Experiments · E246

Does the fly do better when it remembers what it learned in a previous run?

Not yet. It is pre-registered, built and reviewed (one bug found and fixed); it runs when the cores are free.

In the log: does the fly do better when it remembers a previous run? (pre-registered 2026-09-25 16:43)

recordedDate 2026-09-25 16:43, as written in the logrung 0 · energy model3 predictions · 0 result paragraphsEXPERIMENTS.md lines 17109–17167, lines 17169–17183, lines 17185–17205

Pre-registration

  1. (1)
    M beats F on rounds 1–50.
    no verdict written against it
  2. (2)
    Over 200 rounds the gap narrows as the fresh fly catches up; M vs F on the full AUC_Q does not clear its bar.
    no verdict written against it
  3. (3)
    S sits between F and M. Cost and order. About 45 min per fly run on MPS, one search at a time: 2 donors plus 15 fly runs plus 5 elitist runs, about 14 h. Runs after E245c's sampling frees the cores. The code gets an adversarial review before any M run is scored.
    no verdict written against it
The pre-registration, as written

E246 — does the fly do better when it remembers a previous run? (pre-registered 2026-09-25 16:43)

The operator's question (2026-09-24): the fly learns from scratch every run. Once the search is in the HEA regime it should keep what it learned, "build out its own map". Every run already saves its readout (runs/readout_*.json, 100 files), but nothing has ever loaded one. This tests the smallest version of memory before building more.

Memory, defined. Everything the fly learned in a run:

  • the readout's weights and its reward-normalisation trace;
  • every connectome synapse the run moved: core.w wherever it differs from the anatomy's value, which covers the fb, oa and 5ht sites (they rewrite core.w directly and keep no weights of their own) and any other plastic edges;
  • each plastic site's reward/score trace.

Not carried: the walkers' positions, the niche archive, and the modulator's running activity statistics (a normaliser, not knowledge). The archive, a persistent map, is the next step if this one earns it.

Implementation, before any run.

  • FORAGER_MEMORY_OUT=<file> saves the snapshot at the end of a run.
  • FORAGER_MEMORY_IN=<file> loads it before the first round, matched by neuron and edge id, never by position.
  • FORAGER_MEMORY_SHUFFLE=1 loads it permuted: the readout's weights across the read neurons, and each site's moved values across that site's edges of the same anatomical sign. The same magnitudes and signs, with the assignment destroyed.
  • Tests before any run: a save followed by a load reproduces the learned state exactly; saving changes nothing about the run; a shuffled load keeps every sign and every magnitude.

Protocol. E244's search exactly (the HEA space, pure rung-0 reward on e6, E244's brain flags, 200 rounds × 4 proposals). Donors: fresh fly runs on seeds 0 and 1 with FORAGER_MEMORY_OUT. Then seeds 2–6 for each arm:

