예제 #1
0
def kuramotos_f():
	for i in range(n):
		coupling_sum = sum(
				sin(y(j)-y(i))
				for j in range(n)
				if A[j,i]
			)
		yield omega[i] + c/(n-1)*coupling_sum
예제 #2
0
	def f():
		for i in range(N):
			coupling_sum = sum( y(3*j)-y(3*i) for j in range(N) if A[i,j] )
			coupling_term = k * symengine.sin(t) * coupling_sum
			yield -ω[i] * y(3*i+1) - y(3*i+2) + coupling_term
			yield  ω[i] * y(3*i) + a*y(3*i+1)
			coupling_term_2 = k * (sum_z-N*y(3*i+2))
			yield b + y(3*i+2) * (y(3*i) - c) + coupling_term_2
예제 #3
0
 def f():
     for i in range(N):
         coupling_sum = sum(
             y(3 * j) - y(3 * i) for j in range(N) if A[i, j])
         coupling_term = k * symengine.sin(t) * coupling_sum
         yield -ω[i] * y(3 * i + 1) - y(3 * i + 2) + coupling_term
         yield ω[i] * y(3 * i) + a * y(3 * i + 1)
         coupling_term_2 = k * (sum_z - N * y(3 * i + 2))
         yield b + y(3 * i + 2) * (y(3 * i) - c) + coupling_term_2
예제 #4
0
def getData(train_data_ratio, trans_ratio):
    '''
        Integrates the rossler system, records the data into
        train_data, test_data based on train_data_ratio (train_data_length/total length of data)
        trans_ratio = (transience length/ total length of data)

        Returns: (train_data, test_data)
    '''
    # Lorenz equation for motion
    f = [
        10 * (y(1) - y(0)),
        y(0) * (28 - y(2)) - y(1),
        y(0) * y(1) - (8.0 / 3) * y(2)
    ]

    inital_state = 2.0 * (1 - 2 * np.random.random(3))
    ODE = jitcode(f)
    ODE.set_integrator("dopri5")
    ODE.set_initial_value(inital_state, 0.0)

    data = []
    times = np.arange(1000, 10000, 0.1)
    for time in times:
        data.append(ODE.integrate(time))

    data_arr = np.array(data)

    train_len = int(train_data_ratio * len(data_arr))
    trans_len = int(trans_ratio * len(data_arr))

    train_data = data_arr[0:train_len, :]
    test_data = data_arr[train_len + 1:, :]

    return train_data, test_data, trans_len
예제 #5
0
 def tearDown(self):
     if isinstance(self.ODE, jitcode) and self.ODE.f_sym():
         self.ODE.check()
     self.assertIsNotNone(self.ODE.f)
     assert_allclose(self.ODE.f(0.0, y0), f_of_y0, rtol=1e-5)
     if not self.ODE.jac is None:
         assert_allclose(self.ODE.jac(0.0, y0), jac_of_y0, rtol=1e-5)
     assert_allclose(self.ODE.integrate(1.0), y1, rtol=1e-4)
     for i in reversed(range(n)):
         assert_allclose(self.ODE.y_dict[y(i)], y1[i], rtol=1e-4)
예제 #6
0
 def __init__(self, n, para):
     # Put all the internal variables and instance specific constants here
     # Examples of varibales include Vm, gating variables, calcium ...etc
     # Constants can be variouse conductances, which can vary across
     # instances.
     i = n2i(n)  #integration variable index
     self.mem_pot = y(i)  # the jitcode y
     # self.m = y(i+1)
     # ... and stuff like that
     self.int_freq = para[0]
     self.dim = NUM_DIM_NEURON  # can vary across different types of neuron
예제 #7
0
 def set_integration_index(self, i):
     self.ii = i
     self.V = y(i)
     self.n = y(i + 1)
     self.s = y(i + 2)
     self.v = y(i + 3)
     self.q = y(i + 4)
     self.Ca = y(i + 5)
예제 #8
0
 def set_integration_index(self, i):
     self.ii = i
     self.V = y(i)
     self.m = y(i + 1)
     self.h = y(i + 2)
     self.n = y(i + 3)
     self.z = y(i + 4)
     self.u = y(i + 5)
예제 #9
0
 def set_integration_index(self, i):
     """
     Args:
         i: integration variable index
     """
     self.ii = i  # integration index
     self.v_mem = y(i)  # membrane potential
     self.m_gate = y(i + 1)
     self.n_gate = y(i + 2)
     self.h_gate = y(i + 3)
     self.a_gate = y(i + 4)
     self.b_gate = y(i + 5)
     self.calcium = y(i + 6)
예제 #10
0
    def dydt(self, pre_synapses,
             pre_neurons):  # a list of pre-synaptic neurons
        # define how neurons are coupled here
        VV = self.V
        mm = self.m
        hh = self.h
        nn = self.n
        i_inj = self.i_inj
        i_syn = sum(
            self.I_syn(VV, y(synapse.get_ind()),
                       synapse.get_params()[0],
                       synapse.get_params()[1], synapse.weight)
            for (i, synapse) in enumerate(pre_synapses))

        i_base = (self.I_Na(VV, mm, hh) + self.I_K(VV, nn) + self.I_L(VV) +
                  i_syn)

        yield -1 / self.C_m * (i_inj + i_base)
        yield self.dm_dt(VV, mm)
        yield self.dh_dt(VV, hh)
        yield self.dn_dt(VV, nn)
예제 #11
0
from jitcode import jitcode, y
import pdb

substances = Ca, Na, Ko = [y(i) for i in range(3)]
diffusion_rate = {Ca: 0.3, Na: 0.4, Ko: 0.5}


def diffusion_loss(substance):
    return -diffusion_rate[substance] * substance


