1 /*  _________________________________________________________________________
2  *
3  *  Acro: A Common Repository for Optimizers
4  *  Copyright (c) 2008 Sandia Corporation.
5  *  This software is distributed under the BSD License.
6  *  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
7  *  the U.S. Government retains certain rights in this software.
8  *  For more information, see the README.txt file in the top Acro directory.
9  *  _________________________________________________________________________
10  */
11 
12 //
13 // Solver test w/constraints
14 //	using two functions
15 //
16 
17 #include <acro_config.h>
18 
19 #include <colin/Solver.h>
20 
21 #include <utilib/stl_auxiliary.h>
22 
23 using namespace colin;
24 using namespace std;
25 
26 
func(utilib::pvector<double> & vec,real & ans)27 void func(utilib::pvector<double>& vec, real& ans)
28 {
29    real val;
30    for (unsigned int i = 0; i < vec.size(); i++)
31       val += (i + 1) * vec[i];
32    ans = val;
33 }
34 
35 
36 #ifdef ACRO_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS
cfunc(utilib::pvector<double> & vec,utilib::pvector<real> & constraints)37 void cfunc(utilib::pvector<double>& vec, utilib::pvector<real >& constraints)
38 #else
39 void cfunc(utilib::pvector<double>& vec, utilib::BasicArray<real >& constraints)
40 #endif
41 {
42    for (unsigned int i = 0; i < constraints.size(); i++)
43    {
44       constraints[i] = vec[i] * vec[i] + i + 1.0;
45    }
46 }
47 
48 
49 class TestOptSolver : public Solver<utilib::pvector<double> >
50 {
51 public:
52 
53    void minimize();
54 
set_initial_point(utilib::pvector<double> & pt)55    void set_initial_point(utilib::pvector<double>& pt)
56    {curr = pt;}
57 
58 protected:
59 
initialize_best_point()60    void initialize_best_point() {best().point.resize(problem.num_real_params());}
61 
62    utilib::pvector<double> curr;
63 };
64 
65 
minimize()66 void TestOptSolver::minimize()
67 {
68    real tmp;
69    problem.EvalF(curr, tmp);
70    best().value() = tmp;
71 
72 #ifdef ACRO_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS
73    utilib::pvector<real > g(problem.num_real_params());
74    utilib::pvector<real > cf(problem.numConstraints());
75    utilib::pvector<utilib::pvector<real > > cg(problem.numConstraints());
76 #else
77    utilib::BasicArray<real > g(problem.num_real_params());
78    utilib::BasicArray<real > cf(problem.numConstraints());
79    utilib::BasicArray<utilib::BasicArray<real > > cg(problem.numConstraints());
80 #endif
81 
82    for (unsigned int i = 0; i < problem.numConstraints(); i++)
83    {
84       cg[i].resize(curr.size());
85    }
86 
87    int j = 0;
88    while (best().value() > accuracy)
89    {
90       for (unsigned int i = 0; i < curr.size(); i++)
91          curr[i] -= 0.0001;
92 
93       problem.EvalF(curr, tmp);
94       best().value() = tmp;
95       cout << j << " " << best().value() << " " << curr << endl;
96 
97       problem.EvalG(curr, g);
98       cout << j << " grad: " << g << endl;
99 
100       problem.EvalCF(curr, cf);
101       cout << j << " constraints: " << cf << endl;
102 
103       problem.EvalCG(curr, cg);
104       cout << j << " constraint gradients: " << endl;
105       for (unsigned int i = 0; i < problem.numConstraints(); i++)
106          cout << " " << i << " " << cg[i] << endl;
107 
108       j++;
109    }
110 }
111 
112 
113 
main()114 int main()
115 {
116    Problem<utilib::pvector<double> > prob;
117    OptSetup(prob, func, cfunc, "[-10.0,10.0]^3", 1, 2);
118 
119    TestOptSolver opt;
120 
121    utilib::pvector<double> point(4);
122    point << 10.0;
123 
124    opt.set_initial_point(point);
125    opt.set_problem(prob);
126    opt["sufficient_objective_value"] = 0.1;
127 
128    opt.reset();
129    opt.minimize();
130 
131    return 0;
132 }
133