Skip to content

GDP: simple disjunction reverse-polar enumeration cuts - #4040

Open
sadavis1 wants to merge 21 commits into
Pyomo:mainfrom
sadavis1:connor-cuts
Open

sadavis1 wants to merge 21 commits into
Pyomo:mainfrom
sadavis1:connor-cuts

Conversation

@sadavis1

@sadavis1 sadavis1 commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Fixes # (n/a)

Summary/Motivation:

Add a transformation that uses Connor's method to generate cutting planes on "simple disjunctions." Simple disjunctions are disjunctions on variables bounded in the nonnegative orthant, where each disjunct contains exactly one linear constraint, which is outwards facing in the sense that it cuts off the origin. For now we only support the standard setting in the nonnegative orthant cone (so the disjunction must look like \cup_{t \in T} {x | c^t . x >= 1, x >= 0}), however, this should be extensible later if necessary to a transformed setting like \cup_{t \in T} {x | c^(t) . (Ax + b) >= 1, Ax + b >= 0} or similar, without breaking the interface.

This PR is connected with Connor Johnston's work with John, Emma and me this summer implementing and investigating this family of cuts (see also #3982). It may be used later as a subroutine in a multi-part transformation that also does things like aggregating non-simple disjunctions into a simple relaxation or calling gdp.bigm or hull.

Changes proposed in this PR:

  • Add gdp.reverse_polar_enumeration_cuts cut generator for simple disjunctions. Name not necessarily final, if something else is more descriptive.
  • Add tests

AI-Use Disclosure

  • AI tools were NOT used during the preparation of this PR

or

  • AI tools contributed to the development of this PR

    • AI tools generated documentation (including the PR description/comments, code comments, and/or Sphinx documentation)
    • AI tools generated tests (baselines, examples, and/or code)
    • AI tools generated code (apart from tests)

    Review process (select ONE):

    • Rewritten: All AI-generated content was rewritten by me before being committed.
    • Reviewed/verified: I retained AI-generated content and verified it before committing. Verification included (as applicable):
      • Ran the code and fixed issues
      • Added and ran tests
      • Checked correctness/logic of code and tests
      • Checked for alignment with the contribution guide
      • Considered security implications
    • As-is: AI-generated content was commited directly to the repository

Notes for reviewers (optional):

Legal Acknowledgement

By contributing to this software project, I have read the contribution guide and agree to the following terms and conditions for my contribution:

  1. I agree my contributions are submitted under the BSD license.
  2. I represent I am authorized to make the contributions and grant the license. If my employer has rights to intellectual property that includes these contributions, I represent that I have received permission to make contributions and grant the required license on behalf of that employer.

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