Skip to content

Performance roadmap: upstream cross-check, benchmark gate fixes, and next optimization experiments #3

Description

@berkorbay

Objective

Improve runtime and MIP gap closure on top of upstream latest, separating pure speedups from changes to the search path. Cross-checked upstream issues, PRs and relevant comments on 2026-09-25. This is a source/results review; no new solver benchmarks were run. Proposed gains remain hypotheses.

Reviewed lab snapshot: acc2726. Control: 6293630a84612d22e87a542d2f1fd2d1b6f07940.

Existing evidence

The three-seed hard-set comparison reports 2 vs 1 solved runs, 100 vs 97 feasible runs, unchanged mean gap of 55.7%, and worst overrun of 25.1 vs 282.4 seconds across 126 instance–seed pairs (42 instances). This supports better time-limit behavior, but does not establish a broad speedup. PDI needs correction below, and the run metadata records an active LLM server.

Upstream cross-check

Topic Upstream evidence and current status Implication
DSE preservation PR #685, merged, already preserves DSE weights and notes scope for more. Issue #2230, closed, covers warm starts, recomputation, model changes and scaling. Extend existing preservation; identify exactly which invalidation paths still cause unnecessary recomputation.
Strong branching and DSE PR #688, closed unmerged; a maintainer comment says a different fix superseded it and reports sudden DSE-weight errors during strong branching. Add freeze/unfreeze, strong-branching and full weight-recomputation comparisons. Historical evidence is a regression-test target, not proof the lab patch is wrong.
Repeated equation checks PR #3035, merged, avoids rechecking unchanged equations; issue #2773, closed, discusses related dual-fixing overhead. P1 optimizes invalidation cost after existing work. Preserve its recheck semantics.
Domain/probing changes PR #3244, open, changes dual fixing, probing and domain-copy handling. A later comment reports neutrality on a larger set and loss of useful structure on neos-3046615-murg. Keep scratch-buffer work independent of propagation semantics; inspect domain-copy behavior. Include neos-3046615-murg and neos-787933 in coverage. Do not treat the initial claimed gain as settled.
Clique structures PR #3312, open, changes clique-table consistency through presolve. PR #2688, merged, fixes fixed-variable handling in clique merging. Keep caches narrowly scoped, invalidate on mutation, preserve fixed/deleted-variable handling and recheck compatibility with #3312.
Implications PR #3264, open, adds implication aggregation, explicitly excluding binary clique implications; toguru is affected. Related moving code, not the same optimization as clique traversal. Re-profile after upstream changes.
Time limits Issue #3314, open, is the existing s100 report; lab #2 has the later diagnosis. Issue #1930, closed, distinguishes normal timing from expensive development profiling. Separate deadline handling from speed. Use bounded-frequency checks and measure instrumentation overhead.
Build tuning PR #1104, closed unmerged, documents static-library/user-preference LTO concerns and platform CI failures. Use supported, opt-in build experiments; do not assume universally enabling LTO is safe or novel.

Searches covered open and closed issues/PRs for steepest, DSE, propagation, clique, dual fixing, time_limit, LTO, PGO, profile guided, changedbounds, markChangedCol and find_common. No exact hits were found for changedbounds, markChangedCol, find_common or PGO/profile guided. That is not proof equivalent work does not exist.

P0: Reproducibility and acceptance gate

  • Publish the exact benchmarked combined arm. At review, remote dev-tideseed and upstream latest both pointed to 6293630a84; bench/queue.txt contained only its header. Experimental branches exist, but this queue cannot reconstruct the documented combination. Record source SHA, ordered patches, compiler/version/flags, effective options, model checksum and binary hash.
  • Fix analyze.py: crash counts are omitted from PASS, and required --identical failures are printed after the verdict without changing it. Make both enforceable; compare solved counts on the same paired set.
  • Fix run.py resume validation: existing-file presence alone must not reuse results for changed binaries/options/time limits.
  • Fix hard.py: zero PDI with unavailable bounds must not score as excellent performance. Record bound trajectories; integrate a defined normalized gap over the same horizon, assigning worst-case gap while bounds are unavailable. Report overrun separately. Bootstrap over instances, retaining their seeds together.
  • Use a declared clean window for acceptance runs, separate diagnostic profiling from timing, and report correctness-check coverage. Missing reference objectives must not silently become evidence of correctness.

Prioritized solver experiments

1. Cheaper, more selective DSE preservation

Starting point: DSE patch.

  • Split basis-restoration caching and cut-row weight carry into separate arms.
  • Measure cache hits/misses, BTRANs avoided, cache time, bytes copied and retained memory.
  • Compare current dense num_col + num_row entries against compact basic-variable/weight storage; test caching at actual basis-save points instead of every solve return, verifying coverage.
  • Add matrix/scaling-generation validity checks and sampled comparisons against full recomputation. Exercise freeze/unfreeze, strong branching, row add/delete and scaling changes.
  • Measure runtime and solution quality: reused floating-point weights can change pivoting/search. Node throughput alone is insufficient.

The lab's reported 24–27% recomputation shares justify priority, but cache overhead and end-to-end benefit need isolated measurement.

2. Reuse propagation scratch memory

The current source allocates a large changed-bounds array on each propagation call with pending work.

  • Reuse a grow-on-demand buffer, including cut-pool nonzero capacity in sizing as current code does.
  • Avoid deep-copying scratch storage with domains or unsafe sharing between simultaneous/reentrant uses.
  • Measure allocations, page faults, peak RSS and runtime; require identical-search checks for a pure storage change.
  • Profile first: the allocation is source-confirmed; its runtime share is not yet established.

3. Reduce repeated presolve invalidation walks (P1)

  • Prototype lazy invalidation/generation stamps in markChangedCol(), preserving the recheck semantics from #3035. Simply returning when changedColFlag is already set is insufficient.
  • Cover row/column modification, deletion, compaction and new rows; shadow-check against existing flags.
  • Re-profile the reported 17.5% toguru hotspot after existing patches and upstream changes; historical profile shares are not necessarily additive.

4. Clique traversal locality and deadline handling

5. CPU tuning, LTO and PGO as separate build arms

  • Compare baseline, CPU-specific tuning, supported LTO, then PGO on identical source.
  • Train PGO on disjoint model families and evaluate held-out instances plus production workloads.
  • Preserve floating-point semantics initially; report code size and memory alongside runtime.
  • Verify actual compiler flags instead of inferring them from build or wheel defaults.

Experiment order and acceptance

  1. Complete P0.
  2. Screen upstream, combined-without-DSE, DSE-cache-only, DSE-row-carry-only and propagation-buffer reuse in the same session, isolating each treatment's baseline.
  3. Follow with P1, clique-locality and build experiments according to fresh profiles.
  4. Test the winning combination on held-out MIPLIB and representative production instances, including short solves and long gap-limited runs.
  5. Retain the documented speed gate: shifted geometric-mean ratio <= 0.97, paired-bootstrap CI upper < 1, solved count no lower, zero detected wrong answers, no crashes, and identical search where claimed. Define a separate acceptance rule for deadline/quality improvements so they are not mislabeled universal speedups.

Keep findings in this lab. This issue does not request an upstream post or PR.

Prepared with Codex from repository source, recorded results and upstream discussions.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions