GCC Code Coverage Report


Directory: ./
File: unittest/test_actions.cpp
Date: 2025-03-26 19:23:43
Exec Total Coverage
Lines: 179 183 97.8%
Branches: 372 802 46.4%

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