- 3.0.2 core module.
DerivativesCppadJIT.h
Go to the documentation of this file.
1 /**********************************************************************************************************************
2 This file is part of the Control Toolbox (https://github.com/ethz-adrl/control-toolbox), copyright by ETH Zurich.
3 Licensed under the BSD-2 license (see LICENSE file in main directory)
4 **********************************************************************************************************************/
5 
6 #pragma once
7 
8 #ifdef CPPADCG
9 
10 #include <ct/core/types/AutoDiff.h>
14 
15 #include <cppad/cg/model/llvm/llvm.hpp>
16 
17 namespace ct {
18 namespace core {
19 
20 
22 
35 template <int IN_DIM, int OUT_DIM>
36 class DerivativesCppadJIT : public Derivatives<IN_DIM, OUT_DIM, double> // double on purpose!
37 {
38 public:
39  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
40 
41  using CG_SCALAR = ADCGScalar;
42  using CG_VALUE_TYPE = ADCGValueType;
43 
44  using IN_TYPE_CG = Eigen::Matrix<CG_SCALAR, IN_DIM, 1>;
45  using OUT_TYPE_CG = Eigen::Matrix<CG_SCALAR, OUT_DIM, 1>;
46 
47  using IN_TYPE_D = Eigen::Matrix<double, IN_DIM, 1>;
48  using OUT_TYPE_D = Eigen::Matrix<double, OUT_DIM, 1>;
49  using JAC_TYPE_D = Eigen::Matrix<double, OUT_DIM, IN_DIM>;
50  using JAC_TYPE_ROW_MAJOR = Eigen::Matrix<double, OUT_DIM, IN_DIM, Eigen::RowMajor>;
51  using HES_TYPE_D = Eigen::Matrix<double, IN_DIM, IN_DIM>;
52  using HES_TYPE_ROW_MAJOR = Eigen::Matrix<double, IN_DIM, IN_DIM, Eigen::RowMajor>;
53 
54 
55  using FUN_TYPE_CG = std::function<OUT_TYPE_CG(const IN_TYPE_CG&)>;
56  using DerivativesBase = Derivatives<IN_DIM, OUT_DIM>;
57 
70  DerivativesCppadJIT(FUN_TYPE_CG& f, int inputDim = IN_DIM, int outputDim = OUT_DIM);
71 
77  DerivativesCppadJIT(const DerivativesCppadJIT& arg);
78 
79 
81 
89  void update(FUN_TYPE_CG& f, const size_t inputDim = IN_DIM, const size_t outputDim = OUT_DIM);
90 
91  virtual ~DerivativesCppadJIT() = default;
92 
94  DerivativesCppadJIT* clone() const;
95 
96  virtual OUT_TYPE_D forwardZero(const Eigen::VectorXd& x);
97 
98  virtual JAC_TYPE_D jacobian(const Eigen::VectorXd& x);
99 
100  virtual void sparseJacobian(const Eigen::VectorXd& x,
101  Eigen::VectorXd& jac,
102  Eigen::VectorXi& iRow,
103  Eigen::VectorXi& jCol);
104 
105  virtual Eigen::VectorXd sparseJacobianValues(const Eigen::VectorXd& x);
106 
107 
108  virtual HES_TYPE_D hessian(const Eigen::VectorXd& x, const Eigen::VectorXd& lambda);
109 
110  virtual void sparseHessian(const Eigen::VectorXd& x,
111  const Eigen::VectorXd& lambda,
112  Eigen::VectorXd& hes,
113  Eigen::VectorXi& iRow,
114  Eigen::VectorXi& jCol);
115 
116 
117  virtual Eigen::VectorXd sparseHessianValues(const Eigen::VectorXd& x, const Eigen::VectorXd& lambda);
118 
120 
124  Eigen::Matrix<bool, Eigen::Dynamic, Eigen::Dynamic> getSparsityPatternJacobian();
125 
131  Eigen::Matrix<bool, Eigen::Dynamic, Eigen::Dynamic> getSparsityPatternHessian();
132 
133 
135 
142  void getSparsityPatternJacobian(Eigen::VectorXi& rows, Eigen::VectorXi& columns);
143 
149  size_t getNumNonZerosJacobian();
150 
156  size_t getNumNonZerosHessian();
157 
159 
166  void getSparsityPatternHessian(Eigen::VectorXi& rows, Eigen::VectorXi& columns);
167 
168 
170 
174  void compileJIT(const DerivativesCppadSettings& settings,
175  const std::string& libName = "unnamedLib",
176  bool verbose = false);
177 
179  const std::shared_ptr<CppAD::cg::DynamicLib<double>> getDynamicLib();
180 
181 #ifdef LLVM_VERSION_MAJOR
182  const std::shared_ptr<CppAD::cg::LlvmModelLibrary<double>> getLlvmLib();
184 #endif
185 
186 protected:
188  void recordCg();
189 
190  std::function<OUT_TYPE_CG(const IN_TYPE_CG&)> cgStdFun_;
191 
192  int inputDim_;
193  int outputDim_;
194 
195  CppAD::ADFun<CG_VALUE_TYPE> cgCppadFun_;
196 
197  bool compiled_;
198  std::string libName_;
199 
200  std::vector<size_t> sparsityRowsJacobian_;
201  std::vector<size_t> sparsityColsJacobian_;
202  std::vector<size_t> sparsityRowsHessian_;
203  std::vector<size_t> sparsityColsHessian_;
204 
205  Eigen::VectorXi sparsityRowsJacobianEigen_;
206  Eigen::VectorXi sparsityColsJacobianEigen_;
207  Eigen::VectorXi sparsityRowsHessianEigen_;
208  Eigen::VectorXi sparsityColsHessianEigen_;
210  CppAD::cg::GccCompiler<double> compiler_;
211  CppAD::cg::ClangCompiler<double> compilerClang_;
212  std::shared_ptr<CppAD::cg::DynamicLib<double>> dynamicLib_;
213  std::shared_ptr<CppAD::cg::GenericModel<double>> model_;
214 #ifdef LLVM_VERSION_MAJOR
215  std::shared_ptr<CppAD::cg::LlvmModelLibrary<double>> llvmModelLib_;
216 #endif
217 };
218 
219 
220 } /* namespace core */
221 } /* namespace ct */
222 
223 #endif
224 
const bool verbose
Definition: JacobianCGTest.h:19