DualExponV2#

class brainpy.dyn.DualExponV2(size, keep_size=False, sharding=None, method='exp_auto', name=None, mode=None, tau_decay=10.0, tau_rise=1.0)[source]#

Dual exponential synapse model.

The dual exponential synapse model [1], also named as difference of two exponentials model, is given by:

\[g_{\mathrm{syn}}(t)=g_{\mathrm{max}} \frac{\tau_{1} \tau_{2}}{ \tau_{1}-\tau_{2}}\left(\exp \left(-\frac{t-t_{0}}{\tau_{1}}\right) -\exp \left(-\frac{t-t_{0}}{\tau_{2}}\right)\right)\]

where \(\tau_1\) is the time constant of the decay phase, \(\tau_2\) is the time constant of the rise phase, \(t_0\) is the time of the pre-synaptic spike, \(g_{\mathrm{max}}\) is the maximal conductance.

This module can be used with interface brainpy.dyn.ProjAlignPreMg2, as shown in the following example:

import numpy as np
import brainpy as bp
import brainpy.math as bm

import matplotlib.pyplot as plt


class DualExponV2SparseCOBA(bp.Projection):
    def __init__(self, pre, post, delay, prob, g_max, tau_decay, tau_rise, E):
        super().__init__()

        self.proj = bp.dyn.ProjAlignPreMg2(
            pre=pre,
            delay=delay,
            syn=bp.dyn.DualExponV2.desc(pre.num, tau_decay=tau_decay, tau_rise=tau_rise),
            comm=bp.dnn.CSRLinear(bp.conn.FixedProb(prob, pre=pre.num, post=post.num), g_max),
            out=bp.dyn.COBA(E=E),
            post=post,
        )


class SimpleNet(bp.DynSysGroup):
    def __init__(self, syn_cls, E=0.):
        super().__init__()
        self.pre = bp.dyn.SpikeTimeGroup(1, indices=(0, 0, 0, 0), times=(10., 30., 50., 70.))
        self.post = bp.dyn.LifRef(1, V_rest=-60., V_th=-50., V_reset=-60., tau=20., tau_ref=5.,
                                  V_initializer=bp.init.Constant(-60.))
        self.syn = syn_cls(self.pre, self.post, delay=None, prob=1., g_max=1., tau_decay=5., tau_rise=1., E=E)

    def update(self):
        self.pre()
        self.syn()
        self.post()
        # monitor the following variables
        conductance = self.syn.proj.refs['syn'].g_rise
        current = self.post.sum_inputs(self.post.V)
        return conductance, current, self.post.V




indices = np.arange(1000)  # 100 ms, dt= 0.1 ms
net = SimpleNet(DualExponV2SparseCOBAPost, E=0.)
conductances, currents, potentials = bm.for_loop(net.step_run, indices, progress_bar=True)
ts = indices * bm.get_dt()
fig, gs = bp.visualize.get_figure(1, 3, 3.5, 4)
fig.add_subplot(gs[0, 0])
plt.plot(ts, conductances)
plt.title('Syn conductance')
fig.add_subplot(gs[0, 1])
plt.plot(ts, currents)
plt.title('Syn current')
fig.add_subplot(gs[0, 2])
plt.plot(ts, potentials)
plt.title('Post V')
plt.show()

Moreover, it can also be used with interface ProjAlignPostMg2:

class DualExponV2SparseCOBAPost(bp.Projection):
    def __init__(self, pre, post, delay, prob, g_max, tau_decay, tau_rise, E):
        super().__init__()

        self.proj = bp.dyn.ProjAlignPostMg2(
            pre=pre,
            delay=delay,
            comm=bp.dnn.EventCSRLinear(bp.conn.FixedProb(prob, pre=pre.num, post=post.num), g_max),
            syn=bp.dyn.DualExponV2.desc(post.num, tau_decay=tau_decay, tau_rise=tau_rise),
            out=bp.dyn.COBA.desc(E=E),
            post=post,
        )
Parameters:
reset_state(batch_or_mode=None, **kwargs)[source]#

Reset function which resets local states in this model.

Simply speaking, this function should implement the logic of resetting of local variables in this node.

See https://brainpy.readthedocs.io/en/latest/tutorial_toolbox/state_resetting.html for details.

update(x=None)[source]#

The function to specify the updating rule.