RobertTLange/evosax

Evolution Strategies in JAX 🦎

Python

798

417 commits

updated Oct 11, 2026

See the code

README

evosax: Evolution Strategies in JAX 🦎

Pyversions PyPI version Ruff codecov Paper

Tired of having to handle asynchronous processes for neuroevolution? Do you want to leverage massive vectorization and high-throughput accelerators for Evolution Strategies? evosax provides a comprehensive, high-performance library that implements Evolution Strategies (ES) in JAX. By leveraging XLA compilation and JAX's transformation primitives, evosax enables researchers and practitioners to efficiently scale evolutionary algorithms to modern hardware accelerators without the traditional overhead of distributed implementations.

The API follows the classical ask-eval-tell cycle of ES, with full support for JAX's transformations (jit, vmap, lax.scan). The library includes 30+ evolution strategies, from classics like CMA-ES and Differential Evolution to modern approaches like OpenAI-ES and Diffusion Evolution.

Get started here πŸ‘‰ Colab

Basic evosax API Usage 🍲

import jax
from evosax.algorithms import CMA_ES


# Instantiate the search strategy
es = CMA_ES(population_size=32, solution=dummy_solution)
params = es.default_params

# Initialize state
key = jax.random.key(0)
state = es.init(key, dummy_solution, params)

# Ask-Eval-Tell loop
for i in range(num_generations):
    key, key_ask, key_eval = jax.random.split(key, 3)

    # Generate a set of candidate solutions to evaluate
    population, state = es.ask(key_ask, state, params)

    # Evaluate the fitness of the population
    fitness = ...

    # Update the evolution strategy
    state, metrics = es.tell(key, population, fitness, state, params)

# Get best solution
state.best_solution, state.best_fitness

Population-based algorithms such as SimpleGA use the same ask-tell loop, but their state is initialized from an explicit initial population and its fitness:

import jax
import jax.numpy as jnp
from evosax.algorithms import SimpleGA


key = jax.random.key(0)
solution = dummy_solution
ga = SimpleGA(population_size=32, solution=solution)
params = ga.default_params

# Replicate a template solution (or provide your own evaluated population).
population_init = jax.tree.map(
    lambda x: jnp.repeat(x[None, ...], ga.population_size, axis=0),
    solution,
)
fitness_init = ...

# Initialize state from the initial population and its fitness.
state = ga.init(key, population_init, fitness_init, params)

The fitness_init argument seeds the stored population ranking used by the first ask(...) call. After initialization, ga.ask(...) returns the next population to evaluate and ga.tell(...) updates the algorithm state with the evaluated population and fitness.

Implemented Evolution Strategies 🦎

StrategyReferenceImportExample
Simple Evolution StrategyRechenberg (1978)SimpleESColab
OpenAI-ESSalimans et al. (2017)Open_ESColab
CMA-ESHansen & Ostermeier (2001)CMA_ESColab
Sep-CMA-ESRos & Hansen (2008)Sep_CMA_ESColab
xNESWierstra et al. (2014)xNESColab
SNESWierstra et al. (2014)SNESColab
MA-ESBayer & Sendhoff (2017)MA_ESColab
LM-MA-ESLoshchilov et al. (2017)LM_MA_ESColab
Rm_ESLi & Zhang (2017)Rm_ESColab
PGPESehnke et al. (2010)PGPEColab
ARSMania et al. (2018)ARSColab
ESMCMerchant et al. (2021)ESMCColab
Persistent ESVicol et al. (2021)PersistentESColab
Noise-Reuse ESLi et al. (2023)NoiseReuseESColab
CR-FM-NESNomura & Ono (2022)CR_FM_NESColab
Guided ESMaheswaranathan et al. (2018)GuidedESColab
ASEBOChoromanski et al. (2019)ASEBOColab
Discovered ESLange et al. (2023a)DiscoveredESColab
LESLange et al. (2023a)LearnedESColab
CMA-anchored LESLange et al. (2026)CMAAnchoredLESColab
EvoTFLange et al. (2024)EvoTF_ESColab
iAMaLGaM-FullBosman et al. (2013)iAMaLGaM_FullColab
iAMaLGaM-UnivariateBosman et al. (2013)iAMaLGaM_UnivariateColab
Gradientless DescentGolovin et al. (2019)GradientlessDescentColab
Simulated AnnealingRasdi Rere et al. (2015)SimAnnealColab
Hill ClimbingRasdi Rere et al. (2015)HillClimbingColab
Random SearchBergstra & Bengio (2012)RandomSearchColab
SV-CMA-ESBraun et al. (2024)SV_CMA_ESColab
SV-OpenAI-ESLiu et al. (2017)SV_OpenESColab
Simple Genetic AlgorithmSuch et al. (2017)SimpleGAColab
MR15-GARechenberg (1978)MR15_GAColab
SAMR-GAClune et al. (2008)SAMR_GAColab
GESMR-GAKumar et al. (2022)GESMR_GAColab
LGALange et al. (2023b)LearnedGAColab
Diffusion EvolutionZhang et al. (2024)DiffusionEvolutionColab
Differential EvolutionStorn & Price (1997)DifferentialEvolutionColab
Particle Swarm OptimizationKennedy & Eberhart (1995)PSOColab

