Skip to content

Fix: MPS reader bound conventions, infinite bounds, and unsupported sections - #102

Merged
ZedongPeng merged 3 commits into
MIT-Lu-Lab:mainfrom
ZedongPeng:fix/mps-integer-default-bounds
Aug 22, 2026
Merged

Fix: MPS reader bound conventions, infinite bounds, and unsupported sections#102
ZedongPeng merged 3 commits into
MIT-Lu-Lab:mainfrom
ZedongPeng:fix/mps-integer-default-bounds

Conversation

@ZedongPeng

@ZedongPeng ZedongPeng commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

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.

  1. MARKER 'INTORG'/'INTEND' was ignored. By the classic MPS convention (CPLEX, Gurobi, SCIP, HiGHS), an integer column with no BOUNDS entry is [0, 1]; we gave it [0, +inf). Any BOUNDS entry cancels the default. LI/UI, previously skipped, are now accepted.
  2. A negative UP bound did not release the lower bound, giving the empty interval [0, -3] for UP x -3. It now implies lb = -inf, but only when no explicit lower bound was given.
  3. A large finite bound was taken literally, polluting rescaling and the termination criteria. Bounds at or beyond +/-infinite_bound (new parameter, 1e20 by default, as in HiGHS and Gurobi) are now replaced by true infinities. This lives in preprocess_problem rather than the reader, as in HiGHS, so models built through the Python or C API get it too.
  4. A huge matrix or objective coefficient went unreported. Either wrecks the scaling and is almost always a modelling mistake. preprocess_problem now warns about matrix entries reaching 1e15 and objective coefficients reaching 1e20 (HiGHS's thresholds). HiGHS errors instead; we only warn, having no "invalid input" termination status to return.
  5. A file with no N row 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 missing N row now gives a zero objective, those sections are rejected, and SOS/SETS are 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-sub

Everything else in our benchmark set parses byte-for-byte identically. The 12 were re-solved at 1e-4 and 1e-8 and still terminate OPTIMAL with essentially unchanged objectives: these are set-covering-style models whose constraints already imply x <= 1, so the restored bound is redundant.

@ZedongPeng ZedongPeng changed the title fix: MPS reader integer default bounds Fix: MPS reader bound conventions, infinite bounds, and unsupported sections Aug 22, 2026
@ZedongPeng
ZedongPeng merged commit 7067294 into MIT-Lu-Lab:main Aug 22, 2026
18 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.

1 participant