jinns 1.5.1__tar.gz → 1.6.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 (191) hide show
  1. jinns-1.6.1/Notebooks/ODE/1D_Generalized_Lotka_Volterra.ipynb +786 -0
  2. jinns-1.6.1/Notebooks/ODE/MS_model_Verhulst.ipynb +1982 -0
  3. jinns-1.6.1/Notebooks/PDE/1D_non_stationary_Burgers.ipynb +785 -0
  4. jinns-1.6.1/Notebooks/PDE/2D_Heat_inverse_problem.ipynb +931 -0
  5. jinns-1.6.1/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_Metamodel_hyperpinn.ipynb +1474 -0
  6. jinns-1.6.1/Notebooks/PDE/2D_Poisson_inverse_problem.ipynb +791 -0
  7. jinns-1.6.1/Notebooks/PDE/Reaction_Diffusion_2D_heterogenous_model.ipynb +1818 -0
  8. jinns-1.6.1/Notebooks/PDE/Reaction_Diffusion_2D_homogeneous_metamodel_hyperpinn_diffrax.ipynb +1013 -0
  9. jinns-1.6.1/Notebooks/Tutorials/1D_non_stationary_Burgers_JointEstimation_Vanilla.ipynb +881 -0
  10. jinns-1.6.1/Notebooks/Tutorials/implementing_your_own_PDE_problem.ipynb +771 -0
  11. jinns-1.6.1/Notebooks/Tutorials/load_save_model.ipynb +601 -0
  12. {jinns-1.5.1 → jinns-1.6.1}/PKG-INFO +2 -2
  13. {jinns-1.5.1 → jinns-1.6.1}/docs/changelog.md +13 -0
  14. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/_AbstractDataGenerator.py +1 -1
  15. jinns-1.6.1/jinns/data/_Batchs.py +76 -0
  16. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/_CubicMeshPDENonStatio.py +55 -34
  17. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/_CubicMeshPDEStatio.py +63 -35
  18. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/_DataGeneratorODE.py +48 -22
  19. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/_DataGeneratorObservations.py +86 -32
  20. jinns-1.6.1/jinns/data/_DataGeneratorParameter.py +257 -0
  21. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/__init__.py +2 -1
  22. {jinns-1.5.1 → jinns-1.6.1}/jinns/data/_utils.py +22 -10
  23. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_DynamicLoss.py +21 -20
  24. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_DynamicLossAbstract.py +51 -36
  25. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_LossODE.py +139 -184
  26. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_LossPDE.py +440 -358
  27. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_abstract_loss.py +60 -25
  28. jinns-1.6.1/jinns/loss/_loss_components.py +22 -0
  29. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_loss_weight_updates.py +6 -7
  30. jinns-1.6.1/jinns/loss/_loss_weights.py +82 -0
  31. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_abstract_pinn.py +0 -2
  32. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_hyperpinn.py +34 -23
  33. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_mlp.py +5 -4
  34. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_pinn.py +1 -16
  35. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_ppinn.py +5 -16
  36. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_save_load.py +11 -4
  37. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_spinn.py +1 -16
  38. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/_spinn_mlp.py +5 -5
  39. jinns-1.6.1/jinns/nn/_utils.py +33 -0
  40. {jinns-1.5.1 → jinns-1.6.1}/jinns/parameters/__init__.py +3 -1
  41. {jinns-1.5.1 → jinns-1.6.1}/jinns/parameters/_derivative_keys.py +99 -41
  42. {jinns-1.5.1 → jinns-1.6.1}/jinns/parameters/_params.py +50 -25
  43. {jinns-1.5.1 → jinns-1.6.1}/jinns/solver/_solve.py +3 -3
  44. jinns-1.6.1/jinns/utils/_DictToModuleMeta.py +66 -0
  45. jinns-1.6.1/jinns/utils/_ItemizableModule.py +19 -0
  46. jinns-1.6.1/jinns/utils/__init__.py +4 -0
  47. jinns-1.6.1/jinns/utils/_types.py +41 -0
  48. {jinns-1.5.1 → jinns-1.6.1}/jinns.egg-info/PKG-INFO +2 -2
  49. {jinns-1.5.1 → jinns-1.6.1}/jinns.egg-info/SOURCES.txt +5 -0
  50. {jinns-1.5.1 → jinns-1.6.1}/pyproject.toml +2 -2
  51. {jinns-1.5.1 → jinns-1.6.1}/tests/conftest.py +19 -2
  52. {jinns-1.5.1 → jinns-1.6.1}/tests/dataGenerator_tests/test_DataGeneratorParameter.py +17 -15
  53. {jinns-1.5.1 → jinns-1.6.1}/tests/nn_tests/test_mlp.py +4 -1
  54. {jinns-1.5.1 → jinns-1.6.1}/tests/nn_tests/test_ppinn_mlp.py +1 -0
  55. {jinns-1.5.1 → jinns-1.6.1}/tests/operator_tests/test_divergence_fwd.py +2 -0
  56. {jinns-1.5.1 → jinns-1.6.1}/tests/operator_tests/test_divergence_rev.py +2 -0
  57. {jinns-1.5.1 → jinns-1.6.1}/tests/operator_tests/test_laplacian_fwd.py +2 -0
  58. {jinns-1.5.1 → jinns-1.6.1}/tests/operator_tests/test_laplacian_rev.py +2 -0
  59. {jinns-1.5.1 → jinns-1.6.1}/tests/operator_tests/test_vectorial_laplacian_fwd.py +2 -0
  60. {jinns-1.5.1 → jinns-1.6.1}/tests/operator_tests/test_vectorial_laplacian_rev.py +2 -0
  61. {jinns-1.5.1 → jinns-1.6.1}/tests/parameters_tests/test_DerivativeKeysODE.py +10 -10
  62. jinns-1.6.1/tests/parameters_tests/test_params.py +78 -0
  63. {jinns-1.5.1 → jinns-1.6.1}/tests/plot_tests/test_plot1D.py +2 -2
  64. {jinns-1.5.1 → jinns-1.6.1}/tests/plot_tests/test_plot2D.py +2 -7
  65. jinns-1.6.1/tests/pytest.ini +3 -0
  66. {jinns-1.5.1 → jinns-1.6.1}/tests/save_load_tests/test_saving_loading_hyperpinn.py +6 -2
  67. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_OU1D_statio_x32.py +2 -2
  68. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_nan_params_catch.py +1 -1
  69. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_parameter_tracker.py +2 -2
  70. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests_hyperpinn/test_NSPipeFlow_x32_hyperpinn.py +9 -6
  71. jinns-1.6.1/tests/solver_tests_inverse/test_simple_inverse_pb.py +130 -0
  72. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests_spinn/test_ReactionDiffusion_nonhomo_x64_spinn.py +5 -2
  73. {jinns-1.5.1 → jinns-1.6.1}/tests/utils_tests/test_solver_utils.py +1 -6
  74. jinns-1.5.1/Notebooks/ODE/1D_Generalized_Lotka_Volterra.ipynb +0 -785
  75. jinns-1.5.1/Notebooks/ODE/MS_model_Verhulst.ipynb +0 -1951
  76. jinns-1.5.1/Notebooks/PDE/1D_non_stationary_Burgers.ipynb +0 -784
  77. jinns-1.5.1/Notebooks/PDE/2D_Heat_inverse_problem.ipynb +0 -932
  78. jinns-1.5.1/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_Metamodel_hyperpinn.ipynb +0 -1390
  79. jinns-1.5.1/Notebooks/PDE/2D_Poisson_inverse_problem.ipynb +0 -799
  80. jinns-1.5.1/Notebooks/PDE/Reaction_Diffusion_2D_heterogenous_model.ipynb +0 -1772
  81. jinns-1.5.1/Notebooks/PDE/Reaction_Diffusion_2D_homogeneous_metamodel_hyperpinn_diffrax.ipynb +0 -1002
  82. jinns-1.5.1/Notebooks/Tutorials/1D_non_stationary_Burgers_JointEstimation_Vanilla.ipynb +0 -887
  83. jinns-1.5.1/Notebooks/Tutorials/implementing_your_own_PDE_problem.ipynb +0 -769
  84. jinns-1.5.1/Notebooks/Tutorials/load_save_model.ipynb +0 -535
  85. jinns-1.5.1/jinns/data/_Batchs.py +0 -42
  86. jinns-1.5.1/jinns/data/_DataGeneratorParameter.py +0 -206
  87. jinns-1.5.1/jinns/loss/_loss_components.py +0 -43
  88. jinns-1.5.1/jinns/loss/_loss_weights.py +0 -83
  89. jinns-1.5.1/jinns/nn/_utils.py +0 -38
  90. jinns-1.5.1/jinns/utils/__init__.py +0 -3
  91. jinns-1.5.1/jinns/utils/_types.py +0 -31
  92. {jinns-1.5.1 → jinns-1.6.1}/.gitignore +0 -0
  93. {jinns-1.5.1 → jinns-1.6.1}/.gitlab-ci.yml +0 -0
  94. {jinns-1.5.1 → jinns-1.6.1}/.pre-commit-config.yaml +0 -0
  95. {jinns-1.5.1 → jinns-1.6.1}/AUTHORS +0 -0
  96. {jinns-1.5.1 → jinns-1.6.1}/LICENSE +0 -0
  97. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/ODE/linear_fo_equation.ipynb +0 -0
  98. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/ODE/sbinn_data/glucose.dat +0 -0
  99. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/ODE/sbinn_data/meal.dat +0 -0
  100. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/ODE/systems_biology_informed_neural_network.ipynb +0 -0
  101. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/PDE/1D_non_stationary_Fisher_KPP_Bounded_Domain.ipynb +0 -0
  102. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/PDE/2D_Navier_Stokes_PipeFlow.ipynb +0 -0
  103. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/PDE/2D_Navier_Stokes_PipeFlow_SoftConstraints.ipynb +0 -0
  104. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/PDE/2D_non_stationary_OU.ipynb +0 -0
  105. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/PDE/2d_nonstatio_ou_standardsampling.png +0 -0
  106. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/PDE/OU_1D_nonstatio_solution_grid.npy +0 -0
  107. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/Tutorials/burgers_solution_grid.npy +0 -0
  108. {jinns-1.5.1 → jinns-1.6.1}/Notebooks/Tutorials/introducing_validation_loss.ipynb +0 -0
  109. {jinns-1.5.1 → jinns-1.6.1}/README.md +0 -0
  110. {jinns-1.5.1 → jinns-1.6.1}/codemeta.json +0 -0
  111. {jinns-1.5.1 → jinns-1.6.1}/docs/README.md +0 -0
  112. {jinns-1.5.1 → jinns-1.6.1}/docs/_static/custom_css.css +0 -0
  113. {jinns-1.5.1 → jinns-1.6.1}/docs/_static/favicon.png +0 -0
  114. {jinns-1.5.1 → jinns-1.6.1}/docs/api/advanced/derivative_keys.md +0 -0
  115. {jinns-1.5.1 → jinns-1.6.1}/docs/api/advanced/differential_operators.md +0 -0
  116. {jinns-1.5.1 → jinns-1.6.1}/docs/api/advanced/loss_weight_updates.md +0 -0
  117. {jinns-1.5.1 → jinns-1.6.1}/docs/api/datagenerators/datagenerators_core.md +0 -0
  118. {jinns-1.5.1 → jinns-1.6.1}/docs/api/datagenerators/datagenerators_other.md +0 -0
  119. {jinns-1.5.1 → jinns-1.6.1}/docs/api/loss/dynamic_loss.md +0 -0
  120. {jinns-1.5.1 → jinns-1.6.1}/docs/api/loss/loss_weights.md +0 -0
  121. {jinns-1.5.1 → jinns-1.6.1}/docs/api/loss/loss_xde.md +0 -0
  122. {jinns-1.5.1 → jinns-1.6.1}/docs/api/pinn/hyperpinn.md +0 -0
  123. {jinns-1.5.1 → jinns-1.6.1}/docs/api/pinn/pinn.md +0 -0
  124. {jinns-1.5.1 → jinns-1.6.1}/docs/api/pinn/ppinn.md +0 -0
  125. {jinns-1.5.1 → jinns-1.6.1}/docs/api/pinn/save_load.md +0 -0
  126. {jinns-1.5.1 → jinns-1.6.1}/docs/api/pinn/spinn.md +0 -0
  127. {jinns-1.5.1 → jinns-1.6.1}/docs/api/plot.md +0 -0
  128. {jinns-1.5.1 → jinns-1.6.1}/docs/api/solver.md +0 -0
  129. {jinns-1.5.1 → jinns-1.6.1}/docs/doc_requirements.txt +0 -0
  130. {jinns-1.5.1 → jinns-1.6.1}/docs/index.md +0 -0
  131. {jinns-1.5.1 → jinns-1.6.1}/docs/javascripts/katex.js +0 -0
  132. {jinns-1.5.1 → jinns-1.6.1}/docs/maths/fokker_planck.md +0 -0
  133. {jinns-1.5.1 → jinns-1.6.1}/docs/maths/introduction_to_pinns.md +0 -0
  134. {jinns-1.5.1 → jinns-1.6.1}/img/jinns-diagram.png +0 -0
  135. {jinns-1.5.1 → jinns-1.6.1}/jinns/__init__.py +0 -0
  136. {jinns-1.5.1 → jinns-1.6.1}/jinns/experimental/__init__.py +0 -0
  137. {jinns-1.5.1 → jinns-1.6.1}/jinns/experimental/_diffrax_solver.py +0 -0
  138. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/__init__.py +0 -0
  139. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_boundary_conditions.py +0 -0
  140. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_loss_utils.py +0 -0
  141. {jinns-1.5.1 → jinns-1.6.1}/jinns/loss/_operators.py +0 -0
  142. {jinns-1.5.1 → jinns-1.6.1}/jinns/nn/__init__.py +0 -0
  143. {jinns-1.5.1 → jinns-1.6.1}/jinns/plot/__init__.py +0 -0
  144. {jinns-1.5.1 → jinns-1.6.1}/jinns/plot/_plot.py +0 -0
  145. {jinns-1.5.1 → jinns-1.6.1}/jinns/solver/__init__.py +0 -0
  146. {jinns-1.5.1 → jinns-1.6.1}/jinns/solver/_rar.py +0 -0
  147. {jinns-1.5.1 → jinns-1.6.1}/jinns/solver/_utils.py +0 -0
  148. {jinns-1.5.1 → jinns-1.6.1}/jinns/utils/_containers.py +0 -0
  149. {jinns-1.5.1 → jinns-1.6.1}/jinns/utils/_utils.py +0 -0
  150. {jinns-1.5.1 → jinns-1.6.1}/jinns/validation/__init__.py +0 -0
  151. {jinns-1.5.1 → jinns-1.6.1}/jinns/validation/_validation.py +0 -0
  152. {jinns-1.5.1 → jinns-1.6.1}/jinns.egg-info/dependency_links.txt +0 -0
  153. {jinns-1.5.1 → jinns-1.6.1}/jinns.egg-info/requires.txt +0 -0
  154. {jinns-1.5.1 → jinns-1.6.1}/jinns.egg-info/top_level.txt +0 -0
  155. {jinns-1.5.1 → jinns-1.6.1}/mkdocs.yml +0 -0
  156. {jinns-1.5.1 → jinns-1.6.1}/setup.cfg +0 -0
  157. {jinns-1.5.1 → jinns-1.6.1}/tests/adaptative_weight_tests/test_ReLoBRaLo_update.py +0 -0
  158. {jinns-1.5.1 → jinns-1.6.1}/tests/adaptative_weight_tests/test_loss_weight_update.py +0 -0
  159. {jinns-1.5.1 → jinns-1.6.1}/tests/adaptative_weight_tests/test_lr_annealing.py +0 -0
  160. {jinns-1.5.1 → jinns-1.6.1}/tests/adaptative_weight_tests/test_soft_adapt.py +0 -0
  161. {jinns-1.5.1 → jinns-1.6.1}/tests/dataGenerator_tests/test_CubicMeshPDENonStatio.py +0 -0
  162. {jinns-1.5.1 → jinns-1.6.1}/tests/dataGenerator_tests/test_CubicMeshPDEStatio.py +0 -0
  163. {jinns-1.5.1 → jinns-1.6.1}/tests/dataGenerator_tests/test_DataGeneratorODE.py +0 -0
  164. {jinns-1.5.1 → jinns-1.6.1}/tests/dataGenerator_tests/test_sobol_method.py +0 -0
  165. {jinns-1.5.1 → jinns-1.6.1}/tests/loss_tests/test_lossODE.py +0 -0
  166. {jinns-1.5.1 → jinns-1.6.1}/tests/loss_tests/test_lossPDEnonstatio.py +0 -0
  167. {jinns-1.5.1 → jinns-1.6.1}/tests/loss_tests/test_lossPDEstatio.py +0 -0
  168. {jinns-1.5.1 → jinns-1.6.1}/tests/loss_tests/test_norm_loss.py +0 -0
  169. {jinns-1.5.1 → jinns-1.6.1}/tests/nn_tests/test_hyperpinns.py +0 -0
  170. {jinns-1.5.1 → jinns-1.6.1}/tests/nn_tests/test_pinn.py +0 -0
  171. {jinns-1.5.1 → jinns-1.6.1}/tests/nn_tests/test_smlp.py +0 -0
  172. {jinns-1.5.1 → jinns-1.6.1}/tests/nn_tests/test_spinn.py +0 -0
  173. {jinns-1.5.1 → jinns-1.6.1}/tests/save_load_tests/test_saving_loading_pinn.py +0 -0
  174. {jinns-1.5.1 → jinns-1.6.1}/tests/save_load_tests/test_saving_loading_spinn.py +0 -0
  175. {jinns-1.5.1 → jinns-1.6.1}/tests/sharding_tests/test_Burgers_x32_multiple_shardings.py +0 -0
  176. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_Burgers_x32.py +0 -0
  177. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_Burgers_x64.py +0 -0
  178. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_Fisher_x32.py +0 -0
  179. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_Fisher_x64.py +0 -0
  180. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_GLV_x32.py +0 -0
  181. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_GLV_x64.py +0 -0
  182. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_NSPipeFlow_x32.py +0 -0
  183. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_NSPipeFlow_x64.py +0 -0
  184. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_OU2D_x32.py +0 -0
  185. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests/test_rar_algorithm.py +0 -0
  186. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests_spinn/test_Burgers_x32_spinn.py +0 -0
  187. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests_spinn/test_Fisher_x32_spinn.py +0 -0
  188. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests_spinn/test_NSPipeFlow_x32_spinn.py +0 -0
  189. {jinns-1.5.1 → jinns-1.6.1}/tests/solver_tests_spinn/test_OU2D_x32_spinn.py +0 -0
  190. {jinns-1.5.1 → jinns-1.6.1}/tests/utils_tests/test_subtract_with_check.py +0 -0
  191. {jinns-1.5.1 → jinns-1.6.1}/tests/validation_tests/test_vanilla_validation.py +0 -0
