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 "nlopt-internal.h"
28 /*************************************************************************/
30 int nlopt_isinf(double x) {
31 return fabs(x) >= HUGE_VAL * 0.99
38 int nlopt_isfinite(double x) {
39 return fabs(x) <= DBL_MAX;
42 /*************************************************************************/
44 void NLOPT_STDCALL nlopt_version(int *major, int *minor, int *bugfix)
46 *major = MAJOR_VERSION;
47 *minor = MINOR_VERSION;
48 *bugfix = BUGFIX_VERSION;
51 /*************************************************************************/
53 static const char nlopt_algorithm_names[NLOPT_NUM_ALGORITHMS][256] = {
54 "DIRECT (global, no-derivative)",
55 "DIRECT-L (global, no-derivative)",
56 "Randomized DIRECT-L (global, no-derivative)",
57 "Unscaled DIRECT (global, no-derivative)",
58 "Unscaled DIRECT-L (global, no-derivative)",
59 "Unscaled Randomized DIRECT-L (global, no-derivative)",
60 "Original DIRECT version (global, no-derivative)",
61 "Original DIRECT-L version (global, no-derivative)",
63 "StoGO (global, derivative-based)",
64 "StoGO with randomized search (global, derivative-based)",
66 "StoGO (NOT COMPILED)",
67 "StoGO randomized (NOT COMPILED)",
69 "original L-BFGS code by Nocedal et al. (NOT COMPILED)",
70 "Limited-memory BFGS (L-BFGS) (local, derivative-based)",
71 "Principal-axis, praxis (local, no-derivative)",
72 "Limited-memory variable-metric, rank 1 (local, derivative-based)",
73 "Limited-memory variable-metric, rank 2 (local, derivative-based)",
74 "Truncated Newton (local, derivative-based)",
75 "Truncated Newton with restarting (local, derivative-based)",
76 "Preconditioned truncated Newton (local, derivative-based)",
77 "Preconditioned truncated Newton with restarting (local, derivative-based)",
78 "Controlled random search (CRS2) with local mutation (global, no-derivative)",
79 "Multi-level single-linkage (MLSL), random (global, no-derivative)",
80 "Multi-level single-linkage (MLSL), random (global, derivative)",
81 "Multi-level single-linkage (MLSL), quasi-random (global, no-derivative)",
82 "Multi-level single-linkage (MLSL), quasi-random (global, derivative)",
83 "Method of Moving Asymptotes (MMA) (local, derivative)",
84 "COBYLA (Constrained Optimization BY Linear Approximations) (local, no-derivative)",
85 "NEWUOA unconstrained optimization via quadratic models (local, no-derivative)",
86 "Bound-constrained optimization via NEWUOA-based quadratic models (local, no-derivative)",
87 "Nelder-Mead simplex algorithm (local, no-derivative)",
88 "Sbplx variant of Nelder-Mead (re-implementation of Rowan's Subplex) (local, no-derivative)",
89 "Augmented Lagrangian method (local, no-derivative)",
90 "Augmented Lagrangian method (local, derivative)",
91 "Augmented Lagrangian method for equality constraints (local, no-derivative)",
92 "Augmented Lagrangian method for equality constraints (local, derivative)",
93 "BOBYQA bound-constrained optimization via quadratic models (local, no-derivative)",
94 "ISRES evolutionary constrained optimization (global, no-derivative)",
95 "Augmented Lagrangian method (needs sub-algorithm)",
96 "Augmented Lagrangian method for equality constraints (needs sub-algorithm)",
97 "Multi-level single-linkage (MLSL), random (global, needs sub-algorithm)",
98 "Multi-level single-linkage (MLSL), quasi-random (global, needs sub-algorithm)",
99 "Sequential Quadratic Programming (SQP) (local, derivative)",
100 "CCSA (Conservative Convex Separable Approximations) with simple quadratic approximations (local, derivative)",
101 "ESCH evolutionary strategy"
104 const char * NLOPT_STDCALL nlopt_algorithm_name(nlopt_algorithm a)
106 if (((int) a) < 0 || a >= NLOPT_NUM_ALGORITHMS) return "UNKNOWN";
107 return nlopt_algorithm_names[a];
110 /*************************************************************************/
111 /* get thread id, if possible, for use in nlopt_srand_time to ensure that
112 different threads have a different default seed even if they are called
115 #if defined(_WIN32) || defined(__WIN32__)
116 # include <windows.h>
117 # define my_gettid GetCurrentThreadId
118 #elif defined(HAVE_GETTID_SYSCALL)
120 # include <sys/syscall.h>
121 # define my_gettid() syscall(SYS_gettid)
122 #elif defined(HAVE_GETPID)
123 # include <sys/types.h>
125 # define my_gettid getpid
127 # define my_gettid() (0)
130 /*************************************************************************/
132 static THREADLOCAL int nlopt_srand_called = 0;
133 void NLOPT_STDCALL nlopt_srand(unsigned long seed) {
134 nlopt_srand_called = 1;
135 nlopt_init_genrand(seed);
138 void NLOPT_STDCALL nlopt_srand_time(void) {
139 nlopt_srand(nlopt_time_seed() + my_gettid() * 314159);
142 void nlopt_srand_time_default(void) {
143 if (!nlopt_srand_called) nlopt_srand_time();
146 /*************************************************************************/