Fix: MPS reader bound conventions, infinite bounds, and unsupported sections - #102
Merged
ZedongPeng merged 3 commits intoAug 22, 2026
Merged
Conversation
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.
Description
The MPS reader deviated from the standard MPS conventions in several ways, each of which silently produced a different LP than other solvers read from the same file. Two numerical checks that other solvers perform were also missing.
MARKER 'INTORG'/'INTEND'was ignored. By the classic MPS convention (CPLEX, Gurobi, SCIP, HiGHS), an integer column with noBOUNDSentry is[0, 1]; we gave it[0, +inf). AnyBOUNDSentry cancels the default.LI/UI, previously skipped, are now accepted.UPbound did not release the lower bound, giving the empty interval[0, -3]forUP x -3. It now implieslb = -inf, but only when no explicit lower bound was given.+/-infinite_bound(new parameter,1e20by default, as in HiGHS and Gurobi) are now replaced by true infinities. This lives inpreprocess_problemrather than the reader, as in HiGHS, so models built through the Python or C API get it too.preprocess_problemnow warns about matrix entries reaching1e15and objective coefficients reaching1e20(HiGHS's thresholds). HiGHS errors instead; we only warn, having no "invalid input" termination status to return.Nrow stole the first constraint as the objective, and sections that change the model beyond an LP (QUADOBJ,CSECTION,INDICATORS, ...) fell through into whichever section was active. A missingNrow now gives a zero objective, those sections are rejected, andSOS/SETSare skipped since they leave the LP relaxation unchanged.Effect
Only (1) changes any instance we solve - 12 in MIPLIB 2017:
ds,ds-big,eilA101-2,eilC76-2,ivu06,ivu06-big,ivu52,ivu59,neos-1354092,neos-3352863-ancoa,ns2122698,rvb-subEverything else in our benchmark set parses byte-for-byte identically. The 12 were re-solved at
1e-4and1e-8and still terminateOPTIMALwith essentially unchanged objectives: these are set-covering-style models whose constraints already implyx <= 1, so the restored bound is redundant.