From ab3dc1058793fc92dce264c7ea2d9f19be5173d4 Mon Sep 17 00:00:00 2001 From: Giorgio Gilestro Date: Sun, 13 Sep 2026 17:00:40 +0100 Subject: [PATCH] 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 Claude-Session: https://claude.ai/code/session_01Y64o8FKP7rCuXzC48pxpMm --- CLAUDE.md | 12 +-- Makefile | 40 +++++----- README.md | 21 ++--- REPRODUCING.md | 51 ++++++------ .../collapse_null.yaml} | 2 +- .../fig2_grounding_sweep.yaml} | 2 +- .../fig4_society_ablation.yaml} | 2 +- .../fig5_speciation_bdm.yaml} | 2 +- .../figS10_rugged_landscapes.yaml} | 2 +- .../figS11_directed_recombination.yaml} | 2 +- .../figS12_quality_diversity.yaml} | 2 +- .../figS13_mating_breadth.yaml} | 2 +- .../figS2_kernel_sharpen.yaml} | 4 +- .../figS2_kernel_smooth.yaml} | 4 +- .../figS3_rebaselining.yaml} | 2 +- .../figS5_aimed_grounding.yaml} | 2 +- .../figS8_multiparent_union.yaml} | 2 +- .../figS9_specialist_superparent.yaml} | 2 +- .../sexual_vs_asexual_lineage.yaml} | 2 +- .../speciation_bdm_nk.yaml} | 2 +- ...collapse.yaml => fig2_mnist_collapse.yaml} | 2 +- ...tectures.yaml => figS1_architectures.yaml} | 2 +- ...rounding.yaml => figS6_grounding_rnn.yaml} | 2 +- figures/mnist_montage.py | 6 +- figures/plot_bridge.py | 4 +- figures/plot_collapse.py | 2 +- figures/{plot_E1.py => plot_collapse_null.py} | 6 +- ...lot_E2.py => plot_fig2_grounding_sweep.py} | 12 +-- ...t_mnist.py => plot_fig2_mnist_collapse.py} | 8 +- ...t_E11.py => plot_fig4_society_ablation.py} | 6 +- ...lot_E12.py => plot_fig5_speciation_bdm.py} | 8 +- ...E9.py => plot_figS10_rugged_landscapes.py} | 6 +- ... => plot_figS11_directed_recombination.py} | 6 +- ...E5.py => plot_figS12_quality_diversity.py} | 6 +- ...t_E14.py => plot_figS13_mating_breadth.py} | 6 +- ...ectures.py => plot_figS1_architectures.py} | 6 +- ...{plot_E6.py => plot_figS3_rebaselining.py} | 6 +- ...ot_E3.py => plot_figS5_aimed_grounding.py} | 6 +- ...ounding.py => plot_figS6_grounding_rnn.py} | 10 +-- ..._E4.py => plot_figS8_multiparent_union.py} | 6 +- ...y => plot_figS9_specialist_superparent.py} | 6 +- figures/plot_kernel.py | 20 ++--- ...7.py => plot_sexual_vs_asexual_lineage.py} | 6 +- notebooks/01_biological_model.ipynb | 14 ++-- notebooks/02_paper_figures.ipynb | 72 ++++++++--------- paper/arxiv/md2tex.py | 4 +- paper/blueprint.md | 2 +- paper/{pnas => manuscript}/body.tex | 0 paper/{pnas => manuscript}/build.py | 12 +-- .../{pnas => manuscript}/build_lay_legends.py | 4 +- .../build_zotero_library.py | 4 +- .../{pnas => manuscript}/cover_letter_nmi.md | 0 paper/{pnas => manuscript}/figs/fig1a.pdf | Bin 226926 -> 226926 bytes paper/{pnas => manuscript}/figs/fig1b.pdf | Bin 422536 -> 422536 bytes paper/{pnas => manuscript}/figs/fig2.pdf | Bin 81001 -> 81001 bytes paper/{pnas => manuscript}/figs/fig3.pdf | Bin 408067 -> 408067 bytes paper/{pnas => manuscript}/figs/fig4.pdf | Bin 76426 -> 76426 bytes paper/{pnas => manuscript}/figs/fig5.pdf | Bin 48164 -> 48164 bytes paper/{pnas => manuscript}/figs/fig6.pdf | Bin paper/{pnas => manuscript}/figs/fig7.pdf | Bin paper/{pnas => manuscript}/figs/icons/pea.svg | 0 .../{pnas => manuscript}/figs/icons/robot.svg | 0 .../figs/si/s10_figS10_rugged_landscapes.pdf} | Bin .../si/s11_figS11_directed_recombination.pdf} | Bin .../figs/si/s12_figS12_quality_diversity.pdf} | Bin .../figs/si/s13_figS13_mating_breadth.pdf} | Bin .../figs/si/s14_curriculum_timing.pdf | Bin .../figs/si/s15_curriculum_cull.pdf | Bin .../figs/si/s16_llm_smol.pdf | Bin .../figs/si/s1_figS1_architectures.pdf} | Bin .../figs/si/s2_kernel.pdf | Bin .../figs/si/s3_figS3_rebaselining.pdf} | Bin .../figs/si/s4_fig2_grounding_sweep.pdf} | Bin .../figs/si/s5_figS5_aimed_grounding.pdf} | Bin .../figs/si/s6_figS6_grounding_rnn.pdf} | Bin .../figs/si/s7_fig2_mnist_collapse.pdf} | Bin .../figs/si/s8_figS8_multiparent_union.pdf} | Bin .../si/s9_figS9_specialist_superparent.pdf} | Bin .../figure_legends_for_students.md | 24 +++--- .../figure_legends_for_students.pdf | Bin 1752387 -> 1752387 bytes .../figure_legends_for_students.tex | 24 +++--- paper/{pnas => manuscript}/main.md | 0 paper/{pnas => manuscript}/main.pdf | Bin 1368785 -> 1368785 bytes paper/{pnas => manuscript}/main.tex | 0 paper/{pnas => manuscript}/make_figs.py | 18 ++--- .../refs/Evolution of sex for AI.ris | 0 paper/{pnas => manuscript}/refs/README.md | 2 +- .../refs/references.csl.json | 0 .../{pnas => manuscript}/refs/references.json | 0 .../{pnas => manuscript}/refs/references.ris | 0 paper/{pnas => manuscript}/refs/report.txt | 0 .../refs/resolution-report.tsv | 0 paper/{pnas => manuscript}/renumber_refs.py | 8 +- paper/{pnas => manuscript}/si.md | 70 +++++++++-------- paper/{pnas => manuscript}/si.pdf | Bin 625097 -> 629619 bytes paper/{pnas => manuscript}/si.tex | 2 +- paper/{pnas => manuscript}/si_body.tex | 73 +++++++++--------- paper/{pnas => manuscript}/si_figures.py | 26 +++---- paper/response-to-review-3.md | 2 +- paper/the-evolution-of-sex-for-ai.md | 4 +- pyproject.toml | 6 +- reproduce.sh | 4 +- results/{E1 => collapse_null}/README.md | 0 .../collapse_null.pdf} | Bin .../collapse_null.png} | Bin results/{E1 => collapse_null}/manifest.json | 0 .../resolved_config.yaml | 2 +- .../{E2 => fig2_grounding_sweep}/README.md | 0 .../fig2_grounding_sweep.pdf} | Bin .../fig2_grounding_sweep.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../fig2_mnist_collapse.pdf} | Bin .../fig2_mnist_collapse.png} | Bin .../manifest.json | 0 .../mnist_montage.pdf | Bin .../mnist_montage.png | Bin .../resolved_config.yaml | 2 +- .../{E11 => fig4_society_ablation}/README.md | 0 .../fig4_society_ablation.pdf} | Bin .../fig4_society_ablation.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../{E12 => fig5_speciation_bdm}/README.md | 4 +- .../fig5_speciation_bdm.pdf} | Bin .../fig5_speciation_bdm.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../figS10_rugged_landscapes.pdf} | Bin .../figS10_rugged_landscapes.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../figS11_directed_recombination.pdf} | Bin .../figS11_directed_recombination.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../figS12_quality_diversity.pdf} | Bin .../figS12_quality_diversity.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../{E14 => figS13_mating_breadth}/README.md | 0 .../figS13_mating_breadth.pdf} | Bin .../figS13_mating_breadth.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../figS1_architectures.pdf} | Bin .../figS1_architectures.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 2 +- .../kernel.pdf | Bin .../kernel.png | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 2 +- .../kernel.pdf | Bin .../kernel.png | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- results/{E6 => figS3_rebaselining}/README.md | 0 .../figS3_rebaselining.pdf} | Bin .../figS3_rebaselining.png} | Bin .../{E6 => figS3_rebaselining}/manifest.json | 0 .../resolved_config.yaml | 2 +- .../{E3 => figS5_aimed_grounding}/README.md | 0 .../figS5_aimed_grounding.pdf} | Bin .../figS5_aimed_grounding.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../figS6_grounding_rnn.pdf} | Bin .../figS6_grounding_rnn.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../{E4 => figS8_multiparent_union}/README.md | 0 .../figS8_multiparent_union.pdf} | Bin .../figS8_multiparent_union.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../figS9_specialist_superparent.pdf} | Bin .../figS9_specialist_superparent.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../README.md | 0 .../manifest.json | 0 .../resolved_config.yaml | 2 +- .../sexual_vs_asexual_lineage.pdf} | Bin .../sexual_vs_asexual_lineage.png} | Bin .../manifest.json | 0 .../resolved_config.yaml | 2 +- src/{knowledge => inheritance}/__init__.py | 0 src/{knowledge => inheritance}/analysis.py | 0 src/{knowledge => inheritance}/config.py | 0 .../dynamic_society.py | 0 src/{knowledge => inheritance}/experiment.py | 4 +- src/{knowledge => inheritance}/genotype.py | 0 .../genotype_lineage.py | 0 src/{knowledge => inheritance}/kernel.py | 0 src/{knowledge => inheritance}/lineage.py | 2 +- .../mating_system.py | 0 src/{knowledge => inheritance}/metrics.py | 0 src/{knowledge => inheritance}/seeding.py | 0 src/{knowledge => inheritance}/society.py | 0 src/{knowledge => inheritance}/speciation.py | 0 src/{knowledge => inheritance}/step.py | 0 src/{knowledge => inheritance}/teachers.py | 0 src/{knowledge => inheritance}/truth.py | 0 src/llm/experiment.py | 4 +- src/neural/__init__.py | 2 +- src/neural/config.py | 10 +-- src/neural/evaluate.py | 16 ++-- src/neural/experiment.py | 10 +-- src/neural/generation_loop.py | 12 +-- src/neural/mnist_data.py | 2 +- src/neural/mnist_loop.py | 8 +- src/neural/recombine.py | 8 +- src/neural/synthetic.py | 4 +- tasks/clarity-audit-2026-09-13.md | 2 +- tasks/lessons.md | 4 +- tasks/todo.md | 60 +++++++------- tasks/workorder-E2-analysis-addons.md | 10 +-- tasks/workorder-llm-society.md | 2 +- tasks/workorder-pnas-submission.md | 6 +- tests/test_analysis.py | 4 +- tests/test_correctness.py | 12 +-- tests/test_dynamic_society.py | 2 +- tests/test_genotype.py | 8 +- tests/test_kernel.py | 6 +- tests/test_mating_system.py | 4 +- tests/test_mnist.py | 2 +- tests/test_neural_torch.py | 2 +- tests/test_neural_validation.py | 6 +- tests/test_scientific_validation.py | 10 +-- tests/test_speciation.py | 2 +- 240 files changed, 477 insertions(+), 476 deletions(-) rename configs/{layer1/E1.yaml => inheritance/collapse_null.yaml} (96%) rename configs/{layer1/E2.yaml => inheritance/fig2_grounding_sweep.yaml} (96%) rename configs/{layer1/E11.yaml => inheritance/fig4_society_ablation.yaml} (97%) rename configs/{layer1/E12.yaml => inheritance/fig5_speciation_bdm.yaml} (97%) rename configs/{layer1/E9.yaml => inheritance/figS10_rugged_landscapes.yaml} (96%) rename configs/{layer1/E10.yaml => inheritance/figS11_directed_recombination.yaml} (96%) rename configs/{layer1/E5.yaml => inheritance/figS12_quality_diversity.yaml} (96%) rename configs/{layer1/E14.yaml => inheritance/figS13_mating_breadth.yaml} (97%) rename configs/{layer1/kernel_sharpen.yaml => inheritance/figS2_kernel_sharpen.yaml} (93%) rename configs/{layer1/kernel_smooth.yaml => inheritance/figS2_kernel_smooth.yaml} (94%) rename configs/{layer1/E6.yaml => inheritance/figS3_rebaselining.yaml} (98%) rename configs/{layer1/E3.yaml => inheritance/figS5_aimed_grounding.yaml} (97%) rename configs/{layer1/E4.yaml => inheritance/figS8_multiparent_union.yaml} (96%) rename configs/{layer1/E8.yaml => inheritance/figS9_specialist_superparent.yaml} (96%) rename configs/{layer1/E7.yaml => inheritance/sexual_vs_asexual_lineage.yaml} (96%) rename configs/{layer1/E12_nk.yaml => inheritance/speciation_bdm_nk.yaml} (96%) rename configs/neural/{mnist_collapse.yaml => fig2_mnist_collapse.yaml} (98%) rename configs/neural/{architectures.yaml => figS1_architectures.yaml} (97%) rename configs/neural/{grounding.yaml => figS6_grounding_rnn.yaml} (98%) rename figures/{plot_E1.py => plot_collapse_null.py} (92%) rename figures/{plot_E2.py => plot_fig2_grounding_sweep.py} (93%) rename figures/{plot_mnist.py => plot_fig2_mnist_collapse.py} (92%) rename figures/{plot_E11.py => plot_fig4_society_ablation.py} (93%) rename figures/{plot_E12.py => plot_fig5_speciation_bdm.py} (94%) rename figures/{plot_E9.py => plot_figS10_rugged_landscapes.py} (92%) rename figures/{plot_E10.py => plot_figS11_directed_recombination.py} (92%) rename figures/{plot_E5.py => plot_figS12_quality_diversity.py} (92%) rename figures/{plot_E14.py => plot_figS13_mating_breadth.py} (94%) rename figures/{plot_architectures.py => plot_figS1_architectures.py} (94%) rename figures/{plot_E6.py => plot_figS3_rebaselining.py} (94%) rename figures/{plot_E3.py => plot_figS5_aimed_grounding.py} (91%) rename figures/{plot_grounding.py => plot_figS6_grounding_rnn.py} (95%) rename figures/{plot_E4.py => plot_figS8_multiparent_union.py} (93%) rename figures/{plot_E8.py => plot_figS9_specialist_superparent.py} (92%) rename figures/{plot_E7.py => plot_sexual_vs_asexual_lineage.py} (91%) rename paper/{pnas => manuscript}/body.tex (100%) rename paper/{pnas => manuscript}/build.py (97%) rename paper/{pnas => manuscript}/build_lay_legends.py (90%) rename paper/{pnas => manuscript}/build_zotero_library.py (98%) rename paper/{pnas => manuscript}/cover_letter_nmi.md (100%) rename paper/{pnas => manuscript}/figs/fig1a.pdf (99%) rename paper/{pnas => manuscript}/figs/fig1b.pdf (99%) rename paper/{pnas => manuscript}/figs/fig2.pdf (99%) rename paper/{pnas => manuscript}/figs/fig3.pdf (99%) rename paper/{pnas => manuscript}/figs/fig4.pdf (99%) rename paper/{pnas => manuscript}/figs/fig5.pdf (99%) rename paper/{pnas => manuscript}/figs/fig6.pdf (100%) rename paper/{pnas => manuscript}/figs/fig7.pdf (100%) rename paper/{pnas => manuscript}/figs/icons/pea.svg (100%) rename paper/{pnas => manuscript}/figs/icons/robot.svg (100%) rename paper/{pnas/figs/si/s10_E9.pdf => manuscript/figs/si/s10_figS10_rugged_landscapes.pdf} (100%) rename paper/{pnas/figs/si/s11_E10.pdf => manuscript/figs/si/s11_figS11_directed_recombination.pdf} (100%) rename paper/{pnas/figs/si/s12_E5.pdf => manuscript/figs/si/s12_figS12_quality_diversity.pdf} (100%) rename paper/{pnas/figs/si/s13_E14.pdf => manuscript/figs/si/s13_figS13_mating_breadth.pdf} (100%) rename paper/{pnas => manuscript}/figs/si/s14_curriculum_timing.pdf (100%) rename paper/{pnas => manuscript}/figs/si/s15_curriculum_cull.pdf (100%) rename paper/{pnas => manuscript}/figs/si/s16_llm_smol.pdf (100%) rename paper/{pnas/figs/si/s1_architectures.pdf => manuscript/figs/si/s1_figS1_architectures.pdf} (100%) rename paper/{pnas => manuscript}/figs/si/s2_kernel.pdf (100%) rename paper/{pnas/figs/si/s3_E6.pdf => manuscript/figs/si/s3_figS3_rebaselining.pdf} (100%) rename paper/{pnas/figs/si/s4_E2.pdf => manuscript/figs/si/s4_fig2_grounding_sweep.pdf} (100%) rename paper/{pnas/figs/si/s5_E3.pdf => manuscript/figs/si/s5_figS5_aimed_grounding.pdf} (100%) rename paper/{pnas/figs/si/s6_grounding.pdf => manuscript/figs/si/s6_figS6_grounding_rnn.pdf} (100%) rename paper/{pnas/figs/si/s7_mnist_collapse.pdf => manuscript/figs/si/s7_fig2_mnist_collapse.pdf} (100%) rename paper/{pnas/figs/si/s8_E4.pdf => manuscript/figs/si/s8_figS8_multiparent_union.pdf} (100%) rename paper/{pnas/figs/si/s9_E8.pdf => manuscript/figs/si/s9_figS9_specialist_superparent.pdf} (100%) rename paper/{pnas => manuscript}/figure_legends_for_students.md (98%) rename paper/{pnas => manuscript}/figure_legends_for_students.pdf (99%) rename paper/{pnas => manuscript}/figure_legends_for_students.tex (97%) rename paper/{pnas => manuscript}/main.md (100%) rename paper/{pnas => manuscript}/main.pdf (99%) rename paper/{pnas => manuscript}/main.tex (100%) rename paper/{pnas => manuscript}/make_figs.py (98%) rename paper/{pnas => manuscript}/refs/Evolution of sex for AI.ris (100%) rename paper/{pnas => manuscript}/refs/README.md (98%) rename paper/{pnas => manuscript}/refs/references.csl.json (100%) rename paper/{pnas => manuscript}/refs/references.json (100%) rename paper/{pnas => manuscript}/refs/references.ris (100%) rename paper/{pnas => manuscript}/refs/report.txt (100%) rename paper/{pnas => manuscript}/refs/resolution-report.tsv (100%) rename paper/{pnas => manuscript}/renumber_refs.py (92%) rename paper/{pnas => manuscript}/si.md (90%) rename paper/{pnas => manuscript}/si.pdf (82%) rename paper/{pnas => manuscript}/si.tex (90%) rename paper/{pnas => manuscript}/si_body.tex (90%) rename paper/{pnas => manuscript}/si_figures.py (96%) rename results/{E1 => collapse_null}/README.md (100%) rename results/{E1/E1.pdf => collapse_null/collapse_null.pdf} (100%) rename results/{E1/E1.png => collapse_null/collapse_null.png} (100%) rename results/{E1 => collapse_null}/manifest.json (100%) rename results/{E1 => collapse_null}/resolved_config.yaml (97%) rename results/{E2 => fig2_grounding_sweep}/README.md (100%) rename results/{E2/E2.pdf => fig2_grounding_sweep/fig2_grounding_sweep.pdf} (100%) rename results/{E2/E2.png => fig2_grounding_sweep/fig2_grounding_sweep.png} (100%) rename results/{E2 => fig2_grounding_sweep}/manifest.json (100%) rename results/{E2 => fig2_grounding_sweep}/resolved_config.yaml (99%) rename results/{mnist_collapse => fig2_mnist_collapse}/README.md (100%) rename results/{mnist_collapse/mnist_collapse.pdf => fig2_mnist_collapse/fig2_mnist_collapse.pdf} (100%) rename results/{mnist_collapse/mnist_collapse.png => fig2_mnist_collapse/fig2_mnist_collapse.png} (100%) rename results/{mnist_collapse => fig2_mnist_collapse}/manifest.json (100%) rename results/{mnist_collapse => fig2_mnist_collapse}/mnist_montage.pdf (100%) rename results/{mnist_collapse => fig2_mnist_collapse}/mnist_montage.png (100%) rename results/{mnist_collapse => fig2_mnist_collapse}/resolved_config.yaml (98%) rename results/{E11 => fig4_society_ablation}/README.md (100%) rename results/{E11/E11.pdf => fig4_society_ablation/fig4_society_ablation.pdf} (100%) rename results/{E11/E11.png => fig4_society_ablation/fig4_society_ablation.png} (100%) rename results/{E11 => fig4_society_ablation}/manifest.json (100%) rename results/{E11 => fig4_society_ablation}/resolved_config.yaml (93%) rename results/{E12 => fig5_speciation_bdm}/README.md (93%) rename results/{E12/E12.pdf => fig5_speciation_bdm/fig5_speciation_bdm.pdf} (100%) rename results/{E12/E12.png => fig5_speciation_bdm/fig5_speciation_bdm.png} (100%) rename results/{E12 => fig5_speciation_bdm}/manifest.json (100%) rename results/{E12 => fig5_speciation_bdm}/resolved_config.yaml (91%) rename results/{E9 => figS10_rugged_landscapes}/README.md (100%) rename results/{E9/E9.pdf => figS10_rugged_landscapes/figS10_rugged_landscapes.pdf} (100%) rename results/{E9/E9.png => figS10_rugged_landscapes/figS10_rugged_landscapes.png} (100%) rename results/{E9 => figS10_rugged_landscapes}/manifest.json (100%) rename results/{E9 => figS10_rugged_landscapes}/resolved_config.yaml (89%) rename results/{E10 => figS11_directed_recombination}/README.md (100%) rename results/{E10/E10.pdf => figS11_directed_recombination/figS11_directed_recombination.pdf} (100%) rename results/{E10/E10.png => figS11_directed_recombination/figS11_directed_recombination.png} (100%) rename results/{E10 => figS11_directed_recombination}/manifest.json (100%) rename results/{E10 => figS11_directed_recombination}/resolved_config.yaml (86%) rename results/{E5 => figS12_quality_diversity}/README.md (100%) rename results/{E5/E5.pdf => figS12_quality_diversity/figS12_quality_diversity.pdf} (100%) rename results/{E5/E5.png => figS12_quality_diversity/figS12_quality_diversity.png} (100%) rename results/{E5 => figS12_quality_diversity}/manifest.json (100%) rename results/{E5 => figS12_quality_diversity}/resolved_config.yaml (99%) rename results/{E14 => figS13_mating_breadth}/README.md (100%) rename results/{E14/E14.pdf => figS13_mating_breadth/figS13_mating_breadth.pdf} (100%) rename results/{E14/E14.png => figS13_mating_breadth/figS13_mating_breadth.png} (100%) rename results/{E14 => figS13_mating_breadth}/manifest.json (100%) rename results/{E14 => figS13_mating_breadth}/resolved_config.yaml (91%) rename results/{architectures => figS1_architectures}/README.md (100%) rename results/{architectures/architectures.pdf => figS1_architectures/figS1_architectures.pdf} (100%) rename results/{architectures/architectures.png => figS1_architectures/figS1_architectures.png} (100%) rename results/{architectures => figS1_architectures}/manifest.json (100%) rename results/{architectures => figS1_architectures}/resolved_config.yaml (99%) rename results/{kernel_sharpen => figS2_kernel_sharpen}/README.md (96%) rename results/{kernel_sharpen => figS2_kernel_sharpen}/kernel.pdf (100%) rename results/{kernel_sharpen => figS2_kernel_sharpen}/kernel.png (100%) rename results/{kernel_sharpen => figS2_kernel_sharpen}/manifest.json (100%) rename results/{kernel_sharpen => figS2_kernel_sharpen}/resolved_config.yaml (97%) rename results/{kernel_smooth => figS2_kernel_smooth}/README.md (96%) rename results/{kernel_smooth => figS2_kernel_smooth}/kernel.pdf (100%) rename results/{kernel_smooth => figS2_kernel_smooth}/kernel.png (100%) rename results/{kernel_smooth => figS2_kernel_smooth}/manifest.json (100%) rename results/{kernel_smooth => figS2_kernel_smooth}/resolved_config.yaml (97%) rename results/{E6 => figS3_rebaselining}/README.md (100%) rename results/{E6/E6.pdf => figS3_rebaselining/figS3_rebaselining.pdf} (100%) rename results/{E6/E6.png => figS3_rebaselining/figS3_rebaselining.png} (100%) rename results/{E6 => figS3_rebaselining}/manifest.json (100%) rename results/{E6 => figS3_rebaselining}/resolved_config.yaml (98%) rename results/{E3 => figS5_aimed_grounding}/README.md (100%) rename results/{E3/E3.pdf => figS5_aimed_grounding/figS5_aimed_grounding.pdf} (100%) rename results/{E3/E3.png => figS5_aimed_grounding/figS5_aimed_grounding.png} (100%) rename results/{E3 => figS5_aimed_grounding}/manifest.json (100%) rename results/{E3 => figS5_aimed_grounding}/resolved_config.yaml (98%) rename results/{grounding => figS6_grounding_rnn}/README.md (100%) rename results/{grounding/grounding.pdf => figS6_grounding_rnn/figS6_grounding_rnn.pdf} (100%) rename results/{grounding/grounding.png => figS6_grounding_rnn/figS6_grounding_rnn.png} (100%) rename results/{grounding => figS6_grounding_rnn}/manifest.json (100%) rename results/{grounding => figS6_grounding_rnn}/resolved_config.yaml (99%) rename results/{E4 => figS8_multiparent_union}/README.md (100%) rename results/{E4/E4.pdf => figS8_multiparent_union/figS8_multiparent_union.pdf} (100%) rename results/{E4/E4.png => figS8_multiparent_union/figS8_multiparent_union.png} (100%) rename results/{E4 => figS8_multiparent_union}/manifest.json (100%) rename results/{E4 => figS8_multiparent_union}/resolved_config.yaml (92%) rename results/{E8 => figS9_specialist_superparent}/README.md (100%) rename results/{E8/E8.pdf => figS9_specialist_superparent/figS9_specialist_superparent.pdf} (100%) rename results/{E8/E8.png => figS9_specialist_superparent/figS9_specialist_superparent.png} (100%) rename results/{E8 => figS9_specialist_superparent}/manifest.json (100%) rename results/{E8 => figS9_specialist_superparent}/resolved_config.yaml (88%) rename results/{E7 => sexual_vs_asexual_lineage}/README.md (100%) rename results/{E7 => sexual_vs_asexual_lineage}/manifest.json (100%) rename results/{E7 => sexual_vs_asexual_lineage}/resolved_config.yaml (88%) rename results/{E7/E7.pdf => sexual_vs_asexual_lineage/sexual_vs_asexual_lineage.pdf} (100%) rename results/{E7/E7.png => sexual_vs_asexual_lineage/sexual_vs_asexual_lineage.png} (100%) rename results/{E12_nk => speciation_bdm_nk}/manifest.json (100%) rename results/{E12_nk => speciation_bdm_nk}/resolved_config.yaml (89%) rename src/{knowledge => inheritance}/__init__.py (100%) rename src/{knowledge => inheritance}/analysis.py (100%) rename src/{knowledge => inheritance}/config.py (100%) rename src/{knowledge => inheritance}/dynamic_society.py (100%) rename src/{knowledge => inheritance}/experiment.py (99%) rename src/{knowledge => inheritance}/genotype.py (100%) rename src/{knowledge => inheritance}/genotype_lineage.py (100%) rename src/{knowledge => inheritance}/kernel.py (100%) rename src/{knowledge => inheritance}/lineage.py (98%) rename src/{knowledge => inheritance}/mating_system.py (100%) rename src/{knowledge => inheritance}/metrics.py (100%) rename src/{knowledge => inheritance}/seeding.py (100%) rename src/{knowledge => inheritance}/society.py (100%) rename src/{knowledge => inheritance}/speciation.py (100%) rename src/{knowledge => inheritance}/step.py (100%) rename src/{knowledge => inheritance}/teachers.py (100%) rename src/{knowledge => inheritance}/truth.py (100%) diff --git a/CLAUDE.md b/CLAUDE.md index b13b03b..7da2ef7 100644 --- a/CLAUDE.md +++ b/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 -- **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: critical grounding `g* = 0.048 ≪ 1`; the E4 finding that mean-mixture distillation conserves collapse while only a union-preserving max-merge realises the recombination benefit. @@ -50,7 +50,7 @@ The population-genetics dictionary in blueprint §1 is the spine. Keep its abstr ## Two layers, staged by cost -- **Layer 1 — analytical core** (`src/knowledge/`). Pure NumPy/SciPy 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. 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). @@ -77,15 +77,15 @@ E4's whole purpose is to isolate the effect of teacher **decorrelation ρ**, so **Finding (2026-07-05, real-MNIST `mnist_collapse`) — collapse and grounding-rescue reproduce on real images.** External-validity tier: a small **convolutional VAE** (the canonical generative-collapse model) is retrained each generation on its own generated digits. Modes = digit class × stroke-thickness bin (K=30, Zipf, ~18 tail modes); the oracle is a **frozen CNN + deterministic thickness** at **98.5% mode accuracy** (its 30×30 confusion matrix is recorded in the manifest as the measurement floor). Result (4 reps): the **dry (g=0) lineage collapses to a single mode** — forward-KL 0.5→18, support 30→1, tail truth-mass 1.0→0.06, H→0 — while **10% grounding holds all 30 modes** (KL≈0.6, full tail, H≈0.9). The VAE needs ~10% grounding here vs the synthetic histogram's ~5%, consistent with the `grounding` finding that trained neural models need more grounding than the exact operator. **Confirmation-only (signs, not magnitudes; blueprint §3.5)** — the exact synthetic oracle stays the quantitative anchor. `figures/mnist_montage.py` is an eyeball diagnostic (re-runs a short dry lineage; NOT a parquet figure). Build gates passed: CNN mode accuracy 98.5%; VAE gen-0 recovers full 30/30 support (over-smooths frequencies, KL≈0.5, no prior hole — unlike the *synthetic*-codeword VAE, which is why the MNIST VAE works where that one didn't). The MNIST tier is heavy (torchvision `--extra mnist`, downloads MNIST, ~5 min): `make mnist`, kept out of the `make neural` loop. -**Finding (2026-07-05, learning kernel) — neutral drift is a null both real models fail, oppositely; the estimator bias is a signed operator.** Layer-1 extension (`knowledge/kernel.py`, `LearningKernelCfg`): the refit becomes `p_{t+1} = T_θ(counts/n)` with two pop-gen knobs — **reset `u`** (mutation toward a prior = smoothing) and **temperature `τ`** (sharpening = mode-competition) — both identity at their defaults, so the histogram bridge and every scientific-validation test are unchanged (68 core tests still green). Result: **neutral 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. **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. @@ -131,7 +131,7 @@ make all ./reproduce.sh # uv sync → test → run all at committed seeds → regen figures → REPRODUCED.md ``` -Single-experiment run pattern: one YAML config per experiment under `configs/layer1/EX.yaml` or `configs/layer2/CX.yaml`, fed to the experiment runner. Figures are regenerated separately by `figures/plot_EX.py` reading **only** `results.parquet` (no re-simulation). +Single-experiment run pattern: one YAML config per experiment under `configs/inheritance/EX.yaml` or `configs/layer2/CX.yaml`, fed to the experiment runner. Figures are regenerated separately by `figures/plot_EX.py` reading **only** `results.parquet` (no re-simulation). ## Non-negotiable engineering standard (blueprint §4) diff --git a/Makefile b/Makefile index b8f4618..fd206ed 100644 --- a/Makefile +++ b/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`. -.PHONY: env env-neural env-mnist env-llm env-notebooks test layer1 layer2 neural mnist llm \ +.PHONY: env env-neural env-mnist env-llm env-notebooks test inheritance neural mnist llm \ llm-epistasis llm-society llm-society-calib llm-society-calib-b llm-society-v2-smoke \ figures paper-figures paper notebooks clean env: ## build .venv from the committed lockfile uv sync --extra dev -env-neural: ## add the Layer 1.5 torch stack (GPU; Stage C onward) +env-neural: ## add the torch stack for the trained-network tier (GPU) uv sync --extra dev --extra neural env-mnist: ## add torchvision for the real-MNIST confirmation tier @@ -17,19 +17,19 @@ env-mnist: ## add torchvision for the real-MNIST confirmation tier test: ## correctness tests + scientific-validation tests (the spine of trust) uv run pytest -layer1: ## run experiments E1-E6 + the learning-kernel bridge (analytic) - for e in E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E12_nk E14 kernel_sharpen kernel_smooth; do uv run python -m knowledge.experiment configs/layer1/$$e.yaml; done +inheritance: ## run every inheritance-model experiment (analytic; bitwise reproducible) + for c in configs/inheritance/*.yaml; do uv run python -m inheritance.experiment "$$c"; done -neural: ## run Layer 1.5 synthetic neural experiments (excludes the MNIST/torchvision tiers) +neural: ## run the synthetic trained-network experiments (excludes the MNIST/torchvision tiers) for c in configs/neural/*.yaml; do case "$$c" in *mnist*|*speciation_real*) ;; \ *) uv run python -m neural.experiment "$$c" ;; esac; done -mnist: ## run the torchvision tiers: MNIST collapse + E13 real-weight speciation (needs env-mnist) - uv run python -m neural.experiment configs/neural/mnist_collapse.yaml +mnist: ## run the torchvision tiers: MNIST collapse + real-weight speciation (needs env-mnist) + uv run python -m neural.experiment configs/neural/fig2_mnist_collapse.yaml uv run python -m neural.experiment configs/neural/speciation_real.yaml uv run python -m neural.experiment configs/neural/speciation_real_cliff.yaml uv run python -m neural.experiment configs/neural/speciation_real_emergent.yaml - MPLBACKEND=Agg uv run python figures/mnist_montage.py # the asset paper Fig. 2B embeds + MPLBACKEND=Agg uv run python figures/mnist_montage.py # the asset paper Fig. 2A embeds env-llm: ## add the LLM stack for the Layer-2 prototype (GPU; transformers/peft) uv sync --extra dev --extra neural --extra llm @@ -76,21 +76,17 @@ llm-seeds: ## multi-seed firm-up (heavy): merge x5, moe-hard x3, directe uv run python -m llm.experiment configs/llm/moe_hard_seeds.yaml uv run python -m llm.experiment configs/llm/directed_hard_seeds.yaml -layer2: neural ## alias: Layer 1.5 is the current Layer-2 deliverable (LLM rung deferred) - figures: ## regenerate per-experiment figures from committed results (pure; no re-simulation) - for e in E1 E2 E3 E4 E5 E6; do MPLBACKEND=Agg uv run python figures/plot_$$e.py; done - for p in figures/plot_*.py; do case "$$p" in */plot_E[1-6].py|*/_*) ;; \ - *) [ -e "$$p" ] && MPLBACKEND=Agg uv run python "$$p" ;; esac; done + for p in figures/plot_*.py; do MPLBACKEND=Agg uv run python "$$p"; done -paper-figures: ## regenerate the manuscript figures (Fig. 1-7) and rebuild the PDF bodies - MPLBACKEND=Agg uv run python paper/pnas/make_figs.py - uv run python paper/pnas/build.py - uv run python paper/pnas/build.py si +paper-figures: ## regenerate the manuscript figures (Fig. 1-5) and rebuild the PDF bodies + MPLBACKEND=Agg uv run python paper/manuscript/make_figs.py + uv run python paper/manuscript/build.py + uv run python paper/manuscript/build.py si paper: paper-figures ## figures + compile both PDFs (needs tectonic) - cd paper/pnas && tectonic main.tex && tectonic si.tex - uv run python paper/pnas/build_lay_legends.py && cd paper/pnas && tectonic figure_legends_for_students.tex + cd paper/manuscript && tectonic main.tex && tectonic si.tex + uv run python paper/manuscript/build_lay_legends.py && cd paper/manuscript && tectonic figure_legends_for_students.tex env-notebooks: ## add Jupyter for the walkthrough notebooks uv sync --extra dev --extra notebooks @@ -99,6 +95,6 @@ notebooks: ## execute every notebook end-to-end (a reproduction check in for nb in notebooks/*.ipynb; do uv run jupyter nbconvert --to notebook --execute \ --inplace --ExecutePreprocessor.timeout=1800 "$$nb"; done -clean: ## remove caches and generated results (keeps committed manifests) +clean: ## remove caches and regenerable parquets (keeps committed manifests and figures) rm -rf .pytest_cache **/__pycache__ - find results -type f ! -name '.gitkeep' -delete 2>/dev/null || true + find results -name 'results.parquet' -delete 2>/dev/null || true # tracked manifests/figures stay diff --git a/README.md b/README.md index cce3d79..d356caa 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The framework is developed at three tiers of increasing realism: | 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 | | **Language models** | LoRA specialists on Qwen2.5-Instruct (0.5B / 7B) with an exact-match verifier | one GPU / L40S | @@ -25,7 +25,7 @@ and artifact-hash verification. ```bash curl -LsSf https://astral.sh/uv/install.sh | sh # one-time, if needed -./reproduce.sh # env -> tests -> biological-model tier at committed seeds -> figures +./reproduce.sh # env -> tests -> inheritance-model tier at committed seeds -> figures ./reproduce.sh --with-gpu # ... and the trained-network + language-model tiers ``` @@ -34,9 +34,9 @@ Or tier by tier: ```bash make env # build .venv from the committed, hash-pinned uv.lock make test # correctness + closed-form scientific validation (the spine of trust) -make layer1 # the biological model: E1-E12, E14, learning kernel +make inheritance # the inheritance model, every experiment at its committed seed make figures # per-experiment figures, from committed parquets (no re-simulation) -make paper-figures # the manuscript's Fig. 1-7 + rebuild the PDF body +make paper-figures # the manuscript's Fig. 1-5 + rebuild the PDF bodies ``` `make help` is not defined, but every target carries a `##` description — `grep '##' Makefile`. @@ -56,20 +56,21 @@ make env-notebooks && jupyter lab notebooks/ ## Layout ``` -src/knowledge/ biological-model tier (imported as `knowledge`) +src/inheritance/ inheritance-model tier (imported as `inheritance`) src/neural/ trained-network tier src/llm/ language-model tier -configs/ one YAML per experiment: layer1/ neural/ llm/ (each declares its master seed) +configs/ one YAML per experiment: inheritance/ neural/ llm/ (each declares its master seed) figures/ plot_*.py — per-experiment diagnostics, read results.parquet only -paper/pnas/ the manuscript: main.md, make_figs.py (Fig. 1-7), build.py, si.md +paper/manuscript/ the manuscript: main.md, si.md, make_figs.py (Fig. 1-5), si_figures.py, build.py notebooks/ executable walkthroughs hpc/ PBS job scripts for the 7B tier (Imperial CX3) tests/ correctness + test_scientific_validation.py (the closed forms as assertions) -results/ run artifacts: results.parquet (gitignored) + resolved_config.yaml + manifest.json +results/ run artifacts: results.parquet (gitignored) + resolved_config.yaml + manifest.json; + bundles are named after the manuscript figure they feed (fig2_*, figS4_*) ``` -Design documents: `paper/blueprint.md` (the normative build spec) and `paper/results-summary.md` -(plain-language + technical summary of every result). +Development history, design documents, pre-registrations and exploratory experiments that did not +reach the manuscript live on the `dev` branch; `main` holds only what reproduces the paper. ## The engineering contract diff --git a/REPRODUCING.md b/REPRODUCING.md index 98285ad..f1ff280 100644 --- a/REPRODUCING.md +++ b/REPRODUCING.md @@ -5,7 +5,7 @@ that produced it. Every figure panel, every headline number, and the environment in are listed below. If something in the paper is not traceable through this document, that is a bug — please open an issue. -Manuscript: `paper/pnas/main.md` (built to `paper/pnas/main.pdf`). +Manuscript: `paper/manuscript/main.md` (built to `paper/manuscript/main.pdf`). --- @@ -50,7 +50,7 @@ Tier by tier, by hand: ```bash make test # correctness + closed-form scientific validation -make layer1 # the inheritance model: E1-E12, E14, learning kernel +make inheritance # the inheritance model, every experiment at its committed seed make neural # trained networks (needs a GPU) make mnist # real-MNIST tier + the Fig. 2A montage asset (needs torchvision) make llm # language-model prototypes (needs a GPU) @@ -64,16 +64,16 @@ make paper-figures # the manuscript figures Fig. 1-5 + rebuild the PDF body ## 4. The figure map Every manuscript panel, the artifact it is plotted from, the config that produced that artifact, and -that config's declared seed. All panels are drawn by `paper/pnas/make_figs.py` (function per figure); +that config's declared seed. All panels are drawn by `paper/manuscript/make_figs.py` (function per figure); `make paper-figures` regenerates all of them. Figures are a **pure function of committed artifacts** — no panel re-simulates anything, with the single documented exception of the Fig. 2A montage asset. | Panel | Drawn by | From artifact | Produced by config | Seed(s) | |---|---|---|---|---| -| Fig. 1A, 1B | `fig1a()`, `fig1b()` | — (schematics; icons in `paper/pnas/figs/icons/`) | — | — | -| Fig. 2A | `fig2()` | `results/mnist_collapse/mnist_montage.png` | `configs/neural/mnist_collapse.yaml` → asset from `figures/mnist_montage.py` | 20260705 | -| Fig. 2B *(reference)* | `fig2()` | `results/E2/` | `configs/layer1/E2.yaml` | 20260704 | -| Fig. 3A | `fig3()` | — (schematic of the compared models; icons in `paper/pnas/figs/icons/`) | — | — | +| Fig. 1A, 1B | `fig1a()`, `fig1b()` | — (schematics; icons in `paper/manuscript/figs/icons/`) | — | — | +| Fig. 2A | `fig2()` | `results/fig2_mnist_collapse/mnist_montage.png` | `configs/neural/fig2_mnist_collapse.yaml` → asset from `figures/mnist_montage.py` | 20260705 | +| Fig. 2B *(reference)* | `fig2()` | `results/fig2_grounding_sweep/` | `configs/inheritance/fig2_grounding_sweep.yaml` | 20260704 | +| Fig. 3A | `fig3()` | — (schematic of the compared models; icons in `paper/manuscript/figs/icons/`) | — | — | | Fig. 3B | `fig3()` | `results/llm_merge_seeds/` | `configs/llm/merge_seeds.yaml` | 1, 2, 3, 4, 5 | | Fig. 3C | `fig3()` | `results/llm_moe_hard_hpc/s{1,2,3}/` | `configs/llm/moe_hard_hpc.yaml` (7B, HPC; seeds 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 | @@ -83,20 +83,26 @@ no panel re-simulates anything, with the single documented exception of the Fig. | Fig. S14 | `figures/plot_curriculum_timing.py` | `results/llm_curriculum_v5_{early,late,early_obl,late_obl}/s{1,2,3}/` | `configs/llm/curriculum_v5_{early,late}[_obl].yaml` via `hpc/llm_curriculum_timing.pbs`; statistics `figures/stats_llm_curriculum.py` | 1, 2, 3 | | Fig. S15 | `figures/plot_curriculum_cull.py` | `results/llm_curriculum_v5_cull/s{1,2,3}/` | `configs/llm/curriculum_v5_cull.yaml` via `hpc/llm_cull.pbs`; statistics `figures/stats_llm_curriculum.py` | 1, 2, 3 | | Fig. S16 | `figures/plot_llm_smol.py` | `results/llm_{merge_seeds,moe_hard_seeds}_smol/` (+ the Qwen bundles) | `configs/llm/{merge_seeds,moe_hard_seeds}_smol.yaml` via `hpc/llm_smol.pbs`; statistics `figures/stats_llm_smol.py` | 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. 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. 5E, 5F *(reference)* | `fig5()` | `results/E12/` | `configs/layer1/E12.yaml` | 12 | +| Fig. 5E, 5F *(reference)* | `fig5()` | `results/fig5_speciation_bdm/` | `configs/inheritance/fig5_speciation_bdm.yaml` | 12 | Panels marked *(reference)* are inheritance-model results included to set the expectation the real-model panels are read against, not as findings in their own right. **Inheritance-model results reported in SI only.** These have no real-model counterpart in the paper and reproduce known results, so they are cited as reference values and plotted only in SI, from their -per-experiment figures: blending vs union (E4), Fisher–Muller super-parent (E8), outbreeding -depression (E9), directed recombination (E10), and mate-pool breadth (E14), drawn by -`figures/plot_E{4,8,9,10,14}.py` from `results/E{4,8,9,10,14}/`. +per-experiment figures: blending vs union (`figS8_multiparent_union`), Fisher–Muller super-parent +(`figS9_specialist_superparent`), outbreeding depression (`figS10_rugged_landscapes`), directed +recombination (`figS11_directed_recombination`), and mate-pool breadth (`figS13_mating_breadth`), +each drawn by `figures/plot_.py` from `results//`. + +**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 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 | |---|---|---|---| -| Collapse null (E1) | `results/E1/` | `configs/layer1/E1.yaml` | 20260704 | -| Region-matched grounding (E3) | `results/E3/` | `configs/layer1/E3.yaml` | 20260704 | -| Quality-diversity vs greedy (E5) | `results/E5/` | `configs/layer1/E5.yaml` | 20260704 | -| Re-minting / irreversibility (E6) | `results/E6/` | `configs/layer1/E6.yaml` | 20260704 | -| Advantage of sex, lineage (E7) | `results/E7/` | `configs/layer1/E7.yaml` | 20260705 | -| Incompatibilities on NK (E12_nk) | `results/E12_nk/` | `configs/layer1/E12_nk.yaml` | 12 | -| Learning kernel (estimator bias) | `results/kernel_sharpen/`, `results/kernel_smooth/` | `configs/layer1/kernel_{sharpen,smooth}.yaml` | 20260705 | +| Region-matched grounding (Fig. S5) | `results/figS5_aimed_grounding/` | `configs/inheritance/figS5_aimed_grounding.yaml` | 20260704 | +| Quality-diversity vs greedy (Fig. S12) | `results/figS12_quality_diversity/` | `configs/inheritance/figS12_quality_diversity.yaml` | 20260704 | +| Re-baselining / irreversibility (Fig. S3) | `results/figS3_rebaselining/` | `configs/inheritance/figS3_rebaselining.yaml` | 20260704 | +| Learning kernel (Fig. S2) | `results/figS2_kernel_sharpen/`, `results/figS2_kernel_smooth/` | `configs/inheritance/figS2_kernel_{sharpen,smooth}.yaml` | 20260705 | | Histogram bridge gate | `results/bridge/` | `configs/neural/bridge.yaml` | 20260704 | -| Neural collapse / grounding / architectures / recombination | `results/{collapse,grounding,architectures,recombination}/` | `configs/neural/*.yaml` | 20260704 | +| Neural collapse / grounding / architectures / recombination | `results/{collapse,figS6_grounding_rnn,figS1_architectures,recombination}/` | `configs/neural/*.yaml` | 20260704 | | Emergent-isolation null | `results/speciation_real_emergent/` | `configs/neural/speciation_real_emergent.yaml` | 813 | | Budget-controlled speciation (add design) | `results/llm_speciation_add/` | `configs/llm/speciation_add.yaml` | 1, 2, 3 | -| LLM prototypes (0.5B) | `results/llm_{merge,moe,directed}/` | `configs/llm/{merge,moe,directed}.yaml` | 1 | +| 0.5B multi-seed runs | `results/llm_{merge_seeds,moe_hard_seeds,directed_hard_seeds}/` | `configs/llm/{merge_seeds,moe_hard_seeds,directed_hard_seeds}.yaml` | 1–5; 1–3; 1–3 | | 7B firm-ups | `results/llm_*_hpc/` | `configs/llm/*_hpc.yaml` (run via `hpc/*.pbs`) | 1 | ### Per-experiment (exploratory) figures @@ -132,7 +135,7 @@ sensitivity). ## 5. Seeds and determinism **Policy.** One master seed per config. All sub-randomness is derived from it via -`numpy.random.SeedSequence.spawn` (`src/knowledge/seeding.py`); no code touches global RNG state, and +`numpy.random.SeedSequence.spawn` (`src/inheritance/seeding.py`); no code touches global RNG state, and every `rng` is passed explicitly. A run is a pure function of its resolved config. **Biological-model tier: bitwise reproducible.** Re-running a config on the same lockfile @@ -185,7 +188,7 @@ same `uv.lock` environment, so the only difference from a local run is the GPU. ```bash qsub hpc/llm_merge.pbs # 7B merge firm-up qsub hpc/llm_hard.pbs # hard-benchmark moe + directed at 7B -qsub hpc/llm_society.pbs # the society campaign (array over seeds) +qsub hpc/llm_7b_seeds.pbs # seeds 2-3 of the three 7B experiments (array) ``` ## 8. Notebooks @@ -206,6 +209,6 @@ qsub hpc/llm_society.pbs # the society campaign (array over seeds) regenerated. The archived deposit (Zenodo DOI, on publication) includes the parquets so that the paper's "regenerates from committed artifacts without re-simulation" holds from the archive. - `figures/mnist_montage.py` re-runs a short dry lineage to draw its montage rather than reading a - parquet; it is an eyeball diagnostic whose quantitative counterpart is `results/mnist_collapse/`. + parquet; it is an eyeball diagnostic whose quantitative counterpart is `results/fig2_mnist_collapse/`. - The composed society at language-model scale is an open experiment at the time of writing; see `tasks/workorder-llm-society.md`. diff --git a/configs/layer1/E1.yaml b/configs/inheritance/collapse_null.yaml similarity index 96% rename from configs/layer1/E1.yaml rename to configs/inheritance/collapse_null.yaml index 3421b68..44aa685 100644 --- a/configs/layer1/E1.yaml +++ b/configs/inheritance/collapse_null.yaml @@ -29,4 +29,4 @@ metrics: # No sweep: a single condition. output: - dir: results/E1 + dir: results/collapse_null diff --git a/configs/layer1/E2.yaml b/configs/inheritance/fig2_grounding_sweep.yaml similarity index 96% rename from configs/layer1/E2.yaml rename to configs/inheritance/fig2_grounding_sweep.yaml index 05dcc6e..c1dac0b 100644 --- a/configs/layer1/E2.yaml +++ b/configs/inheritance/fig2_grounding_sweep.yaml @@ -33,4 +33,4 @@ sweep: values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4] output: - dir: results/E2 + dir: results/fig2_grounding_sweep diff --git a/configs/layer1/E11.yaml b/configs/inheritance/fig4_society_ablation.yaml similarity index 97% rename from configs/layer1/E11.yaml rename to configs/inheritance/fig4_society_ablation.yaml index 9caf284..f28373f 100644 --- a/configs/layer1/E11.yaml +++ b/configs/inheritance/fig4_society_ablation.yaml @@ -37,4 +37,4 @@ sweep: - {name: no_sex, set: {society.sex: false}} - {name: no_diversity, set: {society.select: greedy, society.novelty: 0.0}} -output: {dir: results/E11} +output: {dir: results/fig4_society_ablation} diff --git a/configs/layer1/E12.yaml b/configs/inheritance/fig5_speciation_bdm.yaml similarity index 97% rename from configs/layer1/E12.yaml rename to configs/inheritance/fig5_speciation_bdm.yaml index 6f983ac..77d6c57 100644 --- a/configs/layer1/E12.yaml +++ b/configs/inheritance/fig5_speciation_bdm.yaml @@ -25,4 +25,4 @@ speciation: n_offspring: 500 output: - dir: results/E12 + dir: results/fig5_speciation_bdm diff --git a/configs/layer1/E9.yaml b/configs/inheritance/figS10_rugged_landscapes.yaml similarity index 96% rename from configs/layer1/E9.yaml rename to configs/inheritance/figS10_rugged_landscapes.yaml index d3c17fe..be2a3e7 100644 --- a/configs/layer1/E9.yaml +++ b/configs/inheritance/figS10_rugged_landscapes.yaml @@ -24,4 +24,4 @@ sweep: - param: rate values: [0.0, 0.05, 0.1, 0.2, 0.35, 0.5] # clonal -> free recombination -output: {dir: results/E9} +output: {dir: results/figS10_rugged_landscapes} diff --git a/configs/layer1/E10.yaml b/configs/inheritance/figS11_directed_recombination.yaml similarity index 96% rename from configs/layer1/E10.yaml rename to configs/inheritance/figS11_directed_recombination.yaml index 9b349d5..ee3127a 100644 --- a/configs/layer1/E10.yaml +++ b/configs/inheritance/figS11_directed_recombination.yaml @@ -24,4 +24,4 @@ sweep: - param: K values: [2, 4, 6, 8, 10] # landscape ruggedness (all with parent diversity) -output: {dir: results/E10} +output: {dir: results/figS11_directed_recombination} diff --git a/configs/layer1/E5.yaml b/configs/inheritance/figS12_quality_diversity.yaml similarity index 96% rename from configs/layer1/E5.yaml rename to configs/inheritance/figS12_quality_diversity.yaml index 2deb1ce..7714c3f 100644 --- a/configs/layer1/E5.yaml +++ b/configs/inheritance/figS12_quality_diversity.yaml @@ -36,4 +36,4 @@ sweep: values: [0.5, 1.0, 2.0] output: - dir: results/E5 + dir: results/figS12_quality_diversity diff --git a/configs/layer1/E14.yaml b/configs/inheritance/figS13_mating_breadth.yaml similarity index 97% rename from configs/layer1/E14.yaml rename to configs/inheritance/figS13_mating_breadth.yaml index b9f0cab..4174af9 100644 --- a/configs/layer1/E14.yaml +++ b/configs/inheritance/figS13_mating_breadth.yaml @@ -31,4 +31,4 @@ sweep: - param: mating.breadth values: [0.03, 0.08, 0.17, 0.35, 0.6, 1.0] -output: {dir: results/E14} +output: {dir: results/figS13_mating_breadth} diff --git a/configs/layer1/kernel_sharpen.yaml b/configs/inheritance/figS2_kernel_sharpen.yaml similarity index 93% rename from configs/layer1/kernel_sharpen.yaml rename to configs/inheritance/figS2_kernel_sharpen.yaml index dc59c92..bb9f75a 100644 --- a/configs/layer1/kernel_sharpen.yaml +++ b/configs/inheritance/figS2_kernel_sharpen.yaml @@ -6,7 +6,7 @@ n_replicates: 24 # (Learning-kernel bridge, pro-collapse arm): does neutral Wright-Fisher explain the VAE's # collapse on MNIST? NO -- and that is the point. This matches the MNIST regime (K=30, n=6000, # Zipf) where drift is nearly inert: neutral (temperature=1.0) barely moves (H stays ~H*, ~all -# modes alive), yet the real VAE collapsed to a SINGLE mode (results/mnist_collapse). Adding the +# modes alive), yet the real VAE collapsed to a SINGLE mode (results/fig2_mnist_collapse). Adding the # estimator's sharpening / mode-competition (temperature<1: p ~ p^(1/tau)) reproduces the # catastrophic collapse. tau=0.8 is calibrated to reproduce collapse-to-one-mode. This is the # axis Riis (2026) names as future work: the estimator, not the sampling, drives VAE collapse. @@ -26,4 +26,4 @@ sweep: - param: dynamics.kernel.temperature values: [1.0, 0.8] # neutral (no collapse) vs sharpened (catastrophic collapse) -output: {dir: results/kernel_sharpen} +output: {dir: results/figS2_kernel_sharpen} diff --git a/configs/layer1/kernel_smooth.yaml b/configs/inheritance/figS2_kernel_smooth.yaml similarity index 94% rename from configs/layer1/kernel_smooth.yaml rename to configs/inheritance/figS2_kernel_smooth.yaml index 714e8d6..c3ec250 100644 --- a/configs/layer1/kernel_smooth.yaml +++ b/configs/inheritance/figS2_kernel_smooth.yaml @@ -6,7 +6,7 @@ n_replicates: 24 # (Learning-kernel bridge, anti-collapse arm): neutral Wright-Fisher OVER-predicts the RNN's # collapse. This matches the RNN grounding regime (K=256, n=200, Zipf): neutral (reset=0) drives # H all the way to 0, but the real RNN only PARTIALLY collapses -- H plateaus ~0.68 of a possible -# 0.88, forward-KL plateaus ~2 (does not diverge), ~half the tail stays alive (results/grounding). +# 0.88, forward-KL plateaus ~2 (does not diverge), ~half the tail stays alive (results/figS6_grounding_rnn). # The estimator's smoothing / regularisation supplies a diversity FLOOR. A mutation-toward-prior # knob (reset=u: p <- (1-u)p + u*uniform) reproduces the H-floor. reset=0.006 is calibrated to the # RNN's stationary dry H. Honest caveat carried in the write-up: uniform-mutation matches the @@ -29,4 +29,4 @@ sweep: - param: dynamics.kernel.reset values: [0.0, 0.006] # neutral (H -> 0) vs smoothed (H floors, like the RNN) -output: {dir: results/kernel_smooth} +output: {dir: results/figS2_kernel_smooth} diff --git a/configs/layer1/E6.yaml b/configs/inheritance/figS3_rebaselining.yaml similarity index 98% rename from configs/layer1/E6.yaml rename to configs/inheritance/figS3_rebaselining.yaml index ecbe7b3..fa38ddb 100644 --- a/configs/layer1/E6.yaml +++ b/configs/inheritance/figS3_rebaselining.yaml @@ -43,4 +43,4 @@ sweep: set: {dynamics.grounding.m: 1, dynamics.remint.enabled: false} output: - dir: results/E6 + dir: results/figS3_rebaselining diff --git a/configs/layer1/E3.yaml b/configs/inheritance/figS5_aimed_grounding.yaml similarity index 97% rename from configs/layer1/E3.yaml rename to configs/inheritance/figS5_aimed_grounding.yaml index ebcadd4..00f12cf 100644 --- a/configs/layer1/E3.yaml +++ b/configs/inheritance/figS5_aimed_grounding.yaml @@ -37,4 +37,4 @@ sweep: values: [uniform, matched] output: - dir: results/E3 + dir: results/figS5_aimed_grounding diff --git a/configs/layer1/E4.yaml b/configs/inheritance/figS8_multiparent_union.yaml similarity index 96% rename from configs/layer1/E4.yaml rename to configs/inheritance/figS8_multiparent_union.yaml index 8ac87b7..948a774 100644 --- a/configs/layer1/E4.yaml +++ b/configs/inheritance/figS8_multiparent_union.yaml @@ -31,4 +31,4 @@ sweep: values: [0.0, 0.02, 0.05] output: - dir: results/E4 + dir: results/figS8_multiparent_union diff --git a/configs/layer1/E8.yaml b/configs/inheritance/figS9_specialist_superparent.yaml similarity index 96% rename from configs/layer1/E8.yaml rename to configs/inheritance/figS9_specialist_superparent.yaml index 4c91f9b..07eaebc 100644 --- a/configs/layer1/E8.yaml +++ b/configs/inheritance/figS9_specialist_superparent.yaml @@ -26,4 +26,4 @@ sweep: - param: rho values: [0.0, 0.5, 1.0] # decorrelated -> identical parents (the control) -output: {dir: results/E8} +output: {dir: results/figS9_specialist_superparent} diff --git a/configs/layer1/E7.yaml b/configs/inheritance/sexual_vs_asexual_lineage.yaml similarity index 96% rename from configs/layer1/E7.yaml rename to configs/inheritance/sexual_vs_asexual_lineage.yaml index 0b58208..a69b5e2 100644 --- a/configs/layer1/E7.yaml +++ b/configs/inheritance/sexual_vs_asexual_lineage.yaml @@ -26,4 +26,4 @@ sweep: - param: genotype.recomb_rate values: [0.0, 1.0] # asexual vs sexual -output: {dir: results/E7} +output: {dir: results/sexual_vs_asexual_lineage} diff --git a/configs/layer1/E12_nk.yaml b/configs/inheritance/speciation_bdm_nk.yaml similarity index 96% rename from configs/layer1/E12_nk.yaml rename to configs/inheritance/speciation_bdm_nk.yaml index 0e27d2d..3b1669e 100644 --- a/configs/layer1/E12_nk.yaml +++ b/configs/inheritance/speciation_bdm_nk.yaml @@ -19,4 +19,4 @@ speciation: n_offspring: 200 output: - dir: results/E12_nk + dir: results/speciation_bdm_nk diff --git a/configs/neural/mnist_collapse.yaml b/configs/neural/fig2_mnist_collapse.yaml similarity index 98% rename from configs/neural/mnist_collapse.yaml rename to configs/neural/fig2_mnist_collapse.yaml index 40c604d..875ab0c 100644 --- a/configs/neural/mnist_collapse.yaml +++ b/configs/neural/fig2_mnist_collapse.yaml @@ -56,4 +56,4 @@ sweep: values: [0.0, 0.1] # dry vs grounded (VAE collapse is strong; needs ~10% real, cf. grounding) output: - dir: results/mnist_collapse + dir: results/fig2_mnist_collapse diff --git a/configs/neural/architectures.yaml b/configs/neural/figS1_architectures.yaml similarity index 97% rename from configs/neural/architectures.yaml rename to configs/neural/figS1_architectures.yaml index 232f121..ae40f45 100644 --- a/configs/neural/architectures.yaml +++ b/configs/neural/figS1_architectures.yaml @@ -51,4 +51,4 @@ sweep: values: [0.0, 0.05] output: - dir: results/architectures + dir: results/figS1_architectures diff --git a/configs/neural/grounding.yaml b/configs/neural/figS6_grounding_rnn.yaml similarity index 98% rename from configs/neural/grounding.yaml rename to configs/neural/figS6_grounding_rnn.yaml index c21e58e..0128109 100644 --- a/configs/neural/grounding.yaml +++ b/configs/neural/figS6_grounding_rnn.yaml @@ -63,4 +63,4 @@ sweep: values: [0.0, 0.005, 0.01, 0.02, 0.035, 0.05, 0.075, 0.1, 0.2] output: - dir: results/grounding + dir: results/figS6_grounding_rnn diff --git a/figures/mnist_montage.py b/figures/mnist_montage.py index c0ec277..ac5ecee 100644 --- a/figures/mnist_montage.py +++ b/figures/mnist_montage.py @@ -1,11 +1,11 @@ """Eyeball diagnostic: watch a dry MNIST lineage collapse, generation by generation. -Unlike the `plot_mnist` figure (a pure function of committed parquet), this **re-runs** a short +Unlike the `plot_fig2_mnist_collapse` figure (a pure function of committed parquet), this **re-runs** a short dry VAE lineage and saves a grid of freshly-generated digits at a few generations, so the collapse is visible directly — early generations show varied digits, late generations degenerate toward a single blurry mode. Diagnostic only; not part of the reproducible figure set. -Usage: python figures/mnist_montage.py [results/mnist_collapse] +Usage: python figures/mnist_montage.py [results/fig2_mnist_collapse] """ from __future__ import annotations @@ -28,7 +28,7 @@ _SNAP_GENS = [0, 4, 8, 12, 15] # generations to snapshot _COLS = 12 # sample digits per row -def main(out_dir: str = "results/mnist_collapse") -> None: +def main(out_dir: str = "results/fig2_mnist_collapse") -> None: cfg = MnistCfg() data = load_mnist(cfg.data_root) td = make_mnist_truth(cfg) diff --git a/figures/plot_bridge.py b/figures/plot_bridge.py index 8c656c4..a861c6b 100644 --- a/figures/plot_bridge.py +++ b/figures/plot_bridge.py @@ -24,8 +24,8 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig # noqa: E402 sys.path.insert(0, str(Path(__file__).parents[1] / "src")) -from knowledge.analysis import critical_grounding, reduce_to_stationary # noqa: E402 -from knowledge.metrics import heterozygosity # noqa: E402 +from inheritance.analysis import critical_grounding, reduce_to_stationary # noqa: E402 +from inheritance.metrics import heterozygosity # noqa: E402 from neural.config import SyntheticCfg # noqa: E402 from neural.synthetic import make_mode_truth # noqa: E402 diff --git a/figures/plot_collapse.py b/figures/plot_collapse.py index 4b7360b..5cd1587 100644 --- a/figures/plot_collapse.py +++ b/figures/plot_collapse.py @@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig # noqa: E402 sys.path.insert(0, str(Path(__file__).parents[1] / "src")) -from knowledge.metrics import heterozygosity # noqa: E402 +from inheritance.metrics import heterozygosity # noqa: E402 from neural.config import SyntheticCfg # noqa: E402 from neural.synthetic import make_mode_truth # noqa: E402 diff --git a/figures/plot_E1.py b/figures/plot_collapse_null.py similarity index 92% rename from figures/plot_E1.py rename to figures/plot_collapse_null.py index 18bd732..257d29d 100644 --- a/figures/plot_E1.py +++ b/figures/plot_collapse_null.py @@ -2,7 +2,7 @@ Shows tail-first collapse under pure neutral drift: geometric H decay matching the analytic law, tail items dying faster than head items, support -> 1 and forward-KL -diverging. Usage: python figures/plot_E1.py [results/E1] +diverging. Usage: python figures/plot_collapse_null.py [results/collapse_null] """ from __future__ import annotations @@ -17,7 +17,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig # noqa: E402 -def main(results_dir: str = "results/E1") -> None: +def main(results_dir: str = "results/collapse_null") -> None: df, cfg = load_bundle(results_dir) n = cfg["dynamics"]["n"] @@ -57,7 +57,7 @@ def main(results_dir: str = "results/E1") -> None: fig.suptitle("E1 — distillation without grounding collapses, tail first", y=1.02) fig.tight_layout() - savefig(fig, results_dir, "E1") + savefig(fig, results_dir, "collapse_null") if __name__ == "__main__": diff --git a/figures/plot_E2.py b/figures/plot_fig2_grounding_sweep.py similarity index 93% rename from figures/plot_E2.py rename to figures/plot_fig2_grounding_sweep.py index 2d44736..d3035f9 100644 --- a/figures/plot_E2.py +++ b/figures/plot_fig2_grounding_sweep.py @@ -5,7 +5,7 @@ stationary H vs g tracking the exact H_eq, with an operational g* (where H first 0.95·H*) and its bootstrap CI, and g=0 marked as a finite-time artifact; (C) tail coverage by item-count vs truth-mass — both stay low, the deep tail is largely unrescuable at feasible grounding; (D) per-rarity-band survival — the m·p*_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 @@ -20,12 +20,12 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402 sys.path.insert(0, str(Path(__file__).parents[1] / "src")) -from knowledge.analysis import critical_grounding, reduce_to_stationary # noqa: E402 -from knowledge.metrics import heterozygosity # noqa: E402 -from knowledge.truth import make_true_distribution # noqa: E402 +from inheritance.analysis import critical_grounding, reduce_to_stationary # noqa: E402 +from inheritance.metrics import heterozygosity # noqa: E402 +from inheritance.truth import make_true_distribution # noqa: E402 -def main(results_dir: str = "results/E2") -> None: +def main(results_dir: str = "results/fig2_grounding_sweep") -> None: df, cfg = load_bundle(results_dir) n = cfg["dynamics"]["n"] td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"], @@ -108,7 +108,7 @@ def main(results_dir: str = "results/E2") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E2") + savefig(fig, results_dir, "fig2_grounding_sweep") if __name__ == "__main__": diff --git a/figures/plot_mnist.py b/figures/plot_fig2_mnist_collapse.py similarity index 92% rename from figures/plot_mnist.py rename to figures/plot_fig2_mnist_collapse.py index c9e437c..357750d 100644 --- a/figures/plot_mnist.py +++ b/figures/plot_fig2_mnist_collapse.py @@ -10,7 +10,7 @@ Four panels, dry (g=0) vs grounded, mean ± 95% CI across replicates: (A) forwar (B) support size (distinct modes alive); (C) tail truth-mass alive; (D) heterozygosity. Reads the committed bundle (parquet) + manifest.json only. -Usage: python figures/plot_mnist.py [results/mnist_collapse] +Usage: python figures/plot_fig2_mnist_collapse.py [results/fig2_mnist_collapse] """ from __future__ import annotations @@ -26,7 +26,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, savefig, letter_axes # noqa: E402 sys.path.insert(0, str(Path(__file__).parents[1] / "src")) -from knowledge.metrics import heterozygosity # noqa: E402 +from inheritance.metrics import heterozygosity # noqa: E402 from neural.config import MnistCfg # noqa: E402 from neural.mnist_data import make_mnist_truth # noqa: E402 @@ -39,7 +39,7 @@ def _traj(df, g, col): return gens, grp.mean().to_numpy(), 1.96 * grp.sem().to_numpy() -def main(results_dir: str = "results/mnist_collapse") -> None: +def main(results_dir: str = "results/fig2_mnist_collapse") -> None: df, cfg = load_bundle(results_dir) syn = MnistCfg(**cfg["mnist"]) H_star = heterozygosity(make_mnist_truth(syn).p_star) @@ -72,7 +72,7 @@ def main(results_dir: str = "results/mnist_collapse") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "mnist_collapse") + savefig(fig, results_dir, "fig2_mnist_collapse") if __name__ == "__main__": diff --git a/figures/plot_E11.py b/figures/plot_fig4_society_ablation.py similarity index 93% rename from figures/plot_E11.py rename to figures/plot_fig4_society_ablation.py index 27955f9..ef57887 100644 --- a/figures/plot_E11.py +++ b/figures/plot_fig4_society_ablation.py @@ -13,7 +13,7 @@ almost immediately; (C) the self-consumption signature — conformity minus true population's mutual agreement exceeds its real capability), largest for no_grounding. Reads only the committed bundle. -Usage: python figures/plot_E11.py [results/E11] +Usage: python figures/plot_fig4_society_ablation.py [results/fig4_society_ablation] """ from __future__ import annotations @@ -32,7 +32,7 @@ _ARMS = [("full", "#2ca02c", "full society"), ("no_grounding", "#d62728", "no grounding (self-consumption)")] -def main(results_dir: str = "results/E11") -> None: +def main(results_dir: str = "results/fig4_society_ablation") -> None: df, _ = load_bundle(results_dir) arms = [a for a in _ARMS if a[0] in set(df["arm"].unique())] g_opt = df["global_opt"].mean() @@ -61,7 +61,7 @@ def main(results_dir: str = "results/E11") -> None: fig.suptitle("E11 — the dynamic Lamarckian society: grounding + directed sex + diversity climb to " "the optimum; remove any one and it breaks (the vertical claim, C3)", y=1.02, fontsize=12) fig.tight_layout() - savefig(fig, results_dir, "E11") + savefig(fig, results_dir, "fig4_society_ablation") if __name__ == "__main__": diff --git a/figures/plot_E12.py b/figures/plot_fig5_speciation_bdm.py similarity index 94% rename from figures/plot_E12.py rename to figures/plot_fig5_speciation_bdm.py index 3ba5260..396c55b 100644 --- a/figures/plot_E12.py +++ b/figures/plot_fig5_speciation_bdm.py @@ -8,7 +8,7 @@ vs divergence — the isolation cliff, moving to lower divergence as epistasis d epistasis wedge — as landscape ruggedness K grows, recombining two adapted local-optimum parents flips from a gain to outbreeding depression. -Usage: python figures/plot_E12.py +Usage: python figures/plot_fig5_speciation_bdm.py """ from __future__ import annotations @@ -30,8 +30,8 @@ def _agg(df, keys, value): def main() -> None: - bdm, _ = load_bundle("results/E12") - nk, _ = load_bundle("results/E12_nk") + bdm, _ = load_bundle("results/fig5_speciation_bdm") + nk, _ = load_bundle("results/speciation_bdm_nk") rhos = sorted(bdm["rho"].unique()) colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos))) @@ -72,7 +72,7 @@ def main() -> None: fig.suptitle("E12 — model speciation: when two diverged models are too incompatible to merge", y=1.02, fontsize=13) fig.tight_layout() - savefig(fig, "results/E12", "E12") + savefig(fig, "results/fig5_speciation_bdm", "E12") if __name__ == "__main__": diff --git a/figures/plot_E9.py b/figures/plot_figS10_rugged_landscapes.py similarity index 92% rename from figures/plot_E9.py rename to figures/plot_figS10_rugged_landscapes.py index 1061068..8bafe7b 100644 --- a/figures/plot_E9.py +++ b/figures/plot_figS10_rugged_landscapes.py @@ -12,7 +12,7 @@ Two panels: (A) the risk — mean offspring fitness minus best-parent vs recombi per ruggedness K (all ≤0, steeper as K grows); (B) with offspring selection — best-of-brood fitness vs rate per K, showing an intermediate optimum on rugged landscapes. Reads only the bundle. -Usage: python figures/plot_E9.py [results/E9] +Usage: python figures/plot_figS10_rugged_landscapes.py [results/figS10_rugged_landscapes] """ from __future__ import annotations @@ -27,7 +27,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, savefig, letter_axes # noqa: E402 -def main(results_dir: str = "results/E9") -> None: +def main(results_dir: str = "results/figS10_rugged_landscapes") -> None: df, _ = load_bundle(results_dir) Ks = sorted(df["K"].unique()) rates = sorted(df["rate"].unique()) @@ -58,7 +58,7 @@ def main(results_dir: str = "results/E9") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E9") + savefig(fig, results_dir, "figS10_rugged_landscapes") if __name__ == "__main__": diff --git a/figures/plot_E10.py b/figures/plot_figS11_directed_recombination.py similarity index 92% rename from figures/plot_E10.py rename to figures/plot_figS11_directed_recombination.py index 7d5f382..bca27ad 100644 --- a/figures/plot_E10.py +++ b/figures/plot_figS11_directed_recombination.py @@ -10,7 +10,7 @@ Two panels: (A) deployed capability vs landscape ruggedness — best single pare directed sex, and the global optimum; (B) each strategy's edge over the best parent, making the random-sex collapse and the directed-sex rescue explicit. Reads only the committed bundle. -Usage: python figures/plot_E10.py [results/E10] +Usage: python figures/plot_figS11_directed_recombination.py [results/figS11_directed_recombination] """ from __future__ import annotations @@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402 -def main(results_dir: str = "results/E10") -> None: +def main(results_dir: str = "results/figS11_directed_recombination") -> None: df, _ = load_bundle(results_dir) fig, axes = plt.subplots(1, 2, figsize=(13, 5)) @@ -57,7 +57,7 @@ def main(results_dir: str = "results/E10") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E10") + savefig(fig, results_dir, "figS11_directed_recombination") if __name__ == "__main__": diff --git a/figures/plot_E5.py b/figures/plot_figS12_quality_diversity.py similarity index 92% rename from figures/plot_E5.py rename to figures/plot_figS12_quality_diversity.py index 91247d0..cdbf213 100644 --- a/figures/plot_E5.py +++ b/figures/plot_figS12_quality_diversity.py @@ -3,7 +3,7 @@ At matched grounding, greedy (directional) selection drives the lineage toward the fittest items and collapses diversity, while quality-diversity selection (a novelty bonus w_i ∝ f_i·p_i^{-alpha}) maintains a high stationary heterozygosity that rises with the -novelty exponent alpha. Usage: python figures/plot_E5.py [results/E5] +novelty exponent alpha. Usage: python figures/plot_figS12_quality_diversity.py [results/figS12_quality_diversity] """ from __future__ import annotations @@ -18,7 +18,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, savefig, letter_axes # noqa: E402 -def main(results_dir: str = "results/E5") -> None: +def main(results_dir: str = "results/figS12_quality_diversity") -> None: df, cfg = load_bundle(results_dir) last = int(cfg["generations"] * 0.8) @@ -72,7 +72,7 @@ def main(results_dir: str = "results/E5") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E5") + savefig(fig, results_dir, "figS12_quality_diversity") if __name__ == "__main__": diff --git a/figures/plot_E14.py b/figures/plot_figS13_mating_breadth.py similarity index 94% rename from figures/plot_E14.py rename to figures/plot_figS13_mating_breadth.py index e4fa7f8..ca75f46 100644 --- a/figures/plot_E14.py +++ b/figures/plot_figS13_mating_breadth.py @@ -15,7 +15,7 @@ panmictic), one line per landscape ruggedness K: The tension between (A)/(C) is the result: promiscuity maximises the typical model and kills diversity; on rugged landscapes the best model needs preserved diversity, so an intermediate breadth wins. -Usage: python figures/plot_E14.py +Usage: python figures/plot_figS13_mating_breadth.py """ from __future__ import annotations @@ -30,7 +30,7 @@ from _figlib import load_bundle, savefig, letter_axes # noqa: E402 def main() -> None: - df, _ = load_bundle("results/E14") + df, _ = load_bundle("results/figS13_mating_breadth") last = df[df["generation"] == df["generation"].max()].copy() last["best_n"] = last["best_fitness"] / last["global_opt"] last["mean_n"] = last["mean_fitness"] / last["global_opt"] @@ -60,7 +60,7 @@ def main() -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, "results/E14", "E14") + savefig(fig, "results/figS13_mating_breadth", "E14") if __name__ == "__main__": diff --git a/figures/plot_architectures.py b/figures/plot_figS1_architectures.py similarity index 94% rename from figures/plot_architectures.py rename to figures/plot_figS1_architectures.py index 4fb9834..d9d2e59 100644 --- a/figures/plot_architectures.py +++ b/figures/plot_figS1_architectures.py @@ -10,7 +10,7 @@ Three panels: (A) forward-KL trajectories per architecture, dry (solid) vs groun (C) tail-item survival, dry vs grounded, grouped by architecture (all rise). Reads only the committed bundle. -Usage: python figures/plot_architectures.py [results/architectures] +Usage: python figures/plot_figS1_architectures.py [results/figS1_architectures] """ from __future__ import annotations @@ -29,7 +29,7 @@ _ARCH_LABEL = {"histogram": "histogram\n(exact)", "rnn": "GRU\n(autoregressive)" "mlp": "MLP\n(causal-masked)"} -def main(results_dir: str = "results/architectures") -> None: +def main(results_dir: str = "results/figS1_architectures") -> None: df, cfg = load_bundle(results_dir) kinds = [k for k in _ARCH_ORDER if k in set(df["kind"].unique())] g_dry, g_wet = min(df["g"].unique()), max(df["g"].unique()) @@ -74,7 +74,7 @@ def main(results_dir: str = "results/architectures") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "architectures") + savefig(fig, results_dir, "figS1_architectures") if __name__ == "__main__": diff --git a/figures/plot_E6.py b/figures/plot_figS3_rebaselining.py similarity index 94% rename from figures/plot_E6.py rename to figures/plot_figS3_rebaselining.py index f8b1c6b..f9b3581 100644 --- a/figures/plot_E6.py +++ b/figures/plot_figS3_rebaselining.py @@ -4,7 +4,7 @@ Re-minting freezes the current distribution as the new grounding reference and d the original truth. Re-minting a collapsed lineage locks in the collapse: KL to the original truth diverges, because the lost original tails can no longer be grounded. Gating re-mint on diversity refuses to re-mint while collapsed and keeps KL bounded; -re-minting a healthy lineage is harmless. Usage: python figures/plot_E6.py [results/E6] +re-minting a healthy lineage is harmless. Usage: python figures/plot_figS3_rebaselining.py [results/figS3_rebaselining] """ from __future__ import annotations @@ -26,7 +26,7 @@ STYLE = { } -def main(results_dir: str = "results/E6") -> None: +def main(results_dir: str = "results/figS3_rebaselining") -> None: df, cfg = load_bundle(results_dir) period = cfg["dynamics"]["remint"]["period"] G = cfg["generations"] @@ -69,7 +69,7 @@ def main(results_dir: str = "results/E6") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E6") + savefig(fig, results_dir, "figS3_rebaselining") if __name__ == "__main__": diff --git a/figures/plot_E3.py b/figures/plot_figS5_aimed_grounding.py similarity index 91% rename from figures/plot_E3.py rename to figures/plot_figS5_aimed_grounding.py index ebe4ebf..aa4a7d7 100644 --- a/figures/plot_E3.py +++ b/figures/plot_figS5_aimed_grounding.py @@ -3,7 +3,7 @@ Shows that grounding must *overlap* the content it protects. At the same total budget, uniform grounding spreads thin and lets the exercised region's tail collapse, while matched grounding concentrates on that region and keeps its rare items alive (at the cost -of the regions it does not touch). Usage: python figures/plot_E3.py [results/E3] +of the regions it does not touch). Usage: python figures/plot_figS5_aimed_grounding.py [results/figS5_aimed_grounding] Metric: per-region tail-item survival. (Per-region *heterozygosity* is confounded by region mass under matched grounding, so it is deliberately not used here.) @@ -21,7 +21,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, savefig, letter_axes # noqa: E402 -def main(results_dir: str = "results/E3") -> None: +def main(results_dir: str = "results/figS5_aimed_grounding") -> None: df, cfg = load_bundle(results_dir) R = cfg["truth"]["R"] exercised = cfg["dynamics"]["grounding"]["exercised"] @@ -66,7 +66,7 @@ def main(results_dir: str = "results/E3") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E3") + savefig(fig, results_dir, "figS5_aimed_grounding") if __name__ == "__main__": diff --git a/figures/plot_grounding.py b/figures/plot_figS6_grounding_rnn.py similarity index 95% rename from figures/plot_grounding.py rename to figures/plot_figS6_grounding_rnn.py index 5873da2..7d452bd 100644 --- a/figures/plot_grounding.py +++ b/figures/plot_figS6_grounding_rnn.py @@ -14,7 +14,7 @@ recovery grounding (≈Layer-1's 0.048) and the note that full recovery needs mu smoothing model; (D) the metric-choice panel — H and tail-survival are flat/non-monotone while forward-KL responds. Reads only the committed bundle. -Usage: python figures/plot_grounding.py [results/grounding] +Usage: python figures/plot_figS6_grounding_rnn.py [results/figS6_grounding_rnn] """ from __future__ import annotations @@ -29,8 +29,8 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402 sys.path.insert(0, str(Path(__file__).parents[1] / "src")) -from knowledge.analysis import reduce_to_stationary # noqa: E402 -from knowledge.metrics import heterozygosity # noqa: E402 +from inheritance.analysis import reduce_to_stationary # noqa: E402 +from inheritance.metrics import heterozygosity # noqa: E402 from neural.config import SyntheticCfg # noqa: E402 from neural.synthetic import make_mode_truth # noqa: E402 @@ -63,7 +63,7 @@ def _recovery_gstar(piv: np.ndarray, gs: np.ndarray, frac: float, seed: int = 7) return float(pt), float(lo), float(hi) -def main(results_dir: str = "results/grounding") -> None: +def main(results_dir: str = "results/figS6_grounding_rnn") -> None: df, cfg = load_bundle(results_dir) syn = SyntheticCfg(**cfg["synthetic"]) H_star = heterozygosity(make_mode_truth(syn).p_star) @@ -133,7 +133,7 @@ def main(results_dir: str = "results/grounding") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "grounding") + savefig(fig, results_dir, "figS6_grounding_rnn") if __name__ == "__main__": diff --git a/figures/plot_E4.py b/figures/plot_figS8_multiparent_union.py similarity index 93% rename from figures/plot_E4.py rename to figures/plot_figS8_multiparent_union.py index acb101e..c9f25dd 100644 --- a/figures/plot_E4.py +++ b/figures/plot_figS8_multiparent_union.py @@ -4,7 +4,7 @@ Three panels tell the honest story: (A) union coverage rises with K_T and decorr matching the exact closed form (recombination *supplies* the tail); (B) that supply is realised in the pupil only under a union-preserving merge — mean-mixture distillation dilutes it away (flat in K_T) while max-merge keeps it; (C) the union-surviving gap. -Usage: python figures/plot_E4.py [results/E4] +Usage: python figures/plot_figS8_multiparent_union.py [results/figS8_multiparent_union] """ from __future__ import annotations @@ -23,7 +23,7 @@ def U_closed(K_T, rho, q): return rho * q + (1 - rho) * (1 - (1 - q) ** K_T) -def main(results_dir: str = "results/E4") -> None: +def main(results_dir: str = "results/figS8_multiparent_union") -> None: df, cfg = load_bundle(results_dir) q = cfg["coverage"]["q"] K_Ts = sorted(df["K_T"].unique()) @@ -71,7 +71,7 @@ def main(results_dir: str = "results/E4") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E4") + savefig(fig, results_dir, "figS8_multiparent_union") if __name__ == "__main__": diff --git a/figures/plot_E8.py b/figures/plot_figS9_specialist_superparent.py similarity index 92% rename from figures/plot_E8.py rename to figures/plot_figS9_specialist_superparent.py index 693d308..8605b6c 100644 --- a/figures/plot_E8.py +++ b/figures/plot_figS9_specialist_superparent.py @@ -11,7 +11,7 @@ mean-mixture "model soup" plateau below; (B) the decorrelation control — sexua count for ρ ∈ {0, 0.5, 1}: decorrelated parents (ρ=0) climb to the optimum, identical parents (ρ=1) buy nothing. Reads only the committed bundle. -Usage: python figures/plot_E8.py [results/E8] +Usage: python figures/plot_figS9_specialist_superparent.py [results/figS9_specialist_superparent] """ from __future__ import annotations @@ -26,7 +26,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig, letter_axes # noqa: E402 -def main(results_dir: str = "results/E8") -> None: +def main(results_dir: str = "results/figS9_specialist_superparent") -> None: df, cfg = load_bundle(results_dir) L = cfg["society"]["L"] rhos = sorted(df["rho"].unique()) @@ -60,7 +60,7 @@ def main(results_dir: str = "results/E8") -> None: fig.tight_layout() letter_axes(fig) - savefig(fig, results_dir, "E8") + savefig(fig, results_dir, "figS9_specialist_superparent") if __name__ == "__main__": diff --git a/figures/plot_kernel.py b/figures/plot_kernel.py index 63215fd..9cbbfae 100644 --- a/figures/plot_kernel.py +++ b/figures/plot_kernel.py @@ -13,7 +13,7 @@ one knob of the learning kernel: estimator REMOVES collapse pressure. Analytic arms are read from results/kernel_{sharpen,smooth}; the neural reference endpoints -(dashed) are read from the committed results/mnist_collapse and results/grounding parquets — so the +(dashed) are read from the committed results/fig2_mnist_collapse and results/figS6_grounding_rnn parquets — so the figure is a pure function of committed artifacts. Usage: python figures/plot_kernel.py @@ -31,8 +31,8 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, savefig, letter_axes # noqa: E402 sys.path.insert(0, str(Path(__file__).parents[1] / "src")) -from knowledge.metrics import heterozygosity # noqa: E402 -from knowledge.truth import make_true_distribution # noqa: E402 +from inheritance.metrics import heterozygosity # noqa: E402 +from inheritance.truth import make_true_distribution # noqa: E402 def _mean_traj(df, knob, val, col): @@ -52,8 +52,8 @@ def _neural_dry(results_dir, col, stationary_frac=0.0): def main() -> None: - sh, sh_cfg = load_bundle("results/kernel_sharpen") - sm, sm_cfg = load_bundle("results/kernel_smooth") + sh, sh_cfg = load_bundle("results/figS2_kernel_sharpen") + sm, sm_cfg = load_bundle("results/figS2_kernel_smooth") Hstar_sh = heterozygosity(make_true_distribution( sh_cfg["truth"]["K"], 1, "zipf", 0.5, sh_cfg["truth"]["zipf_s"], 0, tail_threshold=sh_cfg["truth"]["tail_threshold"]).p_star) @@ -62,10 +62,10 @@ def main() -> None: tail_threshold=sm_cfg["truth"]["tail_threshold"]).p_star) # Neural reference endpoints (dashed) from the committed neural runs. - vae_H = _neural_dry("results/mnist_collapse", "heterozygosity") - vae_sup = _neural_dry("results/mnist_collapse", "support_size") - rnn_H = _neural_dry("results/grounding", "heterozygosity", stationary_frac=0.4) - rnn_KL = _neural_dry("results/grounding", "forward_kl", stationary_frac=0.4) + vae_H = _neural_dry("results/fig2_mnist_collapse", "heterozygosity") + vae_sup = _neural_dry("results/fig2_mnist_collapse", "support_size") + rnn_H = _neural_dry("results/figS6_grounding_rnn", "heterozygosity", stationary_frac=0.4) + rnn_KL = _neural_dry("results/figS6_grounding_rnn", "forward_kl", stationary_frac=0.4) fig, axes = plt.subplots(2, 2, figsize=(13, 9)) NEU, KER = "#1f77b4", "#d62728" @@ -111,7 +111,7 @@ def main() -> None: ax.legend(frameon=False, fontsize=8) fig.tight_layout() - for d in ("results/kernel_sharpen", "results/kernel_smooth"): + for d in ("results/figS2_kernel_sharpen", "results/figS2_kernel_smooth"): letter_axes(fig) savefig(fig, d, "kernel") diff --git a/figures/plot_E7.py b/figures/plot_sexual_vs_asexual_lineage.py similarity index 91% rename from figures/plot_E7.py rename to figures/plot_sexual_vs_asexual_lineage.py index ac52358..bdcfc40 100644 --- a/figures/plot_E7.py +++ b/figures/plot_sexual_vs_asexual_lineage.py @@ -10,7 +10,7 @@ Two panels: (A) mean-fitness adaptation curves, asexual vs sexual, over generati disequilibrium over generations — asexual holds beneficial alleles in disequilibrium (scattered across genotypes) while sexual drives it to ~0 (assembled), the mechanism of the speed gap. -Usage: python figures/plot_E7.py [results/E7] +Usage: python figures/plot_sexual_vs_asexual_lineage.py [results/sexual_vs_asexual_lineage] """ from __future__ import annotations @@ -24,7 +24,7 @@ sys.path.insert(0, str(Path(__file__).parent)) from _figlib import load_bundle, mean_ci, savefig # noqa: E402 -def main(results_dir: str = "results/E7") -> None: +def main(results_dir: str = "results/sexual_vs_asexual_lineage") -> None: df, cfg = load_bundle(results_dir) L = cfg["genotype"]["L"] arms = [(0.0, "#7f7f7f", "asexual (clonal)"), (1.0, "#d62728", "sexual (recombining)")] @@ -55,7 +55,7 @@ def main(results_dir: str = "results/E7") -> None: fig.suptitle("E7 — the advantage of sex: recombination reassorts beneficial alleles that arose " "in different lineages", y=1.02, fontsize=12) fig.tight_layout() - savefig(fig, results_dir, "E7") + savefig(fig, results_dir, "sexual_vs_asexual_lineage") if __name__ == "__main__": diff --git a/notebooks/01_biological_model.ipynb b/notebooks/01_biological_model.ipynb index 16375d1..4fbe2cf 100644 --- a/notebooks/01_biological_model.ipynb +++ b/notebooks/01_biological_model.ipynb @@ -46,9 +46,9 @@ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", - "from knowledge.lineage import run_lineage\n", - "from knowledge.metrics import heterozygosity\n", - "from knowledge.truth import make_true_distribution\n", + "from inheritance.lineage import run_lineage\n", + "from inheritance.metrics import heterozygosity\n", + "from inheritance.truth import make_true_distribution\n", "\n", "K, N_SAMPLES = 200, 100 # K items of knowledge; n samples drawn per generation\n", "print('ready')" @@ -127,7 +127,7 @@ "process — the textbook model of neutral evolution in a finite population of size `n`.\n", "\n", "The config below is the same schema the experiments use, so anything you learn here transfers\n", - "directly to `configs/layer1/*.yaml`." + "directly to `configs/inheritance/*.yaml`." ] }, { @@ -430,7 +430,7 @@ "output_type": "stream", "text": [ "first swept point retaining 95% of H*: g = 0.091 (m = 10)\n", - "the paper reports g ~ 0.05 for its tested setting; see results/E2 and Fig. 2A\n", + "the paper reports g ~ 0.05 for its tested setting; see results/fig2_grounding_sweep and Fig. 2A\n", "\n", "common item (p=1e-02): seen once per batch at m ~ 100 -> P(seen | m=1000) = 100.0%\n", "rare item (p=1e-03): seen once per batch at m ~ 1,000 -> P(seen | m=1000) = 63.2%\n", @@ -442,7 +442,7 @@ "target = 0.95\n", "i = int(np.argmax(np.array(sim) >= target * H_star))\n", "print(f'first swept point retaining {target:.0%} of H*: g = {g[i]:.3f} (m = {ms[i]})')\n", - "print('the paper reports g ~ 0.05 for its tested setting; see results/E2 and Fig. 2A\\n')\n", + "print('the paper reports g ~ 0.05 for its tested setting; see results/fig2_grounding_sweep and Fig. 2A\\n')\n", "\n", "for p, label in [(1e-2, 'common'), (1e-3, 'rare'), (1e-4, 'very rare')]:\n", " need = 1 / p\n", @@ -458,7 +458,7 @@ "## Where to go next\n", "\n", "- `02_paper_figures.ipynb` — regenerate every manuscript figure from the committed artifacts.\n", - "- `configs/layer1/E2.yaml` — the full grounding sweep this notebook miniaturises (Fig. 2A).\n", + "- `configs/inheritance/fig2_grounding_sweep.yaml` — the full grounding sweep this notebook miniaturises (Fig. 2A).\n", "- `REPRODUCING.md` — the map from each paper panel to its config and seed.\n", "- `tests/test_scientific_validation.py` — these same identities as assertions; if they fail, the\n", " science is wrong, not just the code." diff --git a/notebooks/02_paper_figures.ipynb b/notebooks/02_paper_figures.ipynb index 56a2d86..5d06d54 100644 --- a/notebooks/02_paper_figures.ipynb +++ b/notebooks/02_paper_figures.ipynb @@ -40,7 +40,7 @@ "import sys, pathlib, json, hashlib\n", "\n", "ROOT = pathlib.Path.cwd().parent\n", - "sys.path.insert(0, str(ROOT / 'paper' / 'pnas'))\n", + "sys.path.insert(0, str(ROOT / 'paper' / 'manuscript'))\n", "\n", "import make_figs # note: importing this chdir's to the repo root, by design\n", "from IPython.display import IFrame, display, Markdown\n", @@ -79,18 +79,18 @@ "| Panel | Artifact | Config | Seed(s) |\n", "|---|---|---|---|\n", "| Fig. 1A/1B | `schematics (no data)` | `-` | - |\n", - "| Fig. 2A | `results/E2` | `configs/layer1/E2.yaml` | 20260704 |\n", - "| Fig. 2B | `results/mnist_collapse` | `configs/neural/mnist_collapse.yaml` | 20260705 |\n", + "| Fig. 2A | `results/fig2_grounding_sweep` | `configs/inheritance/fig2_grounding_sweep.yaml` | 20260704 |\n", + "| Fig. 2B | `results/fig2_mnist_collapse` | `configs/neural/fig2_mnist_collapse.yaml` | 20260705 |\n", "| Fig. 3A | `results/llm_merge_seeds` | `configs/llm/merge_seeds.yaml` | 1-5 |\n", "| Fig. 3B | `results/llm_moe_hard_hpc` | `configs/llm/moe_hard_hpc.yaml` | 1 |\n", "| Fig. 3C/3D | `results/llm_epistasis(_compat)` | `configs/llm/epistasis*.yaml` | 1-3 |\n", - "| Fig. 4A | `results/E4` | `configs/layer1/E4.yaml` | 20260704 |\n", - "| Fig. 4B | `results/E8` | `configs/layer1/E8.yaml` | 20260705 |\n", - "| Fig. 5A | `results/E9` | `configs/layer1/E9.yaml` | 20260705 |\n", - "| Fig. 5B | `results/E10` | `configs/layer1/E10.yaml` | 20260705 |\n", - "| Fig. 5C/5D | `results/E14` | `configs/layer1/E14.yaml` | 20260709 |\n", - "| Fig. 6A-C | `results/E11` | `configs/layer1/E11.yaml` | 20260705 |\n", - "| Fig. 7A/7B | `results/E12` | `configs/layer1/E12.yaml` | 12 |\n", + "| Fig. 4A | `results/figS8_multiparent_union` | `configs/inheritance/figS8_multiparent_union.yaml` | 20260704 |\n", + "| Fig. 4B | `results/figS9_specialist_superparent` | `configs/inheritance/figS9_specialist_superparent.yaml` | 20260705 |\n", + "| Fig. 5A | `results/figS10_rugged_landscapes` | `configs/inheritance/figS10_rugged_landscapes.yaml` | 20260705 |\n", + "| Fig. 5B | `results/figS11_directed_recombination` | `configs/inheritance/figS11_directed_recombination.yaml` | 20260705 |\n", + "| Fig. 5C/5D | `results/figS13_mating_breadth` | `configs/inheritance/figS13_mating_breadth.yaml` | 20260709 |\n", + "| Fig. 6A-C | `results/fig4_society_ablation` | `configs/inheritance/fig4_society_ablation.yaml` | 20260705 |\n", + "| Fig. 7A/7B | `results/fig5_speciation_bdm` | `configs/inheritance/fig5_speciation_bdm.yaml` | 12 |\n", "| Fig. 7C | `results/speciation_real` | `configs/neural/speciation_real.yaml` | 13 |\n", "| Fig. 7D | `results/speciation_real_cliff` | `configs/neural/speciation_real_cliff.yaml` | 13 |\n", "| Fig. 7E/7F | `results/llm_speciation` | `configs/llm/speciation.yaml` | 1 |" @@ -106,18 +106,18 @@ "source": [ "PROVENANCE = [\n", " ('Fig. 1A/1B', 'schematics (no data)', '-', '-'),\n", - " ('Fig. 2A', 'results/E2', 'configs/layer1/E2.yaml', '20260704'),\n", - " ('Fig. 2B', 'results/mnist_collapse', 'configs/neural/mnist_collapse.yaml', '20260705'),\n", + " ('Fig. 2A', 'results/fig2_grounding_sweep', 'configs/inheritance/fig2_grounding_sweep.yaml', '20260704'),\n", + " ('Fig. 2B', 'results/fig2_mnist_collapse', 'configs/neural/fig2_mnist_collapse.yaml', '20260705'),\n", " ('Fig. 3A', 'results/llm_merge_seeds', 'configs/llm/merge_seeds.yaml', '1-5'),\n", " ('Fig. 3B', 'results/llm_moe_hard_hpc', 'configs/llm/moe_hard_hpc.yaml', '1'),\n", " ('Fig. 3C/3D', 'results/llm_epistasis(_compat)', 'configs/llm/epistasis*.yaml', '1-3'),\n", - " ('Fig. 4A', 'results/E4', 'configs/layer1/E4.yaml', '20260704'),\n", - " ('Fig. 4B', 'results/E8', 'configs/layer1/E8.yaml', '20260705'),\n", - " ('Fig. 5A', 'results/E9', 'configs/layer1/E9.yaml', '20260705'),\n", - " ('Fig. 5B', 'results/E10', 'configs/layer1/E10.yaml', '20260705'),\n", - " ('Fig. 5C/5D', 'results/E14', 'configs/layer1/E14.yaml', '20260709'),\n", - " ('Fig. 6A-C', 'results/E11', 'configs/layer1/E11.yaml', '20260705'),\n", - " ('Fig. 7A/7B', 'results/E12', 'configs/layer1/E12.yaml', '12'),\n", + " ('Fig. 4A', 'results/figS8_multiparent_union', 'configs/inheritance/figS8_multiparent_union.yaml', '20260704'),\n", + " ('Fig. 4B', 'results/figS9_specialist_superparent', 'configs/inheritance/figS9_specialist_superparent.yaml', '20260705'),\n", + " ('Fig. 5A', 'results/figS10_rugged_landscapes', 'configs/inheritance/figS10_rugged_landscapes.yaml', '20260705'),\n", + " ('Fig. 5B', 'results/figS11_directed_recombination', 'configs/inheritance/figS11_directed_recombination.yaml', '20260705'),\n", + " ('Fig. 5C/5D', 'results/figS13_mating_breadth', 'configs/inheritance/figS13_mating_breadth.yaml', '20260709'),\n", + " ('Fig. 6A-C', 'results/fig4_society_ablation', 'configs/inheritance/fig4_society_ablation.yaml', '20260705'),\n", + " ('Fig. 7A/7B', 'results/fig5_speciation_bdm', 'configs/inheritance/fig5_speciation_bdm.yaml', '12'),\n", " ('Fig. 7C', 'results/speciation_real', 'configs/neural/speciation_real.yaml','13'),\n", " ('Fig. 7D', 'results/speciation_real_cliff','configs/neural/speciation_real_cliff.yaml','13'),\n", " ('Fig. 7E/7F', 'results/llm_speciation', 'configs/llm/speciation.yaml', '1'),\n", @@ -200,7 +200,7 @@ "source": [ "## Regenerate the figures\n", "\n", - "One call per manuscript figure. Each writes `paper/pnas/figs/.pdf` — exactly the files the\n", + "One call per manuscript figure. Each writes `paper/manuscript/figs/.pdf` — exactly the files the\n", "manuscript includes, so a rebuilt PDF picks them up unchanged." ] }, @@ -221,46 +221,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig1a.pdf\n" + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig1a.pdf\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig1b.pdf\n" + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig1b.pdf\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig2.pdf\n" + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig2.pdf\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig3.pdf\n", - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig4.pdf\n" + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig3.pdf\n", + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig4.pdf\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig5.pdf\n", - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig6.pdf\n" + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig5.pdf\n", + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig6.pdf\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/figs/fig7.pdf\n", + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/figs/fig7.pdf\n", "\n", - "all manuscript figures regenerated into paper/pnas/figs/\n" + "all manuscript figures regenerated into paper/manuscript/figs/\n" ] } ], @@ -278,7 +278,7 @@ "\n", "for name, caption in FIGURES:\n", " getattr(make_figs, name)()\n", - "print('\\nall manuscript figures regenerated into paper/pnas/figs/')" + "print('\\nall manuscript figures regenerated into paper/manuscript/figs/')" ] }, { @@ -490,7 +490,7 @@ "\n", "has_poppler = shutil.which('pdftoppm') is not None\n", "for name, caption in FIGURES:\n", - " pdf = ROOT / 'paper' / 'pnas' / 'figs' / f'{name}.pdf'\n", + " pdf = ROOT / 'paper' / 'manuscript' / 'figs' / f'{name}.pdf'\n", " display(Markdown(f'### {caption}'))\n", " if not has_poppler:\n", " print(f'(install poppler-utils to preview inline) {pdf}'); continue\n", @@ -507,7 +507,7 @@ "source": [ "## Rebuild the manuscript PDF (optional)\n", "\n", - "`build.py` converts `paper/pnas/main.md` to LaTeX, placing these figures; compiling needs a TeX\n", + "`build.py` converts `paper/manuscript/main.md` to LaTeX, placing these figures; compiling needs a TeX\n", "toolchain (`tectonic main.tex`), so it is left as a shell step rather than run here." ] }, @@ -528,16 +528,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/pnas/body.tex\n", - "now: cd paper/pnas && tectonic main.tex\n" + "wrote /home/gg/ownCloud/Work/Projects/LamarckianAI/paper/manuscript/body.tex\n", + "now: cd paper/manuscript && tectonic main.tex\n" ] } ], "source": [ "import subprocess\n", - "print(subprocess.run([sys.executable, str(ROOT / 'paper' / 'pnas' / 'build.py')],\n", + "print(subprocess.run([sys.executable, str(ROOT / 'paper' / 'manuscript' / 'build.py')],\n", " capture_output=True, text=True).stdout.strip())\n", - "print('now: cd paper/pnas && tectonic main.tex')" + "print('now: cd paper/manuscript && tectonic main.tex')" ] } ], diff --git a/paper/arxiv/md2tex.py b/paper/arxiv/md2tex.py index b28e425..1c2164c 100644 --- a/paper/arxiv/md2tex.py +++ b/paper/arxiv/md2tex.py @@ -19,11 +19,11 @@ OUT = Path(__file__).resolve().parent / "body.tex" # Figure references in the text -> (graphics file under figs/, caption). FIGURES = { - "results/E14/E14.png": ("figs/E14.pdf", + "results/figS13_mating_breadth/E14.png": ("figs/E14.pdf", "Mating systems (E14): the best mate-pool breadth shrinks as skills get more entangled. " "(A) best fitness peaks at intermediate breadth on rugged landscapes; (B) the population mean " "is monotonically favoured by promiscuity; (C) diversity is monotonically destroyed by it."), - "results/E12/E12.png": ("figs/E12.pdf", + "results/fig5_speciation_bdm/E12.png": ("figs/E12.pdf", "Model speciation, analytic (E12): hybrid fitness vs divergence traces compatible $\\rightarrow$ " "outbreeding depression $\\rightarrow$ inviability; the isolation cliff arrives earlier the " "denser the incompatibilities (epistasis), and damage grows super-linearly (the Orr--Turelli " diff --git a/paper/blueprint.md b/paper/blueprint.md index 12c1267..1e81404 100644 --- a/paper/blueprint.md +++ b/paper/blueprint.md @@ -240,7 +240,7 @@ dynamics: metrics: kl_floor: 1.0e-9 output: - dir: results/E2/ + dir: results/fig2_grounding_sweep/ save_per_generation: true ``` diff --git a/paper/pnas/body.tex b/paper/manuscript/body.tex similarity index 100% rename from paper/pnas/body.tex rename to paper/manuscript/body.tex diff --git a/paper/pnas/build.py b/paper/manuscript/build.py similarity index 97% rename from paper/pnas/build.py rename to paper/manuscript/build.py index 6abf138..30dc337 100644 --- a/paper/pnas/build.py +++ b/paper/manuscript/build.py @@ -5,7 +5,7 @@ Adapted from paper/arxiv/md2tex.py (same Markdown subset + pipe tables), with on codename-free panels re-plotted from the committed artifacts). Run make_figs.py before building when results change. -Usage: python paper/pnas/build.py && (cd paper/pnas && tectonic main.tex) +Usage: python paper/manuscript/build.py && (cd paper/manuscript && tectonic main.tex) """ from __future__ import annotations @@ -27,7 +27,7 @@ from si_figures import SI_FIGURES # noqa: E402 (supplementary figures, numbere # figure name -> (single publication PDF from make_figs.py, caption) FIGURES: dict[str, tuple[list[str], str]] = { - "fig1": (["paper/pnas/figs/fig1a.pdf", "paper/pnas/figs/fig1b.pdf"], + "fig1": (["paper/manuscript/figs/fig1a.pdf", "paper/manuscript/figs/fig1b.pdf"], "A map of the study. (A) Each row is a biological mechanism the paper borrows, each column a level " "of realism at which it is tested: an inheritance model (an exact simulation of knowledge " "transmission, green), trained neural networks measured against exact oracles (blue), and language " @@ -42,7 +42,7 @@ FIGURES: dict[str, tuple[list[str], str]] = { "time, which is what population genetics describes. Dots are capabilities: the rare one (gold) is " "lost under single-parent inheritance, reassembled by merging complementary parents, and re-supplied " "by grounding."), - "fig2": (["paper/pnas/figs/fig2.pdf"], + "fig2": (["paper/manuscript/figs/fig2.pdf"], "How much real data stops model collapse. (A) An image-generating network (a variational " "autoencoder) is trained on handwritten digits, then a fresh copy is trained only on the digits the " "previous one drew, for fifteen generations, with no real data added. Each row is a later generation " @@ -58,7 +58,7 @@ FIGURES: dict[str, tuple[list[str], str]] = { "data's diversity is kept, about 0.05 (bootstrap CI shaded). The hollow point at $g = 0$ has not yet " "reached its equilibrium of zero. The trained image model needed about twice this fraction, because " "a trained network is not the exact copier the simulation assumes (Fig.~S2)."), - "fig4": (["paper/pnas/figs/fig4.pdf"], + "fig4": (["paper/manuscript/figs/fig4.pdf"], "A population of language models over six generations. (A) The set-up. Three lineages start " "from one frozen 1.5-billion-parameter base (Qwen2.5-1.5B). Each generation, every lineage learns " "one new skill from a public dataset by continuing to train its parent's adapter (300 new examples " @@ -82,7 +82,7 @@ FIGURES: dict[str, tuple[list[str], str]] = { "agreement with the crowd instead of on the truth, collapses the population onto a confident but " "wrong consensus (D, F); removing recombination or diversity preservation strands it below the " "optimum (D) and drains diversity fastest (E). Each removal fails in its own way."), - "fig5": (["paper/pnas/figs/fig5.pdf"], + "fig5": (["paper/manuscript/figs/fig5.pdf"], "Model speciation: when two lineages can no longer merge. (A, B) Small image classifiers " "(multilayer perceptrons) forked from one trained base. Two networks that compute the same function " "can still differ in their weights, because hidden units can be renumbered and rescaled without " @@ -101,7 +101,7 @@ FIGURES: dict[str, tuple[list[str], str]] = { "compatible, then crashes, sooner the denser the incompatibilities (E), and the probability of a " "non-viable hybrid rises with divergence (F). What breaks merging is conflicting conventions on " "shared machinery, not distance or specialisation as such."), - "fig3": (["paper/pnas/figs/fig3.pdf"], + "fig3": (["paper/manuscript/figs/fig3.pdf"], "Merging language-model specialists: when it helps, and predicting when it will hurt. All models " "are built from one frozen base (Qwen2.5) plus a LoRA adapter, a small set of extra weights trained " "on one family of tasks (list puzzles, string puzzles or arithmetic); a verifier marks every answer " diff --git a/paper/pnas/build_lay_legends.py b/paper/manuscript/build_lay_legends.py similarity index 90% rename from paper/pnas/build_lay_legends.py rename to paper/manuscript/build_lay_legends.py index 4dd0d0f..15ddfbb 100644 --- a/paper/pnas/build_lay_legends.py +++ b/paper/manuscript/build_lay_legends.py @@ -1,10 +1,10 @@ """Build the student-level figure guide (figure_legends_for_students.md -> .tex -> PDF). The Markdown is the source of truth. Lines of the form ``![](path.pdf)`` become figure includes -(paths relative to paper/pnas/); ``## `` headings become unnumbered sections; everything else goes +(paths relative to paper/manuscript/); ``## `` headings become unnumbered sections; everything else goes through build.py's inline() converter, so the same Markdown subset and unicode handling apply. -Usage: python paper/pnas/build_lay_legends.py && (cd paper/pnas && tectonic figure_legends_for_students.tex) +Usage: python paper/manuscript/build_lay_legends.py && (cd paper/manuscript && tectonic figure_legends_for_students.tex) """ from __future__ import annotations diff --git a/paper/pnas/build_zotero_library.py b/paper/manuscript/build_zotero_library.py similarity index 98% rename from paper/pnas/build_zotero_library.py rename to paper/manuscript/build_zotero_library.py index 7796454..f533f32 100644 --- a/paper/pnas/build_zotero_library.py +++ b/paper/manuscript/build_zotero_library.py @@ -1,6 +1,6 @@ """Build a Zotero-importable library from the manuscript's reference list. -For each of the numbered references in paper/pnas/main.md: take the DOI printed in the entry when +For each of the numbered references in paper/manuscript/main.md: take the DOI printed in the entry when there is one, otherwise ask Crossref for it by title (accepting only a high-scoring match whose title really is the same, checked by normalised comparison). Then fetch authoritative metadata for every resolved DOI by content negotiation against doi.org, which serves Crossref and DataCite alike, and @@ -9,7 +9,7 @@ write the result as CSL-JSON plus RIS. Entries whose DOI cannot be resolved (pre-DOI literature, books, chapters) are reported and written from the manuscript's own metadata so nothing is silently dropped. -Usage: python paper/pnas/build_zotero_library.py +Usage: python paper/manuscript/build_zotero_library.py """ from __future__ import annotations diff --git a/paper/pnas/cover_letter_nmi.md b/paper/manuscript/cover_letter_nmi.md similarity index 100% rename from paper/pnas/cover_letter_nmi.md rename to paper/manuscript/cover_letter_nmi.md diff --git a/paper/pnas/figs/fig1a.pdf b/paper/manuscript/figs/fig1a.pdf similarity index 99% rename from paper/pnas/figs/fig1a.pdf rename to paper/manuscript/figs/fig1a.pdf index 6df1bcfb673a21bbb5d8df525d847fbfa3612766..e1da59dcd238f0f1870333bf3da03275f09fa694 100644 GIT binary patch delta 27 jcmaF&hWFhY-i8*&7N#xC|591aOf3wIwlk+OXA1xTtSJf{ delta 27 jcmaF&hWFhY-i8*&7N#xC|58~EOifITw=<_PXA1xTtLh3D diff --git a/paper/pnas/figs/fig1b.pdf b/paper/manuscript/figs/fig1b.pdf similarity index 99% rename from paper/pnas/figs/fig1b.pdf rename to paper/manuscript/figs/fig1b.pdf index 3045a8e03fd344455b518aaa40f5af4636e24500..8cbf9b0aaf41e96b8cc1174ec3baa6f80e851fe5 100644 GIT binary patch delta 33 ocmeBpD%tT=vY~~sg{g(Pg{6gc3mZ#1tC^{Vf$?_EbhdhK0LKIh7XSbN delta 33 ocmeBpD%tT=vY~~sg{g(Pg{6gc3mZ#1tAVMBiOF`(bhdhK0LH}%5&!@I diff --git a/paper/pnas/figs/fig2.pdf b/paper/manuscript/figs/fig2.pdf similarity index 99% rename from paper/pnas/figs/fig2.pdf rename to paper/manuscript/figs/fig2.pdf index f62f1762c658a6936f08e7797262ca6a659399cf..58c9ee331c20c83d647c8f6ce3c79b29754d06cf 100644 GIT binary patch delta 22 dcmaF)gXQH9mWC~iN`@?ErWOX<)eIS(xdCtZ2ZsOv delta 22 dcmaF)gXQH9mWC~iN`@>3rY0ua)eIS(xdCsu2Y~

