GCC Code Coverage Report


Directory: ./
File: unittest/cholesky.cpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 161 161 100.0%
Branches: 382 746 51.2%

Line Branch Exec Source
1 //
2 // Copyright (c) 2015-2019 CNRS INRIA
3 //
4
5 /*
6 * Validate the sparse Cholesky decomposition of the mass matrix. The code
7 * tests both the numerical value and the computation time. For a strong
8 * computation benchmark, see benchmark/timings.
9 *
10 */
11
12 #include "pinocchio/spatial/se3.hpp"
13 #include "pinocchio/multibody/model.hpp"
14 #include "pinocchio/multibody/data.hpp"
15 #include "pinocchio/algorithm/crba.hpp"
16 #include "pinocchio/algorithm/cholesky.hpp"
17 #include "pinocchio/multibody/sample-models.hpp"
18 #include "pinocchio/utils/timer.hpp"
19 #include "pinocchio/algorithm/joint-configuration.hpp"
20
21 #include <iostream>
22 #ifdef NDEBUG
23 #include <Eigen/Cholesky>
24 #endif
25
26 #include <boost/test/unit_test.hpp>
27 #include <boost/utility/binary.hpp>
28
29 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
30
31
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_cholesky)
32 {
33 using namespace Eigen;
34 using namespace pinocchio;
35
36
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Model model;
37
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::buildModels::humanoidRandom(model, true);
38
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Data data(model);
39
40
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
41
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
42
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
43
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 data.M.fill(0); // Only nonzero coeff of M are initialized by CRBA.
44
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 crba(model, data, q, Convention::WORLD);
45
46
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::decompose(model, data);
47
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 data.M.triangularView<Eigen::StrictlyLower>() =
48
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
4 data.M.triangularView<Eigen::StrictlyUpper>().transpose();
49
50 2 const Eigen::MatrixXd & U = data.U;
51 2 const Eigen::VectorXd & D = data.D;
52 2 const Eigen::MatrixXd & M = data.M;
53
54 #ifndef NDEBUG
55
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
2 std::cout << "M = [\n" << M << "];" << std::endl;
56
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
2 std::cout << "U = [\n" << U << "];" << std::endl;
57
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 std::cout << "D = [\n" << D.transpose() << "];" << std::endl;
58 #endif
59
60
11/22
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
2 BOOST_CHECK(M.isApprox(U * D.asDiagonal() * U.transpose(), 1e-12));
61
62
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd v = Eigen::VectorXd::Random(model.nv);
63 // std::cout << "v = [" << v.transpose() << "]';" << std::endl;
64
65
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd Uv = v;
66
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::Uv(model, data, Uv);
67
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(Uv.isApprox(U * v, 1e-12));
68
69
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd Utv = v;
70
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::Utv(model, data, Utv);
71
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
2 BOOST_CHECK(Utv.isApprox(U.transpose() * v, 1e-12));
72
73
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd Uiv = v;
74
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::Uiv(model, data, Uiv);
75
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
2 BOOST_CHECK(Uiv.isApprox(U.inverse() * v, 1e-12));
76
77
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd Utiv = v;
78
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::Utiv(model, data, Utiv);
79
10/20
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 30 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
2 BOOST_CHECK(Utiv.isApprox(U.transpose().inverse() * v, 1e-12));
80
81
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd Miv = v;
82
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::solve(model, data, Miv);
83
9/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
2 BOOST_CHECK(Miv.isApprox(M.inverse() * v, 1e-12));
84
85
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd Mv = v;
86
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Mv = pinocchio::cholesky::Mv(model, data, Mv);
87
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(Mv.isApprox(M * v, 1e-12));
88
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Mv = v;
89
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::UDUtv(model, data, Mv);
90
8/16
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(Mv.isApprox(M * v, 1e-12));
91 2 }
92
93 /* The flag triger the following timers:
94 * 000001: sparse UDUt cholesky
95 * 000010: dense Eigen LDLt cholesky (with pivot)
96 * 000100: sparse resolution
97 * 001000: sparse U*v multiplication
98 * 010000: sparse U\v substitution
99 * 100000: sparse M*v multiplication without Cholesky
100 */
101
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_timings)
102 {
103 using namespace Eigen;
104 using namespace pinocchio;
105
106
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Model model;
107
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::buildModels::humanoidRandom(model, true);
108
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Data data(model);
109
110
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
111
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
112
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
113
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 data.M.fill(0); // Only nonzero coeff of M are initialized by CRBA.
114
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 crba(model, data, q, Convention::WORLD);
115
116 2 long flag = BOOST_BINARY(1111111);
117
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 PinocchioTicToc timer(PinocchioTicToc::US);
118 #ifdef NDEBUG
119 #ifdef _INTENSE_TESTING_
120 const size_t NBT = 1000 * 1000;
121 #else
122 const size_t NBT = 10;
123 #endif
124 #else
125 2 const size_t NBT = 1;
126
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "(the time score in debug mode is not relevant) ";
127 #endif
128
129 2 bool verbose = flag & (flag - 1); // True is two or more binaries of the flag are 1.
130
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
131
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 std::cout << "--" << std::endl;
132
133
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 0 & 1)
134 {
135
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
136
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
137 {
138
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::cholesky::decompose(model, data);
139 }
140
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
141
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "Decompose =\t";
142
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
143 }
144
145
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 1 & 1)
146 {
147
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
148
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd v = Eigen::VectorXd::Random(model.nv);
149
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd res(model.nv);
150
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
151 {
152
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::LDLT<Eigen::MatrixXd> Mchol(data.M);
153
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 res = Mchol.solve(v);
154 2 }
155
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
156
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "Eigen::LDLt =\t";
157
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
158 2 }
159
160
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 2 & 31)
161 {
162
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::vector<Eigen::VectorXd> randvec(NBT);
163
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 for (size_t i = 0; i < NBT; ++i)
164
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 randvec[i] = Eigen::VectorXd::Random(model.nv);
165
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd zero = Eigen::VectorXd::Zero(model.nv);
166
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd res(model.nv);
167
168
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 2 & 1)
169 {
170
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
171
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
172 {
173
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 pinocchio::cholesky::solve(model, data, randvec[_smooth]);
174 }
175
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
176
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "solve =\t\t";
177
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
178 }
179
180
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 3 & 1)
181 {
182
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
183
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
184 {
185
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 pinocchio::cholesky::Uv(model, data, randvec[_smooth]);
186 }
187
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
188
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "Uv =\t\t";
189
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
190 }
191
192
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 4 & 1)
193 {
194
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
195
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
196 {
197
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 pinocchio::cholesky::Uiv(model, data, randvec[_smooth]);
198 }
199
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
200
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "Uiv =\t\t";
201
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
202 }
203
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 5 & 1)
204 {
205
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
206
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd res;
207
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
208 {
209
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 res = pinocchio::cholesky::Mv(model, data, randvec[_smooth]);
210 }
211
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
212
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "Mv =\t\t";
213
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
214 2 }
215
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (flag >> 6 & 1)
216 {
217
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.tic();
218
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
4 SMOOTH(NBT)
219 {
220
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 pinocchio::cholesky::UDUtv(model, data, randvec[_smooth]);
221 }
222
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (verbose)
223
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 std::cout << "UDUtv =\t\t";
224
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 timer.toc(std::cout, NBT);
225 }
226 2 }
227 2 }
228
229
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_Minv_from_cholesky)
230 {
231 using namespace Eigen;
232 using namespace pinocchio;
233
234
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Model model;
235
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::buildModels::humanoidRandom(model, true);
236
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Data data(model);
237
238
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
239
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
240
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
241
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 crba(model, data, q, Convention::WORLD);
242
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 data.M.triangularView<Eigen::StrictlyLower>() =
243
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
4 data.M.triangularView<Eigen::StrictlyUpper>().transpose();
244
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 MatrixXd Minv_ref(data.M.inverse());
245
246
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 cholesky::decompose(model, data);
247
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v_unit(VectorXd::Unit(model.nv, 0));
248
249
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd Ui_v_unit(model.nv);
250
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd Ui_v_unit_ref(model.nv);
251
252
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
253 {
254
2/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
64 v_unit = VectorXd::Unit(model.nv, k);
255
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 Ui_v_unit.setZero();
256
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 cholesky::internal::Miunit(model, data, k, Ui_v_unit);
257
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 Ui_v_unit_ref = v_unit;
258
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 cholesky::Uiv(model, data, Ui_v_unit_ref);
259
3/6
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 8 not taken.
64 Ui_v_unit_ref.array() *= data.Dinv.array();
260
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 cholesky::Utiv(model, data, Ui_v_unit_ref);
261
9/18
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 32 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 32 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 32 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 32 times.
✗ Branch 28 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 32 times.
64 BOOST_CHECK(Ui_v_unit.head(k + 1).isApprox(Ui_v_unit_ref.head(k + 1)));
262
263
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 Ui_v_unit_ref = v_unit;
264
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 cholesky::solve(model, data, Ui_v_unit_ref);
265
9/18
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 32 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 32 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 32 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 32 times.
✗ Branch 28 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 32 times.
64 BOOST_CHECK(Ui_v_unit.head(k + 1).isApprox(Ui_v_unit_ref.head(k + 1)));
266 }
267
268
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 MatrixXd Minv(model.nv, model.nv);
269
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Minv.setZero();
270
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 cholesky::computeMinv(model, data, Minv);
271
272
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(Minv.isApprox(Minv_ref));
273
274 // Check second call to cholesky::computeMinv
275
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 cholesky::computeMinv(model, data, Minv);
276
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(Minv.isApprox(Minv_ref));
277
278 // Call the second signature of cholesky::computeMinv
279
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data_bis(model);
280
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 crba(model, data_bis, q, Convention::WORLD);
281
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 cholesky::decompose(model, data_bis);
282
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 cholesky::computeMinv(model, data_bis);
283
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(data_bis.Minv.isApprox(Minv_ref));
284 2 }
285
286 BOOST_AUTO_TEST_SUITE_END()
287