sep_cma_es (faber_tweann v2.4.0)
View SourceSeparable (diagonal) CMA-ES over a real-valued vector.
The second optimizer of Programme 2 (Search Strategies). Where mu_lambda_es carries a single global step size sigma (isotropic search), sep-CMA-ES adapts a PER-COORDINATE variance (a diagonal covariance) plus a cumulative step-size path, so it can scale each dimension independently. It is the diagonal restriction of CMA-ES (Ros and Hansen 2008, "A Simple Modification in CMA-ES Achieving Linear Time and Space Complexity"): O(N) per generation, no eigendecomposition. It captures the anisotropic-scaling half of full CMA-ES's power, but NOT correlations/rotations (the covariance stays diagonal). If a problem needs correlated steps, full CMA-ES or CoSyNE is the next rung.
Same pluggable-fitness contract as mu_lambda_es: evolve/3 takes fun(([float()]) -> float()), higher is better, and returns #{best, fitness, generations, evaluations, reason}. That makes it a drop-in swap in the EXP-025/026 evaluation harness (EXP-028).
Reference: Hansen, "The CMA Evolution Strategy: A Tutorial" (arXiv 1604.00772) for the update equations; Ros and Hansen 2008 for the diagonal learning-rate scaling ((N+2)/3 on c1 and cmu).
Summary
Functions
Run a separable (diagonal) CMA-ES.
Types
Functions
-spec evolve(fitness_fun(), pos_integer(), map()) -> map().
Run a separable (diagonal) CMA-ES.
Opts: lambda offspring per generation (default 4 + floor(3*ln N)) mu parents (default lambda div 2) max_generations cap (default 1000) fitness_goal stop when best fitness >= this (default infinity) init_sigma initial step size (default 1.0) x0 initial mean vector (default zeros) trace when true, record the running best fitness per generation (default false) on_generation fun(Gen, BestFitnessSoFar) called once per generation, for live progress (default undefined)
Returns #{best, fitness, generations, evaluations, reason}, plus history => [{Generation, BestFitnessSoFar}] when trace is true (reason = solved | max_generations).