Skip to content

docs(solvers): how to solve an LP by interior point without crossover, and when it paid on the benchmark models - #1879

Merged
FBumann merged 8 commits into
claude/festive-carson-8x46sq-mipstartfrom
claude/festive-carson-8x46sq-crossover
Oct 8, 2026
Merged

FBumann merged 8 commits into
claude/festive-carson-8x46sq-mipstartfrom
claude/festive-carson-8x46sq-crossover

Conversation

@FBumann

@FBumann FBumann commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Prompt: Add stacked PRs about the new things we discussed

The discussion it refers to began with: "What about basis, warmstaer initial solution etc? What kind of things would be reasonable to add to boost sovler performance?"

Note

The following content was generated by AI.

The solvers how-to now says how to leave crossover off on each sink and what that costs: no basis, so no start=. On HiGHS at rung m it paid only on transport, by 14%. bench/crossover.py measures this.

What it is
  • docs/howto/solvers.md gains "Solve an LP by interior point without crossover": the option on each sink, what the answer carries (duals, no basis), and the conclusion below with this PR's number.
  • bench/crossover.py builds a case's rung once and solves it three ways, each from a fresh solver: HiGHS's own choice (simplex on these LPs), interior point with crossover, and interior point without. It prints solve seconds (diagnostics().seconds['solve'], the solve alone and not the build), whether the answer has duals, and the objective's gap relative to simplex. It is not an arm and writes no results file. bench/test_harness.py checks that the three ways reach one optimum on dispatch 2xs.
  • No src/ change. A solve that would pick crossover itself, when no outputs= needs a basis, was the idea in the discussion. These numbers do not support it on HiGHS.
Measured: HiGHS, rung m, solve seconds

Method: python -m bench.crossover <cases> --sizes m, each case built once and solved three ways with keep='nothing'. HiGHS 1.15, at fcea065 for the first run and 6908ec1 for the others: the bench script changed between them, src/ did not. Each run started only after the 1-minute load average fell below 0.5 on 4 cores, and nothing else ran on the box. transport and nodal were run three times, dispatch and storage twice; each cell is the range over those runs.

case simplex interior point with crossover without crossover
dispatch 3.5–3.8 s 5.5–7.1 s 5.4–6.3 s
nodal 2.5–2.8 s 1.1–1.3 s 32.6–34.1 s
transport 24.2–25.1 s 24.3–24.5 s 20.8–21.5 s
storage 48.6–50.6 s 131.0–133.7 s 121.7–123.3 s

On transport, without crossover is fastest: 21.2 s against 24.7 s for simplex, the means of the three runs, 14% less. On nodal it took 28 times as long as interior point with crossover: 33.2 s against 1.18 s, the means. Every answer had duals. The largest objective gap to simplex was 6.7e-9 relative (dispatch, without crossover), so the how-to says 7e-9.

At rung s (one run), the fastest way was the same as at m on every case except transport. There simplex was fastest: 0.86 s against 1.25 s without crossover.

Full output
dispatch s:  simplex 0.276   ipm 0.414   no crossover 0.396
dispatch m:  simplex 3.783   ipm 7.125   no crossover 6.257
nodal s:     simplex 0.167   ipm 0.093   no crossover 0.837
nodal m:     simplex 2.729   ipm 1.256   no crossover 34.071
transport s: simplex 0.863   ipm 1.363   no crossover 1.247
transport m: simplex 25.104  ipm 24.309  no crossover 20.794
storage s:   simplex 1.248   ipm 2.855   no crossover 2.446
storage m:   simplex 50.602  ipm 133.702 no crossover 121.679

second and third runs, with the relative gap:
transport m (9.76456e+08): simplex 24.891 / 24.185, ipm 24.461 / 24.263 (+1.2e-16), no crossover 21.502 / 21.312 (+1.6e-11)
nodal m (3.07336e+09):     simplex 2.541 / 2.766,   ipm 1.154 / 1.126 (0),       no crossover 33.049 / 32.627 (+4.2e-12)
dispatch m (2.17995e+09):  simplex 3.488,           ipm 5.496 (-4.4e-16),        no crossover 5.414 (+6.7e-09)
storage m (9.62692e+08):   simplex 48.648,          ipm 131.049 (-5.0e-16),      no crossover 123.328 (+3.1e-09)
Verification

Gates: ruff check ., ruff format --check ., zensical build --strict, and pytest bench/test_harness.py -k crossover_bench. The src/ tree is #1878's, whose full suite is green.

Deliberately not done
  • Gurobi and Xpress are not measured: their bundled licences stop well below rung m.
  • Rung l is not measured: storage at m already takes over two minutes per way.
  • No choice of method in src/. The numbers say HiGHS's default is the right default on these models.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GLBvwp6NU7YjszFz5QMRf1

claude added 5 commits October 7, 2026 08:06
…or point with crossover and without

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLBvwp6NU7YjszFz5QMRf1
…e to the simplex one

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLBvwp6NU7YjszFz5QMRf1
…, and when it paid on the benchmark models

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLBvwp6NU7YjszFz5QMRf1
…e changelog names #1879

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GLBvwp6NU7YjszFz5QMRf1
@codspeed

codspeed Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 67 untouched benchmarks
⏩ 307 skipped benchmarks1


Comparing claude/festive-carson-8x46sq-crossover (a5b2dce) with claude/festive-carson-8x46sq-mipstart (64fcb1c)

Open in CodSpeed

Footnotes

  1. 307 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

…ive-carson-8x46sq-crossover

# Conflicts:
#	CHANGELOG.md
@read-the-docs-community

read-the-docs-community Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

claude added 2 commits October 7, 2026 09:06
…start' into claude/festive-carson-8x46sq-crossover

# Conflicts:
#	CHANGELOG.md
An error occurred while trying to automatically change base from claude/festive-carson-8x46sq-mipstart to claude/festive-carson-8x46sq-warm October 8, 2026 14:16
@FBumann
FBumann merged commit add46a2 into claude/festive-carson-8x46sq-mipstart Oct 8, 2026
13 checks passed
@FBumann
FBumann deleted the claude/festive-carson-8x46sq-crossover branch October 8, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants