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-4.0.0.tar.gz (72.9 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-4.0.0-cp312-cp312-win_amd64.whl (16.0 MB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64

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

Uploaded CPython 3.12macOS 13.0+ ARM64

bam_solver-4.0.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-4.0.0.tar.gz.

File metadata

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

File hashes

Hashes for bam_solver-4.0.0.tar.gz
Algorithm Hash digest
SHA256 92a141e279dff4ced6a2b96eb9411552a55d211bc1f3aa80035f6e0a17c9566f
MD5 ea721aad6381bddacbb8d0edd19973fc
BLAKE2b-256 a2527f1ceb26dcc905b4aa424ca6d3088f79598e0a6879e6397b78a2e29e8857

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bam_solver-4.0.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-4.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 9467882dc079aef2e308f73954ff9b47813c480ff46a9c6d591cbb714c206a80
MD5 af70c584baa18b00b3ca227dd18ca6fd
BLAKE2b-256 7cd7e36480e0a76f6de035e3075832849db2688eda45a99138ea4f88578995cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-4.0.0-cp312-cp312-manylinux_2_27_aarch64.whl
Algorithm Hash digest
SHA256 d406d594ef3db085d7ad86384ab71f8a724fab0a5d89e5f71c64fa54a4ccbbf2
MD5 43ecad9e1b1eb162c7049caa8f7810e0
BLAKE2b-256 7d6dc28753a048b30c10fae9bcb109a087b9320e50583f34cda37fda9244c4e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-4.0.0-cp312-cp312-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 dc7de9e7cf63cf4be2148ee759479c6ae1fabc6b186b347d58cf7ad06242da04
MD5 1a822a341ec2a7da22d581a4f4f10e07
BLAKE2b-256 fa093bd9ce890780abb081b17603b26d2a507d7a200801a3e697ca6bec3cda9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-4.0.0-cp312-cp312-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 56b5caa783ebcc796f4eeb89dc4c5b04c3efb977765f48876ba0e88bb3c3bbb4
MD5 aa5beeca7d6f7e254abf0298e76c572a
BLAKE2b-256 2df9bd84e965729b8722e04fa3d733f2f51ca1b5b63ea0cd0d606a6cce57487c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bam_solver-4.0.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7afbd8d2d7299486761ec5909de55c2fcf0a3446ab98072ffbd91b82497a71b7
MD5 cc5d4b25e1b85471905e96c6ff6b499c
BLAKE2b-256 3f2da0000edaef19a5ed157b7d685fa5339a9edbd6cbdd64490581bfb585eea8

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