chiark / gitweb /
use nlopt_stopping in StoGO (currently only for maxevals and maxtime)
[nlopt.git] / stogo / stogo.cc
1 // A C-callable front-end to the StoGO global-optimization library.
2 //  -- Steven G. Johnson
3
4 #include "stogo.h"
5 #include "global.h"
6
7 class MyGlobal : public Global {
8 protected:
9   objective_func my_func;
10   void *my_data;
11
12 public:
13
14   MyGlobal(RTBox D, GlobalParams P, objective_func func, void *data) : Global(D, 0, 0, P), my_func(func), my_data(data) {}
15   
16   virtual double ObjectiveGradient(RCRVector xy, RVector &grad, whichO which){
17     ++numeval;
18     switch (which) {
19     case GRADIENT_ONLY:
20     case OBJECTIVE_AND_GRADIENT:
21       return my_func(xy.GetLength(), xy.raw_data_const(), grad.raw_data(), my_data);
22     case OBJECTIVE_ONLY:
23       return my_func(xy.GetLength(), xy.raw_data_const(), NULL, my_data);
24     }
25     return 0.0;
26   }
27 };
28
29 int stogo_minimize(int n,
30                    objective_func fgrad, void *data,
31                    double *x, double *fmin,
32                    const double *l, const double *u,
33 #ifdef NLOPT_UTIL_H
34                    nlopt_stopping *stop,
35 #else
36                    long int maxeval, double maxtime,
37 #endif
38                    int nrandom)
39 {
40   GlobalParams params;
41
42   // FIXME: WTF do these parameters mean?
43   params.rnd_pnts=nrandom;
44   params.det_pnts=2*n+1 - nrandom; 
45   params.eps_cl=0.1; params.rshift=0.3;
46   params.mu=1.0E-4;
47   params.stop = stop;
48
49   TBox D(n);
50   for (int i = 0; i < n; ++i) {
51     D.lb(i) = l[i];
52     D.ub(i) = u[i];
53   }
54
55   MyGlobal Problem(D, params, fgrad, data);
56   RVector dummyvec(n);
57   Problem.Search(-1, dummyvec);
58
59   if (Problem.NoMinimizers())
60     return 0;
61   
62   *fmin = Problem.OneMinimizer(dummyvec);
63   for (int i = 0; i < n; ++i) x[i] = dummyvec(i);
64   return 1;
65 }