brian2
adapters.brian2
Native Brian2 backend for small-scale spiking networks.
Consumes the shared small-scale lowering core (:mod:tvbo.adapters.smallscale) and emits a Brian2 point-neuron network. The maths is printed through the shared SymPy printer (render_expression(..., format="brian2")); this adapter adds only the Brian2 role vocabulary and the synapse rendering.
Two connectivity lowerings, chosen per edge by the connectivity rule:
all_to_all → O(N) population sums. Every post-synaptic neuron sees the same sum over pre-synaptic gating, so the gate lives on the pre-synaptic neuron and a size-1 “hub” NeuronGroup accumulates the population sum once (via a (summed) Synapses), read by every post-synaptic neuron through a linked_var. This is the hand-written Deco 2014 deco_column.py structure — it runs the 160E+40I column in seconds where the enumerated LEMS network needs ~190 s per 100 ms in jLEMS.
random / one_to_one → real sparse Synapses. A genuinely sparse projection cannot be a single population sum (each target sees a different subset), so it is emitted as a Brian2 Synapses with connect(p=…) / connect(j='i'). Following the canonical Brian2 idioms: the delivered conductance decays on the post-synaptic NeuronGroup (dg/dt=-g/tau) and is incremented event-driven by on_pre (spike-gated, not summed every step); short-term-plasticity state (u, x) lives on the synapse as (event-driven) variables, mutated in on_pre in the recipe’s declared order, so any facilitation/depression convention is honoured per connection.
Supported synapse forms
neuroml:expOneSynapse— single-exponential conductance (AMPA, GABA), either lowering;- a custom conductance synapse extending
baseConductanceBasedSynapsewhose current is linear in a single gate: all_to_all lowers any such gate (e.g. the saturating NMDA with Mg block); the sparse path additionally requires that gate to be a pure decaying conductance (dg/dt=-g/tau), with the remaining state variables the per-synapse STP; neuroml:poissonFiringSynapse— independent Poisson background →PoissonInput.
Anything outside this set (non-Poisson spike sources, constant-current inputs, a summed-gate current nonlinear in its gate, or a sparse synapse whose gate is not a pure decay) raises a clear NotImplementedError rather than mis-simulating.
Classes
| Name | Description |
|---|---|
| Brian2Adapter | Render/run a small-scale spiking network natively in Brian2. |
Brian2Adapter
adapters.brian2.Brian2Adapter(experiment)Render/run a small-scale spiking network natively in Brian2.
Methods
| Name | Description |
|---|---|
| prepare_context | Reduce the experiment to a backend-neutral Brian2 build description. |
| run | Build and run the network in Brian2, returning an ExperimentResult. |
prepare_context
adapters.brian2.Brian2Adapter.prepare_context()Reduce the experiment to a backend-neutral Brian2 build description.
Returns a dict the template renders and _instantiate builds: populations (per cell pop: eqs data, namespace, poisson, size), hubs (summed-gate accumulators), duration_ms, dt_ms.
run
adapters.brian2.Brian2Adapter.run(
seed=None,
record_v=False,
codegen_target='numpy',
**kwargs,
)Build and run the network in Brian2, returning an ExperimentResult.
Population firing rates (from Brian2 SpikeMonitor) are the primary output — the exact quantity the Deco 2014 replication targets — and are exposed both as result.integration.observations.firing_rate_<pop> and, raw, under result._extras.
codegen_target defaults to "numpy" (no C compilation, portable); pass "cython" for the faster compiled path where the toolchain allows.
Functions
| Name | Description |
|---|---|
| assemble_eqs | The Brian2 Equations block for a cell population. |
| reset_code | The Brian2 reset statement: v reset plus pre-synaptic gate increments. |
assemble_eqs
adapters.brian2.assemble_eqs(pop)The Brian2 Equations block for a cell population.
Membrane ODE + a summed drive iSyn + the pre-synaptic gate ODEs (dimensionless) + any linked summed-gate variables. Shared by the in-process run path and the generated script so the two never diverge. A conductance-based cell’s drive is a current (amp); a current-based cell (one declaring a membrane time constant tau_m, whose membrane is (-v + ... + iSyn)/tau_m) has a voltage drive (volt) — the Mongillo/Amit-Brunel form.
reset_code
adapters.brian2.reset_code(pop)The Brian2 reset statement: v reset plus pre-synaptic gate increments.