CoombesByrneStep#

class brainmass.CoombesByrneStep(in_size, Delta=1.0, eta=2.0, k=1.0, v_syn=-4.0, init_r=Constant(value=0.1), init_v=Constant(value=0.0), noise_r=None, noise_v=None, method='exp_euler')#

Coombes-Byrne next-generation neural mass model (2D).

Exact mean-field reduction of an infinite population of all-to-all coupled quadratic-integrate-and-fire (QIF) / \(\theta\)-neurons with conductance-based synapses, obtained through the Ott-Antonsen ansatz [1]. Like the Montbrio-Pazo-Roxin model (MontbrioPazoRoxinStep) it tracks the population firing rate \(r(t)\) and mean membrane potential \(v(t)\), but it adds a synaptic conductance proportional to the firing rate, \(g = \kappa\,\pi\,r\), which couples reciprocally into both equations:

\[\begin{split}\begin{aligned} \dot r(t) &= \frac{\Delta}{\pi} + 2\,v\,r - g\,r, \\ \dot v(t) &= v^2 - (\pi r)^2 + \eta + (v_{\mathrm{syn}} - v)\,g + I(t), \end{aligned}\end{split}\]

with \(g = \kappa\,\pi\,r\). Here \(\Delta\) is the half-width at half-maximum of the Lorentzian background-excitability distribution, \(\eta\) the mean excitability, \(\kappa\) the synaptic conductance scale, \(v_{\mathrm{syn}}\) the synaptic reversal potential, and \(I(t)\) an external/coupling input to the mean potential.

The conductance term makes the rate equation quadratically damped in \(r\) (the \(-g\,r = -\kappa\pi r^2\) term), giving richer dynamics than the standard QIF mean field.

Parameters:
  • in_size (int | Sequence[int] | integer | Sequence[integer]) – Spatial shape of the population. An int or tuple of int; all parameters are broadcastable to this shape.

  • Delta (Callable | Array | ndarray | bool | number | bool | int | float | complex | Quantity | Param) – HWHM of the Lorentzian excitability distribution (dimensionless). Default is 1.0.

  • eta (Callable | Array | ndarray | bool | number | bool | int | float | complex | Quantity | Param) – Mean background excitability (dimensionless). Default is 2.0.

  • k (Callable | Array | ndarray | bool | number | bool | int | float | complex | Quantity | Param) – Synaptic conductance scaling \(\kappa\) (dimensionless). Setting k = 0 removes the conductance and recovers the Montbrio-Pazo-Roxin field with J = 0. Default is 1.0.

  • v_syn (Callable | Array | ndarray | bool | number | bool | int | float | complex | Quantity | Param) – Synaptic reversal potential \(v_{\mathrm{syn}}\) (dimensionless). Default is -4.0.

  • init_r (Callable) – Initializer for the firing-rate state r. Default is braintools.init.Constant(0.1).

  • init_v (Callable) – Initializer for the mean-potential state v. Default is braintools.init.Constant(0.0).

  • noise_r (Noise) – Additive noise process for the rate dynamics. If provided, its output is added to r_inp at each update. Default is None.

  • noise_v (Noise) – Additive noise process for the potential dynamics. If provided, its output is added to v_inp at each update. Default is None.

  • method (str) – Integration method. Either 'exp_euler' (default) or any method in braintools.quad (e.g. 'rk4', 'rk2', 'heun').

Return type:

Any

r#

Population firing rate (dimensionless). Shape (batch?,) + in_size.

Type:

brainstate.HiddenState

v#

Population mean membrane potential (dimensionless).

Type:

brainstate.HiddenState

Notes

  • State variables are dimensionless; the per-variable right-hand sides returned by dr() / dv() carry unit 1/ms so an exponential-Euler step with dt in milliseconds is consistent (the same convention used by FitzHughNagumoStep).

  • Relationship to Montbrio-Pazo-Roxin. With \(\kappa = 0\) the conductance \(g\) vanishes and the equations collapse to \(\dot r = \Delta/\pi + 2vr\), \(\dot v = v^2 - (\pi r)^2 + \eta + I\), i.e. MontbrioPazoRoxinStep with recurrent coupling J = 0 (at unit time constant). The conductance regime (k > 0) is what distinguishes the next-generation mass.

  • The model can equivalently be written in the complex Kuramoto-Daido form via \(Z = (1 - \bar W)/(1 + \bar W)\) with \(\bar W = \pi r - i v\); this implementation uses the real (r, v) coordinates.

References

Examples

>>> import brainmass
>>> import brainstate
>>> import brainunit as u
>>> model = brainmass.CoombesByrneStep(in_size=1)
>>> _ = brainstate.nn.init_all_states(model)
>>> with brainstate.environ.context(dt=0.1 * u.ms):
...     r = model.update()
>>> r.shape
(1,)
__init__(in_size, Delta=1.0, eta=2.0, k=1.0, v_syn=-4.0, init_r=Constant(value=0.1), init_v=Constant(value=0.0), noise_r=None, noise_v=None, method='exp_euler')[source]#
Parameters:
derivative(state, t, r_ext, v_ext)[source]#
dr(r, v, r_ext)[source]#

Right-hand side for the firing rate r.

Parameters:
  • r (array-like) – Current firing rate (dimensionless).

  • v (array-like) – Current mean membrane potential (dimensionless), broadcastable to r.

  • r_ext (array-like or scalar) – External input to the rate equation (includes noise if enabled).

Returns:

Time derivative dr/dt with unit 1/ms.

Return type:

array-like

dv(v, r, v_ext)[source]#

Right-hand side for the mean membrane potential v.

Parameters:
  • v (array-like) – Current mean membrane potential (dimensionless).

  • r (array-like) – Current firing rate (dimensionless), broadcastable to v.

  • v_ext (array-like or scalar) – External input to the potential equation (includes noise/coupling if enabled).

Returns:

Time derivative dv/dt with unit 1/ms.

Return type:

array-like

init_state(batch_size=None, **kwargs)[source]#

Allocate firing-rate and mean-potential states.

Parameters:

batch_size (int or None, optional) – Optional leading batch dimension. If None, no batch dimension is used. Default is None.

update(r_inp=None, v_inp=None)[source]#

Advance the population by one time step.

Parameters:
  • r_inp (array-like or scalar or None, optional) – External input to the rate equation. If None, treated as zero. If noise_r is set, its output is added. Default is None.

  • v_inp (array-like or scalar or None, optional) – External input to the potential equation (the coupling port). If None, treated as zero. If noise_v is set, its output is added. Default is None.

Returns:

The updated firing rate r (the coupling observable), same shape as the internal state.

Return type:

array-like