arm what
F the fresh fly (E244's fly arm)
M the fly warm-started from donor seed (s mod 2)
S M's memory shuffled (the control: warm weights with the content destroyed)
E elitist, for reference

Measures. AUC_Q over the 200 rounds (primary), AUC_Q over rounds 1–50 (where memory should matter most), distinct finds, best rung-0 energy. If the per-round series is not already stored, the implementation stores it before any run.

Bars (Welch, 5 seeds per arm).

  • Memory helps: mean AUC_Q(M) − mean AUC_Q(F) > 2 s.e. of the difference.
  • It is the content, not the weights' size: mean AUC_Q(M) − mean AUC_Q(S) > 2 s.e. as well.
  • M > F with M ≈ S reads "warm weights help, what they learned does not". M ≤ F means memory as defined does not help, and the next step is the map (the archive), not more of this.

What 5 seeds can see. E244's fly had a seed sd of 38.5 on an AUC_Q of 115, so the smallest difference these bars can detect is about 2 × 38.5 × √(2/5) ≈ 49, roughly 40 % of the fly's AUC_Q. A smaller real effect will read as no effect; that is stated now, not discovered afterwards.

Predictions. (1) M beats F on rounds 1–50. (2) Over 200 rounds the gap narrows as the fresh fly catches up; M vs F on the full AUC_Q does not clear its bar. (3) S sits between F and M.

Cost and order. About 45 min per fly run on MPS, one search at a time: 2 donors plus 15 fly runs plus 5 elitist runs, about 14 h. Runs after E245c's sampling frees the cores. The code gets an adversarial review before any M run is scored.

E246 amendment and smoke test (2026-09-25 17:01, before any E246 run).

  • The control's wording, corrected. "The same magnitudes and signs" is not quite what a shuffle can give. A change moved onto a synapse too weak to take it is stopped at zero by the anatomy's sign, and one moved onto a strong site edge is capped at ±rho, exactly as learning would stop it. memory.load counts these (clamped) and reports them with every S run. A faithful load clamps nothing.
  • Code. forager/brain/memory.py and the stage_b hooks (FORAGER_MEMORY_IN, _OUT, _SHUFFLE); tests/test_fly_memory.py, 4 tests: exact round trip, saving changes nothing, landing on another seed's start, the shuffle keeps the values within each group except the counted clamps, and a foreign circuit is refused.
  • Smoke test on the full brain (E244's flags, 3 rounds, one seed, outputs kept out of runs/): 3 rounds moved 37,901 synapses (a 1.25 MB file); a faithful load clamped 0; a shuffled load clamped 226 (0.6 %). The loaded memory reaches the forward pass: on the same seed, fresh / memory / shuffled ended at best +13.5 / −67.7 / +14.4 meV/atom with 0 / 5 / 0 finds. Three rounds on one seed prove the plumbing, not the effect; that is E246's job.

E246 adversarial review (2026-09-25 17:20, before any E246 run). An independent reviewer read the memory code against the pre-registration. Verdict: not runnable as written, for one reason, now fixed.

  • Fixed, would have invalidated M vs S. A shuffled load held only the plastic sites' synapses within ±rho, not the mushroom body's own KC→MBON synapses. Under E244's flags the three sites (fb, oa, 5ht) sit elsewhere, so that ungated group is the core's whole plastic pathway (61,210 synapses on the full brain). A shuffle could park them beyond any value learning reaches, which is exactly what the S control must not do. Every plastic group is now clipped, as both learning rules clip. The test suite missed it because its one site sat on the KC→MBON edges; a new test puts the site elsewhere and failed on the old code (0.196 against rho 0.05) before passing on the new.
  • Fixed. A memory whose readout neurons differ from the fly's is refused, not partly applied; a multi-seed run's save path must contain {seed}.
  • Kept, with the reason written in the code. A warm run's saved memory is measured from the anatomy, so it holds what it loaded plus what it learned. Loading that one file reproduces it; it is not added to its donor's.
  • Named, not carried. The mushroom body's per-Kenyon-cell exposure counter, which drives novelty(). Nothing on E246's path reads it (stage_b → FlyGenerator → forage); only campaign.py and qualify.py do.
  • Cleared by the reviewer: edge and neuron identity, the sign rule, the stale-operator reset, the shuffle's RNG (its own Generator, never the search's; loading draws nothing from the search), the hook's order, and non-fly arms. Full-brain smoke loads after the fix: faithful 0 clamped, shuffled 226 of 37,901 moved synapses.

Results

No result paragraph for this entry was found in the log.

The full record

This entry is written in 3 separate places in the log, shown here in log order.

EXPERIMENTS.md · lines 17109–17167

E246 — does the fly do better when it remembers a previous run? (pre-registered 2026-09-25 16:43)

The operator's question (2026-09-24): the fly learns from scratch every run. Once the search is in the HEA regime it should keep what it learned, "build out its own map". Every run already saves its readout (runs/readout_*.json, 100 files), but nothing has ever loaded one. This tests the smallest version of memory before building more.

Memory, defined. Everything the fly learned in a run:

  • the readout's weights and its reward-normalisation trace;
  • every connectome synapse the run moved: core.w wherever it differs from the anatomy's value, which covers the fb, oa and 5ht sites (they rewrite core.w directly and keep no weights of their own) and any other plastic edges;
  • each plastic site's reward/score trace.

Not carried: the walkers' positions, the niche archive, and the modulator's running activity statistics (a normaliser, not knowledge). The archive, a persistent map, is the next step if this one earns it.

Implementation, before any run.

  • FORAGER_MEMORY_OUT=<file> saves the snapshot at the end of a run.
  • FORAGER_MEMORY_IN=<file> loads it before the first round, matched by neuron and edge id, never by position.
  • FORAGER_MEMORY_SHUFFLE=1 loads it permuted: the readout's weights across the read neurons, and each site's moved values across that site's edges of the same anatomical sign. The same magnitudes and signs, with the assignment destroyed.
  • Tests before any run: a save followed by a load reproduces the learned state exactly; saving changes nothing about the run; a shuffled load keeps every sign and every magnitude.

Protocol. E244's search exactly (the HEA space, pure rung-0 reward on e6, E244's brain flags, 200 rounds × 4 proposals). Donors: fresh fly runs on seeds 0 and 1 with FORAGER_MEMORY_OUT. Then seeds 2–6 for each arm:

