Directory: | ./ |
---|---|
File: | include/pinocchio/algorithm/cholesky.hxx |
Date: | 2025-02-12 21:03:38 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 172 | 180 | 95.6% |
Branches: | 134 | 503 | 26.6% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | // | ||
2 | // Copyright (c) 2015-2020 CNRS INRIA | ||
3 | // | ||
4 | |||
5 | #ifndef __pinocchio_cholesky_hxx__ | ||
6 | #define __pinocchio_cholesky_hxx__ | ||
7 | |||
8 | #include "pinocchio/algorithm/check.hpp" | ||
9 | |||
10 | /// @cond DEV | ||
11 | |||
12 | namespace pinocchio | ||
13 | { | ||
14 | namespace cholesky | ||
15 | { | ||
16 | |||
17 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
18 | 248 | inline const typename DataTpl<Scalar, Options, JointCollectionTpl>::MatrixXs & decompose( | |
19 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
20 | DataTpl<Scalar, Options, JointCollectionTpl> & data) | ||
21 | { | ||
22 | /* | ||
23 | * D = zeros(n,1); | ||
24 | * U = eye(n); | ||
25 | * for j=n:-1:1 | ||
26 | * subtree = j+1:tree(j); | ||
27 | * D(j) = M(j,j) - U(j,subtree)*diag(D(subtree))*U(j,subtree)'; | ||
28 | * i=parent(j); | ||
29 | * while i>0 | ||
30 | * U(i,j) = (M(i,j) - U(i,subtree)*diag(D(subtree))*U(j,subtree)') / D(j); | ||
31 | * i=parent(i); | ||
32 | * end | ||
33 | * end | ||
34 | */ | ||
35 | PINOCCHIO_UNUSED_VARIABLE(model); | ||
36 |
1/2✓ Branch 1 taken 248 times.
✗ Branch 2 not taken.
|
248 | assert(model.check(data) && "data is not consistent with model."); |
37 | |||
38 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
39 | |||
40 | 248 | const typename Data::MatrixXs & M = data.M; | |
41 | 248 | typename Data::MatrixXs & U = data.U; | |
42 | 248 | typename Data::VectorXs & D = data.D; | |
43 | 248 | typename Data::VectorXs & Dinv = data.Dinv; | |
44 | |||
45 |
2/2✓ Branch 0 taken 7922 times.
✓ Branch 1 taken 248 times.
|
8170 | for (int j = model.nv - 1; j >= 0; --j) |
46 | { | ||
47 | 7922 | const int NVT = data.nvSubtree_fromRow[(size_t)j] - 1; | |
48 |
1/2✓ Branch 1 taken 7922 times.
✗ Branch 2 not taken.
|
7922 | typename Data::VectorXs::SegmentReturnType DUt = data.tmp.head(NVT); |
49 |
2/2✓ Branch 0 taken 6930 times.
✓ Branch 1 taken 992 times.
|
7922 | if (NVT) |
50 |
3/6✓ Branch 1 taken 6930 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6930 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6930 times.
✗ Branch 8 not taken.
|
6930 | DUt.noalias() = |
51 |
4/8✓ Branch 1 taken 6930 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6930 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6930 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6930 times.
✗ Branch 11 not taken.
|
13860 | U.row(j).segment(j + 1, NVT).transpose().cwiseProduct(D.segment(j + 1, NVT)); |
52 | |||
53 |
5/14✓ Branch 1 taken 7922 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7922 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7922 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 7922 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 7922 times.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
7922 | D[j] = M(j, j) - U.row(j).segment(j + 1, NVT).dot(DUt); |
54 |
2/10✓ Branch 1 taken 7922 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7922 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
|
7922 | Dinv[j] = Scalar(1) / D[j]; |
55 |
2/2✓ Branch 1 taken 63331 times.
✓ Branch 2 taken 7922 times.
|
71253 | for (int _i = data.parents_fromRow[(size_t)j]; _i >= 0; |
56 | 63331 | _i = data.parents_fromRow[(size_t)_i]) | |
57 |
6/18✓ Branch 1 taken 63331 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 63331 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 63331 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 63331 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 63331 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 63331 times.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
63331 | U(_i, j) = (M(_i, j) - U.row(_i).segment(j + 1, NVT).dot(DUt)) * Dinv[j]; |
58 | } | ||
59 | |||
60 | 248 | return data.U; | |
61 | } | ||
62 | |||
63 | namespace internal | ||
64 | { | ||
65 | template<typename Mat, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
66 | struct Uv | ||
67 | { | ||
68 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
69 | 1 | static void run( | |
70 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
71 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
72 | const Eigen::MatrixBase<Mat> & m) | ||
73 | { | ||
74 | 1 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
75 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 2 taken 1 times.
|
21 | for (int k = 0; k < m_.cols(); ++k) |
76 |
1/2✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
|
20 | cholesky::Uv(model, data, m_.col(k)); |
77 | 1 | } | |
78 | }; | ||
79 | |||
80 | template<typename Mat> | ||
81 | struct Uv<Mat, 1> | ||
82 | { | ||
83 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
84 | 25 | static void run( | |
85 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
86 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
87 | const Eigen::MatrixBase<Mat> & v) | ||
88 | { | ||
89 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
90 | |||
91 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
92 | PINOCCHIO_UNUSED_VARIABLE(model); | ||
93 |
1/2✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
|
25 | assert(model.check(data) && "data is not consistent with model."); |
94 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 25 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
25 | PINOCCHIO_CHECK_ARGUMENT_SIZE(v.size(), model.nv); |
95 | |||
96 | 25 | Mat & v_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, v); | |
97 | |||
98 | 25 | const typename Data::MatrixXs & U = data.U; | |
99 | 25 | const std::vector<int> & nvt = data.nvSubtree_fromRow; | |
100 | |||
101 |
2/2✓ Branch 0 taken 775 times.
✓ Branch 1 taken 25 times.
|
800 | for (int k = 0; k < model.nv - 1; ++k) // You can stop one step before nv |
102 |
4/8✓ Branch 1 taken 775 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 775 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 775 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 775 times.
✗ Branch 12 not taken.
|
1550 | v_.row(k) += U.row(k).segment(k + 1, nvt[(size_t)k] - 1) |
103 |
1/2✓ Branch 3 taken 775 times.
✗ Branch 4 not taken.
|
2325 | * v_.middleRows(k + 1, nvt[(size_t)k] - 1); |
104 | 25 | } | |
105 | }; | ||
106 | |||
107 | } // namespace internal | ||
108 | |||
109 | /* Compute U*v. | ||
110 | * Nota: there is no smart way of doing U*D*v, so it is not proposed. */ | ||
111 | template< | ||
112 | typename Scalar, | ||
113 | int Options, | ||
114 | template<typename, int> class JointCollectionTpl, | ||
115 | typename Mat> | ||
116 | 47 | Mat & Uv( | |
117 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
118 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
119 | const Eigen::MatrixBase<Mat> & m) | ||
120 | { | ||
121 | 47 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
122 | 47 | internal::Uv<Mat, Mat::ColsAtCompileTime>::run(model, data, m_); | |
123 | 47 | return m_.derived(); | |
124 | } | ||
125 | |||
126 | namespace internal | ||
127 | { | ||
128 | template<typename Mat, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
129 | struct Utv | ||
130 | { | ||
131 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
132 | 1 | static void run( | |
133 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
134 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
135 | const Eigen::MatrixBase<Mat> & m) | ||
136 | { | ||
137 | 1 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
138 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 2 taken 1 times.
|
21 | for (int k = 0; k < m_.cols(); ++k) |
139 |
1/2✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
|
20 | cholesky::Utv(model, data, m_.col(k)); |
140 | 1 | } | |
141 | }; | ||
142 | |||
143 | template<typename Mat> | ||
144 | struct Utv<Mat, 1> | ||
145 | { | ||
146 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
147 | 24 | static void run( | |
148 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
149 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
150 | const Eigen::MatrixBase<Mat> & v) | ||
151 | { | ||
152 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
153 | |||
154 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
155 | |||
156 | PINOCCHIO_UNUSED_VARIABLE(model); | ||
157 |
1/2✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
|
24 | assert(model.check(data) && "data is not consistent with model."); |
158 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 24 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
24 | PINOCCHIO_CHECK_ARGUMENT_SIZE(v.size(), model.nv); |
159 | 24 | Mat & v_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, v); | |
160 | |||
161 | 24 | const typename Data::MatrixXs & U = data.U; | |
162 | 24 | const std::vector<int> & nvt = data.nvSubtree_fromRow; | |
163 | |||
164 |
2/2✓ Branch 0 taken 744 times.
✓ Branch 1 taken 24 times.
|
768 | for (int k = model.nv - 2; k >= 0; --k) // You can start from nv-2 (no child in nv-1) |
165 |
3/6✓ Branch 1 taken 744 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 744 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 744 times.
✗ Branch 9 not taken.
|
744 | v_.segment(k + 1, nvt[(size_t)k] - 1) += |
166 |
2/4✓ Branch 4 taken 744 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 744 times.
✗ Branch 8 not taken.
|
1488 | U.row(k).segment(k + 1, nvt[(size_t)k] - 1).transpose() * v_[k]; |
167 | 24 | } | |
168 | }; | ||
169 | |||
170 | } // namespace internal | ||
171 | |||
172 | /* Compute U'*v */ | ||
173 | template< | ||
174 | typename Scalar, | ||
175 | int Options, | ||
176 | template<typename, int> class JointCollectionTpl, | ||
177 | typename Mat> | ||
178 | 46 | Mat & Utv( | |
179 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
180 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
181 | const Eigen::MatrixBase<Mat> & m) | ||
182 | { | ||
183 | 46 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
184 | 46 | internal::Utv<Mat, Mat::ColsAtCompileTime>::run(model, data, m_); | |
185 | 46 | return m_.derived(); | |
186 | } | ||
187 | |||
188 | namespace internal | ||
189 | { | ||
190 | template<typename Mat, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
191 | struct Uiv | ||
192 | { | ||
193 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
194 | 240 | static void run( | |
195 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
196 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
197 | const Eigen::MatrixBase<Mat> & m) | ||
198 | { | ||
199 | 240 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
200 |
2/2✓ Branch 1 taken 1577 times.
✓ Branch 2 taken 240 times.
|
1817 | for (int k = 0; k < m_.cols(); ++k) |
201 |
1/2✓ Branch 2 taken 1577 times.
✗ Branch 3 not taken.
|
1577 | cholesky::Uiv(model, data, m_.col(k)); |
202 | 240 | } | |
203 | }; | ||
204 | |||
205 | template<typename Mat> | ||
206 | struct Uiv<Mat, 1> | ||
207 | { | ||
208 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
209 | 2489 | static void run( | |
210 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
211 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
212 | const Eigen::MatrixBase<Mat> & v) | ||
213 | { | ||
214 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
215 | |||
216 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
217 |
1/2✓ Branch 1 taken 2319 times.
✗ Branch 2 not taken.
|
2489 | assert(model.check(data) && "data is not consistent with model."); |
218 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 2319 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
2489 | PINOCCHIO_CHECK_ARGUMENT_SIZE(v.size(), model.nv); |
219 | 2489 | Mat & v_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, v); | |
220 | |||
221 | 2489 | const typename Data::MatrixXs & U = data.U; | |
222 | 2489 | const std::vector<int> & nvt = data.nvSubtree_fromRow; | |
223 | |||
224 |
2/2✓ Branch 0 taken 71693 times.
✓ Branch 1 taken 2319 times.
|
79424 | for (int k = model.nv - 2; k >= 0; --k) // You can start from nv-2 (no child in nv-1) |
225 |
0/6✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
76935 | v_[k] -= U.row(k) |
226 |
1/2✓ Branch 2 taken 71693 times.
✗ Branch 3 not taken.
|
76935 | .segment(k + 1, nvt[(size_t)k] - 1) |
227 |
3/6✓ Branch 2 taken 71693 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 71693 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 71693 times.
✗ Branch 9 not taken.
|
76935 | .dot(v_.segment(k + 1, nvt[(size_t)k] - 1)); |
228 | 2489 | } | |
229 | }; | ||
230 | |||
231 | } // namespace internal | ||
232 | |||
233 | /* Compute U^{-1}*v | ||
234 | * Nota: there is no efficient way to compute D^{-1}U^{-1}v | ||
235 | * in a single loop, so algorithm is not proposed.*/ | ||
236 | template< | ||
237 | typename Scalar, | ||
238 | int Options, | ||
239 | template<typename, int> class JointCollectionTpl, | ||
240 | typename Mat> | ||
241 | 4546 | Mat & Uiv( | |
242 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
243 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
244 | const Eigen::MatrixBase<Mat> & m) | ||
245 | { | ||
246 | 4546 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
247 | 4546 | internal::Uiv<Mat, Mat::ColsAtCompileTime>::run(model, data, m_); | |
248 | 4546 | return m_.derived(); | |
249 | } | ||
250 | |||
251 | namespace internal | ||
252 | { | ||
253 | template<typename Mat, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
254 | struct Utiv | ||
255 | { | ||
256 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
257 | 1 | static void run( | |
258 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
259 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
260 | const Eigen::MatrixBase<Mat> & m) | ||
261 | { | ||
262 | 1 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
263 |
2/2✓ Branch 1 taken 20 times.
✓ Branch 2 taken 1 times.
|
21 | for (int k = 0; k < m_.cols(); ++k) |
264 |
1/2✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
|
20 | cholesky::Utiv(model, data, m_.col(k)); |
265 | 1 | } | |
266 | }; | ||
267 | |||
268 | template<typename Mat> | ||
269 | struct Utiv<Mat, 1> | ||
270 | { | ||
271 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
272 | 931 | static void run( | |
273 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
274 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
275 | const Eigen::MatrixBase<Mat> & v) | ||
276 | { | ||
277 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
278 | |||
279 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
280 |
1/2✓ Branch 1 taken 761 times.
✗ Branch 2 not taken.
|
931 | assert(model.check(data) && "data is not consistent with model."); |
281 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 761 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
931 | PINOCCHIO_CHECK_ARGUMENT_SIZE(v.size(), model.nv); |
282 | 931 | Mat & v_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, v); | |
283 | |||
284 | 931 | const typename Data::MatrixXs & U = data.U; | |
285 | 931 | const std::vector<int> & nvt = data.nvSubtree_fromRow; | |
286 | |||
287 |
2/2✓ Branch 0 taken 23563 times.
✓ Branch 1 taken 761 times.
|
29736 | for (int k = 0; k < model.nv - 1; ++k) // You can stop one step before nv. |
288 |
3/6✓ Branch 1 taken 23563 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 23563 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 23563 times.
✗ Branch 9 not taken.
|
28805 | v_.segment(k + 1, nvt[(size_t)k] - 1) -= |
289 |
2/4✓ Branch 4 taken 23563 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 23563 times.
✗ Branch 8 not taken.
|
57610 | U.row(k).segment(k + 1, nvt[(size_t)k] - 1).transpose() * v_[k]; |
290 | 931 | } | |
291 | }; | ||
292 | |||
293 | } // namespace internal | ||
294 | |||
295 | template< | ||
296 | typename Scalar, | ||
297 | int Options, | ||
298 | template<typename, int> class JointCollectionTpl, | ||
299 | typename Mat> | ||
300 | 953 | Mat & Utiv( | |
301 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
302 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
303 | const Eigen::MatrixBase<Mat> & m) | ||
304 | { | ||
305 | 953 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
306 | 953 | internal::Utiv<Mat, Mat::ColsAtCompileTime>::run(model, data, m_); | |
307 | 953 | return m_.derived(); | |
308 | } | ||
309 | |||
310 | namespace internal | ||
311 | { | ||
312 | template<typename Mat, typename MatRes, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
313 | struct Mv | ||
314 | { | ||
315 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
316 | ✗ | static void run( | |
317 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
318 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
319 | const Eigen::MatrixBase<Mat> & min, | ||
320 | const Eigen::MatrixBase<MatRes> & mout) | ||
321 | { | ||
322 | ✗ | MatRes & mout_ = PINOCCHIO_EIGEN_CONST_CAST(MatRes, mout); | |
323 | ✗ | for (int k = 0; k < min.cols(); ++k) | |
324 | ✗ | cholesky::Mv(model, data, min.col(k), mout_.col(k)); | |
325 | } | ||
326 | }; | ||
327 | |||
328 | template<typename Mat, typename MatRes> | ||
329 | struct Mv<Mat, MatRes, 1> | ||
330 | { | ||
331 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
332 | 2 | static void run( | |
333 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
334 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
335 | const Eigen::MatrixBase<Mat> & vin, | ||
336 | const Eigen::MatrixBase<MatRes> & vout) | ||
337 | { | ||
338 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
339 | |||
340 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
341 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(MatRes) | ||
342 | |||
343 | PINOCCHIO_UNUSED_VARIABLE(model); | ||
344 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | assert(model.check(data) && "data is not consistent with model."); |
345 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
2 | PINOCCHIO_CHECK_ARGUMENT_SIZE(vin.size(), model.nv); |
346 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
2 | PINOCCHIO_CHECK_ARGUMENT_SIZE(vout.size(), model.nv); |
347 | |||
348 | 2 | MatRes & vout_ = PINOCCHIO_EIGEN_CONST_CAST(MatRes, vout); | |
349 | |||
350 | 2 | const typename Data::MatrixXs & M = data.M; | |
351 | 2 | const std::vector<int> & nvt = data.nvSubtree_fromRow; | |
352 | |||
353 |
2/2✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2 times.
|
66 | for (int k = model.nv - 1; k >= 0; --k) |
354 | { | ||
355 |
5/10✓ Branch 3 taken 64 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 64 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 64 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 64 times.
✗ Branch 17 not taken.
|
64 | vout_[k] = M.row(k).segment(k, nvt[(size_t)k]) * vin.segment(k, nvt[(size_t)k]); |
356 |
3/6✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 64 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 64 times.
✗ Branch 9 not taken.
|
64 | vout_.segment(k + 1, nvt[(size_t)k] - 1) += |
357 |
2/9✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 64 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
|
128 | M.row(k).segment(k + 1, nvt[(size_t)k] - 1).transpose() * vin[k]; |
358 | } | ||
359 | 2 | } | |
360 | }; | ||
361 | |||
362 | } // namespace internal | ||
363 | |||
364 | template< | ||
365 | typename Scalar, | ||
366 | int Options, | ||
367 | template<typename, int> class JointCollectionTpl, | ||
368 | typename Mat, | ||
369 | typename MatRes> | ||
370 | 2 | MatRes & Mv( | |
371 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
372 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
373 | const Eigen::MatrixBase<Mat> & min, | ||
374 | const Eigen::MatrixBase<MatRes> & mout) | ||
375 | { | ||
376 | 2 | MatRes & mout_ = PINOCCHIO_EIGEN_CONST_CAST(MatRes, mout); | |
377 | 2 | internal::Mv<Mat, MatRes, Mat::ColsAtCompileTime>::run(model, data, min.derived(), mout_); | |
378 | 2 | return mout_.derived(); | |
379 | } | ||
380 | |||
381 | template< | ||
382 | typename Scalar, | ||
383 | int Options, | ||
384 | template<typename, int> class JointCollectionTpl, | ||
385 | typename Mat> | ||
386 | 2 | typename PINOCCHIO_EIGEN_PLAIN_TYPE(Mat) Mv( | |
387 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
388 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
389 | const Eigen::MatrixBase<Mat> & min) | ||
390 | { | ||
391 | typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Mat) ReturnType; | ||
392 |
1/2✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
2 | ReturnType res(model.nv, min.cols()); |
393 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | return Mv(model, data, min, res); |
394 | 2 | } | |
395 | |||
396 | namespace internal | ||
397 | { | ||
398 | template<typename Mat, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
399 | struct UDUtv | ||
400 | { | ||
401 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
402 | ✗ | static void run( | |
403 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
404 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
405 | const Eigen::MatrixBase<Mat> & m) | ||
406 | { | ||
407 | ✗ | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
408 | ✗ | for (int k = 0; k < m_.cols(); ++k) | |
409 | ✗ | cholesky::UDUtv(model, data, m_.col(k)); | |
410 | } | ||
411 | }; | ||
412 | |||
413 | template<typename Mat> | ||
414 | struct UDUtv<Mat, 1> | ||
415 | { | ||
416 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
417 | 2 | static void run( | |
418 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
419 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
420 | const Eigen::MatrixBase<Mat> & v) | ||
421 | { | ||
422 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
423 | |||
424 |
1/2✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
|
2 | assert(model.check(data) && "data is not consistent with model."); |
425 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
2 | PINOCCHIO_CHECK_ARGUMENT_SIZE(v.size(), model.nv); |
426 | |||
427 | 2 | Mat & v_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, v); | |
428 | |||
429 | 2 | cholesky::Utv(model, data, v_); | |
430 |
2/4✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
|
2 | v_.array() *= data.D.array(); |
431 | 2 | cholesky::Uv(model, data, v_); | |
432 | 2 | } | |
433 | }; | ||
434 | |||
435 | } // namespace internal | ||
436 | |||
437 | template< | ||
438 | typename Scalar, | ||
439 | int Options, | ||
440 | template<typename, int> class JointCollectionTpl, | ||
441 | typename Mat> | ||
442 | 2 | Mat & UDUtv( | |
443 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
444 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
445 | const Eigen::MatrixBase<Mat> & m) | ||
446 | { | ||
447 | 2 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
448 | |||
449 | 2 | internal::UDUtv<Mat>::run(model, data, m_); | |
450 | 2 | return m_; | |
451 | } | ||
452 | |||
453 | namespace internal | ||
454 | { | ||
455 | template<typename Mat, int ColsAtCompileTime = Mat::ColsAtCompileTime> | ||
456 | struct solve | ||
457 | { | ||
458 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
459 | 7 | static void run( | |
460 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
461 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
462 | const Eigen::MatrixBase<Mat> & m) | ||
463 | { | ||
464 | 7 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
465 |
2/2✓ Branch 1 taken 224 times.
✓ Branch 2 taken 7 times.
|
231 | for (int k = 0; k < m_.cols(); ++k) |
466 |
1/2✓ Branch 2 taken 224 times.
✗ Branch 3 not taken.
|
224 | cholesky::solve(model, data, m_.col(k)); |
467 | 7 | } | |
468 | }; | ||
469 | |||
470 | template<typename Mat> | ||
471 | struct solve<Mat, 1> | ||
472 | { | ||
473 | template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl> | ||
474 | 877 | static void run( | |
475 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
476 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
477 | const Eigen::MatrixBase<Mat> & v) | ||
478 | { | ||
479 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(Mat) | ||
480 | |||
481 |
1/2✓ Branch 1 taken 707 times.
✗ Branch 2 not taken.
|
877 | assert(model.check(data) && "data is not consistent with model."); |
482 | |||
483 | 877 | Mat & v_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, v); | |
484 | |||
485 | 877 | cholesky::Uiv(model, data, v_); | |
486 |
2/4✓ Branch 2 taken 707 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 707 times.
✗ Branch 6 not taken.
|
877 | v_.array() *= data.Dinv.array(); |
487 | 877 | cholesky::Utiv(model, data, v_); | |
488 | 877 | } | |
489 | }; | ||
490 | |||
491 | } // namespace internal | ||
492 | |||
493 | template< | ||
494 | typename Scalar, | ||
495 | int Options, | ||
496 | template<typename, int> class JointCollectionTpl, | ||
497 | typename Mat> | ||
498 | 714 | Mat & solve( | |
499 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
500 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
501 | const Eigen::MatrixBase<Mat> & m) | ||
502 | { | ||
503 | 714 | Mat & m_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, m); | |
504 | 714 | internal::solve<Mat, Mat::ColsAtCompileTime>::run(model, data, m_); | |
505 | 714 | return m_; | |
506 | } | ||
507 | |||
508 | namespace internal | ||
509 | { | ||
510 | template< | ||
511 | typename Scalar, | ||
512 | int Options, | ||
513 | template<typename, int> class JointCollectionTpl, | ||
514 | typename VectorLike> | ||
515 | 192 | VectorLike & Miunit( | |
516 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
517 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
518 | const int col, | ||
519 | const Eigen::MatrixBase<VectorLike> & v) | ||
520 | { | ||
521 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorLike); | ||
522 | |||
523 | PINOCCHIO_UNUSED_VARIABLE(model); | ||
524 |
1/2✓ Branch 1 taken 128 times.
✗ Branch 2 not taken.
|
192 | assert(model.check(data) && "data is not consistent with model."); |
525 |
2/6✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 128 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
192 | PINOCCHIO_CHECK_INPUT_ARGUMENT(col < model.nv && col >= 0); |
526 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 128 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
192 | PINOCCHIO_CHECK_ARGUMENT_SIZE(v.size(), model.nv); |
527 | |||
528 | typedef DataTpl<Scalar, Options, JointCollectionTpl> Data; | ||
529 | |||
530 | 192 | const typename Data::MatrixXs & U = data.U; | |
531 | 192 | const std::vector<int> & nvt = data.nvSubtree_fromRow; | |
532 | 192 | VectorLike & v_ = PINOCCHIO_EIGEN_CONST_CAST(VectorLike, v); | |
533 | |||
534 |
0/4✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
192 | v_[col] = (typename VectorLike::Scalar)1; |
535 | 192 | const int last_col = | |
536 | 192 | std::min<int>(col - 1, model.nv - 2); // You can start from nv-2 (no child in nv-1) | |
537 |
1/2✓ Branch 2 taken 128 times.
✗ Branch 3 not taken.
|
192 | v_.tail(model.nv - col - 1).setZero(); |
538 |
2/2✓ Branch 0 taken 1984 times.
✓ Branch 1 taken 128 times.
|
3168 | for (int k = last_col; k >= 0; --k) |
539 | { | ||
540 | 2976 | const int nvt_max = std::min<int>(col, nvt[(size_t)k] - 1); | |
541 |
4/12✓ Branch 2 taken 1984 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1984 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1984 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1984 times.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
2976 | v_[k] = -U.row(k).segment(k + 1, nvt_max).dot(v_.segment(k + 1, nvt_max)); |
542 | } | ||
543 | |||
544 |
4/8✓ Branch 2 taken 128 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 128 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 128 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 128 times.
✗ Branch 12 not taken.
|
192 | v_.head(col + 1).array() *= data.Dinv.head(col + 1).array(); |
545 | |||
546 |
2/2✓ Branch 0 taken 2112 times.
✓ Branch 1 taken 128 times.
|
3360 | for (int k = 0; k < col + 1; ++k) |
547 | { | ||
548 | 3168 | const int nvt_max = nvt[(size_t)k] - 1; | |
549 |
5/10✓ Branch 3 taken 2112 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2112 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2112 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 2112 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 2112 times.
✗ Branch 16 not taken.
|
3168 | v_.segment(k + 1, nvt_max) -= U.row(k).segment(k + 1, nvt_max).transpose() * v_[k]; |
550 | } | ||
551 | |||
552 | 192 | return v_; | |
553 | } | ||
554 | } // namespace internal | ||
555 | |||
556 | template< | ||
557 | typename Scalar, | ||
558 | int Options, | ||
559 | template<typename, int> class JointCollectionTpl, | ||
560 | typename Mat> | ||
561 | 3 | Mat & computeMinv( | |
562 | const ModelTpl<Scalar, Options, JointCollectionTpl> & model, | ||
563 | const DataTpl<Scalar, Options, JointCollectionTpl> & data, | ||
564 | const Eigen::MatrixBase<Mat> & Minv) | ||
565 | { | ||
566 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
3 | PINOCCHIO_CHECK_ARGUMENT_SIZE(Minv.rows(), model.nv); |
567 |
1/24✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
|
3 | PINOCCHIO_CHECK_ARGUMENT_SIZE(Minv.cols(), model.nv); |
568 | |||
569 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | assert(model.check(data) && "data is not consistent with model."); |
570 | |||
571 | 3 | Mat & Minv_ = PINOCCHIO_EIGEN_CONST_CAST(Mat, Minv); | |
572 | |||
573 |
2/2✓ Branch 0 taken 96 times.
✓ Branch 1 taken 3 times.
|
99 | for (int col = 0; col < model.nv; ++col) |
574 |
1/2✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
|
96 | internal::Miunit(model, data, col, Minv_.col(col)); |
575 | |||
576 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | Minv_.template triangularView<Eigen::StrictlyLower>() = |
577 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
3 | Minv_.transpose().template triangularView<Eigen::StrictlyLower>(); |
578 | |||
579 | 3 | return Minv_; | |
580 | } | ||
581 | |||
582 | } // namespace cholesky | ||
583 | } // namespace pinocchio | ||
584 | |||
585 | /// @endcond | ||
586 | |||
587 | #endif // ifndef __pinocchio_cholesky_hxx__ | ||
588 |