From fd151889a784f695f09529b757f0c4853c7cab33 Mon Sep 17 00:00:00 2001 From: swl <642878280@qq.com> Date: Fri, 30 Aug 2024 21:13:13 +0800 Subject: [PATCH 1/3] add the rest channels and fix bugs --- dendritex/channels/calcium.py | 83 +++-- dendritex/channels/potassium_calcium.py | 257 +++++++++++++ dendritex/channels/sodium.py | 15 +- examples/golgi_model/golgi.ipynb | 470 +++++++++++------------- 4 files changed, 515 insertions(+), 310 deletions(-) diff --git a/dendritex/channels/calcium.py b/dendritex/channels/calcium.py index aaa9f69..8baf8dc 100644 --- a/dendritex/channels/calcium.py +++ b/dendritex/channels/calcium.py @@ -792,10 +792,10 @@ class ICav12_Ma2020(CalciumChannel): def __init__( self, size: bst.typing.Size, - g_max: Union[bst.typing.ArrayLike, Callable] = 0 * (bu.cm / bu.second), + g_max: Union[bst.typing.ArrayLike, Callable] = 0 * (bu.mS / bu.cm**2), V_sh: Union[bst.typing.ArrayLike, Callable] = 0 * bu.mV, T_base: bst.typing.ArrayLike = 3 , - T: bst.typing.ArrayLike = 32., + T: bst.typing.ArrayLike = 22., name: Optional[str] = None, mode: Optional[bst.mixin.Mode] = None, ): @@ -823,8 +823,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None): self.n = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size)) def reset_state(self, V, Ca, batch_size=None): - self.m.value = self.f_m_inf(V,Ca) - self.h.value = self.f_h_inf(V,Ca) + self.m.value = self.f_m_inf(V) + self.h.value = self.f_h_inf(V) self.n.value = self.f_n_inf(V,Ca) def compute_derivative(self, V, Ca): @@ -837,11 +837,11 @@ def f_m_inf(self, V): return 1/(1 + bu.math.exp((V + 8.9)/(-6.7))) def f_h_inf(self, V): V = V / bu.mV - return self.VDI/(1 + exp((V +55)/8)) + (1-self.VDI) + return self.VDI/(1 + bu.math.exp((V +55)/8)) + (1-self.VDI) def f_n_inf(self, V, Ca): V = V / bu.mV - return self.kf/(self.kf + Ca.C/bu.mM) + return bu.math.ones_like(V)*self.kf/(self.kf + Ca.C/bu.mM) def f_m_tau(self, V): V = V / bu.mV @@ -902,8 +902,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None): self.n = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size)) def reset_state(self, V, Ca, batch_size=None): - self.m.value = self.f_m_inf(V,Ca) - self.h.value = self.f_h_inf(V,Ca) + self.m.value = self.f_m_inf(V) + self.h.value = self.f_h_inf(V) self.n.value = self.f_n_inf(V,Ca) def compute_derivative(self, V, Ca): @@ -922,7 +922,7 @@ def f_h_inf(self, V): def f_n_inf(self, V, Ca): V = V / bu.mV - return self.kf/(self.kf + Ca.C/bu.mM) + return bu.math.ones_like(V)*self.kf/(self.kf + Ca.C/bu.mM) def f_m_tau(self, V): V = V / bu.mV @@ -988,8 +988,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None): def reset_state(self, V, Ca, batch_size=None): - self.m.value = self.f_m_inf(V,Ca) - self.h.value = self.f_h_inf(V,Ca) + self.m.value = self.f_m_inf(V) + self.h.value = self.f_h_inf(V) def compute_derivative(self, V, Ca): @@ -1033,7 +1033,6 @@ class ICav31_Ma2020(CalciumChannel): Contact: Haroon Anwar (anwar@oist.jp) ''' - __module__ = 'dendritex.channels' root_type = Calcium @@ -1043,7 +1042,7 @@ def __init__( size: bst.typing.Size, g_max: Union[bst.typing.ArrayLike, Callable] = 2.5e-4 * (bu.cm / bu.second), V_sh: Union[bst.typing.ArrayLike, Callable] = 0 * bu.mV, - T_base: bst.typing.ArrayLike = 3 , + T_base: bst.typing.ArrayLike = 3 , T: bst.typing.ArrayLike = 22., name: Optional[str] = None, mode: Optional[bst.mixin.Mode] = None, @@ -1061,8 +1060,23 @@ def __init__( self.V_sh = bst.init.param(V_sh, self.varshape, allow_none=False) self.phi = bst.init.param(T_base ** ((T - 37) / 10), self.varshape, allow_none=False) - self.ci = 1e-4 - self.co = 2 + self.v0_m_inf = -52 + self.v0_h_inf = -72 + self.k_m_inf = -5 + self.k_h_inf = 7 + + self.C_tau_m = 1 + self.A_tau_m = 1.0 + self.v0_tau_m1 = -40 + self.v0_tau_m2 = -102 + self.k_tau_m1 = 9 + self.k_tau_m2 = -18 + + self.C_tau_h = 15 + self.A_tau_h = 1.0 + self.v0_tau_h1 = -32 + self.k_tau_h1 = 7 + def init_state(self, V, Ca: IonInfo, batch_size: int = None): @@ -1079,33 +1093,34 @@ def compute_derivative(self, V, Ca): def f_p_inf(self, V): V = V / bu.mV - return 1.0 / ( 1 + bu.math.exp((V - (-42.206)-self.V_sh)/-4.7056) )^(1/3) + return 1.0 / ( 1 + bu.math.exp((V - self.v0_m_inf)/self.k_m_inf) ) def f_q_inf(self, V): V = V / bu.mV - return 1.0 / ( 1 + bu.math.exp((V - (-75.118)-self.V_sh)/6.4635 ) ) + return 1.0 / ( 1 + bu.math.exp((V - self.v0_h_inf)/self.k_h_inf) ) def f_p_tau(self, V): V = V / bu.mV - return 1/( 1.2757 -2.3199 / (1. + bu.math.exp((-48.048 -V- self.V_sh)/ 30.655))+2.5712/ (1. + bu.math.exp((-28.386-V-self.V_sh)/ 9.6306))) + return bu.math.where(V<=-90, 1, (self.C_tau_m + self.A_tau_m / (bu.math.exp((V - self.v0_tau_m1)/ self.k_tau_m1) + bu.math.exp((V - self.v0_tau_m2)/self.k_tau_m2))) ) def f_p_tau(self, V): V = V / bu.mV - return 1/( 0.0076 + 0.17746 / (1. + bu.math.exp((-58.535-V-self.V_sh)/ 6.2692))+ 0.13402/ (1. + bu.math.exp((-101.436-V-self.V_sh)/-5.5845))) + return ( self.C_tau_h + self.A_tau_h / bu.math.exp((V - self.v0_tau_h1)/self.k_tau_h1) ) - def ghk(self, V, Ca: IonInfo): - E = (1e-3) * V/bu.mV - zeta = (2*bu.faraday_constant * E )/( bu.gas_constant * (273.15 + self.T) * bu.kelvin ) - ci = self.ci - co = self.co - - if bu.math.maximum((1-bu.math.exp(-zeta)),0) <= 1e-6: - g = (1e-6) * bu.faraday_constant * (ci - co *bu.math.exp(-zeta)) * (1 + zeta/2) - else: - g = (1e-6) * (zeta*bu.faraday_constant) * (ci - co*bu.math.exp(-zeta)) / (1-bu.math.exp(-zeta)) - return g + def ghk(self, V, Ca: IonInfo): + E = (1e-3) * V + zeta = (2 * bu.faraday_constant * E )/( bu.gas_constant * (273.15 + self.T) * bu.kelvin) + zeta = zeta.to_decimal() + ci = Ca.C + co = 2 * bu.mM #co = Ca.C0 for Calciumdetailed + g_1 = (1e-6) * bu.faraday_constant * (ci - co * bu.math.exp(-zeta)) * (1 + zeta/2) + print(g_1) + g_2= (1e-6) * (zeta*bu.faraday_constant) * (ci - co*bu.math.exp(-zeta)) / (1-bu.math.exp(-zeta)) + return bu.math.where(bu.math.abs((1-bu.math.exp(-zeta))) <= 1e-6,g_1,g_2) def current(self, V, Ca: IonInfo): - return (1e3)*self.g_max * self.p.value ** 3 * self.q.value * self.ghk(V,Ca) + i = (1e3)*self.g_max * self.p.value ** 2 * self.q.value * self.ghk(V,Ca) + print(self.ghk(V,Ca)) + return (1e3)*self.g_max * self.p.value ** 2 * self.q.value * self.ghk(V,Ca) @@ -1145,7 +1160,7 @@ def __init__( self.T = bst.init.param(T, self.varshape, allow_none=False) self.T_base = bst.init.param(T_base, self.varshape, allow_none=False) self.V_sh = bst.init.param(V_sh, self.varshape, allow_none=False) - self.phi = bst.init.param( T_base ** ((T - 37) / 10), self.varshape, allow_none=False) + self.phi = bst.init.param( T_base ** ((T - 20) / 10), self.varshape, allow_none=False) self.eca = 129.33 * bu.mV @@ -1173,8 +1188,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None): def reset_state(self, V, Ca, batch_size=None): - self.m.value = self.f_m_inf(V,Ca) - self.h.value = self.f_h_inf(V,Ca) + self.m.value = self.f_m_inf(V) + self.h.value = self.f_h_inf(V) def compute_derivative(self, V, Ca): diff --git a/dendritex/channels/potassium_calcium.py b/dendritex/channels/potassium_calcium.py index 1edbd11..fa87d89 100644 --- a/dendritex/channels/potassium_calcium.py +++ b/dendritex/channels/potassium_calcium.py @@ -18,6 +18,9 @@ __all__ = [ 'IAHP_De1994', 'IKca3_1_Ma2020', + 'IKca2_2_Ma2020', + 'IKca1_1_Ma2020', + ] @@ -204,3 +207,257 @@ def reset_state(self, V, K: IonInfo, Ca: IonInfo, batch_size=None): def compute_derivative(self, V, K: IonInfo, Ca: IonInfo): self.p.derivative = self.phi * (self.p_inf(V,Ca) - self.p.value) / self.p_tau(V,Ca) / bu.ms + + + +class IKca2_2_Ma2020(KCaChannel): + r''' + TITLE SK2 multi-state model Cerebellum Golgi Cell Model + + COMMENT + + Author:Sergio Solinas, Lia Forti, Egidio DAngelo + Based on data from: Hirschberg, Maylie, Adelman, Marrion J Gen Physiol 1998 + Last revised: May 2007 + + Published in: + Sergio M. Solinas, Lia Forti, Elisabetta Cesana, + Jonathan Mapelli, Erik De Schutter and Egidio D`Angelo (2008) + Computational reconstruction of pacemaking and intrinsic + electroresponsiveness in cerebellar golgi cells + Frontiers in Cellular Neuroscience 2:2 + ''' + __module__ = 'dendritex.channels' + + root_type = bst.mixin.JointTypes[Potassium ,Calcium] + + def __init__( + self, + size: bst.typing.Size, + g_max: Union[bst.typing.ArrayLike, Callable] = 38. * (bu.mS / bu.cm ** 2), + T_base: bst.typing.ArrayLike = 3., + diff: bst.typing.ArrayLike = 3., + T: bst.typing.ArrayLike = 22, + name: Optional[str] = None, + mode: Optional[bst.mixin.Mode] = None, + ): + super().__init__( + size=size, + name=name, + mode=mode + ) + + # parameters + self.T = bst.init.param(T, self.varshape, allow_none=False) + self.T_base = bst.init.param(T_base, self.varshape, allow_none=False) + self.phi = bst.init.param(T_base ** ((T - 23) / 10), self.varshape, allow_none=False) + self.g_max = bst.init.param(g_max, self.varshape, allow_none=False) + self.diff = bst.init.param(diff, self.varshape, allow_none=False) + + self.invc1 = 80e-3 # (/ms) + self.invc2 = 80e-3 # (/ms) + self.invc3 = 200e-3 # (/ms) + + self.invo1 = 1 # (/ms) + self.invo2 = 100e-3 # (/ms) + self.diro1 = 160e-3 # (/ms) + self.diro2 = 1.2 # (/ms) + + self.dirc2 = 200 # (/ms-mM) + self.dirc3 = 160 # (/ms-mM) + self.dirc4 = 80 # (/ms-mM) + + def init_state(self, V, K: IonInfo, Ca: IonInfo, batch_size=None): + + self.C1 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.C2 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.C3 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.C4 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.O1 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.O2 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.O1, self.O2]) + + def reset_state(self, V, K: IonInfo, Ca: IonInfo, batch_size=None): + self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.O1, self.O2]) + + def current(self, V, K: IonInfo, Ca: IonInfo): + return self.g_max * (self.O1.value + self.O2.value) * (K.E - V) + + def before_integral(self, V, K: IonInfo, Ca: IonInfo): + self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.O1, self.O2]) + + def normalize_states(self, states): + total = 0. + for state in states: + state.value = bu.math.maximum(state.value, 0) + total = total + state.value + for state in states: + state.value = state.value/total + + def compute_derivative(self, V, K: IonInfo, Ca: IonInfo): + + self.C1.derivative = (self.C2.value * self.invc1_t(Ca) - self.C1.value * self.dirc2_t_ca(Ca)) / bu.ms + self.C2.derivative = (self.C3.value * self.invc2_t(Ca) + self.C1.value * self.dirc2_t_ca(Ca) - self.C2.value * (self.invc1_t(Ca) + self.dirc3_t_ca(Ca))) / bu.ms + self.C3.derivative = (self.C4.value * self.invc3_t(Ca) + self.O1.value * self.invo1_t(Ca) - self.C3.value * (self.dirc4_t_ca(Ca) + self.diro1_t(Ca))) / bu.ms + self.C4.derivative = (self.C3.value * self.dirc4_t_ca(Ca) + self.O2.value * self.invo2_t(Ca) - self.C4.value * (self.invc3_t(Ca) + self.diro2_t(Ca))) / bu.ms + self.O1.derivative = (self.C3.value * self.diro1_t(Ca) - self.O1.value * self.invo1_t(Ca)) / bu.ms + self.O2.derivative = (self.C4.value * self.diro2_t(Ca) - self.O2.value * self.invo2_t(Ca)) / bu.ms + + dirc2_t_ca = lambda self, Ca: self.dirc2_t * (Ca.C / bu.mM) / self.diff + dirc3_t_ca = lambda self, Ca: self.dirc3_t * (Ca.C / bu.mM) / self.diff + dirc4_t_ca = lambda self, Ca: self.dirc4_t * (Ca.C / bu.mM) / self.diff + + invc1_t = lambda self, Ca: self.invc1 * self.phi + invc2_t = lambda self, Ca: self.invc2 * self.phi + invc3_t = lambda self, Ca: self.invc3 * self.phi + invo1_t = lambda self, Ca: self.invo1 * self.phi + invo2_t = lambda self, Ca: self.invo2 * self.phi + diro1_t = lambda self, Ca: self.diro1 * self.phi + diro2_t = lambda self, Ca: self.diro2 * self.phi + dirc2_t = lambda self, Ca: self.dirc2 * self.phi + dirc3_t = lambda self, Ca: self.dirc3 * self.phi + dirc4_t = lambda self, Ca: self.dirc4 * self.phi + + +class IKca1_1_Ma2020(KCaChannel): + r''' + TITLE Large conductance Ca2+ activated K+ channel mslo + + COMMENT + + Parameters from Cox et al. (1987) J Gen Physiol 110:257-81 (patch 1). + + Current Model Reference: Anwar H, Hong S, De Schutter E (2010) Controlling Ca2+-activated K+ channels with models of Ca2+ buffering in Purkinje cell. Cerebellum* + + *Article available as Open Access + + PubMed link: http://www.ncbi.nlm.nih.gov/pubmed/20981513 + + + Written by Sungho Hong, Okinawa Institute of Science and Technology, March 2009. + Contact: Sungho Hong (shhong@oist.jp) + ''' + __module__ = 'dendritex.channels' + + root_type = bst.mixin.JointTypes[Potassium ,Calcium] + + def __init__( + self, + size: bst.typing.Size, + g_max: Union[bst.typing.ArrayLike, Callable] = 10. * (bu.mS / bu.cm ** 2), + T_base: bst.typing.ArrayLike = 3., + T: bst.typing.ArrayLike = 22., + name: Optional[str] = None, + mode: Optional[bst.mixin.Mode] = None, + ): + super().__init__( + size=size, + name=name, + mode=mode + ) + + # parameters + self.g_max = bst.init.param(g_max, self.varshape, allow_none=False) + self.T = bst.init.param(T, self.varshape, allow_none=False) + self.T_base = bst.init.param(T_base, self.varshape, allow_none=False) + self.phi = bst.init.param(T_base ** ((T - 23) / 10), self.varshape, allow_none=False) + + self.Qo = 0.73 + self.Qc = -0.67 + self.k1 = 1.0e3 + self.onoffrate = 1. + self.L0 = 1806 + self.Kc = 11.0e-3 + self.Ko = 1.1e-3 + + self.pf0 = 2.39e-3 + self.pf1 = 7.0e-3 + self.pf2 = 40e-3 + self.pf3 = 295e-3 + self.pf4 = 557e-3 + + self.pb0 = 3936e-3 + self.pb1 = 1152e-3 + self.pb2 = 659e-3 + self.pb3 = 486e-3 + self.pb4 = 92e-3 + def init_state(self, V, K: IonInfo, Ca: IonInfo, batch_size=None): + + for i in range(5): + setattr(self, f'C{i}', State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size))) + + for i in range(5): + setattr(self, f'O{i}', State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size))) + + self.normalize_states([getattr(self, f'C{i}') for i in range(5)] + [getattr(self, f'O{i}') for i in range(5)]) + + def reset_state(self, V, K: IonInfo, Ca: IonInfo, batch_size=None): + self.normalize_states([getattr(self, f'C{i}') for i in range(5)] + [getattr(self, f'O{i}') for i in range(5)]) + + def current(self, V, K: IonInfo, Ca: IonInfo): + return self.g_max * (self.O1.value + self.O2.value) * (K.E - V) + + def before_integral(self, V, K: IonInfo, Ca: IonInfo): + self.normalize_states([getattr(self, f'C{i}') for i in range(5)] + [getattr(self, f'O{i}') for i in range(5)]) + + def normalize_states(self, states): + total = 0. + for state in states: + state.value = bu.math.maximum(state.value, 0) + total = total + state.value + for state in states: + state.value = state.value/total + + + def compute_derivative(self, V, K: IonInfo, Ca: IonInfo): + + self.C0.derivative = (self.C1 * self.c10(Ca) + self.O0 * self.b0(V) - self.C0 * (self.c01(Ca) + self.f0(V))) / bu.ms + self.C1.derivative = (self.C0 * self.c01(Ca) + self.C2 * self.c21(Ca) + self.O1 * self.b1(V) - self.C1 * (self.c10(Ca) + self.c12(Ca) + self.f1(V))) / bu.ms + self.C2.derivative = (self.C1 * self.c12(Ca) + self.C3 * self.c32(Ca) + self.O2 * self.b2(V) - self.C2 * (self.c21(Ca) + self.c23(Ca) + self.f2(V))) / bu.ms + self.C3.derivative = (self.C2 * self.c23(Ca) + self.C4 * self.c43(Ca) + self.O3 * self.b3(V) - self.C3 * (self.c32(Ca) + self.c34(Ca) + self.f3(V))) / bu.ms + self.C4.derivative = (self.C3 * self.c34(Ca) + self.O4 * self.b4(V) - self.C4 * (self.c43(Ca) + self.f4(V))) / bu.ms + + self.O0.derivative = (self.O1 * self.o10(Ca) + self.C0 * self.f0(V) - self.O0 * (self.o01(Ca) + self.b0(V))) / bu.ms + self.O1.derivative = (self.O0 * self.o01(Ca) + self.O2 * self.o21(Ca) + self.C1 * self.f1(V) - self.O1 * (self.o10(Ca) + self.o12(Ca) + self.b1(V))) / bu.ms + self.O2.derivative = (self.O1 * self.o12(Ca) + self.O3 * self.o32(Ca) + self.C2 * self.f2(V) - self.O2 * (self.o21(Ca) + self.o23(Ca) + self.b2(V))) / bu.ms + self.O3.derivative = (self.O2 * self.o23(Ca) + self.O4 * self.o43(Ca) + self.C3 * self.f3(V) - self.O3 * (self.o32(Ca) + self.o34(Ca) + self.b3(V))) / bu.ms + self.O4.derivative = (self.O3 * self.o34(Ca) + self.C4 * self.f4(V) - self.O4 * (self.o43(Ca) + self.b4(V))) / bu.ms + + + def current(self, V, K: IonInfo, Ca: IonInfo): + return self.g_max * (self.O0.value + self.O1.value + self.O2.value + self.O3.value + self.O4.value) * ( K.E - V) + + c01 = lambda self, Ca: 4 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + c12 = lambda self, Ca: 3 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + c23 = lambda self, Ca: 2 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + c34 = lambda self, Ca: 1 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + + o01 = lambda self, Ca: 4 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + o12 = lambda self, Ca: 3 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + o23 = lambda self, Ca: 2 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + o34 = lambda self, Ca: 1 * (Ca.C/ bu.mM) * self.k1 * self.onoffrate * self.phi + + c10 = lambda self, Ca: 1 * self.Kc * self.k1 * self.onoffrate * self.phi + c21 = lambda self, Ca: 2 * self.Kc * self.k1 * self.onoffrate * self.phi + c32 = lambda self, Ca: 3 * self.Kc * self.k1 * self.onoffrate * self.phi + c43 = lambda self, Ca: 4 * self.Kc * self.k1 * self.onoffrate * self.phi + + o10 = lambda self, Ca: 1 * self.Ko * self.k1 * self.onoffrate * self.phi + o21 = lambda self, Ca: 2 * self.Ko * self.k1 * self.onoffrate * self.phi + o32 = lambda self, Ca: 3 * self.Ko * self.k1 * self.onoffrate * self.phi + o43 = lambda self, Ca: 4 * self.Ko * self.k1 * self.onoffrate * self.phi + + alpha = lambda self, V : bu.math.exp((self.Qo * bu.faraday_constant * V) / (bu.gas_constant * (273.15 + self.T) * bu.kelvin)) + beta = lambda self, V : bu.math.exp((self.Qc * bu.faraday_constant * V) / (bu.gas_constant * (273.15 + self.T) * bu.kelvin)) + + f0 = lambda self, V: self.pf0 * self.alpha(V) * self.phi + f1 = lambda self, V: self.pf1 * self.alpha(V) * self.phi + f2 = lambda self, V: self.pf2 * self.alpha(V) * self.phi + f3 = lambda self, V: self.pf3 * self.alpha(V) * self.phi + f4 = lambda self, V: self.pf4 * self.alpha(V) * self.phi + + b0 = lambda self, V: self.pb0 * self.beta(V) * self.phi + b1 = lambda self, V: self.pb1 * self.beta(V) * self.phi + b2 = lambda self, V: self.pb2 * self.beta(V) * self.phi + b3 = lambda self, V: self.pb3 * self.beta(V) * self.phi + b4 = lambda self, V: self.pb4 * self.beta(V) * self.phi \ No newline at end of file diff --git a/dendritex/channels/sodium.py b/dendritex/channels/sodium.py index 1e4894a..598cdb1 100644 --- a/dendritex/channels/sodium.py +++ b/dendritex/channels/sodium.py @@ -430,28 +430,21 @@ def init_state(self, V, Na: IonInfo, batch_size=None): self.I4 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) self.I5 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) self.O = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size)) - self.B = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) + self.B = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size)) self.I6 = State4Integral(bst.init.param(bu.math.ones, self.varshape, batch_size)) - self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.C5, self.I1, self.I2, self.I3, self.I4, self.I5, self.O, self.B, self.I6]) def normalize_states(self, states): total = 0. for state in states: state.value = bu.math.maximum(state.value, 0) total = total + state.value - for state in states: state.value = state.value/total def before_integral(self, V, Na: IonInfo): self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.C5, self.I1, self.I2, self.I3, self.I4, self.I5, self.O, self.B, self.I6]) - def after_integral(self, V, Na: IonInfo): - self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.C5, self.I1, self.I2, self.I3, self.I4, self.I5, self.O, self.B, self.I6]) - def compute_derivative(self, V, Na: IonInfo): - - #self.I6.derivative = 0. / bu.ms self.C1.derivative = (self.I1.value * self.bi1(V) + self.C2.value * self.b01(V) - self.C1.value * (self.fi1(V) + self.f01(V))) / bu.ms self.C2.derivative = (self.C1.value * self.f01(V) + self.I2.value * self.bi2(V) + self.C3.value * self.b02(V) - self.C2.value * (self.b01(V) + self.fi2(V) + self.f02(V)))/ bu.ms @@ -467,18 +460,12 @@ def compute_derivative(self, V, Na: IonInfo): self.I5.derivative = (self.I4.value * self.f14(V) + self.C5.value * self.fi5(V) + self.I6.value * self.b1n(V) - self.I5.value * (self.b14(V) + self.bi5(V) + self.f1n(V)))/ bu.ms self.I6.derivative = (self.I5.value * self.f1n(V) + self.O.value * self.fin(V) - self.I6.value * (self.b1n(V) + self.bin(V))) / bu.ms - #print(f"O: {jax.device_get(self.O.value)}, B: {jax.device_get(self.B.value)}") - - def reset_state(self, V, Na: IonInfo, batch_size=None): - self.normalize_states([self.C1, self.C2, self.C3, self.C4, self.C5, self.I1, self.I2, self.I3, self.I4, self.I5, self.O, self.B, self.I6]) def current(self, V, Na: IonInfo): - return self.g_max * self.O.value * (Na.E - V) - f01 = lambda self, V: 4 * self.alpha * bu.math.exp((V/ bu.mV) / self.x1) * self.phi f02 = lambda self, V: 3 * self.alpha * bu.math.exp((V/ bu.mV) / self.x1) * self.phi f03 = lambda self, V: 2 * self.alpha * bu.math.exp((V/ bu.mV) / self.x1) * self.phi diff --git a/examples/golgi_model/golgi.ipynb b/examples/golgi_model/golgi.ipynb index 9b2b9b3..c6882da 100644 --- a/examples/golgi_model/golgi.ipynb +++ b/examples/golgi_model/golgi.ipynb @@ -6,20 +6,26 @@ "metadata": {}, "outputs": [], "source": [ - "from typing import Callable, Sequence\n", + "import sys\n", + "import os\n", + "\n", + "current_dir = os.path.dirname(os.path.abspath('.'))\n", + "project_root = os.path.abspath(os.path.join(current_dir, '..', '..'))\n", + "dendritex_path = os.path.join(project_root, 'dendritex')\n", + "sys.path.insert(0, dendritex_path)\n", + "\n", + "import time\n", "import brainstate as bst\n", "import braintools as bts\n", - "import brainunit as bu\n", + "import brainunit as u\n", "import jax\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", - "from scipy.optimize import minimize\n", "import dendritex as dx\n", - "from dendritex import IonInfo\n", - "import golgi_mophology\n", "\n", - "bst.environ.set(dt=0.001 * bu.ms)\n", - "s = bu.mS / (bu.cm ** 2)" + "bst.environ.set(precision=64)\n", + "\n", + "jax.config.update(\"jax_disable_jit\", True)" ] }, { @@ -44,14 +50,74 @@ "index_soma = loaded_params['index_soma']\n", "index_axon = loaded_params['index_axon']\n", "index_dend_basal = loaded_params['index_dend_basal']\n", - "index_dend_apical = loaded_params['index_dend_apical']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## test ion " + "index_dend_apical = loaded_params['index_dend_apical']\n", + "\n", + "## conductvalues \n", + "conductvalues = 1e3 * np.array([\n", + "\n", + " 0.00499506303209, 0.01016375552607, 0.00247172479141, 0.00128859564935,\n", + " 3.690771983E-05, 0.0080938853146, 0.01226052748146, 0.01650689958385,\n", + " 0.00139885617712, 0.14927733727426, 0.00549507510519, 0.14910988921938,\n", + " 0.00406420380423, 0.01764345789036, 0.10177335775222, 0.0087689418803,\n", + " 3.407734319E-05, 0.0003371456442, 0.00030643090764, 0.17233663543619,\n", + " 0.00024381226198, 0.10008178886943, 0.00595046001148, 0.0115, 0.0091\n", + "])\n", + "\n", + "## IL \n", + "gl = np.ones(n_compartments)\n", + "gl[index_soma] = 0.03\n", + "gl[index_axon] = 0.001\n", + "gl[index_axon[0]] = 0.03\n", + "gl[index_dend_basal] = 0.03\n", + "gl[index_dend_apical] = 0.03\n", + "\n", + "## IKv11_Ak2007\n", + "gkv11 = np.zeros(n_compartments)\n", + "gkv11[index_soma] = conductvalues[10]\n", + "\n", + "## IKv34_Ma2020 \n", + "gkv34 = np.zeros(n_compartments)\n", + "gkv34[index_soma] = conductvalues[11]\n", + "gkv34[index_axon[1:]] = 9.1\n", + "\n", + "## IKv43_Ma2020\n", + "gkv43 = np.zeros(n_compartments)\n", + "gkv43[index_soma] = conductvalues[12]\n", + "\n", + "## ICaGrc_Ma2020\n", + "gcagrc = np.zeros(n_compartments)\n", + "gcagrc[index_soma] = conductvalues[15]\n", + "gcagrc[index_dend_basal] = conductvalues[8]\n", + "gcagrc[index_axon[0]] = conductvalues[22]\n", + "\n", + "## ICav23_Ma2020\n", + "gcav23 = np.zeros(n_compartments)\n", + "gcav23[index_dend_apical] = conductvalues[3]\n", + "\n", + "## ICav31_Ma2020 \n", + "gcav31 = np.zeros(n_compartments)\n", + "gcav31[index_soma] = conductvalues[16]\n", + "gcav31[index_dend_apical] = conductvalues[4]\n", + "\n", + "## INa_Rsg\n", + "gnarsg = np.zeros(n_compartments)\n", + "gnarsg [index_soma] = conductvalues[9]\n", + "gnarsg[index_dend_apical] = conductvalues[0]\n", + "gnarsg[index_dend_basal] = conductvalues[5]\n", + "gnarsg[index_axon[0]] = conductvalues[19]\n", + "gnarsg[index_axon[1:]] = 11.5\n", + "\n", + "## Ih1_Ma2020 \n", + "gh1 = np.zeros(n_compartments)\n", + "gh1[index_axon[0]] = conductvalues[17]\n", + "\n", + "## Ih1_Ma2020 \n", + "gh2 = np.zeros(n_compartments)\n", + "gh2[index_axon[0]] = conductvalues[18]\n", + "\n", + "## IKca3_1_Ma2020 \n", + "gkca31 = np.zeros(n_compartments)\n", + "gkca31[index_soma] = conductvalues[14]" ] }, { @@ -60,300 +126,180 @@ "metadata": {}, "outputs": [], "source": [ - "connection = ((1,2),(2,3))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ + "# single ion test\n", + "connection = ((1,2),(2,3))\n", "gl = np.zeros(n_compartments) \n", - "gh = np.zeros(n_compartments) \n", - "gh[index_soma] = 0.2" + "g_test = np.zeros(n_compartments) \n", + "g_test[index_soma] = 20" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class Golgi(dx.neurons.MultiCompartment):\n", - " def __init__(self, size , connection, Ra, cm, diam, L, gl, gh):\n", + " def __init__(self, size, connection, Ra, cm, diam, L, gl, g_test):\n", " super().__init__(\n", - " size = size,\n", - " connection = connection,\n", - " Ra = Ra * bu.ohm * bu.cm,\n", - " cm = cm * bu.uF / bu.cm ** 2,\n", - " diam = diam * bu.um,\n", - " L = L * bu.um,\n", - " V_th = 20. * bu.mV,\n", - " V_initializer = bst.init.Constant(-55 * bu.mV),\n", - " spk_fun = bst.surrogate.ReluGrad(),\n", + " size=size,\n", + " connection=connection,\n", + " Ra=Ra * u.ohm * u.cm,\n", + " cm=cm * u.uF / u.cm ** 2,\n", + " diam=diam * u.um,\n", + " L=L * u.um,\n", + " V_th=20. * u.mV,\n", + " V_initializer=bst.init.Constant(-55 * u.mV),\n", + " spk_fun=bst.surrogate.ReluGrad(),\n", " )\n", "\n", - " self.IL = dx.channels.IL(self.size, E = -55. * bu.mV, g_max = gl*s )\n", - " #self.Ih1 = dx.channels.Ih2_Ma2020(self.size, E = -20. * bu.mV, g_max = gh*s )\n", - " self.ca = dx.ions.CalciumFixed(self.size, E = 130.* bu.mV , C = 5e-5 *bu.mM )\n", - " self.ca.add_elem(dx.channels.ICav31_Ma2020(self.size, g_max = gh*s ))\n", - " \n", - " def step_run(self, t, inp):\n", - " dx.rk4_step(self, t, inp)\n", - " return self.V.value, self.spike.value" + " self.IL = dx.channels.IL(self.size, E=-55. * u.mV, g_max=gl * u.mS / (u.cm ** 2))\n", + " #self.Ih1 = dx.channels.Ih1_Ma2020(self.size, E=-20. * u.mV, g_max=g_test * u.mS / (u.cm ** 2))\n", + " #self.k = dx.ions.PotassiumFixed(self.size, E=-80. * u.mV)\n", + " #self.k.add_elem(dx.channels.IKv34_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))\n", + " self.ca = dx.ions.CalciumFixed(self.size, E=137.* u.mV, C =5e-5 * u.mM)\n", + " self.ca.add_elem(dx.channels.ICav31_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))\n", + " #self.kca = dx.MixIons(self.k, self.ca)\n", + " #self.kca.add_elem(dx.channels.IKca1_1_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))" ] }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import partial\n", - "\n", - "#static_args = np.arange(1, 9)\n", - "#@partial(jax.jit, static_argnums=static_args)\n", - "#@jax.jit\n", - "def simulate(currents, size , connection, Ra, cm, diam, L, gl, gkv11):\n", - " cell = Golgi(size , connection, Ra, cm, diam, L, gl, gkv11)\n", - " cell.init_state()\n", - " cell.reset_state()\n", - "\n", - " times = np.arange(0, currents.shape[0]) * bst.environ.get_dt()\n", - " vs, spks = bst.transform.for_loop(cell.step_run, times, currents)\n", - " \n", - " return vs, spks \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def visualize_a_simulate(currents, size ,connection, Ra, cm, diam, L, gl, gkv11):\n", - " times = np.arange(0, currents.shape[0]) * bst.environ.get_dt()\n", - " vs, spks = simulate(currents, size ,connection, Ra, cm, diam, L, gl, gkv11)\n", - "\n", - " fig, gs = bts.visualize.get_figure(1, 1, 3.0, 4.0)\n", - " ax = fig.add_subplot(gs[0, 0])\n", - " plt.plot(times / bu.ms, bu.math.squeeze(vs / bu.mV))\n", - " plt.xlabel('Time [ms]')\n", - " plt.ylabel('Potential [mV]')\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "jax.config.update(\"jax_disable_jit\", True)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "ArrayImpl([[-0.19338109, -0.19338109, -0.19338109, -0.19338109,\n", - " -0.19338109, -0.19338109... * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n" + "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n", + "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n", + "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n", + "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n" ] }, { "ename": "UnitMismatchError", - "evalue": "Cannot calculate [[0. 0. ... 0. 0.]] + [[-0.39344537 -0. ... -0. -0. ]], units do not match (units are mS/cmeter2 * mV and mS/cmeter2 * Unit(10.0^0) * Unit(10.0^0) * Unit(10.0^0) * C/mol * Unit(10.0^0) * mM * Unit(10.0^0)).", + "evalue": "Cannot calculate Tracedwith + Tracedwith, units do not match (units are mS/cmeter2 * mV and mS/cmeter2 * Unit(10.0^0) * Unit(10.0^0) * Unit(10.0^0) * C/mol * Unit(10.0^0) * mM * Unit(10.0^0)).", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mUnitMismatchError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[9], line 5\u001b[0m\n\u001b[0;32m 3\u001b[0m inp_traces[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m,\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.00\u001b[39m \u001b[38;5;241m*\u001b[39m bu\u001b[38;5;241m.\u001b[39mnA\n\u001b[0;32m 4\u001b[0m inp_traces[:,\u001b[38;5;28mint\u001b[39m(n_seq\u001b[38;5;241m/\u001b[39m\u001b[38;5;241m2\u001b[39m):,:] \u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0.00\u001b[39m \u001b[38;5;241m*\u001b[39m bu\u001b[38;5;241m.\u001b[39mnA\n\u001b[1;32m----> 5\u001b[0m \u001b[43mvisualize_a_simulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43minp_traces\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mconnection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mRa\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiam\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgh\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[1;32mIn[7], line 3\u001b[0m, in \u001b[0;36mvisualize_a_simulate\u001b[1;34m(currents, size, connection, Ra, cm, diam, L, gl, gkv11)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mvisualize_a_simulate\u001b[39m(currents, size ,connection, Ra, cm, diam, L, gl, gkv11):\n\u001b[0;32m 2\u001b[0m times \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;241m0\u001b[39m, currents\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]) \u001b[38;5;241m*\u001b[39m bst\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget_dt()\n\u001b[1;32m----> 3\u001b[0m vs, spks \u001b[38;5;241m=\u001b[39m \u001b[43msimulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcurrents\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[43m \u001b[49m\u001b[43m,\u001b[49m\u001b[43mconnection\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mRa\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiam\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgkv11\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 5\u001b[0m fig, gs \u001b[38;5;241m=\u001b[39m bts\u001b[38;5;241m.\u001b[39mvisualize\u001b[38;5;241m.\u001b[39mget_figure(\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m3.0\u001b[39m, \u001b[38;5;241m4.0\u001b[39m)\n\u001b[0;32m 6\u001b[0m ax \u001b[38;5;241m=\u001b[39m fig\u001b[38;5;241m.\u001b[39madd_subplot(gs[\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m])\n", - "Cell \u001b[1;32mIn[6], line 12\u001b[0m, in \u001b[0;36msimulate\u001b[1;34m(currents, size, connection, Ra, cm, diam, L, gl, gkv11)\u001b[0m\n\u001b[0;32m 9\u001b[0m cell\u001b[38;5;241m.\u001b[39mreset_state()\n\u001b[0;32m 11\u001b[0m times \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;241m0\u001b[39m, currents\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m]) \u001b[38;5;241m*\u001b[39m bst\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget_dt()\n\u001b[1;32m---> 12\u001b[0m vs, spks \u001b[38;5;241m=\u001b[39m \u001b[43mbst\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfor_loop\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcell\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep_run\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimes\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcurrents\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 14\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m vs, spks\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_loop_collect_return.py:401\u001b[0m, in \u001b[0;36mfor_loop\u001b[1;34m(f, length, reverse, unroll, pbar, *xs)\u001b[0m\n\u001b[0;32m 359\u001b[0m \u001b[38;5;129m@set_module_as\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbrainstate.transform\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 360\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfor_loop\u001b[39m(\n\u001b[0;32m 361\u001b[0m f: Callable[[X], Y],\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 366\u001b[0m pbar: Optional[ProgressBar] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 367\u001b[0m ):\n\u001b[0;32m 368\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 369\u001b[0m \u001b[38;5;124;03m ``for-loop`` control flow with :py:class:`~.State`.\u001b[39;00m\n\u001b[0;32m 370\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 399\u001b[0m \n\u001b[0;32m 400\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 401\u001b[0m _, ys \u001b[38;5;241m=\u001b[39m \u001b[43mscan\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 402\u001b[0m \u001b[43m \u001b[49m\u001b[43m_forloop_to_scan_fun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 403\u001b[0m \u001b[43m \u001b[49m\u001b[43minit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 404\u001b[0m \u001b[43m \u001b[49m\u001b[43mxs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mxs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 405\u001b[0m \u001b[43m \u001b[49m\u001b[43mlength\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlength\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 406\u001b[0m \u001b[43m \u001b[49m\u001b[43mreverse\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreverse\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 407\u001b[0m \u001b[43m \u001b[49m\u001b[43munroll\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43munroll\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 408\u001b[0m \u001b[43m \u001b[49m\u001b[43mpbar\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpbar\u001b[49m\n\u001b[0;32m 409\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 410\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ys\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_loop_collect_return.py:200\u001b[0m, in \u001b[0;36mscan\u001b[1;34m(f, init, xs, length, reverse, unroll, pbar)\u001b[0m\n\u001b[0;32m 198\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m maybe_reversed(\u001b[38;5;28mrange\u001b[39m(length)):\n\u001b[0;32m 199\u001b[0m xs_slice \u001b[38;5;241m=\u001b[39m [jax\u001b[38;5;241m.\u001b[39mlax\u001b[38;5;241m.\u001b[39mindex_in_dim(x, i, keepdims\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m) \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m xs_flat]\n\u001b[1;32m--> 200\u001b[0m carry, y \u001b[38;5;241m=\u001b[39m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcarry\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mjax\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtree\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43munflatten\u001b[49m\u001b[43m(\u001b[49m\u001b[43mxs_tree\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxs_slice\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 201\u001b[0m ys\u001b[38;5;241m.\u001b[39mappend(y)\n\u001b[0;32m 202\u001b[0m stacked_y \u001b[38;5;241m=\u001b[39m jax\u001b[38;5;241m.\u001b[39mtree\u001b[38;5;241m.\u001b[39mmap(\u001b[38;5;28;01mlambda\u001b[39;00m \u001b[38;5;241m*\u001b[39melems: jnp\u001b[38;5;241m.\u001b[39mstack(elems), \u001b[38;5;241m*\u001b[39mmaybe_reversed(ys))\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_loop_collect_return.py:354\u001b[0m, in \u001b[0;36m_forloop_to_scan_fun..scan_fun\u001b[1;34m(carry, x)\u001b[0m\n\u001b[0;32m 352\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mscan_fun\u001b[39m(carry, x):\n\u001b[1;32m--> 354\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m carry, \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[1;32mIn[5], line 21\u001b[0m, in \u001b[0;36mGolgi.step_run\u001b[1;34m(self, t, inp)\u001b[0m\n\u001b[0;32m 20\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mstep_run\u001b[39m(\u001b[38;5;28mself\u001b[39m, t, inp):\n\u001b[1;32m---> 21\u001b[0m \u001b[43mdx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrk4_step\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 22\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mvalue, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mspike\u001b[38;5;241m.\u001b[39mvalue\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\dendritex\\_integrators.py:164\u001b[0m, in \u001b[0;36mrk4_step\u001b[1;34m(target, t, *args)\u001b[0m\n\u001b[0;32m 162\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m bst\u001b[38;5;241m.\u001b[39mStateTrace() \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[0;32m 163\u001b[0m target\u001b[38;5;241m.\u001b[39mbefore_integral(\u001b[38;5;241m*\u001b[39margs)\n\u001b[1;32m--> 164\u001b[0m \u001b[43mtarget\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute_derivative\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 166\u001b[0m \u001b[38;5;66;03m# state collection\u001b[39;00m\n\u001b[0;32m 167\u001b[0m states \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mtuple\u001b[39m([st \u001b[38;5;28;01mfor\u001b[39;00m st \u001b[38;5;129;01min\u001b[39;00m trace\u001b[38;5;241m.\u001b[39mstates \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(st, State4Integral)])\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\dendritex\\neurons\\multi_compartment.py:221\u001b[0m, in \u001b[0;36mMultiCompartment.compute_derivative\u001b[1;34m(self, I_ext)\u001b[0m\n\u001b[0;32m 219\u001b[0m I_channel \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 220\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ch \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnodes(level\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, include_self\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\u001b[38;5;241m.\u001b[39msubset(IonChannel)\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m--> 221\u001b[0m I_channel \u001b[38;5;241m=\u001b[39m ch\u001b[38;5;241m.\u001b[39mcurrent(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mvalue) \u001b[38;5;28;01mif\u001b[39;00m I_channel \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m (\u001b[43mI_channel\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcurrent\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mV\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[0;32m 222\u001b[0m \u001b[38;5;66;03m# 4. derivatives\u001b[39;00m\n\u001b[0;32m 223\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mderivative \u001b[38;5;241m=\u001b[39m (I_ext \u001b[38;5;241m+\u001b[39m I_axial \u001b[38;5;241m+\u001b[39m I_syn \u001b[38;5;241m+\u001b[39m I_channel) \u001b[38;5;241m/\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcm\n", + "Cell \u001b[1;32mIn[5], line 92\u001b[0m\n\u001b[0;32m 88\u001b[0m plot(ys_kvaerno5, fig\u001b[38;5;241m.\u001b[39madd_subplot(gs[\u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m0\u001b[39m]), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mkvaerno5\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 90\u001b[0m plt\u001b[38;5;241m.\u001b[39mshow()\n\u001b[1;32m---> 92\u001b[0m \u001b[43mvisualize_a_simulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mRa\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiam\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mg_test\u001b[49m\u001b[43m)\u001b[49m\n", + "Cell \u001b[1;32mIn[5], line 50\u001b[0m, in \u001b[0;36mvisualize_a_simulate\u001b[1;34m(Ra, cm, diam, L, gl, gkv11)\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mvisualize_a_simulate\u001b[39m(Ra, cm, diam, L, gl, gkv11):\n\u001b[0;32m 49\u001b[0m t0 \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m---> 50\u001b[0m ts, ys_kvaerno5, steps \u001b[38;5;241m=\u001b[39m \u001b[43msimulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mRa\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiam\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgkv11\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mkvaerno5\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 51\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mkvaerno5\u001b[39m\u001b[38;5;124m'\u001b[39m, steps)\n\u001b[0;32m 52\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m, time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m-\u001b[39m t0)\n", + "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_jit.py:78\u001b[0m, in \u001b[0;36m_get_jitted_fun..jitted_fun\u001b[1;34m(*args, **params)\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(fun\u001b[38;5;241m.\u001b[39mfun)\n\u001b[0;32m 76\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mjitted_fun\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams):\n\u001b[0;32m 77\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m jax\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mjax_disable_jit:\n\u001b[1;32m---> 78\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fun\u001b[38;5;241m.\u001b[39mfun(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n\u001b[0;32m 79\u001b[0m states \u001b[38;5;241m=\u001b[39m fun\u001b[38;5;241m.\u001b[39mcompile_and_get_states_by_static_args(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 80\u001b[0m state_vals, outs \u001b[38;5;241m=\u001b[39m jit_fun([st\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;28;01mfor\u001b[39;00m st \u001b[38;5;129;01min\u001b[39;00m states], \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n", + "Cell \u001b[1;32mIn[5], line 19\u001b[0m, in \u001b[0;36msimulate\u001b[1;34m(Ra, cm, diam, L, gl, gkv11, method)\u001b[0m\n\u001b[0;32m 17\u001b[0m dt \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.01\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms\n\u001b[0;32m 18\u001b[0m ts \u001b[38;5;241m=\u001b[39m u\u001b[38;5;241m.\u001b[39mmath\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;241m0.\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms, \u001b[38;5;241m200.\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms, dt)\n\u001b[1;32m---> 19\u001b[0m ts, ys, steps \u001b[38;5;241m=\u001b[39m \u001b[43mdx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdiffrax_solve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 20\u001b[0m \u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m200.\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 21\u001b[0m \u001b[43m \u001b[49m\u001b[43msavefn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43matol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1e-5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# max_steps=200000,\u001b[39;49;00m\n\u001b[0;32m 22\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 24\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ts, ys, steps\n", + "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\_integrators.py:324\u001b[0m, in \u001b[0;36mdiffrax_solve\u001b[1;34m(model, solver, t0, t1, dt0, saveat, savefn, args, rtol, atol, max_steps, adjoint)\u001b[0m\n\u001b[0;32m 271\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdiffrax_solve\u001b[39m(\n\u001b[0;32m 272\u001b[0m model: Callable,\n\u001b[0;32m 273\u001b[0m solver: \u001b[38;5;28mstr\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 283\u001b[0m adjoint: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcheckpoint\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 284\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[u\u001b[38;5;241m.\u001b[39mQuantity, bst\u001b[38;5;241m.\u001b[39mtyping\u001b[38;5;241m.\u001b[39mPyTree[u\u001b[38;5;241m.\u001b[39mQuantity], Dict]:\n\u001b[0;32m 285\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \u001b[38;5;124;03m Solve the differential equations using `diffrax `_.\u001b[39;00m\n\u001b[0;32m 287\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 322\u001b[0m \u001b[38;5;124;03m - The running step statistics.\u001b[39;00m\n\u001b[0;32m 323\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_diffrax_solve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 325\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 326\u001b[0m \u001b[43m \u001b[49m\u001b[43msolver\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msolver\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 327\u001b[0m \u001b[43m \u001b[49m\u001b[43mt0\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mt0\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 328\u001b[0m \u001b[43m \u001b[49m\u001b[43mt1\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mt1\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 329\u001b[0m \u001b[43m \u001b[49m\u001b[43mdt0\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdt0\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 330\u001b[0m \u001b[43m \u001b[49m\u001b[43msaveat\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msaveat\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 331\u001b[0m \u001b[43m \u001b[49m\u001b[43msavefn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msavefn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 332\u001b[0m \u001b[43m \u001b[49m\u001b[43madjoint\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43madjoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 333\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 334\u001b[0m \u001b[43m \u001b[49m\u001b[43mrtol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrtol\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 335\u001b[0m \u001b[43m \u001b[49m\u001b[43matol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43matol\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 336\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_steps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmax_steps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 337\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\_integrators.py:124\u001b[0m, in \u001b[0;36m_diffrax_solve\u001b[1;34m(model, solver, t0, t1, dt0, adjoint, saveat, savefn, args, rtol, atol, max_steps)\u001b[0m\n\u001b[0;32m 121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m derivatives\n\u001b[0;32m 123\u001b[0m \u001b[38;5;66;03m# stateful function and make jaxpr\u001b[39;00m\n\u001b[1;32m--> 124\u001b[0m stateful_fn \u001b[38;5;241m=\u001b[39m \u001b[43mbst\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mStatefulFunction\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel_to_derivative\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_jaxpr\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0.\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 126\u001b[0m \u001b[38;5;66;03m# states\u001b[39;00m\n\u001b[0;32m 127\u001b[0m states \u001b[38;5;241m=\u001b[39m stateful_fn\u001b[38;5;241m.\u001b[39mget_states()\n", + "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:419\u001b[0m, in \u001b[0;36mStatefulFunction.make_jaxpr\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 417\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n\u001b[0;32m 418\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m--> 419\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[0;32m 421\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\n", + "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:402\u001b[0m, in \u001b[0;36mStatefulFunction.make_jaxpr\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cache_key \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state_trace:\n\u001b[0;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 401\u001b[0m \u001b[38;5;66;03m# jaxpr\u001b[39;00m\n\u001b[1;32m--> 402\u001b[0m jaxpr, (out_shapes, state_shapes) \u001b[38;5;241m=\u001b[39m _make_jaxpr(\n\u001b[0;32m 403\u001b[0m functools\u001b[38;5;241m.\u001b[39mpartial(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wrapped_fun_to_eval, cache_key),\n\u001b[0;32m 404\u001b[0m static_argnums\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstatic_argnums,\n\u001b[0;32m 405\u001b[0m axis_env\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis_env,\n\u001b[0;32m 406\u001b[0m return_shape\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[0;32m 407\u001b[0m abstracted_axes\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mabstracted_axes\n\u001b[0;32m 408\u001b[0m )(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 410\u001b[0m \u001b[38;5;66;03m# returns\u001b[39;00m\n\u001b[0;32m 411\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jaxpr_out_tree[cache_key] \u001b[38;5;241m=\u001b[39m jax\u001b[38;5;241m.\u001b[39mtree\u001b[38;5;241m.\u001b[39mstructure((out_shapes, state_shapes))\n", + " \u001b[1;31m[... skipping hidden 1 frame]\u001b[0m\n", + "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:726\u001b[0m, in \u001b[0;36m_make_jaxpr..make_jaxpr_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 724\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m axis_name, size \u001b[38;5;129;01min\u001b[39;00m axis_env \u001b[38;5;129;01mor\u001b[39;00m []:\n\u001b[0;32m 725\u001b[0m stack\u001b[38;5;241m.\u001b[39menter_context(jax\u001b[38;5;241m.\u001b[39mcore\u001b[38;5;241m.\u001b[39mextend_axis_env(axis_name, size, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m--> 726\u001b[0m jaxpr, out_type, consts \u001b[38;5;241m=\u001b[39m \u001b[43mpe\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrace_to_jaxpr_dynamic2\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdebug_info\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdebug_info\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 727\u001b[0m closed_jaxpr \u001b[38;5;241m=\u001b[39m jax\u001b[38;5;241m.\u001b[39mcore\u001b[38;5;241m.\u001b[39mClosedJaxpr(jaxpr, consts)\n\u001b[0;32m 728\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m return_shape:\n", + " \u001b[1;31m[... skipping hidden 4 frame]\u001b[0m\n", + "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:371\u001b[0m, in \u001b[0;36mStatefulFunction._wrapped_fun_to_eval\u001b[1;34m(self, cache_key, *args, **kwargs)\u001b[0m\n\u001b[0;32m 369\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state_trace[cache_key] \u001b[38;5;241m=\u001b[39m _state_trace\n\u001b[0;32m 370\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _state_trace:\n\u001b[1;32m--> 371\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfun(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 372\u001b[0m state_values \u001b[38;5;241m=\u001b[39m _state_trace\u001b[38;5;241m.\u001b[39mcollect_values(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mread\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwrite\u001b[39m\u001b[38;5;124m'\u001b[39m, check_val_tree\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 373\u001b[0m _state_trace\u001b[38;5;241m.\u001b[39mrecovery_original_values()\n", + "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\_integrators.py:109\u001b[0m, in \u001b[0;36m_diffrax_solve..model_to_derivative\u001b[1;34m(t, *args)\u001b[0m\n\u001b[0;32m 107\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m bst\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mcontext(t\u001b[38;5;241m=\u001b[39mt \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms):\n\u001b[0;32m 108\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m bst\u001b[38;5;241m.\u001b[39mStateTrace() \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[1;32m--> 109\u001b[0m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 110\u001b[0m derivatives \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m 111\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m st \u001b[38;5;129;01min\u001b[39;00m trace\u001b[38;5;241m.\u001b[39mstates:\n", + "Cell \u001b[1;32mIn[5], line 11\u001b[0m, in \u001b[0;36msimulate..step\u001b[1;34m(t, *args)\u001b[0m\n\u001b[0;32m 9\u001b[0m inp_a[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, \u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.0\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mnA\n\u001b[0;32m 10\u001b[0m inp_b \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mfull((n_neuron, n_compartments), \u001b[38;5;241m0.\u001b[39m) \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mnA\n\u001b[1;32m---> 11\u001b[0m \u001b[43mcell\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute_derivative\u001b[49m\u001b[43m(\u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwhere\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m<\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minp_a\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minp_b\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\neurons\\multi_compartment.py:198\u001b[0m, in \u001b[0;36mMultiCompartment.compute_derivative\u001b[1;34m(self, I_ext)\u001b[0m\n\u001b[0;32m 196\u001b[0m I_channel \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 197\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ch \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnodes(level\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, include_self\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\u001b[38;5;241m.\u001b[39msubset(IonChannel)\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m--> 198\u001b[0m I_channel \u001b[38;5;241m=\u001b[39m ch\u001b[38;5;241m.\u001b[39mcurrent(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mvalue) \u001b[38;5;28;01mif\u001b[39;00m I_channel \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m (\u001b[43mI_channel\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcurrent\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mV\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[0;32m 199\u001b[0m \u001b[38;5;66;03m# 4. derivatives\u001b[39;00m\n\u001b[0;32m 200\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mderivative \u001b[38;5;241m=\u001b[39m (I_ext \u001b[38;5;241m+\u001b[39m I_axial \u001b[38;5;241m+\u001b[39m I_syn \u001b[38;5;241m+\u001b[39m I_channel) \u001b[38;5;241m/\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcm\n", "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainunit\\_base.py:2650\u001b[0m, in \u001b[0;36mQuantity.__add__\u001b[1;34m(self, oc)\u001b[0m\n\u001b[0;32m 2649\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__add__\u001b[39m(\u001b[38;5;28mself\u001b[39m, oc):\n\u001b[1;32m-> 2650\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_binary_operation\u001b[49m\u001b[43m(\u001b[49m\u001b[43moc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfail_for_mismatch\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator_str\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m+\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainunit\\_base.py:2631\u001b[0m, in \u001b[0;36mQuantity._binary_operation\u001b[1;34m(self, other, value_operation, unit_operation, fail_for_mismatch, operator_str, inplace)\u001b[0m\n\u001b[0;32m 2629\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 2630\u001b[0m message \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot calculate \u001b[39m\u001b[38;5;132;01m{value1}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{value2}\u001b[39;00m\u001b[38;5;124m, units do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m operator_str\n\u001b[1;32m-> 2631\u001b[0m _, other_unit \u001b[38;5;241m=\u001b[39m \u001b[43mfail_for_unit_mismatch\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmessage\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue1\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue2\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2632\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m other_unit\u001b[38;5;241m.\u001b[39mhas_same_scale(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit):\n\u001b[0;32m 2633\u001b[0m other_value \u001b[38;5;241m=\u001b[39m other_value \u001b[38;5;241m*\u001b[39m (other_unit\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;241m/\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit\u001b[38;5;241m.\u001b[39mvalue)\n", "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainunit\\_base.py:863\u001b[0m, in \u001b[0;36mfail_for_unit_mismatch\u001b[1;34m(obj1, obj2, error_message, **error_arrays)\u001b[0m\n\u001b[0;32m 861\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitMismatchError(error_message, unit1)\n\u001b[0;32m 862\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 863\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitMismatchError(error_message, unit1, unit2)\n", - "\u001b[1;31mUnitMismatchError\u001b[0m: Cannot calculate [[0. 0. ... 0. 0.]] + [[-0.39344537 -0. ... -0. -0. ]], units do not match (units are mS/cmeter2 * mV and mS/cmeter2 * Unit(10.0^0) * Unit(10.0^0) * Unit(10.0^0) * C/mol * Unit(10.0^0) * mM * Unit(10.0^0))." + "\u001b[1;31mUnitMismatchError\u001b[0m: Cannot calculate Tracedwith + Tracedwith, units do not match (units are mS/cmeter2 * mV and mS/cmeter2 * Unit(10.0^0) * Unit(10.0^0) * Unit(10.0^0) * C/mol * Unit(10.0^0) * mM * Unit(10.0^0))." ] } ], "source": [ - "n_batch, n_seq =1, 200000\n", - "inp_traces = np.full((n_batch, n_seq, n_compartments), 0.) * bu.nA\n", - "inp_traces[...,0] =0.00 * bu.nA\n", - "inp_traces[:,int(n_seq/2):,:] =0.00 * bu.nA\n", - "visualize_a_simulate(inp_traces[0], size , connection, Ra, cm, diam, L, gl, gh)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "E = (1e-3) * -55*bu.mV\n", - "zeta = (2 * bu.faraday_constant * E )/( bu.gas_constant * (273.15 + 22) * bu.kelvin)\n", - "zeta.to_decimal()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = -55 * bu.mV\n", - "b=a / bu.mV\n", - "b" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## conductvalues \n", - "conductvalues = 1e3 * np.array([\n", - " 0.00499506303209, 0.01016375552607, 0.00247172479141, 0.00128859564935, \n", - " 3.690771983E-05, 0.0080938853146, 0.01226052748146, 0.01650689958385, \n", - " 0.00139885617712, 0.14927733727426, 0.00549507510519, 0.14910988921938, \n", - " 0.00406420380423, 0.01764345789036, 0.10177335775222, 0.0087689418803, \n", - " 3.407734319E-05, 0.0003371456442, 0.00030643090764, 0.17233663543619, \n", - " 0.00024381226198, 0.10008178886943, 0.00595046001148, 0.0115, 0.0091\n", - "])\n", - "\n", + "@bst.transform.jit(static_argnums=6)\n", + "def simulate(Ra, cm, diam, L, gl, gkv11, method='ieuler'):\n", + " cell = Golgi(size, connection, Ra, cm, diam, L, gl, gkv11)\n", + " cell.init_state()\n", + " cell.reset_state()\n", "\n", - "## IL params\n", - "gl = np.ones(n_compartments) \n", - "gl[index_soma] = 0.03 \n", - "gl[index_axon] = 0.001 \n", - "gl[index_axon[0]] = 0.03\n", - "gl[index_dend_basal] = 0.03\n", - "gl[index_dend_apical] = 0.03 \n", + " def step(t, *args):\n", + " inp_a = np.full((n_neuron, n_compartments), 0.) * u.nA\n", + " inp_a[..., 0] = 0.0 * u.nA\n", + " inp_b = np.full((n_neuron, n_compartments), 0.) * u.nA\n", + " cell.compute_derivative(u.math.where(t < 100 * u.ms, inp_a, inp_b))\n", "\n", + " def save(t, *args):\n", + " return cell.V.value\n", "\n", - "## Kv11 params\n", - "gkv11 = np.zeros(n_compartments) \n", - "gkv11[index_soma] = conductvalues[10] \n", + " with jax.ensure_compile_time_eval():\n", + " dt = 0.01 * u.ms\n", + " ts = u.math.arange(0. * u.ms, 200. * u.ms, dt)\n", + " ts, ys, steps = dx.diffrax_solve(\n", + " step, method, 0. * u.ms, 200. * u.ms, dt, ts,\n", + " savefn=save, atol=1e-5, # max_steps=200000,\n", + " )\n", "\n", - "## Kv34 params \n", - "gkv34 = np.zeros(n_compartments) \n", - "gkv34[index_soma] = conductvalues[11]\n", - "gkv34[index_axon[1:]] = 9.1\n", - "\n", - "## Kv43 params \n", - "gkv43 = np.zeros(n_compartments) \n", - "gkv43[index_soma] = conductvalues[12]\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class Golgi(dx.neurons.MultiCompartment):\n", - " def __init__(self, size , connection, Ra, cm, diam, L, gl, gkv11):\n", - " super().__init__(\n", - " size = size,\n", - " connection = connection,\n", - " Ra = Ra * bu.ohm * bu.cm,\n", - " cm = cm * bu.uF / bu.cm ** 2,\n", - " diam = diam * bu.um,\n", - " L = L * bu.um,\n", - " V_th = 20. * bu.mV,\n", - " V_initializer = bst.init.Constant(-55 * bu.mV),\n", - " spk_fun = bst.surrogate.ReluGrad(),\n", - " )\n", + " return ts, ys, steps\n", "\n", - " self.IL = dx.channels.IL(self.size, E = -55. * bu.mV, g_max = gl*s )\n", - " self.k = dx.ions.PotassiumFixed(self.size, E = -80.* bu.mV)\n", - " self.k.add_elem(dx.channels.IKv11_Ak2007(self.size, g_max = gkv11*s ))\n", - " \n", - " def step_run(self, t, inp):\n", - " dx.rk4_step(self, t, inp)\n", - " return self.V.value, self.spike.value" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import partial\n", "\n", - "#static_args = np.arange(1, 9)\n", - "#@partial(jax.jit, static_argnums=static_args)\n", - "#@jax.jit\n", - "def simulate(currents, size , connection, Ra, cm, diam, L, gl, gkv11):\n", - " cell = Golgi(size , connection, Ra, cm, diam, L, gl, gkv11)\n", + "@bst.transform.jit\n", + "def simulate2(Ra, cm, diam, L, gl, gkv11):\n", + " cell = Golgi(size, connection, Ra, cm, diam, L, gl, gkv11)\n", " cell.init_state()\n", " cell.reset_state()\n", "\n", - " times = np.arange(0, currents.shape[0]) * bst.environ.get_dt()\n", - " vs, spks = bst.transform.for_loop(cell.step_run, times, currents)\n", + " def step_run(t):\n", + " inp_a = np.full((n_neuron, n_compartments), 0.) * u.nA\n", + " inp_a[..., 0] = 0.0 * u.nA\n", + " inp_b = np.full((n_neuron, n_compartments), 0.) * u.nA\n", + " inp = u.math.where(t < 100 * u.ms, inp_a, inp_b)\n", + " dx.rk4_step(cell, t, inp)\n", + " return cell.V.value\n", + "\n", + " with jax.ensure_compile_time_eval():\n", + " dt = 0.001 * u.ms\n", + " ts = u.math.arange(0. * u.ms, 200. * u.ms, dt)\n", + " with bst.environ.context(dt=dt):\n", + " ys = bst.transform.for_loop(step_run, ts)\n", + " return ts, ys[::10], ts.size\n", + "\n", + "def visualize_a_simulate(Ra, cm, diam, L, gl, gkv11):\n", + " t0 = time.time()\n", + " ts, ys_kvaerno5, steps = simulate(Ra, cm, diam, L, gl, gkv11, 'kvaerno5')\n", + " print('kvaerno5', steps)\n", + " print('time', time.time() - t0)\n", + "\n", + " t0 = time.time()\n", + " ts, ys_ieuler, steps = simulate(Ra, cm, diam, L, gl, gkv11, 'ieuler')\n", + " print('ieuler', steps)\n", + " print('time', time.time() - t0)\n", + "\n", + " '''\n", + " t0 = time.time()\n", + " ts, ys_tsit5, steps = simulate(Ra, cm, diam, L, gl, gkv11, 'tsit5')\n", + " print('tsit5', steps)\n", + " print('time', time.time() - t0)\n", + "\n", + " t0 = time.time()\n", + " ts, ys_dopri5, steps = simulate(Ra, cm, diam, L, gl, gkv11, 'dopri5')\n", + " print('dopri5', steps)\n", + " print('time', time.time() - t0)\n", + " '''\n", + " t0 = time.time()\n", + " ts2, ys2_rk4, steps = simulate2(Ra, cm, diam, L, gl, gkv11)\n", + " print('rk4', steps)\n", + " print('time', time.time() - t0)\n", " \n", - " return vs, spks \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def visualize_a_simulate(currents, size ,connection, Ra, cm, diam, L, gl, gkv11):\n", - " times = np.arange(0, currents.shape[0]) * bst.environ.get_dt()\n", - " vs, spks = simulate(currents, size ,connection, Ra, cm, diam, L, gl, gkv11)\n", - "\n", - " fig, gs = bts.visualize.get_figure(1, 1, 3.0, 4.0)\n", - " ax = fig.add_subplot(gs[0, 0])\n", - " plt.plot(times / bu.ms, bu.math.squeeze(vs / bu.mV))\n", - " plt.xlabel('Time [ms]')\n", - " plt.ylabel('Potential [mV]')\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "n_batch, n_seq =1, 200000\n", - "inp_traces = np.full((n_batch, n_seq, n_compartments), 0.) * bu.nA\n", - "inp_traces[...,0] =0.00 * bu.nA\n", - "inp_traces[:,int(n_seq/2):,:] =0.00 * bu.nA\n", - "visualize_a_simulate(inp_traces[0], size , connection, Ra, cm, diam, L, gl, gkv11)" + " def plot(data, ax, title):\n", + " ax.plot(ts.to_decimal(u.ms), u.math.squeeze(data.to_decimal(u.mV)))\n", + " plt.xlabel('Time [ms]')\n", + " plt.ylabel('Potential [mV]')\n", + " plt.title(title)\n", + "\n", + " fig, gs = bts.visualize.get_figure(4, 1, 6.0, 8.0)\n", + " plot(ys_kvaerno5 - ys_ieuler, fig.add_subplot(gs[0, 0]), 'kvaerno5 - ieuler')\n", + " #plot(ys_ieuler - ys_tsit5, fig.add_subplot(gs[0, 1]), 'ieuler - tsit5')\n", + " #plot(ys_tsit5 - ys_dopri5, fig.add_subplot(gs[0, 2]), 'tsit5 - dopri5')\n", + " #plot(ys_dopri5 - ys2_rk4, fig.add_subplot(gs[0, 3]), 'dopri5 - rk4')\n", + " plot(ys2_rk4 - ys_ieuler, fig.add_subplot(gs[1, 0]), 'rk4 - ieuler')\n", + " plot(ys_ieuler, fig.add_subplot(gs[2, 0]), 'ieuler')\n", + " plot(ys_kvaerno5, fig.add_subplot(gs[3, 0]), 'kvaerno5')\n", + "\n", + " plt.show()\n", + "\n", + "visualize_a_simulate(Ra, cm, diam, L, gl, g_test)" ] } ], From c0d3606b71b9a08f4edf8f801703f58d26933d8e Mon Sep 17 00:00:00 2001 From: swl <642878280@qq.com> Date: Fri, 30 Aug 2024 21:20:36 +0800 Subject: [PATCH 2/3] add the rest of channel params --- examples/golgi_model/golgi.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/examples/golgi_model/golgi.py b/examples/golgi_model/golgi.py index a386899..b2b4b63 100644 --- a/examples/golgi_model/golgi.py +++ b/examples/golgi_model/golgi.py @@ -110,6 +110,20 @@ gkca31 = np.zeros(n_compartments) gkca31[index_soma] = conductvalues[14] +## IKca2_2_Ma2020 +gkca22 = np.zeros(n_compartments) +gkca31[index_dend_apical] = conductvalues[2] +gkca31[index_dend_basal] = conductvalues[7] + +## IKca1_1_Ma2020 +gkca11 = np.zeros(n_compartments) +gkca11[index_soma]= conductvalues[13] +gkca11[index_dend_apical]= conductvalues[1] +gkca11[index_dend_basal]= conductvalues[6] +gkca11[index_axon[0]] = conductvalues[21] +gkca11[index_axon[1:]] = conductvalues[13] + +## class Golgi(dx.neurons.MultiCompartment): def __init__(self, size, connection, Ra, cm, diam, L, gl, gkv11): From f7d68f4685db029d5a5231bb6aaf593d99d68e8b Mon Sep 17 00:00:00 2001 From: swl <642878280@qq.com> Date: Fri, 30 Aug 2024 22:43:59 +0800 Subject: [PATCH 3/3] fix bugs --- dendritex/channels/calcium.py | 15 +++--- dendritex/channels/potassium.py | 86 +++++++++++++++++++++++++++++++- examples/golgi_model/golgi.ipynb | 70 ++++++++++---------------- examples/golgi_model/golgi.py | 4 +- 4 files changed, 120 insertions(+), 55 deletions(-) diff --git a/dendritex/channels/calcium.py b/dendritex/channels/calcium.py index 8baf8dc..4b1a858 100644 --- a/dendritex/channels/calcium.py +++ b/dendritex/channels/calcium.py @@ -1076,7 +1076,7 @@ def __init__( self.A_tau_h = 1.0 self.v0_tau_h1 = -32 self.k_tau_h1 = 7 - + self.z = 2 def init_state(self, V, Ca: IonInfo, batch_size: int = None): @@ -1102,25 +1102,22 @@ def f_q_inf(self, V): def f_p_tau(self, V): V = V / bu.mV return bu.math.where(V<=-90, 1, (self.C_tau_m + self.A_tau_m / (bu.math.exp((V - self.v0_tau_m1)/ self.k_tau_m1) + bu.math.exp((V - self.v0_tau_m2)/self.k_tau_m2))) ) - def f_p_tau(self, V): + def f_q_tau(self, V): V = V / bu.mV return ( self.C_tau_h + self.A_tau_h / bu.math.exp((V - self.v0_tau_h1)/self.k_tau_h1) ) def ghk(self, V, Ca: IonInfo): E = (1e-3) * V - zeta = (2 * bu.faraday_constant * E )/( bu.gas_constant * (273.15 + self.T) * bu.kelvin) + zeta = (self.z * bu.faraday_constant * E )/( bu.gas_constant * (273.15 + self.T) * bu.kelvin) zeta = zeta.to_decimal() ci = Ca.C co = 2 * bu.mM #co = Ca.C0 for Calciumdetailed - g_1 = (1e-6) * bu.faraday_constant * (ci - co * bu.math.exp(-zeta)) * (1 + zeta/2) - print(g_1) - g_2= (1e-6) * (zeta*bu.faraday_constant) * (ci - co*bu.math.exp(-zeta)) / (1-bu.math.exp(-zeta)) + g_1 = (1e-6) * (self.z * bu.faraday_constant) * (ci - co * bu.math.exp(-zeta)) * (1 + zeta/2) + g_2= (1e-6) *( self.z * zeta * bu.faraday_constant) * (ci - co*bu.math.exp(-zeta)) / (1-bu.math.exp(-zeta)) return bu.math.where(bu.math.abs((1-bu.math.exp(-zeta))) <= 1e-6,g_1,g_2) def current(self, V, Ca: IonInfo): - i = (1e3)*self.g_max * self.p.value ** 2 * self.q.value * self.ghk(V,Ca) - print(self.ghk(V,Ca)) - return (1e3)*self.g_max * self.p.value ** 2 * self.q.value * self.ghk(V,Ca) + return -(1e3)*self.g_max * self.p.value ** 2 * self.q.value * self.ghk(V,Ca) diff --git a/dendritex/channels/potassium.py b/dendritex/channels/potassium.py index 178a83d..a8c4e39 100644 --- a/dendritex/channels/potassium.py +++ b/dendritex/channels/potassium.py @@ -26,9 +26,11 @@ 'IKK2B_HM1992', 'IKNI_Ya1989', 'IK_Leak', - "IKv11_Ak2007", + 'IKv11_Ak2007', 'IKv34_Ma2020', - "IKv43_Ma2020", + 'IKv43_Ma2020', + 'IKM_Grc_Ma2020', + ] @@ -1300,3 +1302,83 @@ def f_q_inf(self, V): def f_q_tau(self, V): return 1. / (self.f_q_alpha(V) + self.f_q_beta(V)) + + + +class IKM_Grc_Ma2020(PotassiumChannel): + r""" + TITLE Cerebellum Granule Cell Model + + COMMENT + KM channel + + Author: A. Fontana + CoAuthor: T.Nieus Last revised: 20.11.99 + """ + __module__ = 'dendritex.channels' + + def __init__( + self, + size: Union[int, Sequence[int]], + g_max: Union[bst.typing.ArrayLike, Callable] = 0.25 * (bu.mS / bu.cm ** 2), + V_sh: Union[bst.typing.ArrayLike, Callable] = 0. * bu.mV, + T_base: bst.typing.ArrayLike = 3., + T: bst.typing.ArrayLike = 22, + name: Optional[str] = None, + mode: Optional[bst.mixin.Mode] = None, + ): + super().__init__(size, name=name, mode=mode) + + # parameters + self.g_max = bst.init.param(g_max, self.varshape, allow_none=False) + + self.T = bst.init.param(T, self.varshape, allow_none=False) + self.T_base = bst.init.param(T_base, self.varshape, allow_none=False) + self.phi = bst.init.param(T_base ** ((T - 22) / 10), self.varshape, allow_none=False) + self.V_sh = bst.init.param(V_sh, self.varshape, allow_none=False) + + self.ek = -84.69 * bu.mV + + self.Aalpha_n = 0.0033 + self.Kalpha_n = 40 + + self.V0alpha_n = -30 + self.Abeta_n = 0.0033 + self.Kbeta_n = -20 + + self.V0beta_n = -30 + self.V0_ninf = -35 + self.B_ninf = 6 + + + + def compute_derivative(self, V, K: IonInfo): + self.p.derivative = self.phi * (self.f_p_inf(V) - self.p.value) / self.f_p_tau(V) / bu.ms + + + def current(self, V, K: IonInfo): + return self.g_max * self.p.value * (self.ek - V) + + def init_state(self, V, K: IonInfo, batch_size: int = None): + self.p = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size)) + + def reset_state(self, V, K: IonInfo, batch_size=None): + self.p.value = self.f_p_inf(V) + if isinstance(batch_size, int): + assert self.p.value.shape[0] == batch_size + + + def f_p_alpha(self, V): + V = (V - self.V_sh).to_decimal(bu.mV) + return self.Aalpha_n*bu.math.exp((V-self.V0alpha_n)/self.Kalpha_n) + + def f_p_beta(self, V): + V = (V - self.V_sh).to_decimal(bu.mV) + return self.Abeta_n*bu.math.exp((V-self.V0beta_n)/self.Kbeta_n) + + def f_p_inf(self, V): + V = (V - self.V_sh).to_decimal(bu.mV) + return 1/(1+bu.math.exp(-(V-self.V0_ninf)/self.B_ninf)) + + def f_p_tau(self, V): + return 1. / (self.f_p_alpha(V) + self.f_p_beta(V)) diff --git a/examples/golgi_model/golgi.ipynb b/examples/golgi_model/golgi.ipynb index c6882da..cd6008e 100644 --- a/examples/golgi_model/golgi.ipynb +++ b/examples/golgi_model/golgi.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -25,12 +25,12 @@ "\n", "bst.environ.set(precision=64)\n", "\n", - "jax.config.update(\"jax_disable_jit\", True)" + "#jax.config.update(\"jax_disable_jit\", True)" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -130,12 +130,12 @@ "connection = ((1,2),(2,3))\n", "gl = np.zeros(n_compartments) \n", "g_test = np.zeros(n_compartments) \n", - "g_test[index_soma] = 20" + "g_test[index_soma] = 2.5e-4" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -155,56 +155,40 @@ "\n", " self.IL = dx.channels.IL(self.size, E=-55. * u.mV, g_max=gl * u.mS / (u.cm ** 2))\n", " #self.Ih1 = dx.channels.Ih1_Ma2020(self.size, E=-20. * u.mV, g_max=g_test * u.mS / (u.cm ** 2))\n", - " #self.k = dx.ions.PotassiumFixed(self.size, E=-80. * u.mV)\n", - " #self.k.add_elem(dx.channels.IKv34_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))\n", - " self.ca = dx.ions.CalciumFixed(self.size, E=137.* u.mV, C =5e-5 * u.mM)\n", - " self.ca.add_elem(dx.channels.ICav31_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))\n", + " self.k = dx.ions.PotassiumFixed(self.size, E=-80. * u.mV)\n", + " self.k.add_elem(dx.channels.IKM_Grc_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))\n", + " #self.ca = dx.ions.CalciumFixed(self.size, E=137.* u.mV, C =5e-5 * u.mM)\n", + " #self.ca.add_elem(dx.channels.ICav31_Ma2020(self.size, g_max=g_test * (u.cm / u.second)))\n", " #self.kca = dx.MixIons(self.k, self.ca)\n", " #self.kca.add_elem(dx.channels.IKca1_1_Ma2020(self.size, g_max=g_test * u.mS / (u.cm ** 2)))" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n", - "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n", - "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n", - "Tracedwith * coulomb / mole * Unit(10.0^0) * mmolar * Unit(10.0^0)\n" + "kvaerno5 {'max_steps': None, 'num_accepted_steps': Array(13, dtype=int64, weak_type=True), 'num_rejected_steps': Array(13, dtype=int64, weak_type=True), 'num_steps': Array(26, dtype=int64, weak_type=True)}\n", + "time 6.803005695343018\n", + "ieuler {'max_steps': None, 'num_accepted_steps': Array(75, dtype=int64, weak_type=True), 'num_rejected_steps': Array(17, dtype=int64, weak_type=True), 'num_steps': Array(92, dtype=int64, weak_type=True)}\n", + "time 5.315016984939575\n", + "rk4 200000\n", + "time 14.174999952316284\n" ] }, { - "ename": "UnitMismatchError", - "evalue": "Cannot calculate Tracedwith + Tracedwith, units do not match (units are mS/cmeter2 * mV and mS/cmeter2 * Unit(10.0^0) * Unit(10.0^0) * Unit(10.0^0) * C/mol * Unit(10.0^0) * mM * Unit(10.0^0)).", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mUnitMismatchError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[1;32mIn[5], line 92\u001b[0m\n\u001b[0;32m 88\u001b[0m plot(ys_kvaerno5, fig\u001b[38;5;241m.\u001b[39madd_subplot(gs[\u001b[38;5;241m3\u001b[39m, \u001b[38;5;241m0\u001b[39m]), \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mkvaerno5\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m 90\u001b[0m plt\u001b[38;5;241m.\u001b[39mshow()\n\u001b[1;32m---> 92\u001b[0m \u001b[43mvisualize_a_simulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mRa\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiam\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mg_test\u001b[49m\u001b[43m)\u001b[49m\n", - "Cell \u001b[1;32mIn[5], line 50\u001b[0m, in \u001b[0;36mvisualize_a_simulate\u001b[1;34m(Ra, cm, diam, L, gl, gkv11)\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mvisualize_a_simulate\u001b[39m(Ra, cm, diam, L, gl, gkv11):\n\u001b[0;32m 49\u001b[0m t0 \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime()\n\u001b[1;32m---> 50\u001b[0m ts, ys_kvaerno5, steps \u001b[38;5;241m=\u001b[39m \u001b[43msimulate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mRa\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcm\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdiam\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgkv11\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mkvaerno5\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 51\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mkvaerno5\u001b[39m\u001b[38;5;124m'\u001b[39m, steps)\n\u001b[0;32m 52\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m'\u001b[39m, time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m-\u001b[39m t0)\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_jit.py:78\u001b[0m, in \u001b[0;36m_get_jitted_fun..jitted_fun\u001b[1;34m(*args, **params)\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(fun\u001b[38;5;241m.\u001b[39mfun)\n\u001b[0;32m 76\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mjitted_fun\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams):\n\u001b[0;32m 77\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m jax\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mjax_disable_jit:\n\u001b[1;32m---> 78\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m fun\u001b[38;5;241m.\u001b[39mfun(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n\u001b[0;32m 79\u001b[0m states \u001b[38;5;241m=\u001b[39m fun\u001b[38;5;241m.\u001b[39mcompile_and_get_states_by_static_args(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 80\u001b[0m state_vals, outs \u001b[38;5;241m=\u001b[39m jit_fun([st\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;28;01mfor\u001b[39;00m st \u001b[38;5;129;01min\u001b[39;00m states], \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n", - "Cell \u001b[1;32mIn[5], line 19\u001b[0m, in \u001b[0;36msimulate\u001b[1;34m(Ra, cm, diam, L, gl, gkv11, method)\u001b[0m\n\u001b[0;32m 17\u001b[0m dt \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.01\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms\n\u001b[0;32m 18\u001b[0m ts \u001b[38;5;241m=\u001b[39m u\u001b[38;5;241m.\u001b[39mmath\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;241m0.\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms, \u001b[38;5;241m200.\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms, dt)\n\u001b[1;32m---> 19\u001b[0m ts, ys, steps \u001b[38;5;241m=\u001b[39m \u001b[43mdx\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdiffrax_solve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 20\u001b[0m \u001b[43m \u001b[49m\u001b[43mstep\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m0.\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m200.\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdt\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mts\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 21\u001b[0m \u001b[43m \u001b[49m\u001b[43msavefn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msave\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43matol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m1e-5\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# max_steps=200000,\u001b[39;49;00m\n\u001b[0;32m 22\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 24\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ts, ys, steps\n", - "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\_integrators.py:324\u001b[0m, in \u001b[0;36mdiffrax_solve\u001b[1;34m(model, solver, t0, t1, dt0, saveat, savefn, args, rtol, atol, max_steps, adjoint)\u001b[0m\n\u001b[0;32m 271\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdiffrax_solve\u001b[39m(\n\u001b[0;32m 272\u001b[0m model: Callable,\n\u001b[0;32m 273\u001b[0m solver: \u001b[38;5;28mstr\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 283\u001b[0m adjoint: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcheckpoint\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 284\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[u\u001b[38;5;241m.\u001b[39mQuantity, bst\u001b[38;5;241m.\u001b[39mtyping\u001b[38;5;241m.\u001b[39mPyTree[u\u001b[38;5;241m.\u001b[39mQuantity], Dict]:\n\u001b[0;32m 285\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 286\u001b[0m \u001b[38;5;124;03m Solve the differential equations using `diffrax `_.\u001b[39;00m\n\u001b[0;32m 287\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 322\u001b[0m \u001b[38;5;124;03m - The running step statistics.\u001b[39;00m\n\u001b[0;32m 323\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 324\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_diffrax_solve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 325\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 326\u001b[0m \u001b[43m \u001b[49m\u001b[43msolver\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msolver\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 327\u001b[0m \u001b[43m \u001b[49m\u001b[43mt0\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mt0\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 328\u001b[0m \u001b[43m \u001b[49m\u001b[43mt1\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mt1\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 329\u001b[0m \u001b[43m \u001b[49m\u001b[43mdt0\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdt0\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 330\u001b[0m \u001b[43m \u001b[49m\u001b[43msaveat\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msaveat\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 331\u001b[0m \u001b[43m \u001b[49m\u001b[43msavefn\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msavefn\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 332\u001b[0m \u001b[43m \u001b[49m\u001b[43madjoint\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43madjoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 333\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 334\u001b[0m \u001b[43m \u001b[49m\u001b[43mrtol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrtol\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 335\u001b[0m \u001b[43m \u001b[49m\u001b[43matol\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43matol\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 336\u001b[0m \u001b[43m \u001b[49m\u001b[43mmax_steps\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmax_steps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 337\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\_integrators.py:124\u001b[0m, in \u001b[0;36m_diffrax_solve\u001b[1;34m(model, solver, t0, t1, dt0, adjoint, saveat, savefn, args, rtol, atol, max_steps)\u001b[0m\n\u001b[0;32m 121\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m derivatives\n\u001b[0;32m 123\u001b[0m \u001b[38;5;66;03m# stateful function and make jaxpr\u001b[39;00m\n\u001b[1;32m--> 124\u001b[0m stateful_fn \u001b[38;5;241m=\u001b[39m \u001b[43mbst\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransform\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mStatefulFunction\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel_to_derivative\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_jaxpr\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0.\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 126\u001b[0m \u001b[38;5;66;03m# states\u001b[39;00m\n\u001b[0;32m 127\u001b[0m states \u001b[38;5;241m=\u001b[39m stateful_fn\u001b[38;5;241m.\u001b[39mget_states()\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:419\u001b[0m, in \u001b[0;36mStatefulFunction.make_jaxpr\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 417\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m:\n\u001b[0;32m 418\u001b[0m \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m--> 419\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m e\n\u001b[0;32m 421\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:402\u001b[0m, in \u001b[0;36mStatefulFunction.make_jaxpr\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cache_key \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state_trace:\n\u001b[0;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 401\u001b[0m \u001b[38;5;66;03m# jaxpr\u001b[39;00m\n\u001b[1;32m--> 402\u001b[0m jaxpr, (out_shapes, state_shapes) \u001b[38;5;241m=\u001b[39m _make_jaxpr(\n\u001b[0;32m 403\u001b[0m functools\u001b[38;5;241m.\u001b[39mpartial(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_wrapped_fun_to_eval, cache_key),\n\u001b[0;32m 404\u001b[0m static_argnums\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstatic_argnums,\n\u001b[0;32m 405\u001b[0m axis_env\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis_env,\n\u001b[0;32m 406\u001b[0m return_shape\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[0;32m 407\u001b[0m abstracted_axes\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mabstracted_axes\n\u001b[0;32m 408\u001b[0m )(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 410\u001b[0m \u001b[38;5;66;03m# returns\u001b[39;00m\n\u001b[0;32m 411\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_jaxpr_out_tree[cache_key] \u001b[38;5;241m=\u001b[39m jax\u001b[38;5;241m.\u001b[39mtree\u001b[38;5;241m.\u001b[39mstructure((out_shapes, state_shapes))\n", - " \u001b[1;31m[... skipping hidden 1 frame]\u001b[0m\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:726\u001b[0m, in \u001b[0;36m_make_jaxpr..make_jaxpr_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 724\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m axis_name, size \u001b[38;5;129;01min\u001b[39;00m axis_env \u001b[38;5;129;01mor\u001b[39;00m []:\n\u001b[0;32m 725\u001b[0m stack\u001b[38;5;241m.\u001b[39menter_context(jax\u001b[38;5;241m.\u001b[39mcore\u001b[38;5;241m.\u001b[39mextend_axis_env(axis_name, size, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m--> 726\u001b[0m jaxpr, out_type, consts \u001b[38;5;241m=\u001b[39m \u001b[43mpe\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrace_to_jaxpr_dynamic2\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdebug_info\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdebug_info\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 727\u001b[0m closed_jaxpr \u001b[38;5;241m=\u001b[39m jax\u001b[38;5;241m.\u001b[39mcore\u001b[38;5;241m.\u001b[39mClosedJaxpr(jaxpr, consts)\n\u001b[0;32m 728\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m return_shape:\n", - " \u001b[1;31m[... skipping hidden 4 frame]\u001b[0m\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainstate\\transform\\_make_jaxpr.py:371\u001b[0m, in \u001b[0;36mStatefulFunction._wrapped_fun_to_eval\u001b[1;34m(self, cache_key, *args, **kwargs)\u001b[0m\n\u001b[0;32m 369\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state_trace[cache_key] \u001b[38;5;241m=\u001b[39m _state_trace\n\u001b[0;32m 370\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m _state_trace:\n\u001b[1;32m--> 371\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfun(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 372\u001b[0m state_values \u001b[38;5;241m=\u001b[39m _state_trace\u001b[38;5;241m.\u001b[39mcollect_values(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mread\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwrite\u001b[39m\u001b[38;5;124m'\u001b[39m, check_val_tree\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m 373\u001b[0m _state_trace\u001b[38;5;241m.\u001b[39mrecovery_original_values()\n", - "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\_integrators.py:109\u001b[0m, in \u001b[0;36m_diffrax_solve..model_to_derivative\u001b[1;34m(t, *args)\u001b[0m\n\u001b[0;32m 107\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m bst\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mcontext(t\u001b[38;5;241m=\u001b[39mt \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mms):\n\u001b[0;32m 108\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m bst\u001b[38;5;241m.\u001b[39mStateTrace() \u001b[38;5;28;01mas\u001b[39;00m trace:\n\u001b[1;32m--> 109\u001b[0m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 110\u001b[0m derivatives \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m 111\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m st \u001b[38;5;129;01min\u001b[39;00m trace\u001b[38;5;241m.\u001b[39mstates:\n", - "Cell \u001b[1;32mIn[5], line 11\u001b[0m, in \u001b[0;36msimulate..step\u001b[1;34m(t, *args)\u001b[0m\n\u001b[0;32m 9\u001b[0m inp_a[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, \u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0.0\u001b[39m \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mnA\n\u001b[0;32m 10\u001b[0m inp_b \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mfull((n_neuron, n_compartments), \u001b[38;5;241m0.\u001b[39m) \u001b[38;5;241m*\u001b[39m u\u001b[38;5;241m.\u001b[39mnA\n\u001b[1;32m---> 11\u001b[0m \u001b[43mcell\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute_derivative\u001b[49m\u001b[43m(\u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mwhere\u001b[49m\u001b[43m(\u001b[49m\u001b[43mt\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m<\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m100\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mms\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minp_a\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minp_b\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32mc:\\Users\\64287\\Desktop\\vscode\\my_github\\dendritex\\dendritex\\neurons\\multi_compartment.py:198\u001b[0m, in \u001b[0;36mMultiCompartment.compute_derivative\u001b[1;34m(self, I_ext)\u001b[0m\n\u001b[0;32m 196\u001b[0m I_channel \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 197\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m ch \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mnodes(level\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m, include_self\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\u001b[38;5;241m.\u001b[39msubset(IonChannel)\u001b[38;5;241m.\u001b[39mvalues():\n\u001b[1;32m--> 198\u001b[0m I_channel \u001b[38;5;241m=\u001b[39m ch\u001b[38;5;241m.\u001b[39mcurrent(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mvalue) \u001b[38;5;28;01mif\u001b[39;00m I_channel \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m (\u001b[43mI_channel\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcurrent\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mV\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalue\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[0;32m 199\u001b[0m \u001b[38;5;66;03m# 4. derivatives\u001b[39;00m\n\u001b[0;32m 200\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mV\u001b[38;5;241m.\u001b[39mderivative \u001b[38;5;241m=\u001b[39m (I_ext \u001b[38;5;241m+\u001b[39m I_axial \u001b[38;5;241m+\u001b[39m I_syn \u001b[38;5;241m+\u001b[39m I_channel) \u001b[38;5;241m/\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcm\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainunit\\_base.py:2650\u001b[0m, in \u001b[0;36mQuantity.__add__\u001b[1;34m(self, oc)\u001b[0m\n\u001b[0;32m 2649\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__add__\u001b[39m(\u001b[38;5;28mself\u001b[39m, oc):\n\u001b[1;32m-> 2650\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_binary_operation\u001b[49m\u001b[43m(\u001b[49m\u001b[43moc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfail_for_mismatch\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moperator_str\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m+\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainunit\\_base.py:2631\u001b[0m, in \u001b[0;36mQuantity._binary_operation\u001b[1;34m(self, other, value_operation, unit_operation, fail_for_mismatch, operator_str, inplace)\u001b[0m\n\u001b[0;32m 2629\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 2630\u001b[0m message \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot calculate \u001b[39m\u001b[38;5;132;01m{value1}\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m \u001b[39m\u001b[38;5;132;01m{value2}\u001b[39;00m\u001b[38;5;124m, units do not match\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m operator_str\n\u001b[1;32m-> 2631\u001b[0m _, other_unit \u001b[38;5;241m=\u001b[39m \u001b[43mfail_for_unit_mismatch\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mother\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmessage\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue1\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mvalue2\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mother\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 2632\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m other_unit\u001b[38;5;241m.\u001b[39mhas_same_scale(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit):\n\u001b[0;32m 2633\u001b[0m other_value \u001b[38;5;241m=\u001b[39m other_value \u001b[38;5;241m*\u001b[39m (other_unit\u001b[38;5;241m.\u001b[39mvalue \u001b[38;5;241m/\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39munit\u001b[38;5;241m.\u001b[39mvalue)\n", - "File \u001b[1;32md:\\STUDYTOOL\\anaconda\\envs\\bp_cpu_\\lib\\site-packages\\brainunit\\_base.py:863\u001b[0m, in \u001b[0;36mfail_for_unit_mismatch\u001b[1;34m(obj1, obj2, error_message, **error_arrays)\u001b[0m\n\u001b[0;32m 861\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitMismatchError(error_message, unit1)\n\u001b[0;32m 862\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 863\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m UnitMismatchError(error_message, unit1, unit2)\n", - "\u001b[1;31mUnitMismatchError\u001b[0m: Cannot calculate Tracedwith + Tracedwith, units do not match (units are mS/cmeter2 * mV and mS/cmeter2 * Unit(10.0^0) * Unit(10.0^0) * Unit(10.0^0) * C/mol * Unit(10.0^0) * mM * Unit(10.0^0))." - ] + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAysAAAlrCAYAAADif1h+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3wUdf7H8fdsskloCSUkIYQuUqSDIChNkaIoWEEhUk5OVET09BQr+lOxnXfnKVYEQU/wDlFsIJ6AIL0rIoL0EnoKpO/O748kCyGFAElmZ/b1fDz2QTL7nZnPrps473y/3/kapmmaAgAAAAA/47K6AAAAAAAoDGEFAAAAgF8irAAAAADwS4QVAAAAAH6JsAIAAADALxFWAAAAAPglwgoAAAAAv0RYAQAAAOCXCCsAAAAA/BJhBQAcasKECTIMQ0eOHLG6FL9Qv359GYZR4DF69OhSP1ePHj3Uo0ePUj/u6RYuXCjDMLRw4cIyPQ8AWCnY6gIAACgvl19+uV599dV826Kjo0v9PJMmTSr1YwJAICKsAAD8RlpamsLCwmQYRpkcv2rVqrrsssvK5Nina968eZmfo7SV9XsPAOeDYWAAEEB+++03NWzYUJ06ddKhQ4c0btw4VapUScnJyQXaDho0SNHR0crKypIkzZw5U71791atWrVUoUIFNWvWTI8++qhOnjxZYN/Vq1fr+uuvV/Xq1RUWFqa2bdvq008/zddm6tSpMgxD3333nUaOHKmaNWuqYsWKysjIUI8ePdSiRQutWrVKXbt2VcWKFdWwYUO9+OKL8nq9+Y6ze/duDR06VFFRUQoNDVWzZs30t7/9rUC78lTYMLDMzEw999xzatq0qUJDQ1WzZk2NGDFChw8fztfOMAxNmDChwDHr16+v4cOHn/XcF/reA4A/IawAQIBYtGiRunTpolatWmnBggWKiorSyJEjlZqaWuBiNjExUV988YWGDh0qt9stSdq6dauuueYaTZ48WXPnztW4ceP06aef6rrrrsu374IFC3T55ZcrMTFRb7/9tr744gu1adNGgwYN0tSpUwvUNXLkSLndbk2fPl3//e9/fedLSEjQkCFDNHToUM2ZM0f9+vXT+PHj9dFHH/n2PXz4sLp06aLvvvtO//d//6c5c+aoV69eeuihhzRmzJgC5/rxxx9VpUoVud1uNW/eXH/729/k8Xgu9K09K6/XqwEDBujFF1/U7bffrq+//lovvvii5s+frx49eigtLa1UzlNa7z0A+A0TAOBITz/9tCnJPHz4sDl9+nQzJCTEHDt2rOnxePK1a9eundmlS5d82yZNmmRKMn/++edCj+31es2srCxz0aJFpiRzw4YNvueaNm1qtm3b1szKysq3T//+/c1atWr5zj9lyhRTknnHHXcUOH737t1NSeaKFSvybW/evLnZp08f3/ePPvpooe3uvvtu0zAMc8uWLb5t99xzj/nBBx+YixYtMj///HNzyJAhpiRz6NChhb7GC9G9e3eze/fuvu8/+eQTU5I5a9asfO1WrVplSjInTZrk2ybJfPrppwscs169euawYcN83y9YsMCUZC5YsMC3rTTeewDwJ/SsAIDDPf/88xo+fLhefPFF/fOf/5TLlf9X/4gRI7R06VJt2bLFt23KlCm69NJL1aJFC9+27du36/bbb1dMTIyCgoLkdrvVvXt3SdLmzZslSdu2bdNvv/2mIUOGSJKys7N9j2uuuUYHDhzIdx5JuummmwqtOyYmRh07dsy3rVWrVtq1a5fv+x9++EHNmzcv0G748OEyTVM//PCDb9ubb76pESNGqFu3bhowYIA++ugjjRkzRh999JHWrVtX7Hvo8XjyvZZzHWL21VdfqWrVqrruuuvyHadNmzaKiYkplTt6leZ7DwD+grACAA730UcfqXbt2ho8eHChzw8ZMkShoaG+YUK//vqrVq1apREjRvjanDhxQl27dtWKFSv03HPPaeHChVq1apU+++wzSfINYzp48KAk6aGHHpLb7c73uOeeeySpwK2Ua9WqVWhdNWrUKLAtNDQ035Cpo0ePFrp/bGys7/niDB06VJK0fPnyYts1atQo32t59tlni21/poMHDyoxMVEhISEF3peEhIRSub10ab73AOAvuBsYADjc3LlzNWjQIHXt2lX/+9//VK9evXzPV6tWTQMGDNC0adP03HPPacqUKQoLC9Ntt93ma/PDDz9o//79Wrhwoa83RcqZ23K6yMhISdL48eN14403FlpPkyZN8n1/IXefqlGjhg4cOFBg+/79+/PVUxTTNCWpQG/Tmb788st8k8/zwlBJRUZGqkaNGpo7d26hz1epUsX3dWhoaKET3c8WvMr7vQeA8kBYAQCHq1evnhYvXqxevXr5Akvjxo3ztRkxYoQ+/fRTffPNN/roo490ww03qGrVqr7n8y5qQ0ND8+33zjvv5Pu+SZMmaty4sTZs2KAXXnihbF7Qaa666ipNnDhRa9euVbt27Xzbp02bJsMw1LNnz2L3nzZtmiSd9XbGLVu2vKA6+/fvrxkzZsjj8ahTp07Ftq1fv742btyYb9sPP/ygEydOFLtfeb/3AFAeCCsAEABq1aqlRYsWqU+fPurWrZvmz5+fbz5K7969FRcXp3vuuUcJCQn5hoBJUpcuXVStWjWNHj1aTz/9tNxutz7++GNt2LChwLneeecd9evXT3369NHw4cNVu3ZtHTt2TJs3b9batWv1n//8p9Re1wMPPKBp06bp2muv1bPPPqt69erp66+/1qRJk3T33Xfr4osvliT9+9//1meffaZrr71W9erVU2Jiov7zn/9oxowZGj58uFq3bl1qNRVm8ODB+vjjj3XNNdfo/vvvV8eOHeV2u7V3714tWLBAAwYM0A033CBJio+P15NPPqmnnnpK3bt316+//qo33nhDERERZz1Peb73AFAeCCsAECAiIyP1ww8/6Nprr1X37t01b948dejQQVLOMKg77rhDL7zwgurUqaOrrroq3741atTQ119/rb/85S8aOnSoKlWqpAEDBmjmzJn5ejQkqWfPnlq5cqWef/55jRs3TsePH1eNGjXUvHlz3XrrraX6mmrWrKmlS5dq/PjxGj9+vJKTk9WwYUO9/PLLevDBB33tGjZsqMTERD322GM6evSo3G63LrnkEk2aNEl33XVXqdZUmKCgIM2ZM0f//Oc/NX36dE2cOFHBwcGKi4tT9+7d8/XcPPzww0pOTtbUqVP16quvqmPHjvr00081YMCAs56nPN97ACgPhpk3YBcAAAAA/Ah3AwMAAADglwgrAAAAAPwSYQUAAACAXyKsAAAAAPBLhBUAAAAAfomwAgAAAMAvsc5KOfF6vdq/f7+qVKniWwkaAAAACESmaSolJUWxsbFyuYruPyGslJP9+/erTp06VpcBAAAA+I09e/YoLi6uyOcJK+WkSpUqknL+g4SHh1tcDQAAAGCd5ORk1alTx3eNXBTCSjnJG/oVHh5OWAEAAACks06PYII9AAAAAL9EWAEAAADglwgrAAAAAPwSYQUAAACAXyKsAAAAAPBLhBUAAAAAfomwAgAAAMAvEVYAAAAA+CXCCgAAAAC/RFgB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Zsjlcun9999Xy5Yt1axZM02ZMkW7d+/WwoULz/n8rVu31hNPPOE7V4UKFRQZGalRo0apcePGeuqpp3T06FFt3LhRkrR79261bdtWHTp0UP369dWrVy9dd911pfmWAEBAYc4KAMBvXXLJJXK5Tv1dLTo6Wi1atPB9HxQUpBo1aujQoUOSpDVr1mjbtm2qUqVKvuOkp6frjz/+OOfzt2rVqsC5WrZsma8eSb7z33333brpppu0du1a9e7dWwMHDlSXLl3O+bwAgByEFQCA33K73fm+Nwyj0G1er1eS5PV61b59e3388ccFjlWzZs1SP79hGL7zSlK/fv20a9cuff311/r+++911VVX6d5779Wrr756zucGABBWAAAO0q5dO82cOVNRUVEKDw+3pIaaNWtq+PDhGj58uLp27aqHH36YsAIA54k5KwAAxxgyZIgiIyM1YMAALV68WDt27NCiRYt0//33a+/evWV+/qeeekpffPGFtm3bpk2bNumrr75Ss2bNyvy8AOBUhBUAgGNUrFhRP/74o+rWrasbb7xRzZo108iRI5WWllYuPS0hISEaP368WrVqpW7duikoKEgzZswo8/MCgFMZpmmaVhcBAIBVFi5cqJ49e+r48eNlviikJE2dOlXjxo1TYmJimZ8LAOyOOSsAAEiKi4vTddddp08++aTMzlG5cmVlZ2crLCyszM4BAE5CzwoAIKClpaVp3759knLCRExMTJmda9u2bZJyboPcoEGDMjsPADgFYQUAAACAX2KCPQAAAAC/RFgBAAAA4JcIKwAAAAD8EmEFAAAAgF8irAAAAADwS4QVAAAAAH6JsAIAAADALxFWAAAAAPglwgoAAAAAv0RYAQAAAOCXCCsAAAAA/BJhBQBQZoYPH67KlSuf0z6maapbt24yDENjxowp9ZomTJggwzBK/bhnMgxDEyZMKPPzAICTEVYAAH7lzTff1LZt28rs+HfeeaeWLVtWZscHAJQewgoAoNSlpqae1347d+7U+PHj9eabb5ZyRafExcXpsssuK7PjlwWPx6OMjAyrywCAckdYAQBckLxhVWvXrtXNN9+satWqqVGjRkW2/+mnnxQZGan+/fvr5MmT+Z7785//rKuvvlo33HBDmdd7ppkzZ6pz586qVKmSKleurD59+mjdunX52vTo0UM9evQosO/w4cNVv379s547ISFB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Uvxl9fSf1XslSYMvrVOeZQIoRYQVAADg17I8Xr218A+9tfAPpWV5JEnhYcFqV6+a6lavqGCXS0dPZmjj3iTtOHJS8389qPm/HpQkVa8UwsR6wMYIKwAAwG/tPpqq+2as04Y9iZKkNnWq6u4ejdSzSZRCggtOvf39YIqmL9ulT1buVrbX1C3t4wptB8AeDNM0TauLCATJycmKiIhQUlKSwsNZkAoAgLNZt/u4/vThah07manwsGA9O6CFBrSJlWGc/a5ee46lauWOY+rfupZCg4PKoVoA56Kk18b0rAAAAL+zdNsRjfxwldKzvGpRO1zvxndQbNUKJd6/TvWKqlOdSfWA3RFWAACAX1m7+7junLZa6Vledb+4piYNaadKoVyyAIGIn3wAAOA3dhw5qRFTVik106OujSP17h3tGcYFBDBmnAEAAL9wIiNbf562WklpWWpTp6reiSeoAIGOsAIAACxnmqb++t8N2nrohKKqhOrd+PaqGMIAECDQEVYAAIDl/rN6r775OUHuIENvDW2vqPAwq0sC4AcIKwAAwFJ7jqXqmS83SZL+0ruJ2terZnFFAPwFYQUAAFjGNE09/N8NOpnp0aX1q2lU14ZWlwTAjxBWAACAZWav26fl24+pgjtIf7uljYJcZ1/wEUDgIKwAAABLJKdn6YVvfpMkjb2qserWYBFHAPkRVgAAgCX+Pv93HTmRoYY1K+lPVzSwuhwAfoiwAgAAyt32wyc0bdkuSdIz11+ikGAuSQAUxG8GAABQ7v42/3d5vKauahqlro1rWl0OAD9lu7AyadIkNWjQQGFhYWrfvr0WL15cbPtFixapffv2CgsLU8OGDfX2228XaDNr1iw1b95coaGhat68uWbPnl2gzb59+zR06FDVqFFDFStWVJs2bbRmzZpSe10AAASKX/Yl6euNB2QY0kN9mlhdDgA/ZquwMnPmTI0bN06PP/641q1bp65du6pfv37avXt3oe137Niha665Rl27dtW6dev02GOPaezYsZo1a5avzbJlyzRo0CDFx8drw4YNio+P16233qoVK1b42hw/flyXX3653G63vv32W/3666/629/+pqpVq5b1SwYAwHFenrdFknR961g1qxVucTUA/JlhmqZpdREl1alTJ7Vr105vvfWWb1uzZs00cOBATZw4sUD7Rx55RHPmzNHmzZt920aPHq0N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AChnhmmaptVFBILk5GRFREQoKSmJIAcAOKt9iWnq/doincz06N6ejfRwn6ZWlwQApaak18YlHgY2cOBAffXVV/J6vaVSIAAAKJxpmnp01kadzPSofb1qevDqJlaXBACWKHFYSUtL08CBAxUXF6fHHntMW7duLcu6AAAIWP9Zs1eLtx5RaLBLL9/cSkEuw+qSAMASJQ4r8+bN086dO3X33Xfr008/VdOmTdWtWzdNmzZNaWlpZVkjAAABIzk9Sy99+5sk6YGrL1ajmizuCCBwlTisSFJcXJyefPJJbdu2Td9//73q1aune+65RzExMbrrrru0YsWKsqrTZ9KkSWrQoIHCwsLUvn17LV68uNj2ixYtUvv27RUWFqaGDRvq7bffLtBm1qxZat68uUJDQ9W8eXPNnj27yONNnDhRhmFo3LhxF/pSAAAo4M0ftunoyUw1qllJf7qigdXlAIClzimsnK5nz56aPn26Dhw4oJdffln//e9/dfnll5dmbQXMnDlT48aN0+OPP65169apa9eu6tevn3bv3l1o+x07duiaa65R165dtW7dOj322GMaO3asZs2a5WuzbNkyDRo0SPHx8dqwYYPi4+N16623Fhq8Vq1apXfffVetWrUqs9cIAAhcu46e1Ac/7ZAkPXFtc7mDzvt/0wDgCBd0N7Dt27dr6tSpmjp1qvbv369evXpp7ty5pVlfPp06dVK7du301ltv+bY1a9ZMAwcO1MSJEwu0f+SRRzRnzhxt3rzZt2306NHasGGDli1bJkkaNGiQkpOT9e233/ra9O3bV9WqVdMnn3zi23bixAm1a9dOkyZN0nPPPac2bdroH//4R4lr525gAICzGfvJOs3ZsF/dLq6pD0dcKsNgrgoAZyr1u4HlSUtL07Rp09SzZ081btxY06dP15133qkdO3aUaVDJzMzUmjVr1Lt373zbe/furaVLlxa6z7Jlywq079Onj1avXq2srKxi25x5zHvvvVfXXnutevXqVaJ6MzIylJycnO8BAEBRth06oS837pckPdK3CUEFACQFl7Th0qVLNWXKFH366afKzMzUwIEDNW/evBJfvF+oI0eOyOPxKDo6Ot/26OhoJSQkFLpPQkJCoe2zs7N15MgR1apVq8g2px9zxowZWrt2rVatWlXieidOnKhnnnmmxO0BAIHtjR+2yjSlq5tH65JYVqkH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UWRkpDw8PFSpUiWNHDlSaWlpecZZLBYNHz5cU6ZMUd26deXp6amvv/76ut4rAODy2LMCAHAI3377rR544AH16NFDX3/9tdzd3fXJJ5+oc+fOWrBggTp27HjDy0hPT1e7du109OhRvfDCC2rUqJF27typcePGafv27Vq8eHGewvO///1PK1as0Lhx4xQSEqKgoKAbzgAA+AdlBQBg99LT0zVixAh169ZNs2fPzp1+xx13qGnTpnrhhRe0du3aG17OBx98oG3btmnt2rVq1qyZJKljx46qVKmSevfurfnz56tr166548+ePavt27erXLlyN7xsAEB+HAYGALB7q1at0qlTpzRo0CDl5OTkPmw2m7p06aL169fnO0zrevzyyy9q0KCBGjdunGc5nTt3lsVi0dKlS/OMv/XWWykqAFCM2LMCALB7x48flyT17t37imNOnTolHx+fG15OTEyM3N3dL/t8UlJSnu+5UhkAFC/KCgDA7gUGBkqSPvzwQ7Vo0eKyY4KDgyVJXl5eyszMzPf8pUXjSsvx9vbWl19+edUcFxTkhH0AwPWjrAAA7N4tt9yismXLateuXRo+fPhVx1atWlWJiYk6fvx4boHJysrSggULrrmcbt266c0331SFChUUGRlZJNkBANePsgIAsHu+vr768MMPNWjQIJ06dUq9e/dWUFCQTpw4oa1bt+rEiRP6+OOPJUn9+vXTuHHjdO+99+qZZ55RRkaGPvjgA1mt1msuZ+TIkZo1a5batm2rp59+Wo0aNZLNZlNsbKwWLlyo0aNHq3nz5sX9dgEAf6OsAAAcwoABA1S5cmW98847evTRR5WamqqgoCA1btxYgwcPzh0XGRmpOXPm6IUXXlDv3r0VGhqqUaNG6cSJE3r11VevugwfHx+tWLFCb731lj799FMdPHhQ3t7eqly5sm677bbL3r8FAFB8LIZhGGaHAAAAAIBLceliAAAAAHaJsgIAAADALlFWAAAAANglygoAAAAAu0RZAQAAAGCXKCsAAAAA7BL3WSkhNptNcXFx8vPzk8ViMTsOAAAAYBrDMJSamqqwsDC5uFx5/wllpYTExcUpIiLC7BgAAACA3Thy5IjCw8Ov+DxlpYT4+flJOv8/xN/f3+Q0AAAAgHlSUlIUERGRu418JZSVEnLh0C9/f3/KCgAAACBd8/QITrAHAAAAYJcoKwAA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JMoKAAAAAJdEWfESVqtVEyZMkNVqNTuK2+I5vHw8h5eH5+/y8RxePp7Dy8dzePl4Di+POz1/vMEeAAAAgEvizAoAAAAAl0RZAQAAAOCSKCsAAAAAXBJlBQAAAIBLoqx4iddee0316tVTYGCg2rRpo++//97sSC5p6tSpuvLKKxUWFqaaNWuqT58+2r59e6lthg4dKovFUupyzTXXmJTY9UycOLHM8xMbG1uy3jAMTZw4UfHx8QoKCtL111+vzZs3m5jY9SQmJpZ5Di0Wix566CFJvAb/aPny5erVq5fi4+NlsVj06aefllpfntec3W7XX/7yF0VHRyskJES9e/fW/v37q/BRmOt8z2FhYaGeeOIJtWzZUiEhIYqPj9fdd9+tjIyMUvdx/fXXl3ldDhw4sIofiXku9Dosz88tr8PzP4dn+71osVg0bdq0km28+XVYnmMYd/x9SFnxArNmzdKjjz6q8ePHa/369bruuut00003KS0tzexoLue7777TQw89pJ9++klff/21ioqK1LVrV508ebLUdt27d1dmZmbJ5YsvvjApsWtq0aJFqedn48aNJetefvllvfLKK/rnP/+pNWvWKDY2Vn/605+Um5trYmLXsmbNmlLP39dffy1JGjBgQMk2vAZ/d/LkSaWkpOif//znWdeX5zX36KOP6pNPPtFHH32kFStW6MSJE+rZs6ccDkdVPQxTne85zMvL07p16/TMM89o3bp1mjdvnn799Vf17t27zLbDhw8v9bp88803qyK+S7jQ61C68M8tr8PzP4dnPneZmZn673//K4vFon79+pXazltfh+U5hnHL34cGPN5VV11ljBgxotSypk2bGk8++aRJidzHoUOHDEnGd999V7JsyJAhxi233GJeKBc3YcIEIyUl5azrnE6nERsba7z44osly/Lz842IiAjjjTfeqKKE7ueRRx4xGjRoYDidTsMweA2ejyTjk08+Kblentfc8ePHDX9/f+Ojjz4q2ebAgQOGj4+P8eWXX1ZZdlfxx+fwbFavXm1IMvbt21eyrFOnTsYjjzxSueHcxNmewwv93PI6LK08r8NbbrnFuOGGG0ot43X4uz8ew7jr70POrHi4goICrV27Vl27di21vGvXrlq5cqVJqdxHTk6OJKlatWqlli9btkw1a9ZU48aNNXz4cB06dMiMeC5rx44dio+PV7169TRw4EDt3r1bkrRnzx5lZWWVej1arVZ16tSJ1+M5FBQU6IMPPtCwYcNksVhKlvMaLJ/yvObWrl2rwsLCUtvEx8crKSmJ1+U55OTkyGKxKDIystTyDz/8UNHR0WrRooVGjx7NGdM/ON/PLa/Di3Pw4EEtXLhQ9957b5l1vA6L/fEYxl1/H/qZsldUmezsbDkcDsXExJRaHhMTo6ysLJNSuQfDMDRq1Chde+21SkpKKll+0003acCAAapbt6727NmjZ555RjfccIPWrl3rFt8EW9muvvpqvffee2rcuLEOHjyo559/Xu3bt9fmzZtLXnNnez3u27fPjLgu79NPP9Xx48c1dOjQkmW8BsuvPK+5rKwsBQQEKCoqqsw2/J4sKz8/X08++aTuvPNOhYeHlywfNGiQ6tWrp9jYWG3atEnjxo1TampqyRijt7vQzy2vw4vz7rvvKiwsTH379i21nNdhsbMdw7jr70PKipc4819kpeIX8R+XobSRI0dqw4YNWrFiRanlt99+e8mfk5KS1LZtW9WtW1cLFy4s80vTG910000lf27ZsqXatWunBg0a6N133y15Mymvx/J7++23ddNNNyk+Pr5kGa/Bi3cprzlel2UVFhZq4MCBcjqdeu2110qtGz58eMmfk5KS1KhRI7Vt21br1q1T69atqzqqy7nUn1teh2f33//+V4MGDVJgYGCp5bwOi53rGEZyv9+HjIF5uOjoaPn6+pZpw4cOHSrTrPG7v/zlL5o/f76WLl2q2rVrn3fbuLg41a1bVzt27KiidO4lJCRELVu21I4dO0o+FYzXY/ns27dPS5Ys0X333Xfe7XgNnlt5XnOxsbEqKCjQsWPHzrkNiovKbbfdpj179ujrr78udVblbFq3bi1/f39el+fwx59bXofl9/3332v79u0X/N0oeefr8FzHMO76+5Cy4uECAgLUpk2bMqc/v/76a7Vv396kVK7LMAyNHDlS8+bN07fffqt69epd8DZHjhxRenq64uLiqiCh+7Hb7dq6davi4uJKTs2f+XosKCjQd999x+vxLGbOnKmaNWuqR48e592O1+C5lec116ZNG/n7+5faJjMzU5s2beJ1+ZvTRWXHjh1asmSJqlevfsHbbN68WYWFhbwuz+GPP7e8Dsvv7bffVps2bZSSknLBbb3pdXihYxi3/X1oytv6UaU++ugjw9/f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AAAAl0RZAQAAAOCSKCsAAAAAXBJlBQAAAIBLoqwAAAAAcEmUFQBApZk4caIsFouys7PNjmK6xMREWSyWMpcRI0aYHQ0AXJaf2QEAAPAWHTp00PTp00sti4mJMSkNALg+ygoAAL85deqUAgMDZbFYKuX+IyMjdc0111TKfQOAJ2IMDABQpbZt26b69evr6quv1oMPPqiQkBDZbLYy291+++2KiYlRYWGhJGnWrFnq2rWr4uLiFBQUpGbNmunJJ5/UyZMny9z2559/Vu/evVWtWjUFBgbqiiuu0Mcff1xqm3feeUcWi0WLFy/WsGHDVKNGDQUHB8tut+v6669XUlKS1qxZo+uuu07BwcGqX7++XnzxRTmdzlL3k5aWpsGDB6tmzZqyWq1q1qyZZsyYUWY7AMDFo6wAAKrMd999p/bt2ys5OVlLly7ViBEjlJeXV6ZIHD9+XJ999pkGDx4sf39/SdKOHTt088036+2339aXX36pRx99VB9//LF69epV6rZLly5Vhw4ddPz4cb3xxhv67LPP1KpVK91+++165513ymQaNmyY/P399f7772vOnDkl+8vKytKgQYM0ePBgzZ8/XzfddJPGjRunDz74oOS2hw8fVvv27bV48WI999xzmj9/vrp06aLRo0dr5MiRZfa1fPlyhYWFyd/fX82bN9eMGTPkcDgu92kFAM9lAABQSSZMmGBIMg4fPmy8//77RkBAgPHwww8bDoejZJvWrVsb7du3L3W71157zZBkbNy48az363Q6jcLCQuO7774zJBmpqakl65o2bWpcccUVRmFhYanb9OzZ04iLiyvZ98yZMw1Jxt13313m/jt16mRIMlatWlVqefPmzY1u3bqVXH/yySfPut0DDzxgWCwWY/v27SXLHnzwQeO///2v8d133xmffvqpMWjQIEOSMXjw4LM+RgCAYXBmBQBQ6aZMmaKhQ4fqxRdf1N///nf5+Pz+188999yjlStXavv27SXLZs6cqSuvvFJJSUkly3bv3q0777xTsbGx8vX1lb+/vzp16iRJ2rp1qyRp586d2rZtmwYNGiRJKioqKrncfPPNyszMLLUfSerXr99ZM8fGxuqqq64qtSw5OVn79u0ruf7tt9+qefPmZbYbOnSoDMPQt99+W7LsX//6l+655x517NhRt9xyiz744AONHDlSH3zwgdavX3/hJxEAvBBlBQBQ6T744APVqlVLAwcOLLNu0KBBslqtJSNaW7Zs0Zo1a3TPPfeUbHPixAldd911WrVqlZ5//nktW7ZMa9as0bx58yQVvzFekg4ePChJGj16tPz9/UtdHnzwQUkq8zHKcXFxZ81cvXr1MsusVmvJviTpyJEjZ719fHx8yfrzGTx4sCTpp59+Ou92AOCt+DQwAECl+/LLL3X77bfruuuu0zfffKO6deuWrIuKitItt9yi9957T88//7xmzpypwMBA3XHHHSXbfPvtt8rIyNCyZctKzqZIxe9tOVN0dLQkady4cerbt+9ZszRp0qTU9cv55K/q1asrMzOzzPKMjIxSec7FMAxJKnWmCQDwO347AgAqXd26dfX999/LarXquuuu044dO0qtv+eee5SRkaEvvvhCH3zwgW699VZFRkaWrD9dKKxWa6nbvfnmm6WuN2nSRI0aNVJqaqratm171ktYWFiFPa4bb7xRW7Zs0bp160otf++992SxWNS5c+fz3v69996TJD7OGADOgTMrAIAqERcXp++++07dunVTx44d9fXXX5e8J6Vr166qXbu2HnzwQWVlZZUaAZOk9u3bKyoqSiNGjNCECRPk7++vDz/8UKmpqWX28+abb+qmm25St27dNHToUNWqVUtHjx7V1q1btW7dOs2ePbvCHtNjjz2m9957Tz169NDkyZNVt25dLVy4UK+99poeeOABNW7cWJL0f//3f5o3b5569OihunXr6vjx45o9e7Y++ugjDR06VCkpKRWWCQA8CWdWAABVJjo6Wt9++60aNGigTp066eeff5ZUPAZ19913a//+/UpISNCNN95Y6nbVq1fXwoULFRwcrMGDB2vYsGEKDQ3VrFmzyuyjc+fOWr16tSIjI/Xoo4+qS5cueuCBB7RkyRJ16dKlQh9PjRo1tHLlSt1www0aN26cevbsqa+++kovv/yyXn311ZLt6tevr+PHj+upp55S9+7dddddd2nXrl167bXX9Pbbb1doJgDwJBbj9MAsAAAAALgQzqwAAAAAcEmUFQAAAAAuibICAAAAwCVRVgAAAAC4JMoKAAAAAJfE96xUEafTqYyMDIWFhV3WtyUDAAAA7s4wDOXm5io+Pl4+Puc+f0JZqSIZGRlKSEgwOwYAAADgMtLT01W7du1zrqesVJGwsDBJxf9DwsPDTU4DAAAAmMdm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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -216,7 +200,7 @@ "\n", " def step(t, *args):\n", " inp_a = np.full((n_neuron, n_compartments), 0.) * u.nA\n", - " inp_a[..., 0] = 0.0 * u.nA\n", + " inp_a[..., 0] = 0.002 * u.nA\n", " inp_b = np.full((n_neuron, n_compartments), 0.) * u.nA\n", " cell.compute_derivative(u.math.where(t < 100 * u.ms, inp_a, inp_b))\n", "\n", @@ -242,7 +226,7 @@ "\n", " def step_run(t):\n", " inp_a = np.full((n_neuron, n_compartments), 0.) * u.nA\n", - " inp_a[..., 0] = 0.0 * u.nA\n", + " inp_a[..., 0] = 0.002 * u.nA\n", " inp_b = np.full((n_neuron, n_compartments), 0.) * u.nA\n", " inp = u.math.where(t < 100 * u.ms, inp_a, inp_b)\n", " dx.rk4_step(cell, t, inp)\n", diff --git a/examples/golgi_model/golgi.py b/examples/golgi_model/golgi.py index b2b4b63..27ec1f5 100644 --- a/examples/golgi_model/golgi.py +++ b/examples/golgi_model/golgi.py @@ -123,7 +123,9 @@ gkca11[index_axon[0]] = conductvalues[21] gkca11[index_axon[1:]] = conductvalues[13] -## +## IKM_Grc_Ma2020 +gkmgrc = np.zeros(n_compartments) +gkmgrc[index_axon[0]] = conductvalues[20] class Golgi(dx.neurons.MultiCompartment): def __init__(self, size, connection, Ra, cm, diam, L, gl, gkv11):