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