jinns 0.5.0__tar.gz → 0.5.1__tar.gz
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.
- jinns-0.5.1/Notebooks/ODE/1D_Generalized_Lotka_Volterra.ipynb +761 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/ODE/1D_Generalized_Lotka_Volterra_seq2seq.ipynb +3 -3
- jinns-0.5.1/Notebooks/ODE/systems_biology_informed_neural_network.ipynb +1258 -0
- jinns-0.5.1/Notebooks/PDE/imperfect_modeling_sobolev_reg.ipynb +1053 -0
- jinns-0.5.1/Notebooks/Tutorials/implementing_your_own_PDE_problem.ipynb +714 -0
- {jinns-0.5.0 → jinns-0.5.1}/PKG-INFO +2 -4
- {jinns-0.5.0 → jinns-0.5.1}/README.md +1 -3
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/index.rst +7 -1
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/_DynamicLoss.py +26 -22
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/_DynamicLossAbstract.py +17 -10
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/_LossODE.py +8 -14
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/_LossPDE.py +64 -64
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/_boundary_conditions.py +17 -17
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/_operators.py +26 -29
- {jinns-0.5.0 → jinns-0.5.1}/jinns/solver/_solve.py +10 -5
- {jinns-0.5.0 → jinns-0.5.1}/jinns/utils/__init__.py +0 -1
- {jinns-0.5.0 → jinns-0.5.1}/jinns/utils/_pinn.py +21 -31
- {jinns-0.5.0 → jinns-0.5.1}/jinns/utils/_spinn.py +9 -8
- jinns-0.5.1/jinns/utils/_utils.py +157 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns.egg-info/PKG-INFO +2 -4
- {jinns-0.5.0 → jinns-0.5.1}/jinns.egg-info/SOURCES.txt +1 -1
- jinns-0.5.1/tests/solver_tests/test_imperfect_sobolev_x32.py +158 -0
- jinns-0.5.0/Notebooks/ODE/1D_Generalized_Lotka_Volterra.ipynb +0 -707
- jinns-0.5.0/Notebooks/ODE/systems_biology_informed_neural_network.ipynb +0 -1143
- jinns-0.5.0/Notebooks/PDE/imperfect_modeling_sobolev_reg.ipynb +0 -1060
- jinns-0.5.0/Notebooks/Tutorials/implementing_your_own_ODE_problem.ipynb +0 -59
- jinns-0.5.0/Notebooks/Tutorials/implementing_your_own_PDE_problem.ipynb +0 -716
- jinns-0.5.0/jinns/utils/_utils.py +0 -268
- {jinns-0.5.0 → jinns-0.5.1}/.gitignore +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/.gitlab-ci.yml +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/.pre-commit-config.yaml +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/LICENSE +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/1D_non_stationary_Burger.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/1D_non_stationary_Burger_JointEstimation_Vanilla.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/1D_non_stationary_Fisher_KPP_Bounded_Domain.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/1D_non_stationary_OU.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/2D_Navier_Stokes_PipeFlow.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_Metamodel.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_SoftConstraints.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/2D_non_stationary_OU.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/2d_nonstatio_ou_standardsampling.png +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/OU_1D_nonstatio_solution_grid.npy +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/Reaction_Diffusion_2D_heterogenous_model.ipynb +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/Notebooks/PDE/burger_solution_grid.npy +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/Makefile +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/PinnSolver.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/boundary_conditions.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/conf.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/data.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/dynamic_loss.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/fokker_planck.qmd +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/loss.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/loss_ode.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/loss_pde.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/math_pinn.qmd +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/operators.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/param_estim_pinn.qmd +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/rar.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/seq2seq.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/solver.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/doc/source/utils.rst +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/__init__.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/data/_DataGenerators.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/data/__init__.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/data/_display.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/loss/__init__.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/solver/__init__.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/solver/_rar.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns/solver/_seq2seq.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns.egg-info/dependency_links.txt +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns.egg-info/requires.txt +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/jinns.egg-info/top_level.txt +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/pyproject.toml +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/setup.cfg +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/conftest.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/dataGenerator_tests/test_CubicMeshPDENonStatio.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/dataGenerator_tests/test_CubicMeshPDEStatio.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/dataGenerator_tests/test_DataGeneratorODE.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/runtests.sh +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_Burger_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_Burger_x64.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_Fisher_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_Fisher_x64.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_GLV_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_GLV_x64.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_NSPipeFlow_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_NSPipeFlow_x64.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests/test_OU2D_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests_spinn/test_Burger_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests_spinn/test_Fisher_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests_spinn/test_NSPipeFlow_x32_spinn.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests_spinn/test_OU2D_x32.py +0 -0
- {jinns-0.5.0 → jinns-0.5.1}/tests/solver_tests_spinn/test_ReactionDiffusion_nonhomo_x64.py +0 -0
|
@@ -0,0 +1,761 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "markdown",
|
|
5
|
+
"id": "40925fec",
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"source": [
|
|
8
|
+
"# Generalized Lotka Volterra"
|
|
9
|
+
]
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"cell_type": "markdown",
|
|
13
|
+
"id": "b825efcb",
|
|
14
|
+
"metadata": {},
|
|
15
|
+
"source": [
|
|
16
|
+
"We consider a Generalized Lotka Volterra system with $3$ populations\n",
|
|
17
|
+
"$$\n",
|
|
18
|
+
"\\frac{\\partial}{\\partial t}u_i(t) = r_iu_i(t) - \\sum_{j\\neq i}\\alpha_{ij}u_j(t)\n",
|
|
19
|
+
"-\\alpha_{i,i}u_i(t) + c_iu_i(t) + \\sum_{j \\neq i} c_ju_j(t), i\\in\\{1, 2, 3\\}\n",
|
|
20
|
+
"$$"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"cell_type": "markdown",
|
|
25
|
+
"id": "f337b94d",
|
|
26
|
+
"metadata": {},
|
|
27
|
+
"source": [
|
|
28
|
+
"More information on this ODE system can be found at [https://stefanoallesina.github.io/Sao_Paulo_School/intro.html#basic-formulation](https://stefanoallesina.github.io/Sao_Paulo_School/intro.html#basic-formulation)"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"cell_type": "code",
|
|
33
|
+
"execution_count": 1,
|
|
34
|
+
"id": "8bf8bebc-b311-4eb4-ad63-11447f62b280",
|
|
35
|
+
"metadata": {},
|
|
36
|
+
"outputs": [],
|
|
37
|
+
"source": [
|
|
38
|
+
"%load_ext autoreload\n",
|
|
39
|
+
"%autoreload 2\n",
|
|
40
|
+
"%matplotlib inline"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"cell_type": "markdown",
|
|
45
|
+
"id": "ddee93b7",
|
|
46
|
+
"metadata": {},
|
|
47
|
+
"source": [
|
|
48
|
+
"Float64 and GPU settings"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"cell_type": "code",
|
|
53
|
+
"execution_count": 2,
|
|
54
|
+
"id": "5cdc87e2",
|
|
55
|
+
"metadata": {},
|
|
56
|
+
"outputs": [],
|
|
57
|
+
"source": [
|
|
58
|
+
"#import os; os.environ[\"JAX_ENABLE_X64\"] = \"TRUE\" # comment/uncomment to disable/enable float64 for JAX\n",
|
|
59
|
+
"#import os; os.environ[\"CUDA_VISIBLE_DEVICES\"]=\"\" # If uncommented then GPU is disable"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"cell_type": "markdown",
|
|
64
|
+
"id": "e42b1b48",
|
|
65
|
+
"metadata": {},
|
|
66
|
+
"source": [
|
|
67
|
+
"Import our package"
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"cell_type": "code",
|
|
72
|
+
"execution_count": 3,
|
|
73
|
+
"id": "fbdd16f7",
|
|
74
|
+
"metadata": {
|
|
75
|
+
"scrolled": true
|
|
76
|
+
},
|
|
77
|
+
"outputs": [],
|
|
78
|
+
"source": [
|
|
79
|
+
"import jinns"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"cell_type": "markdown",
|
|
84
|
+
"id": "09955058",
|
|
85
|
+
"metadata": {},
|
|
86
|
+
"source": [
|
|
87
|
+
"Import other dependencies"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"cell_type": "code",
|
|
92
|
+
"execution_count": 4,
|
|
93
|
+
"id": "3abe5254-7556-424e-a57e-d364d67244a1",
|
|
94
|
+
"metadata": {},
|
|
95
|
+
"outputs": [],
|
|
96
|
+
"source": [
|
|
97
|
+
"import jax\n",
|
|
98
|
+
"from jax import random, vmap\n",
|
|
99
|
+
"import jax.numpy as jnp\n",
|
|
100
|
+
"import equinox as eqx\n",
|
|
101
|
+
"\n",
|
|
102
|
+
"import matplotlib.pyplot as plt\n",
|
|
103
|
+
"\n",
|
|
104
|
+
"key = random.PRNGKey(2)\n",
|
|
105
|
+
"key, subkey = random.split(key)"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"cell_type": "markdown",
|
|
110
|
+
"id": "2bfbd766",
|
|
111
|
+
"metadata": {},
|
|
112
|
+
"source": [
|
|
113
|
+
"Create the neural network architecture for the PINN with `equinox`. Note that we will use the same architecture for the 3 populations."
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"cell_type": "code",
|
|
118
|
+
"execution_count": 5,
|
|
119
|
+
"id": "9396d007-04f1-4893-a3c8-c58c36845ee0",
|
|
120
|
+
"metadata": {},
|
|
121
|
+
"outputs": [],
|
|
122
|
+
"source": [
|
|
123
|
+
"eqx_list = [\n",
|
|
124
|
+
" [eqx.nn.Linear, 1, 20],\n",
|
|
125
|
+
" [jax.nn.tanh],\n",
|
|
126
|
+
" [eqx.nn.Linear, 20, 20],\n",
|
|
127
|
+
" [jax.nn.tanh],\n",
|
|
128
|
+
" [eqx.nn.Linear, 20, 20],\n",
|
|
129
|
+
" [jax.nn.tanh],\n",
|
|
130
|
+
" [eqx.nn.Linear, 20, 1],\n",
|
|
131
|
+
" [jnp.exp]\n",
|
|
132
|
+
"]\n",
|
|
133
|
+
"key, subkey = random.split(key)\n",
|
|
134
|
+
"u = jinns.utils.create_PINN(subkey, eqx_list, \"ODE\")"
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"cell_type": "code",
|
|
139
|
+
"execution_count": 6,
|
|
140
|
+
"id": "1e47cbca-3af2-4ab2-a379-4b763c383843",
|
|
141
|
+
"metadata": {},
|
|
142
|
+
"outputs": [],
|
|
143
|
+
"source": [
|
|
144
|
+
"init_nn_params = u.init_params()"
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"cell_type": "markdown",
|
|
149
|
+
"id": "0a5d567b",
|
|
150
|
+
"metadata": {},
|
|
151
|
+
"source": [
|
|
152
|
+
"Create a DataGenerator object"
|
|
153
|
+
]
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"cell_type": "code",
|
|
157
|
+
"execution_count": 7,
|
|
158
|
+
"id": "15088440",
|
|
159
|
+
"metadata": {},
|
|
160
|
+
"outputs": [],
|
|
161
|
+
"source": [
|
|
162
|
+
"n = 320\n",
|
|
163
|
+
"batch_size = 32\n",
|
|
164
|
+
"method = 'uniform'\n",
|
|
165
|
+
"tmin = 0\n",
|
|
166
|
+
"tmax = 1\n",
|
|
167
|
+
"\n",
|
|
168
|
+
"Tmax = 30\n",
|
|
169
|
+
"key, subkey = random.split(key)\n",
|
|
170
|
+
"train_data = jinns.data.DataGeneratorODE(\n",
|
|
171
|
+
" subkey,\n",
|
|
172
|
+
" n,\n",
|
|
173
|
+
" tmin,\n",
|
|
174
|
+
" tmax,\n",
|
|
175
|
+
" batch_size, \n",
|
|
176
|
+
" method=method\n",
|
|
177
|
+
")"
|
|
178
|
+
]
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"cell_type": "markdown",
|
|
182
|
+
"id": "4f1ac783",
|
|
183
|
+
"metadata": {},
|
|
184
|
+
"source": [
|
|
185
|
+
"Initialize 3 set of neural network parameters for the 3 populations"
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"cell_type": "code",
|
|
190
|
+
"execution_count": 8,
|
|
191
|
+
"id": "4fec8c54",
|
|
192
|
+
"metadata": {},
|
|
193
|
+
"outputs": [],
|
|
194
|
+
"source": [
|
|
195
|
+
"init_nn_params_list = []\n",
|
|
196
|
+
"for _ in range(3):\n",
|
|
197
|
+
" key, subkey = random.split(key)\n",
|
|
198
|
+
" u = jinns.utils.create_PINN(subkey, eqx_list, \"ODE\", 0)\n",
|
|
199
|
+
" init_nn_params = u.init_params()\n",
|
|
200
|
+
" init_nn_params_list.append(init_nn_params)"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"cell_type": "markdown",
|
|
205
|
+
"id": "e595cbcd",
|
|
206
|
+
"metadata": {},
|
|
207
|
+
"source": [
|
|
208
|
+
"Visualize the output of the neural networks before the parameter learning step"
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"cell_type": "code",
|
|
213
|
+
"execution_count": 9,
|
|
214
|
+
"id": "d18c73d2-ff23-4019-a7a1-40cc023dbf53",
|
|
215
|
+
"metadata": {},
|
|
216
|
+
"outputs": [
|
|
217
|
+
{
|
|
218
|
+
"data": {
|
|
219
|
+
"text/plain": [
|
|
220
|
+
"<matplotlib.legend.Legend at 0x7f16fc34c790>"
|
|
221
|
+
]
|
|
222
|
+
},
|
|
223
|
+
"execution_count": 9,
|
|
224
|
+
"metadata": {},
|
|
225
|
+
"output_type": "execute_result"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"data": {
|
|
229
|
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABA10lEQVR4nO3de3RU5aH//8/MJDNJyJ2EXEiAhEu4lIuiZGHVnmq+jdrytbSriwq/cmnV4tH2VGotWBSlq0b0lOKF1q5Wj56eXrCnar+nWnosFVoqQgWptVwkEAiXXICQmdwvM/v3x2R2MskkZAJhdpL3a6299syzn73z7OnY+fDsZz/bZhiGIQAAAAuzR7oBAAAAF0NgAQAAlkdgAQAAlkdgAQAAlkdgAQAAlkdgAQAAlkdgAQAAlkdgAQAAlhcV6QZcDj6fT2fOnFFCQoJsNlukmwMAAPrBMAzV1dUpOztbdnvffSjDIrCcOXNGubm5kW4GAAAYgJMnTyonJ6fPOsMisCQkJEjyn3BiYmKEWwMAAPrD4/EoNzfX/B3vS9iB5c9//rOeeuop7d27VxUVFXrttdf02c9+ts99tm/frlWrVumf//yncnNztXbtWi1fvtzc/uijj+qxxx4L2qegoECHDh3qV5sCl4ESExMJLAAADDH9Gc4R9qDbhoYGzZ49W5s3b+5X/bKyMn3605/WJz/5Se3fv1/f+MY3dOedd+oPf/hDUL0ZM2aooqLCXHbu3Blu0wAAwDAVdg/LrbfeqltvvbXf9Z9//nnl5eXp+9//viRp2rRp2rlzp37wgx+ouLi4syFRUcrMzAy3OQAAYAQY9Nuad+3apaKioqCy4uJi7dq1K6jsyJEjys7OVn5+vpYsWaLy8vJej9nS0iKPxxO0AACA4WvQB91WVlYqIyMjqCwjI0Mej0dNTU2KjY1VYWGhXnrpJRUUFKiiokKPPfaYbrjhBn344YchB+KUlJT0GPMCAIBVGIah9vZ2eb3eSDcl4hwOh6Kioi552hFL3CXU9RLTrFmzVFhYqPHjx+uVV17RV77ylR7116xZo1WrVpnvA6OMAQCItNbWVlVUVKixsTHSTbGMuLg4ZWVlyel0DvgYgx5YMjMzVVVVFVRWVVWlxMRExcbGhtwnOTlZU6ZMUWlpacjtLpdLLpfrsrcVAIBL4fP5VFZWJofDoezsbDmdzhE9oalhGGptbdXZs2dVVlamyZMnX3SCuN4MemCZP3++3nzzzaCyt956S/Pnz+91n/r6eh09elRf+tKXBrt5AABcNq2trfL5fMrNzVVcXFykm2MJsbGxio6O1okTJ9Ta2qqYmJgBHSfsmFNfX6/9+/dr//79kvy3Le/fv98cJLtmzRotXbrUrL9y5UodO3ZMDz74oA4dOqQf/vCHeuWVV3T//febdR544AHt2LFDx48f1zvvvKOFCxfK4XDojjvuGNBJAQAQSQPtRRiuLsfnEXYPy3vvvadPfvKT5vvAWJJly5bppZdeUkVFRdAdPnl5eXrjjTd0//336+mnn1ZOTo5++tOfBt3SfOrUKd1xxx06f/680tPTdf311+vdd99Venr6pZwbAAAYJmyGYRiRbsSl8ng8SkpKktvtZqZbAEDENDc3q6ysTHl5eQO+9DEc9fa5hPP7TZ8VAACwPAILAADQ8uXLZbPZ9MQTTwSVv/766+adTs3NzVq+fLlmzpypqKioiz5L8HIisFzE+l3r9aO//0g7Tu5QdWO1hsEVNAAAQoqJidGGDRt04cKFkNu9Xq9iY2P19a9/vccs9oPNEhPHWVVda51+/dGvg8pGx4zWtNHTNC11mqaPnq5po6cpe1T2iL7PHgDQO8Mw1NQWmRlvY6MdYf0+FRUVqbS0VCUlJXryySd7bB81apR+9KMfSZL++te/qra29nI19aIILBfx4LUP6uD5gzpYc1DH3Md0vvm8dp7eqZ2nO58mnehM1LTR0zQ9dboZZsYljpPdRgcWAIx0TW1eTX/kDxH52wfWFyvO2f+feofDoccff1yLFy/W17/+deXk5Axi68JDYOlDgjNBX5reOXldU3uTPrrwkRlgDp4/qCO1R+Rp9Wh3xW7trtht1o2LitPU1KlmL8y01GnKS8pTlJ2PHABgXQsXLtScOXO0bt06vfDCC5FujolfzzDERsVqdvpszU6fbZa1eltVWlsaFGIOXzisxvZG7avep33V+8y6MY4YTUmd0nk5KXWaJiVPUrQjOhKnAwC4AmKjHTqwvvjiFQfpbw/Ehg0bdNNNN+mBBx64zC0aOALLJXI6nJo+erqmj55ulrX72lXmLjMDzIHzB3So5pAa2xv1wdkP9MHZD8y6UfYoTU6ebAaYaaOnaUrKFMVEcf8+AAwHNpstrMsyVnDjjTequLhYa9as0fLlyyPdHEkElkERZY/S5JTJmpwyWf934v+VJPkMn8o95Z0hpuaADp4/KE+rx19Wc9Dc32FzKC8pLyjETE2dqlHRoyJ1SgCAEeaJJ57QnDlzVFBQEOmmSCKwXDF2m10TkiZoQtIE3Zp3qyT/yPHT9ad7hJia5hqV1paqtLZU/+/o/5Mk2WTT+MTxZoAJjItJciVF8rQAAMPUzJkztWTJEj3zzDNB5QcOHFBra6tqampUV1dnPltwzpw5g9oeAksE2Ww25STkKCchR/9n/P+R5A8x1Y3VPUJMVWOVjnuO67jnuH5//PfmMcbGj+0MMR3rtNi0SJ0SAGAYWb9+vbZs2RJUdtttt+nEiRPm+6uuukqSBn2eMp4lNEScbzqvQzWHdLDGPybm4PmDOlV/KmTdMbFjgnphpo+eroy4DOaKAYBBxrOEQrsczxKih2WIGB07Wh8f+3F9fOzHzTJ3i1uHaw53hpiagzruPq7qpmpVn6rWjlM7zLoprpSgXpjpqdOVk5BDiAEADAkEliEsyZWkeVnzNC9rnlnW2NaowxcOm70wB2sO6mjtUV1ouaB3zryjd868Y9ZNiE4ICjHTRk/T+ITxctgHdhscAACDhcAyzMRFx+mqMVfpqjFXmWXN7c0qrS01e2EOnj+ojy58pLq2Ou2p3KM9lXvMurFRsZqaOjVoXEx+cr6i7cwVAwCIHALLCBATFaOPpX1MH0v7mFnW5m3TMfexoBBz+MJhNbU36f3q9/V+9ftmXafdqSkpU8xemOmp0zUpZZJcDlckTgcAMAIRWEaoaEe0ClILVJBaoIVaKEny+rw67jkeFGIO1RxSfVu9Pjz/oT48/6G5f5QtShOTJwYN7J2SMkVx0XGROiUAwDBGYIHJYXdoYvJETUyeqAUTF0jyT3h3qu6UeXt1YFxMbUutDl84rMMXDut1vS6pc66YqalTVZBaoKmpUzU1dSq3WQMALhmBBX2y2+walzhO4xLH6ZYJt0jy32tf2VDZGWI6emPONp0154rZenyreYy02DQzvBSkFmha6jTlJuTyNGsAQL8RWBA2m82mrPgsZcVn6eZxN5vl55rO6XDNYR2qOWTebn3Cc0Lnms5p5+md2nl6p1k3NipWBSmdvTBTR0/VpGTGxQAAQiOw4LJJi01T2ti0oLliGtsa9dGFj/xB5sIhHTp/SEdqj6ipvUn7z+7X/rP7zbqBZyhNS51m9sQUpBbw+AEAAIEFgysuOk5zxszRnDFzzLJ2X7uOu4/r0IXOnphDNYfkbnGbz1D6n2P/Y9bPGpXV2RPTsWSNymLSOwC4jJYvX66XX35ZJSUlWr16tVn++uuva+HChTIMQ9u3b9cPfvAD7dmzRx6PR5MnT9a3vvUtLVmyZNDbR2DBFRdlj9KklEmalDJJn8n/jCT/uJiqxirz8QOBS0un60+roqFCFQ0Vevvk2+YxEp2JQWNiClILlJeUx3wxAHAJYmJitGHDBn31q19VSkpKj+3vvPOOZs2apW9/+9vKyMjQ7373Oy1dulRJSUn6zGc+M6ht41lCsDRPq8cML4GxMUdrj6rdaO9R12l3alLKpKCemCkpUzQqelQEWg5gJBrKzxJavny5zp8/r9LSUi1YsEBPPvmkpOAellA+/elPKyMjQy+++GKvx+ZZQhj2Ep2JujbzWl2bea1Z1upt1dHao2aIOVRzSIcvHFZDW4MOnD+gA+cPmHVtsik3IVcFqQWakjJFBSn+uWe4pATgijEMqa0xMn87Ok4K4//rHA6HHn/8cS1evFhf//rXlZOTc9F93G63pk2bdimt7BcCC4Ycp8Npzrob4DN8Ol132hwPc/jCYR06f0jVTdUqrytXeV253jrxllk/ITpBk1Mm+yfP6wgxE5MnKjYqNhKnBGA4a2uUHs+OzN9+6IzkDK+XeeHChZozZ47WrVunF154oc+6r7zyiv72t7/pxz/+8aW0sl8ILBgW7Da7chNzlZuYq09N+JRZfr7pvA5fOKyPaj7yry98pGO1x1TXVqd91fu0r3pf0DHGJYwzQ8yUlCkqSC1QRlwGvTEARpQNGzbopptu0gMPPNBrnbffflsrVqzQT37yE82YMWPQ20RgwbA2Ona0rou9TtdlX2eWBZ6j1D3I1DTXmBPf/eH4H8z6ic7EoEtKU1KnMGcMgP6LjvP3dETqbw/AjTfeqOLiYq1Zs0bLly/vsX3Hjh1asGCBfvCDH2jp0qWX2Mj+IbBgxOn6HCVN9JcZhqFzTef8c8ZcOKzDNf4QU+Yuk6fVo79V/k1/q/ybeQyHzaHxiePNABPokRkTN4beGADBbLawL8tYwRNPPKE5c+aooKAgqHz79u36zGc+ow0bNujuu+++Yu0hsADyz96bHpeu9Lj0oInvAgN8A70wgR6Z2pZaHXMf0zH3Mf3++O/N+smuZDPEBHpkJiZPlNPhjMRpAcCAzZw5U0uWLNEzzzxjlr399tv6zGc+o3/7t3/T5z//eVVWVkqSnE6nUlNTB7U9BBagD6EG+BqGoerGarM3JhBijnuOq7alVrsrd2t35W6zfpQtShOSJmhKij/ETE6ZrCkpUxgbA8Dy1q9fry1btpjvX375ZTU2NqqkpEQlJSVm+Sc+8Qlt3759UNvCPCzAZdLc3qyj7qNB42IO1xyWp9UTsn6CM0GTkydrcspkcz0pZZISnXyHgaFqKM/DMpiYhwWwkJioGM0YPUMzRneOlg/M4BsYE3PkwhEdqT2i4+7jqmvteaeSJGXEZfhDTEeQmZIyRXlJeVxWAjCiEViAQWSz2ZQ5KlOZozL1idxPmOWt3laVuct0pPaIP8R0BJnKhkpVNVapqrEq6OnWUbYojU8cHxRkJqdMVnZ8tuw2eyRODQCuKAILEAFOh7PzTqUuPK0elV4oNQNMIMzUtdXpqPuojrqPauvxrWb9uKg4TUqZZAaYKSlTNDl5spJjkq/wGQHA4CKwABaS6EzU1RlX6+qMq82ywGWl7iHmmPuYGtsb9cHZD/TB2Q+CjpMem65JyZM6e2RSJmti0kTFRHFNHcDQRGABLK7rZaUbcm4wy9t8bSr3lOvIhSP+8TEdYeZ0/WmdbTqrs01ntatil1nfbrMrJz5HE5MnalLyJHM9IWkCk+ABsDwCCzBERdujNTF5oiYmT9QtebeY5Y1tjSqt7XlZ6ULLBfO5Sm+ffNusH3gkQeBYgTCTl5inaEd0JE4NAHogsADDTFx0nGalz9Ks9FlmmWEYOt98Xkdrj6q0tlRHa4+arz2tHvORBNvKt5n7OGwOjUscZwaYickTNSlpksYnjVe0nSAD4MoisAAjgM1mU1psmtJi01SYVWiWBx5JEAgxXcNMXVudytxlKnOXBT3pOsoepQmJE3r0yIxLGKcoO/+XAmBw8P8uwAjW9ZEE87Pnm+WBgb7dQ8xR91E1tDWotLZUpbWlQceKtkdrQtIETUqaFBRkchNy5bA7rvSpARhmCCwAeug60Lfrs5UMw1BlQ2XPHhn3UTW1N5njZbqKtkdrfOJ45SflKz85379OymewL4CwEFgA9JvNZlNWfJay4rOC7ljyGT5VNFQEhZjS2lIdqz2mZm9zZ4/Mic5j2W12jY0fawaYvKQ8M9AkOBMicHbAyLZ8+XK9/PLLKikp0erVq83y119/XQsXLpRhGDp8+LBWrlypAwcOyO12Kzs7W4sXL9a6desUHT24Y9sILAAuWSB8jI0fqxtzbjTLfYZPZ+rP6Jj7mMrcZf4nXNf6n3LtafXoZN1Jnaw7qR2ndgQdLz02vUeIyU/KV1psGg+MBAZRTEyMNmzYoK9+9atKSUnpsT06OlpLly7V1VdfreTkZP3973/XXXfdJZ/Pp8cff3xQ20ZgATBo7Da7chJylJOQExRkAnctlbnLzAATCDPVTdXmPDJdn3otSQnRCcpLzjMDTGDJjs9mnAxwGRQVFam0tFQlJSV68skne2zPz89Xfn6++X78+PHavn27/vKXvwx62wgsAK64rnctXZt5bdC2uta6zt4Y9zGV1fpfn6o/pbq2upAz+7ocrs5xMkn5ykvOU15insYnjmd2X0ScYRhqam+KyN+OjYoNq1fS4XDo8ccf1+LFi/X1r39dOTk5fdYvLS3V1q1b9bnPfe5Sm3pRBBYAlpLgTOgxj4wktXhbdMJzIijEHHMf03H3cbV4W/TRhY/00YWPgvaxyaasUVmakDRBExInmOu8pDxlxGVweQlXRFN7kwp/UXjxioNg9+LdiouOC2ufhQsXas6cOVq3bp1eeOGFkHWuu+467du3Ty0tLbr77ru1fv36y9HcPhFYAAwJLodLU1KmaErKlKByr89rjpM55j6mo7VH/fPHeMpU11qnMw1ndKbhjN45807QfrFRsRqfOD4oyATWo6JHXclTAyxnw4YNuummm/TAAw+E3L5lyxbV1dXp73//u771rW/p3//93/Xggw8OapsILACGNIfdodzEXOUm5uoTuZ8wyw3DUE1zjX8WX/fxoPWpulNqam/SoZpDOlRzqMcxx8SO6RFiJiRNUPYoxsogfLFRsdq9ePfFKw7S3x6IG2+8UcXFxVqzZo2WL1/eY3tubq4kafr06fJ6vbr77rv1zW9+Uw7H4P33QWABMCzZbDaNjh2t0bGjNTdjbtC2Nl+bTtWd6gwyXcJMTXONqpuqVd1UrT2Ve4L2c9qdGpc4LmSvTJIr6UqeHoYQm80W9mUZK3jiiSc0Z84cFRQU9FnP5/Opra1NPp/PWoHlz3/+s5566int3btXFRUVeu211/TZz362z322b9+uVatW6Z///Kdyc3O1du3aHolt8+bNeuqpp1RZWanZs2fr2Wef1bx588JtHgBcVLQ9WnlJecpLyuuxzd3iDtkrc8JzQq2+1pCz/EpSiitF4xLHaXzieI1L6Fh3vOcSE4aimTNnasmSJXrmmWfMsp///OeKjo7WzJkz5XK59N5772nNmjVatGiR9eZhaWho0OzZs/XlL3+5X6OCy8rK9OlPf1orV67Uz3/+c23btk133nmnsrKyVFxcLMl/LWzVqlV6/vnnVVhYqE2bNqm4uFiHDx/WmDFjwj8rABigJFeSZqfP1uz02UHlXp9XZxrO9Agyx93HVd1UrQstF3Th7AX9/ezfexxzdMzooAATCDS5CblD8l/eGDnWr1+vLVu2mO+joqK0YcMGffTRRzIMQ+PHj9d9992n+++/f9DbYjMMwxjwzjbbRXtYvv3tb+uNN97Qhx9+aJZ98YtfVG1trbZu3SpJKiws1LXXXqvnnntOkr97KTc3V1/72teCZtvrjcfjUVJSktxutxITEwd6OgAwIA1tDSr3lOtE3Qn/2uNfl9eVq6a5ps99x8SOMYNMbkKuGWzGJYzjluwhqLm5WWVlZcrLy1NMDP/7BfT2uYTz+z3oY1h27dqloqKioLLi4mJ94xvfkCS1trZq7969WrNmjbndbrerqKhIu3btCnnMlpYWtbS0mO89Hs/lbzgA9NOo6FGaNnqapo2e1mObp9Wjk56TOuE5YQaaQLhxt7jN8TLvVb3XY9+MuIzOnpmEzh6anIQcnsOEEWfQA0tlZaUyMjKCyjIyMuTxeNTU1KQLFy7I6/WGrHPoUM/R+5JUUlKixx57bNDaDACXS6IzUTPSZmhG2owe29wtbn+Q8ZxQeV2XnhlPuera6lTVWKWqxqoeg38D88vkJuSaMwnnJuSaC89iwnA0JO8SWrNmjVatWmW+93g85i1WADBUJLmSQk6SZxiGLrRcMC8vBQJN4H1je6M5v0z3xxdIUrIr2QwzgRCTE+9/nR6XLrvNfqVOEbhsBj2wZGZmqqqqKqisqqpKiYmJio2NlcPhkMPhCFknMzMz5DFdLpdcLrpDAQxPNptNqTGpSo1J1Zwxc4K2BZ7DVO4pNx8eear+lH9dd0o1zTWqbalVbUut/nHuHz2O7XK4zPASFGgScjQ2fqycDucVOksgPIMeWObPn68333wzqOytt97S/PnzJUlOp1Nz587Vtm3bzMG7Pp9P27Zt03333TfYzQOAIaXrc5iuzri6x/b61nozwARCTOB1RUOFWrwtOuo+qqPuoz2PLZsyR2UGhRguNcEqwg4s9fX1Ki3tnIOgrKxM+/fvV2pqqsaNG6c1a9bo9OnT+s///E9J0sqVK/Xcc8/pwQcf1Je//GX96U9/0iuvvKI33njDPMaqVau0bNkyXXPNNZo3b542bdqkhoYGrVix4jKcIgCMHPHOeE1NnaqpqVN7bGvztamivqJnmKk/ac7+W9FQoYqGih7jZiT/JayceH9PjLkk+NfZ8dkMBO7iEm7AHZYux+cRdmB577339MlPftJ8HxhLsmzZMr300kuqqKhQeXm5uT0vL09vvPGG7r//fj399NPKycnRT3/6U3MOFklatGiRzp49q0ceeUSVlZWaM2eOtm7d2mMg7hXnbZM2zZRs9p6L3dHlvUOy2Xopt/u3hSzvqG+PkhzRkj1ackT53/d4Hd1RN/A6qst+3V937OtwSVEuyeGUomKkKGe3Mpe/Pg+AA0aEaHu0/5bpxHE9tgUuNQXCTPfemZrmGrlb3HK3uPXP8/8Mefz02PSgEJMTn6Ps+GyNjR+rzFGZirIPyWGTYQlMntbY2KjY2IFNiz8cNTY2StIlTS53SfOwWMWgzcPS1ix9L8KhadDZOgJMR5DpGmZ6rLvXiZGiY6ToOCk6VoqK9a+DlriOenHB5VGxkp2Bf8BQ0dDWoFN1p3Sq/pTO1J/R6frTOl13WqfqT+l0/Wk1tTf1ub/D5lDmqEwzwHRfhtNg4IqKCtXW1mrMmDGKi4sb0U8FNwxDjY2Nqq6uVnJysrKysoK2h/P7TWDpi88nVf1DMnz+xefrfG14u5R7JcPoY5uvY3uX8sA2X3vHus3fo+Nr9y/eto6yjvc9Xnev22Ud2O5tldpbpfZmydvif+1t8f9tK3C4egk3Ha/NMBQnOUdJzviOdR+vXfH+947BnSIaQCfDMFTbUqvT9R0Bpu60Ttef7gw29afV5mvr8xhOu9MMM2aoSfD30mSNylJqTOqQ+eE3DEOVlZWqra2NdFMsIzk5WZmZmT3+NySwoG/e9o4A09IRarquO8p73dbauW5v9i9tjVJbU5elsaO843Vblzrelou373JwOEMEm75CzyjJldixJPiXmC7vCUDAgPkMn842njXDS9flTP0ZVTZUymt4+zyGy+FS1qgs/xLvX2fHZ5tlGaMyFG231n+nXq9XbW19B7WRIDo6uteHIhJYYF0+b5cw0z3gdA8+TZ1lrfVSa0OXpb7b64733tbBaXdUbLcgk9BLwOmj3JngH1sEIEibr01VDVU9A01HT825pnMy1PdPlU02pcelK3tUthlqskdlB4UbHkJpPQQWjFztrVJbb8Gm2/uWuuDyljqpxdOxrpOaPdJFrsuHzRkvxSRLMUlSbMc66H0f26LjGCCNEanV26qqhipVNFToTMMZVdRXmK8rGypVUV+hVt/F/7GS4EwIDjHdAk1qTOqwGUczVBBYgMvF2xY6yJhl/Sy/HJfC7NEdIaYf4SYmSYpNkWJT/WtXAmEHw5bP8KmmuUYV9T0DTeC1p/Xiz5xz2p3KHJXZ2TvT0VOTOSpTmXGZyhiVodgo7vy5nAgsgNW0t3SEF7fUXCs11Xa+bnb3/b6p1j9g+1LYozoDTFxqlzCTHPw+aFuK5Iy7tL8LWERDW4PO1J/xzzMTItBUN1Zf9LKT5J+LJiMuQ5mjMkOuCTXhIbAAw4lh+C9b9SfcmO9r/eumGv/4oIGKiukML3EdASfofeD1aGlUmn8dk8wt6xhyAuNoAhPnBQYDn6k/o8rGSlU2VF701u2AJFeS2SNjrrsEmzFxYwg1HQgsADq1NkpNF/zhpemC1FjT+b6xpjPYmNs6XvvaB/b3bPaO3ppAiEmV4jrCTKiyUWn+W9kBCzMMw/8E7YYqVTZUqqox9Lq/oSbZldyzh6ZLwMmIy1BMVMwgn1XkEVgAXBrD8F/CCgo2FzqXrsGmsUZqPO9ft7gH9vei4zoDTdfempBlaf6eHnvo2ySBSAmEmsqGSn+waawMGXDCCTWBHpkxcWM0JnZM5+uOJdmVPGTmpwmFwAIgMtpb/UGm4VxHiOmymGXn/OEm8P4iE4qFZLN3hJh0f5AZNabL63Qpvtt7J7ezwhoMw5Cn1dOzh6ZLwAkn1ETbozUmbozSY9ODgkx6XLoy4jLM8rhoa45HI7AAGBoCPTndQ0xjl8DTcD64rHkAvTjRozrDy6h0KT6983X3JS6V3htEVCDUBAJNVWOVzjaeVXVjtbmcbTqrmuaafh8zPjo+KMgEQk5GXIbS4/yhZnTs6Cs++R6BBcDw5W3rCDbnpIaz/tf11Z2vG85KDdWd5eHeUt6j9ya9owcnLTjYxI/xL4y/QYS0elt1rulcUJCpbuoINB0BJ5zeGptsGh07OijIpMelKz22Y4lLV0FKgRyXMdATWABA6rjDqt4fYurPdoSZQLDpHnLO+nt5+nFraxBXYkd4yQhej+pWNiqdmY4REfWt9UFBJqjHpqP8XOM5tRt9D7S32+za+//tvaxP3Q7n95v/egAMXzZb5yMSUvMvXt/b3nEZ6mwvS5fenEDvTWCiwPOlF2uMv+cm0DMTFHC6hZzYFG4Nx2UT74xXvDNe+Um9/zfgM3y60HzBvNxU1VhlBpxAL47P8F3WsBIuelgAYCAMwx9U6qul+qqO5WzHumtZR8AJZ/I/e1RHeAkEmvTgYNP1tTOeWYwxZNHDAgCDzWbrfFRC2uS+6/p8/runuoaYHuuO1001/jlw6s74l4uJivUHl4RMf4hJyJISMqT4TP86Icv/Oi6VYIMhjcACAIPNbu8YtJsmZczou257a8clp0DvTKhw07Furfc/oLP2hH/psw3RHYEms0u4CbzO7Aw5o9K4SwqWRGABACuJckpJY/3LxbQ2dAaYusrOdV2lVF8p1VX514H5bjyn/EtfbI7Oy0599dqMGsMgYlxRfNsAYKhyjpJS8/xLX9pbOy9H1VVKdRXdQk6FP9wExtrUVfiXir4OavP3xsR39NKYgaZ7r02GFOW6nGeNEYrAAgDDXZRTSs71L33xtvtDS2+Bxuy1qfIHm8DdU1X/6Pu4sak9L0MlZHWsszu3RTkv3zlj2CGwAAD8HFFSYpZ/6YvP67/MFDLQVAZfnvK1dTx3qkaqPtD3cUelhw4zCR1tSsjyP0uKW75HJAILACA89sA4lzF91zMM/wMy6yp6jrEJlAVe+9o6e2wq++ixsUd1GVfTLcyYYSfLf/cWd0UNKwQWAMDgsNn8t1PHpfZ9d1Tgtu+6CslT0SXMVHRZKv0DjH3tkue0f+lLVKw/wCRmd+u16RZunNZ8KCB6IrAAACKr623fmTN7r+dtDx44XNct3ATCTnOt/3bvC2X+pS8xSX1fggqMr3Fc2YcCoicCCwBgaHBE9e+W77ambqGmUvKc6XY5qkJqa/Q//bvZLZ091McBbcHja4IuQXUJOXGjGV8ziAgsAIDhJTr24rd7Bx6t0L13pq6yY5bhruNr2jsellktVX7Q+zHt0V3uguoWZrpennIlMr5mAAgsAICRp+ujFdILeq/n83XcEdXLuJpAz03DWf/AYfdJ/9KX6FE9x9eYr7M7Aw/z1wQhsAAA0Bu7vePhk+lS1qze63nb/IOCextXE+i5aXZLbQ1SzVH/0pe40Z0BxrwM1S3cjKDLUAQWAAAulSO6f+NrWht7GVtzJvi9t8Xfs9N4vu+J+YIuQ2V1GWOT3e0yVMLlPd8IILAAAHClOOOk0RP9S2+6zl/jqegZZgLv66v7fxnKmdB3T00g9Fj4bigCCwAAVtLf+Wu6XobqraemrsI/uLi1TjpfJ50/0tcf9t9aHtRT0y3cjJkesad5E1gAABiK+nsZqqW+lzATeF8RYrbhUHdD2aSHzw3KqfQHgQUAgOHMFS+5Jklpk3qv02O24RDhxufzz4UTIQQWAABGuv7ONhxBI+NeKAAAMKQRWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOURWAAAgOUNKLBs3rxZEyZMUExMjAoLC7Vnz55e67a1tWn9+vWaOHGiYmJiNHv2bG3dujWozqOPPiqbzRa0TJ06dSBNAwAAw1DYgWXLli1atWqV1q1bp3379mn27NkqLi5WdXV1yPpr167Vj3/8Yz377LM6cOCAVq5cqYULF+r9998PqjdjxgxVVFSYy86dOwd2RgAAYNgJO7Bs3LhRd911l1asWKHp06fr+eefV1xcnF588cWQ9X/2s5/poYce0m233ab8/Hzdc889uu222/T9738/qF5UVJQyMzPNJS0tbWBnBAAAhp2wAktra6v27t2roqKizgPY7SoqKtKuXbtC7tPS0qKYmJigstjY2B49KEeOHFF2drby8/O1ZMkSlZeX99qOlpYWeTyeoAUAAAxfYQWWc+fOyev1KiMjI6g8IyNDlZWVIfcpLi7Wxo0bdeTIEfl8Pr311lt69dVXVVFRYdYpLCzUSy+9pK1bt+pHP/qRysrKdMMNN6iuri7kMUtKSpSUlGQuubm54ZwGAAAYYgb9LqGnn35akydP1tSpU+V0OnXfffdpxYoVsts7//Stt96qL3zhC5o1a5aKi4v15ptvqra2Vq+88krIY65Zs0Zut9tcTp48OdinAQAAIiiswJKWliaHw6Gqqqqg8qqqKmVmZobcJz09Xa+//roaGhp04sQJHTp0SPHx8crPz+/17yQnJ2vKlCkqLS0Nud3lcikxMTFoAQAAw1dYgcXpdGru3Lnatm2bWebz+bRt2zbNnz+/z31jYmI0duxYtbe36ze/+Y1uv/32XuvW19fr6NGjysrKCqd5AABgmAr7ktCqVav0k5/8RC+//LIOHjyoe+65Rw0NDVqxYoUkaenSpVqzZo1Zf/fu3Xr11Vd17Ngx/eUvf9Ett9win8+nBx980KzzwAMPaMeOHTp+/LjeeecdLVy4UA6HQ3fcccdlOEUAADDURYW7w6JFi3T27Fk98sgjqqys1Jw5c7R161ZzIG55eXnQ+JTm5matXbtWx44dU3x8vG677Tb97Gc/U3Jyslnn1KlTuuOOO3T+/Hmlp6fr+uuv17vvvqv09PRLP0MAADDk2QzDMCLdiEvl8XiUlJQkt9vNeBYAAIaIcH6/eZYQAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwPAILAACwvAEFls2bN2vChAmKiYlRYWGh9uzZ02vdtrY2rV+/XhMnTlRMTIxmz56trVu3XtIxAQDAyBJ2YNmyZYtWrVqldevWad++fZo9e7aKi4tVXV0dsv7atWv14x//WM8++6wOHDiglStXauHChXr//fcHfEwAADCy2AzDMMLZobCwUNdee62ee+45SZLP51Nubq6+9rWvafXq1T3qZ2dn6zvf+Y7uvfdes+zzn/+8YmNj9V//9V8DOmZ3Ho9HSUlJcrvdSkxMDOd0AABAhITz+x1WD0tra6v27t2roqKizgPY7SoqKtKuXbtC7tPS0qKYmJigstjYWO3cufOSjunxeIIWAAAwfIUVWM6dOyev16uMjIyg8oyMDFVWVobcp7i4WBs3btSRI0fk8/n01ltv6dVXX1VFRcWAj1lSUqKkpCRzyc3NDec0AADAEDPodwk9/fTTmjx5sqZOnSqn06n77rtPK1askN0+8D+9Zs0aud1uczl58uRlbDEAALCasFJDWlqaHA6HqqqqgsqrqqqUmZkZcp/09HS9/vrramho0IkTJ3To0CHFx8crPz9/wMd0uVxKTEwMWgAAwPAVVmBxOp2aO3eutm3bZpb5fD5t27ZN8+fP73PfmJgYjR07Vu3t7frNb36j22+//ZKPCQAARoaocHdYtWqVli1bpmuuuUbz5s3Tpk2b1NDQoBUrVkiSli5dqrFjx6qkpESStHv3bp0+fVpz5szR6dOn9eijj8rn8+nBBx/s9zEBAMDIFnZgWbRokc6ePatHHnlElZWVmjNnjrZu3WoOmi0vLw8an9Lc3Ky1a9fq2LFjio+P12233aaf/exnSk5O7vcxAQDAyBb2PCxWxDwsAAAMPYM2DwsAAEAkEFgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlEVgAAIDlDSiwbN68WRMmTFBMTIwKCwu1Z8+ePutv2rRJBQUFio2NVW5uru6//341Nzeb2x999FHZbLagZerUqQNpGgAAGIaiwt1hy5YtWrVqlZ5//nkVFhZq06ZNKi4u1uHDhzVmzJge9X/xi19o9erVevHFF3Xdddfpo48+0vLly2Wz2bRx40az3owZM/THP/6xs2FRYTcNAAAMU2H3sGzcuFF33XWXVqxYoenTp+v5559XXFycXnzxxZD133nnHX384x/X4sWLNWHCBH3qU5/SHXfc0aNXJioqSpmZmeaSlpY2sDMCAADDTliBpbW1VXv37lVRUVHnAex2FRUVadeuXSH3ue6667R3714zoBw7dkxvvvmmbrvttqB6R44cUXZ2tvLz87VkyRKVl5f32o6WlhZ5PJ6gBQAADF9hXXc5d+6cvF6vMjIygsozMjJ06NChkPssXrxY586d0/XXXy/DMNTe3q6VK1fqoYceMusUFhbqpZdeUkFBgSoqKvTYY4/phhtu0IcffqiEhIQexywpKdFjjz0WTtMBAMAQNuh3CW3fvl2PP/64fvjDH2rfvn169dVX9cYbb+i73/2uWefWW2/VF77wBc2aNUvFxcV68803VVtbq1deeSXkMdesWSO3220uJ0+eHOzTAAAAERRWD0taWpocDoeqqqqCyquqqpSZmRlyn4cfflhf+tKXdOedd0qSZs6cqYaGBt199936zne+I7u9Z2ZKTk7WlClTVFpaGvKYLpdLLpcrnKYDAIAhLKweFqfTqblz52rbtm1mmc/n07Zt2zR//vyQ+zQ2NvYIJQ6HQ5JkGEbIferr63X06FFlZWWF0zwAADBMhX3v8KpVq7Rs2TJdc801mjdvnjZt2qSGhgatWLFCkrR06VKNHTtWJSUlkqQFCxZo48aNuuqqq1RYWKjS0lI9/PDDWrBggRlcHnjgAS1YsEDjx4/XmTNntG7dOjkcDt1xxx2X8VQBAMBQFXZgWbRokc6ePatHHnlElZWVmjNnjrZu3WoOxC0vLw/qUVm7dq1sNpvWrl2r06dPKz09XQsWLND3vvc9s86pU6d0xx136Pz580pPT9f111+vd999V+np6ZfhFAEAwFBnM3q7LjOEeDweJSUlye12KzExMdLNAQAA/RDO7zfPEgIAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJZHYAEAAJY3oMCyefNmTZgwQTExMSosLNSePXv6rL9p0yYVFBQoNjZWubm5uv/++9Xc3HxJxwQAACNH2IFly5YtWrVqldatW6d9+/Zp9uzZKi4uVnV1dcj6v/jFL7R69WqtW7dOBw8e1AsvvKAtW7booYceGvAxAQDAyGIzDMMIZ4fCwkJde+21eu655yRJPp9Pubm5+trXvqbVq1f3qH/ffffp4MGD2rZtm1n2zW9+U7t379bOnTsHdMzuPB6PkpKS5Ha7lZiYGM7pAACACAnn9zusHpbW1lbt3btXRUVFnQew21VUVKRdu3aF3Oe6667T3r17zUs8x44d05tvvqnbbrttwMdsaWmRx+MJWgAAwPAVFU7lc+fOyev1KiMjI6g8IyNDhw4dCrnP4sWLde7cOV1//fUyDEPt7e1auXKleUloIMcsKSnRY489Fk7TAQDAEDbodwlt375djz/+uH74wx9q3759evXVV/XGG2/ou9/97oCPuWbNGrndbnM5efLkZWwxAACwmrB6WNLS0uRwOFRVVRVUXlVVpczMzJD7PPzww/rSl76kO++8U5I0c+ZMNTQ06O6779Z3vvOdAR3T5XLJ5XKF03QAADCEhdXD4nQ6NXfu3KABtD6fT9u2bdP8+fND7tPY2Ci7PfjPOBwOSZJhGAM6JgAAGFnC6mGRpFWrVmnZsmW65pprNG/ePG3atEkNDQ1asWKFJGnp0qUaO3asSkpKJEkLFizQxo0bddVVV6mwsFClpaV6+OGHtWDBAjO4XOyYAABgZAs7sCxatEhnz57VI488osrKSs2ZM0dbt241B82Wl5cH9aisXbtWNptNa9eu1enTp5Wenq4FCxboe9/7Xr+PCQAARraw52GxIuZhAQBg6Bm0eVgAAAAigcACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsj8ACAAAsLyrSDQAAAIPL5zPU0u5TS7tXzW0+Nbd51dz1dZv/tX+7V02tXjW3+8zy5javbDZp3YIZETsHAgsAAFdIIDg0t3kvuu5e1tKPfYLX/gDS0uZTq9d3yW13RtkJLAAAXElen2H+mDd3X3cNDR1BoblLYOj6vrNXoq91576XIzhcqii7Ta4ou2KiHYqJdsgVbVdsx+uYaLtiojrLY6IdHe/9dQzDkM1mi0y7I/JXAQAjkmEYavcZam33mZcoAq9bO963BL33/9i3en1mT4F/7Q1639Les06LN3jfrgGlzWtE+qNQlN3mDwYd4cEVZZfLfG+XqyMoXHTd7RgXW0c5hubwVQILAIwQ7d7gIBA6IHhD1gm1z0WDRoj9Wtt98kU+KwSJdtiCQoArKBSE/uHvPWj0bz2Ug0OkEFgAYJAFLj/09gPf2SvQvZega+9AiLJudYOCQY8eCZ+8VksK8ocFp8P/g+9f24PXHQGitzouR2dYcHYEAf+6e93eeykc9shc4kB4CCwAhi1vx6WHHgGhR3jo2ZMQqk73cv+2vnskWtqtGRSi7LYeP/Ahf/RD1HFdpI6zjzquLu+dUXbCAvqNwALgsvP5DP+/7ANBodu/9Hv0JPRSp6X7mIRQlxj6qNNuwaBgt6nLZYfeewPMHoRuP/KuKHuPur2Hh859u9chKGCoIbAAw4hhGGrzGiF6AXrvPei8LNH3j3/oHofQZVYY0NidzSbFhPhBd3brWejai9B3z0HfPRIx0XY5HY4elzgYtwAMDIEFuEzavd17CPo/oDFkqOjS+9C1rOedD52XJVraI3/LZHc2m7r0CvTsSQh5iaH7OIU+Ljv0HjSC60TZbRG7HRPApSOwYFjw+ozOyZW6zIEQmFOhX5cfehmn0L+gYc1xCv5Bi11+1EMNWuxnQOjPZQb/3wgOJ9EOggKAS0dgwWVjGEZnL0DX0NDuCxkmmts6g0LousEzPHafuKnrdquNVXB0TMzU/4GIwT/4rhDjGLr3PvTWy9B1nIOdcQoAhgkCyzATmJSp55TOnbM4dg8TLSECQnNb6LqhwkRzl9sprSDaYVNMl7kUzB/0Xi4/hBqHcLGgEehF6DpOIbCdcQoAcPkRWAZJ12mfQ/2497hsEaJu9zo9QkMvIcQKnQ2BAY7d5ztwdUz7bN79YIaIEHWjuk7KZA8KIb3V5e4HABieCCx9aGn36qmth0OGia49DS0hAoZV7pLovGOh5yyLMSHCQuDZEd3rhgoWXUNE9+MywBEAcDkRWC7ipzvLLvkYgQdNuaIdiun649/PEBHTpTciZO9DLz0ZjGEAAAwXBJY+OB12ffXG/L6DRbcQwvMiAAC4/AgsfbDZbFpz27RINwMAgBGPf/oDAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLI7AAAADLGxZPazYMQ5Lk8Xgi3BIAANBfgd/twO94X4ZFYKmrq5Mk5ebmRrglAAAgXHV1dUpKSuqzjs3oT6yxOJ/PpzNnzighIUE2m+2yHtvj8Sg3N1cnT55UYmLiZT32cMNn1X98VuHh8+o/Pqvw8Hn132B8VoZhqK6uTtnZ2bLb+x6lMix6WOx2u3Jycgb1byQmJvJl7ic+q/7jswoPn1f/8VmFh8+r/y73Z3WxnpUABt0CAADLI7AAAADLI7BchMvl0rp16+RyuSLdFMvjs+o/Pqvw8Hn1H59VePi8+i/Sn9WwGHQLAACGN3pYAACA5RFYAACA5RFYAACA5RFYAACA5RFY+rB582ZNmDBBMTExKiws1J49eyLdJEt69NFHZbPZgpapU6dGulmW8Oc//1kLFixQdna2bDabXn/99aDthmHokUceUVZWlmJjY1VUVKQjR45EprEWcLHPa/ny5T2+a7fccktkGhtBJSUluvbaa5WQkKAxY8bos5/9rA4fPhxUp7m5Wffee69Gjx6t+Ph4ff7zn1dVVVWEWhxZ/fm8/uVf/qXHd2vlypURanHk/OhHP9KsWbPMyeHmz5+v3//+9+b2SH6vCCy92LJli1atWqV169Zp3759mj17toqLi1VdXR3pplnSjBkzVFFRYS47d+6MdJMsoaGhQbNnz9bmzZtDbn/yySf1zDPP6Pnnn9fu3bs1atQoFRcXq7m5+Qq31Bou9nlJ0i233BL0XfvlL395BVtoDTt27NC9996rd999V2+99Zba2tr0qU99Sg0NDWad+++/X//zP/+jX//619qxY4fOnDmjz33ucxFsdeT05/OSpLvuuivou/Xkk09GqMWRk5OToyeeeEJ79+7Ve++9p5tuukm33367/vnPf0qK8PfKQEjz5s0z7r33XvO91+s1srOzjZKSkgi2yprWrVtnzJ49O9LNsDxJxmuvvWa+9/l8RmZmpvHUU0+ZZbW1tYbL5TJ++ctfRqCF1tL98zIMw1i2bJlx++23R6Q9VlZdXW1IMnbs2GEYhv97FB0dbfz617826xw8eNCQZOzatStSzbSM7p+XYRjGJz7xCePf/u3fItcoC0tJSTF++tOfRvx7RQ9LCK2trdq7d6+KiorMMrvdrqKiIu3atSuCLbOuI0eOKDs7W/n5+VqyZInKy8sj3STLKysrU2VlZdD3LCkpSYWFhXzP+rB9+3aNGTNGBQUFuueee3T+/PlINyni3G63JCk1NVWStHfvXrW1tQV9t6ZOnapx48bx3VLPzyvg5z//udLS0vSxj31Ma9asUWNjYySaZxler1e/+tWv1NDQoPnz50f8ezUsHn54uZ07d05er1cZGRlB5RkZGTp06FCEWmVdhYWFeumll1RQUKCKigo99thjuuGGG/Thhx8qISEh0s2zrMrKSkkK+T0LbEOwW265RZ/73OeUl5eno0eP6qGHHtKtt96qXbt2yeFwRLp5EeHz+fSNb3xDH//4x/Wxj31Mkv+75XQ6lZycHFSX71boz0uSFi9erPHjxys7O1sffPCBvv3tb+vw4cN69dVXI9jayPjHP/6h+fPnq7m5WfHx8Xrttdc0ffp07d+/P6LfKwILLtmtt95qvp41a5YKCws1fvx4vfLKK/rKV74SwZZhuPniF79ovp45c6ZmzZqliRMnavv27br55psj2LLIuffee/Xhhx8ybqyfevu87r77bvP1zJkzlZWVpZtvvllHjx7VxIkTr3QzI6qgoED79++X2+3Wf//3f2vZsmXasWNHpJvFoNtQ0tLS5HA4eox8rqqqUmZmZoRaNXQkJydrypQpKi0tjXRTLC3wXeJ7NnD5+flKS0sbsd+1++67T7/73e/09ttvKycnxyzPzMxUa2uramtrg+qP9O9Wb59XKIWFhZI0Ir9bTqdTkyZN0ty5c1VSUqLZs2fr6aefjvj3isASgtPp1Ny5c7Vt2zazzOfzadu2bZo/f34EWzY01NfX6+jRo8rKyop0UywtLy9PmZmZQd8zj8ej3bt38z3rp1OnTun8+fMj7rtmGIbuu+8+vfbaa/rTn/6kvLy8oO1z585VdHR00Hfr8OHDKi8vH5HfrYt9XqHs379fkkbcdysUn8+nlpaWyH+vBn1Y7xD1q1/9ynC5XMZLL71kHDhwwLj77ruN5ORko7KyMtJNs5xvfvObxvbt242ysjLjr3/9q1FUVGSkpaUZ1dXVkW5axNXV1Rnvv/++8f777xuSjI0bNxrvv/++ceLECcMwDOOJJ54wkpOTjd/+9rfGBx98YNx+++1GXl6e0dTUFOGWR0Zfn1ddXZ3xwAMPGLt27TLKysqMP/7xj8bVV19tTJ482Whubo5006+oe+65x0hKSjK2b99uVFRUmEtjY6NZZ+XKlca4ceOMP/3pT8Z7771nzJ8/35g/f34EWx05F/u8SktLjfXr1xvvvfeeUVZWZvz2t7818vPzjRtvvDHCLb/yVq9ebezYscMoKyszPvjgA2P16tWGzWYz/vd//9cwjMh+rwgsfXj22WeNcePGGU6n05g3b57x7rvvRrpJlrRo0SIjKyvLcDqdxtixY41FixYZpaWlkW6WJbz99tuGpB7LsmXLDMPw39r88MMPGxkZGYbL5TJuvvlm4/Dhw5FtdAT19Xk1NjYan/rUp4z09HQjOjraGD9+vHHXXXeNyH9EhPqMJBn/8R//YdZpamoy/vVf/9VISUkx4uLijIULFxoVFRWRa3QEXezzKi8vN2688UYjNTXVcLlcxqRJk4xvfetbhtvtjmzDI+DLX/6yMX78eMPpdBrp6enGzTffbIYVw4js98pmGIYx+P04AAAAA8cYFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHkEFgAAYHn/P9UaUMLzDZZRAAAAAElFTkSuQmCC",
|
|
230
|
+
"text/plain": [
|
|
231
|
+
"<Figure size 640x480 with 1 Axes>"
|
|
232
|
+
]
|
|
233
|
+
},
|
|
234
|
+
"metadata": {},
|
|
235
|
+
"output_type": "display_data"
|
|
236
|
+
}
|
|
237
|
+
],
|
|
238
|
+
"source": [
|
|
239
|
+
"vectorized_u_init = vmap(lambda t: u(t, init_nn_params_list[0]), (0), 0)\n",
|
|
240
|
+
"vectorized_v_init = vmap(lambda t: u(t, init_nn_params_list[1]), (0), 0)\n",
|
|
241
|
+
"vectorized_w_init = vmap(lambda t: u(t, init_nn_params_list[2]), (0), 0)\n",
|
|
242
|
+
"\n",
|
|
243
|
+
"\n",
|
|
244
|
+
"plt.plot(train_data.times.sort(axis=0) * Tmax, vectorized_u_init(train_data.times.sort(axis=0)), label=\"N1\")\n",
|
|
245
|
+
"plt.plot(train_data.times.sort(axis=0) * Tmax, vectorized_v_init(train_data.times.sort(axis=0)), label=\"N2\")\n",
|
|
246
|
+
"plt.plot(train_data.times.sort(axis=0) * Tmax, vectorized_w_init(train_data.times.sort(axis=0)), label=\"N3\")\n",
|
|
247
|
+
"\n",
|
|
248
|
+
"plt.legend()"
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"cell_type": "markdown",
|
|
253
|
+
"id": "f0701671",
|
|
254
|
+
"metadata": {},
|
|
255
|
+
"source": [
|
|
256
|
+
"## Model parameters"
|
|
257
|
+
]
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"cell_type": "code",
|
|
261
|
+
"execution_count": 10,
|
|
262
|
+
"id": "8c609f60",
|
|
263
|
+
"metadata": {},
|
|
264
|
+
"outputs": [],
|
|
265
|
+
"source": [
|
|
266
|
+
"# initial conditions for each species\n",
|
|
267
|
+
"N_0 = jnp.array([10., 7., 4.])\n",
|
|
268
|
+
"# growth rates for each species\n",
|
|
269
|
+
"growth_rates = jnp.array([0.1, 0.5, 0.8])\n",
|
|
270
|
+
"# carrying capacity for each species\n",
|
|
271
|
+
"carrying_capacities = jnp.array([0.04, 0.02, 0.02])\n",
|
|
272
|
+
"# interactions\n",
|
|
273
|
+
"# NOTE that for the interaction between the species **with itself** is always at position 0\n",
|
|
274
|
+
"# NOTE minus sign \n",
|
|
275
|
+
"interactions = -jnp.array([[0, 0.001, 0.001], [0, 0.001, 0.001], [0, 0.001, 0.001]])"
|
|
276
|
+
]
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"cell_type": "markdown",
|
|
280
|
+
"id": "bbe7f24b",
|
|
281
|
+
"metadata": {},
|
|
282
|
+
"source": [
|
|
283
|
+
"## Loss construction"
|
|
284
|
+
]
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"cell_type": "markdown",
|
|
288
|
+
"id": "33e3c866",
|
|
289
|
+
"metadata": {},
|
|
290
|
+
"source": [
|
|
291
|
+
"A set of parameters as required by the losses' `evaluate` functions is a dictionary with the neural network parameters `nn_params` and the equation parameters `eq_params`. Here we construct this dictionary.\n",
|
|
292
|
+
"\n",
|
|
293
|
+
"__Note__ that `nn_params` and `eq_params` must always be top level keys but can be nested dictionaries.\n",
|
|
294
|
+
"\n",
|
|
295
|
+
"__Note__ that the keys of the sub dictionaries `nn_params` and `eq_params` (here `str(i)`) can differ !"
|
|
296
|
+
]
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"cell_type": "code",
|
|
300
|
+
"execution_count": 11,
|
|
301
|
+
"id": "11d93e85",
|
|
302
|
+
"metadata": {},
|
|
303
|
+
"outputs": [],
|
|
304
|
+
"source": [
|
|
305
|
+
"# initiate parameters dictionary\n",
|
|
306
|
+
"init_params = {}\n",
|
|
307
|
+
"\n",
|
|
308
|
+
"init_params[\"nn_params\"] = {\n",
|
|
309
|
+
" str(i): init_nn_params_list[i]\n",
|
|
310
|
+
" for i in range(3)\n",
|
|
311
|
+
"}\n",
|
|
312
|
+
"\n",
|
|
313
|
+
"init_params[\"eq_params\"] = {\n",
|
|
314
|
+
" str(i):{\n",
|
|
315
|
+
" \"carrying_capacity\": carrying_capacities[i],\n",
|
|
316
|
+
" \"growth_rate\": growth_rates[i],\n",
|
|
317
|
+
" \"interactions\": interactions[i, :]\n",
|
|
318
|
+
" }\n",
|
|
319
|
+
" for i in range(3)\n",
|
|
320
|
+
"}"
|
|
321
|
+
]
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"cell_type": "markdown",
|
|
325
|
+
"id": "aa14a602-1b0e-4582-876e-99d0322c57a0",
|
|
326
|
+
"metadata": {},
|
|
327
|
+
"source": [
|
|
328
|
+
"We construct a SystemLossODE with GeneralizedLotkaVolterra losses for each population. Here `key_main` refer to the key in `params[\"nn_params\"]` which are the parameters for the main PINN of the equation (the PINN which represents the solution differentiated with respect to the `t`). `key_others` refer to the keys in `params[\"nn_params\"]` which are the parameters for the PINNs which interact with `key_main`."
|
|
329
|
+
]
|
|
330
|
+
},
|
|
331
|
+
{
|
|
332
|
+
"cell_type": "code",
|
|
333
|
+
"execution_count": 12,
|
|
334
|
+
"id": "b6a65062",
|
|
335
|
+
"metadata": {},
|
|
336
|
+
"outputs": [],
|
|
337
|
+
"source": [
|
|
338
|
+
"N1_dynamic_loss = jinns.loss.GeneralizedLotkaVolterra(key_main=\"0\", keys_other=[\"1\", \"2\"], Tmax=Tmax)\n",
|
|
339
|
+
"N2_dynamic_loss = jinns.loss.GeneralizedLotkaVolterra(key_main=\"1\", keys_other=[\"0\", \"2\"], Tmax=Tmax)\n",
|
|
340
|
+
"N3_dynamic_loss = jinns.loss.GeneralizedLotkaVolterra(key_main=\"2\", keys_other=[\"0\", \"1\"], Tmax=Tmax)"
|
|
341
|
+
]
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"cell_type": "code",
|
|
345
|
+
"execution_count": 13,
|
|
346
|
+
"id": "22b2647f",
|
|
347
|
+
"metadata": {},
|
|
348
|
+
"outputs": [],
|
|
349
|
+
"source": [
|
|
350
|
+
"loss_weights = {\"dyn_loss\":1, \"initial_condition\":1 * Tmax}\n",
|
|
351
|
+
"\n",
|
|
352
|
+
"loss = jinns.loss.SystemLossODE(\n",
|
|
353
|
+
" u_dict={\"0\":u, \"1\":u, \"2\":u},\n",
|
|
354
|
+
" loss_weights=loss_weights,\n",
|
|
355
|
+
" dynamic_loss_dict={\"0\": N1_dynamic_loss, \"1\":N2_dynamic_loss, \"2\":N3_dynamic_loss},\n",
|
|
356
|
+
" initial_condition_dict={\"0\":(float(tmin), N_0[0]), \"1\":(float(tmin), N_0[1]), \"2\":(float(tmin), N_0[2])}\n",
|
|
357
|
+
")"
|
|
358
|
+
]
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"cell_type": "code",
|
|
362
|
+
"execution_count": 14,
|
|
363
|
+
"id": "5f5418d5-629f-4745-ad0f-3778020cc635",
|
|
364
|
+
"metadata": {},
|
|
365
|
+
"outputs": [
|
|
366
|
+
{
|
|
367
|
+
"name": "stdout",
|
|
368
|
+
"output_type": "stream",
|
|
369
|
+
"text": [
|
|
370
|
+
"total loss: 4579.1962890625\n",
|
|
371
|
+
"Individual losses: {'dyn_loss': '676.71', 'initial_condition': '3902.49', 'observations': '0.00'}\n"
|
|
372
|
+
]
|
|
373
|
+
}
|
|
374
|
+
],
|
|
375
|
+
"source": [
|
|
376
|
+
"# Testing the loss function\n",
|
|
377
|
+
"losses_and_grad = jax.value_and_grad(loss.evaluate, 0, has_aux=True)\n",
|
|
378
|
+
"losses, grads = losses_and_grad(\n",
|
|
379
|
+
" init_params,\n",
|
|
380
|
+
" train_data.get_batch()\n",
|
|
381
|
+
")\n",
|
|
382
|
+
"l_tot, d = losses\n",
|
|
383
|
+
"print(f\"total loss: {l_tot}\")\n",
|
|
384
|
+
"print(f\"Individual losses: { {key: f'{val:.2f}' for key, val in d.items()} }\")"
|
|
385
|
+
]
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"cell_type": "markdown",
|
|
389
|
+
"id": "64835b79-0bce-4f06-bd57-5ee051796663",
|
|
390
|
+
"metadata": {},
|
|
391
|
+
"source": [
|
|
392
|
+
"## Learning the neural network parameters\n",
|
|
393
|
+
"The learning process here consider known equation parameters `eq_params`. We thus only update `nn_params`"
|
|
394
|
+
]
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"cell_type": "code",
|
|
398
|
+
"execution_count": 15,
|
|
399
|
+
"id": "4e2c75a4-e3de-4d10-9424-4ee4ae206da3",
|
|
400
|
+
"metadata": {},
|
|
401
|
+
"outputs": [],
|
|
402
|
+
"source": [
|
|
403
|
+
"params = init_params"
|
|
404
|
+
]
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"cell_type": "code",
|
|
408
|
+
"execution_count": 16,
|
|
409
|
+
"id": "8d0106ad-d1e4-4fa8-958d-c8ebd4572d76",
|
|
410
|
+
"metadata": {},
|
|
411
|
+
"outputs": [],
|
|
412
|
+
"source": [
|
|
413
|
+
"# Optimizer\n",
|
|
414
|
+
"import optax\n",
|
|
415
|
+
"tx = optax.adam(learning_rate=1e-3)"
|
|
416
|
+
]
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"cell_type": "code",
|
|
420
|
+
"execution_count": 17,
|
|
421
|
+
"id": "055a7e63-4d0e-4246-b792-2007a0deeaab",
|
|
422
|
+
"metadata": {},
|
|
423
|
+
"outputs": [],
|
|
424
|
+
"source": [
|
|
425
|
+
"n_iter = int(50000)"
|
|
426
|
+
]
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
"cell_type": "code",
|
|
430
|
+
"execution_count": 18,
|
|
431
|
+
"id": "9284d4ed",
|
|
432
|
+
"metadata": {},
|
|
433
|
+
"outputs": [],
|
|
434
|
+
"source": [
|
|
435
|
+
"key, subkey = random.split(key)"
|
|
436
|
+
]
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"cell_type": "code",
|
|
440
|
+
"execution_count": 19,
|
|
441
|
+
"id": "df0ab21d-bfc1-4e81-8708-df8b30d0173b",
|
|
442
|
+
"metadata": {},
|
|
443
|
+
"outputs": [
|
|
444
|
+
{
|
|
445
|
+
"name": "stdout",
|
|
446
|
+
"output_type": "stream",
|
|
447
|
+
"text": [
|
|
448
|
+
"Iteration 0: loss value = 4555.5380859375\n"
|
|
449
|
+
]
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"data": {
|
|
453
|
+
"application/vnd.jupyter.widget-view+json": {
|
|
454
|
+
"model_id": "0885ff2c80a84f4693344948349fcbe0",
|
|
455
|
+
"version_major": 2,
|
|
456
|
+
"version_minor": 0
|
|
457
|
+
},
|
|
458
|
+
"text/plain": [
|
|
459
|
+
" 0%| | 0/50000 [00:00<?, ?it/s]"
|
|
460
|
+
]
|
|
461
|
+
},
|
|
462
|
+
"metadata": {},
|
|
463
|
+
"output_type": "display_data"
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"name": "stdout",
|
|
467
|
+
"output_type": "stream",
|
|
468
|
+
"text": [
|
|
469
|
+
"Iteration 1000: loss value = 318.8741149902344\n",
|
|
470
|
+
"Iteration 2000: loss value = 224.96556091308594\n",
|
|
471
|
+
"Iteration 3000: loss value = 150.76829528808594\n",
|
|
472
|
+
"Iteration 4000: loss value = 91.44490051269531\n",
|
|
473
|
+
"Iteration 5000: loss value = 56.90504455566406\n",
|
|
474
|
+
"Iteration 6000: loss value = 35.36555099487305\n",
|
|
475
|
+
"Iteration 7000: loss value = 23.368562698364258\n",
|
|
476
|
+
"Iteration 8000: loss value = 15.524669647216797\n",
|
|
477
|
+
"Iteration 9000: loss value = 10.52753734588623\n",
|
|
478
|
+
"Iteration 10000: loss value = 7.434139251708984\n",
|
|
479
|
+
"Iteration 11000: loss value = 5.210718154907227\n",
|
|
480
|
+
"Iteration 12000: loss value = 3.7904136180877686\n",
|
|
481
|
+
"Iteration 13000: loss value = 2.4596922397613525\n",
|
|
482
|
+
"Iteration 14000: loss value = 1.9706025123596191\n",
|
|
483
|
+
"Iteration 15000: loss value = 1.482211709022522\n",
|
|
484
|
+
"Iteration 16000: loss value = 0.9678654670715332\n",
|
|
485
|
+
"Iteration 17000: loss value = 1.0758025646209717\n",
|
|
486
|
+
"Iteration 18000: loss value = 0.4116891026496887\n",
|
|
487
|
+
"Iteration 19000: loss value = 0.32329803705215454\n",
|
|
488
|
+
"Iteration 20000: loss value = 0.5885492563247681\n",
|
|
489
|
+
"Iteration 21000: loss value = 0.31351974606513977\n",
|
|
490
|
+
"Iteration 22000: loss value = 0.178497776389122\n",
|
|
491
|
+
"Iteration 23000: loss value = 0.10003294795751572\n",
|
|
492
|
+
"Iteration 24000: loss value = 0.21409007906913757\n",
|
|
493
|
+
"Iteration 25000: loss value = 0.10440698266029358\n",
|
|
494
|
+
"Iteration 26000: loss value = 0.14562144875526428\n",
|
|
495
|
+
"Iteration 27000: loss value = 0.09297636151313782\n",
|
|
496
|
+
"Iteration 28000: loss value = 0.04384230822324753\n",
|
|
497
|
+
"Iteration 29000: loss value = 0.06380896270275116\n",
|
|
498
|
+
"Iteration 30000: loss value = 0.047628261148929596\n",
|
|
499
|
+
"Iteration 31000: loss value = 0.08742117881774902\n",
|
|
500
|
+
"Iteration 32000: loss value = 0.2274346649646759\n",
|
|
501
|
+
"Iteration 33000: loss value = 0.039586469531059265\n",
|
|
502
|
+
"Iteration 34000: loss value = 0.041193120181560516\n",
|
|
503
|
+
"Iteration 35000: loss value = 0.0384555421769619\n",
|
|
504
|
+
"Iteration 36000: loss value = 0.02351181022822857\n",
|
|
505
|
+
"Iteration 37000: loss value = 0.03427871689200401\n",
|
|
506
|
+
"Iteration 38000: loss value = 0.04472379386425018\n",
|
|
507
|
+
"Iteration 39000: loss value = 0.018797673285007477\n",
|
|
508
|
+
"Iteration 40000: loss value = 0.04032493382692337\n",
|
|
509
|
+
"Iteration 41000: loss value = 0.01733144372701645\n",
|
|
510
|
+
"Iteration 42000: loss value = 0.10980413109064102\n",
|
|
511
|
+
"Iteration 43000: loss value = 0.19737961888313293\n",
|
|
512
|
+
"Iteration 44000: loss value = 0.024736665189266205\n",
|
|
513
|
+
"Iteration 45000: loss value = 0.0491604208946228\n",
|
|
514
|
+
"Iteration 46000: loss value = 0.021411903202533722\n",
|
|
515
|
+
"Iteration 47000: loss value = 0.02852526120841503\n",
|
|
516
|
+
"Iteration 48000: loss value = 0.6865979433059692\n",
|
|
517
|
+
"Iteration 49000: loss value = 0.02246144972741604\n",
|
|
518
|
+
"Iteration 50000: loss value = 0.09908341616392136\n"
|
|
519
|
+
]
|
|
520
|
+
}
|
|
521
|
+
],
|
|
522
|
+
"source": [
|
|
523
|
+
"params, total_loss_list, loss_by_term_dict, data, loss, _, _ = jinns.solve(\n",
|
|
524
|
+
" init_params=params,\n",
|
|
525
|
+
" data=train_data,\n",
|
|
526
|
+
" optimizer=tx,\n",
|
|
527
|
+
" loss=loss,\n",
|
|
528
|
+
" n_iter=n_iter\n",
|
|
529
|
+
")"
|
|
530
|
+
]
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"cell_type": "code",
|
|
534
|
+
"execution_count": 20,
|
|
535
|
+
"id": "b65dfc33",
|
|
536
|
+
"metadata": {},
|
|
537
|
+
"outputs": [
|
|
538
|
+
{
|
|
539
|
+
"data": {
|
|
540
|
+
"text/plain": [
|
|
541
|
+
"Array(0.09908342, dtype=float32)"
|
|
542
|
+
]
|
|
543
|
+
},
|
|
544
|
+
"execution_count": 20,
|
|
545
|
+
"metadata": {},
|
|
546
|
+
"output_type": "execute_result"
|
|
547
|
+
}
|
|
548
|
+
],
|
|
549
|
+
"source": [
|
|
550
|
+
"total_loss_list[-1]"
|
|
551
|
+
]
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
"cell_type": "markdown",
|
|
555
|
+
"id": "1d0a1757",
|
|
556
|
+
"metadata": {},
|
|
557
|
+
"source": [
|
|
558
|
+
"## Results"
|
|
559
|
+
]
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
"cell_type": "markdown",
|
|
563
|
+
"id": "64c794ff",
|
|
564
|
+
"metadata": {},
|
|
565
|
+
"source": [
|
|
566
|
+
"Plot the loss values"
|
|
567
|
+
]
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
"cell_type": "code",
|
|
571
|
+
"execution_count": 21,
|
|
572
|
+
"id": "2cd778b4-d9d9-4f69-ad02-2a3f7eacf59d",
|
|
573
|
+
"metadata": {
|
|
574
|
+
"scrolled": true
|
|
575
|
+
},
|
|
576
|
+
"outputs": [
|
|
577
|
+
{
|
|
578
|
+
"data": {
|
|
579
|
+
"image/png": "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",
|
|
580
|
+
"text/plain": [
|
|
581
|
+
"<Figure size 640x480 with 1 Axes>"
|
|
582
|
+
]
|
|
583
|
+
},
|
|
584
|
+
"metadata": {},
|
|
585
|
+
"output_type": "display_data"
|
|
586
|
+
}
|
|
587
|
+
],
|
|
588
|
+
"source": [
|
|
589
|
+
"for loss_name, loss_values in loss_by_term_dict.items():\n",
|
|
590
|
+
" plt.plot(jnp.log10(loss_values), label=loss_name)\n",
|
|
591
|
+
"plt.plot(jnp.log10(total_loss_list), label=\"total loss\")\n",
|
|
592
|
+
"plt.legend()\n",
|
|
593
|
+
"plt.show();"
|
|
594
|
+
]
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"cell_type": "markdown",
|
|
598
|
+
"id": "a6247171",
|
|
599
|
+
"metadata": {},
|
|
600
|
+
"source": [
|
|
601
|
+
"Plot the ODE solutions learned by the PINN"
|
|
602
|
+
]
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
"cell_type": "code",
|
|
606
|
+
"execution_count": 22,
|
|
607
|
+
"id": "6d473743-c9a8-4406-b18c-256496cfde59",
|
|
608
|
+
"metadata": {},
|
|
609
|
+
"outputs": [
|
|
610
|
+
{
|
|
611
|
+
"data": {
|
|
612
|
+
"text/plain": [
|
|
613
|
+
"<matplotlib.legend.Legend at 0x7f16280d1050>"
|
|
614
|
+
]
|
|
615
|
+
},
|
|
616
|
+
"execution_count": 22,
|
|
617
|
+
"metadata": {},
|
|
618
|
+
"output_type": "execute_result"
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
"data": {
|
|
622
|
+
"image/png": "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",
|
|
623
|
+
"text/plain": [
|
|
624
|
+
"<Figure size 640x480 with 1 Axes>"
|
|
625
|
+
]
|
|
626
|
+
},
|
|
627
|
+
"metadata": {},
|
|
628
|
+
"output_type": "display_data"
|
|
629
|
+
}
|
|
630
|
+
],
|
|
631
|
+
"source": [
|
|
632
|
+
"u_est_fp = vmap(lambda t:u(t, params[\"nn_params\"][\"0\"]), (0), 0)\n",
|
|
633
|
+
"v_est_fp = vmap(lambda t:u(t, params[\"nn_params\"][\"1\"]), (0), 0)\n",
|
|
634
|
+
"w_est_fp = vmap(lambda t:u(t, params[\"nn_params\"][\"2\"]), (0), 0)\n",
|
|
635
|
+
"\n",
|
|
636
|
+
"\n",
|
|
637
|
+
"key, subkey = random.split(key, 2)\n",
|
|
638
|
+
"val_data = jinns.data.DataGeneratorODE(subkey, n, tmin, tmax, batch_size, method)\n",
|
|
639
|
+
"\n",
|
|
640
|
+
"plt.plot(val_data.times.sort(axis=0) * Tmax, u_est_fp(val_data.times.sort(axis=0)), label=\"N1\")\n",
|
|
641
|
+
"plt.plot(val_data.times.sort(axis=0) * Tmax, v_est_fp(val_data.times.sort(axis=0)), label=\"N2\")\n",
|
|
642
|
+
"plt.plot(val_data.times.sort(axis=0) * Tmax, w_est_fp(val_data.times.sort(axis=0)), label=\"N3\")\n",
|
|
643
|
+
"\n",
|
|
644
|
+
"plt.legend()"
|
|
645
|
+
]
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
"cell_type": "markdown",
|
|
649
|
+
"id": "aed49c41",
|
|
650
|
+
"metadata": {},
|
|
651
|
+
"source": [
|
|
652
|
+
"## Compare with the scipy solver\n",
|
|
653
|
+
"Code from Lorenzo Sala"
|
|
654
|
+
]
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
"cell_type": "code",
|
|
658
|
+
"execution_count": 23,
|
|
659
|
+
"id": "484380a5",
|
|
660
|
+
"metadata": {},
|
|
661
|
+
"outputs": [
|
|
662
|
+
{
|
|
663
|
+
"data": {
|
|
664
|
+
"image/png": "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EJTvreN5PB7Ky8v94z3lk2GtFnv//fcNp9NpvP3228a6deuMO++804iLizNycnKsjuZ3HnjgAWP+/PnGtm3bjEWLFhmDBw82mjZtauTl5VkdzXJFRUXGypUrjZUrVxqA8eyzzxorV640duzYYRiGYUyZMsWIi4szZs+ebfz888/GiBEjjPT0dKO0tNTi5L53qteqqKjIePDBB43MzExj27ZtxjfffGP06tXLaN++vVFWVmZ1dJ8bO3as4XK5jPnz5xt79+71XkpKSrz73HXXXUZaWpoxb948Y9myZUZGRoaRkZFhYWprnO612rx5s/HEE08Yy5YtM7Zt22bMnj3baNOmjXHJJZdYnNz3Hn74YWPBggXGtm3bjJ9//tl4+OGHDZvNZnz99deGYVj/ngqK8mEYhvHiiy8aaWlphsPhMPr27WssWbLE6kh+6dprrzWaN29uOBwOo0WLFsa1115rbN682epYfuHbb781gBMut9xyi2EY5tdtH330USMpKclwOp3GoEGDjKysLGtDW+RUr1VJSYkxdOhQo1mzZkZYWJjRqlUr44477gjaXwZqe50A46233vLuU1paatx9991GkyZNjMjISOOqq64y9u7da11oi5zutdq5c6dxySWXGPHx8YbT6TTatWtn/M///I9RUFBgbXAL3H777UarVq0Mh8NhNGvWzBg0aJC3eBiG9e8pm2EYhm+OsYiIiIgEwZgPERER8S8qHyIiIuJTKh8iIiLiUyofIiIi4lMqHyIiIuJTKh8iIiLiUyofIiIi4lMqHyIiIuJTKh8iIiLiUyofIiIi4lMqHyIiIuJTKh8iIiLiU/8fy6z8wq7PDJwAAAAASUVORK5CYII=",
|
|
665
|
+
"text/plain": [
|
|
666
|
+
"<Figure size 640x480 with 1 Axes>"
|
|
667
|
+
]
|
|
668
|
+
},
|
|
669
|
+
"metadata": {},
|
|
670
|
+
"output_type": "display_data"
|
|
671
|
+
}
|
|
672
|
+
],
|
|
673
|
+
"source": [
|
|
674
|
+
"import numpy as np\n",
|
|
675
|
+
"from scipy.integrate import odeint\n",
|
|
676
|
+
"\n",
|
|
677
|
+
"def lotka_volterra_log(y_log, t, params):\n",
|
|
678
|
+
" \"\"\"\n",
|
|
679
|
+
" Generalized Lotka-Volterra model for N bacterial species, with logarithmic transformation for stability.\n",
|
|
680
|
+
" \n",
|
|
681
|
+
" Parameters:\n",
|
|
682
|
+
" y_log (array): Array of log-transformed bacterial populations.\n",
|
|
683
|
+
" t (float): Time.\n",
|
|
684
|
+
" params (tuple): Tuple of model parameters.\n",
|
|
685
|
+
" \n",
|
|
686
|
+
" Returns:\n",
|
|
687
|
+
" dydt (array): Array of derivative of log-transformed bacterial populations with respect to time.\n",
|
|
688
|
+
" \"\"\"\n",
|
|
689
|
+
" alpha, beta, gamma, _ = params\n",
|
|
690
|
+
" N = len(y_log)\n",
|
|
691
|
+
" y = np.exp(y_log)\n",
|
|
692
|
+
" dydt = np.zeros(N)\n",
|
|
693
|
+
" \n",
|
|
694
|
+
" for i in range(N):\n",
|
|
695
|
+
" dydt[i] = y[i] * (alpha[i] - beta[i] * np.sum(y) - np.sum([gamma[j][i] * y[j] for j in range(N)]))\n",
|
|
696
|
+
" \n",
|
|
697
|
+
" dydt_log = dydt / y\n",
|
|
698
|
+
" \n",
|
|
699
|
+
" return dydt_log\n",
|
|
700
|
+
"\n",
|
|
701
|
+
"# Define name bacteria\n",
|
|
702
|
+
"names = ['N1', 'N2', 'N3']\n",
|
|
703
|
+
"N = len(names)\n",
|
|
704
|
+
"\n",
|
|
705
|
+
"# Define model parameters\n",
|
|
706
|
+
"death_rates = None\n",
|
|
707
|
+
"params = (growth_rates, carrying_capacities, interactions, death_rates)\n",
|
|
708
|
+
"\n",
|
|
709
|
+
"# Define initial bacterial populations\n",
|
|
710
|
+
"y0 = [10, 7, 4] #[0.26, 0.37, 0.57] #\n",
|
|
711
|
+
"\n",
|
|
712
|
+
"# Define time points\n",
|
|
713
|
+
"Tmax = 30\n",
|
|
714
|
+
"t = np.linspace(0, Tmax, 1000)\n",
|
|
715
|
+
"\n",
|
|
716
|
+
"############################\n",
|
|
717
|
+
"\n",
|
|
718
|
+
"y0_log = np.log(y0)\n",
|
|
719
|
+
"y_log = odeint(lotka_volterra_log, y0_log, t, args=(params,))\n",
|
|
720
|
+
"y = np.exp(y_log)\n",
|
|
721
|
+
"\n",
|
|
722
|
+
"for i in range(N): \n",
|
|
723
|
+
" plt.plot(t, y[:,i], label=names[i])"
|
|
724
|
+
]
|
|
725
|
+
},
|
|
726
|
+
{
|
|
727
|
+
"cell_type": "code",
|
|
728
|
+
"execution_count": null,
|
|
729
|
+
"id": "e962c046",
|
|
730
|
+
"metadata": {},
|
|
731
|
+
"outputs": [],
|
|
732
|
+
"source": []
|
|
733
|
+
}
|
|
734
|
+
],
|
|
735
|
+
"metadata": {
|
|
736
|
+
"kernelspec": {
|
|
737
|
+
"display_name": "Python 3 (ipykernel)",
|
|
738
|
+
"language": "python",
|
|
739
|
+
"name": "python3"
|
|
740
|
+
},
|
|
741
|
+
"language_info": {
|
|
742
|
+
"codemirror_mode": {
|
|
743
|
+
"name": "ipython",
|
|
744
|
+
"version": 3
|
|
745
|
+
},
|
|
746
|
+
"file_extension": ".py",
|
|
747
|
+
"mimetype": "text/x-python",
|
|
748
|
+
"name": "python",
|
|
749
|
+
"nbconvert_exporter": "python",
|
|
750
|
+
"pygments_lexer": "ipython3",
|
|
751
|
+
"version": "3.11.2"
|
|
752
|
+
},
|
|
753
|
+
"vscode": {
|
|
754
|
+
"interpreter": {
|
|
755
|
+
"hash": "991718e94fb5d91fa62c7598521d2199c208ff1ff700f1ac060f334be0bee194"
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
},
|
|
759
|
+
"nbformat": 4,
|
|
760
|
+
"nbformat_minor": 5
|
|
761
|
+
}
|