Skip to content

Commit a006a27

Browse files
h-g-sCopilot
andcommitted
fix: correct stale highspy→highsbox error message; update release announcement for 1.17.1
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 583802a commit a006a27

File tree

2 files changed

+77
-33
lines changed

2 files changed

+77
-33
lines changed

RELEASE-ANNOUNCEMENT.md

Lines changed: 75 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,59 @@
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
1562
backend. It supports LP and MIP solve, warm-starting for LP re-solves, and the full
1663
python-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
```
2169
pip 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
2674
of 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

100144
Full 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/

mip/highs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,8 +686,8 @@ class SolverHighs(mip.Solver):
686686
def __init__(self, model: mip.Model, name: str, sense: str):
687687
if not has_highs:
688688
raise FileNotFoundError(
689-
"HiGHS not found."
690-
"Please install the `highspy` package, or"
689+
"HiGHS not found. "
690+
"Please install the `highsbox` package (pip install mip[highs]), or "
691691
"set the `PMIP_HIGHS_LIBRARY` environment variable."
692692
)
693693

0 commit comments

Comments
 (0)