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
The CrossScenarioExtension (mpisppy/extensions/cross_scen_extension.py) installs per-iteration cuts into every local scenario's s._mpisppy_model.benders_cuts ConstraintList, keyed by (outer_iter, scen_name). Those entries are never removed — only the inner_bound_constr gets pruned (to keep just the tightest bound). benders_cuts accumulates unboundedly over the life of a run.
The proposed xhat feasibility-cut feature (see doc/xhat_feasibility_cuts_design.md, addresses issue #601) will install cuts the same way, so it inherits the same unbounded growth.
Impact
For long runs — especially on problems where each PH iteration triggers a fresh cross-scen cut round, or where an xhatter finds many distinct infeasible candidates — the per-scenario subproblem accumulates constraints indefinitely. Persistent-solver warm starts still work, but solver times grow as the model bloats, and eventually dominate.
What this issue asks for
A shared cut-pool-management strategy that both extensions can use. Options to consider:
Hard cap per scenario. Keep at most N cuts; drop the oldest on overflow.
LRU / "not binding for K iterations" prune. Track whether each cut was at its bound in the last K solves; drop cold ones.
Age-based prune. Drop cuts older than M outer iterations.
The strategy should live in a small utility (candidate name: mpisppy.utils.cut_pool) so both extensions call the same code. Persistent-solver-aware removal (solver.remove_constraint(...)) has to be part of it.
Background
The
CrossScenarioExtension(mpisppy/extensions/cross_scen_extension.py) installs per-iteration cuts into every local scenario'ss._mpisppy_model.benders_cutsConstraintList, keyed by(outer_iter, scen_name). Those entries are never removed — only theinner_bound_constrgets pruned (to keep just the tightest bound).benders_cutsaccumulates unboundedly over the life of a run.The proposed xhat feasibility-cut feature (see
doc/xhat_feasibility_cuts_design.md, addresses issue #601) will install cuts the same way, so it inherits the same unbounded growth.Impact
For long runs — especially on problems where each PH iteration triggers a fresh cross-scen cut round, or where an xhatter finds many distinct infeasible candidates — the per-scenario subproblem accumulates constraints indefinitely. Persistent-solver warm starts still work, but solver times grow as the model bloats, and eventually dominate.
What this issue asks for
A shared cut-pool-management strategy that both extensions can use. Options to consider:
The strategy should live in a small utility (candidate name:
mpisppy.utils.cut_pool) so both extensions call the same code. Persistent-solver-aware removal (solver.remove_constraint(...)) has to be part of it.Relation to other work
doc/xhat_feasibility_cuts_design.md(upcoming PR for issue Xhatters should optionally generate feasibility cuts #601) calls out this gap in its "Cut pool management" open question and defers to this issue.cut_installerhelper proposed in the same design doc is a natural home for the pruning symmetry.