Skip to content

Results and status

cuPDLPx reports a termination status, primal and dual vectors, residuals, objective values, and solve statistics. Check the status before using the returned vectors. Field names differ across interfaces.

Termination status

Status Meaning Next step
Optimal Presolve solved the LP, or the main iteration met the feasibility and optimality tolerances. Check the final residuals and gap, especially if polishing is enabled.
Primal infeasible The solver detected primal infeasibility. Review the constraints and bounds, along with any returned infeasibility information.
Dual infeasible The solver detected dual infeasibility, which can indicate an unbounded primal problem. Review any returned infeasibility information and check for unbounded directions.
Infeasible or unbounded Presolve or the solver could not distinguish infeasibility from unboundedness. Inspect the model and log for more detail.
Time limit The wall-clock limit was reached. Check residuals and the gap; increase the time limit if needed.
Iteration limit The iteration limit was reached. Check residuals and the gap; increase the iteration limit if needed.
Feasibility polishing succeeded A feasibility-polishing phase reached the polishing tolerance. Check the final residuals and gap; polishing alone does not establish optimality.
Unspecified No more specific termination reason is available. Inspect the log and input data.

Feasibility polishing preserves the main solve's termination status. The final gap can exceed the optimality tolerance even when the status is OPTIMAL.

Always inspect the status

Reaching a time or iteration limit does not establish feasibility or optimality. Check the residuals and primal–dual gap before using the returned iterate.

Solution and quality measures

The result contains:

Result Description
Primal solution \(x\) One value for each variable.
Dual solution \(y\) One multiplier for each constraint.
Dual slacks \(r\) One dual slack for each variable.
Primal objective \(c^\top x+c_0\) in the original objective sense.
Dual objective Reported dual objective value; a valid bound requires dual feasibility.
Objective gap Absolute and relative primal–dual gaps.
Primal residual Absolute and relative violation of the primal constraints.
Dual residual Absolute and relative violation of \(c-A^\top y-r=0\).
Infeasibility information Primal- and dual-ray quality measures when applicable.
Work statistics Iteration counts and phase timings.

With presolve enabled, the reported residuals and objective gap refer to the presolved model, while the solution vectors are recovered for the original model.

See Python results, the Julia interface, C result fields, and command-line output files for field names and access methods.

Status constants

Use symbolic constants to compare statuses; Python and C use different integer values. Julia maps the native termination reason to a MathOptInterface status; see the Julia interface.

Status Constant
Optimal PDLP.OPTIMAL
Primal infeasible PDLP.PRIMAL_INFEASIBLE
Dual infeasible PDLP.DUAL_INFEASIBLE
Infeasible or unbounded PDLP.INFEASIBLE_OR_UNBOUNDED
Time limit PDLP.TIME_LIMIT
Iteration limit PDLP.ITERATION_LIMIT
Feasibility polishing succeeded PDLP.FEAS_POLISH_SUCCESS
Unspecified PDLP.UNSPECIFIED
Status Constant
Optimal TERMINATION_REASON_OPTIMAL
Primal infeasible TERMINATION_REASON_PRIMAL_INFEASIBLE
Dual infeasible TERMINATION_REASON_DUAL_INFEASIBLE
Infeasible or unbounded TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED
Time limit TERMINATION_REASON_TIME_LIMIT
Iteration limit TERMINATION_REASON_ITERATION_LIMIT
Feasibility polishing succeeded TERMINATION_REASON_FEAS_POLISH_SUCCESS
Unspecified TERMINATION_REASON_UNSPECIFIED