libcmaes 0.10.2
A C++11 library for stochastic optimization with CMA-ES
Loading...
Searching...
No Matches
cmaes.h
1
22#ifndef CMAES_H
23#define CMAES_H
24
25#include <libcmaes/esoptimizer.h>
26#include <libcmaes/cmastrategy.h>
27#include <libcmaes/ipopcmastrategy.h>
28#include <libcmaes/bipopcmastrategy.h>
29
30namespace cma = libcmaes;
31
32namespace libcmaes
33{
34 template <class TGenoPheno=GenoPheno<NoBoundStrategy>>
35 CMASolutions cmaes(FitFunc &func,
36 CMAParameters<TGenoPheno> &parameters,
37 ProgressFunc<CMAParameters<TGenoPheno>,CMASolutions> &pfunc=CMAStrategy<CovarianceUpdate,TGenoPheno>::_defaultPFunc,
38 GradFunc gfunc=nullptr,
39 const CMASolutions &solutions=CMASolutions(),
40 PlotFunc<CMAParameters<TGenoPheno>,CMASolutions> &pffunc=CMAStrategy<CovarianceUpdate,TGenoPheno>::_defaultFPFunc)
41 {
42 switch(parameters.get_algo())
43 {
44 case CMAES_DEFAULT:
45 {
46 // if / else as object cannot be reused for now, and we're avoiding pointers.
47 if (solutions.cov().size()==0)
48 {
49 ESOptimizer<CMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> cmaes_vanilla(func,parameters);
50 if (gfunc != nullptr)
51 cmaes_vanilla.set_gradient_func(gfunc);
52 cmaes_vanilla.set_progress_func(pfunc);
53 cmaes_vanilla.set_plot_func(pffunc);
54 cmaes_vanilla.optimize();
55 return cmaes_vanilla.get_solutions();
56 }
57 else
58 {
59 ESOptimizer<CMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> cmaes_vanilla(func,parameters,solutions);
60 if (gfunc != nullptr)
61 cmaes_vanilla.set_gradient_func(gfunc);
62 cmaes_vanilla.set_progress_func(pfunc);
63 cmaes_vanilla.set_plot_func(pffunc);
64 cmaes_vanilla.optimize();
65 return cmaes_vanilla.get_solutions();
66 }
67 }
68 case IPOP_CMAES:
69 {
70 if (solutions.cov().size()==0)
71 {
72 ESOptimizer<IPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> ipop(func,parameters);
73 if (gfunc != nullptr)
74 ipop.set_gradient_func(gfunc);
75 ipop.set_progress_func(pfunc);
76 ipop.set_plot_func(pffunc);
77 ipop.optimize();
78 return ipop.get_solutions();
79 }
80 else
81 {
82 ESOptimizer<IPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> ipop(func,parameters,solutions);
83 if (gfunc != nullptr)
84 ipop.set_gradient_func(gfunc);
85 ipop.set_progress_func(pfunc);
86 ipop.set_plot_func(pffunc);
87 ipop.optimize();
88 return ipop.get_solutions();
89 }
90 }
91 case BIPOP_CMAES:
92 {
93 if (solutions.cov().size()==0)
94 {
95 ESOptimizer<BIPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> bipop(func,parameters);
96 if (gfunc != nullptr)
97 bipop.set_gradient_func(gfunc);
98 bipop.set_progress_func(pfunc);
99 bipop.set_plot_func(pffunc);
100 bipop.optimize();
101 return bipop.get_solutions();
102 }
103 else
104 {
105 ESOptimizer<BIPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> bipop(func,parameters,solutions);
106 if (gfunc != nullptr)
107 bipop.set_gradient_func(gfunc);
108 bipop.set_progress_func(pfunc);
109 bipop.set_plot_func(pffunc);
110 bipop.optimize();
111 return bipop.get_solutions();
112 }
113 }
114 case aCMAES:
115 {
116 if (solutions.cov().size()==0)
117 {
118 ESOptimizer<CMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> acmaes(func,parameters);
119 if (gfunc != nullptr)
120 acmaes.set_gradient_func(gfunc);
121 acmaes.set_progress_func(pfunc);
122 acmaes.set_plot_func(pffunc);
123 acmaes.optimize();
124 return acmaes.get_solutions();
125 }
126 else
127 {
128 ESOptimizer<CMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> acmaes(func,parameters,solutions);
129 if (gfunc != nullptr)
130 acmaes.set_gradient_func(gfunc);
131 acmaes.set_progress_func(pfunc);
132 acmaes.set_plot_func(pffunc);
133 acmaes.optimize();
134 return acmaes.get_solutions();
135 }
136 }
137 case aIPOP_CMAES:
138 {
139 if (solutions.cov().size()==0)
140 {
141 ESOptimizer<IPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> aipop(func,parameters);
142 if (gfunc != nullptr)
143 aipop.set_gradient_func(gfunc);
144 aipop.set_progress_func(pfunc);
145 aipop.set_plot_func(pffunc);
146 aipop.optimize();
147 return aipop.get_solutions();
148 }
149 else
150 {
151 ESOptimizer<IPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> aipop(func,parameters,solutions);
152 if (gfunc != nullptr)
153 aipop.set_gradient_func(gfunc);
154 aipop.set_progress_func(pfunc);
155 aipop.set_plot_func(pffunc);
156 aipop.optimize();
157 return aipop.get_solutions();
158 }
159 }
160 case aBIPOP_CMAES:
161 {
162 if (solutions.cov().size()==0)
163 {
164 ESOptimizer<BIPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> abipop(func,parameters);
165 if (gfunc != nullptr)
166 abipop.set_gradient_func(gfunc);
167 abipop.set_progress_func(pfunc);
168 abipop.set_plot_func(pffunc);
169 abipop.optimize();
170 return abipop.get_solutions();
171 }
172 else
173 {
174 ESOptimizer<BIPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> abipop(func,parameters,solutions);
175 if (gfunc != nullptr)
176 abipop.set_gradient_func(gfunc);
177 abipop.set_progress_func(pfunc);
178 abipop.set_plot_func(pffunc);
179 abipop.optimize();
180 return abipop.get_solutions();
181 }
182 }
183 case sepCMAES:
184 {
185 if (!parameters.is_sep())
186 parameters.set_sep();
187 if (solutions.cov().size()==0)
188 {
189 ESOptimizer<CMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> sepcmaes(func,parameters);
190 if (gfunc != nullptr)
191 sepcmaes.set_gradient_func(gfunc);
192 sepcmaes.set_progress_func(pfunc);
193 sepcmaes.set_plot_func(pffunc);
194 sepcmaes.optimize();
195 return sepcmaes.get_solutions();
196 }
197 else
198 {
199 ESOptimizer<CMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> sepcmaes(func,parameters,solutions);
200 if (gfunc != nullptr)
201 sepcmaes.set_gradient_func(gfunc);
202 sepcmaes.set_progress_func(pfunc);
203 sepcmaes.set_plot_func(pffunc);
204 sepcmaes.optimize();
205 return sepcmaes.get_solutions();
206 }
207 }
208 case sepIPOP_CMAES:
209 {
210 if (!parameters.is_sep())
211 parameters.set_sep();
212 if (solutions.cov().size()==0)
213 {
214 ESOptimizer<IPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> ipop(func,parameters);
215 if (gfunc != nullptr)
216 ipop.set_gradient_func(gfunc);
217 ipop.set_progress_func(pfunc);
218 ipop.set_plot_func(pffunc);
219 ipop.optimize();
220 return ipop.get_solutions();
221 }
222 else
223 {
224 ESOptimizer<IPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> ipop(func,parameters,solutions);
225 if (gfunc != nullptr)
226 ipop.set_gradient_func(gfunc);
227 ipop.set_progress_func(pfunc);
228 ipop.set_plot_func(pffunc);
229 ipop.optimize();
230 return ipop.get_solutions();
231 }
232 }
233 case sepBIPOP_CMAES:
234 {
235 if (!parameters.is_sep())
236 parameters.set_sep();
237 if (solutions.cov().size()==0)
238 {
239 ESOptimizer<BIPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> bipop(func,parameters);
240 if (gfunc != nullptr)
241 bipop.set_gradient_func(gfunc);
242 bipop.set_progress_func(pfunc);
243 bipop.set_plot_func(pffunc);
244 bipop.optimize();
245 return bipop.get_solutions();
246 }
247 else
248 {
249 ESOptimizer<BIPOPCMAStrategy<CovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> bipop(func,parameters,solutions);
250 if (gfunc != nullptr)
251 bipop.set_gradient_func(gfunc);
252 bipop.set_progress_func(pfunc);
253 bipop.optimize();
254 return bipop.get_solutions();
255 }
256 }
257 case sepaCMAES:
258 {
259 if (!parameters.is_sep())
260 parameters.set_sep();
261 if (solutions.cov().size()==0)
262 {
263 ESOptimizer<CMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> sepcmaes(func,parameters);
264 if (gfunc != nullptr)
265 sepcmaes.set_gradient_func(gfunc);
266 sepcmaes.set_progress_func(pfunc);
267 sepcmaes.set_plot_func(pffunc);
268 sepcmaes.optimize();
269 return sepcmaes.get_solutions();
270 }
271 else
272 {
273 ESOptimizer<CMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> sepcmaes(func,parameters,solutions);
274 if (gfunc != nullptr)
275 sepcmaes.set_gradient_func(gfunc);
276 sepcmaes.set_progress_func(pfunc);
277 sepcmaes.optimize();
278 return sepcmaes.get_solutions();
279 }
280 }
281 case sepaIPOP_CMAES:
282 {
283 if (!parameters.is_sep())
284 parameters.set_sep();
285 if (solutions.cov().size() == 0)
286 {
287 ESOptimizer<IPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> ipop(func,parameters);
288 if (gfunc != nullptr)
289 ipop.set_gradient_func(gfunc);
290 ipop.set_progress_func(pfunc);
291 ipop.set_plot_func(pffunc);
292 ipop.optimize();
293 return ipop.get_solutions();
294 }
295 else
296 {
297 ESOptimizer<IPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> ipop(func,parameters,solutions);
298 if (gfunc != nullptr)
299 ipop.set_gradient_func(gfunc);
300 ipop.set_progress_func(pfunc);
301 ipop.optimize();
302 return ipop.get_solutions();
303 }
304 }
305 case sepaBIPOP_CMAES:
306 {
307 if (!parameters.is_sep())
308 parameters.set_sep();
309 if (solutions.cov().size() == 0)
310 {
311 ESOptimizer<BIPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> bipop(func,parameters);
312 if (gfunc != nullptr)
313 bipop.set_gradient_func(gfunc);
314 bipop.set_progress_func(pfunc);
315 bipop.set_plot_func(pffunc);
316 bipop.optimize();
317 return bipop.get_solutions();
318 }
319 else
320 {
321 ESOptimizer<BIPOPCMAStrategy<ACovarianceUpdate,TGenoPheno>,CMAParameters<TGenoPheno>,CMASolutions> bipop(func,parameters,solutions);
322 if (gfunc != nullptr)
323 bipop.set_gradient_func(gfunc);
324 bipop.set_progress_func(pfunc);
325 bipop.optimize();
326 return bipop.get_solutions();
327 }
328 }
329 case VD_CMAES:
330 {
331 if (!parameters.is_vd())
332 parameters.set_vd();
333 ESOptimizer<CMAStrategy<VDCMAUpdate,TGenoPheno>,CMAParameters<TGenoPheno>> vdcma(func,parameters);
334 if (gfunc != nullptr)
335 vdcma.set_gradient_func(gfunc);
336 vdcma.set_progress_func(pfunc);
337 vdcma.set_plot_func(pffunc);
338 vdcma.optimize();
339 return vdcma.get_solutions();
340 }
341 case VD_IPOP_CMAES:
342 {
343 if (!parameters.is_vd())
344 parameters.set_vd();
345 ESOptimizer<IPOPCMAStrategy<VDCMAUpdate,TGenoPheno>,CMAParameters<TGenoPheno>> ipop(func,parameters);
346 if (gfunc != nullptr)
347 ipop.set_gradient_func(gfunc);
348 ipop.set_progress_func(pfunc);
349 ipop.set_plot_func(pffunc);
350 ipop.optimize();
351 return ipop.get_solutions();
352 }
353 case VD_BIPOP_CMAES:
354 {
355 if (!parameters.is_vd())
356 parameters.set_vd();
357 ESOptimizer<BIPOPCMAStrategy<VDCMAUpdate,TGenoPheno>,CMAParameters<TGenoPheno>> bipop(func,parameters);
358 if (gfunc != nullptr)
359 bipop.set_gradient_func(gfunc);
360 bipop.set_progress_func(pfunc);
361 bipop.set_plot_func(pffunc);
362 bipop.optimize();
363 return bipop.get_solutions();
364 }
365 default:
366 return CMASolutions();
367 }
368 }
369}
370
371#endif
static PlotFunc< CMAParameters< TGenoPheno >, CMASolutions > _defaultFPFunc
Definition cmastrategy.h:130
static ProgressFunc< CMAParameters< TGenoPheno >, CMASolutions > _defaultPFunc
Definition cmastrategy.h:129
linear scaling of the parameter space to achieve similar sensitivity across all components.
Definition acovarianceupdate.h:30