Skip to content

Commit 4d720b1

Browse files
committed
undocumented internal parameter sigma_min for experiments
1 parent 68df462 commit 4d720b1

4 files changed

Lines changed: 13 additions & 6 deletions

File tree

src/algs/mma/ccsa_quadratic.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ nlopt_result ccsa_quadratic_minimize(
219219
double *minf,
220220
nlopt_stopping *stop,
221221
nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init,
222-
int inner_gradients, int always_improve,
222+
int inner_gradients, int always_improve, double sigma_min,
223223
const double *sigma_init)
224224
{
225225
nlopt_result ret = NLOPT_SUCCESS;
@@ -330,6 +330,7 @@ nlopt_result ccsa_quadratic_minimize(
330330
sigma[j] = 1.0; /* arbitrary default */
331331
else
332332
sigma[j] = 0.5 * (ub[j] - lb[j]);
333+
sigma[j] = MAX(sigma[j], sigma_min);
333334
}
334335
rho = rho_init;
335336
for (i = 0; i < m; ++i) {
@@ -585,6 +586,7 @@ nlopt_result ccsa_quadratic_minimize(
585586
0.01*(ub-lb), which seems unnecessarily large */
586587
sigma[j] = MAX(sigma[j], 1e-8*(ub[j]-lb[j]));
587588
}
589+
sigma[j] = MAX(sigma[j], sigma_min);
588590
}
589591
for (j = 0; j < MIN(verbose, n); ++j)
590592
printf(" CCSA sigma[%u] -> %g\n",

src/algs/mma/mma.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data,
149149
double *minf,
150150
nlopt_stopping *stop,
151151
nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init,
152-
int inner_gradients, int always_improve,
152+
int inner_gradients, int always_improve, double sigma_min,
153153
const double *sigma_init)
154154
{
155155
nlopt_result ret = NLOPT_SUCCESS;
@@ -206,6 +206,7 @@ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data,
206206
sigma[j] = 1.0; /* arbitrary default */
207207
else
208208
sigma[j] = 0.5 * (ub[j] - lb[j]);
209+
sigma[j] = MAX(sigma[j], sigma_min);
209210
}
210211
rho = rho_init;
211212
for (i = 0; i < m; ++i) {
@@ -437,6 +438,7 @@ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data,
437438
sigma[j] = MIN(sigma[j], 10*(ub[j]-lb[j]));
438439
sigma[j] = MAX(sigma[j], 0.01*(ub[j]-lb[j]));
439440
}
441+
sigma[j] = MAX(sigma[j], sigma_min);
440442
}
441443
for (j = 0; j < MIN(verbose, n); ++j)
442444
printf(" MMA sigma[%u] -> %g\n",

src/algs/mma/mma.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ nlopt_result mma_minimize(unsigned n, nlopt_func f, void *f_data,
4141
double *minf,
4242
nlopt_stopping *stop,
4343
nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init,
44-
int inner_gradients, int always_improve,
44+
int inner_gradients, int always_improve, double sigma_min,
4545
const double *sigma_init);
4646

4747
nlopt_result ccsa_quadratic_minimize(
@@ -55,7 +55,7 @@ nlopt_result ccsa_quadratic_minimize(
5555
double *minf,
5656
nlopt_stopping *stop,
5757
nlopt_opt dual_opt, int inner_maxeval, unsigned verbose, double rho_init,
58-
int inner_gradients, int always_improve,
58+
int inner_gradients, int always_improve, double sigma_min,
5959
const double *sigma_init);
6060

6161
#ifdef __cplusplus

src/api/optimize.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,7 @@ static nlopt_result nlopt_optimize_(nlopt_opt opt, double *x, double *minf)
800800
double rho_init = nlopt_get_param(opt, "rho_init",1.0);
801801
int inner_gradients = (int)nlopt_get_param(opt, "inner_gradients",1);
802802
int always_improve = (int)nlopt_get_param(opt, "always_improve",1);
803+
double sigma_min = nlopt_get_param(opt, "sigma_min",0.0);
803804
nlopt_opt dual_opt;
804805
nlopt_result ret;
805806

@@ -809,6 +810,8 @@ static nlopt_result nlopt_optimize_(nlopt_opt opt, double *x, double *minf)
809810
RETURN_ERR(NLOPT_INVALID_ARGS, opt, "inner_gradients must be 0 or 1");
810811
if (always_improve != 0 && always_improve != 1)
811812
RETURN_ERR(NLOPT_INVALID_ARGS, opt, "always_improve must be 0 or 1");
813+
if (sigma_min < 0.0)
814+
RETURN_ERR(NLOPT_INVALID_ARGS, opt, "sigma_min must be non-negative");
812815
verbosity = verbosity < 0 ? 0 : verbosity;
813816

814817
#define LO(param, def) (opt->local_opt ? opt->local_opt->param : (def))
@@ -823,9 +826,9 @@ static nlopt_result nlopt_optimize_(nlopt_opt opt, double *x, double *minf)
823826
nlopt_set_maxeval(dual_opt, (int)nlopt_get_param(opt, "dual_maxeval", LO(maxeval, 100000)));
824827
#undef LO
825828
if (algorithm == NLOPT_LD_MMA)
826-
ret = mma_minimize(n, f, f_data, opt->m, opt->fc, lb, ub, x, minf, &stop, dual_opt, inner_maxeval, (unsigned)verbosity, rho_init, inner_gradients, always_improve, opt->dx);
829+
ret = mma_minimize(n, f, f_data, opt->m, opt->fc, lb, ub, x, minf, &stop, dual_opt, inner_maxeval, (unsigned)verbosity, rho_init, inner_gradients, always_improve, sigma_min, opt->dx);
827830
else
828-
ret = ccsa_quadratic_minimize(n, f, f_data, opt->m, opt->fc, opt->pre, lb, ub, x, minf, &stop, dual_opt, inner_maxeval, (unsigned)verbosity, rho_init, inner_gradients, always_improve, opt->dx);
831+
ret = ccsa_quadratic_minimize(n, f, f_data, opt->m, opt->fc, opt->pre, lb, ub, x, minf, &stop, dual_opt, inner_maxeval, (unsigned)verbosity, rho_init, inner_gradients, always_improve, sigma_min, opt->dx);
829832
nlopt_destroy(dual_opt);
830833
return ret;
831834
}

0 commit comments

Comments
 (0)