Ejemplo n.º 1
0
def test_cls_func_hh1_2():
    class HH(bp.NeuGroup):
        def __init__(self,
                     size,
                     ENa=50.,
                     EK=-77.,
                     EL=-54.387,
                     C=1.0,
                     gNa=120.,
                     gK=36.,
                     gL=0.03,
                     V_th=20.,
                     **kwargs):
            super(HH, self).__init__(size=size, **kwargs)

            # parameters
            self.ENa = ENa
            self.EK = EK
            self.EL = EL
            self.C = C
            self.gNa = gNa
            self.gK = gK
            self.gL = gL
            self.V_th = V_th

            # variable
            self.input = bp.math.numpy.Variable(np.zeros(size))

            # integral
            self.integral = bp.odeint(method='rk4', f=self.derivaitve)

        def derivaitve(self, V, m, h, n, t):
            alpha = 0.1 * (V + 40) / (1 - np.exp(-(V + 40) / 10))
            beta = 4.0 * np.exp(-(V + 65) / 18)
            dmdt = alpha * (1 - m) - beta * m

            alpha = 0.07 * np.exp(-(V + 65) / 20.)
            beta = 1 / (1 + np.exp(-(V + 35) / 10))
            dhdt = alpha * (1 - h) - beta * h

            alpha = 0.01 * (V + 55) / (1 - np.exp(-(V + 55) / 10))
            beta = 0.125 * np.exp(-(V + 65) / 80)
            dndt = alpha * (1 - n) - beta * n

            I_Na = (self.gNa * m**3.0 * h) * (V - self.ENa)
            I_K = (self.gK * n**4.0) * (V - self.EK)
            I_leak = self.gL * (V - self.EL)
            dVdt = (-I_Na - I_K - I_leak + self.input) / self.C

            return dVdt, dmdt, dhdt, dndt

    hh = HH(10)

    r = _jit_cls_func(hh.derivaitve, show_code=True)
    print(r)
Ejemplo n.º 2
0
def test_cls_func_hh1():
    class HH(bp.NeuGroup):
        target_backend = 'numpy'

        def __init__(self,
                     size,
                     ENa=50.,
                     EK=-77.,
                     EL=-54.387,
                     C=1.0,
                     gNa=120.,
                     gK=36.,
                     gL=0.03,
                     V_th=20.,
                     **kwargs):
            super(HH, self).__init__(size=size, **kwargs)

            # parameters
            self.ENa = ENa
            self.EK = EK
            self.EL = EL
            self.C = C
            self.gNa = gNa
            self.gK = gK
            self.gL = gL
            self.V_th = V_th

            # variables
            self.V = bp.math.numpy.Variable(np.ones(size) * -65.)
            self.m = bp.math.numpy.Variable(np.ones(size) * 0.5)
            self.h = bp.math.numpy.Variable(np.ones(size) * 0.6)
            self.n = bp.math.numpy.Variable(np.ones(size) * 0.32)
            self.spike = bp.math.numpy.Variable(np.zeros(size, dtype=bool))
            self.input = bp.math.numpy.Variable(np.zeros(size))

            # integral
            self.integral = bp.odeint(method='rk4', f=self.derivaitve)

        def derivaitve(self, V, m, h, n, t, Iext):
            alpha = 0.1 * (V + 40) / (1 - np.exp(-(V + 40) / 10))
            beta = 4.0 * np.exp(-(V + 65) / 18)
            dmdt = alpha * (1 - m) - beta * m

            alpha = 0.07 * np.exp(-(V + 65) / 20.)
            beta = 1 / (1 + np.exp(-(V + 35) / 10))
            dhdt = alpha * (1 - h) - beta * h

            alpha = 0.01 * (V + 55) / (1 - np.exp(-(V + 55) / 10))
            beta = 0.125 * np.exp(-(V + 65) / 80)
            dndt = alpha * (1 - n) - beta * n

            I_Na = (self.gNa * m**3.0 * h) * (V - self.ENa)
            I_K = (self.gK * n**4.0) * (V - self.EK)
            I_leak = self.gL * (V - self.EL)
            dVdt = (-I_Na - I_K - I_leak + Iext) / self.C

            return dVdt, dmdt, dhdt, dndt

        def update(self, _t, _i):
            V, m, h, n = self.integral(self.V, self.m, self.h, self.n, _t,
                                       self.input)
            self.spike[:] = (self.V < self.V_th) * (V >= self.V_th)
            self.V[:] = V
            self.m[:] = m
            self.h[:] = h
            self.n[:] = n
            self.input[:] = 0.

    hh = HH(10)

    r = _jit_cls_func(hh.update, show_code=True)
    pprint(r['func'])
    pprint('arguments:')
    pprint(r['arguments'])
    pprint('arg2call:')
    pprint(r['arg2call'])
    pprint('nodes:')
    pprint(r['nodes'])
