API: differential_evolution

from optimizr import differential_evolution

best_x, best_fx = differential_evolution(
    objective_fn,
    bounds,
    popsize=15,
    maxiter=1000,
    f=None,                 # mutation factor (auto if None)
    cr=None,                # crossover rate (auto if None)
    strategy="rand1",      # rand1, best1, currenttobest1, rand2, best2
    seed=None,
    tol=1e-6,
    atol=1e-8,
    track_history=False,    # keep per-iter best
    parallel=False,         # Python callbacks stay sequential; see Rust path below
    adaptive=False,         # jDE when True
    constraint_penalty=1000.0,
)
  • objective_fn: callable f(x: np.ndarray) -> float

  • bounds: list of (min, max) tuples

  • Returns (best_x: np.ndarray, best_fx: float)

Parallel Rust entry point

For built-in benchmark objectives (no Python callbacks), use the Rust-native path with Rayon:

from optimizr import parallel_differential_evolution_rust

result = parallel_differential_evolution_rust(
    objective_name="rastrigin",  # sphere, rosenbrock, ackley, griewank
    bounds=[(-5, 5)] * 20,
    maxiter=500,
    parallel=True,
)

Notes

  • Adaptive control uses jDE in the current Python API; SHADE/L-SHADE live in Rust and will surface in a future release.

  • Use track_history=True to export convergence curves for benchmarking.