HalfProjAlignPost

HalfProjAlignPost#

class brainpy.dyn.HalfProjAlignPost(comm, syn, out, post, out_label=None, name=None, mode=None)[source]#

Defining the half-part of synaptic projection with the align-post reduction.

The half-part means that the model only needs to provide half information needed for a projection, including comm -> syn -> out -> post. Therefore, the model’s update function needs the manual providing of the spiking input.

The align-post means that the synaptic variables have the same dimension as the post-synaptic neuron group.

All align-post projection models prefer to use the event-driven computation mode. This means that the comm model should be the event-driven model.

To simulate an E/I balanced network:

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.E = bp.dyn.HalfProjAlignPost(comm=bp.dnn.EventJitFPHomoLinear(3200, 4000, prob=0.02, weight=0.6),
                                   syn=bp.dyn.Expon(size=4000, tau=5.),
                                   out=bp.dyn.COBA(E=0.),
                                   post=self.N)
    self.I = bp.dyn.HalfProjAlignPost(comm=bp.dnn.EventJitFPHomoLinear(800, 4000, prob=0.02, weight=6.7),
                                   syn=bp.dyn.Expon(size=4000, tau=10.),
                                   out=bp.dyn.COBA(E=-80.),
                                   post=self.N)

  def update(self, input):
    spk = self.delay.at('I')
    self.E(spk[:3200])
    self.I(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)
Parameters:
update(x)[source]#

The function to specify the updating rule.