Ejemplo n.º 3
0
def test_container1():
    class HH(bp.NeuGroup):
        def __init__(self,
                     size,
                     ENa=50.,
                     EK=-77.,
                     EL=-54.387,
                     C=1.0,
                     gNa=120.,
                     gK=36.,
                     gL=0.03,
                     V_th=20.,
                     **kwargs):
            # parameters
            self.ENa = ENa
            self.EK = EK
            self.EL = EL
            self.C = C
            self.gNa = bp.math.numpy.Variable(gNa)
            self.gK = gK
            self.gL = gL
            self.V_th = bp.math.numpy.Variable(V_th)

            # variables
            self.V = bp.math.numpy.Variable(np.ones(size) * -65.)
            self.m = bp.math.numpy.Variable(np.ones(size) * 0.5)
            self.h = bp.math.numpy.Variable(np.ones(size) * 0.6)
            self.n = bp.math.numpy.Variable(np.ones(size) * 0.32)
            self.spike = bp.math.numpy.Variable(np.zeros(size, dtype=bool))
            self.input = bp.math.numpy.Variable(np.zeros(size))

            super(HH, self).__init__(size=size, **kwargs)

        @bp.odeint(method='rk4')
        def integral(self, V, m, h, n, t, Iext):
            alpha = 0.1 * (V + 40) / (1 - np.exp(-(V + 40) / 10))
            beta = 4.0 * np.exp(-(V + 65) / 18)
            dmdt = alpha * (1 - m) - beta * m

            alpha = 0.07 * np.exp(-(V + 65) / 20.)
            beta = 1 / (1 + np.exp(-(V + 35) / 10))
            dhdt = alpha * (1 - h) - beta * h

            alpha = 0.01 * (V + 55) / (1 - np.exp(-(V + 55) / 10))
            beta = 0.125 * np.exp(-(V + 65) / 80)
            dndt = alpha * (1 - n) - beta * n

            I_Na = (self.gNa * m**3.0 * h) * (V - self.ENa)
            I_K = (self.gK * n**4.0) * (V - self.EK)
            I_leak = self.gL * (V - self.EL)
            dVdt = (-I_Na - I_K - I_leak + Iext) / self.C

            return dVdt, dmdt, dhdt, dndt

        def update(self, _t, _i):
            V, m, h, n = self.integral(self.V, self.m, self.h, self.n, _t,
                                       self.input)
            self.spike[:] = (self.V < self.V_th) * (V >= self.V_th)
            self.V[:] = V
            self.m[:] = m
            self.h[:] = h
            self.n[:] = n
            self.input[:] = 0.

    class AMPA_vec(bp.TwoEndConn):
        def __init__(self,
                     pre,
                     post,
                     conn,
                     delay=0.,
                     g_max=0.10,
                     E=0.,
                     tau=2.0,
                     **kwargs):
            super(AMPA_vec, self).__init__(pre=pre, post=post, **kwargs)

            # parameters
            self.g_max = g_max
            self.E = E
            self.tau = tau
            self.delay = delay

            # connections
            self.conn = conn(pre.size, post.size)
            self.pre_ids, self.post_ids = conn.requires('pre_ids', 'post_ids')
            self.size = len(self.pre_ids)

            # data
            self.s = bp.math.numpy.Variable(np.zeros(self.size))
            self.g = self.register_constant_delay('g',
                                                  size=self.size,
                                                  delay=delay)

        @bp.odeint
        def int_s(self, s, t):
            return -s / self.tau

        def update(self, _t, _i):
            for i in range(self.size):
                pre_id = self.pre_ids[i]
                self.s[i] = self.int_s(self.s[i], _t)
                self.s[i] += self.pre.spike[pre_id]
                self.g.push(i, self.g_max * self.s[i])
                post_id = self.post_ids[i]
                self.post.input[post_id] -= self.g.pull(i) * (
                    self.post.V[post_id] - self.E)

    hh = HH(10)
    ampa = AMPA_vec(pre=hh, post=hh, conn=bp.connect.All2All(), delay=10.)
    net = bp.Network(hh, ampa)

    r = _jit_cls_func(net.update, show_code=True)
    pprint(r['func'])
    pprint('arguments:')
    pprint(r['arguments'])
    pprint('arg2call:')
    pprint(r['arg2call'])
    pprint('nodes:')
    pprint(r['nodes'])