Skip to content

Commit 21c54d9

Browse files
committed
proxqp: fix absolute value check on duality gap
1 parent fac400e commit 21c54d9

File tree

2 files changed

+24
-37
lines changed

2 files changed

+24
-37
lines changed

include/proxsuite/proxqp/dense/solver.hpp

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,26 +1073,11 @@ qp_solve( //
10731073
ruiz.scale_dual_in_place_eq(VectorViewMut<T>{ from_eigen, qpresults.y });
10741074
ruiz.scale_dual_in_place_in(VectorViewMut<T>{ from_eigen, qpresults.z });
10751075
}
1076-
if (is_primal_feasible) {
1077-
1078-
if (dual_feasibility_lhs >=
1079-
qpsettings.refactor_dual_feasibility_threshold &&
1080-
qpresults.info.rho != qpsettings.refactor_rho_threshold) {
1081-
1082-
T rho_new(qpsettings.refactor_rho_threshold);
1083-
1084-
refactorize(qpmodel, qpresults, qpwork, rho_new);
1085-
qpresults.info.rho_updates += 1;
1086-
1087-
qpresults.info.rho = rho_new;
1088-
}
1089-
if (is_dual_feasible) {
1090-
if (qpresults.info.duality_gap <=
1091-
qpsettings.eps_abs +
1092-
(qpsettings.eps_abs + qpsettings.eps_rel) * rhs_duality_gap) {
1093-
qpresults.info.status = QPSolverOutput::PROXQP_SOLVED;
1094-
break;
1095-
}
1076+
if (is_primal_feasible && is_dual_feasible) {
1077+
if (std::abs(qpresults.info.duality_gap) <=
1078+
qpsettings.eps_abs + qpsettings.eps_rel * rhs_duality_gap) {
1079+
qpresults.info.status = QPSolverOutput::PROXQP_SOLVED;
1080+
break;
10961081
}
10971082
}
10981083
qpresults.info.iter_ext += 1; // We start a new external loop update
@@ -1170,9 +1155,8 @@ qp_solve( //
11701155
std::max(dual_feasibility_rhs_1, qpwork.dual_feasibility_rhs_2)));
11711156

11721157
if (is_dual_feasible) {
1173-
if (qpresults.info.duality_gap <=
1174-
qpsettings.eps_abs +
1175-
(qpsettings.eps_abs + qpsettings.eps_rel) * rhs_duality_gap) {
1158+
if (std::abs(qpresults.info.duality_gap) <=
1159+
qpsettings.eps_abs + qpsettings.eps_rel * rhs_duality_gap) {
11761160
qpresults.info.status = QPSolverOutput::PROXQP_SOLVED;
11771161
break;
11781162
}

include/proxsuite/proxqp/sparse/solver.hpp

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -324,11 +324,11 @@ struct PrimalDualGradResult
324324
/*!
325325
* Executes the PROXQP algorithm.
326326
*
327-
* @param work solver workspace.
328-
* @param model QP problem model as defined by the user (without any scaling
327+
* @param results solver results.
328+
* @param data QP problem model as defined by the user (without any scaling
329329
* performed).
330330
* @param settings solver settings.
331-
* @param results solver results.
331+
* @param work solver workspace.
332332
* @param precond preconditioner.
333333
*/
334334
template<typename T, typename I, typename P>
@@ -781,7 +781,8 @@ qp_solve(Results<T>& results,
781781
VEG_BIND( // ?
782782
auto,
783783
(primal_feasibility_lhs, dual_feasibility_lhs),
784-
detail::unscaled_primal_dual_residual(results,
784+
detail::unscaled_primal_dual_residual(work,
785+
results,
785786
primal_residual_eq_scaled,
786787
primal_residual_in_scaled_lo,
787788
primal_residual_in_scaled_up,
@@ -841,9 +842,8 @@ qp_solve(Results<T>& results,
841842
}
842843
if (is_primal_feasible(primal_feasibility_lhs) &&
843844
is_dual_feasible(dual_feasibility_lhs)) {
844-
if (results.info.duality_gap <=
845-
settings.eps_abs +
846-
(settings.eps_rel + settings.eps_abs) * rhs_duality_gap) {
845+
if (std::abs(results.info.duality_gap) <=
846+
settings.eps_abs + settings.eps_rel * rhs_duality_gap) {
847847
results.info.pri_res = primal_feasibility_lhs;
848848
results.info.dua_res = dual_feasibility_lhs;
849849
results.info.status = QPSolverOutput::PROXQP_SOLVED;
@@ -886,8 +886,10 @@ qp_solve(Results<T>& results,
886886
LDLT_TEMP_VEC_UNINIT(bool, new_active_constraints, n_in, stack);
887887
auto rhs = dw;
888888

889-
work.active_set_low.array() = primal_residual_in_scaled_lo.array() <= 0;
890-
work.active_set_up.array() = primal_residual_in_scaled_up.array() >= 0;
889+
work.active_set_low.array() =
890+
primal_residual_in_scaled_lo.array() <= 0;
891+
work.active_set_up.array() =
892+
primal_residual_in_scaled_up.array() >= 0;
891893
new_active_constraints = work.active_set_low || work.active_set_up;
892894

893895
// active set change
@@ -1211,7 +1213,8 @@ qp_solve(Results<T>& results,
12111213
VEG_BIND(
12121214
auto,
12131215
(primal_feasibility_lhs_new, dual_feasibility_lhs_new),
1214-
detail::unscaled_primal_dual_residual(results,
1216+
detail::unscaled_primal_dual_residual(work,
1217+
results,
12151218
primal_residual_eq_scaled,
12161219
primal_residual_in_scaled_lo,
12171220
primal_residual_in_scaled_up,
@@ -1232,9 +1235,8 @@ qp_solve(Results<T>& results,
12321235

12331236
if (is_primal_feasible(primal_feasibility_lhs_new) &&
12341237
is_dual_feasible(dual_feasibility_lhs_new)) {
1235-
if (results.info.duality_gap <=
1236-
settings.eps_abs +
1237-
(settings.eps_abs + settings.eps_rel) * rhs_duality_gap) {
1238+
if (std::fabs(results.info.duality_gap) <=
1239+
settings.eps_abs + settings.eps_rel * rhs_duality_gap) {
12381240
results.info.pri_res = primal_feasibility_lhs_new;
12391241
results.info.dua_res = dual_feasibility_lhs_new;
12401242
results.info.status = QPSolverOutput::PROXQP_SOLVED;
@@ -1274,7 +1276,8 @@ qp_solve(Results<T>& results,
12741276
VEG_BIND(
12751277
auto,
12761278
(_, dual_feasibility_lhs_new_2),
1277-
detail::unscaled_primal_dual_residual(results,
1279+
detail::unscaled_primal_dual_residual(work,
1280+
results,
12781281
primal_residual_eq_scaled,
12791282
primal_residual_in_scaled_lo,
12801283
primal_residual_in_scaled_up,

0 commit comments

Comments
 (0)