Restructure: descriptive tier and experiment names, paper/manuscript

- paper/pnas -> paper/manuscript (venue-neutral)
- configs/layer1 -> configs/inheritance, src/knowledge -> src/inheritance
  (imported as `inheritance`), make layer1 -> make inheritance; layer2 alias dropped
- inheritance and trained-network bundles named after the manuscript figure
  they feed (fig2_grounding_sweep, figS3_rebaselining, ...), or descriptively
  where they feed none; configs keep their `experiment:` value so parquet
  hashes are unchanged, only output.dir moves
- figure scripts, SI figure sources, notebooks, REPRODUCING.md, README and the
  SI Methods/tables updated; make clean no longer deletes tracked manifests;
  reproduce.sh hashes the s{seed}/ layouts too

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y64o8FKP7rCuXzC48pxpMm
This commit is contained in:
Giorgio Gilestro 2026-09-13 17:00:40 +01:00
parent 84124de143
commit ab3dc10587
240 changed files with 477 additions and 476 deletions

View file

@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Current state: Layer 1 complete; Layer 1.5 (neural) in progress
- **Layer 1** (`src/knowledge/`) — **complete and validated.** All six experiments E1E6, the
- **Layer 1** (`src/inheritance/`) — **complete and validated.** All six experiments E1E6, the
closed-form scientific-validation tests, figures, and reproducibility harness exist. Headline:
critical grounding `g* = 0.048 ≪ 1`; the E4 finding that mean-mixture distillation conserves
collapse while only a union-preserving max-merge realises the recombination benefit.
@ -50,7 +50,7 @@ The population-genetics dictionary in blueprint §1 is the spine. Keep its abstr
## Two layers, staged by cost
- **Layer 1 — analytical core** (`src/knowledge/`). Pure NumPy/SciPy WrightFisher simulator. Laptop, minutes, no GPU. Carries the paper's quantitative claims. **Three of the five §2.4 predictions are closed-form**, so validation is an **exact** test, not a vibe check — these become `<0.1%`-tolerance assertions in `test_scientific_validation.py`:
- **Layer 1 — analytical core** (`src/inheritance/`). Pure NumPy/SciPy WrightFisher simulator. Laptop, minutes, no GPU. Carries the paper's quantitative claims. **Three of the five §2.4 predictions are closed-form**, so validation is an **exact** test, not a vibe check — these become `<0.1%`-tolerance assertions in `test_scientific_validation.py`:
- **Pred. 1** — neutral heterozygosity decay: `E[Hₜ] = H₀(1 1/n)ᵗ`.
- **Pred. 3***exact* mutationdrift equilibrium for the implemented immigration model: `H_eq = H* · m(2n+m1)/(n+2nm+m²)`, with `H* = 1 Σ(p*ᵢ)²`. The textbook `θ/(1+θ)` (θ=2m) is only the rare-immigrant limit. **Critical nuance: H is *smooth* in m — the sharp phase threshold lives in discrete tail-item survival (Pred. 4: an item survives iff `m·p*ᵢ ≳ 1`), not in H.** Do not describe E2 as a discontinuity in H.
- **Pred. 5** — closed-form recombination benefit: `U(K_T, ρ, q) = T[ρq + (1ρ)(1(1q)^K_T)]` (expected tail items retained by ≥1 of K_T teachers).
@ -77,15 +77,15 @@ E4's whole purpose is to isolate the effect of teacher **decorrelation ρ**, so
**Finding (2026-07-05, real-MNIST `mnist_collapse`) — collapse and grounding-rescue reproduce on real images.** External-validity tier: a small **convolutional VAE** (the canonical generative-collapse model) is retrained each generation on its own generated digits. Modes = digit class × stroke-thickness bin (K=30, Zipf, ~18 tail modes); the oracle is a **frozen CNN + deterministic thickness** at **98.5% mode accuracy** (its 30×30 confusion matrix is recorded in the manifest as the measurement floor). Result (4 reps): the **dry (g=0) lineage collapses to a single mode** — forward-KL 0.5→18, support 30→1, tail truth-mass 1.0→0.06, H→0 — while **10% grounding holds all 30 modes** (KL≈0.6, full tail, H≈0.9). The VAE needs ~10% grounding here vs the synthetic histogram's ~5%, consistent with the `grounding` finding that trained neural models need more grounding than the exact operator. **Confirmation-only (signs, not magnitudes; blueprint §3.5)** — the exact synthetic oracle stays the quantitative anchor. `figures/mnist_montage.py` is an eyeball diagnostic (re-runs a short dry lineage; NOT a parquet figure). Build gates passed: CNN mode accuracy 98.5%; VAE gen-0 recovers full 30/30 support (over-smooths frequencies, KL≈0.5, no prior hole — unlike the *synthetic*-codeword VAE, which is why the MNIST VAE works where that one didn't). The MNIST tier is heavy (torchvision `--extra mnist`, downloads MNIST, ~5 min): `make mnist`, kept out of the `make neural` loop.
**Finding (2026-07-05, learning kernel) — neutral drift is a null both real models fail, oppositely; the estimator bias is a signed operator.** Layer-1 extension (`knowledge/kernel.py`, `LearningKernelCfg`): the refit becomes `p_{t+1} = T_θ(counts/n)` with two pop-gen knobs — **reset `u`** (mutation toward a prior = smoothing) and **temperature `τ`** (sharpening = mode-competition) — both identity at their defaults, so the histogram bridge and every scientific-validation test are unchanged (68 core tests still green). Result: **neutral WrightFisher fails both neural architectures, in opposite directions.** VAE regime (`n=6000, K=30`): neutral drift is *inert* (no collapse), yet the real VAE collapsed to one mode — **sharpening `τ=0.8` reproduces it** (the estimator ADDS collapse). RNN regime (`n=200, K=256`): neutral drives `H→0`, but the real RNN only partially collapses — **mutation `u=0.006` reproduces the `H`-floor** (the estimator REMOVES collapse). Honest caveat: uniform-mutation matches the RNN `H`-floor but overshoots its forward-KL (~5 vs ~2), evidence the RNN's smoothing prior is *truth-like, not uniform* (future refinement). Configs `configs/layer1/kernel_{sharpen,smooth}.yaml`, figure `plot_kernel.py`. This mechanistically explains the architecture-generality result and the softened neural `g*`.
**Finding (2026-07-05, learning kernel) — neutral drift is a null both real models fail, oppositely; the estimator bias is a signed operator.** Layer-1 extension (`knowledge/kernel.py`, `LearningKernelCfg`): the refit becomes `p_{t+1} = T_θ(counts/n)` with two pop-gen knobs — **reset `u`** (mutation toward a prior = smoothing) and **temperature `τ`** (sharpening = mode-competition) — both identity at their defaults, so the histogram bridge and every scientific-validation test are unchanged (68 core tests still green). Result: **neutral WrightFisher fails both neural architectures, in opposite directions.** VAE regime (`n=6000, K=30`): neutral drift is *inert* (no collapse), yet the real VAE collapsed to one mode — **sharpening `τ=0.8` reproduces it** (the estimator ADDS collapse). RNN regime (`n=200, K=256`): neutral drives `H→0`, but the real RNN only partially collapses — **mutation `u=0.006` reproduces the `H`-floor** (the estimator REMOVES collapse). Honest caveat: uniform-mutation matches the RNN `H`-floor but overshoots its forward-KL (~5 vs ~2), evidence the RNN's smoothing prior is *truth-like, not uniform* (future refinement). Configs `configs/inheritance/kernel_{sharpen,smooth}.yaml`, figure `plot_kernel.py`. This mechanistically explains the architecture-generality result and the softened neural `g*`.
**Strategic positioning vs Riis 2026 (arXiv:2604.08554, "Drift and selection in LLM text ecosystems").** Riis independently formalizes **collapse = WrightFisher drift** (his Thm 1) with n-gram agents: minority-mass martingale, rare-first extinction, single-token dropout ≈ αe^{α}, de Bruijn-polytope fixed points, plus descriptive-vs-normative *selection* (Thm 2). **Concede as prior art:** "collapse is literally WrightFisher", the martingale, rare-first loss, the WF/effective-population formalism — cite him; do **not** frame these as our contribution. **Crucial distinction that protects us:** his "mixed environment" *retains the lineage's own old synthetic tokens* — there is **no injection of fresh real data from a fixed `p*`**, so his headline is *pessimistic* (Thm 1c: extinction is independent of α — retention only changes speed). Our **grounding is immigration from a non-drifting external truth**, giving a stationary `H_eq>0` and a critical `g*≪1` that *prevents* collapse — the mechanism his closed loop lacks. **Our defensible novelty, ranked:** (1) **recombination + "merge, don't average" conservation law** (E4) — he has no model-merging operator; flagship; (2) **the learning-kernel / estimator-bias axis** — he *explicitly names it as future work*; we now build+measure it; (3) grounding threshold (solid anchor, but immigrationdrift balance is classic — not a flagship); (4) architecture-generality in real weights + MNIST; (5) **the Lamarckian society + the vertical/cumulative C3 claim — wholly ours, not yet run.** Reposition the paper from *"collapse is drift"* (now contested) to **a population-genetic *control theory* for sustaining open-ended knowledge**: drift is the diagnosed disease (cite Riis), our contribution is the engineered remedies and their integration.
**Finding (2026-07-05, E7/E8 — the multi-locus society frame; raises the ceiling).** To express the *vertical* claim (capability that *exceeds* any component), knowledge is generalized from a single-locus fixed-`p*` distribution to a distribution over **genotypes** (`L` biallelic loci, `K=2^L`; fitness = # correct loci; reuses all the K-mode machinery). The one new operator is **recombination** (`knowledge/genotype.py`): free recombination sends `p → ⊗ per-locus marginals` (linkage equilibrium). Two experiments, both analytic. **E8 (the star, `kind: society`) — the vertical claim / FisherMuller:** decorrelated *parents* (specialists, expert on their loci, agnostic elsewhere) are recombined; **sexual merge assembles a genotype fitter than any parent, climbing to the optimum (12/12) as parent count grows and `ρ→0`, while the best single parent (~8.7) and the mean-mixture "model soup" (~11.6) plateau below.** Clean, dramatic, 40 reps; reuses `make_retention_matrix` (locus mastery replaces tail-item retention). **E7 (`kind: genotype_lineage`) — the advantage of sex:** a single population adapting toward the optimum; the sexual lineage adapts *faster* (clonal interference slows the asexual one) by keeping loci in linkage equilibrium (LD→0 vs LD spike). Honest scope: a **speed** advantage, not a permanent Muller's-ratchet gap (the single-population ratchet is subtle to force; E8 carries the headline). **Metaphor shift (GG, 2026-07-05):** the society is framed as **sexual reproduction with unbounded parents**, *not* teacher→pupil — teacher→pupil caps at the ceiling (recovery), n-parent recombination is combinatorial and *generative* (exceeds any parent), and unlike biology there is no two-parent limit. Collapse = asexual degradation; the cure = sex. This unifies E4 (merge≠average) + E6 (irreversibility) under evolution-of-sex theory and stakes ground Riis's single-locus n-grams cannot reach. Scope is bounded: fixed combinatorial space (`L≤12`, "effectively open-ended relative to n"), additive fitness (NK/epistasis is an optional extension).
**Finding (2026-07-05, E9/E10 — the sexual-transmission model made rigorous: when sex helps, and directed sex).** Deepening the sexual metaphor (GG excited; wanted it robust before the full society). Added a **Kauffman NK landscape** (`genotype.nk_fitness`, tunable ruggedness `K`), finite **crossover** (`genotype.crossover`, n-parent, per-gap recombination rate), and **hill-climb** (parents = local optima = "trained models"). **E9 (`kind: recomb_landscape`) — landscape robustness / "why sex?":** E8's dramatic transgression used an *additive* landscape; on rugged (epistatic) landscapes, blindly recombining local optima causes **outbreeding depression** — mean offspring fall *below* the parents, worse with ruggedness AND recombination rate (`K=8`, free recomb: ≈ 0.23), and the **optimal recombination rate shrinks as ruggedness grows**. Design rule: *merge freely when skills are complementary/additive; sparingly + with selection when entangled.* **E10 (`kind: directed_sex`) — directed sex beats biological sex (the AI superpower):** biology is stuck with 2 random-mating parents and no offspring preview; an AI can **choose complementary mates + evaluate many recombinant offspring + keep the fittest + use unbounded parents** (iterated recombine-then-select). Result: random ("biological") sex craters with ruggedness (0.66→0.51), while **directed sex tracks/exceeds the best parent at every ruggedness** — converting the outbreeding-depression catastrophe into a win. This is the practical, distinctly-AI payoff and has no biological analog. `configs/layer1/{E9,E10}.yaml`, `plot_{E9,E10}.py`, READMEs, +5 tests (117 green). Complete sexual-transmission picture: **dramatic super-parent offspring when skills are complementary (E8); outbreeding-depression risk when entangled (E9); directed sex resolves the risk (E10).**
**Finding (2026-07-05, E9/E10 — the sexual-transmission model made rigorous: when sex helps, and directed sex).** Deepening the sexual metaphor (GG excited; wanted it robust before the full society). Added a **Kauffman NK landscape** (`genotype.nk_fitness`, tunable ruggedness `K`), finite **crossover** (`genotype.crossover`, n-parent, per-gap recombination rate), and **hill-climb** (parents = local optima = "trained models"). **E9 (`kind: recomb_landscape`) — landscape robustness / "why sex?":** E8's dramatic transgression used an *additive* landscape; on rugged (epistatic) landscapes, blindly recombining local optima causes **outbreeding depression** — mean offspring fall *below* the parents, worse with ruggedness AND recombination rate (`K=8`, free recomb: ≈ 0.23), and the **optimal recombination rate shrinks as ruggedness grows**. Design rule: *merge freely when skills are complementary/additive; sparingly + with selection when entangled.* **E10 (`kind: directed_sex`) — directed sex beats biological sex (the AI superpower):** biology is stuck with 2 random-mating parents and no offspring preview; an AI can **choose complementary mates + evaluate many recombinant offspring + keep the fittest + use unbounded parents** (iterated recombine-then-select). Result: random ("biological") sex craters with ruggedness (0.66→0.51), while **directed sex tracks/exceeds the best parent at every ruggedness** — converting the outbreeding-depression catastrophe into a win. This is the practical, distinctly-AI payoff and has no biological analog. `configs/inheritance/{E9,E10}.yaml`, `plot_{E9,E10}.py`, READMEs, +5 tests (117 green). Complete sexual-transmission picture: **dramatic super-parent offspring when skills are complementary (E8); outbreeding-depression risk when entangled (E9); directed sex resolves the risk (E10).**
**Finding (2026-07-05, E11 — the dynamic Lamarckian society: the vertical claim / C3, realized).** The culmination: a finite population of `N` agents (genotypes, `L` loci) evolves on a rugged NK landscape that *is* reality (`knowledge/dynamic_society.py`), composing the four operators the whole study built toward — grounding, directed recombination (sex), quality-diversity selection, mutation. Grounding is made load-bearing via the **consensus-conformity (self-consumption)** mechanism (GG decision): selection acts on `g·true_fitness + (1g)·conformity` (conformity = agreement with the population's own consensus), so `g=0` optimises fitting-the-crowd rather than reality. **4-arm ablation (12 reps), each breaking distinctly, only the full society climbing (global_opt≈0.79):** `full` 0.78 (climbs to the optimum, diversity maintained longest) · `no_sex` 0.77 (can't recombine to escape local optima) · `no_diversity`/greedy 0.74 (collapses diversity fastest, stuck at a worse local optimum) · **`no_grounding` 0.48 (self-consumption collapse to an unfit consensus** — trains on the crowd, regresses to a confident-but-wrong mean; conformitytrue gap ≈0.5). This integrates E1E6 + the kernel + E7E10 into one system and shows the society needs **all** of grounding + directed sex + diversity: on a rugged landscape you need diversity to explore basins, sex to recombine them, grounding to select on reality — remove any and you fail differently. `configs/layer1/E11.yaml`, `plot_E11.py`, README, +5 tests (122 green). **This closes the C3 vertical claim analytically** (the LLM rung remains the eventual empirical instantiation).
**Finding (2026-07-05, E11 — the dynamic Lamarckian society: the vertical claim / C3, realized).** The culmination: a finite population of `N` agents (genotypes, `L` loci) evolves on a rugged NK landscape that *is* reality (`knowledge/dynamic_society.py`), composing the four operators the whole study built toward — grounding, directed recombination (sex), quality-diversity selection, mutation. Grounding is made load-bearing via the **consensus-conformity (self-consumption)** mechanism (GG decision): selection acts on `g·true_fitness + (1g)·conformity` (conformity = agreement with the population's own consensus), so `g=0` optimises fitting-the-crowd rather than reality. **4-arm ablation (12 reps), each breaking distinctly, only the full society climbing (global_opt≈0.79):** `full` 0.78 (climbs to the optimum, diversity maintained longest) · `no_sex` 0.77 (can't recombine to escape local optima) · `no_diversity`/greedy 0.74 (collapses diversity fastest, stuck at a worse local optimum) · **`no_grounding` 0.48 (self-consumption collapse to an unfit consensus** — trains on the crowd, regresses to a confident-but-wrong mean; conformitytrue gap ≈0.5). This integrates E1E6 + the kernel + E7E10 into one system and shows the society needs **all** of grounding + directed sex + diversity: on a rugged landscape you need diversity to explore basins, sex to recombine them, grounding to select on reality — remove any and you fail differently. `configs/inheritance/fig4_society_ablation.yaml`, `plot_fig4_society_ablation.py`, README, +5 tests (122 green). **This closes the C3 vertical claim analytically** (the LLM rung remains the eventual empirical instantiation).
**Finding (2026-07-05, LLM prototype `llm_merge` — the first real-LLM step; honest/partial).** First move from toy models toward real LLMs (blueprint C2/C4, the real-LLM image of E8), on one 16 GB GPU. New `src/llm/` package: procedural task families + exact-match verifier (`tasks.py`), batched eval (`evaluate.py`), LoRA specialisation (`specialise.py`, manual answer-only SFT), weight-space merge via peft `add_weighted_adapter` (`merge.py`: soup=averaged deltas, ties=sign-reconciled union), runner (`experiment.py`, kind `llm_merge`). Base = **Qwen2.5-0.5B-Instruct** (Apache-2.0). Three *disjoint*, deliberately-hard families (lists/strings/arith); one LoRA specialist each (~90 s total). **Result (seed 1):** each specialist spikes on its own family; the **merges are the only models competent across ALL families — worst-family ≈0.25 vs <0.16 for every single specialist** (the Fisher-Muller "generalist from specialists" signature, robust). **But** the stronger "exceeds every parent *overall*" claim is only marginal at this scale (soup 0.64 vs best specialist 0.63; ties 0.61 below it), and averaging visibly *dilutes* peaks (lists: specialist 0.43 → merge 0.26 — the E4 "merge, don't average" caveat in real weights). Honest scope: pipeline works end-to-end; the balance/retention half reproduces; the strict overall-exceeds and the soup-vs-ties distinction need scale (bigger base, more/cleaner families, seeds, dilution-resistant/offspring-selected merge). **Env notes:** Python 3.14 + transformers 5.13 works (cp314 wheels exist); `transformers 5.x` changed `apply_chat_template` (returns a dict; render to text then tokenize; pass `**inputs` to `generate`). `make env-llm` / `make llm`; adapters cached under gitignored `models/llm/`, base in the HF cache (outside the repo). 125 tests green (+3 pure task/verifier). The full grounded sexual *society* on LLMs (C1 collapse, directed sex, the dynamic society) is the HPC-scale next step.
@ -131,7 +131,7 @@ make all
./reproduce.sh # uv sync → test → run all at committed seeds → regen figures → REPRODUCED.md
```
Single-experiment run pattern: one YAML config per experiment under `configs/layer1/EX.yaml` or `configs/layer2/CX.yaml`, fed to the experiment runner. Figures are regenerated separately by `figures/plot_EX.py` reading **only** `results.parquet` (no re-simulation).
Single-experiment run pattern: one YAML config per experiment under `configs/inheritance/EX.yaml` or `configs/layer2/CX.yaml`, fed to the experiment runner. Figures are regenerated separately by `figures/plot_EX.py` reading **only** `results.parquet` (no re-simulation).
## Non-negotiable engineering standard (blueprint §4)

View file

@ -1,14 +1,14 @@
# Layer 1 + Layer 1.5 automation. The uv venv (built from the committed uv.lock) is the
# Repository automation (inheritance, neural and language-model tiers). The uv venv (built from the committed uv.lock) is the
# reproducibility source of truth; every target runs inside it via `uv run`.
.PHONY: env env-neural env-mnist env-llm env-notebooks test layer1 layer2 neural mnist llm \
.PHONY: env env-neural env-mnist env-llm env-notebooks test inheritance neural mnist llm \
llm-epistasis llm-society llm-society-calib llm-society-calib-b llm-society-v2-smoke \
figures paper-figures paper notebooks clean
env: ## build .venv from the committed lockfile
uv sync --extra dev
env-neural: ## add the Layer 1.5 torch stack (GPU; Stage C onward)
env-neural: ## add the torch stack for the trained-network tier (GPU)
uv sync --extra dev --extra neural
env-mnist: ## add torchvision for the real-MNIST confirmation tier
@ -17,19 +17,19 @@ env-mnist: ## add torchvision for the real-MNIST confirmation tier
test: ## correctness tests + scientific-validation tests (the spine of trust)
uv run pytest
layer1: ## run experiments E1-E6 + the learning-kernel bridge (analytic)
for e in E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E12_nk E14 kernel_sharpen kernel_smooth; do uv run python -m knowledge.experiment configs/layer1/$$e.yaml; done
inheritance: ## run every inheritance-model experiment (analytic; bitwise reproducible)
for c in configs/inheritance/*.yaml; do uv run python -m inheritance.experiment "$$c"; done
neural: ## run Layer 1.5 synthetic neural experiments (excludes the MNIST/torchvision tiers)
neural: ## run the synthetic trained-network experiments (excludes the MNIST/torchvision tiers)
for c in configs/neural/*.yaml; do case "$$c" in *mnist*|*speciation_real*) ;; \
*) uv run python -m neural.experiment "$$c" ;; esac; done
mnist: ## run the torchvision tiers: MNIST collapse + E13 real-weight speciation (needs env-mnist)
uv run python -m neural.experiment configs/neural/mnist_collapse.yaml
mnist: ## run the torchvision tiers: MNIST collapse + real-weight speciation (needs env-mnist)
uv run python -m neural.experiment configs/neural/fig2_mnist_collapse.yaml
uv run python -m neural.experiment configs/neural/speciation_real.yaml
uv run python -m neural.experiment configs/neural/speciation_real_cliff.yaml
uv run python -m neural.experiment configs/neural/speciation_real_emergent.yaml
MPLBACKEND=Agg uv run python figures/mnist_montage.py # the asset paper Fig. 2B embeds
MPLBACKEND=Agg uv run python figures/mnist_montage.py # the asset paper Fig. 2A embeds
env-llm: ## add the LLM stack for the Layer-2 prototype (GPU; transformers/peft)
uv sync --extra dev --extra neural --extra llm
@ -76,21 +76,17 @@ llm-seeds: ## multi-seed firm-up (heavy): merge x5, moe-hard x3, directe
uv run python -m llm.experiment configs/llm/moe_hard_seeds.yaml
uv run python -m llm.experiment configs/llm/directed_hard_seeds.yaml
layer2: neural ## alias: Layer 1.5 is the current Layer-2 deliverable (LLM rung deferred)
figures: ## regenerate per-experiment figures from committed results (pure; no re-simulation)
for e in E1 E2 E3 E4 E5 E6; do MPLBACKEND=Agg uv run python figures/plot_$$e.py; done
for p in figures/plot_*.py; do case "$$p" in */plot_E[1-6].py|*/_*) ;; \
*) [ -e "$$p" ] && MPLBACKEND=Agg uv run python "$$p" ;; esac; done
for p in figures/plot_*.py; do MPLBACKEND=Agg uv run python "$$p"; done
paper-figures: ## regenerate the manuscript figures (Fig. 1-7) and rebuild the PDF bodies
MPLBACKEND=Agg uv run python paper/pnas/make_figs.py
uv run python paper/pnas/build.py
uv run python paper/pnas/build.py si
paper-figures: ## regenerate the manuscript figures (Fig. 1-5) and rebuild the PDF bodies
MPLBACKEND=Agg uv run python paper/manuscript/make_figs.py
uv run python paper/manuscript/build.py
uv run python paper/manuscript/build.py si
paper: paper-figures ## figures + compile both PDFs (needs tectonic)
cd paper/pnas && tectonic main.tex && tectonic si.tex
uv run python paper/pnas/build_lay_legends.py && cd paper/pnas && tectonic figure_legends_for_students.tex
cd paper/manuscript && tectonic main.tex && tectonic si.tex
uv run python paper/manuscript/build_lay_legends.py && cd paper/manuscript && tectonic figure_legends_for_students.tex
env-notebooks: ## add Jupyter for the walkthrough notebooks
uv sync --extra dev --extra notebooks
@ -99,6 +95,6 @@ notebooks: ## execute every notebook end-to-end (a reproduction check in
for nb in notebooks/*.ipynb; do uv run jupyter nbconvert --to notebook --execute \
--inplace --ExecutePreprocessor.timeout=1800 "$$nb"; done
clean: ## remove caches and generated results (keeps committed manifests)
clean: ## remove caches and regenerable parquets (keeps committed manifests and figures)
rm -rf .pytest_cache **/__pycache__
find results -type f ! -name '.gitkeep' -delete 2>/dev/null || true
find results -name 'results.parquet' -delete 2>/dev/null || true # tracked manifests/figures stay

View file

@ -12,7 +12,7 @@ The framework is developed at three tiers of increasing realism:
| Tier | What it is | Hardware |
|---|---|---|
| **Biological model** | WrightFisher simulator over knowledge distributions; closed forms, bitwise reproducible | laptop |
| **Inheritance model** | WrightFisher simulator over knowledge distributions; closed forms, bitwise reproducible | laptop |
| **Trained networks** | RNN / MLP / VAE on a synthetic mode universe with an exact oracle; convolutional VAE on MNIST | one GPU |
| **Language models** | LoRA specialists on Qwen2.5-Instruct (0.5B / 7B) with an exact-match verifier | one GPU / L40S |
@ -25,7 +25,7 @@ and artifact-hash verification.
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh # one-time, if needed
./reproduce.sh # env -> tests -> biological-model tier at committed seeds -> figures
./reproduce.sh # env -> tests -> inheritance-model tier at committed seeds -> figures
./reproduce.sh --with-gpu # ... and the trained-network + language-model tiers
```
@ -34,9 +34,9 @@ Or tier by tier:
```bash
make env # build .venv from the committed, hash-pinned uv.lock
make test # correctness + closed-form scientific validation (the spine of trust)
make layer1 # the biological model: E1-E12, E14, learning kernel
make inheritance # the inheritance model, every experiment at its committed seed
make figures # per-experiment figures, from committed parquets (no re-simulation)
make paper-figures # the manuscript's Fig. 1-7 + rebuild the PDF body
make paper-figures # the manuscript's Fig. 1-5 + rebuild the PDF bodies
```
`make help` is not defined, but every target carries a `##` description — `grep '##' Makefile`.
@ -56,20 +56,21 @@ make env-notebooks && jupyter lab notebooks/
## Layout
```
src/knowledge/ biological-model tier (imported as `knowledge`)
src/inheritance/ inheritance-model tier (imported as `inheritance`)
src/neural/ trained-network tier
src/llm/ language-model tier
configs/ one YAML per experiment: layer1/ neural/ llm/ (each declares its master seed)
configs/ one YAML per experiment: inheritance/ neural/ llm/ (each declares its master seed)
figures/ plot_*.py — per-experiment diagnostics, read results.parquet only
paper/pnas/ the manuscript: main.md, make_figs.py (Fig. 1-7), build.py, si.md
paper/manuscript/ the manuscript: main.md, si.md, make_figs.py (Fig. 1-5), si_figures.py, build.py
notebooks/ executable walkthroughs
hpc/ PBS job scripts for the 7B tier (Imperial CX3)
tests/ correctness + test_scientific_validation.py (the closed forms as assertions)
results/ run artifacts: results.parquet (gitignored) + resolved_config.yaml + manifest.json
results/ run artifacts: results.parquet (gitignored) + resolved_config.yaml + manifest.json;
bundles are named after the manuscript figure they feed (fig2_*, figS4_*)
```
Design documents: `paper/blueprint.md` (the normative build spec) and `paper/results-summary.md`
(plain-language + technical summary of every result).
Development history, design documents, pre-registrations and exploratory experiments that did not
reach the manuscript live on the `dev` branch; `main` holds only what reproduces the paper.
## The engineering contract

View file

@ -5,7 +5,7 @@ that produced it. Every figure panel, every headline number, and the environment
in are listed below. If something in the paper is not traceable through this document, that is a
bug — please open an issue.
Manuscript: `paper/pnas/main.md` (built to `paper/pnas/main.pdf`).
Manuscript: `paper/manuscript/main.md` (built to `paper/manuscript/main.pdf`).
---
@ -50,7 +50,7 @@ Tier by tier, by hand:
```bash
make test # correctness + closed-form scientific validation
make layer1 # the inheritance model: E1-E12, E14, learning kernel
make inheritance # the inheritance model, every experiment at its committed seed
make neural # trained networks (needs a GPU)
make mnist # real-MNIST tier + the Fig. 2A montage asset (needs torchvision)
make llm # language-model prototypes (needs a GPU)
@ -64,16 +64,16 @@ make paper-figures # the manuscript figures Fig. 1-5 + rebuild the PDF body
## 4. The figure map
Every manuscript panel, the artifact it is plotted from, the config that produced that artifact, and
that config's declared seed. All panels are drawn by `paper/pnas/make_figs.py` (function per figure);
that config's declared seed. All panels are drawn by `paper/manuscript/make_figs.py` (function per figure);
`make paper-figures` regenerates all of them. Figures are a **pure function of committed artifacts**
no panel re-simulates anything, with the single documented exception of the Fig. 2A montage asset.
| Panel | Drawn by | From artifact | Produced by config | Seed(s) |
|---|---|---|---|---|
| Fig. 1A, 1B | `fig1a()`, `fig1b()` | — (schematics; icons in `paper/pnas/figs/icons/`) | — | — |
| Fig. 2A | `fig2()` | `results/mnist_collapse/mnist_montage.png` | `configs/neural/mnist_collapse.yaml` → asset from `figures/mnist_montage.py` | 20260705 |
| Fig. 2B *(reference)* | `fig2()` | `results/E2/` | `configs/layer1/E2.yaml` | 20260704 |
| Fig. 3A | `fig3()` | — (schematic of the compared models; icons in `paper/pnas/figs/icons/`) | — | — |
| Fig. 1A, 1B | `fig1a()`, `fig1b()` | — (schematics; icons in `paper/manuscript/figs/icons/`) | — | — |
| Fig. 2A | `fig2()` | `results/fig2_mnist_collapse/mnist_montage.png` | `configs/neural/fig2_mnist_collapse.yaml` → asset from `figures/mnist_montage.py` | 20260705 |
| Fig. 2B *(reference)* | `fig2()` | `results/fig2_grounding_sweep/` | `configs/inheritance/fig2_grounding_sweep.yaml` | 20260704 |
| Fig. 3A | `fig3()` | — (schematic of the compared models; icons in `paper/manuscript/figs/icons/`) | — | — |
| Fig. 3B | `fig3()` | `results/llm_merge_seeds/` | `configs/llm/merge_seeds.yaml` | 1, 2, 3, 4, 5 |
| Fig. 3C | `fig3()` | `results/llm_moe_hard_hpc/s{1,2,3}/` | `configs/llm/moe_hard_hpc.yaml` (7B, HPC; seeds 23 via `hpc/llm_7b_seeds.pbs`); statistics `figures/stats_llm_7b_seeds.py` | 1, 2, 3 |
| Fig. 3D, 3D | `fig3()` | `results/llm_epistasis/` + `results/llm_epistasis_compat/` | `configs/llm/epistasis.yaml`, `configs/llm/epistasis_compat.yaml` | 1, 2, 3 |
@ -83,20 +83,26 @@ no panel re-simulates anything, with the single documented exception of the Fig.
| Fig. S14 | `figures/plot_curriculum_timing.py` | `results/llm_curriculum_v5_{early,late,early_obl,late_obl}/s{1,2,3}/` | `configs/llm/curriculum_v5_{early,late}[_obl].yaml` via `hpc/llm_curriculum_timing.pbs`; statistics `figures/stats_llm_curriculum.py` | 1, 2, 3 |
| Fig. S15 | `figures/plot_curriculum_cull.py` | `results/llm_curriculum_v5_cull/s{1,2,3}/` | `configs/llm/curriculum_v5_cull.yaml` via `hpc/llm_cull.pbs`; statistics `figures/stats_llm_curriculum.py` | 1, 2, 3 |
| Fig. S16 | `figures/plot_llm_smol.py` | `results/llm_{merge_seeds,moe_hard_seeds}_smol/` (+ the Qwen bundles) | `configs/llm/{merge_seeds,moe_hard_seeds}_smol.yaml` via `hpc/llm_smol.pbs`; statistics `figures/stats_llm_smol.py` | 15; 13 |
| Fig. 4D, 4D, 4E *(reference)* | `fig4()` | `results/E11/` | `configs/layer1/E11.yaml` | 20260705 |
| Fig. 4D, 4D, 4E *(reference)* | `fig4()` | `results/fig4_society_ablation/` | `configs/inheritance/fig4_society_ablation.yaml` | 20260705 |
| Fig. 5A | `fig5()` | `results/speciation_real/` | `configs/neural/speciation_real.yaml` | 13 |
| Fig. 5B | `fig5()` | `results/speciation_real_cliff/` | `configs/neural/speciation_real_cliff.yaml` | 13 |
| Fig. 5C, 5D | `fig5()` | `results/llm_speciation/s{1,2,3}/` | `configs/llm/speciation.yaml` (seeds 23 via `hpc/llm_speciation_seeds.pbs`); statistics `figures/stats_llm_speciation_seeds.py` | 1, 2, 3 |
| Fig. 5E, 5F *(reference)* | `fig5()` | `results/E12/` | `configs/layer1/E12.yaml` | 12 |
| Fig. 5E, 5F *(reference)* | `fig5()` | `results/fig5_speciation_bdm/` | `configs/inheritance/fig5_speciation_bdm.yaml` | 12 |
Panels marked *(reference)* are inheritance-model results included to set the expectation the
real-model panels are read against, not as findings in their own right.
**Inheritance-model results reported in SI only.** These have no real-model counterpart in the paper
and reproduce known results, so they are cited as reference values and plotted only in SI, from their
per-experiment figures: blending vs union (E4), FisherMuller super-parent (E8), outbreeding
depression (E9), directed recombination (E10), and mate-pool breadth (E14), drawn by
`figures/plot_E{4,8,9,10,14}.py` from `results/E{4,8,9,10,14}/`.
per-experiment figures: blending vs union (`figS8_multiparent_union`), FisherMuller super-parent
(`figS9_specialist_superparent`), outbreeding depression (`figS10_rugged_landscapes`), directed
recombination (`figS11_directed_recombination`), and mate-pool breadth (`figS13_mating_breadth`),
each drawn by `figures/plot_<bundle>.py` from `results/<bundle>/`.
**Bundle names.** Inheritance-model and trained-network bundles are named after the manuscript
figure they feed at submission (`fig2_*`, `figS4_*`); bundles that feed no figure carry a
descriptive name. The name is a label fixed at submission, so a later renumbering of the figures
does not rename the bundles.
**Replication.** Every panel is replicated: inheritance-model panels over 12100 internal
replicates; Fig. 3B over five training seeds; Fig. 3C, 3DE, 4AB and 5CD over three (Fig. 5CD
@ -106,18 +112,15 @@ was single-seed until 2026-09-12; seeds 23 ran via `hpc/llm_speciation_seeds.
| Result | Artifact | Config | Seed |
|---|---|---|---|
| Collapse null (E1) | `results/E1/` | `configs/layer1/E1.yaml` | 20260704 |
| Region-matched grounding (E3) | `results/E3/` | `configs/layer1/E3.yaml` | 20260704 |
| Quality-diversity vs greedy (E5) | `results/E5/` | `configs/layer1/E5.yaml` | 20260704 |
| Re-minting / irreversibility (E6) | `results/E6/` | `configs/layer1/E6.yaml` | 20260704 |
| Advantage of sex, lineage (E7) | `results/E7/` | `configs/layer1/E7.yaml` | 20260705 |
| Incompatibilities on NK (E12_nk) | `results/E12_nk/` | `configs/layer1/E12_nk.yaml` | 12 |
| Learning kernel (estimator bias) | `results/kernel_sharpen/`, `results/kernel_smooth/` | `configs/layer1/kernel_{sharpen,smooth}.yaml` | 20260705 |
| Region-matched grounding (Fig. S5) | `results/figS5_aimed_grounding/` | `configs/inheritance/figS5_aimed_grounding.yaml` | 20260704 |
| Quality-diversity vs greedy (Fig. S12) | `results/figS12_quality_diversity/` | `configs/inheritance/figS12_quality_diversity.yaml` | 20260704 |
| Re-baselining / irreversibility (Fig. S3) | `results/figS3_rebaselining/` | `configs/inheritance/figS3_rebaselining.yaml` | 20260704 |
| Learning kernel (Fig. S2) | `results/figS2_kernel_sharpen/`, `results/figS2_kernel_smooth/` | `configs/inheritance/figS2_kernel_{sharpen,smooth}.yaml` | 20260705 |
| Histogram bridge gate | `results/bridge/` | `configs/neural/bridge.yaml` | 20260704 |
| Neural collapse / grounding / architectures / recombination | `results/{collapse,grounding,architectures,recombination}/` | `configs/neural/*.yaml` | 20260704 |
| Neural collapse / grounding / architectures / recombination | `results/{collapse,figS6_grounding_rnn,figS1_architectures,recombination}/` | `configs/neural/*.yaml` | 20260704 |
| Emergent-isolation null | `results/speciation_real_emergent/` | `configs/neural/speciation_real_emergent.yaml` | 813 |
| Budget-controlled speciation (add design) | `results/llm_speciation_add/` | `configs/llm/speciation_add.yaml` | 1, 2, 3 |
| LLM prototypes (0.5B) | `results/llm_{merge,moe,directed}/` | `configs/llm/{merge,moe,directed}.yaml` | 1 |
| 0.5B multi-seed runs | `results/llm_{merge_seeds,moe_hard_seeds,directed_hard_seeds}/` | `configs/llm/{merge_seeds,moe_hard_seeds,directed_hard_seeds}.yaml` | 15; 13; 13 |
| 7B firm-ups | `results/llm_*_hpc/` | `configs/llm/*_hpc.yaml` (run via `hpc/*.pbs`) | 1 |
### Per-experiment (exploratory) figures
@ -132,7 +135,7 @@ sensitivity).
## 5. Seeds and determinism
**Policy.** One master seed per config. All sub-randomness is derived from it via
`numpy.random.SeedSequence.spawn` (`src/knowledge/seeding.py`); no code touches global RNG state, and
`numpy.random.SeedSequence.spawn` (`src/inheritance/seeding.py`); no code touches global RNG state, and
every `rng` is passed explicitly. A run is a pure function of its resolved config.
**Biological-model tier: bitwise reproducible.** Re-running a config on the same lockfile
@ -185,7 +188,7 @@ same `uv.lock` environment, so the only difference from a local run is the GPU.
```bash
qsub hpc/llm_merge.pbs # 7B merge firm-up
qsub hpc/llm_hard.pbs # hard-benchmark moe + directed at 7B
qsub hpc/llm_society.pbs # the society campaign (array over seeds)
qsub hpc/llm_7b_seeds.pbs # seeds 2-3 of the three 7B experiments (array)
```
## 8. Notebooks
@ -206,6 +209,6 @@ qsub hpc/llm_society.pbs # the society campaign (array over seeds)
regenerated. The archived deposit (Zenodo DOI, on publication) includes the parquets so that the
paper's "regenerates from committed artifacts without re-simulation" holds from the archive.
- `figures/mnist_montage.py` re-runs a short dry lineage to draw its montage rather than reading a
parquet; it is an eyeball diagnostic whose quantitative counterpart is `results/mnist_collapse/`.
parquet; it is an eyeball diagnostic whose quantitative counterpart is `results/fig2_mnist_collapse/`.
- The composed society at language-model scale is an open experiment at the time of writing; see
`tasks/workorder-llm-society.md`.

