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=1,000 · edges=999,000 · layers=L1, L2/3, L4, L5, L6 · cell types=E, PV, SST, VIP · phenotype distinct=18 · H ownership=no H (equilibrium 1.0, HDP disabled)

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 neurons1000
Edgesspec: see configured 999,000 (realized EdgeList)
Mean in-degree999
Mean out-degree999
Weight0.45 (configured within_gain)mean 0.002798 σ 0.01033 min -0.04268 max 0.04267
Delayall zero (instantaneous) unique steps [0]
τ per edge[2.0, 5.0]
CategoriesE→E 430,992 · E→I 225,351 · I→E 225,351 · I→I 117,306
FF / FB / localFF 0 · FB 0 · local 999,000 (hierarchy ['V1'])
Layers → counts{ "L1": [ 0.0, 0.1 ], "L2/3": [ 0.1, 0.55 ], "L4": [ 0.55, 0.65 ], "L5": [ 0.65, 0.85 ], "L6": [ 0.85, 1.0 ] }{"L1": 100, "L2/3": 450, "L4": 100, "L5": 200, "L6": 150}
Cell-type → counts{"E": 657, "PV": 147, "SST": 91, "VIP": 105} phenotype distinct 18
Configured JSON (cfg.metadata slice)
{
  "connectivity": {
    "within_area": "all_to_all_uniform_random",
    "within_gain": 0.45
  },
  "canonical_biophysics": true,
  "layer_fractions": {
    "L1": [
      0.0,
      0.1
    ],
    "L2/3": [
      0.1,
      0.55
    ],
    "L4": [
      0.55,
      0.65
    ],
    "L5": [
      0.65,
      0.85
    ],
    "L6": [
      0.85,
      1.0
    ]
  },
  "layer_cell_types": {
    "L1": {
      "E": 0.5,
      "PV": 0.05,
      "SST": 0.1,
      "VIP": 0.35
    },
    "L2/3": {
      "E": 0.5,
      "PV": 0.25,
      "SST": 0.13,
      "VIP": 0.12
    },
    "L4": {
      "E": 0.7,
      "PV": 0.2,
      "SST": 0.05,
      "VIP": 0.05
    },
    "L5": {
      "E": 0.85,
      "PV": 0.05,
      "SST": 0.05,
      "VIP": 0.05
    },
    "L6": {
      "E": 0.95,
      "PV": 0.0,
      "SST": 0.05,
      "VIP": 0.0
    }
  }
}

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

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

FF = cross-area low→high in hierarchy ['V1']; FB = high→low. Local = same-area (999,000 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.002798 σ 0.01033 · by category: E→E 0.008906 · E→I 0.01057 · I→E -0.01057 · I→I -0.0089

Delay stats (steps)

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

Degree stats

Mean in 999 max 999 · mean out 999 max 999

Layer × E/I degree (mean)

Phenotype heatmap — layer × cell type counts

Phenotype & H ownership

Phenotype (layer/cell_type) distinct18 · {"L1/E": 50, "L1/PV": 5, "L1/SST": 10, "L1/VIP": 35, "L2/3/E": 225, "L2/3/PV": 112, "L2/3/SST": 58, "L2/3/VIP": 55, "L4/E": 70, "L4/PV": 20, "L4/SST": 5, "L4/VIP": 5, "L5/E": 170, "L5/PV": 10, "L5/SST": 10, "L5/VIP": 10, "L6/E": 142, "L6/SST": 8}
Cell-type counts{"E": 657, "PV": 147, "SST": 91, "VIP": 105} — E/I split: E 657 / I 343
Layer counts{"L1": 100, "L2/3": 450, "L4": 100, "L5": 200, "L6": 150}
H ownership{'present': False, 'enabled': False, 'mean': None, 'note': ''} — equilibrium (model.params has no hdp_initial_H)

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.