Skip to main content

Python wrapper for the BAM derivative-free global optimization solver

Project description

bam-solver

Python wrapper for the BAM (Branch-And-Model) derivative-free global optimization solver.

Three layers of API ergonomics:

  1. bam.minimize: SciPy-style functional facade.
  2. Bam: low-level mirror of the BAM C API.
  3. bam.AskTell: ask/tell interface for off-process or asynchronous evaluators.

Requirements

  • Python >= 3.10
  • Linux (x86_64, aarch64), macOS (Intel, Apple Silicon), or Windows (x86_64)

No compiler and no separate BAM installation are needed: each wheel bundles libbam and its runtime libraries inside the package. The only runtime dependencies are NumPy and CFFI, installed automatically.

Installation

pip install bam-solver

That is all; there is nothing else to install or configure to start solving. BAM runs in free mode for small problems; larger problems need a license (see Licensing below).

Building from source (maintainers/contributors only) requires a local BAM build providing bam.h and libbam.*:

BAM_INCLUDE_DIR=/path/to/bam/include BAM_LIB_DIR=/path/to/bam/lib \
    uv build --wheel

See release/README.md for the full in-house build/test/publish process.

Quick examples

Functional (SciPy-style): bam.minimize

import bam

def shc(x):
    x1, x2 = x
    return ((4 - 2.1*x1**2 + x1**4/3) * x1**2
            + x1*x2 + (-4 + 4*x2**2) * x2**2)

res = bam.minimize(shc, x0=[0, 0],
                   bounds=[(-3, 3), (-1.5, 1.5)],
                   options={"max_evals": 80})
print(res.x, res.fun, res.nfev, res.message)

bam.minimize is also usable as the method= argument to scipy.optimize.minimize:

from scipy.optimize import minimize
res = minimize(shc, [0, 0], method=bam.minimize,
               bounds=[(-3, 3), (-1.5, 1.5)],
               options={"max_evals": 80})

Bounds are optional: omit them and BAM uses its default box, exactly as the low-level Bam class and the C API do. Common BAM options keys: max_evals, max_time, max_iter, max_no_gain, print_to_screen, outfname, tracefname, evalsfname, prevals; setting outfname/tracefname enables the listing/trace file, and evalsfname is required whenever prevals is nonzero. Any other BAM option is forwarded verbatim with a single warning naming it, or pass it through raw_options={"name": value} to forward without the warning. The wrapper also accepts x_evaluated/f_evaluated (pre-evaluated points) and history=True (attaches the full x_hist/f_hist evaluation trajectory to the result). Use integrality=[0, 1, ...] for mixed-integer problems (SciPy convention).

Ask/tell: bam.AskTell

For evaluators that BAM cannot call directly (a remote simulator, a long-running batch job, an HPC scheduler):

import bam

opt = bam.AskTell(nvars=2, bounds=[(-3, 3), (-1.5, 1.5)], max_evals=80)
while not opt.is_done():
    try:
        x = opt.ask()
    except StopIteration:
        break
    f = my_simulator(x)             # may take seconds, minutes, hours
    opt.tell(x, f)
res = opt.recommendation()
print(res.x, res.fun)

BAM runs in a background thread; ask() blocks until BAM requests a point, tell(x, f) feeds the result back. Bounds are optional here too (nvars gives the dimension). Use the context-manager form (with bam.AskTell(...) as opt: ...) so the worker thread is always cleaned up. One ask outstanding at a time; pickling / cross-process resume is not supported.

Low-level: Bam

import numpy as np
from bam import Bam

with Bam(nvars=2) as solver:
    solver.set_real_vector("xmin", [-3, -1.5])
    solver.set_real_vector("xmax", [ 3,  1.5])
    solver.set_int("maxevals", 80)
    solver.set_objective(shc)
    result = solver.solve(x0=[0.0, 0.0])

print(result.x, result.fun, result.nfev, result.message)

Licensing

BAM is free for problems with up to two variables. Larger problems require a license file, free for academic users at https://minlp.com/bam-licenses.

The wrapper defers to BAM for license-file discovery; BAM searches CWD, the executable's directory, and every entry of $PATH for a file whose name is configured via the licfname string option (default bamlice.txt). To override:

