Source code for brainpy._src.dyn.projections.vanilla

from typing import Optional

from brainpy import math as bm, check
from brainpy._src.dynsys import DynamicalSystem, Projection
from brainpy._src.mixin import (JointType, BindCondData)

__all__ = [
  'VanillaProj',
]


[docs] class VanillaProj(Projection): """Synaptic projection which defines the synaptic computation with the dimension of pre-synaptic neuron group. **Code Examples** To simulate an E/I balanced network model: .. code-block:: class EINet(bp.DynSysGroup): def __init__(self): super().__init__() self.N = bp.dyn.LifRef(4000, V_rest=-60., V_th=-50., V_reset=-60., tau=20., tau_ref=5., V_initializer=bp.init.Normal(-55., 2.)) self.delay = bp.VarDelay(self.N.spike, entries={'I': None}) self.syn1 = bp.dyn.Expon(size=3200, tau=5.) self.syn2 = bp.dyn.Expon(size=800, tau=10.) self.E = bp.dyn.VanillaProj(comm=bp.dnn.JitFPHomoLinear(3200, 4000, prob=0.02, weight=0.6), out=bp.dyn.COBA(E=0.), post=self.N) self.I = bp.dyn.VanillaProj(comm=bp.dnn.JitFPHomoLinear(800, 4000, prob=0.02, weight=6.7), out=bp.dyn.COBA(E=-80.), post=self.N) def update(self, input): spk = self.delay.at('I') self.E(self.syn1(spk[:3200])) self.I(self.syn2(spk[3200:])) self.delay(self.N(input)) return self.N.spike.value model = EINet() indices = bm.arange(1000) spks = bm.for_loop(lambda i: model.step_run(i, 20.), indices) bp.visualize.raster_plot(indices, spks, show=True) Args: comm: The synaptic communication. out: The synaptic output. post: The post-synaptic neuron group. name: str. The projection name. mode: Mode. The computing mode. """ def __init__( self, comm: DynamicalSystem, out: JointType[DynamicalSystem, BindCondData], post: DynamicalSystem, name: Optional[str] = None, mode: Optional[bm.Mode] = None, ): super().__init__(name=name, mode=mode) # synaptic models check.is_instance(comm, DynamicalSystem) check.is_instance(out, JointType[DynamicalSystem, BindCondData]) check.is_instance(post, DynamicalSystem) self.comm = comm # output initialization post.add_inp_fun(self.name, out) # references self.refs = dict(post=post, out=out) # invisible to ``self.nodes()`` self.refs['comm'] = comm # unify the access
[docs] def update(self, x): current = self.comm(x) self.refs['out'].bind_cond(current) return current