Native Shell
Native Shell:AI 生成的 UI,在你的應用中原生呈現,涵蓋每個平台。iOS、Android、macOS、Windows 與 Linux 上的應用、GPUI 應用與網頁在執行時載入已簽名、沙箱隔離的 TSX 模組並繪製 th
AI 翻譯
A Python library for simulating the evolution of species, genomes, sequences and traits
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗🌐 Website · Gallery · Documentation · Manual (pdf) · Roadmap
Simulating the evolution of species, genomes, sequences and traits.
ZOMBI2 simulates evolution at four levels: the species tree of lineages, the genomes that evolve along it, the sequences inside each gene, and the traits a lineage carries. Use it to generate benchmark datasets with known ground truth for phylogenetic and comparative methods.
pip install zombi2
Working with an AI agent? Give it this line, and it sets itself up to use ZOMBI2 in your project:
Fetch and follow the instructions at https://aadavin.github.io/zombi2/docs/agent-setup/prompt.txt to set me up for ZOMBI2.
zombi2 species out/ --birth 1 --death 0.3 --n-extant 20 --seed 1
zombi2 genomes out/ --duplication 0.2 --transfer 0.1 --loss 0.25 --seed 1
zombi2 sequences out/ --model hky85 --length 1000 --divergence 0.2 --seed 1
From Python, each level is one call, and the result object carries the history:
from zombi2 import species, genomes, sequences
from zombi2.sequences.substitution_models import hky85
sp = species.simulate_species_tree(birth=1.0, death=0.3, n_extant=20, seed=1)
g = genomes.simulate_genomes_family(sp, duplication=0.2, transfer=0.1, loss=0.25, seed=1)
s = sequences.simulate_sequences(g, model=hky85(), length=1000, divergence=0.2, seed=1)
g.gene_trees # the true gene tree of every family
sp.write("out/") # the trees, the event log and the fates
g.write("out/") # gene trees, the event log, profiles
s.write("out/") # alignments and phylograms (ancestral is opt-in)
Each write fills the directory it is given, so these three share out/; the commands above group
the same run into out/species/, out/genomes/ and out/sequences/, and add a log per level and a
run.zombi2 report. The two routes count families differently, too: the Python result holds an
alignment for every family born, empty where no copy survived, while the commands count the
survivors. run.zombi2 gives both, as families 100 born · 92 surviving · 8 died out.
ZOMBI2 is organized around four levels of evolution. A genome or a trait evolves along the species tree, and a sequence evolves inside a gene of the genome, so a sequences run needs a genomes run first. The levels you run are composed into one seeded, reproducible run.
Dependent runs are how ZOMBI2
simulates a scenario where one part of the run controls another — a habitat trait that makes
lineages lose genes four times faster in the water, a gene family whose presence speeds up transfer
for the rest of the genome, a GC content that sets how fast a trait changes. Every dependency is
written as a connection, with three parts: the driver, the value that is read; the
target, the parameter that depends on it (a rate, an extent, or which lineage receives a
transfer); and the link between them, which says what each value of the driver is worth and
what that number does to the target (scaled_by).
When the driver can be simulated first, the run is conditioned: two ordinary runs in order, the second reading the file the first one wrote.
zombi2 species out/ --birth 1 --death 0.3 --n-extant 20 --seed 1
zombi2 traits out/ --kind discrete --states aquatic,terrestrial --switch 0.4 --seed 1
zombi2 genomes out/ --loss "PerCopy(0.25).scaled_by('out/traits/trait_events.tsv', {'aquatic': 4.0})" --seed 1
When neither level can be simulated first, the run is joint: one run simulates both levels at the same time. A trait that speeds up speciation is the standard case — lineages carrying it split more often, so the trait decides the shape of the tree while the tree decides where the trait can go — and the tree comes out as a result rather than going in as an input.
zombi2 joint out/ --birth "PerLineage(1.0).scaled_by('trait', {'small': 1.0, 'large': 3.0})" \
--states small,large --switch 0.3 --n-extant 100 --seed 1
A species tree of a million leaves takes about six seconds. On the same gene-family task, ZOMBI2 runs about 210× faster than the legacy ZOMBI1 — both pure Python.
The numbers behind the figure are in assets/performance/, one JSON per
benchmark with the raw times and their provenance; the full read is the docs site's
Performance page.
The gallery is a page of worked examples, one figure each, with the code that produced it: species trees, genomes, sequences, traits, conditioning and joining. Every figure is drawn with Phylustrator.
Cite the software by its DOI, which covers every version:
Davín, A. A. (2026). ZOMBI2. Zenodo. https://doi.org/10.5281/zenodo.23168059
To pin the version you used, take that release's own DOI from the
Zenodo record. GitHub's "Cite this repository" button
reads CITATION.cff and gives the same metadata in BibTeX or APA.
A ZOMBI2 paper is in preparation; this section will name it once it is out. For ZOMBI 1, cite Davín et al. (2020).
ZOMBI2 is released under the MIT License.
ZOMBI2 is maintained and supervised by Adrián Arellano Davín.
Contributions are welcome, from humans and from agents alike — a bug report, a model you wish it could express, a fix, a worked example for the gallery. Start with CONTRIBUTING.md, and open an issue or a pull request.