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
On ref/HiGHS/check/instances/issue-2388.lp the MILP driver returns status = optimal, obj = 0.0, bound = 0.0 after 1 node — and the incumbent it
hands back is infeasible. Eight of the 42 structural entries come back
holding the INF sentinel 1e20.
The reported objective happens to equal the true optimum (HiGHS: 0.0), so
nothing downstream notices: the objective is right because those eight columns
all have zero cost, not because the point is feasible.
This is the INF-sentinel class the repo CLAUDE.md already warns about
("INF in the Rust LP layer is the sentinel 1e20, not f64::INFINITY"), but
in the solution readback rather than in FBBT.
All eight are free columns (lb = -1e20, ub = +1e20 in standard form),
returned nonbasic at the sentinel upper bound. The other six free columns
(x31 x32 x41 x42 x43 x44) come back at sensible near-zero values, so this is
not "the whole model is unbounded" — it is specific columns parked on the
sentinel.
Why it slips the internal feasibility check
The sentinels cancel pairwise and exactly in the rows that pair them:
c1: x5 + x11 - x27 = 0 -> 1e20 + 0 - 1e20 = 0 exactly
c41: -a x5 + a x37 + b x43 = 0 -> same magnitude, cancels
so the residual on those rows is genuinely 0 and the point looks feasible.
The row that catches it does not pair them:
c43: x17 - x37 >= 10.2 -> 1e20 - 1e20 = 0 < 10.2
Violated by exactly 10.2. HiGHS on the same arrays returns a point with max |A_eq x - b_eq| = 6.6e-17 and max (A_ub x - b_ub) = 0.
Note on the reported violation magnitude
A verifier built on scipy.sparse matvec reports viol = 173.82 on row c41
for this point. That number is an artifact of the checker, not of the
solver: scipy's CSR matvec contracts to FMA, so evaluating -a*1e20 + a*1e20 accumulates the exact second product against the rounded first one and returns the first product's rounding residual instead
of 0. The dense dot of the identical row and vector gives exactly 0:
The c43 violation of 10.2 is FMA-independent and is the real one. Any
feasibility verifier in this repo that may see sentinel-valued entries should
avoid the sparse-matvec path for the same reason.
Reproduces identically on origin/main and on the #2122 branch — it is
pre-existing and unrelated to that fix.
Only issue-2388 in that 46-instance panel exhibits it, but the mechanism is
not instance-specific: any model with free columns that the simplex leaves
nonbasic at the sentinel bound can produce the same readback.
What "done" looks like
A free column must never be returned at ±1e20. Either the simplex must not
leave a free column nonbasic at a sentinel bound, or the readback must detect
it and refuse (loudly) rather than reporting optimal — per CLAUDE.md §3, a
refusal is preferable to a silently wrong certificate. A regression test should
assert that the returned incumbent for this instance satisfies every original
row within 1e-6, checked densely (see the FMA note above).
Summary
On
ref/HiGHS/check/instances/issue-2388.lpthe MILP driver returnsstatus = optimal, obj = 0.0, bound = 0.0after 1 node — and the incumbent ithands back is infeasible. Eight of the 42 structural entries come back
holding the
INFsentinel1e20.The reported objective happens to equal the true optimum (HiGHS: 0.0), so
nothing downstream notices: the objective is right because those eight columns
all have zero cost, not because the point is feasible.
This is the
INF-sentinel class the repoCLAUDE.mdalready warns about("
INFin the Rust LP layer is the sentinel1e20, notf64::INFINITY"), butin the solution readback rather than in FBBT.
Reproduction
What comes back
All eight are free columns (
lb = -1e20,ub = +1e20in standard form),returned nonbasic at the sentinel upper bound. The other six free columns
(
x31 x32 x41 x42 x43 x44) come back at sensible near-zero values, so this isnot "the whole model is unbounded" — it is specific columns parked on the
sentinel.
Why it slips the internal feasibility check
The sentinels cancel pairwise and exactly in the rows that pair them:
so the residual on those rows is genuinely 0 and the point looks feasible.
The row that catches it does not pair them:
Violated by exactly 10.2. HiGHS on the same arrays returns a point with
max |A_eq x - b_eq| = 6.6e-17andmax (A_ub x - b_ub) = 0.Note on the reported violation magnitude
A verifier built on
scipy.sparsematvec reportsviol = 173.82on rowc41for this point. That number is an artifact of the checker, not of the
solver: scipy's CSR matvec contracts to FMA, so evaluating
-a*1e20 + a*1e20accumulates the exact second product against therounded first one and returns the first product's rounding residual instead
of 0. The dense dot of the identical row and vector gives exactly 0:
The
c43violation of 10.2 is FMA-independent and is the real one. Anyfeasibility verifier in this repo that may see sentinel-valued entries should
avoid the sparse-matvec path for the same reason.
Scope
origin/mainand on the #2122 branch — it ispre-existing and unrelated to that fix.
issue-2388in that 46-instance panel exhibits it, but the mechanism isnot instance-specific: any model with free columns that the simplex leaves
nonbasic at the sentinel bound can produce the same readback.
What "done" looks like
A free column must never be returned at
±1e20. Either the simplex must notleave a free column nonbasic at a sentinel bound, or the readback must detect
it and refuse (loudly) rather than reporting
optimal— perCLAUDE.md§3, arefusal is preferable to a silently wrong certificate. A regression test should
assert that the returned incumbent for this instance satisfies every original
row within
1e-6, checked densely (see the FMA note above).🤖 Generated with Claude Code
https://claude.ai/code/session_0115eE146uMqL5w3mDqKgYSD