View file

@ -29,4 +29,4 @@ metrics:
# No sweep: a single condition.
output:
dir: results/E1
dir: results/collapse_null

View file

@ -33,4 +33,4 @@ sweep:
values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4]
output:
dir: results/E2
dir: results/fig2_grounding_sweep

View file

@ -37,4 +37,4 @@ sweep:
- {name: no_sex, set: {society.sex: false}}
- {name: no_diversity, set: {society.select: greedy, society.novelty: 0.0}}
output: {dir: results/E11}
output: {dir: results/fig4_society_ablation}

View file

@ -25,4 +25,4 @@ speciation:
n_offspring: 500
output:
dir: results/E12
dir: results/fig5_speciation_bdm

View file

@ -24,4 +24,4 @@ sweep:
- param: rate
values: [0.0, 0.05, 0.1, 0.2, 0.35, 0.5] # clonal -> free recombination
output: {dir: results/E9}
output: {dir: results/figS10_rugged_landscapes}

View file

@ -24,4 +24,4 @@ sweep:
- param: K
values: [2, 4, 6, 8, 10] # landscape ruggedness (all with parent diversity)
output: {dir: results/E10}
output: {dir: results/figS11_directed_recombination}

View file

@ -36,4 +36,4 @@ sweep:
values: [0.5, 1.0, 2.0]
output:
dir: results/E5
dir: results/figS12_quality_diversity

View file

@ -31,4 +31,4 @@ sweep:
- param: mating.breadth
values: [0.03, 0.08, 0.17, 0.35, 0.6, 1.0]
output: {dir: results/E14}
output: {dir: results/figS13_mating_breadth}

View file

