What is biota

biota searches the parameter space of Flow-Lenia - a continuous cellular automaton where matter is conserved by construction. Rather than finding a single best creature, it fills a behavioral grid where each cell holds the most compact creature with a particular phenotypic fingerprint. The result is a structured catalog of qualitatively distinct life-forms.

Each creature is a soliton: a stable, self-maintaining pattern that persists indefinitely given the right parameters. Mass conservation is what makes them viable across a wide parameter range - without it, most settings produce explosion or collapse within a few steps.

The search algorithm

MAP-Elites runs a loop: sample parameters, simulate a creature, measure its behavior, insert it into the matching archive cell if it beats whatever is already there. After thousands of rollouts the archive fills with creatures covering the behavioral space as broadly as possible - not optimizing toward one solution, but toward diversity.

Simulations run in parallel across a 3-node GPU cluster. One batch task evaluates B creatures as a single vectorized forward pass on one RTX 5060 Ti. The driver owns the archive and orchestrates the search; workers are stateless.

archive capacity
16,384 cells
grid shape
32 × 32 × 16
cluster throughput
97 s / 500 rollouts

Behavioral descriptors

Three scalars measured from each rollout index the archive's three axes. The active set is chosen per run — any three from the built-in library of nine. All are normalized to [0, 1] and empirically calibrated against real cluster runs.

velocity
Mean COM displacement per step over the trailing 50 steps. Separates drifters from stationary creatures.
gyradius
Mass-weighted RMS distance from the center of mass. Separates compact dots from spread-out rings and lattices.
spectral entropy
Shannon entropy of the radially-averaged FFT spectrum. Separates smooth blobs from sharp-edged structured creatures.
oscillation
Variance of bounding-box area over the trace tail. Separates pulsing, breathing creatures from rigid translators.
compactness
Fraction of total mass inside the bounding box. Separates tight, well-defined creatures from diffuse scattered ones.
mass asymmetry
Directional bias of COM motion. Separates straight-line movers from orbiters and creatures with circular trajectories.
PNG compressibility
Compressed-to-raw size ratio of the final state. Low = smooth and boring, high = noisy, middle = structured and interesting.
rotational symmetry
Angular variance of mass around the center of mass. Low = rings and disks, high = dumbbells, L-shapes, asymmetric gliders.
persistence score
Maximum descriptor drift across the trace tail. Low = behaviorally stable over time, high = the creature is still changing.

Further reading

