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
GDPopt LBB currently sends relaxed node subproblems to minlp_solver even when the transformed node subproblem has no unfixed discrete variables.
This can route continuous NLP subproblems to MINLP-only solver choices. In a GAMS workflow, that can fail before solve with messages like:
ValueError: GAMS writer passed solver (dicopt) unsuitable for model type (nlp)
The inverse workaround is also not safe: forcing minlp_solver to an NLP solver can fail on other LBB nodes that are still MINLP:
ValueError: GAMS writer passed solver (ipopth) unsuitable for model type (minlp)
It seems LBB needs model-class-aware dispatch for node subproblems, or a clearly documented solver role for "relaxed node solver" that can handle both continuous and mixed-integer node formulations.
Minimal working example
This MWE does not require any external solver. It monkeypatches the SolverFactory used inside pyomo.contrib.gdpopt.branch_and_bound to record which solver role LBB calls and whether the subproblem still contains unfixed discrete variables.
There is a global-optimization caveat: for nonconvex continuous NLP node subproblems, using a local NLP solver such as IPOPT may not provide a rigorous LBB bound. One possible design is a separate relaxed_nlp_solver or global_nlp_solver role, defaulting conservatively to the existing minlp_solver for global correctness, but allowing users to route continuous node subproblems to an appropriate solver explicitly.
Downstream context
This surfaced while benchmarking GDPLib's HDA model:
This issue is distinct from, but often masked by, the LBB time-limit stale-method bug in #3941.
Environment
Observed locally with:
Python 3.12.13
Pyomo 6.10.0
I also checked pyomo/contrib/gdpopt/branch_and_bound.py on upstream Pyomo/pyomomain; _solve_rnGDP_subproblem() still appears to call config.minlp_solver unconditionally for the transformed node subproblem.
Summary
GDPopt LBB currently sends relaxed node subproblems to
minlp_solvereven when the transformed node subproblem has no unfixed discrete variables.This can route continuous NLP subproblems to MINLP-only solver choices. In a GAMS workflow, that can fail before solve with messages like:
The inverse workaround is also not safe: forcing
minlp_solverto an NLP solver can fail on other LBB nodes that are still MINLP:It seems LBB needs model-class-aware dispatch for node subproblems, or a clearly documented solver role for "relaxed node solver" that can handle both continuous and mixed-integer node formulations.
Minimal working example
This MWE does not require any external solver. It monkeypatches the
SolverFactoryused insidepyomo.contrib.gdpopt.branch_and_boundto record which solver role LBB calls and whether the subproblem still contains unfixed discrete variables.Observed output:
This isolates the dispatch behavior in
_solve_rnGDP_subproblem(): even with a continuous subproblem, LBB callsconfig.minlp_solver.Expected behavior
If the transformed LBB node subproblem has no unfixed binary/integer variables, GDPopt should not blindly route it through the
minlp_solverrole.A reasonable dispatch policy could be:
There is a global-optimization caveat: for nonconvex continuous NLP node subproblems, using a local NLP solver such as IPOPT may not provide a rigorous LBB bound. One possible design is a separate
relaxed_nlp_solverorglobal_nlp_solverrole, defaulting conservatively to the existingminlp_solverfor global correctness, but allowing users to route continuous node subproblems to an appropriate solver explicitly.Downstream context
This surfaced while benchmarking GDPLib's HDA model:
hdato fix benchmark issues SECQUOIA/gdplib#67Observed HDA evidence:
gdpopt.lbbwith the GDPLibgams-localprofile routesminlp_solverto GAMS/DICOPT.nlp, and the GAMS writer rejects DICOPT for that problem class.minlp_solverto GAMS/IPOPTH avoids that specific error, but another node reaches GAMS as aminlp, and the GAMS writer rejects IPOPTH.Related downstream evidence from earlier GDPLib LBB work:
gdp_colissue: Refactorgdp_colto fix benchmark issues SECQUOIA/gdplib#66This issue is distinct from, but often masked by, the LBB time-limit stale-method bug in #3941.
Environment
Observed locally with:
I also checked
pyomo/contrib/gdpopt/branch_and_bound.pyon upstreamPyomo/pyomomain;_solve_rnGDP_subproblem()still appears to callconfig.minlp_solverunconditionally for the transformed node subproblem.