fix: relax the cost bound when CBC cannot hold it - #142
Open
andig wants to merge 1 commit into
Open
Conversation
Base automatically changed from
feat/stage-timing-logs
to
fix/reserve-the-tie-break-slice
August 23, 2026 09:18
…the tie break Production logs show the pinned tie break LP coming back Infeasible on ~6% of splits, over a cost bound the incumbent CBC just returned satisfies. It is not the incumbent: the solution is fully integral, the pinned pattern reaches the reported cost exactly (pinned cost-max LP reproduces it to 6e-10), and the row survives rescaling. It is the solve itself: the model's big M rows put CBC's perturbation (0.001% of a 1.7e7 element) orders above any hundredth-of-a-cent slack, and primal, dual, barrier and perturbation-off all agree on the wrong answer. So the floor walks the slack up by tens until CBC holds the row, ceiling 1e-2: the default gap_abs, money the cost stage may already have left on the table. keep() follows through budget, and the MILP inherits the relaxed row. Both captured production hits recover their tie break at 1e-4 and 1e-3. The stage label records the slack that landed, so the log line shows how often the ladder climbs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
andig
force-pushed
the
fix/relax-the-cost-bound-when-cbc-cannot-hold-it
branch
from
August 23, 2026 09:20
08bd0f9 to
8b250b3
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What production showed
The new solve logs (#141): ~6% of split requests report
LP Infeasible unused, and 315/day reportMILP Infeasible unused— the tie break silently lost on requests that reserved 4s for it.Diagnosis (two captured hits, replayed)
Perturbing problem by 0.001% of 16921980 — largest nonzero change 5.9. The model's big-M rows put the solver's own perturbation ~6 orders above the 1e-5 slack.Fix
On
Infeasible, walk the slack up ×10 until CBC holds the row, ceilingCOST_BOUND_SLACK_CEILING = 1e-2= defaultgap_abs, money the cost stage may already have left on the table.keep()follows viabudget; the MILP inherits the relaxed row (fixes theMILP Infeasiblerows too). The stage label records the landed slack, so the #141 log line measures how often the ladder climbs.Both captured hits recover their tie break end-to-end (
LP (slack 0.0001) Optimal,LP (slack 0.001) Optimal). Deterministic test forces two Infeasible verdicts and asserts the ladder lands at 0.001.Stacked on #141.
🤖 Generated with Claude Code