17Bf=|gYCaH**F9M%eo5e delta 32 ncmZqvBGLRsqM?Pcg{g(Pg{6gc3)^>176VfglkLAX**F9M%X$jt diff --git a/paper/pnas/figs/fig4.pdf b/paper/manuscript/figs/fig4.pdf similarity index 99% rename from paper/pnas/figs/fig4.pdf rename to paper/manuscript/figs/fig4.pdf index a32c0e4b83786733dc3b865cea5a80f736992b9d..0b09d167743138d741b17e990dca7fc31c7f0342 100644 GIT binary patch delta 22 ecmeCW%F=a}rC|%>VHp-PQwxLb$7L7~^8x^7a0nd$ delta 22 ecmeCW%F=a}rC|%>VHp+!QxlWz$7L7~^8x^7FbEd_ diff --git a/paper/pnas/figs/fig5.pdf b/paper/manuscript/figs/fig5.pdf similarity index 99% rename from paper/pnas/figs/fig5.pdf rename to paper/manuscript/figs/fig5.pdf index 47fcb27a3d817f744f35b7110ca2cd593c26113b..d998019c06af23b82d81276734ad51ea53c84c26 100644 GIT binary patch delta 19 bcmZ4TgK5bRrVWl8SJq%e^N#{7ge=iRsTi*_i`W4uE$r0oc#-MKAtRwJf@TB*|_{^ zK7MwyxR_kg5P4rBzpsa%>c_ZOs$*R|7%fH@({rTyIxrA*HVlm$c;P{7!)`kLkAZ!$2$&eQCZJ zEY{ahBol`rpnK*J)j*gIqh+CD0rKii_o^JJ*OdCe*ymNb0+irgwGW=F#h6voKO zhbayy382xrfiap#=}h2Jf`8(7z*!!o^?8s4RcT;);4yejgO72jr5_oj%Ljx8HYOF4 zfaDZ-6%sU!19E%<#UCz83^Y)LM$6HAb|J^d_xuJtI0mzJf4E1}@LdLA#NGh=C7F4F)Meo~&u=%+ha?i)C|_ z9zf)*{phKCf0v+rzQ4dEo|3d=z(SS`O^a#7%K}kCT+xFLJR@mcqQq-s627L0AOz=q$ z*Q6;)v&QnB6I97rc1l!KRiuF6SYD+R571ZnC3>VIf5o~459pG=b;aJuUK&)MhSZpK z7aZ#gU9X*B*XPa;9zVoy6jZBY?Z=M}AOG^|?@v#jPcKJTO6PmgsP2o8^Tqh`@zt9t zuYl*1`C|6*-r?Ew*YRHYY<4!DO|H)GJwBrqXtMaYN8MasUyLuYAXWG8Z=8Z#xy}3G z&xMXvfBAEMRoB)V3FIz-Sozgm04iBI;U}v!?gv1n!*}O$;;&-kAl(LE?Bhl(723sEE*E}ZPCf4-ya9fv29WLW;?=mlceEI14 z(}p--YI%~puHi3Meb(}%Z13{ax&aPbr2DwHSLMYYw|U+1^3<)wrpw5aOiP!s^*w(7 z3v~1Y84tnF=b>mV>DqhF=93`IWT5qW;S8B2%j1|9{SsATL1t6 delta 1278 zcmVJq%f5N+*Y;tD5s{V`q@8v$8U5~F0Ir|sjd^}kUc}yqMvvK*; zeEjTYaWT1~A@aUNeqRqi)sJznRL8n_Fj|Z*rsqiYbzmUsY#16h@Y)Tn9z;SQj?aP( zfAGF16uD~PP~^?f*#X`FhTU}f$)6aR9(rOx3$N$5r@5i`1L86Ce{n#Shk;lm`qF$c zSgfz1NG1+LK=;fcs(~;aM$1CQ$n}#RIHQKi4Idw(BB=+zNHuta zkg3AZCBEVf$_W!kf7S*S1g=VqL!qf7(nCxE=gClm^O{vaENS@s6}eSX%#Ma1D2$Pl z4^tda5+>K9s?xypz+>>51|Q>4OFuG5mk$UHY)mR7 z0m&)wDkNwc2jut!ia%VG7-*mfjh3VL>_U!@@A(aQa13Vce{hec;kyjL$kE(G^#GbC z7c@@Sp_D|kF;dmK8Mwr1z%_+A`eu$X@dwq>I!QIWn=feA8SV|mqxGnr@<3`XV9aiV zm;Vu$rRcfi>^6AK99|qmm9pFDnB4~7nk<@CP&fkW5Cb2U8Vpi`JXzD!nWf((7t7`< zJ%Gqr`_WVPe=b4$e1CySJSAz#fQ2j>nikWDmj$APxS|Igct+B?M2XkX#X+hpZn1#Q z6W=)j?HIhAkfur+`b3x2FsOkijo=DTMWU0-Q<0dHrm;SQO*8|9ThDKD4EW?Jnc$Ni zu1QmpW{u@LC#aIM?3Adesz?FBvAjwt9-y!COY}%be~NVp9?&I!>x#XRy)>vi4XH8f zE;!Z~x?VfMuFstxJbsAZD5zG)+K(R{KK|v^-=Cg5pI(lxl+O2}QQa3G=Zo>>wUfAZ)2s;;d!63ATuvGS|C093Ma!cSId+z)_Chwski#9zh6LAnjT*vE}n%HjQi zisHc9Ed%+s1nu!)C2{|FF(!$A7+p>0<8P|^U#wdH?#meY9KTzMC_bKCj19&r*qrn_ z#)@sa-jvk3Mc|KYv|p=!|IzAHzi}}*6be@p>KGN5T5=G*2=$#(UZqhB7sI{9TO zOSPX>`6WC?whGUBh3j`mE(i+1}-;bpsr>NcVAXugZ%*Zu7e1<*8eVO_z};nU*eN>wEnE z7o9f)9+wer0~NRZoEpgiLN{eGFg0RkI5J^0G%#c`FgZA5G%{i{WHMr5VL3NuGCn*v oWic={VrDopVKg)_WHK;0IAb(2Vl!kiVqsx9H)b-o2%j1|9@h?bKmY&$ diff --git a/paper/pnas/figure_legends_for_students.tex b/paper/manuscript/figure_legends_for_students.tex similarity index 97% rename from paper/pnas/figure_legends_for_students.tex rename to paper/manuscript/figure_legends_for_students.tex index 310b8a8..588b922 100644 --- a/paper/pnas/figure_legends_for_students.tex +++ b/paper/manuscript/figure_legends_for_students.tex @@ -105,7 +105,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S1. Collapse and rescue in three different kinds of network} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s1_architectures.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s1_figS1_architectures.pdf}\end{center} \textbf{What was done.} The same generational loop as Figure 2 (train a child only on its parent's output, with or without 5\% real data) was run with three generators: an exact histogram (a simple frequency count, no neural network), a recurrent neural network (one that reads and writes sequences one token at a time), and a feed-forward network. Each had to learn a synthetic ``universe'' of 256 kinds of item whose true frequencies were known exactly, for 22 generations, five times over. @@ -125,7 +125,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S3. Re-baselining a collapsed population locks in the damage} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s3_E6.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s3_figS3_rebaselining.pdf}\end{center} \textbf{What was done.} A tempting shortcut in practice is to declare a model's current output the new ``ground truth'' and stop keeping the original data. The simulation tests what that does. Two hundred generations in, and again at 300, the population's current frequencies are frozen as the new reference for grounding and the original truth is thrown away (it is kept only to measure against). Four arms: re-baseline while still healthy (green); re-baseline after collapse (red); the same, but only allowed when diversity is above 0.75 (blue); never re-baseline (grey). @@ -135,7 +135,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S4. The full grounding sweep in the simulation} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s4_E2.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s4_fig2_grounding_sweep.pdf}\end{center} \textbf{What was done.} The complete version of the experiment summarised in Figure 2B: 1,000 knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 lineages, and the fraction g of real data swept from 0 to 0.4. @@ -145,7 +145,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S5. Real data protects only the topics it covers} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s5_E3.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s5_figS5_aimed_grounding.pdf}\end{center} \textbf{What was done.} The 1,000 items were divided into ten topics. The same total budget of real data was spent in two ways: spread evenly over all ten topics, or concentrated on a single topic that the experimenter wants to protect. @@ -155,7 +155,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S6. Grounding in a trained recurrent network} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s6_grounding.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s6_figS6_grounding_rnn.pdf}\end{center} \textbf{What was done.} The grounding sweep of Figure S4 repeated in a trained recurrent network rather than the simulation: 256 kinds of item, 200 samples per generation, 30 generations, nine values of g from 0 to 0.2, eighteen repeats. @@ -165,7 +165,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S7. Collapse and rescue on real handwritten digits, in numbers} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s7_mnist_collapse.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s7_fig2_mnist_collapse.pdf}\end{center} \textbf{What was done.} The experiment whose pictures are in Figure 2A, quantified. Thirty kinds of digit, a classifier reading the kind of each drawn digit with 98.5\% accuracy, 6,000 drawings per generation, fifteen generations, four repeats, with 0\% (red) or 10\% (green) real digits mixed in. @@ -175,7 +175,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S8. Averaging parents cancels the benefit of having several; keeping the best of each does not} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s8_E4.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s8_figS8_multiparent_union.pdf}\end{center} \textbf{What was done.} Several parent models each remember a random share of the rare items, and the experimenter controls how similar their shares are (from fully complementary to identical). A child is then built either by averaging the parents' output frequencies, or by keeping, for each item, the largest frequency any parent gives it (a \emph{union}). The child then resamples, as every generation does, and the question is how many rare items survive in it. @@ -185,7 +185,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S9. Many complementary parents can produce an offspring better than any of them} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s9_E8.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s9_figS9_specialist_superparent.pdf}\end{center} \textbf{What was done.} A capability is modelled as a string of twelve yes/no positions (a \emph{genotype} of twelve \emph{loci}), and fitness is the number of positions that are right. Each parent is a specialist: confident and correct on the positions it has mastered, unsure elsewhere, and no parent has mastered them all. Offspring are built from 2 to 12 parents either by averaging or by taking, position by position, the answer of the parent most confident about it. @@ -195,7 +195,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S10. When skills are entangled, blind recombination harms the offspring} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s10_E9.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s10_figS10_rugged_landscapes.pdf}\end{center} \textbf{What was done.} The same twelve-position genotypes, now on a \emph{rugged} landscape (Kauffman's NK model), in which the value of a position depends on what its neighbours hold, with a knob K from 0 (positions independent) to 8 (highly entangled). Parents are local optima found by hill-climbing, the model of a trained specialist. Offspring are made by recombining them at rates from 0 (copy a parent) to 0.5 (free shuffling). @@ -205,7 +205,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S11. Directed sex: choosing and screening offspring rescues recombination} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s11_E10.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s11_figS11_directed_recombination.pdf}\end{center} \textbf{What was done.} Biology is stuck with two random parents and no preview of the offspring. A model population is not: it can pick complementary parents, breed many candidate offspring, test them, keep the fittest and repeat. On the rugged landscapes of Figure S10 three strategies are compared: the best single parent (grey), random recombination (blue) and this \emph{directed} recombination (red, five rounds). @@ -215,7 +215,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S12. Selecting for the best destroys diversity; rewarding novelty preserves it} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s12_E5.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s12_figS12_quality_diversity.pdf}\end{center} \textbf{What was done.} Each generation, the simulation now \emph{selects} which items to keep, all arms receiving the same grounding. Three rules: no selection; \emph{greedy}, keeping the items of highest true probability; and \emph{quality-diversity}, which rewards an item for being rare as well as good, with a knob (alpha) for how much rarity counts. @@ -225,7 +225,7 @@ The supplementary figures are the experiments behind the main text that either r \section*{Figure S13. Who should mate with whom: mating breadth on rugged landscapes} -\begin{center}\includegraphics[width=\textwidth]{figs/si/s13_E14.pdf}\end{center} +\begin{center}\includegraphics[width=\textwidth]{figs/si/s13_figS13_mating_breadth.pdf}\end{center} \textbf{What was done.} Forty-eight simulated agents sit on a ring. When an offspring is made, its second parent is drawn from a neighbourhood whose width is the knob: narrow (mating only with neighbours, like an isolated village) to the whole ring (anyone can mate with anyone). An offspring replaces the agent at its position only if it is fitter. Ruggedness K is swept from 0 to 10. diff --git a/paper/pnas/main.md b/paper/manuscript/main.md similarity index 100% rename from paper/pnas/main.md rename to paper/manuscript/main.md diff --git a/paper/pnas/main.pdf b/paper/manuscript/main.pdf similarity index 99% rename from paper/pnas/main.pdf rename to paper/manuscript/main.pdf index 30b252074ecc5369e784d80a8bbef9bf17b76b09..36a2764c554317b87297476638a50084c94a3335 100644 GIT binary patch delta 2445 zcmV;833B$)#Z%G6Q-Fj4gaU*Egam{Iga(8Mgb0KQgbIWUgbaiYgbsucgb;)ggc5`k zv=qR}f4!|j7CBJrFZh4I%<=rHnH+s!=dxg{ACIqxV$D^nPHS8~Qx(!489EZ&|=Qo`<1BM8E8Y(G29uA*it7$uxyFtPfT8DCNM0Jr^Y>If2 zf4Hn@jI*A`M5Gl@^_AT5ZotD-tmKA1L7gPsgBw`D5&~oxu}4SRBUjK-2bw}LFogq> zD_2Rn`}d zl#-OFxe!hTL?V`q{II*|*nTL{5fu-21fGeO?zx!LiL&Bso~1&}Qui`5VADl;p0siC z#Ey#_i!$gH7(Q9ig&$F!LP8Q&8xOz17lw`_%M}_w)DTcR*6ma+6mktpY=;ERm+3@P*k^-3@x zpF%x2B=MA=2elj(j5q_)#mNv)LA(hJ@TkIvgrpckkLQ{LVi+SWfN;P;0=Xt14C<+9 zV`G6Ebxxl%Pn4a+nUgXN9FO#{e_s|^#tZ`E5b;O(KBa;zs1f>Y2kahwnMY$QuO~hzBR>r5&C%N^zX*mJY4~w|GBk)M+I`?9G zZ>1W8SxQqxv}XD&Y1C$tBUxR@fINT{$>V3XFrC7$K6**1Ub9**As+=(e=A?~fX9x3 zqciysKo6d;%B3GB1S%vmZFwi%=a7^ zz$n33zGU(3C#li|I6Rv`e@Y%{L4agt9#!Kbm&jMBCSTHXs{>tVf23;zx2e z#*zZABq`(yhXq^d3hs&ksW2}_xS2zEW8CweC5TmXrj%*!|BBt`@Z@-ziuv1CcjT*eSSWkU(Y_@J35>GtGQo4pPe19rao@wA7T!~ICvOKsS`bk#0CI#@t|@TC5E@?m-ge|OZKdj+zy5p<9jM2L(Z*sq&#CEyj0wGD@n0ZIFM?gZv}XcKzLYKdj(q8xVPDF`EtJvwQ|9E?$4BqpEY(rp zlQQiwNS8AHf2%0dn`FGpUCLMm%J7FCPRDOfnO+3fDC0IL6ZT0lJu~b}nY@KE|C73U zy?=3`pgb?Xr6}hPv-$O-kE0o|d^T#U)~-x=boBVu`)5BsI(_wa+_`4UZe}2}S)xH3s5%AW%`f@zEnb%jK z`}BS{Lq)cpHqbWvY4^ZDh?hmZAWHkn>d~WbqvD z(1DMBFGtXsr%daazWpuBGSj~rpI?sZ|1`5{J)Jc5^`F!F`s1u=>ffg~vwA-MRL`3~ znn^7R){`;%NV@N&_OA82W8J=9USi$8BVA$bI}cWGR$xDV`r_}ee&KX!3)cR7VI9L3 zf2?g-U>(&KtnE711edUOuF^W}lNEL^-oAeQ>?x)@J=x0C@U78X zTbV?&ZDnH30z;R!U>MdhoPC_O>k?UT)aUi2zUlzFX5oI1ile7b9=(6sd2)TPvj>0c z?7@HC*@JeyXAjnNQ$r$Ov#&IdhK|}-j!)^UCLk!dmz8&c3uu2(zo16_5s-COV~Jj z2>YBp^h~ffW1`x^n6%&OqP(VGrS0-tl1|#Tsk4<#DAP*i!`6o#7H8SZ&-Xpn^mzkBw`CjNL9S~HbhZ&I z{vWan`UjKJ|EH=$3hsxfl5zj%37I?9{{qZSN*I>`78Deh%hD7ZK{YjGH)J?vWHB`~ zVliZ8H)c3FVK8PnGBag2I5se4K0GirHDotrIAvrpH8f%|WMwyII5}Z3W;rr5Wj8oB LFlDzV(-f)?)|l&c delta 2445 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 LWHPrW(-f)?St`?p diff --git a/paper/pnas/main.tex b/paper/manuscript/main.tex similarity index 100% rename from paper/pnas/main.tex rename to paper/manuscript/main.tex diff --git a/paper/pnas/make_figs.py b/paper/manuscript/make_figs.py similarity index 98% rename from paper/pnas/make_figs.py rename to paper/manuscript/make_figs.py index 9d141e9..e6a293f 100644 --- a/paper/pnas/make_figs.py +++ b/paper/manuscript/make_figs.py @@ -8,7 +8,7 @@ Figs. 3 and 4 open with a schematic panel explaining the set-up, so a figure is caption. The per-experiment figures under results/ remain the exploratory versions; these are the manuscript's. -Usage: python paper/pnas/make_figs.py +Usage: python paper/manuscript/make_figs.py """ from __future__ import annotations @@ -26,7 +26,7 @@ import os os.chdir(ROOT) # load_bundle uses repo-relative paths from _figlib import load_bundle, load_seed_bundles, mean_ci # noqa: E402 -OUT = ROOT / "paper" / "pnas" / "figs" +OUT = ROOT / "paper" / "manuscript" / "figs" plt.rcParams.update({ "font.size": 8, "axes.labelsize": 8.5, "legend.fontsize": 7, "legend.frameon": False, @@ -348,11 +348,11 @@ def fig1b(): # ---------------------------------------------------------------- fig 2: grounding + MNIST def fig2(): - from knowledge.analysis import critical_grounding, reduce_to_stationary - from knowledge.metrics import heterozygosity - from knowledge.truth import make_true_distribution + from inheritance.analysis import critical_grounding, reduce_to_stationary + from inheritance.metrics import heterozygosity + from inheritance.truth import make_true_distribution - df, cfg = load_bundle("results/E2") + df, cfg = load_bundle("results/fig2_grounding_sweep") n = cfg["dynamics"]["n"] td = make_true_distribution(cfg["truth"]["K"], 1, "zipf", cfg["truth"]["tail_frac"], cfg["truth"]["zipf_s"], 0, tail_threshold=cfg["truth"]["tail_threshold"]) @@ -391,7 +391,7 @@ def fig2(): ax = axes[0] from PIL import Image - im = np.asarray(Image.open("results/mnist_collapse/mnist_montage.png")) + im = np.asarray(Image.open("results/fig2_mnist_collapse/mnist_montage.png")) # Strip the baked-in title band and left label margin (raster text is unreadable at panel # size); measured on the committed montage: boxes span y >= 69, x >= 75, row centres below. top, left = 60, 68 @@ -424,7 +424,7 @@ def fig4(): import pandas as pd from matplotlib.patches import FancyArrowPatch, FancyBboxPatch - df, _ = load_bundle("results/E11") + df, _ = load_bundle("results/fig4_society_ablation") arms = [("full", "#2ca02c", "full system"), ("no_sex", "#ff7f0e", "no recombination"), ("no_diversity", "#9467bd", "no diversity preservation"), @@ -582,7 +582,7 @@ def fig5(): fig, axes = plt.subplots(2, 3, figsize=(11.4, 8.4), gridspec_kw={"wspace": 0.45, "hspace": 0.75}) fig.subplots_adjust(top=0.9) - bdm, _ = load_bundle("results/E12") + bdm, _ = load_bundle("results/fig5_speciation_bdm") rhos = sorted(bdm["rho"].unique()) colors = plt.cm.viridis(np.linspace(0.15, 0.85, len(rhos))) diff --git a/paper/pnas/refs/Evolution of sex for AI.ris b/paper/manuscript/refs/Evolution of sex for AI.ris similarity index 100% rename from paper/pnas/refs/Evolution of sex for AI.ris rename to paper/manuscript/refs/Evolution of sex for AI.ris diff --git a/paper/pnas/refs/README.md b/paper/manuscript/refs/README.md similarity index 98% rename from paper/pnas/refs/README.md rename to paper/manuscript/refs/README.md index 49e8745..ffca4a3 100644 --- a/paper/pnas/refs/README.md +++ b/paper/manuscript/refs/README.md @@ -1,6 +1,6 @@ # Zotero library for the manuscript's references -`Evolution of sex for AI.ris` — all 80 references from `paper/pnas/main.md`, with metadata +`Evolution of sex for AI.ris` — all 80 references from `paper/manuscript/main.md`, with metadata fetched from the publisher of record rather than retyped. **To import:** Zotero → File → Import… → choose this file → keep "Place imported collections and diff --git a/paper/pnas/refs/references.csl.json b/paper/manuscript/refs/references.csl.json similarity index 100% rename from paper/pnas/refs/references.csl.json rename to paper/manuscript/refs/references.csl.json diff --git a/paper/pnas/refs/references.json b/paper/manuscript/refs/references.json similarity index 100% rename from paper/pnas/refs/references.json rename to paper/manuscript/refs/references.json diff --git a/paper/pnas/refs/references.ris b/paper/manuscript/refs/references.ris similarity index 100% rename from paper/pnas/refs/references.ris rename to paper/manuscript/refs/references.ris diff --git a/paper/pnas/refs/report.txt b/paper/manuscript/refs/report.txt similarity index 100% rename from paper/pnas/refs/report.txt rename to paper/manuscript/refs/report.txt diff --git a/paper/pnas/refs/resolution-report.tsv b/paper/manuscript/refs/resolution-report.tsv similarity index 100% rename from paper/pnas/refs/resolution-report.tsv rename to paper/manuscript/refs/resolution-report.tsv diff --git a/paper/pnas/renumber_refs.py b/paper/manuscript/renumber_refs.py similarity index 92% rename from paper/pnas/renumber_refs.py rename to paper/manuscript/renumber_refs.py index e6ed8bf..8ce94f8 100644 --- a/paper/pnas/renumber_refs.py +++ b/paper/manuscript/renumber_refs.py @@ -1,14 +1,14 @@ """Renumber the manuscript's references to first-appearance order (PNAS style). -Reads paper/pnas/main.md, finds every parenthesised citation group in the text above +Reads paper/manuscript/main.md, finds every parenthesised citation group in the text above "## References", derives the order in which references first appear, and rewrites the citation groups in main.md, si.md, and the figure captions in build.py, then reorders the reference list. Citation groups are parentheses containing only reference numbers, commas, en-dash ranges, an optional "cf. " prefix, or a prose prefix ending in a semicolon ("...; 11, 12"). Four-digit numbers (years) never match, and any number above the list length is reported and left alone. -Usage: python paper/pnas/renumber_refs.py # dry run: mapping + per-file counts - python paper/pnas/renumber_refs.py --apply # rewrite the three files in place +Usage: python paper/manuscript/renumber_refs.py # dry run: mapping + per-file counts + python paper/manuscript/renumber_refs.py --apply # rewrite the three files in place """ from __future__ import annotations @@ -18,7 +18,7 @@ import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] -MAIN, SI, BUILD = (ROOT / "paper" / "pnas" / n for n in ("main.md", "si.md", "build.py")) +MAIN, SI, BUILD = (ROOT / "paper" / "manuscript" / n for n in ("main.md", "si.md", "build.py")) REF_HEADER = "## References" CIT = re.compile( r"\((?P

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

