1 /* Copyright (c) 2007-2014 Massachusetts Institute of Technology
3 * Permission is hereby granted, free of charge, to any person obtaining
4 * a copy of this software and associated documentation files (the
5 * "Software"), to deal in the Software without restriction, including
6 * without limitation the rights to use, copy, modify, merge, publish,
7 * distribute, sublicense, and/or sell copies of the Software, and to
8 * permit persons to whom the Software is furnished to do so, subject to
9 * the following conditions:
11 * The above copyright notice and this permission notice shall be
12 * included in all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include <stddef.h> /* for ptrdiff_t and size_t */
28 /* Change 0 to 1 to use stdcall convention under Win32 */
29 #if 0 && (defined(_WIN32) || defined(__WIN32__))
30 # if defined(__GNUC__)
31 # define NLOPT_STDCALL __attribute__((stdcall))
32 # elif defined(_MSC_VER) || defined(_ICC) || defined(_STDCALL_SUPPORTED)
33 # define NLOPT_STDCALL __stdcall
35 # define NLOPT_STDCALL
38 # define NLOPT_STDCALL
41 /* for Windows compilers, you should add a line
43 when using NLopt from a DLL, in order to do the proper
44 Windows importing nonsense. */
45 #if defined(NLOPT_DLL) && (defined(_WIN32) || defined(__WIN32__)) && !defined(__LCC__)
46 /* annoying Windows syntax for calling functions in a DLL */
47 # if defined(NLOPT_DLL_EXPORT)
48 # define NLOPT_EXTERN(T) extern __declspec(dllexport) T NLOPT_STDCALL
50 # define NLOPT_EXTERN(T) extern __declspec(dllimport) T NLOPT_STDCALL
53 # define NLOPT_EXTERN(T) extern T NLOPT_STDCALL
59 #endif /* __cplusplus */
61 typedef double (*nlopt_func)(unsigned n, const double *x,
62 double *gradient, /* NULL if not needed */
65 typedef void (*nlopt_mfunc)(unsigned m, double *result,
66 unsigned n, const double *x,
67 double *gradient, /* NULL if not needed */
70 /* A preconditioner, which preconditions v at x to return vpre.
71 (The meaning of "preconditioning" is algorithm-dependent.) */
72 typedef void (*nlopt_precond)(unsigned n, const double *x, const double *v,
73 double *vpre, void *data);
76 /* Naming conventions:
79 = global/local derivative/no-derivative optimization,
82 *_RAND algorithms involve some randomization.
84 *_NOSCAL algorithms are *not* scaled to a unit hypercube
85 (i.e. they are sensitive to the units of x)
90 NLOPT_GN_DIRECT_L_RAND,
91 NLOPT_GN_DIRECT_NOSCAL,
92 NLOPT_GN_DIRECT_L_NOSCAL,
93 NLOPT_GN_DIRECT_L_RAND_NOSCAL,
96 NLOPT_GN_ORIG_DIRECT_L,
101 NLOPT_LD_LBFGS_NOCEDAL,
111 NLOPT_LD_TNEWTON_RESTART,
112 NLOPT_LD_TNEWTON_PRECOND,
113 NLOPT_LD_TNEWTON_PRECOND_RESTART,
127 NLOPT_LN_NEWUOA_BOUND,
141 /* new variants that require local_optimizer to be set,
142 not with older constants for backwards compatibility */
154 NLOPT_NUM_ALGORITHMS /* not an algorithm, just the number of them */
157 NLOPT_EXTERN(const char *) nlopt_algorithm_name(nlopt_algorithm a);
160 NLOPT_FAILURE = -1, /* generic failure code */
161 NLOPT_INVALID_ARGS = -2,
162 NLOPT_OUT_OF_MEMORY = -3,
163 NLOPT_ROUNDOFF_LIMITED = -4,
164 NLOPT_FORCED_STOP = -5,
165 NLOPT_SUCCESS = 1, /* generic success code */
166 NLOPT_STOPVAL_REACHED = 2,
167 NLOPT_FTOL_REACHED = 3,
168 NLOPT_XTOL_REACHED = 4,
169 NLOPT_MAXEVAL_REACHED = 5,
170 NLOPT_MAXTIME_REACHED = 6
173 #define NLOPT_MINF_MAX_REACHED NLOPT_STOPVAL_REACHED
175 NLOPT_EXTERN(void) nlopt_srand(unsigned long seed);
176 NLOPT_EXTERN(void) nlopt_srand_time(void);
178 NLOPT_EXTERN(void) nlopt_version(int *major, int *minor, int *bugfix);
180 /*************************** OBJECT-ORIENTED API **************************/
181 /* The style here is that we create an nlopt_opt "object" (an opaque pointer),
182 then set various optimization parameters, and then execute the
183 algorithm. In this way, we can add more and more optimization parameters
184 (including algorithm-specific ones) without breaking backwards
185 compatibility, having functions with zillions of parameters, or
186 relying non-reentrantly on global variables.*/
188 struct nlopt_opt_s; /* opaque structure, defined internally */
189 typedef struct nlopt_opt_s *nlopt_opt;
191 /* the only immutable parameters of an optimization are the algorithm and
192 the dimension n of the problem, since changing either of these could
193 have side-effects on lots of other parameters */
194 NLOPT_EXTERN(nlopt_opt) nlopt_create(nlopt_algorithm algorithm, unsigned n);
195 NLOPT_EXTERN(void) nlopt_destroy(nlopt_opt opt);
196 NLOPT_EXTERN(nlopt_opt) nlopt_copy(const nlopt_opt opt);
198 NLOPT_EXTERN(nlopt_result) nlopt_optimize(nlopt_opt opt, double *x,
201 NLOPT_EXTERN(nlopt_result) nlopt_set_min_objective(nlopt_opt opt, nlopt_func f,
203 NLOPT_EXTERN(nlopt_result) nlopt_set_max_objective(nlopt_opt opt, nlopt_func f,
206 NLOPT_EXTERN(nlopt_result) nlopt_set_precond_min_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data);
207 NLOPT_EXTERN(nlopt_result) nlopt_set_precond_max_objective(nlopt_opt opt, nlopt_func f, nlopt_precond pre, void *f_data);
209 NLOPT_EXTERN(nlopt_algorithm) nlopt_get_algorithm(const nlopt_opt opt);
210 NLOPT_EXTERN(unsigned) nlopt_get_dimension(const nlopt_opt opt);
212 NLOPT_EXTERN(const char*) nlopt_get_errmsg(nlopt_opt opt);
216 NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds(nlopt_opt opt,
218 NLOPT_EXTERN(nlopt_result) nlopt_set_lower_bounds1(nlopt_opt opt, double lb);
219 NLOPT_EXTERN(nlopt_result) nlopt_get_lower_bounds(const nlopt_opt opt,
221 NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds(nlopt_opt opt,
223 NLOPT_EXTERN(nlopt_result) nlopt_set_upper_bounds1(nlopt_opt opt, double ub);
224 NLOPT_EXTERN(nlopt_result) nlopt_get_upper_bounds(const nlopt_opt opt,
227 NLOPT_EXTERN(nlopt_result) nlopt_remove_inequality_constraints(nlopt_opt opt);
228 NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_constraint(nlopt_opt opt,
232 NLOPT_EXTERN(nlopt_result) nlopt_add_precond_inequality_constraint(
233 nlopt_opt opt, nlopt_func fc, nlopt_precond pre, void *fc_data,
235 NLOPT_EXTERN(nlopt_result) nlopt_add_inequality_mconstraint(nlopt_opt opt,
241 NLOPT_EXTERN(nlopt_result) nlopt_remove_equality_constraints(nlopt_opt opt);
242 NLOPT_EXTERN(nlopt_result) nlopt_add_equality_constraint(nlopt_opt opt,
246 NLOPT_EXTERN(nlopt_result) nlopt_add_precond_equality_constraint(
247 nlopt_opt opt, nlopt_func h, nlopt_precond pre, void *h_data,
249 NLOPT_EXTERN(nlopt_result) nlopt_add_equality_mconstraint(nlopt_opt opt,
255 /* stopping criteria: */
257 NLOPT_EXTERN(nlopt_result) nlopt_set_stopval(nlopt_opt opt, double stopval);
258 NLOPT_EXTERN(double) nlopt_get_stopval(const nlopt_opt opt);
260 NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_rel(nlopt_opt opt, double tol);
261 NLOPT_EXTERN(double) nlopt_get_ftol_rel(const nlopt_opt opt);
262 NLOPT_EXTERN(nlopt_result) nlopt_set_ftol_abs(nlopt_opt opt, double tol);
263 NLOPT_EXTERN(double) nlopt_get_ftol_abs(const nlopt_opt opt);
265 NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_rel(nlopt_opt opt, double tol);
266 NLOPT_EXTERN(double) nlopt_get_xtol_rel(const nlopt_opt opt);
267 NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs1(nlopt_opt opt, double tol);
268 NLOPT_EXTERN(nlopt_result) nlopt_set_xtol_abs(nlopt_opt opt, const double *tol);
269 NLOPT_EXTERN(nlopt_result) nlopt_get_xtol_abs(const nlopt_opt opt,
272 NLOPT_EXTERN(nlopt_result) nlopt_set_maxeval(nlopt_opt opt, int maxeval);
273 NLOPT_EXTERN(int) nlopt_get_maxeval(const nlopt_opt opt);
275 NLOPT_EXTERN(nlopt_result) nlopt_set_maxtime(nlopt_opt opt, double maxtime);
276 NLOPT_EXTERN(double) nlopt_get_maxtime(const nlopt_opt opt);
278 NLOPT_EXTERN(nlopt_result) nlopt_force_stop(nlopt_opt opt);
279 NLOPT_EXTERN(nlopt_result) nlopt_set_force_stop(nlopt_opt opt, int val);
280 NLOPT_EXTERN(int) nlopt_get_force_stop(const nlopt_opt opt);
282 /* more algorithm-specific parameters */
284 NLOPT_EXTERN(nlopt_result) nlopt_set_local_optimizer(nlopt_opt opt,
285 const nlopt_opt local_opt);
287 NLOPT_EXTERN(nlopt_result) nlopt_set_population(nlopt_opt opt, unsigned pop);
288 NLOPT_EXTERN(unsigned) nlopt_get_population(const nlopt_opt opt);
290 NLOPT_EXTERN(nlopt_result) nlopt_set_vector_storage(nlopt_opt opt, unsigned dim);
291 NLOPT_EXTERN(unsigned) nlopt_get_vector_storage(const nlopt_opt opt);
293 NLOPT_EXTERN(nlopt_result) nlopt_set_default_initial_step(nlopt_opt opt,
295 NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step(nlopt_opt opt,
297 NLOPT_EXTERN(nlopt_result) nlopt_set_initial_step1(nlopt_opt opt, double dx);
298 NLOPT_EXTERN(nlopt_result) nlopt_get_initial_step(const nlopt_opt opt,
299 const double *x, double *dx);
301 /* the following are functions mainly designed to be used internally
302 by the Fortran and SWIG wrappers, allow us to tel nlopt_destroy and
303 nlopt_copy to do something to the f_data pointers (e.g. free or
304 duplicate them, respectively) */
305 typedef void* (*nlopt_munge)(void *p);
306 NLOPT_EXTERN(void) nlopt_set_munge(nlopt_opt opt,
307 nlopt_munge munge_on_destroy,
308 nlopt_munge munge_on_copy);
309 typedef void* (*nlopt_munge2)(void *p, void *data);
310 NLOPT_EXTERN(void) nlopt_munge_data(nlopt_opt opt,
311 nlopt_munge2 munge, void *data);
313 /*************************** DEPRECATED API **************************/
314 /* The new "object-oriented" API is preferred, since it allows us to
315 gracefully add new features and algorithm-specific options in a
316 re-entrant way, and we can automatically assume reasonable defaults
317 for unspecified parameters. */
319 /* Where possible (e.g. for gcc >= 3.1), enable a compiler warning
320 for code that uses a deprecated function */
321 #if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__==3 && __GNUC_MINOR__ > 0))
322 # define NLOPT_DEPRECATED __attribute__((deprecated))
324 # define NLOPT_DEPRECATED
327 typedef double (*nlopt_func_old)(int n, const double *x,
328 double *gradient, /* NULL if not needed */
331 NLOPT_EXTERN(nlopt_result) nlopt_minimize(
332 nlopt_algorithm algorithm,
333 int n, nlopt_func_old f, void *f_data,
334 const double *lb, const double *ub, /* bounds */
335 double *x, /* in: initial guess, out: minimizer */
336 double *minf, /* out: minimum */
337 double minf_max, double ftol_rel, double ftol_abs,
338 double xtol_rel, const double *xtol_abs,
339 int maxeval, double maxtime) NLOPT_DEPRECATED;
341 NLOPT_EXTERN(nlopt_result) nlopt_minimize_constrained(
342 nlopt_algorithm algorithm,
343 int n, nlopt_func_old f, void *f_data,
344 int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size,
345 const double *lb, const double *ub, /* bounds */
346 double *x, /* in: initial guess, out: minimizer */
347 double *minf, /* out: minimum */
348 double minf_max, double ftol_rel, double ftol_abs,
349 double xtol_rel, const double *xtol_abs,
350 int maxeval, double maxtime) NLOPT_DEPRECATED;
352 NLOPT_EXTERN(nlopt_result) nlopt_minimize_econstrained(
353 nlopt_algorithm algorithm,
354 int n, nlopt_func_old f, void *f_data,
355 int m, nlopt_func_old fc, void *fc_data, ptrdiff_t fc_datum_size,
356 int p, nlopt_func_old h, void *h_data, ptrdiff_t h_datum_size,
357 const double *lb, const double *ub, /* bounds */
358 double *x, /* in: initial guess, out: minimizer */
359 double *minf, /* out: minimum */
360 double minf_max, double ftol_rel, double ftol_abs,
361 double xtol_rel, const double *xtol_abs,
362 double htol_rel, double htol_abs,
363 int maxeval, double maxtime) NLOPT_DEPRECATED;
365 NLOPT_EXTERN(void) nlopt_get_local_search_algorithm(nlopt_algorithm *deriv,
366 nlopt_algorithm *nonderiv,
367 int *maxeval) NLOPT_DEPRECATED;
368 NLOPT_EXTERN(void) nlopt_set_local_search_algorithm(nlopt_algorithm deriv,
369 nlopt_algorithm nonderiv,
370 int maxeval) NLOPT_DEPRECATED;
372 NLOPT_EXTERN(int) nlopt_get_stochastic_population(void) NLOPT_DEPRECATED;
373 NLOPT_EXTERN(void) nlopt_set_stochastic_population(int pop) NLOPT_DEPRECATED;
375 /*********************************************************************/
379 #endif /* __cplusplus */