GCC Code Coverage Report


Directory: ./
File: unittest/test_actions.cpp
Date: 2025-02-24 23:41:29
Exec Total Coverage
Lines: 179 183 97.8%
Branches: 352 762 46.2%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2019-2023, LAAS-CNRS, New York University, Max Planck
5 // Gesellschaft
6 // University of Edinburgh, INRIA
7 // Copyright note valid unless otherwise stated in individual files.
8 // All rights reserved.
9 ///////////////////////////////////////////////////////////////////////////////
10
11 #define BOOST_TEST_NO_MAIN
12 #define BOOST_TEST_ALTERNATIVE_INIT_API
13
14 #include "factory/action.hpp"
15 #include "factory/control.hpp"
16 #include "factory/diff_action.hpp"
17 #include "factory/integrator.hpp"
18 #include "unittest_common.hpp"
19
20 using namespace boost::unit_test;
21 using namespace crocoddyl::unittest;
22
23 //----------------------------------------------------------------------------//
24
25 214 void test_check_data(
26 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model) {
27 // Run the print function
28
1/2
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
214 std::ostringstream tmp;
29
1/2
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
214 tmp << *model;
30
31 // create the corresponding data object
32 const std::shared_ptr<crocoddyl::ActionDataAbstract>& data =
33
1/2
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
214 model->createData();
34
7/14
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 214 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 214 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 214 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 214 times.
214 BOOST_CHECK(model->checkData(data));
35 214 }
36
37 214 void test_calc(const std::shared_ptr<crocoddyl::ActionModelAbstract>& model) {
38 // create the corresponding data object
39 const std::shared_ptr<crocoddyl::ActionDataAbstract>& data =
40
1/2
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
214 model->createData();
41 214 data->cost = nan("");
42
43 // Generating random state and control vectors
44
1/2
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
214 const Eigen::VectorXd x = model->get_state()->rand();
45
2/4
✓ Branch 3 taken 214 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 214 times.
✗ Branch 7 not taken.
214 const Eigen::VectorXd u = Eigen::VectorXd::Random(model->get_nu());
46
47 // Getting the state dimension from calc() call
48
3/6
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 214 times.
✗ Branch 9 not taken.
214 model->calc(data, x, u);
49
6/12
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 20 taken 214 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 214 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 214 times.
214 BOOST_CHECK(static_cast<std::size_t>(data->xnext.size()) ==
50 model->get_state()->get_nx());
51
52 // Checking that calc returns a cost value
53
6/12
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 214 times.
214 BOOST_CHECK(!std::isnan(data->cost));
54
55 // Checking the termninal state
56 214 double tol = std::sqrt(2.0 * std::numeric_limits<double>::epsilon());
57
2/4
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
214 model->calc(data, x);
58
9/18
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 214 times.
✗ Branch 16 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 214 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 214 times.
✗ Branch 32 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 214 times.
214 BOOST_CHECK((data->xnext - x).head(model->get_state()->get_nq()).isZero(tol));
59 214 }
60
61 214 void test_partial_derivatives_against_numdiff(
62 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model) {
63 // create the corresponding data object and set the cost to nan
64 const std::shared_ptr<crocoddyl::ActionDataAbstract>& data =
65
1/2
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
214 model->createData();
66
67
1/2
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
214 crocoddyl::ActionModelNumDiff model_num_diff(model);
68 const std::shared_ptr<crocoddyl::ActionDataAbstract>& data_num_diff =
69
1/2
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
214 model_num_diff.createData();
70
71 // Generating random values for the state and control
72
1/2
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
214 Eigen::VectorXd x = model->get_state()->rand();
73
2/4
✓ Branch 3 taken 214 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 214 times.
✗ Branch 7 not taken.
214 const Eigen::VectorXd u = Eigen::VectorXd::Random(model->get_nu());
74
75 // Computing the action derivatives
76
3/6
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 214 times.
✗ Branch 9 not taken.
214 model->calc(data, x, u);
77
3/6
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 214 times.
✗ Branch 9 not taken.
214 model->calcDiff(data, x, u);
78
3/6
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 214 times.
✗ Branch 8 not taken.
214 model_num_diff.calc(data_num_diff, x, u);
79
3/6
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 214 times.
✗ Branch 8 not taken.
214 model_num_diff.calcDiff(data_num_diff, x, u);
80 // Tolerance defined as in
81 // http://www.it.uom.gr/teaching/linearalgebra/NumericalRecipiesInC/c5-7.pdf
82 214 double tol = std::pow(model_num_diff.get_disturbance(), 1. / 3.);
83
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->h - data_num_diff->h).isZero(tol));
84
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->g - data_num_diff->g).isZero(tol));
85
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Fx - data_num_diff->Fx).isZero(tol));
86
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Fu - data_num_diff->Fu).isZero(tol));
87
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Lx - data_num_diff->Lx).isZero(tol));
88
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Lu - data_num_diff->Lu).isZero(tol));
89
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 214 times.
214 if (model_num_diff.get_with_gauss_approx()) {
90 BOOST_CHECK((data->Lxx - data_num_diff->Lxx).isZero(tol));
91 BOOST_CHECK((data->Lxu - data_num_diff->Lxu).isZero(tol));
92 BOOST_CHECK((data->Luu - data_num_diff->Luu).isZero(tol));
93 }
94
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Hx - data_num_diff->Hx).isZero(tol));
95
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Hu - data_num_diff->Hu).isZero(tol));
96
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Gx - data_num_diff->Gx).isZero(tol));
97
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Gu - data_num_diff->Gu).isZero(tol));
98
99 // Computing the action derivatives
100
1/2
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
214 x = model->get_state()->rand();
101
2/4
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
214 model->calc(data, x);
102
2/4
✓ Branch 2 taken 214 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
214 model->calcDiff(data, x);
103
2/4
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
214 model_num_diff.calc(data_num_diff, x);
104
2/4
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 214 times.
✗ Branch 5 not taken.
214 model_num_diff.calcDiff(data_num_diff, x);
105
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->h - data_num_diff->h).isZero(tol));
106
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->g - data_num_diff->g).isZero(tol));
107
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Lx - data_num_diff->Lx).isZero(tol));
108
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 214 times.
214 if (model_num_diff.get_with_gauss_approx()) {
109 BOOST_CHECK((data->Lxx - data_num_diff->Lxx).isZero(tol));
110 }
111
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Hx - data_num_diff->Hx).isZero(tol));
112
8/16
✓ Branch 1 taken 214 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 214 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 214 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 214 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 214 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 214 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 214 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 214 times.
214 BOOST_CHECK((data->Gx - data_num_diff->Gx).isZero(tol));
113 214 }
114
115 7 void test_check_action_data(ActionModelTypes::Type action_model_type) {
116 // create the model
117
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 ActionModelFactory factory;
118 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model =
119
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 factory.create(action_model_type);
120
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 test_check_data(model);
121 7 }
122
123 207 void test_check_integrated_action_data(
124 DifferentialActionModelTypes::Type dam_type,
125 IntegratorTypes::Type integrator_type, ControlTypes::Type control_type) {
126 // create the differential action model
127
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 DifferentialActionModelFactory factory_dam;
128 const std::shared_ptr<crocoddyl::DifferentialActionModelAbstract>& dam =
129
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 factory_dam.create(dam_type);
130 // create the control discretization
131
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 ControlFactory factory_ctrl;
132 const std::shared_ptr<crocoddyl::ControlParametrizationModelAbstract>& ctrl =
133
1/2
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
207 factory_ctrl.create(control_type, dam->get_nu());
134 // create the integrator
135
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 IntegratorFactory factory_int;
136 const std::shared_ptr<crocoddyl::IntegratedActionModelAbstract>& model =
137
1/2
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
207 factory_int.create(integrator_type, dam, ctrl);
138
1/2
✓ Branch 2 taken 207 times.
✗ Branch 3 not taken.
207 test_check_data(model);
139 207 }
140
141 7 void test_calc_action_model(ActionModelTypes::Type action_model_type) {
142 // create the model
143
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 ActionModelFactory factory;
144 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model =
145
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 factory.create(action_model_type);
146
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 test_calc(model);
147 7 }
148
149 207 void test_calc_integrated_action_model(
150 DifferentialActionModelTypes::Type dam_type,
151 IntegratorTypes::Type integrator_type, ControlTypes::Type control_type) {
152 // create the differential action model
153
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 DifferentialActionModelFactory factory_dam;
154 const std::shared_ptr<crocoddyl::DifferentialActionModelAbstract>& dam =
155
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 factory_dam.create(dam_type);
156 // create the control discretization
157
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 ControlFactory factory_ctrl;
158 const std::shared_ptr<crocoddyl::ControlParametrizationModelAbstract>& ctrl =
159
1/2
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
207 factory_ctrl.create(control_type, dam->get_nu());
160 // create the integrator
161
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 IntegratorFactory factory_int;
162 const std::shared_ptr<crocoddyl::IntegratedActionModelAbstract>& model =
163
1/2
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
207 factory_int.create(integrator_type, dam, ctrl);
164
1/2
✓ Branch 2 taken 207 times.
✗ Branch 3 not taken.
207 test_calc(model);
165 207 }
166
167 7 void test_partial_derivatives_action_model(
168 ActionModelTypes::Type action_model_type) {
169 // create the model
170
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 ActionModelFactory factory;
171 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model =
172
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 factory.create(action_model_type);
173
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 test_partial_derivatives_against_numdiff(model);
174 7 }
175
176 207 void test_partial_derivatives_integrated_action_model(
177 DifferentialActionModelTypes::Type dam_type,
178 IntegratorTypes::Type integrator_type, ControlTypes::Type control_type) {
179 // create the differential action model
180
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 DifferentialActionModelFactory factory_dam;
181 const std::shared_ptr<crocoddyl::DifferentialActionModelAbstract>& dam =
182
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 factory_dam.create(dam_type);
183 // create the control discretization
184
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 ControlFactory factory_ctrl;
185 const std::shared_ptr<crocoddyl::ControlParametrizationModelAbstract>& ctrl =
186
1/2
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
207 factory_ctrl.create(control_type, dam->get_nu());
187 // create the integrator
188
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 IntegratorFactory factory_int;
189 const std::shared_ptr<crocoddyl::IntegratedActionModelAbstract>& model =
190
1/2
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
207 factory_int.create(integrator_type, dam, ctrl);
191
1/2
✓ Branch 2 taken 207 times.
✗ Branch 3 not taken.
207 test_partial_derivatives_against_numdiff(model);
192 207 }
193
194 /**
195 * Test two action models that should provide the same result when calling calc
196 * if the first part of the control input u of model2 is equal to the control
197 * input of model1. A typical case would be an integrated action model using an
198 * Euler integration scheme, which can be coupled either with a constant control
199 * parametrization (model1) or a linear control parametrization (model2), and
200 * should thus provide the same result as long as the control input at the
201 * beginning of the step has the same value.
202 */
203 46 void test_calc_against_calc(
204 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model1,
205 const std::shared_ptr<crocoddyl::ActionModelAbstract>& model2) {
206 // create the corresponding data object and set the cost to nan
207 const std::shared_ptr<crocoddyl::ActionDataAbstract>& data1 =
208
1/2
✓ Branch 2 taken 46 times.
✗ Branch 3 not taken.
46 model1->createData();
209 const std::shared_ptr<crocoddyl::ActionDataAbstract>& data2 =
210
1/2
✓ Branch 2 taken 46 times.
✗ Branch 3 not taken.
46 model2->createData();
211
212 // Generating random values for the state and control
213
1/2
✓ Branch 4 taken 46 times.
✗ Branch 5 not taken.
46 const Eigen::VectorXd x = model1->get_state()->rand();
214
2/4
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 46 times.
✗ Branch 7 not taken.
46 Eigen::VectorXd u1 = Eigen::VectorXd::Random(model1->get_nu());
215
2/4
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 46 times.
✗ Branch 7 not taken.
46 Eigen::VectorXd u2 = Eigen::VectorXd::Random(model2->get_nu());
216 // copy u1 to the first part of u2 (assuming u2 is larger than u1)
217
2/4
✓ Branch 2 taken 46 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 46 times.
✗ Branch 6 not taken.
46 u2.head(u1.size()) = u1;
218
219 // Computing the action
220
3/6
✓ Branch 2 taken 46 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 46 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 46 times.
✗ Branch 9 not taken.
46 model1->calc(data1, x, u1);
221
3/6
✓ Branch 2 taken 46 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 46 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 46 times.
✗ Branch 9 not taken.
46 model2->calc(data2, x, u2);
222
223 // Checking the state and cost integration
224
8/16
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 46 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 46 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 46 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 46 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 46 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 46 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 46 times.
46 BOOST_CHECK((data1->xnext - data2->xnext).isZero(1e-9));
225
6/12
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 46 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 46 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 46 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 46 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 46 times.
46 BOOST_CHECK(abs(data1->cost - data2->cost) < 1e-9);
226 46 }
227
228 46 void register_test_calc_integrated_action_model(
229 DifferentialActionModelTypes::Type dam_type,
230 IntegratorTypes::Type integrator_type, ControlTypes::Type control_type1,
231 ControlTypes::Type control_type2) {
232 // create the differential action model
233
1/2
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
46 DifferentialActionModelFactory factory_dam;
234 const std::shared_ptr<crocoddyl::DifferentialActionModelAbstract>& dam =
235
1/2
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
46 factory_dam.create(dam_type);
236 // create the control discretization
237
1/2
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
46 ControlFactory factory_ctrl;
238 const std::shared_ptr<crocoddyl::ControlParametrizationModelAbstract>& ctrl1 =
239
1/2
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
46 factory_ctrl.create(control_type1, dam->get_nu());
240 const std::shared_ptr<crocoddyl::ControlParametrizationModelAbstract>& ctrl2 =
241
1/2
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
46 factory_ctrl.create(control_type2, dam->get_nu());
242 // create the integrator
243
1/2
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
46 IntegratorFactory factory_int;
244 const std::shared_ptr<crocoddyl::IntegratedActionModelAbstract>& model1 =
245
1/2
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
46 factory_int.create(integrator_type, dam, ctrl1);
246 const std::shared_ptr<crocoddyl::IntegratedActionModelAbstract>& model2 =
247
1/2
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
46 factory_int.create(integrator_type, dam, ctrl2);
248
249
2/4
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 46 times.
✗ Branch 5 not taken.
46 boost::test_tools::output_test_stream test_name;
250
3/6
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 46 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 46 times.
✗ Branch 8 not taken.
46 test_name << "test_calc_integrated_action_model_" << dam_type << "_"
251
5/10
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 46 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 46 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 46 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 46 times.
✗ Branch 14 not taken.
46 << integrator_type << "_" << control_type1 << "_" << control_type2;
252
4/8
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 46 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 46 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 46 times.
✗ Branch 11 not taken.
46 std::cout << "Running " << test_name.str() << std::endl;
253
4/8
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 46 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 46 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 46 times.
✗ Branch 12 not taken.
46 test_suite* ts = BOOST_TEST_SUITE(test_name.str());
254 92 ts->add(
255
5/10
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 46 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 46 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 46 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 46 times.
✗ Branch 17 not taken.
46 BOOST_TEST_CASE(boost::bind(&test_calc_against_calc, model1, model2)));
256
3/6
✓ Branch 1 taken 46 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 46 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 46 times.
✗ Branch 7 not taken.
46 framework::master_test_suite().add(ts);
257 46 }
258
259 //----------------------------------------------------------------------------//
260
261 7 void register_action_model_unit_tests(
262 ActionModelTypes::Type action_model_type) {
263
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 boost::test_tools::output_test_stream test_name;
264
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 test_name << "test_" << action_model_type;
265
4/8
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
7 std::cout << "Running " << test_name.str() << std::endl;
266
4/8
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
7 test_suite* ts = BOOST_TEST_SUITE(test_name.str());
267 14 ts->add(
268
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
7 BOOST_TEST_CASE(boost::bind(&test_check_action_data, action_model_type)));
269 14 ts->add(
270
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
7 BOOST_TEST_CASE(boost::bind(&test_calc_action_model, action_model_type)));
271
5/10
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
7 ts->add(BOOST_TEST_CASE(
272 boost::bind(&test_partial_derivatives_action_model, action_model_type)));
273
3/6
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
7 framework::master_test_suite().add(ts);
274 7 }
275
276 207 void register_integrated_action_model_unit_tests(
277 DifferentialActionModelTypes::Type dam_type,
278 IntegratorTypes::Type integrator_type, ControlTypes::Type control_type) {
279
2/4
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 207 times.
✗ Branch 5 not taken.
207 boost::test_tools::output_test_stream test_name;
280
5/10
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 207 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 207 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 207 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 207 times.
✗ Branch 14 not taken.
207 test_name << "test_" << dam_type << "_" << integrator_type << "_"
281
1/2
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
207 << control_type;
282
4/8
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 207 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 207 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 207 times.
✗ Branch 11 not taken.
207 std::cout << "Running " << test_name.str() << std::endl;
283
4/8
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 207 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 207 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 207 times.
✗ Branch 12 not taken.
207 test_suite* ts = BOOST_TEST_SUITE(test_name.str());
284 414 ts->add(
285
5/10
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 207 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 207 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 207 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 207 times.
✗ Branch 15 not taken.
207 BOOST_TEST_CASE(boost::bind(&test_check_integrated_action_data, dam_type,
286 integrator_type, control_type)));
287 414 ts->add(
288
5/10
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 207 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 207 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 207 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 207 times.
✗ Branch 15 not taken.
207 BOOST_TEST_CASE(boost::bind(&test_calc_integrated_action_model, dam_type,
289 integrator_type, control_type)));
290
5/10
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 207 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 207 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 207 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 207 times.
✗ Branch 15 not taken.
207 ts->add(BOOST_TEST_CASE(
291 boost::bind(&test_partial_derivatives_integrated_action_model, dam_type,
292 integrator_type, control_type)));
293
3/6
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 207 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 207 times.
✗ Branch 7 not taken.
207 framework::master_test_suite().add(ts);
294 207 }
295
296 1 bool init_function() {
297
2/2
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
8 for (size_t i = 0; i < ActionModelTypes::all.size(); ++i) {
298 7 register_action_model_unit_tests(ActionModelTypes::all[i]);
299 }
300
301
2/2
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 1 times.
24 for (size_t i = 0; i < DifferentialActionModelTypes::all.size(); ++i) {
302 23 register_integrated_action_model_unit_tests(
303 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorEuler,
304 ControlTypes::PolyZero);
305 23 register_integrated_action_model_unit_tests(
306 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK2,
307 ControlTypes::PolyZero);
308 23 register_integrated_action_model_unit_tests(
309 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK2,
310 ControlTypes::PolyOne);
311 23 register_integrated_action_model_unit_tests(
312 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK3,
313 ControlTypes::PolyZero);
314 23 register_integrated_action_model_unit_tests(
315 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK3,
316 ControlTypes::PolyOne);
317 23 register_integrated_action_model_unit_tests(
318 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK3,
319 ControlTypes::PolyTwoRK3);
320 23 register_integrated_action_model_unit_tests(
321 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK4,
322 ControlTypes::PolyZero);
323 23 register_integrated_action_model_unit_tests(
324 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK4,
325 ControlTypes::PolyOne);
326 23 register_integrated_action_model_unit_tests(
327 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorRK4,
328 ControlTypes::PolyTwoRK4);
329 }
330
331
2/2
✓ Branch 1 taken 23 times.
✓ Branch 2 taken 1 times.
24 for (size_t i = 0; i < DifferentialActionModelTypes::all.size(); ++i) {
332 23 register_test_calc_integrated_action_model(
333 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorEuler,
334 ControlTypes::PolyZero, ControlTypes::PolyOne);
335 23 register_test_calc_integrated_action_model(
336 23 DifferentialActionModelTypes::all[i], IntegratorTypes::IntegratorEuler,
337 ControlTypes::PolyOne, ControlTypes::PolyTwoRK4);
338 }
339 1 return true;
340 }
341
342 1 int main(int argc, char** argv) {
343 1 return ::boost::unit_test::unit_test_main(&init_function, argc, argv);
344 }
345