Pybnb
A parallel branch-and-bound engine for Python. (https://pybnb.readthedocs.io/)
Install / Use
/learn @ghackebeil/PybnbREADME
pybnb
|PyPI-Status| |PyPI-Versions| |PyPI-Downloads|
|Testing-Status| |Coverage-Status| |Documentation-Status|
|Codacy-Grade| |Mypy| |Black|
A parallel branch-and-bound engine for Python. (https://pybnb.readthedocs.io)
This software is copyright (c) by Gabriel A. Hackebeil (gabe.hackebeil@gmail.com).
This software is released under the MIT software license. This license, including disclaimer, is available in the 'LICENSE' file.
Quick Start
Define a problem:
.. code:: python
simple.py
import pybnb class Simple(pybnb.Problem): def init(self): self.bounds = [0.0,1.0] def sense(self): return pybnb.minimize def objective(self): return round(self.bounds[1] - self.bounds[0], 3) def bound(self): return -(self.bounds[1] - self.bounds[0])**2 def save_state(self, node): node.state = self.bounds def load_state(self, node): self.bounds = node.state def branch(self): L, U = self.bounds mid = 0.5 * (L + U) for l,u in [(L,mid), (mid,U)]: child = pybnb.Node() child.state = (l,u) yield child
Write a solve script:
.. code:: python
solve_simple.py
import simple problem = simple.Simple() results = pybnb.solve(problem, absolute_gap=1e-9)
Run the script:
.. code:: bash
$ mpirun -np 4 python solve_simple.py
Using non-default solver options:
- absolute_gap: 1e-09 (default: 0)
Starting branch & bound solve:
- dispatcher pid: 34902 (Ozymandias.local)
- worker processes: 3
Nodes | Objective Bounds | Work
Expl Unexpl | Incumbent Bound Rel. Gap Abs. Gap | Time (s) Nodes/Sec Imbalance Idle
0 1 | inf -inf inf% inf | 0.0 0.00 0.00% 0
-
1 2 | 1 -1 200.0000000% 2 | 0.0 1226.99 300.00% 1 -
2 3 | 0.5 -1 150.0000000% 1.5 | 0.0 2966.04 150.00% 0 -
4 5 | 0.25 -0.25 50.0000000% 0.5 | 0.0 8081.95 75.00% 0 -
8 9 | 0.125 -0.0625 18.7500000% 0.1875 | 0.0 12566.90 37.50% 0 Expl Unexpl | Incumbent Bound Rel. Gap Abs. Gap | Time (s) Nodes/Sec Imbalance Idle -
16 17 | 0.062 -0.015625 7.7625000% 0.077625 | 0.0 15352.74 18.75% 0 -
32 33 | 0.031 -0.00390625 3.4906250% 0.03490625 | 0.0 15981.49 18.75% 0 -
64 65 | 0.016 -0.0009765625 1.6976563% 0.0169765625 | 0.0 18740.68 18.75% 0 -
128 129 | 0.008 -0.0002441406 0.8244141% 0.008244140625 | 0.0 21573.51 11.72% 0 -
256 257 | 0.004 -6.103516e-05 0.4061035% 0.004061035156 | 0.0 22166.96 8.20% 0 Expl Unexpl | Incumbent Bound Rel. Gap Abs. Gap | Time (s) Nodes/Sec Imbalance Idle -
512 513 | 0.002 -1.525879e-05 0.2015259% 0.002015258789 | 0.0 21177.00 5.86% 0 -
1024 1025 | 0.001 -3.814697e-06 0.1003815% 0.001003814697 | 0.1 19978.42 9.38% 0 -
24029 24030 | 0 -1.490116e-08 0.0000015% 1.490116119e-08 | 1.1 21961.03 5.98% 0 46159 46160 | 0 -3.72529e-09 0.0000004% 3.725290298e-09 | 2.1 22120.75 5.73% 0 Expl Unexpl | Incumbent Bound Rel. Gap Abs. Gap | Time (s) Nodes/Sec Imbalance Idle 65537 65538 | 0 -9.313226e-10 0.0000001% 9.313225746e-10 | 3.0 22459.50 6.20% 02048 2049 | 0 -9.536743e-07 0.0000954% 9.536743164e-07 | 0.1 21606.45 5.42% 0
Absolute optimality tolerance met Optimal solution found!
solver results:
- solution_status: optimal
- termination_condition: optimality
- objective: 0
- bound: -9.313226e-10
- absolute_gap: 9.313226e-10
- relative_gap: 9.313226e-10
- nodes: 65537
- wall_time: 2.96 s
- best_node: Node(objective=0)
Number of Workers: 3 Load Imbalance: 6.20%
- min: 21355 (proc rank=3)
- max: 22710 (proc rank=1) Average Worker Timing:
- queue: 80.78% [avg time: 109.6 us, count: 65537]
- load_state: 0.44% [avg time: 596.1 ns, count: 65537]
- bound: 0.59% [avg time: 796.1 ns, count: 65537]
- objective: 3.52% [avg time: 4.7 us, count: 65537]
- branch: 3.36% [avg time: 4.6 us, count: 65537]
- other: 11.31% [avg time: 15.3 us, count: 65537]
.. |Testing-Status| image:: https://github.com/ghackebeil/pybnb/actions/workflows/ci.yml/badge.svg :target: https://github.com/ghackebeil/pybnb/actions/workflows/ci.yml .. |Coverage-Status| image:: https://codecov.io/gh/ghackebeil/pybnb/branch/master/graph/badge.svg :target: https://codecov.io/gh/ghackebeil/pybnb .. |Documentation-Status| image:: https://readthedocs.org/projects/pybnb/badge/?version=latest :target: http://pybnb.readthedocs.io/en/latest/?badge=latest .. |PyPI-Status| image:: https://img.shields.io/pypi/v/pybnb.svg :target: https://pypi.python.org/pypi/pybnb .. |PyPI-Versions| image:: https://img.shields.io/pypi/pyversions/pybnb.svg :target: https://pypi.org/project/pybnb .. |Codacy-Grade| image:: https://img.shields.io/lgtm/grade/python/g/ghackebeil/pybnb.svg?logo=lgtm&logoWidth=18 :target: https://lgtm.com/projects/g/ghackebeil/pybnb/context:python .. |PyPI-Downloads| image:: https://img.shields.io/pypi/dm/pybnb.svg :target: https://pypistats.org/packages/pybnb .. |Black| image:: https://img.shields.io/badge/code%20style-black-000000.svg :target: https://github.com/psf/black .. |Mypy| image:: http://www.mypy-lang.org/static/mypy_badge.svg :target: http://mypy-lang.org
Related Skills
node-connect
352.0kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
claude-opus-4-5-migration
111.1kMigrate prompts and code from Claude Sonnet 4.0, Sonnet 4.5, or Opus 4.1 to Opus 4.5
frontend-design
111.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
model-usage
352.0kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
