Skip to content

Methods

Iterative refinement

Iterative refinement is performed after each solve with a direct linear solver. The residuals are computed on the uncondensed (possibly unsymmetric) Newton system, i.e. before the condensation of its condensed blocks (e.g. the bound duals of the primal-dual interior-point method); without condensation, the uncondensed system is the augmented system. The residuals use the factorized matrix (regularization included) without the Schur complement of the condensed blocks. Iterative refinement is not performed with limited-memory quasi-Newton Hessians (L-BFGS, L-SR1), since the augmented matrix then does not contain the full Hessian.

If refinement fails, the pivoting tolerance of the linear solver (MA27, MA57, MUMPS) is increased (at most once per matrix) and the matrix is refactorized; its inertia is checked again and the regularization increased if needed. The increase of the pivoting tolerance is permanent: all subsequent factorizations use the stricter tolerance, up to a solver-specific maximum (1e-4 for MA27 and MA57, 0.1 for MUMPS, as in IPOPT). If the tolerance cannot be increased and the residual ratio is above iterative_refinement_residual_ratio_singular, the matrix is deemed singular and the inertia correction strategy increases the regularization. Second-order corrections never modify the factorization (their refined solution is accepted as is).

Setting iterative_refinement_max_steps to 0 disables the whole mechanism (no residual computation, no pivoting tolerance increase, no singularity heuristic). Unlike IPOPT's max_refinement_steps (which allows up to max_refinement_steps + 1 steps), iterative_refinement_max_steps is the exact maximum number of refinement steps.