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:
parent
84124de143
commit
ab3dc10587
240 changed files with 477 additions and 476 deletions
12
CLAUDE.md
12
CLAUDE.md
|
|
@ -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
|
## Current state: Layer 1 complete; Layer 1.5 (neural) in progress
|
||||||
|
|
||||||
- **Layer 1** (`src/knowledge/`) — **complete and validated.** All six experiments E1–E6, the
|
- **Layer 1** (`src/inheritance/`) — **complete and validated.** All six experiments E1–E6, the
|
||||||
closed-form scientific-validation tests, figures, and reproducibility harness exist. Headline:
|
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
|
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.
|
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
|
## Two layers, staged by cost
|
||||||
|
|
||||||
- **Layer 1 — analytical core** (`src/knowledge/`). Pure NumPy/SciPy Wright–Fisher 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 Wright–Fisher 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. 1** — neutral heterozygosity decay: `E[Hₜ] = H₀(1 − 1/n)ᵗ`.
|
||||||
- **Pred. 3** — *exact* mutation–drift equilibrium for the implemented immigration model: `H_eq = H* · m(2n+m−1)/(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. 3** — *exact* mutation–drift equilibrium for the implemented immigration model: `H_eq = H* · m(2n+m−1)/(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−(1−q)^K_T)]` (expected tail items retained by ≥1 of K_T teachers).
|
- **Pred. 5** — closed-form recombination benefit: `U(K_T, ρ, q) = T[ρq + (1−ρ)(1−(1−q)^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, 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 Wright–Fisher 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 Wright–Fisher 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 = Wright–Fisher 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 Wright–Fisher", 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 immigration–drift 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.
|
**Strategic positioning vs Riis 2026 (arXiv:2604.08554, "Drift and selection in LLM text ecosystems").** Riis independently formalizes **collapse = Wright–Fisher 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 Wright–Fisher", 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 immigration–drift 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 / Fisher–Muller:** 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, 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 / Fisher–Muller:** 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 + (1−g)·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; conformity−true gap ≈0.5). This integrates E1–E6 + the kernel + E7–E10 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 + (1−g)·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; conformity−true gap ≈0.5). This integrates E1–E6 + the kernel + E7–E10 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.
|
**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
|
./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)
|
## Non-negotiable engineering standard (blueprint §4)
|
||||||
|
|
||||||
|
|
|
||||||
40
Makefile
40
Makefile
|
|
@ -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`.
|
# 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 \
|
llm-epistasis llm-society llm-society-calib llm-society-calib-b llm-society-v2-smoke \
|
||||||
figures paper-figures paper notebooks clean
|
figures paper-figures paper notebooks clean
|
||||||
|
|
||||||
env: ## build .venv from the committed lockfile
|
env: ## build .venv from the committed lockfile
|
||||||
uv sync --extra dev
|
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
|
uv sync --extra dev --extra neural
|
||||||
|
|
||||||
env-mnist: ## add torchvision for the real-MNIST confirmation tier
|
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)
|
test: ## correctness tests + scientific-validation tests (the spine of trust)
|
||||||
uv run pytest
|
uv run pytest
|
||||||
|
|
||||||
layer1: ## run experiments E1-E6 + the learning-kernel bridge (analytic)
|
inheritance: ## run every inheritance-model experiment (analytic; bitwise reproducible)
|
||||||
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
|
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*) ;; \
|
for c in configs/neural/*.yaml; do case "$$c" in *mnist*|*speciation_real*) ;; \
|
||||||
*) uv run python -m neural.experiment "$$c" ;; esac; done
|
*) uv run python -m neural.experiment "$$c" ;; esac; done
|
||||||
|
|
||||||
mnist: ## run the torchvision tiers: MNIST collapse + E13 real-weight speciation (needs env-mnist)
|
mnist: ## run the torchvision tiers: MNIST collapse + real-weight speciation (needs env-mnist)
|
||||||
uv run python -m neural.experiment configs/neural/mnist_collapse.yaml
|
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.yaml
|
||||||
uv run python -m neural.experiment configs/neural/speciation_real_cliff.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
|
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)
|
env-llm: ## add the LLM stack for the Layer-2 prototype (GPU; transformers/peft)
|
||||||
uv sync --extra dev --extra neural --extra llm
|
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/moe_hard_seeds.yaml
|
||||||
uv run python -m llm.experiment configs/llm/directed_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)
|
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 MPLBACKEND=Agg uv run python "$$p"; 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
|
|
||||||
|
|
||||||
paper-figures: ## regenerate the manuscript figures (Fig. 1-7) and rebuild the PDF bodies
|
paper-figures: ## regenerate the manuscript figures (Fig. 1-5) and rebuild the PDF bodies
|
||||||
MPLBACKEND=Agg uv run python paper/pnas/make_figs.py
|
MPLBACKEND=Agg uv run python paper/manuscript/make_figs.py
|
||||||
uv run python paper/pnas/build.py
|
uv run python paper/manuscript/build.py
|
||||||
uv run python paper/pnas/build.py si
|
uv run python paper/manuscript/build.py si
|
||||||
|
|
||||||
paper: paper-figures ## figures + compile both PDFs (needs tectonic)
|
paper: paper-figures ## figures + compile both PDFs (needs tectonic)
|
||||||
cd paper/pnas && tectonic main.tex && tectonic si.tex
|
cd paper/manuscript && tectonic main.tex && tectonic si.tex
|
||||||
uv run python paper/pnas/build_lay_legends.py && cd paper/pnas && tectonic figure_legends_for_students.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
|
env-notebooks: ## add Jupyter for the walkthrough notebooks
|
||||||
uv sync --extra dev --extra 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 \
|
for nb in notebooks/*.ipynb; do uv run jupyter nbconvert --to notebook --execute \
|
||||||
--inplace --ExecutePreprocessor.timeout=1800 "$$nb"; done
|
--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__
|
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
|
||||||
|
|
|
||||||
21
README.md
21
README.md
|
|
@ -12,7 +12,7 @@ The framework is developed at three tiers of increasing realism:
|
||||||
|
|
||||||
| Tier | What it is | Hardware |
|
| Tier | What it is | Hardware |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **Biological model** | Wright–Fisher simulator over knowledge distributions; closed forms, bitwise reproducible | laptop |
|
| **Inheritance model** | Wright–Fisher 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 |
|
| **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 |
|
| **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
|
```bash
|
||||||
curl -LsSf https://astral.sh/uv/install.sh | sh # one-time, if needed
|
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
|
./reproduce.sh --with-gpu # ... and the trained-network + language-model tiers
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -34,9 +34,9 @@ Or tier by tier:
|
||||||
```bash
|
```bash
|
||||||
make env # build .venv from the committed, hash-pinned uv.lock
|
make env # build .venv from the committed, hash-pinned uv.lock
|
||||||
make test # correctness + closed-form scientific validation (the spine of trust)
|
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 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`.
|
`make help` is not defined, but every target carries a `##` description — `grep '##' Makefile`.
|
||||||
|
|
@ -56,20 +56,21 @@ make env-notebooks && jupyter lab notebooks/
|
||||||
## Layout
|
## Layout
|
||||||
|
|
||||||
```
|
```
|
||||||
src/knowledge/ biological-model tier (imported as `knowledge`)
|
src/inheritance/ inheritance-model tier (imported as `inheritance`)
|
||||||
src/neural/ trained-network tier
|
src/neural/ trained-network tier
|
||||||
src/llm/ language-model 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
|
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
|
notebooks/ executable walkthroughs
|
||||||
hpc/ PBS job scripts for the 7B tier (Imperial CX3)
|
hpc/ PBS job scripts for the 7B tier (Imperial CX3)
|
||||||
tests/ correctness + test_scientific_validation.py (the closed forms as assertions)
|
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`
|
Development history, design documents, pre-registrations and exploratory experiments that did not
|
||||||
(plain-language + technical summary of every result).
|
reach the manuscript live on the `dev` branch; `main` holds only what reproduces the paper.
|
||||||
|
|
||||||
## The engineering contract
|
## The engineering contract
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
in are listed below. If something in the paper is not traceable through this document, that is a
|
||||||
bug — please open an issue.
|
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
|
```bash
|
||||||
make test # correctness + closed-form scientific validation
|
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 neural # trained networks (needs a GPU)
|
||||||
make mnist # real-MNIST tier + the Fig. 2A montage asset (needs torchvision)
|
make mnist # real-MNIST tier + the Fig. 2A montage asset (needs torchvision)
|
||||||
make llm # language-model prototypes (needs a GPU)
|
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
|
## 4. The figure map
|
||||||
|
|
||||||
Every manuscript panel, the artifact it is plotted from, the config that produced that artifact, and
|
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** —
|
`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.
|
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) |
|
| Panel | Drawn by | From artifact | Produced by config | Seed(s) |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| Fig. 1A, 1B | `fig1a()`, `fig1b()` | — (schematics; icons in `paper/pnas/figs/icons/`) | — | — |
|
| Fig. 1A, 1B | `fig1a()`, `fig1b()` | — (schematics; icons in `paper/manuscript/figs/icons/`) | — | — |
|
||||||
| Fig. 2A | `fig2()` | `results/mnist_collapse/mnist_montage.png` | `configs/neural/mnist_collapse.yaml` → asset from `figures/mnist_montage.py` | 20260705 |
|
| 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/E2/` | `configs/layer1/E2.yaml` | 20260704 |
|
| 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/pnas/figs/icons/`) | — | — |
|
| 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. 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 2–3 via `hpc/llm_7b_seeds.pbs`); statistics `figures/stats_llm_7b_seeds.py` | 1, 2, 3 |
|
| Fig. 3C | `fig3()` | `results/llm_moe_hard_hpc/s{1,2,3}/` | `configs/llm/moe_hard_hpc.yaml` (7B, HPC; seeds 2–3 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 |
|
| 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. 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. 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` | 1–5; 1–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` | 1–5; 1–3 |
|
||||||
| 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. 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. 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 2–3 via `hpc/llm_speciation_seeds.pbs`); statistics `figures/stats_llm_speciation_seeds.py` | 1, 2, 3 |
|
| Fig. 5C, 5D | `fig5()` | `results/llm_speciation/s{1,2,3}/` | `configs/llm/speciation.yaml` (seeds 2–3 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
|
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.
|
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
|
**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
|
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), Fisher–Muller super-parent (E8), outbreeding
|
per-experiment figures: blending vs union (`figS8_multiparent_union`), Fisher–Muller super-parent
|
||||||
depression (E9), directed recombination (E10), and mate-pool breadth (E14), drawn by
|
(`figS9_specialist_superparent`), outbreeding depression (`figS10_rugged_landscapes`), directed
|
||||||
`figures/plot_E{4,8,9,10,14}.py` from `results/E{4,8,9,10,14}/`.
|
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 12–100 internal
|
**Replication.** Every panel is replicated: inheritance-model panels over 12–100 internal
|
||||||
replicates; Fig. 3B over five training seeds; Fig. 3C, 3D–E, 4A–B and 5C–D over three (Fig. 5C–D
|
replicates; Fig. 3B over five training seeds; Fig. 3C, 3D–E, 4A–B and 5C–D over three (Fig. 5C–D
|
||||||
|
|
@ -106,18 +112,15 @@ was single-seed until 2026-09-12; seeds 2–3 ran via `hpc/llm_speciation_seeds.
|
||||||
|
|
||||||
| Result | Artifact | Config | Seed |
|
| Result | Artifact | Config | Seed |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Collapse null (E1) | `results/E1/` | `configs/layer1/E1.yaml` | 20260704 |
|
| Region-matched grounding (Fig. S5) | `results/figS5_aimed_grounding/` | `configs/inheritance/figS5_aimed_grounding.yaml` | 20260704 |
|
||||||
| Region-matched grounding (E3) | `results/E3/` | `configs/layer1/E3.yaml` | 20260704 |
|
| Quality-diversity vs greedy (Fig. S12) | `results/figS12_quality_diversity/` | `configs/inheritance/figS12_quality_diversity.yaml` | 20260704 |
|
||||||
| Quality-diversity vs greedy (E5) | `results/E5/` | `configs/layer1/E5.yaml` | 20260704 |
|
| Re-baselining / irreversibility (Fig. S3) | `results/figS3_rebaselining/` | `configs/inheritance/figS3_rebaselining.yaml` | 20260704 |
|
||||||
| Re-minting / irreversibility (E6) | `results/E6/` | `configs/layer1/E6.yaml` | 20260704 |
|
| Learning kernel (Fig. S2) | `results/figS2_kernel_sharpen/`, `results/figS2_kernel_smooth/` | `configs/inheritance/figS2_kernel_{sharpen,smooth}.yaml` | 20260705 |
|
||||||
| 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 |
|
|
||||||
| Histogram bridge gate | `results/bridge/` | `configs/neural/bridge.yaml` | 20260704 |
|
| 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 |
|
| 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 |
|
| 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` | 1–5; 1–3; 1–3 |
|
||||||
| 7B firm-ups | `results/llm_*_hpc/` | `configs/llm/*_hpc.yaml` (run via `hpc/*.pbs`) | 1 |
|
| 7B firm-ups | `results/llm_*_hpc/` | `configs/llm/*_hpc.yaml` (run via `hpc/*.pbs`) | 1 |
|
||||||
|
|
||||||
### Per-experiment (exploratory) figures
|
### Per-experiment (exploratory) figures
|
||||||
|
|
@ -132,7 +135,7 @@ sensitivity).
|
||||||
## 5. Seeds and determinism
|
## 5. Seeds and determinism
|
||||||
|
|
||||||
**Policy.** One master seed per config. All sub-randomness is derived from it via
|
**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.
|
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
|
**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
|
```bash
|
||||||
qsub hpc/llm_merge.pbs # 7B merge firm-up
|
qsub hpc/llm_merge.pbs # 7B merge firm-up
|
||||||
qsub hpc/llm_hard.pbs # hard-benchmark moe + directed at 7B
|
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
|
## 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
|
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.
|
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
|
- `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
|
- The composed society at language-model scale is an open experiment at the time of writing; see
|
||||||
`tasks/workorder-llm-society.md`.
|
`tasks/workorder-llm-society.md`.
|
||||||
|
|
|
||||||
|
|
@ -29,4 +29,4 @@ metrics:
|
||||||
|
|
||||||
# No sweep: a single condition.
|
# No sweep: a single condition.
|
||||||
output:
|
output:
|
||||||
dir: results/E1
|
dir: results/collapse_null
|
||||||
|
|
@ -33,4 +33,4 @@ sweep:
|
||||||
values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4]
|
values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4]
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E2
|
dir: results/fig2_grounding_sweep
|
||||||
|
|
@ -37,4 +37,4 @@ sweep:
|
||||||
- {name: no_sex, set: {society.sex: false}}
|
- {name: no_sex, set: {society.sex: false}}
|
||||||
- {name: no_diversity, set: {society.select: greedy, society.novelty: 0.0}}
|
- {name: no_diversity, set: {society.select: greedy, society.novelty: 0.0}}
|
||||||
|
|
||||||
output: {dir: results/E11}
|
output: {dir: results/fig4_society_ablation}
|
||||||
|
|
@ -25,4 +25,4 @@ speciation:
|
||||||
n_offspring: 500
|
n_offspring: 500
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E12
|
dir: results/fig5_speciation_bdm
|
||||||
|
|
@ -24,4 +24,4 @@ sweep:
|
||||||
- param: rate
|
- param: rate
|
||||||
values: [0.0, 0.05, 0.1, 0.2, 0.35, 0.5] # clonal -> free recombination
|
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}
|
||||||
|
|
@ -24,4 +24,4 @@ sweep:
|
||||||
- param: K
|
- param: K
|
||||||
values: [2, 4, 6, 8, 10] # landscape ruggedness (all with parent diversity)
|
values: [2, 4, 6, 8, 10] # landscape ruggedness (all with parent diversity)
|
||||||
|
|
||||||
output: {dir: results/E10}
|
output: {dir: results/figS11_directed_recombination}
|
||||||
|
|
@ -36,4 +36,4 @@ sweep:
|
||||||
values: [0.5, 1.0, 2.0]
|
values: [0.5, 1.0, 2.0]
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E5
|
dir: results/figS12_quality_diversity
|
||||||
|
|
@ -31,4 +31,4 @@ sweep:
|
||||||
- param: mating.breadth
|
- param: mating.breadth
|
||||||
values: [0.03, 0.08, 0.17, 0.35, 0.6, 1.0]
|
values: [0.03, 0.08, 0.17, 0.35, 0.6, 1.0]
|
||||||
|
|
||||||
output: {dir: results/E14}
|
output: {dir: results/figS13_mating_breadth}
|
||||||
|
|
@ -6,7 +6,7 @@ n_replicates: 24
|
||||||
# (Learning-kernel bridge, pro-collapse arm): does neutral Wright-Fisher explain the VAE's
|
# (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,
|
# 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
|
# 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
|
# 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
|
# 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.
|
# axis Riis (2026) names as future work: the estimator, not the sampling, drives VAE collapse.
|
||||||
|
|
@ -26,4 +26,4 @@ sweep:
|
||||||
- param: dynamics.kernel.temperature
|
- param: dynamics.kernel.temperature
|
||||||
values: [1.0, 0.8] # neutral (no collapse) vs sharpened (catastrophic collapse)
|
values: [1.0, 0.8] # neutral (no collapse) vs sharpened (catastrophic collapse)
|
||||||
|
|
||||||
output: {dir: results/kernel_sharpen}
|
output: {dir: results/figS2_kernel_sharpen}
|
||||||
|
|
@ -6,7 +6,7 @@ n_replicates: 24
|
||||||
# (Learning-kernel bridge, anti-collapse arm): neutral Wright-Fisher OVER-predicts the RNN's
|
# (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
|
# 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
|
# 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
|
# 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
|
# 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
|
# 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
|
- param: dynamics.kernel.reset
|
||||||
values: [0.0, 0.006] # neutral (H -> 0) vs smoothed (H floors, like the RNN)
|
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}
|
||||||
|
|
@ -43,4 +43,4 @@ sweep:
|
||||||
set: {dynamics.grounding.m: 1, dynamics.remint.enabled: false}
|
set: {dynamics.grounding.m: 1, dynamics.remint.enabled: false}
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E6
|
dir: results/figS3_rebaselining
|
||||||
|
|
@ -37,4 +37,4 @@ sweep:
|
||||||
values: [uniform, matched]
|
values: [uniform, matched]
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E3
|
dir: results/figS5_aimed_grounding
|
||||||
|
|
@ -31,4 +31,4 @@ sweep:
|
||||||
values: [0.0, 0.02, 0.05]
|
values: [0.0, 0.02, 0.05]
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E4
|
dir: results/figS8_multiparent_union
|
||||||
|
|
@ -26,4 +26,4 @@ sweep:
|
||||||
- param: rho
|
- param: rho
|
||||||
values: [0.0, 0.5, 1.0] # decorrelated -> identical parents (the control)
|
values: [0.0, 0.5, 1.0] # decorrelated -> identical parents (the control)
|
||||||
|
|
||||||
output: {dir: results/E8}
|
output: {dir: results/figS9_specialist_superparent}
|
||||||
|
|
@ -26,4 +26,4 @@ sweep:
|
||||||
- param: genotype.recomb_rate
|
- param: genotype.recomb_rate
|
||||||
values: [0.0, 1.0] # asexual vs sexual
|
values: [0.0, 1.0] # asexual vs sexual
|
||||||
|
|
||||||
output: {dir: results/E7}
|
output: {dir: results/sexual_vs_asexual_lineage}
|
||||||
|
|
@ -19,4 +19,4 @@ speciation:
|
||||||
n_offspring: 200
|
n_offspring: 200
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/E12_nk
|
dir: results/speciation_bdm_nk
|
||||||
|
|
@ -56,4 +56,4 @@ sweep:
|
||||||
values: [0.0, 0.1] # dry vs grounded (VAE collapse is strong; needs ~10% real, cf. grounding)
|
values: [0.0, 0.1] # dry vs grounded (VAE collapse is strong; needs ~10% real, cf. grounding)
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/mnist_collapse
|
dir: results/fig2_mnist_collapse
|
||||||
|
|
@ -51,4 +51,4 @@ sweep:
|
||||||
values: [0.0, 0.05]
|
values: [0.0, 0.05]
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/architectures
|
dir: results/figS1_architectures
|
||||||
|
|
@ -63,4 +63,4 @@ sweep:
|
||||||
values: [0.0, 0.005, 0.01, 0.02, 0.035, 0.05, 0.075, 0.1, 0.2]
|
values: [0.0, 0.005, 0.01, 0.02, 0.035, 0.05, 0.075, 0.1, 0.2]
|
||||||
|
|
||||||
output:
|
output:
|
||||||
dir: results/grounding
|
dir: results/figS6_grounding_rnn
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
"""Eyeball diagnostic: watch a dry MNIST lineage collapse, generation by generation.
|
"""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
|
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
|
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.
|
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
|
from __future__ import annotations
|
||||||
|
|
@ -28,7 +28,7 @@ _SNAP_GENS = [0, 4, 8, 12, 15] # generations to snapshot
|
||||||
_COLS = 12 # sample digits per row
|
_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()
|
cfg = MnistCfg()
|
||||||
data = load_mnist(cfg.data_root)
|
data = load_mnist(cfg.data_root)
|
||||||
td = make_mnist_truth(cfg)
|
td = make_mnist_truth(cfg)
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ sys.path.insert(0, str(Path(__file__).parent))
|
||||||
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
|
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
|
||||||
|
|
||||||
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
||||||
from knowledge.analysis import critical_grounding, reduce_to_stationary # noqa: E402
|
from inheritance.analysis import critical_grounding, reduce_to_stationary # noqa: E402
|
||||||
from knowledge.metrics import heterozygosity # noqa: E402
|
from inheritance.metrics import heterozygosity # noqa: E402
|
||||||
from neural.config import SyntheticCfg # noqa: E402
|
from neural.config import SyntheticCfg # noqa: E402
|
||||||
from neural.synthetic import make_mode_truth # noqa: E402
|
from neural.synthetic import make_mode_truth # noqa: E402
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent))
|
||||||
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
|
from _figlib import load_bundle, mean_ci, savefig # noqa: E402
|
||||||
|
|
||||||
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
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.config import SyntheticCfg # noqa: E402
|
||||||
from neural.synthetic import make_mode_truth # noqa: E402
|
from neural.synthetic import make_mode_truth # noqa: E402
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Shows tail-first collapse under pure neutral drift: geometric H decay matching the
|
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
|
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
|
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
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
n = cfg["dynamics"]["n"]
|
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.suptitle("E1 — distillation without grounding collapses, tail first", y=1.02)
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
savefig(fig, results_dir, "E1")
|
savefig(fig, results_dir, "collapse_null")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
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
|
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*_i≳1 threshold made visible
|
feasible grounding; (D) per-rarity-band survival — the m·p*_i≳1 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
|
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
|
from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402
|
||||||
|
|
||||||
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
||||||
from knowledge.analysis import critical_grounding, reduce_to_stationary # noqa: E402
|
from inheritance.analysis import critical_grounding, reduce_to_stationary # noqa: E402
|
||||||
from knowledge.metrics import heterozygosity # noqa: E402
|
from inheritance.metrics import heterozygosity # noqa: E402
|
||||||
from knowledge.truth import make_true_distribution # 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)
|
df, cfg = load_bundle(results_dir)
|
||||||
n = cfg["dynamics"]["n"]
|
n = cfg["dynamics"]["n"]
|
||||||
td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"],
|
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()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E2")
|
savefig(fig, results_dir, "fig2_grounding_sweep")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
(B) support size (distinct modes alive); (C) tail truth-mass alive; (D) heterozygosity. Reads the
|
||||||
committed bundle (parquet) + manifest.json only.
|
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
|
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
|
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
|
||||||
|
|
||||||
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
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.config import MnistCfg # noqa: E402
|
||||||
from neural.mnist_data import make_mnist_truth # 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()
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
syn = MnistCfg(**cfg["mnist"])
|
syn = MnistCfg(**cfg["mnist"])
|
||||||
H_star = heterozygosity(make_mnist_truth(syn).p_star)
|
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()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "mnist_collapse")
|
savefig(fig, results_dir, "fig2_mnist_collapse")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
population's mutual agreement exceeds its real capability), largest for no_grounding. Reads only the
|
||||||
committed bundle.
|
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
|
from __future__ import annotations
|
||||||
|
|
@ -32,7 +32,7 @@ _ARMS = [("full", "#2ca02c", "full society"),
|
||||||
("no_grounding", "#d62728", "no grounding (self-consumption)")]
|
("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)
|
df, _ = load_bundle(results_dir)
|
||||||
arms = [a for a in _ARMS if a[0] in set(df["arm"].unique())]
|
arms = [a for a in _ARMS if a[0] in set(df["arm"].unique())]
|
||||||
g_opt = df["global_opt"].mean()
|
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 "
|
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)
|
"the optimum; remove any one and it breaks (the vertical claim, C3)", y=1.02, fontsize=12)
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
savefig(fig, results_dir, "E11")
|
savefig(fig, results_dir, "fig4_society_ablation")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
epistasis wedge — as landscape ruggedness K grows, recombining two adapted local-optimum parents flips
|
||||||
from a gain to outbreeding depression.
|
from a gain to outbreeding depression.
|
||||||
|
|
||||||
Usage: python figures/plot_E12.py
|
Usage: python figures/plot_fig5_speciation_bdm.py
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
@ -30,8 +30,8 @@ def _agg(df, keys, value):
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
bdm, _ = load_bundle("results/E12")
|
bdm, _ = load_bundle("results/fig5_speciation_bdm")
|
||||||
nk, _ = load_bundle("results/E12_nk")
|
nk, _ = load_bundle("results/speciation_bdm_nk")
|
||||||
rhos = sorted(bdm["rho"].unique())
|
rhos = sorted(bdm["rho"].unique())
|
||||||
colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos)))
|
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",
|
fig.suptitle("E12 — model speciation: when two diverged models are too incompatible to merge",
|
||||||
y=1.02, fontsize=13)
|
y=1.02, fontsize=13)
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
savefig(fig, "results/E12", "E12")
|
savefig(fig, "results/fig5_speciation_bdm", "E12")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
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.
|
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
|
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
|
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)
|
df, _ = load_bundle(results_dir)
|
||||||
Ks = sorted(df["K"].unique())
|
Ks = sorted(df["K"].unique())
|
||||||
rates = sorted(df["rate"].unique())
|
rates = sorted(df["rate"].unique())
|
||||||
|
|
@ -58,7 +58,7 @@ def main(results_dir: str = "results/E9") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E9")
|
savefig(fig, results_dir, "figS10_rugged_landscapes")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
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.
|
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
|
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
|
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)
|
df, _ = load_bundle(results_dir)
|
||||||
|
|
||||||
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
|
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
|
||||||
|
|
@ -57,7 +57,7 @@ def main(results_dir: str = "results/E10") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E10")
|
savefig(fig, results_dir, "figS11_directed_recombination")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
At matched grounding, greedy (directional) selection drives the lineage toward the
|
At matched grounding, greedy (directional) selection drives the lineage toward the
|
||||||
fittest items and collapses diversity, while quality-diversity selection (a novelty bonus
|
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
|
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
|
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
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
last = int(cfg["generations"] * 0.8)
|
last = int(cfg["generations"] * 0.8)
|
||||||
|
|
||||||
|
|
@ -72,7 +72,7 @@ def main(results_dir: str = "results/E5") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E5")
|
savefig(fig, results_dir, "figS12_quality_diversity")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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;
|
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.
|
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
|
from __future__ import annotations
|
||||||
|
|
@ -30,7 +30,7 @@ from _figlib import load_bundle, savefig, letter_axes # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
df, _ = load_bundle("results/E14")
|
df, _ = load_bundle("results/figS13_mating_breadth")
|
||||||
last = df[df["generation"] == df["generation"].max()].copy()
|
last = df[df["generation"] == df["generation"].max()].copy()
|
||||||
last["best_n"] = last["best_fitness"] / last["global_opt"]
|
last["best_n"] = last["best_fitness"] / last["global_opt"]
|
||||||
last["mean_n"] = last["mean_fitness"] / last["global_opt"]
|
last["mean_n"] = last["mean_fitness"] / last["global_opt"]
|
||||||
|
|
@ -60,7 +60,7 @@ def main() -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, "results/E14", "E14")
|
savefig(fig, "results/figS13_mating_breadth", "E14")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
(C) tail-item survival, dry vs grounded, grouped by architecture (all rise). Reads only the
|
||||||
committed bundle.
|
committed bundle.
|
||||||
|
|
||||||
Usage: python figures/plot_architectures.py [results/architectures]
|
Usage: python figures/plot_figS1_architectures.py [results/figS1_architectures]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
@ -29,7 +29,7 @@ _ARCH_LABEL = {"histogram": "histogram\n(exact)", "rnn": "GRU\n(autoregressive)"
|
||||||
"mlp": "MLP\n(causal-masked)"}
|
"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)
|
df, cfg = load_bundle(results_dir)
|
||||||
kinds = [k for k in _ARCH_ORDER if k in set(df["kind"].unique())]
|
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())
|
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()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "architectures")
|
savefig(fig, results_dir, "figS1_architectures")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
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.
|
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;
|
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
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
period = cfg["dynamics"]["remint"]["period"]
|
period = cfg["dynamics"]["remint"]["period"]
|
||||||
G = cfg["generations"]
|
G = cfg["generations"]
|
||||||
|
|
@ -69,7 +69,7 @@ def main(results_dir: str = "results/E6") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E6")
|
savefig(fig, results_dir, "figS3_rebaselining")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Shows that grounding must *overlap* the content it protects. At the same total budget,
|
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
|
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
|
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
|
Metric: per-region tail-item survival. (Per-region *heterozygosity* is confounded by
|
||||||
region mass under matched grounding, so it is deliberately not used here.)
|
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
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
R = cfg["truth"]["R"]
|
R = cfg["truth"]["R"]
|
||||||
exercised = cfg["dynamics"]["grounding"]["exercised"]
|
exercised = cfg["dynamics"]["grounding"]["exercised"]
|
||||||
|
|
@ -66,7 +66,7 @@ def main(results_dir: str = "results/E3") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E3")
|
savefig(fig, results_dir, "figS5_aimed_grounding")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
smoothing model; (D) the metric-choice panel — H and tail-survival are flat/non-monotone
|
||||||
while forward-KL responds. Reads only the committed bundle.
|
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
|
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
|
from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402
|
||||||
|
|
||||||
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
||||||
from knowledge.analysis import reduce_to_stationary # noqa: E402
|
from inheritance.analysis import reduce_to_stationary # noqa: E402
|
||||||
from knowledge.metrics import heterozygosity # noqa: E402
|
from inheritance.metrics import heterozygosity # noqa: E402
|
||||||
from neural.config import SyntheticCfg # noqa: E402
|
from neural.config import SyntheticCfg # noqa: E402
|
||||||
from neural.synthetic import make_mode_truth # 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)
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
syn = SyntheticCfg(**cfg["synthetic"])
|
syn = SyntheticCfg(**cfg["synthetic"])
|
||||||
H_star = heterozygosity(make_mode_truth(syn).p_star)
|
H_star = heterozygosity(make_mode_truth(syn).p_star)
|
||||||
|
|
@ -133,7 +133,7 @@ def main(results_dir: str = "results/grounding") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "grounding")
|
savefig(fig, results_dir, "figS6_grounding_rnn")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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
|
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
|
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.
|
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
|
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)
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
q = cfg["coverage"]["q"]
|
q = cfg["coverage"]["q"]
|
||||||
K_Ts = sorted(df["K_T"].unique())
|
K_Ts = sorted(df["K_T"].unique())
|
||||||
|
|
@ -71,7 +71,7 @@ def main(results_dir: str = "results/E4") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E4")
|
savefig(fig, results_dir, "figS8_multiparent_union")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -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)
|
count for ρ ∈ {0, 0.5, 1}: decorrelated parents (ρ=0) climb to the optimum, identical parents (ρ=1)
|
||||||
buy nothing. Reads only the committed bundle.
|
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
|
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
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
L = cfg["society"]["L"]
|
L = cfg["society"]["L"]
|
||||||
rhos = sorted(df["rho"].unique())
|
rhos = sorted(df["rho"].unique())
|
||||||
|
|
@ -60,7 +60,7 @@ def main(results_dir: str = "results/E8") -> None:
|
||||||
|
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
letter_axes(fig)
|
letter_axes(fig)
|
||||||
savefig(fig, results_dir, "E8")
|
savefig(fig, results_dir, "figS9_specialist_superparent")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -13,7 +13,7 @@ one knob of the learning kernel:
|
||||||
estimator REMOVES collapse pressure.
|
estimator REMOVES collapse pressure.
|
||||||
|
|
||||||
Analytic arms are read from results/kernel_{sharpen,smooth}; the neural reference endpoints
|
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.
|
figure is a pure function of committed artifacts.
|
||||||
|
|
||||||
Usage: python figures/plot_kernel.py
|
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
|
from _figlib import load_bundle, savefig, letter_axes # noqa: E402
|
||||||
|
|
||||||
sys.path.insert(0, str(Path(__file__).parents[1] / "src"))
|
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 knowledge.truth import make_true_distribution # noqa: E402
|
from inheritance.truth import make_true_distribution # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
def _mean_traj(df, knob, val, col):
|
def _mean_traj(df, knob, val, col):
|
||||||
|
|
@ -52,8 +52,8 @@ def _neural_dry(results_dir, col, stationary_frac=0.0):
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
sh, sh_cfg = load_bundle("results/kernel_sharpen")
|
sh, sh_cfg = load_bundle("results/figS2_kernel_sharpen")
|
||||||
sm, sm_cfg = load_bundle("results/kernel_smooth")
|
sm, sm_cfg = load_bundle("results/figS2_kernel_smooth")
|
||||||
Hstar_sh = heterozygosity(make_true_distribution(
|
Hstar_sh = heterozygosity(make_true_distribution(
|
||||||
sh_cfg["truth"]["K"], 1, "zipf", 0.5, sh_cfg["truth"]["zipf_s"], 0,
|
sh_cfg["truth"]["K"], 1, "zipf", 0.5, sh_cfg["truth"]["zipf_s"], 0,
|
||||||
tail_threshold=sh_cfg["truth"]["tail_threshold"]).p_star)
|
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)
|
tail_threshold=sm_cfg["truth"]["tail_threshold"]).p_star)
|
||||||
|
|
||||||
# Neural reference endpoints (dashed) from the committed neural runs.
|
# Neural reference endpoints (dashed) from the committed neural runs.
|
||||||
vae_H = _neural_dry("results/mnist_collapse", "heterozygosity")
|
vae_H = _neural_dry("results/fig2_mnist_collapse", "heterozygosity")
|
||||||
vae_sup = _neural_dry("results/mnist_collapse", "support_size")
|
vae_sup = _neural_dry("results/fig2_mnist_collapse", "support_size")
|
||||||
rnn_H = _neural_dry("results/grounding", "heterozygosity", stationary_frac=0.4)
|
rnn_H = _neural_dry("results/figS6_grounding_rnn", "heterozygosity", stationary_frac=0.4)
|
||||||
rnn_KL = _neural_dry("results/grounding", "forward_kl", 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))
|
fig, axes = plt.subplots(2, 2, figsize=(13, 9))
|
||||||
NEU, KER = "#1f77b4", "#d62728"
|
NEU, KER = "#1f77b4", "#d62728"
|
||||||
|
|
@ -111,7 +111,7 @@ def main() -> None:
|
||||||
ax.legend(frameon=False, fontsize=8)
|
ax.legend(frameon=False, fontsize=8)
|
||||||
|
|
||||||
fig.tight_layout()
|
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)
|
letter_axes(fig)
|
||||||
savefig(fig, d, "kernel")
|
savefig(fig, d, "kernel")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
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.
|
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
|
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
|
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)
|
df, cfg = load_bundle(results_dir)
|
||||||
L = cfg["genotype"]["L"]
|
L = cfg["genotype"]["L"]
|
||||||
arms = [(0.0, "#7f7f7f", "asexual (clonal)"), (1.0, "#d62728", "sexual (recombining)")]
|
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 "
|
fig.suptitle("E7 — the advantage of sex: recombination reassorts beneficial alleles that arose "
|
||||||
"in different lineages", y=1.02, fontsize=12)
|
"in different lineages", y=1.02, fontsize=12)
|
||||||
fig.tight_layout()
|
fig.tight_layout()
|
||||||
savefig(fig, results_dir, "E7")
|
savefig(fig, results_dir, "sexual_vs_asexual_lineage")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
@ -46,9 +46,9 @@
|
||||||
"import numpy as np\n",
|
"import numpy as np\n",
|
||||||
"import matplotlib.pyplot as plt\n",
|
"import matplotlib.pyplot as plt\n",
|
||||||
"\n",
|
"\n",
|
||||||
"from knowledge.lineage import run_lineage\n",
|
"from inheritance.lineage import run_lineage\n",
|
||||||
"from knowledge.metrics import heterozygosity\n",
|
"from inheritance.metrics import heterozygosity\n",
|
||||||
"from knowledge.truth import make_true_distribution\n",
|
"from inheritance.truth import make_true_distribution\n",
|
||||||
"\n",
|
"\n",
|
||||||
"K, N_SAMPLES = 200, 100 # K items of knowledge; n samples drawn per generation\n",
|
"K, N_SAMPLES = 200, 100 # K items of knowledge; n samples drawn per generation\n",
|
||||||
"print('ready')"
|
"print('ready')"
|
||||||
|
|
@ -127,7 +127,7 @@
|
||||||
"process — the textbook model of neutral evolution in a finite population of size `n`.\n",
|
"process — the textbook model of neutral evolution in a finite population of size `n`.\n",
|
||||||
"\n",
|
"\n",
|
||||||
"The config below is the same schema the experiments use, so anything you learn here transfers\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",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"first swept point retaining 95% of H*: g = 0.091 (m = 10)\n",
|
"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",
|
"\n",
|
||||||
"common item (p=1e-02): seen once per batch at m ~ 100 -> P(seen | m=1000) = 100.0%\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",
|
"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",
|
"target = 0.95\n",
|
||||||
"i = int(np.argmax(np.array(sim) >= target * H_star))\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(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",
|
"\n",
|
||||||
"for p, label in [(1e-2, 'common'), (1e-3, 'rare'), (1e-4, 'very rare')]:\n",
|
"for p, label in [(1e-2, 'common'), (1e-3, 'rare'), (1e-4, 'very rare')]:\n",
|
||||||
" need = 1 / p\n",
|
" need = 1 / p\n",
|
||||||
|
|
@ -458,7 +458,7 @@
|
||||||
"## Where to go next\n",
|
"## Where to go next\n",
|
||||||
"\n",
|
"\n",
|
||||||
"- `02_paper_figures.ipynb` — regenerate every manuscript figure from the committed artifacts.\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",
|
"- `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",
|
"- `tests/test_scientific_validation.py` — these same identities as assertions; if they fail, the\n",
|
||||||
" science is wrong, not just the code."
|
" science is wrong, not just the code."
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
"import sys, pathlib, json, hashlib\n",
|
"import sys, pathlib, json, hashlib\n",
|
||||||
"\n",
|
"\n",
|
||||||
"ROOT = pathlib.Path.cwd().parent\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",
|
"\n",
|
||||||
"import make_figs # note: importing this chdir's to the repo root, by design\n",
|
"import make_figs # note: importing this chdir's to the repo root, by design\n",
|
||||||
"from IPython.display import IFrame, display, Markdown\n",
|
"from IPython.display import IFrame, display, Markdown\n",
|
||||||
|
|
@ -79,18 +79,18 @@
|
||||||
"| Panel | Artifact | Config | Seed(s) |\n",
|
"| Panel | Artifact | Config | Seed(s) |\n",
|
||||||
"|---|---|---|---|\n",
|
"|---|---|---|---|\n",
|
||||||
"| Fig. 1A/1B | `schematics (no data)` | `-` | - |\n",
|
"| Fig. 1A/1B | `schematics (no data)` | `-` | - |\n",
|
||||||
"| Fig. 2A | `results/E2` | `configs/layer1/E2.yaml` | 20260704 |\n",
|
"| Fig. 2A | `results/fig2_grounding_sweep` | `configs/inheritance/fig2_grounding_sweep.yaml` | 20260704 |\n",
|
||||||
"| Fig. 2B | `results/mnist_collapse` | `configs/neural/mnist_collapse.yaml` | 20260705 |\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. 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. 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. 3C/3D | `results/llm_epistasis(_compat)` | `configs/llm/epistasis*.yaml` | 1-3 |\n",
|
||||||
"| Fig. 4A | `results/E4` | `configs/layer1/E4.yaml` | 20260704 |\n",
|
"| Fig. 4A | `results/figS8_multiparent_union` | `configs/inheritance/figS8_multiparent_union.yaml` | 20260704 |\n",
|
||||||
"| Fig. 4B | `results/E8` | `configs/layer1/E8.yaml` | 20260705 |\n",
|
"| Fig. 4B | `results/figS9_specialist_superparent` | `configs/inheritance/figS9_specialist_superparent.yaml` | 20260705 |\n",
|
||||||
"| Fig. 5A | `results/E9` | `configs/layer1/E9.yaml` | 20260705 |\n",
|
"| Fig. 5A | `results/figS10_rugged_landscapes` | `configs/inheritance/figS10_rugged_landscapes.yaml` | 20260705 |\n",
|
||||||
"| Fig. 5B | `results/E10` | `configs/layer1/E10.yaml` | 20260705 |\n",
|
"| Fig. 5B | `results/figS11_directed_recombination` | `configs/inheritance/figS11_directed_recombination.yaml` | 20260705 |\n",
|
||||||
"| Fig. 5C/5D | `results/E14` | `configs/layer1/E14.yaml` | 20260709 |\n",
|
"| Fig. 5C/5D | `results/figS13_mating_breadth` | `configs/inheritance/figS13_mating_breadth.yaml` | 20260709 |\n",
|
||||||
"| Fig. 6A-C | `results/E11` | `configs/layer1/E11.yaml` | 20260705 |\n",
|
"| Fig. 6A-C | `results/fig4_society_ablation` | `configs/inheritance/fig4_society_ablation.yaml` | 20260705 |\n",
|
||||||
"| Fig. 7A/7B | `results/E12` | `configs/layer1/E12.yaml` | 12 |\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. 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. 7D | `results/speciation_real_cliff` | `configs/neural/speciation_real_cliff.yaml` | 13 |\n",
|
||||||
"| Fig. 7E/7F | `results/llm_speciation` | `configs/llm/speciation.yaml` | 1 |"
|
"| Fig. 7E/7F | `results/llm_speciation` | `configs/llm/speciation.yaml` | 1 |"
|
||||||
|
|
@ -106,18 +106,18 @@
|
||||||
"source": [
|
"source": [
|
||||||
"PROVENANCE = [\n",
|
"PROVENANCE = [\n",
|
||||||
" ('Fig. 1A/1B', 'schematics (no data)', '-', '-'),\n",
|
" ('Fig. 1A/1B', 'schematics (no data)', '-', '-'),\n",
|
||||||
" ('Fig. 2A', 'results/E2', 'configs/layer1/E2.yaml', '20260704'),\n",
|
" ('Fig. 2A', 'results/fig2_grounding_sweep', 'configs/inheritance/fig2_grounding_sweep.yaml', '20260704'),\n",
|
||||||
" ('Fig. 2B', 'results/mnist_collapse', 'configs/neural/mnist_collapse.yaml', '20260705'),\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. 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. 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. 3C/3D', 'results/llm_epistasis(_compat)', 'configs/llm/epistasis*.yaml', '1-3'),\n",
|
||||||
" ('Fig. 4A', 'results/E4', 'configs/layer1/E4.yaml', '20260704'),\n",
|
" ('Fig. 4A', 'results/figS8_multiparent_union', 'configs/inheritance/figS8_multiparent_union.yaml', '20260704'),\n",
|
||||||
" ('Fig. 4B', 'results/E8', 'configs/layer1/E8.yaml', '20260705'),\n",
|
" ('Fig. 4B', 'results/figS9_specialist_superparent', 'configs/inheritance/figS9_specialist_superparent.yaml', '20260705'),\n",
|
||||||
" ('Fig. 5A', 'results/E9', 'configs/layer1/E9.yaml', '20260705'),\n",
|
" ('Fig. 5A', 'results/figS10_rugged_landscapes', 'configs/inheritance/figS10_rugged_landscapes.yaml', '20260705'),\n",
|
||||||
" ('Fig. 5B', 'results/E10', 'configs/layer1/E10.yaml', '20260705'),\n",
|
" ('Fig. 5B', 'results/figS11_directed_recombination', 'configs/inheritance/figS11_directed_recombination.yaml', '20260705'),\n",
|
||||||
" ('Fig. 5C/5D', 'results/E14', 'configs/layer1/E14.yaml', '20260709'),\n",
|
" ('Fig. 5C/5D', 'results/figS13_mating_breadth', 'configs/inheritance/figS13_mating_breadth.yaml', '20260709'),\n",
|
||||||
" ('Fig. 6A-C', 'results/E11', 'configs/layer1/E11.yaml', '20260705'),\n",
|
" ('Fig. 6A-C', 'results/fig4_society_ablation', 'configs/inheritance/fig4_society_ablation.yaml', '20260705'),\n",
|
||||||
" ('Fig. 7A/7B', 'results/E12', 'configs/layer1/E12.yaml', '12'),\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. 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. 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",
|
" ('Fig. 7E/7F', 'results/llm_speciation', 'configs/llm/speciation.yaml', '1'),\n",
|
||||||
|
|
@ -200,7 +200,7 @@
|
||||||
"source": [
|
"source": [
|
||||||
"## Regenerate the figures\n",
|
"## Regenerate the figures\n",
|
||||||
"\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."
|
"manuscript includes, so a rebuilt PDF picks them up unchanged."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -221,46 +221,46 @@
|
||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"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",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"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",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"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",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig3.pdf\n",
|
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/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/fig4.pdf\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig5.pdf\n",
|
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/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/fig6.pdf\n"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"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",
|
"\n",
|
||||||
"all manuscript figures regenerated into paper/pnas/figs/\n"
|
"all manuscript figures regenerated into paper/manuscript/figs/\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
@ -278,7 +278,7 @@
|
||||||
"\n",
|
"\n",
|
||||||
"for name, caption in FIGURES:\n",
|
"for name, caption in FIGURES:\n",
|
||||||
" getattr(make_figs, name)()\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",
|
"\n",
|
||||||
"has_poppler = shutil.which('pdftoppm') is not None\n",
|
"has_poppler = shutil.which('pdftoppm') is not None\n",
|
||||||
"for name, caption in FIGURES:\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",
|
" display(Markdown(f'### {caption}'))\n",
|
||||||
" if not has_poppler:\n",
|
" if not has_poppler:\n",
|
||||||
" print(f'(install poppler-utils to preview inline) {pdf}'); continue\n",
|
" print(f'(install poppler-utils to preview inline) {pdf}'); continue\n",
|
||||||
|
|
@ -507,7 +507,7 @@
|
||||||
"source": [
|
"source": [
|
||||||
"## Rebuild the manuscript PDF (optional)\n",
|
"## Rebuild the manuscript PDF (optional)\n",
|
||||||
"\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."
|
"toolchain (`tectonic main.tex`), so it is left as a shell step rather than run here."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -528,16 +528,16 @@
|
||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/body.tex\n",
|
"wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/body.tex\n",
|
||||||
"now: cd paper/pnas && tectonic main.tex\n"
|
"now: cd paper/manuscript && tectonic main.tex\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"import subprocess\n",
|
"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",
|
" capture_output=True, text=True).stdout.strip())\n",
|
||||||
"print('now: cd paper/pnas && tectonic main.tex')"
|
"print('now: cd paper/manuscript && tectonic main.tex')"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@ OUT = Path(__file__).resolve().parent / "body.tex"
|
||||||
|
|
||||||
# Figure references in the text -> (graphics file under figs/, caption).
|
# Figure references in the text -> (graphics file under figs/, caption).
|
||||||
FIGURES = {
|
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. "
|
"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 "
|
"(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."),
|
"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$ "
|
"Model speciation, analytic (E12): hybrid fitness vs divergence traces compatible $\\rightarrow$ "
|
||||||
"outbreeding depression $\\rightarrow$ inviability; the isolation cliff arrives earlier the "
|
"outbreeding depression $\\rightarrow$ inviability; the isolation cliff arrives earlier the "
|
||||||
"denser the incompatibilities (epistasis), and damage grows super-linearly (the Orr--Turelli "
|
"denser the incompatibilities (epistasis), and damage grows super-linearly (the Orr--Turelli "
|
||||||
|
|
|
||||||
|
|
@ -240,7 +240,7 @@ dynamics:
|
||||||
metrics:
|
metrics:
|
||||||
kl_floor: 1.0e-9
|
kl_floor: 1.0e-9
|
||||||
output:
|
output:
|
||||||
dir: results/E2/
|
dir: results/fig2_grounding_sweep/
|
||||||
save_per_generation: true
|
save_per_generation: true
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
codename-free panels re-plotted from the committed artifacts). Run make_figs.py before building when
|
||||||
results change.
|
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
|
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)
|
# figure name -> (single publication PDF from make_figs.py, caption)
|
||||||
FIGURES: dict[str, tuple[list[str], str]] = {
|
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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"lost under single-parent inheritance, reassembled by merging complementary parents, and re-supplied "
|
||||||
"by grounding."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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)."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"(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 "
|
"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 "
|
"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 "
|
"non-viable hybrid rises with divergence (F). What breaks merging is conflicting conventions on "
|
||||||
"shared machinery, not distance or specialisation as such."),
|
"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 "
|
"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 "
|
"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 "
|
"on one family of tasks (list puzzles, string puzzles or arithmetic); a verifier marks every answer "
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
"""Build the student-level figure guide (figure_legends_for_students.md -> .tex -> PDF).
|
"""Build the student-level figure guide (figure_legends_for_students.md -> .tex -> PDF).
|
||||||
|
|
||||||
The Markdown is the source of truth. Lines of the form ```` become figure includes
|
The Markdown is the source of truth. Lines of the form ```` 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.
|
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
|
from __future__ import annotations
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
"""Build a Zotero-importable library from the manuscript's reference list.
|
"""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
|
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
|
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
|
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
|
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.
|
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
|
from __future__ import annotations
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2 KiB |
|
|
@ -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
|
## Figure S1. Collapse and rescue in three different kinds of network
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S3. Re-baselining a collapsed population locks in the damage
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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).
|
**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
|
## Figure S4. The full grounding sweep in the simulation
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S5. Real data protects only the topics it covers
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S6. Grounding in a trained recurrent network
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S7. Collapse and rescue on real handwritten digits, in numbers
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S8. Averaging parents cancels the benefit of having several; keeping the best of each does not
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S9. Many complementary parents can produce an offspring better than any of them
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S10. When skills are entangled, blind recombination harms the offspring
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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).
|
**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
|
## Figure S11. Directed sex: choosing and screening offspring rescues recombination
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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).
|
**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
|
## Figure S12. Selecting for the best destroys diversity; rewarding novelty preserves it
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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
|
## Figure S13. Who should mate with whom: mating breadth on rugged landscapes
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**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.
|
**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.
|
||||||
|
|
||||||
Binary file not shown.
|
|
@ -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}
|
\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.
|
\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}
|
\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).
|
\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}
|
\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.
|
\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}
|
\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.
|
\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}
|
\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.
|
\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}
|
\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.
|
\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}
|
\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.
|
\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}
|
\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.
|
\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}
|
\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).
|
\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}
|
\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).
|
\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}
|
\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.
|
\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}
|
\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.
|
\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.
|
||||||
|
|
||||||
Binary file not shown.
|
|
@ -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
|
caption. The per-experiment figures under results/ remain the exploratory versions; these are the
|
||||||
manuscript's.
|
manuscript's.
|
||||||
|
|
||||||
Usage: python paper/pnas/make_figs.py
|
Usage: python paper/manuscript/make_figs.py
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
@ -26,7 +26,7 @@ import os
|
||||||
os.chdir(ROOT) # load_bundle uses repo-relative paths
|
os.chdir(ROOT) # load_bundle uses repo-relative paths
|
||||||
from _figlib import load_bundle, load_seed_bundles, mean_ci # noqa: E402
|
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({
|
plt.rcParams.update({
|
||||||
"font.size": 8, "axes.labelsize": 8.5, "legend.fontsize": 7, "legend.frameon": False,
|
"font.size": 8, "axes.labelsize": 8.5, "legend.fontsize": 7, "legend.frameon": False,
|
||||||
|
|
@ -348,11 +348,11 @@ def fig1b():
|
||||||
|
|
||||||
# ---------------------------------------------------------------- fig 2: grounding + MNIST
|
# ---------------------------------------------------------------- fig 2: grounding + MNIST
|
||||||
def fig2():
|
def fig2():
|
||||||
from knowledge.analysis import critical_grounding, reduce_to_stationary
|
from inheritance.analysis import critical_grounding, reduce_to_stationary
|
||||||
from knowledge.metrics import heterozygosity
|
from inheritance.metrics import heterozygosity
|
||||||
from knowledge.truth import make_true_distribution
|
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"]
|
n = cfg["dynamics"]["n"]
|
||||||
td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"],
|
td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"],
|
||||||
cfg["truth"]["zipf_s"], 0, tail_threshold=cfg["truth"]["tail_threshold"])
|
cfg["truth"]["zipf_s"], 0, tail_threshold=cfg["truth"]["tail_threshold"])
|
||||||
|
|
@ -391,7 +391,7 @@ def fig2():
|
||||||
|
|
||||||
ax = axes[0]
|
ax = axes[0]
|
||||||
from PIL import Image
|
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
|
# 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.
|
# size); measured on the committed montage: boxes span y >= 69, x >= 75, row centres below.
|
||||||
top, left = 60, 68
|
top, left = 60, 68
|
||||||
|
|
@ -424,7 +424,7 @@ def fig4():
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from matplotlib.patches import FancyArrowPatch, FancyBboxPatch
|
from matplotlib.patches import FancyArrowPatch, FancyBboxPatch
|
||||||
|
|
||||||
df, _ = load_bundle("results/E11")
|
df, _ = load_bundle("results/fig4_society_ablation")
|
||||||
arms = [("full", "#2ca02c", "full system"),
|
arms = [("full", "#2ca02c", "full system"),
|
||||||
("no_sex", "#ff7f0e", "no recombination"),
|
("no_sex", "#ff7f0e", "no recombination"),
|
||||||
("no_diversity", "#9467bd", "no diversity preservation"),
|
("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, axes = plt.subplots(2, 3, figsize=(11.4, 8.4), gridspec_kw={"wspace": 0.45, "hspace": 0.75})
|
||||||
fig.subplots_adjust(top=0.9)
|
fig.subplots_adjust(top=0.9)
|
||||||
|
|
||||||
bdm, _ = load_bundle("results/E12")
|
bdm, _ = load_bundle("results/fig5_speciation_bdm")
|
||||||
rhos = sorted(bdm["rho"].unique())
|
rhos = sorted(bdm["rho"].unique())
|
||||||
colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos)))
|
colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos)))
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Zotero library for the manuscript's references
|
# 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.
|
fetched from the publisher of record rather than retyped.
|
||||||
|
|
||||||
**To import:** Zotero → File → Import… → choose this file → keep "Place imported collections and
|
**To import:** Zotero → File → Import… → choose this file → keep "Place imported collections and
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
"""Renumber the manuscript's references to first-appearance order (PNAS style).
|
"""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
|
"## 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.
|
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
|
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)
|
"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.
|
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
|
Usage: python paper/manuscript/renumber_refs.py # dry run: mapping + per-file counts
|
||||||
python paper/pnas/renumber_refs.py --apply # rewrite the three files in place
|
python paper/manuscript/renumber_refs.py --apply # rewrite the three files in place
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
@ -18,7 +18,7 @@ import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[2]
|
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"
|
REF_HEADER = "## References"
|
||||||
CIT = re.compile(
|
CIT = re.compile(
|
||||||
r"\((?P<pre>[^()]*?;\s*)?(?P<cf>cf\.\s*)?"
|
r"\((?P<pre>[^()]*?;\s*)?(?P<cf>cf\.\s*)?"
|
||||||
|
|
@ -217,20 +217,20 @@ and the item-wise maximum rises with it.
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| 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) |
|
| 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) |
|
||||||
| 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 |
|
| 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 |
|
| "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 (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 |
|
| Offspring exceed every parent (Fisher–Muller) | 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 | E9–E10; directed selection rescues | Not yet mapped onto a real task-entanglement measure |
|
| 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 | E14 | Phenomenon known to island-model evolutionary computation; the contribution here is the mapping and the diversity/mean decomposition |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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. 4B–C) 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. 4B–C) 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 |
|
| 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 |
|
| 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
|
## 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 |
|
| 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% |
|
| 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 |
|
| 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 |
|
||||||
| Fisher–Muller 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) |
|
| Fisher–Muller 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) |
|
| 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 |
|
| Experiment | Replicates | Reasoning |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 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 |
|
| `fig2_grounding_sweep`, `figS5_aimed_grounding`, `figS12_quality_diversity`, `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 |
|
||||||
| E4 | 200 | Outcomes are per-item binary retentions, the highest-variance quantity in the paper |
|
| `figS8_multiparent_union` | 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 |
|
| `figS9_specialist_superparent` | 40 | The vertical claim; the headline separation, so the most replicated of the genotype experiments |
|
||||||
| E8 | 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 |
|
||||||
| E9, E10 | 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 |
|
||||||
| E11 | 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 |
|
||||||
| E12, E12_nk | 15 | Each point already averages 500 (E12) or 200 (E12_nk) offspring |
|
| `figS13_mating_breadth` | 20 | Breadth × ruggedness grid, 60 generations per cell |
|
||||||
| E14 | 20 | Breadth × ruggedness grid, 60 generations per cell |
|
| `figS2_kernel_sharpen`, `figS2_kernel_smooth` | 24 | Two-parameter kernel fits against neural reference endpoints |
|
||||||
| 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 |
|
||||||
| 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 |
|
||||||
| grounding | 18 | Nine-point grounding sweep with per-generation network retraining |
|
| `collapse`, `figS1_architectures` | 5 | Sign-level demonstrations across architectures; each lineage retrains a network 22–25 times |
|
||||||
| collapse, architectures | 5 | Sign-level demonstrations across architectures; each lineage retrains a network 22–25 times |
|
|
||||||
| recombination | 8 | Operator contrast in trained weights |
|
| 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, _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 |
|
| speciation_real_emergent | 4 | A null: replicates are spent on longer divergence horizons rather than more repeats |
|
||||||
| llm_merge_seeds | 5 training seeds | The Fisher–Muller signature, the most-replicated language-model claim |
|
| llm_merge_seeds | 5 training seeds | The Fisher–Muller signature, the most-replicated language-model claim |
|
||||||
|
|
@ -351,30 +350,33 @@ population size in the Wright–Fisher correspondence and the distillation sampl
|
||||||
reading. Horizons of 400–600 generations were chosen so that ungrounded lineages reach fixation and
|
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.
|
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
|
*Sweeps.* The grounding sweep (`fig2_grounding_sweep`) sweeps `g ∈ {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}`;
|
||||||
against region-matched grounding allocation; E4 crosses parent count `K_T ∈ {1,2,3,5}` with parent
|
the aimed-grounding experiment (`figS5_aimed_grounding`) contrasts uniform against region-matched
|
||||||
correlation `ρ ∈ {0, 0.25, 0.5, 0.75, 1}` and `g ∈ {0, 0.02, 0.05}`; E5 crosses selection mode
|
grounding allocation; the multi-parent union experiment (`figS8_multiparent_union`) crosses parent count
|
||||||
(none / greedy / quality-diversity) with novelty weight; E6 compares four re-minting arms.
|
`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
|
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
|
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
|
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
|
marginal retention `q` and exact pairwise correlation `ρ`, and is exchangeable, so `ρ` is a single
|
||||||
scalar knob.
|
scalar knob.
|
||||||
|
|
||||||
*Multi-locus experiments (E7–E11, 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
|
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
|
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; E10 additionally screens
|
from `n_parents = 6` local optima into populations of 200 offspring; the directed one additionally
|
||||||
offspring and iterates (5 rounds, keeping 8). E11 runs a population of `N = 60` agents for 80
|
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
|
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.
|
breadth on a ring of `N = 48` against ruggedness.
|
||||||
|
|
||||||
*Speciation (E12).* `L = 20` loci, incompatibility density `ρ ∈ {0.1, 0.25, 0.5}`, parental
|
*Speciation (`fig5_speciation_bdm`).* `L = 20` loci, incompatibility density `ρ ∈ {0.1, 0.25, 0.5}`,
|
||||||
divergence swept 0–20 substitutions, 500 offspring per cell at recombination rate 0.5. E12_nk repeats
|
parental divergence swept 0–20 substitutions, 500 offspring per cell at recombination rate 0.5.
|
||||||
the question on NK landscapes (`L = 16`, `K` 0–10, 40 parent pairs, 200 offspring).
|
|
||||||
|
|
||||||
*Validation.* Three closed forms are asserted as standing tests to within 0.5%: neutral
|
*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 immigration–drift equilibrium, and the
|
heterozygosity decay `E[H_t] = H_0(1 − 1/n)^t`, the exact immigration–drift equilibrium, and the
|
||||||
Binary file not shown.
|
|
@ -1,5 +1,5 @@
|
||||||
% Supplementary Information — readable single-column build (tectonic/XeLaTeX). Content is generated from si.md
|
% 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
|
\ifdefined\XeTeXversion\else\ifdefined\pdfoutput\pdfoutput=1\fi\fi
|
||||||
\documentclass[11pt]{article}
|
\documentclass[11pt]{article}
|
||||||
|
|
||||||
|
|
@ -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
|
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]
|
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]
|
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]
|
``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 & 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]
|
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 & E9--E10; directed selection rescues & Not yet mapped onto a real task-entanglement measure \\[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 & E14 & Phenomenon known to island-model evolutionary computation; the contribution here is the mapping and the diversity/mean decomposition \\[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]
|
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]
|
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]
|
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]
|
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]
|
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]
|
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]
|
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
|
\hline\end{tabular}\end{center}\medskip
|
||||||
|
|
||||||
\section*{SI Table S2: headline quantitative results}
|
\section*{SI Table S2: headline quantitative results}
|
||||||
|
|
@ -93,7 +93,7 @@ Headline quantitative results with sample sizes, uncertainty, and outcome defini
|
||||||
\hline
|
\hline
|
||||||
Result & Setting / n & Outcome definition & Headline \\ \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]
|
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]
|
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]
|
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]
|
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}}
|
\begin{tabular}{p{0.307\textwidth} p{0.307\textwidth} p{0.307\textwidth}}
|
||||||
\hline
|
\hline
|
||||||
Experiment & Replicates & Reasoning \\ \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]
|
\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]
|
||||||
E4 & 200 & Outcomes are per-item binary retentions, the highest-variance quantity in the paper \\[3pt]
|
\texttt{figS8\_multiparent\_union} & 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]
|
\texttt{figS9\_specialist\_superparent} & 40 & The vertical claim; the headline separation, so the most replicated of the genotype experiments \\[3pt]
|
||||||
E8 & 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]
|
||||||
E9, E10 & 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]
|
||||||
E11 & 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]
|
||||||
E12, E12\_nk & 15 & Each point already averages 500 (E12) or 200 (E12\_nk) offspring \\[3pt]
|
\texttt{figS13\_mating\_breadth} & 20 & Breadth \(\times\) ruggedness grid, 60 generations per cell \\[3pt]
|
||||||
E14 & 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]
|
||||||
kernel\_sharpen, 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]
|
||||||
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]
|
||||||
grounding & 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]
|
||||||
collapse, architectures & 5 & Sign-level demonstrations across architectures; each lineage retrains a network 22--25 times \\[3pt]
|
|
||||||
recombination & 8 & Operator contrast in trained weights \\[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, \_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]
|
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]
|
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{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.
|
\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).
|
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
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
|
|
@ -246,57 +245,57 @@ Sixteen figures are cited from the main text by number. Each is the per-experime
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s3
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s4
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s5
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s6
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s7
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s8
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s9
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s10
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s11
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s12
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
\begin{figure}[p]\centering % s13
|
\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}
|
\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}
|
\end{figure}
|
||||||
|
|
||||||
|
|
@ -8,7 +8,7 @@ reading.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
SI_FIGURES: dict[str, tuple[str, str]] = {
|
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 "
|
"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 "
|
"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, "
|
"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 "
|
"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 "
|
"subject of Fig.~S2). A variational autoencoder was excluded because it failed the generation-0 "
|
||||||
"fidelity check on this task."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"(the majority gains, nothing new appears); a trained network behaves as drift plus one of these two "
|
||||||
"biases, set by its architecture."),
|
"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 "
|
"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 "
|
"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 "
|
"(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 "
|
"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 "
|
"gone from every copy it cannot be rebuilt (Muller's ratchet); a diversity gate prevents the "
|
||||||
"shortcut from making the loss permanent."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"(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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"$\\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 "
|
"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."),
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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 "
|
"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."),
|
"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 "
|
"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 "
|
"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 "
|
"$[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 "
|
"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 "
|
"above zero throughout; random falls to about $-0.2$. In language models this is ``breed many "
|
||||||
"merges, keep the best'' (Table~S2)."),
|
"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 "
|
"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 "
|
"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, "
|
"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 "
|
"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 "
|
"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."),
|
"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. "
|
"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 "
|
"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 "
|
"an NK landscape of ruggedness $K \\in \\{0, 3, 6, 10\\}$; an offspring's second parent is drawn "
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
# Response to the third review (of the PNAS-format draft)
|
# Response to the third review (of the PNAS-format draft)
|
||||||
|
|
||||||
*All five priority fixes are made, plus the presentation items. The revised draft is
|
*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:*
|
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
|
## 1. The averaging proposition (your §2) — you are right, and the text now proves what it claims
|
||||||
|
|
|
||||||
|
|
@ -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
|
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)
|
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
|
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,
|
*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
|
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.,
|
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
|
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 Dobzhansky–Muller
|
super-linear (snowball) onset, and its dependence on epistasis — merge failure as a Dobzhansky–Muller
|
||||||
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
|
**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
|
"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
Loading…
Add table
Add a link
Reference in a new issue