27 typedef _Scalar Scalar;
31 typedef typename MathBaseTpl<Scalar>::VectorXs VectorXs;
32 typedef typename MathBaseTpl<Scalar>::MatrixXs MatrixXs;
34 typedef CppAD::cg::CG<Scalar> CGScalar;
35 typedef CppAD::AD<CGScalar> ADScalar;
39 typedef typename MathBaseTpl<ADScalar>::VectorXs ADVectorXs;
40 typedef typename MathBaseTpl<ADScalar>::MatrixXs ADMatrixXs;
41 typedef typename MathBaseTpl<ADScalar>::Vector3s ADVector3s;
42 typedef typename MathBaseTpl<ADScalar>::Matrix3s ADMatrix3s;
45 typename PINOCCHIO_EIGEN_PLAIN_ROW_MAJOR_TYPE(ADMatrixXs) RowADMatrixXs;
47 typedef CppAD::ADFun<CGScalar> ADFun;
50 std::shared_ptr<Base>
model,
52 const std::size_t
n_env = 0,
53 std::function<
void(std::shared_ptr<ADBase>,
54 const Eigen::Ref<const ADVectorXs>&)>
57 const std::string& function_name_calcDiff =
"calcDiff")
61 ad_data(ad_model->createData()),
63 function_name_calcDiff(function_name_calcDiff),
67 ad_X(ad_model->get_state()->get_nx() + ad_model->get_nu() +
n_env),
68 ad_X2(ad_model->get_state()->get_nx() + ad_model->get_nu() +
n_env),
69 ad_calcout(ad_model->get_state()->get_nx() + 1) {
70 const std::size_t ndx = ad_model->get_state()->get_ndx();
71 const std::size_t nu = ad_model->get_nu();
72 ad_calcDiffout.resize(2 * ndx * ndx + 2 * ndx * nu + nu * nu + ndx + nu);
77 static void empty_record_env(std::shared_ptr<ADBase>,
78 const Eigen::Ref<const ADVectorXs>&) {}
81 CppAD::Independent(ad_X);
82 const std::size_t nx = ad_model->get_state()->get_nx();
83 const std::size_t nu = ad_model->get_nu();
87 ad_model->calc(ad_data, ad_X.head(nx), ad_X.segment(nx, nu));
91 ad_calc.Dependent(ad_X, ad_calcout);
92 ad_calc.optimize(
"no_compare_op");
95 void collect_calcout() {
96 ad_calcout[0] = ad_data->cost;
97 ad_calcout.tail(ad_model->get_state()->get_nx()) = ad_data->xnext;
100 void collect_calcDiffout() {
101 ADVectorXs& ad_Y = ad_calcDiffout;
103 const std::size_t ndx = ad_model->get_state()->get_ndx();
104 const std::size_t nu = ad_model->get_nu();
105 Eigen::DenseIndex it_Y = 0;
106 Eigen::Map<ADMatrixXs>(ad_Y.data() + it_Y, ndx, ndx) = ad_data->Fx;
108 Eigen::Map<ADMatrixXs>(ad_Y.data() + it_Y, ndx, nu) = ad_data->Fu;
110 Eigen::Map<ADVectorXs>(ad_Y.data() + it_Y, ndx) = ad_data->Lx;
112 Eigen::Map<ADVectorXs>(ad_Y.data() + it_Y, nu) = ad_data->Lu;
114 Eigen::Map<ADMatrixXs>(ad_Y.data() + it_Y, ndx, ndx) = ad_data->Lxx;
116 Eigen::Map<ADMatrixXs>(ad_Y.data() + it_Y, ndx, nu) = ad_data->Lxu;
118 Eigen::Map<ADMatrixXs>(ad_Y.data() + it_Y, nu, nu) = ad_data->Luu;
121 void recordCalcDiff() {
122 CppAD::Independent(ad_X2);
123 const std::size_t nx = ad_model->get_state()->get_nx();
124 const std::size_t nu = ad_model->get_nu();
128 ad_model->calc(ad_data, ad_X2.head(nx), ad_X2.segment(nx, nu));
129 ad_model->calcDiff(ad_data, ad_X2.head(nx), ad_X2.segment(nx, nu));
131 collect_calcDiffout();
132 ad_calcDiff.Dependent(ad_X2, ad_calcDiffout);
133 ad_calcDiff.optimize(
"no_compare_op");
140 calcgen_ptr = std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> >(
142 calcgen_ptr->setCreateForwardZero(
true);
143 calcgen_ptr->setCreateJacobian(
false);
147 calcDiffgen_ptr = std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> >(
148 new CppAD::cg::ModelCSourceGen<Scalar>(ad_calcDiff,
149 function_name_calcDiff));
150 calcDiffgen_ptr->setCreateForwardZero(
true);
151 calcDiffgen_ptr->setCreateJacobian(
false);
153 libcgen_ptr = std::unique_ptr<CppAD::cg::ModelLibraryCSourceGen<Scalar> >(
154 new CppAD::cg::ModelLibraryCSourceGen<Scalar>(*calcgen_ptr,
157 dynamicLibManager_ptr =
158 std::unique_ptr<CppAD::cg::DynamicModelLibraryProcessor<Scalar> >(
159 new CppAD::cg::DynamicModelLibraryProcessor<Scalar>(*libcgen_ptr,
164 CppAD::cg::GccCompiler<Scalar> compiler;
165 std::vector<std::string> compile_options = compiler.getCompileFlags();
166 compile_options[0] =
"-O3";
167 compiler.setCompileFlags(compile_options);
168 dynamicLibManager_ptr->createDynamicLibrary(compiler,
false);
171 bool existLib()
const {
172 const std::string filename =
173 dynamicLibManager_ptr->getLibraryName() +
174 CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION;
175 std::ifstream file(filename.c_str());
179 void loadLib(
const bool generate_if_not_exist =
true) {
180 if (not existLib() && generate_if_not_exist) compileLib();
182 const auto it = dynamicLibManager_ptr->getOptions().find(
"dlOpenMode");
183 if (it == dynamicLibManager_ptr->getOptions().end()) {
184 dynamicLib_ptr.reset(
new CppAD::cg::LinuxDynamicLib<Scalar>(
185 dynamicLibManager_ptr->getLibraryName() +
186 CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION));
188 int dlOpenMode = std::stoi(it->second);
189 dynamicLib_ptr.reset(
new CppAD::cg::LinuxDynamicLib<Scalar>(
190 dynamicLibManager_ptr->getLibraryName() +
191 CppAD::cg::system::SystemInfo<>::DYNAMIC_LIB_EXTENSION,
196 calcDiffFun_ptr = dynamicLib_ptr->model(function_name_calcDiff.c_str());
199 void set_env(
const std::shared_ptr<ActionDataAbstract>& data,
200 const Eigen::Ref<const VectorXs>& env_val)
const {
201 Data* d =
static_cast<Data*
>(data.get());
202 d->xu.tail(
n_env) = env_val;
205 void calc(
const std::shared_ptr<ActionDataAbstract>& data,
206 const Eigen::Ref<const VectorXs>& x,
207 const Eigen::Ref<const VectorXs>& u) {
208 Data* d =
static_cast<Data*
>(data.get());
209 const std::size_t nx = ad_model->get_state()->get_nx();
210 const std::size_t nu = ad_model->get_nu();
213 d->xu.segment(nx, nu) = u;
215 calcFun_ptr->ForwardZero(d->xu, d->calcout);
216 d->distribute_calcout();
219 void calcDiff(
const std::shared_ptr<ActionDataAbstract>& data,
220 const Eigen::Ref<const VectorXs>& x,
221 const Eigen::Ref<const VectorXs>& u) {
222 Data* d =
static_cast<Data*
>(data.get());
223 const std::size_t nx = ad_model->get_state()->get_nx();
224 const std::size_t nu = ad_model->get_nu();
227 d->xu.segment(nx, nu) = u;
228 calcDiffFun_ptr->ForwardZero(d->xu, d->calcDiffout);
229 d->distribute_calcDiffout();
233 return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(),
this);
249 std::shared_ptr<ADBase> ad_model;
250 std::shared_ptr<ADActionDataAbstract> ad_data;
263 std::function<void(std::shared_ptr<ADBase>,
264 const Eigen::Ref<const ADVectorXs>&)>
271 ADVectorXs ad_X, ad_X2;
273 ADVectorXs ad_calcout;
274 ADVectorXs ad_calcDiffout;
276 ADFun ad_calc, ad_calcDiff;
278 std::unique_ptr<CppAD::cg::ModelCSourceGen<Scalar> > calcgen_ptr,
280 std::unique_ptr<CppAD::cg::ModelLibraryCSourceGen<Scalar> > libcgen_ptr;
281 std::unique_ptr<CppAD::cg::DynamicModelLibraryProcessor<Scalar> >
282 dynamicLibManager_ptr;
283 std::unique_ptr<CppAD::cg::DynamicLib<Scalar> > dynamicLib_ptr;
284 std::unique_ptr<CppAD::cg::GenericModel<Scalar> > calcFun_ptr,