chiark / gitweb /
use thread_id, if available, in nlopt_srand_time to ensure that different threads...
[nlopt.git] / api / general.c
1 /* Copyright (c) 2007-2010 Massachusetts Institute of Technology
2  *
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:
10  * 
11  * The above copyright notice and this permission notice shall be
12  * included in all copies or substantial portions of the Software.
13  * 
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. 
21  */
22
23 #include <math.h>
24 #include <float.h>
25
26 #include "nlopt.h"
27 #include "nlopt-util.h"
28
29 /*************************************************************************/
30
31 int nlopt_isinf(double x) {
32      return fabs(x) >= HUGE_VAL * 0.99
33 #ifdef HAVE_ISINF
34           || isinf(x)
35 #endif
36           ;
37 }
38 /*************************************************************************/
39
40 void nlopt_version(int *major, int *minor, int *bugfix)
41 {
42      *major = MAJOR_VERSION;
43      *minor = MINOR_VERSION;
44      *bugfix = BUGFIX_VERSION;
45 }
46
47 /*************************************************************************/
48
49 static const char nlopt_algorithm_names[NLOPT_NUM_ALGORITHMS][256] = {
50      "DIRECT (global, no-derivative)",
51      "DIRECT-L (global, no-derivative)",
52      "Randomized DIRECT-L (global, no-derivative)",
53      "Unscaled DIRECT (global, no-derivative)",
54      "Unscaled DIRECT-L (global, no-derivative)",
55      "Unscaled Randomized DIRECT-L (global, no-derivative)",
56      "Original DIRECT version (global, no-derivative)",
57      "Original DIRECT-L version (global, no-derivative)",
58 #ifdef WITH_CXX
59      "StoGO (global, derivative-based)",
60      "StoGO with randomized search (global, derivative-based)",
61 #else
62      "StoGO (NOT COMPILED)",
63      "StoGO randomized (NOT COMPILED)",
64 #endif
65 #ifdef WITH_NOCEDAL_LBFGS
66      "original NON-FREE L-BFGS code by Nocedal et al. (local, deriv.-based)",
67 #else
68      "original NON-FREE L-BFGS code by Nocedal et al. (NOT COMPILED)",
69 #endif
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 };
96
97 const char *nlopt_algorithm_name(nlopt_algorithm a)
98 {
99      if (((int) a) < 0 || a >= NLOPT_NUM_ALGORITHMS) return "UNKNOWN";
100      return nlopt_algorithm_names[a];
101 }
102
103 /*************************************************************************/
104 /* get thread id, if possible, for use in nlopt_srand_time to ensure that
105    different threads have a different default seed even if they are called
106    simultaneously */
107
108 #if defined(_WIN32) || defined(__WIN32__)
109 #  include <windows.h>
110 #  define my_gettid GetCurrentThreadId
111 #elif defined(HAVE_GETTID_SYSCALL)
112 #  include <unistd.h>
113 #  include <sys/syscall.h>
114 #  define my_gettid() syscall(SYS_gettid)
115 #elif defined(HAVE_GETPID)
116 #  include <sys/types.h>
117 #  include <unistd.h>
118 #  define my_gettid getpid
119 #else
120 #  define my_gettid() (0)
121 #endif
122
123 /*************************************************************************/
124
125 static THREADLOCAL int nlopt_srand_called = 0;
126 void nlopt_srand(unsigned long seed) {
127      nlopt_srand_called = 1;
128      nlopt_init_genrand(seed);
129 }
130
131 void nlopt_srand_time() {
132      nlopt_srand(nlopt_time_seed() + my_gettid() * 314159);
133 }
134
135 void nlopt_srand_time_default() {
136      if (!nlopt_srand_called) nlopt_srand_time();
137 }
138
139 /*************************************************************************/