Simbody  3.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OptimizerRep.h
Go to the documentation of this file.
1 #ifndef SimTK_SIMMATH_OPTIMIZER_REP_H_
2 #define SimTK_SIMMATH_OPTIMIZER_REP_H_
3 
4 /* -------------------------------------------------------------------------- *
5  * Simbody(tm): SimTKmath *
6  * -------------------------------------------------------------------------- *
7  * This is part of the SimTK biosimulation toolkit originating from *
8  * Simbios, the NIH National Center for Physics-Based Simulation of *
9  * Biological Structures at Stanford, funded under the NIH Roadmap for *
10  * Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
11  * *
12  * Portions copyright (c) 2006-13 Stanford University and the Authors. *
13  * Authors: Jack Middleton *
14  * Contributors: Michael Sherman *
15  * *
16  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
17  * not use this file except in compliance with the License. You may obtain a *
18  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
19  * *
20  * Unless required by applicable law or agreed to in writing, software *
21  * distributed under the License is distributed on an "AS IS" BASIS, *
22  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
23  * See the License for the specific language governing permissions and *
24  * limitations under the License. *
25  * -------------------------------------------------------------------------- */
26 
27 #include "SimTKcommon.h"
28 #include "simmath/Optimizer.h"
29 #include "simmath/Differentiator.h"
30 #include <map>
31 
32 namespace SimTK {
33 
34 
35 /* class for Diff jacobian */
37 public:
38  SysObjectiveFunc(int ny, const OptimizerSystem* sysPtr )
39  : Differentiator::GradientFunction(ny) { sysp = sysPtr; }
40 
41  // Must provide this pure virtual function.
42  int f(const Vector& y, Real& fy) const {
43  return(sysp->objectiveFunc(y, true, fy)); // class user's objectiveFunc
44  }
46 };
47 
48 
49 /* class for Diff gradient */
51  public:
52  SysConstraintFunc(int nf, int ny, const OptimizerSystem* sysPtr)
53  : Differentiator::JacobianFunction(nf,ny) { sysp = sysPtr; }
54 
55  // Must provide this pure virtual function.
56  int f(const Vector& y, Vector& fy) const {
57  return(sysp->constraintFunc(y, true, fy)); // calls user's contraintFunc
58  }
60 };
61 
62 
64 public:
65  virtual ~OptimizerRep();
67  : sysp(&sys),
68  myHandle(0),
69  cf(0),
70  of(0),
71  jacDiff(0),
72  gradDiff(0),
73  convergenceTolerance(Real(1e-3)),
74  constraintTolerance(Real(1e-4)),
75  maxIterations(1000),
76  limitedMemoryHistory(50),
77  diagnosticsLevel(0),
78  diffMethod(Differentiator::CentralDifference),
79  objectiveEstimatedAccuracy(SignificantReal),
80  constraintsEstimatedAccuracy(SignificantReal),
81  numericalGradient(false),
82  numericalJacobian(false)
83 
84  {
85  }
87  : sysp(0),
88  myHandle(0),
89  cf(0),
90  of(0),
91  jacDiff(0),
92  gradDiff(0),
93  convergenceTolerance(Real(1e-3)),
94  constraintTolerance(Real(1e-4)),
95  maxIterations(1000),
96  limitedMemoryHistory(50),
97  diagnosticsLevel(0),
98  diffMethod(Differentiator::CentralDifference),
99  objectiveEstimatedAccuracy(SignificantReal),
100  constraintsEstimatedAccuracy(SignificantReal),
101  numericalGradient(false),
102  numericalJacobian(false)
103  {
104  }
105 
106  virtual OptimizerRep* clone() const { return 0; };
107  static bool isAvailable() { return true; }
108 
109  virtual Real optimize( Vector &results ) = 0;
110 
111  const OptimizerSystem& getOptimizerSystem() const {return *sysp;}
112 
113 
114  void setDiagnosticsLevel( const int level );
115  void setConvergenceTolerance( Real accuracy );
116  void setConstraintTolerance( Real tolerance );
117  void setMaxIterations( const int iter );
118  void setLimitedMemoryHistory( const int history );
119 
120  bool setAdvancedStrOption( const std::string &option, const std::string &value );
121  bool setAdvancedRealOption( const std::string &option, const Real value );
122  bool setAdvancedIntOption( const std::string &option, const int value );
123  bool setAdvancedBoolOption( const std::string &option, const bool value );
124 
125  bool getAdvancedStrOption( const std::string &option, std::string &value ) const;
126  bool getAdvancedRealOption( const std::string &option, Real &value ) const;
127  bool getAdvancedIntOption( const std::string &option, int &value ) const;
128  bool getAdvancedBoolOption( const std::string &option, bool &value ) const;
129 
130  void setMyHandle(Optimizer& cp) {myHandle = &cp;}
131  const Optimizer& getMyHandle() const {assert(myHandle); return *myHandle;}
132  void clearMyHandle() {myHandle=0;}
133 
134  void useNumericalGradient(bool flag, Real objEstAccuracy);
135  void useNumericalJacobian(bool flag, Real consEstAccuracy);
136  void setDifferentiatorMethod( Differentiator::Method method);
137 
138  bool isUsingNumericalGradient() const { return numericalGradient; }
139  bool isUsingNumericalJacobian() const { return numericalJacobian; }
140  Differentiator::Method getDifferentiatorMethod() const {return diffMethod;}
141  Real getEstimatedAccuracyOfObjective() const
142  { return objectiveEstimatedAccuracy; }
143  Real getEstimatedAccuracyOfConstraints() const
144  { return constraintsEstimatedAccuracy; }
145 
147  assert(gradDiff);
148  return *gradDiff;
149  }
150 
152  assert(jacDiff);
153  return *jacDiff;
154  }
155 
156  virtual OptimizerAlgorithm getAlgorithm() const = 0;
157 
158  static int numericalGradient_static( const OptimizerSystem&, const Vector & parameters, const bool new_parameters, Vector &gradient );
159  static int numericalJacobian_static(const OptimizerSystem&,
160  const Vector& parameters, const bool new_parameters, Matrix& jacobian );
161 
162 protected:
163  // These methods are to be called by derived classes as an interface
164  // to the OptimizerSystem virtuals. The signature must match that required by
165  // IpOpt's matching callbacks. We're using the "user data" argument to pass in
166  // the current OptimizerRep, making these behave like non-static members.
167 
168  static int objectiveFuncWrapper ( int n, const Real* x, int new_x, Real* f, void* rep);
169  static int gradientFuncWrapper ( int n, const Real* x, int new_x, Real* gradient, void* rep);
170  static int constraintFuncWrapper( int n, const Real* x, int new_x, int m, Real* g, void* rep);
171  static int constraintJacobianWrapper( int n, const Real* x, int new_x,int m, int nele_jac,
172  int* iRow, int* jCol, Real* values, void* rep);
173  static int hessianWrapper( int n, const Real* x, int new_x, Real obj_factor,
174  int m, Real* lambda, int new_lambda,
175  int nele_hess, int* iRow, int* jCol,
176  Real* values, void* rep);
177 
186 
187 private:
188  const OptimizerSystem* sysp;
189  bool numericalGradient; // true if optimizer will compute an numerical gradient
190  bool numericalJacobian; // true if optimizer will compute an numerical Jacobian
191  Differentiator *gradDiff;
192  Differentiator *jacDiff;
193 
194  SysObjectiveFunc *of;
195  SysConstraintFunc *cf;
196 
197  std::map<std::string, std::string> advancedStrOptions;
198  std::map<std::string, Real> advancedRealOptions;
199  std::map<std::string, int> advancedIntOptions;
200  std::map<std::string, bool> advancedBoolOptions;
201 
202  friend class Optimizer;
203  Optimizer* myHandle; // The owner handle of this Rep.
204 
205 }; // end class OptimizerRep
206 
208  Real optimize( Vector &results );
209  OptimizerRep* clone() const;
210  OptimizerAlgorithm getAlgorithm() const;
211 };
212 
213 } // namespace SimTK
214 
215 
216 #endif // SimTK_SIMMATH_OPTIMIZER_REP_H_