--- license: cc-by-nc-4.0 tags: - othello - reversi - spiking-neural-network - connectome - drosophila - rsnn --- # MushroomBody_Othello v1 Synaptic weights for the Othello game of **[BeatTheFly](https://phclab.github.io/BeatTheFly/othello/)** -- *A Smart Fruit Fly is playing Othello against you*: a spiking network wired as the real *Drosophila* mushroom-body connectome that plays Othello. **The anatomical connectome gives you wiring, not synaptic strengths. Ours are trained.** Synaptic weights trained with PHCSSM parallel-scan mode, deployment in sequential RSNN mode ([PHCSSM](https://arxiv.org/abs/2604.01295)). made by Po-Han Chiang @ NYCU ## Architecture * **Wiring:** MaleCNS v1.0 mushroom body -- 4,510 neurons (4,064 Kenyon cells, 97 MBONs, 340 DANs, 2 APL, 2 DPM, 5 MB-C1) and 1,027,152 neuron-to-neuron connections. The connectivity mask is fixed to the connectome; 763,700 connections carry a nonzero weight and 0 weights lie off the connectome. * **Dale's law:** one sign per presynaptic neuron from neurotransmitter annotations (excitatory 4,114, inhibitory 52, modulatory 344); 0 weights violate it. * **Inputs:** each ply provides the move token (one of 68 tokens: the 64 squares, pass, and start, end and padding markers) and the board after it (138 binary features: the discs of the side to move, the opponent's discs, which side is to move, and a disc-count bucket). Two linear encoders with their own LayerNorm drive the Kenyon cells; the move token also drives the dopaminergic neurons. * **Rules:** a pass is a move only when the side to move has no legal square; the network takes one timestep per move, forced passes included. * **Neurons:** leaky integrate-and-fire with per-neuron leak, threshold and reset; synaptic delay of one step. * **Fast weight:** dopamine-gated associative memory on the Kenyon-cell -> MBON synapses, read back into the MBON voltages. * **Readout:** linear map from the membrane voltage of all neurons to the move vocabulary. * **Deployment:** sequential RSNN mode, one timestep per ply, with the neuron state and fast weight carried across the whole game. ## Data sources Data source: [Egaroucid Free Training Data](https://www.egaroucid.nyanyan.dev/en/technology/train-data/) (Takuto Yamana). ## Evaluation Agreement with the engine's move on 10,570 held-out Egaroucid games (legal moves only): 50.1% overall (moves 1–15 43.4%, 16–30 38.6%, 31–45 39.6%, 46+ 61.2%). **Strength:** Beats simple greedy and corner-heuristic bots about 80–86% of the time; scores about one third against the Edax engine at level 1 (32–1–67 in 100 games). Matches: 100 games per opponent, colours swapped; the fly uses no search, one network timestep per move. ## Files * `manifest.json` -- every tensor (file, dtype, shape, bytes), the model scalars, the token map (`scalars.tokens`: pad 0, start 1, end 2, pass 3, square `a1` = 4 ... `h8` = 67, row-major from `a1`) and a connectome audit. * `info.json` -- neuron metadata used by the page (cell classes, hemispheres, soma coordinates). * `selfcheck_.json` -- reference moves and logits that the page replays when it loads. * `fp16/`, `fp32/` -- raw little-endian arrays. Two precisions are listed in the manifest: `fp16w32` (default, 7.6 MB: float16 for the four large dense matrices, float32 for the recurrent weights and all small tensors) and `fp16` (6.1 MB, recurrent weights in float16 as well). The recurrent weight matrix W[dst, src] is stored in CSC order by source neuron (`W_colptr`, `W_rowidx`, `W_vals`): each step multiplies W by a sparse binary spike vector, so the engine visits only the columns of the neurons that spiked. Dense matrices are stored in the orientation they are read: `enc_tok_T` [vocab, H] (a move token selects one row), `enc_brd_T` [138, H] (sum of the active rows), `dec_w` [vocab, H] and `v2d_T` [vocab, n_dan]. | name | file | dtype | shape | |---|---|---|---| | `enc_tok_T` | `fp16/enc_tok_T.bin` | float16 | 68x4510 | | `enc_tok_b` | `fp32/enc_tok_b.bin` | float32 | 4510 | | `ln_tok_w` | `fp32/ln_tok_w.bin` | float32 | 4510 | | `ln_tok_b` | `fp32/ln_tok_b.bin` | float32 | 4510 | | `enc_brd_T` | `fp16/enc_brd_T.bin` | float16 | 138x4510 | | `enc_brd_b` | `fp32/enc_brd_b.bin` | float32 | 4510 | | `ln_brd_w` | `fp32/ln_brd_w.bin` | float32 | 4510 | | `ln_brd_b` | `fp32/ln_brd_b.bin` | float32 | 4510 | | `v2d_T` | `fp16/v2d_T.bin` | float16 | 68x340 | | `v2d_b` | `fp32/v2d_b.bin` | float32 | 340 | | `dec_w` | `fp16/dec_w.bin` | float16 | 68x4510 | | `dec_b` | `fp32/dec_b.bin` | float32 | 68 | | `Wg` | `fp32/Wg.bin` | float32 | 97x340 | | `W_dan_val` | `fp32/W_dan_val.bin` | float32 | 97x340 | | `alpha_exc` | `fp32/alpha_exc.bin` | float32 | 4510 | | `alpha_inh` | `fp32/alpha_inh.bin` | float32 | 4510 | | `v_th` | `fp32/v_th.bin` | float32 | 4510 | | `reset_weight` | `fp32/reset_weight.bin` | float32 | 4510 | | `kc_idx` | `fp32/kc_idx.bin` | int32 | 4064 | | `mbon_idx` | `fp32/mbon_idx.bin` | int32 | 97 | | `dan_idx` | `fp32/dan_idx.bin` | int32 | 340 | | `W_colptr` | `fp32/W_colptr.bin` | uint32 | 4511 | | `W_rowidx` | `fp32/W_rowidx.bin` | uint16 | 763700 | | `W_vals` | `fp32/W_vals.bin` | float32 | 763700 | **Numerical check:** legal top-1 1948/1949 vs the fp32 reference (32 fly-vs-fly reference games); 0 of 8,934,310 spike bits differ from the reference on the same weights. ## Limitations There is no search and no evaluation function: each move is a single timestep of the network, restricted to the legal squares. ## License and attribution Weights: [CC-BY-NC-4.0](https://creativecommons.org/licenses/by-nc/4.0/). They are derived from the MaleCNS v1.0 connectome (Janelia FlyEM and collaborators, https://male-cns.janelia.org/, [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)) and trained with PHCSSM (https://arxiv.org/abs/2604.01295); please credit both. Training data: Egaroucid Free Training Data by Takuto Yamana (https://www.egaroucid.nyanyan.dev/en/technology/train-data/). ## Citation PHCSSM: https://arxiv.org/abs/2604.01295