You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
where $[z]_+$ and $[z]_-$ stand for the projection of z onto the positive and negative orthant. ProxQP provides the ``check_duality_gap`` option to include this duality gap in the stopping criterion. Note that it is disabled by default, as other solvers don't check in general this criterion. Enable this option if you want a stronger guarantee that your solution is optimal. ProxQP will then check the same termination condition as SCS (for more details see, e.g., SCS's [optimality conditions checks](https://www.cvxgrp.org/scs/algorithm/index.html#optimality-conditions) as well as [section 7.2](https://doi.org/10.1137/20M1366307) in the corresponding paper). The absolute and relative thresholds $\epsilon^{\text{gap}}_{\text{abs}}, \epsilon^{\text{gap}}_{\text{rel}}$ for the duality gap can differ from those $\epsilon_{\text{abs}}, \epsilon_{\text{rel}}$ for residuals because, contrary to residuals which result from an infinite norm, the duality gap scales with the square root of the problem dimension (thus it is numerically harder to achieve a given duality gap for larger problems). A recommended choice is $\epsilon^{\text{gap}}_{\text{abs}} = \epsilon_{\text{abs}} \sqrt{\max(n, n_{\text{eq}}, n_{\text{ineq}})}$. Note finally that meeting all residual and duality-gap criteria can be difficult for ill-conditioned problems.
75
75
76
+
Finally, note that ProxQP has a specific feature for handling primal infeasibility. More precisely, if the problem appears to be primal infeasible, it will solve the closest primal feasible problem in $$\ell_2$$ sense, and (x,y,z) will satisfy
You can find more details on these subjects (and how to activate this feature with ProxQP) in the subsections describing the Settings and Results classes. You can also find more technical references with [this work](https://hal.science/hal-01057577).
90
+
76
91
\section OverviewAPIstructure ProxQP unified API for dense and sparse backends
77
92
78
93
ProxQP algorithm is implemented in two versions specialized for dense and sparse matrices. One simple and unified API has been designed for loading the dense and sparse backends. Concretely, it contains three methods:
@@ -395,7 +410,8 @@ In this table you have on the three columns from left to right: the name of the
395
410
| safe_guard | 1.E4 | Safeguard parameter ensuring global convergence of the scheme. More precisely, if the total number of iteration is superior to safe_guard, the BCL scheme accept always the multipliers (hence the scheme is a pure proximal point algorithm).
396
411
| preconditioner_max_iter | 10 | Maximal number of authorized iterations for the preconditioner.
397
412
| preconditioner_accuracy | 1.E-3 | Accuracy level of the preconditioner.
398
-
| HessianType | Dense | Defines the type of problem solved (Dense, Zero or Diagonal). In case Zero or Diagonal option are used, the solver optimize perform internally linear algebra operations involving the Hessian H.
413
+
| HessianType | Dense | Defines the type of problem solved (Dense, Zero or Diagonal). In case Zero or Diagonal option are used, the solver optimize perform internally linear algebra operations involving the Hessian H.
414
+
| primal_infeasibility_solving | False | If set to true, it solves the closest primal feasible problem if primal infeasibility is detected.
399
415
400
416
\subsection OverviewInitialGuess The different initial guesses
401
417
@@ -464,6 +480,8 @@ The result subclass is composed of:
464
480
* x: a primal solution,
465
481
* y: a Lagrange optimal multiplier for equality constraints,
466
482
* z: a Lagrange optimal multiplier for inequality constraints,
483
+
* se: the optimal shift in $$\ell_2$$ with respect to equality constraints,
484
+
* si: the optimal shift in $$\ell_2$$ with respect to inequality constraints,
467
485
* info: a subclass which containts some information about the solver's execution.
468
486
469
487
If the solver has solved the problem, the triplet (x,y,z) satisfies:
(se, si) stands in this context for the optimal shifts in $$\ell_2$$ sense which enables recovering a primal feasible problem. More precisely, they are derived such that
Note that if you use the dense backend and its specific feature for handling box inequality constraints, then the first $$n_in$$ elements of z correspond to multipliers associated to the linear inequality formed with $$C$$ matrix, whereas the last $$d$$ elements correspond to multipliers associated to the box inequality constraints (see for example solve_dense_qp.cpp or solve_dense_qp.py).
485
530
486
531
\subsection OverviewInfoClass The info subclass
@@ -529,6 +574,7 @@ The solver has five status:
529
574
* PROXQP_SOLVED: the problem is solved.
530
575
* PROXQP_MAX_ITER_REACHED: the maximum number of iterations has been reached.
531
576
* PROXQP_PRIMAL_INFEASIBLE: the problem is primal infeasible.
577
+
* PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE: the closest feasible problem in L2 sense is solved.
532
578
* PROXQP_DUAL_INFEASIBLE: the problem is dual infeasible.
533
579
* PROXQP_NOT_RUN: the solver has not been run yet.
0 commit comments