Bug fix: solution incorrect when simplex presolve removes empty columns - #29
Merged
rapids-bot[bot] merged 4 commits intoMay 23, 2025
Merged
Bug fix: solution incorrect when simplex presolve removes empty columns#29rapids-bot[bot] merged 4 commits into
rapids-bot[bot] merged 4 commits into
Conversation
Contributor
Author
|
/ok to test f622513 |
rg20
reviewed
May 22, 2025
Contributor
Author
|
/ok to test 769771f |
rg20
approved these changes
May 22, 2025
Contributor
Author
|
/ok to test f7d243e |
Contributor
Author
|
/ok to test de78eb6 |
Contributor
|
/merge |
jieyibi
pushed a commit
to yining043/cuopt
that referenced
this pull request
Mar 26, 2026
…ns (NVIDIA#29) Fixes an issue reported on the following MPS file, where `_dummy` variable does not appear in the constraints. We remove empty columns (and thus `_dummy`) in presolve for dual simplex. But do not take this into account when constructing the solution. Further work, is needed to develop an actual LP presolve. ``` *SENSE:Minimize NAME test_export_dict_LP_no_obj ROWS N OBJ G c1 E c2 L c3 G c4 COLUMNS __dummy OBJ 1.000000000000e+00 w c4 1.000000000000e+00 x c1 1.000000000000e+00 x c2 1.000000000000e+00 y c1 1.000000000000e+00 y c3 -1.000000000000e+00 z c2 1.000000000000e+00 z c3 1.000000000000e+00 RHS RHS c1 5.000000000000e+00 RHS c2 1.000000000000e+01 RHS c3 7.000000000000e+00 RHS c4 0.000000000000e+00 BOUNDS FX BND __dummy 0.000000000000e+00 FX BND w 0.000000000000e+00 UP BND x 4.000000000000e+00 LO BND y -1.000000000000e+00 UP BND y 1.000000000000e+00 ``` Fixes NVIDIA#13 which was caused by an issue in column scaling when the norm of a column is zero. Authors: - Chris Maes (https://github.com/chris-maes) Approvers: - Rajesh Gandham (https://github.com/rg20) - Nicolas Blin (https://github.com/Kh4ster) URL: NVIDIA#29
spoorendonk
added a commit
to spoorendonk/cuopt
that referenced
this pull request
Jun 9, 2026
… reject Two findings from the multi-agent review of the uniform-resolve refactor: - Seed the PDLP warm-start iterate BEFORE snapshotting/forcing the presolver, so an exception from set_initial_*_solution cannot leave the caller's settings handle with presolver=None (the seed sits outside the restoring try/catch). The seed still runs after apply_pending_mutations, so the warm-start vectors are padded to the post-delta dimensions first. - Hoist the explicit PSLP/Papilo rejection ABOVE apply_pending_mutations so a rejected resolve is a clean no-op: the staged delta is left pending (not committed) and the handle stays usable. spoorendonk/mcfcg#29 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
spoorendonk
added a commit
to spoorendonk/cuopt
that referenced
this pull request
Jun 10, 2026
Add the dual-simplex basis-persistence layer that re-optimizes a column-generation / cutting-plane master from the previous optimum instead of cold-solving on every cuOptResolve. dual_simplex_warm_state.hpp declares dual_simplex_warm_state_t, which persists the converted (slack-augmented) lp_problem_t plus its optimal basis (basis_update_mpf_t, basic_list, nonbasic_list, vstatus, edge_norms) across resolves. solve.cu implements solve_lp_dual_simplex_warm: - On a tail-only structural extension (new columns appended, new '<=' rows appended, prior rows/columns preserved) the persisted basis is transplanted onto the extended LP: appended columns enter nonbasic at their lower bound (cheap — the basis matrix B is unchanged); appended '<=' rows enter via dual_simplex::add_cuts (26.06 internal: appends row + logical slack and updates the LU factor in place). The warm basis then seeds dual_phase2_with_advanced_basis. - Otherwise (first solve, deletes, objective edit, mixed/range/'>=' row appends, or any numerical trouble warm-starting) it falls back to a cold solve_linear_program_with_advanced_basis (26.06 internal) and recaptures the basis. The warm-solve settings force scale_columns / inner_presolve_optimizations / eliminate_singletons / barrier_presolve off so dual_simplex presolve + scaling are the identity on a clean LP, keeping the captured basis in `lp` coordinates and transplantable — the same configuration the MIP B&B cut loop relies on. This mirrors the uniform presolve-off rule of the delta path (NVIDIA#29); NVIDIA#28 later relaxes it with a restricted forward-mappable presolve. The layer is objective-equivalent to a cold solve; only the starting basis differs. Double-only (the wrapped dual_simplex internals are instantiated for <int,double>). spoorendonk/mcfcg#22 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Fixes an issue reported on the following MPS file, where
_dummyvariable does not appear in the constraints. We remove empty columns (and thus_dummy) in presolve for dual simplex. But do not take this into account when constructing the solution.Further work, is needed to develop an actual LP presolve.
Fixes #13 which was caused by an issue in column scaling when the norm of a column is zero.