From: stevenj Date: Mon, 31 May 2010 16:59:10 +0000 (-0400) Subject: improve C++ header exceptions, rename NLOPT_FORCE_STOP to NLOPT_FORCED_STOP X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=09e976da486a9d6b404700cfcd7bd5a4d8b301d6;p=nlopt.git improve C++ header exceptions, rename NLOPT_FORCE_STOP to NLOPT_FORCED_STOP darcs-hash:20100531165910-c8de0-347b8ba2ff62d825467d4baf6b21508f5364d1e0.gz --- diff --git a/api/nlopt-in.hpp b/api/nlopt-in.hpp index a188544..977d5aa 100644 --- a/api/nlopt-in.hpp +++ b/api/nlopt-in.hpp @@ -56,6 +56,19 @@ namespace nlopt { // (Note: it is inefficient to use std::vector for the arguments, // since that would require a copy to be made of NLopt's double* data.) + ////////////////////////////////////////////////////////////////////// + + // NLopt-specific exceptions (corresponding to error codes): + class roundoff_limited : public std::runtime_error { + public: + roundoff_limited() : std::runtime_error("nlopt roundoff-limited") {} + }; + + class forced_stop : public std::runtime_error { + public: + forced_stop() : std::runtime_error("nlopt forced stop") {} + }; + ////////////////////////////////////////////////////////////////////// class opt { @@ -66,8 +79,9 @@ namespace nlopt { switch (ret) { case NLOPT_FAILURE: throw std::runtime_error("nlopt failure"); case NLOPT_OUT_OF_MEMORY: throw std::bad_alloc(); - case NLOPT_INVALID_ARGS: throw std::invalid_argument("nlopt"); - case NLOPT_ROUNDOFF_LIMITED: throw std::runtime_error("nlopt roundoff"); + case NLOPT_INVALID_ARGS: throw std::invalid_argument("nlopt invalid argument"); + case NLOPT_ROUNDOFF_LIMITED: throw roundoff_limited(); + case NLOPT_FORCED_STOP: throw forced_stop(); default: break; } } diff --git a/api/nlopt.3 b/api/nlopt.3 index e5e862b..b2e4359 100644 --- a/api/nlopt.3 +++ b/api/nlopt.3 @@ -635,7 +635,7 @@ Ran out of memory. .B NLOPT_ROUNDOFF_LIMITED Halted because roundoff errors limited progress. .TP -.B NLOPT_FORCE_STOP +.B NLOPT_FORCED_STOP Halted because the user called \fBnlopt_force_stop\fR(\fIopt\fR) on the optimization's \fBnlopt_opt\fR object \fIopt\fR from the user's objective function. diff --git a/api/nlopt.h b/api/nlopt.h index 39cddfd..2f0975b 100644 --- a/api/nlopt.h +++ b/api/nlopt.h @@ -135,7 +135,7 @@ typedef enum { NLOPT_INVALID_ARGS = -2, NLOPT_OUT_OF_MEMORY = -3, NLOPT_ROUNDOFF_LIMITED = -4, - NLOPT_FORCE_STOP = -5, + NLOPT_FORCED_STOP = -5, NLOPT_SUCCESS = 1, /* generic success code */ NLOPT_STOPVAL_REACHED = 2, NLOPT_FTOL_REACHED = 3, diff --git a/api/optimize.c b/api/optimize.c index 0877b01..0f35707 100644 --- a/api/optimize.c +++ b/api/optimize.c @@ -271,7 +271,7 @@ static nlopt_result nlopt_optimize_(nlopt_opt opt, double *x, double *minf) if (freedx) { free(opt->dx); opt->dx = NULL; } switch (iret) { case -2: return NLOPT_INVALID_ARGS; - case -20: return NLOPT_FORCE_STOP; + case -20: return NLOPT_FORCED_STOP; case -10: return NLOPT_MAXTIME_REACHED; case -1: return NLOPT_MAXEVAL_REACHED; case 0: return NLOPT_XTOL_REACHED; diff --git a/auglag/auglag.c b/auglag/auglag.c index 4e5881e..69d257e 100644 --- a/auglag/auglag.c +++ b/auglag/auglag.c @@ -216,7 +216,7 @@ nlopt_result auglag_minimize(int n, nlopt_func f, void *f_data, if (ret != NLOPT_SUCCESS) break; } - if (nlopt_stop_forced(stop)) {ret = NLOPT_FORCE_STOP; break;} + if (nlopt_stop_forced(stop)) {ret = NLOPT_FORCED_STOP; break;} if (nlopt_stop_evals(stop)) {ret = NLOPT_MAXEVAL_REACHED; break;} if (nlopt_stop_time(stop)) {ret = NLOPT_MAXTIME_REACHED; break;} diff --git a/bobyqa/bobyqa.c b/bobyqa/bobyqa.c index 9ca6de7..55f4f7c 100644 --- a/bobyqa/bobyqa.c +++ b/bobyqa/bobyqa.c @@ -592,7 +592,7 @@ L260: goto L340; } - if (nlopt_stop_forced(stop)) return NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; @@ -679,7 +679,7 @@ L260: if (f < fval[*kopt]) { *kopt = kpt; } - if (nlopt_stop_forced(stop)) return NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; else if (f < stop->minf_max) return NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; @@ -1939,7 +1939,7 @@ L50: temp = xpt[nf + ipt * xpt_dim1] * xpt[nf + jpt * xpt_dim1]; hq[ih] = (fbeg - fval[ipt + 1] - fval[jpt + 1] + f) / temp; } - if (nlopt_stop_forced(stop)) return NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; else if (f < stop->minf_max) return NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; @@ -2572,7 +2572,7 @@ L360: /* L380: */ } - if (nlopt_stop_forced(stop)) rc = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) rc = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) rc = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) rc = NLOPT_MAXTIME_REACHED; if (rc != NLOPT_SUCCESS) goto L720; diff --git a/cdirect/cdirect.c b/cdirect/cdirect.c index ed315ee..d37e891 100644 --- a/cdirect/cdirect.c +++ b/cdirect/cdirect.c @@ -142,7 +142,7 @@ static double function_eval(const double *x, params *p) { p->stop->nevals++; return f; } -#define FUNCTION_EVAL(fv,x,p,freeonerr) fv = function_eval(x, p); if (nlopt_stop_forced((p)->stop)) { free(freeonerr); return NLOPT_FORCE_STOP; } else if (p->minf < p->stop->minf_max) { free(freeonerr); return NLOPT_MINF_MAX_REACHED; } else if (nlopt_stop_evals((p)->stop)) { free(freeonerr); return NLOPT_MAXEVAL_REACHED; } else if (nlopt_stop_time((p)->stop)) { free(freeonerr); return NLOPT_MAXTIME_REACHED; } +#define FUNCTION_EVAL(fv,x,p,freeonerr) fv = function_eval(x, p); if (nlopt_stop_forced((p)->stop)) { free(freeonerr); return NLOPT_FORCED_STOP; } else if (p->minf < p->stop->minf_max) { free(freeonerr); return NLOPT_MINF_MAX_REACHED; } else if (nlopt_stop_evals((p)->stop)) { free(freeonerr); return NLOPT_MAXEVAL_REACHED; } else if (nlopt_stop_time((p)->stop)) { free(freeonerr); return NLOPT_MAXTIME_REACHED; } #define THIRD (0.3333333333333333333333) diff --git a/cobyla/cobyla.c b/cobyla/cobyla.c index 9be178b..a2caa9f 100644 --- a/cobyla/cobyla.c +++ b/cobyla/cobyla.c @@ -499,7 +499,7 @@ static nlopt_result cobylb(int *n, int *m, int *mpp, #*&!%*@ Fortran-66 spaghetti code */ L40: - if (nlopt_stop_forced(stop)) rc = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) rc = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) rc = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) rc = NLOPT_MAXTIME_REACHED; if (rc != NLOPT_SUCCESS) goto L600; diff --git a/cquad/cquad.c b/cquad/cquad.c index 8e3bb69..b2dc27c 100644 --- a/cquad/cquad.c +++ b/cquad/cquad.c @@ -315,7 +315,7 @@ nlopt_result cquad_minimize(int n, nlopt_func f, void *f_data, memcpy(x, x0, sizeof(double) * n); feasible = 1; } - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (*minf < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; @@ -342,7 +342,7 @@ nlopt_result cquad_minimize(int n, nlopt_func f, void *f_data, memcpy(x, xcur, sizeof(double) * n); feasible = 1; } - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) diff --git a/crs/crs.c b/crs/crs.c index 36cbc3e..6421f35 100644 --- a/crs/crs.c +++ b/crs/crs.c @@ -132,7 +132,7 @@ static nlopt_result crs_trial(crs_data *d) do { d->p[0] = d->f(n, d->p + 1, NULL, d->f_data); d->stop->nevals++; - if (nlopt_stop_forced(d->stop)) return NLOPT_FORCE_STOP; + if (nlopt_stop_forced(d->stop)) return NLOPT_FORCED_STOP; if (d->p[0] < worst->k[0]) break; if (nlopt_stop_evals(d->stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(d->stop)) return NLOPT_MAXTIME_REACHED; diff --git a/isres/isres.c b/isres/isres.c index 53da615..47cc65c 100644 --- a/isres/isres.c +++ b/isres/isres.c @@ -164,7 +164,7 @@ nlopt_result isres_minimize(int n, nlopt_func f, void *f_data, if (ret != NLOPT_SUCCESS) goto done; } - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; if (ret != NLOPT_SUCCESS) goto done; diff --git a/luksan/plip.c b/luksan/plip.c index 975a5b0..09b735d 100644 --- a/luksan/plip.c +++ b/luksan/plip.c @@ -516,7 +516,7 @@ nlopt_result luksan_plip(int n, nlopt_func f, void *f_data, case 4: return NLOPT_SUCCESS; /* gradient tolerance reached */ case 6: return NLOPT_SUCCESS; case 12: case 13: return NLOPT_MAXEVAL_REACHED; - case -999: return NLOPT_FORCE_STOP; + case -999: return NLOPT_FORCED_STOP; default: return NLOPT_FAILURE; } } diff --git a/luksan/plis.c b/luksan/plis.c index d0e4adf..8e4c0e6 100644 --- a/luksan/plis.c +++ b/luksan/plis.c @@ -509,7 +509,7 @@ nlopt_result luksan_plis(int n, nlopt_func f, void *f_data, case 4: return NLOPT_SUCCESS; /* gradient tolerance reached */ case 6: return NLOPT_SUCCESS; case 12: case 13: return NLOPT_MAXEVAL_REACHED; - case -999: return NLOPT_FORCE_STOP; + case -999: return NLOPT_FORCED_STOP; default: return NLOPT_FAILURE; } } diff --git a/luksan/pnet.c b/luksan/pnet.c index 4f506af..01e84cb 100644 --- a/luksan/pnet.c +++ b/luksan/pnet.c @@ -659,7 +659,7 @@ nlopt_result luksan_pnet(int n, nlopt_func f, void *f_data, case 4: return NLOPT_SUCCESS; /* gradient tolerance reached */ case 6: return NLOPT_SUCCESS; case 12: case 13: return NLOPT_MAXEVAL_REACHED; - case -999: return NLOPT_FORCE_STOP; + case -999: return NLOPT_FORCED_STOP; default: return NLOPT_FAILURE; } } diff --git a/mlsl/mlsl.c b/mlsl/mlsl.c index 70356a4..b6cca7f 100644 --- a/mlsl/mlsl.c +++ b/mlsl/mlsl.c @@ -333,7 +333,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, if (!rb_tree_insert(&d.pts, (rb_key) p)) { free(p); ret = NLOPT_OUT_OF_MEMORY; } - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (p->f < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; @@ -358,7 +358,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, if (!rb_tree_insert(&d.pts, (rb_key) p)) { free(p); ret = NLOPT_OUT_OF_MEMORY; } - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (p->f < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; @@ -385,7 +385,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, double t = nlopt_seconds(); if (nlopt_stop_forced(stop)) { - ret = NLOPT_FORCE_STOP; break; + ret = NLOPT_FORCED_STOP; break; } if (nlopt_stop_evals(stop)) { ret = NLOPT_MAXEVAL_REACHED; break; @@ -406,7 +406,7 @@ nlopt_result mlsl_minimize(int n, nlopt_func f, void *f_data, if (!rb_tree_insert(&d.lms, lm)) { free(lm); ret = NLOPT_OUT_OF_MEMORY; } - else if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + else if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (*lm < stop->minf_max) ret = NLOPT_MINF_MAX_REACHED; else if (nlopt_stop_evals(stop)) diff --git a/mma/mma.c b/mma/mma.c index 638e07d..9de104f 100644 --- a/mma/mma.c +++ b/mma/mma.c @@ -235,7 +235,7 @@ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data, while (1) { /* outer iterations */ double fprev = fcur; - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) @@ -319,7 +319,7 @@ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data, else if (new_infeasible_constraint) feasible = 0; } - if (nlopt_stop_forced(stop)) ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) ret = NLOPT_MAXTIME_REACHED; else if (feasible && *minf < stop->minf_max) diff --git a/neldermead/nldrmd.c b/neldermead/nldrmd.c index 4c30751..ee86e92 100644 --- a/neldermead/nldrmd.c +++ b/neldermead/nldrmd.c @@ -78,7 +78,7 @@ static int reflectpt(int n, double *xnew, #define CHECK_EVAL(xc,fc) \ stop->nevals++; \ - if (nlopt_stop_forced(stop)) { ret=NLOPT_FORCE_STOP; goto done; } \ + if (nlopt_stop_forced(stop)) { ret=NLOPT_FORCED_STOP; goto done; } \ if ((fc) <= *minf) { \ *minf = (fc); memcpy(x, (xc), n * sizeof(double)); \ if (*minf < stop->minf_max) { ret=NLOPT_MINF_MAX_REACHED; goto done; } \ @@ -291,7 +291,7 @@ nlopt_result nldrmd_minimize(int n, nlopt_func f, void *f_data, *minf = f(n, x, NULL, f_data); stop->nevals++; - if (nlopt_stop_forced(stop)) return NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; if (*minf < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; diff --git a/neldermead/sbplx.c b/neldermead/sbplx.c index d5b7fe4..0d98edc 100644 --- a/neldermead/sbplx.c +++ b/neldermead/sbplx.c @@ -79,7 +79,7 @@ nlopt_result sbplx_minimize(int n, nlopt_func f, void *f_data, *minf = f(n, x, NULL, f_data); stop->nevals++; - if (nlopt_stop_forced(stop)) return NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) return NLOPT_FORCED_STOP; if (*minf < stop->minf_max) return NLOPT_MINF_MAX_REACHED; if (nlopt_stop_evals(stop)) return NLOPT_MAXEVAL_REACHED; if (nlopt_stop_time(stop)) return NLOPT_MAXTIME_REACHED; diff --git a/newuoa/newuoa.c b/newuoa/newuoa.c index d993813..c497917 100644 --- a/newuoa/newuoa.c +++ b/newuoa/newuoa.c @@ -2099,7 +2099,7 @@ L290: } ++nf; L310: - if (nlopt_stop_forced(stop)) rc = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) rc = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) rc = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) rc = NLOPT_MAXTIME_REACHED; if (rc != NLOPT_SUCCESS) goto L530; diff --git a/praxis/praxis.c b/praxis/praxis.c index c9f1356..d6636a9 100644 --- a/praxis/praxis.c +++ b/praxis/praxis.c @@ -1241,7 +1241,7 @@ L4: q_1->fbest = ret_val; memcpy(q_1->xbest, t, n * sizeof(double)); } - if (nlopt_stop_forced(stop)) *ret = NLOPT_FORCE_STOP; + if (nlopt_stop_forced(stop)) *ret = NLOPT_FORCED_STOP; else if (nlopt_stop_evals(stop)) *ret = NLOPT_MAXEVAL_REACHED; else if (nlopt_stop_time(stop)) *ret = NLOPT_MAXTIME_REACHED; else if (ret_val <= stop->minf_max) *ret = NLOPT_MINF_MAX_REACHED;