Skip to content

Repository files navigation

Panobbgo: Parallel Noisy Black-Box Global Optimization

Tests

Panobbgo minimizes a function over a box in $R^n$ (n = dimension of the problem) while respecting a vector of constraint violations.

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

  • 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 in doc/dev/); TODO.md — open work

Installation

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.

Using UV (recommended)

Install UV, then:

git clone https://github.com/haraldschilly/panobbgo.git
cd panobbgo
uv sync --extra dev

Using pip

git clone https://github.com/haraldschilly/panobbgo.git
cd panobbgo
pip install -e ".[dev]"

Running tests

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.

Usage

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 evaluations

Start 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.

Repository layout

  • panobbgo/ — the library (core, strategies/, heuristics/, analyzers/, lib/ problems, benchmark harness)
  • tests/ — pytest suite; benchmarks/ — micro-benchmarks and comparison scripts (arm_sweep.py tunes one optimizer alone)
  • benchmark_harness.py, scripts/ — the composite-score and IOH/MA-BBOB benchmark CLIs
  • doc/ — Sphinx documentation; planning/ — goals, design notes and history
  • sketchpad/ — unpolished scratch scripts, not maintained

License

Apache 2.0

Credits

Based on ideas of Snobfit:

Authors

History

This project was revived in 2026 with the help of coding agents like Jules and Claude Code.

About

solver for parallel noisy global black-box optimization -- this is currently work in progress

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages