Repository navigation
🎉 We're happy to announce the PyEPO 2.2.7 release. 🎉
This release tightens the DSL and the solver backends. The DSL expression algebra is now stricter and more numpy-consistent: a numpy array broadcasts against an expression the numpy way, while two expressions must share a shape (no implicit replication, no flat carve-out). A quadratic objective term is made explicitly solve-only across the training and metric stack, and a broad batch of backend correctness fixes lands for MPAX, COPT, OR-Tools, VRP cuts, and Frank-Wolfe. Python 3.14 is now declared supported.
What's New
Features
- Two DSL expressions must share a shape
- A numpy array combined with an expression broadcasts by numpy's own row/column rules
- MPAX warns when it relaxes integer variables to their bounds
- CaVE collate is auto-wired through
optDataLoader
Bug Fixes
- Quadratic objective is now solve-only end to end:
pyepo.functraining methods andpyepo.metricmetrics reject a DSL model carrying a quadratic objective term at construction, andcompile()warns; quadratic constraints are unaffected - Consistent objective offset across the solve, cache, and MPAX paths
- MPAX: dtype and shape edge cases in
setObj, the KNN dataset, Frank-Wolfe, and the solution pool - COPT: guarded solution reads with an explicit availability check; copied variables mapped by name; only violated RCI cuts added in the VRP callback
- OR-Tools: solver parameters reapplied when a model is copied
- VRP: single-customer depot round trips forbidden in the MTZ formulation; RCI cut recording decoupled from lazy-cut submission
- Frank-Wolfe: displaced atom mass no longer dropped on active-set buffer overflow
- CaVE: worker pools skip the
optmodelpreload; regret dataloaders ignore the extra CaVE fields - Datasets: inputs normalized to arrays across subclasses; MSE averaged over the yielded samples
- Model reconstruction: rebuild works with var-positional and non-copyable constructor arguments
- Each solver pool gets a unique pathos id
