Skip to content

Pin HiGHS_jll below 1.15 and assert solve status in tests#220

Merged
vtjeng merged 3 commits into
masterfrom
fix/highs-1.15-instability
Jul 16, 2026
Merged

Pin HiGHS_jll below 1.15 and assert solve status in tests#220
vtjeng merged 3 commits into
masterfrom
fix/highs-1.15-instability

Conversation

@vtjeng

@vtjeng vtjeng commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Why this matters

MIPVerify's repository jobs became unreliable after the Julia workspace began resolving HiGHS.jl 1.24.1 with HiGHS_jll 1.15.1. Issues #218 and #219 record native solver crashes on Ubuntu, Windows, and macOS, plus repeated unexpected objective values for the same macOS test.

A standalone reproducer for that test workload crashed in 3 of 5 process runs with 1.15.1. The observed crashes occurred with threads = 1 and parallel = "off", so those settings did not prevent the reproduced failure. The same script completed 3 of 3 runs with 1.14.0, and every full solve finished OPTIMAL at the expected objective. These small samples support temporarily excluding 1.15.x from this repository; they do not estimate a stable failure rate.

The objective-mismatch CI logs did not record termination status. They therefore cannot show whether HiGHS claimed optimality at the unexpected value or stopped early with a feasible incumbent. A separately checked feasible point at 6.959316 proves that the reported 9.323265 value cannot be the optimum, but it does not recover the missing status.

HiGHS 1.15.0 was the first release of its parallel mixed-integer programming (MIP) solver. A relevant upstream fix, ERGO-Code/HiGHS#3141, removes non-thread-safe C API scheduler resets that can cause random Julia-test segfaults. It merged after HiGHS 1.15.1; no released HiGHS version contained the fix as of July 16, 2026. The exact MIPVerify reproducer has not been tested against that fix, so the pin should remain until a released binary includes it and this workload passes local and CI validation.

What changes

  • Add HiGHS_jll = "~1.14" to the test project's dependencies and compatibility bounds. Because the repository uses a Julia workspace, this constrains tests, benchmarks, and examples. Current registry metadata resolves HiGHS.jl 1.23.0 with HiGHS_jll 1.14.0. MIPVerify's package dependencies are unchanged; downstream users can resolve other HiGHS versions.
  • For adversarial-example tests with a finite expected objective, record a separate SolveStatus == OPTIMAL assertion before the existing objective comparison. A future log will show whether a mismatch followed an optimal or non-optimal termination. The existing objective checks continue after the assertion; infeasible cases are unchanged.

Mitigates #218 and #219.

Validation

  • julia --project=. -e 'using Pkg; Pkg.test(; coverage=false)' on a local merge of 047f47e into 105b11e: 613 passed, 1 expected broken, 614 total. The resolved solver pair was HiGHS.jl 1.23.0 with HiGHS_jll 1.14.0.
  • GitHub Actions run 29528616336: all 15 checks passed for head 047f47e, including all six OS/version package-test jobs. That run used base 8a455e2; the local merge test above covers the later base.
  • git diff --check passes.

For the solver-version comparison, three matched full-suite runs used Linux x64, Julia 1.12.6, and the same 521-test selection:

Run 1.15.1 baseline Pinned 1.14.0 Pinned / baseline
1 260.7 s 263.6 s 1.01×
2 279.1 s 260.0 s 0.93×
3 266.0 s 250.8 s 0.94×
Total 805.8 s 774.4 s 0.96× (3.9% lower)

The aggregate wall time was 3.9% lower with the pin. One machine and three pairs are insufficient to characterize general solver performance or the failure rate.

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.63%. Comparing base (7d71c45) to head (0ac47d6).
⚠️ Report is 3 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #220      +/-   ##
==========================================
+ Coverage   92.64%   93.63%   +0.99%     
==========================================
  Files          23       24       +1     
  Lines         938     1084     +146     
==========================================
+ Hits          869     1015     +146     
  Misses         69       69              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@vtjeng
vtjeng marked this pull request as draft July 16, 2026 07:49
vtjeng added 3 commits July 16, 2026 14:57
A flaky CI failure (#219) reported an objective of 9.32 instead of 6.96
with no way to tell whether the solver claimed optimality at the wrong
value or terminated early with a feasible incumbent. Asserting the
solve status first makes future occurrences diagnosable.
HiGHS 1.15.0 shipped the first variant of the parallel MIP solver, and
1.15.1 segfaults readily when solving the test-suite MIPs: observed
locally at three distinct sites in the new MIP-worker machinery (one
with threads=1/parallel=off), and in CI on three platforms within two
days of 1.15.1 arriving — the #218 segfaults on ubuntu (2026-07-13)
and windows (2026-07-14), and the #219 wrong objective on macOS. It is
also nondeterministic run to run on identical models. The wrong
objective is attributed to the same instability: the formulation with
the loosest valid bounds still solves to the expected optimum, and
HiGHS 1.14 shows none of this behavior.

Unpin once upstream stabilizes the parallel MIP solver.
@vtjeng
vtjeng force-pushed the fix/highs-1.15-instability branch from 047f47e to d4508b1 Compare July 16, 2026 22:09
@vtjeng
vtjeng marked this pull request as ready for review July 16, 2026 22:23
@vtjeng
vtjeng merged commit 1fefff9 into master Jul 16, 2026
13 checks passed
@vtjeng
vtjeng deleted the fix/highs-1.15-instability branch July 16, 2026 22:23
vtjeng added a commit that referenced this pull request Jul 16, 2026
Each note states the scope of the row's numbers, then the one fact a
reader needs: what changed structurally, or what confirmation is
pending. The #209 note also records the #220 solver-pin confound in
the 2026-07-17 nightly.
vtjeng added a commit that referenced this pull request Jul 16, 2026
## Why

The initial log (#240) carried its numbers in free text, so rows could
not be scanned or compared without reading each Notes cell.

## What changed

- Verification rows gain **Total (base → cand)** — pooled end-to-end
wall clock over the paired 500-sample WK17a LP benchmark — and **Median
ratio** (per-sample candidate ÷ baseline). The medians are ratios
because the benchmark reports publish per-sample ratio distributions
rather than absolute medians.
- CI rows gain **Total (before → after)** — runner time summed over the
jobs the row changes — and **Long pole** — the longest single job of a
full CI run, "—" where a row does not move it. Column semantics are
defined in each section intro, along with the caveat that same-day rows
overlap in their before/after runs.
- The queue-aggregate footer is removed; its numbers survive inside the
#237 and #227 rows.

#220 (HiGHS_jll pin) is deliberately not added: it plausibly shifts
solve time but has no paired measurement; the 2026-07-17 nightly
reflects #209 and #220 combined.

Formatted with the pinned prettier (3.9.5). Left for review rather than
auto-merged.
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.

1 participant