@ -6,7 +6,7 @@ n_replicates: 24
# (Learning-kernel bridge, pro-collapse arm): does neutral Wright-Fisher explain the VAE's
# collapse on MNIST? NO -- and that is the point. This matches the MNIST regime (K=30, n=6000,
# Zipf) where drift is nearly inert: neutral (temperature=1.0) barely moves (H stays ~H*, ~all
# modes alive), yet the real VAE collapsed to a SINGLE mode (results/mnist_collapse). Adding the
# modes alive), yet the real VAE collapsed to a SINGLE mode (results/fig2_mnist_collapse). Adding the
# estimator's sharpening / mode-competition (temperature<1: p ~ p^(1/tau)) reproduces the
# catastrophic collapse. tau=0.8 is calibrated to reproduce collapse-to-one-mode. This is the
# axis Riis (2026) names as future work: the estimator, not the sampling, drives VAE collapse.
@ -26,4 +26,4 @@ sweep:
- param: dynamics.kernel.temperature
values: [1.0, 0.8] # neutral (no collapse) vs sharpened (catastrophic collapse)
output: {dir: results/kernel_sharpen}
output: {dir: results/figS2_kernel_sharpen}

View file

@ -6,7 +6,7 @@ n_replicates: 24
# (Learning-kernel bridge, anti-collapse arm): neutral Wright-Fisher OVER-predicts the RNN's
# collapse. This matches the RNN grounding regime (K=256, n=200, Zipf): neutral (reset=0) drives
# H all the way to 0, but the real RNN only PARTIALLY collapses -- H plateaus ~0.68 of a possible
# 0.88, forward-KL plateaus ~2 (does not diverge), ~half the tail stays alive (results/grounding).
# 0.88, forward-KL plateaus ~2 (does not diverge), ~half the tail stays alive (results/figS6_grounding_rnn).
# The estimator's smoothing / regularisation supplies a diversity FLOOR. A mutation-toward-prior
# knob (reset=u: p <- (1-u)p + u*uniform) reproduces the H-floor. reset=0.006 is calibrated to the
# RNN's stationary dry H. Honest caveat carried in the write-up: uniform-mutation matches the
@ -29,4 +29,4 @@ sweep:
- param: dynamics.kernel.reset
values: [0.0, 0.006] # neutral (H -> 0) vs smoothed (H floors, like the RNN)
output: {dir: results/kernel_smooth}
output: {dir: results/figS2_kernel_smooth}

View file

@ -43,4 +43,4 @@ sweep:
set: {dynamics.grounding.m: 1, dynamics.remint.enabled: false}
output:
dir: results/E6
dir: results/figS3_rebaselining

View file

@ -37,4 +37,4 @@ sweep:
values: [uniform, matched]
output:
dir: results/E3
dir: results/figS5_aimed_grounding

View file

@ -31,4 +31,4 @@ sweep:
values: [0.0, 0.02, 0.05]
output:
dir: results/E4
dir: results/figS8_multiparent_union

View file

@ -26,4 +26,4 @@ sweep:
- param: rho
values: [0.0, 0.5, 1.0] # decorrelated -> identical parents (the control)
output: {dir: results/E8}
output: {dir: results/figS9_specialist_superparent}

View file

@ -26,4 +26,4 @@ sweep:
- param: genotype.recomb_rate
values: [0.0, 1.0] # asexual vs sexual
output: {dir: results/E7}
output: {dir: results/sexual_vs_asexual_lineage}

View file

@ -19,4 +19,4 @@ speciation:
n_offspring: 200
output:
dir: results/E12_nk
dir: results/speciation_bdm_nk

View file

@ -56,4 +56,4 @@ sweep:
values: [0.0, 0.1] # dry vs grounded (VAE collapse is strong; needs ~10% real, cf. grounding)
output:
dir: results/mnist_collapse
dir: results/fig2_mnist_collapse

View file

@ -51,4 +51,4 @@ sweep:
values: [0.0, 0.05]
output:
dir: results/architectures
dir: results/figS1_architectures

View file

@ -63,4 +63,4 @@ sweep:
values: [0.0, 0.005, 0.01, 0.02, 0.035, 0.05, 0.075, 0.1, 0.2]
output:
dir: results/grounding
dir: results/figS6_grounding_rnn

View file

@ -1,11 +1,11 @@
"""Eyeball diagnostic: watch a dry MNIST lineage collapse, generation by generation.
Unlike the `plot_mnist` figure (a pure function of committed parquet), this **re-runs** a short
Unlike the `plot_fig2_mnist_collapse` figure (a pure function of committed parquet), this **re-runs** a short
dry VAE lineage and saves a grid of freshly-generated digits at a few generations, so the
collapse is visible directly early generations show varied digits, late generations degenerate
toward a single blurry mode. Diagnostic only; not part of the reproducible figure set.
Usage: python figures/mnist_montage.py [results/mnist_collapse]
Usage: python figures/mnist_montage.py [results/fig2_mnist_collapse]
"""
from __future__ import annotations
@ -28,7 +28,7 @@ _SNAP_GENS = [0, 4, 8, 12, 15] # generations to snapshot
_COLS = 12 # sample digits per row
def main(out_dir: str = "results/mnist_collapse") -> None:
def main(out_dir: str = "results/fig2_mnist_collapse") -> None:
cfg = MnistCfg()
data = load_mnist(cfg.data_root)
td = make_mnist_truth(cfg)

View file

@ -24,8 +24,8 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
from knowledge.analysis import critical_grounding, reduce_to_stationary # noqa: E402
from knowledge.metrics import heterozygosity # noqa: E402
from inheritance.analysis import critical_grounding, reduce_to_stationary # noqa: E402
from inheritance.metrics import heterozygosity # noqa: E402
from neural.config import SyntheticCfg # noqa: E402
from neural.synthetic import make_mode_truth # noqa: E402

View file

@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
from knowledge.metrics import heterozygosity # noqa: E402
from inheritance.metrics import heterozygosity # noqa: E402
from neural.config import SyntheticCfg # noqa: E402
from neural.synthetic import make_mode_truth # noqa: E402

View file

@ -2,7 +2,7 @@
Shows tail-first collapse under pure neutral drift: geometric H decay matching the
analytic law, tail items dying faster than head items, support -> 1 and forward-KL
diverging. Usage: python figures/plot_E1.py [results/E1]
diverging. Usage: python figures/plot_collapse_null.py [results/collapse_null]
"""
from __future__ import annotations
@ -17,7 +17,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
def main(results_dir: str = "results/E1") -> None:
def main(results_dir: str = "results/collapse_null") -> None:
df, cfg = load_bundle(results_dir)
n = cfg["dynamics"]["n"]
@ -57,7 +57,7 @@ def main(results_dir: str = "results/E1") -> None:
fig.suptitle("E1 — distillation without grounding collapses, tail first", y=1.02)
fig.tight_layout()
savefig(fig, results_dir, "E1")
savefig(fig, results_dir, "collapse_null")
if __name__ == "__main__":

View file

@ -5,7 +5,7 @@ stationary H vs g tracking the exact H_eq, with an operational g* (where H first
0.95·H*) and its bootstrap CI, and g=0 marked as a finite-time artifact; (C) tail coverage
by item-count vs truth-mass both stay low, the deep tail is largely unrescuable at
feasible grounding; (D) per-rarity-band survival the m·p*_i1 threshold made visible
(deep bands lag, motivating E4/E6). Usage: python figures/plot_E2.py [results/E2]
(deep bands lag, motivating E4/E6). Usage: python figures/plot_fig2_grounding_sweep.py [results/fig2_grounding_sweep]
"""
from __future__ import annotations
@ -20,12 +20,12 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
from knowledge.analysis import critical_grounding, reduce_to_stationary # noqa: E402
from knowledge.metrics import heterozygosity # noqa: E402
from knowledge.truth import make_true_distribution # noqa: E402
from inheritance.analysis import critical_grounding, reduce_to_stationary # noqa: E402
from inheritance.metrics import heterozygosity # noqa: E402
from inheritance.truth import make_true_distribution # noqa: E402
def main(results_dir: str = "results/E2") -> None:
def main(results_dir: str = "results/fig2_grounding_sweep") -> None:
df, cfg = load_bundle(results_dir)
n = cfg["dynamics"]["n"]
td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"],
@ -108,7 +108,7 @@ def main(results_dir: str = "results/E2") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E2")
savefig(fig, results_dir, "fig2_grounding_sweep")
if __name__ == "__main__":

View file

@ -10,7 +10,7 @@ Four panels, dry (g=0) vs grounded, mean ± 95% CI across replicates: (A) forwar
(B) support size (distinct modes alive); (C) tail truth-mass alive; (D) heterozygosity. Reads the
committed bundle (parquet) + manifest.json only.
Usage: python figures/plot_mnist.py [results/mnist_collapse]
Usage: python figures/plot_fig2_mnist_collapse.py [results/fig2_mnist_collapse]
"""
from __future__ import annotations
@ -26,7 +26,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
from knowledge.metrics import heterozygosity # noqa: E402
from inheritance.metrics import heterozygosity # noqa: E402
from neural.config import MnistCfg # noqa: E402
from neural.mnist_data import make_mnist_truth # noqa: E402
@ -39,7 +39,7 @@ def _traj(df, g, col):
return gens, grp.mean().to_numpy(), 1.96 * grp.sem().to_numpy()
def main(results_dir: str = "results/mnist_collapse") -> None:
def main(results_dir: str = "results/fig2_mnist_collapse") -> None:
df, cfg = load_bundle(results_dir)
syn = MnistCfg(**cfg["mnist"])
H_star = heterozygosity(make_mnist_truth(syn).p_star)
@ -72,7 +72,7 @@ def main(results_dir: str = "results/mnist_collapse") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "mnist_collapse")
savefig(fig, results_dir, "fig2_mnist_collapse")
if __name__ == "__main__":

View file

@ -13,7 +13,7 @@ almost immediately; (C) the self-consumption signature — conformity minus true
population's mutual agreement exceeds its real capability), largest for no_grounding. Reads only the
committed bundle.
Usage: python figures/plot_E11.py [results/E11]
Usage: python figures/plot_fig4_society_ablation.py [results/fig4_society_ablation]
"""
from __future__ import annotations
@ -32,7 +32,7 @@ _ARMS = [("full", "#2ca02c", "full society"),
("no_grounding", "#d62728", "no grounding (self-consumption)")]
def main(results_dir: str = "results/E11") -> None:
def main(results_dir: str = "results/fig4_society_ablation") -> None:
df, _ = load_bundle(results_dir)
arms = [a for a in _ARMS if a[0] in set(df["arm"].unique())]
g_opt = df["global_opt"].mean()
@ -61,7 +61,7 @@ def main(results_dir: str = "results/E11") -> None:
fig.suptitle("E11 — the dynamic Lamarckian society: grounding + directed sex + diversity climb to "
"the optimum; remove any one and it breaks (the vertical claim, C3)", y=1.02, fontsize=12)
fig.tight_layout()
savefig(fig, results_dir, "E11")
savefig(fig, results_dir, "fig4_society_ablation")
if __name__ == "__main__":

View file

@ -8,7 +8,7 @@ vs divergence — the isolation cliff, moving to lower divergence as epistasis d
epistasis wedge as landscape ruggedness K grows, recombining two adapted local-optimum parents flips
from a gain to outbreeding depression.
Usage: python figures/plot_E12.py
Usage: python figures/plot_fig5_speciation_bdm.py
"""
from __future__ import annotations
@ -30,8 +30,8 @@ def _agg(df, keys, value):
def main() -> None:
bdm, _ = load_bundle("results/E12")
nk, _ = load_bundle("results/E12_nk")
bdm, _ = load_bundle("results/fig5_speciation_bdm")
nk, _ = load_bundle("results/speciation_bdm_nk")
rhos = sorted(bdm["rho"].unique())
colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos)))
@ -72,7 +72,7 @@ def main() -> None:
fig.suptitle("E12 — model speciation: when two diverged models are too incompatible to merge",
y=1.02, fontsize=13)
fig.tight_layout()
savefig(fig, "results/E12", "E12")
savefig(fig, "results/fig5_speciation_bdm", "E12")
if __name__ == "__main__":

View file

@ -12,7 +12,7 @@ Two panels: (A) the risk — mean offspring fitness minus best-parent vs recombi
per ruggedness K (all 0, steeper as K grows); (B) with offspring selection best-of-brood fitness
vs rate per K, showing an intermediate optimum on rugged landscapes. Reads only the bundle.
Usage: python figures/plot_E9.py [results/E9]
Usage: python figures/plot_figS10_rugged_landscapes.py [results/figS10_rugged_landscapes]
"""
from __future__ import annotations
@ -27,7 +27,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
def main(results_dir: str = "results/E9") -> None:
def main(results_dir: str = "results/figS10_rugged_landscapes") -> None:
df, _ = load_bundle(results_dir)
Ks = sorted(df["K"].unique())
rates = sorted(df["rate"].unique())
@ -58,7 +58,7 @@ def main(results_dir: str = "results/E9") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E9")
savefig(fig, results_dir, "figS10_rugged_landscapes")
if __name__ == "__main__":

View file

@ -10,7 +10,7 @@ Two panels: (A) deployed capability vs landscape ruggedness — best single pare
directed sex, and the global optimum; (B) each strategy's edge over the best parent, making the
random-sex collapse and the directed-sex rescue explicit. Reads only the committed bundle.
Usage: python figures/plot_E10.py [results/E10]
Usage: python figures/plot_figS11_directed_recombination.py [results/figS11_directed_recombination]
"""
from __future__ import annotations
@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402
def main(results_dir: str = "results/E10") -> None:
def main(results_dir: str = "results/figS11_directed_recombination") -> None:
df, _ = load_bundle(results_dir)
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
@ -57,7 +57,7 @@ def main(results_dir: str = "results/E10") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E10")
savefig(fig, results_dir, "figS11_directed_recombination")
if __name__ == "__main__":

View file

@ -3,7 +3,7 @@
At matched grounding, greedy (directional) selection drives the lineage toward the
fittest items and collapses diversity, while quality-diversity selection (a novelty bonus
w_i f_i·p_i^{-alpha}) maintains a high stationary heterozygosity that rises with the
novelty exponent alpha. Usage: python figures/plot_E5.py [results/E5]
novelty exponent alpha. Usage: python figures/plot_figS12_quality_diversity.py [results/figS12_quality_diversity]
"""
from __future__ import annotations
@ -18,7 +18,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
def main(results_dir: str = "results/E5") -> None:
def main(results_dir: str = "results/figS12_quality_diversity") -> None:
df, cfg = load_bundle(results_dir)
last = int(cfg["generations"] * 0.8)
@ -72,7 +72,7 @@ def main(results_dir: str = "results/E5") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E5")
savefig(fig, results_dir, "figS12_quality_diversity")
if __name__ == "__main__":

View file

@ -15,7 +15,7 @@ panmictic), one line per landscape ruggedness K:
The tension between (A)/(C) is the result: promiscuity maximises the typical model and kills diversity;
on rugged landscapes the best model needs preserved diversity, so an intermediate breadth wins.
Usage: python figures/plot_E14.py
Usage: python figures/plot_figS13_mating_breadth.py
"""
from __future__ import annotations
@ -30,7 +30,7 @@ from _figlib import load_bundle, savefig, letter_axes # noqa: E402
def main() -> None:
df, _ = load_bundle("results/E14")
df, _ = load_bundle("results/figS13_mating_breadth")
last = df[df["generation"] == df["generation"].max()].copy()
last["best_n"] = last["best_fitness"] / last["global_opt"]
last["mean_n"] = last["mean_fitness"] / last["global_opt"]
@ -60,7 +60,7 @@ def main() -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, "results/E14", "E14")
savefig(fig, "results/figS13_mating_breadth", "E14")
if __name__ == "__main__":

View file

@ -10,7 +10,7 @@ Three panels: (A) forward-KL trajectories per architecture, dry (solid) vs groun
(C) tail-item survival, dry vs grounded, grouped by architecture (all rise). Reads only the
committed bundle.
Usage: python figures/plot_architectures.py [results/architectures]
Usage: python figures/plot_figS1_architectures.py [results/figS1_architectures]
"""
from __future__ import annotations
@ -29,7 +29,7 @@ _ARCH_LABEL = {"histogram": "histogram\n(exact)", "rnn": "GRU\n(autoregressive)"
"mlp": "MLP\n(causal-masked)"}
def main(results_dir: str = "results/architectures") -> None:
def main(results_dir: str = "results/figS1_architectures") -> None:
df, cfg = load_bundle(results_dir)
kinds = [k for k in _ARCH_ORDER if k in set(df["kind"].unique())]
g_dry, g_wet = min(df["g"].unique()), max(df["g"].unique())
@ -74,7 +74,7 @@ def main(results_dir: str = "results/architectures") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "architectures")
savefig(fig, results_dir, "figS1_architectures")
if __name__ == "__main__":

View file

@ -4,7 +4,7 @@ Re-minting freezes the current distribution as the new grounding reference and d
the original truth. Re-minting a collapsed lineage locks in the collapse: KL to the
original truth diverges, because the lost original tails can no longer be grounded.
Gating re-mint on diversity refuses to re-mint while collapsed and keeps KL bounded;
re-minting a healthy lineage is harmless. Usage: python figures/plot_E6.py [results/E6]
re-minting a healthy lineage is harmless. Usage: python figures/plot_figS3_rebaselining.py [results/figS3_rebaselining]
"""
from __future__ import annotations
@ -26,7 +26,7 @@ STYLE = {
}
def main(results_dir: str = "results/E6") -> None:
def main(results_dir: str = "results/figS3_rebaselining") -> None:
df, cfg = load_bundle(results_dir)
period = cfg["dynamics"]["remint"]["period"]
G = cfg["generations"]
@ -69,7 +69,7 @@ def main(results_dir: str = "results/E6") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E6")
savefig(fig, results_dir, "figS3_rebaselining")
if __name__ == "__main__":

View file

@ -3,7 +3,7 @@
Shows that grounding must *overlap* the content it protects. At the same total budget,
uniform grounding spreads thin and lets the exercised region's tail collapse, while
matched grounding concentrates on that region and keeps its rare items alive (at the cost
of the regions it does not touch). Usage: python figures/plot_E3.py [results/E3]
of the regions it does not touch). Usage: python figures/plot_figS5_aimed_grounding.py [results/figS5_aimed_grounding]
Metric: per-region tail-item survival. (Per-region *heterozygosity* is confounded by
region mass under matched grounding, so it is deliberately not used here.)
@ -21,7 +21,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
def main(results_dir: str = "results/E3") -> None:
def main(results_dir: str = "results/figS5_aimed_grounding") -> None:
df, cfg = load_bundle(results_dir)
R = cfg["truth"]["R"]
exercised = cfg["dynamics"]["grounding"]["exercised"]
@ -66,7 +66,7 @@ def main(results_dir: str = "results/E3") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E3")
savefig(fig, results_dir, "figS5_aimed_grounding")
if __name__ == "__main__":

View file

@ -14,7 +14,7 @@ recovery grounding (≈Layer-1's 0.048) and the note that full recovery needs mu
smoothing model; (D) the metric-choice panel H and tail-survival are flat/non-monotone
while forward-KL responds. Reads only the committed bundle.
Usage: python figures/plot_grounding.py [results/grounding]
Usage: python figures/plot_figS6_grounding_rnn.py [results/figS6_grounding_rnn]
"""
from __future__ import annotations
@ -29,8 +29,8 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
from knowledge.analysis import reduce_to_stationary # noqa: E402
from knowledge.metrics import heterozygosity # noqa: E402
from inheritance.analysis import reduce_to_stationary # noqa: E402
from inheritance.metrics import heterozygosity # noqa: E402
from neural.config import SyntheticCfg # noqa: E402
from neural.synthetic import make_mode_truth # noqa: E402
@ -63,7 +63,7 @@ def _recovery_gstar(piv: np.ndarray, gs: np.ndarray, frac: float, seed: int = 7)
return float(pt), float(lo), float(hi)
def main(results_dir: str = "results/grounding") -> None:
def main(results_dir: str = "results/figS6_grounding_rnn") -> None:
df, cfg = load_bundle(results_dir)
syn = SyntheticCfg(**cfg["synthetic"])
H_star = heterozygosity(make_mode_truth(syn).p_star)
@ -133,7 +133,7 @@ def main(results_dir: str = "results/grounding") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "grounding")
savefig(fig, results_dir, "figS6_grounding_rnn")
if __name__ == "__main__":

View file

