GCC Code Coverage Report


Directory: ./
File: include/pinocchio/multibody/liegroup/liegroup-variant-visitors.hxx
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 142 149 95.3%
Branches: 72 145 49.7%

Line Branch Exec Source
1 //
2 // Copyright (c) 2018 CNRS
3 //
4
5 #ifndef __pinocchio_lie_group_variant_visitor_hxx__
6 #define __pinocchio_lie_group_variant_visitor_hxx__
7
8 #include "pinocchio/multibody/liegroup/liegroup-base.hpp"
9 #include "pinocchio/multibody/liegroup/cartesian-product-variant.hpp"
10 #include "pinocchio/multibody/visitor.hpp"
11
12 #include <string>
13
14 #define LIE_GROUP_VISITOR(VISITOR) \
15 VISITOR(ArgsType & args) \
16 : args(args) \
17 { \
18 } \
19 ArgsType & args
20
21 namespace pinocchio
22 {
23
24 namespace visitor
25 {
26 namespace bf = boost::fusion;
27
28 template<typename Visitor>
29 struct LieGroupVisitorBase : public boost::static_visitor<>
30 {
31 template<typename LieGroupDerived>
32 786 void operator()(const LieGroupBase<LieGroupDerived> & lg) const
33 {
34
1/2
✓ Branch 1 taken 393 times.
✗ Branch 2 not taken.
786 bf::invoke(
35 &Visitor::template algo<LieGroupDerived>,
36
1/2
✓ Branch 2 taken 393 times.
✗ Branch 3 not taken.
1572 bf::append(boost::ref(lg), static_cast<const Visitor *>(this)->args));
37 786 }
38
39 template<typename LieGroupCollection, typename ArgsTmp>
40 786 static void run(const LieGroupGenericTpl<LieGroupCollection> & lg, ArgsTmp args)
41 {
42
1/2
✓ Branch 2 taken 393 times.
✗ Branch 3 not taken.
786 return boost::apply_visitor(Visitor(args), lg);
43 }
44 };
45
46 template<typename Scalar, int Options>
47 struct LieGroupEqual : public boost::static_visitor<bool>
48 {
49 template<typename T, typename U>
50 bool operator()(const T &, const U &) const
51 {
52 // Should we handle
53 // - dynamic size vector space versus static size vector space
54 // - dynamic versus static cartesian product
55 return false;
56 }
57
58 template<typename T>
59 18 bool operator()(const T & lhs, const T & rhs) const
60 {
61 18 return lhs == rhs;
62 }
63
64 /// \name Vector space comparison
65 /// \{
66 1 bool operator()(
67 const VectorSpaceOperationTpl<Eigen::Dynamic, Scalar, Options> & lhs,
68 const VectorSpaceOperationTpl<Eigen::Dynamic, Scalar, Options> & rhs) const
69 {
70 1 return lhs == rhs;
71 }
72
73 template<int Dim>
74 4 bool operator()(
75 const VectorSpaceOperationTpl<Dim, Scalar, Options> & lhs,
76 const VectorSpaceOperationTpl<Eigen::Dynamic, Scalar, Options> & rhs) const
77 {
78 4 return lhs.nq() == rhs.nq();
79 }
80
81 template<int Dim>
82 bool operator()(
83 const VectorSpaceOperationTpl<Eigen::Dynamic, Scalar, Options> & lhs,
84 const VectorSpaceOperationTpl<Dim, Scalar, Options> & rhs) const
85 {
86 return lhs.nq() == rhs.nq();
87 }
88 /// \}
89
90 template<
91 typename LieGroup1,
92 typename LieGroup2,
93 template<typename, int> class LieGroupCollectionTpl>
94 bool operator()(
95 const CartesianProductOperation<LieGroup1, LieGroup2> & lhs,
96 const CartesianProductOperationVariantTpl<Scalar, Options, LieGroupCollectionTpl> & rhs)
97 const
98 {
99 return rhs.isEqual(lhs);
100 }
101
102 template<
103 typename LieGroup1,
104 typename LieGroup2,
105 template<typename, int> class LieGroupCollectionTpl>
106 bool operator()(
107 const CartesianProductOperationVariantTpl<Scalar, Options, LieGroupCollectionTpl> & lhs,
108 const CartesianProductOperation<LieGroup1, LieGroup2> & rhs) const
109 {
110 return lhs.isEqual(rhs);
111 }
112 };
113 } // namespace visitor
114
115 #define PINOCCHIO_LG_CHECK_VECTOR_SIZE(type, var, exp_size) \
116 EIGEN_STATIC_ASSERT_VECTOR_ONLY(type); \
117 assert(var.size() == exp_size)
118 #define PINOCCHIO_LG_CHECK_MATRIX_SIZE(var, nr, nc) \
119 assert(var.rows() == nr); \
120 assert(var.cols() == nc)
121
122 #define PINOCCHIO_LG_VISITOR(Name, type, _method) \
123 /** @brief Lie Group visitor of the _method */ \
124 struct LieGroup##Name##Visitor : public boost::static_visitor<type> \
125 { \
126 template<typename LieGroupDerived> \
127 type operator()(const LieGroupBase<LieGroupDerived> & lg) const \
128 { \
129 return lg._method(); \
130 } \
131 \
132 template<typename LieGroupCollection> \
133 static type run(const LieGroupGenericTpl<LieGroupCollection> & lg) \
134 { \
135 return boost::apply_visitor(LieGroup##Name##Visitor(), lg); \
136 } \
137 }; \
138 \
139 template<typename LieGroupCollection> \
140 inline type _method(const LieGroupGenericTpl<LieGroupCollection> & lg) \
141 { \
142 return LieGroup##Name##Visitor::run(lg); \
143 }
144
145
1/2
✓ Branch 1 taken 666 times.
✗ Branch 2 not taken.
3996 PINOCCHIO_LG_VISITOR(Nq, int, nq)
146
1/2
✓ Branch 1 taken 503 times.
✗ Branch 2 not taken.
1509 PINOCCHIO_LG_VISITOR(Nv, int, nv)
147
1/2
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
236 PINOCCHIO_LG_VISITOR(Name, std::string, name)
148 #undef PINOCCHIO_LG_VISITOR
149
150 /**
151 * @brief Visitor of the Lie Group neutral element
152 */
153 template<typename Vector>
154 struct LieGroupNeutralVisitor : public boost::static_visitor<Vector>
155 {
156 template<typename LieGroupDerived>
157 118 Vector operator()(const LieGroupBase<LieGroupDerived> & lg) const
158 {
159
1/2
✓ Branch 2 taken 55 times.
✗ Branch 3 not taken.
118 return lg.neutral();
160 }
161
162 template<typename LieGroupCollection>
163 59 static Vector run(const LieGroupGenericTpl<LieGroupCollection> & lg)
164 {
165
1/2
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
118 return boost::apply_visitor(LieGroupNeutralVisitor(), lg);
166 }
167 };
168
169 template<typename LieGroupCollection>
170 inline Eigen::
171 Matrix<typename LieGroupCollection::Scalar, Eigen::Dynamic, 1, LieGroupCollection::Options>
172 59 neutral(const LieGroupGenericTpl<LieGroupCollection> & lg)
173 {
174 typedef Eigen::Matrix<
175 typename LieGroupCollection::Scalar, Eigen::Dynamic, 1, LieGroupCollection::Options>
176 ReturnType;
177 59 return LieGroupNeutralVisitor<ReturnType>::run(lg);
178 }
179
180 #define PINOCCHIO_LG_VISITOR(Name, _method) \
181 /** @brief Visitor of the Lie Group _method method */ \
182 template<class M_t> \
183 struct LieGroup##Name##Visitor : visitor::LieGroupVisitorBase<LieGroup##Name##Visitor<M_t>> \
184 { \
185 typedef boost::fusion::vector<const Eigen::MatrixBase<M_t> &> ArgsType; \
186 LIE_GROUP_VISITOR(LieGroup##Name##Visitor); \
187 template<typename LieGroupDerived> \
188 static void algo(const LieGroupBase<LieGroupDerived> & lg, const Eigen::MatrixBase<M_t> & m1) \
189 { \
190 lg._method(m1); \
191 } \
192 }
193
194 244 PINOCCHIO_LG_VISITOR(Random, random);
195 36 PINOCCHIO_LG_VISITOR(Normalize, normalize);
196
197 template<typename LieGroupCollection, class Config_t>
198 71 inline void random(
199 const LieGroupGenericTpl<LieGroupCollection> & lg, const Eigen::MatrixBase<Config_t> & qout)
200 {
201
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 61 times.
71 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, qout, nq(lg));
202
203 typedef LieGroupRandomVisitor<Config_t> Operation;
204
1/2
✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
71 Operation::run(lg, typename Operation::ArgsType(qout));
205 71 }
206
207 template<typename LieGroupCollection, class Config_t>
208 28 inline void normalize(
209 const LieGroupGenericTpl<LieGroupCollection> & lg, const Eigen::MatrixBase<Config_t> & qout)
210 {
211
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
28 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, qout, nq(lg));
212
213 typedef LieGroupNormalizeVisitor<Config_t> Operation;
214
1/2
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
28 Operation::run(lg, typename Operation::ArgsType(qout));
215 28 }
216
217 #undef PINOCCHIO_LG_VISITOR
218
219 /** @brief Visitor of the Lie Group isNormalized method */
220 template<class Matrix_t>
221 struct LieGroupIsNormalizedVisitor
222 : visitor::LieGroupVisitorBase<LieGroupIsNormalizedVisitor<Matrix_t>>
223 {
224 typedef boost::fusion::
225 vector<const Eigen::MatrixBase<Matrix_t> &, const typename Matrix_t::Scalar &, bool &>
226 ArgsType;
227 8 LIE_GROUP_VISITOR(LieGroupIsNormalizedVisitor);
228 template<typename LieGroupDerived>
229 16 static void algo(
230 const LieGroupBase<LieGroupDerived> & lg,
231 const Eigen::MatrixBase<Matrix_t> & qin,
232 const typename Matrix_t::Scalar & prec,
233 bool & res)
234 {
235 16 res = lg.isNormalized(qin, prec);
236 16 }
237 };
238
239 template<typename LieGroupCollection, class Config_t>
240 8 inline bool isNormalized(
241 const LieGroupGenericTpl<LieGroupCollection> & lg,
242 const Eigen::MatrixBase<Config_t> & qin,
243 const typename Config_t::Scalar & prec)
244 {
245
2/4
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
8 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, qin, nq(lg));
246
247 bool res;
248 typedef LieGroupIsNormalizedVisitor<Config_t> Operation;
249
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
8 Operation::run(lg, typename Operation::ArgsType(qin, prec, res));
250 8 return res;
251 }
252
253 /** @brief Visitor of the Lie Group isSameConfiguration method */
254 template<class Matrix1_t, class Matrix2_t>
255 struct LieGroupIsSameConfigurationVisitor
256 : visitor::LieGroupVisitorBase<LieGroupIsSameConfigurationVisitor<Matrix1_t, Matrix2_t>>
257 {
258 typedef boost::fusion::vector<
259 const Eigen::MatrixBase<Matrix1_t> &,
260 const Eigen::MatrixBase<Matrix2_t> &,
261 const typename Matrix1_t::Scalar &,
262 bool &>
263 ArgsType;
264 20 LIE_GROUP_VISITOR(LieGroupIsSameConfigurationVisitor);
265 template<typename LieGroupDerived>
266 20 static void algo(
267 const LieGroupBase<LieGroupDerived> & lg,
268 const Eigen::MatrixBase<Matrix1_t> & q0,
269 const Eigen::MatrixBase<Matrix2_t> & q1,
270 const typename Matrix1_t::Scalar & prec,
271 bool & res)
272 {
273 20 res = lg.isSameConfiguration(q0, q1, prec);
274 }
275 };
276
277 template<typename LieGroupCollection, class ConfigL_t, class ConfigR_t>
278 20 inline bool isSameConfiguration(
279 const LieGroupGenericTpl<LieGroupCollection> & lg,
280 const Eigen::MatrixBase<ConfigL_t> & q0,
281 const Eigen::MatrixBase<ConfigR_t> & q1,
282 const typename ConfigL_t::Scalar & prec)
283 {
284
2/4
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
20 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
285
2/4
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
20 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
286
287 bool res;
288 typedef LieGroupIsSameConfigurationVisitor<ConfigL_t, ConfigR_t> Operation;
289
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
20 Operation::run(lg, typename Operation::ArgsType(q0, q1, prec, res));
290 20 return res;
291 }
292
293 #define PINOCCHIO_LG_VISITOR(Name, _method) \
294 /** @brief Visitor of the Lie Group _method method */ \
295 template<class Matrix1_t, class Matrix2_t> \
296 struct LieGroup##Name##Visitor \
297 : visitor::LieGroupVisitorBase<LieGroup##Name##Visitor<Matrix1_t, Matrix2_t>> \
298 { \
299 typedef boost::fusion::vector< \
300 const Eigen::MatrixBase<Matrix1_t> &, \
301 const Eigen::MatrixBase<Matrix2_t> &, \
302 typename Matrix1_t::Scalar &> \
303 ArgsType; \
304 LIE_GROUP_VISITOR(LieGroup##Name##Visitor); \
305 template<typename LieGroupDerived> \
306 static void algo( \
307 const LieGroupBase<LieGroupDerived> & lg, \
308 const Eigen::MatrixBase<Matrix1_t> & m1, \
309 const Eigen::MatrixBase<Matrix2_t> & m2, \
310 typename Matrix1_t::Scalar & res) \
311 { \
312 res = lg._method(m1, m2); \
313 } \
314 }
315
316 // PINOCCHIO_LG_VISITOR(Distance, distance);
317
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
112 PINOCCHIO_LG_VISITOR(SquaredDistance, squaredDistance);
318
319 template<typename LieGroupCollection, class ConfigL_t, class ConfigR_t>
320 48 inline typename ConfigL_t::Scalar squaredDistance(
321 const LieGroupGenericTpl<LieGroupCollection> & lg,
322 const Eigen::MatrixBase<ConfigL_t> & q0,
323 const Eigen::MatrixBase<ConfigR_t> & q1)
324 {
325
2/4
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 28 times.
48 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
326
2/4
✓ Branch 2 taken 28 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 28 times.
48 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
327
328 typedef LieGroupSquaredDistanceVisitor<ConfigL_t, ConfigR_t> Operation;
329 typename ConfigL_t::Scalar d2;
330
2/4
✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 28 times.
✗ Branch 5 not taken.
48 Operation::run(lg, typename Operation::ArgsType(q0, q1, d2));
331 48 return d2;
332 }
333
334 #undef PINOCCHIO_LG_VISITOR
335
336 #define PINOCCHIO_LG_VISITOR(Name, _method) \
337 /** @brief Visitor of the Lie Group _method method */ \
338 template<class Matrix1_t, class Matrix2_t, class Matrix3_t> \
339 struct LieGroup##Name##Visitor \
340 : visitor::LieGroupVisitorBase<LieGroup##Name##Visitor<Matrix1_t, Matrix2_t, Matrix3_t>> \
341 { \
342 typedef boost::fusion::vector< \
343 const Eigen::MatrixBase<Matrix1_t> &, \
344 const Eigen::MatrixBase<Matrix2_t> &, \
345 const Eigen::MatrixBase<Matrix3_t> &> \
346 ArgsType; \
347 LIE_GROUP_VISITOR(LieGroup##Name##Visitor); \
348 template<typename LieGroupDerived> \
349 static void algo( \
350 const LieGroupBase<LieGroupDerived> & lg, \
351 const Eigen::MatrixBase<Matrix1_t> & m1, \
352 const Eigen::MatrixBase<Matrix2_t> & m2, \
353 const Eigen::MatrixBase<Matrix3_t> & m3) \
354 { \
355 lg._method(m1, m2, m3); \
356 } \
357 }
358
359 184 PINOCCHIO_LG_VISITOR(Integrate, integrate);
360 64 PINOCCHIO_LG_VISITOR(Difference, difference);
361 20 PINOCCHIO_LG_VISITOR(RandomConfiguration, randomConfiguration);
362
363 template<typename LieGroupCollection, class ConfigIn_t, class Tangent_t, class ConfigOut_t>
364 56 inline void integrate(
365 const LieGroupGenericTpl<LieGroupCollection> & lg,
366 const Eigen::MatrixBase<ConfigIn_t> & q,
367 const Eigen::MatrixBase<Tangent_t> & v,
368 const Eigen::MatrixBase<ConfigOut_t> & qout)
369 {
370
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 46 times.
56 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigIn_t, q, nq(lg));
371
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 46 times.
56 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
372
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 46 times.
56 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigOut_t, qout, nq(lg));
373
374 typedef LieGroupIntegrateVisitor<ConfigIn_t, Tangent_t, ConfigOut_t> Operation;
375
1/2
✓ Branch 2 taken 46 times.
✗ Branch 3 not taken.
56 Operation::run(lg, typename Operation::ArgsType(q, v, qout));
376 56 }
377
378 template<typename LieGroupCollection, class ConfigL_t, class ConfigR_t, class Tangent_t>
379 42 inline void difference(
380 const LieGroupGenericTpl<LieGroupCollection> & lg,
381 const Eigen::MatrixBase<ConfigL_t> & q0,
382 const Eigen::MatrixBase<ConfigR_t> & q1,
383 const Eigen::MatrixBase<Tangent_t> & v)
384 {
385
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
42 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
386
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
42 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
387
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
42 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
388
389 typedef LieGroupDifferenceVisitor<ConfigL_t, ConfigR_t, Tangent_t> Operation;
390
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
42 Operation::run(lg, typename Operation::ArgsType(q0, q1, v));
391 42 }
392
393 template<typename LieGroupCollection, class ConfigL_t, class ConfigR_t, class ConfigOut_t>
394 20 inline void randomConfiguration(
395 const LieGroupGenericTpl<LieGroupCollection> & lg,
396 const Eigen::MatrixBase<ConfigL_t> & q0,
397 const Eigen::MatrixBase<ConfigR_t> & q1,
398 const Eigen::MatrixBase<ConfigOut_t> & qout)
399 {
400
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
20 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
401
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
20 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
402
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
20 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigOut_t, qout, nq(lg));
403
404 typedef LieGroupRandomConfigurationVisitor<ConfigL_t, ConfigR_t, ConfigOut_t> Operation;
405
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
20 Operation::run(lg, typename Operation::ArgsType(q0, q1, qout));
406 20 }
407
408 #undef PINOCCHIO_LG_VISITOR
409
410 /** @brief Visitor of the Lie Group interpolate method */
411 template<class Matrix1_t, class Matrix2_t, class Matrix3_t>
412 struct LieGroupInterpolateVisitor
413 : visitor::LieGroupVisitorBase<LieGroupInterpolateVisitor<Matrix1_t, Matrix2_t, Matrix3_t>>
414 {
415 typedef boost::fusion::vector<
416 const Eigen::MatrixBase<Matrix1_t> &,
417 const Eigen::MatrixBase<Matrix2_t> &,
418 const typename Matrix1_t::Scalar &,
419 const Eigen::MatrixBase<Matrix3_t> &>
420 ArgsType;
421 LIE_GROUP_VISITOR(LieGroupInterpolateVisitor);
422 template<typename LieGroupDerived>
423 static void algo(
424 const LieGroupBase<LieGroupDerived> & lg,
425 const Eigen::MatrixBase<Matrix1_t> & q0,
426 const Eigen::MatrixBase<Matrix2_t> & q1,
427 const typename Matrix1_t::Scalar & u,
428 const Eigen::MatrixBase<Matrix3_t> & qout)
429 {
430 lg.interpolate(q0, q1, u, qout);
431 }
432 };
433
434 template<typename LieGroupCollection, class ConfigL_t, class ConfigR_t, class ConfigOut_t>
435 inline void interpolate(
436 const LieGroupGenericTpl<LieGroupCollection> & lg,
437 const Eigen::MatrixBase<ConfigL_t> & q0,
438 const Eigen::MatrixBase<ConfigR_t> & q1,
439 const typename ConfigL_t::Scalar & u,
440 const Eigen::MatrixBase<ConfigOut_t> & qout)
441 {
442 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
443 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
444 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigOut_t, qout, nq(lg));
445
446 typedef LieGroupInterpolateVisitor<ConfigL_t, ConfigR_t, ConfigOut_t> Operation;
447 Operation::run(lg, typename Operation::ArgsType(q0, q1, u, qout));
448 }
449
450 #define PINOCCHIO_LG_VISITOR(Name, _method, HasArgPos) \
451 /** @brief Visitor of the Lie Group _method method */ \
452 template<class Matrix1_t, class Matrix2_t, class Matrix3_t> \
453 struct LieGroup##Name##Visitor \
454 : visitor::LieGroupVisitorBase<LieGroup##Name##Visitor<Matrix1_t, Matrix2_t, Matrix3_t>> \
455 { \
456 typedef boost::fusion::vector< \
457 const Eigen::MatrixBase<Matrix1_t> &, \
458 const Eigen::MatrixBase<Matrix2_t> &, \
459 const Eigen::MatrixBase<Matrix3_t> &, \
460 const ArgumentPosition BOOST_PP_COMMA_IF(HasArgPos) \
461 BOOST_PP_IIF(HasArgPos, const AssignmentOperatorType, )> \
462 ArgsType; \
463 LIE_GROUP_VISITOR(LieGroup##Name##Visitor); \
464 template<typename LieGroupDerived> \
465 static void algo( \
466 const LieGroupBase<LieGroupDerived> & lg, \
467 const Eigen::MatrixBase<Matrix1_t> & m1, \
468 const Eigen::MatrixBase<Matrix2_t> & m2, \
469 const Eigen::MatrixBase<Matrix3_t> & m3, \
470 const ArgumentPosition arg BOOST_PP_COMMA_IF(HasArgPos) \
471 BOOST_PP_IF(HasArgPos, const AssignmentOperatorType op = SETTO, )) \
472 { \
473 lg._method(m1, m2, m3, arg BOOST_PP_COMMA_IF(HasArgPos) BOOST_PP_IF(HasArgPos, op, )); \
474 } \
475 }
476
477 192 PINOCCHIO_LG_VISITOR(DIntegrate, dIntegrate, 1);
478 68 PINOCCHIO_LG_VISITOR(DDifference, dDifference, 0);
479
480 template<typename LieGroupCollection, class Config_t, class Tangent_t, class JacobianOut_t>
481 68 void dIntegrate(
482 const LieGroupGenericTpl<LieGroupCollection> & lg,
483 const Eigen::MatrixBase<Config_t> & q,
484 const Eigen::MatrixBase<Tangent_t> & v,
485 const Eigen::MatrixBase<JacobianOut_t> & J,
486 const ArgumentPosition arg,
487 const AssignmentOperatorType op)
488 {
489
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 48 times.
68 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, q, nq(lg));
490
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 48 times.
68 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
491
2/4
✗ Branch 2 not taken.
✓ Branch 3 taken 48 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
68 PINOCCHIO_LG_CHECK_MATRIX_SIZE(J, nv(lg), nv(lg));
492
493 typedef LieGroupDIntegrateVisitor<Config_t, Tangent_t, JacobianOut_t> Operation;
494
1/2
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
68 Operation::run(lg, typename Operation::ArgsType(q, v, J, arg, op));
495 68 }
496
497 template<typename LieGroupCollection, class ConfigL_t, class ConfigR_t, class JacobianOut_t>
498 54 void dDifference(
499 const LieGroupGenericTpl<LieGroupCollection> & lg,
500 const Eigen::MatrixBase<ConfigL_t> & q0,
501 const Eigen::MatrixBase<ConfigR_t> & q1,
502 const Eigen::MatrixBase<JacobianOut_t> & J,
503 const ArgumentPosition arg)
504 {
505
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 34 times.
54 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
506
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 34 times.
54 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
507
2/4
✗ Branch 2 not taken.
✓ Branch 3 taken 34 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 34 times.
54 PINOCCHIO_LG_CHECK_MATRIX_SIZE(J, nv(lg), nv(lg));
508
509 typedef LieGroupDDifferenceVisitor<ConfigL_t, ConfigR_t, JacobianOut_t> Operation;
510
1/2
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
54 Operation::run(lg, typename Operation::ArgsType(q0, q1, J, arg));
511 54 }
512
513 #undef PINOCCHIO_LG_VISITOR
514
515 template<class M1_t, class M2_t, class M3_t, class M4_t, bool dIntegrateOnTheLeft>
516 struct LieGroupDIntegrateProductVisitor
517 : visitor::LieGroupVisitorBase<
518 LieGroupDIntegrateProductVisitor<M1_t, M2_t, M3_t, M4_t, dIntegrateOnTheLeft>>
519 {
520 typedef boost::fusion::vector<
521 const M1_t &,
522 const M2_t &,
523 const M3_t &,
524 M4_t &,
525 const ArgumentPosition,
526 const AssignmentOperatorType>
527 ArgsType;
528
529 56 LIE_GROUP_VISITOR(LieGroupDIntegrateProductVisitor);
530
531 template<typename LieGroupDerived>
532 56 static void algo(
533 const LieGroupBase<LieGroupDerived> & lg,
534 const M1_t & q,
535 const M2_t & v,
536 const M3_t & J_in,
537 M4_t & J_out,
538 const ArgumentPosition arg,
539 const AssignmentOperatorType op)
540 {
541
3/6
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
56 PINOCCHIO_CHECK_INPUT_ARGUMENT(
542 arg == ARG0 || arg == ARG1, "arg should be either ARG0 or ARG1");
543
2/3
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
56 switch (arg)
544 {
545 28 case ARG0:
546 if (dIntegrateOnTheLeft)
547 14 lg.dIntegrate_dq(q, v, SELF, J_in, J_out, op);
548 else
549 14 lg.dIntegrate_dq(q, v, J_in, SELF, J_out, op);
550 28 return;
551 28 case ARG1:
552 if (dIntegrateOnTheLeft)
553 14 lg.dIntegrate_dv(q, v, SELF, J_in, J_out, op);
554 else
555 14 lg.dIntegrate_dv(q, v, J_in, SELF, J_out, op);
556 28 return;
557 default:
558 return;
559 }
560 }
561 };
562
563 template<
564 typename LieGroupCollection,
565 class Config_t,
566 class Tangent_t,
567 class JacobianIn_t,
568 class JacobianOut_t>
569 14 void dIntegrate(
570 const LieGroupGenericTpl<LieGroupCollection> & lg,
571 const Eigen::MatrixBase<Config_t> & q,
572 const Eigen::MatrixBase<Tangent_t> & v,
573 const Eigen::MatrixBase<JacobianIn_t> & J_in,
574 int self,
575 const Eigen::MatrixBase<JacobianOut_t> & J_out,
576 const ArgumentPosition arg,
577 const AssignmentOperatorType op)
578 {
579 PINOCCHIO_UNUSED_VARIABLE(self);
580
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
14 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, q, nq(lg));
581
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
14 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
582
583 typedef LieGroupDIntegrateProductVisitor<
584 Config_t, Tangent_t, JacobianIn_t, JacobianOut_t, false>
585 Operation;
586
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 Operation::run(
587 14 lg, typename Operation::ArgsType(
588 q.derived(), v.derived(), J_in.derived(),
589 14 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J_out), arg, op));
590 14 }
591
592 template<
593 typename LieGroupCollection,
594 class Config_t,
595 class Tangent_t,
596 class JacobianIn_t,
597 class JacobianOut_t>
598 14 void dIntegrate(
599 const LieGroupGenericTpl<LieGroupCollection> & lg,
600 const Eigen::MatrixBase<Config_t> & q,
601 const Eigen::MatrixBase<Tangent_t> & v,
602 int self,
603 const Eigen::MatrixBase<JacobianIn_t> & J_in,
604 const Eigen::MatrixBase<JacobianOut_t> & J_out,
605 const ArgumentPosition arg,
606 const AssignmentOperatorType op)
607 {
608 PINOCCHIO_UNUSED_VARIABLE(self);
609
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
14 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, q, nq(lg));
610
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
14 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
611
612 typedef LieGroupDIntegrateProductVisitor<Config_t, Tangent_t, JacobianIn_t, JacobianOut_t, true>
613 Operation;
614
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 Operation::run(
615 14 lg, typename Operation::ArgsType(
616 q.derived(), v.derived(), J_in.derived(),
617 14 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J_out), arg, op));
618 14 }
619
620 template<
621 class M1_t,
622 class M2_t,
623 class M3_t,
624 class M4_t,
625 bool dDifferenceOnTheLeft,
626 ArgumentPosition arg>
627 struct LieGroupDDifferenceProductVisitor
628 : visitor::LieGroupVisitorBase<
629 LieGroupDDifferenceProductVisitor<M1_t, M2_t, M3_t, M4_t, dDifferenceOnTheLeft, arg>>
630 {
631 typedef boost::fusion::
632 vector<const M1_t &, const M2_t &, const M3_t &, M4_t &, const AssignmentOperatorType>
633 ArgsType;
634
635 56 LIE_GROUP_VISITOR(LieGroupDDifferenceProductVisitor);
636
637 template<typename LieGroupDerived>
638 56 static void algo(
639 const LieGroupBase<LieGroupDerived> & lg,
640 const M1_t & q0,
641 const M2_t & q1,
642 const M3_t & J_in,
643 M4_t & J_out,
644 const AssignmentOperatorType op)
645 {
646 if (dDifferenceOnTheLeft)
647 28 lg.template dDifference<arg>(q0, q1, SELF, J_in, J_out, op);
648 else
649 28 lg.template dDifference<arg>(q0, q1, J_in, SELF, J_out, op);
650 }
651 };
652
653 template<
654 ArgumentPosition arg,
655 typename LieGroupCollection,
656 class ConfigL_t,
657 class ConfigR_t,
658 class JacobianIn_t,
659 class JacobianOut_t>
660 28 void dDifference(
661 const LieGroupGenericTpl<LieGroupCollection> & lg,
662 const Eigen::MatrixBase<ConfigL_t> & q0,
663 const Eigen::MatrixBase<ConfigR_t> & q1,
664 const Eigen::MatrixBase<JacobianIn_t> & J_in,
665 int self,
666 const Eigen::MatrixBase<JacobianOut_t> & J_out,
667 const AssignmentOperatorType op)
668 {
669 PINOCCHIO_UNUSED_VARIABLE(self);
670
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
28 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
671
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
28 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
672
673 typedef LieGroupDDifferenceProductVisitor<
674 ConfigL_t, ConfigR_t, JacobianIn_t, JacobianOut_t, false, arg>
675 Operation;
676
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
28 Operation::run(
677 28 lg, typename Operation::ArgsType(
678 q0.derived(), q1.derived(), J_in.derived(),
679 28 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J_out), op));
680 28 }
681
682 template<
683 ArgumentPosition arg,
684 typename LieGroupCollection,
685 class ConfigL_t,
686 class ConfigR_t,
687 class JacobianIn_t,
688 class JacobianOut_t>
689 28 void dDifference(
690 const LieGroupGenericTpl<LieGroupCollection> & lg,
691 const Eigen::MatrixBase<ConfigL_t> & q0,
692 const Eigen::MatrixBase<ConfigR_t> & q1,
693 int self,
694 const Eigen::MatrixBase<JacobianIn_t> & J_in,
695 const Eigen::MatrixBase<JacobianOut_t> & J_out,
696 const AssignmentOperatorType op)
697 {
698 PINOCCHIO_UNUSED_VARIABLE(self);
699
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
28 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigL_t, q0, nq(lg));
700
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
28 PINOCCHIO_LG_CHECK_VECTOR_SIZE(ConfigR_t, q1, nq(lg));
701
702 typedef LieGroupDDifferenceProductVisitor<
703 ConfigL_t, ConfigR_t, JacobianIn_t, JacobianOut_t, true, arg>
704 Operation;
705
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
28 Operation::run(
706 28 lg, typename Operation::ArgsType(
707 q0.derived(), q1.derived(), J_in.derived(),
708 28 PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J_out), op));
709 28 }
710
711 template<class M1_t, class M2_t, class M3_t, class M4_t>
712 struct LieGroupDIntegrateTransportVisitor
713 : visitor::LieGroupVisitorBase<LieGroupDIntegrateTransportVisitor<M1_t, M2_t, M3_t, M4_t>>
714 {
715 typedef boost::fusion::vector<
716 const Eigen::MatrixBase<M1_t> &,
717 const Eigen::MatrixBase<M2_t> &,
718 const Eigen::MatrixBase<M3_t> &,
719 const Eigen::MatrixBase<M4_t> &,
720 const ArgumentPosition>
721 ArgsType;
722
723 42 LIE_GROUP_VISITOR(LieGroupDIntegrateTransportVisitor);
724
725 template<typename LieGroupDerived>
726 84 static void algo(
727 const LieGroupBase<LieGroupDerived> & lg,
728 const Eigen::MatrixBase<M1_t> & q,
729 const Eigen::MatrixBase<M2_t> & v,
730 const Eigen::MatrixBase<M3_t> & J_in,
731 const Eigen::MatrixBase<M4_t> & J_out,
732 const ArgumentPosition arg)
733 {
734 84 lg.dIntegrateTransport(q, v, J_in, J_out, arg);
735 }
736 };
737
738 template<class M1_t, class M2_t, class M3_t>
739 struct LieGroupDIntegrateTransportVisitor<M1_t, M2_t, M3_t, void>
740 : visitor::LieGroupVisitorBase<LieGroupDIntegrateTransportVisitor<M1_t, M2_t, M3_t, void>>
741 {
742 typedef boost::fusion::vector<
743 const Eigen::MatrixBase<M1_t> &,
744 const Eigen::MatrixBase<M2_t> &,
745 const Eigen::MatrixBase<M3_t> &,
746 const ArgumentPosition>
747 ArgsType;
748
749 LIE_GROUP_VISITOR(LieGroupDIntegrateTransportVisitor);
750 template<typename LieGroupDerived>
751 static void algo(
752 const LieGroupBase<LieGroupDerived> & lg,
753 const Eigen::MatrixBase<M1_t> & q,
754 const Eigen::MatrixBase<M2_t> & v,
755 const Eigen::MatrixBase<M3_t> & J,
756 const ArgumentPosition arg)
757 {
758 lg.dIntegrateTransport(q, v, J, arg);
759 }
760 };
761
762 template<
763 typename LieGroupCollection,
764 class Config_t,
765 class Tangent_t,
766 class JacobianIn_t,
767 class JacobianOut_t>
768 42 void dIntegrateTransport(
769 const LieGroupGenericTpl<LieGroupCollection> & lg,
770 const Eigen::MatrixBase<Config_t> & q,
771 const Eigen::MatrixBase<Tangent_t> & v,
772 const Eigen::MatrixBase<JacobianIn_t> & J_in,
773 const Eigen::MatrixBase<JacobianOut_t> & J_out,
774 const ArgumentPosition arg)
775 {
776
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
42 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, q, nq(lg));
777
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
42 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
778
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
42 assert(J_in.rows() == nv(lg));
779
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
42 assert(J_out.rows() == nv(lg));
780
781 typedef LieGroupDIntegrateTransportVisitor<Config_t, Tangent_t, JacobianIn_t, JacobianOut_t>
782 Operation;
783
1/2
✓ Branch 2 taken 42 times.
✗ Branch 3 not taken.
42 Operation::run(lg, typename Operation::ArgsType(q, v, J_in, J_out, arg));
784 42 }
785
786 template<typename LieGroupCollection, class Config_t, class Tangent_t, class JacobianOut_t>
787 void dIntegrateTransport(
788 const LieGroupGenericTpl<LieGroupCollection> & lg,
789 const Eigen::MatrixBase<Config_t> & q,
790 const Eigen::MatrixBase<Tangent_t> & v,
791 const Eigen::MatrixBase<JacobianOut_t> & J,
792 const ArgumentPosition arg)
793 {
794 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Config_t, q, nq(lg));
795 PINOCCHIO_LG_CHECK_VECTOR_SIZE(Tangent_t, v, nv(lg));
796 assert(J.rows() == nv(lg));
797
798 typedef LieGroupDIntegrateTransportVisitor<Config_t, Tangent_t, JacobianOut_t, void> Operation;
799 Operation::run(lg, typename Operation::ArgsType(q, v, J, arg));
800 }
801
802 } // namespace pinocchio
803
804 #undef PINOCCHIO_LG_CHECK_VECTOR_SIZE
805
806 #endif // ifndef __pinocchio_lie_group_variant_visitor_hxx__
807