GCC Code Coverage Report


Directory: ./
File: unittest/test_constraint_manager.cpp
Date: 2025-03-26 19:23:43
Exec Total Coverage
Lines: 306 306 100.0%
Branches: 732 1438 50.9%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2021-2025, University of Edinburgh, Heriot-Watt University
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
7 ///////////////////////////////////////////////////////////////////////////////
8
9 #define BOOST_TEST_NO_MAIN
10 #define BOOST_TEST_ALTERNATIVE_INIT_API
11
12 #include "crocoddyl/core/actions/lqr.hpp"
13 #include "crocoddyl/multibody/data/multibody.hpp"
14 #include "factory/constraint.hpp"
15 #include "unittest_common.hpp"
16
17 using namespace boost::unit_test;
18 using namespace crocoddyl::unittest;
19
20 //----------------------------------------------------------------------------//
21
22 3 void test_constructor(StateModelTypes::Type state_type) {
23 // Setup the test
24
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
25
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
26
27 // Run the print function
28
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 std::ostringstream tmp;
29
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 tmp << model;
30
31 // Test the initial size of the map
32
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(model.get_constraints().size() == 0);
33
34 // Checking that casted computation is the same
35 #ifdef NDEBUG // Run only in release mode
36 crocoddyl::ConstraintModelManagerTpl<float> casted_model =
37 model.cast<float>();
38 BOOST_CHECK(casted_model.get_constraints().size() == 0);
39 #endif
40 3 }
41
42 3 void test_addConstraint(StateModelTypes::Type state_type) {
43 // Setup the test
44
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
45
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
46 crocoddyl::ConstraintModelManagerTpl<float> casted_model =
47
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 model.cast<float>();
48
49 // add an active constraint
50 std::shared_ptr<crocoddyl::ConstraintModelAbstract> rand_constraint_1 =
51
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 create_random_constraint(state_type);
52
2/4
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 model.addConstraint("random_constraint_1", rand_constraint_1);
53
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::size_t ng = rand_constraint_1->get_ng();
54
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::size_t nh = rand_constraint_1->get_nh();
55
3/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 std::size_t ng_T = rand_constraint_1->get_T_constraint() ? ng : 0;
56
3/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 std::size_t nh_T = rand_constraint_1->get_T_constraint() ? nh : 0;
57
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng() == ng);
58
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh() == nh);
59
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng_T() == ng_T);
60
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh_T() == nh_T);
61
62 // add an inactive constraint
63 std::shared_ptr<crocoddyl::ConstraintModelAbstract> rand_constraint_2 =
64
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 create_random_constraint(state_type);
65
2/4
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 model.addConstraint("random_constraint_2", rand_constraint_2, false);
66
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng() == ng);
67
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh() == nh);
68
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng_T() == ng_T);
69
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh_T() == nh_T);
70
71 // change the random constraint 2 status
72
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 model.changeConstraintStatus("random_constraint_2", true);
73
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 ng += rand_constraint_2->get_ng();
74
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 nh += rand_constraint_2->get_nh();
75
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 if (rand_constraint_2->get_T_constraint()) {
76
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 ng_T += rand_constraint_2->get_ng();
77
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 nh_T += rand_constraint_2->get_nh();
78 }
79
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng() == ng);
80
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh() == nh);
81
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng_T() == ng_T);
82
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh_T() == nh_T);
83
84 // change the random constraint 1 status
85
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 model.changeConstraintStatus("random_constraint_1", false);
86
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 ng -= rand_constraint_1->get_ng();
87
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 nh -= rand_constraint_1->get_nh();
88
3/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 if (rand_constraint_1->get_T_constraint()) {
89
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 ng_T -= rand_constraint_1->get_ng();
90
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 nh_T -= rand_constraint_1->get_nh();
91 }
92
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng() == ng);
93
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh() == nh);
94
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng_T() == ng_T);
95
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh_T() == nh_T);
96
97 // Checking that casted computation is the same
98 #ifdef NDEBUG // Run only in release mode
99 std::shared_ptr<crocoddyl::ConstraintModelAbstractTpl<float>>
100 casted_rand_constraint_1 = rand_constraint_1->cast<float>();
101 casted_model.addConstraint("random_constraint_1", casted_rand_constraint_1);
102 ng = casted_rand_constraint_1->get_ng();
103 nh = casted_rand_constraint_1->get_nh();
104 ng_T = casted_rand_constraint_1->get_T_constraint() ? ng : 0;
105 nh_T = casted_rand_constraint_1->get_T_constraint() ? nh : 0;
106 BOOST_CHECK(casted_model.get_ng() == ng);
107 BOOST_CHECK(casted_model.get_nh() == nh);
108 BOOST_CHECK(casted_model.get_ng_T() == ng_T);
109 BOOST_CHECK(casted_model.get_nh_T() == nh_T);
110 std::shared_ptr<crocoddyl::ConstraintModelAbstractTpl<float>>
111 casted_rand_constraint_2 = rand_constraint_2->cast<float>();
112 casted_model.addConstraint("random_constraint_2", casted_rand_constraint_2,
113 false);
114 BOOST_CHECK(casted_model.get_ng() == ng);
115 BOOST_CHECK(casted_model.get_nh() == nh);
116 BOOST_CHECK(casted_model.get_ng_T() == ng_T);
117 BOOST_CHECK(casted_model.get_nh_T() == nh_T);
118 casted_model.changeConstraintStatus("random_constraint_2", true);
119 ng += casted_rand_constraint_2->get_ng();
120 nh += casted_rand_constraint_2->get_nh();
121 if (casted_rand_constraint_2->get_T_constraint()) {
122 ng_T += casted_rand_constraint_2->get_ng();
123 nh_T += casted_rand_constraint_2->get_nh();
124 }
125 BOOST_CHECK(casted_model.get_ng() == ng);
126 BOOST_CHECK(casted_model.get_nh() == nh);
127 BOOST_CHECK(casted_model.get_ng_T() == ng_T);
128 BOOST_CHECK(casted_model.get_nh_T() == nh_T);
129 casted_model.changeConstraintStatus("random_constraint_1", false);
130 ng -= casted_rand_constraint_1->get_ng();
131 nh -= casted_rand_constraint_1->get_nh();
132 if (casted_rand_constraint_1->get_T_constraint()) {
133 ng_T -= casted_rand_constraint_1->get_ng();
134 nh_T -= casted_rand_constraint_1->get_nh();
135 }
136 BOOST_CHECK(casted_model.get_ng() == ng);
137 BOOST_CHECK(casted_model.get_nh() == nh);
138 BOOST_CHECK(casted_model.get_ng_T() == ng_T);
139 BOOST_CHECK(casted_model.get_nh_T() == nh_T);
140 #endif
141 3 }
142
143 3 void test_addConstraint_error_message(StateModelTypes::Type state_type) {
144 // Setup the test
145
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
146
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
147
148 // create an constraint object
149 std::shared_ptr<crocoddyl::ConstraintModelAbstract> rand_constraint =
150
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 create_random_constraint(state_type);
151
152 // add twice the same constraint object to the container
153
2/4
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 model.addConstraint("random_constraint", rand_constraint);
154
155 // test error message when we add a duplicate constraint
156
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 CaptureIOStream capture_ios;
157
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 capture_ios.beginCapture();
158
2/4
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 model.addConstraint("random_constraint", rand_constraint);
159
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 capture_ios.endCapture();
160
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 std::stringstream expected_buffer;
161 expected_buffer << "Warning: we couldn't add the random_constraint "
162
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 "constraint item, it already existed."
163
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 << std::endl;
164
8/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 3 times.
3 BOOST_CHECK(capture_ios.str() == expected_buffer.str());
165
166 // test error message when we change the constraint status of an inexistent
167 // constraint
168
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 capture_ios.beginCapture();
169
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 model.changeConstraintStatus("no_exist_constraint", true);
170
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 capture_ios.endCapture();
171
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 expected_buffer.clear();
172 expected_buffer << "Warning: we couldn't change the status of the "
173
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 "no_exist_constraint constraint item, it doesn't exist."
174
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 << std::endl;
175
8/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 3 times.
3 BOOST_CHECK(capture_ios.str() == expected_buffer.str());
176 3 }
177
178 3 void test_removeConstraint(StateModelTypes::Type state_type) {
179 // Setup the test
180
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
181
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
182 crocoddyl::ConstraintModelManagerTpl<float> casted_model =
183
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 model.cast<float>();
184
185 // add an active constraint
186 std::shared_ptr<crocoddyl::ConstraintModelAbstract> rand_constraint =
187
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 create_random_constraint(state_type);
188
2/4
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 model.addConstraint("random_constraint", rand_constraint);
189
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::size_t ng = rand_constraint->get_ng();
190
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::size_t nh = rand_constraint->get_nh();
191
3/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 std::size_t ng_T = rand_constraint->get_T_constraint() ? ng : 0;
192
3/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1 times.
3 std::size_t nh_T = rand_constraint->get_T_constraint() ? nh : 0;
193
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng() == ng);
194
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh() == nh);
195
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng_T() == ng_T);
196
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh_T() == nh_T);
197
198 // remove the constraint
199
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 model.removeConstraint("random_constraint");
200
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng() == 0);
201
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh() == 0);
202
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_ng_T() == 0);
203
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
3 BOOST_CHECK(model.get_nh_T() == 0);
204
205 // Checking that casted computation is the same
206 #ifdef NDEBUG // Run only in release mode
207 std::shared_ptr<crocoddyl::ConstraintModelAbstractTpl<float>>
208 casted_rand_constraint = rand_constraint->cast<float>();
209 casted_model.addConstraint("random_constraint", casted_rand_constraint);
210 ng = casted_rand_constraint->get_ng();
211 nh = casted_rand_constraint->get_nh();
212 ng_T = casted_rand_constraint->get_T_constraint() ? ng : 0;
213 nh_T = casted_rand_constraint->get_T_constraint() ? nh : 0;
214 BOOST_CHECK(casted_model.get_ng() == ng);
215 BOOST_CHECK(casted_model.get_nh() == nh);
216 BOOST_CHECK(casted_model.get_ng_T() == ng_T);
217 BOOST_CHECK(casted_model.get_nh_T() == nh_T);
218 casted_model.removeConstraint("random_constraint");
219 BOOST_CHECK(casted_model.get_ng() == 0);
220 BOOST_CHECK(casted_model.get_nh() == 0);
221 BOOST_CHECK(casted_model.get_ng_T() == 0);
222 BOOST_CHECK(casted_model.get_nh_T() == 0);
223 #endif
224 3 }
225
226 3 void test_removeConstraint_error_message(StateModelTypes::Type state_type) {
227 // Setup the test
228
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
229
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
230
231 // remove a none existing constraint form the container, we expect a cout
232 // message here
233
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 CaptureIOStream capture_ios;
234
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 capture_ios.beginCapture();
235
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 model.removeConstraint("random_constraint");
236
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 capture_ios.endCapture();
237
238 // Test that the error message is sent.
239
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 std::stringstream expected_buffer;
240 expected_buffer << "Warning: we couldn't remove the random_constraint "
241
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 "constraint item, it doesn't exist."
242
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 << std::endl;
243
8/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 3 times.
3 BOOST_CHECK(capture_ios.str() == expected_buffer.str());
244 3 }
245
246 3 void test_calc(StateModelTypes::Type state_type) {
247 // setup the test
248
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
249
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
250 // create the corresponding data object
251 const std::shared_ptr<crocoddyl::StateMultibody>& state =
252
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 std::static_pointer_cast<crocoddyl::StateMultibody>(model.get_state());
253
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 pinocchio::Model& pinocchio_model = *state->get_pinocchio().get();
254
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 pinocchio::Data pinocchio_data(pinocchio_model);
255
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data);
256
257 // create and add some constraint objects
258 3 std::vector<std::shared_ptr<crocoddyl::ConstraintModelAbstract>> models;
259 3 std::vector<std::shared_ptr<crocoddyl::ConstraintDataAbstract>> datas;
260
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 3 times.
18 for (std::size_t i = 0; i < 5; ++i) {
261
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 std::ostringstream os;
262
2/4
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
15 os << "random_constraint_" << i;
263 const std::shared_ptr<crocoddyl::ConstraintModelAbstract>& m =
264
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 create_random_constraint(state_type);
265
2/4
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
15 model.addConstraint(os.str(), m, 1.);
266
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 models.push_back(m);
267
2/4
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
15 datas.push_back(m->createData(&shared_data));
268 15 }
269
270 // create the data of the constraint sum
271 const std::shared_ptr<crocoddyl::ConstraintDataManager>& data =
272
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 model.createData(&shared_data);
273
274 // compute the constraint sum data for the case when all constraints are
275 // defined as active
276
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 const Eigen::VectorXd& x1 = state->rand();
277
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 const Eigen::VectorXd& u1 = Eigen::VectorXd::Random(model.get_nu());
278
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data,
279 x1);
280
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 model.calc(data, x1, u1);
281
282 // check the constraint against single constraint computations
283 3 std::size_t ng_i = 0;
284 3 std::size_t nh_i = 0;
285
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::VectorXd g = Eigen::VectorXd::Zero(model.get_ng());
286
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::VectorXd h = Eigen::VectorXd::Zero(model.get_nh());
287
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 3 times.
18 for (std::size_t i = 0; i < 5; ++i) {
288
3/6
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
15 models[i]->calc(datas[i], x1, u1);
289
1/2
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
15 const std::size_t ng = models[i]->get_ng();
290
1/2
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
15 const std::size_t nh = models[i]->get_nh();
291
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 g.segment(ng_i, ng) = datas[i]->g;
292
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 h.segment(nh_i, nh) = datas[i]->h;
293 15 ng_i += ng;
294 15 nh_i += nh;
295 }
296
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->g.isApprox(g, 1e-9));
297
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->h.isApprox(h, 1e-9));
298
299 // Checking that casted computation is the same
300 #ifdef NDEBUG // Run only in release mode
301 crocoddyl::ConstraintModelManagerTpl<float> casted_model =
302 model.cast<float>();
303 const std::shared_ptr<crocoddyl::StateMultibodyTpl<float>>& casted_state =
304 std::static_pointer_cast<crocoddyl::StateMultibodyTpl<float>>(
305 casted_model.get_state());
306 pinocchio::ModelTpl<float>& casted_pinocchio_model =
307 *casted_state->get_pinocchio().get();
308 pinocchio::DataTpl<float> casted_pinocchio_data(casted_pinocchio_model);
309 crocoddyl::DataCollectorMultibodyTpl<float> casted_shared_data(
310 &casted_pinocchio_data);
311 std::vector<std::shared_ptr<crocoddyl::ConstraintModelAbstractTpl<float>>>
312 casted_models;
313 std::vector<std::shared_ptr<crocoddyl::ConstraintDataAbstractTpl<float>>>
314 casted_datas;
315 for (std::size_t i = 0; i < 5; ++i) {
316 casted_models.push_back(models[i]->cast<float>());
317 casted_datas.push_back(casted_models[i]->createData(&casted_shared_data));
318 }
319 const std::shared_ptr<crocoddyl::ConstraintDataManagerTpl<float>>&
320 casted_data = casted_model.createData(&casted_shared_data);
321 const Eigen::VectorXf& x1_f = x1.cast<float>();
322 const Eigen::VectorXf& u1_f = u1.cast<float>();
323 crocoddyl::unittest::updateAllPinocchio(&casted_pinocchio_model,
324 &casted_pinocchio_data, x1_f);
325 casted_model.calc(casted_data, x1_f, u1_f);
326 ng_i = 0;
327 nh_i = 0;
328 Eigen::VectorXf g_f = Eigen::VectorXf::Zero(casted_model.get_ng());
329 Eigen::VectorXf h_f = Eigen::VectorXf::Zero(casted_model.get_nh());
330 for (std::size_t i = 0; i < 5; ++i) {
331 casted_models[i]->calc(casted_datas[i], x1_f, u1_f);
332 const std::size_t ng = casted_models[i]->get_ng();
333 const std::size_t nh = casted_models[i]->get_nh();
334 g_f.segment(ng_i, ng) = casted_datas[i]->g;
335 h_f.segment(nh_i, nh) = casted_datas[i]->h;
336 ng_i += ng;
337 nh_i += nh;
338 }
339 BOOST_CHECK(casted_data->g.isApprox(g_f, 1e-9f));
340 BOOST_CHECK(casted_data->h.isApprox(h_f, 1e-9f));
341 #endif
342 3 }
343
344 3 void test_calcDiff(StateModelTypes::Type state_type) {
345 // setup the test
346
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
347
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
348 // create the corresponding data object
349 const std::shared_ptr<crocoddyl::StateMultibody>& state =
350
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 std::static_pointer_cast<crocoddyl::StateMultibody>(model.get_state());
351
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 pinocchio::Model& pinocchio_model = *state->get_pinocchio().get();
352
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 pinocchio::Data pinocchio_data(pinocchio_model);
353
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 crocoddyl::DataCollectorMultibody shared_data(&pinocchio_data);
354
355 // create and add some constraint objects
356 3 std::vector<std::shared_ptr<crocoddyl::ConstraintModelAbstract>> models;
357 3 std::vector<std::shared_ptr<crocoddyl::ConstraintDataAbstract>> datas;
358
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 3 times.
18 for (std::size_t i = 0; i < 5; ++i) {
359
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 std::ostringstream os;
360
2/4
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
15 os << "random_constraint_" << i;
361 const std::shared_ptr<crocoddyl::ConstraintModelAbstract>& m =
362
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 create_random_constraint(state_type);
363
2/4
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
15 model.addConstraint(os.str(), m, 1.);
364
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 models.push_back(m);
365
2/4
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
15 datas.push_back(m->createData(&shared_data));
366 15 }
367
368 // create the data of the constraint sum
369 const std::shared_ptr<crocoddyl::ConstraintDataManager>& data =
370
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 model.createData(&shared_data);
371
372 // compute the constraint sum data for the case when all constraints are
373 // defined as active
374
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 Eigen::VectorXd x1 = state->rand();
375
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 const Eigen::VectorXd u1 = Eigen::VectorXd::Random(model.get_nu());
376
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data,
377 x1);
378
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 model.calc(data, x1, u1);
379
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 model.calcDiff(data, x1, u1);
380
381 // check the constraint against single constraint computations
382 3 std::size_t ng_i = 0;
383 3 std::size_t nh_i = 0;
384
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 const std::size_t ndx = state->get_ndx();
385
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 const std::size_t nu = model.get_nu();
386
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::VectorXd g = Eigen::VectorXd::Zero(model.get_ng());
387
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::VectorXd h = Eigen::VectorXd::Zero(model.get_nh());
388
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::MatrixXd Gx = Eigen::MatrixXd::Zero(model.get_ng(), ndx);
389
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::MatrixXd Gu = Eigen::MatrixXd::Zero(model.get_ng(), nu);
390
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::MatrixXd Hx = Eigen::MatrixXd::Zero(model.get_nh(), ndx);
391
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 Eigen::MatrixXd Hu = Eigen::MatrixXd::Zero(model.get_nh(), nu);
392
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 3 times.
18 for (std::size_t i = 0; i < 5; ++i) {
393
3/6
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
15 models[i]->calc(datas[i], x1, u1);
394
3/6
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
15 models[i]->calcDiff(datas[i], x1, u1);
395
1/2
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
15 const std::size_t ng = models[i]->get_ng();
396
1/2
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
15 const std::size_t nh = models[i]->get_nh();
397
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 g.segment(ng_i, ng) = datas[i]->g;
398
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 h.segment(nh_i, nh) = datas[i]->h;
399
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 Gx.block(ng_i, 0, ng, ndx) = datas[i]->Gx;
400
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 Gu.block(ng_i, 0, ng, nu) = datas[i]->Gu;
401
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 Hx.block(nh_i, 0, nh, ndx) = datas[i]->Hx;
402
2/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 15 times.
✗ Branch 7 not taken.
15 Hu.block(nh_i, 0, nh, nu) = datas[i]->Hu;
403 15 ng_i += ng;
404 15 nh_i += nh;
405 }
406
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->g.isApprox(g, 1e-9));
407
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->h.isApprox(h, 1e-9));
408
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->Gx.isApprox(Gx, 1e-9));
409
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->Gu.isApprox(Gu, 1e-9));
410
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->Hx.isApprox(Hx, 1e-9));
411
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->Hu.isApprox(Hu, 1e-9));
412
413
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 x1 = state->rand();
414
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::unittest::updateAllPinocchio(&pinocchio_model, &pinocchio_data,
415 x1);
416
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 data->resize(&model, false);
417
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 model.calc(data, x1);
418
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 model.calcDiff(data, x1);
419
420
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 const std::size_t ng_T = model.get_ng_T();
421
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 const std::size_t nh_T = model.get_nh_T();
422 3 ng_i = 0;
423 3 nh_i = 0;
424
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 g.conservativeResize(ng_T);
425
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 h.conservativeResize(nh_T);
426
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Gx.conservativeResize(ng_T, ndx);
427
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Gu.conservativeResize(ng_T, nu);
428
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Hx.conservativeResize(nh_T, ndx);
429
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Hu.conservativeResize(nh_T, nu);
430
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 3 times.
18 for (std::size_t i = 0; i < 5; ++i) {
431
3/4
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
✓ Branch 6 taken 2 times.
15 if (models[i]->get_T_constraint()) {
432
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
13 models[i]->calc(datas[i], x1);
433
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
13 models[i]->calcDiff(datas[i], x1);
434
1/2
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
13 const std::size_t ng = models[i]->get_ng();
435
1/2
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
13 const std::size_t nh = models[i]->get_nh();
436
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
13 g.segment(ng_i, ng) = datas[i]->g;
437
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
13 h.segment(nh_i, nh) = datas[i]->h;
438
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
13 Gx.block(ng_i, 0, ng, ndx) = datas[i]->Gx;
439
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
13 Gu.block(ng_i, 0, ng, nu) = datas[i]->Gu;
440
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
13 Hx.block(nh_i, 0, nh, ndx) = datas[i]->Hx;
441
2/4
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
13 Hu.block(nh_i, 0, nh, nu) = datas[i]->Hu;
442 13 ng_i += ng;
443 13 nh_i += nh;
444 }
445 }
446
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->g.isApprox(g, 1e-9));
447
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->h.isApprox(h, 1e-9));
448
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->Gx.isApprox(Gx, 1e-9));
449
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 3 times.
3 BOOST_CHECK(data->Hx.isApprox(Hx, 1e-9));
450
451 // Checking that casted computation is the same
452 #ifdef NDEBUG // Run only in release mode
453 crocoddyl::ConstraintModelManagerTpl<float> casted_model =
454 model.cast<float>();
455 const std::shared_ptr<crocoddyl::StateMultibodyTpl<float>>& casted_state =
456 std::static_pointer_cast<crocoddyl::StateMultibodyTpl<float>>(
457 casted_model.get_state());
458 pinocchio::ModelTpl<float>& casted_pinocchio_model =
459 *casted_state->get_pinocchio().get();
460 pinocchio::DataTpl<float> casted_pinocchio_data(casted_pinocchio_model);
461 crocoddyl::DataCollectorMultibodyTpl<float> casted_shared_data(
462 &casted_pinocchio_data);
463 std::vector<std::shared_ptr<crocoddyl::ConstraintModelAbstractTpl<float>>>
464 casted_models;
465 std::vector<std::shared_ptr<crocoddyl::ConstraintDataAbstractTpl<float>>>
466 casted_datas;
467 for (std::size_t i = 0; i < 5; ++i) {
468 casted_models.push_back(models[i]->cast<float>());
469 casted_datas.push_back(casted_models[i]->createData(&casted_shared_data));
470 }
471 const std::shared_ptr<crocoddyl::ConstraintDataManagerTpl<float>>&
472 casted_data = casted_model.createData(&casted_shared_data);
473 const Eigen::VectorXf& x1_f = x1.cast<float>();
474 const Eigen::VectorXf& u1_f = u1.cast<float>();
475 crocoddyl::unittest::updateAllPinocchio(&casted_pinocchio_model,
476 &casted_pinocchio_data, x1_f);
477
478 casted_model.calc(casted_data, x1_f, u1_f);
479 casted_model.calcDiff(casted_data, x1_f, u1_f);
480
481 ng_i = 0;
482 nh_i = 0;
483 Eigen::VectorXf g_f = Eigen::VectorXf::Zero(casted_model.get_ng());
484 Eigen::VectorXf h_f = Eigen::VectorXf::Zero(casted_model.get_nh());
485 Eigen::MatrixXf Gx_f = Eigen::MatrixXf::Zero(casted_model.get_ng(), ndx);
486 Eigen::MatrixXf Gu_f = Eigen::MatrixXf::Zero(casted_model.get_ng(), nu);
487 Eigen::MatrixXf Hx_f = Eigen::MatrixXf::Zero(casted_model.get_nh(), ndx);
488 Eigen::MatrixXf Hu_f = Eigen::MatrixXf::Zero(casted_model.get_nh(), nu);
489 for (std::size_t i = 0; i < 5; ++i) {
490 casted_models[i]->calc(casted_datas[i], x1_f, u1_f);
491 casted_models[i]->calcDiff(casted_datas[i], x1_f, u1_f);
492 const std::size_t ng = casted_models[i]->get_ng();
493 const std::size_t nh = casted_models[i]->get_nh();
494 g_f.segment(ng_i, ng) = casted_datas[i]->g;
495 h_f.segment(nh_i, nh) = casted_datas[i]->h;
496 Gx_f.block(ng_i, 0, ng, ndx) = casted_datas[i]->Gx;
497 Gu_f.block(ng_i, 0, ng, nu) = casted_datas[i]->Gu;
498 Hx_f.block(nh_i, 0, nh, ndx) = casted_datas[i]->Hx;
499 Hu_f.block(nh_i, 0, nh, nu) = casted_datas[i]->Hu;
500 ng_i += ng;
501 nh_i += nh;
502 }
503 BOOST_CHECK(casted_data->g.isApprox(g_f, 1e-9f));
504 BOOST_CHECK(casted_data->h.isApprox(h_f, 1e-9f));
505 BOOST_CHECK(casted_data->Gx.isApprox(Gx_f, 1e-9f));
506 BOOST_CHECK(casted_data->Gu.isApprox(Gu_f, 1e-9f));
507 BOOST_CHECK(casted_data->Hx.isApprox(Hx_f, 1e-9f));
508 BOOST_CHECK(casted_data->Hu.isApprox(Hu_f, 1e-9f));
509 #endif
510 3 }
511
512 3 void test_get_constraints(StateModelTypes::Type state_type) {
513 // setup the test
514
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
515
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 crocoddyl::ConstraintModelManager model(state_factory.create(state_type));
516 // create the corresponding data object
517 const std::shared_ptr<crocoddyl::StateMultibody>& state =
518
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 std::static_pointer_cast<crocoddyl::StateMultibody>(model.get_state());
519
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 pinocchio::Data pinocchio_data(*state->get_pinocchio().get());
520
521 // create and add some contact objects
522
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 3 times.
18 for (unsigned i = 0; i < 5; ++i) {
523
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 std::ostringstream os;
524
2/4
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
15 os << "random_constraint_" << i;
525
3/6
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 15 times.
✗ Branch 8 not taken.
15 model.addConstraint(os.str(), create_random_constraint(state_type), 1.);
526 15 }
527
528 // get the contacts
529 const crocoddyl::ConstraintModelManager::ConstraintModelContainer&
530
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 constraints = model.get_constraints();
531
532 // test
533 crocoddyl::ConstraintModelManager::ConstraintModelContainer::const_iterator
534 3 it_m,
535 3 end_m;
536 unsigned i;
537 3 for (i = 0, it_m = constraints.begin(), end_m = constraints.end();
538
2/2
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 3 times.
18 it_m != end_m; ++it_m, ++i) {
539
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 std::ostringstream os;
540
2/4
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
15 os << "random_constraint_" << i;
541
7/14
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 15 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 15 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 15 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 15 times.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 15 times.
15 BOOST_CHECK(it_m->first == os.str());
542 15 }
543 3 }
544
545 3 void test_shareMemory(StateModelTypes::Type state_type) {
546 // setup the test
547
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 StateModelFactory state_factory;
548 const std::shared_ptr<crocoddyl::StateAbstract> state =
549
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 state_factory.create(state_type);
550
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 crocoddyl::ConstraintModelManager constraint_model(state);
551
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 crocoddyl::DataCollectorAbstract shared_data;
552 const std::shared_ptr<crocoddyl::ConstraintDataManager>& constraint_data =
553
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 constraint_model.createData(&shared_data);
554
555
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::size_t ng = state->get_ndx();
556
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::size_t nh = state->get_ndx();
557
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 const std::size_t ndx = state->get_ndx();
558
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 const std::size_t nu = constraint_model.get_nu();
559
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 crocoddyl::ActionModelLQR action_model(ndx, nu);
560 const std::shared_ptr<crocoddyl::ActionDataAbstract>& action_data =
561
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 action_model.createData();
562
563
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 action_data->h.resize(nh);
564
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 action_data->g.resize(ng);
565
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 action_data->Gx.resize(ng, ndx);
566
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 action_data->Gu.resize(ng, nu);
567
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 action_data->Hx.resize(nh, ndx);
568
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 action_data->Hu.resize(nh, nu);
569
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 constraint_data->shareMemory(action_data.get());
570
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 constraint_data->h = Eigen::VectorXd::Random(nh);
571
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 constraint_data->g = Eigen::VectorXd::Random(ng);
572
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 constraint_data->Gx = Eigen::MatrixXd::Random(ng, ndx);
573
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 constraint_data->Gu = Eigen::MatrixXd::Random(ng, nu);
574
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 constraint_data->Hx = Eigen::MatrixXd::Random(nh, ndx);
575
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 constraint_data->Hu = Eigen::MatrixXd::Random(nh, nu);
576
577 // check that the data has been shared
578
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->g.isApprox(constraint_data->g, 1e-9));
579
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->h.isApprox(constraint_data->h, 1e-9));
580
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Gx.isApprox(constraint_data->Gx, 1e-9));
581
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Gu.isApprox(constraint_data->Gu, 1e-9));
582
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Hx.isApprox(constraint_data->Hx, 1e-9));
583
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Hu.isApprox(constraint_data->Hu, 1e-9));
584
585 // let's now resize the data
586
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 constraint_data->resize(&action_model, action_data.get());
587
588 // check that the shared data has been resized
589
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->g.isApprox(constraint_data->g, 1e-9));
590
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->h.isApprox(constraint_data->h, 1e-9));
591
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Gx.isApprox(constraint_data->Gx, 1e-9));
592
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Gu.isApprox(constraint_data->Gu, 1e-9));
593
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Hx.isApprox(constraint_data->Hx, 1e-9));
594
7/14
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
3 BOOST_CHECK(action_data->Hu.isApprox(constraint_data->Hu, 1e-9));
595 3 }
596
597 //----------------------------------------------------------------------------//
598
599 3 void register_unit_tests(StateModelTypes::Type state_type) {
600
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 boost::test_tools::output_test_stream test_name;
601 test_name << "test_ConstraintModelManager"
602
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
3 << "_" << state_type;
603
4/8
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
3 std::cout << "Running " << test_name.str() << std::endl;
604
4/8
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
3 test_suite* ts = BOOST_TEST_SUITE(test_name.str());
605
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_constructor, state_type)));
606
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_addConstraint, state_type)));
607
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(
608 boost::bind(&test_addConstraint_error_message, state_type)));
609
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_removeConstraint, state_type)));
610
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(
611 boost::bind(&test_removeConstraint_error_message, state_type)));
612
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_calc, state_type)));
613
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_calcDiff, state_type)));
614
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_get_constraints, state_type)));
615
5/10
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
3 ts->add(BOOST_TEST_CASE(boost::bind(&test_shareMemory, state_type)));
616
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
3 framework::master_test_suite().add(ts);
617 3 }
618
619 1 bool init_function() {
620 1 register_unit_tests(StateModelTypes::StateMultibody_TalosArm);
621 1 register_unit_tests(StateModelTypes::StateMultibody_HyQ);
622 1 register_unit_tests(StateModelTypes::StateMultibody_Talos);
623 1 return true;
624 }
625
626 1 int main(int argc, char** argv) {
627 1 return ::boost::unit_test::unit_test_main(&init_function, argc, argv);
628 }
629