7 static const char nlopt_algorithm_names[NLOPT_NUM_ALGORITHMS][128] = {
11 "Low-storage BFGS (LBFGS) (local)"
14 const char *nlopt_algorithm_name(nlopt_algorithm a)
16 if (a < 0 || a >= NLOPT_NUM_ALGORITHMS) return "UNKNOWN";
17 return nlopt_algorithm_names[a];
20 static int my_isinf(double x) {
29 static int my_isnan(double x) { return x != x; }
30 # define isnan my_isnan
40 static double f_subplex(int n, const double *x, void *data_)
42 nlopt_data *data = (nlopt_data *) data_;
43 return data->f(n, x, NULL, data->f_data);
48 static double f_direct(int n, const double *x, int *undefined, void *data_)
50 nlopt_data *data = (nlopt_data *) data_;
51 double f = data->f(n, x, NULL, data->f_data);
52 *undefined = isnan(f) || my_isinf(f);
59 #define MIN(a,b) ((a) < (b) ? (a) : (b))
61 nlopt_result nlopt_minimize(
62 nlopt_algorithm algorithm,
63 int n, nlopt_func f, void *f_data,
64 const double *lb, const double *ub, /* bounds */
65 double *x, /* in: initial guess, out: minimizer */
66 double *fmin, /* out: minimum */
67 double fmin_max, double ftol_rel, double ftol_abs,
68 double xtol_rel, const double *xtol_abs,
69 int maxeval, double maxtime)
76 case NLOPT_GLOBAL_DIRECT:
77 switch (direct_optimize(f_direct, &d, n, lb, ub, x, fmin,
78 maxeval, 500, ftol_rel, ftol_abs,
80 DIRECT_UNKNOWN_FGLOBAL, -1.0,
81 NULL, DIRECT_GABLONSKY)) {
82 case DIRECT_INVALID_BOUNDS:
83 case DIRECT_MAXFEVAL_TOOBIG:
84 case DIRECT_INVALID_ARGS:
85 return NLOPT_INVALID_ARGS;
86 case DIRECT_INIT_FAILED:
87 case DIRECT_SAMPLEPOINTS_FAILED:
88 case DIRECT_SAMPLE_FAILED:
90 case DIRECT_MAXFEVAL_EXCEEDED:
91 case DIRECT_MAXITER_EXCEEDED:
92 return NLOPT_MAXEVAL_REACHED;
93 case DIRECT_GLOBAL_FOUND:
97 return NLOPT_XTOL_REACHED;
98 case DIRECT_OUT_OF_MEMORY:
99 return NLOPT_OUT_OF_MEMORY;
103 case NLOPT_GLOBAL_STOGO:
104 if (!stogo_minimize(n, f, f_data, x, fmin, lb, ub,
106 return NLOPT_FAILURE;
109 case NLOPT_LOCAL_SUBPLEX: {
111 double *scale = (double *) malloc(sizeof(double) * n);
112 if (!scale) return NLOPT_OUT_OF_MEMORY;
113 for (i = 0; i < n; ++i)
114 scale[i] = fabs(ub[i] - lb[i]);
115 iret = subplex(f_subplex, fmin, x, n, &d, xtol_rel, maxeval,
116 fmin_max, !my_isinf(fmin_max), scale);
119 case -2: return NLOPT_INVALID_ARGS;
120 case -1: return NLOPT_MAXEVAL_REACHED;
121 case 0: return NLOPT_XTOL_REACHED;
122 case 1: return NLOPT_SUCCESS;
123 case 2: return NLOPT_FMIN_MAX_REACHED;
128 case NLOPT_LOCAL_LBFGS: {
129 int iret, i, *nbd = (int *) malloc(sizeof(int) * n);
130 if (!nbd) return NLOPT_OUT_OF_MEMORY;
131 for (i = 0; i < n; ++i) {
132 int linf = my_isinf(lb[i]) && lb[i] < 0;
133 int uinf = my_isinf(ub[i]) && ub[i] > 0;
134 nbd[i] = linf && uinf ? 0 : (uinf ? 1 : (linf ? 3 : 2));
136 iret = lbfgsb_minimize(n, f, f_data, x, nbd, lb, ub,
137 MIN(n, 5), 0.0, ftol_rel,
138 xtol_abs ? xtol_rel : *xtol_abs,
143 case -1: return NLOPT_INVALID_ARGS;
144 case -2: default: return NLOPT_FAILURE;
148 *fmin = f(n, x, NULL, f_data);
150 case 5: return NLOPT_MAXEVAL_REACHED;
151 case 2: return NLOPT_XTOL_REACHED;
152 case 1: return NLOPT_FTOL_REACHED;
153 default: return NLOPT_SUCCESS;
160 return NLOPT_INVALID_ARGS;
163 return NLOPT_SUCCESS;