|
7 | 7 |
|
8 | 8 | from typing import Union, Callable |
9 | 9 |
|
10 | | -import jax.numpy as jnp |
11 | | - |
12 | 10 | import brainpy.math as bm |
13 | 11 | from brainpy._src.dyn.base import Channel |
14 | 12 | from brainpy._src.initialize import OneInit, Initializer, parameter, variable |
|
23 | 21 | 'CalciumDetailed', |
24 | 22 | 'CalciumFirstOrder', |
25 | 23 |
|
26 | | - 'ICa_p2q_ss', 'ICa_p2q_markov', |
| 24 | + '_ICa_p2q_ss', '_ICa_p2q_markov', |
27 | 25 |
|
28 | 26 | 'ICaN_IS2008', |
29 | 27 |
|
@@ -141,12 +139,12 @@ def reset_state(self, V, C_Ca=None, E_Ca=None, batch_size=None): |
141 | 139 |
|
142 | 140 | def update(self, tdi, V): |
143 | 141 | for node in self.nodes(level=1, include_self=False).unique().subset(Channel).values(): |
144 | | - node.update(tdi, V, self.C, self.E) |
| 142 | + node.update(tdi, V, self.C.value, self.E.value) |
145 | 143 | self.C.value = self.integral(self.C.value, tdi['t'], V, tdi['dt']) |
146 | | - self.E.value = self._reversal_potential(self.C) |
| 144 | + self.E.value = self._reversal_potential(self.C.value) |
147 | 145 |
|
148 | 146 | def _reversal_potential(self, C): |
149 | | - return self._constant * jnp.log(self.C0 / C) |
| 147 | + return self._constant * bm.log(self.C0 / C) |
150 | 148 |
|
151 | 149 |
|
152 | 150 | class CalciumDetailed(CalciumDyna): |
@@ -292,7 +290,7 @@ def __init__( |
292 | 290 |
|
293 | 291 | def derivative(self, C, t, V): |
294 | 292 | ICa = self.current(V, C, self.E) |
295 | | - drive = jnp.maximum(- ICa / (2 * self.F * self.d), 0.) |
| 293 | + drive = bm.maximum(- ICa / (2 * self.F * self.d), 0.) |
296 | 294 | return drive + (self.C_rest - C) / self.tau |
297 | 295 |
|
298 | 296 |
|
@@ -335,14 +333,14 @@ def __init__( |
335 | 333 |
|
336 | 334 | def derivative(self, C, t, V): |
337 | 335 | ICa = self.current(V, C, self.E) |
338 | | - drive = jnp.maximum(- self.alpha * ICa, 0.) |
| 336 | + drive = bm.maximum(- self.alpha * ICa, 0.) |
339 | 337 | return drive - self.beta * C |
340 | 338 |
|
341 | 339 |
|
342 | 340 | # ------------------------- |
343 | 341 |
|
344 | 342 |
|
345 | | -class ICa_p2q_ss(CalciumChannel): |
| 343 | +class _ICa_p2q_ss(CalciumChannel): |
346 | 344 | r"""The calcium current model of :math:`p^2q` current which described with steady-state format. |
347 | 345 |
|
348 | 346 | The dynamics of this generalized calcium current model is given by: |
@@ -386,19 +384,19 @@ def __init__( |
386 | 384 | mode: bm.Mode = None, |
387 | 385 | name: str = None |
388 | 386 | ): |
389 | | - super(ICa_p2q_ss, self).__init__(size, |
390 | | - keep_size=keep_size, |
391 | | - name=name, |
392 | | - mode=mode, ) |
| 387 | + super(_ICa_p2q_ss, self).__init__(size, |
| 388 | + keep_size=keep_size, |
| 389 | + name=name, |
| 390 | + mode=mode, ) |
393 | 391 |
|
394 | 392 | # parameters |
395 | 393 | self.phi_p = parameter(phi_p, self.varshape, allow_none=False) |
396 | 394 | self.phi_q = parameter(phi_q, self.varshape, allow_none=False) |
397 | 395 | self.g_max = parameter(g_max, self.varshape, allow_none=False) |
398 | 396 |
|
399 | 397 | # variables |
400 | | - self.p = variable(jnp.zeros, self.mode, self.varshape) |
401 | | - self.q = variable(jnp.zeros, self.mode, self.varshape) |
| 398 | + self.p = variable(bm.zeros, self.mode, self.varshape) |
| 399 | + self.q = variable(bm.zeros, self.mode, self.varshape) |
402 | 400 |
|
403 | 401 | # functions |
404 | 402 | self.integral = odeint(JointEq([self.dp, self.dq]), method=method) |
@@ -435,7 +433,7 @@ def f_q_tau(self, V): |
435 | 433 | raise NotImplementedError |
436 | 434 |
|
437 | 435 |
|
438 | | -class ICa_p2q_markov(CalciumChannel): |
| 436 | +class _ICa_p2q_markov(CalciumChannel): |
439 | 437 | r"""The calcium current model of :math:`p^2q` current which described with first-order Markov chain. |
440 | 438 |
|
441 | 439 | The dynamics of this generalized calcium current model is given by: |
@@ -479,19 +477,19 @@ def __init__( |
479 | 477 | name: str = None, |
480 | 478 | mode: bm.Mode = None, |
481 | 479 | ): |
482 | | - super(ICa_p2q_markov, self).__init__(size, |
483 | | - keep_size=keep_size, |
484 | | - name=name, |
485 | | - mode=mode) |
| 480 | + super(_ICa_p2q_markov, self).__init__(size, |
| 481 | + keep_size=keep_size, |
| 482 | + name=name, |
| 483 | + mode=mode) |
486 | 484 |
|
487 | 485 | # parameters |
488 | 486 | self.phi_p = parameter(phi_p, self.varshape, allow_none=False) |
489 | 487 | self.phi_q = parameter(phi_q, self.varshape, allow_none=False) |
490 | 488 | self.g_max = parameter(g_max, self.varshape, allow_none=False) |
491 | 489 |
|
492 | 490 | # variables |
493 | | - self.p = variable(jnp.zeros, self.mode, self.varshape) |
494 | | - self.q = variable(jnp.zeros, self.mode, self.varshape) |
| 491 | + self.p = variable(bm.zeros, self.mode, self.varshape) |
| 492 | + self.q = variable(bm.zeros, self.mode, self.varshape) |
495 | 493 |
|
496 | 494 | # functions |
497 | 495 | self.integral = odeint(JointEq([self.dp, self.dq]), method=method) |
@@ -592,31 +590,31 @@ def __init__( |
592 | 590 | self.phi = parameter(phi, self.varshape, allow_none=False) |
593 | 591 |
|
594 | 592 | # variables |
595 | | - self.p = variable(jnp.zeros, self.mode, self.varshape) |
| 593 | + self.p = variable(bm.zeros, self.mode, self.varshape) |
596 | 594 |
|
597 | 595 | # function |
598 | 596 | self.integral = odeint(self.derivative, method=method) |
599 | 597 |
|
600 | 598 | def derivative(self, p, t, V): |
601 | | - phi_p = 1.0 / (1 + jnp.exp(-(V + 43.) / 5.2)) |
602 | | - p_inf = 2.7 / (jnp.exp(-(V + 55.) / 15.) + jnp.exp((V + 55.) / 15.)) + 1.6 |
| 599 | + phi_p = 1.0 / (1 + bm.exp(-(V + 43.) / 5.2)) |
| 600 | + p_inf = 2.7 / (bm.exp(-(V + 55.) / 15.) + bm.exp((V + 55.) / 15.)) + 1.6 |
603 | 601 | return self.phi * (phi_p - p) / p_inf |
604 | 602 |
|
605 | 603 | def update(self, tdi, V, C_Ca, E_Ca): |
606 | | - self.p.value = self.integral(self.p, tdi['t'], V, tdi['dt']) |
| 604 | + self.p.value = self.integral(self.p.value, tdi['t'], V, tdi['dt']) |
607 | 605 |
|
608 | 606 | def current(self, V, C_Ca, E_Ca): |
609 | 607 | M = C_Ca / (C_Ca + 0.2) |
610 | 608 | g = self.g_max * M * self.p |
611 | 609 | return g * (self.E - V) |
612 | 610 |
|
613 | 611 | def reset_state(self, V, C_Ca, E_Ca, batch_size=None): |
614 | | - self.p.value = 1.0 / (1 + jnp.exp(-(V + 43.) / 5.2)) |
| 612 | + self.p.value = 1.0 / (1 + bm.exp(-(V + 43.) / 5.2)) |
615 | 613 | if batch_size is not None: |
616 | 614 | assert self.p.shape[0] == batch_size |
617 | 615 |
|
618 | 616 |
|
619 | | -class ICaT_HM1992(ICa_p2q_ss): |
| 617 | +class ICaT_HM1992(_ICa_p2q_ss): |
620 | 618 | r"""The low-threshold T-type calcium current model proposed by (Huguenard & McCormick, 1992) [1]_. |
621 | 619 |
|
622 | 620 | The dynamics of the low-threshold T-type calcium current model [1]_ is given by: |
@@ -697,22 +695,22 @@ def __init__( |
697 | 695 | self.V_sh = parameter(V_sh, self.varshape, allow_none=False) |
698 | 696 |
|
699 | 697 | def f_p_inf(self, V): |
700 | | - return 1. / (1 + jnp.exp(-(V + 59. - self.V_sh) / 6.2)) |
| 698 | + return 1. / (1 + bm.exp(-(V + 59. - self.V_sh) / 6.2)) |
701 | 699 |
|
702 | 700 | def f_p_tau(self, V): |
703 | | - return 1. / (jnp.exp(-(V + 132. - self.V_sh) / 16.7) + |
704 | | - jnp.exp((V + 16.8 - self.V_sh) / 18.2)) + 0.612 |
| 701 | + return 1. / (bm.exp(-(V + 132. - self.V_sh) / 16.7) + |
| 702 | + bm.exp((V + 16.8 - self.V_sh) / 18.2)) + 0.612 |
705 | 703 |
|
706 | 704 | def f_q_inf(self, V): |
707 | | - return 1. / (1. + jnp.exp((V + 83. - self.V_sh) / 4.0)) |
| 705 | + return 1. / (1. + bm.exp((V + 83. - self.V_sh) / 4.0)) |
708 | 706 |
|
709 | 707 | def f_q_tau(self, V): |
710 | | - return jnp.where(V >= (-80. + self.V_sh), |
711 | | - jnp.exp(-(V + 22. - self.V_sh) / 10.5) + 28., |
712 | | - jnp.exp((V + 467. - self.V_sh) / 66.6)) |
| 708 | + return bm.where(V >= (-80. + self.V_sh), |
| 709 | + bm.exp(-(V + 22. - self.V_sh) / 10.5) + 28., |
| 710 | + bm.exp((V + 467. - self.V_sh) / 66.6)) |
713 | 711 |
|
714 | 712 |
|
715 | | -class ICaT_HP1992(ICa_p2q_ss): |
| 713 | +class ICaT_HP1992(_ICa_p2q_ss): |
716 | 714 | r"""The low-threshold T-type calcium current model for thalamic |
717 | 715 | reticular nucleus proposed by (Huguenard & Prince, 1992) [1]_. |
718 | 716 |
|
@@ -795,21 +793,21 @@ def __init__( |
795 | 793 | self.V_sh = parameter(V_sh, self.varshape, allow_none=False) |
796 | 794 |
|
797 | 795 | def f_p_inf(self, V): |
798 | | - return 1. / (1. + jnp.exp(-(V + 52. - self.V_sh) / 7.4)) |
| 796 | + return 1. / (1. + bm.exp(-(V + 52. - self.V_sh) / 7.4)) |
799 | 797 |
|
800 | 798 | def f_p_tau(self, V): |
801 | | - return 3. + 1. / (jnp.exp((V + 27. - self.V_sh) / 10.) + |
802 | | - jnp.exp(-(V + 102. - self.V_sh) / 15.)) |
| 799 | + return 3. + 1. / (bm.exp((V + 27. - self.V_sh) / 10.) + |
| 800 | + bm.exp(-(V + 102. - self.V_sh) / 15.)) |
803 | 801 |
|
804 | 802 | def f_q_inf(self, V): |
805 | | - return 1. / (1. + jnp.exp((V + 80. - self.V_sh) / 5.)) |
| 803 | + return 1. / (1. + bm.exp((V + 80. - self.V_sh) / 5.)) |
806 | 804 |
|
807 | 805 | def f_q_tau(self, V): |
808 | | - return 85. + 1. / (jnp.exp((V + 48. - self.V_sh) / 4.) + |
809 | | - jnp.exp(-(V + 407. - self.V_sh) / 50.)) |
| 806 | + return 85. + 1. / (bm.exp((V + 48. - self.V_sh) / 4.) + |
| 807 | + bm.exp(-(V + 407. - self.V_sh) / 50.)) |
810 | 808 |
|
811 | 809 |
|
812 | | -class ICaHT_HM1992(ICa_p2q_ss): |
| 810 | +class ICaHT_HM1992(_ICa_p2q_ss): |
813 | 811 | r"""The high-threshold T-type calcium current model proposed by (Huguenard & McCormick, 1992) [1]_. |
814 | 812 |
|
815 | 813 | The high-threshold T-type calcium current model is adopted from [1]_. |
@@ -886,29 +884,29 @@ def __init__( |
886 | 884 | self.V_sh = parameter(V_sh, self.varshape, allow_none=False) |
887 | 885 |
|
888 | 886 | # variables |
889 | | - self.p = variable(jnp.zeros, self.mode, self.varshape) |
890 | | - self.q = variable(jnp.zeros, self.mode, self.varshape) |
| 887 | + self.p = variable(bm.zeros, self.mode, self.varshape) |
| 888 | + self.q = variable(bm.zeros, self.mode, self.varshape) |
891 | 889 |
|
892 | 890 | # function |
893 | 891 | self.integral = odeint(JointEq([self.dp, self.dq]), method=method) |
894 | 892 |
|
895 | 893 | def f_p_inf(self, V): |
896 | | - return 1. / (1. + jnp.exp(-(V + 59. - self.V_sh) / 6.2)) |
| 894 | + return 1. / (1. + bm.exp(-(V + 59. - self.V_sh) / 6.2)) |
897 | 895 |
|
898 | 896 | def f_p_tau(self, V): |
899 | | - return 1. / (jnp.exp(-(V + 132. - self.V_sh) / 16.7) + |
900 | | - jnp.exp((V + 16.8 - self.V_sh) / 18.2)) + 0.612 |
| 897 | + return 1. / (bm.exp(-(V + 132. - self.V_sh) / 16.7) + |
| 898 | + bm.exp((V + 16.8 - self.V_sh) / 18.2)) + 0.612 |
901 | 899 |
|
902 | 900 | def f_q_inf(self, V): |
903 | | - return 1. / (1. + jnp.exp((V + 83. - self.V_sh) / 4.)) |
| 901 | + return 1. / (1. + bm.exp((V + 83. - self.V_sh) / 4.)) |
904 | 902 |
|
905 | 903 | def f_q_tau(self, V): |
906 | | - return jnp.where(V >= (-80. + self.V_sh), |
907 | | - jnp.exp(-(V + 22. - self.V_sh) / 10.5) + 28., |
908 | | - jnp.exp((V + 467. - self.V_sh) / 66.6)) |
| 904 | + return bm.where(V >= (-80. + self.V_sh), |
| 905 | + bm.exp(-(V + 22. - self.V_sh) / 10.5) + 28., |
| 906 | + bm.exp((V + 467. - self.V_sh) / 66.6)) |
909 | 907 |
|
910 | 908 |
|
911 | | -class ICaHT_Re1993(ICa_p2q_markov): |
| 909 | +class ICaHT_Re1993(_ICa_p2q_markov): |
912 | 910 | r"""The high-threshold T-type calcium current model proposed by (Reuveni, et al., 1993) [1]_. |
913 | 911 |
|
914 | 912 | HVA Calcium current was described for neocortical neurons by Sayer et al. (1990). |
@@ -994,19 +992,19 @@ def __init__( |
994 | 992 |
|
995 | 993 | def f_p_alpha(self, V): |
996 | 994 | temp = -27 - V + self.V_sh |
997 | | - return 0.055 * temp / (jnp.exp(temp / 3.8) - 1) |
| 995 | + return 0.055 * temp / (bm.exp(temp / 3.8) - 1) |
998 | 996 |
|
999 | 997 | def f_p_beta(self, V): |
1000 | | - return 0.94 * jnp.exp((-75. - V + self.V_sh) / 17.) |
| 998 | + return 0.94 * bm.exp((-75. - V + self.V_sh) / 17.) |
1001 | 999 |
|
1002 | 1000 | def f_q_alpha(self, V): |
1003 | | - return 0.000457 * jnp.exp((-13. - V + self.V_sh) / 50.) |
| 1001 | + return 0.000457 * bm.exp((-13. - V + self.V_sh) / 50.) |
1004 | 1002 |
|
1005 | 1003 | def f_q_beta(self, V): |
1006 | | - return 0.0065 / (jnp.exp((-15. - V + self.V_sh) / 28.) + 1.) |
| 1004 | + return 0.0065 / (bm.exp((-15. - V + self.V_sh) / 28.) + 1.) |
1007 | 1005 |
|
1008 | 1006 |
|
1009 | | -class ICaL_IS2008(ICa_p2q_ss): |
| 1007 | +class ICaL_IS2008(_ICa_p2q_ss): |
1010 | 1008 | r"""The L-type calcium channel model proposed by (Inoue & Strowbridge, 2008) [1]_. |
1011 | 1009 |
|
1012 | 1010 | The L-type calcium channel model is adopted from (Inoue, et, al., 2008) [1]_. |
@@ -1080,15 +1078,15 @@ def __init__( |
1080 | 1078 | self.V_sh = parameter(V_sh, self.varshape, allow_none=False) |
1081 | 1079 |
|
1082 | 1080 | def f_p_inf(self, V): |
1083 | | - return 1. / (1 + jnp.exp(-(V + 10. - self.V_sh) / 4.)) |
| 1081 | + return 1. / (1 + bm.exp(-(V + 10. - self.V_sh) / 4.)) |
1084 | 1082 |
|
1085 | 1083 | def f_p_tau(self, V): |
1086 | | - return 0.4 + .7 / (jnp.exp(-(V + 5. - self.V_sh) / 15.) + |
1087 | | - jnp.exp((V + 5. - self.V_sh) / 15.)) |
| 1084 | + return 0.4 + .7 / (bm.exp(-(V + 5. - self.V_sh) / 15.) + |
| 1085 | + bm.exp((V + 5. - self.V_sh) / 15.)) |
1088 | 1086 |
|
1089 | 1087 | def f_q_inf(self, V): |
1090 | | - return 1. / (1. + jnp.exp((V + 25. - self.V_sh) / 2.)) |
| 1088 | + return 1. / (1. + bm.exp((V + 25. - self.V_sh) / 2.)) |
1091 | 1089 |
|
1092 | 1090 | def f_q_tau(self, V): |
1093 | | - return 300. + 100. / (jnp.exp((V + 40 - self.V_sh) / 9.5) + |
1094 | | - jnp.exp(-(V + 40 - self.V_sh) / 9.5)) |
| 1091 | + return 300. + 100. / (bm.exp((V + 40 - self.V_sh) / 9.5) + |
| 1092 | + bm.exp(-(V + 40 - self.V_sh) / 9.5)) |
0 commit comments