import bam
bam.set_license_file("/path/to/bam.lic")
# or set BAM_LICENSE_FILE in the environment before importing bam

Diagnostics: bam.license_status() returns a dict with state, path, and free_limit_nvars. If BAM is in free mode at solve time the wrapper emits a one-time BamLicenseWarning.

Tests

pytest                                   # runs the in-package suite
BAM_TEST_LICENSE=/usr/local/bin/bamlice.txt pytest    # also exercises licensed-mode paths

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bam_solver-3.1.0.tar.gz (72.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

bam_solver-3.1.0-cp312-cp312-win_amd64.whl (16.0 MB view details)

Uploaded CPython 3.12Windows x86-64

bam_solver-3.1.0-cp312-cp312-manylinux_2_27_aarch64.whl (12.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64

bam_solver-3.1.0-cp312-cp312-manylinux_2_24_x86_64.whl (15.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64

bam_solver-3.1.0-cp312-cp312-macosx_13_0_arm64.whl (14.7 MB view details)

Uploaded CPython 3.12macOS 13.0+ ARM64

bam_solver-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl (20.6 MB view details)

Uploaded CPython 3.12macOS 10.12+ x86-64

File details

Details for the file bam_solver-3.1.0.tar.gz.

File metadata

  • Download URL: bam_solver-3.1.0.tar.gz
  • Upload date:
  • Size: 72.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for bam_solver-3.1.0.tar.gz
Algorithm Hash digest
SHA256 e5800ef72a05c39966348acf4f0ba5d7871d7d0be1bb5159f01fe05d17c041aa
MD5 eb2c17e08e274e37eda29d7eeece02b9
BLAKE2b-256 4862b61d4ac272cbe7c23f0a0eefbb85c2f8d393cd614e3bb9c7a51714328e42

See more details on using hashes here.

File details

Details for the file bam_solver-3.1.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: bam_solver-3.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 16.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for bam_solver-3.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 388bd67a0379e08096d4f7d7613efb46f2ebe554df7425278a1e739d2a9fe547
MD5 d971a4bb9e1e4716da0aed01344ed541
BLAKE2b-256 2475e9033db5ab91bcd95f6ec9aa3c3595d64d790cb3ce84f491fbe11074d5fe

See more details on using hashes here.

File details

Details for the file bam_solver-3.1.0-cp312-cp312-manylinux_2_27_aarch64.whl.

File metadata

File hashes

Hashes for bam_solver-3.1.0-cp312-cp312-manylinux_2_27_aarch64.whl
Algorithm Hash digest
SHA256 7f5f77cf324e90e24019a5972cb3c1306eaee3a2e0993ee7bbe32a9b8b5bf847
MD5 cd9c6eb9fb53ce3799a5d4e412e7e8dc
BLAKE2b-256 7584c987cf71b21b48fc72e850c9041dfafe03c389e4fba80843ed104fb4450d

See more details on using hashes here.

File details

Details for the file bam_solver-3.1.0-cp312-cp312-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for bam_solver-3.1.0-cp312-cp312-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 891bff88bd1e28d9273ddd8e4ff3b955add36a753c4bacd23d6f8fa66283b053
MD5 ce1306aab13144de26f5f8a674d81d02
BLAKE2b-256 5bb772eb6dbc33045df8dbdb2789249dbe257e1429ada3a89b9b7b56bebca8a5

See more details on using hashes here.

File details

Details for the file bam_solver-3.1.0-cp312-cp312-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for bam_solver-3.1.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 f0bdca3a3fce120bec0a60586a5230d9b45ff90d522d544574497c1baf37cc95
MD5 23b7c0517a171c9d9cf3487b4e12ac4a
BLAKE2b-256 e18e115e14dc32cfc2e2c5116215035dc3247605ca646a578d2a6a73d4eef3be

See more details on using hashes here.

File details

Details for the file bam_solver-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bam_solver-3.1.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a3e07af2e78a4830bb8a90ae79f98957676cce19f3fa5fb54cae47c67caa2fd9
MD5 a0962561bcb8c804e94ceebe47c108d1
BLAKE2b-256 6c77e42616d8e799f7c951e6cd4d4ab9ff97ab7e28009c29adb5d396d4b42f2f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page