arm what
F the fresh fly (E244's fly arm)
M the fly warm-started from donor seed (s mod 2)
S M's memory shuffled (the control: warm weights with the content destroyed)
E elitist, for reference

Measures. AUC_Q over the 200 rounds (primary), AUC_Q over rounds 1–50 (where memory should matter most), distinct finds, best rung-0 energy. If the per-round series is not already stored, the implementation stores it before any run.

Bars (Welch, 5 seeds per arm).

  • Memory helps: mean AUC_Q(M) − mean AUC_Q(F) > 2 s.e. of the difference.
  • It is the content, not the weights' size: mean AUC_Q(M) − mean AUC_Q(S) > 2 s.e. as well.
  • M > F with M ≈ S reads "warm weights help, what they learned does not". M ≤ F means memory as defined does not help, and the next step is the map (the archive), not more of this.

What 5 seeds can see. E244's fly had a seed sd of 38.5 on an AUC_Q of 115, so the smallest difference these bars can detect is about 2 × 38.5 × √(2/5) ≈ 49, roughly 40 % of the fly's AUC_Q. A smaller real effect will read as no effect; that is stated now, not discovered afterwards.

Predictions. (1) M beats F on rounds 1–50. (2) Over 200 rounds the gap narrows as the fresh fly catches up; M vs F on the full AUC_Q does not clear its bar. (3) S sits between F and M.

Cost and order. About 45 min per fly run on MPS, one search at a time: 2 donors plus 15 fly runs plus 5 elitist runs, about 14 h. Runs after E245c's sampling frees the cores. The code gets an adversarial review before any M run is scored.

EXPERIMENTS.md · lines 17169–17183

E246 amendment and smoke test (2026-09-25 17:01, before any E246 run).

  • The control's wording, corrected. "The same magnitudes and signs" is not quite what a shuffle can give. A change moved onto a synapse too weak to take it is stopped at zero by the anatomy's sign, and one moved onto a strong site edge is capped at ±rho, exactly as learning would stop it. memory.load counts these (clamped) and reports them with every S run. A faithful load clamps nothing.
  • Code. forager/brain/memory.py and the stage_b hooks (FORAGER_MEMORY_IN, _OUT, _SHUFFLE); tests/test_fly_memory.py, 4 tests: exact round trip, saving changes nothing, landing on another seed's start, the shuffle keeps the values within each group except the counted clamps, and a foreign circuit is refused.
  • Smoke test on the full brain (E244's flags, 3 rounds, one seed, outputs kept out of runs/): 3 rounds moved 37,901 synapses (a 1.25 MB file); a faithful load clamped 0; a shuffled load clamped 226 (0.6 %). The loaded memory reaches the forward pass: on the same seed, fresh / memory / shuffled ended at best +13.5 / −67.7 / +14.4 meV/atom with 0 / 5 / 0 finds. Three rounds on one seed prove the plumbing, not the effect; that is E246's job.
EXPERIMENTS.md · lines 17185–17205

E246 adversarial review (2026-09-25 17:20, before any E246 run). An independent reviewer read the memory code against the pre-registration. Verdict: not runnable as written, for one reason, now fixed.

  • Fixed, would have invalidated M vs S. A shuffled load held only the plastic sites' synapses within ±rho, not the mushroom body's own KC→MBON synapses. Under E244's flags the three sites (fb, oa, 5ht) sit elsewhere, so that ungated group is the core's whole plastic pathway (61,210 synapses on the full brain). A shuffle could park them beyond any value learning reaches, which is exactly what the S control must not do. Every plastic group is now clipped, as both learning rules clip. The test suite missed it because its one site sat on the KC→MBON edges; a new test puts the site elsewhere and failed on the old code (0.196 against rho 0.05) before passing on the new.
  • Fixed. A memory whose readout neurons differ from the fly's is refused, not partly applied; a multi-seed run's save path must contain {seed}.
  • Kept, with the reason written in the code. A warm run's saved memory is measured from the anatomy, so it holds what it loaded plus what it learned. Loading that one file reproduces it; it is not added to its donor's.
  • Named, not carried. The mushroom body's per-Kenyon-cell exposure counter, which drives novelty(). Nothing on E246's path reads it (stage_b → FlyGenerator → forage); only campaign.py and qualify.py do.
  • Cleared by the reviewer: edge and neuron identity, the sign rule, the stale-operator reset, the shuffle's RNG (its own Generator, never the search's; loading draws nothing from the search), the hook's order, and non-fly arms. Full-brain smoke loads after the fix: faithful 0 clamped, shuffled 226 of 37,901 moved synapses.

Related entries

Built with PRISMWebsite and visualizations made using Claude