# Comparison with other libraries heuropt is one of many heuristic-optimization libraries. This chapter is an honest, opinionated comparison to help you choose. The columns: - **Lang** — primary implementation language. - **Algorithms** — rough catalog count. - **Multi-obj** — built-in support for Pareto-based multi-objective optimization. - **Surrogates** — built-in Bayesian / TPE / multi-fidelity. - **Determinism** — seeded reproducibility as a first-class property. - **Async / async-eval** — first-class async runtime support. | Library | Lang | Algorithms | Multi-obj | Surrogates | Determinism | Async | |---|---|---|---|---|---|---| | **heuropt 0.5** | Rust | 35 | ✅ NSGA-II/III, SPEA2, IBEA, MOEA/D, MOPSO, SMS-EMOA, HypE, AGE-MOEA, GrEA, KnEA, RVEA, PESA-II, ε-MOEA, PAES | ✅ BO, TPE, Hyperband | ✅ bit-identical seeded | ⏳ planned | | pymoo | Python | ~25 | ✅ extensive | partial (BO via plug-ins) | ✅ | ❌ | | DEAP | Python | flexible toolbox | ✅ | ❌ | ✅ | ❌ | | hyperopt | Python | TPE-focused | ❌ | ✅ TPE | partial | partial | | optuna | Python | TPE / CMA-ES / NSGA-II | ✅ | ✅ TPE, BoTorch via plug-in | ✅ | ✅ | | MOEA Framework | Java | ~40 | ✅ very extensive | ❌ | ✅ | ❌ | | metaheuristics-rs | Rust | ~10 | partial | ❌ | ✅ | ❌ | | argmin | Rust | line-search / quasi-Newton | ❌ | ❌ | ✅ | ❌ | ## When to pick heuropt - You're working in **Rust** and want a single, dependency-light crate for evolutionary / metaheuristic optimization. - You need **multi-objective or many-objective** algorithms (12+ Pareto-aware methods in the catalog) AND you don't want to glue Python into your Rust pipeline. - You want **bit-identical determinism**: same seed produces same output, on every machine, across releases unless explicitly noted otherwise. - You want a **small, readable codebase** — every algorithm is written for clarity, no trait-object plumbing, no GATs in user- facing APIs. Reading `RandomSearch` should be enough to write a new optimizer. ## When *not* to pick heuropt - You need **first-class async / await** for evaluations that talk to HTTP services or spawn subprocesses. heuropt is sync; that's on the roadmap but not shipping yet. - You need **gradient-based** optimization. Use `argmin` (Rust) or `scipy.optimize` (Python) — heuropt is gradient-free by design. - You need **GPU-accelerated** evaluations. heuropt's `evaluate` function runs on CPU; use Python (jax/torch) or roll your own GPU pipeline. - You need **distributed multi-machine** evaluation. heuropt parallelizes within one process via rayon. Distribution is up to you (split the seeds across machines, aggregate). - You're comfortable in Python and pymoo / optuna already cover your problem. heuropt's value-add over pymoo is mostly that it's Rust — if that doesn't matter to you, the Python ecosystem has more battle-tested integrations. ## Algorithm coverage at a glance heuropt covers the same major Pareto MOEAs as pymoo and MOEA Framework: NSGA-II/III, SPEA2, IBEA, MOEA/D, MOPSO, SMS-EMOA, HypE, AGE-MOEA, GrEA, KnEA, RVEA, PESA-II, ε-MOEA, PAES. The expensive-evaluation regime: BayesianOpt + TPE + Hyperband. This is comparable to optuna's coverage but in pure Rust. The single-objective continuous catalog (CMA-ES, IPOP-CMA-ES, sNES, DE, PSO, GA, TLBO, (1+1)-ES, NelderMead, RandomSearch, HillClimber, SimulatedAnnealing) covers the canonical baselines and several modern variants. What heuropt does **not** ship that some libraries do: - **Re-themed metaphor metaheuristics** (Whale Optimization, Grey Wolf, Bat, Firefly, Harris Hawks, etc.). These are cut from the catalog deliberately — they are mostly DE/PSO with new names. If you specifically need one, please open an issue with citations. - **Non-evolutionary global optimizers** like dual annealing or basin-hopping (use `scipy.optimize` for those). - **A web UI / dashboard** like optuna's. heuropt is library-only. ## Speed heuropt's hot paths (Pareto utilities, hypervolume, key inner loops) are heavily optimized — see the perf entry in the v0.4.0 CHANGELOG. On the comparison harness in `examples/compare.rs` (10-seed mean, 30 000 evaluations on DTLZ2), the total wall-clock time across 12 algorithms is ~5 seconds. Per-algorithm timings are in [`examples/compare-results.md`](https://github.com/swaits/heuropt/blob/main/examples/compare-results.md). For comparison-shopping speed against Python libraries, the gap is typically 10×–100× in heuropt's favor for compute-bound `evaluate` functions, because Rust skips the Python-loop overhead. If your `evaluate` calls into NumPy/PyTorch and those are the bottleneck, the gap shrinks substantially. ## Honest weakness: ecosystem The biggest thing pymoo / optuna / DEAP have that heuropt doesn't: **community + plug-ins + tutorials**. They've been around longer and have rich third-party integrations (visualization, MLflow, Hyperband+BO hybrids, distributed runners). heuropt is younger; the core is solid but the ecosystem is small. If you adopt heuropt and miss a thing, the project is small enough that contributions land fast. See [CONTRIBUTING.md](https://github.com/swaits/heuropt/blob/main/CONTRIBUTING.md).