Results#
Solve Results#
Unified solver result for Cvxium: a SolveResult built from concern-scoped parts.
A solver’s result carries fields whose applicability depends on two independent things:
the problem (a feasibility problem has no objective value; an unconstrained problem has
no Lagrange multipliers) and the solver (the barrier method has inner centering steps
that the primal-dual method lacks). Rather than encode that two-dimensional fact in a
one-dimensional inheritance chain, which forces sentinel values into the data and
isinstance checks into every caller, SolveResult is a single concrete type
assembled by composition:
the always-present spine (
solution,status,message,solver,n_iterations);problem-shape parts (
objective,duals), present exactly when the problem has that structure, so their absence itself carries the information a sentinel would;a single solver-method part (
diagnostics), whose concrete type names the solver that ran;optional
certificateandphase1parts.
Convenience accessors (objective_value, equality_multipliers, and so on)
delegate into the parts and raise a specific error when the concern is absent, so the
common path stays flat. TwoBlockSolveResult adds x- and y-block views for
saddle-point solves.
The module depends only on NumPy, matplotlib, and the standard library; it imports no
other Cvxium module, so it can be used anywhere without risking an import cycle.
(matplotlib backs the diagnostics plotting methods and, under lazy imports, is not
loaded until a plot method is first called.) Every container is frozen (a result is a
value, not a workspace) with eq=False, because the fields include NumPy arrays and
nested parts with no clean value equality or hash; compare fields explicitly instead.
Each container supports a to_dict/from_dict round trip, and SolveResult adds
serialize/deserialize for JSON.
- class cvxium.problems.result.SolveStatus(*values)[source]#
Bases:
EnumOutcome of a solve.
The members are:
OPTIMAL: the duality gap is within tolerance;ACCEPTABLE: the gap is within the soft tolerance;FEASIBLE: a feasibility solve found a feasible point;MAX_ITERATIONS: an optimization stopped at a best-effort iterate;INFEASIBLE: certified infeasible, or no feasible point was found (ProblemMarginallyFeasibleErrorcarries this status without claiming a certificate);UNBOUNDED: certified unbounded.
The centering step still reports the integer codes 0, 1, and 2 internally;
_legacy_solve_statusinoptimizationmaps them toOPTIMAL,ACCEPTABLE, andMAX_ITERATIONS.
- class cvxium.problems.result.SolverDiagnostics[source]#
Bases:
objectSolver-method part of a result; the concrete subclass names the solver.
The base carries no fields; each solver’s subclass exposes its own per-iteration trajectories as typed tuples. The subclasses are
BarrierDiagnostics,SaddleBarrierDiagnostics,PrimalDualDiagnosticsandHsdDiagnostics.- iteration_count()[source]#
Return the number of iterations performed, comparable within one solver.
The unit differs by method (Newton steps for the barrier method, outer iterations for the primal-dual and homogeneous self-dual methods), but within one solver it is an honest measure of work, which is what a performance guard needs.
- Returns:
n – The iteration count; 0 in the base, meaning the solver does not report one.
- Return type:
- static from_dict(d)[source]#
Reconstruct the tagged diagnostics subclass from
to_dictoutput.Dispatches on the
"__type__"tag. The barrier step trajectories (inner_btls_steps,inner_quadratic_from) and the primal-dualstep_sizesare optional in the payload and default to empty.- Parameters:
d (dict[str, Any]) – A dict produced by some diagnostics class’s
to_dict.- Returns:
diagnostics – An instance of the tagged class.
- Return type:
- Raises:
ValueError – When the tag names no known diagnostics class.
KeyError – When a required entry is missing.
- class cvxium.problems.result.BarrierDiagnostics(duality_gaps=(), inner_nits=(), inner_suboptimalities=(), inner_btls_steps=(), inner_quadratic_from=())[source]#
Bases:
SolverDiagnosticsBarrier-method trajectories, one entry per outer (barrier-parameter) step.
Entry i of
inner_nits,inner_suboptimalities,inner_btls_stepsandinner_quadratic_fromdescribes the inner Newton centering performed during outer step i.Together,
inner_btls_stepsandinner_quadratic_fromanswer a question the other trajectories cannot: whether the solver takes full Newton steps once it is entitled to. Past the quadratic-convergence threshold, backtracking accepts the unit step (Boyd and Vandenberghe, 2004, section 9.5.3), so a step below 1 there means a step cap is binding when it should not be, a defect that costs iterations silently and otherwise shows up only as a slow solver.steps_past_quadratic_convergenceextracts those steps.- Fields:
duality_gaps (tuple[float, …]) – Duality gap after each outer step.
inner_nits (tuple[int, …]) – Number of Newton iterations in each centering step.
inner_suboptimalities (tuple[tuple[float, …], …]) – Per centering step, the suboptimality estimate λ^2 / 2 (λ the Newton decrement) at each Newton iteration.
inner_btls_steps (tuple[tuple[float, …], …]) – Per centering step, the accepted backtracking step length of each Newton iteration.
inner_quadratic_from (tuple[int | None, …]) – Per centering step, the 0-based index into that step’s
inner_btls_stepsentry of the first step taken after the suboptimality fell below the quadratic-convergence threshold;Nonewhen it never did.
References
Boyd, Stephen and Vandenberghe, Lieven, Convex Optimization, Cambridge University Press, 2004.
- iteration_count()[source]#
Return the total number of Newton iterations across all centering steps.
- Returns:
n – The sum of
inner_nits.- Return type:
- steps_past_quadratic_convergence()[source]#
Return every accepted step length taken in the quadratic phase.
The hook for regression tests, which assert that these are all 1: a solver in the quadratic phase that is not taking unit steps has a cap binding somewhere, and the iterations it costs are invisible in any aggregate the result otherwise exposes.
- plot_convergence(ax=None)[source]#
Plot the duality gap per outer step on a log scale.
Draws a step function (
stairs), since the barrier duality gap is a discrete value sampled once per outer centering step.PrimalDualDiagnosticsandHsdDiagnosticstrack per-iteration trajectories and draw ordinary line plots instead.- Parameters:
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.- Returns:
ax – The axes drawn on.
- Return type:
Axes
- plot_newton_convergence(it, ax=None)[source]#
Plot the inner Newton suboptimality for one outer (centering) step.
- Parameters:
it (int) – The outer step to plot, 1-indexed.
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.
- Returns:
ax – The axes drawn on.
- Return type:
Axes
- Raises:
ValueError – When
inner_nitsandinner_suboptimalitiesdiffer in length, when no trajectories were recorded, or whenitis outside 1 to the number of outer steps.
- class cvxium.problems.result.SaddleBarrierDiagnostics(duality_gaps=(), inner_nits=(), inner_suboptimalities=(), inner_btls_steps=(), inner_quadratic_from=(), upper_bounds=(), lower_bounds=(), certified_upper_bounds=(), certified_lower_bounds=())[source]#
Bases:
BarrierDiagnosticsBarrier trajectories for a two-block saddle solve, with saddle-value brackets.
Extends
BarrierDiagnosticswith a closed-form bracket on the saddle value V, recorded once per outer step:lower_bounds[i] ≤ V ≤ upper_bounds[i].
The two-block objective ζ is concave in the x-block and convex in the y-block (the negated x-block Hessian is positive definite), so a joint stationary point solves
max_x min_y ζ(x, y).
On the barrier central path, the two frozen-block best-response duals have a closed form (central-path duality applied per block). With the barrier parameter t, the per-block inequality counts m_x (the x-block, a maximization) and m_y (the y-block, a minimization), and the achieved saddle value
v = ζ(x, y),
the bounds are
L = v - m_y / t ≤ V, U = v + m_x / t ≥ V.
The y-block, the inner minimization (min_y ζ(x_bar, y) ≤ V), sets the lower bound, and the x-block, the outer maximization (max_x ζ(x, y_bar) ≥ V), sets the upper bound. So upper_bounds[i] - lower_bounds[i] equals duality_gaps[i], the surrogate gap (m_x + m_y) / t. The bracket is exact on the central path and approximate, to the inner centering tolerance, off it, the same caveat the surrogate gap carries.
The optional certified bounds give a guaranteed bracket that holds off the central path too. Each is obtained by minimizing the frozen-block Lagrangian again with a warm-started mini-Newton solve and subtracting δ^2, the squared Newton decrement. Inside the self-concordant region (Boyd and Vandenberghe, 2004, Eq. 9.50) this correction yields a guaranteed bound, so
certified_lower_bounds[i] ≤ V ≤ certified_upper_bounds[i]
holds unconditionally. When a block’s minimization leaves the self-concordant region where the correction is valid, the entry is -inf (lower) or inf (upper), a conservative deferral rather than an unsound bound.
The fields of
BarrierDiagnosticsare inherited; the new fields are below.- Fields:
upper_bounds (tuple[float, …]) – Closed-form upper bound U on the saddle value after each outer step.
lower_bounds (tuple[float, …]) – Closed-form lower bound L on the saddle value after each outer step.
certified_upper_bounds (tuple[float, …]) – Guaranteed upper bound after each outer step, inf where deferred; empty when the certified dual was not evaluated.
certified_lower_bounds (tuple[float, …]) – Guaranteed lower bound after each outer step, -inf where deferred; empty when the certified dual was not evaluated.
References
Boyd, Stephen and Vandenberghe, Lieven, Convex Optimization, Cambridge University Press, 2004.
- to_dict()[source]#
Serialize the saddle trajectories and value brackets to a JSON-ready dict.
The certified bounds may contain ±inf deferrals.
json.dumpsencodes them asInfinityand-Infinityunder its defaultallow_nan=True, andjson.loadsreads them back.
- plot_bounds(ax=None)[source]#
Plot the upper and lower bounds on the saddle value against the outer step.
Each bound is sampled once per outer centering step, so the two curves are drawn as step functions closing on the saddle value, with the bracket between them shaded.
plot_convergenceshows the same information as a single gap curve on a log scale. When present, the certified bracket is overlaid as dashed curves, with the ±inf deferrals masked out so that only steps with a guaranteed bound are drawn.- Parameters:
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.- Returns:
ax – The axes drawn on.
- Return type:
Axes
- Raises:
ValueError – When
upper_boundsandlower_boundsdiffer in length, when no bounds were recorded, or when certified bounds are present but do not match that length.
- class cvxium.problems.result.PrimalDualDiagnostics(surrogate_gaps=(), primal_residual_norms=(), dual_residual_norms=(), step_sizes=())[source]#
Bases:
SolverDiagnosticsPrimal-dual trajectories, one entry per outer iteration.
- Fields:
surrogate_gaps (tuple[float, …]) – Surrogate duality gap η̂ = -f^T λ at each iteration.
primal_residual_norms (tuple[float, …]) – Euclidean norm of the primal residual r_pri at each iteration.
dual_residual_norms (tuple[float, …]) – Euclidean norm of the dual residual r_dual at each iteration.
step_sizes (tuple[float, …]) – Step length taken at each iteration.
- iteration_count()[source]#
Return the number of outer primal-dual iterations.
- Returns:
n – The length of
surrogate_gaps.- Return type:
- late_step_sizes(fraction=0.25)[source]#
Return the step lengths over the last fraction of the solve.
The primal-dual analogue of the barrier method’s quadratic phase. There is no threshold to cross here; the health signal is that the step length approaches 1 as the iterates converge, since a method still taking short steps at the end is being held back by something. Asserting on the tail rather than on a phase flag keeps the claim to what the method actually guarantees.
- Parameters:
fraction (float) –
Share of the trajectory to return, in (0, 1]. For n recorded steps the tail has
max(1, floor(n × fraction))
entries. Out-of-range values are rejected rather than clamped, since each has a plausible but wrong answer: 0 or a negative value would floor to a one-element tail, and a value above 1 (such as 25 meant as 25%) would return the whole trajectory.
- Returns:
steps – The last entries of
step_sizes; empty when no steps were recorded.- Return type:
- Raises:
ValueError – When
fractionis outside (0, 1].
- plot_convergence(ax=None)[source]#
Plot the surrogate duality gap η̂ = -f^T λ against the iteration.
The primal-dual method does not evaluate a true duality gap at each iteration; it tracks the cheap surrogate gap, and the axis is labeled accordingly. Pass
axto combine withplot_feasibilityon a shared figure.- Parameters:
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.- Returns:
ax – The axes drawn on.
- Return type:
Axes
- plot_feasibility(ax=None)[source]#
Plot the feasibility residual against the iteration.
At each iteration the residual is
r_feas = sqrt(‖r_pri‖^2 + ‖r_dual‖^2),
the primal and dual parts of the KKT residual, excluding the centrality term (Boyd and Vandenberghe, 2004, section 11.7). Pass
axto combine withplot_convergenceon a shared figure.- Parameters:
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.- Returns:
ax – The axes drawn on.
- Return type:
Axes
- Raises:
ValueError – When
primal_residual_normsanddual_residual_normsdiffer in length (raised byzip(..., strict=True)).
References
Boyd, Stephen and Vandenberghe, Lieven, Convex Optimization, Cambridge University Press, 2004.
- class cvxium.problems.result.HsdDiagnostics(duality_gaps=(), tau_history=(), kappa_history=())[source]#
Bases:
SolverDiagnosticsHomogeneous self-dual trajectories, one entry per outer iteration.
There is no step-length trajectory: the step length is chosen inside the inner cone driver and is not surfaced here. An always-empty field would read as “the solver took no steps” rather than “this solver does not report them”.
- Fields:
duality_gaps (tuple[float, …]) – Normalized complementarity gap μ of the embedding at each iteration.
tau_history (tuple[float, …]) – Homogenizing variable τ at each iteration.
kappa_history (tuple[float, …]) – Homogenizing variable κ at each iteration.
- iteration_count()[source]#
Return the number of outer homogeneous self-dual iterations.
- Returns:
n – The length of
duality_gaps.- Return type:
- plot_convergence(ax=None)[source]#
Plot the embedding’s duality gap μ per iteration on a log scale.
- Parameters:
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.- Returns:
ax – The axes drawn on.
- Return type:
Axes
- plot_homogeneity(ax=None)[source]#
Plot the homogenizing variables τ and κ per iteration on a log scale.
In the homogeneous self-dual embedding, τ > 0 at convergence recovers the original optimum, while τ → 0 with κ bounded away from zero certifies infeasibility or unboundedness; τ κ → 0 is the embedding’s complementarity condition. Plotting both makes the termination regime visible at a glance.
The log scale silently omits nonpositive values. The solver terminates before τ or κ underflows to zero, so in practice every stored value is positive and the infeasibility regime stays visible.
- Parameters:
ax (Axes | None) – Axes to draw on;
Nonecreates a new figure.- Returns:
ax – The axes drawn on.
- Return type:
Axes
- Raises:
ValueError – When
tau_historyandkappa_historydiffer in length.
- class cvxium.problems.result.ObjectiveOutcome(value, suboptimality, dual_value=None)[source]#
Bases:
objectObjective part of a result, present exactly when the problem had an objective.
- Fields:
value (float) – Objective value at the solution.
suboptimality (float) – Bound on the achieved suboptimality, a nonnegative magnitude.
dual_value (float | None) – Value of the Lagrangian dual at the solution, or
Nonewhen the solver did not compute one.
- static from_dict(d)[source]#
Reconstruct an outcome from a dict produced by
to_dict.- Parameters:
- Returns:
outcome – The reconstructed outcome.
- Return type:
- Raises:
KeyError – When an entry is missing.
- property duality_gap#
Return the gap between the objective value and its dual bound, if known.
Reported as a magnitude so that it reads the same in both optimization senses: for a minimization
valuelies above the lower bounddual_value, while for a maximization (seenegated) it lies below the upper bound. For a minimization, where weak duality forces value ≥ dual_value, the gap equalsvalue - dual_value.- Returns:
gap – |value - dual_value|, or
Nonewhendual_valueisNone.- Return type:
float | None
- negated()[source]#
Return this outcome viewed from the opposite optimization sense.
The solvers only minimize;
Problem.maximize(g)has them minimize -g, sovalueanddual_valuedescribe that minimization. Negating both recovers the maximization view:valuebecomes g(x_star) anddual_valuethe corresponding upper bound on g.suboptimalityis a nonnegative magnitude and does not depend on the sense, so it carries over unchanged, as doesduality_gap.- Returns:
outcome – The outcome with
valueanddual_valuenegated.- Return type:
- class cvxium.problems.result.Duals(equality_multipliers=None, inequality_multipliers=None)[source]#
Bases:
objectLagrange multipliers, each present exactly when the problem had such constraints.
- Fields:
equality_multipliers (npt.NDArray[np.float64] | None) – Multipliers ν of the equality constraints A x = b, or
None.inequality_multipliers (npt.NDArray[np.float64] | None) – Multipliers λ of the inequality constraints, or
None.
- class cvxium.problems.result.InfeasibilityCertificate(kind, primal_witness=None, dual_witness=None)[source]#
Bases:
objectWitness that a problem is infeasible or unbounded.
- Fields:
kind (Literal[“infeasible”, “unbounded”]) – What the certificate proves.
primal_witness (npt.NDArray[np.float64] | None) – Primal vector supporting the certificate, or
None.dual_witness (npt.NDArray[np.float64] | None) – Dual vector supporting the certificate, or
None.
- static from_dict(d)[source]#
Reconstruct a certificate from a dict produced by
to_dict.- Parameters:
- Returns:
certificate – The reconstructed certificate.
- Return type:
- Raises:
ValueError – When
kindis neither"infeasible"nor"unbounded".KeyError – When an entry is missing.
- class cvxium.problems.result.SolveResult(solution, status, message, solver, n_iterations, objective=None, duals=None, diagnostics=None, certificate=None, phase1=None)[source]#
Bases:
objectResult of a solve.
The spine fields are always present.
objectiveanddualsare present according to the problem’s shape,diagnosticsaccording to the solver,certificateonly when the solve certified infeasibility or unboundedness, andphase1only when a Phase I feasibility solve ran. The accessors (objective_value,dual_value,equality_multipliers, the typed diagnostics views, and so on) raise a specific error when the part they read is absent.- Fields:
solution (npt.NDArray[np.float64]) – The final iterate.
status (SolveStatus) – Outcome of the solve.
message (str) – Human-readable description of the outcome.
solver (str) – Name of the solver that ran.
n_iterations (int) – Iteration count reported by the solver.
objective (ObjectiveOutcome | None) – Objective part;
Nonefor a feasibility problem.duals (Duals | None) – Lagrange multipliers;
Nonewhen the problem had no constraints or the solver did not report them.diagnostics (SolverDiagnostics | None) – Solver-method trajectories, whose type names the solver.
certificate (InfeasibilityCertificate | None) – Certificate of infeasibility or unboundedness, when one was found.
phase1 (SolveResult | None) – Result of the Phase I feasibility solve, when one ran.
- to_dict()[source]#
Serialize to a JSON-ready dict tagged with the concrete type.
The parts (
objective,duals,diagnostics,certificate) and the nestedphase1result are serialized in place. Each absent part is kept asNone, so its absence, itself information, survives the round trip.
- static from_dict(d)[source]#
Reconstruct the tagged
SolveResultclass fromto_dictoutput.Dispatches on the
"__type__"tag toSolveResultorTwoBlockSolveResult, reconstructing each part and the nestedphase1result.- Parameters:
- Returns:
result – The reconstructed result, of the tagged class.
- Return type:
- Raises:
ValueError – When the tag names no known result class or
statusis not aSolveStatusvalue. Also propagated from the parts’from_dictmethods and fromTwoBlockSolveResultvalidation.KeyError – When a required entry is missing.
- serialize()[source]#
Serialize the result to a JSON string.
±inf deferrals in the diagnostics are encoded under
json’s defaultallow_nan=Trueand round-trip throughdeserialize.- Returns:
s – The JSON text, indented by 2.
- Return type:
- static deserialize(s)[source]#
Reconstruct a result from
serializeoutput.- Parameters:
s (str) – JSON text produced by
serialize.- Returns:
result – The reconstructed result, of the tagged class.
- Return type:
- Raises:
ValueError – Propagated from
from_dict; also raised byjson.loadsfor malformed text.KeyError – Propagated from
from_dict.
- property succeeded#
Check whether the solve reached a usable optimal or feasible point.
- Returns:
ok – True when
statusisOPTIMAL,ACCEPTABLEorFEASIBLE.- Return type:
- property barrier_diagnostics#
Return the diagnostics, narrowed to the barrier engine.
A typed view of
diagnosticsfor the caller that reads the barrier convergence trajectories. It raises rather than returning a wrongly typed value, so misuse fails loudly even underpython -O. A saddle barrier solve’s diagnostics also qualify.- Returns:
diagnostics – The diagnostics part.
- Return type:
- Raises:
WrongDiagnosticsError – When
diagnosticsis not aBarrierDiagnostics.
- property saddle_barrier_diagnostics#
Return the diagnostics, narrowed to the two-block saddle barrier engine.
A typed view of
diagnosticsfor the caller that reads the saddle value bracket (upper_boundsandlower_bounds). It raises rather than returning a wrongly typed value, so misuse fails loudly.- Returns:
diagnostics – The diagnostics part.
- Return type:
- Raises:
WrongDiagnosticsError – When
diagnosticsis not aSaddleBarrierDiagnostics.
- property primal_dual_diagnostics#
Return the diagnostics, narrowed to the primal-dual engine.
- Returns:
diagnostics – The diagnostics part.
- Return type:
- Raises:
WrongDiagnosticsError – When
diagnosticsis not aPrimalDualDiagnostics.
- property hsd_diagnostics#
Return the diagnostics, narrowed to the homogeneous self-dual engine.
- Returns:
diagnostics – The diagnostics part.
- Return type:
- Raises:
WrongDiagnosticsError – When
diagnosticsis not anHsdDiagnostics.
- property objective_value#
Return the objective value at the solution.
- Returns:
value –
objective.value.- Return type:
- Raises:
NoObjectiveError – When the result has no objective part (a feasibility solve).
- property suboptimality#
Return the achieved suboptimality bound at the solution.
- Returns:
suboptimality –
objective.suboptimality.- Return type:
- Raises:
NoObjectiveError – When the result has no objective part (a feasibility solve).
- property dual_value#
Return the value of the Lagrangian dual at the solution.
- Returns:
dual_value –
objective.dual_value.- Return type:
- Raises:
NoObjectiveError – When the result has no objective part (a feasibility solve).
NoDualValueError – When the solver did not compute a dual value.
- property equality_multipliers#
Return the Lagrange multipliers of the equality constraints.
- Returns:
nu –
duals.equality_multipliers.- Return type:
npt.NDArray[np.float64]
- Raises:
NoDualsError – When the result has no duals part, or the problem had no equality constraints.
- property inequality_multipliers#
Return the Lagrange multipliers of the inequality constraints.
- Returns:
lmbda –
duals.inequality_multipliers.- Return type:
npt.NDArray[np.float64]
- Raises:
NoDualsError – When the result has no duals part, or the problem had no inequality constraints.
- class cvxium.problems.result.TwoBlockSolveResult(solution, status, message, solver, n_iterations, objective=None, duals=None, diagnostics=None, certificate=None, phase1=None, x_dimension=0)[source]#
Bases:
SolveResultResult of a solve whose primal splits into an x-block and a y-block.
A saddle-point (two-block stationarity) solve produces two coupled variables, an x-block and a y-block, rather than a single primal vector. This class keeps the spine’s
solutionas the flat concatenation (x, y), so every genericSolveResultconsumer works unchanged, and addsxandyviews that split it atx_dimension. Both saddle engines (stationarity_solverandprimal_dual_stationarity_solver) return this type; which one ran is recorded indiagnostics, as for ordinary solves. Build one withfrom_blocks. The fields ofSolveResultare inherited; the new field is below.- Fields:
x_dimension (int) – Length of the x-block. Must lie in [0, len(solution)], or construction raises
ValueError.
- to_dict()[source]#
Serialize to a JSON-ready dict, adding the block split point.
Reuses
SolveResult.to_dictand retags the concrete type, so thatSolveResult.from_dictroutes back to this class.
- property x#
Return the x-block of the solution.
- Returns:
x – The first
x_dimensionentries ofsolution(a view, not a copy).- Return type:
npt.NDArray[np.float64]
- property y#
Return the y-block of the solution.
- Returns:
y – The entries of
solutionafter the firstx_dimension(a view, not a copy).- Return type:
npt.NDArray[np.float64]
- classmethod from_blocks(*, x, y, status, message, solver, n_iterations, objective=None, duals=None, diagnostics=None)[source]#
Build a two-block result from its x- and y-blocks.
Concatenates the blocks into the flat
solutionand records the split point inx_dimension, so thatxandyrecover them. Thecertificateandphase1parts are leftNone.- Parameters:
x (npt.NDArray[np.float64]) – The x-block, converted to float64.
y (npt.NDArray[np.float64]) – The y-block, converted to float64.
status (SolveStatus) – Outcome of the solve.
message (str) – Human-readable description of the outcome.
solver (str) – Name of the solver that ran.
n_iterations (int) – Iteration count reported by the solver.
objective (ObjectiveOutcome | None) – Objective part, or
None.duals (Duals | None) – Lagrange multipliers, or
None.diagnostics (SolverDiagnostics | None) – Solver-method trajectories, or
None.
- Returns:
result – The assembled result.
- Return type: