You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
For pure-continuous AMP candidates with nlp_solver="ipm", the main AMP loop only tried the POUNCE path. The final pure-continuous recovery path already tried ipopt first when cyipopt was available, then fell back to ipm/POUNCE. As a result, nlp_004_010 could spend 1000 AMP refinements without an in-loop incumbent, then recover only a final feasible incumbent with no certified bound.
This PR uses the same ipopt -> ipm sequence inside the pure-continuous AMP candidate path, and makes backend fallback robust when one backend raises.
Changes
Allows _solve_nlp_subproblem to accept an ordered NLP backend sequence.
Uses ("ipopt", "ipm") for pure-continuous nlp_solver="ipm" candidates when cyipopt is available.
Keeps integer-fixed NLP subproblems on the existing single-backend behavior.
Continues to later fallback backends if an earlier backend raises.
Adds regression coverage for both backend selection and exception fallback.
Corrects the issue reference in the existing tan/abs integration-test docstring.
Validation
Fork PR #97 was reviewed and merged before opening this upstream PR.
Filtered AMP-fast selection from the Makefile -> 135 passed, 15 deselected
ruff check on touched/relevant files -> passed
Commit hook -> ruff, ruff format, mypy passed
The exact issue repro changed from a local failure after about 146 seconds (status="feasible", no certified bound) to a pass with status="optimal" in about 1-2 seconds locally.
Notes
This PR intentionally does not claim to close broader AMP slow-tail tracking. It addresses the current tan/abs certification failure surfaced while triaging the fork issue.
I tried to add the existing amp-integration label so this PR runs the opt-in AMP integration workflow, but my token does not have permission on jkitchin/discopt (HTTP 403). A maintainer can trigger it by adding that label.\n\nSeparate naming note: the skipped job is currently named AMP Alpine/incidence suite. It now points at python/tests/test_amp_integration.py, where the relevant coverage for this PR is AMP incidence / partition behavior and MINLPTests-style cases rather than Alpine as an active dependency or path. Since Alpine is no longer the path we use here, would it make sense to rename the job to something like AMP integration (Ipopt, incidence, MINLPTests) while keeping the existing amp-integration label?
do you have examples where ipopt works and pounce doesn't? if so, I would like to see them; pounce has gotten quite good and has been very comparable to ipopt/ma57 so far, and better than the standard cyipopt (ipopt with mumps) many times.
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
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.
Summary
This fixes the current AMP certification failure for the continuous tan/abs MINLPTests case
nlp_004_010.Fork-side evidence:
Root Cause
For pure-continuous AMP candidates with
nlp_solver="ipm", the main AMP loop only tried the POUNCE path. The final pure-continuous recovery path already triedipoptfirst whencyipoptwas available, then fell back toipm/POUNCE. As a result,nlp_004_010could spend 1000 AMP refinements without an in-loop incumbent, then recover only a final feasible incumbent with no certified bound.This PR uses the same
ipopt->ipmsequence inside the pure-continuous AMP candidate path, and makes backend fallback robust when one backend raises.Changes
_solve_nlp_subproblemto accept an ordered NLP backend sequence.("ipopt", "ipm")for pure-continuousnlp_solver="ipm"candidates whencyipoptis available.Validation
Fork PR #97 was reviewed and merged before opening this upstream PR.
Local validation reported on the fork branch:
python/tests/test_amp.py::test_solve_nlp_subproblem_uses_pounce_and_restores_boundspython/tests/test_amp.py::test_solve_nlp_subproblem_continues_after_backend_exceptionpython/tests/test_amp.py::test_solve_nlp_subproblem_respects_expired_time_limitpython/tests/test_amp.py::test_recover_pure_continuous_solution_uses_best_start_and_maximize_signpython/tests/test_amp.py::test_best_nlp_candidate_uses_ipopt_fallback_for_pure_continuous_ipmpython/tests/test_amp_integration.py::TestCurrentCodeWeaknesses::test_amp_certifies_tan_abs_nlp_004_010_at_issue_gappython/tests/test_amp_integration.py::TestCurrentCodeWeaknesses::test_amp_reports_bound_for_tan_abs_nlp_004_010python/tests/test_nlp_pounce.py-> 18 passedruff checkon touched/relevant files -> passedThe exact issue repro changed from a local failure after about 146 seconds (
status="feasible", no certified bound) to a pass withstatus="optimal"in about 1-2 seconds locally.Notes
This PR intentionally does not claim to close broader AMP slow-tail tracking. It addresses the current tan/abs certification failure surfaced while triaging the fork issue.