GCC Code Coverage Report


Directory: ./
File: src/util.cpp
Date: 2025-03-17 04:04:52
Exec Total Coverage
Lines: 97 112 86.6%
Branches: 88 170 51.8%

Line Branch Exec Source
1 /*
2 * Copyright 2015, LAAS-CNRS
3 * Author: Andrea Del Prete
4 */
5
6 #include <ctime>
7 #include <hpp/centroidal-dynamics/util.hh>
8
9 namespace centroidal_dynamics {
10
11 11 dd_MatrixPtr cone_span_eigen_to_cdd(Cref_matrixXX input,
12 const bool canonicalize) {
13 11 dd_debug = false;
14 11 dd_MatrixPtr M = NULL;
15 dd_rowrange i;
16 dd_colrange j;
17 11 dd_rowrange m_input = (dd_rowrange)(input.rows());
18 11 dd_colrange d_input = (dd_colrange)(input.cols() + 1);
19 11 dd_RepresentationType rep = dd_Generator;
20 mytype value;
21 11 dd_NumberType NT = dd_Real;
22
1/2
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
11 dd_init(value);
23
1/2
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
11 M = dd_CreateMatrix(m_input, d_input);
24 11 M->representation = rep;
25 11 M->numbtype = NT;
26
2/2
✓ Branch 1 taken 336 times.
✓ Branch 2 taken 11 times.
347 for (i = 0; i < input.rows(); i++) {
27
1/2
✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
336 dd_set_d(value, 0);
28
1/2
✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
336 dd_set(M->matrix[i][0], value);
29
2/2
✓ Branch 0 taken 2016 times.
✓ Branch 1 taken 336 times.
2352 for (j = 1; j < d_input; j++) {
30
2/4
✓ Branch 1 taken 2016 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2016 times.
✗ Branch 5 not taken.
2016 dd_set_d(value, input(i, j - 1));
31
1/2
✓ Branch 1 taken 2016 times.
✗ Branch 2 not taken.
2016 dd_set(M->matrix[i][j], value);
32 }
33 }
34
1/2
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
11 dd_clear(value);
35
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
11 if (canonicalize) {
36 1 dd_ErrorType error = dd_NoError;
37 dd_rowset redset, impl_linset;
38 dd_rowindex newpos;
39
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 dd_MatrixCanonicalize(&M, &impl_linset, &redset, &newpos, &error);
40
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 set_free(redset);
41
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 set_free(impl_linset);
42 1 free(newpos);
43 }
44 11 return M;
45 }
46
47 2 void init_cdd_library() {
48 2 dd_set_global_constants();
49 2 dd_debug = false;
50 2 }
51
52 void release_cdd_library() {
53 // dd_free_global_constants();
54 }
55
56 1000 void uniform3(Cref_vector3 lower_bounds, Cref_vector3 upper_bounds,
57 Ref_vector3 out) {
58
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
1000 assert(lower_bounds.rows() == out.rows());
59
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
1000 assert(upper_bounds.rows() == out.rows());
60
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
1000 assert(lower_bounds.cols() == out.cols());
61
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 1000 times.
1000 assert(upper_bounds.cols() == out.cols());
62
2/2
✓ Branch 1 taken 3000 times.
✓ Branch 2 taken 1000 times.
4000 for (int i = 0; i < out.rows(); i++)
63
2/2
✓ Branch 1 taken 3000 times.
✓ Branch 2 taken 3000 times.
6000 for (int j = 0; j < out.cols(); j++)
64 6000 out(i, j) = (rand() / value_type(RAND_MAX)) *
65 3000 (upper_bounds(i, j) - lower_bounds(i, j)) +
66 3000 lower_bounds(i, j);
67 1000 }
68
69 40 void uniform(Cref_matrixXX lower_bounds, Cref_matrixXX upper_bounds,
70 Ref_matrixXX out) {
71
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
40 assert(lower_bounds.rows() == out.rows());
72
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
40 assert(upper_bounds.rows() == out.rows());
73
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
40 assert(lower_bounds.cols() == out.cols());
74
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 40 times.
40 assert(upper_bounds.cols() == out.cols());
75
2/2
✓ Branch 1 taken 40 times.
✓ Branch 2 taken 40 times.
80 for (int i = 0; i < out.rows(); i++)
76
2/2
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 40 times.
160 for (int j = 0; j < out.cols(); j++)
77 240 out(i, j) = (rand() / value_type(RAND_MAX)) *
78 120 (upper_bounds(i, j) - lower_bounds(i, j)) +
79 120 lower_bounds(i, j);
80 40 }
81
82 20 void euler_matrix(double roll, double pitch, double yaw, Ref_rotation R) {
83 20 const int i = 0;
84 20 const int j = 1;
85 20 const int k = 2;
86 20 double si = sin(roll);
87 20 double sj = sin(pitch);
88 20 double sk = sin(yaw);
89 20 double ci = cos(roll);
90 20 double cj = cos(pitch);
91 20 double ck = cos(yaw);
92 20 double cc = ci * ck;
93 20 double cs = ci * sk;
94 20 double sc = si * ck;
95 20 double ss = si * sk;
96
97 20 R(i, i) = cj * ck;
98 20 R(i, j) = sj * sc - cs;
99 20 R(i, k) = sj * cc + ss;
100 20 R(j, i) = cj * sk;
101 20 R(j, j) = sj * ss + cc;
102 20 R(j, k) = sj * cs - sc;
103 20 R(k, i) = -sj;
104 20 R(k, j) = cj * si;
105 20 R(k, k) = cj * ci;
106 // R = (angle_axis_t(roll, Vector3::UnitX())
107 // * angle_axis_t(pitch, Vector3::UnitY())
108 // * angle_axis_t(yaw, Vector3::UnitZ())).toRotationMatrix();
109 20 }
110
111 20 bool generate_rectangle_contacts(double lx, double ly, Cref_vector3 pos,
112 Cref_vector3 rpy, Ref_matrix43 p,
113 Ref_matrix43 N) {
114 // compute rotation matrix
115
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 Rotation R;
116
5/10
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
20 euler_matrix(rpy(0), rpy(1), rpy(2), R);
117 // contact points in local frame
118
12/24
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 20 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 20 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 20 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 20 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 20 times.
✗ Branch 35 not taken.
20 p << lx, ly, 0, lx, -ly, 0, -lx, -ly, 0, -lx, ly, 0;
119 // contact points in world frame
120
6/12
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
20 p.row(0) = pos + (R * p.row(0).transpose());
121
6/12
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
20 p.row(1) = pos + (R * p.row(1).transpose());
122
6/12
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
20 p.row(2) = pos + (R * p.row(2).transpose());
123
6/12
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
20 p.row(3) = pos + (R * p.row(3).transpose());
124 // normal direction in local frame
125
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
20 RVector3 n;
126
3/6
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
20 n << 0, 0, 1;
127 // normal directions in world frame
128
4/8
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
20 n = (R * n.transpose()).transpose();
129
4/8
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 11 not taken.
20 N << n, n, n, n;
130 20 return true;
131 }
132
133 11381 Rotation crossMatrix(Cref_vector3 x) {
134
1/2
✓ Branch 2 taken 11381 times.
✗ Branch 3 not taken.
11381 Rotation res = Rotation::Zero();
135 11381 res(0, 1) = -x(2);
136 11381 res(0, 2) = x(1);
137 11381 res(1, 0) = x(2);
138 11381 res(1, 2) = -x(0);
139 11381 res(2, 0) = -x(1);
140 11381 res(2, 1) = x(0);
141 11381 return res;
142 }
143
144 std::string getDateAndTimeAsString() {
145 time_t rawtime;
146 struct tm* timeinfo;
147 char buffer[80];
148 time(&rawtime);
149 timeinfo = localtime(&rawtime);
150 strftime(buffer, 80, "%Y%m%d_%I%M%S", timeinfo);
151 return std::string(buffer);
152 }
153 /*
154 int fact(const int n)
155 {
156 assert(n>=0);
157 int res = 1;
158 for (int i=2 ; i <= n ; ++i)
159 res *= i;
160 return res;
161 }
162
163 int choosenk(const int n, const int k)
164 {
165 return fact(n) / (fact(k) * fact(n - k));
166 }*/
167
168 /* is this faster ?
169 value_type choosenk(const int n, const int k)
170 {
171 if(k>n/2)
172 return nchoosek(n,n-k);
173 else if(k==1)
174 return n;
175 else
176 {
177 double c = 1;
178 for(int i = 1;i<=k;i++)
179 c *= (((double)n-k+i)/((double)i));
180 return std::round(c);
181 }
182 }*/
183
184 value_type nchoosek(const int n, const int k) {
185 if (k > n / 2)
186 return nchoosek(n, n - k);
187 else if (k == 1)
188 return n;
189 else {
190 value_type c = 1;
191 for (int i = 1; i <= k; i++)
192 c *= (((value_type)n - k + i) / ((value_type)i));
193 return round(c);
194 }
195 }
196
197 } // namespace centroidal_dynamics
198