Results
Every table here is pulled from the task reports in docs/reports/ at build time, so
this page cannot say something the reports do not. Nothing on this page is a claim that
the fly has an edge, or that it likes anything.
The kernel reproduces upstream (S01)
| wirehead reports | ours | |
|---|---|---|
| neurons / directed edges | 166,700 / 25,582,938 | 166,700 / 25,582,938 |
| R1–R6 / R8 inputs | 3,335 / 811 | 3,335 / 811 |
| plastic KC→MBON07/11 edges | 7,835 | 7,835 |
| control, 200 ms white: PAM11 spikes | 0 | 0 |
| stimulated (20 mV into 15 PAM11): PAM11 spikes | 261 | 261 (87.0 Hz per cell) |
| plastic edges changed after the stimulated 200 ms | 3,087 | 3,087 |
| video-linked reward == manual pulse (spike hash) | yes | yes |
Also measured, not in wirehead's report: the control run changed 1,768 plastic edges on its own. The centred rule moves weights whenever KC and DAN rates deviate from baseline, so "edges moved" is not a reward signal by itself; the number to show is the difference against a matched control, which was 3,095 edges here.
| timing, Mac M1 Pro | |
|---|---|
| graph prepare (import + compile) | 19 s |
| engine load (graph + circuits + kernel build cached) | 2.6 s |
| one 50 ms observation, median of 20 | 0.282 s (min 0.271, max 0.303) |
| real-time factor | 0.18× |
| peak RSS | 0.95 GB |
So on the Mac the fly lives about 5.6× slower than wall-clock. For the show that is fine: the loop advances 50 ms of neural time per observation and we report simulated time, as wirehead does.
| timing, Linux box (AMD Ryzen 7 9800X3D, g++ 13) | |
|---|---|
| graph prepare, including the 1.1 GB download | ~60 s |
| engine load | 1.3 s |
| one 50 ms observation, median of 20 | 0.1689 s (min 0.0653, max 0.1758) |
| real-time factor | 0.3× |
| peak RSS | 0.96 GB |
The kernel is single-threaded CPU code; the GPU is not used. The box is 1.7× faster than the Mac per observation.
Does the reward change anything? (S04)
Three runs from the same start, same seed, same reels: reward on; reward off; reward on with the plastic weights frozen. What differs between them is what the dopamine current and the rule actually did.
Linux box, threshold 65 Hz, refractory 2 s, 40 minutes of wall time each, run
concurrently from the same cold start, same seed (so the reels are the same sequence),
same wake-up (2,000 ms of white, Kenyon cells at ~4,000 spikes per 500 ms). Files under
runs/s04-box/ on the Mac.
| reward | no reward | reward, weights frozen | |
|---|---|---|---|
| neural time | 578.5 s | 578.6 s | 575.0 s |
| observations | 11,529 | 11,533 | 11,459 |
| spins (= readout crossings) | 126 | 127 | 112 |
| spins per neural minute | 13.1 | 13.2 | 11.7 |
| spins, first half / second half | 60 / 66 | 60 / 67 | 52 / 60 |
| wins | 43 | 44 | 37 |
| wagered → returned | 126 → 76.0 (60.3 %) | 127 → 76.8 (60.5 %) | 112 → 62.1 (55.4 %) |
| balance 1000 → | 950.0 | 949.8 | 950.1 |
| observations with the reward current on | 172 | 0 | 148 |
| PAM11 mean / max (Hz) | 1.56 / 168 | 0.00 / 1.3 | 1.34 / 168 |
| readout mean (Hz) / share ≥ 65 Hz | 21.0 / 2.0 % | 21.4 / 1.9 % | 20.3 / 1.5 % |
| plastic edges moved / L1 drift | 3,648 / 472 | 3,633 / 412 | 0 / 0 |
- The reward current did what it was built to do and nothing more. PAM11 fired at up to 168 Hz for 200 ms after each win (and never without the current); the rule moved ~3,600 edges. With the reward on, the fly pressed Spin 126 times; with it off, 127. There is no evidence in these runs that dopamine changed how often it plays. The spin rate is 13 per neural minute either way, and it did not rise from the first half to the second in any run beyond what all three share.
- Frozen weights: 12 % fewer spins, and that is not attributable to learning. The frozen run is the only one whose trajectory diverged early (the weights stop moving from the first observation), and a chaotic spiking network on a different trajectory sees different reels at different moments. No-reward and reward, whose weights both move, stayed within one spin of each other. So the comparison that isolates the rule's effect on behaviour is reward vs no-reward, and that difference is zero.
- "Edges moved" is not a reward signal. The no-reward run moved 3,633 edges. The centred rule drifts weights whenever Kenyon-cell and dopamine rates deviate from baseline, and the aversive PPL101 cells fire on their own. Only the difference against a matched control says anything, which is why the page shows the count but the docs say what it means.
- The bankroll did what the paytable says. All three lost about 50 credits on ~120 one-credit spins: an observed return of 55–60 % against the published 94.6 %, which for a paytable with a 300× line and 120 spins is ordinary variance (see S03). The expected loss at 120 spins is 6.5 credits; the realised loss was 50. No run "learned" anything about winning because there is nothing to learn.
- What would change this. A reward that lasts longer or hits harder than 200 ms at ≤ 40 mV, a readout closer to the mushroom body output, or many more spins. Those are engineering choices, and any of them that produces a difference will be reported with the same three columns.
Test: tests/test_loop.py (7), plus the full suite: 21 passed on the Mac.