Directory: | ./ |
---|---|
File: | unittest/test_costs.cpp |
Date: | 2025-01-30 11:01:55 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 139 | 143 | 97.2% |
Branches: | 304 | 658 | 46.2% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2019-2023, LAAS-CNRS, New York University, | ||
5 | // Max Planck Gesellschaft, University of Edinburgh, | ||
6 | // 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 "crocoddyl/multibody/data/multibody.hpp" | ||
15 | #include "factory/cost.hpp" | ||
16 | #include "unittest_common.hpp" | ||
17 | |||
18 | using namespace boost::unit_test; | ||
19 | using namespace crocoddyl::unittest; | ||
20 | |||
21 | //----------------------------------------------------------------------------// | ||
22 | |||
23 | 315 | void test_calc_returns_a_cost(CostModelTypes::Type cost_type, | |
24 | StateModelTypes::Type state_type, | ||
25 | ActivationModelTypes::Type activation_type) { | ||
26 | // create the model | ||
27 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | CostModelFactory factory; |
28 | const std::shared_ptr<crocoddyl::CostModelAbstract>& model = | ||
29 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | factory.create(cost_type, state_type, activation_type); |
30 | |||
31 | // Run the print function | ||
32 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | std::ostringstream tmp; |
33 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | tmp << *model; |
34 | |||
35 | // create the corresponding data object | ||
36 | const std::shared_ptr<crocoddyl::StateMultibody>& state = | ||
37 | 315 | std::static_pointer_cast<crocoddyl::StateMultibody>(model->get_state()); | |
38 | 315 | pinocchio::Model& pinocchio_model = *state->get_pinocchio().get(); | |
39 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | pinocchio::Data pinocchio_data(pinocchio_model); |
40 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data); |
41 | const std::shared_ptr<crocoddyl::CostDataAbstract>& data = | ||
42 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | model->createData(&shared_data); |
43 | 315 | data->cost = nan(""); | |
44 | |||
45 | // Generating random values for the state and control | ||
46 |
1/2✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | const Eigen::VectorXd x = model->get_state()->rand(); |
47 |
2/4✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | const Eigen::VectorXd u = Eigen::VectorXd::Random(model->get_nu()); |
48 | |||
49 | // Compute all the pinocchio function needed for the models. | ||
50 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, x); |
51 | |||
52 | // Getting the cost value computed by calc() | ||
53 |
3/6✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
|
315 | model->calc(data, x, u); |
54 | |||
55 | // Checking that calc returns a cost value | ||
56 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 315 times.
|
315 | BOOST_CHECK(!std::isnan(data->cost)); |
57 | 315 | } | |
58 | |||
59 | 315 | void test_calc_against_numdiff(CostModelTypes::Type cost_type, | |
60 | StateModelTypes::Type state_type, | ||
61 | ActivationModelTypes::Type activation_type) { | ||
62 | // create the model | ||
63 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | CostModelFactory factory; |
64 | const std::shared_ptr<crocoddyl::CostModelAbstract>& model = | ||
65 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | factory.create(cost_type, state_type, activation_type); |
66 | |||
67 | // create the corresponding data object | ||
68 | const std::shared_ptr<crocoddyl::StateMultibody>& state = | ||
69 | 315 | std::static_pointer_cast<crocoddyl::StateMultibody>(model->get_state()); | |
70 | 315 | pinocchio::Model& pinocchio_model = *state->get_pinocchio().get(); | |
71 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | pinocchio::Data pinocchio_data(pinocchio_model); |
72 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data); |
73 | const std::shared_ptr<crocoddyl::CostDataAbstract>& data = | ||
74 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | model->createData(&shared_data); |
75 | |||
76 | // Create the equivalent num diff model and data. | ||
77 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::CostModelNumDiff model_num_diff(model); |
78 | const std::shared_ptr<crocoddyl::CostDataAbstract>& data_num_diff = | ||
79 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | model_num_diff.createData(&shared_data); |
80 | |||
81 | // Generating random values for the state and control | ||
82 |
1/2✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | const Eigen::VectorXd x = model->get_state()->rand(); |
83 |
2/4✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | const Eigen::VectorXd u = Eigen::VectorXd::Random(model->get_nu()); |
84 | |||
85 | // Compute all the pinocchio function needed for the models. | ||
86 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, x); |
87 | |||
88 | // Computing the cost derivatives | ||
89 |
3/6✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
|
315 | model->calc(data, x, u); |
90 | |||
91 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
|
315 | model_num_diff.calc(data_num_diff, x, u); |
92 | |||
93 | // Checking the partial derivatives against NumDiff | ||
94 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 315 times.
|
315 | BOOST_CHECK(data->cost == data_num_diff->cost); |
95 | 315 | } | |
96 | |||
97 | 315 | void test_partial_derivatives_against_numdiff( | |
98 | CostModelTypes::Type cost_type, StateModelTypes::Type state_type, | ||
99 | ActivationModelTypes::Type activation_type) { | ||
100 | using namespace boost::placeholders; | ||
101 | |||
102 | // create the model | ||
103 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | CostModelFactory factory; |
104 | const std::shared_ptr<crocoddyl::CostModelAbstract>& model = | ||
105 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | factory.create(cost_type, state_type, activation_type); |
106 | |||
107 | // create the corresponding data object | ||
108 | const std::shared_ptr<crocoddyl::StateMultibody>& state = | ||
109 | 315 | std::static_pointer_cast<crocoddyl::StateMultibody>(model->get_state()); | |
110 | 315 | pinocchio::Model& pinocchio_model = *state->get_pinocchio().get(); | |
111 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | pinocchio::Data pinocchio_data(pinocchio_model); |
112 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data); |
113 | const std::shared_ptr<crocoddyl::CostDataAbstract>& data = | ||
114 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | model->createData(&shared_data); |
115 | |||
116 | // Create the equivalent num diff model and data. | ||
117 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::CostModelNumDiff model_num_diff(model); |
118 | const std::shared_ptr<crocoddyl::CostDataAbstract>& data_num_diff = | ||
119 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | model_num_diff.createData(&shared_data); |
120 | |||
121 | // Generating random values for the state and control | ||
122 |
1/2✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | Eigen::VectorXd x = model->get_state()->rand(); |
123 |
2/4✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | const Eigen::VectorXd u = Eigen::VectorXd::Random(model->get_nu()); |
124 | |||
125 | // Compute all the pinocchio function needed for the models. | ||
126 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, x); |
127 | |||
128 | // set the function that needs to be called at every step of the numdiff | ||
129 | 315 | std::vector<crocoddyl::CostModelNumDiff::ReevaluationFunction> reevals; | |
130 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
|
315 | reevals.push_back(boost::bind(&crocoddyl::unittest::updateAllPinocchio, |
131 | &pinocchio_model, &pinocchio_data, _1, _2)); | ||
132 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | model_num_diff.set_reevals(reevals); |
133 | |||
134 | // Computing the cost derivatives | ||
135 |
3/6✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
|
315 | model->calc(data, x, u); |
136 |
3/6✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
|
315 | model->calcDiff(data, x, u); |
137 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
|
315 | model_num_diff.calc(data_num_diff, x, u); |
138 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
|
315 | model_num_diff.calcDiff(data_num_diff, x, u); |
139 | // Tolerance defined as in | ||
140 | // http://www.it.uom.gr/teaching/linearalgebra/NumericalRecipiesInC/c5-7.pdf | ||
141 | 315 | double tol = std::pow(model_num_diff.get_disturbance(), 1. / 3.); | |
142 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Lx - data_num_diff->Lx).isZero(tol)); |
143 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Lu - data_num_diff->Lu).isZero(tol)); |
144 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
|
315 | if (model_num_diff.get_with_gauss_approx()) { |
145 | // The num diff is not precise enough to be tested here. | ||
146 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Lxx - data_num_diff->Lxx).isZero(tol)); |
147 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Lxu - data_num_diff->Lxu).isZero(tol)); |
148 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Luu - data_num_diff->Luu).isZero(tol)); |
149 | } else { | ||
150 | ✗ | BOOST_CHECK((data_num_diff->Lxx).isZero(tol)); | |
151 | ✗ | BOOST_CHECK((data_num_diff->Lxu).isZero(tol)); | |
152 | ✗ | BOOST_CHECK((data_num_diff->Luu).isZero(tol)); | |
153 | } | ||
154 | |||
155 | // Computing the cost derivatives | ||
156 |
1/2✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | x = model->get_state()->rand(); |
157 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, x); |
158 |
2/4✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
|
315 | model->calc(data, x); |
159 |
2/4✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
|
315 | model->calcDiff(data, x); |
160 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | model_num_diff.calc(data_num_diff, x); |
161 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | model_num_diff.calcDiff(data_num_diff, x); |
162 | |||
163 | // Checking the partial derivatives against numdiff | ||
164 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Lx - data_num_diff->Lx).isZero(tol)); |
165 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
|
315 | if (model_num_diff.get_with_gauss_approx()) { |
166 | // The num diff is not precise enough to be tested here. | ||
167 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 315 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 315 times.
|
315 | BOOST_CHECK((data->Lxx - data_num_diff->Lxx).isZero(tol)); |
168 | } else { | ||
169 | ✗ | BOOST_CHECK((data_num_diff->Lxx).isZero(tol)); | |
170 | } | ||
171 | 315 | } | |
172 | |||
173 | 315 | void test_dimensions_in_cost_sum(CostModelTypes::Type cost_type, | |
174 | StateModelTypes::Type state_type, | ||
175 | ActivationModelTypes::Type activation_type) { | ||
176 | // create the model | ||
177 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | CostModelFactory factory; |
178 | const std::shared_ptr<crocoddyl::CostModelAbstract>& model = | ||
179 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | factory.create(cost_type, state_type, activation_type); |
180 | |||
181 | // create the corresponding data object | ||
182 | const std::shared_ptr<crocoddyl::StateMultibody>& state = | ||
183 | 315 | std::static_pointer_cast<crocoddyl::StateMultibody>(model->get_state()); | |
184 | 315 | pinocchio::Model& pinocchio_model = *state->get_pinocchio().get(); | |
185 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | pinocchio::Data pinocchio_data(pinocchio_model); |
186 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data); |
187 | |||
188 | // create the cost sum model | ||
189 | 315 | crocoddyl::CostModelSum cost_sum(state, model->get_nu()); | |
190 |
2/4✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | cost_sum.addCost("myCost", model, 1.); |
191 | |||
192 | // Generating random values for the state and control | ||
193 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | const Eigen::VectorXd x = state->rand(); |
194 | |||
195 | // Compute all the pinocchio function needed for the models. | ||
196 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, x); |
197 | |||
198 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 21 taken 315 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 315 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 315 times.
|
315 | BOOST_CHECK(model->get_state()->get_nx() == cost_sum.get_state()->get_nx()); |
199 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 21 taken 315 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 315 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 315 times.
|
315 | BOOST_CHECK(model->get_state()->get_ndx() == cost_sum.get_state()->get_ndx()); |
200 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 315 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 315 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 315 times.
|
315 | BOOST_CHECK(model->get_nu() == cost_sum.get_nu()); |
201 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 21 taken 315 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 315 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 315 times.
|
315 | BOOST_CHECK(model->get_state()->get_nq() == cost_sum.get_state()->get_nq()); |
202 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 21 taken 315 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 315 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 315 times.
|
315 | BOOST_CHECK(model->get_state()->get_nv() == cost_sum.get_state()->get_nv()); |
203 |
6/12✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 19 taken 315 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 315 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 315 times.
|
315 | BOOST_CHECK(model->get_activation()->get_nr() == cost_sum.get_nr()); |
204 | 315 | } | |
205 | |||
206 | 315 | void test_partial_derivatives_in_cost_sum( | |
207 | CostModelTypes::Type cost_type, StateModelTypes::Type state_type, | ||
208 | ActivationModelTypes::Type activation_type) { | ||
209 | // create the model | ||
210 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | CostModelFactory factory; |
211 | const std::shared_ptr<crocoddyl::CostModelAbstract>& model = | ||
212 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | factory.create(cost_type, state_type, activation_type); |
213 | |||
214 | // create the corresponding data object | ||
215 | const std::shared_ptr<crocoddyl::StateMultibody>& state = | ||
216 | 315 | std::static_pointer_cast<crocoddyl::StateMultibody>(model->get_state()); | |
217 | 315 | pinocchio::Model& pinocchio_model = *state->get_pinocchio().get(); | |
218 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | pinocchio::Data pinocchio_data(pinocchio_model); |
219 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data); |
220 | const std::shared_ptr<crocoddyl::CostDataAbstract>& data = | ||
221 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | model->createData(&shared_data); |
222 | |||
223 | // create the cost sum model | ||
224 | 315 | crocoddyl::CostModelSum cost_sum(state, model->get_nu()); | |
225 |
2/4✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | cost_sum.addCost("myCost", model, 1.); |
226 | const std::shared_ptr<crocoddyl::CostDataSum>& data_sum = | ||
227 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | cost_sum.createData(&shared_data); |
228 | |||
229 | // Generating random values for the state and control | ||
230 |
1/2✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
|
315 | const Eigen::VectorXd x = state->rand(); |
231 |
2/4✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | const Eigen::VectorXd u = Eigen::VectorXd::Random(model->get_nu()); |
232 | |||
233 | // Compute all the pinocchio function needed for the models. | ||
234 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data, x); |
235 | |||
236 | // Computing the cost derivatives | ||
237 |
3/6✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
|
315 | model->calc(data, x, u); |
238 |
3/6✓ Branch 2 taken 315 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
|
315 | model->calcDiff(data, x, u); |
239 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
|
315 | cost_sum.calc(data_sum, x, u); |
240 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
|
315 | cost_sum.calcDiff(data_sum, x, u); |
241 | |||
242 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 315 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 315 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 315 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 315 times.
|
315 | BOOST_CHECK((data->Lx - data_sum->Lx).isZero()); |
243 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 315 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 315 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 315 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 315 times.
|
315 | BOOST_CHECK((data->Lu - data_sum->Lu).isZero()); |
244 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 315 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 315 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 315 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 315 times.
|
315 | BOOST_CHECK((data->Lxx - data_sum->Lxx).isZero()); |
245 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 315 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 315 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 315 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 315 times.
|
315 | BOOST_CHECK((data->Lxu - data_sum->Lxu).isZero()); |
246 |
8/16✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 315 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 315 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 315 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 315 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 315 times.
|
315 | BOOST_CHECK((data->Luu - data_sum->Luu).isZero()); |
247 | 315 | } | |
248 | |||
249 | //----------------------------------------------------------------------------// | ||
250 | |||
251 | 315 | void register_cost_model_unit_tests( | |
252 | CostModelTypes::Type cost_type, StateModelTypes::Type state_type, | ||
253 | ActivationModelTypes::Type activation_type) { | ||
254 |
2/4✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
|
315 | boost::test_tools::output_test_stream test_name; |
255 |
5/10✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 315 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 315 times.
✗ Branch 14 not taken.
|
315 | test_name << "test_" << cost_type << "_" << activation_type << "_" |
256 |
1/2✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
|
315 | << state_type; |
257 |
4/8✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 315 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 315 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 315 times.
✗ Branch 11 not taken.
|
315 | std::cout << "Running " << test_name.str() << std::endl; |
258 |
4/8✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
|
315 | test_suite* ts = BOOST_TEST_SUITE(test_name.str()); |
259 |
5/10✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 315 times.
✗ Branch 15 not taken.
|
315 | ts->add(BOOST_TEST_CASE(boost::bind(&test_calc_returns_a_cost, cost_type, |
260 | state_type, activation_type))); | ||
261 |
5/10✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 315 times.
✗ Branch 15 not taken.
|
315 | ts->add(BOOST_TEST_CASE(boost::bind(&test_calc_against_numdiff, cost_type, |
262 | state_type, activation_type))); | ||
263 |
5/10✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 315 times.
✗ Branch 15 not taken.
|
315 | ts->add(BOOST_TEST_CASE(boost::bind(&test_partial_derivatives_against_numdiff, |
264 | cost_type, state_type, activation_type))); | ||
265 |
5/10✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 315 times.
✗ Branch 15 not taken.
|
315 | ts->add(BOOST_TEST_CASE(boost::bind(&test_dimensions_in_cost_sum, cost_type, |
266 | state_type, activation_type))); | ||
267 |
5/10✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 315 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 315 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 315 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 315 times.
✗ Branch 15 not taken.
|
315 | ts->add(BOOST_TEST_CASE(boost::bind(&test_partial_derivatives_in_cost_sum, |
268 | cost_type, state_type, activation_type))); | ||
269 |
3/6✓ Branch 1 taken 315 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 315 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 315 times.
✗ Branch 7 not taken.
|
315 | framework::master_test_suite().add(ts); |
270 | 315 | } | |
271 | |||
272 | 1 | bool init_function() { | |
273 | // Test all costs available with all the activation types with all available | ||
274 | // states types. | ||
275 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
|
8 | for (size_t cost_type = 0; cost_type < CostModelTypes::all.size(); |
276 | ++cost_type) { | ||
277 | 35 | for (size_t state_type = | |
278 | 7 | StateModelTypes::all[StateModelTypes::StateMultibody_TalosArm]; | |
279 |
2/2✓ Branch 1 taken 35 times.
✓ Branch 2 taken 7 times.
|
42 | state_type < StateModelTypes::all.size(); ++state_type) { |
280 | 350 | for (size_t activation_type = 0; | |
281 |
2/2✓ Branch 1 taken 315 times.
✓ Branch 2 taken 35 times.
|
350 | activation_type < ActivationModelTypes::all.size(); |
282 | ++activation_type) { | ||
283 | 315 | register_cost_model_unit_tests( | |
284 | 315 | CostModelTypes::all[cost_type], StateModelTypes::all[state_type], | |
285 | 315 | ActivationModelTypes::all[activation_type]); | |
286 | } | ||
287 | } | ||
288 | } | ||
289 | 1 | return true; | |
290 | } | ||
291 | |||
292 | 1 | int main(int argc, char** argv) { | |
293 | 1 | return ::boost::unit_test::unit_test_main(&init_function, argc, argv); | |
294 | } | ||
295 |