multiscale
multiscale
Flatten a multi-scale reservoir SimulationExperiment to a flat one (Python).
Lowering strategy for Experiment A (per-region reservoirs): a network of R macro regions, each hosting an n-unit reservoir (Node.subnetwork with a RandomReservoir generator) coupled long-range through the empirical SC, is compiled into a single flat R·n-node scalar network plus a global weight matrix that the existing tvboptim backend runs unchanged. No vector-state machinery in the templates — the multi-scale structure is resolved entirely in Python (the chosen “flatten in Python” approach).
The reservoir multi-scale pattern this handles
Inner unit dynamics (leaky-integrator + activation of recurrence + drive)::
dx/dt = (1/tau) * (-x + act(W_int @ x + sc_drive))
with the cross-layer edges forming a linear down/up coupling:
- downward (
source_network: ".."):sc_drive = W_in ⊙ (kappa · SC @ x_bar)— the parent’s long-range signal, scaled by a per-unit projectionW_in; - upward mean-pool (
target_network: "..",rhs: mean(x)):x_barfeeds the macro coupling; - (optional) upward trained readout
W_out @ x— ignored for free-running.
Because both the recurrence (W_int @ x) and the cross-region drive are linear in the units’ states and enter the same activation, they fold into one global matrix via Kronecker structure::
W_global = kron(I_R, W_int) + (kappa / n) · kron(SC, outer(W_in, 1ₙ))
dX/dt = (1/tau) · (-X + act(W_global @ X)) # X ∈ ℝ^{R·n}
The flat model is a scalar leaky-integrator whose coupling enters inside the activation. flatten_reservoir validates the spec matches this pattern and raises otherwise — it is a principled lowering of a well-defined model class, not a general arbitrary-coupling compiler (that would be the Stage-3 codegen engine emitting the procedure on-device).
Classes
| Name | Description |
|---|---|
| FlatReservoir | Result of flattening: ready-to-run flat experiment pieces. |
FlatReservoir
multiscale.FlatReservoir(
dynamics,
coupling,
integration,
weights,
n_units,
n_regions,
tau,
activation,
)Result of flattening: ready-to-run flat experiment pieces.
Functions
| Name | Description |
|---|---|
| flatten_reservoir | Flatten a per-region-reservoir experiment dict into a flat scalar model. |
flatten_reservoir
multiscale.flatten_reservoir(exp, n_override=None, max_flat_nodes=12000)Flatten a per-region-reservoir experiment dict into a flat scalar model.
exp is the parsed Experiment-A YAML (a plain dict). n_override optionally shrinks the reservoir size for a fast demonstration run (the full n from the spec is memory-heavy: W_global is dense (R·n)²).
max_flat_nodes caps the flat node count R·n before the dense (R·n)² float64 W_global is allocated. Because memory grows quadratically, a full-n reservoir over a whole-brain SC can exhaust RAM (this lowering has OOM-crashed a machine). Exceeding the cap raises with the projected allocation size; pass a larger value — or None to disable — once the memory is known to be available.