trajopt
 All Classes Namespaces Files Functions Variables Typedefs Pages
num_diff.hpp
1 #pragma once
2 #include <boost/function.hpp>
3 #include <Eigen/Dense>
4 #include <boost/shared_ptr.hpp>
5 /*
6  * Numerical derivatives
7  */
8 
9 namespace sco {
10 using boost::function;
11 using Eigen::VectorXd;
12 using Eigen::MatrixXd;
13 class ScalarOfVector;
14 class VectorOfVector;
15 class MatrixOfVector;
16 typedef boost::shared_ptr<ScalarOfVector> ScalarOfVectorPtr;
17 typedef boost::shared_ptr<VectorOfVector> VectorOfVectorPtr;
18 typedef boost::shared_ptr<MatrixOfVector> MatrixOfVectorPtr;
19 
21 public:
22  virtual double operator()(const VectorXd& x) const = 0;
23  double call(const VectorXd& x) const {return operator()(x);}
24  virtual ~ScalarOfVector() {}
25 
26  typedef function<double(VectorXd)> boost_func;
27  static ScalarOfVectorPtr construct(const boost_func&);
28  // typedef VectorXd (*c_func)(const VectorXd&);
29  // static ScalarOfVectorPtr construct(const c_func&);
30 
31 };
33 public:
34  virtual VectorXd operator()(const VectorXd& x) const = 0;
35  VectorXd call(const VectorXd& x) const {return operator()(x);}
36  virtual ~VectorOfVector() {}
37 
38  typedef function<VectorXd(VectorXd)> boost_func;
39  static VectorOfVectorPtr construct(const boost_func&);
40  // typedef VectorXd (*c_func)(const VectorXd&);
41  // static VectorOfVectorPtr construct(const c_func&);
42 
43 };
45 public:
46  virtual MatrixXd operator()(const VectorXd& x) const = 0;
47  MatrixXd call(const VectorXd& x) const {return operator()(x);}
48  virtual ~MatrixOfVector() {}
49 
50  typedef function<MatrixXd(VectorXd)> boost_func;
51  static MatrixOfVectorPtr construct(const boost_func&);
52  // typedef VectorMatrixXd (*c_func)(const VectorXd&);
53  // static MatrixOfVectorPtr construct(const c_func&);
54 };
55 
56 
57 VectorXd calcForwardNumGrad(const ScalarOfVector& f, const VectorXd& x, double epsilon);
58 MatrixXd calcForwardNumJac(const VectorOfVector& f, const VectorXd& x, double epsilon);
59 void calcGradAndDiagHess(const ScalarOfVector& f, const VectorXd& x, double epsilon,
60  double& y, VectorXd& grad, VectorXd& hess);
61 void calcGradHess(ScalarOfVectorPtr f, const VectorXd& x, double epsilon,
62  double& y, VectorXd& grad, MatrixXd& hess);
63 VectorOfVectorPtr forwardNumGrad(ScalarOfVectorPtr f, double epsilon);
64 MatrixOfVectorPtr forwardNumJac(VectorOfVectorPtr f, double epsilon);
65 
66 
67 
68 }