Installation ⏳

evosax v0.3.2 requires Python 3.10 or later and a working JAX installation.

Then, install evosax from PyPi:

pip install "evosax==0.3.2"

To install the latest development version of evosax, use:

pip install git+https://github.com/RobertTLange/evosax.git@main

Examples πŸ“–

Key Features πŸ’Ž

  • Comprehensive Algorithm Collection: 30+ classic and modern evolution strategies with a unified API
  • JAX Acceleration: Fully compatible with JAX transformations for speed and scalability
  • Vectorization & Parallelization: Fast execution on CPUs, GPUs, and TPUs
  • Production Ready: Well-tested, documented, and used in research environments
  • Batteries Included: Comes with optimizers like ClipUp, fitness shaping, and restart controllers
  • πŸ“Ί Rob's MLC Research Jam Talk - Overview at the ML Collective Research Jam
  • πŸ“ Rob's 02/2021 Blog - Blog post on implementing CMA-ES in JAX
  • πŸ’» Evojax - Hardware-Accelerated Neuroevolution with great rollout wrappers.
  • πŸ’» QDax: Quality-Diversity algorithms in JAX.

Citing evosax ✏️

If you use evosax in your research, please cite the following paper:

@article{evosax2022github,
    author  = {Robert Tjarko Lange},
    title   = {evosax: JAX-based Evolution Strategies},
    journal = {arXiv preprint arXiv:2212.04180},
    year    = {2022},
}

Acknowledgements πŸ™

We acknowledge financial support by the Google TRC and the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under Germany's Excellence Strategy - EXC 2002/1 "Science of Intelligence" - project number 390523135.

Contributing πŸ‘·

Contributions are welcome! If you find a bug or are missing your favorite feature, please open an issue or submit a pull request following our contribution guidelines πŸ€—.

Disclaimer ⚠️

This repository contains independent reimplementations of LES and DES based and is unrelated to Google DeepMind. The implementation has been tested to reproduce the official results on a range of tasks.

RobertTLange/evosax

Evolution Strategies in JAX 🦎

Python

798

417 commits

updated Oct 11, 2026

See the code

README

evosax: Evolution Strategies in JAX 🦎

Pyversions PyPI version Ruff codecov Paper

Tired of having to handle asynchronous processes for neuroevolution? Do you want to leverage massive vectorization and high-throughput accelerators for Evolution Strategies? evosax provides a comprehensive, high-performance library that implements Evolution Strategies (ES) in JAX. By leveraging XLA compilation and JAX's transformation primitives, evosax enables researchers and practitioners to efficiently scale evolutionary algorithms to modern hardware accelerators without the traditional overhead of distributed implementations.

The API follows the classical ask-eval-tell cycle of ES, with full support for JAX's transformations (jit, vmap, lax.scan). The library includes 30+ evolution strategies, from classics like CMA-ES and Differential Evolution to modern approaches like OpenAI-ES and Diffusion Evolution.

Get started here πŸ‘‰ Colab

Basic evosax API Usage 🍲

import jax
from evosax.algorithms import CMA_ES


# Instantiate the search strategy
es = CMA_ES(population_size=32, solution=dummy_solution)
params = es.default_params

# Initialize state
key = jax.random.key(0)
state = es.init(key, dummy_solution, params)

# Ask-Eval-Tell loop
for i in range(num_generations):
    key, key_ask, key_eval = jax.random.split(key, 3)

    # Generate a set of candidate solutions to evaluate
    population, state = es.ask(key_ask, state, params)

    # Evaluate the fitness of the population
    fitness = ...

    # Update the evolution strategy
    state, metrics = es.tell(key, population, fitness, state, params)

# Get best solution
state.best_solution, state.best_fitness

Population-based algorithms such as SimpleGA use the same ask-tell loop, but their state is initialized from an explicit initial population and its fitness:

import jax
import jax.numpy as jnp
from evosax.algorithms import SimpleGA


key = jax.random.key(0)
solution = dummy_solution
ga = SimpleGA(population_size=32, solution=solution)
params = ga.default_params

# Replicate a template solution (or provide your own evaluated population).
population_init = jax.tree.map(
    lambda x: jnp.repeat(x[None, ...], ga.population_size, axis=0),
    solution,
)
fitness_init = ...

# Initialize state from the initial population and its fitness.
state = ga.init(key, population_init, fitness_init, params)

The fitness_init argument seeds the stored population ranking used by the first ask(...) call. After initialization, ga.ask(...) returns the next population to evaluate and ga.tell(...) updates the algorithm state with the evaluated population and fitness.

Implemented Evolution Strategies 🦎

