vbi 0.1.3__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/__init__.py +37 -0
- vbi/_version.py +17 -0
- vbi/dataset/__init__.py +0 -0
- vbi/dataset/connectivity_84/centers.txt +84 -0
- vbi/dataset/connectivity_84/centres.txt +84 -0
- vbi/dataset/connectivity_84/cortical.txt +84 -0
- vbi/dataset/connectivity_84/tract_lengths.txt +84 -0
- vbi/dataset/connectivity_84/weights.txt +84 -0
- vbi/dataset/connectivity_88/Aud_88.txt +88 -0
- vbi/dataset/connectivity_88/Bold.npz +0 -0
- vbi/dataset/connectivity_88/Labels.txt +17 -0
- vbi/dataset/connectivity_88/Region_labels.txt +88 -0
- vbi/dataset/connectivity_88/tract_lengths.txt +88 -0
- vbi/dataset/connectivity_88/weights.txt +88 -0
- vbi/feature_extraction/__init__.py +1 -0
- vbi/feature_extraction/calc_features.py +293 -0
- vbi/feature_extraction/features.json +535 -0
- vbi/feature_extraction/features.py +2124 -0
- vbi/feature_extraction/features_settings.py +374 -0
- vbi/feature_extraction/features_utils.py +1357 -0
- vbi/feature_extraction/infodynamics.jar +0 -0
- vbi/feature_extraction/utility.py +507 -0
- vbi/inference.py +98 -0
- vbi/models/__init__.py +0 -0
- vbi/models/cpp/__init__.py +0 -0
- vbi/models/cpp/_src/__init__.py +0 -0
- vbi/models/cpp/_src/__pycache__/mpr_sde.cpython-310.pyc +0 -0
- 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/bold.hpp +303 -0
- vbi/models/cpp/_src/do.hpp +167 -0
- vbi/models/cpp/_src/do.i +17 -0
- vbi/models/cpp/_src/do.py +467 -0
- vbi/models/cpp/_src/do_wrap.cxx +12811 -0
- vbi/models/cpp/_src/jr_sdde.hpp +352 -0
- vbi/models/cpp/_src/jr_sdde.i +19 -0
- vbi/models/cpp/_src/jr_sdde.py +688 -0
- vbi/models/cpp/_src/jr_sdde_wrap.cxx +18718 -0
- vbi/models/cpp/_src/jr_sde.hpp +264 -0
- vbi/models/cpp/_src/jr_sde.i +17 -0
- vbi/models/cpp/_src/jr_sde.py +470 -0
- vbi/models/cpp/_src/jr_sde_wrap.cxx +13406 -0
- vbi/models/cpp/_src/km_sde.hpp +158 -0
- vbi/models/cpp/_src/km_sde.i +19 -0
- vbi/models/cpp/_src/km_sde.py +671 -0
- vbi/models/cpp/_src/km_sde_wrap.cxx +17367 -0
- vbi/models/cpp/_src/makefile +52 -0
- vbi/models/cpp/_src/mpr_sde.hpp +327 -0
- vbi/models/cpp/_src/mpr_sde.i +19 -0
- vbi/models/cpp/_src/mpr_sde.py +711 -0
- vbi/models/cpp/_src/mpr_sde_wrap.cxx +18618 -0
- vbi/models/cpp/_src/utility.hpp +307 -0
- vbi/models/cpp/_src/vep.hpp +171 -0
- vbi/models/cpp/_src/vep.i +16 -0
- vbi/models/cpp/_src/vep.py +464 -0
- vbi/models/cpp/_src/vep_wrap.cxx +12968 -0
- vbi/models/cpp/_src/wc_ode.hpp +294 -0
- vbi/models/cpp/_src/wc_ode.i +19 -0
- vbi/models/cpp/_src/wc_ode.py +686 -0
- vbi/models/cpp/_src/wc_ode_wrap.cxx +24263 -0
- vbi/models/cpp/damp_oscillator.py +143 -0
- vbi/models/cpp/jansen_rit.py +543 -0
- vbi/models/cpp/km.py +187 -0
- vbi/models/cpp/mpr.py +289 -0
- vbi/models/cpp/vep.py +150 -0
- vbi/models/cpp/wc.py +216 -0
- vbi/models/cupy/__init__.py +0 -0
- vbi/models/cupy/bold.py +111 -0
- vbi/models/cupy/ghb.py +284 -0
- vbi/models/cupy/jansen_rit.py +473 -0
- vbi/models/cupy/km.py +224 -0
- vbi/models/cupy/mpr.py +475 -0
- vbi/models/cupy/mpr_modified_bold.py +12 -0
- vbi/models/cupy/utils.py +184 -0
- vbi/models/numba/__init__.py +0 -0
- vbi/models/numba/_ww_EI.py +444 -0
- vbi/models/numba/damp_oscillator.py +162 -0
- vbi/models/numba/ghb.py +208 -0
- vbi/models/numba/mpr.py +383 -0
- vbi/models/pytorch/__init__.py +0 -0
- vbi/models/pytorch/data/default_parameters.npz +0 -0
- vbi/models/pytorch/data/input/ROI_sim.mat +0 -0
- vbi/models/pytorch/data/input/fc_test.csv +68 -0
- vbi/models/pytorch/data/input/fc_train.csv +68 -0
- vbi/models/pytorch/data/input/fc_vali.csv +68 -0
- vbi/models/pytorch/data/input/fcd_test.mat +0 -0
- vbi/models/pytorch/data/input/fcd_test_high_window.mat +0 -0
- vbi/models/pytorch/data/input/fcd_test_low_window.mat +0 -0
- vbi/models/pytorch/data/input/fcd_train.mat +0 -0
- vbi/models/pytorch/data/input/fcd_vali.mat +0 -0
- vbi/models/pytorch/data/input/myelin.csv +68 -0
- vbi/models/pytorch/data/input/rsfc_gradient.csv +68 -0
- vbi/models/pytorch/data/input/run_label_testset.mat +0 -0
- vbi/models/pytorch/data/input/sc_test.csv +68 -0
- vbi/models/pytorch/data/input/sc_train.csv +68 -0
- vbi/models/pytorch/data/input/sc_vali.csv +68 -0
- vbi/models/pytorch/data/obs_kong0.npz +0 -0
- vbi/models/pytorch/ww_sde_kong.py +570 -0
- vbi/models/tvbk/__init__.py +9 -0
- vbi/models/tvbk/tvbk_wrapper.py +166 -0
- vbi/models/tvbk/utils.py +72 -0
- vbi/papers/__init__.py +0 -0
- vbi/papers/pavlides_pcb_2015/pavlides.py +211 -0
- vbi/tests/__init__.py +0 -0
- vbi/tests/_test_mpr_nb.py +36 -0
- vbi/tests/test_features.py +355 -0
- vbi/tests/test_ghb_cupy.py +90 -0
- vbi/tests/test_mpr_cupy.py +49 -0
- vbi/tests/test_mpr_numba.py +84 -0
- vbi/tests/test_suite.py +19 -0
- vbi/utils.py +402 -0
- vbi-0.1.3.dist-info/METADATA +166 -0
- vbi-0.1.3.dist-info/RECORD +121 -0
- vbi-0.1.3.dist-info/WHEEL +5 -0
- vbi-0.1.3.dist-info/licenses/LICENSE +201 -0
- vbi-0.1.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,303 @@
|
|
1
|
+
#ifndef BOLD_HPP
|
2
|
+
#define BOLD_HPP
|
3
|
+
|
4
|
+
#include <vector>
|
5
|
+
#include <string>
|
6
|
+
#include <random>
|
7
|
+
#include <fstream>
|
8
|
+
#include <assert.h>
|
9
|
+
#include <iostream>
|
10
|
+
#include "utility.hpp"
|
11
|
+
|
12
|
+
typedef std::vector<double> dim1;
|
13
|
+
typedef std::vector<dim1> dim2;
|
14
|
+
typedef std::vector<float> dim1f;
|
15
|
+
typedef std::vector<dim1f> dim2f;
|
16
|
+
|
17
|
+
using std::string;
|
18
|
+
using std::vector;
|
19
|
+
|
20
|
+
class BOLD_2D
|
21
|
+
{
|
22
|
+
private:
|
23
|
+
size_t N;
|
24
|
+
double dt_b;
|
25
|
+
double PAR_rho;
|
26
|
+
double PAR_e;
|
27
|
+
double PAR_taus;
|
28
|
+
double PAR_tauf;
|
29
|
+
double PAR_k1;
|
30
|
+
double PAR_eps;
|
31
|
+
double inv_taus;
|
32
|
+
double inv_tauf;
|
33
|
+
std::string integration_method;
|
34
|
+
|
35
|
+
public:
|
36
|
+
BOLD_2D(
|
37
|
+
size_t N,
|
38
|
+
double dt,
|
39
|
+
std::string integration_method = "heunDeterministic",
|
40
|
+
double rho = 0.8,
|
41
|
+
double e = 0.02,
|
42
|
+
double taus = 0.8,
|
43
|
+
double tauf = 0.4,
|
44
|
+
double k1 = 5.6,
|
45
|
+
double eps = 0.5) : N(N),
|
46
|
+
dt_b(dt),
|
47
|
+
PAR_e(e),
|
48
|
+
PAR_k1(k1),
|
49
|
+
PAR_eps(eps),
|
50
|
+
PAR_rho(rho),
|
51
|
+
PAR_taus(taus),
|
52
|
+
PAR_tauf(tauf)
|
53
|
+
|
54
|
+
{
|
55
|
+
assert(N != 0);
|
56
|
+
inv_taus = 1.0 / PAR_taus;
|
57
|
+
inv_tauf = 1.0 / PAR_tauf;
|
58
|
+
|
59
|
+
this->integration_method = integration_method;
|
60
|
+
}
|
61
|
+
// ------------------------------------------------------------------------
|
62
|
+
dim1 bold_derivate(const dim1 &x,
|
63
|
+
dim1 &dxdt,
|
64
|
+
const double t,
|
65
|
+
const dim1 &vec_in,
|
66
|
+
const size_t index)
|
67
|
+
{
|
68
|
+
|
69
|
+
for (size_t i = 0; i < N; ++i)
|
70
|
+
{
|
71
|
+
dxdt[i] = vec_in[i + index] * PAR_eps - inv_taus * x[i] - inv_tauf * (x[i + N] - 1.0);
|
72
|
+
dxdt[i + N] = x[i];
|
73
|
+
}
|
74
|
+
return dxdt;
|
75
|
+
}
|
76
|
+
// ------------------------------------------------------------------------
|
77
|
+
void eulerDeterministic(dim1 &y0,
|
78
|
+
const double t,
|
79
|
+
const dim1 &vec_in,
|
80
|
+
const size_t num_nodes,
|
81
|
+
const size_t index)
|
82
|
+
{
|
83
|
+
size_t n = y0.size();
|
84
|
+
dim1 dydt(n);
|
85
|
+
bold_derivate(y0, dydt, t, vec_in, index);
|
86
|
+
|
87
|
+
for (size_t i = 0; i < n; ++i)
|
88
|
+
y0[i] += dydt[i] * dt_b;
|
89
|
+
}
|
90
|
+
// ------------------------------------------------------------------------
|
91
|
+
void heunDeterministic(dim1 &y0,
|
92
|
+
const double t,
|
93
|
+
const dim1 &vec_in,
|
94
|
+
const size_t num_nodes,
|
95
|
+
const size_t index)
|
96
|
+
{
|
97
|
+
size_t n = y0.size();
|
98
|
+
dim1 k1(n);
|
99
|
+
dim1 k2(n);
|
100
|
+
dim1 tmp(n);
|
101
|
+
|
102
|
+
bold_derivate(y0, k1, t, vec_in, index);
|
103
|
+
for (size_t i = 0; i < n; ++i)
|
104
|
+
tmp[i] = y0[i] + dt_b * k1[i];
|
105
|
+
bold_derivate(tmp, k2, t + dt_b, vec_in, index);
|
106
|
+
for (size_t i = 0; i < n; ++i)
|
107
|
+
y0[i] += 0.5 * dt_b * (k1[i] + k2[i]);
|
108
|
+
}
|
109
|
+
// ------------------------------------------------------------------------
|
110
|
+
dim1 integrate(dim1 &y0,
|
111
|
+
const double t,
|
112
|
+
const dim1 &vec_in,
|
113
|
+
const size_t num_nodes,
|
114
|
+
const std::string component)
|
115
|
+
{
|
116
|
+
size_t index = (component == "v") ? num_nodes : 0;
|
117
|
+
|
118
|
+
dim1 out(N);
|
119
|
+
|
120
|
+
if (integration_method == "eulerDeterministic")
|
121
|
+
eulerDeterministic(y0, t, vec_in, num_nodes, index);
|
122
|
+
|
123
|
+
else if (integration_method == "heunDeterministic")
|
124
|
+
heunDeterministic(y0, t, vec_in, num_nodes, index);
|
125
|
+
|
126
|
+
else
|
127
|
+
{
|
128
|
+
printf("unknow integration method; \n");
|
129
|
+
exit(EXIT_FAILURE);
|
130
|
+
}
|
131
|
+
|
132
|
+
double coef = (100.0 / PAR_rho) * PAR_e * PAR_k1;
|
133
|
+
|
134
|
+
for (size_t i = 0; i < N; ++i)
|
135
|
+
out[i] = coef * (y0[i + N] - 1.0);
|
136
|
+
|
137
|
+
return out;
|
138
|
+
}
|
139
|
+
};
|
140
|
+
|
141
|
+
class BOLD_4D
|
142
|
+
{
|
143
|
+
|
144
|
+
private:
|
145
|
+
size_t N;
|
146
|
+
double dt_b;
|
147
|
+
double PAR_alpha;
|
148
|
+
double PAR_tauo;
|
149
|
+
double PAR_taus;
|
150
|
+
double PAR_tauf;
|
151
|
+
double PAR_k1;
|
152
|
+
double PAR_k2;
|
153
|
+
double PAR_k3;
|
154
|
+
double PAR_E0;
|
155
|
+
double PAR_V0;
|
156
|
+
double PAR_TE;
|
157
|
+
double PAR_eps;
|
158
|
+
double PAR_nu0;
|
159
|
+
double PAR_r0;
|
160
|
+
std::string integration_method;
|
161
|
+
|
162
|
+
double inv_taus;
|
163
|
+
double inv_tauf;
|
164
|
+
double inv_tauo;
|
165
|
+
double inv_alpha;
|
166
|
+
|
167
|
+
public:
|
168
|
+
BOLD_4D(
|
169
|
+
size_t N,
|
170
|
+
double dt,
|
171
|
+
std::string integration_method = "heunDeterministic",
|
172
|
+
double alpha = 0.32,
|
173
|
+
double tauo = 0.98,
|
174
|
+
double taus = 1.54,
|
175
|
+
double tauf = 1.44,
|
176
|
+
double E0 = 0.4,
|
177
|
+
double V0 = 4.0,
|
178
|
+
double TE = 0.04,
|
179
|
+
double nu0 = 40.3,
|
180
|
+
double r0 = 25.0,
|
181
|
+
double eps = 0.5,
|
182
|
+
size_t RBM = 1) : N(N),
|
183
|
+
dt_b(dt),
|
184
|
+
PAR_alpha(alpha),
|
185
|
+
PAR_tauo(tauo),
|
186
|
+
PAR_taus(taus),
|
187
|
+
PAR_tauf(tauf),
|
188
|
+
PAR_E0(E0),
|
189
|
+
PAR_V0(V0),
|
190
|
+
PAR_TE(TE),
|
191
|
+
PAR_nu0(nu0),
|
192
|
+
PAR_r0(r0),
|
193
|
+
PAR_eps(eps)
|
194
|
+
{
|
195
|
+
|
196
|
+
assert(N != 0);
|
197
|
+
inv_taus = 1.0 / PAR_taus;
|
198
|
+
inv_tauf = 1.0 / PAR_tauf;
|
199
|
+
inv_tauo = 1.0 / PAR_tauo;
|
200
|
+
inv_alpha = 1.0 / PAR_alpha;
|
201
|
+
this->integration_method = integration_method;
|
202
|
+
if (RBM == 1)
|
203
|
+
{
|
204
|
+
PAR_k1 = 7.0 * PAR_E0;
|
205
|
+
PAR_k2 = 2.0 * PAR_E0;
|
206
|
+
PAR_k3 = 1.0 - PAR_eps;
|
207
|
+
}
|
208
|
+
else // TODO
|
209
|
+
{
|
210
|
+
printf("not implemented!");
|
211
|
+
exit(EXIT_FAILURE);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
// // ------------------------------------------------------------------------
|
215
|
+
dim1 bold_derivate(const dim1 &x,
|
216
|
+
dim1 &dxdt,
|
217
|
+
const double t,
|
218
|
+
const dim1 &vec_in,
|
219
|
+
const size_t index)
|
220
|
+
{
|
221
|
+
size_t n2 = 2 * N;
|
222
|
+
size_t n3 = 3 * N;
|
223
|
+
double PAR_E1 = 1.0 - PAR_E0;
|
224
|
+
for (size_t i = 0; i < N; ++i)
|
225
|
+
{
|
226
|
+
dxdt[i] = vec_in[i + index] - inv_taus * x[i] - inv_tauf * (x[i + N] - 1.0);
|
227
|
+
dxdt[i + N] = x[i];
|
228
|
+
dxdt[i + n2] = inv_tauo * (x[i + N] - pow(x[i + n2], inv_alpha));
|
229
|
+
dxdt[i + n3] = inv_tauo * ((x[i + N] * (1. - pow(PAR_E1, (1.0 / x[i + N]))) / PAR_E0) -
|
230
|
+
(pow(x[i + n2], inv_alpha)) * (x[i + n3] / x[i + n2]));
|
231
|
+
}
|
232
|
+
return dxdt;
|
233
|
+
}
|
234
|
+
// // ------------------------------------------------------------------------
|
235
|
+
void eulerDeterministic(dim1 &y0,
|
236
|
+
const double t,
|
237
|
+
const dim1 &vec_in,
|
238
|
+
const size_t num_nodes,
|
239
|
+
const size_t index)
|
240
|
+
{
|
241
|
+
size_t n = y0.size();
|
242
|
+
dim1 dydt(n);
|
243
|
+
bold_derivate(y0, dydt, t, vec_in, index);
|
244
|
+
|
245
|
+
for (size_t i = 0; i < n; ++i)
|
246
|
+
y0[i] += dydt[i] * dt_b;
|
247
|
+
}
|
248
|
+
// ------------------------------------------------------------------------
|
249
|
+
void heunDeterministic(dim1 &y0,
|
250
|
+
const double t,
|
251
|
+
const dim1 &vec_in,
|
252
|
+
const size_t num_nodes,
|
253
|
+
const size_t index)
|
254
|
+
{
|
255
|
+
size_t n = y0.size();
|
256
|
+
dim1 k1(n);
|
257
|
+
dim1 k2(n);
|
258
|
+
dim1 tmp(n);
|
259
|
+
|
260
|
+
bold_derivate(y0, k1, t, vec_in, index);
|
261
|
+
for (size_t i = 0; i < n; ++i)
|
262
|
+
tmp[i] = y0[i] + dt_b * k1[i];
|
263
|
+
bold_derivate(tmp, k2, t + dt_b, vec_in, index);
|
264
|
+
for (size_t i = 0; i < n; ++i)
|
265
|
+
y0[i] += 0.5 * dt_b * (k1[i] + k2[i]);
|
266
|
+
}
|
267
|
+
// // ------------------------------------------------------------------------
|
268
|
+
dim1 integrate(dim1 &y0,
|
269
|
+
const double t,
|
270
|
+
const dim1 &vec_in,
|
271
|
+
const size_t num_nodes,
|
272
|
+
const std::string component)
|
273
|
+
{
|
274
|
+
size_t index = (component == "v") ? num_nodes : 0;
|
275
|
+
size_t n2 = 2 * N;
|
276
|
+
size_t n3 = 3 * N;
|
277
|
+
|
278
|
+
dim1 out(N);
|
279
|
+
if (integration_method == "eulerDeterministic")
|
280
|
+
eulerDeterministic(y0, t, vec_in, num_nodes, index);
|
281
|
+
|
282
|
+
else if (integration_method == "heunDeterministic")
|
283
|
+
heunDeterministic(y0, t, vec_in, num_nodes, index);
|
284
|
+
|
285
|
+
else
|
286
|
+
{
|
287
|
+
printf("unknown integration method.\n");
|
288
|
+
exit(EXIT_FAILURE);
|
289
|
+
}
|
290
|
+
|
291
|
+
// nonlinear
|
292
|
+
for (size_t i = 0; i < N; ++i)
|
293
|
+
out[i] = PAR_V0 * (PAR_k1 * (1.0 - y0[i + n3]) + PAR_k2 * (1.0 - (y0[i + n3] / y0[i + n2])) + PAR_k3 * (1.0 - y0[i + n2]));
|
294
|
+
|
295
|
+
// // linear
|
296
|
+
// // for (size_t i = 0; i < N; ++i)
|
297
|
+
// // out[i] = PAR_V0 * ((PAR_k1 + PAR_k2) * (1.0 - y0[i + n3]) + (PAR_k3 - PAR_k2) * (1.0 - y0[i + n2]));
|
298
|
+
|
299
|
+
return out;
|
300
|
+
}
|
301
|
+
};
|
302
|
+
|
303
|
+
#endif
|
@@ -0,0 +1,167 @@
|
|
1
|
+
#include <vector>
|
2
|
+
#include <string>
|
3
|
+
#include <assert.h>
|
4
|
+
#include <iostream>
|
5
|
+
|
6
|
+
using std::string;
|
7
|
+
using std::vector;
|
8
|
+
|
9
|
+
typedef std::vector<double> dim1;
|
10
|
+
typedef std::vector<dim1> dim2;
|
11
|
+
|
12
|
+
class DO
|
13
|
+
{
|
14
|
+
private:
|
15
|
+
double dt;
|
16
|
+
double PAR_a;
|
17
|
+
double PAR_b;
|
18
|
+
|
19
|
+
size_t dimension;
|
20
|
+
size_t num_steps;
|
21
|
+
double t_final;
|
22
|
+
double t_initial;
|
23
|
+
|
24
|
+
dim1 times;
|
25
|
+
dim2 states;
|
26
|
+
dim1 initial_state;
|
27
|
+
|
28
|
+
public:
|
29
|
+
DO(double dt, // time step
|
30
|
+
double a, // parameter
|
31
|
+
double b,
|
32
|
+
double t_initial,
|
33
|
+
double t_final, // simulation time
|
34
|
+
dim1 y // state vector
|
35
|
+
) : dt(dt), PAR_a(a), PAR_b(b)
|
36
|
+
{
|
37
|
+
assert(t_final >= t_initial);
|
38
|
+
this->t_final = t_final;
|
39
|
+
this->t_initial = t_initial;
|
40
|
+
initial_state = y;
|
41
|
+
|
42
|
+
dimension = y.size();
|
43
|
+
num_steps = int((t_final - t_initial) / dt);
|
44
|
+
|
45
|
+
states.resize(num_steps);
|
46
|
+
for (size_t i = 0; i < num_steps; ++i)
|
47
|
+
states[i].resize(dimension);
|
48
|
+
times.resize(num_steps);
|
49
|
+
}
|
50
|
+
|
51
|
+
void derivative(const vector<double> &x,
|
52
|
+
vector<double> &dxdt,
|
53
|
+
const double t)
|
54
|
+
{
|
55
|
+
dxdt[0] = x[0] - x[0] * x[1] - PAR_a * x[0] * x[0];
|
56
|
+
dxdt[1] = x[0] * x[1] - x[1] - PAR_b * x[1] * x[1];
|
57
|
+
}
|
58
|
+
|
59
|
+
void eulerIntegrate()
|
60
|
+
{
|
61
|
+
size_t n = dimension;
|
62
|
+
dim1 dxdt(n);
|
63
|
+
states[0] = initial_state;
|
64
|
+
times[0] = t_initial;
|
65
|
+
dim1 y = initial_state;
|
66
|
+
|
67
|
+
for (int step = 1; step < num_steps; ++step)
|
68
|
+
{
|
69
|
+
double t = step * dt;
|
70
|
+
euler(y, t);
|
71
|
+
|
72
|
+
states[step] = y;
|
73
|
+
times[step] = t_initial + t;
|
74
|
+
}
|
75
|
+
}
|
76
|
+
|
77
|
+
void euler(dim1& y, const double t)
|
78
|
+
{
|
79
|
+
size_t n = y.size();
|
80
|
+
dim1 dydt(n);
|
81
|
+
derivative(y, dydt, t);
|
82
|
+
for (size_t i = 0; i < n; ++i)
|
83
|
+
y[i] += dydt[i] * dt;
|
84
|
+
}
|
85
|
+
|
86
|
+
// void heunIntegrate()
|
87
|
+
// {
|
88
|
+
// size_t n = dimension;
|
89
|
+
// dim1 dxdt(n), dydt(n), f(n);
|
90
|
+
// states[0] = initial_state;
|
91
|
+
// times[0] = t_initial;
|
92
|
+
// dim1 y = initial_state;
|
93
|
+
|
94
|
+
// for (int step = 1; step < num_steps; ++step)
|
95
|
+
// {
|
96
|
+
// double t = step * dt;
|
97
|
+
// heun(y, t);
|
98
|
+
|
99
|
+
// states[step] = y;
|
100
|
+
// times[step] = t_initial + t;
|
101
|
+
// }
|
102
|
+
// }
|
103
|
+
|
104
|
+
// void heun(dim1& y, const double t)
|
105
|
+
// {
|
106
|
+
// size_t n = y.size();
|
107
|
+
// dim1 dydt(n), f(n);
|
108
|
+
// derivative(y, dydt, t);
|
109
|
+
// for (size_t i = 0; i < n; ++i)
|
110
|
+
// f[i] = y[i] + dydt[i] * dt;
|
111
|
+
|
112
|
+
// derivative(f, dydt, t + dt);
|
113
|
+
// for (size_t i = 0; i < n; ++i)
|
114
|
+
// y[i] += 0.5 * (dydt[i] + dydt[i]) * dt;
|
115
|
+
// }
|
116
|
+
|
117
|
+
void rk4Integrate()
|
118
|
+
{
|
119
|
+
size_t n = dimension;
|
120
|
+
|
121
|
+
states[0] = initial_state;
|
122
|
+
times[0] = t_initial;
|
123
|
+
dim1 y = initial_state;
|
124
|
+
|
125
|
+
for (int step = 1; step < num_steps; ++step)
|
126
|
+
{
|
127
|
+
double t = step * dt;
|
128
|
+
rk4(y, t);
|
129
|
+
states[step] = y;
|
130
|
+
times[step] = t_initial + t;
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
void rk4(dim1&y, const double t)
|
135
|
+
{
|
136
|
+
|
137
|
+
size_t n = y.size();
|
138
|
+
dim1 k1(n), k2(n), k3(n), k4(n);
|
139
|
+
dim1 f(n);
|
140
|
+
double c_dt = 1.0 / 6.0 * dt;
|
141
|
+
|
142
|
+
derivative(y, k1, t);
|
143
|
+
for (int i = 0; i < n; i++)
|
144
|
+
f[i] = y[i] + 0.5 * dt * k1[i];
|
145
|
+
|
146
|
+
derivative(f, k2, t);
|
147
|
+
for (int i = 0; i < n; i++)
|
148
|
+
f[i] = y[i] + 0.5 * dt * k2[i];
|
149
|
+
|
150
|
+
derivative(f, k3, dt);
|
151
|
+
for (int i = 0; i < n; i++)
|
152
|
+
f[i] = y[i] + dt * k3[i];
|
153
|
+
|
154
|
+
derivative(f, k4, t);
|
155
|
+
for (int i = 0; i < n; i++)
|
156
|
+
y[i] += (k1[i] + 2.0 * (k2[i] + k3[i]) + k4[i]) * c_dt;
|
157
|
+
}
|
158
|
+
|
159
|
+
dim2 get_coordinates()
|
160
|
+
{
|
161
|
+
return states;
|
162
|
+
}
|
163
|
+
dim1 get_times()
|
164
|
+
{
|
165
|
+
return times;
|
166
|
+
}
|
167
|
+
};
|
vbi/models/cpp/_src/do.i
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
|
2
|
+
%module do
|
3
|
+
|
4
|
+
%{
|
5
|
+
#include "do.hpp"
|
6
|
+
%}
|
7
|
+
|
8
|
+
%include stl.i
|
9
|
+
%include "std_string.i"
|
10
|
+
/* instantiate the required template specializations */
|
11
|
+
namespace std {
|
12
|
+
%template(IntVector) vector<int>;
|
13
|
+
%template(DoubleVector) vector<double>;
|
14
|
+
%template(DoubleVector2) vector<vector<double> >;
|
15
|
+
}
|
16
|
+
|
17
|
+
%include "do.hpp"
|