1- # python-mip 1.17 Released 🎉
1+ # python-mip 1.17.1 Released 🎉
22
3- We are pleased to announce the release of ** python-mip 1.17** , the first new release since
4- 1.15.0. This version brings a new solver backend, major infrastructure improvements, and several
5- bug fixes.
3+ We are pleased to announce the release of ** python-mip 1.17.1** , the first publicly available
4+ release in quite some time. This is a patch release on top of 1.17, which itself brought a new
5+ solver backend, major infrastructure improvements, and several bug fixes. 1.17.1 delivers
6+ important stability fixes for CBC and updated binaries via ` cbcbox 2.910 ` .
67
78---
89
9- ## What's New
10+ ## What's New in 1.17.1
11+
12+ ### CBC crash fix: Gomory Mixed-Integer cuts (` CutType.GMI ` )
13+
14+ A crash was discovered when using ` CutType.GMI ` with recent CBC versions. The root cause was
15+ a bug in ` scaleCutIntegral ` — a function shared by ` OsiCuts ` and ` CglGomory ` — that modified
16+ coefficient arrays ** in place** before asserting integrality, causing an ` abort() ` when
17+ borderline floating-point rounding left a value just outside the 1e-9 tolerance. The fix
18+ (pre-check all values before applying any modification) was committed directly to the upstream
19+ COIN-OR repositories [ coin-or/Osi] ( https://github.com/coin-or/Osi ) and
20+ [ coin-or/Cgl] ( https://github.com/coin-or/Cgl ) and is included in ` cbcbox 2.910 ` .
21+
22+ ### Updated CBC binaries via ` cbcbox 2.910 `
23+
24+ python-mip 1.17.1 requires ` cbcbox>=2.910 ` , which ships binaries built from the latest
25+ COIN-OR master (post-fix). The new wheels include:
26+
27+ - The ` scaleCutIntegral ` crash fix in both Osi and Cgl
28+ - Updated ` CutType ` C enum (` CT_LaGomory ` removed; entries renumbered) correctly reflected
29+ in python-mip's ` ffi.cdef `
30+ - Performance improvements from recent COIN-OR master commits
31+
32+ ### cbcbox: faster CBC, simpler releases
33+
34+ ` cbcbox ` is now the sole distribution channel for CBC binaries. This decoupling means future
35+ CBC improvements — algorithm enhancements, bug fixes, new COIN-OR master commits — can reach
36+ users with a ` cbcbox ` release alone, without touching python-mip at all. The release cycle
37+ for CBC upgrades is now:
38+
39+ 1 . Push fix to upstream COIN-OR (coin-or/Cbc, coin-or/Cgl, coin-or/Osi, …)
40+ 2 . Bump ` cbcbox ` version and push — CI builds all platforms automatically
41+ 3 . Bump ` cbcbox>=X.Y ` in python-mip ` pyproject.toml ` and push a tag
42+
43+ On x86\_ 64 (Linux, macOS, Windows), ` cbcbox ` ships ** two** complete solver stacks per wheel:
44+
45+ | Variant | OpenBLAS kernel | Description |
46+ | ---| ---| ---|
47+ | ` generic ` | ` DYNAMIC_ARCH ` runtime dispatch | Compatible with any x86\_ 64 CPU |
48+ | ` avx2 ` | ` HASWELL ` 256-bit AVX2/FMA | Optimised for Haswell (2013+) and newer |
49+
50+ The best variant is selected automatically at import time. The AVX2 build delivers measurable
51+ speedups on modern hardware thanks to wider SIMD in the dense linear algebra kernels used by
52+ Clp's simplex solver.
53+
54+ ---
55+
56+ ## What's New in 1.17 (first release since 1.15.0)
1057
1158### HiGHS is now a supported solver
1259
@@ -15,7 +62,8 @@ open-source LP/MIP solver with an MIT licence. HiGHS joins CBC and Gurobi as a f
1562backend. It supports LP and MIP solve, warm-starting for LP re-solves, and the full
1663python-mip constraint/variable API.
1764
18- To use HiGHS, install the optional dependency:
65+ HiGHS binaries are distributed via ` highsbox ` , installed automatically as an optional
66+ dependency:
1967
2068```
2169pip install mip[highs]
@@ -25,52 +73,48 @@ This work was led primarily by **Robert Schwarz**, with contributions from **Tú
2573** Adeel Khan** , ** Bernard Zweers** , and ** Miguel Hisojo** . The integration spanned many months
2674of careful incremental work — thank you all!
2775
28- ### CBC binary distribution: a new era with ` cbcbox `
76+ ### CBC binary distribution via ` cbcbox `
2977
30- One of the longest-standing pain points in python-mip has been shipping up-to-date CBC binaries.
31- Historically, pre-built ` .so ` /` .dylib ` /` .dll ` files lived directly in the python-mip repository,
32- which meant updating CBC required a full python-mip release and manually building binaries for
33- each platform.
78+ Historically, pre-built CBC binaries lived directly in the python-mip repository, requiring
79+ a full python-mip release for every CBC update and manual cross-platform builds.
3480
35- ** With 1.17, we have completely decoupled CBC binary distribution** into a new companion package,
36- [ cbcbox] ( https://pypi.org/project/cbcbox/ ) . ` cbcbox ` ships pre-built CBC wheels for:
81+ ** With 1.17, CBC binary distribution is fully decoupled** into
82+ [ cbcbox] ( https://pypi.org/project/cbcbox/ ) , a dedicated companion package with pre-built
83+ wheels for:
3784
3885- Linux x86\_ 64 and aarch64
3986- macOS x86\_ 64 and arm64 (Apple Silicon, native — no Rosetta!)
4087- Windows x64
4188
42- ` cbcbox ` is installed automatically as a dependency of python-mip. Future CBC upgrades can now
43- be shipped by releasing a new ` cbcbox ` version — completely independently of python-mip.
44-
45- A big thank you to ** Túlio Toffolo** for also building the first macOS ARM64 CBC binary for the
46- transition period, and for co-developing the ` cbcbox ` tooling.
89+ ` cbcbox ` is installed automatically. The same architecture applies to HiGHS via ` highsbox ` .
4790
4891### Automated releases via GitHub Actions
4992
50- Starting with this release, publishing a new version of python-mip to PyPI is as simple as
51- pushing a version tag:
93+ Publishing a new version of python-mip to PyPI is now as simple as:
5294
5395```
54- git tag v1.17 && git push --tags
96+ git tag v1.17.1 && git push --tags
5597```
5698
57- A GitHub Actions workflow using OIDC Trusted Publisher takes care of building and uploading
58- to PyPI automatically, with no API tokens to manage.
99+ A GitHub Actions workflow using OIDC Trusted Publisher handles building and uploading to
100+ PyPI with no API tokens to manage.
59101
60- ### Python 3.10–3.13 + PyPy 3.11 support ; minimum raised to 3.10
102+ ### Python 3.10–3.13 + PyPy 3.11; minimum raised to 3.10
61103
62- python-mip now officially supports Python 3.10, 3.11, 3.12, 3.13 and PyPy 3.11, tested across
63- Linux (x86\_ 64 and arm64), macOS (Apple Silicon), and Windows. Python 3.8 and 3.9 have reached
64- end-of-life and are no longer supported.
104+ python-mip now officially supports Python 3.10, 3.11, 3.12, 3.13 and PyPy 3.11, tested
105+ across Linux (x86\_ 64 and arm64), macOS (Apple Silicon), and Windows. Python 3.8 and 3.9
106+ have reached end-of-life and are no longer supported.
65107
66108---
67109
68- ## Bug Fixes
110+ ## Bug Fixes (cumulative 1.17 + 1.17.1)
69111
70- - ** CBC re-solve correctness** : Calling ` optimize() ` multiple times on the same model could
71- return stale results due to a behavioural change in newer CBC. Fixed.
112+ - ** GMI cut crash** (` CutType.GMI ` ): ` scaleCutIntegral ` assert in Osi/Cgl. Fixed upstream.
113+ - ** CBC re-solve correctness** : ` optimize() ` called multiple times could return stale results.
114+ Fixed by calling ` Cbc_reset() ` before each solve.
72115- ** Empty ` LinExpr ` in constraints** handled correctly (thanks ** Sebastian Heger** , #237 ).
73116- ** Windows DLL loading** fixed for Python 3.8+ (` os.add_dll_directory ` now used).
117+ - ** Stale HiGHS error message** corrected to reference ` highsbox ` instead of ` highspy ` .
74118
75119---
76120
@@ -99,4 +143,4 @@ Thank you to everyone who contributed code, bug reports, and reviews since 1.15:
99143
100144Full changelog: https://github.com/coin-or/python-mip/blob/master/CHANGELOG.md
101145
102- PyPI: https://pypi.org/project/mip/1.17/
146+ PyPI: https://pypi.org/project/mip/1.17.1 /
0 commit comments