Panobbgo minimizes a function over a box in
It is a framework: you compose a strategy (a multi-armed bandit over point generators), a portfolio of heuristics (random/space-filling designs, local search, DE/CMA-ES/PSO, surrogate models, ...) and analyzers into an optimization run in a few lines of Python. Evaluations are dispatched in parallel — local threads by default, optionally a Dask cluster.
- Documentation — user guide and API reference
- User guide sources — reStructuredText, built with Sphinx
- Benchmarking guide — how quality is measured (composite score, statistical acceptance)
AGENTS.md— entry point for contributors and coding agents (process, commands, benchmarking indoc/dev/);TODO.md— open work
Panobbgo requires Python 3.14 or later. Core dependencies: NumPy, SciPy,
pandas, matplotlib, statsmodels, scikit-learn (see
pyproject.toml for the exact list). Dask is an optional
extra (dask) for distributed evaluation.
Install UV, then:
git clone https://github.com/haraldschilly/panobbgo.git
cd panobbgo
uv sync --extra devgit clone https://github.com/haraldschilly/panobbgo.git
cd panobbgo
pip install -e ".[dev]"uv run pytest -q -n 4 # full suite, ~3000 tests
uv run pytest --cov=panobbgo # with coverage
uv run pyright panobbgo # type checking
uv run ruff format --check . # formatting (the CI gate)Serial uv run pytest also works; -n 4 uses pytest-xdist.
Threaded local evaluation needs no setup. A minimal run:
from panobbgo.lib.classic import Rosenbrock
from panobbgo.strategies import StrategyRoundRobin
from panobbgo.heuristics import CMAES
problem = Rosenbrock(dims=5)
strategy = StrategyRoundRobin(problem, max_evaluations=500, seed=42)
strategy.add(CMAES) # self-adapting covariance, IPOP restarts
strategy.start()
print(strategy.best) # best result found
df = strategy.results.results # pandas DataFrame of all evaluationsStart with one strong population method rather than a portfolio: on the MA-BBOB battery a six-arm mix scored below every one of its own arms run alone, because splitting a fixed budget starves the population dynamics. Add heuristics only when a paired A/B shows they earn their evaluations — see Recommended Configurations.
panobbgo.lib.classic contains the built-in test problems (Rosenbrock,
Rastrigin, Himmelblau, Shekel, ...). To define your own, subclass
panobbgo.lib.Problem and implement eval(x) (and optionally
eval_constraints(x)). Configuration (evaluation backend, budgets, logging)
lives in config.yaml / ~/.panobbgo/config.ini; see the
usage guide for Dask setup, constrained
problems, persistent storage and more examples.
panobbgo/— the library (core,strategies/,heuristics/,analyzers/,lib/problems, benchmark harness)tests/— pytest suite;benchmarks/— micro-benchmarks and comparison scripts (arm_sweep.pytunes one optimizer alone)benchmark_harness.py,scripts/— the composite-score and IOH/MA-BBOB benchmark CLIsdoc/— Sphinx documentation;planning/— goals, design notes and historysketchpad/— unpolished scratch scripts, not maintained
Based on ideas of Snobfit:
- Harald Schilly harald.schilly@gmail.com
This project was revived in 2026 with the help of coding agents like Jules and Claude Code.