Skip to content

Commit 4c96b55

Browse files
h-g-sCopilot
andcommitted
docs: add CHANGELOG and release announcement for v1.17
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 65ed45e commit 4c96b55

File tree

2 files changed

+203
-0
lines changed

2 files changed

+203
-0
lines changed

CHANGELOG.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# Changelog — python-mip 1.17
2+
3+
> Changes since **1.15.0** (1.16 was an unreleased RC)
4+
5+
---
6+
7+
## New Features
8+
9+
### HiGHS Solver Support
10+
python-mip now ships with full support for the [HiGHS](https://highs.dev) open-source solver as a
11+
first-class backend (alongside CBC and Gurobi). HiGHS is a high-performance solver for LP and MIP
12+
problems with a permissive MIT licence.
13+
14+
Key capabilities added:
15+
- Full LP and MIP solve via HiGHS C API (through `highsbox`)
16+
- Warm-start (basis handoff) for LP re-solves
17+
- `relax=True` support in `optimize()`
18+
- Variable and constraint inspection/modification
19+
- Correct handling of `UNBOUNDED` vs `INFEASIBLE` status
20+
- Reduced memory footprint and improved file read/write consistency
21+
22+
HiGHS is installed as an optional dependency: `pip install mip[highs]`.
23+
24+
### macOS Apple Silicon (M1/M2/M3) Native Support
25+
CBC now runs natively on Apple Silicon via a pre-built ARM64 binary, replacing the previous
26+
Rosetta 2 x86_64 fallback.
27+
28+
---
29+
30+
## Infrastructure & Distribution
31+
32+
### CBC Binaries via `cbcbox`
33+
The bundled CBC shared libraries (`.so`, `.dylib`, `.dll`) have been **removed from the
34+
python-mip source tree**. CBC binaries are now distributed through the
35+
[cbcbox](https://pypi.org/project/cbcbox/) PyPI package, which provides pre-built wheels for:
36+
37+
- Linux x86\_64 and aarch64 (ARM64)
38+
- macOS x86\_64 and arm64
39+
- Windows x64
40+
41+
`cbcbox` is a dedicated package whose sole job is to ship up-to-date CBC binaries for all
42+
major platforms. This decoupling means future CBC upgrades are released without touching
43+
python-mip itself. The minimum required version is `cbcbox>=2.902`.
44+
45+
### Automated PyPI Publishing
46+
A new GitHub Actions workflow (`.github/workflows/publish.yml`) automatically publishes to
47+
PyPI whenever a `v*` tag is pushed. It uses OIDC Trusted Publisher authentication — no API
48+
tokens to rotate.
49+
50+
### Modernised CI Matrix
51+
| Platform | OS |
52+
|---|---|
53+
| Linux x86\_64 | ubuntu-24.04 |
54+
| Linux aarch64 | ubuntu-24.04-arm *(new)* |
55+
| macOS ARM64 | macos-15 *(new)* |
56+
| Windows x64 | windows-2025 *(new)* |
57+
58+
Python versions tested: **3.10, 3.11, 3.12, 3.13, PyPy 3.11**.
59+
60+
---
61+
62+
## Bug Fixes
63+
64+
- **CBC re-solve correctness**: A bug introduced by newer CBC versions caused stale solution
65+
data to be returned when `optimize()` was called multiple times on the same model. Fixed by
66+
calling `Cbc_reset()` before each `Cbc_solve()`, with objective sense saved and restored
67+
around the reset.
68+
- **`isfile` import missing in `SolverCbc.read()`**: `os.path.isfile` was used but not
69+
imported, causing a `NameError` when loading a model from a file.
70+
- **Windows DLL loading**: On Python 3.8+, Windows ignores `PATH` when resolving DLL
71+
dependencies. Fixed by calling `os.add_dll_directory()` on the cbcbox `bin/` directory.
72+
- **Empty `LinExpr` in constraints**: Constraints containing an empty linear expression were
73+
not handled correctly. Fixed by Sebastian Heger (#237).
74+
75+
---
76+
77+
## Breaking Changes / Compatibility
78+
79+
- **Minimum Python version raised to 3.10.** Python 3.8 and 3.9 have reached end-of-life and
80+
are no longer tested or supported.
81+
- Bundled CBC libraries removed — `cbcbox` is now a required dependency (installed
82+
automatically via pip).
83+
- `gurobipy` version constraint relaxed to `>=10` (no upper bound).
84+
- `cffi` version constraint relaxed to `>=1.15` (no upper bound).
85+
- `highsbox` version constraint relaxed to `>=1.10.0` (no upper bound).
86+
87+
---
88+
89+
## Acknowledgements
90+
91+
This release was a team effort. Thank you to everyone who contributed:
92+
93+
- **Robert Schwarz** — HiGHS interface: initial implementation (PR #332) and extensive
94+
improvements (PR #418), including objective setter fix, option types, test coverage and
95+
`highsbox` migration. Co-authored with **Bernard Zweers** and **Miguel Hisojo**.
96+
- **Túlio Toffolo** — macOS Apple Silicon support, HiGHS testing infrastructure, CI
97+
modernisation, and many quality-of-life fixes.
98+
- **Sebastian Heger** — Bug fix for constraints with empty linear expressions (#237).
99+
- **Dominik Peters** — Removed upper limit on supported Python versions (#408).
100+
- **Adeel Khan** — HiGHS `_core` library support.
101+
- **Haroldo Santos** — cbcbox integration, CBC bug fixes, CI/CD automation, and release management.

RELEASE-ANNOUNCEMENT.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# python-mip 1.17 Released 🎉
2+
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.
6+
7+
---
8+
9+
## What's New
10+
11+
### HiGHS is now a supported solver
12+
13+
python-mip 1.17 ships with full support for [HiGHS](https://highs.dev) — a high-performance,
14+
open-source LP/MIP solver with an MIT licence. HiGHS joins CBC and Gurobi as a first-class
15+
backend. It supports LP and MIP solve, warm-starting for LP re-solves, and the full
16+
python-mip constraint/variable API.
17+
18+
To use HiGHS, install the optional dependency:
19+
20+
```
21+
pip install mip[highs]
22+
```
23+
24+
This work was led primarily by **Robert Schwarz**, with contributions from **Túlio Toffolo**,
25+
**Adeel Khan**, **Bernard Zweers**, and **Miguel Hisojo**. The integration spanned many months
26+
of careful incremental work — thank you all!
27+
28+
### CBC binary distribution: a new era with `cbcbox`
29+
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.
34+
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:
37+
38+
- Linux x86\_64 and aarch64
39+
- macOS x86\_64 and arm64 (Apple Silicon, native — no Rosetta!)
40+
- Windows x64
41+
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.
47+
48+
### Automated releases via GitHub Actions
49+
50+
Starting with this release, publishing a new version of python-mip to PyPI is as simple as
51+
pushing a version tag:
52+
53+
```
54+
git tag v1.17 && git push --tags
55+
```
56+
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.
59+
60+
### Python 3.10–3.13 + PyPy 3.11 support; minimum raised to 3.10
61+
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.
65+
66+
---
67+
68+
## Bug Fixes
69+
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.
72+
- **Empty `LinExpr` in constraints** handled correctly (thanks **Sebastian Heger**, #237).
73+
- **Windows DLL loading** fixed for Python 3.8+ (`os.add_dll_directory` now used).
74+
75+
---
76+
77+
## Upgrading
78+
79+
```
80+
pip install --upgrade mip
81+
```
82+
83+
For HiGHS support:
84+
85+
```
86+
pip install --upgrade "mip[highs]"
87+
```
88+
89+
---
90+
91+
## Contributors
92+
93+
Thank you to everyone who contributed code, bug reports, and reviews since 1.15:
94+
95+
**Robert Schwarz** · **Túlio Toffolo** · **Sebastian Heger** · **Dominik Peters** ·
96+
**Adeel Khan** · **Bernard Zweers** · **Miguel Hisojo** · **Haroldo Santos**
97+
98+
---
99+
100+
Full changelog: https://github.com/coin-or/python-mip/blob/master/CHANGELOG.md
101+
102+
PyPI: https://pypi.org/project/mip/1.17/

0 commit comments

Comments
 (0)