GCC Code Coverage Report


Directory: ./
File: tests/gjk.cc
Date: 2025-05-05 12:19:30
Exec Total Coverage
Lines: 228 242 94.2%
Branches: 299 758 39.4%

Line Branch Exec Source
1
2 #include <hpp/constraints/solver/hierarchical-iterative.hh>
3 #include <hpp/constraints/symbolic-function.hh>
4 #include <hpp/pinocchio/util.hh>
5 #include <sstream>
6
7 using namespace hpp::constraints;
8
9 // This unit test was used to write function
10 // coal::details::GJK::projectTetrahedraOrigin.
11
12 #define DECLARE_EXPRESSION(Class) typedef typename Traits<Class>::Ptr_t Ptr_t;
13
14 #define HPP_CONSTRAINTS_CB_CREATE0(Class) \
15 static typename Traits<Class>::Ptr_t create() { \
16 typename Traits<Class>::Ptr_t ptr(new Class()); \
17 ptr->init(ptr); \
18 return ptr; \
19 }
20
21 static const int Nv = 9;
22 typedef Eigen::Matrix<value_type, Nv, 1> vector9_t;
23 typedef solver::lineSearch::Backtracking LineSearch_t;
24 using hpp::one_line;
25 using hpp::setpyformat;
26 using hpp::shared_ptr;
27 using hpp::constraints::solver::HierarchicalIterative;
28
29 namespace hpp {
30 namespace constraints {
31
32 class PointA;
33 class PointB;
34 class PointC;
35 class PointD;
36
37 class PointB : public CalculusBase<PointB, vector3_t, JacobianMatrix> {
38 public:
39
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 HPP_CONSTRAINTS_CB_CREATE0(PointB)
40 DECLARE_EXPRESSION(PointB)
41
42 PointB(const CalculusBase<PointB, vector3_t, JacobianMatrix>& other)
43 : CalculusBase<PointB, eigen::vector3_t, JacobianMatrix>(other) {}
44
45 PointB(const PointB& point)
46 : CalculusBase<PointB, vector3_t, JacobianMatrix>(point) {}
47
48 1 PointB() : CalculusBase<PointB, vector3_t, JacobianMatrix>() {
49
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_.resize(3, Nv);
50
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 this->jacobian_.rightCols<3>().setIdentity();
51
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 this->jacobian_.leftCols<Nv - 3>().setZero();
52 1 }
53
54
1/2
✓ Branch 2 taken 1532 times.
✗ Branch 3 not taken.
1532 void impl_value(const ConfigurationIn_t x) { this->value_ = x.head<3>(); }
55 484 void impl_jacobian(const ConfigurationIn_t) {}
56 };
57
58 class PointC : public CalculusBase<PointC, vector3_t, JacobianMatrix> {
59 public:
60
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 HPP_CONSTRAINTS_CB_CREATE0(PointC)
61 DECLARE_EXPRESSION(PointC)
62
63 PointC(const CalculusBase<PointC, vector3_t, JacobianMatrix>& other)
64 : CalculusBase<PointC, eigen::vector3_t, JacobianMatrix>(other) {}
65
66 PointC(const PointC& point)
67 : CalculusBase<PointC, vector3_t, JacobianMatrix>(point) {}
68
69 1 PointC() : CalculusBase<PointC, vector3_t, JacobianMatrix>() {
70
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_.resize(3, Nv);
71
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 this->jacobian_.rightCols<3>().setIdentity();
72
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 this->jacobian_.leftCols<Nv - 3>().setZero();
73
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_(0, 3) = 1.;
74 1 }
75
76 1527 void impl_value(const ConfigurationIn_t x) {
77
1/2
✓ Branch 2 taken 1527 times.
✗ Branch 3 not taken.
1527 this->value_ = x.head<3>();
78 1527 this->value_[0] += x[3];
79 1527 }
80 482 void impl_jacobian(const ConfigurationIn_t) {}
81 };
82
83 class PointD : public CalculusBase<PointD, vector3_t, JacobianMatrix> {
84 public:
85
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 HPP_CONSTRAINTS_CB_CREATE0(PointD)
86 DECLARE_EXPRESSION(PointD)
87
88 PointD(const CalculusBase<PointD, vector3_t, JacobianMatrix>& other)
89 : CalculusBase<PointD, eigen::vector3_t, JacobianMatrix>(other) {}
90
91 PointD(const PointD& point)
92 : CalculusBase<PointD, vector3_t, JacobianMatrix>(point) {}
93
94 1 PointD() : CalculusBase<PointD, vector3_t, JacobianMatrix>() {
95
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_.resize(3, Nv);
96
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_.setZero();
97
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_(0, 0) = 1.;
98
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_(0, 4) = 1.;
99
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_(1, 5) = 1.;
100
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_(2, 2) = 1.;
101 1 }
102
103 771 void impl_value(const ConfigurationIn_t x) {
104
5/10
✓ Branch 3 taken 771 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 771 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 771 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 771 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 771 times.
✗ Branch 16 not taken.
771 this->value_ << x[0] + x[4], x[5], x[2];
105 771 }
106 244 void impl_jacobian(const ConfigurationIn_t) {}
107 };
108
109 class PointA : public CalculusBase<PointA, vector3_t, JacobianMatrix> {
110 public:
111
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 HPP_CONSTRAINTS_CB_CREATE0(PointA)
112 DECLARE_EXPRESSION(PointA)
113
114 PointA(const CalculusBase<PointA, vector3_t, JacobianMatrix>& other)
115 : CalculusBase<PointA, eigen::vector3_t, JacobianMatrix>(other) {}
116
117 PointA(const PointA& point)
118 : CalculusBase<PointA, vector3_t, JacobianMatrix>(point) {}
119
120 1 PointA() : CalculusBase<PointA, vector3_t, JacobianMatrix>() {
121
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_.resize(3, Nv);
122
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 this->jacobian_.rightCols<Nv - 3>().setIdentity();
123
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 this->jacobian_.leftCols<3>().setZero();
124
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 this->jacobian_(2, 2) = 1.;
125 1 }
126
127 1147 void impl_value(const ConfigurationIn_t x) {
128
1/2
✓ Branch 2 taken 1147 times.
✗ Branch 3 not taken.
1147 this->value_ = x.tail<3>();
129 1147 this->value_[2] += x[2];
130 1147 }
131 362 void impl_jacobian(const ConfigurationIn_t) {}
132 };
133
134 } // namespace constraints
135 } // namespace hpp
136
137 typedef Difference<PointB, PointA> AB_t;
138 typedef Difference<PointC, PointA> AC_t;
139 typedef Difference<PointD, PointA> AD_t;
140
141 typedef ScalarProduct<AB_t, PointA> AB_OA_t;
142 typedef ScalarProduct<AC_t, PointA> AC_OA_t;
143 typedef ScalarProduct<AD_t, PointA> AD_OA_t;
144
145 typedef CrossProduct<AB_t, AC_t> ABC_t;
146 typedef CrossProduct<AC_t, AD_t> ACD_t;
147 typedef CrossProduct<AD_t, AB_t> ADB_t;
148
149 typedef ScalarProduct<ABC_t, PointA> ABC_OA_t;
150 typedef ScalarProduct<ACD_t, PointA> ACD_OA_t;
151 typedef ScalarProduct<ADB_t, PointA> ADB_OA_t;
152
153 typedef CrossProduct<ABC_t, AB_t> ABC_AB_t;
154 typedef CrossProduct<ABC_t, AC_t> ABC_AC_t;
155 typedef CrossProduct<ACD_t, AC_t> ACD_AC_t;
156 typedef CrossProduct<ACD_t, AD_t> ACD_AD_t;
157 typedef CrossProduct<ADB_t, AD_t> ADB_AD_t;
158 typedef CrossProduct<ADB_t, AB_t> ADB_AB_t;
159
160 typedef ScalarProduct<ABC_AB_t, PointA> ABC_AB_OA_t;
161 typedef ScalarProduct<ABC_AC_t, PointA> ABC_AC_OA_t;
162 typedef ScalarProduct<ACD_AC_t, PointA> ACD_AC_OA_t;
163 typedef ScalarProduct<ACD_AD_t, PointA> ACD_AD_OA_t;
164 typedef ScalarProduct<ADB_AD_t, PointA> ADB_AD_OA_t;
165 typedef ScalarProduct<ADB_AB_t, PointA> ADB_AB_OA_t;
166
167 // ComparisonTypes_t negative (1, Inferior);
168
169 template <typename Expression>
170 52 ImplicitPtr_t implicitConstraint(const std::string& name,
171 const shared_ptr<Expression>& expr,
172 ComparisonTypes_t comp) {
173 typedef SymbolicFunction<Expression> SF_t;
174
3/6
✓ Branch 2 taken 26 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 26 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 26 times.
✗ Branch 11 not taken.
52 return Implicit::create(SF_t::create(name, Nv, Nv, 1, expr), comp);
175 }
176
177 struct Data {
178 PointA::Ptr_t A;
179 PointB::Ptr_t B;
180 PointC::Ptr_t C;
181 PointD::Ptr_t D;
182
183 shared_ptr<AB_t> AB;
184 shared_ptr<AC_t> AC;
185 shared_ptr<AD_t> AD;
186
187 shared_ptr<AB_OA_t> AB_OA;
188 shared_ptr<AC_OA_t> CB_OA;
189 shared_ptr<AD_OA_t> DB_OA;
190
191 shared_ptr<ABC_t> ABC;
192 shared_ptr<ACD_t> ACD;
193 shared_ptr<ADB_t> ADB;
194
195 shared_ptr<ABC_OA_t> ABC_OA;
196 shared_ptr<ACD_OA_t> ACD_OA;
197 shared_ptr<ADB_OA_t> ADB_OA;
198
199 shared_ptr<ABC_AB_t> ABC_AB;
200 shared_ptr<ABC_AC_t> ABC_AC;
201 shared_ptr<ACD_AC_t> ACD_AC;
202 shared_ptr<ACD_AD_t> ACD_AD;
203 shared_ptr<ADB_AD_t> ADB_AD;
204 shared_ptr<ADB_AB_t> ADB_AB;
205
206 shared_ptr<ABC_AB_OA_t> ABC_AB_OA;
207 shared_ptr<ABC_AC_OA_t> ABC_AC_OA;
208 shared_ptr<ACD_AC_OA_t> ACD_AC_OA;
209 shared_ptr<ACD_AD_OA_t> ACD_AD_OA;
210 shared_ptr<ADB_AD_OA_t> ADB_AD_OA;
211 shared_ptr<ADB_AB_OA_t> ADB_AB_OA;
212
213 ImplicitPtr_t c0_AB_OA, c0_CB_OA, c0_DB_OA, c1_AB_OA, c1_CB_OA, c1_DB_OA,
214 c0_ABC_OA, c0_ACD_OA, c0_ADB_OA, c1_ABC_OA, c1_ACD_OA, c1_ADB_OA,
215 c0_ABC_AB_OA, c0_ABC_AC_OA, c1_ABC_AB_OA, c1_ABC_AC_OA, c0_ACD_AC_OA,
216 c0_ACD_AD_OA, c1_ACD_AC_OA, c1_ACD_AD_OA, c0_ADB_AD_OA, c0_ADB_AB_OA,
217 c1_ADB_AD_OA, c1_ADB_AB_OA;
218 ImplicitPtr_t a[12];
219 ImplicitPtr_t not_a[12];
220
221 ImplicitPtr_t O_inside_1, O_inside_2;
222
223 1 Data() {
224
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 A = (PointA::create());
225
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 B = (PointB::create());
226
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 C = (PointC::create());
227
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 D = (PointD::create());
228
229
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 AB = (B - A);
230
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 AC = (C - A);
231
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 AD = (D - A);
232
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 AB_OA = (AB * A);
233
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 CB_OA = (AC * A);
234
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 DB_OA = (AD * A);
235
236
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ABC = (AB ^ AC);
237
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ACD = (AC ^ AD);
238
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ADB = (AD ^ AB);
239
240
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ABC_OA = (ABC * A);
241
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ACD_OA = (ACD * A);
242
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ADB_OA = (ADB * A);
243
244
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ABC_AB = (ABC ^ AB);
245
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ABC_AC = (ABC ^ AC);
246
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ACD_AC = (ACD ^ AC);
247
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ACD_AD = (ACD ^ AD);
248
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ADB_AD = (ADB ^ AD);
249
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ADB_AB = (ADB ^ AB);
250
251
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ABC_AB_OA = (ABC_AB * A);
252
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ABC_AC_OA = (ABC_AC * A);
253
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ACD_AC_OA = (ACD_AC * A);
254
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ACD_AD_OA = (ACD_AD * A);
255
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ADB_AD_OA = (ADB_AD * A);
256
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 ADB_AB_OA = (ADB_AB * A);
257
258
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ComparisonTypes_t negative(1, Inferior);
259
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ComparisonTypes_t positive(1, Superior);
260
261
3/6
✓ 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.
1 c1_AB_OA = implicitConstraint("AB.AO >= 0", AB_OA, negative);
262
3/6
✓ 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.
1 c1_CB_OA = implicitConstraint("CB.AO >= 0", CB_OA, negative);
263
3/6
✓ 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.
1 c1_DB_OA = implicitConstraint("DB.AO >= 0", DB_OA, negative);
264
3/6
✓ 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.
1 c1_ABC_OA = implicitConstraint("ABC.AO >= 0", ABC_OA, negative);
265
3/6
✓ 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.
1 c1_ACD_OA = implicitConstraint("ACD.AO >= 0", ACD_OA, negative);
266
3/6
✓ 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.
1 c1_ADB_OA = implicitConstraint("ADB.AO >= 0", ADB_OA, negative);
267
3/6
✓ 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.
1 c1_ABC_AB_OA = implicitConstraint("ABC^AB.AO >= 0", ABC_AB_OA, negative);
268
3/6
✓ 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.
1 c1_ABC_AC_OA = implicitConstraint("ABC^AC.AO >= 0", ABC_AC_OA, negative);
269
3/6
✓ 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.
1 c1_ACD_AC_OA = implicitConstraint("ACD^AC.AO >= 0", ACD_AC_OA, negative);
270
3/6
✓ 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.
1 c1_ACD_AD_OA = implicitConstraint("ACD^AD.AO >= 0", ACD_AD_OA, negative);
271
3/6
✓ 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.
1 c1_ADB_AD_OA = implicitConstraint("ADB^AD.AO >= 0", ADB_AD_OA, negative);
272
3/6
✓ 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.
1 c1_ADB_AB_OA = implicitConstraint("ADB^AB.AO >= 0", ADB_AB_OA, negative);
273
274
3/6
✓ 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.
1 c0_AB_OA = implicitConstraint("AB.AO <= 0", AB_OA, positive);
275
3/6
✓ 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.
1 c0_CB_OA = implicitConstraint("CB.AO <= 0", CB_OA, positive);
276
3/6
✓ 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.
1 c0_DB_OA = implicitConstraint("DB.AO <= 0", DB_OA, positive);
277
3/6
✓ 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.
1 c0_ABC_OA = implicitConstraint("ABC.AO <= 0", ABC_OA, positive);
278
3/6
✓ 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.
1 c0_ACD_OA = implicitConstraint("ACD.AO <= 0", ACD_OA, positive);
279
3/6
✓ 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.
1 c0_ADB_OA = implicitConstraint("ADB.AO <= 0", ADB_OA, positive);
280
3/6
✓ 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.
1 c0_ABC_AB_OA = implicitConstraint("ABC^AB.AO <= 0", ABC_AB_OA, positive);
281
3/6
✓ 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.
1 c0_ABC_AC_OA = implicitConstraint("ABC^AC.AO <= 0", ABC_AC_OA, positive);
282
3/6
✓ 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.
1 c0_ACD_AC_OA = implicitConstraint("ACD^AC.AO <= 0", ACD_AC_OA, positive);
283
3/6
✓ 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.
1 c0_ACD_AD_OA = implicitConstraint("ACD^AD.AO <= 0", ACD_AD_OA, positive);
284
3/6
✓ 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.
1 c0_ADB_AD_OA = implicitConstraint("ADB^AD.AO <= 0", ADB_AD_OA, positive);
285
3/6
✓ 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.
1 c0_ADB_AB_OA = implicitConstraint("ADB^AB.AO <= 0", ADB_AB_OA, positive);
286
287
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 shared_ptr<Point> z = Point::create(vector3_t(0, 0, 1), Nv);
288 O_inside_1 =
289
6/12
✓ 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 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
1 implicitConstraint("BD^z.OB >= 0", ((D - B) ^ z) * B, negative);
290 O_inside_2 =
291
6/12
✓ 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 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
1 implicitConstraint("CD^z.OC <= 0", ((D - C) ^ z) * C, positive);
292
293 1 a[0] = c1_ABC_OA;
294 1 a[1] = c1_ACD_OA;
295 1 a[2] = c1_ADB_OA;
296 1 a[3] = c1_ABC_AB_OA;
297 1 a[4] = c1_ABC_AC_OA;
298 1 a[5] = c1_ACD_AC_OA;
299 1 a[6] = c1_ACD_AD_OA;
300 1 a[7] = c1_ADB_AD_OA;
301 1 a[8] = c1_ADB_AB_OA;
302 1 a[9] = c1_AB_OA;
303 1 a[10] = c1_CB_OA;
304 1 a[11] = c1_DB_OA;
305
306 1 not_a[0] = c0_ABC_OA;
307 1 not_a[1] = c0_ACD_OA;
308 1 not_a[2] = c0_ADB_OA;
309 1 not_a[3] = c0_ABC_AB_OA;
310 1 not_a[4] = c0_ABC_AC_OA;
311 1 not_a[5] = c0_ACD_AC_OA;
312 1 not_a[6] = c0_ACD_AD_OA;
313 1 not_a[7] = c0_ADB_AD_OA;
314 1 not_a[8] = c0_ADB_AB_OA;
315 1 not_a[9] = c0_AB_OA;
316 1 not_a[10] = c0_CB_OA;
317 1 not_a[11] = c0_DB_OA;
318
0/8
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1 }
319 };
320
321 #define CHECK_MSG(cond, msg) \
322 if (!(cond)) \
323 std::cerr << __FILE__ ":" << __LINE__ << ": " << msg << ": failed" \
324 << std::endl;
325 #define CHECK_EQUAL(a, b) \
326 CHECK_MSG(a == b, #a " (" << a << ") == " #b " (" << b << ")")
327 #define CHECK(cond) CHECK_MSG(cond, #cond)
328
329 269 bool saturation(vectorIn_t q, vectorOut_t qSat, Eigen::VectorXi& saturation) {
330 static const value_type eps = 1e-1;
331 269 bool ret = false;
332 269 qSat = q;
333 269 saturation.setZero();
334
2/2
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 264 times.
269 if (q[1] > 0) { // b1 <= 0
335 5 saturation[1] = 1;
336 5 qSat[1] = 0.;
337 5 ret = true;
338 }
339
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 268 times.
269 if (q[2] > -eps) { // z < 0
340 1 saturation[2] = 1;
341 1 qSat[2] = -eps;
342 1 ret = true;
343 }
344
2/2
✓ Branch 1 taken 59 times.
✓ Branch 2 taken 210 times.
269 if (q[3] < eps) { // s0 > 0
345 59 saturation[3] = -1;
346 59 qSat[3] = eps;
347 59 ret = true;
348 }
349
2/2
✓ Branch 1 taken 38 times.
✓ Branch 2 taken 231 times.
269 if (q[5] < eps) { // d1 > 0
350 38 saturation[5] = -1;
351 38 qSat[5] = eps;
352 38 ret = true;
353 }
354
2/2
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 247 times.
269 if (q[8] < eps) { // h > 0
355 22 saturation[8] = -1;
356 22 qSat[8] = eps;
357 22 ret = true;
358 }
359 269 return ret;
360 }
361
362 value_type ineq_thr = 0.001;
363 size_type max_iter = 100;
364
365 2 HierarchicalIterative createSolver(Data& data) {
366
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 HierarchicalIterative solver(LiegroupSpace::Rn(Nv));
367
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 solver.saturation(hpp::make_shared<solver::saturation::Function>(saturation));
368 2 solver.inequalityThreshold(ineq_thr);
369 2 solver.maxIterations(max_iter);
370
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 solver.add(data.O_inside_1, 0);
371
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 solver.add(data.O_inside_2, 0);
372 2 return solver;
373 }
374
375 1 void check(Data& d) {
376
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 vector9_t x;
377
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 x.setRandom();
378
379
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 d.ABC->invalidate();
380
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 d.ABC->computeValue(x);
381
4/34
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
1 CHECK_EQUAL(d.A->value()[0], x(6));
382
4/34
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
1 CHECK_EQUAL(d.A->value()[1], x(7));
383
5/38
✓ Branch 2 taken 1 times.
✗ Branch 3 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 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✗ 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.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 50 not taken.
✗ Branch 51 not taken.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
1 CHECK_EQUAL(d.A->value()[2], x(8) + x[2]);
384
4/32
✓ 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 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
1 CHECK_EQUAL(d.B->value(), x.head<3>());
385
386
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 HierarchicalIterative solver(createSolver(d));
387
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 solver.add(d.c1_AB_OA, 1);
388
389
9/18
✓ 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.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
1 x << 0, -1, -1, 1, 0, 1, 0, 0, 2;
390
391
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.
1 HierarchicalIterative::Status status = solver.solve<LineSearch_t>(x);
392
1/22
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
1 CHECK_EQUAL(status, HierarchicalIterative::SUCCESS);
393 1 }
394
395 1 int checkCase(Data& d, int N, std::vector<int> conds) {
396
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 HierarchicalIterative solver(createSolver(d));
397
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
4 for (std::size_t i = 0; i < conds.size(); ++i) {
398
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
3 if (i > 0) std::cout << '.';
399
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
3 if (conds[i] > 0) {
400
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 solver.add(d.a[conds[i] - 1], 1);
401 } else {
402
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 std::cout << '!';
403
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 solver.add(d.not_a[-conds[i] - 1], 1);
404 }
405
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 std::cout << 'a' << abs(conds[i]);
406 }
407
408
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 vector9_t x, y;
409 1 bool success = false;
410
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Eigen::VectorXi sat(Nv);
411
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 1 times.
5 for (int i = 0; i < N && !success; ++i) {
412
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 y.setRandom();
413
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 saturation(y, x, sat);
414
3/6
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
4 HierarchicalIterative::Status status = solver.solve<LineSearch_t>(x);
415
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
4 if (status == HierarchicalIterative::SUCCESS) success = true;
416 }
417
4/20
✓ 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 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ 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.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
1 CHECK(!saturation(x, y, sat));
418
419
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 std::cout << " : ";
420
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (success) {
421
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 d.A->invalidate();
422
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 d.A->computeValue(x);
423
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 d.B->invalidate();
424
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 d.B->computeValue(x);
425
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 d.C->invalidate();
426
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 d.C->computeValue(x);
427
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 d.D->invalidate();
428
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 d.D->computeValue(x);
429
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.
1 std::cout << "found.\nX = " << setpyformat << one_line(x) << '\n';
430 std::cout << '\n'
431
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 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.
1 << "A = np.array(" << one_line(d.A->value()) << ")\n"
432
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 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.
1 << "B = np.array(" << one_line(d.B->value()) << ")\n"
433
5/10
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 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.
1 << "C = np.array(" << one_line(d.C->value()) << ")\n"
434
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 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 17 taken 1 times.
✗ Branch 18 not taken.
1 << "D = np.array(" << one_line(d.D->value()) << ")\n";
435 } else {
436 std::cout << "failed\n";
437 }
438
439
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 std::cout << '\n';
440 1 const NumericalConstraints_t& ncs = solver.constraints();
441
2/2
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
6 for (std::size_t i = 0; i < ncs.size(); ++i) {
442
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
5 if (i > 0) std::cout << " . ";
443
1/2
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
5 std::cout << ncs[i]->function().name();
444 }
445
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 std::cout << '\n';
446
447
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 return (success ? 0 : 1);
448 1 }
449
450 template <typename T>
451 T parse(char* arg) {
452 std::istringstream iss(arg);
453 T val;
454 if (iss >> val) return val;
455 std::ostringstream oss;
456 oss << "Could not parse " << arg << " as an integer.";
457 throw std::invalid_argument(oss.str());
458 }
459
460 1 int main(int argc, char** argv) {
461 1 int max_num_shoot = 100;
462
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 std::vector<int> case_, defaultCase({1, 4, -5});
463
464
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 for (int i = 1; i < argc; ++i) {
465 if (strcmp(argv[i], "--num-shoot") == 0)
466 max_num_shoot = parse<int>(argv[++i]);
467 else if (strcmp(argv[i], "--ineq-thr") == 0)
468 ineq_thr = parse<value_type>(argv[++i]);
469 else if (strcmp(argv[i], "--max-iter") == 0)
470 max_iter = parse<size_type>(argv[++i]);
471 else
472 case_.push_back(parse<int>(argv[i]));
473 }
474
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 if (case_.empty()) case_ = defaultCase;
475
476
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Data data;
477
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 check(data);
478
479
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 return checkCase(data, max_num_shoot, case_);
480 1 }
481