Skip to content

Fourier-Motzkin presolve - #3255

Open
fwesselm wants to merge 28 commits into
latestfrom
FMPresolveMerged
Open

Fourier-Motzkin presolve#3255
fwesselm wants to merge 28 commits into
latestfrom
FMPresolveMerged

Conversation

@fwesselm

@fwesselm fwesselm commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR adds the Fourier-Motzkin presolve reduction as described by Zhang, Y., Ploskas, N. & Sahinidis, N.V. A novel linear optimization presolve technique based on Fourier-Motzkin elimination. Math. Prog. Comp. 18, 345–378 (2026):

  • The reduction is currently only used for MIPs and runs once (in presolve's main loop).
  • The objective reformulation needed to handle continuous variables with non-zero cost is inactivated in the default settings (controlled by option presolve_fm_level).
  • The effect on MIP solver performance is relatively small; testing showed a 1% speedup.

Checklist

  • I have read the contributing guidelines
  • This PR targets the latest branch
  • Tests are passing
  • Documentation was updated where relevant
  • This PR is not primarily AI-generated (per the AI contributions policy in CONTRIBUTING.md)

@codecov

codecov Bot commented Sep 2, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.62162% with 30 lines in your changes missing coverage. Please review.
✅ Project coverage is 73.47%. Comparing base (bf989e9) to head (5c8c272).
⚠️ Report is 22 commits behind head on latest.

Files with missing lines Patch % Lines
highs/presolve/HPresolve.cpp 96.43% 18 Missing ⚠️
highs/presolve/HighsPostsolveStack.cpp 95.33% 11 Missing ⚠️
highs/lp_data/HighsOptions.h 75.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           latest    #3255      +/-   ##
==========================================
+ Coverage   73.24%   73.47%   +0.22%     
==========================================
  Files         445      445              
  Lines      108105   109079     +974     
  Branches    17328    17521     +193     
==========================================
+ Hits        79180    80143     +963     
- Misses      28649    28659      +10     
- Partials      276      277       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.


record_int =
new OptionRecordInt("presolve_fm_level", "Fourier-Motzkin level",
advanced, &presolve_fm_level, 0, 0, 1);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be changed to something that explicitly mentions objective reformulation? Example presolve_fm_obj_reformulation

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