libcmaes
A C++11 library for stochastic optimization with CMA-ES
 All Classes Namespaces Functions Variables Typedefs
cmaes.h
1 
22 #ifndef CMAES_H
23 #define CMAES_H
24 
25 #include "esoptimizer.h"
26 #include "cmastrategy.h"
27 #include "ipopcmastrategy.h"
28 #include "bipopcmastrategy.h"
29 
30 namespace cma = libcmaes;
31 
32 namespace 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
linear scaling of the parameter space to achieve similar sensitivity across all components.
Definition: acovarianceupdate.cc:25