Rename neural experiments to descriptive paths (drop N* codes)

configs/neural/{N0,N1,N2,N5}.yaml -> {bridge,collapse,grounding,architectures}.yaml,
results dirs likewise. Updated experiment/output.dir fields, comments/docstrings, and
docs; regenerated the four result manifests (now carrying the real git commit). No
functional path resolution referenced the codes (the Makefile globs configs/neural/*.yaml
and tests use inline configs), so nothing breaks. 92 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Giorgio Gilestro 2026-07-04 21:21:56 +01:00
parent 840b6b00b3
commit aca7b394a3
21 changed files with 82 additions and 78 deletions

View file

@ -13,10 +13,12 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
models* (histogram bridge + RNN + MLP; VAE implemented but not fidelity-passing) on a models* (histogram bridge + RNN + MLP; VAE implemented but not fidelity-passing) on a
fully-synthetic sandbox with an exact oracle, plus real MNIST as a later secondary tier. See fully-synthetic sandbox with an exact oracle, plus real MNIST as a later secondary tier. See
`tasks/todo.md` for status and `~/.claude/plans/we-are-going-to-cheerful-fog.md` for the plan. `tasks/todo.md` for status and `~/.claude/plans/we-are-going-to-cheerful-fog.md` for the plan.
**Done:** scaffold, the histogram bridge gate (reproduces Layer 1 exactly), N0 (bridge, neural **Done:** scaffold, the histogram bridge gate (reproduces Layer 1 exactly), `bridge` (neural
g*=0.047 ≈ Layer 1), N1 (collapse in RNN weights), N2 (neural phase boundary), N5 g*=0.047 ≈ Layer 1), `collapse` (in RNN weights), `grounding` (neural phase boundary),
(architecture-generality). **Remaining:** N4 (mean-vs-max-merge, load-bearing), N3, N6, figures, `architectures` (architecture-generality). **Remaining:** `recombination` (mean-vs-max-merge,
the MNIST tier. The LLM/LoRA rung and the C3 vertical claim are deferred. load-bearing), `region_matched`, `remint`, figures, the MNIST tier. The LLM/LoRA rung and the C3
vertical claim are deferred. Experiments are named descriptively (`configs/neural/<name>.yaml`),
not by code.
The two design documents are the source of truth for intent: The two design documents are the source of truth for intent:

View file

@ -1,9 +1,9 @@
experiment: N5_architecture_generality experiment: architecture_generality
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
# N5 (a new Layer-1.5 axis, no Layer-1 counterpart): is collapse ARCHITECTURE-GENERAL? # (a new Layer-1.5 axis, no Layer-1 counterpart): is collapse ARCHITECTURE-GENERAL?
# Run the same dry-vs-grounded protocol across three genuinely different learners that # Run the same dry-vs-grounded protocol across three genuinely different learners that
# share only the generative-collapse operator: the exact histogram (= Wright-Fisher, the # share only the generative-collapse operator: the exact histogram (= Wright-Fisher, the
# analytic anchor), an autoregressive GRU (recurrent), and an autoregressive MLP (feed- # analytic anchor), an autoregressive GRU (recurrent), and an autoregressive MLP (feed-
@ -51,4 +51,4 @@ sweep:
values: [0.0, 0.05] values: [0.0, 0.05]
output: output:
dir: results/N5 dir: results/architectures

View file

@ -1,4 +1,4 @@
experiment: N0_bridge_histogram experiment: bridge_histogram
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 60 n_replicates: 60
@ -39,4 +39,4 @@ sweep:
values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4] values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.4]
output: output:
dir: results/N0 dir: results/bridge

View file

@ -1,9 +1,9 @@
experiment: N1_collapse_in_weights experiment: collapse_in_weights
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
# N1 (Layer 1.5, maps to Layer-1 E1 / blueprint C1): does model collapse appear in REAL # (maps to Layer-1 E1 / blueprint C1): does model collapse appear in REAL
# trained weights under dry recursive self-training, and does a little grounding arrest it? # trained weights under dry recursive self-training, and does a little grounding arrest it?
# An autoregressive RNN is retrained each generation on n samples drawn from the previous # An autoregressive RNN is retrained each generation on n samples drawn from the previous
# generation's RNN (drift), optionally mixed with m verifier-grounded samples. Expect: the # generation's RNN (drift), optionally mixed with m verifier-grounded samples. Expect: the
@ -47,4 +47,4 @@ sweep:
values: [0.0, 0.02, 0.05, 0.1] values: [0.0, 0.02, 0.05, 0.1]
output: output:
dir: results/N1 dir: results/collapse

View file

@ -1,9 +1,9 @@
experiment: N2_grounding_phase_boundary_neural experiment: grounding_phase_boundary
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
# N2 (Layer 1.5 headline, maps to Layer-1 E2): the grounding phase boundary in REAL weights. # (Layer 1.5 headline, maps to Layer-1 E2): the grounding phase boundary in REAL weights.
# Sweep the grounding fraction g = m/(n+m) and locate the neural critical g* at which # Sweep the grounding fraction g = m/(n+m) and locate the neural critical g* at which
# stationary diversity is restored. Layer 1 found g* = 0.048 << 1. The neural regime (finite # stationary diversity is restored. Layer 1 found g* = 0.048 << 1. The neural regime (finite
# model capacity, a smaller K so gen-0 fidelity holds) will not reproduce that value exactly # model capacity, a smaller K so gen-0 fidelity holds) will not reproduce that value exactly
@ -47,4 +47,4 @@ sweep:
values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2] values: [0.0, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2]
output: output:
dir: results/N2 dir: results/grounding

View file

@ -1,16 +0,0 @@
{
"experiment": "N0_bridge_histogram",
"master_seed": 20260704,
"git_commit": null,
"python": "3.14.5",
"libraries": {
"numpy": "2.5.0",
"scipy": "1.18.0",
"pandas": "3.0.3",
"pyarrow": "24.0.0"
},
"rows": 96480,
"results_sha256": "445fd5165fc69edbca87f79c0cf669b5879025637f4d36ddc769e940fb02f114",
"layer": "1.5",
"model_kind": "histogram"
}

View file

@ -1,7 +1,7 @@
{ {
"experiment": "N5_architecture_generality", "experiment": "architecture_generality",
"master_seed": 20260704, "master_seed": 20260704,
"git_commit": null, "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5",
"python": "3.14.5", "python": "3.14.5",
"libraries": { "libraries": {
"numpy": "2.5.0", "numpy": "2.5.0",
@ -11,7 +11,7 @@
"torch": "2.12.1" "torch": "2.12.1"
}, },
"rows": 690, "rows": 690,
"results_sha256": "4e8d7931e791493aa35ea7b114d81b90a3a58eabd92d8b1dbd87cf0a9e200ba1", "results_sha256": "8f44a15e66c638fc0c717dab9b9d3feedad1cb4cee1890159a325f884677b32e",
"layer": "1.5", "layer": "1.5",
"model_kind": "rnn" "model_kind": "rnn"
} }

View file

@ -1,8 +1,8 @@
experiment: N5_architecture_generality experiment: architecture_generality
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
source_config: source_config:
experiment: N5_architecture_generality experiment: architecture_generality
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
@ -49,7 +49,7 @@ source_config:
- 0.0 - 0.0
- 0.05 - 0.05
output: output:
dir: results/N5 dir: results/architectures
grid: grid:
- label: - label:
kind: histogram kind: histogram

View file

@ -0,0 +1,17 @@
{
"experiment": "bridge_histogram",
"master_seed": 20260704,
"git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5",
"python": "3.14.5",
"libraries": {
"numpy": "2.5.0",
"scipy": "1.18.0",
"pandas": "3.0.3",
"pyarrow": "24.0.0",
"torch": "2.12.1"
},
"rows": 96480,
"results_sha256": "c4e96e1e0ff01b103624a2ca6ac7508d4482df79224336f6a76debab3f93428c",
"layer": "1.5",
"model_kind": "histogram"
}

View file

@ -1,8 +1,8 @@
experiment: N0_bridge_histogram experiment: bridge_histogram
seed: 20260704 seed: 20260704
n_replicates: 60 n_replicates: 60
source_config: source_config:
experiment: N0_bridge_histogram experiment: bridge_histogram
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 60 n_replicates: 60
@ -44,7 +44,7 @@ source_config:
- 0.2 - 0.2
- 0.4 - 0.4
output: output:
dir: results/N0 dir: results/bridge
grid: grid:
- label: - label:
g: 0.0 g: 0.0

View file

@ -1,7 +1,7 @@
{ {
"experiment": "N1_collapse_in_weights", "experiment": "collapse_in_weights",
"master_seed": 20260704, "master_seed": 20260704,
"git_commit": null, "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5",
"python": "3.14.5", "python": "3.14.5",
"libraries": { "libraries": {
"numpy": "2.5.0", "numpy": "2.5.0",
@ -11,7 +11,7 @@
"torch": "2.12.1" "torch": "2.12.1"
}, },
"rows": 520, "rows": 520,
"results_sha256": "27438db70af3240524855e59c4a14d3fb63bf6fca2d2002cdcb1ac354559909b", "results_sha256": "4f3642005e383b07826c3f36c888485005d710f15fb2773a6295d672f6c9af4d",
"layer": "1.5", "layer": "1.5",
"model_kind": "rnn" "model_kind": "rnn"
} }

View file

@ -1,8 +1,8 @@
experiment: N1_collapse_in_weights experiment: collapse_in_weights
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
source_config: source_config:
experiment: N1_collapse_in_weights experiment: collapse_in_weights
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
@ -46,7 +46,7 @@ source_config:
- 0.05 - 0.05
- 0.1 - 0.1
output: output:
dir: results/N1 dir: results/collapse
grid: grid:
- label: - label:
g: 0.0 g: 0.0

View file

@ -1,7 +1,7 @@
{ {
"experiment": "N2_grounding_phase_boundary_neural", "experiment": "grounding_phase_boundary",
"master_seed": 20260704, "master_seed": 20260704,
"git_commit": null, "git_commit": "840b6b00b35ea3f69ef7e0f531914986f88d74a5",
"python": "3.14.5", "python": "3.14.5",
"libraries": { "libraries": {
"numpy": "2.5.0", "numpy": "2.5.0",
@ -11,7 +11,7 @@
"torch": "2.12.1" "torch": "2.12.1"
}, },
"rows": 1085, "rows": 1085,
"results_sha256": "93590677221955189814ccf044b9dc8aee36b026e350c9dea7e8d23b137e514b", "results_sha256": "ca87a339c207adb50953df0f81297fed24d24d98b71e2911709f9708b00ede2d",
"layer": "1.5", "layer": "1.5",
"model_kind": "rnn" "model_kind": "rnn"
} }

View file

@ -1,8 +1,8 @@
experiment: N2_grounding_phase_boundary_neural experiment: grounding_phase_boundary
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
source_config: source_config:
experiment: N2_grounding_phase_boundary_neural experiment: grounding_phase_boundary
kind: gen_lineage kind: gen_lineage
seed: 20260704 seed: 20260704
n_replicates: 5 n_replicates: 5
@ -49,7 +49,7 @@ source_config:
- 0.1 - 0.1
- 0.2 - 0.2
output: output:
dir: results/N2 dir: results/grounding
grid: grid:
- label: - label:
g: 0.0 g: 0.0

View file

@ -6,7 +6,7 @@ provenance helpers, and its output contract (``save_artifacts``). Only the per-r
the config key set differ: a neural run trains generative models rather than resampling a the config key set differ: a neural run trains generative models rather than resampling a
frequency vector, and its config groups are ``synthetic``/``model``/``dynamics``/... . frequency vector, and its config groups are ``synthetic``/``model``/``dynamics``/... .
CLI: python -m neural.experiment configs/neural/N0.yaml CLI: python -m neural.experiment configs/neural/bridge.yaml
""" """
from __future__ import annotations from __future__ import annotations
@ -98,7 +98,7 @@ def run_and_save(config_path: str | Path) -> Path:
out_dir = Path(cfg.get("output", {}).get("dir", f"results/{cfg['experiment']}")) out_dir = Path(cfg.get("output", {}).get("dir", f"results/{cfg['experiment']}"))
kind = cfg.get("kind", "gen_lineage") kind = cfg.get("kind", "gen_lineage")
if kind == "recombination": if kind == "recombination":
from .recombine import run_recombination # Stage C (N4); imported lazily from .recombine import run_recombination # the `recombination` experiment; lazy import
df = run_recombination(cfg) df = run_recombination(cfg)
grid = None grid = None
elif kind == "gen_lineage": elif kind == "gen_lineage":
@ -114,7 +114,7 @@ def run_and_save(config_path: str | Path) -> Path:
def main(argv: list[str] | None = None) -> None: def main(argv: list[str] | None = None) -> None:
parser = argparse.ArgumentParser(description="Run a Layer-1.5 neural experiment from a YAML config.") parser = argparse.ArgumentParser(description="Run a Layer-1.5 neural experiment from a YAML config.")
parser.add_argument("config", help="Path to configs/neural/NX.yaml") parser.add_argument("config", help="Path to configs/neural/<name>.yaml")
args = parser.parse_args(argv) args = parser.parse_args(argv)
out_dir = run_and_save(args.config) out_dir = run_and_save(args.config)
print(f"wrote artifacts to {out_dir}/") print(f"wrote artifacts to {out_dir}/")

View file

@ -72,7 +72,7 @@ def run_generative_lineage(cfg: Mapping[str, Any] | NeuralLineageCfg,
grounding = cfg.dynamics.grounding grounding = cfg.dynamics.grounding
exercised = np.asarray(grounding.exercised) if grounding.exercised is not None else None exercised = np.asarray(grounding.exercised) if grounding.exercised is not None else None
m_vector = allocate_m(grounding.m, R, grounding.policy, exercised) m_vector = allocate_m(grounding.m, R, grounding.policy, exercised)
p_star_eff = p_star_orig.copy() # grounding reference; may be re-minted (N6) p_star_eff = p_star_orig.copy() # grounding reference; may be re-minted (`remint`)
remint = cfg.dynamics.remint remint = cfg.dynamics.remint
n = cfg.dynamics.n n = cfg.dynamics.n
@ -105,7 +105,7 @@ def run_generative_lineage(cfg: Mapping[str, Any] | NeuralLineageCfg,
if remint.enabled and remint.period and t % remint.period == 0: if remint.enabled and remint.period and t % remint.period == 0:
# Founder event: current distribution becomes the new grounding reference and # Founder event: current distribution becomes the new grounding reference and
# the original truth is discarded for grounding. Gated on diversity (N6). # the original truth is discarded for grounding. Gated on diversity (`remint`).
if remint.H_gate is None or heterozygosity(p) >= remint.H_gate: if remint.H_gate is None or heterozygosity(p) >= remint.H_gate:
p_star_eff = p.copy() p_star_eff = p.copy()
record(t, p) record(t, p)

View file

@ -3,7 +3,7 @@
Every model implements the same three-method protocol: ``fit`` on a batch of token Every model implements the same three-method protocol: ``fit`` on a batch of token
sequences, ``sample`` fresh token sequences, and report its ``mode_distribution`` (the sequences, ``sample`` fresh token sequences, and report its ``mode_distribution`` (the
model's ``p_t``). Keeping the interface identical is what makes "collapse is model's ``p_t``). Keeping the interface identical is what makes "collapse is
architecture-general" (experiment N5) a single sweep over ``model.kind``. architecture-general" (the `architectures` experiment) a single sweep over ``model.kind``.
``HistogramModel`` is the bridge: its ``fit`` is a maximum-likelihood mode histogram and ``HistogramModel`` is the bridge: its ``fit`` is a maximum-likelihood mode histogram and
its ``sample`` is a multinomial draw, so a lineage of histogram models is *exactly* its ``sample`` is a multinomial draw, so a lineage of histogram models is *exactly*

View file

@ -1,4 +1,4 @@
"""Autoregressive MLP generative model (Stage C, for the N5 architecture-generality axis). """Autoregressive MLP generative model (Stage C, for the `architectures` generality axis).
A causal feed-forward next-token model: token ``i`` is predicted from the concatenated A causal feed-forward next-token model: token ``i`` is predicted from the concatenated
(causally-masked) embeddings of all earlier tokens. Deliberately a *different* inductive (causally-masked) embeddings of all earlier tokens. Deliberately a *different* inductive

View file

@ -2,7 +2,7 @@
Each model implements the same ``GenerativeModel`` protocol as the histogram bridge Each model implements the same ``GenerativeModel`` protocol as the histogram bridge
(``initialise`` / ``fit`` / ``sample`` / ``mode_distribution``), so a lineage is (``initialise`` / ``fit`` / ``sample`` / ``mode_distribution``), so a lineage is
architecture-agnostic and N5 is a single sweep over ``model.kind``. Unlike the histogram architecture-agnostic and the `architectures` experiment is a single sweep over ``model.kind``. Unlike the histogram
model, a neural model's ``mode_distribution`` is *estimated* by generate-and-classify model, a neural model's ``mode_distribution`` is *estimated* by generate-and-classify
(``n_eval`` samples), which is the honest, slightly-noisy neural readout of ``p_t``. (``n_eval`` samples), which is the honest, slightly-noisy neural readout of ``p_t``.

View file

@ -1,4 +1,4 @@
"""Sequence VAE generative model (Stage C, for the N5 architecture-generality axis). """Sequence VAE generative model (Stage C, for the `architectures` generality axis).
A GRU encoder maps a token sequence to a Gaussian latent ``z``; a GRU decoder (its initial A GRU encoder maps a token sequence to a Gaussian latent ``z``; a GRU decoder (its initial
hidden state projected from ``z``) reconstructs the sequence. Trained by the ELBO hidden state projected from ``z``) reconstructs the sequence. Trained by the ELBO

View file

@ -151,12 +151,13 @@ C3 vertical claim deferred.*
`run_lineage` directly (<3%). The neural plumbing reproduces the analytic core. `run_lineage` directly (<3%). The neural plumbing reproduces the analytic core.
- **Plumbing:** `neural/experiment.py` (`run_and_save` dispatch on `kind`, reuses `_apply_param` - **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 `knowledge.experiment.save_artifacts` (optional `extra_libs`,
`extra_manifest`, injectable `grid`; skips missing libs — backward compatible). `configs/neural/N0.yaml`, `extra_manifest`, injectable `grid`; skips missing libs — backward compatible). `configs/neural/bridge.yaml`,
Makefile `neural`/`env-neural`/`layer2` targets, `.gitignore`. Makefile `neural`/`env-neural`/`layer2` targets, `.gitignore`. (Experiments are named
- **N0 result (bridge, 17s):** neural **g\* = 0.0474, CI [0.045, 0.052]** — reproduces Layer-1 E2's descriptively — `bridge`, `collapse`, `grounding`, `architectures` — not by code.)
- **`bridge` result (17s):** neural **g\* = 0.0474, CI [0.045, 0.052]** — reproduces Layer-1 E2's
g\*=0.048 essentially exactly (g=0.005→67% of H*, g=0.05→96%). **89 tests green.** g\*=0.048 essentially exactly (g=0.005→67% of H*, g=0.05→96%). **89 tests green.**
**2026-07-04 — Stage C: torch models + N1/N2/N5.** **2026-07-04 — Stage C: torch models + collapse/grounding/architectures.**
- **Env:** torch **2.12.1+cu130** (default PyPI wheel ships CUDA 13, matches RTX A4000 driver; - **Env:** torch **2.12.1+cu130** (default PyPI wheel ships CUDA 13, matches RTX A4000 driver;
no custom index needed, cp314 wheels exist). `--extra neural` = torch only; `--extra mnist` = no custom index needed, cp314 wheels exist). `--extra neural` = torch only; `--extra mnist` =
@ -168,16 +169,16 @@ C3 vertical claim deferred.*
- **Validated regime:** K=256, n=200, zipf_s=1.3, RNN hidden=128/epochs=25. RNN gen-0 fidelity - **Validated regime:** K=256, n=200, zipf_s=1.3, RNN hidden=128/epochs=25. RNN gen-0 fidelity
KL(p*‖p̂)=0.008, 64/64 (or 256/256) modes recovered. MLP fidelity KL=0.011. **VAE does NOT clear KL(p*‖p̂)=0.008, 64/64 (or 256/256) modes recovered. MLP fidelity KL=0.011. **VAE does NOT clear
the gen-0 gate** on the Zipf-codeword task (KL≈0.8; prior-hole mismatch — sampling z~N(0,I) misses the gen-0 gate** on the Zipf-codeword task (KL≈0.8; prior-hole mismatch — sampling z~N(0,I) misses
the aggregate posterior) → excluded from N5 to avoid confounding collapse with underfitting. the aggregate posterior) → excluded from `architectures` to avoid confounding collapse with underfitting.
- **N1 (collapse in weights):** dry RNN lineage collapses — forward-KL rises to ~2.2 vs grounded - **`collapse` (in weights):** dry RNN lineage collapses — forward-KL rises to ~2.2 vs grounded
~1.4; grounding lifts tail survival (tailalive 0.31 dry → 0.50 at g=0.02). Sign confirmed. ~1.4; grounding lifts tail survival (tailalive 0.31 dry → 0.50 at g=0.02). Sign confirmed.
- **N2 (neural phase boundary):** stationary H hovers 8091% of H* and is **noisy / non-monotonic** - **`grounding` (neural phase boundary):** stationary H hovers 8091% of H* and is **noisy / non-monotonic**
at 5 reps — no crisp g*. **KEY FINDING:** the neural models' smoothing inductive bias *partially at 5 reps — no crisp g*. **KEY FINDING:** the neural models' smoothing inductive bias *partially
resists* H-collapse (dry H stays ~83% of H*), so **forward-KL and tail survival are the sharp resists* H-collapse (dry H stays ~83% of H*), so **forward-KL and tail survival are the sharp
neural collapse metrics, not H** (mirrors Layer-1's "H is smooth; the threshold lives in tail neural collapse metrics, not H** (mirrors Layer-1's "H is smooth; the threshold lives in tail
survival"). N2 needs (a) forward-KL as the phase metric, (b) more reps (≥10), and/or (c) a survival"). `grounding` needs (a) forward-KL as the phase metric, (b) more reps (≥10), and/or (c) a
stronger-collapse regime for a clean neural g*. stronger-collapse regime for a clean neural g*.
- **N5 (architecture-generality) — clean result:** collapse + grounding-rescue appear in ALL three - **`architectures` (architecture-generality) — clean result:** collapse + grounding-rescue appear in ALL three
model classes (dry→grounded forward-KL: histogram 6.2→4.6, MLP 4.8→1.3, RNN 3.8→1.1; tailalive model classes (dry→grounded forward-KL: histogram 6.2→4.6, MLP 4.8→1.3, RNN 3.8→1.1; tailalive
RNN 0.41→0.64, MLP 0.07→0.20). The WF operator is architecture-general. Bonus: neural smoothing RNN 0.41→0.64, MLP 0.07→0.20). The WF operator is architecture-general. Bonus: neural smoothing
lets RNN/MLP retain *more* tail than the exact histogram under grounding (they generalise to lets RNN/MLP retain *more* tail than the exact histogram under grounding (they generalise to
@ -185,16 +186,16 @@ C3 vertical claim deferred.*
## Remaining ## Remaining
- [ ] **N2 refinement:** re-run with forward-KL as the phase metric + ≥10 reps (and/or smaller n) - [ ] **`grounding` refinement:** re-run with forward-KL as the phase metric + ≥10 reps (and/or
for a clean neural g*. Pin the falsifier ("g* ≪ 1 exists") before re-running. smaller n) for a clean neural g*. Pin the falsifier ("g* ≪ 1 exists") before re-running.
- [ ] **N4 (load-bearing):** `recombine.py` — mean-mixture vs union-preserving merge. The neural - [ ] **`recombination` (load-bearing):** `recombine.py` — mean-mixture vs union-preserving merge.
merge MUST be **oracle-guided mixture sampling** (sample from the teacher strongest on each mode), The neural merge MUST be **oracle-guided mixture sampling** (sample from the teacher strongest on
NOT weight-averaging of recurrent nets (flag #7). Reproduce the E4 "mean flat, max rises" finding. each mode), NOT weight-averaging of recurrent nets. Reproduce the E4 "mean flat, max rises" finding.
- [ ] **N3** region-matched grounding (R>1), **N6** re-mint gate (optional). - [ ] **`region_matched`** grounding (R>1), **`remint`** re-mint gate (optional).
- [ ] **VAE fidelity:** fix the prior-hole mismatch (KL-annealing / free-bits / larger latent) so it - [ ] **VAE fidelity:** fix the prior-hole mismatch (KL-annealing / free-bits / larger latent) so it
clears the gen-0 gate, then add to N5. Or document as a known limitation. clears the gen-0 gate, then add to `architectures`. Or document as a known limitation.
- [ ] Real-MNIST secondary tier (`ClassifierOracle` + confusion matrix; `--extra mnist`). - [ ] Real-MNIST secondary tier (`ClassifierOracle` + confusion matrix; `--extra mnist`).
- [ ] `figures/plot_N*.py` (reuse `figures/_figlib.py`); wire into `make figures`. - [ ] `figures/plot_<name>.py` (reuse `figures/_figlib.py`); wire into `make figures`.
## Discovered during work ## Discovered during work