Directory: | ./ |
---|---|
File: | unittest/test_states.cpp |
Date: | 2025-03-26 19:23:43 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 225 | 225 | 100.0% |
Branches: | 714 | 1426 | 50.1% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2019-2025, LAAS-CNRS, New York University, | ||
5 | // Max Planck Gesellschaft, University of Edinburgh | ||
6 | // INRIA, Heriot-Watt University | ||
7 | // Copyright note valid unless otherwise stated in individual files. | ||
8 | // All rights reserved. | ||
9 | /////////////////////////////////////////////////////////////////////////////// | ||
10 | |||
11 | #define BOOST_TEST_NO_MAIN | ||
12 | #define BOOST_TEST_ALTERNATIVE_INIT_API | ||
13 | |||
14 | #include "factory/state.hpp" | ||
15 | #include "unittest_common.hpp" | ||
16 | |||
17 | using namespace boost::unit_test; | ||
18 | using namespace crocoddyl::unittest; | ||
19 | |||
20 | //----------------------------------------------------------------------------// | ||
21 | |||
22 | 7 | void test_state_dimension(StateModelTypes::Type state_type) { | |
23 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
24 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
25 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
26 | |||
27 | // Checking the dimension of zero and random states | ||
28 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 7 times.
|
7 | BOOST_CHECK(static_cast<std::size_t>(state->zero().size()) == |
29 | state->get_nx()); | ||
30 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 7 times.
|
7 | BOOST_CHECK(static_cast<std::size_t>(state->rand().size()) == |
31 | state->get_nx()); | ||
32 |
9/18✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 7 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 7 times.
✗ Branch 30 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 7 times.
|
7 | BOOST_CHECK(state->get_nx() == (state->get_nq() + state->get_nv())); |
33 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 7 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 7 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 7 times.
✗ Branch 26 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 7 times.
|
7 | BOOST_CHECK(state->get_ndx() == (2 * state->get_nv())); |
34 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 7 times.
|
7 | BOOST_CHECK(static_cast<std::size_t>(state->get_lb().size()) == |
35 | state->get_nx()); | ||
36 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 7 times.
|
7 | BOOST_CHECK(static_cast<std::size_t>(state->get_ub().size()) == |
37 | state->get_nx()); | ||
38 | |||
39 | // Checking that casted computation is the same | ||
40 | #ifdef NDEBUG // Run only in release mode | ||
41 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
42 | state->cast<float>(); | ||
43 | BOOST_CHECK(static_cast<std::size_t>(casted_state->zero().size()) == | ||
44 | casted_state->get_nx()); | ||
45 | BOOST_CHECK(static_cast<std::size_t>(casted_state->rand().size()) == | ||
46 | casted_state->get_nx()); | ||
47 | BOOST_CHECK(casted_state->get_nx() == | ||
48 | (casted_state->get_nq() + casted_state->get_nv())); | ||
49 | BOOST_CHECK(casted_state->get_ndx() == (2 * casted_state->get_nv())); | ||
50 | BOOST_CHECK(static_cast<std::size_t>(casted_state->get_lb().size()) == | ||
51 | casted_state->get_nx()); | ||
52 | BOOST_CHECK(static_cast<std::size_t>(casted_state->get_ub().size()) == | ||
53 | casted_state->get_nx()); | ||
54 | #endif | ||
55 | 7 | } | |
56 | |||
57 | 7 | void test_integrate_against_difference(StateModelTypes::Type state_type) { | |
58 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
59 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
60 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
61 | |||
62 | // Generating random states | ||
63 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x1 = state->rand(); |
64 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x2 = state->rand(); |
65 | |||
66 | // Computing x2 by integrating its difference | ||
67 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd dx(state->get_ndx()); |
68 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd x2i(state->get_nx()); |
69 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd dxi(state->get_ndx()); |
70 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->diff(x1, x2, dx); |
71 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->integrate(x1, dx, x2i); |
72 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->diff(x2i, x2, dxi); |
73 | |||
74 | // Checking that both states agree | ||
75 |
7/14✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 7 times.
|
7 | BOOST_CHECK(dxi.isZero(1e-9)); |
76 | |||
77 | // Checking that casted computation is the same | ||
78 | #ifdef NDEBUG // Run only in release mode | ||
79 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
80 | state->cast<float>(); | ||
81 | const Eigen::VectorXf x1_f = casted_state->rand(); | ||
82 | const Eigen::VectorXf x2_f = casted_state->rand(); | ||
83 | Eigen::VectorXf dx_f(casted_state->get_ndx()); | ||
84 | Eigen::VectorXf x2i_f(casted_state->get_nx()); | ||
85 | Eigen::VectorXf dxi_f(casted_state->get_ndx()); | ||
86 | casted_state->diff(x1_f, x2_f, dx_f); | ||
87 | casted_state->integrate(x1_f, dx_f, x2i_f); | ||
88 | casted_state->diff(x2i_f, x2_f, dxi_f); | ||
89 | BOOST_CHECK(dxi_f.isZero(1e-6f)); | ||
90 | #endif | ||
91 | 7 | } | |
92 | |||
93 | 7 | void test_difference_against_integrate(StateModelTypes::Type state_type) { | |
94 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
95 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
96 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
97 | |||
98 | // Generating random states | ||
99 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x = state->rand(); |
100 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | const Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
101 | |||
102 | // Computing dx by differentiation of its integrate | ||
103 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd xidx(state->get_nx()); |
104 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd dxd(state->get_ndx()); |
105 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->integrate(x, dx, xidx); |
106 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->diff(x, xidx, dxd); |
107 | |||
108 | // Checking that both states agree | ||
109 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((dxd - dx).isZero(1e-9)); |
110 | |||
111 | // Checking that casted computation is the same | ||
112 | #ifdef NDEBUG // Run only in release mode | ||
113 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
114 | state->cast<float>(); | ||
115 | const Eigen::VectorXf x_f = casted_state->rand(); | ||
116 | const Eigen::VectorXf dx_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
117 | Eigen::VectorXf xidx_f(casted_state->get_nx()); | ||
118 | Eigen::VectorXf dxd_f(casted_state->get_ndx()); | ||
119 | casted_state->integrate(x_f, dx_f, xidx_f); | ||
120 | casted_state->diff(x_f, xidx_f, dxd_f); | ||
121 | BOOST_CHECK((dxd_f - dx_f).isZero(1e-6f)); | ||
122 | #endif | ||
123 | 7 | } | |
124 | |||
125 | 7 | void test_Jdiff_firstsecond(StateModelTypes::Type state_type) { | |
126 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
127 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
128 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
129 | |||
130 | // Generating random values for the initial and terminal states | ||
131 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x1 = state->rand(); |
132 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x2 = state->rand(); |
133 | |||
134 | // Computing the partial derivatives of the difference function separately | ||
135 | Eigen::MatrixXd Jdiff_tmp( | ||
136 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
137 | Eigen::MatrixXd Jdiff_first( | ||
138 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
139 | Eigen::MatrixXd Jdiff_second( | ||
140 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
141 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, Jdiff_first, Jdiff_tmp, crocoddyl::first); |
142 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, Jdiff_tmp, Jdiff_second, crocoddyl::second); |
143 | |||
144 | // Computing the partial derivatives of the difference function separately | ||
145 | Eigen::MatrixXd Jdiff_both_first( | ||
146 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
147 | Eigen::MatrixXd Jdiff_both_second( | ||
148 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
149 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, Jdiff_both_first, Jdiff_both_second); |
150 | |||
151 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jdiff_first - Jdiff_both_first).isZero(1e-9)); |
152 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jdiff_second - Jdiff_both_second).isZero(1e-9)); |
153 | |||
154 | // Checking that casted computation is the same | ||
155 | #ifdef NDEBUG // Run only in release mode | ||
156 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
157 | state->cast<float>(); | ||
158 | const Eigen::VectorXf x1_f = casted_state->rand(); | ||
159 | const Eigen::VectorXf x2_f = casted_state->rand(); | ||
160 | Eigen::MatrixXf Jdiff_tmp_f( | ||
161 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
162 | Eigen::MatrixXf Jdiff_first_f( | ||
163 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
164 | Eigen::MatrixXf Jdiff_second_f( | ||
165 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
166 | Eigen::MatrixXf Jdiff_both_first_f( | ||
167 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
168 | Eigen::MatrixXf Jdiff_both_second_f( | ||
169 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
170 | casted_state->Jdiff(x1_f, x2_f, Jdiff_first_f, Jdiff_tmp_f, crocoddyl::first); | ||
171 | casted_state->Jdiff(x1_f, x2_f, Jdiff_tmp_f, Jdiff_second_f, | ||
172 | crocoddyl::second); | ||
173 | casted_state->Jdiff(x1_f, x2_f, Jdiff_both_first_f, Jdiff_both_second_f); | ||
174 | BOOST_CHECK((Jdiff_first_f - Jdiff_both_first_f).isZero(1e-9f)); | ||
175 | BOOST_CHECK((Jdiff_second_f - Jdiff_both_second_f).isZero(1e-9f)); | ||
176 | #endif | ||
177 | 7 | } | |
178 | |||
179 | 7 | void test_Jint_firstsecond(StateModelTypes::Type state_type) { | |
180 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
181 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
182 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
183 | |||
184 | // Generating random values for the initial and terminal states | ||
185 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x = state->rand(); |
186 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | const Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
187 | |||
188 | // Computing the partial derivatives of the difference function separately | ||
189 | Eigen::MatrixXd Jint_tmp( | ||
190 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
191 | Eigen::MatrixXd Jint_first( | ||
192 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
193 | Eigen::MatrixXd Jint_second( | ||
194 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
195 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x, dx, Jint_first, Jint_tmp, crocoddyl::first); |
196 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x, dx, Jint_tmp, Jint_second, crocoddyl::second); |
197 | |||
198 | // Computing the partial derivatives of the integrate function separately | ||
199 | Eigen::MatrixXd Jint_both_first( | ||
200 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
201 | Eigen::MatrixXd Jint_both_second( | ||
202 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
203 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x, dx, Jint_both_first, Jint_both_second); |
204 | |||
205 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jint_first - Jint_both_first).isZero(1e-9)); |
206 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jint_second - Jint_both_second).isZero(1e-9)); |
207 | |||
208 | // Checking that casted computation is the same | ||
209 | #ifdef NDEBUG // Run only in release mode | ||
210 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
211 | state->cast<float>(); | ||
212 | const Eigen::VectorXf x_f = casted_state->rand(); | ||
213 | const Eigen::VectorXf dx_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
214 | Eigen::MatrixXf Jint_tmp_f( | ||
215 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
216 | Eigen::MatrixXf Jint_first_f( | ||
217 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
218 | Eigen::MatrixXf Jint_second_f( | ||
219 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
220 | Eigen::MatrixXf Jint_both_first_f( | ||
221 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
222 | Eigen::MatrixXf Jint_both_second_f( | ||
223 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
224 | casted_state->Jintegrate(x_f, dx_f, Jint_first_f, Jint_tmp_f, | ||
225 | crocoddyl::first); | ||
226 | casted_state->Jintegrate(x_f, dx_f, Jint_tmp_f, Jint_second_f, | ||
227 | crocoddyl::second); | ||
228 | casted_state->Jintegrate(x_f, dx_f, Jint_both_first_f, Jint_both_second_f); | ||
229 | BOOST_CHECK((Jint_first_f - Jint_both_first_f).isZero(1e-9f)); | ||
230 | BOOST_CHECK((Jint_second_f - Jint_both_second_f).isZero(1e-9f)); | ||
231 | #endif | ||
232 | 7 | } | |
233 | |||
234 | 7 | void test_Jdiff_num_diff_firstsecond(StateModelTypes::Type state_type) { | |
235 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
236 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
237 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
238 | // Generating random values for the initial and terminal states | ||
239 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x1 = state->rand(); |
240 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x2 = state->rand(); |
241 | |||
242 | // Get the num diff state | ||
243 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | crocoddyl::StateNumDiff state_num_diff(state); |
244 | |||
245 | // Computing the partial derivatives of the difference function separately | ||
246 | Eigen::MatrixXd Jdiff_num_diff_tmp( | ||
247 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
248 | Eigen::MatrixXd Jdiff_num_diff_first( | ||
249 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
250 | Eigen::MatrixXd Jdiff_num_diff_second( | ||
251 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
252 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jdiff(x1, x2, Jdiff_num_diff_first, Jdiff_num_diff_tmp, |
253 | crocoddyl::first); | ||
254 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jdiff(x1, x2, Jdiff_num_diff_tmp, Jdiff_num_diff_second, |
255 | crocoddyl::second); | ||
256 | |||
257 | // Computing the partial derivatives of the difference function separately | ||
258 | Eigen::MatrixXd Jdiff_num_diff_both_first( | ||
259 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
260 | Eigen::MatrixXd Jdiff_num_diff_both_second( | ||
261 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
262 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jdiff(x1, x2, Jdiff_num_diff_both_first, |
263 | Jdiff_num_diff_both_second); | ||
264 | |||
265 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jdiff_num_diff_first - Jdiff_num_diff_both_first).isZero(1e-9)); |
266 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK( |
267 | (Jdiff_num_diff_second - Jdiff_num_diff_both_second).isZero(1e-9)); | ||
268 | 7 | } | |
269 | |||
270 | 7 | void test_Jint_num_diff_firstsecond(StateModelTypes::Type state_type) { | |
271 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
272 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
273 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
274 | // Generating random values for the initial and terminal states | ||
275 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x = state->rand(); |
276 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | const Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
277 | |||
278 | // Get the num diff state | ||
279 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | crocoddyl::StateNumDiff state_num_diff(state); |
280 | |||
281 | // Computing the partial derivatives of the difference function separately | ||
282 | Eigen::MatrixXd Jint_num_diff_tmp( | ||
283 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
284 | Eigen::MatrixXd Jint_num_diff_first( | ||
285 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
286 | Eigen::MatrixXd Jint_num_diff_second( | ||
287 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
288 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jintegrate(x, dx, Jint_num_diff_first, Jint_num_diff_tmp, |
289 | crocoddyl::first); | ||
290 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jintegrate(x, dx, Jint_num_diff_tmp, Jint_num_diff_second, |
291 | crocoddyl::second); | ||
292 | |||
293 | // Computing the partial derivatives of the given function separately | ||
294 | Eigen::MatrixXd Jint_num_diff_both_first( | ||
295 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
296 | Eigen::MatrixXd Jint_num_diff_both_second( | ||
297 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
298 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jintegrate(x, dx, Jint_num_diff_both_first, |
299 | Jint_num_diff_both_second); | ||
300 | |||
301 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jint_num_diff_first - Jint_num_diff_both_first).isZero(1e-9)); |
302 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jint_num_diff_second - Jint_num_diff_both_second).isZero(1e-9)); |
303 | 7 | } | |
304 | |||
305 | 7 | void test_Jdiff_against_numdiff(StateModelTypes::Type state_type) { | |
306 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
307 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
308 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
309 | // Generating random values for the initial and terminal states | ||
310 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x1 = state->rand(); |
311 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x2 = state->rand(); |
312 | |||
313 | // Computing the partial derivatives of the difference function analytically | ||
314 | Eigen::MatrixXd Jdiff_1( | ||
315 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
316 | Eigen::MatrixXd Jdiff_2( | ||
317 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
318 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, Jdiff_1, Jdiff_2, crocoddyl::first); |
319 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, Jdiff_1, Jdiff_2, crocoddyl::second); |
320 | |||
321 | // Computing the partial derivatives of the difference function numerically | ||
322 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | crocoddyl::StateNumDiff state_num_diff(state); |
323 | Eigen::MatrixXd Jdiff_num_1( | ||
324 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
325 | Eigen::MatrixXd Jdiff_num_2( | ||
326 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
327 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jdiff(x1, x2, Jdiff_num_1, Jdiff_num_2); |
328 | |||
329 | // Checking the partial derivatives against numerical differentiation | ||
330 | // Tolerance defined as in | ||
331 | // http://www.it.uom.gr/teaching/linearalgebra/NumericalRecipiesInC/c5-7.pdf | ||
332 | 7 | double tol = std::pow(std::sqrt(2.0 * std::numeric_limits<double>::epsilon()), | |
333 | 1. / 3.); | ||
334 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jdiff_1 - Jdiff_num_1).isZero(tol)); |
335 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jdiff_2 - Jdiff_num_2).isZero(tol)); |
336 | 7 | } | |
337 | |||
338 | 7 | void test_Jintegrate_against_numdiff(StateModelTypes::Type state_type) { | |
339 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
340 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
341 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
342 | |||
343 | // Generating random values for the initial state and its rate of change | ||
344 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x = state->rand(); |
345 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | const Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
346 | |||
347 | // Computing the partial derivatives of the difference function analytically | ||
348 | Eigen::MatrixXd Jint_1( | ||
349 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
350 | Eigen::MatrixXd Jint_2( | ||
351 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
352 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x, dx, Jint_1, Jint_2); |
353 | |||
354 | // Computing the partial derivatives of the difference function numerically | ||
355 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | crocoddyl::StateNumDiff state_num_diff(state); |
356 | Eigen::MatrixXd Jint_num_1( | ||
357 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
358 | Eigen::MatrixXd Jint_num_2( | ||
359 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
360 |
5/10✓ 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.
✓ Branch 13 taken 7 times.
✗ Branch 14 not taken.
|
7 | state_num_diff.Jintegrate(x, dx, Jint_num_1, Jint_num_2); |
361 | |||
362 | // Checking the partial derivatives against numerical differentiation | ||
363 | // Tolerance defined as in | ||
364 | // http://www.it.uom.gr/teaching/linearalgebra/NumericalRecipiesInC/c5-7.pdf | ||
365 | 7 | double tol = std::pow(std::sqrt(2.0 * std::numeric_limits<double>::epsilon()), | |
366 | 1. / 3.); | ||
367 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jint_1 - Jint_num_1).isZero(tol)); |
368 |
8/16✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 7 times.
|
7 | BOOST_CHECK((Jint_2 - Jint_num_2).isZero(tol)); |
369 | |||
370 | // Checking that casted computation is the same | ||
371 | #ifdef NDEBUG // Run only in release mode | ||
372 | float tol_f = std::sqrt(float(2.0) * std::numeric_limits<float>::epsilon()); | ||
373 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
374 | state->cast<float>(); | ||
375 | crocoddyl::StateNumDiffTpl<float> casted_state_num_diff = | ||
376 | state_num_diff.cast<float>(); | ||
377 | const Eigen::VectorXf x_f = casted_state->rand(); | ||
378 | const Eigen::VectorXf dx_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
379 | Eigen::MatrixXf Jint_1_f( | ||
380 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
381 | Eigen::MatrixXf Jint_2_f( | ||
382 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
383 | Eigen::MatrixXf Jint_num_1_f( | ||
384 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
385 | Eigen::MatrixXf Jint_num_2_f( | ||
386 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
387 | casted_state_num_diff.Jintegrate(x_f, dx_f, Jint_num_1_f, Jint_num_2_f); | ||
388 | casted_state->Jintegrate(x_f, dx_f, Jint_1_f, Jint_2_f); | ||
389 | BOOST_CHECK((Jint_1_f - Jint_num_1_f).isZero(tol_f)); | ||
390 | BOOST_CHECK((Jint_2_f - Jint_num_2_f).isZero(tol_f)); | ||
391 | #endif | ||
392 | 7 | } | |
393 | |||
394 | 7 | void test_JintegrateTransport(StateModelTypes::Type state_type) { | |
395 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
396 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
397 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
398 | |||
399 | // Generating random values for the initial state and its rate of change | ||
400 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x = state->rand(); |
401 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | const Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
402 | |||
403 | // Computing the partial derivatives of the difference function analytically | ||
404 | Eigen::MatrixXd Jint_1( | ||
405 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
406 | Eigen::MatrixXd Jint_2( | ||
407 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
408 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x, dx, Jint_1, Jint_2); |
409 | |||
410 | Eigen::MatrixXd Jref( | ||
411 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Random(state->get_ndx(), 2 * state->get_ndx())); |
412 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | const Eigen::MatrixXd Jtest(Jref); |
413 | |||
414 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->JintegrateTransport(x, dx, Jref, crocoddyl::first); |
415 |
9/18✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 7 times.
|
7 | BOOST_CHECK((Jref - Jint_1 * Jtest).isZero(1e-10)); |
416 | |||
417 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | Jref = Jtest; |
418 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->JintegrateTransport(x, dx, Jref, crocoddyl::second); |
419 |
9/18✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 7 times.
|
7 | BOOST_CHECK((Jref - Jint_2 * Jtest).isZero(1e-10)); |
420 | |||
421 | // Checking that casted computation is the same | ||
422 | #ifdef NDEBUG // Run only in release mode | ||
423 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
424 | state->cast<float>(); | ||
425 | const Eigen::VectorXf x_f = casted_state->rand(); | ||
426 | const Eigen::VectorXf dx_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
427 | Eigen::MatrixXf Jint_1_f( | ||
428 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
429 | Eigen::MatrixXf Jint_2_f( | ||
430 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
431 | Eigen::MatrixXf Jref_f(Eigen::MatrixXf::Random(casted_state->get_ndx(), | ||
432 | 2 * casted_state->get_ndx())); | ||
433 | const Eigen::MatrixXf Jtest_f(Jref_f); | ||
434 | casted_state->Jintegrate(x_f, dx_f, Jint_1_f, Jint_2_f); | ||
435 | Jref_f = Jtest_f; | ||
436 | casted_state->JintegrateTransport(x_f, dx_f, Jref_f, crocoddyl::first); | ||
437 | BOOST_CHECK((Jref_f - Jint_1_f * Jtest_f).isZero(1e-6f)); | ||
438 | casted_state->JintegrateTransport(x_f, dx_f, Jref_f, crocoddyl::second); | ||
439 | Jref_f = Jtest_f; | ||
440 | casted_state->JintegrateTransport(x_f, dx_f, Jref_f, crocoddyl::second); | ||
441 | BOOST_CHECK((Jref_f - Jint_2_f * Jtest_f).isZero(1e-6f)); | ||
442 | #endif | ||
443 | 7 | } | |
444 | |||
445 | 7 | void test_Jdiff_and_Jintegrate_are_inverses(StateModelTypes::Type state_type) { | |
446 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
447 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
448 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
449 | |||
450 | // Generating random states | ||
451 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x1 = state->rand(); |
452 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | const Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
453 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd x2(state->get_nx()); |
454 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->integrate(x1, dx, x2); |
455 | |||
456 | // Computing the partial derivatives of the integrate and difference function | ||
457 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd Jx(Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
458 | Eigen::MatrixXd Jdx( | ||
459 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
460 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x1, dx, Jx, Jdx); |
461 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd J1(Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
462 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd J2(Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
463 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, J1, J2); |
464 | |||
465 | // Checking that Jdiff and Jintegrate are inverses | ||
466 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | Eigen::MatrixXd dX_dDX = Jdx; |
467 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | Eigen::MatrixXd dDX_dX = J2; |
468 |
9/18✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 7 times.
|
7 | BOOST_CHECK((dX_dDX - dDX_dX.inverse()).isZero(1e-9)); |
469 | |||
470 | // Checking that casted computation is the same | ||
471 | #ifdef NDEBUG // Run only in release mode | ||
472 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
473 | state->cast<float>(); | ||
474 | const Eigen::VectorXf x1_f = casted_state->rand(); | ||
475 | const Eigen::VectorXf dx_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
476 | Eigen::VectorXf x2_f(casted_state->get_nx()); | ||
477 | |||
478 | Eigen::MatrixXf Jx_f( | ||
479 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
480 | Eigen::MatrixXf Jdx_f( | ||
481 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
482 | Eigen::MatrixXf J1_f( | ||
483 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
484 | Eigen::MatrixXf J2_f( | ||
485 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
486 | Eigen::MatrixXf dX_dDX_f = Jdx_f; | ||
487 | Eigen::MatrixXf dDX_dX_f = J2_f; | ||
488 | casted_state->integrate(x1_f, dx_f, x2_f); | ||
489 | casted_state->Jintegrate(x1_f, dx_f, Jx_f, Jdx_f); | ||
490 | casted_state->Jdiff(x1_f, x2_f, J1_f, J2_f); | ||
491 | dX_dDX_f = Jdx_f; | ||
492 | dDX_dX_f = J2_f; | ||
493 | BOOST_CHECK((dX_dDX_f - dDX_dX_f.inverse()).isZero(1e-4f)); | ||
494 | #endif | ||
495 | 7 | } | |
496 | |||
497 | 7 | void test_velocity_from_Jintegrate_Jdiff(StateModelTypes::Type state_type) { | |
498 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | StateModelFactory factory; |
499 | const std::shared_ptr<crocoddyl::StateAbstract>& state = | ||
500 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | factory.create(state_type); |
501 | |||
502 | // Generating random states | ||
503 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x1 = state->rand(); |
504 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | Eigen::VectorXd dx = Eigen::VectorXd::Random(state->get_ndx()); |
505 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd x2(state->get_nx()); |
506 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->integrate(x1, dx, x2); |
507 |
3/6✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
|
7 | Eigen::VectorXd eps = Eigen::VectorXd::Random(state->get_ndx()); |
508 | 7 | double h = 1e-8; | |
509 | |||
510 | // Computing the partial derivatives of the integrate and difference function | ||
511 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd Jx(Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
512 | Eigen::MatrixXd Jdx( | ||
513 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
514 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jintegrate(x1, dx, Jx, Jdx); |
515 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd J1(Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
516 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 7 times.
✗ Branch 13 not taken.
|
7 | Eigen::MatrixXd J2(Eigen::MatrixXd::Zero(state->get_ndx(), state->get_ndx())); |
517 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x2, J1, J2); |
518 | |||
519 | // Checking that computed velocity from Jintegrate | ||
520 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | Eigen::MatrixXd dX_dDX = Jdx; |
521 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd x2eps(state->get_nx()); |
522 |
6/12✓ Branch 2 taken 7 times.
✗ Branch 3 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.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
|
7 | state->integrate(x1, dx + eps * h, x2eps); |
523 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd x2_eps(state->get_ndx()); |
524 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->diff(x2, x2eps, x2_eps); |
525 |
10/20✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 7 times.
✗ Branch 30 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 7 times.
|
7 | BOOST_CHECK((dX_dDX * eps - x2_eps / h).isZero(1e-3)); |
526 | |||
527 | // Checking the velocity computed from Jdiff | ||
528 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | const Eigen::VectorXd x = state->rand(); |
529 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | dx.setZero(); |
530 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->diff(x1, x, dx); |
531 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd x2i(state->get_nx()); |
532 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->integrate(x, eps * h, x2i); |
533 |
2/4✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
|
7 | Eigen::VectorXd dxi(state->get_ndx()); |
534 |
4/8✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->diff(x1, x2i, dxi); |
535 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | J1.setZero(); |
536 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | J2.setZero(); |
537 |
5/10✓ Branch 2 taken 7 times.
✗ Branch 3 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 | state->Jdiff(x1, x, J1, J2); |
538 |
12/24✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 7 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 7 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 7 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 7 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 7 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 7 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 7 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 7 times.
✗ Branch 36 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 7 times.
|
7 | BOOST_CHECK((J2 * eps - (-dx + dxi) / h).isZero(1e-3)); |
539 | |||
540 | // Checking that casted computation is the same | ||
541 | #ifdef NDEBUG // Run only in release mode | ||
542 | const std::shared_ptr<crocoddyl::StateAbstractTpl<float>>& casted_state = | ||
543 | state->cast<float>(); | ||
544 | float h_f = std::sqrt(float(2.0) * std::numeric_limits<float>::epsilon()); | ||
545 | Eigen::VectorXf eps_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
546 | const Eigen::VectorXf x1_f = casted_state->rand(); | ||
547 | Eigen::VectorXf dx_f = Eigen::VectorXf::Random(casted_state->get_ndx()); | ||
548 | Eigen::VectorXf x2_f(casted_state->get_nx()); | ||
549 | Eigen::MatrixXf Jx_f( | ||
550 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
551 | Eigen::MatrixXf Jdx_f( | ||
552 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
553 | Eigen::MatrixXf J1_f( | ||
554 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
555 | Eigen::MatrixXf J2_f( | ||
556 | Eigen::MatrixXf::Zero(casted_state->get_ndx(), casted_state->get_ndx())); | ||
557 | Eigen::MatrixXf dX_dDX_f = Jdx_f; | ||
558 | Eigen::VectorXf x2eps_f(casted_state->get_nx()); | ||
559 | Eigen::VectorXf x2_eps_f(casted_state->get_ndx()); | ||
560 | const Eigen::VectorXf x_f = casted_state->rand(); | ||
561 | Eigen::VectorXf x2i_f(casted_state->get_nx()); | ||
562 | Eigen::VectorXf dxi_f(casted_state->get_ndx()); | ||
563 | casted_state->integrate(x1_f, dx_f, x2_f); | ||
564 | casted_state->Jintegrate(x1_f, dx_f, Jx_f, Jdx_f); | ||
565 | casted_state->Jdiff(x1_f, x2_f, J1_f, J2_f); | ||
566 | dX_dDX_f = Jdx_f; | ||
567 | casted_state->integrate(x1_f, dx_f + eps_f * h_f, x2eps_f); | ||
568 | casted_state->diff(x2_f, x2eps_f, x2_eps_f); | ||
569 | BOOST_CHECK((dX_dDX_f * eps_f - x2_eps_f / h_f).isZero(1e-3f)); | ||
570 | dx_f.setZero(); | ||
571 | casted_state->diff(x1_f, x_f, dx_f); | ||
572 | casted_state->integrate(x_f, eps_f * h_f, x2i_f); | ||
573 | casted_state->diff(x1_f, x2i_f, dxi_f); | ||
574 | casted_state->Jdiff(x1_f, x_f, J1_f, J2_f); | ||
575 | BOOST_CHECK((J2_f * eps_f - (dxi_f - dx_f) / h_f).isZero(1e-2f)); | ||
576 | #endif | ||
577 | 7 | } | |
578 | |||
579 | //----------------------------------------------------------------------------// | ||
580 | |||
581 | 7 | void register_state_unit_tests(StateModelTypes::Type state_type) { | |
582 |
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; |
583 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | test_name << "test_" << state_type; |
584 |
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; |
585 |
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()); |
586 |
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(boost::bind(&test_state_dimension, state_type))); |
587 |
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( |
588 | boost::bind(&test_integrate_against_difference, state_type))); | ||
589 |
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( |
590 | boost::bind(&test_difference_against_integrate, state_type))); | ||
591 |
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(boost::bind(&test_Jdiff_firstsecond, state_type))); |
592 |
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(boost::bind(&test_Jint_firstsecond, state_type))); |
593 |
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( |
594 | boost::bind(&test_Jdiff_num_diff_firstsecond, state_type))); | ||
595 |
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( |
596 | boost::bind(&test_Jint_num_diff_firstsecond, state_type))); | ||
597 | 14 | ts->add( | |
598 |
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_Jdiff_against_numdiff, state_type))); |
599 |
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( |
600 | boost::bind(&test_Jintegrate_against_numdiff, state_type))); | ||
601 |
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(boost::bind(&test_JintegrateTransport, state_type))); |
602 |
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( |
603 | boost::bind(&test_Jdiff_and_Jintegrate_are_inverses, state_type))); | ||
604 |
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( |
605 | boost::bind(&test_velocity_from_Jintegrate_Jdiff, state_type))); | ||
606 |
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); |
607 | 7 | } | |
608 | |||
609 | 1 | bool init_function() { | |
610 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
|
8 | for (size_t i = 0; i < StateModelTypes::all.size(); ++i) { |
611 | 7 | register_state_unit_tests(StateModelTypes::all[i]); | |
612 | } | ||
613 | 1 | return true; | |
614 | } | ||
615 | |||
616 | 1 | int main(int argc, char** argv) { | |
617 | 1 | return ::boost::unit_test::unit_test_main(&init_function, argc, argv); | |
618 | } | ||
619 |