Skip to main content

Particle Swarm Optimization with a Rust core

Project description

turboswarm

Particle Swarm Optimization with a compute core in Rust and an API in Python. Focused on visualization, variant comparison and clear code. Supports real, integer, binary and mixed variables, constraints and multi-objective optimization.

Installation

From source (development), with maturin:

pip install maturin
python -m venv .venv && source .venv/bin/activate
maturin develop --release      # compiles the Rust core and installs it

Usage

import turboswarm as pso

# Native benchmark (fast, in Rust, without the GIL)
r = pso.minimize("rastrigin", bounds=(-5.12, 5.12), dim=2, seed=42)

# Your own function in Python
r = pso.minimize(lambda x: sum(xi**2 for xi in x), bounds=(-5, 5), dim=3)

# Integer variables
r = pso.minimize(f, bounds=(-10, 10), dim=2, integer=True)

# Variant and topology by name
r = pso.minimize("ackley", bounds=(-32.768, 32.768), dim=2,
                 velocity="fips", topology="ring", seed=1)

print(r.best_position, r.best_value)

Parameters of minimize

Parameter Default Description
objective callable f(list)->float, or name of a native benchmark
bounds list of (min, max) per dimension
integer / binary False optimize over integers / {0,1}
var_types None per-dimension "real"/"integer"/"binary" (mixed)
n_particles 30 swarm size
max_iter 100 iterations
w, c1, c2 0.729, 1.494, 1.494 inertia, cognitive, social
velocity "inertia" "inertia", "constriction", "fips"
topology "global" "global", "ring", "vonneumann", "random"
bounds_handling "clamp" "clamp", "reflect", "wrap", "reinit"
seed None seed (fix it for reproducibility)
record_history True store the trace for visualization
v_max None clamp each velocity component to [-v_max, v_max]
patience / tol 0 / 0.0 stop after patience iters without >tol improvement
max_evals / target / max_time None stop on evaluation / value / time budget
constraints / penalty None / 1e6 inequality constraints g(x)<=0 via penalty
callback None callback(iteration, best_value); return False to stop
vectorized False objective receives the whole swarm as a NumPy array

Native benchmarks: sphere, rastrigin, rosenbrock, ackley, griewank, schwefel. Their metadata (recommended bound and optimum) are in pso.benchmark_info(name) -> (bound, optimum).

FIPS performs better with local topologies ("ring", "vonneumann"). The "constriction" and "fips" variants derive their factor from c1 + c2.

Result (PsoResult)

  • best_position — list of floats (whole-valued for integer/binary dims)
  • best_value — float
  • convergence — best value per iteration (convergence curve)
  • historyhistory[iter][particle][dim] (empty if record_history=False)
  • evaluations — number of objective evaluations performed
  • stop_reason"max_iterations", "target", "max_evaluations", "stagnation", "max_time" or "callback"

Multi-objective (MOPSO)

minimize_multi returns a ParetoFront (.positions, .objectives):

front = pso.minimize_multi(
    lambda x: [sum(xi**2 for xi in x), sum((xi - 2) ** 2 for xi in x)],
    bounds=[(-5, 5)] * 2, seed=42,
)
print(len(front))            # non-dominated solutions

Visualization

import matplotlib.pyplot as plt

pso.viz.plot_convergence(r); plt.show()
pso.viz.compare({"inertia": rA, "fips": rB}); plt.show()
pso.viz.plot_pareto(front); plt.show()   # objective space of a Pareto front

anim = pso.viz.animate_swarm(r, pso.benchmarks.rastrigin, [(-5.12, 5.12)] * 2)
# in a notebook:  from IPython.display import HTML; HTML(anim.to_jshtml())

animate_swarm only supports 2D problems and requires record_history=True.

Documentation

A navigable documentation portal (narrative guide + API reference) is built with MkDocs Material:

pip install -e ".[docs]"
./scripts/build-docs.sh --serve   # http://127.0.0.1:8000

License

MIT.

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

turboswarm-0.2.0.tar.gz (62.6 kB view details)

Uploaded Source

Built Distributions

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

turboswarm-0.2.0-cp39-abi3-win_amd64.whl (316.1 kB view details)

Uploaded CPython 3.9+Windows x86-64

turboswarm-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (466.5 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

turboswarm-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (456.9 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

turboswarm-0.2.0-cp39-abi3-macosx_11_0_arm64.whl (409.7 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

turboswarm-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl (410.3 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file turboswarm-0.2.0.tar.gz.

File metadata

  • Download URL: turboswarm-0.2.0.tar.gz
  • Upload date:
  • Size: 62.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turboswarm-0.2.0.tar.gz
Algorithm Hash digest
SHA256 d10663abd114868010d02c0ed660dc34a686db5b64ca4a5a424b84a07c22e37c
MD5 ed8da4d4149c2ee50d39d4aaa0d8bb07
BLAKE2b-256 485c0bbb5bfd6876e4af4fccab12287b27aec631cc772c13f0a8b4b72ecd4b55

See more details on using hashes here.

File details

Details for the file turboswarm-0.2.0-cp39-abi3-win_amd64.whl.

File metadata

  • Download URL: turboswarm-0.2.0-cp39-abi3-win_amd64.whl
  • Upload date:
  • Size: 316.1 kB
  • Tags: CPython 3.9+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for turboswarm-0.2.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 061fcdbb40f7ef9ceeb7a4f6dba4185114be484f922b5fc79b0c2949fefc6a41
MD5 5b4d428eb6c14d49cd48385795b899f1
BLAKE2b-256 55938b7889d32410b35111b03c1c17d1ebe977c654fc87a8be5fb03044269002

See more details on using hashes here.

File details

Details for the file turboswarm-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for turboswarm-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 118e7694240f852eff2e5db4461e2c150fd757b62f45e554f662ce3456bf178b
MD5 02dda595a82152678cc6016997985e2c
BLAKE2b-256 39009f9e815e3bd90fe7be74739fc1d1339221b2c56f4f6b9edcda57726f66ae

See more details on using hashes here.

File details

Details for the file turboswarm-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for turboswarm-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c9f3ee39e7baf73274534f93f65a98e4156187f93188c696bf1a99f3ff38adbe
MD5 475d0d75df8dfffeebe1ec353bdf729b
BLAKE2b-256 b3ebb6146e3cbd865c51286d31e3ddc4093bddcd69bf006cf4987ab211de800c

See more details on using hashes here.

File details

Details for the file turboswarm-0.2.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for turboswarm-0.2.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 15bf3e4e8ad14645fad20eabc06416dc29e2c0e62156eaf61e57e660b43f8aaa
MD5 1307675adc818fed1d0c74ad28d09584
BLAKE2b-256 ae975fe4c2572a18ea2c6e0472884c97e3e3c79628da61464bfb14b73a21bcb6

See more details on using hashes here.

File details

Details for the file turboswarm-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for turboswarm-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8609a2c094be9524a8c6f1984ce7c393e5cdf7e9ffd4dc8f4ad171e0b733bb3c
MD5 73feedff21906ae5c7691a78841f1290
BLAKE2b-256 5c1ea5420aca29225c684286126c4823a1e392bbec451502d1980adea536c99a

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