jinns 0.4.2__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.
Files changed (103) hide show
  1. jinns-0.5.1/Notebooks/ODE/1D_Generalized_Lotka_Volterra.ipynb +761 -0
  2. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/ODE/1D_Generalized_Lotka_Volterra_seq2seq.ipynb +3 -3
  3. jinns-0.5.1/Notebooks/ODE/systems_biology_informed_neural_network.ipynb +1258 -0
  4. jinns-0.5.1/Notebooks/PDE/1D_non_stationary_Burger.ipynb +768 -0
  5. jinns-0.5.1/Notebooks/PDE/1D_non_stationary_Fisher_KPP_Bounded_Domain.ipynb +858 -0
  6. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/PDE/2D_Navier_Stokes_PipeFlow.ipynb +59 -73
  7. jinns-0.5.1/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_Metamodel.ipynb +845 -0
  8. jinns-0.5.1/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_SoftConstraints.ipynb +1171 -0
  9. jinns-0.5.1/Notebooks/PDE/2D_non_stationary_OU.ipynb +1152 -0
  10. jinns-0.5.1/Notebooks/PDE/Reaction_Diffusion_2D_heterogenous_model.ipynb +1836 -0
  11. jinns-0.5.1/Notebooks/PDE/imperfect_modeling_sobolev_reg.ipynb +1053 -0
  12. jinns-0.5.1/Notebooks/Tutorials/implementing_your_own_PDE_problem.ipynb +714 -0
  13. {jinns-0.4.2 → jinns-0.5.1}/PKG-INFO +13 -2
  14. {jinns-0.4.2 → jinns-0.5.1}/README.md +12 -1
  15. {jinns-0.4.2 → jinns-0.5.1}/doc/source/conf.py +2 -0
  16. {jinns-0.4.2 → jinns-0.5.1}/doc/source/index.rst +14 -0
  17. {jinns-0.4.2 → jinns-0.5.1}/jinns/data/_display.py +78 -21
  18. jinns-0.5.1/jinns/loss/_DynamicLoss.py +974 -0
  19. {jinns-0.4.2 → jinns-0.5.1}/jinns/loss/_DynamicLossAbstract.py +17 -10
  20. {jinns-0.4.2 → jinns-0.5.1}/jinns/loss/_LossODE.py +8 -14
  21. {jinns-0.4.2 → jinns-0.5.1}/jinns/loss/_LossPDE.py +351 -202
  22. {jinns-0.4.2 → jinns-0.5.1}/jinns/loss/__init__.py +0 -6
  23. jinns-0.5.1/jinns/loss/_boundary_conditions.py +468 -0
  24. jinns-0.5.1/jinns/loss/_operators.py +315 -0
  25. {jinns-0.4.2 → jinns-0.5.1}/jinns/solver/_solve.py +10 -5
  26. {jinns-0.4.2 → jinns-0.5.1}/jinns/utils/__init__.py +2 -2
  27. jinns-0.5.1/jinns/utils/_pinn.py +298 -0
  28. jinns-0.5.1/jinns/utils/_spinn.py +238 -0
  29. jinns-0.5.1/jinns/utils/_utils.py +157 -0
  30. {jinns-0.4.2 → jinns-0.5.1}/jinns.egg-info/PKG-INFO +13 -2
  31. {jinns-0.4.2 → jinns-0.5.1}/jinns.egg-info/SOURCES.txt +11 -3
  32. jinns-0.5.1/tests/runtests.sh +11 -0
  33. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_Burger_x32.py +2 -3
  34. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_Burger_x64.py +2 -3
  35. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_Fisher_x32.py +2 -3
  36. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_Fisher_x64.py +2 -3
  37. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_GLV_x32.py +4 -5
  38. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_GLV_x64.py +4 -5
  39. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_NSPipeFlow_x32.py +38 -33
  40. {jinns-0.4.2 → jinns-0.5.1}/tests/solver_tests/test_NSPipeFlow_x64.py +38 -32
  41. jinns-0.5.1/tests/solver_tests/test_OU2D_x32.py +152 -0
  42. jinns-0.5.1/tests/solver_tests/test_imperfect_sobolev_x32.py +158 -0
  43. jinns-0.5.1/tests/solver_tests_spinn/test_Burger_x32.py +114 -0
  44. jinns-0.5.1/tests/solver_tests_spinn/test_Fisher_x32.py +140 -0
  45. jinns-0.5.1/tests/solver_tests_spinn/test_NSPipeFlow_x32_spinn.py +165 -0
  46. jinns-0.5.1/tests/solver_tests_spinn/test_OU2D_x32.py +144 -0
  47. jinns-0.5.1/tests/solver_tests_spinn/test_ReactionDiffusion_nonhomo_x64.py +173 -0
  48. jinns-0.4.2/Notebooks/ODE/1D_Generalized_Lotka_Volterra.ipynb +0 -707
  49. jinns-0.4.2/Notebooks/ODE/systems_biology_informed_neural_network.ipynb +0 -1143
  50. jinns-0.4.2/Notebooks/PDE/1D_non_stationary_Burger.ipynb +0 -692
  51. jinns-0.4.2/Notebooks/PDE/1D_non_stationary_Fisher_KPP_Bounded_Domain.ipynb +0 -693
  52. jinns-0.4.2/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_Metamodel.ipynb +0 -800
  53. jinns-0.4.2/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_SoftConstraints.ipynb +0 -795
  54. jinns-0.4.2/Notebooks/PDE/2D_non_stationary_OU_RAR.ipynb +0 -754
  55. jinns-0.4.2/Notebooks/PDE/Reaction_Diffusion_2D_heterogenous_model.ipynb +0 -1085
  56. jinns-0.4.2/Notebooks/PDE/imperfect_modeling_sobolev_reg.ipynb +0 -1060
  57. jinns-0.4.2/Notebooks/Tutorials/implementing_your_own_ODE_problem.ipynb +0 -59
  58. jinns-0.4.2/Notebooks/Tutorials/implementing_your_own_PDE_problem.ipynb +0 -716
  59. jinns-0.4.2/jinns/loss/_DynamicLoss.py +0 -1472
  60. jinns-0.4.2/jinns/loss/_boundary_conditions.py +0 -302
  61. jinns-0.4.2/jinns/loss/_operators.py +0 -162
  62. jinns-0.4.2/jinns/utils/_utils.py +0 -542
  63. jinns-0.4.2/tests/runtests.sh +0 -5
  64. {jinns-0.4.2 → jinns-0.5.1}/.gitignore +0 -0
  65. {jinns-0.4.2 → jinns-0.5.1}/.gitlab-ci.yml +0 -0
  66. {jinns-0.4.2 → jinns-0.5.1}/.pre-commit-config.yaml +0 -0
  67. {jinns-0.4.2 → jinns-0.5.1}/LICENSE +0 -0
  68. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/PDE/1D_non_stationary_Burger_JointEstimation_Vanilla.ipynb +0 -0
  69. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/PDE/1D_non_stationary_OU.ipynb +0 -0
  70. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/PDE/2d_nonstatio_ou_standardsampling.png +0 -0
  71. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/PDE/OU_1D_nonstatio_solution_grid.npy +0 -0
  72. {jinns-0.4.2 → jinns-0.5.1}/Notebooks/PDE/burger_solution_grid.npy +0 -0
  73. {jinns-0.4.2 → jinns-0.5.1}/doc/Makefile +0 -0
  74. {jinns-0.4.2 → jinns-0.5.1}/doc/source/PinnSolver.rst +0 -0
  75. {jinns-0.4.2 → jinns-0.5.1}/doc/source/boundary_conditions.rst +0 -0
  76. {jinns-0.4.2 → jinns-0.5.1}/doc/source/data.rst +0 -0
  77. {jinns-0.4.2 → jinns-0.5.1}/doc/source/dynamic_loss.rst +0 -0
  78. {jinns-0.4.2 → jinns-0.5.1}/doc/source/fokker_planck.qmd +0 -0
  79. {jinns-0.4.2 → jinns-0.5.1}/doc/source/loss.rst +0 -0
  80. {jinns-0.4.2 → jinns-0.5.1}/doc/source/loss_ode.rst +0 -0
  81. {jinns-0.4.2 → jinns-0.5.1}/doc/source/loss_pde.rst +0 -0
  82. {jinns-0.4.2 → jinns-0.5.1}/doc/source/math_pinn.qmd +0 -0
  83. {jinns-0.4.2 → jinns-0.5.1}/doc/source/operators.rst +0 -0
  84. {jinns-0.4.2 → jinns-0.5.1}/doc/source/param_estim_pinn.qmd +0 -0
  85. {jinns-0.4.2 → jinns-0.5.1}/doc/source/rar.rst +0 -0
  86. {jinns-0.4.2 → jinns-0.5.1}/doc/source/seq2seq.rst +0 -0
  87. {jinns-0.4.2 → jinns-0.5.1}/doc/source/solver.rst +0 -0
  88. {jinns-0.4.2 → jinns-0.5.1}/doc/source/utils.rst +0 -0
  89. {jinns-0.4.2 → jinns-0.5.1}/jinns/__init__.py +0 -0
  90. {jinns-0.4.2 → jinns-0.5.1}/jinns/data/_DataGenerators.py +0 -0
  91. {jinns-0.4.2 → jinns-0.5.1}/jinns/data/__init__.py +0 -0
  92. {jinns-0.4.2 → jinns-0.5.1}/jinns/solver/__init__.py +0 -0
  93. {jinns-0.4.2 → jinns-0.5.1}/jinns/solver/_rar.py +0 -0
  94. {jinns-0.4.2 → jinns-0.5.1}/jinns/solver/_seq2seq.py +0 -0
  95. {jinns-0.4.2 → jinns-0.5.1}/jinns.egg-info/dependency_links.txt +0 -0
  96. {jinns-0.4.2 → jinns-0.5.1}/jinns.egg-info/requires.txt +0 -0
  97. {jinns-0.4.2 → jinns-0.5.1}/jinns.egg-info/top_level.txt +0 -0
  98. {jinns-0.4.2 → jinns-0.5.1}/pyproject.toml +0 -0
  99. {jinns-0.4.2 → jinns-0.5.1}/setup.cfg +0 -0
  100. {jinns-0.4.2 → jinns-0.5.1}/tests/conftest.py +0 -0
  101. {jinns-0.4.2 → jinns-0.5.1}/tests/dataGenerator_tests/test_CubicMeshPDENonStatio.py +0 -0
  102. {jinns-0.4.2 → jinns-0.5.1}/tests/dataGenerator_tests/test_CubicMeshPDEStatio.py +0 -0
  103. {jinns-0.4.2 → jinns-0.5.1}/tests/dataGenerator_tests/test_DataGeneratorODE.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+x1WD0tra6v27t2roqKizgPY7SoqKtKuXbtC7tPS0qKYmJigstjYWO3cufOSjunxeIIWAAAwfIUVWM6dOyev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",
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
+ }