SteinerPy
SteinerPy solves Steiner tree and Steiner forest problems — and many advanced variants — to proven optimality, directly on NetworkX graphs. It uses the open-source HiGHS solver by default, with Gurobi supported as an optional backend.
- One API, many variants — Steiner tree/forest, prize-collecting, node-weighted, maximum-weight connected subgraph, directed (arborescence), hop-constrained, group, rectilinear, terminal-leaf, and budgeted variants.
- Exact, with a certificate — every solve reports a proven optimality gap;
gap == 0.0means provably optimal. - Fast by default — provably optimum-preserving graph reductions from the Steiner-tree literature run automatically, plus an opt-in dual-ascent accelerator and a heuristic-only mode that stays in NetworkX's speed class while still certifying its gap.
📖 Documentation: steinerpy.readthedocs.io
Installation
pip install steinerpy
Requires Python 3.8+. The HiGHS backend is installed automatically; to use Gurobi instead, install gurobipy and provide a valid license.
Quick start
import networkx as nx
from steinerpy import SteinerProblem
G = nx.Graph()
G.add_edge("A", "B", weight=1)
G.add_edge("B", "C", weight=2)
G.add_edge("C", "D", weight=1)
# One terminal group = Steiner tree; multiple groups = Steiner forest
# Edge/arc costs must be non-negative.
solution = SteinerProblem(G, [["A", "D"]]).get_solution()
print(f"Optimal cost: {solution.objective}")
print(f"Selected edges: {solution.selected_edges}")
print(f"Proven optimality gap: {solution.gap}") # 0.0 == provably optimal
See the documentation for the full catalogue of problem variants, solver selection, performance features (dual ascent, graph reductions, heuristic-only mode), benchmarks against NetworkX and pcst_fast, and the API reference. The example notebook walks through the main features.
Citing
If you use SteinerPy in your research, please cite:
@article{markhorst2025future,
title={Future-proof ship pipe routing: Navigating the energy transition},
author={Markhorst, Berend and Berkhout, Joost and Zocca, Alessandro and Pruyn, Jeroen and van der Mei, Rob},
journal={Ocean Engineering},
volume={319},
pages={120113},
year={2025},
publisher={Elsevier}
}
Contributing
Contributions are very welcome! Please read the contributing guidelines and open an issue to discuss your idea before starting on a pull request.
License
SteinerPy is available under the MIT license.
Star History
Metadata
Release files for steinerpy 1.0.20
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| steinerpy-1.0.20.tar.gz | 124.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| steinerpy-1.0.20-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 251.0 kB
Release files / steinerpy-1.0.20.tar.gz
| Download URL | steinerpy-1.0.20.tar.gz |
|---|---|
| Size | 124.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
66da37e1f51f1205fa57831ddc358c897e8ab4d22e59b0519850da389d132d59
|
|
BLAKE2b-256 checksum How to use checksums |
f1558a318ea74fccade115f2fe8ff143b15d14024f95855e6056ee441ad8ca2b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / steinerpy-1.0.20-py3-none-any.whl
| Download URL | steinerpy-1.0.20-py3-none-any.whl |
|---|---|
| Size | 126.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
67ac4487866bc1877049c94b342ddd0465f9f5fb83c85c3a8453e2f268f92571
|
|
BLAKE2b-256 checksum How to use checksums |
1609b9421886bbb8ce971467d05de49dffb15418811d92575add20e66805484b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|