| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
i_scaled is the only scaled quantity that dense::setup does not refresh from the unscaled model before scaling, so the branch of scale_qp_in_place which reuses the existing equilibration has to reset it. Otherwise it is multiplied by delta again at every update performed with update_preconditioner = false, and the box multipliers are returned scaled by the accumulated factor.
| Back | FazBrowse Home | New Git URL |
Problem
In the dense backend with box constraints, update(..., update_preconditioner = false) (the default since #250) returns box multipliers scaled by a factor which compounds on every call. Re-solving an unchanged model gives a growing dual error while results.info.status stays PROXQP_SOLVED. The primal solution is unaffected, so the error is invisible unless the stationarity residual is checked explicitly.
The exact multipliers are z = (2, 200):
z(1) follows 200 / 0.991046^k, i.e. the returned multiplier is the true one divided by the
accumulated i_scaled drift.
Cause
dense/preconditioner/ruiz.hpp, scale_qp_in_place: the branch taken when execute_preconditioner == false scales i_scaled without resetting it first, while the true branch resets it via i_scaled.setOnes().
i_scaled is also the only scaled quantity that dense/helpers.hpp::setup does not refresh before scaling. The matrices/vectors H_scaled, g_scaled, A_scaled, b_scaled, C_scaled, l/u_scaled and l/u_box_scaled are all re-copied from the unscaled qpmodel on every update, so they start clean. i_scaled has no counterpart in the model to be copied from, and so carries the previous scaling into the next one.
After k updates it holds (delta.head * delta.tail)^k instead of delta.head * delta.tail.