5 #ifndef __pinocchio_utils_code_generator_base_hpp__ 6 #define __pinocchio_utils_code_generator_base_hpp__ 8 #include "pinocchio/multibody/model.hpp" 9 #include "pinocchio/multibody/data.hpp" 11 #ifdef PINOCCHIO_WITH_CPPADCG_SUPPORT 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;
43 typedef CppAD::ADFun<CGScalar> ADFun;
46 const Eigen::DenseIndex dim_input,
47 const Eigen::DenseIndex dim_output,
50 : ad_model(model.template cast<ADScalar>())
57 ad_X = ADVectorXs(dim_input);
58 ad_Y = ADVectorXs(dim_output);
60 y = VectorXs(ad_Y.size());
62 jac = RowMatrixXs(ad_Y.size(),ad_X.size());
73 cgen_ptr = std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> >(
new CppAD::cg::ModelCSourceGen<Scalar>(ad_fun,
function_name));
76 libcgen_ptr = std::unique_ptr<CppAD::cg::ModelLibraryCSourceGen<Scalar> >(
new CppAD::cg::ModelLibraryCSourceGen<Scalar>(*cgen_ptr));
79 = std::unique_ptr<CppAD::cg::DynamicModelLibraryProcessor<Scalar> >(
new CppAD::cg::DynamicModelLibraryProcessor<Scalar>(*libcgen_ptr,
library_name));
82 CppAD::cg::ModelCSourceGen<Scalar> & codeGenerator()
87 CppAD::cg::GccCompiler<Scalar> compiler;
88 std::vector<std::string> compile_options = compiler.getCompileFlags();
89 compile_options[0] =
"-Ofast";
90 compiler.setCompileFlags(compile_options);
91 dynamicLibManager_ptr->createDynamicLibrary(compiler,
false);
96 const std::string filename = dynamicLibManager_ptr->getLibraryName() + CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION;
97 std::ifstream file(filename.c_str());
101 void loadLib(
const bool generate_if_not_exist =
true)
103 if(not existLib() && generate_if_not_exist)
106 const auto it = dynamicLibManager_ptr->getOptions().find(
"dlOpenMode");
107 if (it == dynamicLibManager_ptr->getOptions().end())
109 dynamicLib_ptr.reset(
new CppAD::cg::LinuxDynamicLib<Scalar>(dynamicLibManager_ptr->getLibraryName() + CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION));
113 int dlOpenMode = std::stoi(it->second);
114 dynamicLib_ptr.reset(
new CppAD::cg::LinuxDynamicLib<Scalar>(dynamicLibManager_ptr->getLibraryName() + CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION, dlOpenMode));
117 generatedFun_ptr = dynamicLib_ptr->model(function_name.c_str());
120 template<
typename Vector>
121 void evalFunction(
const Eigen::MatrixBase<Vector> & x)
125 generatedFun_ptr->ForwardZero(PINOCCHIO_EIGEN_CONST_CAST(Vector,x),y);
128 template<
typename Vector>
129 void evalJacobian(
const Eigen::MatrixBase<Vector> & x)
133 CppAD::cg::ArrayView<const Scalar> x_(PINOCCHIO_EIGEN_CONST_CAST(Vector,x).data(),(
size_t)x.size());
134 CppAD::cg::ArrayView<Scalar> jac_(jac.data(),(size_t)jac.size());
135 generatedFun_ptr->Jacobian(x_,jac_);
159 ADVectorXs ad_X, ad_Y;
162 ADCongigVectorType ad_q, ad_q_plus;
163 ADTangentVectorType ad_dq, ad_v, ad_a;
168 std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> > cgen_ptr;
169 std::unique_ptr<CppAD::cg::ModelLibraryCSourceGen<Scalar> > libcgen_ptr;
170 std::unique_ptr<CppAD::cg::DynamicModelLibraryProcessor<Scalar> > dynamicLibManager_ptr;
171 std::unique_ptr<CppAD::cg::DynamicLib<Scalar> > dynamicLib_ptr;
172 std::unique_ptr<CppAD::cg::GenericModel<Scalar> > generatedFun_ptr;
178 #endif // PINOCCHIO_WITH_CPPADCG_SUPPORT 180 #endif // ifndef __pinocchio_utils_code_generator_base_hpp__ bool build_forward
Options to generate or not the source code for the evaluation function.
const std::string function_name
Name of the function.
VectorXs ConfigVectorType
Dense vectorized version of a joint configuration vector.
const std::string library_name
Name of the library.
bool build_jacobian
Options to build or not the Jacobian of he function.
Eigen::DenseIndex getOutputDimension() const
Dimension of the output vector.
virtual void buildMap()=0
build the mapping Y = f(X)
Eigen::DenseIndex getInputDimension() const
Dimension of the input vector.
Main pinocchio namespace.
std::string name
Model name;.
VectorXs TangentVectorType
Dense vectorized version of a joint tangent vector (e.g. velocity, acceleration, etc). It also handles the notion of co-tangent vector (e.g. torque, etc).