pdb.set_trace()
f = {substance: diffusion_loss(substance) for substance in substances}
ODE = jitcode(f)
예제 #12
0
def Paci2018(tDrugApplication, INaFRedMed, ICaLRedMed, IKrRedMed, IKsRedMed):
    dY = [None] * 23

    VmaxUp = 0.5113  # millimolar_per_second (in calcium_dynamics)
    g_irel_max = 62.5434  # millimolar_per_second (in calcium_dynamics)
    RyRa1 = 0.05354  # uM
    RyRa2 = 0.0488  # uM
    RyRahalf = 0.02427  # uM
    RyRohalf = 0.01042  # uM
    RyRchalf = 0.00144  # uM
    kNaCa = 3917.0463  # A_per_F (in i_NaCa)
    PNaK = 2.6351  # A_per_F (in i_NaK)
    Kup = 3.1928e-4  # millimolar (in calcium_dynamics)
    V_leak = 4.7279e-4  # per_second (in calcium_dynamics)
    alpha = 2.5371  # dimensionless (in i_NaCa)

    ## Constants
    F = 96485.3415  # coulomb_per_mole (in model_parameters)
    R = 8.314472  # joule_per_mole_kelvin (in model_parameters)
    T = 310.0  # kelvin (in model_parameters)

    ## Cell geometry
    V_SR = 583.73  # micrometre_cube (in model_parameters)
    Vc = 8800.0  # micrometre_cube (in model_parameters)
    Cm = 9.87109e-11  # farad (in model_parameters)

    ## Extracellular concentrations
    Nao = 151.0  # millimolar (in model_parameters)
    Ko = 5.4  # millimolar (in model_parameters)
    Cao = 1.8  #3#5#1.8   # millimolar (in model_parameters)

    ## Intracellular concentrations
    # Naio = 10 mM y(17)
    Ki = 150.0  # millimolar (in model_parameters)
    # Cai  = 0.0002 mM y(2)
    # caSR = 0.3 mM y(1)

    # time (second)

    ## Nernst potential
    E_Na = R * T / F * symengine.log(Nao / y(17))
    E_Ca = 0.5 * R * T / F * symengine.log(Cao / y(2))

    E_K = R * T / F * log(Ko / Ki)
    PkNa = 0.03  # dimensionless (in electric_potentials)
    E_Ks = R * T / F * symengine.log((Ko + PkNa * Nao) / (Ki + PkNa * y(17)))

    ## INa
    g_Na = 3671.2302  # S_per_F (in i_Na)
    drug_no_drug_na = [
        g_Na * y(13)**3.0 * y(11) * y(12) * (y(0) - E_Na),
        INaFRedMed * g_Na * y(13)**3.0 * y(11) * y(12) * (y(0) - E_Na)
    ]
    i_Na = drug_no_drug_na[0]

    h_inf = 1.0 / symengine.sqrt(1.0 +
                                 symengine.exp((y(0) * 1000.0 + 72.1) / 5.7))
    alpha_h = 0.057 * symengine.exp(-(y(0) * 1000.0 + 80.0) / 6.8)
    beta_h = 2.7 * symengine.exp(
        0.079 * y(0) * 1000.0) + 3.1 * 10.0**5.0 * symengine.exp(
            0.3485 * y(0) * 1000.0)

    tau_h = sigmoid_generator(y(0), -0.0385, -1) * (1.5 / (
        (alpha_h + beta_h) * 1000.0)) + sigmoid_generator(
            y(0), -0.0385, 1) * (1.5 * 1.6947 / 1000.0)

    dY[11] = (h_inf - y(11)) / tau_h

    j_inf = 1.0 / symengine.sqrt(1.0 +
                                 symengine.exp((y(0) * 1000.0 + 72.1) / 5.7))
    alpha_j = sigmoid_generator(y(0), -0.04, -1) * (
        -25428.0 * symengine.exp(0.2444 * y(0) * 1000.0) - 6.948 * 10.0**-6.0 *
        symengine.exp(-0.04391 * y(0) * 1000.0)) * (y(0) * 1000.0 + 37.78) / (
            1.0 + symengine.exp(0.311 *
                                (y(0) * 1000.0 + 79.23))) + sigmoid_generator(
                                    y(0), -0.04, 1) * 0

    beta_j = sigmoid_generator(y(0), -0.04, -1) * (
        (0.02424 * symengine.exp(-0.01052 * y(0) * 1000) /
         (1 + symengine.exp(-0.1378 *
                            (y(0) * 1000 + 40.14))))) + sigmoid_generator(
                                y(0), -0.04, 1) * (
                                    (0.6 * symengine.exp(
                                        (0.057) * y(0) * 1000) /
                                     (1 + symengine.exp(-0.1 *
                                                        (y(0) * 1000 + 32)))))

    tau_j = 7.0 / ((alpha_j + beta_j) * 1000.0)
    dY[12] = (j_inf - y(12)) / tau_j

    m_inf = 1.0 / (1.0 + symengine.exp(
        (-y(0) * 1000.0 - 34.1) / 5.9))**(1.0 / 3.0)
    alpha_m = 1.0 / (1.0 + symengine.exp((-y(0) * 1000.0 - 60.0) / 5.0))
    beta_m = 0.1 / (1.0 + symengine.exp(
        (y(0) * 1000.0 + 35.0) / 5.0)) + 0.1 / (1.0 + symengine.exp(
            (y(0) * 1000.0 - 50.0) / 200.0))
    tau_m = 1.0 * alpha_m * beta_m / 1000.0
    dY[13] = (m_inf - y(13)) / tau_m

    ## INaL
    myCoefTauM = 1
    tauINaL = 200  #ms
    GNaLmax = 2.3 * 7.5  #(S/F)
    Vh_hLate = 87.61
    i_NaL = GNaLmax * y(18)**(3) * y(19) * (y(0) - E_Na)

    m_inf_L = 1 / (1 + symengine.exp(-(y(0) * 1000 + 42.85) / (5.264)))
    alpha_m_L = 1 / (1 + symengine.exp((-60 - y(0) * 1000) / 5))
    beta_m_L = 0.1 / (1 + symengine.exp(
        (y(0) * 1000 + 35) / 5)) + 0.1 / (1 + symengine.exp(
            (y(0) * 1000 - 50) / 200))
    tau_m_L = 1 / 1000 * myCoefTauM * alpha_m_L * beta_m_L
    dY[18] = (m_inf_L - y(18)) / tau_m_L

    h_inf_L = 1 / (1 + symengine.exp((y(0) * 1000 + Vh_hLate) / (7.488)))
    tau_h_L = 1 / 1000 * tauINaL
    dY[19] = (h_inf_L - y(19)) / tau_h_L

    ## If
    E_f = -0.017  # volt (in i_f)
    g_f = 30.10312  # S_per_F (in i_f)

    i_f = g_f * y(14) * (y(0) - E_f)
    i_fNa = 0.42 * g_f * y(14) * (y(0) - E_Na)

    Xf_infinity = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 77.85) / 5.0))
    tau_Xf = 1900.0 / (1.0 + symengine.exp(
        (y(0) * 1000.0 + 15.0) / 10.0)) / 1000.0
    dY[14] = (Xf_infinity - y(14)) / tau_Xf

    ## ICaL
    g_CaL = 8.635702e-5  # metre_cube_per_F_per_s (in i_CaL)
    drug_no_drug_CaL = [
        g_CaL * 4.0 * y(0) * F**2.0 / (R * T) *
        (y(2) * symengine.exp(2.0 * y(0) * F / (R * T)) - 0.341 * Cao) /
        (symengine.exp(2.0 * y(0) * F / (R * T)) - 1.0) * y(4) * y(5) * y(6) *
        y(7), ICaLRedMed * g_CaL * 4.0 * y(0) * F**2.0 / (R * T) *
        (y(2) * symengine.exp(2.0 * y(0) * F / (R * T)) - 0.341 * Cao) /
        (symengine.exp(2.0 * y(0) * F /
                       (R * T)) - 1.0) * y(4) * y(5) * y(6) * y(7)
    ]
    i_CaL = drug_no_drug_CaL[0]

    d_infinity = 1.0 / (1.0 + symengine.exp(-(y(0) * 1000.0 + 9.1) / 7.0))
    alpha_d = 0.25 + 1.4 / (1.0 + symengine.exp(
        (-y(0) * 1000.0 - 35.0) / 13.0))
    beta_d = 1.4 / (1.0 + symengine.exp((y(0) * 1000.0 + 5.0) / 5.0))
    gamma_d = 1.0 / (1.0 + symengine.exp((-y(0) * 1000.0 + 50.0) / 20.0))
    tau_d = (alpha_d * beta_d + gamma_d) * 1.0 / 1000.0
    dY[4] = (d_infinity - y(4)) / tau_d

    f1_inf = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 26.0) / 3.0))
    constf1 = sigmoid_generator(f1_inf - y(5), 0, 1) * 1.0 + 1433.0 * (
        y(2) - 50.0 * 1.0e-6) + sigmoid_generator(f1_inf - y(5), 0, -1) * 1.0

    tau_f1 = (20.0 + 1102.5 * symengine.exp(-(
        (y(0) * 1000.0 + 27.0)**2.0 / 15.0)**2.0) + 200.0 /
              (1.0 + symengine.exp((13.0 - y(0) * 1000.0) / 10.0)) + 180.0 /
              (1.0 + symengine.exp(
                  (30.0 + y(0) * 1000.0) / 10.0))) * constf1 / 1000.0
    dY[5] = (f1_inf - y(5)) / tau_f1

    f2_inf = 0.33 + 0.67 / (1.0 + symengine.exp((y(0) * 1000.0 + 32.0) / 4.0))
    constf2 = 1.0
    tau_f2 = (600.0 * symengine.exp(-(y(0) * 1000.0 + 25.0)**2.0 / 170.0) +
              31.0 / (1.0 + symengine.exp(
                  (25.0 - y(0) * 1000.0) / 10.0)) + 16.0 /
              (1.0 + symengine.exp(
                  (30.0 + y(0) * 1000.0) / 10.0))) * constf2 / 1000.0
    dY[6] = (f2_inf - y(6)) / tau_f2

    alpha_fCa = 1.0 / (1.0 + (y(2) / 0.0006)**8.0)
    beta_fCa = 0.1 / (1.0 + symengine.exp((y(2) - 0.0009) / 0.0001))
    gamma_fCa = 0.3 / (1.0 + symengine.exp((y(2) - 0.00075) / 0.0008))
    fCa_inf = (alpha_fCa + beta_fCa + gamma_fCa) / 1.3156
    constfCa = sigmoid_generator(y(0), -0.06, 1) * sigmoid_generator(
        fCa_inf, y(7), 1) * 0 + (sigmoid_generator(y(0), -0.06, -1) +
                                 sigmoid_generator(fCa_inf, y(7), -1)) * 1.0

    tau_fCa = 0.002  # second (in i_CaL_fCa_gate)
    dY[7] = constfCa * (fCa_inf - y(7)) / tau_fCa

    ## Ito
    g_to = 29.9038  # S_per_F (in i_to)
    i_to = g_to * (y(0) - E_K) * y(15) * y(16)

    q_inf = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 53.0) / 13.0))
    tau_q = (6.06 + 39.102 /
             (0.57 * symengine.exp(-0.08 * (y(0) * 1000.0 + 44.0)) +
              0.065 * symengine.exp(0.1 * (y(0) * 1000.0 + 45.93)))) / 1000.0
    dY[15] = (q_inf - y(15)) / tau_q

    r_inf = 1.0 / (1.0 + symengine.exp(-(y(0) * 1000.0 - 22.3) / 18.75))
    tau_r = (2.75352 + 14.40516 /
             (1.037 * symengine.exp(0.09 * (y(0) * 1000.0 + 30.61)) +
              0.369 * symengine.exp(-0.12 * (y(0) * 1000.0 + 23.84)))) / 1000.0
    dY[16] = (r_inf - y(16)) / tau_r

    ## IKs
    g_Ks = 2.041  # S_per_F (in i_Ks)
    drug_no_drug_Ks = [
        g_Ks * (y(0) - E_Ks) * y(10)**2.0 *
        (1.0 + 0.6 / (1.0 + (3.8 * 0.00001 / y(2))**1.4)),
        IKsRedMed * g_Ks * (y(0) - E_Ks) * y(10)**2.0 *
        (1.0 + 0.6 / (1.0 + (3.8 * 0.00001 / y(2))**1.4))
    ]
    i_Ks = drug_no_drug_Ks[0]

    Xs_infinity = 1.0 / (1.0 + symengine.exp((-y(0) * 1000.0 - 20.0) / 16.0))
    alpha_Xs = 1100.0 / symengine.sqrt(1.0 + symengine.exp(
        (-10.0 - y(0) * 1000.0) / 6.0))
    beta_Xs = 1.0 / (1.0 + symengine.exp((-60.0 + y(0) * 1000.0) / 20.0))
    tau_Xs = 1.0 * alpha_Xs * beta_Xs / 1000.0
    dY[10] = (Xs_infinity - y(10)) / tau_Xs

    ## IKr
    L0 = 0.025  # dimensionless (in i_Kr_Xr1_gate)
    Q = 2.3  # dimensionless (in i_Kr_Xr1_gate)
    g_Kr = 29.8667  # S_per_F (in i_Kr)
    drug_no_drug_Kr = [
        g_Kr * (y(0) - E_K) * y(8) * y(9) * sqrt(Ko / 5.4),
        IKrRedMed * g_Kr * (y(0) - E_K) * y(8) * y(9) * sqrt(Ko / 5.4)
    ]
    i_Kr = drug_no_drug_Kr[0]

    V_half = 1000.0 * (-R * T / (F * Q) * log(
        (1.0 + Cao / 2.6)**4.0 / (L0 * (1.0 + Cao / 0.58)**4.0)) - 0.019)

    Xr1_inf = 1.0 / (1.0 + symengine.exp((V_half - y(0) * 1000.0) / 4.9))
    alpha_Xr1 = 450.0 / (1.0 + symengine.exp((-45.0 - y(0) * 1000.0) / 10.0))
    beta_Xr1 = 6.0 / (1.0 + symengine.exp((30.0 + y(0) * 1000.0) / 11.5))
    tau_Xr1 = 1.0 * alpha_Xr1 * beta_Xr1 / 1000.0
    dY[8] = (Xr1_inf - y(8)) / tau_Xr1

    Xr2_infinity = 1.0 / (1.0 + symengine.exp((y(0) * 1000.0 + 88.0) / 50.0))
    alpha_Xr2 = 3.0 / (1.0 + symengine.exp((-60.0 - y(0) * 1000.0) / 20.0))
    beta_Xr2 = 1.12 / (1.0 + symengine.exp((-60.0 + y(0) * 1000.0) / 20.0))
    tau_Xr2 = 1.0 * alpha_Xr2 * beta_Xr2 / 1000.0
    dY[9] = (Xr2_infinity - y(9)) / tau_Xr2

    ## IK1
    alpha_K1 = 3.91 / (1.0 +
                       symengine.exp(0.5942 *
                                     (y(0) * 1000.0 - E_K * 1000.0 - 200.0)))
    beta_K1 = (-1.509 * symengine.exp(0.0002 *
                                      (y(0) * 1000.0 - E_K * 1000.0 + 100.0)) +
               symengine.exp(0.5886 * (y(0) * 1000.0 - E_K * 1000.0 - 10.0))
               ) / (1.0 + symengine.exp(0.4547 *
                                        (y(0) * 1000.0 - E_K * 1000.0)))
    XK1_inf = alpha_K1 / (alpha_K1 + beta_K1)
    g_K1 = 28.1492  # S_per_F (in i_K1)
    i_K1 = g_K1 * XK1_inf * (y(0) - E_K) * sqrt(Ko / 5.4)

    ## INaCa
    KmCa = 1.38  # millimolar (in i_NaCa)
    KmNai = 87.5  # millimolar (in i_NaCa)
    Ksat = 0.1  # dimensionless (in i_NaCa)
    gamma = 0.35  # dimensionless (in i_NaCa)
    kNaCa1 = kNaCa  # A_per_F (in i_NaCa)
    i_NaCa = kNaCa1 * (symengine.exp(gamma * y(0) * F /
                                     (R * T)) * y(17)**3.0 * Cao -
                       symengine.exp(
                           (gamma - 1.0) * y(0) * F /
                           (R * T)) * Nao**3.0 * y(2) * alpha) / (
                               (KmNai**3.0 + Nao**3.0) * (KmCa + Cao) *
                               (1.0 + Ksat * symengine.exp(
                                   (gamma - 1.0) * y(0) * F / (R * T))))

    ## INaK
    Km_K = 1.0  # millimolar (in i_NaK)
    Km_Na = 40.0  # millimolar (in i_NaK)
    PNaK1 = PNaK  # A_per_F (in i_NaK)
    i_NaK = PNaK1 * Ko / (Ko + Km_K) * y(17) / (y(17) + Km_Na) / (
        1.0 + 0.1245 * symengine.exp(-0.1 * y(0) * F / (R * T)) +
        0.0353 * symengine.exp(-y(0) * F / (R * T)))

    ## IpCa
    KPCa = 0.0005  # millimolar (in i_PCa)
    g_PCa = 0.4125  # A_per_F (in i_PCa)
    i_PCa = g_PCa * y(2) / (y(2) + KPCa)

    ## Background currents
    g_b_Na = 0.95  # S_per_F (in i_b_Na)
    i_b_Na = g_b_Na * (y(0) - E_Na)

    g_b_Ca = 0.727272  # S_per_F (in i_b_Ca)
    i_b_Ca = g_b_Ca * (y(0) - E_Ca)

    ## Sarcoplasmic reticulum
    i_up = VmaxUp / (1.0 + Kup**2.0 / y(2)**2.0)

    i_leak = (y(1) - y(2)) * V_leak

    dY[3] = 0

    # RyR
    RyRSRCass = (1 - 1 / (1 + symengine.exp((y(1) - 0.3) / 0.1)))
    i_rel = g_irel_max * RyRSRCass * y(21) * y(22) * (y(1) - y(2))

    RyRainfss = RyRa1 - RyRa2 / (1 + symengine.exp(
        (1000 * y(2) - (RyRahalf)) / 0.0082))
    RyRtauadapt = 1  #s
    dY[20] = (RyRainfss - y(20)) / RyRtauadapt

    RyRoinfss = (1 - 1 / (1 + symengine.exp(
        (1000 * y(2) - (y(20) + RyRohalf)) / 0.003)))
    RyRtauact = sigmoid_generator(
        RyRoinfss, y(21), 1) * 18.75e-3 + 0.1 * 18.75e-3 * sigmoid_generator(
            RyRoinfss, y(21), -1)

    dY[21] = (RyRoinfss - y(21)) / RyRtauact

    RyRcinfss = (1 / (1 + symengine.exp(
        (1000 * y(2) - (y(20) + RyRchalf)) / 0.001)))

    RyRtauinact = sigmoid_generator(RyRcinfss, y(22),
                                    1) * 2 * 87.5e-3 + sigmoid_generator(
                                        RyRcinfss, y(22), -1) * 87.5e-3

    dY[22] = (RyRcinfss - y(22)) / RyRtauinact

    ## Ca2+ buffering
    Buf_C = 0.25  # millimolar (in calcium_dynamics)
    Buf_SR = 10.0  # millimolar (in calcium_dynamics)
    Kbuf_C = 0.001  # millimolar (in calcium_dynamics)
    Kbuf_SR = 0.3  # millimolar (in calcium_dynamics)
    Cai_bufc = 1.0 / (1.0 + Buf_C * Kbuf_C / (y(2) + Kbuf_C)**2.0)
    Ca_SR_bufSR = 1.0 / (1.0 + Buf_SR * Kbuf_SR / (y(1) + Kbuf_SR)**2.0)

    ## Ionic concentrations
    #Nai
    dY[17] = -Cm * (i_Na + i_NaL + i_b_Na + 3.0 * i_NaK + 3.0 * i_NaCa +
                    i_fNa) / (F * Vc * 1.0e-18)
    #caSR
    dY[2] = Cai_bufc * (i_leak - i_up + i_rel -
                        (i_CaL + i_b_Ca + i_PCa - 2.0 * i_NaCa) * Cm /
                        (2.0 * Vc * F * 1.0e-18))
    #Cai
    dY[1] = Ca_SR_bufSR * Vc / V_SR * (i_up - (i_rel + i_leak))

    ## Stimulation
    i_stim_Amplitude = 7.5e-10  # ampere (in stim_mode)
    i_stim_End = 1000.0  # second (in stim_mode)
    i_stim_PulseDuration = 0.005  # second (in stim_mode)
    i_stim_Start = 0.0  # second (in stim_mode)
    i_stim_frequency = 60.0  # per_second (in stim_mode)
    stim_flag = 0.0  # dimensionless (in stim_mode)
    i_stim_Period = 60.0 / i_stim_frequency

    i_stim = 0  #(sigmoid_generator(time, i_stim_Start, 1) * sigmoid_generator(time, i_stim_End, -1) * (sigmoid_generator(time-i_stim_Start-symengine.floor((time-i_stim_Start)/i_stim_Period)*i_stim_Period, i_stim_PulseDuration, -1) ))*stim_flag*i_stim_Amplitude/Cm+0.0

    ## Membrane potential
    dY[0] = -(i_K1 + i_to + i_Kr + i_Ks + i_CaL + i_NaK + i_Na + i_NaL +
              i_NaCa + i_PCa + i_f + i_b_Na + i_b_Ca - i_stim)

    ## Output variables
    IK1 = i_K1
    Ito = i_to
    IKr = i_Kr
    IKs = i_Ks
    ICaL = i_CaL
    INaK = i_NaK
    INa = i_Na
    INaCa = i_NaCa
    IpCa = i_PCa
    If = i_f
    IbNa = i_b_Na
    IbCa = i_b_Ca
    Irel = i_rel
    Iup = i_up
    Ileak = i_leak
    Istim = i_stim
    INaL = i_NaL

    dati = [
        INa, If, ICaL, Ito, IKs, IKr, IK1, INaCa, INaK, IpCa, IbNa, IbCa, Irel,
        Iup, Ileak, Istim, E_K, E_Na, INaL
    ]

    return dY

    # 1 - evaluate function at Y...
    # 2 - loop over Y, perturb each element by a small percent of its total
    # 3 - during each loop, find dY/dt, given the perturbation
    # 4 - find the change in Y as a function of the change in the perturbation

    # Conditionals
    # tau_h   = 1.5*1.6947/1000.0
    # alpha_j = 0.0
    # beta_j  = ((0.6*exp((0.057)*Y[0]*1000)/(1+exp(-0.1*(Y[0]*1000+32)))))
    # constf1 = 1.0
    # constfCa = 1.0
    # RyRtauact = 0.1*18.75e-3   #s
    # RyRtauinact = 87.5e-3      #s
    # i_stim = 0.0
    '''
예제 #13
0
 def set_integration_index(self, i):
     self.ii = i
     self.r = y(i)
     self.s = y(i + 1)
     self.G = y(i + 2)
예제 #14
0
 def set_integration_index(self, i):
     self.ii = i  # integration index
     #self.syn_weight = y(i)
     self.reduced_weight = y(i)
     self.rho_gate = y(i + 1)
     self.ca = y(i + 2)  ###
예제 #15
0
 def test_check_index_negative(self):
     ODE = jitcode([y(-1)])
     with self.assertRaises(ValueError):
         ODE.check()
예제 #16
0
				current_time = time
				state = I.y
				yield state
		result = np.vstack(solutions())

# Using compiled functions to make things faster
def get_compiled_function(f):
	dummy = jitcode(f,verbose=False)
	dummy.compile_C()
	return dummy.f

# The actual scenarios
test_scenario(
	name = "two coupled FitzHugh–Nagumo oscillators",
	fun = get_compiled_function([
			y(0)*(-0.025794-y(0))*(y(0)-1.0)-y(1)+0.128*(y(2)-y(0)),
			0.0065*y(0)-0.02*y(1),
			y(2)*(-0.025794-y(2))*(y(2)-1.0)-y(3)+0.128*(y(0)-y(2)),
			0.0135*y(2)-0.02*y(3)
		]),
	initial = np.array([1.,2.,3.,4.]),
	times = 2000+np.arange(0,100000,10),
	rtol = 1e-5,
	atol = 1e-8,
)


n, c, q = 100, 3.0, 0.2
A = choice( [1,0], size=(n,n), p=[q,1-q] )
omega = uniform(-0.5,0.5,n)
def kuramotos_f():
예제 #17
0
        result = np.vstack(list(solutions()))


# Using compiled functions to make things faster
def get_compiled_function(f):
    dummy = jitcode(f, verbose=False)
    dummy.compile_C()
    return dummy.f


# The actual scenarios
test_scenario(
    name="two coupled FitzHugh–Nagumo oscillators",
    fun=get_compiled_function([
        y(0) * (-0.025794 - y(0)) * (y(0) - 1.0) - y(1) + 0.128 *
        (y(2) - y(0)), 0.0065 * y(0) - 0.02 * y(1),
        y(2) * (-0.025794 - y(2)) * (y(2) - 1.0) - y(3) + 0.128 *
        (y(0) - y(2)), 0.0135 * y(2) - 0.02 * y(3)
    ]),
    initial=np.array([1., 2., 3., 4.]),
    times=2000 + np.arange(0, 100000, 10),
    rtol=1e-5,
    atol=1e-8,
)

n, c, q = 100, 3.0, 0.2
A = choice([1, 0], size=(n, n), p=[q, 1 - q])
omega = uniform(-0.5, 0.5, n)

예제 #18
0
    0.0195744683782066,
    -0.0057801623466600,
])

lyaps = [0.00710, 0, -0.0513, -0.187]

# vanilla

a = -0.025794
b1 = 0.0065
b2 = 0.0135
c = 0.02
k = 0.128

f = [
    y(0) * (a - y(0)) * (y(0) - 1.0) - y(1) + k * (y(2) - y(0)),
    b1 * y(0) - c * y(1),
    y(2) * (a - y(2)) * (y(2) - 1.0) - y(3) + k * (y(0) - y(2)),
    b2 * y(2) - c * y(3)
]

vanilla = {"f_sym": f}

# as dictionary
f_dict = {y(i): entry for i, entry in reversed(list(enumerate(f)))}
with_dictionary = {"f_sym": f_dict}

# with generator


def f_generator():
Note that the initial state (line 17) is reduced in dimensionality and there is only one component for each synchronisation group.
"""

if __name__ == "__main__":
	# example-start
	from jitcode import jitcode_transversal_lyap, y
	from scipy.stats import sem
	import numpy as np
	
	a = -0.025794
	b =  0.01
	c =  0.02
	k =  0.128
	
	f = [
		y(0) * ( a-y(0) ) * ( y(0)-1.0 ) - y(1) + k * (y(2) - y(0)),
		b*y(0) - c*y(1),
		y(2) * ( a-y(2) ) * ( y(2)-1.0 ) - y(3) + k * (y(0) - y(2)),
		b*y(2) - c*y(3)
		]
	
	initial_state = np.array([1.,2.])
	
	groups = [ [0,2], [1,3] ]
	ODE = jitcode_transversal_lyap(f, groups=groups)
	ODE.set_integrator("lsoda")
	ODE.set_initial_value(initial_state,0.0)
	
	times = range(10,100000,10)
	lyaps = []
	for time in times:
예제 #20
0
	:start-after: example-st\u0061rt
	:dedent: 1
	:linenos:
"""

if __name__ == "__main__":
	# example-start
	from jitcode import y, jitcode
	import numpy as np
	
	γ = 0.6
	φ = 1.0
	ω = 0.5
	ν = 0.5
	
	R,B = [ y(i) for i in range(2) ]
	
	lotka_volterra_diff = {
			B:  γ*B - φ*R*B,
			R: -ω*R + ν*R*B,
		}
	
	ODE = jitcode(lotka_volterra_diff)
	ODE.set_integrator("dopri5")
	initial_state = np.array(np.random.random(2))
	ODE.set_initial_value(initial_state,0.0)
	
	times = np.arange(0.0,100,0.1)
	data = []
	for time in times:
		state = ODE.integrate(time)
예제 #21
0
		 0.0195744683782066,
		-0.0057801623466600,
	])

lyaps = [0.00710, 0, -0.0513, -0.187]

# vanilla

a  = -0.025794
b1 =  0.0065
b2 =  0.0135
c  =  0.02
k  =  0.128

f = [
		y(0) * ( a-y(0) ) * ( y(0)-1.0 ) - y(1) + k * (y(2) - y(0)),
		b1*y(0) - c*y(1),
		y(2) * ( a-y(2) ) * ( y(2)-1.0 ) - y(3) + k * (y(0) - y(2)),
		b2*y(2) - c*y(3)
	]

vanilla = {"f_sym": f}

# as dictionary
f_dict = { y(i):entry for i,entry in reversed(list(enumerate(f))) }
with_dictionary = {"f_sym": f_dict}

# with generator

def f_generator():
	for entry in f:
예제 #22
0
from itertools import combinations
from jitcode import jitcode_restricted_lyap, y, jitcode_transversal_lyap
import numpy as np
from scipy.stats import sem
from symengine import Symbol

a = -0.025794
b = 0.01
c = 0.02
k = Symbol("k")

scenarios = [
    {
        "f": [
            y(0) * (a - y(0)) * (y(0) - 1.0) - y(3) + k * (y(1) - y(0)),
            y(1) * (a - y(1)) * (y(1) - 1.0) - y(4) + k * (y(2) - y(1)),
            y(2) * (a - y(2)) * (y(2) - 1.0) - y(5) + k * (y(0) - y(2)),
            b * y(0) - c * y(3),
            b * y(1) - c * y(4),
            b * y(2) - c * y(5),
        ],
        "vectors": [[1., 1., 1., 0., 0., 0.], [0., 0., 0., 1., 1., 1.]],
        "groups": ([0, 1, 2], [3, 4, 5])
    },
    {
        "f": [
            y(0) * (a - y(0)) * (y(0) - 1.0) - y(1) + k * (y(2) - y(0)),
            b * y(0) - c * y(1),
            y(2) * (a - y(2)) * (y(2) - 1.0) - y(3) + k * (y(4) - y(2)),
            b * y(2) - c * y(3),
예제 #23
0
 def set_integration_index(self, i):
     self.ii = i
     self.r = y(i)
예제 #24
0
 def set_integration_index(self, i):
     self.ii = i  # integration index
     self.syn_weight = y(i)
     self.rho_gate = y(i + 1)
예제 #25
0
from itertools import combinations
from jitcode import jitcode_restricted_lyap, y, jitcode_transversal_lyap
import numpy as np
from scipy.stats import sem
from symengine import Symbol

a = -0.025794
b =  0.01
c =  0.02
k = Symbol("k")

scenarios = [
	{
	"f":
		[
			y(0)*(a-y(0))*(y(0)-1.0) - y(3) + k*(y(1)-y(0)),
			y(1)*(a-y(1))*(y(1)-1.0) - y(4) + k*(y(2)-y(1)),
			y(2)*(a-y(2))*(y(2)-1.0) - y(5) + k*(y(0)-y(2)),
			b*y(0) - c*y(3),
			b*y(1) - c*y(4),
			b*y(2) - c*y(5),
		],
	"vectors":
		[
			[1.,1.,1.,0.,0.,0.],
			[0.,0.,0.,1.,1.,1.]
		],
	"groups":
		( [0,1,2], [3,4,5] )
	},
	{
예제 #26
0
	def test_check_index_negative(self):
		ODE = jitcode([y(-1)])
		with self.assertRaises(ValueError):
			ODE.check()
def kuramotos_f():
    for i in range(n):
        coupling_sum = sum(
            sin(y(j) - y(i)) for j in range(n) if networkMatrix[j, i])
        yield omegas[i] + couplingConstant * coupling_sum
예제 #28
0
	def test_check_index_too_high(self):
		ODE = jitcode([y(1)])
		with self.assertRaises(ValueError):
			ODE.check()
예제 #29
0
def kuramotos_f():
    for i in range(n):
        coupling_sum = sum(sin(y(j) - y(i)) for j in range(n) if A[j, i])
        yield omega[i] + c / (n - 1) * coupling_sum
예제 #30
0
	b = 0.2
	c = 10.0
	k = 0.01
	
	# get adjacency matrix of a small-world network
	A = small_world_network(
		number_of_nodes = N,
		nearest_neighbours = 20,
		rewiring_probability = 0.1
		)
	
	# generate differential equations
	# -------------------------------
	
	sum_z = symengine.Symbol("sum_z")
	helpers = [( sum_z, sum( y(3*j+2) for j in range(N) ) )]
	
	def f():
		for i in range(N):
			coupling_sum = sum( y(3*j)-y(3*i) for j in range(N) if A[i,j] )
			coupling_term = k * symengine.sin(t) * coupling_sum
			yield -ω[i] * y(3*i+1) - y(3*i+2) + coupling_term
			yield  ω[i] * y(3*i) + a*y(3*i+1)
			coupling_term_2 = k * (sum_z-N*y(3*i+2))
			yield b + y(3*i+2) * (y(3*i) - c) + coupling_term_2
	
	# integrate
	# ---------
	
	initial_state = np.random.random(3*N)
	
예제 #31
0
    ω = np.random.uniform(0.8, 1.0, N)
    a = 0.165
    b = 0.2
    c = 10.0
    k = 0.01

    # get adjacency matrix of a small-world network
    A = small_world_network(number_of_nodes=N,
                            nearest_neighbours=20,
                            rewiring_probability=0.1)

    # generate differential equations
    # -------------------------------

    sum_z = symengine.Symbol("sum_z")
    helpers = [(sum_z, sum(y(3 * j + 2) for j in range(N)))]

    def f():
        for i in range(N):
            coupling_sum = sum(
                y(3 * j) - y(3 * i) for j in range(N) if A[i, j])
            coupling_term = k * symengine.sin(t) * coupling_sum
            yield -ω[i] * y(3 * i + 1) - y(3 * i + 2) + coupling_term
            yield ω[i] * y(3 * i) + a * y(3 * i + 1)
            coupling_term_2 = k * (sum_z - N * y(3 * i + 2))
            yield b + y(3 * i + 2) * (y(3 * i) - c) + coupling_term_2

    # integrate
    # ---------

    initial_state = np.random.random(3 * N)
예제 #32
0
 def test_initalise_with_dict(self):
     self.ODE = jitcode(**vanilla)
     initial_value = {y(i): y0[i] for i in range(n)}
     self.ODE.set_initial_value(initial_value)
     self.ODE.set_integrator("dop853")
     self.assertTrue(_is_C(self.ODE.f))
예제 #33
0
#!/usr/bin/python3
# -*- coding: utf-8 -*-

from jitcode import jitcode_restricted_lyap, y
import numpy as np
from scipy.stats import sem

a = -0.025794
b1 = 0.01
b2 = 0.01
c = 0.02
k = 0.128

f = [
    y(0) * (a - y(0)) * (y(0) - 1.0) - y(1) + k * (y(2) - y(0)),
    b1 * y(0) - c * y(1),
    y(2) * (a - y(2)) * (y(2) - 1.0) - y(3) + k * (y(0) - y(2)),
    b2 * y(2) - c * y(3)
]

initial_state = np.random.random(4)

vectors = [np.array([1., 0., 1., 0.]), np.array([0., 1., 0., 1.])]

ODE = jitcode_restricted_lyap(f, vectors=vectors)
ODE.set_integrator("dopri5")
ODE.set_initial_value(initial_state, 0.0)

data = np.hstack(ODE.integrate(T)[1] for T in range(10, 100000, 10))

print(np.average(data[500:]), sem(data[500:]))
예제 #34
0
	:start-after: example-st\u0061rt
	:dedent: 1
	:linenos:
"""

if __name__ == "__main__":
    # example-start
    from jitcode import y, jitcode
    import numpy as np

    γ = 0.6
    φ = 1.0
    ω = 0.5
    ν = 0.5

    R, B = dynvars = [y(i) for i in range(2)]

    lotka_volterra_diff = {
        B: γ * B - φ * R * B,
        R: -ω * R + ν * R * B,
    }

    ODE = jitcode(lotka_volterra_diff)
    ODE.set_integrator("dopri5")
    initial_state = {R: 0.2, B: 0.5}
    ODE.set_initial_value(initial_state, 0.0)

    times = np.arange(0.0, 100, 0.1)
    values = {R: [], B: []}
    for time in times:
        ODE.integrate(time)
예제 #35
0
 def test_check_index_too_high(self):
     ODE = jitcode([y(1)])
     with self.assertRaises(ValueError):
         ODE.check()
def Paci2018(tDrugApplication, INaFRedMed,ICaLRedMed, IKrRedMed, IKsRedMed):
    dY = [None]*23

    '''
    Parameters from optimizer   
      VmaxUp    = param(1)
      g_irel_max  = param(2)
      RyRa1         = param(3)
      RyRa2         = param(4)
      RyRahalf      = param(5)
      RyRohalf      = param(6)
      RyRchalf      = param(7)
      kNaCa         = param(8)
      PNaK          = param(9)
      Kup     = param(10)
      V_leak    = param(11)
      alpha         = param(12)
    '''
    VmaxUp = 0.5113      # millimolar_per_second (in calcium_dynamics)
    g_irel_max = 62.5434 # millimolar_per_second (in calcium_dynamics)
    RyRa1 = 0.05354      # uM
    RyRa2 = 0.0488       # uM
    RyRahalf = 0.02427   # uM
    RyRohalf = 0.01042   # uM
    RyRchalf = 0.00144   # uM
    kNaCa = 3917.0463    # A_per_F (in i_NaCa)
    PNaK = 2.6351        # A_per_F (in i_NaK)
    Kup = 3.1928e-4      # millimolar (in calcium_dynamics)
    V_leak = 4.7279e-4   # per_second (in calcium_dynamics)
    alpha = 2.5371       # dimensionless (in i_NaCa)

    ## Constants
    F = 96485.3415   # coulomb_per_mole (in model_parameters)
    R = 8.314472   # joule_per_mole_kelvin (in model_parameters)
    T = 310   # kelvin (in model_parameters)

    ## Cell geometry
    V_SR = 583.73   # micrometre_cube (in model_parameters)
    Vc   = 8800   # micrometre_cube (in model_parameters)
    Cm   = 9.87109e-11   # farad (in model_parameters)

    ## Extracellular concentrations
    Nao = 151   # millimolar (in model_parameters)
    Ko  = 5.4   # millimolar (in model_parameters)
    Cao = 1.8 #3#5#1.8   # millimolar (in model_parameters)

    ## Intracellular concentrations
    # Naio = 10 mM y(17)
    Ki = 150   # millimolar (in model_parameters)
    # Cai  = 0.0002 mM y(2)
    # caSR = 0.3 mM y(1)

    ## Nernst potential
    E_Na = R*T/F*log(Nao/y(17))
    E_Ca = 0.5*R*T/F*log(Cao/y(2))

    E_K  = R*T/F*log(Ko/Ki)
    PkNa = 0.03   # dimensionless (in electric_potentials)
    E_Ks = R*T/F*log((Ko+PkNa*Nao)/(Ki+PkNa*y(17)))


    ## INa
    g_Na        = 3671.2302   # S_per_F (in i_Na)
    i_Na        = g_Na*y(13)**3*y(11)*y(12)*(y(0)-E_Na)

    h_inf       = 1/sqrt(1+exp((y(0)*1000+72.1)/5.7))
    alpha_h     = 0.057*exp(-(y(0)*1000+80)/6.8)
    beta_h      = 2.7*exp(0.079*y(0)*1000)+3.1*10**5*exp(0.3485*y(0)*1000)
    
    tau_h = conditional(y(0),-0.0385,1.5/((alpha_h+beta_h)*1000),1.5*1.6947/1000)

    dY[11]   = (h_inf-y(11))/tau_h

    j_inf       = 1/sqrt(1+exp((y(0)*1000+72.1)/5.7))
    alpha_j = conditional(y(0),-0.04,(-25428*exp(0.2444*y(0)*1000)-6.948*10**-6*exp(-0.04391*y(0)*1000))*(y(0)*1000+37.78)/(1+exp(0.311*(y(0)*1000+79.23))),0)
    
    beta_j  = conditional(
            y(0),-0.04,
            0.02424*exp(-0.01052*y(0)*1000)/(1+exp(-0.1378*(y(0)*1000+40.14))),
            0.6*exp((0.057)*y(0)*1000)/(1+exp(-0.1*(y(0)*1000+32))),
        )
    
    tau_j       = 7/((alpha_j+beta_j)*1000)
    dY[12]   = (j_inf-y(12))/tau_j

    m_inf       = 1/(1+exp((-y(0)*1000-34.1)/5.9))**(1/3)
    alpha_m     = 1/(1+exp((-y(0)*1000-60)/5))
    beta_m      = 0.1/(1+exp((y(0)*1000+35)/5))+0.1/(1+exp((y(0)*1000-50)/200))
    tau_m       = 1*alpha_m*beta_m/1000
    dY[13]   = (m_inf-y(13))/tau_m

    

    ## INaL
    myCoefTauM  = 1
    tauINaL     = 200 #ms
    GNaLmax     = 2.3*7.5 #(S/F)
    Vh_hLate    = 87.61
    i_NaL       = GNaLmax* y(18)**(3)*y(19)*(y(0)-E_Na)

    m_inf_L     = 1/(1+exp(-(y(0)*1000+42.85)/(5.264)))
    alpha_m_L   = 1/(1+exp((-60-y(0)*1000)/5))
    beta_m_L    = 0.1/(1+exp((y(0)*1000+35)/5))+0.1/(1+exp((y(0)*1000-50)/200))
    tau_m_L     = 1/1000 * myCoefTauM*alpha_m_L*beta_m_L
    dY[18]   = (m_inf_L-y(18))/tau_m_L

    h_inf_L     = 1/(1+exp((y(0)*1000+Vh_hLate)/(7.488)))
    tau_h_L     = 1/1000 * tauINaL
    dY[19]   = (h_inf_L-y(19))/tau_h_L

    ## If
    E_f         = -0.017   # volt (in i_f)
    g_f         = 30.10312   # S_per_F (in i_f)

    i_f         = g_f*y(14)*(y(0)-E_f)
    i_fNa       = 0.42*g_f*y(14)*(y(0)-E_Na)

    Xf_infinity = 1/(1+exp((y(0)*1000+77.85)/5))
    tau_Xf      = 1900/(1+exp((y(0)*1000+15)/10))/1000
    dY[14]   = (Xf_infinity-y(14))/tau_Xf




    ## ICaL
    g_CaL       = 8.635702e-5   # metre_cube_per_F_per_s (in i_CaL)
    i_CaL       = g_CaL*4*y(0)*F**2/(R*T)*(y(2)*exp(2*y(0)*F/(R*T))-0.341*Cao)/(exp(2*y(0)*F/(R*T))-1)*y(4)*y(5)*y(6)*y(7)

    d_infinity  = 1/(1+exp(-(y(0)*1000+9.1)/7))
    alpha_d     = 0.25+1.4/(1+exp((-y(0)*1000-35)/13))
    beta_d      = 1.4/(1+exp((y(0)*1000+5)/5))
    gamma_d     = 1/(1+exp((-y(0)*1000+50)/20))
    tau_d       = (alpha_d*beta_d+gamma_d)*1/1000
    dY[4]    = (d_infinity-y(4))/tau_d

    f1_inf      = 1/(1+exp((y(0)*1000+26)/3))
    constf1 = 1 + 1433*(y(2)-50*1e-6)
    
    tau_f1      = (20+1102.5*exp(-((y(0)*1000+27)**2/15)**2)+200/(1+exp((13-y(0)*1000)/10))+180/(1+exp((30+y(0)*1000)/10)))*constf1/1000
    dY[5]    = (f1_inf-y(5))/tau_f1
    
    f2_inf      = 0.33+0.67/(1+exp((y(0)*1000+32)/4))
    constf2     = 1
    tau_f2      = (600*exp(-(y(0)*1000+25)**2/170)+31/(1+exp((25-y(0)*1000)/10))+16/(1+exp((30+y(0)*1000)/10)))*constf2/1000
    dY[6]    = (f2_inf-y(6))/tau_f2

    alpha_fCa   = 1/(1+(y(2)/0.0006)**8)
    beta_fCa    = 0.1/(1+exp((y(2)-0.0009)/0.0001))
    gamma_fCa   = 0.3/(1+exp((y(2)-0.00075)/0.0008))
    fCa_inf     = (alpha_fCa+beta_fCa+gamma_fCa)/1.3156
    constfCa    = conditional( y(0), -0.06, 1, conditional(fCa_inf,y(7),1,0) )
    
    tau_fCa     = 0.002   # second (in i_CaL_fCa_gate)
    dY[7]    = constfCa*(fCa_inf-y(7))/tau_fCa

    ## Ito
    g_to        = 29.9038   # S_per_F (in i_to)
    i_to        = g_to*(y(0)-E_K)*y(15)*y(16)

    q_inf       = 1/(1+exp((y(0)*1000+53)/13))
    tau_q       = (6.06+39.102/(0.57*exp(-0.08*(y(0)*1000+44))+0.065*exp(0.1*(y(0)*1000+45.93))))/1000
    dY[15]   = (q_inf-y(15))/tau_q

    r_inf       = 1/(1+exp(-(y(0)*1000-22.3)/18.75))
    tau_r       = (2.75352+14.40516/(1.037*exp(0.09*(y(0)*1000+30.61))+0.369*exp(-0.12*(y(0)*1000+23.84))))/1000
    dY[16]   = (r_inf-y(16))/tau_r

    ## IKs
    g_Ks        = 2.041   # S_per_F (in i_Ks)
    i_Ks        = g_Ks*(y(0)-E_Ks)*y(10)**2*(1+0.6/(1+(3.8*0.00001/y(2))**1.4))

    Xs_infinity = 1/(1+exp((-y(0)*1000-20)/16))
    alpha_Xs    = 1100/sqrt(1+exp((-10-y(0)*1000)/6))
    beta_Xs     = 1/(1+exp((-60+y(0)*1000)/20))
    tau_Xs      = 1*alpha_Xs*beta_Xs/1000
    dY[10]   = (Xs_infinity-y(10))/tau_Xs

    ## IKr
    L0           = 0.025   # dimensionless (in i_Kr_Xr1_gate)
    Q            = 2.3   # dimensionless (in i_Kr_Xr1_gate)
    g_Kr         = 29.8667   # S_per_F (in i_Kr)
    i_Kr         = g_Kr*(y(0)-E_K)*y(8)*y(9)*sqrt(Ko/5.4)

    V_half       = 1000*(-R*T/(F*Q)*log((1+Cao/2.6)**4/(L0*(1+Cao/0.58)**4))-0.019)

    Xr1_inf      = 1/(1+exp((V_half-y(0)*1000)/4.9))
    alpha_Xr1    = 450/(1+exp((-45-y(0)*1000)/10))
    beta_Xr1     = 6/(1+exp((30+y(0)*1000)/11.5))
    tau_Xr1      = 1*alpha_Xr1*beta_Xr1/1000
    dY[8]     = (Xr1_inf-y(8))/tau_Xr1

    Xr2_infinity = 1/(1+exp((y(0)*1000+88)/50))
    alpha_Xr2    = 3/(1+exp((-60-y(0)*1000)/20))
    beta_Xr2     = 1.12/(1+exp((-60+y(0)*1000)/20))
    tau_Xr2      = 1*alpha_Xr2*beta_Xr2/1000
    dY[9]    = (Xr2_infinity-y(9))/tau_Xr2
    
    ## IK1
    alpha_K1 = 3.91/(1+exp(0.5942*(y(0)*1000-E_K*1000-200)))
    beta_K1  = (-1.509*exp(0.0002*(y(0)*1000-E_K*1000+100))+exp(0.5886*(y(0)*1000-E_K*1000-10)))/(1+exp(0.4547*(y(0)*1000-E_K*1000)))
    XK1_inf  = alpha_K1/(alpha_K1+beta_K1)
    g_K1     = 28.1492   # S_per_F (in i_K1)
    i_K1     = g_K1*XK1_inf*(y(0)-E_K)*sqrt(Ko/5.4)

    ## INaCa
    KmCa   = 1.38   # millimolar (in i_NaCa)
    KmNai  = 87.5   # millimolar (in i_NaCa)
    Ksat   = 0.1   # dimensionless (in i_NaCa)
    gamma  = 0.35   # dimensionless (in i_NaCa)
    kNaCa1 = kNaCa   # A_per_F (in i_NaCa)
    i_NaCa = kNaCa1*(exp(gamma*y(0)*F/(R*T))*y(17)**3*Cao-exp((gamma-1)*y(0)*F/(R*T))*Nao**3*y(2)*alpha)/((KmNai**3+Nao**3)*(KmCa+Cao)*(1+Ksat*exp((gamma-1)*y(0)*F/(R*T))))

    ## INaK
    Km_K  = 1   # millimolar (in i_NaK)
    Km_Na = 40   # millimolar (in i_NaK)
    PNaK1 = PNaK   # A_per_F (in i_NaK)
    i_NaK = PNaK1*Ko/(Ko+Km_K)*y(17)/(y(17)+Km_Na)/(1+0.1245*exp(-0.1*y(0)*F/(R*T))+0.0353*exp(-y(0)*F/(R*T)))

    ## IpCa
    KPCa  = 0.0005   # millimolar (in i_PCa)
    g_PCa = 0.4125   # A_per_F (in i_PCa)
    i_PCa = g_PCa*y(2)/(y(2)+KPCa)

    ## Background currents
    g_b_Na = 0.95   # S_per_F (in i_b_Na)
    i_b_Na = g_b_Na*(y(0)-E_Na)

    g_b_Ca = 0.727272   # S_per_F (in i_b_Ca)
    i_b_Ca = g_b_Ca*(y(0)-E_Ca)

    ## Sarcoplasmic reticulum
    i_up = VmaxUp/(1+Kup**2/y(2)**2)

    i_leak = (y(1)-y(2))*V_leak

    dY[3] = 0

    # RyR
    RyRSRCass = (1 - 1/(1 +  exp((y(1)-0.3)/0.1)))
    i_rel = g_irel_max*RyRSRCass*y(21)*y(22)*(y(1)-y(2))

    RyRainfss = RyRa1-RyRa2/(1 + exp((1000*y(2)-(RyRahalf))/0.0082))
    RyRtauadapt = 1 #s
    dY[20] = (RyRainfss- y(20))/RyRtauadapt

    RyRoinfss = (1 - 1/(1 +  exp((1000*y(2)-(y(20)+ RyRohalf))/0.003)))
    RyRtauact = conditional(RyRoinfss,y(21),0.1,1)*18.75e-3
    
    dY[21] = (RyRoinfss- y(21))/RyRtauact

    RyRcinfss = (1/(1 + exp((1000*y(2)-(y(20)+RyRchalf))/0.001)))
    
    RyRtauinact = conditional(RyRcinfss,y(22),1,2)*87.5e-3
    
    dY[22] = (RyRcinfss- y(22))/RyRtauinact
    
    ## Ca2+ buffering
    Buf_C       = 0.25   # millimolar (in calcium_dynamics)
    Buf_SR      = 10   # millimolar (in calcium_dynamics)
    Kbuf_C      = 0.001   # millimolar (in calcium_dynamics)
    Kbuf_SR     = 0.3   # millimolar (in calcium_dynamics)
    Cai_bufc    = 1/(1+Buf_C*Kbuf_C/(y(2)+Kbuf_C)**2)
    Ca_SR_bufSR = 1/(1+Buf_SR*Kbuf_SR/(y(1)+Kbuf_SR)**2)

    ## Ionic concentrations
    #Nai
    dY[17] = -Cm*(i_Na+i_NaL+i_b_Na+3*i_NaK+3*i_NaCa+i_fNa)/(F*Vc*1e-18)
    #caSR
    dY[2]  = Cai_bufc*(i_leak-i_up+i_rel-(i_CaL+i_b_Ca+i_PCa-2*i_NaCa)*Cm/(2*Vc*F*1e-18))
    #Cai
    dY[1]  = Ca_SR_bufSR*Vc/V_SR*(i_up-(i_rel+i_leak))

    i_stim = 0
    

    ## Membrane potential
    dY[0] = -(i_K1+i_to+i_Kr+i_Ks+i_CaL+i_NaK+i_Na+i_NaL+i_NaCa+i_PCa+i_f+i_b_Na+i_b_Ca-i_stim)
    
    return dY
#cdc25 and wee1 activity depend on cdk1, but also on their total
def cdc25(cdk, cdc25T=1):
    return cdc25T * (p['acdc25'] + p['bcdc25'] * cdk**p['ncdc25'] /
                     (p['Kcdc25']**p['ncdc25'] + cdk**p['ncdc25']))


def wee1(cdk, wee1T=1):
    return wee1T * (p['awee1'] + p['bwee1'] * p['Kwee1']**p['nwee1'] /
                    (p['Kwee1']**p['nwee1'] + cdk**p['nwee1']))


#solve
#order: cyc, cdk, cdc
#nucleus cytoplasm
cycn = y(0)
cycc = y(1)

cdkn = y(2)
cdkc = y(3)

cdcn = y(4)
cdcc = y(5)

#import rates depend on Cdk1 levels
impcdc = .1 + cdkc / 30  #import factor for cdc25
impcyc = 1 + cdkn / 60  #import factor for cyclin

# derivatives
dcycn = pr['kncyc'] * impcyc * cycc - pr['kccyc'] * cycn
dcycc = -pr['kncyc'] * impcyc * cycc + pr['kccyc'] * cycn + p['ks']
예제 #38
0
def f():
	for n in range(NUM_NEURON):
		coupling_sum = sum(symengine.sin(y(m)-y(n)) for m in A_list[n]) # nonlinearity!
		coupling_term = couple_const * coupling_sum
		yield  int_freqs[n] + coupling_term