@@ -58,14 +58,15 @@ TEST_CASE("Test EqualityFirst")
58
58
for (int i = 0 ; i < 10 ; ++i)
59
59
{
60
60
const int neq = 3 ;
61
- auto pb = QPProblem (randomProblem (ProblemCharacteristics (7 , 7 , neq, 8 )));
61
+ auto pb = QPProblem (randomProblem (ProblemCharacteristics (7 , 7 , neq, 11 -neq )));
62
62
pb.C .transposeInPlace ();
63
63
64
64
for (int i = 0 ; i < neq; ++i)
65
65
{
66
66
REQUIRE_EQ (pb.l [i], pb.u [i]);
67
67
}
68
68
69
+ Eigen::MatrixXd G = pb.G ;
69
70
auto llt = pb.G .llt ();
70
71
Eigen::MatrixXd L = llt.matrixL ();
71
72
Eigen::MatrixXd invL = L.inverse ();
@@ -74,7 +75,7 @@ TEST_CASE("Test EqualityFirst")
74
75
options.gFactorization (jrl::qp::GFactorization::NONE);
75
76
options.equalityFirst (false );
76
77
solver.options (options);
77
- solver.solve (pb. G , pb.a , pb.C , pb.l , pb.u , pb.xl , pb.xu );
78
+ solver.solve (G, pb.a , pb.C , pb.l , pb.u , pb.xl , pb.xu );
78
79
Eigen::VectorXd x0 = solver.solution ();
79
80
80
81
options.equalityFirst (true );
@@ -104,6 +105,44 @@ TEST_CASE("Test EqualityFirst")
104
105
}
105
106
}
106
107
108
+ TEST_CASE (" Test EqualityFirst with additional equalities" )
109
+ {
110
+ jrl::qp::GoldfarbIdnaniSolver solver0 (7 , 11 , false );
111
+ jrl::qp::GoldfarbIdnaniSolver solver1 (7 , 11 , false );
112
+ jrl::qp::SolverOptions options;
113
+
114
+ for (int i = 0 ; i < 10 ; ++i)
115
+ {
116
+ const int neq = 4 ;
117
+ auto pb = QPProblem (randomProblem (ProblemCharacteristics (7 , 7 , neq, 11 - neq)));
118
+ pb.C .transposeInPlace ();
119
+
120
+ for (int i = 0 ; i < neq; ++i)
121
+ {
122
+ REQUIRE_EQ (pb.l [i], pb.u [i]);
123
+ }
124
+
125
+ // reorganize equality constraints
126
+ pb.C .col (neq - 2 ).swap (pb.C .col (9 ));
127
+ std::swap (pb.l [neq - 2 ], pb.l [9 ]);
128
+ std::swap (pb.u [neq - 2 ], pb.u [9 ]);
129
+
130
+ options.gFactorization (jrl::qp::GFactorization::NONE);
131
+ options.equalityFirst (false );
132
+ solver0.options (options);
133
+ Eigen::MatrixXd G = pb.G ;
134
+ solver0.solve (G, pb.a , pb.C , pb.l , pb.u , pb.xl , pb.xu );
135
+ Eigen::VectorXd x0 = solver0.solution ();
136
+
137
+ options.equalityFirst (true );
138
+ solver1.options (options);
139
+ solver1.solve (pb.G , pb.a , pb.C , pb.l , pb.u , pb.xl , pb.xu );
140
+ Eigen::VectorXd x1 = solver1.solution ();
141
+
142
+ FAST_CHECK_UNARY (x1.isApprox (x0));
143
+ }
144
+ }
145
+
107
146
TEST_CASE (" Precomputed R" )
108
147
{
109
148
const int nbVar = 7 ;
0 commit comments