Several mechanisms must all be disabled. A cut separation loop in SCIP is
- solve LP
- separate global cut pool
- call separators
- filter cuts
- add surviving cuts to LP
- repeat.
Accordingly, the following parameters should be adjusted (replace setParam with the equivalent call on your environment).
Node limit.
Prevents branching.
setParam("limits/nodes", 1)
Global stall count cap.
Separation stops after a few rounds (10 is default) without dual bound improvement.
setParam("separating/maxstallroundsroot", -1)
Global cut count cap.
Default is 2000 cuts per round at the root.
setParam("separating/maxcutsroot", 2147483647)
Per-separator round limits.
Each separator has its own maxroundsroot, and the loop exits when all separators exhaust their own cap.
SCIP_SEPARATORS = [
"aggregation", "clique", "closecuts", "cmir", "convexproj",
"disjunctive", "dualbound", "eccuts", "flowcover", "gomory",
"impliedbounds", "intobj", "lagromory", "mcf", "mixing",
"oddcycle", "rapidlearning", "rlt", "strongcg", "zerohalf",
]
for sep in SCIP_SEPARATORS:
try:
setParam(f"separating/{sep}/maxroundsroot", -1)
setParam(f"separating/{sep}/maxsepacutsroot", 2147483647)
except Exception:
pass # separator absent in this SCIP build
Cut filters.
SCIP discards cuts whose efficacy is below minefficacyroot or whose direction is too parallel to existing cuts via minorthoroot.
setParam("separating/minefficacyroot", 0.0)
setParam("separating/hybrid/minorthoroot", 0.0)