15 runs
preview
20260413-171441-amber-ember
69 cells · 0.4% fill · 15.4% insertion
1000 rollouts
pretty 1000 budget cuda
rotational_symmetry · persistence_score · mass_asymmetry
preview
20260413-164838-tawny-yew
54 cells · 0.3% fill · 13.0% insertion
1000 rollouts
pretty 1000 budget cuda
oscillation · gyradius · png_compressibility
preview
20260413-162216-dense-harbor
34 cells · 0.2% fill · 5.4% insertion
1000 rollouts
pretty 1000 budget cuda
oscillation · compactness · png_compressibility
preview
20260413-155501-quiet-cinder
252 cells · 1.5% fill · 44.7% insertion
1000 rollouts
pretty 1000 budget cuda
velocity · gyradius · spectral_entropy
preview
20260413-154511-ochre-bramble
648 cells · 4.0% fill · 38.8% insertion
3000 rollouts
standard 3000 budget cuda
velocity · gyradius · spectral_entropy
preview
20260413-153554-amber-anchor
7 cells · 0.0% fill · 1.0% insertion
3000 rollouts
standard 3000 budget cuda
compactness · persistence_score · rotational_symmetry
preview
20260413-152828-wry-spire
787 cells · 4.8% fill · 49.3% insertion
2000 rollouts
standard 2000 budget cuda
mass_asymmetry · spectral_entropy · gyradius
preview
20260413-151944-dense-xenon
28 cells · 0.2% fill · 4.8% insertion
2000 rollouts
standard 2000 budget cuda
gyradius · rotational_symmetry · oscillation
preview
20260413-151331-dense-spire
442 cells · 2.7% fill · 34.2% insertion
2000 rollouts
standard 2000 budget cuda
velocity · mass_asymmetry · png_compressibility
preview
20260413-145422-plush-petal
39 cells · 0.2% fill · 5.4% insertion
2000 rollouts
standard 2000 budget cuda
png_compressibility · rotational_symmetry · persistence_score
preview
20260413-144705-ochre-xenon
122 cells · 0.7% fill · 10.1% insertion
2000 rollouts
standard 2000 budget cuda
oscillation · compactness · mass_asymmetry
preview
20260413-143705-fierce-spire
233 cells · 1.4% fill · 25.1% insertion
2000 rollouts
standard 2000 budget cuda
velocity · gyradius · oscillation
preview
20260413-135712-amber-ember
116 cells · 0.7% fill · 13.1% insertion
2000 rollouts
standard 2000 budget cuda
velocity · compactness · spectral_entropy
preview
20260413-135102-ochre-thistle
203 cells · 1.2% fill · 22.9% insertion
2000 rollouts
standard 2000 budget cuda
oscillation · gyradius · spectral_entropy
preview
20260413-134355-hazy-creek
521 cells · 3.2% fill · 42.7% insertion
2000 rollouts
standard 2000 budget cuda
velocity · gyradius · spectral_entropy

Ecosystem runs

Coming in v2.0.0. Spawn creatures from selected archive cells together on a large shared grid and observe what happens: do they interact, ignore each other, or destabilize? The behavioral descriptor space lets you make deliberate choices about which creatures to seed together.

Homogeneous first (v2.0.0): one archive cell, multiple copies, global parameters. Then heterogeneous (v2.1.0): creatures from descriptor-space-distant cells, parameter localization.

Run your own atlas

biota is a self-contained CLI tool. You can run it on a laptop for quick iteration or across a Ray cluster for full-scale searches. The only hard dependencies are Python 3.12, PyTorch, and Ray.

Install

# Clone and install
git clone https://github.com/rkv0id/biota
cd biota
uv sync

Quick start

1
Run a search
The dev preset (64×64 grid, 200 steps) is fast enough for a laptop. No Ray needed.
uv run biota search --preset dev --budget 200
2
Build the viewer
Generates a self-contained HTML file for each run, plus an index.
python scripts/build_index.py
open runs/index.html

GPU and cluster

On Apple Silicon pass --device mps --batch-size 32 for a meaningful speedup. On a CUDA cluster, use --batch-size 64 --workers N where N is the number of nodes. The standard preset (192×192, 300 steps) at B=64 on an RTX 5060 Ti cluster runs 500 rollouts in about 97 seconds.

# Apple Silicon
uv run biota search --preset standard --budget 500 \
    --device mps --batch-size 32

# Single CUDA GPU, no Ray
uv run biota search --preset standard --budget 500 \
    --device cuda --batch-size 64

# Multi-node Ray cluster, custom descriptor axes
uv run biota search --ray-address head:6379 \
    --preset standard --budget 2000 \
    --device cuda --batch-size 64 --workers 3 \
    --descriptors oscillation,compactness,png_compressibility

Choosing descriptors

Pass --descriptors with three comma-separated names to control which behavioral axes the archive uses. With 9 built-ins there are 84 possible configurations. You can also supply your own via --descriptor-module path/to/file.py — the file must define a list named DESCRIPTORS containing Descriptor objects.

# Default axes
uv run biota search --descriptors velocity,gyradius,spectral_entropy

# Shape and complexity axes
uv run biota search --descriptors oscillation,compactness,png_compressibility

More detail

Rami Kader
Machine learning engineer. Interested in cellular automata, artificial life, evolutionary computing, and distributed systems.