Directory: | ./ |
---|---|
File: | include/pinocchio/multibody/liegroup/cartesian-product-variant.hxx |
Date: | 2025-02-12 21:03:38 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 195 | 211 | 92.4% |
Branches: | 121 | 225 | 53.8% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // | ||
2 | // Copyright (c) 2020 CNRS | ||
3 | // | ||
4 | |||
5 | #ifndef __pinocchio_cartesian_product_variant_hxx__ | ||
6 | #define __pinocchio_cartesian_product_variant_hxx__ | ||
7 | |||
8 | #include "pinocchio/multibody/liegroup/liegroup-variant-visitors.hpp" | ||
9 | |||
10 | namespace pinocchio | ||
11 | { | ||
12 | |||
13 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
14 | 51 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::append( | |
15 | const LieGroupGeneric & lg) | ||
16 | { | ||
17 |
1/2✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
|
51 | liegroups.push_back(lg); |
18 |
1/2✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
|
51 | const Index lg_nq = ::pinocchio::nq(lg); |
19 |
1/2✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
|
51 | lg_nqs.push_back(lg_nq); |
20 | 51 | m_nq += lg_nq; | |
21 |
1/2✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
|
51 | const Index lg_nv = ::pinocchio::nv(lg); |
22 |
1/2✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
|
51 | lg_nvs.push_back(lg_nv); |
23 | 51 | m_nv += lg_nv; | |
24 | |||
25 |
2/2✓ Branch 1 taken 2 times.
✓ Branch 2 taken 49 times.
|
51 | if (liegroups.size() > 1) |
26 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | m_name += " x "; |
27 |
2/4✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 51 times.
✗ Branch 5 not taken.
|
51 | m_name += ::pinocchio::name(lg); |
28 | |||
29 |
1/2✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
|
51 | m_neutral.conservativeResize(m_nq); |
30 |
3/6✓ Branch 1 taken 51 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 51 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 51 times.
✗ Branch 8 not taken.
|
51 | m_neutral.tail(lg_nq) = ::pinocchio::neutral(lg); |
31 | 51 | } | |
32 | |||
33 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
34 | template<class ConfigL_t, class ConfigR_t, class Tangent_t> | ||
35 | void | ||
36 | 30 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::difference_impl( | |
37 | const Eigen::MatrixBase<ConfigL_t> & q0, | ||
38 | const Eigen::MatrixBase<ConfigR_t> & q1, | ||
39 | const Eigen::MatrixBase<Tangent_t> & d) const | ||
40 | { | ||
41 | 30 | Index id_q = 0, id_v = 0; | |
42 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 21 times.
|
64 | for (size_t k = 0; k < liegroups.size(); ++k) |
43 | { | ||
44 | 34 | const Index & nq = lg_nqs[k]; | |
45 | 34 | const Index & nv = lg_nvs[k]; | |
46 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
34 | ::pinocchio::difference( |
47 |
2/4✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
|
34 | liegroups[k], q0.segment(id_q, nq), q1.segment(id_q, nq), |
48 | 34 | PINOCCHIO_EIGEN_CONST_CAST(Tangent_t, d).segment(id_v, nv)); | |
49 | |||
50 | 34 | id_q += nq; | |
51 | 34 | id_v += nv; | |
52 | } | ||
53 | 30 | } | |
54 | |||
55 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
56 | template<ArgumentPosition arg, class ConfigL_t, class ConfigR_t, class JacobianOut_t> | ||
57 | void | ||
58 | 60 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::dDifference_impl( | |
59 | const Eigen::MatrixBase<ConfigL_t> & q0, | ||
60 | const Eigen::MatrixBase<ConfigR_t> & q1, | ||
61 | const Eigen::MatrixBase<JacobianOut_t> & J) const | ||
62 | { | ||
63 | 60 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).setZero(); | |
64 | 60 | Index id_q = 0, id_v = 0; | |
65 |
2/2✓ Branch 1 taken 34 times.
✓ Branch 2 taken 30 times.
|
128 | for (size_t k = 0; k < liegroups.size(); ++k) |
66 | { | ||
67 | 68 | const Index & nq = lg_nqs[k]; | |
68 | 68 | const Index & nv = lg_nvs[k]; | |
69 |
1/2✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
|
68 | ::pinocchio::dDifference( |
70 |
2/4✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
|
68 | liegroups[k], q0.segment(id_q, nq), q1.segment(id_q, nq), |
71 | 68 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).block(id_v, id_v, nv, nv), arg); | |
72 | |||
73 | 68 | id_q += nq; | |
74 | 68 | id_v += nv; | |
75 | } | ||
76 | 60 | } | |
77 | |||
78 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
79 | template< | ||
80 | ArgumentPosition arg, | ||
81 | class ConfigL_t, | ||
82 | class ConfigR_t, | ||
83 | class JacobianIn_t, | ||
84 | class JacobianOut_t> | ||
85 | 48 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
86 | dDifference_product_impl( | ||
87 | const ConfigL_t & q0, | ||
88 | const ConfigR_t & q1, | ||
89 | const JacobianIn_t & Jin, | ||
90 | JacobianOut_t & Jout, | ||
91 | bool dDifferenceOnTheLeft, | ||
92 | const AssignmentOperatorType op) const | ||
93 | { | ||
94 | 48 | Index id_q = 0, id_v = 0; | |
95 |
2/2✓ Branch 1 taken 28 times.
✓ Branch 2 taken 24 times.
|
104 | for (size_t k = 0; k < liegroups.size(); ++k) |
96 | { | ||
97 | 56 | const Index & nq = lg_nqs[k]; | |
98 | 56 | const Index & nv = lg_nvs[k]; | |
99 |
2/2✓ Branch 0 taken 14 times.
✓ Branch 1 taken 14 times.
|
56 | if (dDifferenceOnTheLeft) |
100 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
28 | ::pinocchio::dDifference<arg>( |
101 |
3/6✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
|
28 | liegroups[k], q0.segment(id_q, nq), q1.segment(id_q, nq), SELF, Jin.middleRows(id_v, nv), |
102 | 56 | Jout.middleRows(id_v, nv), op); | |
103 | else | ||
104 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
28 | ::pinocchio::dDifference<arg>( |
105 |
3/6✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
|
28 | liegroups[k], q0.segment(id_q, nq), q1.segment(id_q, nq), Jin.middleCols(id_v, nv), SELF, |
106 | 56 | Jout.middleCols(id_v, nv), op); | |
107 | |||
108 | 56 | id_q += nq; | |
109 | 56 | id_v += nv; | |
110 | } | ||
111 | 48 | } | |
112 | |||
113 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
114 | template<class ConfigIn_t, class Velocity_t, class ConfigOut_t> | ||
115 | void | ||
116 | 42 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::integrate_impl( | |
117 | const Eigen::MatrixBase<ConfigIn_t> & q, | ||
118 | const Eigen::MatrixBase<Velocity_t> & v, | ||
119 | const Eigen::MatrixBase<ConfigOut_t> & qout) const | ||
120 | { | ||
121 | 42 | ConfigOut_t & qout_ = PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t, qout); | |
122 | 42 | Index id_q = 0, id_v = 0; | |
123 |
2/2✓ Branch 1 taken 38 times.
✓ Branch 2 taken 33 times.
|
90 | for (size_t k = 0; k < liegroups.size(); ++k) |
124 | { | ||
125 | 48 | const Index & nq = lg_nqs[k]; | |
126 | 48 | const Index & nv = lg_nvs[k]; | |
127 |
1/2✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
|
48 | ::pinocchio::integrate( |
128 |
2/4✓ Branch 2 taken 38 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 38 times.
✗ Branch 6 not taken.
|
48 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), qout_.segment(id_q, nq)); |
129 | |||
130 | 48 | id_q += nq; | |
131 | 48 | id_v += nv; | |
132 | } | ||
133 | 42 | } | |
134 | |||
135 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
136 | template<class Config_t, class Jacobian_t> | ||
137 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | ||
138 | integrateCoeffWiseJacobian_impl( | ||
139 | const Eigen::MatrixBase<Config_t> & q, const Eigen::MatrixBase<Jacobian_t> & J) const | ||
140 | { | ||
141 | PINOCCHIO_UNUSED_VARIABLE(q); | ||
142 | PINOCCHIO_UNUSED_VARIABLE(J); | ||
143 | // not implemented yet assert(J.rows() == nq() && J.cols() == nv() && "J is not of the | ||
144 | // right dimension"); not implemented yet Jacobian_t & J_ = | ||
145 | // PINOCCHIO_EIGEN_CONST_CAST(Jacobian_t,J); not implemented yet | ||
146 | // J_.topRightCorner(lg1.nq(),lg2.nv()).setZero(); not implemented yet | ||
147 | // J_.bottomLeftCorner(lg2.nq(),lg1.nv()).setZero(); not implemented yet not implemented yet | ||
148 | // lg1.integrateCoeffWiseJacobian(Q1(q), not implemented yet | ||
149 | // J_.topLeftCorner(lg1.nq(),lg1.nv())); not implemented yet | ||
150 | // lg2.integrateCoeffWiseJacobian(Q2(q), J_.bottomRightCorner(lg2.nq(),lg2.nv())); | ||
151 | } | ||
152 | |||
153 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
154 | template<class Config_t, class Tangent_t, class JacobianOut_t> | ||
155 | void | ||
156 | 30 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::dIntegrate_dq_impl( | |
157 | const Eigen::MatrixBase<Config_t> & q, | ||
158 | const Eigen::MatrixBase<Tangent_t> & v, | ||
159 | const Eigen::MatrixBase<JacobianOut_t> & J, | ||
160 | const AssignmentOperatorType op) const | ||
161 | { | ||
162 |
1/2✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
|
30 | if (op == SETTO) |
163 | 30 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).setZero(); | |
164 | 30 | Index id_q = 0, id_v = 0; | |
165 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 21 times.
|
64 | for (size_t k = 0; k < liegroups.size(); ++k) |
166 | { | ||
167 | 34 | const Index & nq = lg_nqs[k]; | |
168 | 34 | const Index & nv = lg_nvs[k]; | |
169 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
34 | ::pinocchio::dIntegrate( |
170 |
2/4✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
|
34 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), |
171 | 34 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).block(id_v, id_v, nv, nv), ARG0, op); | |
172 | |||
173 | 34 | id_q += nq; | |
174 | 34 | id_v += nv; | |
175 | } | ||
176 | 30 | } | |
177 | |||
178 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
179 | template<class Config_t, class Tangent_t, class JacobianOut_t> | ||
180 | void | ||
181 | 30 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::dIntegrate_dv_impl( | |
182 | const Eigen::MatrixBase<Config_t> & q, | ||
183 | const Eigen::MatrixBase<Tangent_t> & v, | ||
184 | const Eigen::MatrixBase<JacobianOut_t> & J, | ||
185 | const AssignmentOperatorType op) const | ||
186 | { | ||
187 |
1/2✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
|
30 | if (op == SETTO) |
188 | 30 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).setZero(); | |
189 | 30 | Index id_q = 0, id_v = 0; | |
190 |
2/2✓ Branch 1 taken 24 times.
✓ Branch 2 taken 21 times.
|
64 | for (size_t k = 0; k < liegroups.size(); ++k) |
191 | { | ||
192 | 34 | const Index & nq = lg_nqs[k]; | |
193 | 34 | const Index & nv = lg_nvs[k]; | |
194 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
34 | ::pinocchio::dIntegrate( |
195 |
2/4✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
|
34 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), |
196 | 34 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).block(id_v, id_v, nv, nv), ARG1, op); | |
197 | |||
198 | 34 | id_q += nq; | |
199 | 34 | id_v += nv; | |
200 | } | ||
201 | 30 | } | |
202 | |||
203 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
204 | template<class Config_t, class Tangent_t, class JacobianIn_t, class JacobianOut_t> | ||
205 | 24 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
206 | dIntegrate_product_impl( | ||
207 | const Config_t & q, | ||
208 | const Tangent_t & v, | ||
209 | const JacobianIn_t & Jin, | ||
210 | JacobianOut_t & Jout, | ||
211 | bool dIntegrateOnTheLeft, | ||
212 | const ArgumentPosition arg, | ||
213 | const AssignmentOperatorType op) const | ||
214 | { | ||
215 | 24 | Index id_q = 0, id_v = 0; | |
216 |
2/2✓ Branch 1 taken 28 times.
✓ Branch 2 taken 24 times.
|
52 | for (size_t k = 0; k < liegroups.size(); ++k) |
217 | { | ||
218 | 28 | const Index & nq = lg_nqs[k]; | |
219 | 28 | const Index & nv = lg_nvs[k]; | |
220 |
2/2✓ Branch 0 taken 14 times.
✓ Branch 1 taken 14 times.
|
28 | if (dIntegrateOnTheLeft) |
221 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | ::pinocchio::dIntegrate( |
222 |
3/6✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
|
14 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), SELF, Jin.middleRows(id_v, nv), |
223 | 28 | Jout.middleRows(id_v, nv), arg, op); | |
224 | else | ||
225 |
1/2✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
|
14 | ::pinocchio::dIntegrate( |
226 |
3/6✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 8 not taken.
|
14 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), Jin.middleCols(id_v, nv), SELF, |
227 | 28 | Jout.middleCols(id_v, nv), arg, op); | |
228 | |||
229 | 28 | id_q += nq; | |
230 | 28 | id_v += nv; | |
231 | } | ||
232 | 24 | } | |
233 | |||
234 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
235 | template<class Config_t, class Tangent_t, class JacobianIn_t, class JacobianOut_t> | ||
236 | 30 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
237 | dIntegrateTransport_dq_impl( | ||
238 | const Eigen::MatrixBase<Config_t> & q, | ||
239 | const Eigen::MatrixBase<Tangent_t> & v, | ||
240 | const Eigen::MatrixBase<JacobianIn_t> & J_in, | ||
241 | const Eigen::MatrixBase<JacobianOut_t> & J_out) const | ||
242 | { | ||
243 | 30 | Index id_q = 0, id_v = 0; | |
244 |
2/2✓ Branch 1 taken 35 times.
✓ Branch 2 taken 30 times.
|
65 | for (size_t k = 0; k < liegroups.size(); ++k) |
245 | { | ||
246 | 35 | const Index & nq = lg_nqs[k]; | |
247 | 35 | const Index & nv = lg_nvs[k]; | |
248 |
1/2✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
|
35 | ::pinocchio::dIntegrateTransport( |
249 |
3/6✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 35 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 35 times.
✗ Branch 8 not taken.
|
35 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), J_in.middleRows(id_v, nv), |
250 | 35 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J_out).middleRows(id_v, nv), ARG0); | |
251 | |||
252 | 35 | id_q += nq; | |
253 | 35 | id_v += nv; | |
254 | } | ||
255 | 30 | } | |
256 | |||
257 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
258 | template<class Config_t, class Tangent_t, class JacobianIn_t, class JacobianOut_t> | ||
259 | 6 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
260 | dIntegrateTransport_dv_impl( | ||
261 | const Eigen::MatrixBase<Config_t> & q, | ||
262 | const Eigen::MatrixBase<Tangent_t> & v, | ||
263 | const Eigen::MatrixBase<JacobianIn_t> & J_in, | ||
264 | const Eigen::MatrixBase<JacobianOut_t> & J_out) const | ||
265 | { | ||
266 | 6 | Index id_q = 0, id_v = 0; | |
267 |
2/2✓ Branch 1 taken 7 times.
✓ Branch 2 taken 6 times.
|
13 | for (size_t k = 0; k < liegroups.size(); ++k) |
268 | { | ||
269 | 7 | const Index & nq = lg_nqs[k]; | |
270 | 7 | const Index & nv = lg_nvs[k]; | |
271 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | ::pinocchio::dIntegrateTransport( |
272 |
3/6✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
|
7 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), J_in.middleRows(id_v, nv), |
273 | 7 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J_out).middleRows(id_v, nv), ARG1); | |
274 | |||
275 | 7 | id_q += nq; | |
276 | 7 | id_v += nv; | |
277 | } | ||
278 | 6 | } | |
279 | |||
280 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
281 | template<class Config_t, class Tangent_t, class JacobianOut_t> | ||
282 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | ||
283 | dIntegrateTransport_dq_impl( | ||
284 | const Eigen::MatrixBase<Config_t> & q, | ||
285 | const Eigen::MatrixBase<Tangent_t> & v, | ||
286 | const Eigen::MatrixBase<JacobianOut_t> & J) const | ||
287 | { | ||
288 | Index id_q = 0, id_v = 0; | ||
289 | for (size_t k = 0; k < liegroups.size(); ++k) | ||
290 | { | ||
291 | const Index & nq = lg_nqs[k]; | ||
292 | const Index & nv = lg_nvs[k]; | ||
293 | ::pinocchio::dIntegrateTransport( | ||
294 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), | ||
295 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).middleRows(id_v, nv), ARG0); | ||
296 | |||
297 | id_q += nq; | ||
298 | id_v += nv; | ||
299 | } | ||
300 | } | ||
301 | |||
302 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
303 | template<class Config_t, class Tangent_t, class JacobianOut_t> | ||
304 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | ||
305 | dIntegrateTransport_dv_impl( | ||
306 | const Eigen::MatrixBase<Config_t> & q, | ||
307 | const Eigen::MatrixBase<Tangent_t> & v, | ||
308 | const Eigen::MatrixBase<JacobianOut_t> & J) const | ||
309 | { | ||
310 | Index id_q = 0, id_v = 0; | ||
311 | for (size_t k = 0; k < liegroups.size(); ++k) | ||
312 | { | ||
313 | const Index & nq = lg_nqs[k]; | ||
314 | const Index & nv = lg_nvs[k]; | ||
315 | ::pinocchio::dIntegrateTransport( | ||
316 | liegroups[k], q.segment(id_q, nq), v.segment(id_v, nv), | ||
317 | PINOCCHIO_EIGEN_CONST_CAST(JacobianOut_t, J).middleRows(id_v, nv), ARG1); | ||
318 | |||
319 | id_q += nq; | ||
320 | id_v += nv; | ||
321 | } | ||
322 | } | ||
323 | |||
324 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
325 | template<class ConfigL_t, class ConfigR_t> | ||
326 | typename CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::Scalar | ||
327 | 36 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
328 | squaredDistance_impl( | ||
329 | const Eigen::MatrixBase<ConfigL_t> & q0, const Eigen::MatrixBase<ConfigR_t> & q1) const | ||
330 | { | ||
331 | 36 | Scalar d2 = Scalar(0); | |
332 | 36 | Index id_q = 0; | |
333 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 2 taken 18 times.
|
76 | for (size_t k = 0; k < liegroups.size(); ++k) |
334 | { | ||
335 | 40 | const Index & nq = lg_nqs[k]; | |
336 |
2/11✗ Branch 1 not taken.
✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 20 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
|
40 | d2 += ::pinocchio::squaredDistance(liegroups[k], q0.segment(id_q, nq), q1.segment(id_q, nq)); |
337 | 40 | id_q += nq; | |
338 | } | ||
339 | 36 | return d2; | |
340 | } | ||
341 | |||
342 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
343 | template<class Config_t> | ||
344 | void | ||
345 | 18 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::normalize_impl( | |
346 | const Eigen::MatrixBase<Config_t> & qout) const | ||
347 | { | ||
348 | 18 | Index id_q = 0; | |
349 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 9 times.
|
38 | for (size_t k = 0; k < liegroups.size(); ++k) |
350 | { | ||
351 | 20 | const Index & nq = lg_nqs[k]; | |
352 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | ::pinocchio::normalize( |
353 | 20 | liegroups[k], PINOCCHIO_EIGEN_CONST_CAST(Config_t, qout).segment(id_q, nq)); | |
354 | 20 | id_q += nq; | |
355 | } | ||
356 | 18 | } | |
357 | |||
358 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
359 | template<class Config_t> | ||
360 | bool | ||
361 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::isNormalized_impl( | ||
362 | const Eigen::MatrixBase<Config_t> & qin, const Scalar & prec) const | ||
363 | { | ||
364 | Index id_q = 0; | ||
365 | for (size_t k = 0; k < liegroups.size(); ++k) | ||
366 | { | ||
367 | const Index nq = lg_nqs[k]; | ||
368 | const bool res_k = ::pinocchio::isNormalized( | ||
369 | liegroups[k], PINOCCHIO_EIGEN_CONST_CAST(Config_t, qin).segment(id_q, nq), prec); | ||
370 | if (!res_k) | ||
371 | return false; | ||
372 | id_q += nq; | ||
373 | } | ||
374 | return true; | ||
375 | } | ||
376 | |||
377 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
378 | template<class Config_t> | ||
379 | 48 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::random_impl( | |
380 | const Eigen::MatrixBase<Config_t> & qout) const | ||
381 | { | ||
382 | 48 | Index id_q = 0; | |
383 |
2/2✓ Branch 1 taken 45 times.
✓ Branch 2 taken 39 times.
|
103 | for (size_t k = 0; k < liegroups.size(); ++k) |
384 | { | ||
385 | 55 | const Index & nq = lg_nqs[k]; | |
386 |
1/2✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
|
55 | ::pinocchio::random( |
387 | 55 | liegroups[k], PINOCCHIO_EIGEN_CONST_CAST(Config_t, qout).segment(id_q, nq)); | |
388 | 55 | id_q += nq; | |
389 | } | ||
390 | 48 | } | |
391 | |||
392 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
393 | template<class ConfigL_t, class ConfigR_t, class ConfigOut_t> | ||
394 | 18 | void CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
395 | randomConfiguration_impl( | ||
396 | const Eigen::MatrixBase<ConfigL_t> & lower, | ||
397 | const Eigen::MatrixBase<ConfigR_t> & upper, | ||
398 | const Eigen::MatrixBase<ConfigOut_t> & qout) const | ||
399 | { | ||
400 | 18 | Index id_q = 0; | |
401 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 9 times.
|
38 | for (size_t k = 0; k < liegroups.size(); ++k) |
402 | { | ||
403 | 20 | const Index & nq = lg_nqs[k]; | |
404 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | ::pinocchio::randomConfiguration( |
405 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
20 | liegroups[k], lower.segment(id_q, nq), upper.segment(id_q, nq), |
406 | 20 | PINOCCHIO_EIGEN_CONST_CAST(ConfigOut_t, qout).segment(id_q, nq)); | |
407 | |||
408 | 20 | id_q += nq; | |
409 | } | ||
410 | 18 | } | |
411 | |||
412 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
413 | template<class ConfigL_t, class ConfigR_t> | ||
414 | 18 | bool CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>:: | |
415 | isSameConfiguration_impl( | ||
416 | const Eigen::MatrixBase<ConfigL_t> & q0, | ||
417 | const Eigen::MatrixBase<ConfigR_t> & q1, | ||
418 | const Scalar & prec) const | ||
419 | { | ||
420 | 18 | Index id_q = 0; | |
421 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 9 times.
|
38 | for (size_t k = 0; k < liegroups.size(); ++k) |
422 | { | ||
423 | 20 | const Index & nq = lg_nqs[k]; | |
424 |
1/2✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
20 | if (!::pinocchio::isSameConfiguration( |
425 |
2/4✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
|
40 | liegroups[k], q0.segment(id_q, nq), q1.segment(id_q, nq), prec)) |
426 | ✗ | return false; | |
427 | |||
428 | 20 | id_q += nq; | |
429 | } | ||
430 | 18 | return true; | |
431 | } | ||
432 | |||
433 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
434 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl> | ||
435 | 5 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::operator*( | |
436 | const CartesianProductOperationVariantTpl & other) const | ||
437 | { | ||
438 | 5 | CartesianProductOperationVariantTpl res; | |
439 | |||
440 |
1/2✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
|
5 | res.liegroups.reserve(liegroups.size() + other.liegroups.size()); |
441 |
1/2✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | res.liegroups.insert(res.liegroups.end(), liegroups.begin(), liegroups.end()); |
442 |
1/2✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | res.liegroups.insert(res.liegroups.end(), other.liegroups.begin(), other.liegroups.end()); |
443 | |||
444 |
1/2✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
|
5 | res.lg_nqs.reserve(lg_nqs.size() + other.lg_nqs.size()); |
445 |
1/2✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | res.lg_nqs.insert(res.lg_nqs.end(), lg_nqs.begin(), lg_nqs.end()); |
446 |
1/2✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | res.lg_nqs.insert(res.lg_nqs.end(), other.lg_nqs.begin(), other.lg_nqs.end()); |
447 | |||
448 |
1/2✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
|
5 | res.lg_nvs.reserve(lg_nvs.size() + other.lg_nvs.size()); |
449 |
1/2✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | res.lg_nvs.insert(res.lg_nvs.end(), lg_nvs.begin(), lg_nvs.end()); |
450 |
1/2✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
|
5 | res.lg_nvs.insert(res.lg_nvs.end(), other.lg_nvs.begin(), other.lg_nvs.end()); |
451 | |||
452 | 5 | res.m_nq = m_nq + other.m_nq; | |
453 | 5 | res.m_nv = m_nv + other.m_nv; | |
454 | |||
455 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | if (liegroups.size() > 0) |
456 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | res.m_name = m_name; |
457 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | if (other.liegroups.size() > 0) |
458 | { | ||
459 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | if (liegroups.size() > 0) |
460 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | res.m_name += " x "; |
461 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | res.m_name += other.m_name; |
462 | } | ||
463 | |||
464 |
1/2✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 | res.m_neutral.resize(res.m_nq); |
465 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | res.m_neutral.head(m_nq) = m_neutral; |
466 |
2/4✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
|
5 | res.m_neutral.tail(other.m_nq) = other.m_neutral; |
467 | |||
468 | 5 | return res; | |
469 | } | ||
470 | |||
471 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
472 | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl> & | ||
473 | ✗ | CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::operator*=( | |
474 | const CartesianProductOperationVariantTpl & other) | ||
475 | { | ||
476 | ✗ | liegroups.insert(liegroups.end(), other.liegroups.begin(), other.liegroups.end()); | |
477 | |||
478 | ✗ | lg_nqs.insert(lg_nqs.end(), other.lg_nqs.begin(), other.lg_nqs.end()); | |
479 | ✗ | lg_nvs.insert(lg_nvs.end(), other.lg_nvs.begin(), other.lg_nvs.end()); | |
480 | |||
481 | ✗ | m_nq += other.m_nq; | |
482 | ✗ | m_nv += other.m_nv; | |
483 | |||
484 | ✗ | if (other.liegroups.size() > 0) | |
485 | { | ||
486 | ✗ | if (liegroups.size()) | |
487 | ✗ | m_name += " x "; | |
488 | ✗ | m_name += other.m_name; | |
489 | } | ||
490 | |||
491 | ✗ | m_neutral.conservativeResize(m_nq); | |
492 | ✗ | m_neutral.tail(other.m_nq) = other.m_neutral; | |
493 | |||
494 | ✗ | return *this; | |
495 | } | ||
496 | |||
497 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
498 | 9 | bool CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::isEqual_impl( | |
499 | const CartesianProductOperationVariantTpl & other) const | ||
500 | { | ||
501 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
|
9 | if (liegroups.size() != other.liegroups.size()) |
502 | ✗ | return false; | |
503 |
2/2✓ Branch 1 taken 10 times.
✓ Branch 2 taken 9 times.
|
19 | for (size_t k = 0; k < liegroups.size(); ++k) |
504 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
|
10 | if (liegroups[k].isDifferent_impl(other.liegroups[k])) |
505 | ✗ | return false; | |
506 | 9 | return true; | |
507 | } | ||
508 | |||
509 | template<typename _Scalar, int _Options, template<typename, int> class LieGroupCollectionTpl> | ||
510 | template<typename LieGroup1, typename LieGroup2> | ||
511 | bool CartesianProductOperationVariantTpl<_Scalar, _Options, LieGroupCollectionTpl>::isEqual( | ||
512 | const CartesianProductOperation<LieGroup1, LieGroup2> & other) const | ||
513 | { | ||
514 | if (liegroups.size() != 2) | ||
515 | return false; | ||
516 | if (liegroups[0].isDifferent_impl(LieGroupGeneric(other.lg1))) | ||
517 | return false; | ||
518 | if (liegroups[1].isDifferent_impl(LieGroupGeneric(other.lg2))) | ||
519 | return false; | ||
520 | return true; | ||
521 | } | ||
522 | |||
523 | } // namespace pinocchio | ||
524 | |||
525 | #endif // ifndef __pinocchio_cartesian_product_variant_hxx__ | ||
526 |