5 #ifndef __pinocchio_utils_code_generator_base_hpp__
6 #define __pinocchio_utils_code_generator_base_hpp__
8 #include "pinocchio/codegen/cppadcg.hpp"
10 #include "pinocchio/multibody/model.hpp"
11 #include "pinocchio/multibody/data.hpp"
16 template<
typename _Scalar>
19 typedef _Scalar Scalar;
20 typedef CppAD::cg::CG<Scalar> CGScalar;
21 typedef CppAD::AD<CGScalar> ADScalar;
32 typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic,Options> MatrixXs;
33 typedef Eigen::Matrix<Scalar,Eigen::Dynamic,1,Options> VectorXs;
34 typedef Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic,Options|Eigen::RowMajor> RowMatrixXs;
35 typedef Eigen::Matrix<ADScalar,Eigen::Dynamic,1,Options> ADVectorXs;
36 typedef Eigen::Matrix<ADScalar,Eigen::Dynamic,Eigen::Dynamic,Options> ADMatrixXs;
44 typedef CppAD::ADFun<CGScalar> ADFun;
47 const Eigen::DenseIndex dim_input,
48 const Eigen::DenseIndex dim_output,
51 : ad_model(model.template cast<ADScalar>())
58 ad_X = ADVectorXs(dim_input);
59 ad_Y = ADVectorXs(dim_output);
61 y = VectorXs(ad_Y.size());
63 jac = RowMatrixXs(ad_Y.size(),ad_X.size());
74 cgen_ptr = std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> >(
new CppAD::cg::ModelCSourceGen<Scalar>(ad_fun,
function_name));
77 libcgen_ptr = std::unique_ptr<CppAD::cg::ModelLibraryCSourceGen<Scalar> >(
new CppAD::cg::ModelLibraryCSourceGen<Scalar>(*cgen_ptr));
80 = std::unique_ptr<CppAD::cg::DynamicModelLibraryProcessor<Scalar> >(
new CppAD::cg::DynamicModelLibraryProcessor<Scalar>(*libcgen_ptr,
library_name));
83 CppAD::cg::ModelCSourceGen<Scalar> & codeGenerator()
86 void compileLib(
const std::string& gccPath =
"/usr/bin/gcc")
88 CppAD::cg::GccCompiler<Scalar> compiler(gccPath);
89 std::vector<std::string> compile_options = compiler.getCompileFlags();
90 compile_options[0] =
"-Ofast";
91 compiler.setCompileFlags(compile_options);
92 dynamicLibManager_ptr->createDynamicLibrary(compiler,
false);
97 const std::string filename = dynamicLibManager_ptr->getLibraryName() + CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION;
98 std::ifstream file(filename.c_str());
102 void compileAndLoadLib(
const std::string& gccPath)
108 void loadLib(
const bool generate_if_not_exist =
true)
110 if(!existLib() && generate_if_not_exist)
113 const auto it = dynamicLibManager_ptr->getOptions().find(
"dlOpenMode");
114 if (it == dynamicLibManager_ptr->getOptions().end())
116 dynamicLib_ptr.reset(
new CppAD::cg::LinuxDynamicLib<Scalar>(dynamicLibManager_ptr->getLibraryName() + CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION));
120 int dlOpenMode = std::stoi(it->second);
121 dynamicLib_ptr.reset(
new CppAD::cg::LinuxDynamicLib<Scalar>(dynamicLibManager_ptr->getLibraryName() + CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION, dlOpenMode));
124 generatedFun_ptr = dynamicLib_ptr->model(
function_name.c_str());
127 template<
typename Vector>
128 void evalFunction(
const Eigen::MatrixBase<Vector> & x)
132 generatedFun_ptr->ForwardZero(PINOCCHIO_EIGEN_CONST_CAST(Vector,x),y);
135 template<
typename Vector>
136 void evalJacobian(
const Eigen::MatrixBase<Vector> & x)
140 CppAD::cg::ArrayView<const Scalar> x_(PINOCCHIO_EIGEN_CONST_CAST(Vector,x).data(),(
size_t)x.size());
141 CppAD::cg::ArrayView<Scalar> jac_(jac.data(),(
size_t)jac.size());
142 generatedFun_ptr->Jacobian(x_,jac_);
166 ADVectorXs ad_X, ad_Y;
169 ADConfigVectorType ad_q, ad_q_plus;
170 ADTangentVectorType ad_dq, ad_v, ad_a;
175 std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> > cgen_ptr;
176 std::unique_ptr<CppAD::cg::ModelLibraryCSourceGen<Scalar> > libcgen_ptr;
177 std::unique_ptr<CppAD::cg::DynamicModelLibraryProcessor<Scalar> > dynamicLibManager_ptr;
178 std::unique_ptr<CppAD::cg::DynamicLib<Scalar> > dynamicLib_ptr;
179 std::unique_ptr<CppAD::cg::GenericModel<Scalar> > generatedFun_ptr;
185 #endif // ifndef __pinocchio_utils_code_generator_base_hpp__