|
| 1 | +## Release 4.0.0b21 (1.7.2026) — Benders in-out stabilization (degeneracy tail-off) |
| 2 | + |
| 3 | +No database migration (schema stays **v62**). Dependency floor raised to |
| 4 | +**`polar-high>=3.4.0`** (`polars>=1.40`, `highspy<=1.14.0` unchanged). Opt-in and |
| 5 | +OFF by default — the converged solution is unchanged on every model. |
| 6 | + |
| 7 | +### Decomposition (Benders) |
| 8 | + |
| 9 | +- **Optional in-out separation to speed up a slowly-converging (tailing-off) |
| 10 | + spatial-Benders solve.** When storage (or any inter-temporal coupling) makes |
| 11 | + timesteps fungible, the region recourse is flat in the per-timestep coupling |
| 12 | + flow and the cut slopes become basis-dependent; the master then wanders among |
| 13 | + cost-equivalent flow schedules and the lower bound closes very slowly even |
| 14 | + though the best feasible solution is near-optimal early. In-out separation |
| 15 | + (Ben-Ameur & Neto 2007) generates each cut at an interior point |
| 16 | + `f_sep = λ·centre + (1-λ)·f_out` instead of the extreme master vertex — better- |
| 17 | + centred cuts, no wandering, faster bound closure, at **zero extra subproblem |
| 18 | + solves** (the region is solved once per iteration either way, just at a better |
| 19 | + point). Enabled per solve via the environment variable |
| 20 | + `FLEXTOOL_BENDERS_IN_OUT_WEIGHT` (the weight `λ`): **`0.0` (the default) is OFF** |
| 21 | + and byte-identical to before; `λ ∈ (0, 1)` turns it on, larger = more |
| 22 | + stabilisation. On a hydrogen-trade tail-off benchmark, `λ ≈ 0.3–0.7` reached the |
| 23 | + practical optimality gaps about 30% faster and closed the bound tighter than the |
| 24 | + un-stabilised run (which plateaued above the gap it could otherwise reach). The |
| 25 | + stabilisation math is the domain-free `polar_high.decomposition.InOutStabilizer` |
| 26 | + (3.4.0); FlexTool drives one instance per node group. Correctness is preserved |
| 27 | + regardless of `λ`: a cut generated at any point is a valid supporting hyperplane |
| 28 | + (valid lower bound), the interior point is clamped to the chosen capacity (valid |
| 29 | + upper bound), and the moment a region's cut fails to separate the master vertex |
| 30 | + the method falls back to an exact-Benders step for that region — so the optimum |
| 31 | + is unchanged and convergence is guaranteed. A future release will promote the |
| 32 | + knob to a `solve` database parameter once a default is settled. |
| 33 | + |
1 | 34 | ## Release 4.0.0b20 (1.7.2026) — Benders stall guard (fail fast with a diagnostic) |
2 | 35 |
|
3 | 36 | No database migration (schema stays **v62**). Dependency floor raised to |
|
0 commit comments