Skip to content

Sync cuOpt options with NVIDIA/cuopt main (8eb20bd) - #25

Merged
0x17 merged 3 commits into
multigpu-pdlp-nightlyfrom
cuopt-main-sync
Oct 14, 2026
Merged

0x17 merged 3 commits into
multigpu-pdlp-nightlyfrom
cuopt-main-sync

Conversation

@0x17

@0x17 0x17 commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

Brings the solver link's options up to date with NVIDIA/cuopt main at 8eb20bd (2026-10-14). The changes were made against a100ee1; the only later commit, NVIDIA/cuopt#2138, touches cuOpt's own PuLP CI script and has nothing to port here (no header or option changes since a100ee1).

gmscuopt.c passes every option from optcuopt.def to cuOpt by name, so all option changes live in assets/optcuopt.def; no link code changes. With this PR, optcuopt.def covers every option cuOpt main registers, except log_file and log_to_console (set by the link itself) and sequence_solve (out of scope).

Option changes

Option Change Upstream
concurrent_nnz_cutoff → large_nnz_threshold Renamed. The old name was removed upstream without an alias, so an option file that still sets it now gets Unknown option "concurrent_nnz_cutoff". Type, default (50000000), range (-1..maxint) and group are unchanged. The threshold now also enables automatic PDLP column reduction where supported; -1 disables both. NVIDIA/cuopt#2067
pdlp_hyper_reduced_matrix New, integer -1..1, default -1: -1 automatic (at or above large_nnz_threshold), 0 off, 1 column reduction. Unsupported paths such as multi-GPU PDLP are turned off by cuOpt with a log message. NVIDIA/cuopt#2067
pdlp_hyper_project_initial_primal New, integer -1..1, default -1: whether PDLP projects the initial primal solution (the GAMS levels the link passes) onto the variable bounds. -1 uses the pdlp_solver_mode preset, 0 off, 1 on. NVIDIA/cuopt#2089
mip_hyper_heuristic_papilo_probing_max_badgesize New in the def (registered upstream since before this sync, but missing here), integer -1..maxint, default -1: ceiling on Papilo's probing minbadgesize in MIP presolve; -1 derives it from the problem, 0 leaves it uncapped. Placed next to mip_hyper_heuristic_presolve_max_rounds in the MIP group. cuOpt solver_settings.cu

The two PDLP options sit next to pdlp_hyper_enable_curtis_reid_scaling in the Linear Programming group. No other references to concurrent_nnz_cutoff exist in the repo (tests, examples, README).

Tests

  • all_options.gms builds its option file from optcuopt.def, so it now sets all four new or renamed options to their defaults.
  • options.gms is unchanged: it covers options that once made the link abort, on a small MIP, which would not exercise these LP paths.
  • The new lp_pdlp.gms regression test (PDLP column reduction and warm starts through presolve) moved to Add lp_pdlp.gms regression test for PDLP column reduction and warm starts #26: its warm-start check fails because cuOpt ignores the initial dual solution.

Verification

  • GAMS option library (optcc) reads the new optcuopt.def without errors; all new options parse as integers, concurrent_nnz_cutoff is rejected as unknown, and out-of-range values are rejected.
  • options.gms and all_options.gms compile with GAMS 54.5 (action=c).
  • The CI workflows install libcuopt-mathopt-cuXX==26.10.* and libcuopt-client==26.10.*, which currently resolves to nightly 26.10.0a304 (cuOpt 1ab479e, after #2024, #2089 and #2067). Its headers and libcuopt_mathopt.so contain the new option names and no longer contain concurrent_nnz_cutoff; gmscuopt.c compiles and links against it without warnings.
  • GPU run on an NVIDIA RTX A1000 6GB (driver 597.16, CUDA 13 build), cuOpt nightly 26.10.0a306 (8eb20bd), GAMS 54.5, link built exactly like the x86_64 workflow:
    • gams trnsport lp=cuopt: optimal, 153.675
    • examples/models/regression_tests/run_tests.sh: all 10 models pass, including options and all_options with the new and renamed options
    • tests/test-gamslib-cuopt.py: 72/73 match the CPLEX baseline; poutil hit its 300 s time limit (gap 2.43%), the usual run-to-run variance on this model

Out of scope

cuOptSetLogCallback, cuOptGetSolutionFloatAttribute, sequence_solve, mip_presolve.

🤖 Generated with Claude Code

https://claude.ai/code/session_01ALHyZUW9bDK51TntcQG4cg

- Rename concurrent_nnz_cutoff to large_nnz_threshold (cuOpt #2067). The
  old name was removed upstream without an alias, so option files that set
  it fail with an unknown option. The threshold now also enables automatic
  PDLP column reduction where supported; -1 disables both.
- Add pdlp_hyper_reduced_matrix (cuOpt #2067): -1 automatic, 0 off,
  1 column reduction.
- Add pdlp_hyper_project_initial_primal (cuOpt #2089): whether PDLP
  projects the initial primal solution (the GAMS levels) onto the variable
  bounds; -1 uses the pdlp_solver_mode preset.
- Add regression model lp_pdlp.gms: solves a random LP with column
  reduction forced on, automatic and off, and checks that PDLP warm starts
  from levels and marginals with PSLP presolve on (cuOpt #2024 maps the
  initial solution into the presolved space), with Papilo (cuOpt skips LP
  presolve) and with both pdlp_hyper_project_initial_primal settings.
  all_options.gms picks up the new options from optcuopt.def.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ALHyZUW9bDK51TntcQG4cg
Caps Papilo's probing minbadgesize in MIP presolve (-1 derives it from
the problem, 0 leaves it uncapped). cuOpt registers it, but it was the
last registered option missing from optcuopt.def; with it, the def
covers every option of NVIDIA/cuopt main (8eb20bd) except log_file and
log_to_console, which the link sets itself, and sequence_solve.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ALHyZUW9bDK51TntcQG4cg
@0x17 0x17 changed the title Sync cuOpt options with NVIDIA/cuopt main (a100ee1) Sync cuOpt options with NVIDIA/cuopt main (8eb20bd) Oct 14, 2026
@0x17
0x17 merged commit 1c1c62d into multigpu-pdlp-nightly Oct 14, 2026
2 checks passed
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