9lsI2;y$s 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 delta 115051 zcmV)5K*_)JwkFAwCa`o+e>O8WK0XR_baG{3Z3=kW?OnUBB(ZVL^%bK`3c5|Q_yoo` zFkl-{CTKHB!JVBQCsv@yzi+;ZEV4;<&)pT|z*r3SPES9{V%4crkG}o=#&693<2NI2 zM!VfwXVmTc-~6`!@}K{_{r$Fsv+DLg{@cdI&Xttn_P3ifa(7w?e@nLh_w7%&Ki>ZB z+wEWegPWW6ziTl1_U(03yE8`leFfW@kk;J3J^y@XOnfpXEo1z<|6lmeoXWWES z${zxLlVRy+@k%EQf4hiB_&Z*hTemwa9dE82c2fL9SpVI`gTh^idwS0FjOqXQ9O+d5 z{;eHn0lVVdcH>;OUKnTKJ6IuboE4-y3QroJ{8`7n9fgn0nsB$_LE{!%_l!r1G5|p! z*zS~d`26{K{bBr`P7HDE;wDk{z|DRaR>vaBKs&_8E5y4Bf3tKa^J4w^x#Ri#VHWdO z!#`}8O}q?*Q@=jq(f*R0e;;24G@gpyDvDFMZaJd~XKDoz#BPl?yp!=TnrZaHDLyu- zqoA4m3rkO@;bT+6bijppC^shRaY3%6kYwOB4j=9bSrzq)1SZ49vTDl5;Bj$DJU%wZAq#of3l~Iqw)6`g zKYJRDM`Z<9R8BhoSEN)&IXFnE2){UTOE~v&2qw3Of6^o#_54XbS~-&bn+aROl!tpV z?X9hahX5C@fL1!mr`3!kyrj`Ou;Y!E?nUy}r{*-s_dbBMB|M z>Ux7LR>gK*m`EkFp2LG>mK=Y9joT;?K!g%)3yOSRf#aEgw12XUW&NsF_|RVB-G=8? zY2|KUf4ue6&VoNR>`odqHSk#lA)1*dQCukJNu2?Cz%W{V?9*~*A7#6qSppPooku&^ zZf4z`7}-aivT#R7V;84ys!G$H`>{^yq%mhz!%!2}X^*82Nc#j4NaKTd7xkAy(}4Gl z!b1&p+Dk45DV!mRWwBj!%+q>D6^l3phXy))eGk+=G{URZIlK z4ebh!wT<`JuD`I=QIzt`N|jX!_BS(C`9(pBk=jomv$j#7E4F}w6}&P?=whIWvp9Rj z$;j-++kecY&|9Dg$HK!I*{U7If()Xu5C5Yqwdmwv1BSyL72^|!e*Ne?-AonCxVuNA zf388JTI|Mvhpq^a;fLS(M>ZG_Jg9}R+<&oNy;bZF%-3N>g+Q|OyH_3J{{!Xp!ieH>uvTQsM ze#aRV<)@6YhZ7lWq5PgcI)K=)NW)TufAn3yK6o@7JS-A^uKTiK;ONLi^Zc1F!n0#$ z*NP%fIP^9x87{w+qgp5~Kt}X=YqlVCl}+KrBkdo>5^&80y~7yVXIH+4wLuLX;<RoW=j_L`$ zG`}~0$zqrvl!vJ2^5<6iKJ?TVf0%fxp@nFK0_-jXCwi{h?SL_zZf$WM%6v?(dw4Y< z$T1|>t9NO_8Z?^F5i9SEA~ynQ5Ar=TR*Hykg4``EmjO+CjZI8BJSvEcw*V_e=?`}r zh;xgBUTnTjB4Y0?>0ydXGN)52_mqxD5h%x|Nil2}09Cv6bB4bU)*`O1e**g+t#-~1 znjjO*8j@z_Q3e@=pxzz3*8%C_qK#{;g^RdVxwS7Qv!^v@vl5@e6&F-5Jc&LzLFv`4 zC8QJju;cZpxDn7xVPK*(f=|Lkl{sZeow$KIDYQV^HUeYcRq1;6-n;e?m7*i9+70#&Vb> zz{HJtZip_tiYiY1oXjsQad4B<9Jh`j+7^2EIIP+8-1yFna^`R&s@erXxXUslL=_U+ z#xD|(-2@h-GQ3cKf4bU2sdsPID*Bw+w+@RZS12FbT@6XmqNc?$#xpW8fzj~38uC~F zmk-^T{UcW~t7QTZR zd~Fj8G{&}-Aqji(6Mr(j*SR}e@~2*>9P-M3?pYe)tYga zJx5&73tAnd36U^Gi68)zTA}W#6d{h#WYU45CP_zb9+y?4rBB#!s=1S~Z@;1Cj7y5d z7t*gK#*Ae2;z~HaN3J3u11^f+LVrFwDVqmpRE4lBafJmAm

;ADV}Xt5C$wg{gZ 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

`@oY^L` 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 blend in 3/3 seeds, one catastrophic blend failure avoided. 7B: routing 0.503\(\pm\)0.007 vs soup 0.408\(\pm\)0.021 (+0.094\(\pm\)0.015, 3/3); soup vs best specialist +0.001\(\pm\)0.041 (the seed-1 'soup below best parent' did not replicate). Directed \(-\) soup +0.073\(\pm\)0.031 (3/3) \\[3pt] @@ -141,20 +141,19 @@ Replicate counts, and why each is what it is: \begin{tabular}{p{0.307\textwidth} p{0.307\textwidth} p{0.307\textwidth}} \hline Experiment & Replicates & Reasoning \\ \hline -E1, E2, E3, E5, E6 & 100 lineages & Long horizons (400--600 generations) with drift-dominated variance; 100 lineages put the CI on stationary diversity well inside the effect being resolved \\[3pt] -E4 & 200 & Outcomes are per-item binary retentions, the highest-variance quantity in the paper \\[3pt] -E7 & 20 & Trajectory contrast (sexual vs asexual adaptation speed), large and monotone \\[3pt] -E8 & 40 & The vertical claim; the headline separation, so the most replicated of the genotype experiments \\[3pt] -E9, E10 & 24 & Landscape sweeps where each point aggregates 200 offspring internally \\[3pt] -E11 & 12 & Four-arm ablation over 80 generations; arms separate by margins far exceeding the CI \\[3pt] -E12, E12\_nk & 15 & Each point already averages 500 (E12) or 200 (E12\_nk) offspring \\[3pt] -E14 & 20 & Breadth \(\times\) ruggedness grid, 60 generations per cell \\[3pt] -kernel\_sharpen, kernel\_smooth & 24 & Two-parameter kernel fits against neural reference endpoints \\[3pt] -bridge & 60 & The harness gate: must detect \emph{any} departure from the inheritance model, so the most replicated neural run \\[3pt] -grounding & 18 & Nine-point grounding sweep with per-generation network retraining \\[3pt] -collapse, architectures & 5 & Sign-level demonstrations across architectures; each lineage retrains a network 22--25 times \\[3pt] +\texttt{fig2\_grounding\_sweep}, \texttt{figS5\_aimed\_grounding}, \texttt{figS12\_quality\_diversity}, \texttt{figS3\_rebaselining} & 100 lineages & Long horizons (400--600 generations) with drift-dominated variance; 100 lineages put the CI on stationary diversity well inside the effect being resolved \\[3pt] +\texttt{figS8\_multiparent\_union} & 200 & Outcomes are per-item binary retentions, the highest-variance quantity in the paper \\[3pt] +\texttt{figS9\_specialist\_superparent} & 40 & The vertical claim; the headline separation, so the most replicated of the genotype experiments \\[3pt] +\texttt{figS10\_rugged\_landscapes}, \texttt{figS11\_directed\_recombination} & 24 & Landscape sweeps where each point aggregates 200 offspring internally \\[3pt] +\texttt{fig4\_society\_ablation} & 12 & Four-arm ablation over 80 generations; arms separate by margins far exceeding the CI \\[3pt] +\texttt{fig5\_speciation\_bdm} & 15 & Each point already averages 500 offspring \\[3pt] +\texttt{figS13\_mating\_breadth} & 20 & Breadth \(\times\) ruggedness grid, 60 generations per cell \\[3pt] +\texttt{figS2\_kernel\_sharpen}, \texttt{figS2\_kernel\_smooth} & 24 & Two-parameter kernel fits against neural reference endpoints \\[3pt] +\texttt{bridge} & 60 & The harness gate: must detect \emph{any} departure from the inheritance model, so the most replicated neural run \\[3pt] +\texttt{figS6\_grounding\_rnn} & 18 & Nine-point grounding sweep with per-generation network retraining \\[3pt] +\texttt{collapse}, \texttt{figS1\_architectures} & 5 & Sign-level demonstrations across architectures; each lineage retrains a network 22--25 times \\[3pt] recombination & 8 & Operator contrast in trained weights \\[3pt] -mnist\_collapse & 4 & 15 generations \(\times\) a conv-VAE retrained from scratch each generation; the contrast (30 modes vs 1) is categorical \\[3pt] +\texttt{fig2\_mnist\_collapse} & 4 & 15 generations \(\times\) a conv-VAE retrained from scratch each generation; the contrast (30 modes vs 1) is categorical \\[3pt] speciation\_real, \_cliff & 3 & Barrier decomposition; the quantity is a near-deterministic function of the training condition (residual 0.001 vs 0.497) \\[3pt] speciation\_real\_emergent & 4 & A null: replicates are spent on longer divergence horizons rather than more repeats \\[3pt] llm\_merge\_seeds & 5 training seeds & The Fisher--Muller signature, the most-replicated language-model claim \\[3pt] @@ -175,13 +174,13 @@ Knowledge is a distribution over \texttt{K} discrete items; reality is a fixed Z \emph{Parameter choices.} \texttt{K = 500}--\texttt{1000} with \texttt{zipf\_s = 1.1} and half the items designated tail: large enough that the rare tail contains hundreds of items (so tail statistics are not dominated by a handful of them) and small enough to sweep densely. \texttt{n = 100}--\texttt{200} sets drift strength; it is the population size in the Wright--Fisher correspondence and the distillation sample size in the AI reading. Horizons of 400--600 generations were chosen so that ungrounded lineages reach fixation and grounded ones reach stationarity within the run, which the trajectories confirm. -\emph{Sweeps.} E2 sweeps grounding \texttt{g \(\in\) {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}}; E3 contrasts uniform against region-matched grounding allocation; E4 crosses parent count \texttt{K\_T \(\in\) {1,2,3,5}} with parent correlation \texttt{\(\rho\) \(\in\) {0, 0.25, 0.5, 0.75, 1}} and \texttt{g \(\in\) {0, 0.02, 0.05}}; E5 crosses selection mode (none / greedy / quality-diversity) with novelty weight; E6 compares four re-minting arms. +\emph{Sweeps.} The grounding sweep (\texttt{fig2\_grounding\_sweep}) sweeps \texttt{g \(\in\) {0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4}}; the aimed-grounding experiment (\texttt{figS5\_aimed\_grounding}) contrasts uniform against region-matched grounding allocation; the multi-parent union experiment (\texttt{figS8\_multiparent\_union}) crosses parent count \texttt{K\_T \(\in\) {1,2,3,5}} with parent correlation \texttt{\(\rho\) \(\in\) {0, 0.25, 0.5, 0.75, 1}} and \texttt{g \(\in\) {0, 0.02, 0.05}}; the selection experiment (\texttt{figS12\_quality\_diversity}) crosses selection mode (none / greedy / quality-diversity) with novelty weight; the re-baselining experiment (\texttt{figS3\_rebaselining}) compares four re-minting arms. -\emph{The correlated-parent construction (E4).} Parent correlation is constructed directly rather than obtained by tuning drift, so that \texttt{\(\rho\)} is not confounded with \texttt{n}, \texttt{m}, tail size, or generation count. For each tail item a shared switch \texttt{z \textasciitilde{} Bern(\(\rho\))}, a shared retention \texttt{s \textasciitilde{} Bern(q)}, and per-parent \texttt{u\(^{(k)}\) \textasciitilde{} Bern(q)} give parent \texttt{k} retention \texttt{s} if \texttt{z} else \texttt{u\(^{(k)}\)}. This yields exact marginal retention \texttt{q} and exact pairwise correlation \texttt{\(\rho\)}, and is exchangeable, so \texttt{\(\rho\)} is a single scalar knob. +\emph{The correlated-parent construction (\texttt{figS8\_multiparent\_union}).} Parent correlation is constructed directly rather than obtained by tuning drift, so that \texttt{\(\rho\)} is not confounded with \texttt{n}, \texttt{m}, tail size, or generation count. For each tail item a shared switch \texttt{z \textasciitilde{} Bern(\(\rho\))}, a shared retention \texttt{s \textasciitilde{} Bern(q)}, and per-parent \texttt{u\(^{(k)}\) \textasciitilde{} Bern(q)} give parent \texttt{k} retention \texttt{s} if \texttt{z} else \texttt{u\(^{(k)}\)}. This yields exact marginal retention \texttt{q} and exact pairwise correlation \texttt{\(\rho\)}, and is exchangeable, so \texttt{\(\rho\)} is a single scalar knob. -\emph{Multi-locus experiments (E7--E11, E14).} Genotypes are \texttt{L = 12} biallelic loci (4096 genotypes --- effectively open-ended relative to the population sizes used), with fitness either additive or a Kauffman NK landscape whose interaction count \texttt{K} tunes ruggedness from 0 to 10. E9 and E10 breed from \texttt{n\_parents = 6} local optima into populations of 200 offspring; E10 additionally screens offspring and iterates (5 rounds, keeping 8). E11 runs a population of \texttt{N = 60} agents for 80 generations at ruggedness \texttt{K = 8}, with mutation \texttt{\(\mu\) = 0.03}, 120 offspring per generation, and selection weighting true fitness against consensus conformity at \texttt{g = 0.85}. E14 sweeps mate-pool breadth on a ring of \texttt{N = 48} against ruggedness. +\emph{Multi-locus experiments} (\texttt{figS9\_specialist\_superparent}, \texttt{figS10\_rugged\_landscapes}, \texttt{figS11\_directed\_recombination}, \texttt{fig4\_society\_ablation}, \texttt{figS13\_mating\_breadth}). Genotypes are \texttt{L = 12} biallelic loci (4096 genotypes --- effectively open-ended relative to the population sizes used), with fitness either additive or a Kauffman NK landscape whose interaction count \texttt{K} tunes ruggedness from 0 to 10. The landscape and directed-recombination experiments breed from \texttt{n\_parents = 6} local optima into populations of 200 offspring; the directed one additionally screens offspring and iterates (5 rounds, keeping 8). The society ablation runs a population of \texttt{N = 60} agents for 80 generations at ruggedness \texttt{K = 8}, with mutation \texttt{\(\mu\) = 0.03}, 120 offspring per generation, and selection weighting true fitness against consensus conformity at \texttt{g = 0.85}. The mating-breadth experiment sweeps mate-pool breadth on a ring of \texttt{N = 48} against ruggedness. -\emph{Speciation (E12).} \texttt{L = 20} loci, incompatibility density \texttt{\(\rho\) \(\in\) {0.1, 0.25, 0.5}}, parental divergence swept 0--20 substitutions, 500 offspring per cell at recombination rate 0.5. E12\_nk repeats the question on NK landscapes (\texttt{L = 16}, \texttt{K} 0--10, 40 parent pairs, 200 offspring). +\emph{Speciation (\texttt{fig5\_speciation\_bdm}).} \texttt{L = 20} loci, incompatibility density \texttt{\(\rho\) \(\in\) {0.1, 0.25, 0.5}}, parental divergence swept 0--20 substitutions, 500 offspring per cell at recombination rate 0.5. \emph{Validation.} Three closed forms are asserted as standing tests to within 0.5\%: neutral heterozygosity decay \texttt{E[H\_t] = H\_0(1 \(-\) 1/n)\textasciicircum{}t}, the exact immigration--drift equilibrium, and the multi-parent union formula. These run in CI alongside the correctness tests. If they fail, the science is wrong rather than merely the code. @@ -236,7 +235,7 @@ Output of \texttt{figures/stats\_llm\_epistasis.py} (clustered CIs, paired predi Sixteen figures are cited from the main text by number. Each is the per-experiment figure regenerated from the committed results artifact (\texttt{figures/plot\_*.py}), reproduced here without re-plotting, so panel titles still carry the experiment's working name. Five of them are inheritance-model results with no real-model counterpart in this paper, reported here because each reproduces an established result: blending versus union retention (Fig. S8), the Fisher--Muller super-parent (Fig. S9), outbreeding depression on rugged landscapes (Fig. S10), directed recombination (Fig. S11), and the mate-pool breadth optimum (Fig. S13). \begin{figure}[p]\centering % s1 -\includegraphics[width=\textwidth]{figs/si/s1_architectures.pdf} +\includegraphics[width=\textwidth]{figs/si/s1_figS1_architectures.pdf} \caption{Collapse, and its arrest by real data, in three kinds of generator. The generational loop of Fig.~2 (train a child only on its parent's output, with or without 5\% real data) is run with an exact frequency count (a histogram, no network), a recurrent network and a feed-forward network, on a synthetic universe of 256 knowledge items whose true frequencies are known exactly; 200 samples per generation, 22 generations, 5 replicates. (A) Distance from the true distribution (forward KL divergence, which grows the more of the truth a model fails to cover) against generation: solid lines, with no real data, climb in every architecture; dashed lines, with 5\% real data, stay low. (B) The same distance at the end of the run (error bars over replicates): real data lowers it in all three. (C) The fraction of rare items still alive at the end: real data raises it in all three. The histogram's bars in C are small because a frequency count drops a rare item outright once it is unseen, whereas the networks keep some alive by smoothing (the subject of Fig.~S2). A variational autoencoder was excluded because it failed the generation-0 fidelity check on this task.}\label{s1} \end{figure} @@ -246,57 +245,57 @@ Sixteen figures are cited from the main text by number. Each is the per-experime \end{figure} \begin{figure}[p]\centering % s3 -\includegraphics[width=\textwidth]{figs/si/s3_E6.pdf} +\includegraphics[width=\textwidth]{figs/si/s3_figS3_rebaselining.pdf} \caption{Re-baselining a collapsed population locks in its losses. A tempting shortcut is to declare a model's current output the new reference and discard the original data. In the inheritance model (500 items, 200 samples per generation, 400 generations, 100 replicates) the population's current frequencies are frozen as the new grounding reference at generations 150 and 300 (dotted verticals) and the original truth is kept only for measurement. Four arms: re-baseline while still diverse, under generous real data (green); re-baseline after collapse, under starved real data (red); the same starvation with re-baselining allowed only while heterozygosity is above 0.75 (blue); never re-baseline (grey). (A) Distance from the original truth against generation (bands over replicates): the red arm steps up at each re-baselining and never returns; the healthy arm shows small steps; the gated and never arms coincide. (B) Heterozygosity, with the gate's threshold dashed: the gated arm never re-baselines because it stays below the line. Once rare knowledge is gone from every copy it cannot be rebuilt (Muller's ratchet); a diversity gate prevents the shortcut from making the loss permanent.}\label{s3} \end{figure} \begin{figure}[p]\centering % s4 -\includegraphics[width=\textwidth]{figs/si/s4_E2.pdf} +\includegraphics[width=\textwidth]{figs/si/s4_fig2_grounding_sweep.pdf} \caption{The full real-data sweep in the inheritance model (the experiment summarised in Fig.~2B). 1,000 knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 lineages; each generation also receives $m$ fresh real samples, so the real-data share is $g = m/(n+m)$, swept from 0 to 0.4. (A) Heterozygosity against generation, one line per $g$: with no real data it declines steadily; with any real data it levels off. (B) The level it settles at against $g$ (points, simulation) with the exact prediction (dashed) and the real data's own diversity (dotted); the red line marks $g^* = 0.048$ (95\% CI 0.047--0.050), where 95\% of the real data's diversity is kept. The hollow point at $g = 0$ has not converged (its equilibrium is zero). (C) The fraction of the rare tail retained, counted by items (red) and by their share of the truth (purple): both rise with $g$ but stay below 0.1 even at $g = 0.4$. (D) Survival by band of rarity, from the rarest (band 0) to the least rare (band 3): the rarest recover last. Overall diversity is cheap to protect; a rare item persists only once about one real example of it arrives per generation, so protecting it costs about one over its frequency in real samples.}\label{s4} \end{figure} \begin{figure}[p]\centering % s5 -\includegraphics[width=\textwidth]{figs/si/s5_E3.pdf} +\includegraphics[width=\textwidth]{figs/si/s5_figS5_aimed_grounding.pdf} \caption{Real data protects only the topics it covers. The 1,000 items are divided into ten topics (regions) and the same total budget of real data is spent either evenly over all ten or concentrated on one topic the experimenter wants to protect; 200 samples per generation, 400 generations, 100 replicates. (A) The fraction of that topic's rare items still alive against generation, with real data aimed at it (blue) or spread evenly (red), bands 95\% CI: aimed grounding holds about half the topic's rare items, spread grounding lets it fall to about 0.07. (B) Survival per topic at the end, same colours, the protected topic marked by the dotted line: aimed grounding protects its topic and leaves the others with no surviving rare items; spread grounding gives every topic the same low survival. Per-topic heterozygosity is confounded by how much of the truth each topic carries, so rare-item survival is the readout. A fixed budget of real data should be aimed at the knowledge one wants to keep.}\label{s5} \end{figure} \begin{figure}[p]\centering % s6 -\includegraphics[width=\textwidth]{figs/si/s6_grounding.pdf} +\includegraphics[width=\textwidth]{figs/si/s6_figS6_grounding_rnn.pdf} \caption{The real-data response in a trained recurrent network. The sweep of Fig.~S4 repeated in a recurrent generator rather than the exact simulation: 256 items, 200 samples per generation, 30 generations, $g$ swept over nine values from 0 to 0.2, 18 replicates. (A) Distance from the truth (forward KL divergence) against generation, one line per $g$: more real data suppresses the climb. (B) The final distance against $g$ (error bars 95\% CI), falling steadily from 2.08 with no real data to 0.75 at $g = 0.2$ (paired $t = 3.3$ at $g = 0.2$). (C) The fraction of the achievable improvement each $g$ buys: half of it arrives by $g = 0.040$ (red line; bootstrap 95\% CI 0.004--0.116 shaded), close to the simulation's $g^* = 0.048$ (black dashed), but the full improvement needs $g$ near 0.19. (D) Three ways of measuring collapse on one 0--1 scale: heterozygosity relative to the truth (blue) is flat near 0.8; the count of surviving rare items (orange) rises and falls with no pattern; the divergence-based recovery (green) rises cleanly. The direction of the effect matches the simulation, the threshold softens, and counting surviving items is the wrong ruler for a smoothing network, which keeps inventing rare items that are not in the truth; distance from the truth is the measure used for such networks.}\label{s6} \end{figure} \begin{figure}[p]\centering % s7 -\includegraphics[width=\textwidth]{figs/si/s7_mnist_collapse.pdf} +\includegraphics[width=\textwidth]{figs/si/s7_fig2_mnist_collapse.pdf} \caption{Collapse and rescue on real handwritten digits, in numbers (the experiment whose drawings are in Fig.~2A). A convolutional variational autoencoder is retrained from scratch each generation on the previous generation's drawings plus a fraction $g$ of real MNIST digits; the 30 kinds of digit (digit $\times$ stroke thickness, resampled to a long tail with about 18 rare kinds) are read out by a frozen classifier plus a thickness measure at 98.5\% accuracy. Two arms, $g = 0$ (red) and $g = 0.1$ (green); 6,000 drawings per generation, 15 generations, 4 replicates, bands 95\% CI. (A) Distance from the truth rises from about 0.5 to about 18 with no real data and stays near the floor with 10\%. (B) The number of distinct kinds still drawn falls from 30 to about 1 with no real data; with 10\% all 30 survive (dotted line). (C) The share of the rare kinds still alive falls to 0.06 with no real data; with 10\% all of it is kept. (D) Heterozygosity falls to zero with no real data and stays near 0.9 with 10\% (the truth's value dotted). Everything the simulation predicts appears on real images with an independent judge; the dose of real data needed is about twice the simulation's, for the reason shown in Fig.~S2.}\label{s7} \end{figure} \begin{figure}[p]\centering % s8 -\includegraphics[width=\textwidth]{figs/si/s8_E4.pdf} +\includegraphics[width=\textwidth]{figs/si/s8_figS8_multiparent_union.pdf} \caption{Averaging several parents cancels the benefit of having several; keeping each parent's strongest contribution does not. In the inheritance model (500 items) $K_T$ parents each remember a random share of the rare items, with the similarity of their shares controlled directly by a correlation $\rho$ (0 fully complementary, 1 identical); $K_T \in \{1, 2, 3, 5\}$, $\rho \in \{0, 0.25, 0.5, 0.75, 1\}$, 200 replicates. A child is built either by averaging the parents' output frequencies or by keeping, for each item, the largest frequency any parent gives it (a union), and then resamples as every generation does. (A) The fraction of the rare tail held by at least one parent against $\rho$, one curve per $K_T$: points are simulation, lines an exact formula, and they match. (B) The fraction that survives in the child: solid lines (union) rise with more and less similar parents; dashed lines (averaging) stay flat near 0.08 whatever the number of parents. (C) The same at $\rho = 0$ against the number of parents (error bars 95\% CI). Averaging dilutes each rare item by the number of parents, which exactly cancels the gain of having more parents to draw on (blending inheritance, the scheme Jenkin showed would swamp rare variants); the union realises the gain, and needs a judge to say which parent holds each item.}\label{s8} \end{figure} \begin{figure}[p]\centering % s9 -\includegraphics[width=\textwidth]{figs/si/s9_E8.pdf} +\includegraphics[width=\textwidth]{figs/si/s9_figS9_specialist_superparent.pdf} \caption{Many complementary parents can produce an offspring better than any of them. A capability is a string of twelve yes/no positions (a genotype of twelve loci) and fitness is the number of correct positions; each parent is a specialist, confident and correct (0.9) on the positions it has mastered and unsure (0.45) elsewhere, and no parent has mastered them all. Which positions a parent masters is drawn so that the number of parents $K_T$ and their correlation $\rho$ are independent knobs; the deployed capability is the fitness of the most probable genotype; 40 replicates, error bars 95\% CI. (A) Capability against the number of parents when parents master different positions ($\rho = 0$): position-wise recombination (red) reaches the perfect score of 12 with eight parents; the best single parent (grey) sits near 8.7; the average of the parents (blue) reaches about 11.6 at twelve parents. (B) Recombination against the number of parents at $\rho \in \{0, 0.5, 1\}$: complementary parents climb to the optimum, identical parents stay flat near 6. This is the Fisher--Muller effect, unbounded because a model population is not limited to two parents; Fig.~3B is its counterpart in language models.}\label{s9} \end{figure} \begin{figure}[p]\centering % s10 -\includegraphics[width=\textwidth]{figs/si/s10_E9.pdf} +\includegraphics[width=\textwidth]{figs/si/s10_figS10_rugged_landscapes.pdf} \caption{When skills are entangled, blind recombination harms the offspring. The twelve-position genotypes now sit on a rugged landscape (Kauffman's NK model) in which a position's value depends on its neighbours, with ruggedness $K$ from 0 (positions independent) to 8 (highly entangled). Parents are local optima found by hill-climbing, the model of a trained specialist; offspring are made from them at recombination rates from 0 (copy a parent) to 0.5 (free shuffling); 24 replicate landscapes, 200 offspring per point. (A) Mean offspring fitness minus the best parent against recombination rate, one curve per $K$: on a smooth landscape the difference is zero; as $K$ grows the curves fall, more steeply at higher rates, to about $-0.23$ at $K = 8$ under free recombination. (B) The fitness of the best offspring in a brood (parental level dotted): on rugged landscapes it peaks at an intermediate rate and falls back toward the parents under free shuffling. This is outbreeding depression; the optimal amount of recombination shrinks as skills become more entangled.}\label{s10} \end{figure} \begin{figure}[p]\centering % s11 -\includegraphics[width=\textwidth]{figs/si/s11_E10.pdf} +\includegraphics[width=\textwidth]{figs/si/s11_figS11_directed_recombination.pdf} \caption{Choosing mates and screening offspring rescues recombination on rugged landscapes. On the landscapes of Fig.~S10 three strategies are compared, all reported as deployed fitness in $[0, 1]$; 24 replicate landscapes, error bars 95\% CI: the best single parent (grey); random recombination, as in biology (blue: random parents, free recombination, offspring taken as they come); and directed recombination, which a model population can do and a living one cannot (red: complementary parents chosen, many offspring generated at rate 0.2, the fittest kept, for five rounds). (A) Capability against ruggedness $K$ with the global optimum dotted: random recombination falls from 0.66 at $K = 2$ to 0.51 at $K = 10$; directed recombination tracks the best parent and the optimum at every $K$. (B) The same as a difference from the best parent: directed stays at or above zero throughout; random falls to about $-0.2$. In language models this is ``breed many merges, keep the best'' (Table~S2).}\label{s11} \end{figure} \begin{figure}[p]\centering % s12 -\includegraphics[width=\textwidth]{figs/si/s12_E5.pdf} +\includegraphics[width=\textwidth]{figs/si/s12_figS12_quality_diversity.pdf} \caption{Selecting for the best destroys diversity; rewarding novelty preserves it. Each generation of the inheritance model (500 items, 200 samples per generation, 400 generations, 100 replicates, the same real data in every arm) now selects which items to keep, under three rules: no selection; greedy, keeping the items of highest true probability; and quality-diversity, which rewards an item for being rare as well as good, weighting item $i$ by $f_i p_i^{-\alpha}$ with $\alpha \in \{0.5, 1, 2\}$. (A) Heterozygosity against generation: greedy (red) collapses within a few generations to about 0.01; quality-diversity at $\alpha = 1$ (orange) and $\alpha = 2$ (blue) and no selection (green) hold a plateau above 0.85. (B) The settled heterozygosity against $\alpha$ (orange), with greedy (red dashed) and no selection (green dashed) as references: it rises from about 0.48 at $\alpha = 0.5$ to about 0.88 at $\alpha = 2$. (C) The number of distinct items alive at the end: about 9 under greedy, 14 to 28 under quality-diversity, about 32 with no selection. Chasing the best outputs is a directional pressure on top of drift; diversity has to be an objective in its own right, which is the diversity-preservation ingredient of Fig.~4D--F.}\label{s12} \end{figure} \begin{figure}[p]\centering % s13 -\includegraphics[width=\textwidth]{figs/si/s13_E14.pdf} +\includegraphics[width=\textwidth]{figs/si/s13_figS13_mating_breadth.pdf} \caption{Who should mate with whom: the best mating breadth narrows as skills become more entangled. Forty-eight agents carrying twelve-locus genotypes sit on a ring and evolve for 60 generations on an NK landscape of ruggedness $K \in \{0, 3, 6, 10\}$; an offspring's second parent is drawn from a neighbourhood of half-width $\approx bN/2$, so the breadth $b$ runs from mating only with neighbours ($b = 0.03$) to mating with anyone ($b = 1$), and an offspring replaces the agent at its position only if fitter (mutation 0.003, crossover rate 0.5, 20 replicates, error bars 95\% CI, breadth on a logarithmic axis). (A) The best fitness reached, relative to the optimum, against breadth, per $K$: on a smooth landscape every breadth reaches the optimum; at $K = 3$ the best breadth is 0.6, at $K = 6$ and 10 it is 0.35, and mating with everyone falls below it. (B) The population's mean fitness rises with breadth at every $K > 0$. (C) Standing diversity (mean pairwise Hamming distance) falls with breadth, fastest on rugged landscapes. Wide mixing spreads a good variant fast but homogenises the population, so on entangled problems it loses the ability to explore several solutions in parallel (Wright's argument for structured populations).}\label{s13} \end{figure} diff --git a/paper/pnas/si_figures.py b/paper/manuscript/si_figures.py similarity index 96% rename from paper/pnas/si_figures.py rename to paper/manuscript/si_figures.py index b3f452f..a55a7ce 100644 --- a/paper/pnas/si_figures.py +++ b/paper/manuscript/si_figures.py @@ -8,7 +8,7 @@ reading. """ SI_FIGURES: dict[str, tuple[str, str]] = { - "s1": ("results/architectures/architectures.pdf", + "s1": ("results/figS1_architectures/figS1_architectures.pdf", "Collapse, and its arrest by real data, in three kinds of generator. The generational loop of " "Fig.~2 (train a child only on its parent's output, with or without 5\\% real data) is run with an " "exact frequency count (a histogram, no network), a recurrent network and a feed-forward network, " @@ -22,7 +22,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "rare item outright once it is unseen, whereas the networks keep some alive by smoothing (the " "subject of Fig.~S2). A variational autoencoder was excluded because it failed the generation-0 " "fidelity check on this task."), - "s2": ("results/kernel_sharpen/kernel.pdf", + "s2": ("results/figS2_kernel_sharpen/kernel.pdf", "Why trained networks deviate from the ideal copier, in opposite directions. The inheritance model " "assumes a child's frequencies are exactly those it sampled from its parent. Two knobs are added to " "that copying step: a smoothing knob (a small pull toward treating every item as possible; mutation " @@ -40,7 +40,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "appear without being inherited) and the sharpening knob is positive frequency-dependent selection " "(the majority gains, nothing new appears); a trained network behaves as drift plus one of these two " "biases, set by its architecture."), - "s3": ("results/E6/E6.pdf", + "s3": ("results/figS3_rebaselining/figS3_rebaselining.pdf", "Re-baselining a collapsed population locks in its losses. A tempting shortcut is to declare a " "model's current output the new reference and discard the original data. In the inheritance model " "(500 items, 200 samples per generation, 400 generations, 100 replicates) the population's current " @@ -54,7 +54,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "dashed: the gated arm never re-baselines because it stays below the line. Once rare knowledge is " "gone from every copy it cannot be rebuilt (Muller's ratchet); a diversity gate prevents the " "shortcut from making the loss permanent."), - "s4": ("results/E2/E2.pdf", + "s4": ("results/fig2_grounding_sweep/fig2_grounding_sweep.pdf", "The full real-data sweep in the inheritance model (the experiment summarised in Fig.~2B). 1,000 " "knowledge items with a long tail of rare ones, 200 samples per generation, 500 generations, 100 " "lineages; each generation also receives $m$ fresh real samples, so the real-data share is " @@ -68,7 +68,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "of rarity, from the rarest (band 0) to the least rare (band 3): the rarest recover last. Overall " "diversity is cheap to protect; a rare item persists only once about one real example of it arrives " "per generation, so protecting it costs about one over its frequency in real samples."), - "s5": ("results/E3/E3.pdf", + "s5": ("results/figS5_aimed_grounding/figS5_aimed_grounding.pdf", "Real data protects only the topics it covers. The 1,000 items are divided into ten topics " "(regions) and the same total budget of real data is spent either evenly over all ten or " "concentrated on one topic the experimenter wants to protect; 200 samples per generation, 400 " @@ -80,7 +80,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "grounding gives every topic the same low survival. Per-topic heterozygosity is confounded by how " "much of the truth each topic carries, so rare-item survival is the readout. A fixed budget of real " "data should be aimed at the knowledge one wants to keep."), - "s6": ("results/grounding/grounding.pdf", + "s6": ("results/figS6_grounding_rnn/figS6_grounding_rnn.pdf", "The real-data response in a trained recurrent network. The sweep of Fig.~S4 repeated in a " "recurrent generator rather than the exact simulation: 256 items, 200 samples per generation, 30 " "generations, $g$ swept over nine values from 0 to 0.2, 18 replicates. (A) Distance from the truth " @@ -95,7 +95,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "direction of the effect matches the simulation, the threshold softens, and counting surviving items " "is the wrong ruler for a smoothing network, which keeps inventing rare items that are not in the " "truth; distance from the truth is the measure used for such networks."), - "s7": ("results/mnist_collapse/mnist_collapse.pdf", + "s7": ("results/fig2_mnist_collapse/fig2_mnist_collapse.pdf", "Collapse and rescue on real handwritten digits, in numbers (the experiment whose drawings are in " "Fig.~2A). A convolutional variational autoencoder is retrained from scratch each generation on the " "previous generation's drawings plus a fraction $g$ of real MNIST digits; the 30 kinds of digit " @@ -109,7 +109,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "data and stays near 0.9 with 10\\% (the truth's value dotted). Everything the simulation predicts " "appears on real images with an independent judge; the dose of real data needed is about twice the " "simulation's, for the reason shown in Fig.~S2."), - "s8": ("results/E4/E4.pdf", + "s8": ("results/figS8_multiparent_union/figS8_multiparent_union.pdf", "Averaging several parents cancels the benefit of having several; keeping each parent's strongest " "contribution does not. In the inheritance model (500 items) $K_T$ parents each remember a random " "share of the rare items, with the similarity of their shares controlled directly by a correlation " @@ -124,7 +124,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "dilutes each rare item by the number of parents, which exactly cancels the gain of having more " "parents to draw on (blending inheritance, the scheme Jenkin showed would swamp rare variants); the " "union realises the gain, and needs a judge to say which parent holds each item."), - "s9": ("results/E8/E8.pdf", + "s9": ("results/figS9_specialist_superparent/figS9_specialist_superparent.pdf", "Many complementary parents can produce an offspring better than any of them. A capability is a " "string of twelve yes/no positions (a genotype of twelve loci) and fitness is the number of correct " "positions; each parent is a specialist, confident and correct (0.9) on the positions it has " @@ -138,7 +138,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "$\\rho \\in \\{0, 0.5, 1\\}$: complementary parents climb to the optimum, identical parents stay " "flat near 6. This is the Fisher--Muller effect, unbounded because a model population is not limited " "to two parents; Fig.~3B is its counterpart in language models."), - "s10": ("results/E9/E9.pdf", + "s10": ("results/figS10_rugged_landscapes/figS10_rugged_landscapes.pdf", "When skills are entangled, blind recombination harms the offspring. The twelve-position genotypes " "now sit on a rugged landscape (Kauffman's NK model) in which a position's value depends on its " "neighbours, with ruggedness $K$ from 0 (positions independent) to 8 (highly entangled). Parents are " @@ -150,7 +150,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "the best offspring in a brood (parental level dotted): on rugged landscapes it peaks at an " "intermediate rate and falls back toward the parents under free shuffling. This is outbreeding " "depression; the optimal amount of recombination shrinks as skills become more entangled."), - "s11": ("results/E10/E10.pdf", + "s11": ("results/figS11_directed_recombination/figS11_directed_recombination.pdf", "Choosing mates and screening offspring rescues recombination on rugged landscapes. On the " "landscapes of Fig.~S10 three strategies are compared, all reported as deployed fitness in " "$[0, 1]$; 24 replicate landscapes, error bars 95\\% CI: the best single parent (grey); random " @@ -162,7 +162,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "the optimum at every $K$. (B) The same as a difference from the best parent: directed stays at or " "above zero throughout; random falls to about $-0.2$. In language models this is ``breed many " "merges, keep the best'' (Table~S2)."), - "s12": ("results/E5/E5.pdf", + "s12": ("results/figS12_quality_diversity/figS12_quality_diversity.pdf", "Selecting for the best destroys diversity; rewarding novelty preserves it. Each generation of the " "inheritance model (500 items, 200 samples per generation, 400 generations, 100 replicates, the same " "real data in every arm) now selects which items to keep, under three rules: no selection; greedy, " @@ -176,7 +176,7 @@ SI_FIGURES: dict[str, tuple[str, str]] = { "alive at the end: about 9 under greedy, 14 to 28 under quality-diversity, about 32 with no " "selection. Chasing the best outputs is a directional pressure on top of drift; diversity has to be " "an objective in its own right, which is the diversity-preservation ingredient of Fig.~4D--F."), - "s13": ("results/E14/E14.pdf", + "s13": ("results/figS13_mating_breadth/figS13_mating_breadth.pdf", "Who should mate with whom: the best mating breadth narrows as skills become more entangled. " "Forty-eight agents carrying twelve-locus genotypes sit on a ring and evolve for 60 generations on " "an NK landscape of ruggedness $K \\in \\{0, 3, 6, 10\\}$; an offspring's second parent is drawn " diff --git a/paper/response-to-review-3.md b/paper/response-to-review-3.md index f708220..0376523 100644 --- a/paper/response-to-review-3.md +++ b/paper/response-to-review-3.md @@ -1,7 +1,7 @@ # Response to the third review (of the PNAS-format draft) *All five priority fixes are made, plus the presentation items. The revised draft is -`paper/pnas/main.md` (rebuilt PDF alongside); the long-form document and the results documentation +`paper/manuscript/main.md` (rebuilt PDF alongside); the long-form document and the results documentation were corrected wherever they carried the same overstatements. Point-by-point:* ## 1. The averaging proposition (your §2) — you are right, and the text now proves what it claims diff --git a/paper/the-evolution-of-sex-for-ai.md b/paper/the-evolution-of-sex-for-ai.md index 1b6db38..b1c6bcb 100644 --- a/paper/the-evolution-of-sex-for-ai.md +++ b/paper/the-evolution-of-sex-for-ai.md @@ -365,7 +365,7 @@ prematurely converges onto one basin and finds a *worse* champion, while pure mo Throughout, wide mating lifts the *typical* model but monotonically **destroys diversity** — so on rugged problems, where the best model needs preserved diversity to be found, structured (partly monogamous) merging wins. The design rule extends the one above: *merge widely when skills are additive; keep -structured sub-populations — island-style merging — when skills are rugged.* (Figure: `results/E14/E14.png`.) +structured sub-populations — island-style merging — when skills are rugged.* (Figure: `results/figS13_mating_breadth/E14.png`.) *AI can do sex better than biology can.* Biology is stuck with two parents, mating roughly at random, and cannot inspect an offspring before it is born. An AI has none of those limits. It can recombine @@ -423,7 +423,7 @@ increasing specialisation eventually breaks merging and that one should then rou trained models is a coordinate artefact removable by aligning neurons (Git Re-Basin — Ainsworth et al., 2022). What the frame adds is the *theory* of the phenomenon they observe: its functional form, its super-linear (snowball) onset, and its dependence on epistasis — merge failure as a 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 "incompatibility" is a re-labelled loss barrier, and loss barriers between independently trained diff --git a/pyproject.toml b/pyproject.toml index e771e07..7e4ffb4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,10 +34,10 @@ notebooks = ["jupyter>=1.0"] requires = ["hatchling"] build-backend = "hatchling.build" -# src-layout: src/knowledge/ is importable as `knowledge` (the normative package -# name the scientific-validation conformance tests import). src/neural/ is Layer 1.5. +# src-layout: src/inheritance/ (the inheritance model, importable as `inheritance`), +# src/neural/ (trained networks) and src/llm/ (language models). [tool.hatch.build.targets.wheel] -packages = ["src/knowledge", "src/neural", "src/llm"] +packages = ["src/inheritance", "src/neural", "src/llm"] [tool.pytest.ini_options] testpaths = ["tests"] diff --git a/reproduce.sh b/reproduce.sh index 019749e..fdade98 100755 --- a/reproduce.sh +++ b/reproduce.sh @@ -31,7 +31,7 @@ say "Tests (correctness + closed-form scientific validation)" uv run pytest -q say "Biological-model tier at the committed seeds" -make layer1 +make inheritance if [[ $WITH_GPU -eq 1 ]]; then say "Trained-network tier"; make neural @@ -51,7 +51,7 @@ import hashlib, json, pathlib, subprocess, sys, datetime start, with_gpu = sys.argv[1], sys.argv[2] == "1" commit = subprocess.run(["git", "rev-parse", "HEAD"], capture_output=True, text=True).stdout.strip() rows, exact, differ, missing = [], 0, 0, 0 -for man_path in sorted(pathlib.Path("results").glob("*/manifest.json")): +for man_path in sorted(pathlib.Path("results").glob("**/manifest.json")): man = json.loads(man_path.read_text()) pq = man_path.parent / "results.parquet" want = man.get("results_sha256", "") diff --git a/results/E1/README.md b/results/collapse_null/README.md similarity index 100% rename from results/E1/README.md rename to results/collapse_null/README.md diff --git a/results/E1/E1.pdf b/results/collapse_null/collapse_null.pdf similarity index 100% rename from results/E1/E1.pdf rename to results/collapse_null/collapse_null.pdf diff --git a/results/E1/E1.png b/results/collapse_null/collapse_null.png similarity index 100% rename from results/E1/E1.png rename to results/collapse_null/collapse_null.png diff --git a/results/E1/manifest.json b/results/collapse_null/manifest.json similarity index 100% rename from results/E1/manifest.json rename to results/collapse_null/manifest.json diff --git a/results/E1/resolved_config.yaml b/results/collapse_null/resolved_config.yaml similarity index 97% rename from results/E1/resolved_config.yaml rename to results/collapse_null/resolved_config.yaml index 0701c4b..521e3f3 100644 --- a/results/E1/resolved_config.yaml +++ b/results/collapse_null/resolved_config.yaml @@ -34,7 +34,7 @@ source_config: kl_floor: 1.0e-09 support_eps: 1.0e-09 output: - dir: results/E1 + dir: results/collapse_null grid: - label: {} lineage_cfg: diff --git a/results/E2/README.md b/results/fig2_grounding_sweep/README.md similarity index 100% rename from results/E2/README.md rename to results/fig2_grounding_sweep/README.md diff --git a/results/E2/E2.pdf b/results/fig2_grounding_sweep/fig2_grounding_sweep.pdf similarity index 100% rename from results/E2/E2.pdf rename to results/fig2_grounding_sweep/fig2_grounding_sweep.pdf diff --git a/results/E2/E2.png b/results/fig2_grounding_sweep/fig2_grounding_sweep.png similarity index 100% rename from results/E2/E2.png rename to results/fig2_grounding_sweep/fig2_grounding_sweep.png diff --git a/results/E2/manifest.json b/results/fig2_grounding_sweep/manifest.json similarity index 100% rename from results/E2/manifest.json rename to results/fig2_grounding_sweep/manifest.json diff --git a/results/E2/resolved_config.yaml b/results/fig2_grounding_sweep/resolved_config.yaml similarity index 99% rename from results/E2/resolved_config.yaml rename to results/fig2_grounding_sweep/resolved_config.yaml index b626842..2807fde 100644 --- a/results/E2/resolved_config.yaml +++ b/results/fig2_grounding_sweep/resolved_config.yaml @@ -45,7 +45,7 @@ source_config: - 0.2 - 0.4 output: - dir: results/E2 + dir: results/fig2_grounding_sweep grid: - label: g: 0.0 diff --git a/results/mnist_collapse/README.md b/results/fig2_mnist_collapse/README.md similarity index 100% rename from results/mnist_collapse/README.md rename to results/fig2_mnist_collapse/README.md diff --git a/results/mnist_collapse/mnist_collapse.pdf b/results/fig2_mnist_collapse/fig2_mnist_collapse.pdf similarity index 100% rename from results/mnist_collapse/mnist_collapse.pdf rename to results/fig2_mnist_collapse/fig2_mnist_collapse.pdf diff --git a/results/mnist_collapse/mnist_collapse.png b/results/fig2_mnist_collapse/fig2_mnist_collapse.png similarity index 100% rename from results/mnist_collapse/mnist_collapse.png rename to results/fig2_mnist_collapse/fig2_mnist_collapse.png diff --git a/results/mnist_collapse/manifest.json b/results/fig2_mnist_collapse/manifest.json similarity index 100% rename from results/mnist_collapse/manifest.json rename to results/fig2_mnist_collapse/manifest.json diff --git a/results/mnist_collapse/mnist_montage.pdf b/results/fig2_mnist_collapse/mnist_montage.pdf similarity index 100% rename from results/mnist_collapse/mnist_montage.pdf rename to results/fig2_mnist_collapse/mnist_montage.pdf diff --git a/results/mnist_collapse/mnist_montage.png b/results/fig2_mnist_collapse/mnist_montage.png similarity index 100% rename from results/mnist_collapse/mnist_montage.png rename to results/fig2_mnist_collapse/mnist_montage.png diff --git a/results/mnist_collapse/resolved_config.yaml b/results/fig2_mnist_collapse/resolved_config.yaml similarity index 98% rename from results/mnist_collapse/resolved_config.yaml rename to results/fig2_mnist_collapse/resolved_config.yaml index 4bcb8c2..7bf400b 100644 --- a/results/mnist_collapse/resolved_config.yaml +++ b/results/fig2_mnist_collapse/resolved_config.yaml @@ -44,7 +44,7 @@ source_config: - 0.0 - 0.1 output: - dir: results/mnist_collapse + dir: results/fig2_mnist_collapse grid: - label: g: 0.0 diff --git a/results/E11/README.md b/results/fig4_society_ablation/README.md similarity index 100% rename from results/E11/README.md rename to results/fig4_society_ablation/README.md diff --git a/results/E11/E11.pdf b/results/fig4_society_ablation/fig4_society_ablation.pdf similarity index 100% rename from results/E11/E11.pdf rename to results/fig4_society_ablation/fig4_society_ablation.pdf diff --git a/results/E11/E11.png b/results/fig4_society_ablation/fig4_society_ablation.png similarity index 100% rename from results/E11/E11.png rename to results/fig4_society_ablation/fig4_society_ablation.png diff --git a/results/E11/manifest.json b/results/fig4_society_ablation/manifest.json similarity index 100% rename from results/E11/manifest.json rename to results/fig4_society_ablation/manifest.json diff --git a/results/E11/resolved_config.yaml b/results/fig4_society_ablation/resolved_config.yaml similarity index 93% rename from results/E11/resolved_config.yaml rename to results/fig4_society_ablation/resolved_config.yaml index 363c7fe..3f049c2 100644 --- a/results/E11/resolved_config.yaml +++ b/results/fig4_society_ablation/resolved_config.yaml @@ -34,4 +34,4 @@ source_config: society.select: greedy society.novelty: 0.0 output: - dir: results/E11 + dir: results/fig4_society_ablation diff --git a/results/E12/README.md b/results/fig5_speciation_bdm/README.md similarity index 93% rename from results/E12/README.md rename to results/fig5_speciation_bdm/README.md index df68826..b1065c3 100644 --- a/results/E12/README.md +++ b/results/fig5_speciation_bdm/README.md @@ -11,11 +11,11 @@ capability landscape. **Setup.** Pure seeded NumPy on the E7–E11 genotype machinery (bitwise-reproducible; no external simulator, whose separate RNG would break that guarantee). Two landscapes: -- **BDM** (`configs/layer1/E12.yaml`, headline): an ancestor; two lineages each substitute a *disjoint* +- **BDM** (`configs/inheritance/fig5_speciation_bdm.yaml`, headline): an ancestor; two lineages each substitute a *disjoint* set of loci (each parent adaptive, neither carrying an incompatibility); a fraction `ρ` of cross-lineage locus pairs are BDMIs (penalty `s`), biting only when a hybrid inherits *both* derived alleles. Sweep divergence `d` (substitutions) for several `ρ`; `L=20`, 15 reps. -- **NK** (`configs/layer1/E12_nk.yaml`): parents are *local optima* (hill-climbed) on a Kauffman NK +- **NK** (`configs/inheritance/speciation_bdm_nk.yaml`): parents are *local optima* (hill-climbed) on a Kauffman NK landscape; sweep ruggedness `K`. The emergent version. ### Results diff --git a/results/E12/E12.pdf b/results/fig5_speciation_bdm/fig5_speciation_bdm.pdf similarity index 100% rename from results/E12/E12.pdf rename to results/fig5_speciation_bdm/fig5_speciation_bdm.pdf diff --git a/results/E12/E12.png b/results/fig5_speciation_bdm/fig5_speciation_bdm.png similarity index 100% rename from results/E12/E12.png rename to results/fig5_speciation_bdm/fig5_speciation_bdm.png diff --git a/results/E12/manifest.json b/results/fig5_speciation_bdm/manifest.json similarity index 100% rename from results/E12/manifest.json rename to results/fig5_speciation_bdm/manifest.json diff --git a/results/E12/resolved_config.yaml b/results/fig5_speciation_bdm/resolved_config.yaml similarity index 91% rename from results/E12/resolved_config.yaml rename to results/fig5_speciation_bdm/resolved_config.yaml index 5b3cc3e..dbed444 100644 --- a/results/E12/resolved_config.yaml +++ b/results/fig5_speciation_bdm/resolved_config.yaml @@ -30,4 +30,4 @@ source_config: recomb_rate: 0.5 n_offspring: 500 output: - dir: results/E12 + dir: results/fig5_speciation_bdm diff --git a/results/E9/README.md b/results/figS10_rugged_landscapes/README.md similarity index 100% rename from results/E9/README.md rename to results/figS10_rugged_landscapes/README.md diff --git a/results/E9/E9.pdf b/results/figS10_rugged_landscapes/figS10_rugged_landscapes.pdf similarity index 100% rename from results/E9/E9.pdf rename to results/figS10_rugged_landscapes/figS10_rugged_landscapes.pdf diff --git a/results/E9/E9.png b/results/figS10_rugged_landscapes/figS10_rugged_landscapes.png similarity index 100% rename from results/E9/E9.png rename to results/figS10_rugged_landscapes/figS10_rugged_landscapes.png diff --git a/results/E9/manifest.json b/results/figS10_rugged_landscapes/manifest.json similarity index 100% rename from results/E9/manifest.json rename to results/figS10_rugged_landscapes/manifest.json diff --git a/results/E9/resolved_config.yaml b/results/figS10_rugged_landscapes/resolved_config.yaml similarity index 89% rename from results/E9/resolved_config.yaml rename to results/figS10_rugged_landscapes/resolved_config.yaml index e09122d..30e8a6c 100644 --- a/results/E9/resolved_config.yaml +++ b/results/figS10_rugged_landscapes/resolved_config.yaml @@ -27,4 +27,4 @@ source_config: - 0.35 - 0.5 output: - dir: results/E9 + dir: results/figS10_rugged_landscapes diff --git a/results/E10/README.md b/results/figS11_directed_recombination/README.md similarity index 100% rename from results/E10/README.md rename to results/figS11_directed_recombination/README.md diff --git a/results/E10/E10.pdf b/results/figS11_directed_recombination/figS11_directed_recombination.pdf similarity index 100% rename from results/E10/E10.pdf rename to results/figS11_directed_recombination/figS11_directed_recombination.pdf diff --git a/results/E10/E10.png b/results/figS11_directed_recombination/figS11_directed_recombination.png similarity index 100% rename from results/E10/E10.png rename to results/figS11_directed_recombination/figS11_directed_recombination.png diff --git a/results/E10/manifest.json b/results/figS11_directed_recombination/manifest.json similarity index 100% rename from results/E10/manifest.json rename to results/figS11_directed_recombination/manifest.json diff --git a/results/E10/resolved_config.yaml b/results/figS11_directed_recombination/resolved_config.yaml similarity index 86% rename from results/E10/resolved_config.yaml rename to results/figS11_directed_recombination/resolved_config.yaml index 86df9ef..ad6a77c 100644 --- a/results/E10/resolved_config.yaml +++ b/results/figS11_directed_recombination/resolved_config.yaml @@ -22,4 +22,4 @@ source_config: - 8 - 10 output: - dir: results/E10 + dir: results/figS11_directed_recombination diff --git a/results/E5/README.md b/results/figS12_quality_diversity/README.md similarity index 100% rename from results/E5/README.md rename to results/figS12_quality_diversity/README.md diff --git a/results/E5/E5.pdf b/results/figS12_quality_diversity/figS12_quality_diversity.pdf similarity index 100% rename from results/E5/E5.pdf rename to results/figS12_quality_diversity/figS12_quality_diversity.pdf diff --git a/results/E5/E5.png b/results/figS12_quality_diversity/figS12_quality_diversity.png similarity index 100% rename from results/E5/E5.png rename to results/figS12_quality_diversity/figS12_quality_diversity.png diff --git a/results/E5/manifest.json b/results/figS12_quality_diversity/manifest.json similarity index 100% rename from results/E5/manifest.json rename to results/figS12_quality_diversity/manifest.json diff --git a/results/E5/resolved_config.yaml b/results/figS12_quality_diversity/resolved_config.yaml similarity index 99% rename from results/E5/resolved_config.yaml rename to results/figS12_quality_diversity/resolved_config.yaml index 683b195..94049c7 100644 --- a/results/E5/resolved_config.yaml +++ b/results/figS12_quality_diversity/resolved_config.yaml @@ -45,7 +45,7 @@ source_config: - 1.0 - 2.0 output: - dir: results/E5 + dir: results/figS12_quality_diversity grid: - label: mode: none diff --git a/results/E14/README.md b/results/figS13_mating_breadth/README.md similarity index 100% rename from results/E14/README.md rename to results/figS13_mating_breadth/README.md diff --git a/results/E14/E14.pdf b/results/figS13_mating_breadth/figS13_mating_breadth.pdf similarity index 100% rename from results/E14/E14.pdf rename to results/figS13_mating_breadth/figS13_mating_breadth.pdf diff --git a/results/E14/E14.png b/results/figS13_mating_breadth/figS13_mating_breadth.png similarity index 100% rename from results/E14/E14.png rename to results/figS13_mating_breadth/figS13_mating_breadth.png diff --git a/results/E14/manifest.json b/results/figS13_mating_breadth/manifest.json similarity index 100% rename from results/E14/manifest.json rename to results/figS13_mating_breadth/manifest.json diff --git a/results/E14/resolved_config.yaml b/results/figS13_mating_breadth/resolved_config.yaml similarity index 91% rename from results/E14/resolved_config.yaml rename to results/figS13_mating_breadth/resolved_config.yaml index a92f828..a6bf565 100644 --- a/results/E14/resolved_config.yaml +++ b/results/figS13_mating_breadth/resolved_config.yaml @@ -30,4 +30,4 @@ source_config: - 0.6 - 1.0 output: - dir: results/E14 + dir: results/figS13_mating_breadth diff --git a/results/architectures/README.md b/results/figS1_architectures/README.md similarity index 100% rename from results/architectures/README.md rename to results/figS1_architectures/README.md diff --git a/results/architectures/architectures.pdf b/results/figS1_architectures/figS1_architectures.pdf similarity index 100% rename from results/architectures/architectures.pdf rename to results/figS1_architectures/figS1_architectures.pdf diff --git a/results/architectures/architectures.png b/results/figS1_architectures/figS1_architectures.png similarity index 100% rename from results/architectures/architectures.png rename to results/figS1_architectures/figS1_architectures.png diff --git a/results/architectures/manifest.json b/results/figS1_architectures/manifest.json similarity index 100% rename from results/architectures/manifest.json rename to results/figS1_architectures/manifest.json diff --git a/results/architectures/resolved_config.yaml b/results/figS1_architectures/resolved_config.yaml similarity index 99% rename from results/architectures/resolved_config.yaml rename to results/figS1_architectures/resolved_config.yaml index 82126fa..eb33c75 100644 --- a/results/architectures/resolved_config.yaml +++ b/results/figS1_architectures/resolved_config.yaml @@ -49,7 +49,7 @@ source_config: - 0.0 - 0.05 output: - dir: results/architectures + dir: results/figS1_architectures grid: - label: kind: histogram diff --git a/results/kernel_sharpen/README.md b/results/figS2_kernel_sharpen/README.md similarity index 96% rename from results/kernel_sharpen/README.md rename to results/figS2_kernel_sharpen/README.md index 83ee22c..3dd5a3c 100644 --- a/results/kernel_sharpen/README.md +++ b/results/figS2_kernel_sharpen/README.md @@ -1,6 +1,6 @@ # kernel — the learning kernel: why real learners deviate from neutral drift -*(This legend covers both `results/kernel_sharpen/` and `results/kernel_smooth/`; the figure +*(This legend covers both `results/figS2_kernel_sharpen/` and `results/figS2_kernel_smooth/`; the figure `kernel.png` is written into both.)* **Claim tested.** Neutral Wright–Fisher drift (the histogram bridge, and the baseline of Riis diff --git a/results/kernel_sharpen/kernel.pdf b/results/figS2_kernel_sharpen/kernel.pdf similarity index 100% rename from results/kernel_sharpen/kernel.pdf rename to results/figS2_kernel_sharpen/kernel.pdf diff --git a/results/kernel_sharpen/kernel.png b/results/figS2_kernel_sharpen/kernel.png similarity index 100% rename from results/kernel_sharpen/kernel.png rename to results/figS2_kernel_sharpen/kernel.png diff --git a/results/kernel_sharpen/manifest.json b/results/figS2_kernel_sharpen/manifest.json similarity index 100% rename from results/kernel_sharpen/manifest.json rename to results/figS2_kernel_sharpen/manifest.json diff --git a/results/kernel_sharpen/resolved_config.yaml b/results/figS2_kernel_sharpen/resolved_config.yaml similarity index 97% rename from results/kernel_sharpen/resolved_config.yaml rename to results/figS2_kernel_sharpen/resolved_config.yaml index 116f15e..4d30fa4 100644 --- a/results/kernel_sharpen/resolved_config.yaml +++ b/results/figS2_kernel_sharpen/resolved_config.yaml @@ -32,7 +32,7 @@ source_config: - 1.0 - 0.8 output: - dir: results/kernel_sharpen + dir: results/figS2_kernel_sharpen grid: - label: temperature: 1.0 diff --git a/results/kernel_smooth/README.md b/results/figS2_kernel_smooth/README.md similarity index 96% rename from results/kernel_smooth/README.md rename to results/figS2_kernel_smooth/README.md index 83ee22c..3dd5a3c 100644 --- a/results/kernel_smooth/README.md +++ b/results/figS2_kernel_smooth/README.md @@ -1,6 +1,6 @@ # kernel — the learning kernel: why real learners deviate from neutral drift -*(This legend covers both `results/kernel_sharpen/` and `results/kernel_smooth/`; the figure +*(This legend covers both `results/figS2_kernel_sharpen/` and `results/figS2_kernel_smooth/`; the figure `kernel.png` is written into both.)* **Claim tested.** Neutral Wright–Fisher drift (the histogram bridge, and the baseline of Riis diff --git a/results/kernel_smooth/kernel.pdf b/results/figS2_kernel_smooth/kernel.pdf similarity index 100% rename from results/kernel_smooth/kernel.pdf rename to results/figS2_kernel_smooth/kernel.pdf diff --git a/results/kernel_smooth/kernel.png b/results/figS2_kernel_smooth/kernel.png similarity index 100% rename from results/kernel_smooth/kernel.png rename to results/figS2_kernel_smooth/kernel.png diff --git a/results/kernel_smooth/manifest.json b/results/figS2_kernel_smooth/manifest.json similarity index 100% rename from results/kernel_smooth/manifest.json rename to results/figS2_kernel_smooth/manifest.json diff --git a/results/kernel_smooth/resolved_config.yaml b/results/figS2_kernel_smooth/resolved_config.yaml similarity index 97% rename from results/kernel_smooth/resolved_config.yaml rename to results/figS2_kernel_smooth/resolved_config.yaml index c07457e..2905eda 100644 --- a/results/kernel_smooth/resolved_config.yaml +++ b/results/figS2_kernel_smooth/resolved_config.yaml @@ -32,7 +32,7 @@ source_config: - 0.0 - 0.006 output: - dir: results/kernel_smooth + dir: results/figS2_kernel_smooth grid: - label: reset: 0.0 diff --git a/results/E6/README.md b/results/figS3_rebaselining/README.md similarity index 100% rename from results/E6/README.md rename to results/figS3_rebaselining/README.md diff --git a/results/E6/E6.pdf b/results/figS3_rebaselining/figS3_rebaselining.pdf similarity index 100% rename from results/E6/E6.pdf rename to results/figS3_rebaselining/figS3_rebaselining.pdf diff --git a/results/E6/E6.png b/results/figS3_rebaselining/figS3_rebaselining.png similarity index 100% rename from results/E6/E6.png rename to results/figS3_rebaselining/figS3_rebaselining.png diff --git a/results/E6/manifest.json b/results/figS3_rebaselining/manifest.json similarity index 100% rename from results/E6/manifest.json rename to results/figS3_rebaselining/manifest.json diff --git a/results/E6/resolved_config.yaml b/results/figS3_rebaselining/resolved_config.yaml similarity index 98% rename from results/E6/resolved_config.yaml rename to results/figS3_rebaselining/resolved_config.yaml index 7b89a43..b682f83 100644 --- a/results/E6/resolved_config.yaml +++ b/results/figS3_rebaselining/resolved_config.yaml @@ -56,7 +56,7 @@ source_config: dynamics.grounding.m: 1 dynamics.remint.enabled: false output: - dir: results/E6 + dir: results/figS3_rebaselining grid: - label: arm: healthy_remint diff --git a/results/E3/README.md b/results/figS5_aimed_grounding/README.md similarity index 100% rename from results/E3/README.md rename to results/figS5_aimed_grounding/README.md diff --git a/results/E3/E3.pdf b/results/figS5_aimed_grounding/figS5_aimed_grounding.pdf similarity index 100% rename from results/E3/E3.pdf rename to results/figS5_aimed_grounding/figS5_aimed_grounding.pdf diff --git a/results/E3/E3.png b/results/figS5_aimed_grounding/figS5_aimed_grounding.png similarity index 100% rename from results/E3/E3.png rename to results/figS5_aimed_grounding/figS5_aimed_grounding.png diff --git a/results/E3/manifest.json b/results/figS5_aimed_grounding/manifest.json similarity index 100% rename from results/E3/manifest.json rename to results/figS5_aimed_grounding/manifest.json diff --git a/results/E3/resolved_config.yaml b/results/figS5_aimed_grounding/resolved_config.yaml similarity index 98% rename from results/E3/resolved_config.yaml rename to results/figS5_aimed_grounding/resolved_config.yaml index d814792..e35e8a2 100644 --- a/results/E3/resolved_config.yaml +++ b/results/figS5_aimed_grounding/resolved_config.yaml @@ -41,7 +41,7 @@ source_config: - uniform - matched output: - dir: results/E3 + dir: results/figS5_aimed_grounding grid: - label: policy: uniform diff --git a/results/grounding/README.md b/results/figS6_grounding_rnn/README.md similarity index 100% rename from results/grounding/README.md rename to results/figS6_grounding_rnn/README.md diff --git a/results/grounding/grounding.pdf b/results/figS6_grounding_rnn/figS6_grounding_rnn.pdf similarity index 100% rename from results/grounding/grounding.pdf rename to results/figS6_grounding_rnn/figS6_grounding_rnn.pdf diff --git a/results/grounding/grounding.png b/results/figS6_grounding_rnn/figS6_grounding_rnn.png similarity index 100% rename from results/grounding/grounding.png rename to results/figS6_grounding_rnn/figS6_grounding_rnn.png diff --git a/results/grounding/manifest.json b/results/figS6_grounding_rnn/manifest.json similarity index 100% rename from results/grounding/manifest.json rename to results/figS6_grounding_rnn/manifest.json diff --git a/results/grounding/resolved_config.yaml b/results/figS6_grounding_rnn/resolved_config.yaml similarity index 99% rename from results/grounding/resolved_config.yaml rename to results/figS6_grounding_rnn/resolved_config.yaml index a7a40a4..1a1f0ff 100644 --- a/results/grounding/resolved_config.yaml +++ b/results/figS6_grounding_rnn/resolved_config.yaml @@ -51,7 +51,7 @@ source_config: - 0.1 - 0.2 output: - dir: results/grounding + dir: results/figS6_grounding_rnn grid: - label: g: 0.0 diff --git a/results/E4/README.md b/results/figS8_multiparent_union/README.md similarity index 100% rename from results/E4/README.md rename to results/figS8_multiparent_union/README.md diff --git a/results/E4/E4.pdf b/results/figS8_multiparent_union/figS8_multiparent_union.pdf similarity index 100% rename from results/E4/E4.pdf rename to results/figS8_multiparent_union/figS8_multiparent_union.pdf diff --git a/results/E4/E4.png b/results/figS8_multiparent_union/figS8_multiparent_union.png similarity index 100% rename from results/E4/E4.png rename to results/figS8_multiparent_union/figS8_multiparent_union.png diff --git a/results/E4/manifest.json b/results/figS8_multiparent_union/manifest.json similarity index 100% rename from results/E4/manifest.json rename to results/figS8_multiparent_union/manifest.json diff --git a/results/E4/resolved_config.yaml b/results/figS8_multiparent_union/resolved_config.yaml similarity index 92% rename from results/E4/resolved_config.yaml rename to results/figS8_multiparent_union/resolved_config.yaml index b5597fc..76eee0a 100644 --- a/results/E4/resolved_config.yaml +++ b/results/figS8_multiparent_union/resolved_config.yaml @@ -36,4 +36,4 @@ source_config: - 0.02 - 0.05 output: - dir: results/E4 + dir: results/figS8_multiparent_union diff --git a/results/E8/README.md b/results/figS9_specialist_superparent/README.md similarity index 100% rename from results/E8/README.md rename to results/figS9_specialist_superparent/README.md diff --git a/results/E8/E8.pdf b/results/figS9_specialist_superparent/figS9_specialist_superparent.pdf similarity index 100% rename from results/E8/E8.pdf rename to results/figS9_specialist_superparent/figS9_specialist_superparent.pdf diff --git a/results/E8/E8.png b/results/figS9_specialist_superparent/figS9_specialist_superparent.png similarity index 100% rename from results/E8/E8.png rename to results/figS9_specialist_superparent/figS9_specialist_superparent.png diff --git a/results/E8/manifest.json b/results/figS9_specialist_superparent/manifest.json similarity index 100% rename from results/E8/manifest.json rename to results/figS9_specialist_superparent/manifest.json diff --git a/results/E8/resolved_config.yaml b/results/figS9_specialist_superparent/resolved_config.yaml similarity index 88% rename from results/E8/resolved_config.yaml rename to results/figS9_specialist_superparent/resolved_config.yaml index 214fb4c..6fad845 100644 --- a/results/E8/resolved_config.yaml +++ b/results/figS9_specialist_superparent/resolved_config.yaml @@ -26,4 +26,4 @@ source_config: - 0.5 - 1.0 output: - dir: results/E8 + dir: results/figS9_specialist_superparent diff --git a/results/E7/README.md b/results/sexual_vs_asexual_lineage/README.md similarity index 100% rename from results/E7/README.md rename to results/sexual_vs_asexual_lineage/README.md diff --git a/results/E7/manifest.json b/results/sexual_vs_asexual_lineage/manifest.json similarity index 100% rename from results/E7/manifest.json rename to results/sexual_vs_asexual_lineage/manifest.json diff --git a/results/E7/resolved_config.yaml b/results/sexual_vs_asexual_lineage/resolved_config.yaml similarity index 88% rename from results/E7/resolved_config.yaml rename to results/sexual_vs_asexual_lineage/resolved_config.yaml index f18fb16..5297058 100644 --- a/results/E7/resolved_config.yaml +++ b/results/sexual_vs_asexual_lineage/resolved_config.yaml @@ -20,4 +20,4 @@ source_config: - 0.0 - 1.0 output: - dir: results/E7 + dir: results/sexual_vs_asexual_lineage diff --git a/results/E7/E7.pdf b/results/sexual_vs_asexual_lineage/sexual_vs_asexual_lineage.pdf similarity index 100% rename from results/E7/E7.pdf rename to results/sexual_vs_asexual_lineage/sexual_vs_asexual_lineage.pdf diff --git a/results/E7/E7.png b/results/sexual_vs_asexual_lineage/sexual_vs_asexual_lineage.png similarity index 100% rename from results/E7/E7.png rename to results/sexual_vs_asexual_lineage/sexual_vs_asexual_lineage.png diff --git a/results/E12_nk/manifest.json b/results/speciation_bdm_nk/manifest.json similarity index 100% rename from results/E12_nk/manifest.json rename to results/speciation_bdm_nk/manifest.json diff --git a/results/E12_nk/resolved_config.yaml b/results/speciation_bdm_nk/resolved_config.yaml similarity index 89% rename from results/E12_nk/resolved_config.yaml rename to results/speciation_bdm_nk/resolved_config.yaml index dcf4dfb..cf85c4d 100644 --- a/results/E12_nk/resolved_config.yaml +++ b/results/speciation_bdm_nk/resolved_config.yaml @@ -20,4 +20,4 @@ source_config: recomb_rate: 0.5 n_offspring: 200 output: - dir: results/E12_nk + dir: results/speciation_bdm_nk diff --git a/src/knowledge/__init__.py b/src/inheritance/__init__.py similarity index 100% rename from src/knowledge/__init__.py rename to src/inheritance/__init__.py diff --git a/src/knowledge/analysis.py b/src/inheritance/analysis.py similarity index 100% rename from src/knowledge/analysis.py rename to src/inheritance/analysis.py diff --git a/src/knowledge/config.py b/src/inheritance/config.py similarity index 100% rename from src/knowledge/config.py rename to src/inheritance/config.py diff --git a/src/knowledge/dynamic_society.py b/src/inheritance/dynamic_society.py similarity index 100% rename from src/knowledge/dynamic_society.py rename to src/inheritance/dynamic_society.py diff --git a/src/knowledge/experiment.py b/src/inheritance/experiment.py similarity index 99% rename from src/knowledge/experiment.py rename to src/inheritance/experiment.py index 6607523..e56115c 100644 --- a/src/knowledge/experiment.py +++ b/src/inheritance/experiment.py @@ -6,7 +6,7 @@ single master seed, and returns long-form results. ``save_artifacts`` writes the contract: ``results.parquet`` + ``resolved_config.yaml`` + ``manifest.json``. Figures are regenerated separately from ``results.parquet`` alone. -CLI: python -m knowledge.experiment configs/layer1/E2.yaml +CLI: python -m inheritance.experiment configs/inheritance/fig2_grounding_sweep.yaml """ from __future__ import annotations @@ -427,7 +427,7 @@ def run_and_save(config_path: str | Path) -> Path: def main(argv: list[str] | None = None) -> None: parser = argparse.ArgumentParser(description="Run a Layer-1 experiment from a YAML config.") - parser.add_argument("config", help="Path to configs/layer1/EX.yaml") + parser.add_argument("config", help="Path to configs/inheritance/EX.yaml") args = parser.parse_args(argv) out_dir = run_and_save(args.config) print(f"wrote artifacts to {out_dir}/") diff --git a/src/knowledge/genotype.py b/src/inheritance/genotype.py similarity index 100% rename from src/knowledge/genotype.py rename to src/inheritance/genotype.py diff --git a/src/knowledge/genotype_lineage.py b/src/inheritance/genotype_lineage.py similarity index 100% rename from src/knowledge/genotype_lineage.py rename to src/inheritance/genotype_lineage.py diff --git a/src/knowledge/kernel.py b/src/inheritance/kernel.py similarity index 100% rename from src/knowledge/kernel.py rename to src/inheritance/kernel.py diff --git a/src/knowledge/lineage.py b/src/inheritance/lineage.py similarity index 98% rename from src/knowledge/lineage.py rename to src/inheritance/lineage.py index f27755a..e18f57b 100644 --- a/src/knowledge/lineage.py +++ b/src/inheritance/lineage.py @@ -2,7 +2,7 @@ ``run_lineage`` is the core driver every experiment builds on. It accepts a plain nested mapping (the scientific-validation conformance tests pass one directly) or a -:class:`~knowledge.config.LineageCfg`, and returns a tidy DataFrame with one row per +:class:`~inheritance.config.LineageCfg`, and returns a tidy DataFrame with one row per generation (0..T inclusive) carrying every blueprint-2.3 metric, global and per-region. """ diff --git a/src/knowledge/mating_system.py b/src/inheritance/mating_system.py similarity index 100% rename from src/knowledge/mating_system.py rename to src/inheritance/mating_system.py diff --git a/src/knowledge/metrics.py b/src/inheritance/metrics.py similarity index 100% rename from src/knowledge/metrics.py rename to src/inheritance/metrics.py diff --git a/src/knowledge/seeding.py b/src/inheritance/seeding.py similarity index 100% rename from src/knowledge/seeding.py rename to src/inheritance/seeding.py diff --git a/src/knowledge/society.py b/src/inheritance/society.py similarity index 100% rename from src/knowledge/society.py rename to src/inheritance/society.py diff --git a/src/knowledge/speciation.py b/src/inheritance/speciation.py similarity index 100% rename from src/knowledge/speciation.py rename to src/inheritance/speciation.py diff --git a/src/knowledge/step.py b/src/inheritance/step.py similarity index 100% rename from src/knowledge/step.py rename to src/inheritance/step.py diff --git a/src/knowledge/teachers.py b/src/inheritance/teachers.py similarity index 100% rename from src/knowledge/teachers.py rename to src/inheritance/teachers.py diff --git a/src/knowledge/truth.py b/src/inheritance/truth.py similarity index 100% rename from src/knowledge/truth.py rename to src/inheritance/truth.py diff --git a/src/llm/experiment.py b/src/llm/experiment.py index 11a386b..fddf9eb 100644 --- a/src/llm/experiment.py +++ b/src/llm/experiment.py @@ -3,7 +3,7 @@ Trains one LoRA specialist per task family on a small open-weight base, then evaluates the base, each specialist, and their weight-space **merges** (soup vs ties) on a held-out mixed test set. Produces a tidy long-form results frame and the standard artifact triple (via -``knowledge.experiment.save_artifacts``), recording model/adapter provenance in the manifest. +``inheritance.experiment.save_artifacts``), recording model/adapter provenance in the manifest. The claim under test (the real-LLM image of E8): a model recombined from decorrelated specialists is better than any single specialist overall, and — the sharper signature — competent across *all* @@ -20,7 +20,7 @@ import numpy as np import pandas as pd import yaml -from knowledge.experiment import save_artifacts +from inheritance.experiment import save_artifacts from .directed import sample_merge_weights, select_winners from .evaluate import evaluate, generate, load_model diff --git a/src/neural/__init__.py b/src/neural/__init__.py index 30efddb..83b2006 100644 --- a/src/neural/__init__.py +++ b/src/neural/__init__.py @@ -3,7 +3,7 @@ Realises the Layer-1 (``knowledge``) Wright-Fisher abstractions in *real trained generative models* on a fully-synthetic sandbox whose ground-truth ``p*`` is known exactly. A model's knowledge is measured as its output distribution over ``K`` discrete -*modes* (via an oracle), so the same metrics (``knowledge.metrics``), the same closed +*modes* (via an oracle), so the same metrics (``inheritance.metrics``), the same closed forms, and the same experiments carry over — a neural collapse curve can be overlaid on a Layer-1 analytic curve. diff --git a/src/neural/config.py b/src/neural/config.py index a5e5a7c..e838470 100644 --- a/src/neural/config.py +++ b/src/neural/config.py @@ -1,8 +1,8 @@ """Resolved run configuration for a neural (Layer 1.5) lineage. -Mirrors the ``knowledge.config`` idiom exactly: frozen dataclasses with a ``from_dict`` -that fills defaults and rejects unknown keys via ``knowledge.config._sub``. The grounding, -re-mint, and metrics blocks are *reused verbatim* from ``knowledge.config`` so the neural +Mirrors the ``inheritance.config`` idiom exactly: frozen dataclasses with a ``from_dict`` +that fills defaults and rejects unknown keys via ``inheritance.config._sub``. The grounding, +re-mint, and metrics blocks are *reused verbatim* from ``inheritance.config`` so the neural runner speaks the same schema as Layer 1 (grounding ``m``, the ``g -> m`` conversion, the re-mint gate, and the KL/support floors are all identical). Only the data source (``synthetic``) and the model (``model``) are neural-specific. @@ -14,7 +14,7 @@ import math from dataclasses import dataclass, field, replace from typing import Any, Mapping -from knowledge.config import GroundingCfg, MetricsCfg, RemintCfg, _sub +from inheritance.config import GroundingCfg, MetricsCfg, RemintCfg, _sub @dataclass(frozen=True) @@ -22,7 +22,7 @@ class SyntheticCfg: """The fully-synthetic mode-truth and observation grammar. The first seven fields are the Layer-1 ``TruthCfg`` knobs (they build ``p*`` over the - ``K`` modes via ``knowledge.truth.make_true_distribution``). The remaining fields + ``K`` modes via ``inheritance.truth.make_true_distribution``). The remaining fields define how a mode is rendered to a categorical token sequence: an *identity* segment that encodes the mode losslessly (read by the exact oracle) followed by a *style* segment of within-mode stochastic tokens (so a real generative model has a diff --git a/src/neural/evaluate.py b/src/neural/evaluate.py index d8af531..b467429 100644 --- a/src/neural/evaluate.py +++ b/src/neural/evaluate.py @@ -1,19 +1,19 @@ -"""Metrics for a neural lineage — the *same* row schema as ``knowledge.lineage``. +"""Metrics for a neural lineage — the *same* row schema as ``inheritance.lineage``. ``measure_metrics`` takes a model's oracle-measured mode distribution ``p_hat`` and emits a -row with exactly the columns Layer 1 logs per generation (``knowledge.lineage.record``), -computed with the *same* ``knowledge.metrics`` functions. Identical columns are what let a +row with exactly the columns Layer 1 logs per generation (``inheritance.lineage.record``), +computed with the *same* ``inheritance.metrics`` functions. Identical columns are what let a neural collapse curve be plotted on top of an analytic one, and let the same figure and -analysis code (``knowledge.analysis``) run unchanged. +analysis code (``inheritance.analysis``) run unchanged. """ from __future__ import annotations import numpy as np -from knowledge.config import MetricsCfg -from knowledge.lineage import N_BANDS -from knowledge.metrics import ( +from inheritance.config import MetricsCfg +from inheritance.lineage import N_BANDS +from inheritance.metrics import ( forward_kl, heterozygosity, per_region, @@ -27,7 +27,7 @@ def measure_metrics(p: np.ndarray, p_star_orig: np.ndarray, tail_mask: np.ndarra regions: np.ndarray, R: int, metrics_cfg: MetricsCfg) -> dict: """Compute every per-generation metric for a measured mode distribution. - Mirrors ``knowledge.lineage.record`` field-for-field. ``forward_kl`` and the tail set + Mirrors ``inheritance.lineage.record`` field-for-field. ``forward_kl`` and the tail set are always measured against the *original* truth, so a re-minted lineage that has lost tails is penalised exactly as in Layer 1's E6. diff --git a/src/neural/experiment.py b/src/neural/experiment.py index 542e2c9..09b9363 100644 --- a/src/neural/experiment.py +++ b/src/neural/experiment.py @@ -1,6 +1,6 @@ """Neural (Layer 1.5) experiment runner: sweep a grid x replicates, write artifacts. -Mirrors ``knowledge.experiment`` and reuses its sweep-expansion primitives +Mirrors ``inheritance.experiment`` and reuses its sweep-expansion primitives (``_apply_param`` — including the ``g -> m`` conversion — and ``_set_by_path``), its provenance helpers, and its output contract (``save_artifacts``). Only the per-run call and the config key set differ: a neural run trains generative models rather than resampling a @@ -20,8 +20,8 @@ from typing import Any import pandas as pd import yaml -from knowledge.experiment import _apply_param, save_artifacts -from knowledge.seeding import spawn_seeds +from inheritance.experiment import _apply_param, save_artifacts +from inheritance.seeding import spawn_seeds from .generation_loop import run_generative_lineage @@ -38,7 +38,7 @@ _EXTRA_LIBS = ("torch", "torchvision") def expand_sweeps(cfg: dict) -> list[tuple[dict, dict]]: """Expand the sweep grid into (label, resolved_neural_cfg) pairs. - Identical semantics to ``knowledge.experiment.expand_sweeps`` (Cartesian product of the + Identical semantics to ``inheritance.experiment.expand_sweeps`` (Cartesian product of the declared ``{param, values}`` entries, reusing ``_apply_param`` for the ``g -> m`` and ``arm`` special cases) but assembling the base from the neural config groups. @@ -129,7 +129,7 @@ def run_mnist_experiment(cfg: dict) -> tuple[pd.DataFrame, dict]: Returns: tuple[pd.DataFrame, dict]: Long-form results and the oracle-provenance manifest dict. """ - from knowledge.config import _sub + from inheritance.config import _sub from .config import MnistCfg, OracleCfg from .mnist_data import assign_modes, load_mnist, make_mnist_truth, MnistSampler diff --git a/src/neural/generation_loop.py b/src/neural/generation_loop.py index 18680b5..e046c40 100644 --- a/src/neural/generation_loop.py +++ b/src/neural/generation_loop.py @@ -1,4 +1,4 @@ -"""The neural analogue of ``knowledge.lineage.run_lineage``. +"""The neural analogue of ``inheritance.lineage.run_lineage``. Runs ``T`` generations of *train-a-model-on-the-previous-model's-samples*, the neural image of the Wright-Fisher generational step. Each generation the pupil is trained on a @@ -6,7 +6,7 @@ pool of (i) ``n`` observations drawn from the parent model (drift) and (ii) ``m` observations drawn from the grounding reference (immigration, ``g = m/(n+m)``), then its oracle-measured mode distribution is logged with the *same* metric schema Layer 1 uses. Grounding structure (proportional / uniform / matched over regions) and the re-mint gate -reuse ``knowledge.step`` and mirror ``run_lineage`` exactly, so a histogram-model lineage +reuse ``inheritance.step`` and mirror ``run_lineage`` exactly, so a histogram-model lineage reproduces the analytic core and a neural-model lineage tests whether the same signs hold in real weights. """ @@ -18,9 +18,9 @@ from typing import Any, Mapping import numpy as np import pandas as pd -from knowledge.metrics import heterozygosity -from knowledge.step import allocate_m, structured_multinomial -from knowledge.truth import uniform_init +from inheritance.metrics import heterozygosity +from inheritance.step import allocate_m, structured_multinomial +from inheritance.truth import uniform_init from .config import NeuralLineageCfg from .evaluate import measure_metrics @@ -46,7 +46,7 @@ def run_generative_lineage(cfg: Mapping[str, Any] | NeuralLineageCfg, Returns: pd.DataFrame: One row per generation 0..T with the same metric columns as - ``knowledge.lineage.run_lineage``. + ``inheritance.lineage.run_lineage``. """ cfg = NeuralLineageCfg.from_dict(cfg) syn = cfg.synthetic diff --git a/src/neural/mnist_data.py b/src/neural/mnist_data.py index 81bb359..200948c 100644 --- a/src/neural/mnist_data.py +++ b/src/neural/mnist_data.py @@ -20,7 +20,7 @@ from pathlib import Path import numpy as np -from knowledge.truth import TrueDist, make_true_distribution +from inheritance.truth import TrueDist, make_true_distribution from .config import MnistCfg diff --git a/src/neural/mnist_loop.py b/src/neural/mnist_loop.py index a8e305e..5ac8fa2 100644 --- a/src/neural/mnist_loop.py +++ b/src/neural/mnist_loop.py @@ -18,9 +18,9 @@ from typing import Any, Mapping import numpy as np import pandas as pd -from knowledge.config import MetricsCfg, _sub -from knowledge.step import allocate_m, structured_multinomial -from knowledge.truth import TrueDist, uniform_init +from inheritance.config import MetricsCfg, _sub +from inheritance.step import allocate_m, structured_multinomial +from inheritance.truth import TrueDist, uniform_init from .config import MnistCfg, ModelCfg, NeuralDynamicsCfg from .evaluate import measure_metrics @@ -54,7 +54,7 @@ def run_mnist_lineage(cfg: Mapping[str, Any], seed: int, oracle: Oracle, mcfg = _sub(cfg["mnist"], MnistCfg) model_cfg = _sub(cfg["model"], ModelCfg) dyn_raw = dict(cfg.get("dynamics", {})) - from knowledge.config import GroundingCfg, RemintCfg + from inheritance.config import GroundingCfg, RemintCfg dynamics = NeuralDynamicsCfg( n=dyn_raw.get("n", NeuralDynamicsCfg.n), grounding=_sub(dyn_raw.get("grounding", {}), GroundingCfg), diff --git a/src/neural/recombine.py b/src/neural/recombine.py index eb512ea..37b3897 100644 --- a/src/neural/recombine.py +++ b/src/neural/recombine.py @@ -1,6 +1,6 @@ """Multi-teacher recombination in real weights — the neural image of Layer-1 E4. -Layer-1 E4 (``knowledge.experiment.run_coverage``) showed the sharpest result of the study: +Layer-1 E4 (``inheritance.experiment.run_coverage``) showed the sharpest result of the study: under **mean-mixture** distillation surviving tail coverage is *flat* in the teacher count K_T (a conservation law — averaging's 1/K_T dilution cancels the union gain), while a **union-preserving max-merge** (à la M2N2) realises the benefit. This module tests whether @@ -26,9 +26,9 @@ import itertools import numpy as np import pandas as pd -from knowledge.config import _sub -from knowledge.seeding import spawn_seeds -from knowledge.teachers import make_correlated_teachers, make_retention_matrix +from inheritance.config import _sub +from inheritance.seeding import spawn_seeds +from inheritance.teachers import make_correlated_teachers, make_retention_matrix from .config import ModelCfg, SyntheticCfg from .models import make_model diff --git a/src/neural/synthetic.py b/src/neural/synthetic.py index 4833fc7..413f9b7 100644 --- a/src/neural/synthetic.py +++ b/src/neural/synthetic.py @@ -1,7 +1,7 @@ """The fully-synthetic sandbox: a known ``p*`` over modes + a lossless observation grammar. The mode-truth (``p*``, regions, tail mask) comes straight from Layer 1's -``knowledge.truth.make_true_distribution`` — so "mode", "region", and "tail" are *the same +``inheritance.truth.make_true_distribution`` — so "mode", "region", and "tail" are *the same objects* as in the analytic core. Each mode is rendered to a categorical token sequence: * an **identity** segment of ``id_len`` base-``id_base`` digits that encodes the mode @@ -19,7 +19,7 @@ from __future__ import annotations import numpy as np -from knowledge.truth import TrueDist, make_true_distribution +from inheritance.truth import TrueDist, make_true_distribution from .config import SyntheticCfg diff --git a/tasks/clarity-audit-2026-09-13.md b/tasks/clarity-audit-2026-09-13.md index 1114bbe..1d9c476 100644 --- a/tasks/clarity-audit-2026-09-13.md +++ b/tasks/clarity-audit-2026-09-13.md @@ -1,4 +1,4 @@ -# Clarity audit of paper/pnas/main.md (2026-09-13) +# Clarity audit of paper/manuscript/main.md (2026-09-13) Standard: an interpretive sentence must state the concrete formula, number or mechanism it refers to; figure citations must match what the figure plots; no herald sentences; no process ghosts. diff --git a/tasks/lessons.md b/tasks/lessons.md index 3b85c6d..854d7f3 100644 --- a/tasks/lessons.md +++ b/tasks/lessons.md @@ -92,7 +92,7 @@ E9, H1"; spell codenames out. ## 2026-09-11 — check the figure panel inventory before flagging cross-references In the manuscript review I flagged Table 1's "Fig. 4C–E" and "Fig. 3C" as inconsistent with the text. They were correct: `make_figs.py` puts the E11 ablation in Fig. 4's bottom row and the predictive grid in Fig. 3C–D; the text -simply failed to cite them. Rule: before calling a cross-reference wrong, read `paper/pnas/make_figs.py` and the +simply failed to cite them. Rule: before calling a cross-reference wrong, read `paper/manuscript/make_figs.py` and the captions in `build.py` for the panel inventory; the fix is usually a missing citation in the text, not a wrong table. ## 2026-09-11 — never type a result number that a script has not printed @@ -103,7 +103,7 @@ print it first. This is the same rule the plan stated ("copied from the stats-sc typed") and I broke it within the hour. ## Reference numbers hardcoded outside the renumber path (2026-09-11) -`renumber_refs.py` rewrites main.md, si.md and build.py captions, but `make_figs.py` carries a literal "(refs. N, M)" in the fig1a grounding cell, which went stale after references were added. Rule: after any renumber, grep `refs\.` and `ref\.` across `paper/pnas/*.py` and fix by hand (or extend renumber_refs.py to cover make_figs.py). Also: fig text is rendered, so verify by `pdftotext figs/fig1a.pdf`, not by grepping the source alone. +`renumber_refs.py` rewrites main.md, si.md and build.py captions, but `make_figs.py` carries a literal "(refs. N, M)" in the fig1a grounding cell, which went stale after references were added. Rule: after any renumber, grep `refs\.` and `ref\.` across `paper/manuscript/*.py` and fix by hand (or extend renumber_refs.py to cover make_figs.py). Also: fig text is rendered, so verify by `pdftotext figs/fig1a.pdf`, not by grepping the source alone. ## 2026-09-12 — GG's manuscript comments: heralds, undefined terms, and phantom SI references Forty-five comments on the ODT. Three patterns. (1) **Herald sentences** ("Two boundaries follow.", diff --git a/tasks/todo.md b/tasks/todo.md index ebaf5f7..7c7c140 100644 --- a/tasks/todo.md +++ b/tasks/todo.md @@ -28,7 +28,7 @@ These are the only places the spec is genuinely underdetermined. Recommendation - [x] Install `uv` (`curl -LsSf https://astral.sh/uv/install.sh | sh`; lands in `~/.local/bin`, no sudo). - [x] **Reproducibility path = `uv` venv from a committed, hash-pinned `uv.lock`** (GG decision, 2026-07-04; no Apptainer/Docker for Layer 1). `pyproject.toml` (Python ≥3.11; deps: numpy, scipy, pandas, pyarrow, matplotlib, pydantic, pyyaml; dev: pytest). Commit `uv.lock`. Create `.venv` via `uv sync`. -- [x] Repo layout per §5: `src/knowledge/`, `configs/layer1/`, `figures/`, `results/` (gitignored), `tests/`, `paper/`. Add `src/lamarckian/` package root or make `knowledge` importable (decide package name — recommend `src/lamarckian/knowledge/...` with `src`-layout). +- [x] Repo layout per §5: `src/inheritance/`, `configs/inheritance/`, `figures/`, `results/` (gitignored), `tests/`, `paper/`. Add `src/lamarckian/` package root or make `knowledge` importable (decide package name — recommend `src/lamarckian/knowledge/...` with `src`-layout). - [x] `.gitignore` (`.venv/`, `results/`, `__pycache__/`, `*.parquet` under results but keep hashes). - [x] Seeding util `lamarckian/utils/seeding.py`: master seed → `np.random.SeedSequence(seed).spawn(n)` → per-replicate `np.random.default_rng(child)`. No global RNG anywhere. - [x] Config loader `lamarckian/config.py`: pydantic schema mirroring the §2.7 YAML, a `load_config(path)`, a `expand_sweeps(cfg) -> list[ResolvedConfig]`, and `write_resolved(cfg, dir)`. @@ -58,22 +58,22 @@ Implement to the normative signatures in §2.7. Order chosen so each piece is un - [x] `knowledge/experiment.py::run_experiment(cfg)` — sweep grid × `n_replicates`; long-form results + CIs; write `results.parquet` + `resolved_config.yaml` + `manifest.json`. - [x] **E1** config + run: `m=0`, single teacher, no selection. Expect `H` geometric decay, support→1, KL diverges, tail-first loss. - [x] **E2** config + run: sweep `g`, single teacher, uniform grounding, no selection. Locate critical `g*` (transition in **tail mass / support**, since H is smooth in m — the sharp threshold is in discrete tail survival). Report `g*` with CI. **This is the load-bearing result.** -- [x] `figures/plot_E1.py`, `plot_E2.py` — read `results.parquet` only. +- [x] `figures/plot_collapse_null.py`, `plot_fig2_grounding_sweep.py` — read `results.parquet` only. ## Phase 3 — E3–E6 -- [x] **E3 region-matched grounding.** Fixed total `m`; `uniform` vs `matched`; one designated inherited-but-unwatered region with a rare tail. Expect uniform lets that region's tail collapse; matched holds it. Per-region metrics essential. `plot_E3.py`. +- [x] **E3 region-matched grounding.** Fixed total `m`; `uniform` vs `matched`; one designated inherited-but-unwatered region with a rare tail. Expect uniform lets that region's tail collapse; matched holds it. Per-region metrics essential. `plot_figS5_aimed_grounding.py`. - [x] **§2.7.1 correlated-teacher construction** — `knowledge/teachers.py`: - `make_retention_matrix(T, K_T, rho, q, rng)` — shared-switch exchangeable Bernoulli. - `make_correlated_teachers(...)` — retention→distributions (head kept at `p*`; tail at `p*_i` if retained else `tail_floor`; renormalise). `region_specialisation` option. - **Pred. 5** validation: `make_retention_matrix` reproduces marginal `q`, pairwise `ρ`, and union coverage `U(K_T,ρ,q)=T[ρq+(1−ρ)(1−(1−q)^K_T)]` to 3 decimals over a `(ρ,q)` grid. -- [x] **E4 multi-teacher decorrelation.** Sweep `K_T∈{1,2,3,5}`, `ρ∈[0,1]` at fixed `q`, matched budget (`n/K_T` each). Report **both** union `U` and post-distillation surviving coverage; show their gap shrinks as `g` rises. `plot_E4.py` (coverage surface over `(K_T,ρ)`). -- [x] **E5 QD vs greedy.** `apply_selection` (`none`/`greedy`/`qd`, pinned fitness form). Sweep novelty `α`. Expect greedy→fixation (`H→0`), qd holds `H` plateau + re-introduces tails. `plot_E5.py`. -- [x] **E6 re-mint gate.** Re-mint at high vs low `H`; track KL to *original* truth. Expect collapsed re-mint locks KL high forever; gated (high-H) does not. `plot_E6.py`. +- [x] **E4 multi-teacher decorrelation.** Sweep `K_T∈{1,2,3,5}`, `ρ∈[0,1]` at fixed `q`, matched budget (`n/K_T` each). Report **both** union `U` and post-distillation surviving coverage; show their gap shrinks as `g` rises. `plot_figS8_multiparent_union.py` (coverage surface over `(K_T,ρ)`). +- [x] **E5 QD vs greedy.** `apply_selection` (`none`/`greedy`/`qd`, pinned fitness form). Sweep novelty `α`. Expect greedy→fixation (`H→0`), qd holds `H` plateau + re-introduces tails. `plot_figS12_quality_diversity.py`. +- [x] **E6 re-mint gate.** Re-mint at high vs low `H`; track KL to *original* truth. Expect collapsed re-mint locks KL high forever; gated (high-H) does not. `plot_figS3_rebaselining.py`. ## Phase 4 — Reproducibility polish (Layer 1 slice) -- [x] `configs/layer1/E1..E6.yaml` all committed with explicit params (no magic numbers in code). +- [x] `configs/inheritance/E1..E6.yaml` all committed with explicit params (no magic numbers in code). - [x] `paper/figure_manifest.md` — the §6 claim→experiment→figure rows for Layer 1. - [x] `make layer1` runs E1–E6; `make figures` regenerates all figures from committed parquet. - [x] Full `test_correctness.py` (shapes, normalisation, determinism) + `test_scientific_validation.py` (Pred. 1–5) green in CI. @@ -97,7 +97,7 @@ Every Layer-1 row of blueprint §6 has a committed figure produced by `make figu **2026-07-04 — Phases 0 & 1 complete; hard gate PASSED.** -- Reorg: docs → `paper/` (`blueprint.md`, `the-lamarckian-society-v4.md`). src-layout under `src/knowledge/`. +- Reorg: docs → `paper/` (`blueprint.md`, `the-lamarckian-society-v4.md`). src-layout under `src/inheritance/`. - A pre-existing `tests/test_scientific_validation.py` (author-supplied, 22 KB) turned out to hard-specify the package contract — implemented *to it* rather than inventing interfaces. Key contracts it locked (now honoured): package imports as `knowledge.*`; `run_lineage(cfg_dict, seed)` returns a tidy per-gen frame with a `heterozygosity` column, rows 0..T; `p_0` initialises **uniform** (`H_0=1−1/K`); `metrics.heterozygosity` and `teachers.make_retention_matrix` match the reference to 1e-12 / closed form. - Env: `uv` 0.11.26 installed; `pyproject.toml` + `uv.lock` committed; numpy 2.5, pandas 3.0, scipy 1.18, pydantic 2.13, pytest 9.1. - Modules written: `metrics`, `seeding`, `config` (dataclasses + `from_dict`), `truth`, `teachers`, `step`, `lineage`. Config is dataclass-based (not pydantic) — the conformance test passes a raw dict; dataclasses validate cleanly and stay stdlib-simple. **Pydantic still a dep for the Phase-2 YAML/experiment layer.** @@ -107,9 +107,9 @@ Design decisions #1 (dataclasses now / pydantic at YAML layer), #2 (fitness `f_i **2026-07-04 — Phase 2 complete (E1 + E2).** -- `experiment.py`: sweep expansion (Cartesian grid; special-cases `g→m`), paired replicate seeds (shared across grid points), output contract (`results.parquet` + `resolved_config.yaml` + `manifest.json` with lib versions + git commit + sha256). CLI `python -m knowledge.experiment `. -- **E1 (null collapse)** — reproduces tail-first collapse: H geometric decay matches `H₀(1−1/n)ᵗ` within CI; tail items die ~10× faster than head items; support 500→1; forward-KL diverges. Figure `results/E1/E1.png`. -- **E2 (headline)** — `H_sim` tracks the *exact* `H_eq` closed form across the sweep; phase boundary at **`g* ≪ 1`**: g=0.005 (m=1 real sample vs n=200) → 68% of truth H; g=0.05 → 96%. g=0 slides to ~0.10 over 500 gens. Figure `results/E2/E2.png`. **Headline result achieved.** +- `experiment.py`: sweep expansion (Cartesian grid; special-cases `g→m`), paired replicate seeds (shared across grid points), output contract (`results.parquet` + `resolved_config.yaml` + `manifest.json` with lib versions + git commit + sha256). CLI `python -m inheritance.experiment `. +- **E1 (null collapse)** — reproduces tail-first collapse: H geometric decay matches `H₀(1−1/n)ᵗ` within CI; tail items die ~10× faster than head items; support 500→1; forward-KL diverges. Figure `results/collapse_null/E1.png`. +- **E2 (headline)** — `H_sim` tracks the *exact* `H_eq` closed form across the sweep; phase boundary at **`g* ≪ 1`**: g=0.005 (m=1 real sample vs n=200) → 68% of truth H; g=0.05 → 96%. g=0 slides to ~0.10 over 500 gens. Figure `results/fig2_grounding_sweep/E2.png`. **Headline result achieved.** - Metric subtlety found & fixed: aggregate **`tail_mass` is a drift martingale** (mean-conserved), so it's a poor collapse indicator. Added `tail_support`/`head_support`/`tail_frac_alive`/`head_frac_alive`; E1 & E2 figures now use tail-*item* survival, which is honest and monotone. - E2 extended 300→500 generations (GG-approved) so the g=0 arm visibly approaches 0 while g>0 arms sit on plateaus. - Makefile `layer1`/`figures` wired to E1–E2. `make test` still green (68). @@ -140,17 +140,17 @@ C3 vertical claim deferred.* - **Env:** installed `uv` 0.11.26 (`~/.local/bin`); `/home` was 100% full — GG approved clearing pip/yay/browser caches (~10 GB freed). Base venv synced; 71 Layer-1 tests green. - **Stage A (scaffold, pure NumPy):** `src/neural/` — `config.py` (frozen dataclasses reusing - `knowledge.config` GroundingCfg/RemintCfg/MetricsCfg/_sub), `synthetic.py` (mode-truth via + `inheritance.config` GroundingCfg/RemintCfg/MetricsCfg/_sub), `synthetic.py` (mode-truth via `make_true_distribution`; lossless identity + stochastic style token grammar), `oracle.py` (`ExactOracle` zero-error + `measure_distribution`), `models.py` (`GenerativeModel` protocol + - `HistogramModel` bridge), `evaluate.py` (reuses `knowledge.metrics`, Layer-1 row schema), + `HistogramModel` bridge), `evaluate.py` (reuses `inheritance.metrics`, Layer-1 row schema), `generation_loop.py` (`run_generative_lineage`, reuses `allocate_m`/`structured_multinomial`). 15 correctness tests green. - **Stage B — HARD GATE PASSED:** `tests/test_neural_validation.py` — histogram lineage reproduces Pred. 1 (neutral decay, <3% rel err), Pred. 3 (exact `H_eq`, <5%), and tracks Layer-1 `run_lineage` directly (<3%). The neural plumbing reproduces the analytic core. - **Plumbing:** `neural/experiment.py` (`run_and_save` dispatch on `kind`, reuses `_apply_param` - g→m, paired seeds); extended `knowledge.experiment.save_artifacts` (optional `extra_libs`, + g→m, paired seeds); extended `inheritance.experiment.save_artifacts` (optional `extra_libs`, `extra_manifest`, injectable `grid`; skips missing libs — backward compatible). `configs/neural/bridge.yaml`, Makefile `neural`/`env-neural`/`layer2` targets, `.gitignore`. (Experiments are named descriptively — `bridge`, `collapse`, `grounding`, `architectures` — not by code.) @@ -216,7 +216,7 @@ C3 vertical claim deferred.* those are the wrong metrics for a smoothing model, not because grounding fails. Reported as such. - **Robustness fix:** a fully-degenerate RNN can emit only invalid codewords → `measure_distribution` now returns a terminal-collapse sentinel (fixation on the dominant mode) instead of crashing a long - sweep. Edge-case test added. `figures/plot_grounding.py` written (4-panel, states its own verdict), + sweep. Edge-case test added. `figures/plot_figS6_grounding_rnn.py` written (4-panel, states its own verdict), wired into `make figures` (glob all `plot_*.py` except `plot_E[1-6]`). **2026-07-05 — neural figures (all five).** @@ -236,8 +236,8 @@ C3 vertical claim deferred.* reused verbatim): `mnist_data.py` (load, per-class thickness bins, mode = class×thickness bijection, `MnistSampler`), `mnist_oracle.py` (frozen CNN + deterministic thickness = `ClassifierOracle`, confusion matrix), `mnist_vae.py` (`ConvVAEGenerator`), `mnist_loop.py` (`run_mnist_lineage`), plus - `kind=mnist_lineage` dispatch in `experiment.py`, `configs/neural/mnist_collapse.yaml`, - `figures/plot_mnist.py`, `figures/mnist_montage.py` (eyeball diagnostic), `MnistCfg`/`OracleCfg`. + `kind=mnist_lineage` dispatch in `experiment.py`, `configs/neural/fig2_mnist_collapse.yaml`, + `figures/plot_fig2_mnist_collapse.py`, `figures/mnist_montage.py` (eyeball diagnostic), `MnistCfg`/`OracleCfg`. - **Gates:** CNN mode accuracy **98.5%** (30×30 confusion matrix in the manifest = noise floor); VAE gen-0 recovers full 30/30 support (over-smooths freq, KL≈0.5, no prior hole). - **Result (4 reps):** dry (g=0) VAE **collapses to a single mode** (KL 0.5→18, support 30→1, tail @@ -255,7 +255,7 @@ C3 vertical claim deferred.* neutral is inert, sharpening `τ=0.8` reproduces the collapse-to-one-mode. RNN regime (n=200,K=256): neutral → H=0, mutation `u=0.006` reproduces the H-floor (~0.68). Uniform-mutation overshoots the RNN's KL → its prior is truth-like, not uniform (honest caveat, future refinement). -- `configs/layer1/kernel_{sharpen,smooth}.yaml`, `figures/plot_kernel.py` (overlays analytic arms vs +- `configs/inheritance/kernel_{sharpen,smooth}.yaml`, `figures/plot_kernel.py` (overlays analytic arms vs the committed neural endpoints), READMEs, `tests/test_kernel.py` (+6). Wired into `make layer1`. - **Strategic (see CLAUDE.md finding):** concede "collapse=drift" to Riis (prior art; cite); his mixed environment retains OLD SYNTHETIC (no real-data injection) → pessimistic, no g* that prevents @@ -272,8 +272,8 @@ C3 vertical claim deferred.* per-locus marginals). Reuses all K-mode machinery + `make_retention_matrix` (locus mastery). - **E8 (star, `kind: society`, `knowledge/society.py`) — the vertical claim:** decorrelated parents recombined; **sexual merge reaches the optimum (12/12, a genotype no parent had)** as parent count - grows / `ρ→0`, while best-parent (~8.7) and mean-mixture soup (~11.6) plateau. `configs/layer1/E8.yaml`, - `plot_E8.py`, README. The Fisher–Muller effect for AI. + grows / `ρ→0`, while best-parent (~8.7) and mean-mixture soup (~11.6) plateau. `configs/inheritance/figS9_specialist_superparent.yaml`, + `plot_figS9_specialist_superparent.py`, README. The Fisher–Muller effect for AI. - **E7 (`kind: genotype_lineage`, `knowledge/genotype_lineage.py`) — advantage of sex:** sexual lineage adapts faster than asexual (LD→0 vs LD spike). Honest: a speed advantage, not a permanent ratchet gap. - **Metaphor shift (GG):** sexual reproduction with **unbounded parents**, not teacher→pupil (which caps @@ -293,7 +293,7 @@ C3 vertical claim deferred.* (0.66→0.51); **directed sex** (choose mates + select offspring + unbounded parents, iterated) tracks/ exceeds the best parent at every ruggedness. The distinctly-AI superpower, no biological analog. - Complete picture: dramatic super-parent offspring when complementary (E8); outbreeding-depression - risk when entangled (E9); directed sex resolves it (E10). `configs/layer1/{E9,E10}.yaml`, + risk when entangled (E9); directed sex resolves it (E10). `configs/inheritance/{E9,E10}.yaml`, `plot_{E9,E10}.py`, READMEs, +5 tests (117 green). **2026-07-05 — the dynamic Lamarckian society (E11): the vertical claim / C3 realized.** @@ -306,7 +306,7 @@ C3 vertical claim deferred.* diversity maintained longest); no_sex 0.77; no_diversity/greedy 0.74; **no_grounding 0.48 (self-consumption collapse to unfit consensus).** Only the full society climbs. Integrates E1-E6 + kernel + E7-E10 into one system: needs ALL of grounding + directed sex + diversity. -- `configs/layer1/E11.yaml`, `plot_E11.py`, README, `tests/test_dynamic_society.py` (+5, 122 green). +- `configs/inheritance/fig4_society_ablation.yaml`, `plot_fig4_society_ablation.py`, README, `tests/test_dynamic_society.py` (+5, 122 green). Closes C3 analytically; the LLM rung remains the eventual empirical instantiation. ## Remaining (all optional / next) @@ -532,7 +532,7 @@ writing standard is paramount: every term defined at first use with an example f - [x] si.md: S3 text, Table S1/S2 rows, M2/M5/M6 additions, SI figures list; fixed two stale SI citation numbers (41→44, 43→46 pre-renumbering) and one leftover "honest" - [x] References: +8 (73–80 appended, then renumbered to first-appearance order by - `paper/pnas/renumber_refs.py`; 80 refs, 0 orphans, recheck = 0 renumbered) + `paper/manuscript/renumber_refs.py`; 80 refs, 0 orphans, recheck = 0 renumbered) - [x] Verification: fig6 rendered+inspected twice (legend fix); PDFs build (main 24 pp, SI 11 pp; no unresolved FIG markers); gap/meta-language grep clean; two-reader pass (added "verifier", "frozen", validation glosses); `make test` 196 passed @@ -555,7 +555,7 @@ writing standard is paramount: every term defined at first use with an example f via doi.org content negotiation: 77 from DOI (53 printed in the manuscript, 22 found by title-matched Crossref search, 2 hand-verified — Brinkmann *Machine culture*, Schwarz *Progress & Compress*), 3 hand-written because they predate DOIs (Jenkin 1867, Fisher 1930, Templeton 1986). - Artifacts in `paper/pnas/refs/`; generator `paper/pnas/build_zotero_library.py`. + Artifacts in `paper/manuscript/refs/`; generator `paper/manuscript/build_zotero_library.py`. **Not yet in Zotero** — the app is closed and its library lives in ownCloud; direct writes to `zotero.sqlite` are unsafe, so import is one step in the Zotero UI (see refs/README.md). - [ ] Optional: sync long-form `paper/the-evolution-of-sex-for-ai.md` L797 ("LLM society is unbuilt") @@ -587,7 +587,7 @@ the inverse of his rhythm. That is the measurable cause of "too cryptic". ## Manuscript review pass (2026-09-11) -Review of `paper/pnas/main.md` (novelty, accessibility, calibration, cheap experiments); corrections applied: +Review of `paper/manuscript/main.md` (novelty, accessibility, calibration, cheap experiments); corrections applied: - [x] Abstract rewritten (one idea per sentence, jargon removed, 250 words); own-ancestor result added, mating-breadth hypothesis dropped - [x] Own-ancestor (seed-bank) merge given its own paragraph, Table 1 row, and design rule - [x] Emergent null (merge rescues forgetting specialists) and the overlap control (delta-cosine +0.60 → +0.03) promoted from asides to findings @@ -615,19 +615,19 @@ Review of `paper/pnas/main.md` (novelty, accessibility, calibration, cheap exper - Discovered: the venv carried paths from before the repo moved into `LLMs/` (stale shebangs; `uv run pytest` could not spawn). `pytest` re-installed; other console scripts still stale — `uv sync --all-extras --reinstall` would fix all. Hardening candidate: specialist cache key lacks the base model (fails loudly, not silently). ## Venue + novelty audit (2026-09-11) -Target: Nature Machine Intelligence first; PLOS Comput Biol as the venue reaching both ML and pop-gen readers. All PNAS wording removed from `paper/pnas/` sources (SI Appendix → Supplementary Information; build/tex comments). Directory name `paper/pnas/` kept (Makefile/REPRODUCING paths); Significance statement kept pending GG decision. +Target: Nature Machine Intelligence first; PLOS Comput Biol as the venue reaching both ML and pop-gen readers. All PNAS wording removed from `paper/manuscript/` sources (SI Appendix → Supplementary Information; build/tex comments). Directory name `paper/manuscript/` kept (Makefile/REPRODUCING paths); Significance statement kept pending GG decision. Literature audit (three WebSearch sweeps) found claims that need rewording/citations before submission: - [x] "Every merging study merges once" is false → narrow to "no study combines per-generation skill acquisition with repeated, optional merging across lineages". Cite iterated-merging work: model kinship 2410.12613 (stagnation by gen 2, inbreeding analogy), GENOME 2503.01155, M2N2, TIME 2412.06712, MagMax, ACMap 2412.18219 (early-stop precedent), K-Merge 2510.13537 (similarity-gated merge), SFA/"Soup to go" 2501.05559 + IMM 2503.02103 (ancestor-averaging precedent) - [x] Predictor section: "functional > weight geometry" is already shown by Cao 2603.09463 (must-cite), Zhu 2608.09490, Zhou 2601.22285 (gradient > cosine). Reframe novelty as held-out predictive design + the overlap control (cosine = shared-data artefact; not found anywhere) - [x] Speciation: credit permutation+rescaling decomposition to Git Re-Basin + REPAIR 2211.08403; cite ZipIt 2305.03053, Sharma non-local 2410.12766 for residual barriers; Git Re-Basin §5.4 already merges complementary-class parents. Keep as new: conflicting-label manipulation, three-arm contrast, emergent null (against Pari 2411.02207 / Horoi / Kozodoi) - [x] Grounding: must cite Alemohammad 2307.01850 (fresh-data loop fixed point), Bertrand 2310.00429 (stability theorem in real fraction), Dohmatob 2402.07043 + 2410.04840 (counter-claim: any synthetic fraction caps performance — reconcile with H_eq float: # ===================================================================================== # # This is the smallest correct implementation of the core Layer-1 dynamics. It exists -# so the spine tests can run before src/knowledge/ is written, and so the exact +# so the spine tests can run before src/inheritance/ is written, and so the exact # semantics the package must reproduce are unambiguous. The package will do far more # (config, logging, regions, selection, re-minting, per-region metrics); it must agree # with THIS on the analytic-check subset. @@ -388,8 +388,8 @@ class TestMetricSanity: # from the minimal one built here, adapt the *construction* of cfg, never the tolerance. try: - import knowledge.metrics as knowledge_metrics - import knowledge.teachers as knowledge_teachers + import inheritance.metrics as knowledge_metrics + import inheritance.teachers as knowledge_teachers HAVE_KNOWLEDGE = True except Exception: # package not built yet -> conformance layer skips, spine still runs knowledge_metrics = knowledge_teachers = None @@ -440,7 +440,7 @@ class TestPackageDynamicsConform: def _run_lineage(self, cfg_overrides, seed): lineage = pytest.importorskip( - "knowledge.lineage", reason="Layer-1 package not implemented yet") + "inheritance.lineage", reason="Layer-1 package not implemented yet") base = { "truth": {"K": 50, "R": 1, "tail": "zipf", "zipf_s": 1.1, "tail_frac": 0.5, "tail_threshold": 1e-3}, diff --git a/tests/test_speciation.py b/tests/test_speciation.py index 702f154..bfd77be 100644 --- a/tests/test_speciation.py +++ b/tests/test_speciation.py @@ -5,7 +5,7 @@ from __future__ import annotations import numpy as np import pytest -from knowledge.speciation import _bdm_point, _nk_point, run_speciation +from inheritance.speciation import _bdm_point, _nk_point, run_speciation def test_bdm_parents_carry_no_incompatibility():