vbi 0.1.3__cp310-cp310-manylinux2014_x86_64.whl → 0.2__cp310-cp310-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- vbi/feature_extraction/features.json +4 -1
- vbi/feature_extraction/features.py +10 -4
- vbi/inference.py +50 -22
- vbi/models/cpp/_src/_do.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/_jr_sdde.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/_jr_sde.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/_km_sde.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/_mpr_sde.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/_vep.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/_wc_ode.cpython-310-x86_64-linux-gnu.so +0 -0
- vbi/models/cpp/_src/jr_sde.hpp +5 -6
- vbi/models/cpp/_src/jr_sde_wrap.cxx +28 -28
- vbi/models/cpp/jansen_rit.py +2 -9
- vbi/models/cupy/bold.py +117 -0
- vbi/models/cupy/jansen_rit.py +1 -1
- vbi/models/cupy/km.py +62 -34
- vbi/models/cupy/mpr.py +24 -4
- vbi/models/cupy/utils.py +163 -2
- vbi/models/cupy/wilson_cowan.py +317 -0
- vbi/models/cupy/ww.py +342 -0
- vbi/models/numba/__init__.py +4 -0
- vbi/models/numba/jansen_rit.py +532 -0
- vbi/models/numba/mpr.py +8 -0
- vbi/models/numba/wilson_cowan.py +443 -0
- vbi/models/numba/ww.py +564 -0
- {vbi-0.1.3.dist-info → vbi-0.2.dist-info}/METADATA +30 -11
- {vbi-0.1.3.dist-info → vbi-0.2.dist-info}/RECORD +30 -26
- {vbi-0.1.3.dist-info → vbi-0.2.dist-info}/WHEEL +1 -1
- vbi/models/numba/_ww_EI.py +0 -444
- {vbi-0.1.3.dist-info → vbi-0.2.dist-info}/licenses/LICENSE +0 -0
- {vbi-0.1.3.dist-info → vbi-0.2.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
vbi/__init__.py,sha256=jrCuk7WXg9m93yeNUpBYd6YU-ardG_ElbYo7PKOXlC4,925
|
2
2
|
vbi/_version.py,sha256=HzXy6r3mq7QU6lltj6cO46N68LxvGQfYbUUWiv8OH4o,541
|
3
|
-
vbi/inference.py,sha256=
|
3
|
+
vbi/inference.py,sha256=BUM5SE_jlLhYOFmYVkvXnDMFdQHI7EpRLogVrex3XJc,3545
|
4
4
|
vbi/utils.py,sha256=6jOPoomQbgTP8fv0hnt4pAGqDUUrvDtMqtP8rqNmVNw,10993
|
5
5
|
vbi/dataset/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
6
6
|
vbi/dataset/connectivity_84/centers.txt,sha256=KJgj_ehlVcq2ydNhI_xmBSh_QJTiFMD_FHAUlv3bobw,3906
|
@@ -16,8 +16,8 @@ vbi/dataset/connectivity_88/tract_lengths.txt,sha256=T9or8JFl6nETCgF23rOsg2Ldlvg
|
|
16
16
|
vbi/dataset/connectivity_88/weights.txt,sha256=XQcdJPMk7w1cZ6xDexA6Uzfv6kXXs6-YKJVMuXzk9QE,100672
|
17
17
|
vbi/feature_extraction/__init__.py,sha256=aoewfgGUCvbPeP6dHoeOtXF6vfysGNf7-YUY6KIA99o,37
|
18
18
|
vbi/feature_extraction/calc_features.py,sha256=0LtEMzwRYC47FYP5VRZ-mSKgVf7gXoXgI8ZE1lPDTOE,8777
|
19
|
-
vbi/feature_extraction/features.json,sha256=
|
20
|
-
vbi/feature_extraction/features.py,sha256=
|
19
|
+
vbi/feature_extraction/features.json,sha256=PVhuZb6Ut2dDphSY-PgCvVznmH-xrGWrRJa3hQZgObQ,14085
|
20
|
+
vbi/feature_extraction/features.py,sha256=hFeQEov_sKE4am2kO58q7zgGA8qCcel9iGlwhfvSb5E,57421
|
21
21
|
vbi/feature_extraction/features_settings.py,sha256=ZwT8MLscA0UmMyVU2x0a7NMvZjqD_PfesTneqHpR-mU,9919
|
22
22
|
vbi/feature_extraction/features_utils.py,sha256=W5jkkiuf69ny4dK3NSdZ_Y6z5YdHq2y0zXNl2ryG0-E,34256
|
23
23
|
vbi/feature_extraction/infodynamics.jar,sha256=_sp1qeyXTVc7TQ-h7xUZxkxsj6S_7iUCodH0IcLYJeo,613523
|
@@ -25,19 +25,19 @@ vbi/feature_extraction/utility.py,sha256=VI2Io_AAbT8lb_LMuMNK0pZ-Ipc56A0a6qiabqT
|
|
25
25
|
vbi/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
26
|
vbi/models/cpp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
27
27
|
vbi/models/cpp/damp_oscillator.py,sha256=kj5TKNc5obXhZA4pxaP89ymVnEc1h2xKNJ5v4FBdvRo,3976
|
28
|
-
vbi/models/cpp/jansen_rit.py,sha256=
|
28
|
+
vbi/models/cpp/jansen_rit.py,sha256=rBuzdDrpnXQUg0Rins8U5CKOTprlJxX2BSnT_bk9ysw,17128
|
29
29
|
vbi/models/cpp/km.py,sha256=n4dXC2vvAYzAve9xQX8oSwPFiTQg34zX-TcpiMEn2Vs,6181
|
30
30
|
vbi/models/cpp/mpr.py,sha256=lDQCr4n9cAIBrEEtLzNx-JcXoRRC80sHW4rSBygPMO0,8602
|
31
31
|
vbi/models/cpp/vep.py,sha256=TsLTERFhU2dc-ORStSacfaFjMpnfA26-WsHHMk0bQhc,4182
|
32
32
|
vbi/models/cpp/wc.py,sha256=kriqwzdLlTrqRO4us1LqoaAvGuTwHPeSCaQuPb2H4Zc,6721
|
33
33
|
vbi/models/cpp/_src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
|
-
vbi/models/cpp/_src/_do.cpython-310-x86_64-linux-gnu.so,sha256=
|
35
|
-
vbi/models/cpp/_src/_jr_sdde.cpython-310-x86_64-linux-gnu.so,sha256=
|
36
|
-
vbi/models/cpp/_src/_jr_sde.cpython-310-x86_64-linux-gnu.so,sha256=
|
37
|
-
vbi/models/cpp/_src/_km_sde.cpython-310-x86_64-linux-gnu.so,sha256=
|
38
|
-
vbi/models/cpp/_src/_mpr_sde.cpython-310-x86_64-linux-gnu.so,sha256=
|
39
|
-
vbi/models/cpp/_src/_vep.cpython-310-x86_64-linux-gnu.so,sha256=
|
40
|
-
vbi/models/cpp/_src/_wc_ode.cpython-310-x86_64-linux-gnu.so,sha256=
|
34
|
+
vbi/models/cpp/_src/_do.cpython-310-x86_64-linux-gnu.so,sha256=yXFIIwmdZwXovYUB8svqgAZW5yNiG90vu2s9fS18T6A,350224
|
35
|
+
vbi/models/cpp/_src/_jr_sdde.cpython-310-x86_64-linux-gnu.so,sha256=wzdR-q2XuQ7Sprzqr7KzBThQlosWNETnHST9urWEkSE,590224
|
36
|
+
vbi/models/cpp/_src/_jr_sde.cpython-310-x86_64-linux-gnu.so,sha256=Bfhdg-1-Q2zyI-WO25zpvbTzKUUllDk99EciV_i-5dI,382256
|
37
|
+
vbi/models/cpp/_src/_km_sde.cpython-310-x86_64-linux-gnu.so,sha256=nTgRHrFrvvqxBEnSgE-VTVqCc-4PbDQZLsEF9ijJumI,552128
|
38
|
+
vbi/models/cpp/_src/_mpr_sde.cpython-310-x86_64-linux-gnu.so,sha256=mlgsINg-16CUxW74u8W3v7U1zDJndTfcjjCKH6Ceaok,583920
|
39
|
+
vbi/models/cpp/_src/_vep.cpython-310-x86_64-linux-gnu.so,sha256=U0nLS4p48RaD_kr2GpeG-5aieLG1Pr_yWwBUMwdFrIQ,370520
|
40
|
+
vbi/models/cpp/_src/_wc_ode.cpython-310-x86_64-linux-gnu.so,sha256=M0lDtg7OHI4sL-c92k2FnzqXVFnqbo9mnote2JwuciY,689792
|
41
41
|
vbi/models/cpp/_src/bold.hpp,sha256=3yO8mYg3f_zpunpoDGtrBJM6rXpO14fDdTfrgghTkR8,9010
|
42
42
|
vbi/models/cpp/_src/do.hpp,sha256=5D4C7mse4c1Z5NMTIASatmMffA3vswut-xKCkTu0dBw,3826
|
43
43
|
vbi/models/cpp/_src/do.i,sha256=R3tvlYU99X9JuzBtkvcBi6awRD2cJZ1V9H4s-qrQJnw,311
|
@@ -47,10 +47,10 @@ vbi/models/cpp/_src/jr_sdde.hpp,sha256=gkUDKqr0vGsCXXv4mpe4YddUAwMReFMsEAOjJRPe4
|
|
47
47
|
vbi/models/cpp/_src/jr_sdde.i,sha256=wMB2pN_H4UrfVc7gbYvGWcvgDpGY1NBYlb-1zMNUtEM,423
|
48
48
|
vbi/models/cpp/_src/jr_sdde.py,sha256=942Y2ahDr9Pcop5uVzdU7quFSU8IIYBj4U3eegiBHiI,20257
|
49
49
|
vbi/models/cpp/_src/jr_sdde_wrap.cxx,sha256=cr6G-95V7GBnTovucXkxj4ptLFsUP68YewPuXrCTpFY,715796
|
50
|
-
vbi/models/cpp/_src/jr_sde.hpp,sha256=
|
50
|
+
vbi/models/cpp/_src/jr_sde.hpp,sha256=oOBsv1MTq2Kr6kv1YeWq1eYRP6MCoOO2l0dz2xQNoh8,6576
|
51
51
|
vbi/models/cpp/_src/jr_sde.i,sha256=trkSFHmJL2au7u8XfacgHhAgd83gMpbf8HsTHtaPo2U,323
|
52
52
|
vbi/models/cpp/_src/jr_sde.py,sha256=RY5-gUGMw6tFU6qMVrQiaRYJiCXneMK1WjnSZOtzWq4,13617
|
53
|
-
vbi/models/cpp/_src/jr_sde_wrap.cxx,sha256=
|
53
|
+
vbi/models/cpp/_src/jr_sde_wrap.cxx,sha256=zwhtI33yZabbrd-0KHR7WOeiTQrw1JK0NFm3KwQkWsM,486985
|
54
54
|
vbi/models/cpp/_src/km_sde.hpp,sha256=5Gf8Vm0uSPQJncTUDejg6tg_xL88zX5yDpUxXUzqfwI,3657
|
55
55
|
vbi/models/cpp/_src/km_sde.i,sha256=3Mgf0JLu5P9dLjy1qW6W90NrG_1I4h5AA2E2eG090PQ,413
|
56
56
|
vbi/models/cpp/_src/km_sde.py,sha256=N7-51Eg2UZOCH2Knv6LJ-MI6zFWVan6jJE1rkXIW5kU,19249
|
@@ -71,18 +71,22 @@ vbi/models/cpp/_src/wc_ode.py,sha256=fjJ42VxF2cBO94I-zr9G7UaSZ031tPDxGQ_YyN-ZH3w
|
|
71
71
|
vbi/models/cpp/_src/wc_ode_wrap.cxx,sha256=sjGmT0GUOchmM4TApS-AyzcR4xAiDq4Q9QzDIbrzAdU,946453
|
72
72
|
vbi/models/cpp/_src/__pycache__/mpr_sde.cpython-310.pyc,sha256=iVa9uKW8InSohi0UMNO2TLWSvwOq83maCCzyQ47G_50,32596
|
73
73
|
vbi/models/cupy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
74
|
-
vbi/models/cupy/bold.py,sha256=
|
74
|
+
vbi/models/cupy/bold.py,sha256=36Sa_iU5njBawtq0iAmMNcZzllE07OvKanNfqpdXHYQ,6469
|
75
75
|
vbi/models/cupy/ghb.py,sha256=azFBqYn2hWS11BjS3M7oGXNRy3pRYhZUNWsJcrqoOZ8,7451
|
76
|
-
vbi/models/cupy/jansen_rit.py,sha256=
|
77
|
-
vbi/models/cupy/km.py,sha256=
|
78
|
-
vbi/models/cupy/mpr.py,sha256=
|
76
|
+
vbi/models/cupy/jansen_rit.py,sha256=DHS2GRSMhVRBgw6s1Zw_YBYqsZSp3M0uvjggF3hOo-Q,13206
|
77
|
+
vbi/models/cupy/km.py,sha256=IltJGnVYtg9vxOVm691n5LzUFXXbAHI-27_kb8mH3Rk,7878
|
78
|
+
vbi/models/cupy/mpr.py,sha256=5dyoADaZXEnZbrPCZUAtayXCUid97RXNVShAYNtWfyc,14636
|
79
79
|
vbi/models/cupy/mpr_modified_bold.py,sha256=w-mVj0G86GIWTDcUY8rrDz6UgiTAoPZ0vK45VoADEnU,370
|
80
|
-
vbi/models/cupy/utils.py,sha256=
|
81
|
-
vbi/models/
|
82
|
-
vbi/models/
|
80
|
+
vbi/models/cupy/utils.py,sha256=d_Lo7bguMqxvWDu8bdE5e3J2OVd0LznjiKMeEX5PbMo,7765
|
81
|
+
vbi/models/cupy/wilson_cowan.py,sha256=LdRHClPdXDO89lNFyAIZs9zhHIeIYSBup5DEnImToMg,9943
|
82
|
+
vbi/models/cupy/ww.py,sha256=_zxLQslY8ni_608gBZPLgjWf2vlkv2LG2YkZaGihtvE,11211
|
83
|
+
vbi/models/numba/__init__.py,sha256=NK8M8GGAuy5kslFOPJseoftuPd570Q2R-Pt2tW7qqMY,80
|
83
84
|
vbi/models/numba/damp_oscillator.py,sha256=VLCPCcemDBXjbhtf5wkxXqqwWNPvDsdPQ_-4Ev-2YWg,3966
|
84
85
|
vbi/models/numba/ghb.py,sha256=weLLfhmrwQ9pXec7HD9X3U8Fg-PR74KNOnjECdTyRvA,5898
|
85
|
-
vbi/models/numba/
|
86
|
+
vbi/models/numba/jansen_rit.py,sha256=yRTFEIId5YAdl-u5wwfl6i3vqW0BW1Fuuah6panBUbI,16812
|
87
|
+
vbi/models/numba/mpr.py,sha256=jpfF4ttqWmuYJrKMDlNgDgSCsWedXIbc-JWTtOzf6Dw,10257
|
88
|
+
vbi/models/numba/wilson_cowan.py,sha256=mZue7YBlhtPbW0ljz3s3uwUPIsbNTJgln8K23Cq_qFw,12475
|
89
|
+
vbi/models/numba/ww.py,sha256=g8RDxzfJQ4KXbF9yKKcwuQNICdjaWO8ZLkbt_r3XEqw,16557
|
86
90
|
vbi/models/pytorch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
87
91
|
vbi/models/pytorch/ww_sde_kong.py,sha256=M1xm_wCQXAjZ_dJ_aj-g9SYCPH2ReEns2ajUg2mb9oc,17072
|
88
92
|
vbi/models/pytorch/data/default_parameters.npz,sha256=7lUMf6btGWzghl8P2OpT3yebYLBxDpQgdTAeBSCXF-U,820846
|
@@ -114,8 +118,8 @@ vbi/tests/test_ghb_cupy.py,sha256=IglmkfvM76g-IjkRyG1VJq87Nfn1GJPnjMlrV4jyJJE,21
|
|
114
118
|
vbi/tests/test_mpr_cupy.py,sha256=X568kl3TkXvV8e8F1_Gt2WP5t8pC5mGAzsMe0ji8_7A,1118
|
115
119
|
vbi/tests/test_mpr_numba.py,sha256=ctaBkGTlzzzM48kKoplJNMJUcMg__F3eNsR47EjJefg,1891
|
116
120
|
vbi/tests/test_suite.py,sha256=3D7NBY2ve29ncT59-VVH88fYYrS0Wqu-G2FFj-m8Lc4,654
|
117
|
-
vbi-0.
|
118
|
-
vbi-0.
|
119
|
-
vbi-0.
|
120
|
-
vbi-0.
|
121
|
-
vbi-0.
|
121
|
+
vbi-0.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
122
|
+
vbi-0.2.dist-info/METADATA,sha256=vgkTzDNdm7xlvqlKW9hVYvok438FAeDAT87QGGdbjVM,7795
|
123
|
+
vbi-0.2.dist-info/WHEEL,sha256=7Cj2XrhsdKMjPi7T0xvQDc5HEcioDLTsKmSWBd8-0YY,112
|
124
|
+
vbi-0.2.dist-info/top_level.txt,sha256=fbMk9hUFp5f8kQ5xOFIHlcqpHDO70CUHeJZtSp81RMM,4
|
125
|
+
vbi-0.2.dist-info/RECORD,,
|
vbi/models/numba/_ww_EI.py
DELETED
@@ -1,444 +0,0 @@
|
|
1
|
-
import warnings
|
2
|
-
import numpy as np
|
3
|
-
from numba import njit
|
4
|
-
from numba.experimental import jitclass
|
5
|
-
from numba.core.errors import NumbaPerformanceWarning
|
6
|
-
from numba import float64, boolean, int64, types
|
7
|
-
|
8
|
-
warnings.simplefilter("ignore", category=NumbaPerformanceWarning)
|
9
|
-
|
10
|
-
|
11
|
-
w_spec = [
|
12
|
-
("G", float64),
|
13
|
-
|
14
|
-
("a_I", float64),
|
15
|
-
("b_I", float64),
|
16
|
-
("d_I", float64),
|
17
|
-
("tau_I", float64),
|
18
|
-
|
19
|
-
("a_E", float64),
|
20
|
-
("b_E", float64),
|
21
|
-
("d_E", float64),
|
22
|
-
("tau_E", float64),
|
23
|
-
|
24
|
-
("w_II", float64),
|
25
|
-
("w_EE", float64),
|
26
|
-
("w_IE", float64),
|
27
|
-
("w_EI", float64),
|
28
|
-
|
29
|
-
("W_E", float64),
|
30
|
-
("W_I", float64),
|
31
|
-
|
32
|
-
("gamma", float64),
|
33
|
-
("dt", float64),
|
34
|
-
("J_NMDA", float64),
|
35
|
-
("J_I", float64),
|
36
|
-
|
37
|
-
("I_I", float64[:]),
|
38
|
-
("I_E", float64[:]),
|
39
|
-
|
40
|
-
# ("sigma_I", float64),
|
41
|
-
# ("sigma_E", float64),
|
42
|
-
|
43
|
-
("initial_state", float64[:]),
|
44
|
-
("weights", float64[:, :]),
|
45
|
-
("seed", int64),
|
46
|
-
("method", types.string),
|
47
|
-
("t_end", float64),
|
48
|
-
("t_cut", float64),
|
49
|
-
("nn", int64),
|
50
|
-
("ts_decimate", int64),
|
51
|
-
("fmri_decimate", int64),
|
52
|
-
("RECORD_TS", boolean),
|
53
|
-
("RECORD_FMRI", boolean),
|
54
|
-
]
|
55
|
-
|
56
|
-
b_spec = [
|
57
|
-
("eps", float64),
|
58
|
-
("E0", float64),
|
59
|
-
("V0", float64),
|
60
|
-
("alpha", float64),
|
61
|
-
("inv_alpha", float64),
|
62
|
-
("K1", float64),
|
63
|
-
("K2", float64),
|
64
|
-
("K3", float64),
|
65
|
-
("taus", float64),
|
66
|
-
("tauo", float64),
|
67
|
-
("tauf", float64),
|
68
|
-
("inv_tauo", float64),
|
69
|
-
("inv_taus", float64),
|
70
|
-
("inv_tauf", float64),
|
71
|
-
("nn", int64),
|
72
|
-
("dt_bold", float64),
|
73
|
-
]
|
74
|
-
|
75
|
-
|
76
|
-
@jitclass(w_spec)
|
77
|
-
class ParWW:
|
78
|
-
def __init__(
|
79
|
-
self,
|
80
|
-
G=0.0,
|
81
|
-
a_I=615.0,
|
82
|
-
b_I=177.0,
|
83
|
-
d_I=0.087,
|
84
|
-
tau_I=0.01,
|
85
|
-
|
86
|
-
a_E=310.0,
|
87
|
-
b_E=125.0,
|
88
|
-
d_E=0.16,
|
89
|
-
tau_E=0.1,
|
90
|
-
|
91
|
-
gamma=0.641,
|
92
|
-
|
93
|
-
w_II=1.0,
|
94
|
-
w_IE=1.4,
|
95
|
-
w_EI=1.0,
|
96
|
-
w_EE=1.0,
|
97
|
-
dt=0.01,
|
98
|
-
|
99
|
-
W_E=1.0,
|
100
|
-
W_I =0.7,
|
101
|
-
|
102
|
-
I0 = 0.382,
|
103
|
-
J_NMDA=0.15,
|
104
|
-
|
105
|
-
|
106
|
-
I_I=np.array([0.296]), # 0.296
|
107
|
-
I_E=np.array([0.377]), # 0.377
|
108
|
-
sigma_I=0.001,
|
109
|
-
sigma_E=0.001,
|
110
|
-
initial_state=np.array([]),
|
111
|
-
weights=np.array([[], []]),
|
112
|
-
seed=-1,
|
113
|
-
method="heun",
|
114
|
-
t_end=300.0,
|
115
|
-
t_cut=0.0,
|
116
|
-
ts_decimate=10,
|
117
|
-
fmri_decimate=10,
|
118
|
-
RECORD_TS=True,
|
119
|
-
RECORD_FMRI=True,
|
120
|
-
):
|
121
|
-
self.G = G
|
122
|
-
self.a_I = a_I
|
123
|
-
self.b_I = b_I
|
124
|
-
self.d_I = d_I
|
125
|
-
self.tau_I = tau_I
|
126
|
-
|
127
|
-
self.a_E = a_E
|
128
|
-
self.b_E = b_E
|
129
|
-
self.d_E = d_E
|
130
|
-
self.tau_E = tau_E
|
131
|
-
|
132
|
-
self.w_II = w_II
|
133
|
-
self.w_IE = w_IE
|
134
|
-
self.w_EI = w_EI
|
135
|
-
self.w_EE = w_EE
|
136
|
-
self.gamma = gamma
|
137
|
-
|
138
|
-
self.dt = dt
|
139
|
-
|
140
|
-
self.W_E = W_E
|
141
|
-
self.W_I = W_I
|
142
|
-
|
143
|
-
self.I0 = I0
|
144
|
-
self.I_E = I_E
|
145
|
-
self.I_I = I_I
|
146
|
-
self.J_NMDA = J_NMDA
|
147
|
-
|
148
|
-
self.sigma_I = sigma_I
|
149
|
-
self.sigma_E = sigma_E
|
150
|
-
|
151
|
-
self.initial_state = initial_state
|
152
|
-
self.weights = weights
|
153
|
-
self.seed = seed
|
154
|
-
self.method = method
|
155
|
-
self.t_end = t_end
|
156
|
-
self.t_cut = t_cut
|
157
|
-
self.ts_decimate = ts_decimate
|
158
|
-
self.fmri_decimate = fmri_decimate
|
159
|
-
self.RECORD_TS = RECORD_TS
|
160
|
-
self.RECORD_FMRI = RECORD_FMRI
|
161
|
-
if len(initial_state) > 0:
|
162
|
-
self.nn = len(initial_state)
|
163
|
-
else:
|
164
|
-
self.nn = -1
|
165
|
-
|
166
|
-
|
167
|
-
@jitclass(b_spec)
|
168
|
-
class ParBaloon:
|
169
|
-
def __init__(
|
170
|
-
self, eps=0.5, E0=0.4, V0=4.0,
|
171
|
-
alpha=0.32, taus=1.54, tauo=0.98, tauf=1.44
|
172
|
-
):
|
173
|
-
self.eps = eps
|
174
|
-
self.E0 = E0
|
175
|
-
self.V0 = V0
|
176
|
-
self.alpha = alpha
|
177
|
-
self.inv_alpha = 1.0 / alpha
|
178
|
-
self.K1 = 7.0 * E0
|
179
|
-
self.K2 = 2 * E0
|
180
|
-
self.K3 = 1 - eps
|
181
|
-
self.taus = taus
|
182
|
-
self.tauo = tauo
|
183
|
-
self.tauf = tauf
|
184
|
-
self.inv_tauo = 1.0 / tauo
|
185
|
-
self.inv_taus = 1.0 / taus
|
186
|
-
self.inv_tauf = 1.0 / tauf
|
187
|
-
self.dt_bold = 0.01
|
188
|
-
|
189
|
-
|
190
|
-
@njit
|
191
|
-
def f_ww(S, P):
|
192
|
-
"""
|
193
|
-
system function for Wong-Wang model.
|
194
|
-
"""
|
195
|
-
coupling = np.dot(P.weights, S)
|
196
|
-
x = P.w * P.J_N * S + P.I_o + P.G * P.J_N * coupling
|
197
|
-
H = (P.a * x - P.b) / (1 - np.exp(-P.d * (P.a * x - P.b)))
|
198
|
-
dS = -(S / P.tau_s) + (1 - S) * H * P.gamma
|
199
|
-
return dS
|
200
|
-
|
201
|
-
|
202
|
-
@njit
|
203
|
-
def f_fmri(xin, x, t, B):
|
204
|
-
"""
|
205
|
-
system function for Balloon model.
|
206
|
-
"""
|
207
|
-
E0 = B.E0
|
208
|
-
nn = B.nn
|
209
|
-
inv_tauf = B.inv_tauf
|
210
|
-
inv_tauo = B.inv_tauo
|
211
|
-
inv_taus = B.inv_taus
|
212
|
-
inv_alpha = B.inv_alpha
|
213
|
-
|
214
|
-
dxdt = np.zeros(4 * nn)
|
215
|
-
s = x[:nn]
|
216
|
-
f = x[nn : 2 * nn]
|
217
|
-
v = x[2 * nn : 3 * nn]
|
218
|
-
q = x[3 * nn :]
|
219
|
-
|
220
|
-
dxdt[:nn] = xin - inv_taus * s - inv_tauf * (f - 1.0)
|
221
|
-
dxdt[nn : (2 * nn)] = s
|
222
|
-
dxdt[(2 * nn) : (3 * nn)] = inv_tauo * (f - v ** (inv_alpha))
|
223
|
-
dxdt[3 * nn :] = (inv_tauo) * (
|
224
|
-
(f * (1.0 - (1.0 - E0) ** (1.0 / f)) / E0) - (v ** (inv_alpha)) * (q / v)
|
225
|
-
)
|
226
|
-
return dxdt
|
227
|
-
|
228
|
-
|
229
|
-
@njit
|
230
|
-
def euler_sde_step(S, P):
|
231
|
-
dW = np.sqrt(P.dt) * P.sigma_noise * np.random.randn(P.nn)
|
232
|
-
return S + P.dt * f_ww(S, P) + dW
|
233
|
-
|
234
|
-
|
235
|
-
@njit
|
236
|
-
def heun_sde_step(S, P):
|
237
|
-
dW = np.sqrt(P.dt) * P.sigma_noise * np.random.randn(P.nn)
|
238
|
-
k0 = f_ww(S, P)
|
239
|
-
S1 = S + P.dt * k0 + dW
|
240
|
-
k1 = f_ww(S1, P)
|
241
|
-
return S + 0.5 * P.dt * (k0 + k1) + dW
|
242
|
-
|
243
|
-
|
244
|
-
@njit
|
245
|
-
def heun_ode_step(yin, y, t, B):
|
246
|
-
"""Heun scheme."""
|
247
|
-
|
248
|
-
dt = B.dt_bold
|
249
|
-
k1 = f_fmri(yin, y, t, B)
|
250
|
-
tmp = y + dt * k1
|
251
|
-
k2 = f_fmri(yin, tmp, t + dt, B)
|
252
|
-
y += 0.5 * dt * (k1 + k2)
|
253
|
-
return y
|
254
|
-
|
255
|
-
|
256
|
-
@njit
|
257
|
-
def integrate_fmri(yin, y, t, B):
|
258
|
-
"""
|
259
|
-
Integrate Balloon model
|
260
|
-
|
261
|
-
Parameters
|
262
|
-
----------
|
263
|
-
yin : array [nn]
|
264
|
-
r and v time series, r is used as input
|
265
|
-
y : array [4*nn]
|
266
|
-
state, update in place
|
267
|
-
t : float
|
268
|
-
time
|
269
|
-
|
270
|
-
Returns
|
271
|
-
-------
|
272
|
-
yb : array [nn]
|
273
|
-
BOLD signal
|
274
|
-
|
275
|
-
"""
|
276
|
-
|
277
|
-
V0 = B.V0
|
278
|
-
K1 = B.K1
|
279
|
-
K2 = B.K2
|
280
|
-
K3 = B.K3
|
281
|
-
|
282
|
-
nn = yin.shape[0]
|
283
|
-
y = heun_ode_step(yin, y, t, B)
|
284
|
-
yb = V0 * (
|
285
|
-
K1 * (1.0 - y[(3 * nn) :])
|
286
|
-
+ K2 * (1.0 - y[(3 * nn) :] / y[(2 * nn) : (3 * nn)])
|
287
|
-
+ K3 * (1.0 - y[(2 * nn) : (3 * nn)])
|
288
|
-
)
|
289
|
-
return y, yb
|
290
|
-
|
291
|
-
|
292
|
-
@njit
|
293
|
-
def integrate(P, B, intg=heun_sde_step):
|
294
|
-
"""
|
295
|
-
integrate Wong-Wang model and Balloon model.
|
296
|
-
"""
|
297
|
-
t = np.arange(0, P.t_end, P.dt)
|
298
|
-
nt = len(t)
|
299
|
-
nn = P.nn
|
300
|
-
|
301
|
-
if P.RECORD_TS:
|
302
|
-
T = np.empty(int(np.ceil(nt / P.ts_decimate)))
|
303
|
-
S = np.empty((int(np.ceil(nt / P.ts_decimate)), nn))
|
304
|
-
else:
|
305
|
-
T = np.empty(0)
|
306
|
-
S = np.empty((0, 1))
|
307
|
-
|
308
|
-
if P.RECORD_FMRI:
|
309
|
-
t_fmri = np.empty(int(np.ceil(nt / P.fmri_decimate)))
|
310
|
-
d_fmri = np.empty((int(np.ceil(nt / P.fmri_decimate)), nn))
|
311
|
-
else:
|
312
|
-
t_fmri = np.empty(0)
|
313
|
-
d_fmri = np.empty((0, 1))
|
314
|
-
|
315
|
-
x0 = P.initial_state
|
316
|
-
y0 = np.zeros((4 * nn))
|
317
|
-
y0[nn:] = 1.0
|
318
|
-
|
319
|
-
jj = 0
|
320
|
-
ii = 0
|
321
|
-
for i in range(1, nt):
|
322
|
-
|
323
|
-
t = i * P.dt
|
324
|
-
t_bold = i * B.dt_bold
|
325
|
-
x0 = intg(x0, P)
|
326
|
-
|
327
|
-
if P.RECORD_TS:
|
328
|
-
if i % P.ts_decimate == 0:
|
329
|
-
S[ii, :] = x0
|
330
|
-
T[ii] = t
|
331
|
-
ii += 1
|
332
|
-
if P.RECORD_FMRI:
|
333
|
-
y0, fmri_i = integrate_fmri(x0, y0, t, B)
|
334
|
-
if i % P.fmri_decimate == 0:
|
335
|
-
d_fmri[jj, :] = fmri_i
|
336
|
-
# t_fmri[jj] = t[i]
|
337
|
-
t_fmri[jj] = t_bold
|
338
|
-
jj += 1
|
339
|
-
S = S[T >= P.t_cut, :]
|
340
|
-
T = T[T >= P.t_cut]
|
341
|
-
d_fmri = d_fmri[t_fmri >= P.t_cut, :]
|
342
|
-
t_fmri = t_fmri[t_fmri >= P.t_cut]
|
343
|
-
|
344
|
-
return T, S, t_fmri, d_fmri
|
345
|
-
|
346
|
-
|
347
|
-
class WW_sde(object):
|
348
|
-
r"""
|
349
|
-
Wong-Wang model.
|
350
|
-
|
351
|
-
.. math::
|
352
|
-
x_k &= w\,J_N \, S_k + I_o + G\,J_N \sum_j \, C_{kj} \,Sj \\
|
353
|
-
H(x_k) &= \dfrac{ax_k - b}{1 - \exp(-d(ax_k -b))}\\
|
354
|
-
\dot{S}_k &= -\dfrac{S_k}{\tau_s} + (1 - S_k) \, H(x_k) \, \gamma + \sigma \, \Xi_k
|
355
|
-
|
356
|
-
- Kong-Fatt Wong and Xiao-Jing Wang, A Recurrent Network Mechanism of Time Integration in Perceptual Decisions. Journal of Neuroscience 26(4), 1314-1328, 2006.
|
357
|
-
- Deco Gustavo, Ponce Alvarez Adrian, Dante Mantini, Gian Luca Romani, Patric Hagmann and Maurizio Corbetta. Resting-State Functional Connectivity Emerges from Structurally and Dynamically Shaped Slow Linear Fluctuations. The Journal of Neuroscience 32(27), 11239-11252, 2013. Equations taken from DPA 2013 , page 11242.
|
358
|
-
"""
|
359
|
-
|
360
|
-
def __init__(self, par: dict = {}, parB: dict = {}) -> None:
|
361
|
-
|
362
|
-
self.valid_parW = [w_spec[i][0] for i in range(len(w_spec))]
|
363
|
-
self.valid_parB = [b_spec[i][0] for i in range(len(b_spec))]
|
364
|
-
self.valid_par = self.valid_parW + self.valid_parB
|
365
|
-
|
366
|
-
self.check_parameters(par)
|
367
|
-
self.P = self.get_par_WW_obj(par)
|
368
|
-
self.B = self.get_par_Baloon_obj(parB)
|
369
|
-
|
370
|
-
def __str__(self):
|
371
|
-
print("Wong-Wang model of neural population dynamics")
|
372
|
-
print("Parameters:----------------------------")
|
373
|
-
for key in self.valid_parW:
|
374
|
-
print(key, ": ", getattr(self.P, key))
|
375
|
-
print("---------------------------------------")
|
376
|
-
for key in self.valid_parB:
|
377
|
-
print(key, ": ", getattr(self.B, key))
|
378
|
-
return ""
|
379
|
-
|
380
|
-
def get_par_WW_obj(self, par: dict = {}) -> ParWW:
|
381
|
-
"""
|
382
|
-
return default parameters for Wong-Wang model.
|
383
|
-
"""
|
384
|
-
if "initial_state" in par.keys():
|
385
|
-
par["initial_state"] = np.array(par["initial_state"])
|
386
|
-
if "weights" in par.keys():
|
387
|
-
assert par["weights"] is not None
|
388
|
-
par["weights"] = np.array(par["weights"])
|
389
|
-
assert par["weights"].shape[0] == par["weights"].shape[1]
|
390
|
-
parobj = ParWW(**par)
|
391
|
-
|
392
|
-
return parobj
|
393
|
-
|
394
|
-
def get_par_Baloon_obj(self, par: dict = {}) -> ParBaloon:
|
395
|
-
"""
|
396
|
-
return default parameters for Balloon model.
|
397
|
-
"""
|
398
|
-
parobj = ParBaloon(**par)
|
399
|
-
return parobj
|
400
|
-
|
401
|
-
def check_parameters(self, par: dict) -> None:
|
402
|
-
for key in par.keys():
|
403
|
-
if key not in self.valid_par:
|
404
|
-
raise ValueError(f"Invalid parameter {key}")
|
405
|
-
|
406
|
-
def set_initial_state(self, seed=None):
|
407
|
-
if seed is not None:
|
408
|
-
np.random.seed(seed)
|
409
|
-
self.P.nn = self.P.weights.shape[0]
|
410
|
-
self.initial_state = np.random.rand(self.P.nn)
|
411
|
-
self.B.nn = self.P.nn
|
412
|
-
|
413
|
-
def check_input(self):
|
414
|
-
|
415
|
-
assert self.P.weights is not None
|
416
|
-
assert self.P.weights.shape[0] == self.P.weights.shape[1]
|
417
|
-
assert self.P.initial_state is not None
|
418
|
-
assert len(self.P.initial_state) == self.P.weights.shape[0]
|
419
|
-
self.B.nn = self.P.nn
|
420
|
-
# self.B.dt = self.P.dt
|
421
|
-
|
422
|
-
def run(self, par={}, parB={}, x0=None, verbose=True):
|
423
|
-
|
424
|
-
if x0 is None:
|
425
|
-
self.seed = self.P.seed if self.P.seed > 0 else None
|
426
|
-
self.set_initial_state(self.seed)
|
427
|
-
self.P.initial_state = self.initial_state
|
428
|
-
else:
|
429
|
-
self.P.initial_state = x0
|
430
|
-
self.P.nn = len(x0)
|
431
|
-
|
432
|
-
if par:
|
433
|
-
self.check_parameters(par)
|
434
|
-
for key in par.keys():
|
435
|
-
setattr(self.P, key, par[key])
|
436
|
-
if parB:
|
437
|
-
self.check_parameters(parB)
|
438
|
-
for key in parB.keys():
|
439
|
-
setattr(self.B, key, parB[key])
|
440
|
-
self.check_input()
|
441
|
-
|
442
|
-
T, S, t_fmri, d_fmri = integrate(self.P, self.B)
|
443
|
-
|
444
|
-
return {"t": T, "s": S, "t_fmri": t_fmri, "d_fmri": d_fmri}
|
File without changes
|
File without changes
|