Landscape and gap analysis
Survey date 2026-09-26. Every figure (versions, dates, stars, issues, licences)
was read from the GitHub API, PyPI JSON, the package source or a cited page on
that date; items we could not confirm are marked UNVERIFIED. Full per-tool notes
with quotes and URLs: docs/research/landscape_access_analysis.md and
docs/research/landscape_sim_and_longtail.md.
Verdict legend: depend-on (import), wrap (adapter, optional extra), borrow-ideas (reimplement with attribution), contribute-upstream, reference (parity target only), ignore.
1. One-paragraph conclusion
The ecosystem has mature data-access clients (neuprint-python, caveclient,
fafbseg, navis/flybrains, banc) and exactly one mature analysis library
(connectome_interpreter). It has no harmonized offline multi-dataset store,
no uncertainty propagation anywhere (every tool uses point NT labels and a
fixed threshold), no validated cross-platform simulator (the reference is a
Brian2 script; the reimplementations are either Apple-only, CUDA-only, Euler-
integrated, unseeded or days old), and no declarative experiment/report
layer. Cross-dataset typing exists in cocoa (Python, untested, GPL, token-
bound) and coconatfly (R). Those four gaps are flyconn's scope; everything
else we wrap or cite.
2. Data access and analysis libraries
| Tool | Lang / licence | Datasets (verified) | Latest release | Last commit | Issues / contributors | CI | Gap it leaves | Verdict |
|---|---|---|---|---|---|---|---|---|
| neuprint-python | Py / BSD-3 | any neuPrint: hemibrain:v1.2.1, male-cns:v0.9, male-cns:v1.0, manc:v1.0/1.2.1/1.2.3, optic-lobe |
0.6.3, 2026-07-20 | 2026-07-20 | 18 / 7 | no test CI (pytest suite exists) | online only; token mandatory (client raises without one, though the public server answered anonymous Cypher for male-cns:v1.0); tokens issued before 2026-08 invalid; no type hints; slow for whole-CNS adjacency vs the 1.1 GB feather |
depend-on (thin, optional [neuprint]) |
| caveclient | Py / MIT | CAVE datastacks: flywire_fafb_public, brain_and_nerve_cord (BANC), FANC |
8.2.1, 2026-07-10 | 2026-07-10 | 38 / 14 | yes | token required for every datastack; raw synapse tables, no harmonized schema; CAVE datasets only | depend-on (optional [cave]) |
| fafbseg-py | Py / GPL-3.0 | FlyWire production/sandbox/public, flat_630, flat_783 |
3.2.2, 2026-02-20 | 2026-07-09 | 8 / 4 | yes | FlyWire only; heavy (cloud-volume, navis<2.0); GPL | wrap lazily (optional) |
| navis | Py / GPL-3.0 | morphology, dataset-agnostic; 0 code refs to MaleCNS | 1.12.0, 2026-07-13 | 2026-09-06 | 31 / 16 | 5 workflows | morphology-centric; GPL; heavy | depend-on optional [morph] |
| navis-flybrains | Py / GPL-3.0 | templates incl. JRCFIB2022M (=MaleCNS), MANC, FANC, BANC, FLYWIRE, FAFB14; bridging FLYWIRE↔MaleCNS, BANC↔MaleCNS |
0.6.3, 2025-11-17 | 2026-09-02 | 6 / 2 | publish only | h5py<=3.12.1 pin; transforms downloaded separately | depend-on optional |
| cocoa (flyconnectome) | Py / GPL-3.0 | FlyWire 783, hemibrain 1.2.1, MANC 1.2.1, MaleCNS via male-cns:latest (resolves to v1.0 by string ordering; docs say v0.9); BANC/FANC TODO (BANC only on unmerged aedes branch via internal SeaTable) |
not on PyPI; git 0.2.1 | main 2026-01-09 | 1 / 1 | none; 0 tests | untested, single maintainer, tokens + internal SeaTable, GPL, no uncertainty | borrow-ideas (GraphMapper) + contribute-upstream where cheap; do not depend (ADR-0003) |
| coconatfly / coconat / malecns / bancr | R / GPL≥3 | flywire, malecns (v1.0 default), manc, fanc, hemibrain, opticlobe, banc, yakubavnc; multi-hop effective connectivity added 2026-08-19 | GitHub releases only | 2026-08-19 | 9 / 1 | R-CMD-check | R; "experimental" lifecycle | reference (parity targets); copy bancr's public feather path |
| connectome_interpreter (YijieYin) | Py / MIT | dataset-agnostic (scipy.sparse + index dicts); tutorials FlyWire 783, BANC, MaleCNS, hemibrain, MANC |
PyPI 2.9.5, 2025-06-26; repo 2.10.0 unreleased (~15 months of commits) | 2026-08-27 | 0 / 6 | flake8, black, mypy(non-blocking), pytest+cov on py3.10 | torch mandatory; fixed idx_to_sign (no uncertainty); no data layer; PyPI stale |
depend-on optional [interpret] pinned to a git SHA (ADR-0002) |
| sjcabs/fly_connectome_data_tutorial | Py+R / MIT | harmonized feather/parquet on GCS: BANC 888, FAFB 783, hemibrain 1.2.1, MANC 1.2.1, MaleCNS v0.9 | not a package | 2026-06-07 | – / 4 | – | workshop bundle; v0.9; no DuckDB; assumes Google credentials | adopt vocabulary, contribute MaleCNS v1.0 (ADR-0001) |
| YijieYin/connectome_data_prep | Py | .npz inprop/outprop/syncount for MaleCNS, BANC, FAFB 783, hemibrain, MANC |
– | 2026-08-12 | – / 4 | – | dataset versions unstated; no licence file | ignore as data source; contribute a v1.0 prep |
| schlegelp/connecto | Py / GPL-3.0 | unified CAVE/neuPrint query interface | – | 2026-09-22 | – | 2 workflows | live-query oriented | reference |
| flyconnectome/drosophila_neurotransmitters | data | versioned NT ground truth across datasets | – | – | – | – | – | use as ground-truth table for NT sanity tests (licence to verify in M3) |
| flywire_annotations (Schlegel 2024 supplements) | data | FlyWire 783 annotations, hemibrain meta | – | – | – | – | – | primary source for FlyWire types |
Direct answers the brief asked for:
- connectome_interpreter takes an arbitrary scipy sparse matrix + metadata? Yes:
compress_paths(A: spmatrix, step_number, ...),compress_paths_signed(inprop, idx_to_sign: dict, target_layer_number, ...),find_paths_of_length(edgelist: spmatrix | DataFrame, inidx, outidx, target_layer_number),_NetworkBase(all_weights: Tensor | spmatrix, sensory_indices, ..., idx_to_group). Weights must be input-proportion normalised; analysis functions want pre-in-rows, the torch model pre-in-columns. - cocoa MaleCNS v1.0? No explicit support; BANC still a README TODO.
- neuprint-python against MaleCNS? Yes,
Client("https://neuprint.janelia.org", dataset="male-cns:v1.0"); a token is always required by the library.
3. Simulation codebases
| Project | What | Licence | Datasets | Last commit | Stars / issues / contributors | Tests | Integration / device | Gap | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| philshiu/Drosophila_brain_model | reference Brian2 LIF (Shiu 2024) | MIT | FlyWire v630 (+ v783 files shipped) | 2024-09-14 | 347 / 2 / 3 | none | Brian2 2.5.1 method='linear' (= exact), dt 0.1 ms, delay 18 steps, refractory 22 steps (0 for Poisson-driven), Cython runtime |
one dataset, CPU, unseeded (joblib, per-trial rebuild), silencing zeroes only outgoing weights (issue #10) | reference + parity oracle; never imported at runtime |
| eonsystemspbc/fly-brain | six-backend benchmark harness (Brian2 C++/CUDA, PyTorch CUDA, NEST GPU, GeNN, Brian2GeNN) | GPL-2.0-or-later | v783 (v630 archive) | 2026-08-29 | 920 / 0 / 1 | none, no CI | PyTorch runner is forward Euler (v += dt/tau*(g-(v-v_rest))), CUDA-or-CPU (no MPS), no manual_seed, no library API; Brian2 comparison is Jaccard/rate-r only and its results JSON is not committed |
cannot be spike-exact by construction; GPL | not a backend (ADR-0004); borrow trial batching, comparison metrics, parquet spike schema |
| Kisame76/drosophila-brain-mlx | Shiu LIF on Apple MLX/Metal | MIT | v630, MaleCNS v1.0 | 2026-09-26 | 2 / 0 / 1 | 17 pytest files, no CI | fixed-spike-train Brian2 gate on an 800-neuron subnet: float64 NumPy oracle spike-for-spike identical to Brian2 2.10.1; float32 Metal lane within 5 % of spikes; 0.29 s per biological second on M4 Pro vs Brian2 Cython 2.07 s; degree-preserving shuffle; manifest records "constants fitted to FlyWire" | Apple-only, single author | borrow-ideas heavily: validation design, ref64 oracle, pack manifest, shuffle |
| seohyunjun/mps-malecns-model | MaleCNS LIF on PyTorch MPS via gather + index_add_ (no sparse tensors) |
none | MaleCNS | 2026-09-12 | 3 / 0 / 1 | 6 | float32; CPU/MPS not bit-identical (summation order) | slower than real time; unlicensed | confirms MPS edge-list approach |
| eonfathom/FastFly | CUDA/CuPy push-model LIF | none stated | v783 | 2026-02-27 | 11 | none | event-driven | NVIDIA only | ignore (note push idea) |
| TuragaLab/flyvis | task-trained DMN of the optic lobe (Lappalainen 2024) | MIT | optic lobe | 2026-08-06 (1.2.0) | 190 / 4 / 5 | yes | non-spiking, trained | different problem | borrow packaging/ensemble ideas |
| brandoncho369/flybench | 31 pre-registered behavioural tasks + shuffled controls on v783/MaleCNS | MIT | v783, MaleCNS | 2026-09-24 | 2 | tests, 3 workflows | n/a | no engine | borrow task list for YAML experiments |
| Others (mehrantsi/flyBrain Rust/Metal, Pronexsteam/brainlab, annel0/flybrain, snedea/flybrain JS, erojasoficial-byte/fly-brain, ruvnet/Connectome-OS, abgnydn/webgpu-fly, ~60 game/desktop-pet repos on awesome-fly) | hobby sims, Sept-2026 wave | mostly MIT | v783/MaleCNS | days–weeks old | – | rarely | none validated against Brian2 | – | ignore |
No JAX, Norse, snnTorch, Nengo, Lava, BindsNET or BrainPy port of the Shiu model exists on GitHub (searched 2026-09-26).
Substrate facts that fix the engine design (verified on this machine, torch 2.14.0, macOS 26.2, M4 Pro):
| Capability | CPU | MPS | Notes |
|---|---|---|---|
sparse COO torch.sparse.mm |
OK | OK (0.20 s for 200 k × 200 k, 3 M nnz × 32 cols) | |
| sparse CSR matmul | OK (0.015 s) | FAIL new_compressed_tensor NotImplementedError (pytorch #140941 closed-not-planned) |
CSR only on CPU/CUDA |
gather + index_add_ |
OK | OK (0.10 s) but non-deterministic under use_deterministic_algorithms(True) |
|
| float64 | OK | not supported | float64 oracle runs on CPU |
torch.mps.manual_seed + bernoulli |
– | OK | seedable Poisson drive |
| Brian2 | 2.10.1 (2025-12-05), Python ≥3.12, arm64 wheels, tested on Apple Silicon since 2.6.0 | – | Shiu pinned 2.5.1/py3.10 |
4. Long tail and naming
- flybrain: the PyPI name was taken on 2026-09-13 by a hobby monorepo (alextitonis/fly.ai); FlyBrainLab (BSD-3, Columbia) is dormant since 2025-09;
flybrainsis the navis transforms package. Nothing to build on. - connectome-lab: four unrelated 0-star repos from mid-2026; PyPI name free. Nothing to build on.
- awesome-fly (cobanov, CC0, 617 stars, 97 repos): a good discovery index with honest "prototype / not independently reproduced" labels. Its solid entries are the data clients above, connectome_interpreter, cocoa, flywire_annotations, drosophila_neurotransmitters, flygym, flyvis and flybody.
- PyPI 2025–26 sweep (46 MB simple index grepped): every "LIF/spiking" fly package is ≤0.2.0 and ≤2 weeks old;
connectome-kgis Elastic-2.0; the BBPconnectome-manipulator(Apache-2.0) has transferable rewiring ideas. - Name check:
flyconnis free on PyPI and conda-forge; two GitHub namesakes (TypeScript, 0 stars, 2026-09-15; R, 3 stars, 2022) have no releases or users.flyconnectomeis the Cambridge group's GitHub org,connectomixis fMRI tooling,flywiringimplies FlyWire affiliation. Keepflyconn(ADR-0005); fallbackdmelconn.
5. Licence map (matters for our own licence choice, ADR-0006)
| Permissive | Copyleft |
|---|---|
| neuprint-python (BSD-3), caveclient (MIT), connectome_interpreter (MIT), Shiu model (MIT), drosophila-brain-mlx (MIT), flyvis (MIT), sjcabs tutorial (MIT), flygym (Apache-2.0) | navis, navis-flybrains, fafbseg, cocoa, coconat*, malecns (R), bancr, connecto, banc: GPL-3.0; eonsystems fly-brain: GPL-2.0+; brian2cuda: GPL-3.0; Brian2: CeCILL-2.1 |
6. Gaps flyconn fills (and what it must not rebuild)
| Gap | Evidence | flyconn module |
|---|---|---|
| Offline, pinned, checksummed, harmonized Parquet/DuckDB store across MaleCNS v1.0 / FlyWire / hemibrain / MANC / BANC | no package exists; SJCABS is v0.9 and not a package; official files are Feather in three vocabularies | data (ADR-0001) |
| Uncertainty propagation: NT sampling, threshold sweeps, null models, version diffs | absent in every surveyed tool | uncertainty |
| Validated cross-platform (CPU/MPS/CUDA) seeded LIF engine with Brian2 parity | reference is a script; ports are Apple-only, CUDA-only, Euler, unseeded | sim (ADR-0004) |
| Declarative experiments with controls-by-default and standalone reports | flybench has the task-list idea; nobody has the runner/report | experiments, report |
| Tested cross-dataset type matching + L/R null | cocoa untested/GPL; coconatfly R | compare (ADR-0003) |
| Line → cell type with off-target evidence | no Python tool combines Meissner 2025 + NeuronBridge + connectome types | access (exploratory) |
Must not rebuild: neuPrint/CAVE clients, morphology and template transforms (navis/flybrains), effective-connectivity kernels and differentiable rate model (connectome_interpreter), Brian2 itself (used as the oracle).