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.1.0.tar.gz (73.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-4.1.0-cp312-abi3-win_amd64.whl (16.0 MB view details)

Uploaded CPython 3.12+Windows x86-64

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

Uploaded CPython 3.12+manylinux: glibc 2.27+ ARM64

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

Uploaded CPython 3.12+manylinux: glibc 2.24+ x86-64

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

Uploaded CPython 3.12+macOS 13.0+ ARM64

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

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: bam_solver-4.1.0.tar.gz
  • Upload date:
  • Size: 73.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-4.1.0.tar.gz
Algorithm Hash digest
SHA256 75811238a25471fbcefdfacbc8b19e34c97693005a394bfc496ff86df43d23f4
MD5 9b63bae9f9a37a8a4b2d4cd438560daa
BLAKE2b-256 13f8a43a8e242a2ac27edbf8e24db6de29af1ba6be535f5669c4bb21dfea1b69

See more details on using hashes here.

File details

Details for the file bam_solver-4.1.0-cp312-abi3-win_amd64.whl.

File metadata

  • Download URL: bam_solver-4.1.0-cp312-abi3-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.1.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 3e8dbac1b6f671e35761b88c3ea2f53c2c4b90f354e2fad4de336bf5ae5aa069
MD5 f831f31b048d6b0cc8b55467eb6d23e5
BLAKE2b-256 18d7532eba9c665590c36a0605a5d3860ee2ea9e3d4900574b66a0e1e8881860

See more details on using hashes here.

File details

Details for the file bam_solver-4.1.0-cp312-abi3-manylinux_2_27_aarch64.whl.

File metadata

File hashes

Hashes for bam_solver-4.1.0-cp312-abi3-manylinux_2_27_aarch64.whl
Algorithm Hash digest
SHA256 99d508b4f08eb601cc597a211869b0e68b71ef6455524c40e797c0d626e9e4ea
MD5 e84a8d0242147384bb0ef6bcb94bdebb
BLAKE2b-256 1dc990e47c9c606727794d74107786290f15436191866e401e00304d2110e980

See more details on using hashes here.

File details

Details for the file bam_solver-4.1.0-cp312-abi3-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for bam_solver-4.1.0-cp312-abi3-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 491212a49fdedc8d9a18efe39da46795afac7308b855a1b7856d675b628b0a2c
MD5 1efb1361118192e46050298cdb366148
BLAKE2b-256 a84a55ca83308a249ae7e488cc823075493d7d9cfcc983bae4ddd34ea162b768

See more details on using hashes here.

File details

Details for the file bam_solver-4.1.0-cp312-abi3-macosx_13_0_arm64.whl.

File metadata

File hashes

Hashes for bam_solver-4.1.0-cp312-abi3-macosx_13_0_arm64.whl
Algorithm Hash digest
SHA256 b3e428c113a6fed04344a5ceebe0d6d34efce09ff2655ba5d98f8fd1b39b89f9
MD5 79820437f2319f4115378c35a6bd5999
BLAKE2b-256 2a0e282591495d17584c04cf0882f0243afcb18c77870a7492446564ab39619a

See more details on using hashes here.

File details

Details for the file bam_solver-4.1.0-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for bam_solver-4.1.0-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2e8d4a371345f7dddbd9f17f5d7b218f5ac4fe7c16b51b108af38a0a4c29c6a7
MD5 8d044e2e62d536d25165c58f36a68748
BLAKE2b-256 42eec48f5b49bee731d695014605c4f5875628102fba127d057cb480de36ede3

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