Canonical cortical column — realized EdgeList viewer

Realized EdgeList only — no simulation re-run, no kernel change (Δscience=0). Hover neurons for layer / E/I / phenotype / H / degree / position. Toggle edges by category via checkboxes + legend. Standalone HTML — no server.

N=60 · edges=441 · layers=L1, L2 · cell types=E, PV · phenotype distinct=4 · H ownership=present (mean 1.7)

Configured → Realized (EdgeList is truth)

Left = what was requested in cfg.metadata (connectivity / circuit / compilation). Right = what model.params["edge_list"] materialized — the only place dynamics reads.

AspectConfigured specRealized EdgeList
N neurons60
Edges1 441 (realized EdgeList)
Mean in-degree7.35
Mean out-degree7.35
Weight— (configured within_gain)mean 0.1291 σ 0 min 0.1291 max 0.1291
Delayall zero (instantaneous) unique steps [0]
τ per edge[0.10000000149011612]
CategoriesE→E 441 · E→I 0 · I→E 0 · I→I 0
FF / FB / localFF 441 · FB 0 · local 0 (hierarchy ['A1', 'A2'])
Layers → counts{"L1": 30, "L2": 30}
Cell-type → counts{"E": 42, "PV": 18} phenotype distinct 4
Configured JSON (cfg.metadata slice)
{
  "circuit_connections": [
    {
      "name": "areaconn_0",
      "source": {
        "area": "A1",
        "layer": "L1",
        "cell_type": "E"
      },
      "target": {
        "area": "A2",
        "layer": "L2",
        "cell_type": "E"
      },
      "probability": 1.0,
      "weight": 0.12909944487358055,
      "sign": "excitatory",
      "mechanism": "monotonic_cable_synapse__dt0.1__0",
      "status": "compiled"
    }
  ],
  "circuit_mechanisms": [
    {
      "name": "monotonic_cable_synapse__dt0.1__0",
      "kind": "monotonic_cable_synapse",
      "params": {
        "tau_ms": 0.1
      },
      "status": "declared_not_compiled"
    }
  ],
  "connectivity_mode": "explicit",
  "connectivity_compilation": {
    "connectivity_mode": "explicit",
    "default_edge_count": 0,
    "declared_rule_edge_count": 441,
    "total_compiled_edge_count": 441
  }
}

Edge sampling cap for display: 600 per category, 2400 total. Histograms sampled from up to 441 edges with deterministic seed.

Edge toggles — E→E / E→I / I→E / I→I / FF / FB

FF = cross-area low→high in hierarchy ['A1', 'A2']; FB = high→low. Local = same-area (0 edges) not toggled separately — it is inside the E→E etc. categories. For single-area columns FF/FB are zero by construction.

3D column — layers · E/I class · position · phenotype · H ownership · degree (hover)

Rotate/drag to inspect depth (z). Layer colors via legend — click legend entries to isolate a layer. Neuron symbols: E circle, I diamond (same hue per layer). Hover shows H, in/out-degree, phenotype, position.

Weight stats (realized)

Mean 0.1291 σ 0 · by category: E→E 0.1291 · E→I — · I→E — · I→I —

Delay stats (steps)

All delays zero — instantaneous kernel · unique steps [0]

Degree stats

Mean in 7.35 max 21 · mean out 7.35 max 21

Layer × E/I degree (mean)

Phenotype heatmap — layer × cell type counts

Phenotype & H ownership

Phenotype (layer/cell_type) distinct4 · {"L1/E": 21, "L1/PV": 9, "L2/E": 21, "L2/PV": 9}
Cell-type counts{"E": 42, "PV": 18} — E/I split: E 42 / I 18
Layer counts{"L1": 30, "L2": 30}
H ownership{'present': True, 'enabled': True, 'mean': 1.7, 'note': ''} — per-neuron H histogram below

How to verify

import jaxfne as jtfne
from jaxfne.vis.column_viewer import render_column_viewer, collect_column_viewer_data
cfg = jtfne.build_laminar_column(n=1000, ei_profile="canonical")
cfg = cfg.set_emitter("izhikevich","cortical_eig").probes(["spikes"],n_contacts=16).field(domain="laminar_column", conductivity="proxy", boundary="mean_zero_neumann")
model = jtfne.construct(cfg)
data = collect_column_viewer_data(model)  # no simulation, reads realized EdgeList
render_column_viewer(model, output_path="artifacts/column_viewer_canonical_1000n.html")
# Check: data["realized"]["n_edges"] == int(model.params["edge_list"].n_edges)
# and edge_category_counts sum to n_edges.

No kernel or sampler was changed to build this viewer. The HTML is self-contained (Plotly.js via CDN) — open it in a browser, no Python server needed. Re-render with any Model (laminar, multi-area, neuronal tensor, HDP) without re-running a simulation.