An evolutionary particle life simulation using JAX for high-performance computation. This system implements evolving particles with local interaction rules, species diversity through mutation and selection, and comprehensive experimental tracking.
- JAX-accelerated physics: Fast particle dynamics using JAX and jax-md
- Periodic boundary conditions: Toroidal space for continuous interaction
- Neighbor lists: Efficient spatial queries using jax-md neighbor lists
- Species evolution: Particles copy successful neighbors and mutate over time
- Spatial mutations: Random circular regions selected for mutation (not point mutations)
- Three transformation types:
- Noise addition: Random gaussian noise to species vectors
- Rotation: Species vectors rotated in 2D space
- Scaling: Species vectors scaled by random factors
- Group-level evolution: Mutations affect spatially coherent groups
- Adaptive stepping: Runs steps until neighbor list overflow
- Maximized efficiency: Reduces overhead by maximizing steps between rebuilds
- Configurable limits: Balance efficiency and memory usage
- Momentum, mean velocity, velocity variance
- Spatial extent
- Number of unique species
- Shannon entropy
- Species variance and range
- Pairwise diversity
- Activity level
- Clustering coefficient
- Nearest neighbor distances
- Compression complexity: PNG compression ratio as proxy for Kolmogorov complexity
- Spatial frequency: FFT-based high-frequency content measure
Based on: Flow-Lenia.png: Evolving Multi-Scale Complexity by Means of Compression
- Life-likeness scoring: Uses Qwen3-VL-8B to evaluate "life-like" qualities
- Local inference: vLLM for fast, free evaluation
- Temporal analysis: Tracks growth, movement, interaction patterns
Inspired by: ASAL: Agent-Supervised Artificial Life
- Wandb integration: Track experiments, metrics, videos
- Parameter sweeps: Automated grid search over evolutionary parameters
- Hydra configuration: YAML-based config management
# Create virtual environment with uv
uv venv
source .venv/bin/activate
# Install dependencies
uv pip install -r requirements.txt
# For CUDA support (GPU acceleration)
uv pip install --upgrade "jax[cuda12]"python test_setup.py# Default config
python run_experiment.py
# Small simulation for testing
python run_experiment.py simulation=small
# Disable wandb
python run_experiment.py wandb.mode=disabled
# Override parameters
python run_experiment.py \
simulation.num_particles=2000 \
mutation.mutation_prob=0.02# Evolution-focused sweep
python run_sweep.py experiment=evolution_sweep
# Smaller focused sweep
python run_sweep.py experiment=evo_focusedpython analyze_sweep.pyAll experiments use Hydra YAML configs in conf/:
conf/
├── config.yaml # Main config
├── simulation/
│ ├── default.yaml # Default parameters
│ ├── small.yaml # Small test
│ └── large.yaml # Large simulation
├── mutation/
│ └── default.yaml # Mutation parameters
├── metrics/
│ └── default.yaml # Metrics config
└── experiment/
├── single.yaml # Single run
├── evolution_sweep.yaml # Full sweep
└── evo_focused.yaml # Smaller sweep
Override from command line:
# Override parameters
python run_experiment.py simulation.mass=0.05 mutation.copy_prob=0.01
# Use different configs
python run_experiment.py simulation=large experiment=evolution_sweep
# See full config
python run_experiment.py --cfg jobcopy_dist: Maximum distance for copying successful neighborscopy_prob: Probability of copying per framemutation_prob: Probability of mutation per framespecies_dim: Dimensionality of species vectors
mass: Particle massrmax: Maximum interaction radiusrepulsion_dist: Repulsion distancerepulsion: Repulsion strength
min_radius: Minimum mutation circle radiusmax_radius: Maximum mutation circle radius
import jax.numpy as jnp
from evo_particle_life import ParticleLife
from metrics import MetricsTracker
# Create simulation
sim = ParticleLife(
num_particles=4000,
species_dims=2,
size=jnp.array([3.0, 3.0]),
)
# Run with adaptive stepping
positions, step_count = sim.step_while(max_steps=200)
# Track metrics
tracker = MetricsTracker(sim.displacement_fn)
metrics = tracker.compute_all_metrics(sim, step=0)The metrics system enables investigation of:
- Species diversification dynamics: How does diversity evolve over time?
- Complexity emergence: When do complex visual patterns appear?
- VLM correlation: Do compression-complex systems score higher on life-likeness?
- Parameter effects: How do copy_prob, mutation_prob affect diversity/complexity?
- Phase transitions: Identify sudden changes in system behavior
evo_particle_life.py: Core simulation with JAX physics and mutationmetrics.py: Comprehensive metrics (species, complexity, spatial)vlm_evaluator.py: VLM-based life-likeness evaluationrun_experiment.py: Single experiment runnerrun_sweep.py: Parameter sweep runneranalyze_sweep.py: Results analysisrender.py: Fast JAX-based visualization
- JIT compilation: All core functions JIT compiled
- Neighbor lists: O(N) force computation
- While loop optimization: Minimizes Python overhead
- GPU compatible: Runs on GPU with CUDA JAX
Inspired by:
- Flow-Lenia: Massively Parallel Continuous Cellular Automata
- Flow-Lenia.png: Evolving Multi-Scale Complexity by Means of Compression
- ASAL: Agent-Supervised Artificial Life
MIT