@ -4,7 +4,7 @@ Three panels tell the honest story: (A) union coverage rises with K_T and decorr
matching the exact closed form (recombination *supplies* the tail); (B) that supply is
realised in the pupil only under a union-preserving merge mean-mixture distillation
dilutes it away (flat in K_T) while max-merge keeps it; (C) the union-surviving gap.
Usage: python figures/plot_E4.py [results/E4]
Usage: python figures/plot_figS8_multiparent_union.py [results/figS8_multiparent_union]
"""
from __future__ import annotations
@ -23,7 +23,7 @@ def U_closed(K_T, rho, q):
return rho * q + (1 - rho) * (1 - (1 - q) ** K_T)
def main(results_dir: str = "results/E4") -> None:
def main(results_dir: str = "results/figS8_multiparent_union") -> None:
df, cfg = load_bundle(results_dir)
q = cfg["coverage"]["q"]
K_Ts = sorted(df["K_T"].unique())
@ -71,7 +71,7 @@ def main(results_dir: str = "results/E4") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E4")
savefig(fig, results_dir, "figS8_multiparent_union")
if __name__ == "__main__":

View file

@ -11,7 +11,7 @@ mean-mixture "model soup" plateau below; (B) the decorrelation control — sexua
count for ρ {0, 0.5, 1}: decorrelated parents (ρ=0) climb to the optimum, identical parents (ρ=1)
buy nothing. Reads only the committed bundle.
Usage: python figures/plot_E8.py [results/E8]
Usage: python figures/plot_figS9_specialist_superparent.py [results/figS9_specialist_superparent]
"""
from __future__ import annotations
@ -26,7 +26,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402
def main(results_dir: str = "results/E8") -> None:
def main(results_dir: str = "results/figS9_specialist_superparent") -> None:
df, cfg = load_bundle(results_dir)
L = cfg["society"]["L"]
rhos = sorted(df["rho"].unique())
@ -60,7 +60,7 @@ def main(results_dir: str = "results/E8") -> None:
fig.tight_layout()
letter_axes(fig)
savefig(fig, results_dir, "E8")
savefig(fig, results_dir, "figS9_specialist_superparent")
if __name__ == "__main__":

View file

@ -13,7 +13,7 @@ one knob of the learning kernel:
estimator REMOVES collapse pressure.
Analytic arms are read from results/kernel_{sharpen,smooth}; the neural reference endpoints
(dashed) are read from the committed results/mnist_collapse and results/grounding parquets so the
(dashed) are read from the committed results/fig2_mnist_collapse and results/figS6_grounding_rnn parquets so the
figure is a pure function of committed artifacts.
Usage: python figures/plot_kernel.py
@ -31,8 +31,8 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
from knowledge.metrics import heterozygosity # noqa: E402
from knowledge.truth import make_true_distribution # noqa: E402
from inheritance.metrics import heterozygosity # noqa: E402
from inheritance.truth import make_true_distribution # noqa: E402
def _mean_traj(df, knob, val, col):
@ -52,8 +52,8 @@ def _neural_dry(results_dir, col, stationary_frac=0.0):
def main() -> None:
sh, sh_cfg = load_bundle("results/kernel_sharpen")
sm, sm_cfg = load_bundle("results/kernel_smooth")
sh, sh_cfg = load_bundle("results/figS2_kernel_sharpen")
sm, sm_cfg = load_bundle("results/figS2_kernel_smooth")
Hstar_sh = heterozygosity(make_true_distribution(
sh_cfg["truth"]["K"], 1, "zipf", 0.5, sh_cfg["truth"]["zipf_s"], 0,
tail_threshold=sh_cfg["truth"]["tail_threshold"]).p_star)
@ -62,10 +62,10 @@ def main() -> None:
tail_threshold=sm_cfg["truth"]["tail_threshold"]).p_star)
# Neural reference endpoints (dashed) from the committed neural runs.
vae_H = _neural_dry("results/mnist_collapse", "heterozygosity")
vae_sup = _neural_dry("results/mnist_collapse", "support_size")
rnn_H = _neural_dry("results/grounding", "heterozygosity", stationary_frac=0.4)
rnn_KL = _neural_dry("results/grounding", "forward_kl", stationary_frac=0.4)
vae_H = _neural_dry("results/fig2_mnist_collapse", "heterozygosity")
vae_sup = _neural_dry("results/fig2_mnist_collapse", "support_size")
rnn_H = _neural_dry("results/figS6_grounding_rnn", "heterozygosity", stationary_frac=0.4)
rnn_KL = _neural_dry("results/figS6_grounding_rnn", "forward_kl", stationary_frac=0.4)
fig, axes = plt.subplots(2, 2, figsize=(13, 9))
NEU, KER = "#1f77b4", "#d62728"
@ -111,7 +111,7 @@ def main() -> None:
ax.legend(frameon=False, fontsize=8)
fig.tight_layout()
for d in ("results/kernel_sharpen", "results/kernel_smooth"):
for d in ("results/figS2_kernel_sharpen", "results/figS2_kernel_smooth"):
letter_axes(fig)
savefig(fig, d, "kernel")

View file

@ -10,7 +10,7 @@ Two panels: (A) mean-fitness adaptation curves, asexual vs sexual, over generati
disequilibrium over generations asexual holds beneficial alleles in disequilibrium (scattered
across genotypes) while sexual drives it to ~0 (assembled), the mechanism of the speed gap.
Usage: python figures/plot_E7.py [results/E7]
Usage: python figures/plot_sexual_vs_asexual_lineage.py [results/sexual_vs_asexual_lineage]
"""
from __future__ import annotations
@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent))
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
def main(results_dir: str = "results/E7") -> None:
def main(results_dir: str = "results/sexual_vs_asexual_lineage") -> None:
df, cfg = load_bundle(results_dir)
L = cfg["genotype"]["L"]
arms = [(0.0, "#7f7f7f", "asexual (clonal)"), (1.0, "#d62728", "sexual (recombining)")]
@ -55,7 +55,7 @@ def main(results_dir: str = "results/E7") -> None:
fig.suptitle("E7 — the advantage of sex: recombination reassorts beneficial alleles that arose "
"in different lineages", y=1.02, fontsize=12)
fig.tight_layout()
savefig(fig, results_dir, "E7")
savefig(fig, results_dir, "sexual_vs_asexual_lineage")
if __name__ == "__main__":

View file

@ -46,9 +46,9 @@
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from knowledge.lineage import run_lineage\n",
"from knowledge.metrics import heterozygosity\n",
"from knowledge.truth import make_true_distribution\n",
"from inheritance.lineage import run_lineage\n",
"from inheritance.metrics import heterozygosity\n",
"from inheritance.truth import make_true_distribution\n",
"\n",
"K, N_SAMPLES = 200, 100 # K items of knowledge; n samples drawn per generation\n",
"print('ready')"
@ -127,7 +127,7 @@
"process — the textbook model of neutral evolution in a finite population of size `n`.\n",
"\n",
"The config below is the same schema the experiments use, so anything you learn here transfers\n",
"directly to `configs/layer1/*.yaml`."
"directly to `configs/inheritance/*.yaml`."
]
},
{
@ -430,7 +430,7 @@
"output_type": "stream",
"text": [
"first swept point retaining 95% of H*: g = 0.091 (m = 10)\n",
"the paper reports g ~ 0.05 for its tested setting; see results/E2 and Fig. 2A\n",
"the paper reports g ~ 0.05 for its tested setting; see results/fig2_grounding_sweep and Fig. 2A\n",
"\n",
"common item (p=1e-02): seen once per batch at m ~ 100 -> P(seen | m=1000) = 100.0%\n",
"rare item (p=1e-03): seen once per batch at m ~ 1,000 -> P(seen | m=1000) = 63.2%\n",
@ -442,7 +442,7 @@
"target = 0.95\n",
"i = int(np.argmax(np.array(sim) >= target * H_star))\n",
"print(f'first swept point retaining {target:.0%} of H*: g = {g[i]:.3f} (m = {ms[i]})')\n",
"print('the paper reports g ~ 0.05 for its tested setting; see results/E2 and Fig. 2A\\n')\n",
"print('the paper reports g ~ 0.05 for its tested setting; see results/fig2_grounding_sweep and Fig. 2A\\n')\n",
"\n",
"for p, label in [(1e-2, 'common'), (1e-3, 'rare'), (1e-4, 'very rare')]:\n",
" need = 1 / p\n",
@ -458,7 +458,7 @@
"## Where to go next\n",
"\n",
"- `02_paper_figures.ipynb` — regenerate every manuscript figure from the committed artifacts.\n",
"- `configs/layer1/E2.yaml` — the full grounding sweep this notebook miniaturises (Fig. 2A).\n",
"- `configs/inheritance/fig2_grounding_sweep.yaml` — the full grounding sweep this notebook miniaturises (Fig. 2A).\n",
"- `REPRODUCING.md` — the map from each paper panel to its config and seed.\n",
"- `tests/test_scientific_validation.py` — these same identities as assertions; if they fail, the\n",
" science is wrong, not just the code."

View file

@ -40,7 +40,7 @@
"import sys, pathlib, json, hashlib\n",
"\n",
"ROOT = pathlib.Path.cwd().parent\n",
"sys.path.insert(0, str(ROOT / 'paper' / 'pnas'))\n",
"sys.path.insert(0, str(ROOT / 'paper' / 'manuscript'))\n",
"\n",
"import make_figs # note: importing this chdir's to the repo root, by design\n",
"from IPython.display import IFrame, display, Markdown\n",
@ -79,18 +79,18 @@
"| Panel | Artifact | Config | Seed(s) |\n",
"|---|---|---|---|\n",
"| Fig. 1A/1B | `schematics (no data)` | `-` | - |\n",
"| Fig. 2A | `results/E2` | `configs/layer1/E2.yaml` | 20260704 |\n",
"| Fig. 2B | `results/mnist_collapse` | `configs/neural/mnist_collapse.yaml` | 20260705 |\n",
"| Fig. 2A | `results/fig2_grounding_sweep` | `configs/inheritance/fig2_grounding_sweep.yaml` | 20260704 |\n",
"| Fig. 2B | `results/fig2_mnist_collapse` | `configs/neural/fig2_mnist_collapse.yaml` | 20260705 |\n",
"| Fig. 3A | `results/llm_merge_seeds` | `configs/llm/merge_seeds.yaml` | 1-5 |\n",
"| Fig. 3B | `results/llm_moe_hard_hpc` | `configs/llm/moe_hard_hpc.yaml` | 1 |\n",
"| Fig. 3C/3D | `results/llm_epistasis(_compat)` | `configs/llm/epistasis*.yaml` | 1-3 |\n",
"| Fig. 4A | `results/E4` | `configs/layer1/E4.yaml` | 20260704 |\n",
"| Fig. 4B | `results/E8` | `configs/layer1/E8.yaml` | 20260705 |\n",
"| Fig. 5A | `results/E9` | `configs/layer1/E9.yaml` | 20260705 |\n",
"| Fig. 5B | `results/E10` | `configs/layer1/E10.yaml` | 20260705 |\n",
"| Fig. 5C/5D | `results/E14` | `configs/layer1/E14.yaml` | 20260709 |\n",
"| Fig. 6A-C | `results/E11` | `configs/layer1/E11.yaml` | 20260705 |\n",
"| Fig. 7A/7B | `results/E12` | `configs/layer1/E12.yaml` | 12 |\n",
"| Fig. 4A | `results/figS8_multiparent_union` | `configs/inheritance/figS8_multiparent_union.yaml` | 20260704 |\n",
"| Fig. 4B | `results/figS9_specialist_superparent` | `configs/inheritance/figS9_specialist_superparent.yaml` | 20260705 |\n",
"| Fig. 5A | `results/figS10_rugged_landscapes` | `configs/inheritance/figS10_rugged_landscapes.yaml` | 20260705 |\n",
"| Fig. 5B | `results/figS11_directed_recombination` | `configs/inheritance/figS11_directed_recombination.yaml` | 20260705 |\n",
"| Fig. 5C/5D | `results/figS13_mating_breadth` | `configs/inheritance/figS13_mating_breadth.yaml` | 20260709 |\n",
"| Fig. 6A-C | `results/fig4_society_ablation` | `configs/inheritance/fig4_society_ablation.yaml` | 20260705 |\n",
"| Fig. 7A/7B | `results/fig5_speciation_bdm` | `configs/inheritance/fig5_speciation_bdm.yaml` | 12 |\n",
"| Fig. 7C | `results/speciation_real` | `configs/neural/speciation_real.yaml` | 13 |\n",
"| Fig. 7D | `results/speciation_real_cliff` | `configs/neural/speciation_real_cliff.yaml` | 13 |\n",
"| Fig. 7E/7F | `results/llm_speciation` | `configs/llm/speciation.yaml` | 1 |"
@ -106,18 +106,18 @@
"source": [
"PROVENANCE = [\n",
" ('Fig. 1A/1B', 'schematics (no data)', '-', '-'),\n",
" ('Fig. 2A', 'results/E2', 'configs/layer1/E2.yaml', '20260704'),\n",
" ('Fig. 2B', 'results/mnist_collapse', 'configs/neural/mnist_collapse.yaml', '20260705'),\n",
" ('Fig. 2A', 'results/fig2_grounding_sweep', 'configs/inheritance/fig2_grounding_sweep.yaml', '20260704'),\n",
" ('Fig. 2B', 'results/fig2_mnist_collapse', 'configs/neural/fig2_mnist_collapse.yaml', '20260705'),\n",
" ('Fig. 3A', 'results/llm_merge_seeds', 'configs/llm/merge_seeds.yaml', '1-5'),\n",
" ('Fig. 3B', 'results/llm_moe_hard_hpc', 'configs/llm/moe_hard_hpc.yaml', '1'),\n",
" ('Fig. 3C/3D', 'results/llm_epistasis(_compat)', 'configs/llm/epistasis*.yaml', '1-3'),\n",
" ('Fig. 4A', 'results/E4', 'configs/layer1/E4.yaml', '20260704'),\n",
" ('Fig. 4B', 'results/E8', 'configs/layer1/E8.yaml', '20260705'),\n",
" ('Fig. 5A', 'results/E9', 'configs/layer1/E9.yaml', '20260705'),\n",
" ('Fig. 5B', 'results/E10', 'configs/layer1/E10.yaml', '20260705'),\n",
" ('Fig. 5C/5D', 'results/E14', 'configs/layer1/E14.yaml', '20260709'),\n",
" ('Fig. 6A-C', 'results/E11', 'configs/layer1/E11.yaml', '20260705'),\n",
" ('Fig. 7A/7B', 'results/E12', 'configs/layer1/E12.yaml', '12'),\n",
" ('Fig. 4A', 'results/figS8_multiparent_union', 'configs/inheritance/figS8_multiparent_union.yaml', '20260704'),\n",
" ('Fig. 4B', 'results/figS9_specialist_superparent', 'configs/inheritance/figS9_specialist_superparent.yaml', '20260705'),\n",
" ('Fig. 5A', 'results/figS10_rugged_landscapes', 'configs/inheritance/figS10_rugged_landscapes.yaml', '20260705'),\n",
" ('Fig. 5B', 'results/figS11_directed_recombination', 'configs/inheritance/figS11_directed_recombination.yaml', '20260705'),\n",
" ('Fig. 5C/5D', 'results/figS13_mating_breadth', 'configs/inheritance/figS13_mating_breadth.yaml', '20260709'),\n",
" ('Fig. 6A-C', 'results/fig4_society_ablation', 'configs/inheritance/fig4_society_ablation.yaml', '20260705'),\n",
" ('Fig. 7A/7B', 'results/fig5_speciation_bdm', 'configs/inheritance/fig5_speciation_bdm.yaml', '12'),\n",
" ('Fig. 7C', 'results/speciation_real', 'configs/neural/speciation_real.yaml','13'),\n",
" ('Fig. 7D', 'results/speciation_real_cliff','configs/neural/speciation_real_cliff.yaml','13'),\n",
" ('Fig. 7E/7F', 'results/llm_speciation', 'configs/llm/speciation.yaml', '1'),\n",
@ -200,7 +200,7 @@
"source": [
"## Regenerate the figures\n",
"\n",
"One call per manuscript figure. Each writes `paper/pnas/figs/<name>.pdf` — exactly the files the\n",
"One call per manuscript figure. Each writes `paper/manuscript/figs/<name>.pdf` — exactly the files the\n",
"manuscript includes, so a rebuilt PDF picks them up unchanged."
]
},
@ -221,46 +221,46 @@
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig1a.pdf\n"
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig1a.pdf\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig1b.pdf\n"
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig1b.pdf\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig2.pdf\n"
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig2.pdf\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig3.pdf\n",
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig4.pdf\n"
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig3.pdf\n",
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig4.pdf\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig5.pdf\n",
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig6.pdf\n"
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig5.pdf\n",
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig6.pdf\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig7.pdf\n",
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig7.pdf\n",
"\n",
"all manuscript figures regenerated into paper/pnas/figs/\n"
"all manuscript figures regenerated into paper/manuscript/figs/\n"
]
}
],
@ -278,7 +278,7 @@
"\n",
"for name, caption in FIGURES:\n",
" getattr(make_figs, name)()\n",
"print('\\nall manuscript figures regenerated into paper/pnas/figs/')"
"print('\\nall manuscript figures regenerated into paper/manuscript/figs/')"
]
},
{
@ -490,7 +490,7 @@
"\n",
"has_poppler = shutil.which('pdftoppm') is not None\n",
"for name, caption in FIGURES:\n",
" pdf = ROOT / 'paper' / 'pnas' / 'figs' / f'{name}.pdf'\n",
" pdf = ROOT / 'paper' / 'manuscript' / 'figs' / f'{name}.pdf'\n",
" display(Markdown(f'### {caption}'))\n",
" if not has_poppler:\n",
" print(f'(install poppler-utils to preview inline) {pdf}'); continue\n",
@ -507,7 +507,7 @@
"source": [
"## Rebuild the manuscript PDF (optional)\n",
"\n",
"`build.py` converts `paper/pnas/main.md` to LaTeX, placing these figures; compiling needs a TeX\n",
"`build.py` converts `paper/manuscript/main.md` to LaTeX, placing these figures; compiling needs a TeX\n",
"toolchain (`tectonic main.tex`), so it is left as a shell step rather than run here."
]
},
@ -528,16 +528,16 @@
"name": "stdout",
"output_type": "stream",
"text": [
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/body.tex\n",
"now: cd paper/pnas && tectonic main.tex\n"
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/body.tex\n",
"now: cd paper/manuscript && tectonic main.tex\n"
]
}
],
"source": [
"import subprocess\n",
"print(subprocess.run([sys.executable, str(ROOT / 'paper' / 'pnas' / 'build.py')],\n",
"print(subprocess.run([sys.executable, str(ROOT / 'paper' / 'manuscript' / 'build.py')],\n",
" capture_output=True, text=True).stdout.strip())\n",
"print('now: cd paper/pnas && tectonic main.tex')"
"print('now: cd paper/manuscript && tectonic main.tex')"
]
}
],

View file

@ -19,11 +19,11 @@ OUT = Path(__file__).resolve().parent / "body.tex"
# Figure references in the text -> (graphics file under figs/, caption).
FIGURES = {
"results/E14/E14.png": ("figs/E14.pdf",
"results/figS13_mating_breadth/E14.png": ("figs/E14.pdf",
"Mating systems (E14): the best mate-pool breadth shrinks as skills get more entangled. "
"(A) best fitness peaks at intermediate breadth on rugged landscapes; (B) the population mean "
"is monotonically favoured by promiscuity; (C) diversity is monotonically destroyed by it."),
"results/E12/E12.png": ("figs/E12.pdf",
"results/fig5_speciation_bdm/E12.png": ("figs/E12.pdf",
"Model speciation, analytic (E12): hybrid fitness vs divergence traces compatible $\\rightarrow$ "
"outbreeding depression $\\rightarrow$ inviability; the isolation cliff arrives earlier the "
"denser the incompatibilities (epistasis), and damage grows super-linearly (the Orr--Turelli "

View file

@ -240,7 +240,7 @@ dynamics:
metrics:
kl_floor: 1.0e-9
output:
dir: results/E2/
dir: results/fig2_grounding_sweep/
save_per_generation: true
```

View file

@ -5,7 +5,7 @@ Adapted from paper/arxiv/md2tex.py (same Markdown subset + pipe tables), with on
codename-free panels re-plotted from the committed artifacts). Run make_figs.py before building when
results change.
Usage: python paper/pnas/build.py && (cd paper/pnas && tectonic main.tex)
Usage: python paper/manuscript/build.py && (cd paper/manuscript && tectonic main.tex)
"""
from __future__ import annotations
@ -27,7 +27,7 @@ from si_figures import SI_FIGURES # noqa: E402 (supplementary figures, numbere
# figure name -> (single publication PDF from make_figs.py, caption)
FIGURES: dict[str, tuple[list[str], str]] = {
"fig1": (["paper/pnas/figs/fig1a.pdf", "paper/pnas/figs/fig1b.pdf"],
"fig1": (["paper/manuscript/figs/fig1a.pdf", "paper/manuscript/figs/fig1b.pdf"],
"A map of the study. (A) Each row is a biological mechanism the paper borrows, each column a level "
"of realism at which it is tested: an inheritance model (an exact simulation of knowledge "
"transmission, green), trained neural networks measured against exact oracles (blue), and language "
@ -42,7 +42,7 @@ FIGURES: dict[str, tuple[list[str], str]] = {
"time, which is what population genetics describes. Dots are capabilities: the rare one (gold) is "
"lost under single-parent inheritance, reassembled by merging complementary parents, and re-supplied "
"by grounding."),
"fig2": (["paper/pnas/figs/fig2.pdf"],
"fig2": (["paper/manuscript/figs/fig2.pdf"],
"How much real data stops model collapse. (A) An image-generating network (a variational "
"autoencoder) is trained on handwritten digits, then a fresh copy is trained only on the digits the "
"previous one drew, for fifteen generations, with no real data added. Each row is a later generation "
@ -58,7 +58,7 @@ FIGURES: dict[str, tuple[list[str], str]] = {
"data's diversity is kept, about 0.05 (bootstrap CI shaded). The hollow point at $g = 0$ has not yet "
"reached its equilibrium of zero. The trained image model needed about twice this fraction, because "
"a trained network is not the exact copier the simulation assumes (Fig.~S2)."),
"fig4": (["paper/pnas/figs/fig4.pdf"],
"fig4": (["paper/manuscript/figs/fig4.pdf"],
"A population of language models over six generations. (A) The set-up. Three lineages start "
"from one frozen 1.5-billion-parameter base (Qwen2.5-1.5B). Each generation, every lineage learns "
"one new skill from a public dataset by continuing to train its parent's adapter (300 new examples "
@ -82,7 +82,7 @@ FIGURES: dict[str, tuple[list[str], str]] = {
"agreement with the crowd instead of on the truth, collapses the population onto a confident but "
"wrong consensus (D, F); removing recombination or diversity preservation strands it below the "
"optimum (D) and drains diversity fastest (E). Each removal fails in its own way."),
"fig5": (["paper/pnas/figs/fig5.pdf"],
"fig5": (["paper/manuscript/figs/fig5.pdf"],
"Model speciation: when two lineages can no longer merge. (A, B) Small image classifiers "
"(multilayer perceptrons) forked from one trained base. Two networks that compute the same function "
"can still differ in their weights, because hidden units can be renumbered and rescaled without "
@ -101,7 +101,7 @@ FIGURES: dict[str, tuple[list[str], str]] = {
"compatible, then crashes, sooner the denser the incompatibilities (E), and the probability of a "
"non-viable hybrid rises with divergence (F). What breaks merging is conflicting conventions on "
"shared machinery, not distance or specialisation as such."),
"fig3": (["paper/pnas/figs/fig3.pdf"],
"fig3": (["paper/manuscript/figs/fig3.pdf"],
"Merging language-model specialists: when it helps, and predicting when it will hurt. All models "
"are built from one frozen base (Qwen2.5) plus a LoRA adapter, a small set of extra weights trained "
"on one family of tasks (list puzzles, string puzzles or arithmetic); a verifier marks every answer "

View file

@ -1,10 +1,10 @@
"""Build the student-level figure guide (figure_legends_for_students.md -> .tex -> PDF).
The Markdown is the source of truth. Lines of the form ``![](path.pdf)`` become figure includes
(paths relative to paper/pnas/); ``## `` headings become unnumbered sections; everything else goes
(paths relative to paper/manuscript/); ``## `` headings become unnumbered sections; everything else goes
through build.py's inline() converter, so the same Markdown subset and unicode handling apply.
Usage: python paper/pnas/build_lay_legends.py && (cd paper/pnas && tectonic figure_legends_for_students.tex)
Usage: python paper/manuscript/build_lay_legends.py && (cd paper/manuscript && tectonic figure_legends_for_students.tex)
"""
from __future__ import annotations

View file

@ -1,6 +1,6 @@
"""Build a Zotero-importable library from the manuscript's reference list.
For each of the numbered references in paper/pnas/main.md: take the DOI printed in the entry when
For each of the numbered references in paper/manuscript/main.md: take the DOI printed in the entry when
there is one, otherwise ask Crossref for it by title (accepting only a high-scoring match whose title
really is the same, checked by normalised comparison). Then fetch authoritative metadata for every
resolved DOI by content negotiation against doi.org, which serves Crossref and DataCite alike, and
@ -9,7 +9,7 @@ write the result as CSL-JSON plus RIS.
Entries whose DOI cannot be resolved (pre-DOI literature, books, chapters) are reported and written
from the manuscript's own metadata so nothing is silently dropped.
Usage: python paper/pnas/build_zotero_library.py
Usage: python paper/manuscript/build_zotero_library.py
"""
from __future__ import annotations

View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

Before After
Before After

View file

@ -93,7 +93,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S1. Collapse and rescue in three different kinds of network
![](figs/si/s1_architectures.pdf)
![](figs/si/s1_figS1_architectures.pdf)
**What was done.** The same generational loop as Figure 2 (train a child only on its parent's output, with or without 5% real data) was run with three generators: an exact histogram (a simple frequency count, no neural network), a recurrent neural network (one that reads and writes sequences one token at a time), and a feed-forward network. Each had to learn a synthetic "universe" of 256 kinds of item whose true frequencies were known exactly, for 22 generations, five times over.
@ -113,7 +113,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S3. Re-baselining a collapsed population locks in the damage
![](figs/si/s3_E6.pdf)
![](figs/si/s3_figS3_rebaselining.pdf)
**What was done.** A tempting shortcut in practice is to declare a model's current output the new "ground truth" and stop keeping the original data. The simulation tests what that does. Two hundred generations in, and again at 300, the population's current frequencies are frozen as the new reference for grounding and the original truth is thrown away (it is kept only to measure against). Four arms: re-baseline while still healthy (green); re-baseline after collapse (red); the same, but only allowed when diversity is above 0.75 (blue); never re-baseline (grey).
@ -123,7 +123,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S4. The full grounding sweep in the simulation
![](figs/si/s4_E2.pdf)
![](figs/si/s4_fig2_grounding_sweep.pdf)
**What was done.** The complete version of the experiment summarised in Figure 2B: 1,000 knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 lineages, and the fraction g of real data swept from 0 to 0.4.
@ -133,7 +133,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S5. Real data protects only the topics it covers
![](figs/si/s5_E3.pdf)
![](figs/si/s5_figS5_aimed_grounding.pdf)
**What was done.** The 1,000 items were divided into ten topics. The same total budget of real data was spent in two ways: spread evenly over all ten topics, or concentrated on a single topic that the experimenter wants to protect.
@ -143,7 +143,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S6. Grounding in a trained recurrent network
![](figs/si/s6_grounding.pdf)
![](figs/si/s6_figS6_grounding_rnn.pdf)
**What was done.** The grounding sweep of Figure S4 repeated in a trained recurrent network rather than the simulation: 256 kinds of item, 200 samples per generation, 30 generations, nine values of g from 0 to 0.2, eighteen repeats.
@ -153,7 +153,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S7. Collapse and rescue on real handwritten digits, in numbers
![](figs/si/s7_mnist_collapse.pdf)
![](figs/si/s7_fig2_mnist_collapse.pdf)
**What was done.** The experiment whose pictures are in Figure 2A, quantified. Thirty kinds of digit, a classifier reading the kind of each drawn digit with 98.5% accuracy, 6,000 drawings per generation, fifteen generations, four repeats, with 0% (red) or 10% (green) real digits mixed in.
@ -163,7 +163,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S8. Averaging parents cancels the benefit of having several; keeping the best of each does not
![](figs/si/s8_E4.pdf)
![](figs/si/s8_figS8_multiparent_union.pdf)
**What was done.** Several parent models each remember a random share of the rare items, and the experimenter controls how similar their shares are (from fully complementary to identical). A child is then built either by averaging the parents' output frequencies, or by keeping, for each item, the largest frequency any parent gives it (a *union*). The child then resamples, as every generation does, and the question is how many rare items survive in it.
@ -173,7 +173,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S9. Many complementary parents can produce an offspring better than any of them
![](figs/si/s9_E8.pdf)
![](figs/si/s9_figS9_specialist_superparent.pdf)
**What was done.** A capability is modelled as a string of twelve yes/no positions (a *genotype* of twelve *loci*), and fitness is the number of positions that are right. Each parent is a specialist: confident and correct on the positions it has mastered, unsure elsewhere, and no parent has mastered them all. Offspring are built from 2 to 12 parents either by averaging or by taking, position by position, the answer of the parent most confident about it.
@ -183,7 +183,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S10. When skills are entangled, blind recombination harms the offspring
![](figs/si/s10_E9.pdf)
![](figs/si/s10_figS10_rugged_landscapes.pdf)
**What was done.** The same twelve-position genotypes, now on a *rugged* landscape (Kauffman's NK model), in which the value of a position depends on what its neighbours hold, with a knob K from 0 (positions independent) to 8 (highly entangled). Parents are local optima found by hill-climbing, the model of a trained specialist. Offspring are made by recombining them at rates from 0 (copy a parent) to 0.5 (free shuffling).
@ -193,7 +193,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S11. Directed sex: choosing and screening offspring rescues recombination
![](figs/si/s11_E10.pdf)
![](figs/si/s11_figS11_directed_recombination.pdf)
**What was done.** Biology is stuck with two random parents and no preview of the offspring. A model population is not: it can pick complementary parents, breed many candidate offspring, test them, keep the fittest and repeat. On the rugged landscapes of Figure S10 three strategies are compared: the best single parent (grey), random recombination (blue) and this *directed* recombination (red, five rounds).
@ -203,7 +203,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S12. Selecting for the best destroys diversity; rewarding novelty preserves it
![](figs/si/s12_E5.pdf)
![](figs/si/s12_figS12_quality_diversity.pdf)
**What was done.** Each generation, the simulation now *selects* which items to keep, all arms receiving the same grounding. Three rules: no selection; *greedy*, keeping the items of highest true probability; and *quality-diversity*, which rewards an item for being rare as well as good, with a knob (alpha) for how much rarity counts.
@ -213,7 +213,7 @@ The supplementary figures are the experiments behind the main text that either r
## Figure S13. Who should mate with whom: mating breadth on rugged landscapes
![](figs/si/s13_E14.pdf)
![](figs/si/s13_figS13_mating_breadth.pdf)
**What was done.** Forty-eight simulated agents sit on a ring. When an offspring is made, its second parent is drawn from a neighbourhood whose width is the knob: narrow (mating only with neighbours, like an isolated village) to the whole ring (anyone can mate with anyone). An offspring replaces the agent at its position only if it is fitter. Ruggedness K is swept from 0 to 10.

View file

@ -105,7 +105,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S1. Collapse and rescue in three different kinds of network}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s1_architectures.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s1_figS1_architectures.pdf}\end{center}
\textbf{What was done.} The same generational loop as Figure 2 (train a child only on its parent's output, with or without 5\% real data) was run with three generators: an exact histogram (a simple frequency count, no neural network), a recurrent neural network (one that reads and writes sequences one token at a time), and a feed-forward network. Each had to learn a synthetic ``universe'' of 256 kinds of item whose true frequencies were known exactly, for 22 generations, five times over.
@ -125,7 +125,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S3. Re-baselining a collapsed population locks in the damage}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s3_E6.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s3_figS3_rebaselining.pdf}\end{center}
\textbf{What was done.} A tempting shortcut in practice is to declare a model's current output the new ``ground truth'' and stop keeping the original data. The simulation tests what that does. Two hundred generations in, and again at 300, the population's current frequencies are frozen as the new reference for grounding and the original truth is thrown away (it is kept only to measure against). Four arms: re-baseline while still healthy (green); re-baseline after collapse (red); the same, but only allowed when diversity is above 0.75 (blue); never re-baseline (grey).
@ -135,7 +135,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S4. The full grounding sweep in the simulation}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s4_E2.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s4_fig2_grounding_sweep.pdf}\end{center}
\textbf{What was done.} The complete version of the experiment summarised in Figure 2B: 1,000 knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 lineages, and the fraction g of real data swept from 0 to 0.4.
@ -145,7 +145,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S5. Real data protects only the topics it covers}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s5_E3.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s5_figS5_aimed_grounding.pdf}\end{center}
\textbf{What was done.} The 1,000 items were divided into ten topics. The same total budget of real data was spent in two ways: spread evenly over all ten topics, or concentrated on a single topic that the experimenter wants to protect.
@ -155,7 +155,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S6. Grounding in a trained recurrent network}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s6_grounding.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s6_figS6_grounding_rnn.pdf}\end{center}
\textbf{What was done.} The grounding sweep of Figure S4 repeated in a trained recurrent network rather than the simulation: 256 kinds of item, 200 samples per generation, 30 generations, nine values of g from 0 to 0.2, eighteen repeats.
@ -165,7 +165,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S7. Collapse and rescue on real handwritten digits, in numbers}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s7_mnist_collapse.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s7_fig2_mnist_collapse.pdf}\end{center}
\textbf{What was done.} The experiment whose pictures are in Figure 2A, quantified. Thirty kinds of digit, a classifier reading the kind of each drawn digit with 98.5\% accuracy, 6,000 drawings per generation, fifteen generations, four repeats, with 0\% (red) or 10\% (green) real digits mixed in.
@ -175,7 +175,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S8. Averaging parents cancels the benefit of having several; keeping the best of each does not}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s8_E4.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s8_figS8_multiparent_union.pdf}\end{center}
\textbf{What was done.} Several parent models each remember a random share of the rare items, and the experimenter controls how similar their shares are (from fully complementary to identical). A child is then built either by averaging the parents' output frequencies, or by keeping, for each item, the largest frequency any parent gives it (a \emph{union}). The child then resamples, as every generation does, and the question is how many rare items survive in it.
@ -185,7 +185,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S9. Many complementary parents can produce an offspring better than any of them}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s9_E8.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s9_figS9_specialist_superparent.pdf}\end{center}
\textbf{What was done.} A capability is modelled as a string of twelve yes/no positions (a \emph{genotype} of twelve \emph{loci}), and fitness is the number of positions that are right. Each parent is a specialist: confident and correct on the positions it has mastered, unsure elsewhere, and no parent has mastered them all. Offspring are built from 2 to 12 parents either by averaging or by taking, position by position, the answer of the parent most confident about it.
@ -195,7 +195,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S10. When skills are entangled, blind recombination harms the offspring}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s10_E9.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s10_figS10_rugged_landscapes.pdf}\end{center}
\textbf{What was done.} The same twelve-position genotypes, now on a \emph{rugged} landscape (Kauffman's NK model), in which the value of a position depends on what its neighbours hold, with a knob K from 0 (positions independent) to 8 (highly entangled). Parents are local optima found by hill-climbing, the model of a trained specialist. Offspring are made by recombining them at rates from 0 (copy a parent) to 0.5 (free shuffling).
@ -205,7 +205,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S11. Directed sex: choosing and screening offspring rescues recombination}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s11_E10.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s11_figS11_directed_recombination.pdf}\end{center}
\textbf{What was done.} Biology is stuck with two random parents and no preview of the offspring. A model population is not: it can pick complementary parents, breed many candidate offspring, test them, keep the fittest and repeat. On the rugged landscapes of Figure S10 three strategies are compared: the best single parent (grey), random recombination (blue) and this \emph{directed} recombination (red, five rounds).
@ -215,7 +215,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S12. Selecting for the best destroys diversity; rewarding novelty preserves it}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s12_E5.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s12_figS12_quality_diversity.pdf}\end{center}
\textbf{What was done.} Each generation, the simulation now \emph{selects} which items to keep, all arms receiving the same grounding. Three rules: no selection; \emph{greedy}, keeping the items of highest true probability; and \emph{quality-diversity}, which rewards an item for being rare as well as good, with a knob (alpha) for how much rarity counts.
@ -225,7 +225,7 @@ The supplementary figures are the experiments behind the main text that either r
\section*{Figure S13. Who should mate with whom: mating breadth on rugged landscapes}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s13_E14.pdf}\end{center}
\begin{center}\includegraphics[width=\textwidth]{figs/si/s13_figS13_mating_breadth.pdf}\end{center}
\textbf{What was done.} Forty-eight simulated agents sit on a ring. When an offspring is made, its second parent is drawn from a neighbourhood whose width is the knob: narrow (mating only with neighbours, like an isolated village) to the whole ring (anyone can mate with anyone). An offspring replaces the agent at its position only if it is fitter. Ruggedness K is swept from 0 to 10.

