GCC Code Coverage Report


Directory: ./
File: tests/solver-by-substitution.cc
Date: 2025-05-05 12:19:30
Exec Total Coverage
Lines: 694 696 99.7%
Branches: 2255 4536 49.7%

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 SOLVER_BY_SUBSTITUTION
30 #include <../tests/util.hh>
31 #include <Eigen/Geometry>
32 #include <boost/test/unit_test.hpp>
33 #include <hpp/constraints/affine-function.hh>
34 #include <hpp/constraints/explicit/relative-pose.hh>
35 #include <hpp/constraints/generic-transformation.hh>
36 #include <hpp/constraints/solver/by-substitution.hh>
37 #include <hpp/pinocchio/configuration.hh>
38 #include <hpp/pinocchio/device.hh>
39 #include <hpp/pinocchio/joint.hh>
40 #include <hpp/pinocchio/liegroup-element.hh>
41 #include <hpp/pinocchio/serialization.hh>
42 #include <hpp/pinocchio/simple-device.hh>
43 #include <pinocchio/algorithm/joint-configuration.hpp>
44 #include <sstream>
45
46 using hpp::constraints::AffineFunction;
47 using hpp::constraints::AffineFunctionPtr_t;
48 using hpp::constraints::ComparisonTypes_t;
49 using hpp::constraints::Configuration_t;
50 using hpp::constraints::ConstantFunction;
51 using hpp::constraints::ConstantFunctionPtr_t;
52 using hpp::constraints::DevicePtr_t;
53 using hpp::constraints::DifferentiableFunction;
54 using hpp::constraints::DifferentiableFunctionPtr_t;
55 using hpp::constraints::Equality;
56 using hpp::constraints::EqualToZero;
57 using hpp::constraints::Explicit;
58 using hpp::constraints::ExplicitConstraintSet;
59 using hpp::constraints::ExplicitPtr_t;
60 using hpp::constraints::Implicit;
61 using hpp::constraints::ImplicitPtr_t;
62 using hpp::constraints::JointPtr_t;
63 using hpp::constraints::LiegroupElement;
64 using hpp::constraints::LiegroupElementRef;
65 using hpp::constraints::LiegroupSpace;
66 using hpp::constraints::LockedJoint;
67 using hpp::constraints::matrix3_t;
68 using hpp::constraints::matrix_t;
69 using hpp::constraints::matrixOut_t;
70 using hpp::constraints::Orientation;
71 using hpp::constraints::RelativeTransformation;
72 using hpp::constraints::RelativeTransformationPtr_t;
73 using hpp::constraints::segment_t;
74 using hpp::constraints::segments_t;
75 using hpp::constraints::size_type;
76 using hpp::constraints::Transform3s;
77 using hpp::constraints::Transformation;
78 using hpp::constraints::value_type;
79 using hpp::constraints::vector3_t;
80 using hpp::constraints::vector_t;
81 using hpp::constraints::vectorIn_t;
82 using hpp::constraints::vectorOut_t;
83 using hpp::constraints::solver::BySubstitution;
84 using hpp::constraints::solver::lineSearch::Backtracking;
85 using hpp::constraints::solver::lineSearch::Constant;
86 using hpp::constraints::solver::lineSearch::ErrorNormBased;
87 using hpp::constraints::solver::lineSearch::FixedSequence;
88 using hpp::pinocchio::displayConfig;
89 using hpp::pinocchio::JACOBIAN;
90 using hpp::pinocchio::JOINT_POSITION;
91 using hpp::pinocchio::unittest::HumanoidRomeo;
92 using hpp::pinocchio::unittest::HumanoidSimple;
93 using hpp::pinocchio::unittest::makeDevice;
94 using hpp::pinocchio::unittest::ManipulatorArm2;
95
96 namespace saturation = hpp::constraints::solver::saturation;
97
98 1016 matrix_t randomPositiveDefiniteMatrix(int N) {
99
1/2
✓ Branch 2 taken 1016 times.
✗ Branch 3 not taken.
1016 matrix_t A(matrix_t::Random(N, N));
100
9/18
✓ Branch 1 taken 1016 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1016 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1016 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1016 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1016 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1016 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1016 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1016 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1016 times.
1016 BOOST_REQUIRE((A.array() < 1).all());
101
9/18
✓ Branch 1 taken 1016 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1016 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1016 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1016 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1016 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1016 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1016 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1016 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1016 times.
1016 BOOST_REQUIRE((A.array() > -1).all());
102
103
4/8
✓ Branch 1 taken 1016 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1016 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1016 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1016 times.
✗ Branch 11 not taken.
1016 A = (A + A.transpose()) / 2;
104
3/6
✓ Branch 1 taken 1016 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1016 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1016 times.
✗ Branch 8 not taken.
1016 A += N * matrix_t::Identity(N, N);
105
1/2
✓ Branch 1 taken 1016 times.
✗ Branch 2 not taken.
1016 A /= N;
106 1016 return A;
107 }
108
109 const value_type test_precision = 1e-5;
110
111 // x y z
112 template <int N1, int N2, int N3>
113 4 void test_quadratic() {
114 4 const int N = N1 + N2 + N3;
115
116 // (x y z) A (x y z)
117
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t A(randomPositiveDefiniteMatrix(N));
118
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 Quadratic::Ptr_t quad(new Quadratic(A));
119
120 // y = B * z
121
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t B(matrix_t::Random(N2, N3));
122 4 const int Ninf = std::min(N2, N3);
123
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 B.topLeftCorner(Ninf, Ninf) = randomPositiveDefiniteMatrix(Ninf);
124 4 segments_t in;
125
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 in.push_back(segment_t(N1 + N2, N3));
126 4 segments_t out;
127
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 out.push_back(segment_t(N1, N2));
128
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.
8 AffineFunctionPtr_t affine(AffineFunction::create(B));
129
1/2
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
12 ExplicitPtr_t expl(
130
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
8 Explicit::create(LiegroupSpace::Rn(N), affine, in, out, in, out));
131
132 // Make solver
133
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 BySubstitution solver(LiegroupSpace::Rn(N));
134 4 solver.maxIterations(20);
135 4 solver.errorThreshold(test_precision);
136
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 solver.saturation(hpp::make_shared<saturation::Bounds>(-vector_t::Ones(N),
137 vector_t::Ones(N)));
138
139
3/6
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 solver.add(Implicit::create(quad, ComparisonTypes_t(1, EqualToZero)));
140
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 solver.add(expl);
141
142
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t M(N, N1 + N3);
143
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
4 M << matrix_t::Identity(N1, N1), matrix_t::Zero(N1, N3),
144
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
4 matrix_t::Zero(N2, N1), B, matrix_t::Zero(N3, N1),
145 matrix_t::Identity(N3, N3);
146
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 matrix_t Ar(M.transpose() * A * M);
147
148
7/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
4 BOOST_CHECK_EQUAL(Ar.fullPivLu().rank(), N1 + N3);
149
150
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 vector_t x(N);
151
152
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setZero();
153
8/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
4 BOOST_CHECK(solver.isSatisfied(x));
154
155
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setRandom();
156
13/26
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
4 SOLVER_CHECK_SOLVE(solver.solve<Backtracking>(x), SUCCESS);
157 // EIGEN_VECTOR_IS_APPROX (x, vector_t::Zero(N));
158
19/38
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
4 EIGEN_VECTOR_IS_APPROX(x.segment<N2>(N1), B * x.tail<N3>());
159
9/18
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
4 BOOST_CHECK_SMALL(value_type(x.transpose() * A * x), test_precision);
160
161
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t expectedJ(1, N1 + N3), J(1, N1 + N3);
162
163
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setRandom();
164
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
4 solver.explicitConstraintSet().solve(x);
165
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 expectedJ =
166
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 2 *
167
3/6
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
8 solver.explicitConstraintSet().notOutArgs().rview(x).eval().transpose() *
168 Ar;
169
170
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 solver.computeValue<true>(x);
171
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 solver.updateJacobian(x);
172
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 solver.getReducedJacobian(J);
173
174
11/22
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
4 EIGEN_IS_APPROX(expectedJ, J);
175 4 }
176
177 // w x y z
178 template <int N1, int N2, int N4, int N3>
179 4 void test_quadratic2() {
180 4 const int N = N1 + N2 + N3 + N4;
181
182 // (w x y z) A (w x y z)
183
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t A(randomPositiveDefiniteMatrix(N));
184
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 Quadratic::Ptr_t quad(new Quadratic(A));
185
186 // x = B * y
187
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t B(matrix_t::Random(N2, N3));
188 4 const int Ninf = std::min(N2, N3);
189
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 B.topLeftCorner(Ninf, Ninf) = randomPositiveDefiniteMatrix(Ninf);
190 4 segments_t in1;
191
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 in1.push_back(segment_t(N1 + N2, N3));
192 4 segments_t out1;
193
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 out1.push_back(segment_t(N1, N2));
194
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.
8 AffineFunctionPtr_t affine1(AffineFunction::create(B));
195
1/2
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
12 ExplicitPtr_t expl1(
196
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
8 Explicit::create(LiegroupSpace::Rn(N), affine1, in1, out1, in1, out1));
197
198 // y = C * z
199
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t C(matrix_t::Random(N3, N4));
200 4 const int Ninf2 = std::min(N3, N4);
201
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 C.topLeftCorner(Ninf2, Ninf2) = randomPositiveDefiniteMatrix(Ninf2);
202 4 segments_t in2;
203
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 in2.push_back(segment_t(N1 + N2 + N3, N4));
204 4 segments_t out2;
205
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 out2.push_back(segment_t(N1 + N2, N3));
206
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.
8 AffineFunctionPtr_t affine2(AffineFunction::create(C));
207
1/2
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
12 ExplicitPtr_t expl2(
208
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
8 Explicit::create(LiegroupSpace::Rn(N), affine2, in2, out2, in2, out2));
209
210 // Make solver
211
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 BySubstitution solver(LiegroupSpace::Rn(N));
212 4 solver.maxIterations(20);
213 4 solver.errorThreshold(test_precision);
214
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 solver.saturation(hpp::make_shared<saturation::Bounds>(-vector_t::Ones(N),
215 vector_t::Ones(N)));
216
217
3/6
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 solver.add(Implicit::create(quad, ComparisonTypes_t(1, EqualToZero)));
218
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 solver.add(expl1);
219
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 solver.add(expl2);
220
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 solver.explicitConstraintSetHasChanged();
221
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4 assert(solver.contains(expl1));
222
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4 assert(solver.contains(expl2));
223
224
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t M(N, N1 + N4);
225
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
4 M << matrix_t::Identity(N1, N1), matrix_t::Zero(N1, N4),
226
7/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
4 matrix_t::Zero(N2, N1), B * C, matrix_t::Zero(N3, N1), C,
227
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t::Zero(N4, N1), matrix_t::Identity(N4, N4);
228
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 matrix_t Ar(M.transpose() * A * M);
229
230
7/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
4 BOOST_CHECK_EQUAL(Ar.fullPivLu().rank(), N1 + N4);
231
232
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 vector_t x(N);
233
234
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setZero();
235
8/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
4 BOOST_CHECK(solver.isSatisfied(x));
236
237
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setRandom();
238
13/26
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
4 SOLVER_CHECK_SOLVE(solver.solve<Backtracking>(x), SUCCESS);
239 // SOLVER_CHECK_SOLVE (solver.solve<lineSearch::Constant>(x), SUCCESS);
240 // EIGEN_VECTOR_IS_APPROX (x, vector_t::Zero(N));
241
19/38
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
4 EIGEN_VECTOR_IS_APPROX(x.segment<N2>(N1), B * x.segment<N3>(N1 + N2));
242
19/38
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
4 EIGEN_VECTOR_IS_APPROX(x.segment<N3>(N1 + N2),
243 C * x.segment<N4>(N1 + N2 + N3));
244
9/18
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
4 BOOST_CHECK_SMALL(value_type(x.transpose() * A * x), test_precision);
245
246
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t expectedJ(1, N1 + N4), J(1, N1 + N4);
247
248
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setRandom();
249
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
4 solver.explicitConstraintSet().solve(x);
250
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 expectedJ =
251
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 2 *
252
3/6
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
8 solver.explicitConstraintSet().notOutArgs().rview(x).eval().transpose() *
253 Ar;
254
255
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 solver.computeValue<true>(x);
256
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 solver.updateJacobian(x);
257
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 solver.getReducedJacobian(J);
258
259
11/22
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
4 EIGEN_IS_APPROX(expectedJ, J);
260 4 }
261
262 // w x y z
263 template <int N1, int N2, int N4, int N3>
264 4 void test_quadratic3() {
265 4 const int N = N1 + N2 + N3 + N4;
266
267 // x = B * (y z)
268
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t B(matrix_t::Random(N2, N3 + N4));
269 4 const int Ninf = std::min(N2, N3 + N4);
270
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 B.topLeftCorner(Ninf, Ninf) = randomPositiveDefiniteMatrix(Ninf);
271 4 segments_t in1;
272
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 in1.push_back(segment_t(N1 + N2, N3 + N4));
273 4 segments_t out1;
274
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 out1.push_back(segment_t(N1, N2));
275
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.
8 AffineFunctionPtr_t affine1(AffineFunction::create(B));
276
1/2
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
12 ExplicitPtr_t expl1(
277
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
8 Explicit::create(LiegroupSpace::Rn(N), affine1, in1, out1, in1, out1));
278
279 // y = C * z
280
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t C(matrix_t::Random(N3, N4));
281 4 const int Ninf2 = std::min(N3, N4);
282
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 C.topLeftCorner(Ninf2, Ninf2) = randomPositiveDefiniteMatrix(Ninf2);
283 4 segments_t in2;
284
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 in2.push_back(segment_t(N1 + N2 + N3, N4));
285 4 segments_t out2;
286
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 out2.push_back(segment_t(N1 + N2, N3));
287
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.
8 AffineFunctionPtr_t affine2(AffineFunction::create(C));
288
1/2
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
12 ExplicitPtr_t expl2(
289
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
8 Explicit::create(LiegroupSpace::Rn(N), affine2, in2, out2, in2, out2));
290
291 // z[0] = d
292
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 vector_t d(vector_t::Random(1));
293 4 segments_t in3;
294 4 segments_t out3;
295
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 out3.push_back(segment_t(N1 + N2 + N3, 1));
296
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
4 ConstantFunctionPtr_t constant3(ConstantFunction::create(d, 0, 0));
297
1/2
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
12 ExplicitPtr_t expl3(
298
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
8 Explicit::create(LiegroupSpace::Rn(N), constant3, in3, out3, in3, out3));
299
300 // (w x y z) A (w x y z)
301
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t A(randomPositiveDefiniteMatrix(N));
302
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 Quadratic::Ptr_t quad(new Quadratic(A, -d[0]));
303
304 // Make solver
305
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 BySubstitution solver(LiegroupSpace::Rn(N));
306 4 solver.maxIterations(20);
307 4 solver.errorThreshold(test_precision);
308
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 solver.saturation(hpp::make_shared<saturation::Bounds>(-vector_t::Ones(N),
309 vector_t::Ones(N)));
310
311
3/6
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 solver.add(Implicit::create(quad, ComparisonTypes_t(1, Equality)));
312
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 solver.add(expl1);
313
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 solver.add(expl2);
314
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
4 solver.add(expl3);
315
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 BySubstitution copySolver(solver);
316
317
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t M(N, N1 + N4);
318
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
4 M << matrix_t::Identity(N1, N1), matrix_t::Zero(N1, N4),
319
7/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
4 matrix_t::Zero(N2, N1), B.leftCols(N3) * C + B.rightCols(N4),
320
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
4 matrix_t::Zero(N3, N1), C, matrix_t::Zero(N4, N1),
321 matrix_t::Identity(N4, N4);
322
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 matrix_t P(N1 + N4, N1 + N4 - 1);
323
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
4 P << matrix_t::Identity(N1, N1), matrix_t::Zero(N1, N4 - 1),
324
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 matrix_t::Zero(1, N1 + N4 - 1), matrix_t::Zero(N4 - 1, N1),
325 matrix_t::Identity(N4 - 1, N4 - 1);
326
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 vector_t Xr_0(vector_t::Zero(N1 + N4));
327
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 Xr_0[N1] = d[0];
328
329
4/8
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
4 matrix_t Ar(M.transpose() * A * M);
330
331
7/14
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
4 BOOST_CHECK_EQUAL(Ar.fullPivLu().rank(), N1 + N4);
332
333
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 vector_t x(N);
334
335
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setRandom();
336
13/26
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
4 SOLVER_CHECK_SOLVE(copySolver.solve<Backtracking>(x), SUCCESS);
337 // SOLVER_CHECK_SOLVE (solver.solve<lineSearch::Constant>(x), SUCCESS);
338 // EIGEN_VECTOR_IS_APPROX (x, vector_t::Zero(N));
339
19/38
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
4 EIGEN_VECTOR_IS_APPROX(x.segment<N2>(N1), B * x.segment<N3 + N4>(N1 + N2));
340
19/38
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 64 not taken.
✓ Branch 65 taken 2 times.
4 EIGEN_VECTOR_IS_APPROX(x.segment<N3>(N1 + N2),
341 C * x.segment<N4>(N1 + N2 + N3));
342
10/20
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
4 BOOST_CHECK_SMALL(value_type(x.transpose() * A * x - d[0]), test_precision);
343
344
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 matrix_t expectedJ(1, N1 + N4 - 1), J(1, N1 + N4 - 1);
345
346
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 x.setRandom();
347
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
4 copySolver.explicitConstraintSet().solve(x);
348
5/10
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
8 expectedJ =
349
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 2 *
350
3/6
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
8 (P * copySolver.explicitConstraintSet().notOutArgs().rview(x).eval() +
351 Xr_0)
352 .transpose() *
353 Ar * P;
354
355
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 copySolver.computeValue<true>(x);
356
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 copySolver.updateJacobian(x);
357
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
4 copySolver.getReducedJacobian(J);
358
359
11/22
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
4 EIGEN_IS_APPROX(expectedJ, J);
360 4 }
361
362
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(quadratic) {
363 2 test_quadratic<3, 3, 3>();
364 2 test_quadratic<5, 3, 4>();
365
366 2 test_quadratic2<3, 3, 3, 3>();
367 2 test_quadratic2<3, 4, 2, 6>();
368
369 2 test_quadratic3<3, 3, 3, 3>();
370 2 test_quadratic3<1, 4, 2, 6>();
371 2 }
372
373 100 void se3ToConfig(const Transform3s& oMi, vectorOut_t v) {
374
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 100 times.
100 assert(v.size() == 7);
375
3/6
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
100 v.head<3>() = oMi.translation();
376
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
100 Eigen::Map<Transform3s::Quaternion> q(v.tail<4>().data());
377
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
100 q = oMi.rotation();
378 100 }
379
380 class Frame : public DifferentiableFunction {
381 public:
382 JointPtr_t joint_;
383
384 Frame(JointPtr_t joint)
385 : DifferentiableFunction(joint->robot()->configSize(),
386 joint->robot()->numberDof(),
387 LiegroupSpace::SE3(), "Frame"),
388 joint_(joint) {}
389
390 void impl_compute(LiegroupElementRef result, vectorIn_t arg) const {
391 hpp::pinocchio::DeviceSync robot(joint_->robot());
392 robot.currentConfiguration(arg);
393 robot.computeForwardKinematics(JOINT_POSITION);
394
395 const Transform3s& oMi = joint_->currentTransformation(robot.d());
396 se3ToConfig(oMi, result.vector());
397 }
398
399 void impl_jacobian(matrixOut_t J, vectorIn_t arg) const {
400 // finiteDifferenceCentral(J, arg, joint_->robot(), 1e-6);
401 hpp::pinocchio::DeviceSync robot(joint_->robot());
402 robot.currentConfiguration(arg);
403 robot.computeForwardKinematics(JOINT_POSITION | JACOBIAN);
404
405 J = joint_->jacobian(robot.d(), true);
406 }
407 };
408
409 219 matrix3_t exponential(const vector3_t& aa) {
410
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 matrix3_t R, xCross;
411
1/2
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
219 xCross.setZero();
412
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 xCross(1, 0) = +aa(2);
413
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 xCross(0, 1) = -aa(2);
414
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 xCross(2, 0) = -aa(1);
415
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 xCross(0, 2) = +aa(1);
416
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 xCross(2, 1) = +aa(0);
417
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 xCross(1, 2) = -aa(0);
418
1/2
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
219 R.setIdentity();
419
1/2
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
219 value_type theta = aa.norm();
420
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 219 times.
219 if (theta < 1e-6) {
421 R += xCross;
422 R += 0.5 * xCross.transpose() * xCross;
423 } else {
424
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 R += sin(theta) / theta * xCross;
425
3/6
✓ Branch 3 taken 219 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 219 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 219 times.
✗ Branch 10 not taken.
219 R += 2 * std::pow(sin(theta / 2), 2) / std::pow(theta, 2) * xCross * xCross;
426 }
427 438 return R;
428 }
429
430 // Pose of a joint in root joint frame
431 //
432 // This differentiable function returns as ouput an element of R3xSO3
433 // corresponding to the pose of a joint J in the root joint frame of a robot.
434 // The input is the vector of configuration variables that move the joint with
435 // respect to the root joint.
436 class ExplicitTransformation : public DifferentiableFunction {
437 public:
438 JointPtr_t joint_;
439 size_type in_, inDer_;
440 // log_{SO(3)} (rootJoint^{-1}.joint)
441 RelativeTransformationPtr_t rt_;
442
443 // Constructor
444 // joint: joint J the pose of which is computed with respect to root joint.
445 // [in:in+l] : interval of robot configuration variables that
446 // modify the position of J with respect to the root
447 // joint.
448 // [inDer:inDer+lDer]: interval of robot velocity variables that modify the
449 // position of J with respect to the root joint.
450 1 ExplicitTransformation(JointPtr_t joint, size_type in, size_type l,
451 size_type inDer, size_type lDer)
452
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 : DifferentiableFunction(l, lDer, LiegroupSpace::R3xSO3(),
453 "ExplicitTransformation"),
454 1 joint_(joint),
455 1 in_(in),
456
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
3 inDer_(inDer) {
457
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(),
458
1/2
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 joint_->robot()->rootJoint(), joint_,
459
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
3 Transform3s::Identity());
460 1 }
461
462 1 ExplicitConstraintSet::RowBlockIndices inArg() const {
463 1 ExplicitConstraintSet::RowBlockIndices ret;
464
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ret.addRow(in_, inputSize());
465 1 return ret;
466 }
467
468 1 ExplicitConstraintSet::RowBlockIndices outArg() const {
469 1 ExplicitConstraintSet::RowBlockIndices ret;
470
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ret.addRow(0, 7);
471 1 return ret;
472 }
473
474 108 ExplicitConstraintSet::ColBlockIndices inDer() const {
475 108 ExplicitConstraintSet::ColBlockIndices ret;
476
1/2
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
108 ret.addCol(inDer_, inputDerivativeSize());
477 108 return ret;
478 }
479
480 1 ExplicitConstraintSet::RowBlockIndices outDer() const {
481 1 ExplicitConstraintSet::RowBlockIndices ret;
482
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ret.addRow(0, 6);
483 1 return ret;
484 }
485 // Fill input variables with arg. Other variables are set to neutral
486 326 vector_t config(vectorIn_t arg) const {
487
1/2
✓ Branch 4 taken 326 times.
✗ Branch 5 not taken.
326 vector_t q = joint_->robot()->neutralConfiguration();
488
2/4
✓ Branch 2 taken 326 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 326 times.
✗ Branch 6 not taken.
326 q.segment(in_, inputSize()) = arg;
489 326 return q;
490 // joint_->robot()->currentConfiguration(q);
491 // joint_->robot()->computeForwardKinematics();
492 }
493
494 // Compute relative position of joint_ wrt root joint
495 // arg: vector of configuration variables that move joint_ in root joint.
496 // result: R3xSO3 element containing the result
497 219 void impl_compute(LiegroupElementRef result, vectorIn_t arg) const {
498 // forwardKinematics(arg);
499
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 LiegroupElement transform(LiegroupSpace::Rn(6));
500
2/4
✓ Branch 1 taken 219 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 219 times.
✗ Branch 5 not taken.
219 vector_t q = config(arg);
501
3/6
✓ Branch 2 taken 219 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 219 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 219 times.
✗ Branch 9 not taken.
219 rt_->value(transform, q);
502
3/6
✓ Branch 2 taken 219 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 219 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 219 times.
✗ Branch 10 not taken.
219 result.vector().head<3>() = transform.vector().head<3>();
503
1/2
✓ Branch 2 taken 219 times.
✗ Branch 3 not taken.
219 result.vector().tail<4>() =
504
4/8
✓ Branch 2 taken 219 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 219 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 219 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 219 times.
✗ Branch 12 not taken.
219 Eigen::Quaternion<value_type>(exponential(transform.vector().tail<3>()))
505
1/2
✓ Branch 2 taken 219 times.
✗ Branch 3 not taken.
438 .coeffs();
506
507 // Transform3s tf1 = joint_->robot()->rootJoint()->currentTransformation();
508 // Transform3s tf2 = joint_->currentTransformation();
509 // Transform3s tf = tf2.inverse() * tf1;
510
511 // result.head<3> = tf.translation();
512 // result.tail<4> = Eigen::Quaternion<value_type>(tf.rotation());
513 219 }
514
515 107 void impl_jacobian(matrixOut_t jacobian, vectorIn_t arg) const {
516 // forwardKinematics(arg);
517
1/2
✓ Branch 3 taken 107 times.
✗ Branch 4 not taken.
107 matrix_t J(6, rt_->inputDerivativeSize());
518
2/4
✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 107 times.
✗ Branch 5 not taken.
107 vector_t q = config(arg);
519
3/6
✓ Branch 2 taken 107 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 107 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 107 times.
✗ Branch 9 not taken.
107 rt_->jacobian(J, q);
520
521
3/6
✓ Branch 1 taken 107 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 107 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 107 times.
✗ Branch 8 not taken.
107 inDer().rview(J).writeTo(jacobian);
522 107 }
523 };
524
525 typedef hpp::shared_ptr<ExplicitTransformation> ExplicitTransformationPtr_t;
526
527
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(functions1) {
528
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 BySubstitution solver(LiegroupSpace::R3());
529
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 BySubstitution solver1(LiegroupSpace::R3());
530
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 BySubstitution solver2(LiegroupSpace::R3());
531
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 BySubstitution solver3(LiegroupSpace::R3());
532
533 /// System:
534 /// f (q1, q2) = 0
535 /// h ( q2) = 0
536 /// q1 = g(q3)
537 /// q2 = C
538
539 // f
540 ImplicitPtr_t impl(Implicit::create(
541
7/14
✓ Branch 3 taken 1 times.
✗ Branch 4 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.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
4 AffineFunction::create(matrix_t::Identity(2, 3)), 2 * EqualToZero));
542
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.add(impl);
543 // Test inclusion of manifolds
544
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 solver1.add(impl->copy());
545
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(solver.definesSubmanifoldOf(solver));
546
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(solver.definesSubmanifoldOf(solver1));
547
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(solver1.definesSubmanifoldOf(solver));
548
549 // q1 = g(q3)
550
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::Matrix<value_type, 1, 1> Jg;
551
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jg(0, 0) = 1;
552
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::RowBlockIndices inArg;
553
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 inArg.addRow(2, 1);
554
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::ColBlockIndices inDer;
555
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 inDer.addCol(2, 1);
556
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::RowBlockIndices outArg;
557
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 outArg.addRow(1, 1);
558 2 segments_t in;
559
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 in.push_back(segment_t(2, 1));
560 2 segments_t out;
561
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 out.push_back(segment_t(0, 1));
562
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.
4 AffineFunctionPtr_t affine(AffineFunction::create(matrix_t::Ones(1, 1)));
563 ExplicitPtr_t expl(
564
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
4 Explicit::create(LiegroupSpace::R3(), affine, in, out, in, out));
565
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 solver.add(expl);
566 // Test inclusion of manifolds
567
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(solver.definesSubmanifoldOf(solver1));
568
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 solver1.add(expl->copy());
569 // q2 = C
570
6/12
✓ 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.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
2 affine = AffineFunction::create(matrix_t(1, 0), vector_t::Zero(1));
571 2 in.clear();
572 2 out.clear();
573
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 out.push_back(segment_t(1, 1));
574
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 expl = Explicit::create(LiegroupSpace::R3(), affine, in, out, in, out);
575
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 solver.add(expl);
576
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(solver.reducedDimension(), 2);
577
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(solver.definesSubmanifoldOf(solver1));
578
579 // h
580
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 matrix_t h(1, 3);
581
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 h << 0, 1, 0;
582
5/10
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 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.
6 solver.add(Implicit::create(AffineFunction::create(h),
583
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 ComparisonTypes_t(1, EqualToZero)));
584
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(solver.dimension(), 3);
585
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(solver.reducedDimension(), 2);
586
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(solver.definesSubmanifoldOf(solver1));
587
588
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 segments_t impDof{segment_t(2, 1)};
589
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(solver.implicitDof(), impDof);
590 2 }
591
592
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(functions2) {
593
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 BySubstitution solver(LiegroupSpace::R3());
594
595 /// System:
596 /// f (q1, q3) = 0
597 /// q2 = g(q3)
598
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::Matrix<value_type, 2, 3> Jf;
599
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 Jf << 1, 0, 0, 0, 0, 1;
600
7/14
✓ Branch 3 taken 1 times.
✗ Branch 4 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 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
2 solver.add(Implicit::create(AffineFunction::create(Jf), 2 * EqualToZero));
601
602
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::Matrix<value_type, 1, 1> Jg;
603
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jg(0, 0) = 1;
604
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::RowBlockIndices inArg;
605
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 inArg.addRow(2, 1);
606
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::ColBlockIndices inDer;
607
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 inDer.addCol(2, 1);
608
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::RowBlockIndices outArg;
609
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 outArg.addRow(1, 1);
610 ExplicitPtr_t expl(Explicit::create(
611
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.
8 LiegroupSpace::R3(), AffineFunction::create(Jg), inArg.indices(),
612
5/10
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 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.
10 outArg.indices(), inDer.indices(), outArg.indices()));
613 2 ImplicitPtr_t c1(expl);
614
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 solver.add(expl);
615
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(solver.dimension(), 2);
616
617 // We add to the system h(q3) = 0
618 /// f (q1, q3) = 0
619 /// h ( q3) = 0
620 /// q2 = g(q3)
621 // This function should not be removed from the system.
622
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::Matrix<value_type, 1, 3> Jh;
623
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 Jh << 0, 0, 1;
624
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.
4 ImplicitPtr_t impl(Implicit::create(AffineFunction::create(Jh),
625
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
8 ComparisonTypes_t(1, EqualToZero)));
626 2 ImplicitPtr_t c2(impl);
627
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 c2->comparisonType(ComparisonTypes_t(1, Equality));
628
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.add(impl);
629
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(solver.dimension(), 3);
630
631 // We add to the system q3 = C
632 // Function h should be removed, f should not.
633
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t C(1);
634
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 C(0) = 0;
635 2 segments_t out;
636
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 out.push_back(segment_t(2, 1));
637
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
8 expl = Explicit::create(LiegroupSpace::R3(),
638
5/10
✓ 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.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
4 AffineFunction::create(matrix_t(1, 0), C),
639 6 segments_t(), out, segments_t(), out);
640 2 ImplicitPtr_t c3(expl);
641
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 c3->comparisonType(ComparisonTypes_t(1, Equality));
642
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 solver.add(expl);
643
644
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(solver.dimension(), 3);
645
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(solver.reducedDimension(), 2);
646
647
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 segments_t impDof = {segment_t(0, 1)};
648
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(solver.implicitDof(), impDof);
649 // test right hand side access by functions.
650
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.
2 vector_t rhs1(vector_t::Zero(c1->rightHandSideSize()));
651
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.
2 vector_t rhs2(vector_t::Random(c2->rightHandSideSize()));
652
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.
2 vector_t rhs3(vector_t::Random(c3->rightHandSideSize()));
653
654
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver.rightHandSide(c1, rhs1));
655
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver.rightHandSide(c2, rhs2));
656
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver.rightHandSide(c3, rhs3));
657
658
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 vector_t tmp1(c1->rightHandSideSize());
659
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 tmp1.fill(sqrt(-1));
660
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 vector_t tmp2(c2->rightHandSideSize());
661
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 tmp2.fill(sqrt(-1));
662
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 vector_t tmp3(c3->rightHandSideSize());
663
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 tmp3.fill(sqrt(-1));
664
665
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(solver.getRightHandSide(c1, tmp1));
666
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(solver.getRightHandSide(c2, tmp2));
667
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(solver.getRightHandSide(c3, tmp3));
668
669
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(tmp1 == rhs1);
670
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(tmp2 == rhs2);
671
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(tmp3 == rhs3);
672 2 }
673
674
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(hybrid_solver) {
675
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));
676
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);
677
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 12 taken 1 times.
✗ Branch 13 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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK_EQUAL(device->rootJoint()->positionInParentFrame(),
678 Transform3s::Identity());
679
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);
680
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);
681
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);
682
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);
683
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);
684
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);
685
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("rleg6_joint"),
686
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee2 = device->getJointByName("lleg6_joint"),
687
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee3 = device->getJointByName("larm6_joint");
688
689
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 Configuration_t q0 = device->neutralConfiguration();
690
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 device->currentConfiguration(q0);
691
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 device->computeForwardKinematics(JOINT_POSITION);
692
693
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 JointPtr_t lleg6Joint(device->getJointByName("lleg6_joint"));
694
6/12
✓ 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 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
2 BOOST_CHECK_EQUAL(lleg6Joint->rankInConfiguration(), 12);
695
6/12
✓ 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 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
2 BOOST_CHECK_EQUAL(lleg6Joint->rankInVelocity(), 11);
696
6/12
✓ 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 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
2 BOOST_CHECK_EQUAL(lleg6Joint->configSize(), 1);
697
6/12
✓ 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 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
2 BOOST_CHECK_EQUAL(lleg6Joint->numberDof(), 1);
698 // Compute a configuration that satisfies the constaints.
699 // Compute relative position of "lleg6_joint" wrt root
700
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s Mlleg6(lleg6Joint->currentTransformation());
701
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 Transform3s Mroot(device->rootJoint()->currentTransformation());
702
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Transform3s M(Mroot.inverse() * Mlleg6);
703
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 q0.segment<3>(0) = M.translation();
704
4/8
✓ 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.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
2 q0.segment<4>(3) = Eigen::Quaternion<value_type>(M.rotation()).coeffs();
705
706
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver(device->configSpace());
707 2 solver.maxIterations(40);
708 2 solver.errorThreshold(1e-4);
709
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.saturation(hpp::make_shared<saturation::Device>(device));
710
711
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 device->currentConfiguration(q0);
712
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 device->computeForwardKinematics(JOINT_POSITION);
713
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s tf1(ee1->currentTransformation());
714
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s tf2(ee2->currentTransformation());
715
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s tf3(ee3->currentTransformation());
716
717
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.
8 solver.add(Implicit::create(
718
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
4 Orientation::create("Orientation lleg6_joint", device, ee2, tf2),
719 4 3 * EqualToZero));
720
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.
8 solver.add(Implicit::create(
721
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
4 Orientation::create("Orientation larm6_joint", device, ee3, tf3),
722 4 3 * EqualToZero));
723
724
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(solver.numberStacks() == 1);
725
726 2 ExplicitTransformationPtr_t et;
727 {
728
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.
2 et.reset(new ExplicitTransformation(lleg6Joint, 7, 6, 6, 6));
729 }
730 // Add an explicit constraint that computes the pose of the root joint (FF)
731 // output variables are [0:7] for configurations and [0:6] for velocities
732 // output value is equal to relative pose of "lleg6_joint" with respect to
733 // the root joint.
734
16/32
✓ 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 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 36 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 42 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✗ Branch 70 not taken.
✓ Branch 71 taken 1 times.
2 BOOST_CHECK(solver.explicitConstraintSet().add(Explicit::create(
735 device->configSpace(), et, et->inArg().indices(),
736 et->outArg().indices(), et->inDer().indices(),
737 et->outDer().indices())) >= 0);
738
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.explicitConstraintSetHasChanged();
739
6/12
✓ 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 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
2 BOOST_TEST_MESSAGE(solver << '\n');
740
741
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver.isSatisfied(q0));
742
743
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.
2 vector_t v(vector_t::Random(device->numberDof()));
744
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v *= .1;
745
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Configuration_t qrand(q0);
746
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 LiegroupElement g(qrand, device->configSpace());
747
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 g += v;
748
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 qrand = g.vector();
749
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(solver.solve<Backtracking>(qrand), BySubstitution::SUCCESS);
750
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 qrand = g.vector();
751
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 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK_EQUAL(solver.solve<ErrorNormBased>(qrand),
752 BySubstitution::SUCCESS);
753
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 qrand = g.vector();
754
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 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK_EQUAL(solver.solve<FixedSequence>(qrand),
755 BySubstitution::SUCCESS);
756
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(solver.solve<Constant>(qrand), BySubstitution::SUCCESS);
757 2 }
758
759
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(by_substitution_serialization) {
760
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));
761
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);
762
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);
763
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);
764
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);
765
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);
766
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);
767
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);
768
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("rleg5_joint"),
769
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee2 = device->getJointByName("lleg5_joint"),
770
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee3 = device->getJointByName("larm5_joint");
771
772
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(),
773
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 qrand = ::pinocchio::randomConfiguration(device->model());
774
775
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver(device->configSpace());
776 2 solver.maxIterations(20);
777 2 solver.errorThreshold(1e-3);
778
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.saturation(hpp::make_shared<saturation::Device>(device));
779
780
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 device->currentConfiguration(q);
781
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 device->computeForwardKinematics(JOINT_POSITION);
782
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s tf1(ee1->currentTransformation());
783
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s tf2(ee2->currentTransformation());
784
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 Transform3s tf3(ee3->currentTransformation());
785
786
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.
8 solver.add(Implicit::create(
787
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
4 Orientation::create("Orientation RAnkleRoll", device, ee2, tf2),
788 4 3 * Equality));
789
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.
8 solver.add(Implicit::create(
790
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
4 Orientation::create("Orientation LWristPitch", device, ee3, tf3),
791 4 3 * Equality));
792
4/8
✓ 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.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 solver.add(LockedJoint::create(ee1, ee1->configurationSpace()->neutral()));
793
794
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
2 BOOST_CHECK(solver.numberStacks() == 1);
795
796
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::stringstream ss;
797 {
798
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 hpp::serialization::xml_oarchive oa(ss);
799
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 oa.insert(device->name(), device.get());
800
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 oa << boost::serialization::make_nvp("solver", solver);
801 2 }
802
803
6/12
✓ 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 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
2 BOOST_TEST_MESSAGE(ss.str());
804
805
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution r_solver(device->configSpace());
806 {
807
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 hpp::serialization::xml_iarchive ia(ss);
808
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 ia.insert(device->name(), device.get());
809
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 ia >> boost::serialization::make_nvp("solver", r_solver);
810 2 }
811
812
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 std::ostringstream ss_result, ss_expect;
813
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 ss_expect << solver << '\n';
814
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 ss_result << r_solver << '\n';
815
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 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK_EQUAL(ss_expect.str(), ss_result.str());
816 2 }
817
818
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(hybrid_solver_rhs) {
819 using namespace hpp::constraints;
820
821
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(HumanoidRomeo));
822
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);
823
824
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Configuration_t q, qrand;
825
826
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 JointPtr_t left = device->getJointByName("LWristPitch");
827 TransformationR3xSO3::Ptr_t frame(TransformationR3xSO3::create(
828
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.
4 "LWristPitch", device, left, Transform3s::Identity()));
829 Transformation::Ptr_t logFrame(Transformation::create(
830
4/8
✓ Branch 2 taken 1 times.
✗ Branch 3 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.
4 "LWristPitch", device, left, Transform3s::Identity()));
831
832 // Check the logFrame if the log6 of frame.
833
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 LiegroupElement valueFrame(frame->outputSpace()),
834
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 logValFrame(logFrame->outputSpace());
835
4/8
✓ 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.
2 matrix_t Jframe(6, device->numberDof()), JlogFrame(6, device->numberDof()),
836
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 expectedJlogFrame(6, device->numberDof());
837
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 LiegroupElement neutral = frame->outputSpace()->neutral();
838
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (int i = 0; i < 100; ++i) {
839
1/2
✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
200 q = ::pinocchio::randomConfiguration(device->model());
840
841
3/6
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 9 not taken.
200 frame->value(valueFrame, q);
842
3/6
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 9 not taken.
200 logFrame->value(logValFrame, q);
843
844
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 vector_t expectedLog = hpp::pinocchio::log(valueFrame);
845
846
13/26
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 100 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 100 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 100 times.
✗ Branch 30 not taken.
✓ Branch 33 taken 100 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 100 times.
✗ Branch 37 not taken.
✓ Branch 39 taken 100 times.
✗ Branch 40 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 100 times.
200 EIGEN_VECTOR_IS_APPROX(expectedLog, logValFrame.vector());
847
848
3/6
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 9 not taken.
200 frame->jacobian(Jframe, q);
849
3/6
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 9 not taken.
200 logFrame->jacobian(expectedJlogFrame, q);
850
851
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 JlogFrame = Jframe;
852
4/8
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 100 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
600 frame->outputSpace()->dDifference_dq1<hpp::pinocchio::DerivativeTimesInput>(
853 400 neutral.vector(), valueFrame.vector(), JlogFrame);
854
855
11/22
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 100 times.
200 EIGEN_IS_APPROX(expectedJlogFrame, JlogFrame);
856 200 }
857
858 // Check that the solver can handle constraints with R3xSO3 outputs.
859
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
4 ImplicitPtr_t constraint(Implicit::create(frame, 6 * Equality));
860
861
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver(device->configSpace());
862 2 solver.maxIterations(20);
863 2 solver.errorThreshold(1e-3);
864
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 solver.saturation(hpp::make_shared<saturation::Device>(device));
865
866
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.add(constraint);
867
868
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 20 not taken.
✓ Branch 21 taken 1 times.
2 BOOST_CHECK_EQUAL(solver.rightHandSideSize(), 7);
869
870
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (int i = 0; i < 100; ++i) {
871
1/2
✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
200 q = ::pinocchio::randomConfiguration(device->model()),
872
873
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 device->currentConfiguration(q);
874
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 device->computeForwardKinematics(JOINT_POSITION);
875
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 Transform3s tf_expected(left->currentTransformation());
876
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 vector_t rhs_expected(7), rhs(7);
877
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 se3ToConfig(tf_expected, rhs_expected);
878
879
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 solver.rightHandSideFromConfig(q);
880
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 rhs = solver.rightHandSide();
881
55/108
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 100 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 100 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 100 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 100 times.
✗ Branch 44 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 100 times.
✓ Branch 55 taken 100 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 100 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 100 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 100 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 100 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 100 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 100 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 66 times.
✓ Branch 76 taken 34 times.
✓ Branch 78 taken 66 times.
✗ Branch 79 not taken.
✓ Branch 82 taken 66 times.
✗ Branch 83 not taken.
✓ Branch 87 taken 66 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 66 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 66 times.
✗ Branch 94 not taken.
✓ Branch 96 taken 66 times.
✗ Branch 97 not taken.
✓ Branch 99 taken 66 times.
✗ Branch 100 not taken.
✓ Branch 102 taken 66 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 66 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 66 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 66 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 66 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 66 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 66 times.
✗ Branch 121 not taken.
✗ Branch 129 not taken.
✓ Branch 130 taken 66 times.
✓ Branch 132 taken 34 times.
✗ Branch 133 not taken.
✓ Branch 136 taken 34 times.
✗ Branch 137 not taken.
✓ Branch 141 taken 34 times.
✗ Branch 142 not taken.
✓ Branch 144 taken 34 times.
✗ Branch 145 not taken.
✓ Branch 147 taken 34 times.
✗ Branch 148 not taken.
✓ Branch 150 taken 34 times.
✗ Branch 151 not taken.
✓ Branch 153 taken 34 times.
✗ Branch 154 not taken.
✓ Branch 156 taken 34 times.
✗ Branch 157 not taken.
✓ Branch 159 taken 34 times.
✗ Branch 160 not taken.
✓ Branch 162 taken 34 times.
✗ Branch 163 not taken.
✓ Branch 165 taken 34 times.
✗ Branch 166 not taken.
✓ Branch 168 taken 34 times.
✗ Branch 169 not taken.
✓ Branch 171 taken 34 times.
✗ Branch 172 not taken.
✓ Branch 174 taken 34 times.
✗ Branch 175 not taken.
✓ Branch 177 taken 34 times.
✗ Branch 178 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 34 times.
200 SE3CONFIG_IS_APPROX(rhs_expected, rhs);
882
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 solver.getRightHandSide(constraint, rhs);
883
55/108
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 100 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 100 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 100 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 100 times.
✗ Branch 44 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 100 times.
✓ Branch 55 taken 100 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 100 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 100 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 100 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 100 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 100 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 100 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 66 times.
✓ Branch 76 taken 34 times.
✓ Branch 78 taken 66 times.
✗ Branch 79 not taken.
✓ Branch 82 taken 66 times.
✗ Branch 83 not taken.
✓ Branch 87 taken 66 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 66 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 66 times.
✗ Branch 94 not taken.
✓ Branch 96 taken 66 times.
✗ Branch 97 not taken.
✓ Branch 99 taken 66 times.
✗ Branch 100 not taken.
✓ Branch 102 taken 66 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 66 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 66 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 66 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 66 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 66 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 66 times.
✗ Branch 121 not taken.
✗ Branch 129 not taken.
✓ Branch 130 taken 66 times.
✓ Branch 132 taken 34 times.
✗ Branch 133 not taken.
✓ Branch 136 taken 34 times.
✗ Branch 137 not taken.
✓ Branch 141 taken 34 times.
✗ Branch 142 not taken.
✓ Branch 144 taken 34 times.
✗ Branch 145 not taken.
✓ Branch 147 taken 34 times.
✗ Branch 148 not taken.
✓ Branch 150 taken 34 times.
✗ Branch 151 not taken.
✓ Branch 153 taken 34 times.
✗ Branch 154 not taken.
✓ Branch 156 taken 34 times.
✗ Branch 157 not taken.
✓ Branch 159 taken 34 times.
✗ Branch 160 not taken.
✓ Branch 162 taken 34 times.
✗ Branch 163 not taken.
✓ Branch 165 taken 34 times.
✗ Branch 166 not taken.
✓ Branch 168 taken 34 times.
✗ Branch 169 not taken.
✓ Branch 171 taken 34 times.
✗ Branch 172 not taken.
✓ Branch 174 taken 34 times.
✗ Branch 175 not taken.
✓ Branch 177 taken 34 times.
✗ Branch 178 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 34 times.
200 SE3CONFIG_IS_APPROX(rhs_expected, rhs);
884
885
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 solver.rightHandSideFromConfig(constraint, q);
886
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 rhs = solver.rightHandSide();
887
55/108
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 100 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 100 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 100 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 100 times.
✗ Branch 44 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 100 times.
✓ Branch 55 taken 100 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 100 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 100 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 100 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 100 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 100 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 100 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 66 times.
✓ Branch 76 taken 34 times.
✓ Branch 78 taken 66 times.
✗ Branch 79 not taken.
✓ Branch 82 taken 66 times.
✗ Branch 83 not taken.
✓ Branch 87 taken 66 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 66 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 66 times.
✗ Branch 94 not taken.
✓ Branch 96 taken 66 times.
✗ Branch 97 not taken.
✓ Branch 99 taken 66 times.
✗ Branch 100 not taken.
✓ Branch 102 taken 66 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 66 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 66 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 66 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 66 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 66 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 66 times.
✗ Branch 121 not taken.
✗ Branch 129 not taken.
✓ Branch 130 taken 66 times.
✓ Branch 132 taken 34 times.
✗ Branch 133 not taken.
✓ Branch 136 taken 34 times.
✗ Branch 137 not taken.
✓ Branch 141 taken 34 times.
✗ Branch 142 not taken.
✓ Branch 144 taken 34 times.
✗ Branch 145 not taken.
✓ Branch 147 taken 34 times.
✗ Branch 148 not taken.
✓ Branch 150 taken 34 times.
✗ Branch 151 not taken.
✓ Branch 153 taken 34 times.
✗ Branch 154 not taken.
✓ Branch 156 taken 34 times.
✗ Branch 157 not taken.
✓ Branch 159 taken 34 times.
✗ Branch 160 not taken.
✓ Branch 162 taken 34 times.
✗ Branch 163 not taken.
✓ Branch 165 taken 34 times.
✗ Branch 166 not taken.
✓ Branch 168 taken 34 times.
✗ Branch 169 not taken.
✓ Branch 171 taken 34 times.
✗ Branch 172 not taken.
✓ Branch 174 taken 34 times.
✗ Branch 175 not taken.
✓ Branch 177 taken 34 times.
✗ Branch 178 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 34 times.
200 SE3CONFIG_IS_APPROX(rhs_expected, rhs);
888
889
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 solver.rightHandSide(rhs_expected);
890
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 rhs = solver.rightHandSide();
891
55/108
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 100 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 100 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 100 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 100 times.
✗ Branch 44 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 100 times.
✓ Branch 55 taken 100 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 100 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 100 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 100 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 100 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 100 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 100 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 66 times.
✓ Branch 76 taken 34 times.
✓ Branch 78 taken 66 times.
✗ Branch 79 not taken.
✓ Branch 82 taken 66 times.
✗ Branch 83 not taken.
✓ Branch 87 taken 66 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 66 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 66 times.
✗ Branch 94 not taken.
✓ Branch 96 taken 66 times.
✗ Branch 97 not taken.
✓ Branch 99 taken 66 times.
✗ Branch 100 not taken.
✓ Branch 102 taken 66 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 66 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 66 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 66 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 66 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 66 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 66 times.
✗ Branch 121 not taken.
✗ Branch 129 not taken.
✓ Branch 130 taken 66 times.
✓ Branch 132 taken 34 times.
✗ Branch 133 not taken.
✓ Branch 136 taken 34 times.
✗ Branch 137 not taken.
✓ Branch 141 taken 34 times.
✗ Branch 142 not taken.
✓ Branch 144 taken 34 times.
✗ Branch 145 not taken.
✓ Branch 147 taken 34 times.
✗ Branch 148 not taken.
✓ Branch 150 taken 34 times.
✗ Branch 151 not taken.
✓ Branch 153 taken 34 times.
✗ Branch 154 not taken.
✓ Branch 156 taken 34 times.
✗ Branch 157 not taken.
✓ Branch 159 taken 34 times.
✗ Branch 160 not taken.
✓ Branch 162 taken 34 times.
✗ Branch 163 not taken.
✓ Branch 165 taken 34 times.
✗ Branch 166 not taken.
✓ Branch 168 taken 34 times.
✗ Branch 169 not taken.
✓ Branch 171 taken 34 times.
✗ Branch 172 not taken.
✓ Branch 174 taken 34 times.
✗ Branch 175 not taken.
✓ Branch 177 taken 34 times.
✗ Branch 178 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 34 times.
200 SE3CONFIG_IS_APPROX(rhs_expected, rhs);
892
893
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 solver.rightHandSide(constraint, rhs_expected);
894
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 rhs = solver.rightHandSide();
895
38/108
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 100 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 100 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 100 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 100 times.
✗ Branch 44 not taken.
✗ Branch 52 not taken.
✓ Branch 53 taken 100 times.
✓ Branch 55 taken 100 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 100 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 100 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 100 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 100 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 100 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 100 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 100 times.
✗ Branch 76 not taken.
✓ Branch 78 taken 100 times.
✗ Branch 79 not taken.
✓ Branch 82 taken 100 times.
✗ Branch 83 not taken.
✓ Branch 87 taken 100 times.
✗ Branch 88 not taken.
✓ Branch 90 taken 100 times.
✗ Branch 91 not taken.
✓ Branch 93 taken 100 times.
✗ Branch 94 not taken.
✓ Branch 96 taken 100 times.
✗ Branch 97 not taken.
✓ Branch 99 taken 100 times.
✗ Branch 100 not taken.
✓ Branch 102 taken 100 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 100 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 100 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 100 times.
✗ Branch 112 not taken.
✓ Branch 114 taken 100 times.
✗ Branch 115 not taken.
✓ Branch 117 taken 100 times.
✗ Branch 118 not taken.
✓ Branch 120 taken 100 times.
✗ Branch 121 not taken.
✗ Branch 129 not taken.
✓ Branch 130 taken 100 times.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✗ Branch 145 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✗ Branch 153 not taken.
✗ Branch 154 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✗ Branch 162 not taken.
✗ Branch 163 not taken.
✗ Branch 165 not taken.
✗ Branch 166 not taken.
✗ Branch 168 not taken.
✗ Branch 169 not taken.
✗ Branch 171 not taken.
✗ Branch 172 not taken.
✗ Branch 174 not taken.
✗ Branch 175 not taken.
✗ Branch 177 not taken.
✗ Branch 178 not taken.
✗ Branch 186 not taken.
✗ Branch 187 not taken.
200 SE3CONFIG_IS_APPROX(rhs_expected, rhs);
896
897
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 100 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 100 times.
200 BOOST_CHECK_EQUAL(solver.solve<FixedSequence>(q), BySubstitution::SUCCESS);
898
899 BySubstitution::Status status;
900
1/2
✓ Branch 0 taken 137 times.
✗ Branch 1 not taken.
274 for (int j = 0; j < 100; ++j) {
901
1/2
✓ Branch 3 taken 137 times.
✗ Branch 4 not taken.
274 qrand = ::pinocchio::randomConfiguration(device->model());
902
3/6
✓ Branch 1 taken 137 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 137 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 137 times.
✗ Branch 8 not taken.
274 status = solver.solve<FixedSequence>(qrand);
903
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 37 times.
274 if (status == BySubstitution::SUCCESS) break;
904 }
905
5/10
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 100 times.
200 BOOST_CHECK_EQUAL(status, BySubstitution::SUCCESS);
906
907
1/2
✓ Branch 0 taken 100 times.
✗ Branch 1 not taken.
200 if (status == BySubstitution::SUCCESS) {
908
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 device->currentConfiguration(qrand);
909
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 device->computeForwardKinematics(JOINT_POSITION);
910
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 Transform3s tf_result(left->currentTransformation());
911
912
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 Transform3s id = tf_expected.actInv(tf_result);
913
12/24
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 100 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 100 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 100 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 100 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 100 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 100 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 100 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 100 times.
✗ Branch 35 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 100 times.
200 BOOST_CHECK_MESSAGE(id.isIdentity(1e-3), "Right hand side is different:\n"
914 << tf_result << '\n'
915 << tf_expected << '\n'
916 << id);
917 }
918 200 }
919 2 }
920
921
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(rightHandSide) {
922
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
2002 for (size_type i = 0; i < 1000; ++i) {
923 2000 size_type N(10);
924
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 matrix_t A(randomPositiveDefiniteMatrix((int)N));
925
3/6
✓ Branch 2 taken 1000 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1000 times.
✗ Branch 9 not taken.
4000 AffineFunctionPtr_t affine(AffineFunction::create(A));
926
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 vector_t b(vector_t::Random(N));
927
1/2
✓ Branch 2 taken 1000 times.
✗ Branch 3 not taken.
2000 ComparisonTypes_t comp(N, Equality);
928 2000 comp[1] = comp[3] = comp[5] = comp[6] = EqualToZero;
929
4/8
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1000 times.
✗ Branch 11 not taken.
2000 b[1] = b[3] = b[5] = b[6] = 0;
930
931
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 BySubstitution solver(LiegroupSpace::Rn(N));
932 2000 solver.maxIterations(20);
933 2000 solver.errorThreshold(test_precision);
934 // Create constraint with various comparison types
935
3/6
✓ Branch 2 taken 1000 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1000 times.
✗ Branch 7 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
4000 ImplicitPtr_t constraint(Implicit::create(affine, comp));
936
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 solver.add(constraint);
937
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 solver.rightHandSide(constraint, b);
938
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 vector_t b1(N);
939
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 solver.getRightHandSide(constraint, b1);
940
7/14
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1000 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1000 times.
2000 BOOST_CHECK(b == b1);
941 // Check resolution
942
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 vector_t x(vector_t::Random(N));
943
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 solver.solve(x);
944
3/6
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
2000 vector_t error(A * x - b);
945
14/28
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 10 taken 1000 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1000 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1000 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1000 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1000 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1000 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1000 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1000 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1000 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1000 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1000 times.
✗ Branch 41 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 1000 times.
2000 BOOST_CHECK_MESSAGE(error.norm() < test_precision,
946 "Error threshold exceeded. Error is "
947 << error.transpose() << ", norm " << error.norm()
948 << ". Precision is " << test_precision);
949 2000 }
950 2 }
951
952
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(rightHandSideFromConfig) {
953 // Create a kinematic chain
954
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 DevicePtr_t device = hpp::pinocchio::unittest::makeDevice(HumanoidSimple);
955
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 JointPtr_t root = device->rootJoint(),
956
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee1 = device->getJointByName("lleg5_joint"),
957
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");
958
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);
959
960
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.
4 ComparisonTypes_t comp1(EqualToZero << Equality << EqualToZero << Equality
961
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 << EqualToZero << Equality);
962
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp1[0] == EqualToZero);
963
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp1[2] == EqualToZero);
964
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp1[4] == EqualToZero);
965
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 ComparisonTypes_t comp2(2 * Equality << 2 * EqualToZero << 2 * Equality);
966
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp2[0] == Equality);
967
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp2[1] == Equality);
968
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp2[2] == EqualToZero);
969
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp2[3] == EqualToZero);
970
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp2[4] == Equality);
971
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
2 assert(comp2[5] == Equality);
972 // Create two relative transformation constraints
973
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf1(Transform3s::Identity());
974
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector3_t u;
975
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 u << 0, -.2, 0;
976
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2(Transform3s::Identity());
977
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.translation(u);
978
979 DifferentiableFunctionPtr_t h(
980
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
4 RelativeTransformation::create("RelativeTransformation", device, ee1, ee2,
981
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
6 tf1, tf2, std::vector<bool>(6, true)));
982
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 ImplicitPtr_t c1(Implicit::create(h, comp1));
983
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 u << 1.2, 0, -1;
984
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.translation(u);
985
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.
8 ImplicitPtr_t c2(hpp::constraints::explicit_::RelativePose::create(
986 4 "Transformation", device, JointPtr_t(), root, tf2, tf1, comp2,
987
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
6 std::vector<bool>(6, true)));
988
989
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver(device->configSpace());
990 2 solver.maxIterations(20);
991 2 solver.errorThreshold(test_precision);
992
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.add(c1);
993
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver.add(c2);
994 // 0
995 // rhs [1]
996 // f1 (q) = 0
997 // rhs [3]
998 // 0
999 // rhs [5]
1000 //
1001 // rhs [6]
1002 // 0
1003 // f2 (q) = 0
1004 // rhs [9]
1005 // rhs [10]
1006 // rhs [11]
1007 // rhs [12]
1008
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
2002 for (size_type i = 0; i < 1000; ++i) {
1009
1/2
✓ Branch 3 taken 1000 times.
✗ Branch 4 not taken.
2000 Configuration_t q = ::pinocchio::randomConfiguration(device->model());
1010 bool success;
1011 // Set right hand side for both constraints from random configuration
1012
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.rightHandSideFromConfig(c1, q);
1013
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1014
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.rightHandSideFromConfig(c2, q);
1015
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1016 // Store right hand side for each constraint
1017
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 vector_t rhs1(6);
1018
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 rhs1.setZero();
1019
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 vector_t rhs1_(6);
1020
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 rhs1_.setZero();
1021
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 vector_t rhs2(7);
1022
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 rhs2.setZero();
1023
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 vector_t rhs2_(7);
1024
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 rhs2_.setZero();
1025
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.getRightHandSide(c1, rhs1);
1026
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1027
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.getRightHandSide(c2, rhs2);
1028
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1029 // Set right hand side for both constraints from other random configuration
1030
1/2
✓ Branch 3 taken 1000 times.
✗ Branch 4 not taken.
2000 q = ::pinocchio::randomConfiguration(device->model());
1031
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.rightHandSideFromConfig(c1, q);
1032
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1033
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.rightHandSideFromConfig(c2, q);
1034
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1035 // Set right hand side from stored values
1036
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.rightHandSide(c1, rhs1);
1037
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1038
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.rightHandSide(c2, rhs2);
1039
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1040 // Get right hand side for each constraint and compare to stored values
1041
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.getRightHandSide(c1, rhs1_);
1042
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1043
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 success = solver.getRightHandSide(c2, rhs2_);
1044
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(success);
1045
8/16
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1000 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1000 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1000 times.
2000 BOOST_CHECK((rhs1 - rhs1_).norm() < 1e-10);
1046
8/16
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1000 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1000 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1000 times.
2000 BOOST_CHECK((rhs2 - rhs2_).norm() < 1e-10);
1047 2000 }
1048 2 }
1049
1050
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(merge) {
1051 // Create a kinematic chain
1052
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 DevicePtr_t device = hpp::pinocchio::unittest::makeDevice(HumanoidSimple);
1053
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 JointPtr_t root = device->rootJoint(),
1054
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 ee1 = device->getJointByName("lleg5_joint"),
1055
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");
1056
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);
1057
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
2 Configuration_t q(device->configSpace()->neutral().vector());
1058
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 ComparisonTypes_t comp1(6 * Equality);
1059 2 comp1[0] = comp1[2] = comp1[4] = EqualToZero;
1060
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 ComparisonTypes_t comp2(6 * Equality);
1061 2 comp2[1] = comp2[2] = EqualToZero;
1062 // Create two relative transformation constraints
1063
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf1(Transform3s::Identity());
1064
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector3_t u;
1065
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 u << 0, -.2, 0;
1066
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Transform3s tf2(Transform3s::Identity());
1067
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.translation(u);
1068
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
4 DifferentiableFunctionPtr_t h(RelativeTransformation::create(
1069 2 "RelativeTransformation", device, ee1, ee2, tf1, tf2));
1070
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 ImplicitPtr_t c1(Implicit::create(h, comp1));
1071
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 u << 1.2, 0, -1;
1072
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 tf2.translation(u);
1073 ImplicitPtr_t c2(
1074
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()));
1075
1076
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
8 ImplicitPtr_t c3(hpp::constraints::explicit_::RelativePose::create(
1077 6 "Transformation root", device, JointPtr_t(), root, tf2, tf1, comp2));
1078
1079
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver1(device->configSpace());
1080
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver2(device->configSpace());
1081 2 solver1.maxIterations(20);
1082 2 solver1.errorThreshold(test_precision);
1083
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 solver1.add(c1->copy());
1084
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 solver1.add(c2->copy());
1085
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 solver2.add(c1->copy());
1086
3/6
✓ 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.
2 solver2.add(c3->copy());
1087 // copy and merge solvers
1088
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 BySubstitution solver3(solver1);
1089
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 BySubstitution solver4(solver2);
1090
1091
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver3.merge(solver4);
1092
1093
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 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
2 BOOST_CHECK(solver3.numericalConstraints().size() == 3);
1094
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(solver3.contains(c1));
1095
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(solver3.contains(c2));
1096
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(solver3.contains(c3));
1097
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver3.rightHandSideFromConfig(c1, q));
1098
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver3.rightHandSideFromConfig(c2, q));
1099
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 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(solver3.rightHandSideFromConfig(c3, q));
1100
1101 // Check computation of errors by constraint
1102 // order is c1 c2 c3
1103
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 vector_t error(solver3.errorSize());
1104
1/2
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 vector_t error1(c1->function().outputSpace()->nv());
1105
1/2
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 vector_t error2(c2->function().outputSpace()->nv());
1106
1/2
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 vector_t error3(c3->function().outputSpace()->nv());
1107
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
6 for (int i = 0; i < 2; ++i) {
1108
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 bool satisfied(solver3.isSatisfied(q, error));
1109 bool found;
1110
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 bool satisfied1(solver3.isConstraintSatisfied(c1, q, error1, found));
1111
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
4 BOOST_CHECK(found);
1112
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 bool satisfied2(solver3.isConstraintSatisfied(c2, q, error2, found));
1113
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
4 BOOST_CHECK(found);
1114
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
4 bool satisfied3(solver3.isConstraintSatisfied(c3, q, error3, found));
1115
6/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
4 BOOST_CHECK(found);
1116
6/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
4 BOOST_CHECK_EQUAL(satisfied, (satisfied1 && satisfied2 && satisfied3));
1117 4 size_type row = 0, nRows = error1.size();
1118
8/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
4 BOOST_CHECK(error1 == error.segment(row, nRows));
1119 4 row += nRows;
1120 4 nRows = error2.size();
1121
8/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
4 BOOST_CHECK(error2 == error.segment(row, nRows));
1122 4 row += nRows;
1123 4 nRows = error3.size();
1124
8/16
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
4 BOOST_CHECK(error3 == error.segment(row, nRows));
1125
1126
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
4 q = ::pinocchio::randomConfiguration(device->model());
1127 }
1128
1129
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 BySubstitution solver5(device->configSpace());
1130
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 solver5.add(c3);
1131
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 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 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
2 BOOST_CHECK(solver5.contains(c3->copy()));
1132 2 }
1133