GCC Code Coverage Report


Directory: ./
File: tests/symbolic-calculus.cc
Date: 2025-05-05 12:19:30
Exec Total Coverage
Lines: 279 279 100.0%
Branches: 642 1268 50.6%

Line Branch Exec Source
1 // Copyright (c) 2015, LAAS-CNRS
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 SymbolicCalculus
30
31 #include <math.h>
32 #include <stdlib.h>
33
34 #include <Eigen/Geometry>
35 #include <boost/test/included/unit_test.hpp>
36 #include <hpp/constraints/affine-function.hh>
37 #include <hpp/constraints/symbolic-calculus.hh>
38 #include <hpp/constraints/symbolic-function.hh>
39 #include <limits>
40 #include <pinocchio/fwd.hpp>
41
42 using namespace hpp::constraints;
43
44 typedef SymbolicFunction<JointFrame> JointFrameFunction;
45
46 template <class ValueType = eigen::vector3_t,
47 class JacobianType = JacobianMatrix>
48 class PointTesterT : public CalculusBase<PointTesterT<ValueType, JacobianType>,
49 ValueType, JacobianType> {
50 public:
51 typedef CalculusBase<PointTesterT<ValueType, JacobianType>, ValueType,
52 JacobianType>
53 Parent_t;
54 struct DataWrapper {
55 ValueType value;
56 JacobianType jacobian;
57
58 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
59 };
60
61
2/4
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
24 HPP_CONSTRAINTS_CB_CREATE1(PointTesterT, DataWrapper*)
62
63 24 PointTesterT(DataWrapper* d = NULL) : datas(d) {}
64
65 PointTesterT(const Parent_t& other)
66 : Parent_t(other), datas(static_cast<const PointTesterT&>(other).datas) {}
67
68 2200 void impl_value(const ConfigurationIn_t) { this->value_ = datas->value; }
69 1100 void impl_jacobian(const ConfigurationIn_t) {
70 2200 this->jacobian_ = datas->jacobian;
71 2200 }
72
73 DataWrapper* datas;
74 };
75
76 namespace crossProduct {
77 typedef Eigen::Matrix<value_type, 1, 6> Config;
78 typedef Eigen::Matrix<value_type, 3, 1> Value;
79 typedef Eigen::Matrix<value_type, 3, 6, Eigen::RowMajor> Jacobian;
80 typedef PointTesterT<Value, Jacobian> PointTester;
81 typedef PointTester::DataWrapper DataWrapper;
82
83 100 void setWrappers(Config cfg, DataWrapper* d1, DataWrapper* d2) {
84
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->value = cfg.leftCols(3);
85
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->value = cfg.rightCols(3);
86
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian = Jacobian::Zero();
87
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian = Jacobian::Zero();
88
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian.leftCols(3).setIdentity();
89
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian.rightCols(3).setIdentity();
90 100 }
91
92 100 void value(Config c, Value& v) {
93 100 v[0] = c[1] * c[5] - c[2] * c[4];
94 100 v[1] = -c[0] * c[5] + c[2] * c[3];
95 100 v[2] = c[0] * c[4] - c[1] * c[3];
96 100 }
97
98 200 void jacobian(Config cfg, Eigen::Ref<Jacobian> j) {
99 200 j(0, 0) = 0;
100 200 j(0, 1) = cfg[5];
101 200 j(0, 2) = -cfg[4];
102 200 j(0, 3) = 0;
103 200 j(0, 4) = -cfg[2];
104 200 j(0, 5) = cfg[1];
105 200 j(1, 0) = -cfg[5];
106 200 j(1, 1) = 0;
107 200 j(1, 2) = cfg[3];
108 200 j(1, 3) = cfg[2];
109 200 j(1, 4) = 0;
110 200 j(1, 5) = -cfg[0];
111 200 j(2, 0) = cfg[4];
112 200 j(2, 1) = -cfg[3];
113 200 j(2, 2) = 0;
114 200 j(2, 3) = -cfg[1];
115 200 j(2, 4) = cfg[0];
116 200 j(2, 5) = 0;
117 200 }
118 } // namespace crossProduct
119
120
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(CrossProductTest) {
121 using namespace crossProduct;
122
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d1 = new DataWrapper();
123
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d2 = new DataWrapper();
124
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<PointTester>::Ptr_t p1 = PointTester::create(d1),
125
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 p2 = PointTester::create(d2);
126 typedef CrossProduct<PointTester, PointTester> CP_t;
127
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<CP_t>::Ptr_t cp = p1 ^ p2;
128
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Value v;
129
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jacobian j;
130
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t unused;
131
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
132
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
133
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 cp->invalidate();
134
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 setWrappers(cfg, d1, d2);
135
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeValue(unused);
136
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 value(cfg, v);
137
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.
200 jacobian(cfg, j);
138
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->value().isApprox(v));
139
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeJacobian(unused);
140
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->jacobian().isApprox(j));
141 }
142
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d1;
143
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d2;
144 2 }
145
146 namespace difference {
147 typedef Eigen::Matrix<value_type, 1, 6> Config;
148 typedef Eigen::Matrix<value_type, 3, 1> Value;
149 typedef Eigen::Matrix<value_type, 3, 6, Eigen::RowMajor> Jacobian;
150 typedef PointTesterT<Value, Jacobian> PointTester;
151 typedef PointTester::DataWrapper DataWrapper;
152
153 100 void setWrappers(Config cfg, DataWrapper* d1, DataWrapper* d2) {
154
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->value = cfg.leftCols(3);
155
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->value = cfg.rightCols(3);
156
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian = Jacobian::Identity();
157
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian = Jacobian::Zero();
158
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian.rightCols(3).setIdentity();
159 100 }
160
161
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.
100 void value(Config c, Value& v) { v = c.leftCols(3) - c.rightCols(3); }
162
163 100 void jacobian(Config, Jacobian& j) {
164
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.rightCols(3).setIdentity();
165
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j = -j;
166
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.leftCols(3).setIdentity();
167 100 }
168 } // namespace difference
169
170
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(DifferenceTest) {
171 using namespace difference;
172
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d1 = new DataWrapper();
173
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d2 = new DataWrapper();
174
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<PointTester>::Ptr_t p1 = PointTester::create(d1),
175
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 p2 = PointTester::create(d2);
176 typedef Difference<PointTester, PointTester> D_t;
177
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<D_t>::Ptr_t cp = p1 - p2;
178
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Value v;
179
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jacobian j;
180
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t unused;
181
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
182
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
183
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 cp->invalidate();
184
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 setWrappers(cfg, d1, d2);
185
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeValue(unused);
186
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 value(cfg, v);
187
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 jacobian(cfg, j);
188
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->value().isApprox(v));
189
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeJacobian(unused);
190
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->jacobian().isApprox(j));
191 }
192
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d1;
193
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d2;
194 2 }
195
196 namespace sum {
197 typedef Eigen::Matrix<value_type, 1, 6> Config;
198 typedef Eigen::Matrix<value_type, 3, 1> Value;
199 typedef Eigen::Matrix<value_type, 3, 6, Eigen::RowMajor> Jacobian;
200 typedef PointTesterT<Value, Jacobian> PointTester;
201 typedef PointTester::DataWrapper DataWrapper;
202
203 100 void setWrappers(Config cfg, DataWrapper* d1, DataWrapper* d2) {
204
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->value = cfg.leftCols(3);
205
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->value = cfg.rightCols(3);
206
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian = Jacobian::Identity();
207
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian = Jacobian::Zero();
208
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian.rightCols(3).setIdentity();
209 100 }
210
211
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.
100 void value(Config c, Value& v) { v = c.leftCols(3) + c.rightCols(3); }
212
213 100 void jacobian(Config, Jacobian& j) {
214
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.rightCols(3).setIdentity();
215
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.leftCols(3).setIdentity();
216 100 }
217 } // namespace sum
218
219
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(SumTest) {
220 using namespace sum;
221
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d1 = new DataWrapper();
222
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d2 = new DataWrapper();
223
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<PointTester>::Ptr_t p1 = PointTester::create(d1),
224
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 p2 = PointTester::create(d2);
225 typedef Sum<PointTester, PointTester> D_t;
226
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<D_t>::Ptr_t cp = p1 + p2;
227
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Value v;
228
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jacobian j;
229
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t unused;
230
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
231
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
232
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 cp->invalidate();
233
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 setWrappers(cfg, d1, d2);
234
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeValue(unused);
235
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 value(cfg, v);
236
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 jacobian(cfg, j);
237
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->value().isApprox(v));
238
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeJacobian(unused);
239
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->jacobian().isApprox(j));
240 }
241
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d1;
242
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d2;
243 2 }
244
245 namespace scalarMultiply {
246 typedef Eigen::Matrix<value_type, 1, 4> Config;
247 typedef Eigen::Matrix<value_type, 3, 1> Value;
248 typedef Eigen::Matrix<value_type, 3, 3, Eigen::RowMajor> Jacobian;
249 typedef PointTesterT<Value, Jacobian> PointTester;
250 typedef PointTester::DataWrapper DataWrapper;
251
252 100 void setWrappers(Config cfg, DataWrapper* d1, DataWrapper*) {
253
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->value = cfg.leftCols(3);
254
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian = Jacobian::Identity();
255 100 }
256
257
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.
100 void value(Config c, Value& v) { v = c[3] * c.leftCols(3); }
258
259 100 void jacobian(Config c, Jacobian& j) {
260 100 j.setIdentity();
261
1/2
✓ Branch 3 taken 100 times.
✗ Branch 4 not taken.
100 j = c[3] * j;
262 100 }
263 } // namespace scalarMultiply
264
265
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(ScalarMultiplyTest) {
266 using namespace scalarMultiply;
267
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d1 = new DataWrapper();
268
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d2 = new DataWrapper();
269
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<PointTester>::Ptr_t p1 = PointTester::create(d1),
270
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 p2 = PointTester::create(d2);
271 typedef ScalarMultiply<PointTester> D_t;
272 2 value_type scalar = 3;
273
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<D_t>::Ptr_t cp = scalar * p1;
274
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Value v;
275
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jacobian j;
276
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t unused;
277
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
278
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
279
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 cfg[3] = scalar;
280
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 cp->invalidate();
281
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 setWrappers(cfg, d1, d2);
282
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeValue(unused);
283
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 value(cfg, v);
284
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 jacobian(cfg, j);
285
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->value().isApprox(v));
286
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 cp->computeJacobian(unused);
287
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(cp->jacobian().isApprox(j));
288 }
289
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d1;
290
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d2;
291 2 }
292
293 namespace scalarProduct {
294 typedef Eigen::Matrix<value_type, 1, 6> Config;
295 typedef Eigen::Matrix<value_type, 1, 1> OutputValue;
296 typedef Eigen::Matrix<value_type, 1, 6, Eigen::RowMajor> OutputJacobian;
297 typedef Eigen::Matrix<value_type, 3, 1> Value;
298 typedef Eigen::Matrix<value_type, 3, 6, Eigen::RowMajor> Jacobian;
299 typedef PointTesterT<Value, Jacobian> PointTester;
300 typedef PointTester::DataWrapper DataWrapper;
301
302 100 void setWrappers(Config cfg, DataWrapper* d1, DataWrapper* d2) {
303
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->value = cfg.leftCols(3);
304
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->value = cfg.rightCols(3);
305
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian = Jacobian::Zero();
306
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian = Jacobian::Zero();
307
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian.leftCols(3).setIdentity();
308
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian.rightCols(3).setIdentity();
309 100 }
310
311 100 void value(Config c, OutputValue& v) {
312
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.
100 v[0] = c.segment(0, 3).dot(c.segment(3, 3));
313 100 }
314
315 100 void jacobian(Config cfg, OutputJacobian& j) {
316 100 j(0, 0) = cfg[3];
317 100 j(0, 1) = cfg[4];
318 100 j(0, 2) = cfg[5];
319 100 j(0, 3) = cfg[0];
320 100 j(0, 4) = cfg[1];
321 100 j(0, 5) = cfg[2];
322 100 }
323 } // namespace scalarProduct
324
325
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(ScalarProductTest) {
326 using namespace scalarProduct;
327
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d1 = new DataWrapper();
328
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d2 = new DataWrapper();
329
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<PointTester>::Ptr_t p1 = PointTester::create(d1),
330
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 p2 = PointTester::create(d2);
331 typedef ScalarProduct<PointTester, PointTester> SP_t;
332
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<SP_t>::Ptr_t sp = p1 * p2;
333
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 OutputValue v;
334
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 OutputJacobian j;
335
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t unused;
336
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
337
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
338
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 sp->invalidate();
339
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 setWrappers(cfg, d1, d2);
340
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 sp->computeValue(unused);
341
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 value(cfg, v);
342
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 jacobian(cfg, j);
343
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(v.isApprox(sp->value()));
344
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 sp->computeJacobian(unused);
345
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(sp->jacobian().isApprox(j));
346 }
347
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d1;
348
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d2;
349 2 }
350
351 namespace matrixOfExp {
352 typedef Eigen::Matrix<value_type, 1, 6> Config;
353 typedef Eigen::Matrix<value_type, 3, 1> Value;
354 typedef Eigen::Matrix<value_type, 3, Eigen::Dynamic, Eigen::RowMajor> Jacobian;
355 typedef Eigen::Matrix<value_type, 6, 2> OutputValue;
356 typedef Eigen::Matrix<value_type, 6, 2 * 6, Eigen::RowMajor> OutputJacobian;
357 typedef Eigen::Matrix<value_type, 2, 1> RValue;
358 typedef Eigen::Matrix<value_type, 6, 6> OutputJacobianTimesRValue;
359 typedef PointTesterT<Value, Jacobian> PointTester;
360 typedef PointTester::DataWrapper DataWrapper;
361
362 100 void setWrappers(Config cfg, DataWrapper* d1, DataWrapper* d2) {
363
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->value = cfg.leftCols(3);
364
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->value = cfg.rightCols(3);
365
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian = Jacobian::Zero(3, 6);
366
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian = Jacobian::Zero(3, 6);
367
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d1->jacobian.leftCols(3).setIdentity();
368
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 d2->jacobian.rightCols(3).setIdentity();
369 100 }
370
371 100 void value(Config c, OutputValue& v) {
372
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.
100 v.block(0, 0, 3, 1).transpose() = c.segment<3>(0);
373
5/10
✓ 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.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 100 times.
✗ Branch 15 not taken.
100 v.block(3, 0, 3, 1).transpose() = c.segment<3>(0).cross(c.segment<3>(3));
374
5/10
✓ 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.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 100 times.
✗ Branch 15 not taken.
100 v.block(0, 1, 3, 1).transpose() = c.segment(0, 3) - c.segment(3, 3);
375
5/10
✓ 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.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 100 times.
✗ Branch 15 not taken.
100 v.block(3, 1, 3, 1).transpose() = c.segment(0, 3) + c.segment(3, 3);
376 100 }
377
378 100 void jacobian(Config cfg, OutputJacobian& j) {
379
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.block<3, 3>(0, 0).setIdentity();
380
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.block<3, 3>(0, 3).setZero();
381
382
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.
100 crossProduct::jacobian(cfg, j.block<3, 6>(3, 0));
383 // j.block (0,3,3,3).setZero();
384
385
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.block<3, 3>(0, 6).setIdentity();
386
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.block<3, 3>(0, 9).setIdentity();
387
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
100 j.block<3, 3>(0, 9) *= -1;
388
389
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.block<3, 3>(3, 6).setIdentity();
390
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
100 j.block<3, 3>(3, 9).setIdentity();
391 100 }
392
393 10000 void jacobianTimes(Eigen::Ref<const OutputJacobian> jin,
394 Eigen::Ref<const RValue> rvalue,
395 Eigen::Ref<OutputJacobianTimesRValue> jout) {
396
1/2
✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
10000 jout.block(0, 0, 3, 6) =
397
7/14
✓ Branch 2 taken 10000 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10000 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 10000 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 10000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 10000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 10000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 10000 times.
✗ Branch 21 not taken.
20000 rvalue[0] * jin.block(0, 0, 3, 6) + rvalue[1] * jin.block(0, 6, 3, 6);
398
1/2
✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
10000 jout.block(3, 0, 3, 6) =
399
7/14
✓ Branch 2 taken 10000 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 10000 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 10000 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 10000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 10000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 10000 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 10000 times.
✗ Branch 21 not taken.
20000 rvalue[0] * jin.block(3, 0, 3, 6) + rvalue[1] * jin.block(3, 6, 3, 6);
400 10000 }
401 } // namespace matrixOfExp
402
403
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(MatrixOfExpTest) {
404 using namespace matrixOfExp;
405
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d1 = new DataWrapper();
406
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 DataWrapper* d2 = new DataWrapper();
407
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Traits<PointTester>::Ptr_t p1 = PointTester::create(d1),
408
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 p2 = PointTester::create(d2);
409 typedef MatrixOfExpressions<Value, Jacobian> MoE_t;
410
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 OutputValue v;
411
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 OutputJacobian j;
412
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 RValue rvalue;
413
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 OutputJacobianTimesRValue jout, cache;
414
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 MoE_t moe(v, j);
415
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 moe.setSize(2, 2);
416 2 moe.set(0, 0, p1);
417
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 moe.set(1, 0, p1 ^ p2);
418
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 moe.set(0, 1, p1 - p2);
419
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 moe.set(1, 1, p1 + p2);
420
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 vector_t unused;
421
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
422
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
423
1/2
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
200 moe.invalidate();
424
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 setWrappers(cfg, d1, d2);
425
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 moe.computeValue(unused);
426
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 value(cfg, v);
427
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 jacobian(cfg, j);
428
7/14
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 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 27 not taken.
✓ Branch 28 taken 100 times.
200 BOOST_CHECK(moe.value().isApprox(v));
429
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 moe.computeJacobian(unused);
430
7/14
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 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 27 not taken.
✓ Branch 28 taken 100 times.
200 BOOST_CHECK(moe.jacobian().isApprox(j));
431
2/2
✓ Branch 0 taken 10000 times.
✓ Branch 1 taken 100 times.
20200 for (size_t l = 0; l < 100; l++) {
432
2/4
✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10000 times.
✗ Branch 5 not taken.
20000 rvalue = RValue::Random();
433
4/8
✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 10000 times.
✗ Branch 11 not taken.
20000 moe.jacobianTimes(unused, rvalue, cache);
434
4/8
✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10000 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 10000 times.
✗ Branch 11 not taken.
20000 jacobianTimes(j, rvalue, jout);
435
7/14
✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 10000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 10000 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 10000 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 10000 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 10000 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 10000 times.
20000 BOOST_CHECK(cache.isApprox(jout));
436 }
437 }
438
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d1;
439
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 delete d2;
440 2 }
441
442
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(FunctionExpTest) {
443 typedef Eigen::Matrix<value_type, 3, 1> Config;
444
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 func(AffineFunction::create(matrix3_t::Identity()));
445 hpp::shared_ptr<FunctionExp<AffineFunction> > funcExp =
446
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 FunctionExp<AffineFunction>::create(func);
447
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 times.
202 for (size_t i = 0; i < 100; i++) {
448
2/4
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 100 times.
✗ Branch 5 not taken.
200 Config cfg = Config::Random();
449
450
1/2
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
200 funcExp->invalidate();
451
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 funcExp->computeValue(cfg);
452
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(funcExp->value().isApprox(cfg));
453
2/4
✓ Branch 2 taken 100 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
200 funcExp->computeJacobian(cfg);
454
8/16
✓ Branch 1 taken 100 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 100 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 100 times.
✗ Branch 16 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 30 not taken.
✓ Branch 31 taken 100 times.
200 BOOST_CHECK(funcExp->jacobian().isIdentity());
455 }
456 2 }
457