View file

@ -8,7 +8,7 @@ Figs. 3 and 4 open with a schematic panel explaining the set-up, so a figure is
caption. The per-experiment figures under results/ remain the exploratory versions; these are the
manuscript's.
Usage: python paper/pnas/make_figs.py
Usage: python paper/manuscript/make_figs.py
"""
from __future__ import annotations
@ -26,7 +26,7 @@ import os
os.chdir(ROOT) # load_bundle uses repo-relative paths
from _figlib import load_bundle, load_seed_bundles, mean_ci # noqa: E402
OUT = ROOT / "paper" / "pnas" / "figs"
OUT = ROOT / "paper" / "manuscript" / "figs"
plt.rcParams.update({
"font.size": 8, "axes.labelsize": 8.5, "legend.fontsize": 7, "legend.frameon": False,
@ -348,11 +348,11 @@ def fig1b():
# ---------------------------------------------------------------- fig 2: grounding + MNIST
def fig2():
from knowledge.analysis import critical_grounding, reduce_to_stationary
from knowledge.metrics import heterozygosity
from knowledge.truth import make_true_distribution
from inheritance.analysis import critical_grounding, reduce_to_stationary
from inheritance.metrics import heterozygosity
from inheritance.truth import make_true_distribution
df, cfg = load_bundle("results/E2")
df, cfg = load_bundle("results/fig2_grounding_sweep")
n = cfg["dynamics"]["n"]
td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"],
cfg["truth"]["zipf_s"], 0, tail_threshold=cfg["truth"]["tail_threshold"])
@ -391,7 +391,7 @@ def fig2():
ax = axes[0]
from PIL import Image
im = np.asarray(Image.open("results/mnist_collapse/mnist_montage.png"))
im = np.asarray(Image.open("results/fig2_mnist_collapse/mnist_montage.png"))
# Strip the baked-in title band and left label margin (raster text is unreadable at panel
# size); measured on the committed montage: boxes span y >= 69, x >= 75, row centres below.
top, left = 60, 68
@ -424,7 +424,7 @@ def fig4():
import pandas as pd
from matplotlib.patches import FancyArrowPatch, FancyBboxPatch
df, _ = load_bundle("results/E11")
df, _ = load_bundle("results/fig4_society_ablation")
arms = [("full", "#2ca02c", "full system"),
("no_sex", "#ff7f0e", "no recombination"),
("no_diversity", "#9467bd", "no diversity preservation"),
@ -582,7 +582,7 @@ def fig5():
fig, axes = plt.subplots(2, 3, figsize=(11.4, 8.4), gridspec_kw={"wspace": 0.45, "hspace": 0.75})
fig.subplots_adjust(top=0.9)
bdm, _ = load_bundle("results/E12")
bdm, _ = load_bundle("results/fig5_speciation_bdm")
rhos = sorted(bdm["rho"].unique())
colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos)))

View file

@ -1,6 +1,6 @@
# Zotero library for the manuscript's references
`Evolution of sex for AI.ris` — all 80 references from `paper/pnas/main.md`, with metadata
`Evolution of sex for AI.ris` — all 80 references from `paper/manuscript/main.md`, with metadata
fetched from the publisher of record rather than retyped.
**To import:** Zotero → File → Import… → choose this file → keep "Place imported collections and

View file

@ -1,14 +1,14 @@
"""Renumber the manuscript's references to first-appearance order (PNAS style).
Reads paper/pnas/main.md, finds every parenthesised citation group in the text above
Reads paper/manuscript/main.md, finds every parenthesised citation group in the text above
"## References", derives the order in which references first appear, and rewrites the citation
groups in main.md, si.md, and the figure captions in build.py, then reorders the reference list.
Citation groups are parentheses containing only reference numbers, commas, en-dash ranges, an optional
"cf. " prefix, or a prose prefix ending in a semicolon ("...; 11, 12"). Four-digit numbers (years)
never match, and any number above the list length is reported and left alone.
Usage: python paper/pnas/renumber_refs.py # dry run: mapping + per-file counts
python paper/pnas/renumber_refs.py --apply # rewrite the three files in place
Usage: python paper/manuscript/renumber_refs.py # dry run: mapping + per-file counts
python paper/manuscript/renumber_refs.py --apply # rewrite the three files in place
"""
from __future__ import annotations
@ -18,7 +18,7 @@ import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
MAIN, SI, BUILD = (ROOT / "paper" / "pnas" / n for n in ("main.md", "si.md", "build.py"))
MAIN, SI, BUILD = (ROOT / "paper" / "manuscript" / n for n in ("main.md", "si.md", "build.py"))
REF_HEADER = "## References"
CIT = re.compile(
r"\((?P<pre>[^()]*?;\s*)?(?P<cf>cf\.\s*)?"

View file

@ -217,20 +217,20 @@ and the item-wise maximum rises with it.
|---|---|---|---|---|
| Population collapse in the inheritance model is WrightFisher drift | Closed form; the diagnosis itself is due to prior work | Knowledge is a categorical distribution; refitting means resampling | Closed forms reproduced to <0.5% | Real learners add a signed, architecture-specific estimator bias (measured) |
| Grounding behaves like immigration, and the critical real-data fraction is far below one | Closed form, plus the sign confirmed empirically | Fresh samples from a fixed, non-drifting truth | Exact `H_eq`; `g*≈0.048`; sign holds in RNN/MLP/VAE and on MNIST | Deepest tail unrescuable at feasible budgets (`m 1/p`); sharp threshold softens in trained nets |
| "Merge, don't average" conservation | Exact **for the output-mean operator** | Rare-item regime; an oracle/verifier identifies the strongest source | E4 closed form + simulation; neural reproduction | Weight-averaging and routing are empirical cousins, not instances; budgets differ; bridge = the headroom rule |
| Offspring exceed every parent (FisherMuller) | Interpretation + empirical | Complementary (decorrelated) parents; verifiable fitness | E8 (inheritance model); LoRA merges beat the best specialist overall in every seed at 0.5B (5 seeds) and 7B (3 seeds) | LLM tier: 3 lexically-distinct families |
| Outbreeding depression on rugged landscapes; operator design rule | Biological-model result; hypothesis at LLM scale | NK epistasis stands in for skill entanglement | E9E10; directed selection rescues | Not yet mapped onto a real task-entanglement measure |
| Optimal mate-pool breadth shrinks with ruggedness | Biological-model result; hypothesis for merging populations | Ring population, local selection | E14 | Phenomenon known to island-model evolutionary computation; the contribution here is the mapping and the diversity/mean decomposition |
| "Merge, don't average" conservation | Exact **for the output-mean operator** | Rare-item regime; an oracle/verifier identifies the strongest source | `figS8_multiparent_union` closed form + simulation; neural reproduction | Weight-averaging and routing are empirical cousins, not instances; budgets differ; bridge = the headroom rule |
| Offspring exceed every parent (FisherMuller) | Interpretation + empirical | Complementary (decorrelated) parents; verifiable fitness | `figS9_specialist_superparent` (inheritance model); LoRA merges beat the best specialist overall in every seed at 0.5B (5 seeds) and 7B (3 seeds) | LLM tier: 3 lexically-distinct families |
| Outbreeding depression on rugged landscapes; operator design rule | Biological-model result; hypothesis at LLM scale | NK epistasis stands in for skill entanglement | `figS10_rugged_landscapes`, `figS11_directed_recombination`; directed selection rescues | Not yet mapped onto a real task-entanglement measure |
| Optimal mate-pool breadth shrinks with ruggedness | Biological-model result; hypothesis for merging populations | Ring population, local selection | `figS13_mating_breadth` | Phenomenon known to island-model evolutionary computation; the contribution here is the mapping and the diversity/mean decomposition |
| Merge failure decomposes into a coordinate artefact plus a functional residual | Empirical at the trained-network and language-model tiers | Alignment enumerates the architecture's unit symmetries | Full-symmetry residual ≈ 0 for compatible parents versus ≈ the naive barrier under conflict; a cliff in hybrid fitness; function-specific breakdown at the LLM tier | Scoped to aligned linear interpolation; conflict floor is information-theoretic, not genetic |
| Epistasis (not divergence) sets the cliff; snowball onset | Biological-model result; **hypothesis** at the neural tier | BDM incompatibility structure | E12 | Snowball count ≠ performance cliff without the effect-size link; neural test outstanding |
| Epistasis (not divergence) sets the cliff; snowball onset | Biological-model result; **hypothesis** at the neural tier | BDM incompatibility structure | `fig5_speciation_bdm` | Snowball count ≠ performance cliff without the effect-size link; neural test outstanding |
| Pre-merge functional disagreement predicts merge penalty | Empirical, within a controlled grid (0.5B, 13 conditions × 3 seeds) | Constructed conflict/overlap/duration axes; oracle-potential outcome (pre-registered; ordering sensitive to reference) | Clustered CIs exclude 0; held-out LOCO ρ≈0.4; selected geometry baselines ≈ 0 | Head-to-head predictor differences not individually significant; only selected baselines; generalisation to real task pairs open |
| Confidence weighting improves rank prediction over raw disagreement | Not supported (pre-registered internal prediction) | — | Paired contrast over the same bootstrap resamples: Δ\|ρ\| = 0.021, CI [0.130, +0.059] | The weighting does sharpen the conflict-versus-compatible level contrast, so it is not useless — only no better as a rank predictor |
| The predictor improves budget-matched operator choice | **Open** | — | Soup-vs-route gap readout noise-dominated at 0.5B | The practical payoff; untested |
| Emergent speciation without label conflict | Not observed (pre-registered) | Shared ancestry; compatible tasks; the divergences tested | Residual 0.000 to 6.4× base training; the merge rescues the specialists | Bounds the hypothesis; longer horizons/distribution shift/capacity pressure untested |
| Grounding, recombination, and diversity preservation make complementary contributions | Biological-model result; hypothesis at LLM scale | Conformity stands in for self-consumption | E11 four-arm ablation; each arm fails in a distinct way | General joint necessity is not established; the language-model population (Fig. 4BC) lacks differential reproduction between lineages |
| Grounding, recombination, and diversity preservation make complementary contributions | Biological-model result; hypothesis at LLM scale | Conformity stands in for self-consumption | `fig4_society_ablation` four-arm ablation; each arm fails in a distinct way | General joint necessity is not established; the language-model population (Fig. 4BC) lacks differential reproduction between lineages |
| Obligate recombination collapses once partners carry conflicting conventions | Empirical (1.5B base, 3 lineages × 6 generations, 3 seeds) | Latin-square curriculum; replay present; linear merge; no culling of lineages | Best lineage 0.269 vs 0.796 never merging; onset at complementarity < 0.8; own-ancestor merge 0.663; three alternative mechanisms refuted (SI Text S3) | Six generations; one base; the arrival order of conflicting families is set by the curriculum |
| A declinable merge reverts the population to asexual accumulation without advance knowledge of when to stop | Empirical (same population, plus two controls, 3 seeds each) | "Keep the parent" scored as one candidate on validation data | Fraction declined 0.44 → 1.00 across generations; finishes 0.792 vs 0.796 never merging. Forced stop after generation 2 finishes 0.793 (veto stop3 per seed 0.008/0.006/+0.011). Under a decorrelated curriculum (complementarity 0.00 → 0.70 → 0.00) declines still rise 0.44 → 0.89; pooled partial ρ(declined, complementarity \| generation) = 0.07, CI (0.21, +0.09); partial ρ with generation +0.31 | The reduction-principle reading (declines track complementarity) is **not supported**; declines track generation, which here confounds adapter age, skill count and the arrival of conflicting conventions. Modifier set by evaluation, not evolved |
| Recombination's net benefit across six generations is an early lead, not a final gain | Empirical (same population); consistent with the inheritance model's speed advantage (E7) | Every skill reaches every lineage by the curriculum regardless | +0.08 at generation 0; 0.005 at generation 5 (per-seed 0.03/+0.01/+0.01) | Replay present, so forgetting was not a live pressure; a curriculum that withholds skills from some lineages is untested |
| Recombination's net benefit across six generations is an early lead, not a final gain | Empirical (same population); consistent with the inheritance model's speed advantage | Every skill reaches every lineage by the curriculum regardless | +0.08 at generation 0; 0.005 at generation 5 (per-seed 0.03/+0.01/+0.01) | Replay present, so forgetting was not a live pressure; a curriculum that withholds skills from some lineages is untested |
## SI Table S2: headline quantitative results
@ -240,7 +240,7 @@ per-experiment tables and falsifier status in the per-experiment documentation).
| Result | Setting / n | Outcome definition | Headline |
|---|---|---|---|
| Closed-form validation | Inheritance model; standing tests | Simulated vs closed-form H-decay, immigration equilibrium, multi-parent union | Agreement < 0.5% |
| Grounding retention | Inheritance model (E2); 100 lineages per grounding level | Fraction of equilibrium diversity retained at grounding `g` (operational threshold) | `g ≈ 0.05` retains ≥95% in the tested setting; smooth in `g` |
| Grounding retention | Inheritance model (`fig2_grounding_sweep`); 100 lineages per grounding level | Fraction of equilibrium diversity retained at grounding `g` (operational threshold) | `g ≈ 0.05` retains ≥95% in the tested setting; smooth in `g` |
| MNIST collapse & rescue | Conv-VAE, 4 replicates; frozen oracle (98.5% mode acc.) | Mode support / forward-KL over generations | Dry: 30→1 modes; 10% grounding: 30/30 held |
| FisherMuller in LLMs | 5 seeds (0.5B) and 3 seeds (7B), fixed tests | Merged vs best-specialist accuracy (overall; worst family); ±: 95% CI over seeds | 0.5B ties 0.647±0.027 vs 0.592±0.009; 7B soup 0.873±0.004 vs 0.807±0.038 (soup best +0.066±0.036, 3/3 seeds) |
| Union vs blend (headroom) | 3 seeds (0.5B hard); 3 seeds (7B hard) | Paired per-seed ordering, routing vs weight-average | 0.5B: routing > blend in 3/3 seeds, one catastrophic blend failure avoided. 7B: routing 0.503±0.007 vs soup 0.408±0.021 (+0.094±0.015, 3/3); soup vs best specialist +0.001±0.041 (the seed-1 'soup below best parent' did not replicate). Directed soup +0.073±0.031 (3/3) |
@ -309,20 +309,19 @@ Replicate counts, and why each is what it is:
| Experiment | Replicates | Reasoning |
|---|---|---|
| E1, E2, E3, E5, E6 | 100 lineages | Long horizons (400600 generations) with drift-dominated variance; 100 lineages put the CI on stationary diversity well inside the effect being resolved |
| E4 | 200 | Outcomes are per-item binary retentions, the highest-variance quantity in the paper |
| E7 | 20 | Trajectory contrast (sexual vs asexual adaptation speed), large and monotone |
| E8 | 40 | The vertical claim; the headline separation, so the most replicated of the genotype experiments |
| E9, E10 | 24 | Landscape sweeps where each point aggregates 200 offspring internally |
| E11 | 12 | Four-arm ablation over 80 generations; arms separate by margins far exceeding the CI |
| E12, E12_nk | 15 | Each point already averages 500 (E12) or 200 (E12_nk) offspring |
| E14 | 20 | Breadth × ruggedness grid, 60 generations per cell |
| kernel_sharpen, kernel_smooth | 24 | Two-parameter kernel fits against neural reference endpoints |
| bridge | 60 | The harness gate: must detect *any* departure from the inheritance model, so the most replicated neural run |
| grounding | 18 | Nine-point grounding sweep with per-generation network retraining |
| collapse, architectures | 5 | Sign-level demonstrations across architectures; each lineage retrains a network 2225 times |
| `fig2_grounding_sweep`, `figS5_aimed_grounding`, `figS12_quality_diversity`, `figS3_rebaselining` | 100 lineages | Long horizons (400600 generations) with drift-dominated variance; 100 lineages put the CI on stationary diversity well inside the effect being resolved |
| `figS8_multiparent_union` | 200 | Outcomes are per-item binary retentions, the highest-variance quantity in the paper |
| `figS9_specialist_superparent` | 40 | The vertical claim; the headline separation, so the most replicated of the genotype experiments |
| `figS10_rugged_landscapes`, `figS11_directed_recombination` | 24 | Landscape sweeps where each point aggregates 200 offspring internally |
| `fig4_society_ablation` | 12 | Four-arm ablation over 80 generations; arms separate by margins far exceeding the CI |
| `fig5_speciation_bdm` | 15 | Each point already averages 500 offspring |
| `figS13_mating_breadth` | 20 | Breadth × ruggedness grid, 60 generations per cell |
| `figS2_kernel_sharpen`, `figS2_kernel_smooth` | 24 | Two-parameter kernel fits against neural reference endpoints |
| `bridge` | 60 | The harness gate: must detect *any* departure from the inheritance model, so the most replicated neural run |
| `figS6_grounding_rnn` | 18 | Nine-point grounding sweep with per-generation network retraining |
| `collapse`, `figS1_architectures` | 5 | Sign-level demonstrations across architectures; each lineage retrains a network 2225 times |
| recombination | 8 | Operator contrast in trained weights |
| mnist_collapse | 4 | 15 generations × a conv-VAE retrained from scratch each generation; the contrast (30 modes vs 1) is categorical |
| `fig2_mnist_collapse` | 4 | 15 generations × a conv-VAE retrained from scratch each generation; the contrast (30 modes vs 1) is categorical |
| speciation_real, _cliff | 3 | Barrier decomposition; the quantity is a near-deterministic function of the training condition (residual 0.001 vs 0.497) |
| speciation_real_emergent | 4 | A null: replicates are spent on longer divergence horizons rather than more repeats |
| llm_merge_seeds | 5 training seeds | The FisherMuller signature, the most-replicated language-model claim |
@ -351,30 +350,33 @@ population size in the WrightFisher correspondence and the distillation sampl
reading. Horizons of 400600 generations were chosen so that ungrounded lineages reach fixation and
grounded ones reach stationarity within the run, which the trajectories confirm.
*Sweeps.* E2 sweeps grounding `g ∈ {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}`; E3 contrasts uniform
against region-matched grounding allocation; E4 crosses parent count `K_T ∈ {1,2,3,5}` with parent
correlation `ρ ∈ {0, 0.25, 0.5, 0.75, 1}` and `g ∈ {0, 0.02, 0.05}`; E5 crosses selection mode
(none / greedy / quality-diversity) with novelty weight; E6 compares four re-minting arms.
*Sweeps.* The grounding sweep (`fig2_grounding_sweep`) sweeps `g ∈ {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}`;
the aimed-grounding experiment (`figS5_aimed_grounding`) contrasts uniform against region-matched
grounding allocation; the multi-parent union experiment (`figS8_multiparent_union`) crosses parent count
`K_T ∈ {1,2,3,5}` with parent correlation `ρ ∈ {0, 0.25, 0.5, 0.75, 1}` and `g ∈ {0, 0.02, 0.05}`; the
selection experiment (`figS12_quality_diversity`) crosses selection mode (none / greedy /
quality-diversity) with novelty weight; the re-baselining experiment (`figS3_rebaselining`) compares
four re-minting arms.
*The correlated-parent construction (E4).* Parent correlation is constructed directly rather than
*The correlated-parent construction (`figS8_multiparent_union`).* Parent correlation is constructed directly rather than
obtained by tuning drift, so that `ρ` is not confounded with `n`, `m`, tail size, or generation
count. For each tail item a shared switch `z ~ Bern(ρ)`, a shared retention `s ~ Bern(q)`, and
per-parent `u⁽ᵏ⁾ ~ Bern(q)` give parent `k` retention `s` if `z` else `u⁽ᵏ⁾`. This yields exact
marginal retention `q` and exact pairwise correlation `ρ`, and is exchangeable, so `ρ` is a single
scalar knob.
*Multi-locus experiments (E7E11, E14).* Genotypes are `L = 12` biallelic loci (4096 genotypes —
*Multi-locus experiments* (`figS9_specialist_superparent`, `figS10_rugged_landscapes`,
`figS11_directed_recombination`, `fig4_society_ablation`, `figS13_mating_breadth`). Genotypes are `L = 12` biallelic loci (4096 genotypes —
effectively open-ended relative to the population sizes used), with fitness either additive or a
Kauffman NK landscape whose interaction count `K` tunes ruggedness from 0 to 10. E9 and E10 breed
from `n_parents = 6` local optima into populations of 200 offspring; E10 additionally screens
offspring and iterates (5 rounds, keeping 8). E11 runs a population of `N = 60` agents for 80
Kauffman NK landscape whose interaction count `K` tunes ruggedness from 0 to 10. The landscape and directed-recombination experiments breed
from `n_parents = 6` local optima into populations of 200 offspring; the directed one additionally
screens offspring and iterates (5 rounds, keeping 8). The society ablation runs a population of `N = 60` agents for 80
generations at ruggedness `K = 8`, with mutation `μ = 0.03`, 120 offspring per generation, and
selection weighting true fitness against consensus conformity at `g = 0.85`. E14 sweeps mate-pool
selection weighting true fitness against consensus conformity at `g = 0.85`. The mating-breadth experiment sweeps mate-pool
breadth on a ring of `N = 48` against ruggedness.
*Speciation (E12).* `L = 20` loci, incompatibility density `ρ ∈ {0.1, 0.25, 0.5}`, parental
divergence swept 020 substitutions, 500 offspring per cell at recombination rate 0.5. E12_nk repeats
the question on NK landscapes (`L = 16`, `K` 010, 40 parent pairs, 200 offspring).
*Speciation (`fig5_speciation_bdm`).* `L = 20` loci, incompatibility density `ρ ∈ {0.1, 0.25, 0.5}`,
parental divergence swept 020 substitutions, 500 offspring per cell at recombination rate 0.5.
*Validation.* Three closed forms are asserted as standing tests to within 0.5%: neutral
heterozygosity decay `E[H_t] = H_0(1 1/n)^t`, the exact immigrationdrift equilibrium, and the

View file

@ -1,5 +1,5 @@
% Supplementary Information — readable single-column build (tectonic/XeLaTeX). Content is generated from si.md
% by `python paper/pnas/build.py si`; journal-template reflow happens at submission.
% by `python paper/manuscript/build.py si`; journal-template reflow happens at submission.
\ifdefined\XeTeXversion\else\ifdefined\pdfoutput\pdfoutput=1\fi\fi
\documentclass[11pt]{article}

View file

@ -68,20 +68,20 @@ Both statements are confirmed by simulation in Fig. S8, where mean-mixture survi
Claim & Status & Key assumptions & Evidence & Known limits \\ \hline
Population collapse in the inheritance model is Wright--Fisher drift & Closed form; the diagnosis itself is due to prior work & Knowledge is a categorical distribution; refitting means resampling & Closed forms reproduced to <0.5\% & Real learners add a signed, architecture-specific estimator bias (measured) \\[3pt]
Grounding behaves like immigration, and the critical real-data fraction is far below one & Closed form, plus the sign confirmed empirically & Fresh samples from a fixed, non-drifting truth & Exact \texttt{H\_eq}; \texttt{g*\(\approx\)0.048}; sign holds in RNN/MLP/VAE and on MNIST & Deepest tail unrescuable at feasible budgets (\texttt{m \(\sim\) 1/p}); sharp threshold softens in trained nets \\[3pt]
``Merge, don't average'' conservation & Exact \textbf{for the output-mean operator} & Rare-item regime; an oracle/verifier identifies the strongest source & E4 closed form + simulation; neural reproduction & Weight-averaging and routing are empirical cousins, not instances; budgets differ; bridge = the headroom rule \\[3pt]
Offspring exceed every parent (Fisher--Muller) & Interpretation + empirical & Complementary (decorrelated) parents; verifiable fitness & E8 (inheritance model); LoRA merges beat the best specialist overall in every seed at 0.5B (5 seeds) and 7B (3 seeds) & LLM tier: 3 lexically-distinct families \\[3pt]
Outbreeding depression on rugged landscapes; operator design rule & Biological-model result; hypothesis at LLM scale & NK epistasis stands in for skill entanglement & E9--E10; directed selection rescues & Not yet mapped onto a real task-entanglement measure \\[3pt]
Optimal mate-pool breadth shrinks with ruggedness & Biological-model result; hypothesis for merging populations & Ring population, local selection & E14 & Phenomenon known to island-model evolutionary computation; the contribution here is the mapping and the diversity/mean decomposition \\[3pt]
``Merge, don't average'' conservation & Exact \textbf{for the output-mean operator} & Rare-item regime; an oracle/verifier identifies the strongest source & \texttt{figS8\_multiparent\_union} closed form + simulation; neural reproduction & Weight-averaging and routing are empirical cousins, not instances; budgets differ; bridge = the headroom rule \\[3pt]
Offspring exceed every parent (Fisher--Muller) & Interpretation + empirical & Complementary (decorrelated) parents; verifiable fitness & \texttt{figS9\_specialist\_superparent} (inheritance model); LoRA merges beat the best specialist overall in every seed at 0.5B (5 seeds) and 7B (3 seeds) & LLM tier: 3 lexically-distinct families \\[3pt]
Outbreeding depression on rugged landscapes; operator design rule & Biological-model result; hypothesis at LLM scale & NK epistasis stands in for skill entanglement & \texttt{figS10\_rugged\_landscapes}, \texttt{figS11\_directed\_recombination}; directed selection rescues & Not yet mapped onto a real task-entanglement measure \\[3pt]
Optimal mate-pool breadth shrinks with ruggedness & Biological-model result; hypothesis for merging populations & Ring population, local selection & \texttt{figS13\_mating\_breadth} & Phenomenon known to island-model evolutionary computation; the contribution here is the mapping and the diversity/mean decomposition \\[3pt]
Merge failure decomposes into a coordinate artefact plus a functional residual & Empirical at the trained-network and language-model tiers & Alignment enumerates the architecture's unit symmetries & Full-symmetry residual \(\approx\) 0 for compatible parents versus \(\approx\) the naive barrier under conflict; a cliff in hybrid fitness; function-specific breakdown at the LLM tier & Scoped to aligned linear interpolation; conflict floor is information-theoretic, not genetic \\[3pt]
Epistasis (not divergence) sets the cliff; snowball onset & Biological-model result; \textbf{hypothesis} at the neural tier & BDM incompatibility structure & E12 & Snowball count \(\neq\) performance cliff without the effect-size link; neural test outstanding \\[3pt]
Epistasis (not divergence) sets the cliff; snowball onset & Biological-model result; \textbf{hypothesis} at the neural tier & BDM incompatibility structure & \texttt{fig5\_speciation\_bdm} & Snowball count \(\neq\) performance cliff without the effect-size link; neural test outstanding \\[3pt]
Pre-merge functional disagreement predicts merge penalty & Empirical, within a controlled grid (0.5B, 13 conditions \(\times\) 3 seeds) & Constructed conflict/overlap/duration axes; oracle-potential outcome (pre-registered; ordering sensitive to reference) & Clustered CIs exclude 0; held-out LOCO \(\rho\)\(\approx\)0.4; selected geometry baselines \(\approx\) 0 & Head-to-head predictor differences not individually significant; only selected baselines; generalisation to real task pairs open \\[3pt]
Confidence weighting improves rank prediction over raw disagreement & Not supported (pre-registered internal prediction) & --- & Paired contrast over the same bootstrap resamples: \(\Delta\)\textbackslash{} & \(\rho\)\textbackslash{} \\[3pt]
The predictor improves budget-matched operator choice & \textbf{Open} & --- & Soup-vs-route gap readout noise-dominated at 0.5B & The practical payoff; untested \\[3pt]
Emergent speciation without label conflict & Not observed (pre-registered) & Shared ancestry; compatible tasks; the divergences tested & Residual 0.000 to 6.4\(\times\) base training; the merge rescues the specialists & Bounds the hypothesis; longer horizons/distribution shift/capacity pressure untested \\[3pt]
Grounding, recombination, and diversity preservation make complementary contributions & Biological-model result; hypothesis at LLM scale & Conformity stands in for self-consumption & E11 four-arm ablation; each arm fails in a distinct way & General joint necessity is not established; the language-model population (Fig. 4B--C) lacks differential reproduction between lineages \\[3pt]
Grounding, recombination, and diversity preservation make complementary contributions & Biological-model result; hypothesis at LLM scale & Conformity stands in for self-consumption & \texttt{fig4\_society\_ablation} four-arm ablation; each arm fails in a distinct way & General joint necessity is not established; the language-model population (Fig. 4B--C) lacks differential reproduction between lineages \\[3pt]
Obligate recombination collapses once partners carry conflicting conventions & Empirical (1.5B base, 3 lineages \(\times\) 6 generations, 3 seeds) & Latin-square curriculum; replay present; linear merge; no culling of lineages & Best lineage 0.269 vs 0.796 never merging; onset at complementarity < 0.8; own-ancestor merge 0.663; three alternative mechanisms refuted (SI Text S3) & Six generations; one base; the arrival order of conflicting families is set by the curriculum \\[3pt]
A declinable merge reverts the population to asexual accumulation without advance knowledge of when to stop & Empirical (same population, plus two controls, 3 seeds each) & ``Keep the parent'' scored as one candidate on validation data & Fraction declined 0.44 \(\rightarrow\) 1.00 across generations; finishes 0.792 vs 0.796 never merging. Forced stop after generation 2 finishes 0.793 (veto \(-\) stop3 per seed \(-\)0.008/\(-\)0.006/+0.011). Under a decorrelated curriculum (complementarity 0.00 \(\rightarrow\) 0.70 \(\rightarrow\) 0.00) declines still rise 0.44 \(\rightarrow\) 0.89; pooled partial \(\rho\)(declined, complementarity \textbackslash{} & generation) = \(-\)0.07, CI (\(-\)0.21, +0.09); partial \(\rho\) with generation +0.31 \\[3pt]
Recombination's net benefit across six generations is an early lead, not a final gain & Empirical (same population); consistent with the inheritance model's speed advantage (E7) & Every skill reaches every lineage by the curriculum regardless & +0.08 at generation 0; \(-\)0.005 at generation 5 (per-seed \(-\)0.03/+0.01/+0.01) & Replay present, so forgetting was not a live pressure; a curriculum that withholds skills from some lineages is untested \\[3pt]
Recombination's net benefit across six generations is an early lead, not a final gain & Empirical (same population); consistent with the inheritance model's speed advantage & Every skill reaches every lineage by the curriculum regardless & +0.08 at generation 0; \(-\)0.005 at generation 5 (per-seed \(-\)0.03/+0.01/+0.01) & Replay present, so forgetting was not a live pressure; a curriculum that withholds skills from some lineages is untested \\[3pt]
\hline\end{tabular}\end{center}\medskip
\section*{SI Table S2: headline quantitative results}
@ -93,7 +93,7 @@ Headline quantitative results with sample sizes, uncertainty, and outcome defini
\hline
Result & Setting / n & Outcome definition & Headline \\ \hline
Closed-form validation & Inheritance model; standing tests & Simulated vs closed-form H-decay, immigration equilibrium, multi-parent union & Agreement < 0.5\% \\[3pt]
Grounding retention & Inheritance model (E2); 100 lineages per grounding level & Fraction of equilibrium diversity retained at grounding \texttt{g} (operational threshold) & \texttt{g \(\approx\) 0.05} retains \(\geq\)95\% in the tested setting; smooth in \texttt{g} \\[3pt]
Grounding retention & Inheritance model (\texttt{fig2\_grounding\_sweep}); 100 lineages per grounding level & Fraction of equilibrium diversity retained at grounding \texttt{g} (operational threshold) & \texttt{g \(\approx\) 0.05} retains \(\geq\)95\% in the tested setting; smooth in \texttt{g} \\[3pt]
MNIST collapse \& rescue & Conv-VAE, 4 replicates; frozen oracle (98.5\% mode acc.) & Mode support / forward-KL over generations & Dry: 30\(\rightarrow\)1 modes; 10\% grounding: 30/30 held \\[3pt]
Fisher--Muller in LLMs & 5 seeds (0.5B) and 3 seeds (7B), fixed tests & Merged vs best-specialist accuracy (overall; worst family); \(\pm\): 95\% CI over seeds & 0.5B ties 0.647\(\pm\)0.027 vs 0.592\(\pm\)0.009; 7B soup 0.873\(\pm\)0.004 vs 0.807\(\pm\)0.038 (soup \(-\) best +0.066\(\pm\)0.036, 3/3 seeds) \\[3pt]
Union vs blend (headroom) & 3 seeds (0.5B hard); 3 seeds (7B hard) & Paired per-seed ordering, routing vs weight-average & 0.5B: routing > blend in 3/3 seeds, one catastrophic blend failure avoided. 7B: routing 0.503\(\pm\)0.007 vs soup 0.408\(\pm\)0.021 (+0.094\(\pm\)0.015, 3/3); soup vs best specialist +0.001\(\pm\)0.041 (the seed-1 'soup below best parent' did not replicate). Directed \(-\) soup +0.073\(\pm\)0.031 (3/3) \\[3pt]
@ -141,20 +141,19 @@ Replicate counts, and why each is what it is:
\begin{tabular}{p{0.307\textwidth} p{0.307\textwidth} p{0.307\textwidth}}
\hline
Experiment & Replicates & Reasoning \\ \hline
E1, E2, E3, E5, E6 & 100 lineages & Long horizons (400--600 generations) with drift-dominated variance; 100 lineages put the CI on stationary diversity well inside the effect being resolved \\[3pt]
E4 & 200 & Outcomes are per-item binary retentions, the highest-variance quantity in the paper \\[3pt]
E7 & 20 & Trajectory contrast (sexual vs asexual adaptation speed), large and monotone \\[3pt]
E8 & 40 & The vertical claim; the headline separation, so the most replicated of the genotype experiments \\[3pt]
E9, E10 & 24 & Landscape sweeps where each point aggregates 200 offspring internally \\[3pt]
E11 & 12 & Four-arm ablation over 80 generations; arms separate by margins far exceeding the CI \\[3pt]
E12, E12\_nk & 15 & Each point already averages 500 (E12) or 200 (E12\_nk) offspring \\[3pt]
E14 & 20 & Breadth \(\times\) ruggedness grid, 60 generations per cell \\[3pt]
kernel\_sharpen, kernel\_smooth & 24 & Two-parameter kernel fits against neural reference endpoints \\[3pt]
bridge & 60 & The harness gate: must detect \emph{any} departure from the inheritance model, so the most replicated neural run \\[3pt]
grounding & 18 & Nine-point grounding sweep with per-generation network retraining \\[3pt]
collapse, architectures & 5 & Sign-level demonstrations across architectures; each lineage retrains a network 22--25 times \\[3pt]
\texttt{fig2\_grounding\_sweep}, \texttt{figS5\_aimed\_grounding}, \texttt{figS12\_quality\_diversity}, \texttt{figS3\_rebaselining} & 100 lineages & Long horizons (400--600 generations) with drift-dominated variance; 100 lineages put the CI on stationary diversity well inside the effect being resolved \\[3pt]
\texttt{figS8\_multiparent\_union} & 200 & Outcomes are per-item binary retentions, the highest-variance quantity in the paper \\[3pt]
\texttt{figS9\_specialist\_superparent} & 40 & The vertical claim; the headline separation, so the most replicated of the genotype experiments \\[3pt]
\texttt{figS10\_rugged\_landscapes}, \texttt{figS11\_directed\_recombination} & 24 & Landscape sweeps where each point aggregates 200 offspring internally \\[3pt]
\texttt{fig4\_society\_ablation} & 12 & Four-arm ablation over 80 generations; arms separate by margins far exceeding the CI \\[3pt]
\texttt{fig5\_speciation\_bdm} & 15 & Each point already averages 500 offspring \\[3pt]
\texttt{figS13\_mating\_breadth} & 20 & Breadth \(\times\) ruggedness grid, 60 generations per cell \\[3pt]
\texttt{figS2\_kernel\_sharpen}, \texttt{figS2\_kernel\_smooth} & 24 & Two-parameter kernel fits against neural reference endpoints \\[3pt]
\texttt{bridge} & 60 & The harness gate: must detect \emph{any} departure from the inheritance model, so the most replicated neural run \\[3pt]
\texttt{figS6\_grounding\_rnn} & 18 & Nine-point grounding sweep with per-generation network retraining \\[3pt]
\texttt{collapse}, \texttt{figS1\_architectures} & 5 & Sign-level demonstrations across architectures; each lineage retrains a network 22--25 times \\[3pt]
recombination & 8 & Operator contrast in trained weights \\[3pt]
mnist\_collapse & 4 & 15 generations \(\times\) a conv-VAE retrained from scratch each generation; the contrast (30 modes vs 1) is categorical \\[3pt]
\texttt{fig2\_mnist\_collapse} & 4 & 15 generations \(\times\) a conv-VAE retrained from scratch each generation; the contrast (30 modes vs 1) is categorical \\[3pt]
speciation\_real, \_cliff & 3 & Barrier decomposition; the quantity is a near-deterministic function of the training condition (residual 0.001 vs 0.497) \\[3pt]
speciation\_real\_emergent & 4 & A null: replicates are spent on longer divergence horizons rather than more repeats \\[3pt]
llm\_merge\_seeds & 5 training seeds & The Fisher--Muller signature, the most-replicated language-model claim \\[3pt]
@ -175,13 +174,13 @@ Knowledge is a distribution over \texttt{K} discrete items; reality is a fixed Z
\emph{Parameter choices.} \texttt{K = 500}--\texttt{1000} with \texttt{zipf\_s = 1.1} and half the items designated tail: large enough that the rare tail contains hundreds of items (so tail statistics are not dominated by a handful of them) and small enough to sweep densely. \texttt{n = 100}--\texttt{200} sets drift strength; it is the population size in the Wright--Fisher correspondence and the distillation sample size in the AI reading. Horizons of 400--600 generations were chosen so that ungrounded lineages reach fixation and grounded ones reach stationarity within the run, which the trajectories confirm.
\emph{Sweeps.} E2 sweeps grounding \texttt{g \(\in\) {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}}; E3 contrasts uniform against region-matched grounding allocation; E4 crosses parent count \texttt{K\_T \(\in\) {1,2,3,5}} with parent correlation \texttt{\(\rho\) \(\in\) {0, 0.25, 0.5, 0.75, 1}} and \texttt{g \(\in\) {0, 0.02, 0.05}}; E5 crosses selection mode (none / greedy / quality-diversity) with novelty weight; E6 compares four re-minting arms.
\emph{Sweeps.} The grounding sweep (\texttt{fig2\_grounding\_sweep}) sweeps \texttt{g \(\in\) {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}}; the aimed-grounding experiment (\texttt{figS5\_aimed\_grounding}) contrasts uniform against region-matched grounding allocation; the multi-parent union experiment (\texttt{figS8\_multiparent\_union}) crosses parent count \texttt{K\_T \(\in\) {1,2,3,5}} with parent correlation \texttt{\(\rho\) \(\in\) {0, 0.25, 0.5, 0.75, 1}} and \texttt{g \(\in\) {0, 0.02, 0.05}}; the selection experiment (\texttt{figS12\_quality\_diversity}) crosses selection mode (none / greedy / quality-diversity) with novelty weight; the re-baselining experiment (\texttt{figS3\_rebaselining}) compares four re-minting arms.
\emph{The correlated-parent construction (E4).} Parent correlation is constructed directly rather than obtained by tuning drift, so that \texttt{\(\rho\)} is not confounded with \texttt{n}, \texttt{m}, tail size, or generation count. For each tail item a shared switch \texttt{z \textasciitilde{} Bern(\(\rho\))}, a shared retention \texttt{s \textasciitilde{} Bern(q)}, and per-parent \texttt{u\(^{(k)}\) \textasciitilde{} Bern(q)} give parent \texttt{k} retention \texttt{s} if \texttt{z} else \texttt{u\(^{(k)}\)}. This yields exact marginal retention \texttt{q} and exact pairwise correlation \texttt{\(\rho\)}, and is exchangeable, so \texttt{\(\rho\)} is a single scalar knob.
\emph{The correlated-parent construction (\texttt{figS8\_multiparent\_union}).} Parent correlation is constructed directly rather than obtained by tuning drift, so that \texttt{\(\rho\)} is not confounded with \texttt{n}, \texttt{m}, tail size, or generation count. For each tail item a shared switch \texttt{z \textasciitilde{} Bern(\(\rho\))}, a shared retention \texttt{s \textasciitilde{} Bern(q)}, and per-parent \texttt{u\(^{(k)}\) \textasciitilde{} Bern(q)} give parent \texttt{k} retention \texttt{s} if \texttt{z} else \texttt{u\(^{(k)}\)}. This yields exact marginal retention \texttt{q} and exact pairwise correlation \texttt{\(\rho\)}, and is exchangeable, so \texttt{\(\rho\)} is a single scalar knob.
\emph{Multi-locus experiments (E7--E11, E14).} Genotypes are \texttt{L = 12} biallelic loci (4096 genotypes --- effectively open-ended relative to the population sizes used), with fitness either additive or a Kauffman NK landscape whose interaction count \texttt{K} tunes ruggedness from 0 to 10. E9 and E10 breed from \texttt{n\_parents = 6} local optima into populations of 200 offspring; E10 additionally screens offspring and iterates (5 rounds, keeping 8). E11 runs a population of \texttt{N = 60} agents for 80 generations at ruggedness \texttt{K = 8}, with mutation \texttt{\(\mu\) = 0.03}, 120 offspring per generation, and selection weighting true fitness against consensus conformity at \texttt{g = 0.85}. E14 sweeps mate-pool breadth on a ring of \texttt{N = 48} against ruggedness.
\emph{Multi-locus experiments} (\texttt{figS9\_specialist\_superparent}, \texttt{figS10\_rugged\_landscapes}, \texttt{figS11\_directed\_recombination}, \texttt{fig4\_society\_ablation}, \texttt{figS13\_mating\_breadth}). Genotypes are \texttt{L = 12} biallelic loci (4096 genotypes --- effectively open-ended relative to the population sizes used), with fitness either additive or a Kauffman NK landscape whose interaction count \texttt{K} tunes ruggedness from 0 to 10. The landscape and directed-recombination experiments breed from \texttt{n\_parents = 6} local optima into populations of 200 offspring; the directed one additionally screens offspring and iterates (5 rounds, keeping 8). The society ablation runs a population of \texttt{N = 60} agents for 80 generations at ruggedness \texttt{K = 8}, with mutation \texttt{\(\mu\) = 0.03}, 120 offspring per generation, and selection weighting true fitness against consensus conformity at \texttt{g = 0.85}. The mating-breadth experiment sweeps mate-pool breadth on a ring of \texttt{N = 48} against ruggedness.
\emph{Speciation (E12).} \texttt{L = 20} loci, incompatibility density \texttt{\(\rho\) \(\in\) {0.1, 0.25, 0.5}}, parental divergence swept 0--20 substitutions, 500 offspring per cell at recombination rate 0.5. E12\_nk repeats the question on NK landscapes (\texttt{L = 16}, \texttt{K} 0--10, 40 parent pairs, 200 offspring).
\emph{Speciation (\texttt{fig5\_speciation\_bdm}).} \texttt{L = 20} loci, incompatibility density \texttt{\(\rho\) \(\in\) {0.1, 0.25, 0.5}}, parental divergence swept 0--20 substitutions, 500 offspring per cell at recombination rate 0.5.
\emph{Validation.} Three closed forms are asserted as standing tests to within 0.5\%: neutral heterozygosity decay \texttt{E[H\_t] = H\_0(1 \(-\) 1/n)\textasciicircum{}t}, the exact immigration--drift equilibrium, and the multi-parent union formula. These run in CI alongside the correctness tests. If they fail, the science is wrong rather than merely the code.
@ -236,7 +235,7 @@ Output of \texttt{figures/stats\_llm\_epistasis.py} (clustered CIs, paired predi
Sixteen figures are cited from the main text by number. Each is the per-experiment figure regenerated from the committed results artifact (\texttt{figures/plot\_*.py}), reproduced here without re-plotting, so panel titles still carry the experiment's working name. Five of them are inheritance-model results with no real-model counterpart in this paper, reported here because each reproduces an established result: blending versus union retention (Fig. S8), the Fisher--Muller super-parent (Fig. S9), outbreeding depression on rugged landscapes (Fig. S10), directed recombination (Fig. S11), and the mate-pool breadth optimum (Fig. S13).
\begin{figure}[p]\centering % s1
\includegraphics[width=\textwidth]{figs/si/s1_architectures.pdf}
\includegraphics[width=\textwidth]{figs/si/s1_figS1_architectures.pdf}
\caption{Collapse, and its arrest by real data, in three kinds of generator. The generational loop of Fig.~2 (train a child only on its parent's output, with or without 5\% real data) is run with an exact frequency count (a histogram, no network), a recurrent network and a feed-forward network, on a synthetic universe of 256 knowledge items whose true frequencies are known exactly; 200 samples per generation, 22 generations, 5 replicates. (A) Distance from the true distribution (forward KL divergence, which grows the more of the truth a model fails to cover) against generation: solid lines, with no real data, climb in every architecture; dashed lines, with 5\% real data, stay low. (B) The same distance at the end of the run (error bars over replicates): real data lowers it in all three. (C) The fraction of rare items still alive at the end: real data raises it in all three. The histogram's bars in C are small because a frequency count drops a rare item outright once it is unseen, whereas the networks keep some alive by smoothing (the subject of Fig.~S2). A variational autoencoder was excluded because it failed the generation-0 fidelity check on this task.}\label{s1}
\end{figure}
@ -246,57 +245,57 @@ Sixteen figures are cited from the main text by number. Each is the per-experime
\end{figure}
\begin{figure}[p]\centering % s3
\includegraphics[width=\textwidth]{figs/si/s3_E6.pdf}
\includegraphics[width=\textwidth]{figs/si/s3_figS3_rebaselining.pdf}
\caption{Re-baselining a collapsed population locks in its losses. A tempting shortcut is to declare a model's current output the new reference and discard the original data. In the inheritance model (500 items, 200 samples per generation, 400 generations, 100 replicates) the population's current frequencies are frozen as the new grounding reference at generations 150 and 300 (dotted verticals) and the original truth is kept only for measurement. Four arms: re-baseline while still diverse, under generous real data (green); re-baseline after collapse, under starved real data (red); the same starvation with re-baselining allowed only while heterozygosity is above 0.75 (blue); never re-baseline (grey). (A) Distance from the original truth against generation (bands over replicates): the red arm steps up at each re-baselining and never returns; the healthy arm shows small steps; the gated and never arms coincide. (B) Heterozygosity, with the gate's threshold dashed: the gated arm never re-baselines because it stays below the line. Once rare knowledge is gone from every copy it cannot be rebuilt (Muller's ratchet); a diversity gate prevents the shortcut from making the loss permanent.}\label{s3}
\end{figure}
\begin{figure}[p]\centering % s4
\includegraphics[width=\textwidth]{figs/si/s4_E2.pdf}
\includegraphics[width=\textwidth]{figs/si/s4_fig2_grounding_sweep.pdf}
\caption{The full real-data sweep in the inheritance model (the experiment summarised in Fig.~2B). 1,000 knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 lineages; each generation also receives $m$ fresh real samples, so the real-data share is $g = m/(n+m)$, swept from 0 to 0.4. (A) Heterozygosity against generation, one line per $g$: with no real data it declines steadily; with any real data it levels off. (B) The level it settles at against $g$ (points, simulation) with the exact prediction (dashed) and the real data's own diversity (dotted); the red line marks $g^* = 0.048$ (95\% CI 0.047--0.050), where 95\% of the real data's diversity is kept. The hollow point at $g = 0$ has not converged (its equilibrium is zero). (C) The fraction of the rare tail retained, counted by items (red) and by their share of the truth (purple): both rise with $g$ but stay below 0.1 even at $g = 0.4$. (D) Survival by band of rarity, from the rarest (band 0) to the least rare (band 3): the rarest recover last. Overall diversity is cheap to protect; a rare item persists only once about one real example of it arrives per generation, so protecting it costs about one over its frequency in real samples.}\label{s4}
\end{figure}
\begin{figure}[p]\centering % s5
\includegraphics[width=\textwidth]{figs/si/s5_E3.pdf}
\includegraphics[width=\textwidth]{figs/si/s5_figS5_aimed_grounding.pdf}
\caption{Real data protects only the topics it covers. The 1,000 items are divided into ten topics (regions) and the same total budget of real data is spent either evenly over all ten or concentrated on one topic the experimenter wants to protect; 200 samples per generation, 400 generations, 100 replicates. (A) The fraction of that topic's rare items still alive against generation, with real data aimed at it (blue) or spread evenly (red), bands 95\% CI: aimed grounding holds about half the topic's rare items, spread grounding lets it fall to about 0.07. (B) Survival per topic at the end, same colours, the protected topic marked by the dotted line: aimed grounding protects its topic and leaves the others with no surviving rare items; spread grounding gives every topic the same low survival. Per-topic heterozygosity is confounded by how much of the truth each topic carries, so rare-item survival is the readout. A fixed budget of real data should be aimed at the knowledge one wants to keep.}\label{s5}
\end{figure}
\begin{figure}[p]\centering % s6
\includegraphics[width=\textwidth]{figs/si/s6_grounding.pdf}
\includegraphics[width=\textwidth]{figs/si/s6_figS6_grounding_rnn.pdf}
\caption{The real-data response in a trained recurrent network. The sweep of Fig.~S4 repeated in a recurrent generator rather than the exact simulation: 256 items, 200 samples per generation, 30 generations, $g$ swept over nine values from 0 to 0.2, 18 replicates. (A) Distance from the truth (forward KL divergence) against generation, one line per $g$: more real data suppresses the climb. (B) The final distance against $g$ (error bars 95\% CI), falling steadily from 2.08 with no real data to 0.75 at $g = 0.2$ (paired $t = 3.3$ at $g = 0.2$). (C) The fraction of the achievable improvement each $g$ buys: half of it arrives by $g = 0.040$ (red line; bootstrap 95\% CI 0.004--0.116 shaded), close to the simulation's $g^* = 0.048$ (black dashed), but the full improvement needs $g$ near 0.19. (D) Three ways of measuring collapse on one 0--1 scale: heterozygosity relative to the truth (blue) is flat near 0.8; the count of surviving rare items (orange) rises and falls with no pattern; the divergence-based recovery (green) rises cleanly. The direction of the effect matches the simulation, the threshold softens, and counting surviving items is the wrong ruler for a smoothing network, which keeps inventing rare items that are not in the truth; distance from the truth is the measure used for such networks.}\label{s6}
\end{figure}
\begin{figure}[p]\centering % s7
\includegraphics[width=\textwidth]{figs/si/s7_mnist_collapse.pdf}
\includegraphics[width=\textwidth]{figs/si/s7_fig2_mnist_collapse.pdf}
\caption{Collapse and rescue on real handwritten digits, in numbers (the experiment whose drawings are in Fig.~2A). A convolutional variational autoencoder is retrained from scratch each generation on the previous generation's drawings plus a fraction $g$ of real MNIST digits; the 30 kinds of digit (digit $\times$ stroke thickness, resampled to a long tail with about 18 rare kinds) are read out by a frozen classifier plus a thickness measure at 98.5\% accuracy. Two arms, $g = 0$ (red) and $g = 0.1$ (green); 6,000 drawings per generation, 15 generations, 4 replicates, bands 95\% CI. (A) Distance from the truth rises from about 0.5 to about 18 with no real data and stays near the floor with 10\%. (B) The number of distinct kinds still drawn falls from 30 to about 1 with no real data; with 10\% all 30 survive (dotted line). (C) The share of the rare kinds still alive falls to 0.06 with no real data; with 10\% all of it is kept. (D) Heterozygosity falls to zero with no real data and stays near 0.9 with 10\% (the truth's value dotted). Everything the simulation predicts appears on real images with an independent judge; the dose of real data needed is about twice the simulation's, for the reason shown in Fig.~S2.}\label{s7}
\end{figure}
\begin{figure}[p]\centering % s8
\includegraphics[width=\textwidth]{figs/si/s8_E4.pdf}
\includegraphics[width=\textwidth]{figs/si/s8_figS8_multiparent_union.pdf}
\caption{Averaging several parents cancels the benefit of having several; keeping each parent's strongest contribution does not. In the inheritance model (500 items) $K_T$ parents each remember a random share of the rare items, with the similarity of their shares controlled directly by a correlation $\rho$ (0 fully complementary, 1 identical); $K_T \in \{1, 2, 3, 5\}$, $\rho \in \{0, 0.25, 0.5, 0.75, 1\}$, 200 replicates. A child is built either by averaging the parents' output frequencies or by keeping, for each item, the largest frequency any parent gives it (a union), and then resamples as every generation does. (A) The fraction of the rare tail held by at least one parent against $\rho$, one curve per $K_T$: points are simulation, lines an exact formula, and they match. (B) The fraction that survives in the child: solid lines (union) rise with more and less similar parents; dashed lines (averaging) stay flat near 0.08 whatever the number of parents. (C) The same at $\rho = 0$ against the number of parents (error bars 95\% CI). Averaging dilutes each rare item by the number of parents, which exactly cancels the gain of having more parents to draw on (blending inheritance, the scheme Jenkin showed would swamp rare variants); the union realises the gain, and needs a judge to say which parent holds each item.}\label{s8}
\end{figure}
\begin{figure}[p]\centering % s9
\includegraphics[width=\textwidth]{figs/si/s9_E8.pdf}
\includegraphics[width=\textwidth]{figs/si/s9_figS9_specialist_superparent.pdf}
\caption{Many complementary parents can produce an offspring better than any of them. A capability is a string of twelve yes/no positions (a genotype of twelve loci) and fitness is the number of correct positions; each parent is a specialist, confident and correct (0.9) on the positions it has mastered and unsure (0.45) elsewhere, and no parent has mastered them all. Which positions a parent masters is drawn so that the number of parents $K_T$ and their correlation $\rho$ are independent knobs; the deployed capability is the fitness of the most probable genotype; 40 replicates, error bars 95\% CI. (A) Capability against the number of parents when parents master different positions ($\rho = 0$): position-wise recombination (red) reaches the perfect score of 12 with eight parents; the best single parent (grey) sits near 8.7; the average of the parents (blue) reaches about 11.6 at twelve parents. (B) Recombination against the number of parents at $\rho \in \{0, 0.5, 1\}$: complementary parents climb to the optimum, identical parents stay flat near 6. This is the Fisher--Muller effect, unbounded because a model population is not limited to two parents; Fig.~3B is its counterpart in language models.}\label{s9}
\end{figure}
\begin{figure}[p]\centering % s10
\includegraphics[width=\textwidth]{figs/si/s10_E9.pdf}
\includegraphics[width=\textwidth]{figs/si/s10_figS10_rugged_landscapes.pdf}
\caption{When skills are entangled, blind recombination harms the offspring. The twelve-position genotypes now sit on a rugged landscape (Kauffman's NK model) in which a position's value depends on its neighbours, with ruggedness $K$ from 0 (positions independent) to 8 (highly entangled). Parents are local optima found by hill-climbing, the model of a trained specialist; offspring are made from them at recombination rates from 0 (copy a parent) to 0.5 (free shuffling); 24 replicate landscapes, 200 offspring per point. (A) Mean offspring fitness minus the best parent against recombination rate, one curve per $K$: on a smooth landscape the difference is zero; as $K$ grows the curves fall, more steeply at higher rates, to about $-0.23$ at $K = 8$ under free recombination. (B) The fitness of the best offspring in a brood (parental level dotted): on rugged landscapes it peaks at an intermediate rate and falls back toward the parents under free shuffling. This is outbreeding depression; the optimal amount of recombination shrinks as skills become more entangled.}\label{s10}
\end{figure}
\begin{figure}[p]\centering % s11
\includegraphics[width=\textwidth]{figs/si/s11_E10.pdf}
\includegraphics[width=\textwidth]{figs/si/s11_figS11_directed_recombination.pdf}
\caption{Choosing mates and screening offspring rescues recombination on rugged landscapes. On the landscapes of Fig.~S10 three strategies are compared, all reported as deployed fitness in $[0, 1]$; 24 replicate landscapes, error bars 95\% CI: the best single parent (grey); random recombination, as in biology (blue: random parents, free recombination, offspring taken as they come); and directed recombination, which a model population can do and a living one cannot (red: complementary parents chosen, many offspring generated at rate 0.2, the fittest kept, for five rounds). (A) Capability against ruggedness $K$ with the global optimum dotted: random recombination falls from 0.66 at $K = 2$ to 0.51 at $K = 10$; directed recombination tracks the best parent and the optimum at every $K$. (B) The same as a difference from the best parent: directed stays at or above zero throughout; random falls to about $-0.2$. In language models this is ``breed many merges, keep the best'' (Table~S2).}\label{s11}
\end{figure}
\begin{figure}[p]\centering % s12
\includegraphics[width=\textwidth]{figs/si/s12_E5.pdf}
\includegraphics[width=\textwidth]{figs/si/s12_figS12_quality_diversity.pdf}
\caption{Selecting for the best destroys diversity; rewarding novelty preserves it. Each generation of the inheritance model (500 items, 200 samples per generation, 400 generations, 100 replicates, the same real data in every arm) now selects which items to keep, under three rules: no selection; greedy, keeping the items of highest true probability; and quality-diversity, which rewards an item for being rare as well as good, weighting item $i$ by $f_i p_i^{-\alpha}$ with $\alpha \in \{0.5, 1, 2\}$. (A) Heterozygosity against generation: greedy (red) collapses within a few generations to about 0.01; quality-diversity at $\alpha = 1$ (orange) and $\alpha = 2$ (blue) and no selection (green) hold a plateau above 0.85. (B) The settled heterozygosity against $\alpha$ (orange), with greedy (red dashed) and no selection (green dashed) as references: it rises from about 0.48 at $\alpha = 0.5$ to about 0.88 at $\alpha = 2$. (C) The number of distinct items alive at the end: about 9 under greedy, 14 to 28 under quality-diversity, about 32 with no selection. Chasing the best outputs is a directional pressure on top of drift; diversity has to be an objective in its own right, which is the diversity-preservation ingredient of Fig.~4D--F.}\label{s12}
\end{figure}
\begin{figure}[p]\centering % s13
\includegraphics[width=\textwidth]{figs/si/s13_E14.pdf}
\includegraphics[width=\textwidth]{figs/si/s13_figS13_mating_breadth.pdf}
\caption{Who should mate with whom: the best mating breadth narrows as skills become more entangled. Forty-eight agents carrying twelve-locus genotypes sit on a ring and evolve for 60 generations on an NK landscape of ruggedness $K \in \{0, 3, 6, 10\}$; an offspring's second parent is drawn from a neighbourhood of half-width $\approx bN/2$, so the breadth $b$ runs from mating only with neighbours ($b = 0.03$) to mating with anyone ($b = 1$), and an offspring replaces the agent at its position only if fitter (mutation 0.003, crossover rate 0.5, 20 replicates, error bars 95\% CI, breadth on a logarithmic axis). (A) The best fitness reached, relative to the optimum, against breadth, per $K$: on a smooth landscape every breadth reaches the optimum; at $K = 3$ the best breadth is 0.6, at $K = 6$ and 10 it is 0.35, and mating with everyone falls below it. (B) The population's mean fitness rises with breadth at every $K > 0$. (C) Standing diversity (mean pairwise Hamming distance) falls with breadth, fastest on rugged landscapes. Wide mixing spreads a good variant fast but homogenises the population, so on entangled problems it loses the ability to explore several solutions in parallel (Wright's argument for structured populations).}\label{s13}
\end{figure}

View file

@ -8,7 +8,7 @@ reading.
"""
SI_FIGURES: dict[str, tuple[str, str]] = {
"s1": ("results/architectures/architectures.pdf",
"s1": ("results/figS1_architectures/figS1_architectures.pdf",
"Collapse, and its arrest by real data, in three kinds of generator. The generational loop of "
"Fig.~2 (train a child only on its parent's output, with or without 5\\% real data) is run with an "
"exact frequency count (a histogram, no network), a recurrent network and a feed-forward network, "
@ -22,7 +22,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"rare item outright once it is unseen, whereas the networks keep some alive by smoothing (the "
"subject of Fig.~S2). A variational autoencoder was excluded because it failed the generation-0 "
"fidelity check on this task."),
"s2": ("results/kernel_sharpen/kernel.pdf",
"s2": ("results/figS2_kernel_sharpen/kernel.pdf",
"Why trained networks deviate from the ideal copier, in opposite directions. The inheritance model "
"assumes a child's frequencies are exactly those it sampled from its parent. Two knobs are added to "
"that copying step: a smoothing knob (a small pull toward treating every item as possible; mutation "
@ -40,7 +40,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"appear without being inherited) and the sharpening knob is positive frequency-dependent selection "
"(the majority gains, nothing new appears); a trained network behaves as drift plus one of these two "
"biases, set by its architecture."),
"s3": ("results/E6/E6.pdf",
"s3": ("results/figS3_rebaselining/figS3_rebaselining.pdf",
"Re-baselining a collapsed population locks in its losses. A tempting shortcut is to declare a "
"model's current output the new reference and discard the original data. In the inheritance model "
"(500 items, 200 samples per generation, 400 generations, 100 replicates) the population's current "
@ -54,7 +54,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"dashed: the gated arm never re-baselines because it stays below the line. Once rare knowledge is "
"gone from every copy it cannot be rebuilt (Muller's ratchet); a diversity gate prevents the "
"shortcut from making the loss permanent."),
"s4": ("results/E2/E2.pdf",
"s4": ("results/fig2_grounding_sweep/fig2_grounding_sweep.pdf",
"The full real-data sweep in the inheritance model (the experiment summarised in Fig.~2B). 1,000 "
"knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 "
"lineages; each generation also receives $m$ fresh real samples, so the real-data share is "
@ -68,7 +68,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"of rarity, from the rarest (band 0) to the least rare (band 3): the rarest recover last. Overall "
"diversity is cheap to protect; a rare item persists only once about one real example of it arrives "
"per generation, so protecting it costs about one over its frequency in real samples."),
"s5": ("results/E3/E3.pdf",
"s5": ("results/figS5_aimed_grounding/figS5_aimed_grounding.pdf",
"Real data protects only the topics it covers. The 1,000 items are divided into ten topics "
"(regions) and the same total budget of real data is spent either evenly over all ten or "
"concentrated on one topic the experimenter wants to protect; 200 samples per generation, 400 "
@ -80,7 +80,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"grounding gives every topic the same low survival. Per-topic heterozygosity is confounded by how "
"much of the truth each topic carries, so rare-item survival is the readout. A fixed budget of real "
"data should be aimed at the knowledge one wants to keep."),
"s6": ("results/grounding/grounding.pdf",
"s6": ("results/figS6_grounding_rnn/figS6_grounding_rnn.pdf",
"The real-data response in a trained recurrent network. The sweep of Fig.~S4 repeated in a "
"recurrent generator rather than the exact simulation: 256 items, 200 samples per generation, 30 "
"generations, $g$ swept over nine values from 0 to 0.2, 18 replicates. (A) Distance from the truth "
@ -95,7 +95,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"direction of the effect matches the simulation, the threshold softens, and counting surviving items "
"is the wrong ruler for a smoothing network, which keeps inventing rare items that are not in the "
"truth; distance from the truth is the measure used for such networks."),
"s7": ("results/mnist_collapse/mnist_collapse.pdf",
"s7": ("results/fig2_mnist_collapse/fig2_mnist_collapse.pdf",
"Collapse and rescue on real handwritten digits, in numbers (the experiment whose drawings are in "
"Fig.~2A). A convolutional variational autoencoder is retrained from scratch each generation on the "
"previous generation's drawings plus a fraction $g$ of real MNIST digits; the 30 kinds of digit "
@ -109,7 +109,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"data and stays near 0.9 with 10\\% (the truth's value dotted). Everything the simulation predicts "
"appears on real images with an independent judge; the dose of real data needed is about twice the "
"simulation's, for the reason shown in Fig.~S2."),
"s8": ("results/E4/E4.pdf",
"s8": ("results/figS8_multiparent_union/figS8_multiparent_union.pdf",
"Averaging several parents cancels the benefit of having several; keeping each parent's strongest "
"contribution does not. In the inheritance model (500 items) $K_T$ parents each remember a random "
"share of the rare items, with the similarity of their shares controlled directly by a correlation "
@ -124,7 +124,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"dilutes each rare item by the number of parents, which exactly cancels the gain of having more "
"parents to draw on (blending inheritance, the scheme Jenkin showed would swamp rare variants); the "
"union realises the gain, and needs a judge to say which parent holds each item."),
"s9": ("results/E8/E8.pdf",
"s9": ("results/figS9_specialist_superparent/figS9_specialist_superparent.pdf",
"Many complementary parents can produce an offspring better than any of them. A capability is a "
"string of twelve yes/no positions (a genotype of twelve loci) and fitness is the number of correct "
"positions; each parent is a specialist, confident and correct (0.9) on the positions it has "
@ -138,7 +138,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"$\\rho \\in \\{0, 0.5, 1\\}$: complementary parents climb to the optimum, identical parents stay "
"flat near 6. This is the Fisher--Muller effect, unbounded because a model population is not limited "
"to two parents; Fig.~3B is its counterpart in language models."),
"s10": ("results/E9/E9.pdf",
"s10": ("results/figS10_rugged_landscapes/figS10_rugged_landscapes.pdf",
"When skills are entangled, blind recombination harms the offspring. The twelve-position genotypes "
"now sit on a rugged landscape (Kauffman's NK model) in which a position's value depends on its "
"neighbours, with ruggedness $K$ from 0 (positions independent) to 8 (highly entangled). Parents are "
@ -150,7 +150,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"the best offspring in a brood (parental level dotted): on rugged landscapes it peaks at an "
"intermediate rate and falls back toward the parents under free shuffling. This is outbreeding "
"depression; the optimal amount of recombination shrinks as skills become more entangled."),
"s11": ("results/E10/E10.pdf",
"s11": ("results/figS11_directed_recombination/figS11_directed_recombination.pdf",
"Choosing mates and screening offspring rescues recombination on rugged landscapes. On the "
"landscapes of Fig.~S10 three strategies are compared, all reported as deployed fitness in "
"$[0, 1]$; 24 replicate landscapes, error bars 95\\% CI: the best single parent (grey); random "
@ -162,7 +162,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"the optimum at every $K$. (B) The same as a difference from the best parent: directed stays at or "
"above zero throughout; random falls to about $-0.2$. In language models this is ``breed many "
"merges, keep the best'' (Table~S2)."),
"s12": ("results/E5/E5.pdf",
"s12": ("results/figS12_quality_diversity/figS12_quality_diversity.pdf",
"Selecting for the best destroys diversity; rewarding novelty preserves it. Each generation of the "
"inheritance model (500 items, 200 samples per generation, 400 generations, 100 replicates, the same "
"real data in every arm) now selects which items to keep, under three rules: no selection; greedy, "
@ -176,7 +176,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = {
"alive at the end: about 9 under greedy, 14 to 28 under quality-diversity, about 32 with no "
"selection. Chasing the best outputs is a directional pressure on top of drift; diversity has to be "
"an objective in its own right, which is the diversity-preservation ingredient of Fig.~4D--F."),
"s13": ("results/E14/E14.pdf",
"s13": ("results/figS13_mating_breadth/figS13_mating_breadth.pdf",
"Who should mate with whom: the best mating breadth narrows as skills become more entangled. "
"Forty-eight agents carrying twelve-locus genotypes sit on a ring and evolve for 60 generations on "
"an NK landscape of ruggedness $K \\in \\{0, 3, 6, 10\\}$; an offspring's second parent is drawn "

View file

@ -1,7 +1,7 @@
# Response to the third review (of the PNAS-format draft)
*All five priority fixes are made, plus the presentation items. The revised draft is
`paper/pnas/main.md` (rebuilt PDF alongside); the long-form document and the results documentation
`paper/manuscript/main.md` (rebuilt PDF alongside); the long-form document and the results documentation
were corrected wherever they carried the same overstatements. Point-by-point:*
## 1. The averaging proposition (your §2) — you are right, and the text now proves what it claims

View file

@ -365,7 +365,7 @@ prematurely converges onto one basin and finds a *worse* champion, while pure mo
Throughout, wide mating lifts the *typical* model but monotonically **destroys diversity** — so on rugged
problems, where the best model needs preserved diversity to be found, structured (partly monogamous)
merging wins. The design rule extends the one above: *merge widely when skills are additive; keep
structured sub-populations — island-style merging — when skills are rugged.* (Figure: `results/E14/E14.png`.)
structured sub-populations — island-style merging — when skills are rugged.* (Figure: `results/figS13_mating_breadth/E14.png`.)
*AI can do sex better than biology can.* Biology is stuck with two parents, mating roughly at random,
and cannot inspect an offspring before it is born. An AI has none of those limits. It can recombine
@ -423,7 +423,7 @@ increasing specialisation eventually breaks merging and that one should then rou
trained models is a coordinate artefact removable by aligning neurons (Git Re-Basin — Ainsworth et al.,
2022). What the frame adds is the *theory* of the phenomenon they observe: its functional form, its
super-linear (snowball) onset, and its dependence on epistasis — merge failure as a DobzhanskyMuller
event. (Figure: `results/E12/E12.png`.)
event. (Figure: `results/fig5_speciation_bdm/E12.png`.)
**The real-weight confirmation.** The obvious objection to the analytic model is that its
"incompatibility" is a re-labelled loss barrier, and loss barriers between independently trained

Some files were not shown because too many files have changed in this diff Show more