StrategyReferenceImportExample
Simple Evolution StrategyRechenberg (1978)SimpleESColab
OpenAI-ESSalimans et al. (2017)Open_ESColab
CMA-ESHansen & Ostermeier (2001)CMA_ESColab
Sep-CMA-ESRos & Hansen (2008)Sep_CMA_ESColab
xNESWierstra et al. (2014)xNESColab
SNESWierstra et al. (2014)SNESColab
MA-ESBayer & Sendhoff (2017)MA_ESColab
LM-MA-ESLoshchilov et al. (2017)LM_MA_ESColab
Rm_ESLi & Zhang (2017)Rm_ESColab
PGPESehnke et al. (2010)PGPEColab
ARSMania et al. (2018)ARSColab
ESMCMerchant et al. (2021)ESMCColab
Persistent ESVicol et al. (2021)PersistentESColab
Noise-Reuse ESLi et al. (2023)NoiseReuseESColab
CR-FM-NESNomura & Ono (2022)CR_FM_NESColab
Guided ESMaheswaranathan et al. (2018)GuidedESColab
ASEBOChoromanski et al. (2019)ASEBOColab
Discovered ESLange et al. (2023a)DiscoveredESColab
LESLange et al. (2023a)LearnedESColab
CMA-anchored LESLange et al. (2026)CMAAnchoredLESColab
EvoTFLange et al. (2024)EvoTF_ESColab
iAMaLGaM-FullBosman et al. (2013)iAMaLGaM_FullColab
iAMaLGaM-UnivariateBosman et al. (2013)iAMaLGaM_UnivariateColab
Gradientless DescentGolovin et al. (2019)GradientlessDescentColab
Simulated AnnealingRasdi Rere et al. (2015)SimAnnealColab
Hill ClimbingRasdi Rere et al. (2015)HillClimbingColab
Random SearchBergstra & Bengio (2012)RandomSearchColab
SV-CMA-ESBraun et al. (2024)SV_CMA_ESColab
SV-OpenAI-ESLiu et al. (2017)SV_OpenESColab
Simple Genetic AlgorithmSuch et al. (2017)SimpleGAColab
MR15-GARechenberg (1978)MR15_GAColab
SAMR-GAClune et al. (2008)SAMR_GAColab
GESMR-GAKumar et al. (2022)GESMR_GAColab
LGALange et al. (2023b)LearnedGAColab
Diffusion EvolutionZhang et al. (2024)DiffusionEvolutionColab
Differential EvolutionStorn & Price (1997)DifferentialEvolutionColab
Particle Swarm OptimizationKennedy & Eberhart (1995)PSOColab

Installation ⏳

evosax v0.3.2 requires Python 3.10 or later and a working JAX installation.

Then, install evosax from PyPi:

pip install "evosax==0.3.2"

To install the latest development version of evosax, use:

pip install git+https://github.com/RobertTLange/evosax.git@main

Examples πŸ“–

Key Features πŸ’Ž

  • Comprehensive Algorithm Collection: 30+ classic and modern evolution strategies with a unified API
  • JAX Acceleration: Fully compatible with JAX transformations for speed and scalability
  • Vectorization & Parallelization: Fast execution on CPUs, GPUs, and TPUs
  • Production Ready: Well-tested, documented, and used in research environments
  • Batteries Included: Comes with optimizers like ClipUp, fitness shaping, and restart controllers
  • πŸ“Ί Rob's MLC Research Jam Talk - Overview at the ML Collective Research Jam
  • πŸ“ Rob's 02/2021 Blog - Blog post on implementing CMA-ES in JAX
  • πŸ’» Evojax - Hardware-Accelerated Neuroevolution with great rollout wrappers.
  • πŸ’» QDax: Quality-Diversity algorithms in JAX.

Citing evosax ✏️

If you use evosax in your research, please cite the following paper:

@article{evosax2022github,
    author  = {Robert Tjarko Lange},
    title   = {evosax: JAX-based Evolution Strategies},
    journal = {arXiv preprint arXiv:2212.04180},
    year    = {2022},
}

Acknowledgements πŸ™

We acknowledge financial support by the Google TRC and the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under Germany's Excellence Strategy - EXC 2002/1 "Science of Intelligence" - project number 390523135.

Contributing πŸ‘·

Contributions are welcome! If you find a bug or are missing your favorite feature, please open an issue or submit a pull request following our contribution guidelines πŸ€—.

Disclaimer ⚠️

This repository contains independent reimplementations of LES and DES based and is unrelated to Google DeepMind. The implementation has been tested to reproduce the official results on a range of tasks.

Project health

Overall

4.5/10

Maintained

10/10

Code review

2/10
OpenSSF Scorecard

PyPI

Latest release

0.3.2 Β· Oct 11, 2026

Releases this year

3

Significant stargazers

Gleb Mazovetskiy

936 followers Β· starred Dec 2025

Hiroaki Hayashi

112 followers Β· starred Mar 2022

Haoran Ye

157 followers Β· starred Nov 2024

Douglas Hanley

133 followers Β· starred Dec 2022