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 |