GCC Code Coverage Report


Directory: ./
File: tests/explicit-constraint-set.cc
Date: 2025-05-05 12:19:30
Exec Total Coverage
Lines: 347 375 92.5%
Branches: 1047 2162 48.4%

Line Branch Exec Source
1 // Copyright (c) 2017, Joseph Mirabel
2 // Authors: Joseph Mirabel (joseph.mirabel@laas.fr)
3 //
4
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // 1. Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //
12 // 2. Redistributions in binary form must reproduce the above copyright
13 // notice, this list of conditions and the following disclaimer in the
14 // documentation and/or other materials provided with the distribution.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
27 // DAMAGE.
28
29 #define BOOST_TEST_MODULE EXPLICIT_CONSTRAINT_SET
30 #include <../tests/util.hh>
31 #include <boost/test/unit_test.hpp>
32 #include <hpp/constraints/affine-function.hh>
33 #include <hpp/constraints/explicit-constraint-set.hh>
34 #include <hpp/constraints/explicit.hh>
35 #include <hpp/constraints/explicit/relative-pose.hh>
36 #include <hpp/constraints/generic-transformation.hh>
37 #include <hpp/constraints/locked-joint.hh>
38 #include <hpp/constraints/symbolic-calculus.hh>
39 #include <hpp/pinocchio/configuration.hh>
40 #include <hpp/pinocchio/device.hh>
41 #include <hpp/pinocchio/joint.hh>
42 #include <hpp/pinocchio/liegroup-element.hh>
43 #include <hpp/pinocchio/liegroup.hh>
44 #include <hpp/pinocchio/simple-device.hh>
45 #include <hpp/pinocchio/urdf/util.hh>
46 #include <pinocchio/algorithm/joint-configuration.hpp>
47
48 using Eigen::BlockIndex;
49 using Eigen::ColBlockIndices;
50 using Eigen::RowBlockIndices;
51
52 using hpp::constraints::AffineFunction;
53 using hpp::constraints::AffineFunctionPtr_t;
54 using hpp::constraints::ComparisonTypes_t;
55 using hpp::constraints::Configuration_t;
56 using hpp::constraints::Device;
57 using hpp::constraints::DevicePtr_t;
58 using hpp::constraints::DifferentiableFunction;
59 using hpp::constraints::Equality;
60 using hpp::constraints::EqualToZero;
61 using hpp::constraints::Explicit;
62 using hpp::constraints::ExplicitConstraintSet;
63 using hpp::constraints::ExplicitPtr_t;
64 using hpp::constraints::JointPtr_t;
65 using hpp::constraints::LiegroupElement;
66 using hpp::constraints::LiegroupElementRef;
67 using hpp::constraints::LiegroupSpace;
68 using hpp::constraints::LiegroupSpacePtr_t;
69 using hpp::constraints::LockedJoint;
70 using hpp::constraints::LockedJointPtr_t;
71 using hpp::constraints::matrix3_t;
72 using hpp::constraints::matrix_t;
73 using hpp::constraints::matrixOut_t;
74 using hpp::constraints::RelativeTransformation;
75 using hpp::constraints::RelativeTransformationPtr_t;
76 using hpp::constraints::segment_t;
77 using hpp::constraints::segments_t;
78 using hpp::constraints::size_type;
79 using hpp::constraints::Transform3s;
80 using hpp::constraints::value_type;
81 using hpp::constraints::vector3_t;
82 using hpp::constraints::vector_t;
83 using hpp::constraints::vectorIn_t;
84 using hpp::pinocchio::unittest::HumanoidSimple;
85 using hpp::pinocchio::unittest::makeDevice;
86
87 namespace Eigen {
88 namespace internal {
89 bool operator==(const empty_struct&, const empty_struct&) { return true; }
90 } // namespace internal
91
92 template <bool _allRows, bool _allCols>
93 12 bool operator==(const MatrixBlocks<_allRows, _allCols>& a,
94 const MatrixBlocks<_allRows, _allCols>& b) {
95 8 return (_allRows || a.nbRows() == b.nbRows()) &&
96 12 (_allCols || a.nbCols() == b.nbCols()) &&
97
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
16 (_allRows || a.rows() == b.rows()) &&
98
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
16 (_allCols || a.cols() == b.cols());
99 }
100 } // namespace Eigen
101
102 // Explicit expression of variables
103 // - [idxOut:idxOut+length] with respect to
104 // - [idxIn:idxIn+length]
105 class TestFunction : public AffineFunction {
106 public:
107 size_type idxIn_, idxOut_, length_;
108
109 2 TestFunction(size_type idxIn, size_type idxOut, size_type length)
110
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 : AffineFunction(matrix_t::Identity(length, length), "TestFunction"),
111 2 idxIn_(idxIn),
112 2 idxOut_(idxOut),
113
3/6
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
4 length_(length) {}
114
115 // return configuration input interval
116 5 ExplicitConstraintSet::RowBlockIndices inArg() const {
117 5 ExplicitConstraintSet::RowBlockIndices ret;
118
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 ret.addRow(idxIn_, length_);
119 5 return ret;
120 }
121
122 // return configuration output interval
123 5 ExplicitConstraintSet::RowBlockIndices outArg() const {
124 5 ExplicitConstraintSet::RowBlockIndices ret;
125
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 ret.addRow(idxOut_, length_);
126 5 return ret;
127 }
128
129 // return velocity input interval
130 5 ExplicitConstraintSet::ColBlockIndices inDer() const {
131 5 ExplicitConstraintSet::ColBlockIndices ret;
132 ret.addCol(idxIn_ - 1,
133
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 length_); // TODO this assumes there is only the freeflyer
134 5 return ret;
135 }
136
137 // return velocity output interval
138 5 ExplicitConstraintSet::RowBlockIndices outDer() const {
139 5 ExplicitConstraintSet::RowBlockIndices ret;
140 ret.addRow(idxOut_ - 1,
141
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 length_); // TODO this assumes there is only the freeflyer
142 5 return ret;
143 }
144 }; // class TestFunction
145
146 matrix3_t exponential(const vector3_t& aa) {
147 matrix3_t R, xCross;
148 xCross.setZero();
149 xCross(1, 0) = +aa(2);
150 xCross(0, 1) = -aa(2);
151 xCross(2, 0) = -aa(1);
152 xCross(0, 2) = +aa(1);
153 xCross(2, 1) = +aa(0);
154 xCross(1, 2) = -aa(0);
155 R.setIdentity();
156 value_type theta = aa.norm();
157 if (theta < 1e-6) {
158 R += xCross;
159 R += 0.5 * xCross.transpose() * xCross;
160 } else {
161 R += sin(theta) / theta * xCross;
162 R += 2 * std::pow(sin(theta / 2), 2) / std::pow(theta, 2) * xCross * xCross;
163 }
164 return R;
165 }
166
167 class ExplicitTransformation : public DifferentiableFunction {
168 public:
169 JointPtr_t joint_;
170 size_type in_, inDer_;
171 RelativeTransformationPtr_t rt_;
172
173 1 ExplicitTransformation(JointPtr_t joint, size_type in, size_type l,
174 size_type inDer, size_type lDer)
175 1 : DifferentiableFunction(l, lDer,
176
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 LiegroupSpacePtr_t(LiegroupSpace::R3xSO3()),
177 "ExplicitTransformation"),
178 1 joint_(joint),
179 1 in_(in),
180
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
3 inDer_(inDer) {
181
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
4 rt_ = RelativeTransformation::create("RT", joint_->robot(),
182
1/2
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 joint_->robot()->rootJoint(), joint_,
183
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
3 Transform3s::Identity());
184 1 }
185
186 1 ExplicitConstraintSet::RowBlockIndices inArg() const {
187 1 ExplicitConstraintSet::RowBlockIndices ret;
188
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ret.addRow(in_, inputSize());
189 1 return ret;
190 }
191
192 1 ExplicitConstraintSet::RowBlockIndices outArg() const {
193 1 ExplicitConstraintSet::RowBlockIndices ret;
194
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ret.addRow(0, 7);
195 1 return ret;
196 }
197
198 2 ExplicitConstraintSet::ColBlockIndices inDer() const {
199 2 ExplicitConstraintSet::ColBlockIndices ret;
200
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 ret.addCol(inDer_, inputDerivativeSize());
201 2 return ret;
202 }
203
204 1 ExplicitConstraintSet::RowBlockIndices outDer() const {
205 1 ExplicitConstraintSet::RowBlockIndices ret;
206
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ret.addRow(0, 6);
207 1 return ret;
208 }
209
210 1 vector_t config(vectorIn_t arg) const {
211
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 vector_t q = joint_->robot()->neutralConfiguration();
212
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 q.segment(in_, inputSize()) = arg;
213 1 return q;
214 // joint_->robot()->currentConfiguration(q);
215 // joint_->robot()->computeForwardKinematics();
216 }
217
218 void impl_compute(LiegroupElementRef result, vectorIn_t arg) const {
219 // forwardKinematics(arg);
220 LiegroupElement transform(LiegroupSpace::Rn(6));
221 vector_t q = config(arg);
222 rt_->value(transform, q);
223 result.vector().head<3>() = transform.vector().head<3>();
224 result.vector().tail<4>() =
225 Eigen::Quaternion<value_type>(exponential(transform.vector().tail<3>()))
226 .coeffs();
227 }
228
229 1 void impl_jacobian(matrixOut_t jacobian, vectorIn_t arg) const {
230 // forwardKinematics(arg);
231
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 matrix_t J(6, rt_->inputDerivativeSize());
232
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 vector_t q = config(arg);
233
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 rt_->jacobian(J, q);
234
235
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 inDer().rview(J).writeTo(jacobian);
236 1 }
237 };
238
239 typedef hpp::shared_ptr<TestFunction> TestFunctionPtr_t;
240 typedef hpp::shared_ptr<ExplicitTransformation> ExplicitTransformationPtr_t;
241
242 template <int N>
243 6 void order_test(const AffineFunctionPtr_t f[N], const segment_t s[N + 1],
244 const std::vector<int> forder, const segments_t& inArgs,
245 const segments_t& outArgs) {
246
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 ExplicitConstraintSet expression(LiegroupSpace::Rn(4));
247
2/2
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 6 times.
24 for (int i = 0; i < N; ++i) {
248 18 int fo = forder[i], si = forder[i], so = forder[i] + 1;
249
1/2
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
72 ExplicitPtr_t constraint(Explicit::create(
250
3/6
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 18 times.
✗ Branch 11 not taken.
54 LiegroupSpace::Rn(4), f[fo], segments_t(1, s[si]), segments_t(1, s[so]),
251
2/4
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
36 segments_t(1, s[si]), segments_t(1, s[so])));
252
7/14
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 18 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 18 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 18 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 18 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 18 times.
18 BOOST_CHECK(expression.add(constraint) >= 0);
253 }
254
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 6 times.
6 BOOST_CHECK_EQUAL(expression.inArgs().rows(), inArgs);
255
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 6 times.
6 BOOST_CHECK_EQUAL(expression.outArgs().rows(), outArgs);
256 6 }
257
258
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(order) {
259
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::Matrix<value_type, 1, 1> M;
260
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 M(0, 0) = 1;
261
262 // dof : 0 -> 1 -> 2 -> 3
263 // function: f0 f1 f2
264 AffineFunctionPtr_t f[] = {AffineFunction::create(M),
265 AffineFunction::create(M),
266
9/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
10 AffineFunction::create(M)};
267 2 segment_t s[] = {segment_t(0, 1), segment_t(1, 1), segment_t(2, 1),
268 segment_t(3, 1)};
269
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 segments_t inArgs{s[0]}, outArgs{s[1], s[2], s[3]};
270
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 BlockIndex::shrink(outArgs);
271
272
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::vector<int> order(3);
273
274
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 order = {0, 1, 2};
275
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 order_test<3>(f, s, order, inArgs, outArgs);
276
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 order = {0, 2, 1};
277
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 order_test<3>(f, s, order, inArgs, outArgs);
278
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 order = {1, 0, 2};
279
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 order_test<3>(f, s, order, inArgs, outArgs);
280
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 order = {1, 2, 0};
281
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 order_test<3>(f, s, order, inArgs, outArgs);
282
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 order = {2, 0, 1};
283
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 order_test<3>(f, s, order, inArgs, outArgs);
284
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 order = {2, 1, 0};
285
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 order_test<3>(f, s, order, inArgs, outArgs);
286
2/4
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
12 }
287
288
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(jacobian1) {
289
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 matrix_t J[] = {(matrix_t(1, 1) << 1).finished(),
290
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 (matrix_t(1, 1) << 2).finished(),
291
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
18 (matrix_t(1, 1) << 3).finished()};
292
293 // dof : 0 -> 1 -> 2 -> 3
294 // function: f0 f1 f2
295 AffineFunctionPtr_t f[] = {AffineFunction::create(J[0]),
296 AffineFunction::create(J[1]),
297
9/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
10 AffineFunction::create(J[2])};
298 segments_t s[] = {
299 4 segments_t(1, segment_t(0, 1)), segments_t(1, segment_t(1, 1)),
300
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
16 segments_t(1, segment_t(2, 1)), segments_t(1, segment_t(3, 1))};
301
302
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 ExplicitConstraintSet expression(LiegroupSpace::Rn(4));
303
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (int i = 0; i < 3; ++i) {
304
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
12 ExplicitPtr_t constraint(Explicit::create(LiegroupSpace::Rn(4), f[i], s[i],
305
1/2
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
18 s[i + 1], s[i], s[i + 1]));
306
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 expression.add(constraint);
307 6 }
308
309
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t x(4);
310
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
2 x << 1, 2, 3, 4;
311
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t xres = x;
312
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(expression.solve(xres));
313
314 // Check the solution
315
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_EQUAL(xres[0], x[0]);
316
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (int i = 0; i < 3; ++i)
317
9/18
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 3 times.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 3 times.
6 BOOST_CHECK_EQUAL(xres.segment<1>(i + 1),
318 (*f[i])(xres.segment<1>(i)).vector());
319
320 // Check the jacobian
321 // It should be ( J[0], J[1] * J[0], J[2] * J[1] * J[0])
322
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 matrix_t expjac(matrix_t::Zero(expression.nv(), expression.nv()));
323
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 expjac.col(0) << 1, J[0], J[1] * J[0], J[2] * J[1] * J[0];
324
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 matrix_t jacobian(expression.nv(), expression.nv());
325
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, xres);
326
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_EQUAL(jacobian, expjac);
327
6/12
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
30 }
328
329
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(jacobian2) {
330
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 matrix_t J[] = {(matrix_t(1, 2) << 3.2, -0.3).finished(),
331
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 (matrix_t(1, 1) << 4.1).finished(),
332
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
18 (matrix_t(1, 2) << -0.3, 1.2).finished()};
333
334 /* dof : 1,2 -> 0 \
335 * function: f0 --> 4
336 * 1 -> 3 / f2
337 * f1
338 */
339 AffineFunctionPtr_t f[] = {AffineFunction::create(J[0]),
340 AffineFunction::create(J[1]),
341
9/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
10 AffineFunction::create(J[2])};
342
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::vector<segments_t> s(6);
343
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 s[0] = {segment_t(1, 2)};
344
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 s[1] = {segment_t(0, 1)};
345
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 s[2] = {segment_t(3, 1)};
346
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 s[3] = {segment_t(4, 1)};
347
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 s[4] = {segment_t(0, 1), segment_t(3, 1)};
348
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 s[5] = {segment_t(1, 1)};
349
350
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 ExplicitConstraintSet expression(LiegroupSpace::Rn(5));
351 2 ExplicitPtr_t constraint;
352 constraint =
353
2/4
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Explicit::create(LiegroupSpace::Rn(5), f[0], s[0], s[1], s[0], s[1]);
354
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expression.add(constraint);
355 constraint =
356
2/4
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Explicit::create(LiegroupSpace::Rn(5), f[2], s[4], s[3], s[4], s[3]);
357
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expression.add(constraint);
358 constraint =
359
2/4
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 Explicit::create(LiegroupSpace::Rn(5), f[1], s[5], s[2], s[5], s[2]);
360
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expression.add(constraint);
361
362
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::MatrixXi inOutDependencies(3, 5);
363
15/30
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
2 inOutDependencies << 0, 1, 1, 0, 0, 0, 2, 1, 0, 0, 0, 1, 0, 0, 0;
364
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.inOutDependencies(), inOutDependencies);
365
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 inOutDependencies.resize(3, 2);
366
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
2 inOutDependencies << 1, 1, 1, 0, 2, 1;
367
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.inOutDofDependencies(), inOutDependencies);
368
369
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
2 segments_t inArgs = s[0], outArgs = {s[1][0], s[2][0], s[3][0]};
370
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 BlockIndex::shrink(outArgs);
371
372
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.inArgs().rows(), inArgs);
373
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.outArgs().rows(), outArgs);
374
375
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t x(5);
376
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 x << 1, 2, 3, 4, 5;
377
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t xres = x;
378
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(expression.solve(xres));
379
380 // Check the solution
381
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK_EQUAL(xres.segment<2>(1), x.segment<2>(1));
382
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
2 BOOST_CHECK_EQUAL(xres.segment<1>(0), (*f[0])(xres.segment<2>(1)).vector());
383
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
2 BOOST_CHECK_EQUAL(xres.segment<1>(3), (*f[1])(xres.segment<1>(1)).vector());
384
11/22
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
2 BOOST_CHECK_EQUAL(xres.segment<1>(4),
385 (*f[2])(RowBlockIndices(s[4]).rview(xres).eval()).vector());
386
387 // Check the jacobian
388 // It should be ( J[0], J[1] * J[0], J[2] * J[1] * J[0])
389
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 matrix_t expjac(matrix_t::Zero(expression.nv(), expression.nv()));
390
12/24
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
2 expjac.block<5, 2>(0, 1) << J[0](0, 0), J[0](0, 1), 1, 0, 0, 1, J[1](0, 0), 0,
391
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 J[2](0, 0) * J[0](0, 0) + J[2](0, 1) * J[1](0, 0),
392
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 J[2](0, 0) * J[0](0, 1);
393
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 matrix_t jacobian(expression.nv(), expression.nv());
394
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, xres);
395
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 BOOST_CHECK_EQUAL(jacobian, expjac);
396
397
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 matrix_t smallJ = expression.jacobianNotOutToOut(jacobian);
398
10/20
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.outArgs().rview(xres).eval(),
399 smallJ * expression.inArgs().rview(xres).eval());
400
4/8
✓ Branch 11 taken 3 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 3 times.
✓ Branch 14 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
20 }
401
402
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(locked_joints) {
403
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 DevicePtr_t device(makeDevice(HumanoidSimple));
404
405
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_REQUIRE(device);
406
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 device->rootJoint()->lowerBound(0, -1);
407
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 device->rootJoint()->lowerBound(1, -1);
408
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 device->rootJoint()->lowerBound(2, -1);
409
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 device->rootJoint()->upperBound(0, 1);
410
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 device->rootJoint()->upperBound(1, 1);
411
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 device->rootJoint()->upperBound(2, 1);
412
413
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 JointPtr_t ee1 = device->getJointByName("lleg5_joint"),
414
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee2 = device->getJointByName("rleg5_joint"),
415
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee3 = device->getJointByName("rleg4_joint");
416
417 LockedJointPtr_t l1(
418
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
4 LockedJoint::create(ee1, ee1->configurationSpace()->neutral()));
419 LockedJointPtr_t l2(
420
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
4 LockedJoint::create(ee2, ee2->configurationSpace()->neutral()));
421 LockedJointPtr_t l3(
422
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
4 LockedJoint::create(ee3, ee3->configurationSpace()->neutral()));
423
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 TestFunctionPtr_t t1(new TestFunction(ee1->rankInConfiguration(),
424
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 ee2->rankInConfiguration(), 1));
425
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 TestFunctionPtr_t t2(new TestFunction(ee2->rankInConfiguration(),
426
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 ee1->rankInConfiguration(), 1));
427
428
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 RowBlockIndices expectedRow;
429
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 ColBlockIndices expectedCol;
430
431
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Configuration_t q = device->currentConfiguration(),
432
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 qrand = ::pinocchio::randomConfiguration(device->model());
433
434 {
435
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 ExplicitConstraintSet expression(device->configSpace());
436 2 ExplicitPtr_t constraint;
437
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l1) >= 0);
438
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l1) < 0);
439
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l2) >= 0);
440
441
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expectedRow = RowBlockIndices();
442
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 expectedRow.addRow(ee1->rankInConfiguration(), 1);
443
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 expectedRow.addRow(ee2->rankInConfiguration(), 1);
444
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expectedRow.updateRows<true, true, true>();
445
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.outArgs(), expectedRow);
446
447
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 expectedRow = RowBlockIndices(BlockIndex::difference(
448
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
6 BlockIndex::segment_t(0, expression.nq()), expectedRow.rows()));
449
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.notOutArgs(), expectedRow);
450
451
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expectedRow = RowBlockIndices();
452
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 expectedRow.addRow(ee1->rankInVelocity(), 1);
453
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 expectedRow.addRow(ee2->rankInVelocity(), 1);
454
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 expectedRow.updateRows<true, true, true>();
455
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.outDers(), expectedRow);
456
457
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 expectedCol = ColBlockIndices(BlockIndex::difference(
458
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
6 BlockIndex::segment_t(0, expression.nv()), expectedRow.rows()));
459
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.notOutDers(), expectedCol);
460
461
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expectedRow = RowBlockIndices();
462
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.inArgs(), expectedRow);
463
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 expectedCol = ColBlockIndices();
464
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.inDers(), expectedCol);
465
466
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(expression.solve(qrand));
467
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK_EQUAL(qrand[ee1->rankInConfiguration()], 0);
468
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK_EQUAL(qrand[ee2->rankInConfiguration()], 0);
469
470
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 expression.rightHandSide(l1, vector_t::Ones(1));
471
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 expression.rightHandSide(l2, vector_t::Constant(1, -0.2));
472
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(expression.solve(qrand));
473
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK_EQUAL(qrand[ee1->rankInConfiguration()], 1);
474
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK_EQUAL(qrand[ee2->rankInConfiguration()], -0.2);
475
476
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
2 matrix_t jacobian(device->numberDof(), device->numberDof());
477
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, q);
478
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
2 BOOST_CHECK(expression.jacobianNotOutToOut(jacobian).eval().isZero());
479 2 }
480
481 {
482
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 ExplicitConstraintSet expression(device->configSpace());
483
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l1) >= 0);
484 2 ExplicitPtr_t constraint;
485
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
8 constraint = Explicit::create(
486
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 device->configSpace(), t1, t1->inArg().indices(),
487
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
6 t1->outArg().indices(), t1->inDer().indices(), t1->outDer().indices());
488
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(expression.add(constraint) >= 0);
489
490
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(expression.solve(qrand));
491
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 vector_t error(expression.outDers().nbIndices());
492
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
2 BOOST_CHECK(expression.isSatisfied(qrand, error));
493
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK_EQUAL(qrand[ee1->rankInConfiguration()], 0);
494
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK_EQUAL(qrand[ee2->rankInConfiguration()], 0);
495
496
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
2 matrix_t jacobian(device->numberDof(), device->numberDof());
497
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, q);
498
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
2 BOOST_CHECK(expression.jacobianNotOutToOut(jacobian).eval().isZero());
499 2 }
500
501 {
502
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 ExplicitConstraintSet expression(device->configSpace());
503 2 ExplicitPtr_t constraint;
504
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
8 constraint = Explicit::create(
505
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 device->configSpace(), t1, t1->inArg().indices(),
506
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
6 t1->outArg().indices(), t1->inDer().indices(), t1->outDer().indices());
507
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(expression.add(constraint) >= 0);
508
509
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
2 matrix_t jacobian(device->numberDof(), device->numberDof());
510
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, q);
511
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK_EQUAL(jacobian(ee2->rankInVelocity(), ee1->rankInVelocity()),
512 1);
513
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.jacobianNotOutToOut(jacobian).eval().norm(),
514 1);
515 2 }
516
517 {
518
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 ExplicitConstraintSet expression(device->configSpace());
519 2 ExplicitPtr_t constraint;
520
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
8 constraint = Explicit::create(
521
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 device->configSpace(), t1, t1->inArg().indices(),
522
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
6 t1->outArg().indices(), t1->inDer().indices(), t1->outDer().indices());
523
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(expression.add(constraint) >= 0);
524
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
8 constraint = Explicit::create(
525
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 device->configSpace(), t2, t2->inArg().indices(),
526
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
6 t2->outArg().indices(), t2->inDer().indices(), t2->outDer().indices());
527
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(expression.add(constraint) < 0);
528 2 }
529
530 {
531
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 ExplicitConstraintSet expression(device->configSpace());
532 2 ExplicitPtr_t constraint;
533
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
8 constraint = Explicit::create(
534
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 device->configSpace(), t1, t1->inArg().indices(),
535
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
6 t1->outArg().indices(), t1->inDer().indices(), t1->outDer().indices());
536
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(expression.add(constraint) >= 0);
537
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l2) < 0);
538
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l3) >= 0);
539
540
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
2 matrix_t jacobian(device->numberDof(), device->numberDof());
541
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, q);
542
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK_EQUAL(jacobian(ee2->rankInVelocity(), ee1->rankInVelocity()),
543 1);
544
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK_EQUAL(expression.jacobianNotOutToOut(jacobian).eval().norm(),
545 1);
546 2 }
547
548 {
549 // Find a joint such that the config parameters for the chain from the root
550 // joint to it are the n first parameters (i.e. q.segment(0, n)).
551 // We take the one which gives the longest block
552
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 JointPtr_t parent = device->rootJoint(),
553
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 current = device->getJointAtConfigRank(7);
554
3/4
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 1 times.
14 while (current->parentJoint()->index() == parent->index()) {
555 12 parent = current;
556
1/2
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
24 current = device->getJointAtConfigRank(current->rankInConfiguration() +
557
2/4
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
12 current->configSize());
558 }
559 // std::cout << parent->name() << std::endl;
560
561 ExplicitTransformationPtr_t et(new ExplicitTransformation(
562
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 parent, 7, 6, parent->rankInConfiguration() + parent->configSize() - 7,
563
5/10
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
4 parent->rankInVelocity() + parent->numberDof() - 6));
564
565
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 ExplicitConstraintSet expression(device->configSpace());
566 2 ExplicitPtr_t constraint;
567
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
8 constraint = Explicit::create(
568
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
4 device->configSpace(), et, et->inArg().indices(),
569
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
6 et->outArg().indices(), et->inDer().indices(), et->outDer().indices());
570
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(expression.add(constraint) >= 0);
571
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
2 BOOST_CHECK(expression.add(l2) >= 0);
572
573
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
2 matrix_t jacobian(device->numberDof(), device->numberDof());
574
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expression.jacobian(jacobian, qrand);
575 2 }
576 2 }
577
578
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(RelativePose) {
579 const std::string urdf(
580 "<robot name=\"two-freeflyers\">\n"
581 " <link name=\"base_link\">\n"
582 " </link>\n"
583
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 "</robot>");
584 // Make robot with two free flyers.
585
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 DevicePtr_t device(Device::create("two-freeflyers"));
586
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
2 hpp::pinocchio::urdf::loadModelFromString(device, 0, "1", "freeflyer", urdf,
587 "");
588
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
2 hpp::pinocchio::urdf::loadModelFromString(device, 0, "2", "freeflyer", urdf,
589 "");
590
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 assert(device->configSize() == 14);
591
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 assert(device->numberDof() == 12);
592 // Set joint bounds
593
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 hpp::pinocchio::JointPtr_t joint1(device->jointAt(0));
594
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 hpp::pinocchio::JointPtr_t joint2(device->jointAt(1));
595
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 vector_t low(device->configSize());
596
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 low.fill(-1);
597
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 vector_t up(device->configSize());
598
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 up.fill(1);
599
600
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 hpp::constraints::Transform3s frame1(pinocchio::SE3::Random());
601
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 hpp::constraints::Transform3s frame2(pinocchio::SE3::Random());
602 // explicit relative pose
603 hpp::constraints::ExplicitPtr_t constraint(
604
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
4 hpp::constraints::explicit_::RelativePose::create(
605 "explicit-relative-pose", device, joint1, joint2, frame1, frame2,
606
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
6 6 * Equality, std::vector<bool>(6, true)));
607
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
2 assert(constraint->inputConf().size() == 1);
608
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
2 assert(constraint->inputConf()[0].first == 0);
609
1/2
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
2 assert(constraint->inputConf()[0].second == 7);
610
611
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_type k = 0; k < 100; ++k) {
612 // Pick a random configuration
613
1/2
✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
200 vector_t q_rand(pinocchio::randomConfiguration(device->model(), low, up));
614
2/2
✓ Branch 0 taken 6400 times.
✓ Branch 1 taken 100 times.
13000 for (size_type i = 0; i < 64; ++i) {
615
1/2
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
12800 vector_t q(q_rand);
616 12800 size_type m = 1;
617
1/2
✓ Branch 2 taken 6400 times.
✗ Branch 3 not taken.
12800 hpp::constraints::ComparisonTypes_t comp(6 * EqualToZero);
618
2/2
✓ Branch 0 taken 38400 times.
✓ Branch 1 taken 6400 times.
89600 for (size_type j = 0; j < 6; ++j) {
619 // m = 2^(j+1)
620
2/2
✓ Branch 0 taken 19200 times.
✓ Branch 1 taken 19200 times.
76800 if ((m & i) == 0) {
621 38400 comp[j] = Equality;
622 } else {
623 38400 comp[j] = EqualToZero;
624 }
625 76800 m *= 2;
626 }
627
1/2
✓ Branch 2 taken 6400 times.
✗ Branch 3 not taken.
12800 constraint->comparisonType(comp);
628
1/2
✓ Branch 3 taken 6400 times.
✗ Branch 4 not taken.
12800 hpp::constraints::ExplicitConstraintSet ecs(device->configSpace());
629
1/2
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
12800 size_type res(ecs.add(constraint));
630
6/12
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 6400 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 6400 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 6400 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 6400 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 6400 times.
12800 BOOST_CHECK(res != -1);
631 // Initialize right hand side with initial value of q -> rhs0_impl
632
1/2
✓ Branch 4 taken 6400 times.
✗ Branch 5 not taken.
12800 LiegroupElement rhs0_impl(constraint->function().outputSpace());
633
2/4
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6400 times.
✗ Branch 5 not taken.
12800 rhs0_impl.vector() = ecs.rightHandSideFromInput(q);
634
635 // Solve constraint
636
2/4
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6400 times.
✗ Branch 5 not taken.
12800 ecs.solve(q);
637 // Get value of function h for new value of q -> rhs2_impl
638
1/2
✓ Branch 4 taken 6400 times.
✗ Branch 5 not taken.
12800 LiegroupElement rhs2_impl(constraint->function().outputSpace());
639
3/6
✓ Branch 3 taken 6400 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 6400 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 6400 times.
✗ Branch 10 not taken.
12800 constraint->function().value(rhs2_impl, q);
640
1/2
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
12800 vector_t logRhs0_impl = log(rhs0_impl);
641
1/2
✓ Branch 1 taken 6400 times.
✗ Branch 2 not taken.
12800 vector_t logRhs2_impl = log(rhs2_impl);
642
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6400 times.
12800 assert(logRhs0_impl.size() == 6);
643
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6400 times.
12800 assert(logRhs2_impl.size() == 6);
644 // For each coordinate check that
645 // rhs2_impl [j] == 0 if comp[i] is EqualToZero
646 // rhs2_impl [j] == rhs0_impl [j] if comp[i] is Equality
647
2/2
✓ Branch 0 taken 38400 times.
✓ Branch 1 taken 6400 times.
89600 for (size_type j = 0; j < 6; ++j) {
648
14/26
✓ Branch 1 taken 38400 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 38400 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 38400 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 19200 times.
✓ Branch 15 taken 19200 times.
✓ Branch 17 taken 19200 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 19200 times.
✓ Branch 22 taken 19200 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 19200 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 19200 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 19200 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 38400 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 38400 times.
✗ Branch 37 not taken.
✗ Branch 41 not taken.
✓ Branch 42 taken 38400 times.
76800 BOOST_CHECK(
649 ((comp[j] == EqualToZero) && (fabs(logRhs2_impl[j]) < 1e-10)) ||
650 ((comp[j] == Equality) &&
651 (fabs(logRhs2_impl[j] - logRhs0_impl[j]) < 1e-10)));
652 }
653 12800 }
654 200 }
655 2 }
656