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: full-control 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 full-control 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.

Full-control: 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.2.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.2.0-cp312-cp312-win_amd64.whl (16.0 MB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64

bam_solver-3.2.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.2.0-cp312-cp312-macosx_13_0_arm64.whl (14.7 MB view details)

Uploaded CPython 3.12macOS 13.0+ ARM64

bam_solver-3.2.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.2.0.tar.gz.

File metadata

  • Download URL: bam_solver-3.2.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.2.0.tar.gz
Algorithm Hash digest
SHA256 749f827d25b26ecc2fc43eec12c8c2059bfd25495708735e43c3ee0024d6f9a6
MD5 2adf981222517d4f02d7773206e69502
BLAKE2b-256 e95c6327df54974c094cca18fa50bed92bbb7cab280bd38e19a50142fa31f47e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bam_solver-3.2.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.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ac3fa2ab5a03cc621217ca9d1b3a6ed2a4decefe5d291289f7cd474c628d2950
MD5 c1f27d51b552c50507f2792b5cc984f5
BLAKE2b-256 221fb78dbd1bbd6796077709c7cf97b34e9212d41cc17c1096d7faa11babc1de

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-3.2.0-cp312-cp312-manylinux_2_27_aarch64.whl
Algorithm Hash digest
SHA256 e1a3cf7c06476295d28b9a3dc401ba36c8a6643f71f3620d95868adb03f76524
MD5 bfa366eff53f1e52165c4ab5f7412291
BLAKE2b-256 991f259e28d9441bc06831cc3e232ca24c7e3c8c83833da9b28c7f51fc8ba690

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-3.2.0-cp312-cp312-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 1c3f9ff406987544a895a79a7fbde99048dce9390340b2dd5398c66e84b5846a
MD5 fd6e180a96c27070b39cdb5d82af39b7
BLAKE2b-256 e6fcad2310450c9c702c2b6ffd1f663a6a071a854beb4cf8c6069da40ea0cd14

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-3.2.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 86d859c6fddbe0ff2ebe693f7cc57dd3e06fcac85f320e384479ceb4e4ad67d0
MD5 7f7f3a31cc4a18990a3def6cb2517f7f
BLAKE2b-256 08617403282a0c15a7bc8e25a68e939ac3eb9b7dac773d590dbca36c5ca644b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-3.2.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9e9d7b099ef30941e106d734991501aaf3f27edf7bf876fe9ff696ac5bf16484
MD5 ba1da51da8b2a672c9e843e6a388094e
BLAKE2b-256 801556e08526eaa33f816491e3e3e1032327fea87425e39936d4d30bc9624693

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