@@ -0,0 +1,786 @@
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) = \\alpha_iu_i(t)\n",
19
+ "-\\sum_j\\gamma_{j,i}u_j(t) - \\beta_i\\sum_{i'}u_{i'}(t), i\\in\\{1, 2, 3\\}\n",
20
+ "$$\n",
21
+ "where $\\alpha$ are the growth rates, $\\gamma$ are the interactions terms and $\\beta$ and the capacity terms."
22
+ ]
23
+ },
24
+ {
25
+ "cell_type": "markdown",
26
+ "id": "f337b94d",
27
+ "metadata": {},
28
+ "source": [
29
+ "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)"
30
+ ]
31
+ },
32
+ {
33
+ "cell_type": "code",
34
+ "execution_count": 1,
35
+ "id": "8bf8bebc-b311-4eb4-ad63-11447f62b280",
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "%load_ext autoreload\n",
40
+ "%autoreload 2\n",
41
+ "%matplotlib inline"
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "markdown",
46
+ "id": "a933fc3a-ced5-418f-bf96-13fe8aa9232c",
47
+ "metadata": {},
48
+ "source": [
49
+ "Optionnally force CPU"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": 2,
55
+ "id": "2c255899-92e1-4196-ba45-4e4d38331121",
56
+ "metadata": {},
57
+ "outputs": [],
58
+ "source": [
59
+ "# import os\n",
60
+ "# os.environ[\"JAX_PLATFORMS\"] = \"cpu\""
61
+ ]
62
+ },
63
+ {
64
+ "cell_type": "markdown",
65
+ "id": "e42b1b48",
66
+ "metadata": {},
67
+ "source": [
68
+ "Import our package"
69
+ ]
70
+ },
71
+ {
72
+ "cell_type": "code",
73
+ "execution_count": 3,
74
+ "id": "fbdd16f7",
75
+ "metadata": {
76
+ "scrolled": true
77
+ },
78
+ "outputs": [],
79
+ "source": [
80
+ "import jinns"
81
+ ]
82
+ },
83
+ {
84
+ "cell_type": "markdown",
85
+ "id": "09955058",
86
+ "metadata": {},
87
+ "source": [
88
+ "Import other dependencies"
89
+ ]
90
+ },
91
+ {
92
+ "cell_type": "code",
93
+ "execution_count": 4,
94
+ "id": "3abe5254-7556-424e-a57e-d364d67244a1",
95
+ "metadata": {},
96
+ "outputs": [],
97
+ "source": [
98
+ "import jax\n",
99
+ "from jax import random, vmap\n",
100
+ "import jax.numpy as jnp\n",
101
+ "import equinox as eqx\n",
102
+ "\n",
103
+ "import matplotlib.pyplot as plt\n",
104
+ "\n",
105
+ "key = random.PRNGKey(2)\n",
106
+ "key, subkey = random.split(key)"
107
+ ]
108
+ },
109
+ {
110
+ "cell_type": "markdown",
111
+ "id": "2bfbd766",
112
+ "metadata": {},
113
+ "source": [
114
+ "Create the neural network architecture for the PINN with `equinox`. Note that the output is 3, for the 3 populations."
115
+ ]
116
+ },
117
+ {
118
+ "cell_type": "code",
119
+ "execution_count": 5,
120
+ "id": "9396d007-04f1-4893-a3c8-c58c36845ee0",
121
+ "metadata": {},
122
+ "outputs": [],
123
+ "source": [
124
+ "eqx_list = (\n",
125
+ " (eqx.nn.Linear, 1, 64),\n",
126
+ " (jax.nn.tanh,),\n",
127
+ " (eqx.nn.Linear, 64, 64),\n",
128
+ " (jax.nn.tanh,),\n",
129
+ " (eqx.nn.Linear, 64, 64),\n",
130
+ " (jax.nn.tanh,),\n",
131
+ " (eqx.nn.Linear, 64, 64),\n",
132
+ " (jax.nn.tanh,),\n",
133
+ " (eqx.nn.Linear, 64, 64),\n",
134
+ " (jax.nn.tanh,),\n",
135
+ " (eqx.nn.Linear, 64, 3),\n",
136
+ " (jnp.exp,),\n",
137
+ ")\n",
138
+ "key, subkey = random.split(key)"
139
+ ]
140
+ },
141
+ {
142
+ "cell_type": "markdown",
143
+ "id": "0a5d567b",
144
+ "metadata": {},
145
+ "source": [
146
+ "Create a DataGenerator object"
147
+ ]
148
+ },
149
+ {
150
+ "cell_type": "code",
151
+ "execution_count": 6,
152
+ "id": "15088440",
153
+ "metadata": {},
154
+ "outputs": [],
155
+ "source": [
156
+ "nt = 5000\n",
157
+ "method = \"uniform\"\n",
158
+ "tmin = 0\n",
159
+ "tmax = 1\n",
160
+ "\n",
161
+ "Tmax = 30\n",
162
+ "key, subkey = random.split(key)\n",
163
+ "train_data = jinns.data.DataGeneratorODE(\n",
164
+ " key=subkey, nt=nt, tmin=tmin, tmax=tmax, temporal_batch_size=512, method=method\n",
165
+ ")"
166
+ ]
167
+ },
168
+ {
169
+ "cell_type": "markdown",
170
+ "id": "4f1ac783",
171
+ "metadata": {},
172
+ "source": [
173
+ "Initialize a **jinns** neural network"
174
+ ]
175
+ },
176
+ {
177
+ "cell_type": "code",
178
+ "execution_count": 7,
179
+ "id": "4fec8c54",
180
+ "metadata": {},
181
+ "outputs": [],
182
+ "source": [
183
+ "u, init_nn_params = jinns.nn.PINN_MLP.create(\n",
184
+ " key=subkey, eqx_list=eqx_list, eq_type=\"ODE\"\n",
185
+ ")"
186
+ ]
187
+ },
188
+ {
189
+ "cell_type": "markdown",
190
+ "id": "83b7faef",
191
+ "metadata": {},
192
+ "source": [
193
+ "### Model parameters\n",
194
+ "\n",
195
+ "\n"
196
+ ]
197
+ },
198
+ {
199
+ "cell_type": "code",
200
+ "execution_count": 8,
201
+ "id": "2f6b6656",
202
+ "metadata": {},
203
+ "outputs": [],
204
+ "source": [
205
+ "# initial conditions for each species\n",
206
+ "import numpy as onp\n",
207
+ "\n",
208
+ "N_0 = onp.array([10.0, 7.0, 4.0])\n",
209
+ "# growth rates for each species\n",
210
+ "growth_rates = jnp.array([0.1, 0.5, 0.8])\n",
211
+ "# carrying capacity for each species\n",
212
+ "carrying_capacities = jnp.array([0.04, 0.02, 0.02])\n",
213
+ "# interactions\n",
214
+ "# NOTE that interaction with oneself is 0\n",
215
+ "# NOTE minus sign\n",
216
+ "interactions = (\n",
217
+ " -jnp.array([0, 0.001, 0.001]),\n",
218
+ " -jnp.array([0.001, 0, 0.001]),\n",
219
+ " -jnp.array([0.001, 0.001, 0]),\n",
220
+ ")"
221
+ ]
222
+ },
223
+ {
224
+ "cell_type": "markdown",
225
+ "id": "a5a5ecb8",
226
+ "metadata": {},
227
+ "source": [
228
+ "Then, we proceed to define the set of parameters as required by the losses' `equation(self, ...)` methods. This is a `jinns.paramaters.Params` object, with two fields for\n",
229
+ " 1. `nn_params`: the neural network parameters \n",
230
+ " 2. `eq_params`: the equation parameters"
231
+ ]
232
+ },
233
+ {
234
+ "cell_type": "code",
235
+ "execution_count": 9,
236
+ "id": "7946039f",
237
+ "metadata": {},
238
+ "outputs": [],
239
+ "source": [
240
+ "init_params = jinns.parameters.Params(\n",
241
+ " nn_params=init_nn_params,\n",
242
+ " eq_params={\n",
243
+ " \"carrying_capacities\": carrying_capacities,\n",
244
+ " \"growth_rates\": growth_rates,\n",
245
+ " \"interactions\": interactions,\n",
246
+ " },\n",
247
+ ")"
248
+ ]
249
+ },
250
+ {
251
+ "cell_type": "markdown",
252
+ "id": "e595cbcd",
253
+ "metadata": {},
254
+ "source": [
255
+ "Visualize the output of the neural networks with the random initialization."
256
+ ]
257
+ },
258
+ {
259
+ "cell_type": "code",
260
+ "execution_count": 10,
261
+ "id": "d18c73d2-ff23-4019-a7a1-40cc023dbf53",
262
+ "metadata": {},
263
+ "outputs": [
264
+ {
265
+ "data": {
266
+ "text/plain": [
267
+ "<matplotlib.legend.Legend at 0x7e4db69abcd0>"
268
+ ]
269
+ },
270
+ "execution_count": 10,
271
+ "metadata": {},
272
+ "output_type": "execute_result"
273
+ },
274
+ {
275
+ "data": {
276
+ "image/png": "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n/zktNZGYAEAYDoZhhTyZudv2/Kk2OmcTFitVj3wwAO64YYbdOedd6qqqmrcbXp7e3XOOedMpsqMTDiwvPjii3rooYe0e/dudXR0aMuWLVq1atWY22zfvl1r167Vn//8Z1VXV2vdunVas2ZNYvl9992n+++/P2WbJUuW6O23355oeQAAmEvIKz1QmZ2//bXDkj1/QptcffXVqqur0/r16/XDH/5wzHWfeuop/c///I++973vTabKjEx4DMvAwICWL1+uzZs3Z7R+e3u7rrjiCq1YsUJtbW2666679LnPfU7PPfdcynrnnXeeOjo6Eq+XXnppoqUBAIApsGnTJj3xxBN66623Rl3nhRde0M0336zvf//7Ou+886a9pgn3sKxcuVIrV67MeP3HH39ctbW1+sY3viFJOuecc/TSSy/p4YcfVlNT01AhubkqLy+faDkAAJibLS/a05Gtv30SLrnkEjU1Nam5uTnljEjcjh07dOWVV+rhhx/WTTfdNMkiMzPtY1h27typxsbGlLampibdddddKW3vvPOOKisr5XQ61dDQoJaWFi1cuHDUzw0EAgoEAol5j8czpXUDADAlLJYJn5Yxg40bN6qurk5LlixJad++fbs++clPatOmTbr11ltPWT3TfllzZ2enysrKUtrKysrk8Xjk8/kkSfX19WptbdWzzz6r7373u2pvb9dHP/pR9fX1jfq5LS0tKioqSryqq6un9XsAADCbLF26VDfeeKMee+yxRNsLL7ygK664QnfeeaeuvfZadXZ2qrOzU8ePH5/2ekxxH5aVK1fqU5/6lJYtW6ampib99re/VU9Pj5566qlRt2lublZvb2/idfDgwVNYMQAAM9+GDRsUiUQS80888YS8Xq9aWlpUUVGReF1zzTXTXsu0nxIqLy9XV1dXSltXV5fcbrdcLlfabYqLi3XWWWdp7969o36uw+GQw+GY0loBAJitWltbR7QtWrQoZfhFa2tr2vVOhWnvYWloaNC2bdtS2p5//nk1NDSMuk1/f7/effddVVRUTHd5AADgNDDhwNLf36+2tja1tbVJil623NbWpgMHDkiKnqpJHjF822236b333tNXvvIVvf322/rOd76jp556SnfffXdinS9/+cvasWOH9u3bp5dffllXX321rFarrr/++kl+PQAAMBNM+JTQrl27tGLFisT82rVrJUmr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qb/9278ddd3+/n69++67+ru/+7uJlDct1ly8SBaLJTGehFACAMCpN+Ff3rVr12r16tX6q7/6K1100UV65JFHNDAwoJtvvlmSdNNNN2nBggVqaWmRJL366qs6dOiQ6urqdOjQId13332KRCL6yle+kvjML3/5y7ryyitVU1Ojw4cPa/369bJarbr++uun6GuevDv+5gPZLgEAgFlvwoHluuuu09GjR3Xvvfeqs7NTdXV1evbZZxMDcQ8cOKCcpKcO+/1+rVu3Tu+9954KCgp0+eWX69/+7d9UXFycWOf999/X9ddfr+7ubpWWluojH/mIXnnlFZWWlk7+GwIAgNPehO/DYlZmvw8LAAAYKdPfb+7PDgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATI/AAgAATG/CDz80q/gjkTweT5YrAQAAmYr/bo/3aMMZE1j6+vokSdXV1VmuBAAATFRfX5+KiopGXT5jntYciUR0+PBhFRYWymKxTNnnejweVVdX6+DBgzwFehzsq4lhf2WOfZU59lXm2FeZm859ZRiG+vr6VFlZqZyc0UeqzJgelpycHFVVVU3b57vdbg7oDLGvJob9lTn2VebYV5ljX2VuuvbVWD0rcQy6BQAApkdgAQAApkdgGYfD4dD69evlcDiyXYrpsa8mhv2VOfZV5thXmWNfZc4M+2rGDLoFAAAzFz0sAADA9AgsAADA9AgsAADA9AgsAADA9Ags49i8ebMWLVokp9Op+vp6/fGPf8x2SaZz3333yWKxpLzOPvvsbJdlCi+++KKuvPJKVVZWymKxaOvWrSnLDcPQvffeq4qKCrlcLjU2Nuqdd97JTrEmMN7+WrNmzYhj7bLLLstOsVnU0tKiD33oQyosLNT8+fO1atUq7dmzJ2Udv9+v22+/XfPmzVNBQYGuvfZadXV1Zani7MlkX3384x8fcVzddtttWao4u7773e9q2bJliRvENTQ06D//8z8Ty7N5XBFYxvDkk09q7dq1Wr9+vV577TUtX75cTU1NOnLkSLZLM53zzjtPHR0diddLL72U7ZJMYWBgQMuXL9fmzZvTLn/wwQf12GOP6fHHH9err76q/Px8NTU1ye/3n+JKzWG8/SVJl112Wcqx9vOf//wUVmgOO3bs0O23365XXnlF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",
277
+ "text/plain": [
278
+ "<Figure size 640x480 with 1 Axes>"
279
+ ]
280
+ },
281
+ "metadata": {},
282
+ "output_type": "display_data"
283
+ }
284
+ ],
285
+ "source": [
286
+ "vectorized_u_init = vmap(lambda t: u(t, init_params), (0), 0)\n",
287
+ "\n",
288
+ "plt.plot(\n",
289
+ " train_data.times.sort(axis=0) * Tmax,\n",
290
+ " vectorized_u_init(train_data.times.sort(axis=0))[:, 0],\n",
291
+ " label=\"N1\",\n",
292
+ ")\n",
293
+ "plt.plot(\n",
294
+ " train_data.times.sort(axis=0) * Tmax,\n",
295
+ " vectorized_u_init(train_data.times.sort(axis=0))[:, 1],\n",
296
+ " label=\"N2\",\n",
297
+ ")\n",
298
+ "plt.plot(\n",
299
+ " train_data.times.sort(axis=0) * Tmax,\n",
300
+ " vectorized_u_init(train_data.times.sort(axis=0))[:, 2],\n",
301
+ " label=\"N3\",\n",
302
+ ")\n",
303
+ "\n",
304
+ "plt.legend()"
305
+ ]
306
+ },
307
+ {
308
+ "cell_type": "markdown",
309
+ "id": "bbe7f24b",
310
+ "metadata": {},
311
+ "source": [
312
+ "## Loss construction"
313
+ ]
314
+ },
315
+ {
316
+ "cell_type": "markdown",
317
+ "id": "aa14a602-1b0e-4582-876e-99d0322c57a0",
318
+ "metadata": {},
319
+ "source": [
320
+ "We construct a LossODE for GeneralizedLotkaVolterra"
321
+ ]
322
+ },
323
+ {
324
+ "cell_type": "code",
325
+ "execution_count": 11,
326
+ "id": "b6a65062",
327
+ "metadata": {},
328
+ "outputs": [],
329
+ "source": [
330
+ "dynamic_loss = jinns.loss.GeneralizedLotkaVolterra(Tmax=Tmax)"
331
+ ]
332
+ },
333
+ {
334
+ "cell_type": "code",
335
+ "execution_count": 12,
336
+ "id": "22b2647f",
337
+ "metadata": {},
338
+ "outputs": [],
339
+ "source": [
340
+ "loss_weights = jinns.loss.LossWeightsODE(dyn_loss=1, initial_condition=1 * Tmax)\n",
341
+ "\n",
342
+ "loss = jinns.loss.LossODE(\n",
343
+ " u=u,\n",
344
+ " loss_weights=loss_weights,\n",
345
+ " dynamic_loss=dynamic_loss,\n",
346
+ " initial_condition=(float(tmin), jnp.array([N_0[0], N_0[1], N_0[2]])),\n",
347
+ " params=init_params,\n",
348
+ ")"
349
+ ]
350
+ },
351
+ {
352
+ "cell_type": "code",
353
+ "execution_count": 13,
354
+ "id": "5f5418d5-629f-4745-ad0f-3778020cc635",
355
+ "metadata": {},
356
+ "outputs": [
357
+ {
358
+ "name": "stdout",
359
+ "output_type": "stream",
360
+ "text": [
361
+ "total loss: 4466.4443359375\n",
362
+ "Individual losses: {'dyn_loss': '667.46', 'initial_condition': '126.63'}\n"
363
+ ]
364
+ }
365
+ ],
366
+ "source": [
367
+ "# Testing the loss function\n",
368
+ "train_data, batch = train_data.get_batch()\n",
369
+ "\n",
370
+ "losses_and_grad = jax.value_and_grad(loss.evaluate, 0, has_aux=True)\n",
371
+ "losses, grads = losses_and_grad(init_params, batch)\n",
372
+ "l_tot, d = losses\n",
373
+ "print(f\"total loss: {l_tot}\")\n",
374
+ "print(f\"Individual losses: { {key: f'{val:.2f}' for key, val in d.items()} }\")"
375
+ ]
376
+ },
377
+ {
378
+ "cell_type": "markdown",
379
+ "id": "64835b79-0bce-4f06-bd57-5ee051796663",
380
+ "metadata": {},
381
+ "source": [
382
+ "## Learning the neural network parameters\n",
383
+ "\n",
384
+ "The learning process here considers known equation parameters `eq_params`. We thus only update `nn_params`.\n",
385
+ "\n",
386
+ "In the following cells, we define the necessary object for optimization of the \n",
387
+ "`loss` we just defined. Namely, an `optax.GradientTransformation` which is the optimizer we'll use for \n",
388
+ "updating `params` throughout. Here it is simply Adam with an exponential weight decay.\n"
389
+ ]
390
+ },
391
+ {
392
+ "cell_type": "code",
393
+ "execution_count": 14,
394
+ "id": "4e2c75a4-e3de-4d10-9424-4ee4ae206da3",
395
+ "metadata": {},
396
+ "outputs": [],
397
+ "source": [
398
+ "params = init_params"
399
+ ]
400
+ },
401
+ {
402
+ "cell_type": "code",
403
+ "execution_count": 15,
404
+ "id": "8d0106ad-d1e4-4fa8-958d-c8ebd4572d76",
405
+ "metadata": {},
406
+ "outputs": [],
407
+ "source": [
408
+ "# Optimizer\n",
409
+ "import optax\n",
410
+ "\n",
411
+ "start_learning_rate = 1e-3\n",
412
+ "# Exponential decay of the learning rate.\n",
413
+ "scheduler = optax.exponential_decay(\n",
414
+ " init_value=start_learning_rate,\n",
415
+ " transition_begin=5000,\n",
416
+ " transition_steps=100,\n",
417
+ " decay_rate=0.99,\n",
418
+ ")\n",
419
+ "\n",
420
+ "tx = optax.chain(\n",
421
+ " optax.scale_by_adam(), # Use the updates from adam.\n",
422
+ " optax.scale_by_schedule(scheduler), # Use the learning rate from the scheduler.\n",
423
+ " # Scale updates by -1 since optax.apply_updates is additive and we want to descend on the loss.\n",
424
+ " optax.scale(-1.0),\n",
425
+ ")"
426
+ ]
427
+ },
428
+ {
429
+ "cell_type": "code",
430
+ "execution_count": 16,
431
+ "id": "055a7e63-4d0e-4246-b792-2007a0deeaab",
432
+ "metadata": {},
433
+ "outputs": [],
434
+ "source": [
435
+ "n_iter = int(25000)"
436
+ ]
437
+ },
438
+ {
439
+ "cell_type": "code",
440
+ "execution_count": 17,
441
+ "id": "9284d4ed",
442
+ "metadata": {},
443
+ "outputs": [],
444
+ "source": [
445
+ "key, subkey = random.split(key)"
446
+ ]
447
+ },
448
+ {
449
+ "cell_type": "code",
450
+ "execution_count": 18,
451
+ "id": "df0ab21d-bfc1-4e81-8708-df8b30d0173b",
452
+ "metadata": {},
453
+ "outputs": [
454
+ {
455
+ "name": "stdout",
456
+ "output_type": "stream",
457
+ "text": [
458
+ "Initialization time: 2.264939069747925\n",
459
+ "\n",
460
+ "Compilation took\n",
461
+ " 5.612658262252808 \n",
462
+ "\n",
463
+ "[train] Iteration 0: loss value = 4466.54931640625\n",
464
+ "[train] Iteration 1000: loss value = 237.7439727783203\n",
465
+ "[train] Iteration 2000: loss value = 137.75143432617188\n",
466
+ "[train] Iteration 3000: loss value = 93.12828063964844\n",
467
+ "[train] Iteration 4000: loss value = 50.614898681640625\n",
468
+ "[train] Iteration 5000: loss value = 31.16500473022461\n",
469
+ "[train] Iteration 6000: loss value = 19.59442710876465\n",
470
+ "[train] Iteration 7000: loss value = 12.085222244262695\n",
471
+ "[train] Iteration 8000: loss value = 7.334090232849121\n",
472
+ "[train] Iteration 9000: loss value = 6.363088130950928\n",
473
+ "[train] Iteration 10000: loss value = 3.878598928451538\n",
474
+ "[train] Iteration 11000: loss value = 2.159217596054077\n",
475
+ "[train] Iteration 12000: loss value = 1.4222497940063477\n",
476
+ "[train] Iteration 13000: loss value = 2.4902212619781494\n",
477
+ "[train] Iteration 14000: loss value = 0.9382096529006958\n",
478
+ "[train] Iteration 15000: loss value = 0.34892794489860535\n",
479
+ "[train] Iteration 16000: loss value = 0.12134893983602524\n",
480
+ "[train] Iteration 17000: loss value = 0.8341091275215149\n",
481
+ "[train] Iteration 18000: loss value = 0.44106370210647583\n",
482
+ "[train] Iteration 19000: loss value = 0.05247867852449417\n",
483
+ "[train] Iteration 20000: loss value = 0.03282078355550766\n",
484
+ "[train] Iteration 21000: loss value = 0.01538669504225254\n",
485
+ "[train] Iteration 22000: loss value = 0.004614260047674179\n",
486
+ "[train] Iteration 23000: loss value = 0.00442978460341692\n",
487
+ "[train] Iteration 24000: loss value = 0.0018984810449182987\n",
488
+ "\n",
489
+ "Stopping main optimization loop, cause: max iteration is reached\n",
490
+ "\n",
491
+ "Training took\n",
492
+ " 36.406750440597534 \n",
493
+ "\n",
494
+ "\n",
495
+ "Final iteration 25000: train loss value = 0.0023585441522300243\n"
496
+ ]
497
+ }
498
+ ],
499
+ "source": [
500
+ "params, total_loss_list, loss_by_term_dict, data, loss, _, _, _, _, _ = jinns.solve(\n",
501
+ " init_params=params, data=train_data, optimizer=tx, loss=loss, n_iter=n_iter\n",
502
+ ")"
503
+ ]
504
+ },
505
+ {
506
+ "cell_type": "markdown",
507
+ "id": "1d0a1757",
508
+ "metadata": {},
509
+ "source": [
510
+ "## Results"
511
+ ]
512
+ },
513
+ {
514
+ "cell_type": "markdown",
515
+ "id": "64c794ff",
516
+ "metadata": {},
517
+ "source": [
518
+ "Plot the loss values"
519
+ ]
520
+ },
521
+ {
522
+ "cell_type": "code",
523
+ "execution_count": 19,
524
+ "id": "2cd778b4-d9d9-4f69-ad02-2a3f7eacf59d",
525
+ "metadata": {
526
+ "scrolled": true
527
+ },
528
+ "outputs": [
529
+ {
530
+ "data": {
531
+ "image/png": "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",
532
+ "text/plain": [
533
+ "<Figure size 640x480 with 1 Axes>"
534
+ ]
535
+ },
536
+ "metadata": {},
537
+ "output_type": "display_data"
538
+ }
539
+ ],
540
+ "source": [
541
+ "for loss_name, loss_values in loss_by_term_dict.items():\n",
542
+ " plt.plot(jnp.log10(loss_values), label=loss_name)\n",
543
+ "plt.plot(jnp.log10(total_loss_list), label=\"total loss\")\n",
544
+ "plt.legend()\n",
545
+ "plt.show()"
546
+ ]
547
+ },
548
+ {
549
+ "cell_type": "markdown",
550
+ "id": "a6247171",
551
+ "metadata": {},
552
+ "source": [
553
+ "Plot the ODE solutions learned by the PINN"
554
+ ]
555
+ },
556
+ {
557
+ "cell_type": "code",
558
+ "execution_count": 20,
559
+ "id": "6d473743-c9a8-4406-b18c-256496cfde59",
560
+ "metadata": {},
561
+ "outputs": [
562
+ {
563
+ "data": {
564
+ "text/plain": [
565
+ "<Axes: xlabel='t'>"
566
+ ]
567
+ },
568
+ "execution_count": 20,
569
+ "metadata": {},
570
+ "output_type": "execute_result"
571
+ },
572
+ {
573
+ "data": {
574
+ "image/png": "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",
575
+ "text/plain": [
576
+ "<Figure size 640x480 with 1 Axes>"
577
+ ]
578
+ },
579
+ "metadata": {},
580
+ "output_type": "display_data"
581
+ }
582
+ ],
583
+ "source": [
584
+ "import pandas as pd\n",
585
+ "\n",
586
+ "u_est = vmap(lambda t: u(t, params), (0), 0)\n",
587
+ "\n",
588
+ "key, subkey = random.split(key, 2)\n",
589
+ "val_data = jinns.data.DataGeneratorODE(\n",
590
+ " key=subkey, nt=nt, tmin=tmin, tmax=tmax, method=method\n",
591
+ ")\n",
592
+ "\n",
593
+ "ts = val_data.times.sort(axis=0).squeeze()\n",
594
+ "df = pd.DataFrame(\n",
595
+ " {\n",
596
+ " \"t\": ts * Tmax, # rescale time for plotting\n",
597
+ " \"N1\": u_est(ts)[:, 0],\n",
598
+ " \"N2\": u_est(ts)[:, 1],\n",
599
+ " \"N3\": u_est(ts)[:, 2],\n",
600
+ " \"Method\": \"PINN\",\n",
601
+ " },\n",
602
+ ")\n",
603
+ "df.plot(x=\"t\")"
604
+ ]
605
+ },
606
+ {
607
+ "cell_type": "markdown",
608
+ "id": "aed49c41",
609
+ "metadata": {},
610
+ "source": [
611
+ "## Compare with the scipy solver\n",
612
+ "Code from Lorenzo Sala"
613
+ ]
614
+ },
615
+ {
616
+ "cell_type": "code",
617
+ "execution_count": 21,
618
+ "id": "484380a5",
619
+ "metadata": {},
620
+ "outputs": [],
621
+ "source": [
622
+ "import numpy as np\n",
623
+ "from scipy.integrate import odeint\n",
624
+ "\n",
625
+ "# NOTE the following line is not accurate as it skips one batch\n",
626
+ "\n",
627
+ "\n",
628
+ "def lotka_volterra_log(y_log, t, eq_params):\n",
629
+ " \"\"\"\n",
630
+ " Generalized Lotka-Volterra model for N bacterial species, with logarithmic transformation for stability.\n",
631
+ "\n",
632
+ " Parameters:\n",
633
+ " y_log (array): Array of log-transformed bacterial populations.\n",
634
+ " t (float): Time.\n",
635
+ " params (tuple): Tuple of model parameters.\n",
636
+ "\n",
637
+ " Returns:\n",
638
+ " dydt (array): Array of derivative of log-transformed bacterial populations with respect to time.\n",
639
+ " \"\"\"\n",
640
+ " alpha, beta, gamma, _ = eq_params\n",
641
+ " N = len(y_log)\n",
642
+ " y = np.exp(y_log)\n",
643
+ " dydt = np.zeros(N)\n",
644
+ "\n",
645
+ " for i in range(N):\n",
646
+ " dydt[i] = y[i] * (\n",
647
+ " alpha[i]\n",
648
+ " - beta[i] * np.sum(y)\n",
649
+ " - np.sum([gamma[j][i] * y[j] for j in range(N)])\n",
650
+ " )\n",
651
+ "\n",
652
+ " dydt_log = dydt / y\n",
653
+ "\n",
654
+ " return dydt_log\n",
655
+ "\n",
656
+ "\n",
657
+ "# Define name bacteria\n",
658
+ "names = [\"N1\", \"N2\", \"N3\"]\n",
659
+ "N = len(names)\n",
660
+ "\n",
661
+ "# Define model parameters\n",
662
+ "death_rates = None\n",
663
+ "eq_params = (growth_rates, carrying_capacities, interactions, death_rates)\n",
664
+ "\n",
665
+ "# Define initial bacterial populations\n",
666
+ "y0 = [10, 7, 4]\n",
667
+ "\n",
668
+ "# Define time points\n",
669
+ "Tmax = 30\n",
670
+ "t = ts * Tmax\n",
671
+ "\n",
672
+ "############################\n",
673
+ "\n",
674
+ "y0_log = np.log(y0)\n",
675
+ "y_log = odeint(lotka_volterra_log, y0_log, t, args=(eq_params,))\n",
676
+ "y = np.exp(y_log)"
677
+ ]
678
+ },
679
+ {
680
+ "cell_type": "code",
681
+ "execution_count": 22,
682
+ "id": "69d5f147",
683
+ "metadata": {},
684
+ "outputs": [],
685
+ "source": [
686
+ "# comparative plots\n",
687
+ "df_scipy = pd.DataFrame(\n",
688
+ " {\n",
689
+ " \"t\": ts * Tmax, # rescale time for plotting\n",
690
+ " \"Method\": \"Scipy solver\",\n",
691
+ " }\n",
692
+ " | {f\"N{i + 1}\": y[:, i] for i in range(3)},\n",
693
+ ")"
694
+ ]
695
+ },
696
+ {
697
+ "cell_type": "code",
698
+ "execution_count": 23,
699
+ "id": "692d66b9",
700
+ "metadata": {},
701
+ "outputs": [
702
+ {
703
+ "data": {
704
+ "text/plain": [
705
+ "<seaborn.axisgrid.FacetGrid at 0x7e4c6c75b810>"
706
+ ]
707
+ },
708
+ "execution_count": 23,
709
+ "metadata": {},
710
+ "output_type": "execute_result"
711
+ },
712
+ {
713
+ "data": {
714
+ "image/png": "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WLGifH9I5cDSJUyWLVsW6HYGuOeeewAYNmwYr7zyCqtWrWLatGlkZWWRlJREnz59eOyxx045YErldcd3d2BiEmwP5oULX7C6HBERERGpxhISErjkkkuYOnUqpmlyySWXUKNGjcD+jRs3UlBQwEUXXVTiccXFxSWG1B5P27ZtS9yvXbs2+/btA2DdunUkJyeXmJC0ZcuWxMTEsG7dOjp16sS6deuOmpyoW7du/PDDD6f9vVYGlobMHj16cKKO1NmzZ1dgNVJRZm6Yyd4C/xj0x859jLCgMIsrEhEREZHq7sYbb2TkyJEAJXoMwT/CEuDLL7+kTp06JfadSgeXw+Eocd8wDHw+398pt0qrUtdkStWXVZTFs7/6J/jp36A//Rv0t7giERERETkT9OvXj+LiYtxuN3379i2xr2XLlgQHB7N9+3YaN25c4na4B9LpdAKccDnFY2nRogU7duwoserF2rVrycrKomXLloE2S5YsKfG4xYsXn/b3WFlY2pMpZ55JSyeRWZRJ45jGPH7u41aXIyIiIiJnCLvdzrp16wJfHykyMpL77ruP0aNH4/P5OO+888jOzuann34iKiqKYcOGUa9ePQzDYNasWVx88cWEhoYSERFx0uft3bs3bdq04dprr+W5557D4/Fwxx13cMEFF3D22WcDcPfdd5OamsrZZ5/Nueeey/Tp0/n9999p2LBqLu+nnkypMFN+m8KXm7/EwODRcx7FaXdaXZKIiIiInEFOtMThY489xtixY5k4cSItWrSgX79+fPnllzRo0ACAOnXqMGHCBB588EFq1aoVGHp7MoZh8L///Y/Y2Fi6d+9O7969adiwIR988EGgzVVXXcXYsWO5//77Oeuss9i2bRvDhw//+9+wRSydXbYiaHbZymF3/m76fdIPn+mjTY02zLhkhtUliYiIiIhIOVBPplSIW7+9FZ/pI8gI4uULq+6aPyIiIiIicmIKmVLu3lj9BltztgJwf6f7iQmJsbQeEREREREpPwqZUq725u/lxd9eBKBpbFOuaXGNxRWJiIiIiEh5UsiUcnXztzfjNb3YDTuv9X7N6nJERERERKScKWRKuXllxSuBYbL/6vQvaoTVsLYgEREREREpdwqZUi6yXdl8kOaflrlFXAuubXGtxRWJiIiIiEhFUMiUcvHkkifJKMqgQXQD3ur7ltXliIiIiIhIBVHI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yF9U+pB51VVXsX//fh555BH27NlD+/bt+eabb6hVq5bVpYmIiIiIiMhfVOprMsuCljARERERERGpOJX6mkwRERERERGpWhQyRUREREREpMwoZIqIiIiIiEiZUcgUERERERGRMqOQKSIiIiIiImVGIVNERERERETKjEKmiIiIiIiIlBmFTBERERERESkzQVYXUN5M0wQgJyfH4kpERERERCq/yMhIDMOwugypwqp9yMzNzQUgOTnZ4kpERERERCq/7OxsoqKirC5DqjDDPNzVV035fD7S09Mt+4tMTk4OycnJ7NixQ2/WKkLnrOrROat6dM6qHp2zqkfnrOqpLOdMPZnyd1X7nkybzUbdunWtLoOoqCj9gq9idM6qHp2zqkfnrOrROat6dM6qHp0zqeo08Y+IiIiIiIiUGYVMERERERERKTMKmeUsODiYcePGERwcbHUpcop0zqoenbOqR+es6tE5q3p0zqoenTOpLqr9xD8iIiIiIiJScdSTKSIiIiIiImVGIVNERERERETKjEKmiIiIiIiIlBmFzHI2ZcoU6tevT0hICF26dOGXX36xuiQ5jvHjx2MYRolb8+bNrS5LjrBgwQIGDBhAUlIShmEwc+bMEvtN0+SRRx6hdu3ahIaG0rt3bzZs2GBNsQKc/JylpqYe9b7r16+fNcUKEydOpFOnTkRGRlKzZk0GDRpEWlpaiTZFRUWMGDGC+Ph4IiIiGDJkCHv37rWoYjmVc9ajR4+j3me33367RRXLK6+8Qtu2bQNrYXbr1o2vv/46sF/vMakOFDLL0QcffMA999zDuHHj+PXXX2nXrh19+/Zl3759Vpcmx9GqVSt2794duP34449WlyRHyM/Pp127dkyZMuWY+5966ileeOEFXn31VZYsWUJ4eDh9+/alqKiogiuVw052zgD69etX4n333nvvVWCFcqT58+czYsQIFi9ezJw5c3C73fTp04f8/PxAm9GjR/PFF1/w0UcfMX/+fNLT0xk8eLCFVZ/ZTuWcAdxyyy0l3mdPPfWURRVL3bp1mTRpEsuXL2fZsmX06tWLgQMH8vvvvwN6j0k1YUq56dy5szlixIjAfa/XayYlJZkTJ060sCo5nnHjxpnt2rWzugw5RYD52WefBe77fD4zMTHRfPrppwPbsrKyzODgYPO9996zoEL5q7+eM9M0zWHDhpkDBw60pB45uX379pmAOX/+fNM0/e8ph8NhfvTRR4E269atMwFz0aJFVpUpR/jrOTNN07zgggvMu+++27qi5KRiY2PN//73v3qPSbWhnsxyUlxczPLly+ndu3dgm81mo3fv3ixatMjCyuRENmzYQFJSEg0bNuTaa69l+/btVpckp2jLli3s2bOnxHsuOjqaLl266D1Xyc2bN4+aNWvSrFkzhg8fTkZGhtUlySHZ2dkAxMXFAbB8+XLcbneJ91nz5s1JSUnR+6yS+Os5O2z69OnUqFGD1q1bM2bMGAoKCqwoT/7C6/Xy/vvvk5+fT7du3fQek2ojyOoCqqsDBw7g9XqpVatWie21atXijz/+sKgqOZEuXbowdepUmjVrxu7du5kwYQLnn38+a9asITIy0ury5CT27NkDcMz33OF9Uvn069ePwYMH06BBAzZt2sRDDz1E//79WbRoEXa73eryzmg+n49Ro0Zx7rnn0rp1a8D/PnM6ncTExJRoq/dZ5XCscwYwdOhQ6tWrR1JSEqtWreKBBx4gLS2NTz/91MJqz2yrV6+mW7duFBUVERERwWeffUbLli1ZsWKF3mNSLShkihzSv3//wNdt27alS5cu1KtXjw8//JCbbrrJwspEqq+rr7468HWbNm1o27YtjRo1Yt68eVx44YUWViYjRoxgzZo1uja9CjneObv11lsDX7dp04batWtz4YUXsmnTJho1alTRZQrQrFkzVqxYQXZ2Nh9//DHDhg1j/vz5VpclUmY0XLac1KhRA7vdftRsYHv37iUxMdGiquR0xMTE0LRpUzZu3Gh1KXIKDr+v9J6r2ho2bEiNGjX0vrPYyJEjmTVrFj/88AN169YNbE9MTKS4uJisrKwS7fU+s97xztmxdOnSBUDvMws5nU4aN27MWWedxcSJE2nXrh3PP/+83mNSbShklhOn08lZZ53F3LlzA9t8Ph9z586lW7duFlYmpyovL49NmzZRu3Ztq0uRU9CgQQMSExNLvOdycnJYsmSJ3nNVyM6dO8nIyND7ziKmaTJy5Eg+++wzvv/+exo0aFBi/1lnnYXD4SjxPktLS2P79u16n1nkZOfsWFasWAGg91kl4vP5cLlceo9JtaHhsuXonnvuYdiwYZx99tl07tyZ5557jvz8fG644QarS5NjuO+++xgwYAD16tUjPT2dcePGYbfbueaaa6wuTQ7Jy8sr8Zf3LVu2sGLFCuLi4khJSWHUqFE8/vjjNGnShAYNGjB27FiSkpIYNGiQdUWf4U50zuLi4pgwYQJDhgwhMTGRTZs2cf/999O4cWP69u1rYdVnrhEjRjBjxgz+97//ERkZGbgGLDo6mtDQUKKjo7npppu45557iIuLIyoqijvvvJNu3brRtWtXi6s/M53snG3atIkZM2Zw8cUXEx8fz6pVqxg9ejTdu3enbdu2Fld/ZhozZgz9+/cnJSWF3NxcZsyYwbx585g9e7beY1J9WD29bXX34osvmikpKabT6TQ7d+5sLl682OqS5Diuuuoqs3bt2qbT6TTr1KljXnXVVebGjRutLkuO8MMPP5jAUbdhw4aZpulfxmTs2LFmrVq1zODgYPPCCy8009LSrC36DHeic1ZQUGD26dPHTEhIMB0Oh1mvXj3zlltuMffs2WN12WesY50rwHzrrbcCbQoLC8077rjDjI2NNcPCwszLL7/c3L17t3VFn+FOds62b99udu/e3YyLizODg4PNxo0bm//617/M7Oxsaws/g914441mvXr1TKfTaSYkJJgXXnih+e233wb26z0m1YFhmqZZkaFWREREREREqi9dkykiIiIiIiJlRiFTREREREREyoxCpoiIiIiIiJQZhUwREREREREpMwqZIiIiIiIiUmYUMkVERERERKTMKGSKiIiIiIhImVHIFBERERERkTKjkCkiIiIiIiJlRiFTREQqXI8ePRg1apTVZYiIiEg5UMgUERERERGRMmOYpmlaXYSIiJw5UlNTmTZtWoltW7ZsoX79+tYUJCIiImVKIVNERCpUdnY2/fv3p3Xr1jz66KMAJCQkYLfbLa5MREREykKQ1QWIiMiZJTo6GqfTSVhYGImJiVaXIyIiImVM12SKiIiIiIhImVHIFBERERERkTKjkCkiIhXO6XTi9XqtLkNERETKgUKmiIhUuPr167NkyRK2bt3KgQMH8Pl8VpckIiIiZUQhU0REKtx9992H3W6nZcuWJCQksH37dqtLEhERkTKiJUxERERERESkzKgnU0RERERERMqMQqaIiIiIiIiUGYVMERERERERKTMKmSIiIiIiIlJmFDJFRERERESkzChkioiIiIiISJlRyBQREREREZEyo5ApIiIiIiIiZUYhU0RERERERMqMQqaIiIiIiIiUGYVMERERERERKTMKmSIiIiIiIlJm/j+onQyq79GwsQAAAABJRU5ErkJggg==",
715
+ "text/plain": [
716
+ "<Figure size 933.75x400 with 1 Axes>"
717
+ ]
718
+ },
719
+ "metadata": {},
720
+ "output_type": "display_data"
721
+ }
722
+ ],
723
+ "source": [
724
+ "import seaborn as sns\n",
725
+ "\n",
726
+ "df_plot = pd.concat((df, df_scipy)).melt(\n",
727
+ " id_vars=[\"Method\", \"t\"], var_name=\"Population\", value_name=\"Solution\"\n",
728
+ ")\n",
729
+ "sns.relplot(\n",
730
+ " df_plot,\n",
731
+ " kind=\"line\",\n",
732
+ " x=\"t\",\n",
733
+ " y=\"Solution\",\n",
734
+ " hue=\"Population\",\n",
735
+ " style=\"Method\",\n",
736
+ " height=4,\n",
737
+ " aspect=2,\n",
738
+ ")"
739
+ ]
740
+ },
741
+ {
742
+ "cell_type": "markdown",
743
+ "id": "94a9d06f",
744
+ "metadata": {},
745
+ "source": [
746
+ "# Conclusion\n",
747
+ "\n",
748
+ "We have shown how to use `LossODE` for system of ODEs. The results are satisfying although they could be improved by tweaking the network's architecture, learning rate and optimizers. Obviously, in the simple *forward problem* setting, the approach is not competitive compared to more standard and basic approaches. However, it paves the way for using PINN in an *inverse problem* when we have partial observation of the solution and wish to learn `params.eq_params`."
749
+ ]
750
+ },
751
+ {
752
+ "cell_type": "code",
753
+ "execution_count": null,
754
+ "id": "647e98b2-7c55-420f-ac07-c28e4d85c1c7",
755
+ "metadata": {},
756
+ "outputs": [],
757
+ "source": []
758
+ }
759
+ ],
760
+ "metadata": {
761
+ "kernelspec": {
762
+ "display_name": "Python 3 (ipykernel)",
763
+ "language": "python",
764
+ "name": "python3"
765
+ },
766
+ "language_info": {
767
+ "codemirror_mode": {
768
+ "name": "ipython",
769
+ "version": 3
770
+ },
771
+ "file_extension": ".py",
772
+ "mimetype": "text/x-python",
773
+ "name": "python",
774
+ "nbconvert_exporter": "python",
775
+ "pygments_lexer": "ipython3",
776
+ "version": "3.11.11"
777
+ },
778
+ "vscode": {
779
+ "interpreter": {
780
+ "hash": "991718e94fb5d91fa62c7598521d2199c208ff1ff700f1ac060f334be0bee194"
781
+ }
782
+ }
783
+ },
784
+ "nbformat": 4,
785
+ "nbformat_minor": 5
786
+ }