diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml index 85de33a9..e3a05105 100644 --- a/.github/workflows/python-test.yml +++ b/.github/workflows/python-test.yml @@ -125,6 +125,7 @@ jobs: python -m pip install flake8 pytest pip install .[pyabc,pymoo,interactive,numpyro] pip install -e case_studies/lotka_volterra_case_study + pip install -e case_studies/lotka_volterra_UDE_case_study - name: Lint with flake8 if: env.full-test == 'true' && needs.decide-to-test.outputs.changes == 'true' && needs.decide-to-test.outputs.tagged_commit == 'false' && github.event_name == 'pull_request' diff --git a/.gitignore b/.gitignore index c19a5915..8f743839 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,8 @@ build .env +hyperparams + # linked case studies bufferguts guts_base diff --git a/case_studies/lotka_volterra_UDE_case_study/.gitignore b/case_studies/lotka_volterra_UDE_case_study/.gitignore new file mode 100644 index 00000000..5847c610 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/.gitignore @@ -0,0 +1,5 @@ +__pycache__ +results +*.code-workspace +*.egg-info +scripts/case_studies \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/.pre-commit-config.yaml b/case_studies/lotka_volterra_UDE_case_study/.pre-commit-config.yaml new file mode 100644 index 00000000..3104612c --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/.pre-commit-config.yaml @@ -0,0 +1,15 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + - id: check-toml + +- repo: local + hooks: + - id: pytest-check + name: pytest-check + entry: test.sh + language: script + pass_filenames: false + always_run: true \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/__init__.py b/case_studies/lotka_volterra_UDE_case_study/__init__.py new file mode 100644 index 00000000..d538f87e --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/__init__.py @@ -0,0 +1 @@ +__version__ = "1.0.0" \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/data/UDE_obs_inferer_test.nc b/case_studies/lotka_volterra_UDE_case_study/data/UDE_obs_inferer_test.nc new file mode 100644 index 00000000..92c86305 Binary files /dev/null and b/case_studies/lotka_volterra_UDE_case_study/data/UDE_obs_inferer_test.nc differ diff --git a/case_studies/lotka_volterra_UDE_case_study/data/UDE_obs_solver_test.nc b/case_studies/lotka_volterra_UDE_case_study/data/UDE_obs_solver_test.nc new file mode 100644 index 00000000..a173b79e Binary files /dev/null and b/case_studies/lotka_volterra_UDE_case_study/data/UDE_obs_solver_test.nc differ diff --git a/case_studies/lotka_volterra_UDE_case_study/interactive.ipynb b/case_studies/lotka_volterra_UDE_case_study/interactive.ipynb new file mode 100644 index 00000000..17545eae --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/interactive.ipynb @@ -0,0 +1,482 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "890baa7f", + "metadata": {}, + "outputs": [], + "source": [ + "from pymob import Config\n", + "\n", + "from lotka_volterra_UDE_case_study.sim import UDESimulation, UDESimulation2" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b41179b1", + "metadata": {}, + "outputs": [], + "source": [ + "from lotka_volterra_UDE_case_study.mod import *\n", + "\n", + "key = jr.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jr.split(key, 3)\n", + "\n", + "func = Func(2,5,3,key=model_key,theta_true=(alpha,gamma))\n", + "func = setFuncWeightsAndBias(func, weights, bias, key=model_key)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "285eea70", + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Non-hashable static arguments are not supported. An error occurred during a call to '__call__' while trying to hash an object of type , Func(\n mlp=MLP(\n layers=(\n Linear(\n weight=f32[5,2],\n bias=f32[5],\n in_features=2,\n out_features=5,\n use_bias=True\n ),\n Linear(\n weight=f32[5,5],\n bias=f32[5],\n in_features=5,\n out_features=5,\n use_bias=True\n ),\n Linear(\n weight=f32[5,5],\n bias=f32[5],\n in_features=5,\n out_features=5,\n use_bias=True\n ),\n Linear(\n weight=f32[2,5],\n bias=f32[2],\n in_features=5,\n out_features=2,\n use_bias=True\n )\n ),\n activation=,\n final_activation=>,\n use_bias=True,\n use_final_bias=True,\n in_size=2,\n out_size=2,\n width_size=5,\n depth=3\n ),\n theta_true=(0.5, 0.2)\n). The error was:\nTypeError: unhashable type: 'ArrayImpl'\n\nAt:\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\equinox\\_module.py(1073): __hash__\n C:\\Users\\Markus\\AppData\\Local\\Temp\\ipykernel_1104\\4278677127.py(1): \n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3548): run_code\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3488): run_ast_nodes\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3306): run_cell_async\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\async_helpers.py(129): _pseudo_sync_runner\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3101): _run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3046): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\zmqshell.py(549): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(449): do_execute\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(778): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(362): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(437): dispatch_shell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(534): process_one\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(545): dispatch_queue\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\events.py(84): _run\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(1936): _run_once\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(608): run_forever\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\tornado\\platform\\asyncio.py(205): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelapp.py(739): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\traitlets\\config\\application.py(1075): launch_instance\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel_launcher.py(18): \n (88): _run_code\n (198): _run_module_as_main\n\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[9], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28mcallable\u001b[39m(\u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m)\n", + "\u001b[1;31mValueError\u001b[0m: Non-hashable static arguments are not supported. An error occurred during a call to '__call__' while trying to hash an object of type , Func(\n mlp=MLP(\n layers=(\n Linear(\n weight=f32[5,2],\n bias=f32[5],\n in_features=2,\n out_features=5,\n use_bias=True\n ),\n Linear(\n weight=f32[5,5],\n bias=f32[5],\n in_features=5,\n out_features=5,\n use_bias=True\n ),\n Linear(\n weight=f32[5,5],\n bias=f32[5],\n in_features=5,\n out_features=5,\n use_bias=True\n ),\n Linear(\n weight=f32[2,5],\n bias=f32[2],\n in_features=5,\n out_features=2,\n use_bias=True\n )\n ),\n activation=,\n final_activation=>,\n use_bias=True,\n use_final_bias=True,\n in_size=2,\n out_size=2,\n width_size=5,\n depth=3\n ),\n theta_true=(0.5, 0.2)\n). The error was:\nTypeError: unhashable type: 'ArrayImpl'\n\nAt:\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\equinox\\_module.py(1073): __hash__\n C:\\Users\\Markus\\AppData\\Local\\Temp\\ipykernel_1104\\4278677127.py(1): \n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3548): run_code\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3488): run_ast_nodes\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3306): run_cell_async\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\async_helpers.py(129): _pseudo_sync_runner\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3101): _run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3046): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\zmqshell.py(549): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(449): do_execute\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(778): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(362): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(437): dispatch_shell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(534): process_one\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(545): dispatch_queue\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\events.py(84): _run\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(1936): _run_once\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(608): run_forever\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\tornado\\platform\\asyncio.py(205): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelapp.py(739): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\traitlets\\config\\application.py(1075): launch_instance\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel_launcher.py(18): \n (88): _run_code\n (198): _run_module_as_main\n\n" + ] + } + ], + "source": [ + "callable(func())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6e1009c4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(variable=rabbits, min=5.968110437683305, max=86.99133665713266)\n", + "MinMaxScaler(variable=wolves, min=7.203778019337644, max=62.829641338400535)\n", + "Results directory exists at 'c:\\Users\\Markus\\lotka_volterra_UDE_case_study\\results\\test_scenario_v2'.\n", + "Scenario directory exists at 'c:\\Users\\Markus\\lotka_volterra_UDE_case_study\\scenarios\\test_scenario_v2'.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\simulation.py:554: UserWarning: The number of ODE states was not specified in the config file [simulation] > 'n_ode_states = ' and could not be extracted from the return arguments.\n", + " warnings.warn(\n" + ] + }, + { + "ename": "TypeError", + "evalue": "unhashable type: 'ArrayImpl'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[5], line 5\u001b[0m\n\u001b[0;32m 2\u001b[0m config\u001b[38;5;241m.\u001b[39mcase_study\u001b[38;5;241m.\u001b[39mpackage \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m../..\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 4\u001b[0m sim \u001b[38;5;241m=\u001b[39m UDESimulation2(config)\n\u001b[1;32m----> 5\u001b[0m \u001b[43msim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msetup\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\simulation.py:262\u001b[0m, in \u001b[0;36mSimulationBase.setup\u001b[1;34m(self, **evaluator_kwargs)\u001b[0m\n\u001b[0;32m 257\u001b[0m \u001b[38;5;66;03m# TODO: set up logger\u001b[39;00m\n\u001b[0;32m 258\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparameterize \u001b[38;5;241m=\u001b[39m partial(\n\u001b[0;32m 259\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparameterize, \n\u001b[0;32m 260\u001b[0m model_parameters\u001b[38;5;241m=\u001b[39mcopy\u001b[38;5;241m.\u001b[39mdeepcopy(\u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_parameters))\n\u001b[0;32m 261\u001b[0m )\n\u001b[1;32m--> 262\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdispatch_constructor\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\simulation.py:716\u001b[0m, in \u001b[0;36mSimulationBase.dispatch_constructor\u001b[1;34m(self, **evaluator_kwargs)\u001b[0m\n\u001b[0;32m 713\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m:\n\u001b[0;32m 714\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[1;32m--> 716\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mevaluator \u001b[38;5;241m=\u001b[39m \u001b[43mEvaluator\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 717\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 718\u001b[0m \u001b[43m \u001b[49m\u001b[43msolver\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msolver\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 719\u001b[0m \u001b[43m \u001b[49m\u001b[43mparameter_dims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparameter_dims\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 720\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdimensions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 721\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimension_sizes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdimension_sizes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 722\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_ode_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msimulation\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mn_ode_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 723\u001b[0m \u001b[43m \u001b[49m\u001b[43mvar_dim_mapper\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvar_dim_mapper\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 724\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata_structure\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_structure\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 725\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata_structure_and_dimensionality\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_structure_and_dimensionality\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 726\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata_variables\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_variables\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 727\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoordinates\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcoordinates\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 728\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoordinates_input_vars\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcoordinates_input_vars\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 729\u001b[0m \u001b[43m \u001b[49m\u001b[43mdims_input_vars\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdims_input_vars\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 730\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoordinates_indices\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcoordinates_indices\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 731\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;66;43;03m# TODO: pass the whole simulation settings section\u001b[39;49;00m\n\u001b[0;32m 732\u001b[0m \u001b[43m \u001b[49m\u001b[43mstochastic\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mstochastic\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstochastic\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[0;32m 733\u001b[0m \u001b[43m \u001b[49m\u001b[43mindices\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindices\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 734\u001b[0m \u001b[43m \u001b[49m\u001b[43mpost_processing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpost_processing\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 735\u001b[0m \u001b[43m \u001b[49m\u001b[43mbatch_dimension\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mconfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msimulation\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbatch_dimension\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 736\u001b[0m \u001b[43m \u001b[49m\u001b[43msolver_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msolver_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 737\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mevaluator_kwargs\u001b[49m\n\u001b[0;32m 738\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\sim\\evaluator.py:243\u001b[0m, in \u001b[0;36mEvaluator.__init__\u001b[1;34m(self, model, solver, dimensions, dimension_sizes, parameter_dims, n_ode_states, var_dim_mapper, data_structure, data_structure_and_dimensionality, coordinates, coordinates_input_vars, dims_input_vars, coordinates_indices, data_variables, stochastic, batch_dimension, indices, post_processing, solver_options, **kwargs)\u001b[0m\n\u001b[0;32m 235\u001b[0m solver_extra_options \u001b[38;5;241m=\u001b[39m frozendict({\n\u001b[0;32m 236\u001b[0m k:v \u001b[38;5;28;01mfor\u001b[39;00m k, v \u001b[38;5;129;01min\u001b[39;00m kwargs\u001b[38;5;241m.\u001b[39mitems() \n\u001b[0;32m 237\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m k \u001b[38;5;129;01min\u001b[39;00m solver\u001b[38;5;241m.\u001b[39m__match_args__\n\u001b[0;32m 238\u001b[0m })\n\u001b[0;32m 240\u001b[0m solver_options\u001b[38;5;241m.\u001b[39mupdate(solver_extra_options)\n\u001b[1;32m--> 243\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_solver \u001b[38;5;241m=\u001b[39m \u001b[43msolver\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 244\u001b[0m \u001b[43m \u001b[49m\u001b[43mmodel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 245\u001b[0m \u001b[43m \u001b[49m\u001b[43mpost_processing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpost_processing\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 246\u001b[0m \u001b[43m \u001b[49m\n\u001b[0;32m 247\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoordinates\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozen_coordinates\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 248\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoordinates_input_vars\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozen_coordinates_input_vars\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 249\u001b[0m \u001b[43m \u001b[49m\u001b[43mdims_input_vars\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozen_dims_input_vars\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 250\u001b[0m \u001b[43m \u001b[49m\u001b[43mcoordinates_indices\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozen_coordinates_indices\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 251\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimensions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdimensions\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 252\u001b[0m \u001b[43m \u001b[49m\u001b[43mdimension_sizes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozendict\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdimension_sizes\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 253\u001b[0m \u001b[43m \u001b[49m\u001b[43mparameter_dims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozendict\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparameter_dims\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 254\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata_variables\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdata_variables\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 255\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata_structure_and_dimensionality\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdata_structure_dims\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 256\u001b[0m \n\u001b[0;32m 257\u001b[0m \u001b[43m \u001b[49m\u001b[43mindices\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfrozendict\u001b[49m\u001b[43m(\u001b[49m\u001b[43m{\u001b[49m\u001b[43mk\u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalues\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mk\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mv\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mindices\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mitems\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 258\u001b[0m \u001b[43m \u001b[49m\u001b[43mn_ode_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mn_ode_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 259\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_stochastic\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mis_stochastic\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 260\u001b[0m \u001b[43m \u001b[49m\u001b[43mbatch_dimension\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbatch_dimension\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 261\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43msolver_options\u001b[49m\n\u001b[0;32m 262\u001b[0m \n\u001b[0;32m 263\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 264\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 265\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(\n\u001b[0;32m 266\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIf solver is passed as a class of type \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(solver)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 267\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMust be a subclass of `pymob.solvers.base.SolverBase`. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 268\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAlternatively pass a callable.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 269\u001b[0m )\n", + "File \u001b[1;32m:30\u001b[0m, in \u001b[0;36m__init__\u001b[1;34m(self, model, dimensions, dimension_sizes, parameter_dims, n_ode_states, coordinates, coordinates_input_vars, dims_input_vars, coordinates_indices, data_variables, data_structure_and_dimensionality, is_stochastic, post_processing, solver_kwargs, indices, x_dim, batch_dimension, exclude_kwargs_model, exclude_kwargs_postprocessing, diffrax_solver, rtol, atol, pcoeff, icoeff, dcoeff, max_steps, throw_exception)\u001b[0m\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\solvers\\diffrax.py:72\u001b[0m, in \u001b[0;36mJaxSolver.__post_init__\u001b[1;34m(self, *args, **kwargs)\u001b[0m\n\u001b[0;32m 69\u001b[0m x_in_jumps \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_x_in_jumps()\n\u001b[0;32m 70\u001b[0m \u001b[38;5;28mobject\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__setattr__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mx_in_jumps\u001b[39m\u001b[38;5;124m\"\u001b[39m, x_in_jumps)\n\u001b[1;32m---> 72\u001b[0m \u001b[38;5;28;43mhash\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m:3\u001b[0m, in \u001b[0;36m__hash__\u001b[1;34m(self)\u001b[0m\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\equinox\\_module.py:1073\u001b[0m, in \u001b[0;36mModule.__hash__\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 1072\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21m__hash__\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m-> 1073\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mhash\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mtuple\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mjtu\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtree_leaves\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'ArrayImpl'" + ] + } + ], + "source": [ + "config = Config(\"scenarios/test_scenario_v2/settings.cfg\")\n", + "config.case_study.package = \"../..\"\n", + "\n", + "sim = UDESimulation2(config)\n", + "sim.setup()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cc75ed96", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\solvers\\base.py:281: FutureWarning: None encountered in jnp.array(); this is currently treated as NaN. In the future this will result in an error.\n", + " arg_promoted = num_backend.array(arg, ndmin=1, dtype=float)\n" + ] + }, + { + "ename": "XlaRuntimeError", + "evalue": "INTERNAL: Generated function failed: CpuCallback error: _EquinoxRuntimeError: The maximum number of solver steps was reached. Try increasing `max_steps`.\n\n\n--------------------\nAn error occurred during the runtime of your JAX program! Unfortunately you do not appear to be using `equinox.filter_jit` (perhaps you are using `jax.jit` instead?) and so further information about the error cannot be displayed. (Probably you are seeing a very large but uninformative error message right now.) Please wrap your program with `equinox.filter_jit`.\n--------------------\n\n\nAt:\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\equinox\\_errors.py(89): raises\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\callback.py(258): _flat_callback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\callback.py(52): pure_callback_impl\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\callback.py(188): _callback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\interpreters\\mlir.py(2327): _wrapped_callback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\interpreters\\pxla.py(1145): __call__\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\profiler.py(334): wrapper\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(1178): _pjit_call_impl_python\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(1222): call_impl_cache_miss\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(1238): _pjit_call_impl\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\core.py(893): process_primitive\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\core.py(405): bind_with_trace\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\core.py(2682): bind\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(166): _python_pjit_helper\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(255): cache_miss\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\traceback_util.py(177): reraise_with_filtered_traceback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\solvers\\base.py(82): __call__\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\sim\\evaluator.py(351): __call__\n C:\\Users\\Markus\\AppData\\Local\\Temp\\ipykernel_17300\\2517945625.py(6): \n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3548): run_code\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3488): run_ast_nodes\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3306): run_cell_async\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\async_helpers.py(129): _pseudo_sync_runner\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3101): _run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3046): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\zmqshell.py(549): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(449): do_execute\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(778): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(362): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(437): dispatch_shell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(534): process_one\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(545): dispatch_queue\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\events.py(84): _run\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(1936): _run_once\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(608): run_forever\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\tornado\\platform\\asyncio.py(205): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelapp.py(739): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\traitlets\\config\\application.py(1075): launch_instance\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel_launcher.py(18): \n (88): _run_code\n (198): _run_module_as_main\n", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mXlaRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[5], line 6\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# run\u001b[39;00m\n\u001b[0;32m 5\u001b[0m evaluator \u001b[38;5;241m=\u001b[39m sim\u001b[38;5;241m.\u001b[39mdispatch()\n\u001b[1;32m----> 6\u001b[0m \u001b[43mevaluator\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7\u001b[0m evaluator\u001b[38;5;241m.\u001b[39mresults\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\sim\\evaluator.py:351\u001b[0m, in \u001b[0;36mEvaluator.__call__\u001b[1;34m(self, seed)\u001b[0m\n\u001b[0;32m 348\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_signature\u001b[38;5;241m.\u001b[39mupdate({\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mseed\u001b[39m\u001b[38;5;124m\"\u001b[39m: seed})\n\u001b[0;32m 350\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_solver, SolverBase):\n\u001b[1;32m--> 351\u001b[0m Y_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_solver\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mparameters\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 353\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 354\u001b[0m Y_ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_solver(parameters\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparameters, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_signature)\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\solvers\\base.py:82\u001b[0m, in \u001b[0;36mSolverBase.__call__\u001b[1;34m(self, **kwargs)\u001b[0m\n\u001b[0;32m 81\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m---> 82\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msolve\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + " \u001b[1;31m[... skipping hidden 10 frame]\u001b[0m\n", + "File \u001b[1;32mc:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\interpreters\\pxla.py:1145\u001b[0m, in \u001b[0;36mExecuteReplicated.__call__\u001b[1;34m(self, *args)\u001b[0m\n\u001b[0;32m 1142\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mordered_effects \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhas_unordered_effects\n\u001b[0;32m 1143\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhas_host_callbacks):\n\u001b[0;32m 1144\u001b[0m input_bufs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_add_tokens_to_inputs(input_bufs)\n\u001b[1;32m-> 1145\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mxla_executable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexecute_sharded\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 1146\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_bufs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwith_tokens\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\n\u001b[0;32m 1147\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 1148\u001b[0m result_token_bufs \u001b[38;5;241m=\u001b[39m results\u001b[38;5;241m.\u001b[39mdisassemble_prefix_into_single_device_arrays(\n\u001b[0;32m 1149\u001b[0m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mordered_effects))\n\u001b[0;32m 1150\u001b[0m sharded_runtime_token \u001b[38;5;241m=\u001b[39m results\u001b[38;5;241m.\u001b[39mconsume_token()\n", + "\u001b[1;31mXlaRuntimeError\u001b[0m: INTERNAL: Generated function failed: CpuCallback error: _EquinoxRuntimeError: The maximum number of solver steps was reached. Try increasing `max_steps`.\n\n\n--------------------\nAn error occurred during the runtime of your JAX program! Unfortunately you do not appear to be using `equinox.filter_jit` (perhaps you are using `jax.jit` instead?) and so further information about the error cannot be displayed. (Probably you are seeing a very large but uninformative error message right now.) Please wrap your program with `equinox.filter_jit`.\n--------------------\n\n\nAt:\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\equinox\\_errors.py(89): raises\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\callback.py(258): _flat_callback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\callback.py(52): pure_callback_impl\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\callback.py(188): _callback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\interpreters\\mlir.py(2327): _wrapped_callback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\interpreters\\pxla.py(1145): __call__\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\profiler.py(334): wrapper\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(1178): _pjit_call_impl_python\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(1222): call_impl_cache_miss\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(1238): _pjit_call_impl\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\core.py(893): process_primitive\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\core.py(405): bind_with_trace\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\core.py(2682): bind\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(166): _python_pjit_helper\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\pjit.py(255): cache_miss\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\jax\\_src\\traceback_util.py(177): reraise_with_filtered_traceback\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\solvers\\base.py(82): __call__\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\pymob\\sim\\evaluator.py(351): __call__\n C:\\Users\\Markus\\AppData\\Local\\Temp\\ipykernel_17300\\2517945625.py(6): \n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3548): run_code\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3488): run_ast_nodes\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3306): run_cell_async\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\async_helpers.py(129): _pseudo_sync_runner\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3101): _run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\IPython\\core\\interactiveshell.py(3046): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\zmqshell.py(549): run_cell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(449): do_execute\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(778): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\ipkernel.py(362): execute_request\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(437): dispatch_shell\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(534): process_one\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelbase.py(545): dispatch_queue\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\events.py(84): _run\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(1936): _run_once\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\asyncio\\base_events.py(608): run_forever\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\tornado\\platform\\asyncio.py(205): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel\\kernelapp.py(739): start\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\traitlets\\config\\application.py(1075): launch_instance\n c:\\Users\\Markus\\anaconda3\\envs\\lotka_UDE\\Lib\\site-packages\\ipykernel_launcher.py(18): \n (88): _run_code\n (198): _run_module_as_main\n" + ] + } + ], + "source": [ + "# put everything in place for running the simulation\n", + "sim.dispatch_constructor()\n", + "\n", + "# run\n", + "evaluator = sim.dispatch()\n", + "evaluator()\n", + "evaluator.results" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "959f4520", + "metadata": {}, + "outputs": [], + "source": [ + "import jax.random as jrandom\n", + "from lotka_volterra_UDE_case_study.mod import *\n", + "import numpy as np\n", + "\n", + "alpha = 0.5\n", + "gamma = 0.2\n", + "\n", + "key = jrandom.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jrandom.split(key, 3)\n", + "func = Func(2,5,3,key=model_key,theta_true=np.array([alpha,gamma]))\n", + "\n", + "weights = transformWeights(getFuncWeights(func))[4]\n", + "bias = transformBias(getFuncBias(func))[3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57ad2dc0", + "metadata": {}, + "outputs": [], + "source": [ + "for (i, el) in enumerate(weights):\n", + " print(\"weight\"+str(i)+\" = value=\"+ str(el) +\" dims=[] hyper=False free=True\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "002a861e", + "metadata": {}, + "outputs": [], + "source": [ + "for (i, el) in enumerate(bias):\n", + " print(\"bias\"+str(i)+\" = value=\"+ str(el) +\" dims=[] hyper=False free=True\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "076d1514", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "weight0, weight1, weight2, weight3, weight4, weight5, weight6, weight7, weight8, weight9, weight10, weight11, weight12, weight13, weight14, weight15, weight16, weight17, weight18, weight19, weight20, weight21, weight22, weight23, weight24, weight25, weight26, weight27, weight28, weight29, weight30, weight31, weight32, weight33, weight34, weight35, weight36, weight37, weight38, weight39, weight40, weight41, weight42, weight43, weight44, weight45, weight46, weight47, weight48, weight49, weight50, weight51, weight52, weight53, weight54, weight55, weight56, weight57, weight58, weight59, weight60, weight61, weight62, weight63, weight64, weight65, weight66, weight67, weight68, weight69, \n" + ] + } + ], + "source": [ + "string = \"\"\n", + "for (i, el) in enumerate(weights):\n", + " string = string + \"weight\"+str(i)+\", \"\n", + "print(string)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e8d9b552", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bias0, bias1, bias2, bias3, bias4, bias5, bias6, bias7, bias8, bias9, bias10, bias11, bias12, bias13, bias14, bias15, bias16, \n" + ] + } + ], + "source": [ + "string = \"\"\n", + "for (i, el) in enumerate(bias):\n", + " string = string + \"bias\"+str(i)+\", \"\n", + "print(string)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "80764af1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "lotka_volterra_UDE_case_study.mod.Func" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c53c93df", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'alpha': 0.5,\n", + " 'gamma': 0.3,\n", + " 'weight0': 0.5169155597686768,\n", + " 'weight1': -0.1113400012254715,\n", + " 'weight2': 0.0019739896524697542,\n", + " 'weight3': -0.14228995144367218,\n", + " 'weight4': 0.6534742116928101,\n", + " 'weight5': 0.04554422199726105,\n", + " 'weight6': -0.598878026008606,\n", + " 'weight7': 0.062172163277864456,\n", + " 'weight8': -0.39768972992897034,\n", + " 'weight9': -0.28594544529914856,\n", + " 'weight10': 0.3566611111164093,\n", + " 'weight11': -0.18897797167301178,\n", + " 'weight12': -0.2817196547985077,\n", + " 'weight13': -0.23240125179290771,\n", + " 'weight14': -0.05755160003900528,\n", + " 'weight15': -0.22106988728046417,\n", + " 'weight16': 0.21608766913414001,\n", + " 'weight17': 0.24480344355106354,\n", + " 'weight18': -0.1570640206336975,\n", + " 'weight19': 0.32572320103645325,\n", + " 'weight20': 0.0890553742647171,\n", + " 'weight21': 0.10775744169950485,\n", + " 'weight22': -0.42297303676605225,\n", + " 'weight23': 0.12325247377157211,\n", + " 'weight24': 0.015271333046257496,\n", + " 'weight25': 0.30383509397506714,\n", + " 'weight26': 0.1462707817554474,\n", + " 'weight27': -0.2669238746166229,\n", + " 'weight28': -0.40271320939064026,\n", + " 'weight29': 0.011248514987528324,\n", + " 'weight30': -0.17801563441753387,\n", + " 'weight31': -0.3874042332172394,\n", + " 'weight32': -0.2194657325744629,\n", + " 'weight33': 0.3422509729862213,\n", + " 'weight34': -0.4402901828289032,\n", + " 'weight35': 0.4382105767726898,\n", + " 'weight36': 0.24042896926403046,\n", + " 'weight37': 0.072720468044281,\n", + " 'weight38': 0.1857479065656662,\n", + " 'weight39': -0.021435268223285675,\n", + " 'weight40': 0.27837562561035156,\n", + " 'weight41': -0.17096778750419617,\n", + " 'weight42': 0.3841945230960846,\n", + " 'weight43': 0.3788338005542755,\n", + " 'weight44': -0.2520178258419037,\n", + " 'weight45': -0.233578160405159,\n", + " 'weight46': -0.024746477603912354,\n", + " 'weight47': -0.4264543056488037,\n", + " 'weight48': -0.22861962020397186,\n", + " 'weight49': -0.06451500207185745,\n", + " 'weight50': -0.180024653673172,\n", + " 'weight51': -0.3829347491264343,\n", + " 'weight52': 0.19242215156555176,\n", + " 'weight53': -0.0955929234623909,\n", + " 'weight54': 0.275176465511322,\n", + " 'weight55': 0.08110132813453674,\n", + " 'weight56': 0.20457345247268677,\n", + " 'weight57': -0.09262514859437943,\n", + " 'weight58': 0.05374106764793396,\n", + " 'weight59': -0.2004258781671524,\n", + " 'weight60': 0.16397570073604584,\n", + " 'weight61': 0.4274598956108093,\n", + " 'weight62': -0.35722097754478455,\n", + " 'weight63': -0.35819360613822937,\n", + " 'weight64': 0.15884485840797424,\n", + " 'weight65': -0.027911610901355743,\n", + " 'weight66': 0.06736569851636887,\n", + " 'weight67': -0.29996421933174133,\n", + " 'weight68': 0.4070671796798706,\n", + " 'weight69': -0.28022512793540955,\n", + " 'bias0': -0.699512243270874,\n", + " 'bias1': -0.5325741171836853,\n", + " 'bias2': -0.4929340183734894,\n", + " 'bias3': 0.5522717237472534,\n", + " 'bias4': -0.5678955912590027,\n", + " 'bias5': 0.2719436287879944,\n", + " 'bias6': -0.3104589879512787,\n", + " 'bias7': 0.25237566232681274,\n", + " 'bias8': 0.04901730641722679,\n", + " 'bias9': -0.25238311290740967,\n", + " 'bias10': 0.0028977212496101856,\n", + " 'bias11': -0.15775930881500244,\n", + " 'bias12': -0.13378308713436127,\n", + " 'bias13': 0.22126640379428864,\n", + " 'bias14': -0.302773118019104,\n", + " 'bias15': -0.0479828380048275,\n", + " 'bias16': -0.3930566906929016}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim.model_parameters[\"parameters\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "aaa85ba9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0.5169155597686768,\n", + " -0.1113400012254715,\n", + " 0.0019739896524697542,\n", + " -0.14228995144367218,\n", + " 0.6534742116928101,\n", + " 0.04554422199726105,\n", + " -0.598878026008606,\n", + " 0.062172163277864456,\n", + " -0.39768972992897034,\n", + " -0.28594544529914856,\n", + " 0.3566611111164093,\n", + " -0.18897797167301178,\n", + " -0.2817196547985077,\n", + " -0.23240125179290771,\n", + " -0.05755160003900528,\n", + " -0.22106988728046417,\n", + " 0.21608766913414001,\n", + " 0.24480344355106354,\n", + " -0.1570640206336975,\n", + " 0.32572320103645325,\n", + " 0.0890553742647171,\n", + " 0.10775744169950485,\n", + " -0.42297303676605225,\n", + " 0.12325247377157211,\n", + " 0.015271333046257496,\n", + " 0.30383509397506714,\n", + " 0.1462707817554474,\n", + " -0.2669238746166229,\n", + " -0.40271320939064026,\n", + " 0.011248514987528324,\n", + " -0.17801563441753387,\n", + " -0.3874042332172394,\n", + " -0.2194657325744629,\n", + " 0.3422509729862213,\n", + " -0.4402901828289032,\n", + " 0.4382105767726898,\n", + " 0.24042896926403046,\n", + " 0.072720468044281,\n", + " 0.1857479065656662,\n", + " -0.021435268223285675,\n", + " 0.27837562561035156,\n", + " -0.17096778750419617,\n", + " 0.3841945230960846,\n", + " 0.3788338005542755,\n", + " -0.2520178258419037,\n", + " -0.233578160405159,\n", + " -0.024746477603912354,\n", + " -0.4264543056488037,\n", + " -0.22861962020397186,\n", + " -0.06451500207185745,\n", + " -0.180024653673172,\n", + " -0.3829347491264343,\n", + " 0.19242215156555176,\n", + " -0.0955929234623909,\n", + " 0.275176465511322,\n", + " 0.08110132813453674,\n", + " 0.20457345247268677,\n", + " -0.09262514859437943,\n", + " 0.05374106764793396,\n", + " -0.2004258781671524,\n", + " 0.16397570073604584,\n", + " 0.4274598956108093,\n", + " -0.35722097754478455,\n", + " -0.35819360613822937,\n", + " 0.15884485840797424,\n", + " -0.027911610901355743,\n", + " 0.06736569851636887,\n", + " -0.29996421933174133,\n", + " 0.4070671796798706,\n", + " -0.28022512793540955]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from lotka_volterra_UDE_case_study.sim import returnWeightList\n", + "\n", + "returnWeightList(sim, 70)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d41d8ac", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "lotka_UDE", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/__init__.py b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/__init__.py new file mode 100644 index 00000000..9780ee8d --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/__init__.py @@ -0,0 +1,7 @@ +from . import data +from . import mod +from . import plot +from . import prob +from . import sim + +__version__ = "1.0.0" \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/data.py b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/data.py new file mode 100644 index 00000000..e69de29b diff --git a/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/mod.py b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/mod.py new file mode 100644 index 00000000..fe22f0a2 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/mod.py @@ -0,0 +1,58 @@ +import equinox as eqx +import jax.nn as jnn +import jax.numpy as jnp +import jax +from typing import Callable +from pymob.utils.UDE import UDEBase, transformBiasBackwards, transformWeightsBackwards + +class Func(UDEBase): + + mlp_depth: int = 3 + mlp_width: int = 3 + mlp_in_size: int = 2 + mlp_out_size: int = 2 + mlp_activation: Callable = staticmethod(jnn.softplus) + mlp_final_activation: Callable = staticmethod(lambda x: x) + + alpha: jax.Array + delta: jax.Array + + @staticmethod + def model(t, y, mlp, alpha, delta, ): + prey, predator = y + + # input = x_in.evaluate(t) + + dprey_dt_ode = alpha * prey + dpredator_dt_ode = - delta * predator + dprey_dt_nn, dpredator_dt_nn = mlp(y) * jnp.array([jnp.tanh(prey).astype(float), jnp.tanh(predator).astype(float)]) + + dprey_dt = dprey_dt_ode + dprey_dt_nn + dpredator_dt = dpredator_dt_ode + dpredator_dt_nn + + return dprey_dt, dpredator_dt + + @staticmethod + def loss(y_obs, y_pred): + return (y_obs - y_pred)**2 + 1e-2*(y_pred**-1) + +class Func1D(UDEBase): + + mlp_depth: int = 3 + mlp_width: int = 3 + mlp_in_size: int = 1 + mlp_out_size: int = 1 + + r: jax.Array + + @staticmethod + def model(y, mlp, r): + X = y + + dX_dt = r * X + mlp(y) + + return dX_dt + + @staticmethod + def loss(y_obs, y_pred): + return (y_obs - y_pred)**2 \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/plot.py b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/plot.py new file mode 100644 index 00000000..de8a666f --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/plot.py @@ -0,0 +1 @@ +from lotka_volterra_case_study.plot import * diff --git a/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/prob.py b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/prob.py new file mode 100644 index 00000000..5c5ab70c --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/prob.py @@ -0,0 +1 @@ +from lotka_volterra_case_study.prob import * diff --git a/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/sim.py b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/sim.py new file mode 100644 index 00000000..03035a75 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/lotka_volterra_UDE_case_study/sim.py @@ -0,0 +1 @@ +from lotka_volterra_case_study.sim import Simulation_v2 \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/pyproject.toml b/case_studies/lotka_volterra_UDE_case_study/pyproject.toml new file mode 100644 index 00000000..80ef0e19 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/pyproject.toml @@ -0,0 +1,72 @@ + +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "lotka_volterra_UDE_case_study" +version = "1.0.0" +authors = [ + { name="Florian Schunck", email="fluncki@protonmail.com" }, +] +description = "Lotka Volterra Predator-Prey case study" +readme = "README.md" +requires-python = ">=3.10" +dependencies=[ + "pymob[numpyro] >= 0.5.0a19", + "preliz", +] +license = {file = "LICENSE"} +classifiers = [ + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", + "Natural Language :: English", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Operating System :: OS Independent", + "Topic :: Scientific/Engineering :: Bio-Informatics", +] + +[project.urls] +"Homepage" = "https://github.com/flo-schu/lotka_volterra_case_study" +"Issue Tracker" = "https://github.com/flo-schu/lotka_volterra_case_study/issues" + +[project.optional-dependencies] +dev = [ + "pytest >= 7.3", + "bumpver", + "pre-commit", + "ipykernel", + "ipywidgets" +] + +[tool.setuptools.packages.find] +include = ["lotka_volterra_UDE_case_study*"] + +[tool.bumpver] +current_version = "1.0.0" +version_pattern = "MAJOR.MINOR.PATCH[PYTAGNUM]" +commit_message = "bump version {old_version} -> {new_version}" +tag_message = "{new_version}" +tag_scope = "default" +pre_commit_hook = "" +post_commit_hook = "" +commit = true +tag = true +push = true + +[tool.bumpver.file_patterns] +"pyproject.toml" = [ + 'current_version = "{version}"', + 'version = "{version}"' +] +"lotka_volterra_case_study/__init__.py" = [ + '__version__ = "{version}"' +] +"README.md" = [ + 'git clone git@github.com:flo-schu/lotka_volterra_case_study/{version}' +] + +[tool.pytest.ini_options] +markers = [ + "slow='mark test as slow.'" +] diff --git a/case_studies/lotka_volterra_UDE_case_study/scenarios/InfererTest/settings.cfg b/case_studies/lotka_volterra_UDE_case_study/scenarios/InfererTest/settings.cfg new file mode 100644 index 00000000..90f115d6 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scenarios/InfererTest/settings.cfg @@ -0,0 +1,133 @@ +[case-study] +name = lotka_volterra_UDE_case_study +pymob_version = 0.6.4 +scenario = InfererTest +package = case_studies +modules = sim mod prob data plot +simulation = Simulation +observations = UDE_obs_inferer_test.nc +logging = DEBUG + +[simulation] +y0 = +x_in = +input_files = +n_ode_states = 2 +batch_dimension = batch_id +x_dimension = time +modeltype = deterministic +seed = 1 + +[data-structure] +prey = dimensions=['batch_id','time'] min=nan max=nan observed=True +predator = dimensions=['batch_id','time'] min=0.11841753125190735 max=5.719013214111328 observed=True + +[solverbase] +x_dim = time +exclude_kwargs_model = t time x_in y x Y X +exclude_kwargs_postprocessing = t time interpolation results + +[jax-solver] +diffrax_solver = Dopri5 +rtol = 1e-06 +atol = 1e-07 +pcoeff = 0.0 +icoeff = 1.0 +dcoeff = 0.0 +max_steps = 100000 +throw_exception = True + +[inference] +eps = 1e-08 +objective_function = total_average +n_objectives = 1 +objective_names = +extra_vars = +n_predictions = 100 + +[model-parameters] + +[error-model] + +[multiprocessing] +cores = 1 + +[inference.pyabc] +sampler = SingleCoreSampler +population_size = 100 +minimum_epsilon = 0.0 +min_eps_diff = 0.0 +max_nr_populations = 1000 +database_path = C:\Users\Markus\AppData\Local\Temp/pyabc.db + +[inference.pyabc.redis] +password = nopassword +port = 1111 +eval.n_predictions = 50 +eval.history_id = -1 +eval.model_id = 0 + +[inference.pymoo] +algortihm = UNSGA3 +population_size = 100 +max_nr_populations = 1000 +ftol = 1e-05 +xtol = 1e-07 +cvtol = 1e-07 +verbose = True + +[inference.numpyro] +gaussian_base_distribution = False +kernel = nuts +init_strategy = init_to_uniform +chains = 1 +draws = 2000 +warmup = 1000 +thinning = 1 +nuts_draws = 2000 +nuts_step_size = 0.8 +nuts_max_tree_depth = 10 +nuts_target_accept_prob = 0.8 +nuts_dense_mass = True +nuts_adapt_step_size = True +nuts_adapt_mass_matrix = True +svi_iterations = 10000 +svi_learning_rate = 0.0001 + +[inference.optax] +UDE_parameters = alpha = value=1.3 dims=[] hyper=False free=False delta = value=1.8 dims=[] prior=uniform(loc=1.0,scale=2.0) hyper=False free=True +MLP_weight_dist = normal() +MLP_bias_dist = normal() +length_strategy = 0.1 1 +steps_strategy = 1000 1000 +lr_strategy = 0.003 0.003 +clip_strategy = 0.1 0.1 +batch_size = 32 +data_split = 0.8 +multiple_runs_target = 3 +multiple_runs_limit = 5 +multiple_runs_plot = 5 + +[report] +debug_report = False +pandoc_output_format = html +model = True +parameters = True +parameters_format = pandas +diagnostics = True +diagnostics_with_batch_dim_vars = False +diagnostics_exclude_vars = +goodness_of_fit = True +goodness_of_fit_use_predictions = True +goodness_of_fit_nrmse_mode = range +table_parameter_estimates = True +table_parameter_estimates_format = csv +table_parameter_estimates_significant_figures = 3 +table_parameter_estimates_error_metric = sd +table_parameter_estimates_parameters_as_rows = True +table_parameter_estimates_with_batch_dim_vars = False +table_parameter_estimates_exclude_vars = +table_parameter_estimates_override_names = +plot_trace = True +plot_parameter_pairs = True + diff --git a/case_studies/lotka_volterra_UDE_case_study/scenarios/UDESolverTest/settings.cfg b/case_studies/lotka_volterra_UDE_case_study/scenarios/UDESolverTest/settings.cfg new file mode 100644 index 00000000..f4e38657 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scenarios/UDESolverTest/settings.cfg @@ -0,0 +1,133 @@ +[case-study] +name = lotka_volterra_UDE_case_study +pymob_version = 0.6.4 +scenario = UDESolverTest +package = case_studies +modules = sim mod prob data plot +simulation = Simulation +observations = UDE_obs_solver_test.nc +logging = DEBUG + +[simulation] +y0 = +x_in = +input_files = +n_ode_states = 2 +batch_dimension = batch_id +x_dimension = time +modeltype = deterministic +seed = 1 + +[data-structure] +prey = dimensions=['time'] min=nan max=nan observed=True +predator = dimensions=['time'] min=9.99999993922529e-09 max=8.670677185058594 observed=True + +[solverbase] +x_dim = time +exclude_kwargs_model = t time x_in y x Y X +exclude_kwargs_postprocessing = t time interpolation results + +[jax-solver] +diffrax_solver = Dopri5 +rtol = 1e-06 +atol = 1e-07 +pcoeff = 0.0 +icoeff = 1.0 +dcoeff = 0.0 +max_steps = 100000 +throw_exception = True + +[inference] +eps = 1e-08 +objective_function = total_average +n_objectives = 1 +objective_names = +extra_vars = +n_predictions = 100 + +[model-parameters] + +[error-model] + +[multiprocessing] +cores = 1 + +[inference.pyabc] +sampler = SingleCoreSampler +population_size = 100 +minimum_epsilon = 0.0 +min_eps_diff = 0.0 +max_nr_populations = 1000 +database_path = C:\Users\Markus\AppData\Local\Temp/pyabc.db + +[inference.pyabc.redis] +password = nopassword +port = 1111 +eval.n_predictions = 50 +eval.history_id = -1 +eval.model_id = 0 + +[inference.pymoo] +algortihm = UNSGA3 +population_size = 100 +max_nr_populations = 1000 +ftol = 1e-05 +xtol = 1e-07 +cvtol = 1e-07 +verbose = True + +[inference.numpyro] +gaussian_base_distribution = False +kernel = nuts +init_strategy = init_to_uniform +chains = 1 +draws = 2000 +warmup = 1000 +thinning = 1 +nuts_draws = 2000 +nuts_step_size = 0.8 +nuts_max_tree_depth = 10 +nuts_target_accept_prob = 0.8 +nuts_dense_mass = True +nuts_adapt_step_size = True +nuts_adapt_mass_matrix = True +svi_iterations = 10000 +svi_learning_rate = 0.0001 + +[inference.optax] +UDE_parameters = +MLP_weight_dist = normal() +MLP_bias_dist = normal() +length_strategy = 0.1 1 +steps_strategy = 1000 1000 +lr_strategy = 0.003 0.003 +clip_strategy = 0.1 0.1 +batch_size = 1 +data_split = 0.8 +multiple_runs_target = 10 +multiple_runs_limit = 50 +multiple_runs_plot = 1 + +[report] +debug_report = False +pandoc_output_format = html +model = True +parameters = True +parameters_format = pandas +diagnostics = True +diagnostics_with_batch_dim_vars = False +diagnostics_exclude_vars = +goodness_of_fit = True +goodness_of_fit_use_predictions = True +goodness_of_fit_nrmse_mode = range +table_parameter_estimates = True +table_parameter_estimates_format = csv +table_parameter_estimates_significant_figures = 3 +table_parameter_estimates_error_metric = sd +table_parameter_estimates_parameters_as_rows = True +table_parameter_estimates_with_batch_dim_vars = False +table_parameter_estimates_exclude_vars = +table_parameter_estimates_override_names = +plot_trace = True +plot_parameter_pairs = True + diff --git a/case_studies/lotka_volterra_UDE_case_study/scripts/array_job.sh b/case_studies/lotka_volterra_UDE_case_study/scripts/array_job.sh new file mode 100644 index 00000000..0dcc710c --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scripts/array_job.sh @@ -0,0 +1,30 @@ +#!/bin/bash +#SBATCH --job-name=UDE_hyperparam +#SBATCH --output=hyperparams/logs/%s_%A_%a.out +#SBATCH --error=hyperparams/logs/%s_%A_%a.err +#SBATCH --nodes=1 +#SBATCH --ntasks=1 +#SBATCH --cpus-per-task=1 +#SBATCH --mem-per-cpu=8000MB +#SBATCH --mail-type=END + +spack load miniconda3 +source activate pymob +spack unload miniconda3 + +# Get line from input list +line=$(sed -n "${SLURM_ARRAY_TASK_ID}p" input_list.txt) + +# Split into variables +IFS=\; read -ra inputs <<<"$line" +length=${inputs[0]} +lr=${inputs[1]} +clip=${inputs[2]} +batch=${inputs[3]} +points=${inputs[4]} +noise=${inputs[5]} + +echo "running hyperparameters.py with length=$length, lr=$lr, clip=$clip, batch=$batch, points=$points, and noise=$noise" + +# Run simulation +python3 hyperparameters.py -length=$length -lr=$lr -clip=$clip -batch=$batch -points=$points -noise=$noise \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/scripts/hyperparameters.py b/case_studies/lotka_volterra_UDE_case_study/scripts/hyperparameters.py new file mode 100644 index 00000000..6ef32886 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scripts/hyperparameters.py @@ -0,0 +1,172 @@ +import os +import click + +from lotka_volterra_UDE_case_study.mod import Func +import jax.random as jrandom +import jax.numpy as jnp +import xarray as xr +from pymob.simulation import SimulationBase +from pymob.solvers.diffrax import UDESolver +from pymob.sim.config import Param +import diffrax +import jax.random as jr +import jax + +def _get_data(ts, theta, max, min, noisiness, *, key): + """ + Returns a single time series (evaluated at the time points defined by ts) of the + Lotka-Volterra model with some normally-distributed noise. Initial conditions for + prey and predator are both chosen randomly from the range [min, max]. + + Parameters + ---------- + ts : jax.ArrayImpl + An array containing all the time points the timeseries should be evaluated for. + theta : list + A list of four floats representing the parameters of the Lotka Volterra model + [alpha, beta, gamma, delta]. + max : float + Maximum value for the initial prey and predator values (before adding noise). + min : float + Minimum value for the initial prey and predator values (before adding noise). + noisiness : float + Scale of the normal distribution the noise is drawn from. I fnoisiness == 0, + no noise is added. + key : jax.ArrayImpl, optional + A key used to make stochastic processes (in this case the noise values drawn + from a normal distribution) reproducible. If no key is provided, noise may + differ between runs. + + Returns: + -------- + jax.ArrayImpl + An array containing a noisy Lotka Volterra time series, evaluated at time + points ts. + """ + + y0 = jr.uniform(key, (2,), minval=min, maxval=max) + + def f(t, y, args): + dXdt = theta[0] * y[0] - theta[1] * y[0] * y[1] + dYdt = theta[2] * y[0] * y[1] - theta[3] * y[1] + return jnp.stack([dXdt, dYdt], axis=-1) + + solver = diffrax.Tsit5() + dt0 = 0.1 + saveat = diffrax.SaveAt(ts=ts) + sol = diffrax.diffeqsolve( + diffrax.ODETerm(f), solver, ts[0], ts[-1], dt0, y0, saveat=saveat + ) + ys = sol.ys + noise = jr.normal(key=key, shape=(len(ts), 2)) + ys += noisiness * noise + return jnp.greater(ys, jnp.zeros(ys.shape)) * ys + 1e-8 + +def get_data(dataset_size, theta, max, min, t_end, datapoints, noisiness, *, key): + """ + Returns multiple time series (evaluated at the time points defined by ts) of the + Lotka-Volterra model with some normally-distributed noise and different initial + conditions for prey and predator chosen randomly from the range [min, max]. + + Parameters + ---------- + dataset_size : int + The amount of generated time series. + theta : list + A list of four floats representing the parameters of the Lotka Volterra model + [alpha, beta, gamma, delta]. + max : float + Maximum value for the initial prey and predator values (before adding noise). + min : float + Minimum value for the initial prey and predator values (before adding noise). + t_end : float + The last point in time that the time series are supposed to contain. + datapoints : int + The amount of evenly-spaced datapoints each time series is supposed to contain. + noisiness : float + Scale of the normal distribution the noise is drawn from. If noisiness == 0, + no noise is added. + key : jax.Array + A key used to make stochastic processes (in this case the noise values drawn + from a normal distribution) reproducible. If no key is provided, noise may + differ between runs. + + Returns: + -------- + jax.ArrayImpl + An array containing multiple noisy Lotka Volterra time series, evaluated at time + points ts. + """ + + ts = jnp.linspace(0, t_end, datapoints) + key = jr.split(key, dataset_size) + ys = jax.vmap(lambda key: _get_data(ts, theta, max, min, noisiness, key=key))(key) + return ts, ys + +@click.command() +@click.option("-length", "--length_strategy", type=(float, float, float, float), default=(0.1, 1, -1, -1)) +@click.option("-lr", "--lr_strategy", type=float, default=1e-3) +@click.option("-clip", "--clip_strategy", type=float, default=0.1) +@click.option("-batch", "--batch_size", type=int, default=20) +@click.option("-points", "--data_points", type=int, default=51) +@click.option("-noise", "--data_noise", type=float, default=0.0) +def main(length_strategy, lr_strategy, clip_strategy, batch_size, data_points, data_noise): + + sim = SimulationBase() + sim.config.case_study.name = "lotka_volterra_UDE_case_study" + sim.config.case_study.scenario = "UDETest" + + key = jrandom.PRNGKey(5678) + data_key, model_key, loader_key = jrandom.split(key, 3) + sim.model = Func({"alpha":jnp.array(1.3), "delta":jnp.array(1.8)},key=model_key) + + ts,ys = get_data(50, [1.3,0.9,0.8,1.8], 5, 0.1, 50, data_points, data_noise, key=jr.PRNGKey(0)) + datasets = jnp.linspace(0, 49, 50) + test_data1 = xr.DataArray(ys[:,:,0], coords={"batch_id": datasets, "time": ts}).to_dataset(name="prey") + test_data2 = xr.DataArray(ys[:,:,1], coords={"batch_id": datasets, "time": ts}).to_dataset(name="predator") + test_data = xr.merge([test_data1, test_data2]) + sim.observations = test_data + sim.model_parameters["y0"] = sim.observations.sel(time = 0).drop_vars("time") + + sim.config.model_parameters.alpha = Param(value=1.3, free=False) + sim.config.model_parameters.delta = Param(value=1.8, free=True) + sim.config.model_parameters.delta.prior = "uniform(loc=1.0,scale=2.0)" + + sim.solver = UDESolver + sim.config.jaxsolver.max_steps = 100000 + sim.config.jaxsolver.throw_exception = False + + sim.dispatch_constructor() + evaluator = sim.dispatch() + + sim.config.inference_optax.MLP_weight_dist = "normal()" + sim.config.inference_optax.MLP_bias_dist = "normal()" + sim.config.inference_optax.batch_size = batch_size + sim.config.inference_optax.data_split = 0.8 + sim.config.inference_optax.multiple_runs_target = 10 + sim.config.inference_optax.multiple_runs_limit = 100 + + sim.config.inference_optax.length_strategy = [i for i in length_strategy if i != -1] + sim.config.inference_optax.steps_strategy = 1000 + sim.config.inference_optax.lr_strategy = lr_strategy + sim.config.inference_optax.clip_strategy = clip_strategy + sim.set_inferer("optax") + sim.inferer.run() + + sim.config.case_study.output_path = f"hyperparams/scenario_{str(data_points)}_{str(data_noise)}_hyperparams_{str(length_strategy)}_{str(lr_strategy)}_{str(clip_strategy)}_{str(batch_size)}" + sim.config.case_study.data_path = f"hyperparams/scenario_{str(data_points)}_{str(data_noise)}_hyperparams_{str(length_strategy)}_{str(lr_strategy)}_{str(clip_strategy)}_{str(batch_size)}" + sim.config.create_directory("results", force=True) + os.makedirs(sim.data_path, exist_ok=True) + os.makedirs(sim.output_path, exist_ok=True) + + sim.save_observations(force=True) + sim.config.save(fp = sim.data_path+"/settings.cfg", force=True) + try: + sim.report() + except AttributeError: + pass + sim.inferer.store_results() + sim.inferer.store_loss_evolution() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/scripts/input_list.txt b/case_studies/lotka_volterra_UDE_case_study/scripts/input_list.txt new file mode 100644 index 00000000..03ad3ca4 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scripts/input_list.txt @@ -0,0 +1,108 @@ +1 -1 -1 -1;0.1;0;5;51;0 +1 -1 -1 -1;0.1;0;10;51;0 +1 -1 -1 -1;0.1;0;20;51;0 +1 -1 -1 -1;0.1;0.1;5;51;0 +1 -1 -1 -1;0.1;0.1;10;51;0 +1 -1 -1 -1;0.1;0.1;20;51;0 +1 -1 -1 -1;0.1;1;5;51;0 +1 -1 -1 -1;0.1;1;10;51;0 +1 -1 -1 -1;0.1;1;20;51;0 +1 -1 -1 -1;0.01;0;5;51;0 +1 -1 -1 -1;0.01;0;10;51;0 +1 -1 -1 -1;0.01;0;20;51;0 +1 -1 -1 -1;0.01;0.1;5;51;0 +1 -1 -1 -1;0.01;0.1;10;51;0 +1 -1 -1 -1;0.01;0.1;20;51;0 +1 -1 -1 -1;0.01;1;5;51;0 +1 -1 -1 -1;0.01;1;10;51;0 +1 -1 -1 -1;0.01;1;20;51;0 +1 -1 -1 -1;0.001;0;5;51;0 +1 -1 -1 -1;0.001;0;10;51;0 +1 -1 -1 -1;0.001;0;20;51;0 +1 -1 -1 -1;0.001;0.1;5;51;0 +1 -1 -1 -1;0.001;0.1;10;51;0 +1 -1 -1 -1;0.001;0.1;20;51;0 +1 -1 -1 -1;0.001;1;5;51;0 +1 -1 -1 -1;0.001;1;10;51;0 +1 -1 -1 -1;0.001;1;20;51;0 +1 -1 -1 -1;0.0001;0;5;51;0 +1 -1 -1 -1;0.0001;0;10;51;0 +1 -1 -1 -1;0.0001;0;20;51;0 +1 -1 -1 -1;0.0001;0.1;5;51;0 +1 -1 -1 -1;0.0001;0.1;10;51;0 +1 -1 -1 -1;0.0001;0.1;20;51;0 +1 -1 -1 -1;0.0001;1;5;51;0 +1 -1 -1 -1;0.0001;1;10;51;0 +1 -1 -1 -1;0.0001;1;20;51;0 +0.1 1 -1 -1;0.1;0;5;51;0 +0.1 1 -1 -1;0.1;0;10;51;0 +0.1 1 -1 -1;0.1;0;20;51;0 +0.1 1 -1 -1;0.1;0.1;5;51;0 +0.1 1 -1 -1;0.1;0.1;10;51;0 +0.1 1 -1 -1;0.1;0.1;20;51;0 +0.1 1 -1 -1;0.1;1;5;51;0 +0.1 1 -1 -1;0.1;1;10;51;0 +0.1 1 -1 -1;0.1;1;20;51;0 +0.1 1 -1 -1;0.01;0;5;51;0 +0.1 1 -1 -1;0.01;0;10;51;0 +0.1 1 -1 -1;0.01;0;20;51;0 +0.1 1 -1 -1;0.01;0.1;5;51;0 +0.1 1 -1 -1;0.01;0.1;10;51;0 +0.1 1 -1 -1;0.01;0.1;20;51;0 +0.1 1 -1 -1;0.01;1;5;51;0 +0.1 1 -1 -1;0.01;1;10;51;0 +0.1 1 -1 -1;0.01;1;20;51;0 +0.1 1 -1 -1;0.001;0;5;51;0 +0.1 1 -1 -1;0.001;0;10;51;0 +0.1 1 -1 -1;0.001;0;20;51;0 +0.1 1 -1 -1;0.001;0.1;5;51;0 +0.1 1 -1 -1;0.001;0.1;10;51;0 +0.1 1 -1 -1;0.001;0.1;20;51;0 +0.1 1 -1 -1;0.001;1;5;51;0 +0.1 1 -1 -1;0.001;1;10;51;0 +0.1 1 -1 -1;0.001;1;20;51;0 +0.1 1 -1 -1;0.0001;0;5;51;0 +0.1 1 -1 -1;0.0001;0;10;51;0 +0.1 1 -1 -1;0.0001;0;20;51;0 +0.1 1 -1 -1;0.0001;0.1;5;51;0 +0.1 1 -1 -1;0.0001;0.1;10;51;0 +0.1 1 -1 -1;0.0001;0.1;20;51;0 +0.1 1 -1 -1;0.0001;1;5;51;0 +0.1 1 -1 -1;0.0001;1;10;51;0 +0.1 1 -1 -1;0.0001;1;20;51;0 +0.1 0.2 0.5 1;0.1;0;5;51;0 +0.1 0.2 0.5 1;0.1;0;10;51;0 +0.1 0.2 0.5 1;0.1;0;20;51;0 +0.1 0.2 0.5 1;0.1;0.1;5;51;0 +0.1 0.2 0.5 1;0.1;0.1;10;51;0 +0.1 0.2 0.5 1;0.1;0.1;20;51;0 +0.1 0.2 0.5 1;0.1;1;5;51;0 +0.1 0.2 0.5 1;0.1;1;10;51;0 +0.1 0.2 0.5 1;0.1;1;20;51;0 +0.1 0.2 0.5 1;0.01;0;5;51;0 +0.1 0.2 0.5 1;0.01;0;10;51;0 +0.1 0.2 0.5 1;0.01;0;20;51;0 +0.1 0.2 0.5 1;0.01;0.1;5;51;0 +0.1 0.2 0.5 1;0.01;0.1;10;51;0 +0.1 0.2 0.5 1;0.01;0.1;20;51;0 +0.1 0.2 0.5 1;0.01;1;5;51;0 +0.1 0.2 0.5 1;0.01;1;10;51;0 +0.1 0.2 0.5 1;0.01;1;20;51;0 +0.1 0.2 0.5 1;0.001;0;5;51;0 +0.1 0.2 0.5 1;0.001;0;10;51;0 +0.1 0.2 0.5 1;0.001;0;20;51;0 +0.1 0.2 0.5 1;0.001;0.1;5;51;0 +0.1 0.2 0.5 1;0.001;0.1;10;51;0 +0.1 0.2 0.5 1;0.001;0.1;20;51;0 +0.1 0.2 0.5 1;0.001;1;5;51;0 +0.1 0.2 0.5 1;0.001;1;10;51;0 +0.1 0.2 0.5 1;0.001;1;20;51;0 +0.1 0.2 0.5 1;0.0001;0;5;51;0 +0.1 0.2 0.5 1;0.0001;0;10;51;0 +0.1 0.2 0.5 1;0.0001;0;20;51;0 +0.1 0.2 0.5 1;0.0001;0.1;5;51;0 +0.1 0.2 0.5 1;0.0001;0.1;10;51;0 +0.1 0.2 0.5 1;0.0001;0.1;20;51;0 +0.1 0.2 0.5 1;0.0001;1;5;51;0 +0.1 0.2 0.5 1;0.0001;1;10;51;0 +0.1 0.2 0.5 1;0.0001;1;20;51;0 \ No newline at end of file diff --git a/case_studies/lotka_volterra_UDE_case_study/scripts/test4.ipynb b/case_studies/lotka_volterra_UDE_case_study/scripts/test4.ipynb new file mode 100644 index 00000000..aee8eca3 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scripts/test4.ipynb @@ -0,0 +1,982 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "1abb758a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Markus\\anaconda3\\envs\\pymob3\\Lib\\site-packages\\sympy2jax\\sympy_module.py:290: UserWarning: `equinox.static_field` is deprecated in favour of `equinox.field(static=True)`\n", + " has_extra_funcs: bool = eqx.static_field()\n" + ] + } + ], + "source": [ + "from lotka_volterra_UDE_case_study.mod import Func, Func1D\n", + "import jax.random as jrandom\n", + "import jax.numpy as jnp\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import xarray as xr\n", + "from pymob.simulation import SimulationBase\n", + "from pymob.solvers.diffrax import JaxSolver, UDESolver\n", + "from pymob.sim.config import Param\n", + "import diffrax\n", + "import jax.random as jr\n", + "import jax\n", + "\n", + "# jax.config.update('jax_enable_x64', True)" + ] + }, + { + "cell_type": "markdown", + "id": "7d6b52b2", + "metadata": {}, + "source": [ + "method to create artificial data" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7608a8c3", + "metadata": {}, + "outputs": [], + "source": [ + "def _get_data(ts, theta, max, min, noisiness, *, key):\n", + " \"\"\"\n", + " Returns a single time series (evaluated at the time points defined by ts) of the \n", + " Lotka-Volterra model with some normally-distributed noise. Initial conditions for \n", + " prey and predator are both chosen randomly from the range [min, max].\n", + "\n", + " Parameters\n", + " ----------\n", + " ts : jax.ArrayImpl\n", + " An array containing all the time points the timeseries should be evaluated for.\n", + " theta : list\n", + " A list of four floats representing the parameters of the Lotka Volterra model\n", + " [alpha, beta, gamma, delta].\n", + " max : float\n", + " Maximum value for the initial prey and predator values (before adding noise).\n", + " min : float\n", + " Minimum value for the initial prey and predator values (before adding noise).\n", + " noisiness : float\n", + " Scale of the normal distribution the noise is drawn from. I fnoisiness == 0,\n", + " no noise is added.\n", + " key : jax.ArrayImpl, optional\n", + " A key used to make stochastic processes (in this case the noise values drawn \n", + " from a normal distribution) reproducible. If no key is provided, noise may\n", + " differ between runs.\n", + "\n", + " Returns:\n", + " --------\n", + " jax.ArrayImpl\n", + " An array containing a noisy Lotka Volterra time series, evaluated at time\n", + " points ts.\n", + " \"\"\"\n", + " \n", + " y0 = jr.uniform(key, (2,), minval=min, maxval=max)\n", + "\n", + " def f(t, y, args):\n", + " dXdt = theta[0] * y[0] - theta[1] * y[0] * y[1]\n", + " dYdt = theta[2] * y[0] * y[1] - theta[3] * y[1]\n", + " return jnp.stack([dXdt, dYdt], axis=-1)\n", + "\n", + " solver = diffrax.Tsit5()\n", + " dt0 = 0.1\n", + " saveat = diffrax.SaveAt(ts=ts)\n", + " sol = diffrax.diffeqsolve(\n", + " diffrax.ODETerm(f), solver, ts[0], ts[-1], dt0, y0, saveat=saveat\n", + " )\n", + " ys = sol.ys\n", + " noise = jr.normal(key=key, shape=(len(ts), 2))\n", + " ys += noisiness * noise\n", + " return jnp.greater(ys, jnp.zeros(ys.shape)) * ys + 1e-8\n", + "\n", + "def get_data(dataset_size, theta, max, min, t_end, datapoints, noisiness, *, key):\n", + " \"\"\"\n", + " Returns multiple time series (evaluated at the time points defined by ts) of the \n", + " Lotka-Volterra model with some normally-distributed noise and different initial \n", + " conditions for prey and predator chosen randomly from the range [min, max].\n", + "\n", + " Parameters\n", + " ----------\n", + " dataset_size : int\n", + " The amount of generated time series.\n", + " theta : list\n", + " A list of four floats representing the parameters of the Lotka Volterra model\n", + " [alpha, beta, gamma, delta].\n", + " max : float\n", + " Maximum value for the initial prey and predator values (before adding noise).\n", + " min : float\n", + " Minimum value for the initial prey and predator values (before adding noise).\n", + " t_end : float\n", + " The last point in time that the time series are supposed to contain.\n", + " datapoints : int\n", + " The amount of evenly-spaced datapoints each time series is supposed to contain.\n", + " noisiness : float\n", + " Scale of the normal distribution the noise is drawn from. If noisiness == 0,\n", + " no noise is added.\n", + " key : jax.Array\n", + " A key used to make stochastic processes (in this case the noise values drawn \n", + " from a normal distribution) reproducible. If no key is provided, noise may\n", + " differ between runs.\n", + "\n", + " Returns:\n", + " --------\n", + " jax.ArrayImpl\n", + " An array containing multiple noisy Lotka Volterra time series, evaluated at time\n", + " points ts.\n", + " \"\"\"\n", + "\n", + " ts = jnp.linspace(0, t_end, datapoints)\n", + " key = jr.split(key, dataset_size)\n", + " ys = jax.vmap(lambda key: _get_data(ts, theta, max, min, noisiness, key=key))(key)\n", + " return ts, ys" + ] + }, + { + "cell_type": "markdown", + "id": "c5fddc62", + "metadata": {}, + "source": [ + "create a simulation with only one data batch (x_in can be added by uncommenting the corresponding lines of code but then the model has to be changed, too)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c4f50f0a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Markus\\AppData\\Local\\Temp\\ipykernel_14488\\32602615.py:22: FutureWarning: In a future version of xarray the default value for join will change from join='outer' to join='exact'. This change will result in the following ValueError: cannot be aligned with join='exact' because index/labels/sizes are not equal along these coordinates (dimensions): 'time' ('time',) The recommendation is to set join explicitly for this case.\n", + " test_data = xr.merge([test_data1, test_data2])\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:309: UserWarning: `sim.config.data_structure.prey = Datavariable(dimensions=['time'] min=nan max=nan observed=True dimensions_evaluator=None)` has been assumed from `sim.observations`. If the order of the dimensions should be different, specify `sim.config.data_structure.prey = DataVariable(dimensions=[...], ...)` manually.\n", + " warnings.warn(\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:309: UserWarning: `sim.config.data_structure.predator = Datavariable(dimensions=['time'] min=9.99999993922529e-09 max=8.670677185058594 observed=True dimensions_evaluator=None)` has been assumed from `sim.observations`. If the order of the dimensions should be different, specify `sim.config.data_structure.predator = DataVariable(dimensions=[...], ...)` manually.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(variable=prey, min=9.99999993922529e-09, max=9.192420959472656)\n", + "MinMaxScaler(variable=predator, min=9.99999993922529e-09, max=8.670677185058594)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:579: UserWarning: The number of ODE states was not specified in the config file [simulation] > 'n_ode_states = '. Extracted the return arguments ['jnp.array[dprey_dt.astypefloat', 'dpredator_dt.astypefloat]'] from the source code. Setting 'n_ode_states=2.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbcAAAFuCAYAAAACplYMAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAM/RJREFUeJzt3QeUVFW2//Hd0HSTJGckCCggCDzBRkRFBcSEiDqw1AWIMzIi+AdxHMEA4qgoimEQZWREmWUAExgfggj61BaGIDpkFAUZcmiwpWjC/a/feXPrVTfdQMequvX9rHWpdG/VrUt17Trn7Ht2kud5ngEAECClor0DAAAUNYIbACBwCG4AgMAhuAEAAofgBgAIHIIbACBwCG4AgMAhuAEAAofgBgAIHIIbACBw4iq4ffHFF9azZ0+rV6+eJSUl2axZs/K1/YIFC6xXr15Wt25dq1ChgrVr185ee+21bOscOnTIHnroIWvatKmVLVvW2rZta7Nnzy7idwIAKE5xFdwyMzNdsJk0aVKBtv/666+tTZs29s4779h3331nAwcOtP79+9uHH34YXuf++++3v/3tbzZx4kRbuXKl3Xbbbda7d29btmxZEb4TAEBxSorXiZPVcps5c6Zdc8014fsOHjxo9913n73xxhu2d+9ea926tT3++ON20UUX5fk8V155pdWuXdumTp3qbqtVqOcYMmRIeJ3rrrvOypUrZ6+++moxvysAQMK13E5k6NChlp6ebtOnT3cts9/97nd22WWX2bp16/LcJiMjw6pVq5YtQKo7MpIC25dfflms+w4AKDqBablt3LjRmjRp4i7V+vJ169bN0tLS7NFHHz3mOd58803r16+fLV261Fq1auXuu/HGG2358uVuPE/jbvPmzXPjdEeOHHGBDwAQ+5ItIL7//nsXgM4444xs9ysgVa9e/Zj158+f78bcpkyZEg5s8uyzz9qtt95qLVq0cAFUAU7r+d2WAIDYF5jg9uuvv1rp0qVtyZIl7jJSxYoVs93+/PPPXdbl008/7RJKItWsWdO12kKhkO3atcu1AkeOHOlahQCA+BCY4PZf//VfruW2fft2u+CCC457OsBVV13lEk0GDRqU53oad6tfv747NUDZlX369CmmPQcAJHRwU+ts/fr14dsbNmywb7/91iWEqDvypptuci2xCRMmuGC3Y8cON2am9H9l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buijSZMmdtNNN9nGjRujclzioipAYezcudP9YdauXTvb/bq9evXqqO1XrFFgk9yOk/9Y0Km0ksZNOnfubK1bt3b36b2npKRYlSpVEvK4fP/99y6YqWtaYyQzZ860M88807799tuEPi4K9BriULdkTon8menYsaO98sor1rx5c9clOXbsWLvgggvsX//6V4kfl8AHNyA/v8T1Rxg5RpDo9CWlQKYW7dtvv20DBgxwYyWJTPXIhg0b5sZolaCG/3P55ZeHr2scUsGuUaNG9uabb7oktZIU+G7JGjVqWOnSpY/JyNHtOnXqRG2/Yo1/LBL1OA0dOtQ+/PBDmz9/frbagXrv6treu3dvQh4X/dJu1qyZtW/f3mWWKiHp2WefTejjou41JaOdffbZlpyc7BYFfCVj6bpaIol6bHJSK+2MM86w9evXl/hnplQi/HHqD3PevHnZup90W90t+F+nnXaa+4BFHidVzlXWZJCPk3JrFNjU3fbZZ5+54xBJn50yZcpkOy46VUDjCEE+LnnR387BgwcT+rh07drVddeqResvHTp0cONL/vVEPTY5/frrr/bDDz+404tK/DPjJYDp06e7rL9XXnnFW7lypTdo0CCvSpUq3tatW71EouyuZcuWuUX/9U899ZS7/vPPP7vHH3vsMXdc3nvvPe+7777zevXq5Z122mnegQMHvKAaPHiwV7lyZW/BggXeli1bwstvv/0WXue2227zGjZs6H322Wfe4sWLvU6dOrkl6EaOHOmyRjds2OA+D7qdlJTkzZkzJ6GPS24isyUT+djcdddd7m9Jn5mvvvrK69atm1ejRg2XhVzSxyUhgptMnDjRHdSUlBR3asA333zjJZr58+e7oJZzGTBgQPh0gAceeMCrXbu2+zHQtWtXb82aNV6Q5XY8tLz88svhdRTcb7/9dpcGX758ea93794uAAbdLbfc4jVq1Mj9zdSsWdN9HvzAlsjH5WSCW6Iem759+3p169Z1n5n69eu72+vXr4/KcaGeGwAgcAI/5gYASDwENwBA4BDcAACBQ3ADAAQOwQ0AEDgENwBA4BDcAACBQ3ADAAQOwQ0AEDgENwBA4BDcAAAWNP8f2/7GxqqiuqAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Initialize the simulation object\n", + "sim = SimulationBase()\n", + "\n", + "# Configure the case study\n", + "sim.config.case_study.name = \"lotka_volterra_UDE_case_study\"\n", + "sim.config.case_study.scenario = \"UDETest\"\n", + "\n", + "key = jrandom.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jrandom.split(key, 3)\n", + "\n", + "# Add the model to the simulation\n", + "sim.model = Func({\"alpha\":jnp.array(1.3), \"delta\":jnp.array(1.8)},key=model_key)\n", + "\n", + "# Define a solver\n", + "sim.solver = UDESolver\n", + "\n", + "ts,ys = get_data(1, [1.3,0.9,0.8,1.8], 1, 5, 50, 201, 1, key=jr.PRNGKey(0))\n", + "\n", + "# Create an xArray dataset containing the artificial data\n", + "test_data1 = xr.DataArray(ys[0,::2,0], coords={\"time\": ts[0::2]}).to_dataset(name=\"prey\")\n", + "test_data2 = xr.DataArray(ys[0,:,1], coords={\"time\": ts}).to_dataset(name=\"predator\")\n", + "test_data = xr.merge([test_data1, test_data2])\n", + "\n", + "# Add our dataset to the simulation\n", + "sim.observations = test_data\n", + "\n", + "# Add the initial condition to the simulation\n", + "sim.model_parameters[\"y0\"] = sim.observations.sel(time = 0).drop_vars(\"time\")\n", + "\n", + "# Create an xArray dataset containing the external input data\n", + "# xin = xr.DataArray(np.zeros(201), coords={\"time\": ts}).to_dataset(name=\"x_in\")\n", + "\n", + "# Add external inputs to the simulation\n", + "# sim.model_parameters[\"x_in\"] = xin\n", + "\n", + "sim.config.jaxsolver.max_steps = 100000\n", + "sim.config.jaxsolver.throw_exception = True\n", + "\n", + "# Put everything in place for running the simulation\n", + "sim.dispatch_constructor()\n", + "\n", + "# Create an evaluator, run the simulation and obtain the results\n", + "evaluator = sim.dispatch()\n", + "evaluator()\n", + "data_res = evaluator.results\n", + "\n", + "# Plot the results\n", + "fig, ax = plt.subplots(figsize=(5, 4))\n", + "ax.plot(test_data.time, test_data.prey, ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(test_data.time, test_data.predator, ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(data_res.time, data_res.prey, color=\"black\", label =\"result\")\n", + "ax.plot(data_res.time, data_res.predator, color=\"black\", label =\"result\")\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "id": "697376ec", + "metadata": {}, + "source": [ + "create a simulation with n data batches (same situation as above for x_in)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "eb95c563", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Markus\\AppData\\Local\\Temp\\ipykernel_14488\\3215443746.py:26: FutureWarning: In a future version of xarray the default value for join will change from join='outer' to join='exact'. This change will result in the following ValueError: cannot be aligned with join='exact' because index/labels/sizes are not equal along these coordinates (dimensions): 'time' ('time',) The recommendation is to set join explicitly for this case.\n", + " test_data = xr.merge([test_data1, test_data2])\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:309: UserWarning: `sim.config.data_structure.prey = Datavariable(dimensions=['batch_id', 'time'] min=nan max=nan observed=True dimensions_evaluator=None)` has been assumed from `sim.observations`. If the order of the dimensions should be different, specify `sim.config.data_structure.prey = DataVariable(dimensions=[...], ...)` manually.\n", + " warnings.warn(\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:309: UserWarning: `sim.config.data_structure.predator = Datavariable(dimensions=['batch_id', 'time'] min=0.12846745550632477 max=5.574018478393555 observed=True dimensions_evaluator=None)` has been assumed from `sim.observations`. If the order of the dimensions should be different, specify `sim.config.data_structure.predator = DataVariable(dimensions=[...], ...)` manually.\n", + " warnings.warn(\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:579: UserWarning: The number of ODE states was not specified in the config file [simulation] > 'n_ode_states = '. Extracted the return arguments ['jnp.array[dprey_dt.astypefloat', 'dpredator_dt.astypefloat]'] from the source code. Setting 'n_ode_states=2.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(variable=prey, min=0.3210952579975128, max=7.368402004241943)\n", + "MinMaxScaler(variable=predator, min=0.12846745550632477, max=5.574018478393555)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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hmHYgluPHj3EChjciIi83L59+/ScW6VKleT2228XK2BwIyLycuvXr9fbO++8UypUqCBWwOBGROTlNvynS7Jnz55iFQxuRERe7OLFi/L9999b6nwbMLgREXmxf/3rX5KZmSk33nijNG3aVKyCwY2IyIutWbNGb/v3768XcFsFgxsRkZfKyMiQdevW6f37779frKREwS0qKkoaNWqkWTWY0C4mJqbAdRctWqRDueCKdywRERGFrk9ERM6xefNmSU1NlTp16kj79u3Fq4PbypUrZezYsTJ16lTZtWuXhIaG6knI+Pj4fNffunWrDBo0SLZs2aIzvNavX1/uvvtuOXXqVGmUn4iISmjt2rV6269fP53DzUp8DFya7gC01G677TZ577339HF2drYGrGeffVbGjx9f5PZZWVnagsP2Q4cOLdY+U1JSpFq1apKcnOzxcwwREbmDK1euaIstMTFRNm7cqL1q7s6RWFDO0cqIjY3NUQmI9niMVllxXLp0STNzqlevXmg/MD6E/UJERKV74XZiYqKEhIToxdtW41BwS0hI0JZXcHBwjufx+MyZM8V6j3HjxumvhcJ+JUyfPl2js7mgZUhERKXnn//8p94+8sgj4ufnJ1bj1E7Wt956S1asWKH9vIUN8TJhwgRtdprLyZMnnVlMIiJLS0pKki+//FLvDxkyRKzIoXAdFBQkvr6+cvbs2RzP4zGatoV5++23Nbht2rRJ5wsqTEBAgC5ERFT6Vq9erad/WrZsqUmBVuRQy83f31/atWun6aMmJJTgcceOHQvcbubMmfLaa69pH++tt956bSUmIqJr8o9//MPWarPShdv2HO5oxWUAkZGRGqRwXcTcuXMlLS1Nhg8frq8jA7Ju3bp63gxmzJghU6ZMkeXLl+u1cea5uSpVquhCRETOs3PnTr3WGI2VYcOGiVU5HNwGDhwo586d04CFQBUWFqYtMjPJJC4uLsf1EvPnz9csywcffDDH++A6uVdeeaU0PgMRERXT/Pnz9RbH5Fq1aolVOXydmyvwOjciomt34cIFzVZPT0+XH374QcLDw8WTlNl1bkRE5LkWLVqkgQ1JfZ06dRIrY3AjIvIC6enpMmfOHL3/3HPPWTaRxMTgRkTkBT788EPNk8CgGLhw2+oY3IiILO7q1at6SRY8//zzmilpdQxuRERe0Gr77bffpEaNGvL444+L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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = 50\n", + "\n", + "# Initialize the simulation object\n", + "sim = SimulationBase()\n", + "\n", + "# Configure the case study\n", + "sim.config.case_study.name = \"lotka_volterra_UDE_case_study\"\n", + "sim.config.case_study.scenario = \"UDETest\"\n", + "\n", + "key = jrandom.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jrandom.split(key, 3)\n", + "\n", + "# Add the model to the simulation\n", + "sim.model = Func({\"alpha\":jnp.array(1.3), \"delta\":jnp.array(1.8)},key=model_key)\n", + "\n", + "# Define a solver\n", + "sim.solver = UDESolver\n", + "\n", + "ts,ys = get_data(n, [0.65,0.45,0.4,0.9], 5, 1, 20, 201, 0, key=jr.PRNGKey(0))\n", + "\n", + "# Create an xArray dataset containing the artificial data\n", + "datasets = jnp.linspace(0,n-1,n)\n", + "\n", + "test_data1 = xr.DataArray(ys[:,::2,0], coords={\"batch_id\": datasets, \"time\": ts[0::2]}).to_dataset(name=\"prey\")\n", + "test_data2 = xr.DataArray(ys[:,:,1], coords={\"batch_id\": datasets, \"time\": ts}).to_dataset(name=\"predator\")\n", + "test_data = xr.merge([test_data1, test_data2])\n", + "\n", + "# Add our dataset to the simulation\n", + "sim.observations = test_data\n", + "\n", + "# Add the initial condition to the simulation\n", + "sim.model_parameters[\"y0\"] = sim.observations.sel(time = 0).drop_vars(\"time\")\n", + "\n", + "# Create an xArray dataset containing the external input data\n", + "# xin = xr.DataArray(np.zeros(201), coords={\"time\": ts}).to_dataset(name=\"x_in\")\n", + "\n", + "# Add external inputs to the simulation\n", + "# sim.model_parameters[\"x_in\"] = xin\n", + "\n", + "sim.config.jaxsolver.max_steps = 100000\n", + "sim.config.jaxsolver.throw_exception = False\n", + "\n", + "# Put everything in place for running the simulation\n", + "sim.dispatch_constructor()\n", + "\n", + "# Create an evaluator, run the simulation and obtain the results\n", + "evaluator = sim.dispatch()\n", + "evaluator()\n", + "data_res = evaluator.results\n", + "\n", + "# Plot the results\n", + "fig, ax = plt.subplots(figsize=(5, 4))\n", + "ax.plot(test_data.time, test_data.prey.sel(batch_id = 1), ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(test_data.time, test_data.predator.sel(batch_id = 1), ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(data_res.time, data_res.prey.sel(batch_id = 1), color=\"black\", label =\"result\")\n", + "ax.plot(data_res.time, data_res.predator.sel(batch_id = 1), color=\"black\", label =\"result\")\n", + "ax.legend()" + ] + }, + { + "cell_type": "markdown", + "id": "224eb22d", + "metadata": {}, + "source": [ + "initialize inferer" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e564ffd2", + "metadata": {}, + "outputs": [], + "source": [ + "sim.config.inference_optax.UDE_parameters.alpha = Param(value=1.3, free=False)\n", + "sim.config.inference_optax.UDE_parameters.delta = Param(value=1.8, free=True)\n", + "sim.config.inference_optax.UDE_parameters.delta.prior = \"uniform(loc=1.0,scale=2.0)\"\n", + "\n", + "sim.config.inference_optax.MLP_weight_dist = \"normal()\"\n", + "sim.config.inference_optax.MLP_bias_dist = \"normal()\"\n", + "sim.config.inference_optax.batch_size = int(n/3)\n", + "sim.config.inference_optax.data_split = 0.8\n", + "sim.config.inference_optax.multiple_runs_target = 2\n", + "sim.config.inference_optax.multiple_runs_limit = 5\n", + "\n", + "sim.set_inferer(\"optax\")" + ] + }, + { + "cell_type": "markdown", + "id": "b3dee184", + "metadata": {}, + "source": [ + "runs inferer (implementation using the `standalone_solver` workaround)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3dd3a8f6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2 of 2 runs completed: 100%|█████████▉| 2199.9999999999077/2200.0 [02:43<00:00, 13.48it/s, 0 unsuccessful runs so far] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "run number\tsuccessful?\tloss\n", + "\n", + "run 1\t\tyes\t\t0.03481396287679672\n", + "run 2\t\tyes\t\t0.055918872356414795\n" + ] + } + ], + "source": [ + "sim.inferer.run()" + ] + }, + { + "cell_type": "markdown", + "id": "56c7c04c", + "metadata": {}, + "source": [ + "runs inferer (implementation using the standard `evaluator()` workflow)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35ea59fd", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "1 of 2 runs completed: 50%|█████ | 1106.3999999999928/2200.0 [02:42<27:32, 1.51s/it, 0 unsuccessful runs so far] " + ] + } + ], + "source": [ + "sim.inferer.run2()" + ] + }, + { + "cell_type": "markdown", + "id": "35b16fe4", + "metadata": {}, + "source": [ + "beautiful plots" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "874c9712", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([,\n", + " ,\n", + " ,\n", + " ,\n", + " ], dtype=object)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sim.inferer.plot_posterior_predictions(\"predator\", \"time\", n=5)" + ] + }, + { + "cell_type": "markdown", + "id": "84fefa86", + "metadata": {}, + "source": [ + "save observations and config (saves into wrong directory and was only used to debug saving)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "aa922d4a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scenario directory exists at 'c:\\Users\\Markus\\pymob\\case_studies\\lotka_volterra_UDE_case_study\\scripts\\case_studies\\lotka_volterra_UDE_case_study\\scenarios\\UDETest'.\n", + "Results directory exists at 'c:\\Users\\Markus\\pymob\\case_studies\\lotka_volterra_UDE_case_study\\scripts\\case_studies\\lotka_volterra_UDE_case_study\\results\\UDETest'.\n" + ] + } + ], + "source": [ + "# Set the data paths we want to save to and create the necessary folders if they don't exist yet\n", + "import os\n", + "sim.config.create_directory(\"scenario\", force=True)\n", + "sim.config.create_directory(\"results\", force=True)\n", + "os.makedirs(sim.data_path, exist_ok=True)\n", + "\n", + "# Save our configuration and observations\n", + "sim.save_observations(force=True)\n", + "sim.config.save(force=True)" + ] + }, + { + "cell_type": "markdown", + "id": "17fe9e8f", + "metadata": {}, + "source": [ + "more or less the same for a 1-dimensional model" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cfadb16b", + "metadata": {}, + "outputs": [], + "source": [ + "def _get_data(ts, theta, max, min, noisiness, *, key):\n", + " \"\"\"\n", + " Returns a single time series (evaluated at the time points defined by ts) of the \n", + " Lotka-Volterra model with some normally-distributed noise. Initial conditions for \n", + " prey and predator are both chosen randomly from the range [min, max].\n", + "\n", + " Parameters\n", + " ----------\n", + " ts : jax.ArrayImpl\n", + " An array containing all the time points the timeseries should be evaluated for.\n", + " theta : list\n", + " A list of four floats representing the parameters of the Lotka Volterra model\n", + " [alpha, beta, gamma, delta].\n", + " max : float\n", + " Maximum value for the initial prey and predator values (before adding noise).\n", + " min : float\n", + " Minimum value for the initial prey and predator values (before adding noise).\n", + " noisiness : float\n", + " Scale of the normal distribution the noise is drawn from. If noisiness == 0,\n", + " no noise is added.\n", + " key : jax.ArrayImpl, optional\n", + " A key used to make stochastic processes (in this case the noise values drawn \n", + " from a normal distribution) reproducible. If no key is provided, noise may\n", + " differ between runs.\n", + "\n", + " Returns:\n", + " --------\n", + " jax.ArrayImpl\n", + " An array containing a noisy Lotka Volterra time series, evaluated at time\n", + " points ts.\n", + " \"\"\"\n", + " \n", + " y0 = jr.uniform(key, (), minval=min, maxval=max)\n", + "\n", + " def f(t, y, args):\n", + " dYdt = theta[0]*y - theta[0]/theta[1]*y**2\n", + " return dYdt\n", + "\n", + " solver = diffrax.Tsit5()\n", + " dt0 = 0.1\n", + " saveat = diffrax.SaveAt(ts=ts)\n", + " sol = diffrax.diffeqsolve(\n", + " diffrax.ODETerm(f), solver, ts[0], ts[-1], dt0, y0, saveat=saveat\n", + " )\n", + " ys = sol.ys\n", + " noise = jr.normal(key=key, shape=(len(ts)))\n", + " ys += noisiness * noise\n", + " return jnp.greater(ys, jnp.zeros(ys.shape)) * ys + 1e-8\n", + "\n", + "def get_data(dataset_size, theta, max, min, t_end, datapoints, noisiness, *, key):\n", + " \"\"\"\n", + " Returns multiple time series (evaluated at the time points defined by ts) of the \n", + " Lotka-Volterra model with some normally-distributed noise and different initial \n", + " conditions for prey and predator chosen randomly from the range [min, max].\n", + "\n", + " Parameters\n", + " ----------\n", + " dataset_size : int\n", + " The amount of generated time series.\n", + " theta : list\n", + " A list of four floats representing the parameters of the Lotka Volterra model\n", + " [alpha, beta, gamma, delta].\n", + " max : float\n", + " Maximum value for the initial prey and predator values (before adding noise).\n", + " min : float\n", + " Minimum value for the initial prey and predator values (before adding noise).\n", + " t_end : float\n", + " The last point in time that the time series are supposed to contain.\n", + " datapoints : int\n", + " The amount of evenly-spaced datapoints each time series is supposed to contain.\n", + " noisiness : float\n", + " Scale of the normal distribution the noise is drawn from. If noisiness == 0,\n", + " no noise is added.\n", + " key : jax.Array\n", + " A key used to make stochastic processes (in this case the noise values drawn \n", + " from a normal distribution) reproducible. If no key is provided, noise may\n", + " differ between runs.\n", + "\n", + " Returns:\n", + " --------\n", + " jax.ArrayImpl\n", + " An array containing multiple noisy Lotka Volterra time series, evaluated at time\n", + " points ts.\n", + " \"\"\"\n", + "\n", + " ts = jnp.linspace(0, t_end, datapoints)\n", + " key = jr.split(key, dataset_size)\n", + " ys = jax.vmap(lambda key: _get_data(ts, theta, max, min, noisiness, key=key))(key)\n", + " return ts, ys" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e90ed3a9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:309: UserWarning: `sim.config.data_structure.X = Datavariable(dimensions=['time'] min=7.269932270050049 max=17.866065979003906 observed=True dimensions_evaluator=None)` has been assumed from `sim.observations`. If the order of the dimensions should be different, specify `sim.config.data_structure.X = DataVariable(dimensions=[...], ...)` manually.\n", + " warnings.warn(\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:579: UserWarning: The number of ODE states was not specified in the config file [simulation] > 'n_ode_states = '. Extracted the return arguments ['jnp.arraydX_dt.astypefloat'] from the source code. Setting 'n_ode_states=1.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(variable=X, min=7.269932270050049, max=17.866065979003906)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Initialize the simulation object\n", + "sim = SimulationBase()\n", + "\n", + "# Configure the case study\n", + "sim.config.case_study.name = \"lotka_volterra_UDE_case_study\"\n", + "sim.config.case_study.scenario = \"UDETest1D\"\n", + "\n", + "key = jrandom.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jrandom.split(key, 3)\n", + "\n", + "# Add the model to the simulation\n", + "sim.model = Func1D({\"r\":jnp.array(0.5)},key=model_key)\n", + "\n", + "# Define a solver\n", + "sim.solver = UDESolver\n", + "\n", + "ts,ys = get_data(1, [0.5,10], 20, 0.1, 100, 101, 1, key=jr.PRNGKey(0))\n", + "\n", + "# Create an xArray dataset containing the artificial data\n", + "test_data = xr.DataArray(ys[0,::2], coords={\"time\": ts[0::2]}).to_dataset(name=\"X\")\n", + "\n", + "# Add our dataset to the simulation\n", + "sim.observations = test_data\n", + "\n", + "# Add the initial condition to the simulation\n", + "sim.model_parameters[\"y0\"] = sim.observations.sel(time = 0).drop_vars(\"time\")\n", + "\n", + "# Create an xArray dataset containing the external input data\n", + "# xin = xr.DataArray(np.zeros(101), coords={\"time\": ts}).to_dataset(name=\"x_in\")\n", + "\n", + "# Add external inputs to the simulation\n", + "# sim.model_parameters[\"x_in\"] = xin\n", + "\n", + "sim.config.jaxsolver.max_steps = 100000\n", + "\n", + "# Put everything in place for running the simulation\n", + "sim.dispatch_constructor()\n", + "\n", + "# Create an evaluator, run the simulation and obtain the results\n", + "evaluator = sim.dispatch()\n", + "evaluator()\n", + "data_res = evaluator.results\n", + "\n", + "# Plot the results\n", + "fig, ax = plt.subplots(figsize=(5, 4))\n", + "ax.plot(test_data.time, test_data.X, ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(data_res.time, data_res.X, color=\"black\", label =\"result\")\n", + "ax.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "90548eac", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:309: UserWarning: `sim.config.data_structure.X = Datavariable(dimensions=['batch_id', 'time'] min=9.99999993922529e-09 max=19.354379653930664 observed=True dimensions_evaluator=None)` has been assumed from `sim.observations`. If the order of the dimensions should be different, specify `sim.config.data_structure.X = DataVariable(dimensions=[...], ...)` manually.\n", + " warnings.warn(\n", + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:579: UserWarning: The number of ODE states was not specified in the config file [simulation] > 'n_ode_states = '. Extracted the return arguments ['jnp.arraydX_dt.astypefloat'] from the source code. Setting 'n_ode_states=1.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(variable=X, min=9.99999993922529e-09, max=19.354379653930664)\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "n = 10\n", + "\n", + "# Initialize the simulation object\n", + "sim = SimulationBase()\n", + "\n", + "# Configure the case study\n", + "sim.config.case_study.name = \"lotka_volterra_UDE_case_study\"\n", + "sim.config.case_study.scenario = \"UDETest1D\"\n", + "\n", + "key = jrandom.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jrandom.split(key, 3)\n", + "\n", + "# Add the model to the simulation\n", + "sim.model = Func1D({\"r\":jnp.array(0.5)},key=model_key)\n", + "\n", + "# Define a solver\n", + "sim.solver = UDESolver\n", + "\n", + "ts,ys = get_data(n, [0.5,10], 20, 0.1, 100, 101, 1, key=jr.PRNGKey(0))\n", + "\n", + "# Create an xArray dataset containing the artificial data\n", + "datasets = jnp.linspace(0,n-1,n)\n", + "\n", + "test_data = xr.DataArray(ys[:,::2], coords={\"batch_id\": datasets, \"time\": ts[0::2]}).to_dataset(name=\"X\")\n", + "\n", + "# Add our dataset to the simulation\n", + "sim.observations = test_data\n", + "\n", + "# Add the initial condition to the simulation\n", + "sim.model_parameters[\"y0\"] = sim.observations.sel(time = 0).drop_vars(\"time\")\n", + "\n", + "# Create an xArray dataset containing the external input data\n", + "# xin = xr.DataArray(np.zeros(101), coords={\"time\": ts}).to_dataset(name=\"x_in\")\n", + "\n", + "# Add external inputs to the simulation\n", + "# sim.model_parameters[\"x_in\"] = xin\n", + "\n", + "sim.config.jaxsolver.max_steps = 100000\n", + "\n", + "# Put everything in place for running the simulation\n", + "sim.dispatch_constructor()\n", + "\n", + "# Create an evaluator, run the simulation and obtain the results\n", + "evaluator = sim.dispatch()\n", + "evaluator()\n", + "data_res = evaluator.results\n", + "\n", + "# Plot the results\n", + "fig, ax = plt.subplots(figsize=(5, 4))\n", + "ax.plot(test_data.time, test_data.X.sel(batch_id = 1), ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(data_res.time, data_res.X.sel(batch_id = 1), color=\"black\", label =\"result\")\n", + "ax.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "da3d0748", + "metadata": {}, + "outputs": [], + "source": [ + "sim.config.inference_optax.UDE_parameters.r = Param(value=0.5, free=False)\n", + "\n", + "sim.config.inference_optax.MLP_weight_dist = \"normal()\"\n", + "sim.config.inference_optax.MLP_bias_dist = \"normal()\"\n", + "sim.config.inference_optax.batch_size = 5\n", + "sim.config.inference_optax.data_split = 0.8\n", + "sim.config.inference_optax.multiple_runs_target = 2\n", + "sim.config.inference_optax.multiple_runs_limit = 10\n", + "\n", + "sim.set_inferer(\"optax\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c7e7dd07", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2 of 2 runs completed: 100%|█████████▉| 2199.999999999909/2200.0 [03:33<00:00, 10.28it/s, 3 unsuccessful runs so far] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "run number\tsuccessful?\tloss\n", + "\n", + "run 1\t\tno\t\t---\n", + "run 2\t\tno\t\t---\n", + "run 3\t\tyes\t\t1.2010711431503296\n", + "run 4\t\tno\t\t---\n", + "run 5\t\tyes\t\t1.0392415523529053\n" + ] + } + ], + "source": [ + "sim.inferer.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6a26284d", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2 of 2 runs completed: 100%|█████████▉| 2199.9999999999077/2200.0 [01:48<00:00, 20.23it/s, 0 unsuccessful runs so far] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "run number\tsuccessful?\tloss\n", + "\n", + "run 1\t\tyes\t\t1.0563292503356934\n", + "run 2\t\tyes\t\t1.0259826183319092\n" + ] + } + ], + "source": [ + "sim.inferer.run2()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "75d16004", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([,\n", + " ], dtype=object)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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bM2YMcNavXq19bvf/c5q3ry5dejQIUeP3S2eeOIJKyUlxZo5c6aVmZlpvffee1aNGjWsF154IXAfyjDUrFmzrD/+8Y/WtGnTtIZkTZ8+PeT2cMrr0ksvtdq3b299+eWX1hdffGGddtpp1uDBg61oIfiXQseOHa0777wzcDkvL89KS0uzMjIyHD0uL9i9e7f5EsyfP99c3rdvn1WxYkXzQ2L75ptvzH0WL17s4JG6z/79+63TTz/d+uyzz6wePXoEgj9lWLKRI0da3bp1K/L2/Px8q2HDhtbTTz8duE7LtXLlytY777wTp6N0tz59+lg33HBDyHUDBgywhgwZYv6mDItXMPiHU17r1683/7ds2bLAfT7++GMrKSnJ+umnn6xooNs/TEePHpUVK1aY7pngfQP08uLFix09Ni/Izs4253Xr1jXnWpbHjh0LKc/WrVtLeno65VmAduv36dMnpKwUZViyDz74QM477zy58sorzfBThw4d5NVXXw3cnpmZKTt37gwpQ10XXYf0KMMTunTpIrNnz5aNGzeay6tXr5aFCxdK7969zWXKsHTCKS89165+/eza9P4ac5YsWSLRkPAb+0RLVlaWGftq0KBByPV6+dtvv3XsuLyys6KOU3ft2lXatm1rrtMPf6VKlcwHvGB56m04YcqUKbJy5UpZtmzZSbdRhiX7/vvvZeLEiTJixAh56KGHTDneddddptyGDh0aKKfCvteU4QmjRo0yu89pxbJ8+fLmd/CJJ54w49GKMiydcMpLz7WyGqxChQqm8RStMiX4Iy4t17Vr15rWAsKn23zefffd8tlnn5kEU5St4qmtp3HjxpnL2vLXz+Irr7xigj9K9u6778rkyZPl7bffljPPPFNWrVplKvOazEYZehfd/mGqV6+eqfUWzKTWyw0bNnTsuNxu+PDhMnPmTJk7d27I1spaZjqUsm/fvpD7U56h3fq7d++Wc845x9T69TR//nx58cUXzd/aUqAMi6fZ1G3atAm57owzzpCtW7eav+1y4ntdtAceeMC0/q+66iozU+Laa6+Ve++918zoUZRh6YRTXnqu3/1gx48fNzMAolWmBP8waTfhueeea8a+glsVerlz586OHpsbaZ6LBv7p06fLnDlzzDShYFqWFStWDClPnQqoP8qU5wm9evWSNWvWmJaWfdJWrHa32n9ThsXToaaCU0x17Lpp06bmb/1c6o9pcBlqF7eOq1KGJxw8eNCMNQfThpD+/inKsHTCKS8910q9NgBs+juqZa65AVERlbRBH03104zMSZMmmWzMW265xUz127lzp9OH5jq33367mcoyb948a8eOHYHTwYMHQ6ap6fS/OXPmmGlqnTt3NicULTjbX1GGJU+RrFChgpmutmnTJmvy5MlWtWrVrLfeeitk2pV+j99//33r66+/tvr16+fraWoFDR061GrUqFFgqp9OX6tXr5714IMPBu5DGZ48Q+err74yJw2zzz33nPl7y5YtYZeXTvXr0KGDmaK6cOFCM+OHqX4Oeumll8yPrc7316l/OgcTJ9MPfGEnnftv0w/6HXfcYdWpU8f8IF9++eWmgoDwgz9lWLIPP/zQatu2ram4t27d2vr73/8ecrtOvRozZozVoEEDc59evXpZGzZscOx43SYnJ8d85vR3r0qVKtapp55q5rAfOXIkcB/KMNTcuXML/f3TilS45bVnzx4T7HVNhVq1alnDhg0zlYpoYUtfAAB8hjF/AAB8huAPAIDPEPwBAPAZgj8AAD5D8AcAwGcI/gAA+AzBHwAAnyH4AwDgMwR/AKUyb948SUpKOmlDIQDewQp/AIp14YUXytlnny3PP/+8uaw7CeruYrqroFYCAHhPBacPAID3drhkq1bA2+j2B1Ck66+/XubPny8vvPCCaeXradKkSSHd/nq5du3aMnPmTGnVqpVUq1ZNrrjiCrMV7Ouvvy7NmjWTOnXqyF133SV5eXmBxz5y5Ijcf//90qhRI6levbrZqlSHFADEHi1/AEXSoL9x40Zp27at/PnPfzbXrVu37qT7aaB/8cUXZcqUKbJ//34ZMGCAXH755aZSMGvWLPn+++9l4MCB0rVrVxk0aJD5n+HDh8v69evN/6Slpcn06dPl0ksvlTVr1sjpp58e99cK+AnBH0CRkpOTTTe/tubtrv5vv/32pPsdO3ZMJk6cKC1atDCXteX/5ptvyq5du6RGjRrSpk0b6dmzp8ydO9cE/61bt8prr71mzjXwK+0F+OSTT8z148aNi/MrBfyF4A8gYlo5sAO/0mRA7e7XwB983e7du83f2rrXIYCWLVuGPI4OBaSkpMTxyAF/IvgDiFjFihVDLmtOQGHX5efnm79zc3OlfPnysmLFCnMeLLjCACA2CP4AiqXd/sGJetHQoUMH85jaE/CrX/0qqo8NoGRk+wMolnbfL1myRH744QfJysoKtN4jod39Q4YMkeuuu06mTZsmmZmZsnTpUsnIyJCPPvooKscNoGgEfwDF0kQ87ZrXpL369eubJL1o0MQ+Df733XefmSLYv39/WbZsmaSnp0fl8QEUjRX+AADwGVr+AAD4DMEfAACfIfgDAOAzBH8AAHyG4A8AgM8Q/AEA8BmCPwAAPkPwBwDAZwj+AAD4DMEfAACfIfgDACD+8v8BPMuD5uY9d2YAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sim.inferer.plot_posterior_predictions(\"X\", \"time\", n=2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pymob3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/case_studies/lotka_volterra_UDE_case_study/scripts/testcfg.ipynb b/case_studies/lotka_volterra_UDE_case_study/scripts/testcfg.ipynb new file mode 100644 index 00000000..569516cd --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/scripts/testcfg.ipynb @@ -0,0 +1,228 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "e1f3ed19", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "c:\\Users\\Markus\\anaconda3\\envs\\pymob3\\Lib\\site-packages\\sympy2jax\\sympy_module.py:290: UserWarning: `equinox.static_field` is deprecated in favour of `equinox.field(static=True)`\n", + " has_extra_funcs: bool = eqx.static_field()\n" + ] + } + ], + "source": [ + "from pymob import Config\n", + "\n", + "from lotka_volterra_UDE_case_study.mod import Func\n", + "import jax.random as jrandom\n", + "import jax.numpy as jnp\n", + "from pymob import Config\n", + "import matplotlib.pyplot as plt\n", + "from pymob.simulation import SimulationBase\n", + "from pymob.solvers.diffrax import UDESolver\n", + "\n", + "# jax.config.update('jax_enable_x64', True)" + ] + }, + { + "cell_type": "markdown", + "id": "7290e77f", + "metadata": {}, + "source": [ + "create a simulation from a config file, run it, and infer the optimal parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d8c7893b", + "metadata": {}, + "outputs": [], + "source": [ + "# Load configuration to a Config instance\n", + "config = Config(\"../scenarios/InfererTest/settings.cfg\")\n", + "\n", + "# Create a new simulation from the configuration\n", + "sim2 = SimulationBase(config)\n", + "\n", + "sim2.config.case_study.data_path = \"../data\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "21db418b", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Markus\\pymob\\pymob\\simulation.py:1432: UserWarning: Using default initialize method, (load observations, define 'y0', define 'x_in'). This may be insufficient for more complex simulations.\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MinMaxScaler(variable=prey, min=0.30178511142730713, max=7.541078090667725)\n", + "MinMaxScaler(variable=predator, min=0.11841753125190735, max=5.719013214111328)\n" + ] + } + ], + "source": [ + "# Add data and initial conditions to the simulation\n", + "sim2.initialize(config)\n", + "\n", + "# Add model, model parameters, and solver to the simulation\n", + "key = jrandom.PRNGKey(5678)\n", + "data_key, model_key, loader_key = jrandom.split(key, 3)\n", + "sim2.model = Func({\"alpha\":jnp.array(1.3), \"delta\":jnp.array(1.8)},key=model_key)\n", + "sim2.model_parameters[\"parameters\"] = sim2.config.model_parameters.value_dict\n", + "sim2.model_parameters[\"y0\"] = sim2.observations.sel(time = 0).drop_vars(\"time\")\n", + "sim2.solver = UDESolver" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "219b7592", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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Mbft27cXqyO4AQBuSReXdmZLUnMDANgmmaSwsFBq1aolUVFRYnUENwBAhZsktdYWEhIiVkdwAwC4FdwCAcENAFDhTMlASCZRBDcAwC1RcwMA2M6RABoGoAhuAIByXb16VVJTU819am4AAFs4evSoudWVAMLDwyUQENwAAOU6dOiQq0kyEIYBKIIbAKBc33//vbm99957JVAQ3AAA5dq/f7+57dixowQKghsAoELBjZobAMAWrl+/7upzo+YGALCFlJQUuXbtmtSuXVtatmwptg5uixYtktatW0uNGjWkR48esnPnzgqdt3LlSpNpM2LEiMq8LADAT8kkHTp0kCpVAqc+5HZJV61aJXFxcTJnzhzZvXu3REdHy6BBgyQzM7Pc83QdoJdffln69OlzO+UFAPjQ/gBMJqlUcHv77bflmWeekYkTJ5rOxSVLlpj1fZYuXVrmOboG0JNPPilz586VO++883bLDADwkf0BmEzidnDTlViTk5MlJibmH09QpYrZT0pKKvO8n//859KkSRN5+umnK/Q6+fn5cunSpWIbAMB/zZId7VxzO3funKmFRUREFHtc99PT00s95+uvv5YPP/xQPvjggwq/TkJCgpnmxbm1aNHCnWICADycKWnrmpu7cnJyZNy4cSawuTMf2YwZMyQ7O9u1paWlebOYAIBSaGDTFrs6depIq1atJJCEunOwBqiqVatKRkZGscd1PzIystTJNjWRZPjw4a7Hbty48f9fODTUXLi2bduWOC8sLMxsAAD/2bNnj7nt3LlzQGVKKrdKW716denWrZskJiYWC1a637NnzxLH33PPPbJv3z7Zu3eva3vkkUekf//+5j7NjQBgXXv37nUFt0DjVs1N6TCA8ePHywMPPCDdu3eXhQsXSm5ursmeVLGxsdKsWTPTb6bj4Dp16lTs/Pr165vbmx8HAFiz5talSxexfXAbM2aMnD17VuLj400SiUb0jRs3upJMdEG7QKu+AgCKczgcAV1zC3HoO7A4HQqgWZOaXFK3bl1/FwcAbC81NdUkkWh+xOXLly2RB+FOLKCKBQAowVlr0yEAVghs7iK4AQDKzZQMRAQ3AECZNbdATCZRBDcAQAm7du0ytwQ3AIAtnD59Wn744QeT+a5jmwMRwQ0AUMy3337rGo+sU28FIoIbAKDU4KaLUQcqghsAoBiCGwDAVgoLC+W7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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Put everything in place for running the simulation\n", + "sim2.dispatch_constructor()\n", + "\n", + "# Create an evaluator, run the simulation and obtain the results\n", + "evaluator2 = sim2.dispatch()\n", + "evaluator2()\n", + "data_res = evaluator2.results\n", + "\n", + "# Plot the results\n", + "fig, ax = plt.subplots(figsize=(5, 4))\n", + "# ax.plot(test_data.time, test_data.prey.sel(batch_id = 1), ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "# ax.plot(test_data.time, test_data.predator.sel(batch_id = 1), ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "ax.plot(data_res.time, data_res.prey.sel(batch_id = 1), color=\"black\", label =\"result\")\n", + "ax.plot(data_res.time, data_res.predator.sel(batch_id = 1), color=\"black\", label =\"result\")\n", + "# ax.plot(test_data.time, test_data.prey, ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "# ax.plot(test_data.time, test_data.predator, ls=\"-\", color=\"tab:blue\", alpha=.5, label =\"observation data\")\n", + "# ax.plot(data_res.time, data_res.prey, color=\"black\", label =\"result\")\n", + "# ax.plot(data_res.time, data_res.predator, color=\"black\", label =\"result\")\n", + "ax.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e19eee63", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "3 of 3 runs completed: 100%|█████████▉| 3299.9999999998167/3300.0 [06:20<00:00, 8.68it/s, 0 unsuccessful runs so far] \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "run number\tsuccessful?\tloss\n", + "\n", + "run 1\t\tyes\t\t2.2590839862823486\n", + "run 2\t\tyes\t\t0.05836641043424606\n", + "run 3\t\tyes\t\t0.13672125339508057\n" + ] + } + ], + "source": [ + "sim2.set_inferer(\"optax\")\n", + "\n", + "sim2.inferer.run()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "69522454", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([,\n", + " ,\n", + " ], dtype=object)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sim2.inferer.plot_posterior_predictions(\"predator\", \"time\", n=3)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pymob3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/case_studies/lotka_volterra_UDE_case_study/test.sh b/case_studies/lotka_volterra_UDE_case_study/test.sh new file mode 100644 index 00000000..41966ec7 --- /dev/null +++ b/case_studies/lotka_volterra_UDE_case_study/test.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +source activate pymob +pytest -m "not slow" \ No newline at end of file diff --git a/pymob/inference/optax_backend.py b/pymob/inference/optax_backend.py new file mode 100644 index 00000000..559f713e --- /dev/null +++ b/pymob/inference/optax_backend.py @@ -0,0 +1,1052 @@ +import time +import jax +from pymob.inference.base import InferenceBackend, Distribution, Errorfunction +from pymob.utils.UDE import getFuncBias, transformBias, getFuncWeights, transformWeights +from typing import ( + Tuple, Dict, Union, Optional, Callable, Literal, List, Any, + Protocol +) +import copy +import warnings +import jax.numpy as jnp +import jax.random as jr +import numpy as np +from functools import partial +import optax +import equinox as eqx +from equinox import EquinoxRuntimeError +import xarray as xr +import arviz as az +from tqdm import tqdm, TqdmWarning +import matplotlib.pyplot as plt + + +scipy_to_jax = { + # Continuous Distributions + "beta": (lambda a, b, key, loc=0.0, scale=1.0, shape=(): jr.beta(key=key, a=a, b=b, shape=shape)*scale + loc, {}), + "cauchy": (lambda key, loc=0.0, scale=1.0, shape=(): jr.cauchy(key=key, shape=shape)*scale + loc, {}), + "chi2": (lambda df, key, loc=0.0, scale=1.0, shape=(): jr.chisquare(key=key, df=df, shape=shape)*scale + loc, {}), + "expon": (lambda key, loc=0.0, scale=1.0, shape=(): jr.exponential(key=key, shape=shape)*scale + loc, {}), + "exponential": (lambda key, loc=0.0, scale=1.0, shape=(): jr.exponential(key=key, shape=shape)*scale + loc, {}), + "gamma": (lambda a, key, loc=0.0, scale=1.0, shape=(): jr.gamma(key=key, a=a, shape=shape)*scale + loc, {}), + "gumbel_r": (lambda key, loc=0.0, scale=1.0, shape=(): jr.gumbel(key=key, shape=shape)*scale + loc, {}), + "laplace": (lambda key, loc=0.0, scale=1.0, shape=(): jr.laplace(key=key, shape=shape)*scale + loc, {}), + "logistic": (lambda key, loc=0.0, scale=1.0, shape=(): jr.logistic(key=key, shape=shape)*scale + loc, {}), + "lognorm": (lambda key, loc=0.0, scale=1.0, shape=(): jr.lognormal(key=key, shape=shape)*scale + loc, {}), + "lognormal": (lambda key, loc=0.0, scale=1.0, shape=(): jr.lognormal(key=key, shape=shape)*scale + loc, {}), + "norm": (lambda key, loc=0.0, scale=1.0, shape=(): jr.normal(key=key, shape=shape)*scale + loc, {}), + "normal": (lambda key, loc=0.0, scale=1.0, shape=(): jr.normal(key=key, shape=shape)*scale + loc, {}), + "pareto": (lambda b, key, loc=0.0, scale=1.0, shape=(): jr.pareto(key=key, b=b, shape=shape)*scale + loc, {}), + "rayleigh": (lambda key, loc=0.0, scale=1.0, shape=(): jr.rayleigh(key=key, scale=1, shape=shape)*scale + loc, {}), + "t": (lambda df, key, loc=0.0, scale=1.0, shape=(): jr.t(key=key, df=df, shape=shape)*scale + loc, {}), + "triang": (lambda c, key, loc=0.0, scale=1.0, shape=(): jr.triangular(key=key, left=loc, mode=(loc+c*scale), right=(loc+scale), shape=shape), {}), + "truncnorm": (lambda a, b, key, loc=0.0, scale=1.0, shape=(): jr.truncated_normal(key=key, lower=(a*scale+loc), upper=(b*scale+loc), shape=shape), {}), + "truncnormal": (lambda a, b, key, loc=0.0, scale=1.0, shape=(): jr.truncated_normal(key=key, lower=(a*scale+loc), upper=(b*scale+loc), shape=shape), {}), + "uniform": (lambda key, loc=0.0, scale=1.0, shape=(): jr.uniform(key=key, minval=loc, maxval=(loc+scale), shape=shape), {}), + "wald": (lambda key, loc=0.0, scale=1.0, shape=(): jr.wald(key=key, mean=1, shape=shape)*scale + loc, {}), + "weibull_min": (lambda c, key, loc=0.0, scale=1.0, shape=(): jr.weibull_min(key=key, scale=1, concentration=c, shape=shape)*scale + loc, {}), + + # Discrete Distributions + "bernoulli": (lambda p, key, loc=0.0, shape=(): jr.bernoulli(key=key, p=p, shape=shape) + loc, {}), + "binom": (lambda n, p, key, loc=0.0, shape=(): jr.binomial(key=key, n=n, p=p, shape=shape) + loc, {}), + "geom": (lambda p, key, loc=0.0, shape=(): jr.geometric(key=key, p=p, shape=shape) + loc, {}), + "poisson": (lambda mu, key, loc=0.0, shape=(): jr.poisson(key=key, lam=mu, shape=shape) + loc, {}), + "randint": (lambda low, high, key, loc=0.0, shape=(): jr.randint(key=key, minval=low, maxval=high, shape=shape) + loc, {}), + + # some are missing, see https://docs.jax.dev/en/latest/jax.random.html for complete list -> TODO +} + +class OptaxDistribution(Distribution): + distribution_map: Dict[str,Tuple[Callable, Dict[str,str]]] = scipy_to_jax + parameter_converter = staticmethod(lambda x: jnp.array(x)) + + def _get_distribution(self, distribution: str) -> Tuple[Callable, Dict[str, str]]: + # TODO: This is not satisfying. I think the transformed distributions + # should only be used when this is explicitly specified. + # I really wonder, why this makes such a large change in numpyro + return self.distribution_map[distribution] + + @property + def dist_name(self): + return self.distribution.func.__name__ + +class OptaxBackend(InferenceBackend): + _distribution = OptaxDistribution + prior: Dict[str, Callable] + + optimized_models: list + failed_models: list + + def __init__(self, simulation): + super().__init__(simulation) + + if simulation.config.simulation.batch_dimension in [x for x in simulation.observations.sizes.keys()]: + self.n_datasets = simulation.observations.sizes[simulation.config.simulation.batch_dimension] + self.n_train_sets = jnp.round(self.n_datasets * simulation.config.inference_optax.data_split).astype(int) + if self.n_train_sets == self.n_datasets: + self.n_train_sets -= 1 + if self.n_train_sets == 0: + self.n_train_sets = 1 + else: + self.n_datasets = 1 + self.n_train_sets = 1 + warnings.warn( + "The single provided data batch will be used for both training and validation. " \ + "This should not be the case, please provide multiple datasets.", + category=UserWarning + ) + + self.batch_size = self.config.inference_optax.batch_size + + if self.n_train_sets < self.batch_size: + self.batch_size = self.n_train_sets + warnings.warn( + f"The specified training batch size ({self.config.inference_optax.batch_size}) is larger " \ + f"than the number of batches made available for training ({self.n_datasets}). The batch size " \ + f"was therefore lowered to {self.batch_size} (internally, the value in the config " \ + "stays the same).", + category=UserWarning + ) + + if simulation.config.inference_optax.multiple_runs_target > simulation.config.inference_optax.multiple_runs_limit: + self.multiple_runs_target = simulation.config.inference_optax.multiple_runs_limit + warnings.warn( + f"The specified target number for successful runs/output models ({simulation.config.inference_optax.multiple_runs_target}) " \ + f"is larger than the allowed total number of runs ({simulation.config.inference_optax.multiple_runs_limit}). " \ + f"The target was therefore lowered to {self.multiple_runs_target} (internally, the value in the config " \ + "stays the same).", + category=UserWarning + ) + else: + self.multiple_runs_target = simulation.config.inference_optax.multiple_runs_target + + def run(self, return_losses = False): + make_step_compiled = self.compile_make_step() + self.optimized_models, self.failed_models, success, lossev = self.optimize_multiple_runs(make_step_compiled) + losses = [self.global_loss(model) for model in self.optimized_models] + + i = 0 + print("\nrun number\tsuccessful?\tloss\n") + for (j, s) in enumerate(success): + if s: + print(f"run {j+1}\t\tyes\t\t{losses[i]}") + i += 1 + else: + print(f"run {j+1}\t\tno\t\t---") + + self.idata, self.idata_f = self.create_idata() + self.lossev = xr.DataArray(lossev, coords={"run": jnp.arange(1, lossev.shape[0]+1), "step": jnp.arange(1, lossev.shape[1]+1)}).to_dataset(name="losses") + + def run2(self): + make_step_compiled = self.compile_make_step2() + self.optimized_models, self.failed_models, success, lossev = self.optimize_multiple_runs2() + losses = [self.global_loss2(model) for model in self.optimized_models] + + i = 0 + print("\nrun number\tsuccessful?\tloss\n") + for (j, s) in enumerate(success): + if s: + print(f"run {j+1}\t\tyes\t\t{losses[i]}") + i += 1 + else: + print(f"run {j+1}\t\tno\t\t---") + + self.idata = self.create_idata2() + self.lossev = xr.DataArray(lossev, coords={"run": jnp.arange(1, lossev.shape[0]+1), "step": jnp.arange(1, lossev.shape[1]+1)}).to_dataset(name="losses") + + @property + def best_model(self): + return self.optimized_models[0] + + class StopOptimizing(Exception): + pass + + def parse_deterministic_model(self): + pass + + def parse_probabilistic_model(self): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def posterior_predictions(self): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def prior_predictions(self): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def create_log_likelihood(self) -> Tuple[Errorfunction,Errorfunction]: + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def plot_likelihood_landscape(self, parameters, log_likelihood_func, gradient_func = None, bounds = ..., n_grid_points = 100, n_vector_points = 50, normal_base=False, ax = None): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def plot_prior_predictions(self, data_variable, x_dim, ax=None, subset=..., n=None, seed=None, plot_preds_without_obs=False, prediction_data_variable = None, **plot_kwargs): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def plot_posterior_predictions( + self, data_variable: str, x_dim: str, ax=None, subset={}, + n=1, seed=None, plot_preds_without_obs=False, + prediction_data_variable: Optional[str] = None, + **plot_kwargs + ): + observations = self.simulation.observations + + if self.n_datasets > 1: + if n > (self.n_datasets - self.n_train_sets): + msgstr = "dataset is" if (self.n_datasets - self.n_train_sets)==1 else "datasets are" + warnings.warn( + f"The specified number of plotted datasets ({n}) is greater than " \ + f"the number of validation datasets ({int(self.n_datasets - self.n_train_sets)}). " \ + f"Therefore, only {int(self.n_datasets - self.n_train_sets)} {msgstr} being plotted.", + category = UserWarning + ) + n = int(self.n_datasets - self.n_train_sets) + observations = observations.isel({self.simulation.config.simulation.batch_dimension: slice(int(self.n_train_sets), int(self.n_train_sets + n))}) + else: + if n > 1: + warnings.warn( + f"The specified number of plotted datasets ({n}) is greater than " \ + "the number of validation datasets (1). " \ + "Therefore, only 1 dataset is being plotted.", + category = UserWarning + ) + n = 1 + observations = observations.expand_dims(self.simulation.config.simulation.batch_dimension) + observations = observations.assign_coords({self.simulation.config.simulation.batch_dimension:[0]}) + + predictions = self.idata.posterior_model_fits.isel({"data_batch": slice(int(self.n_train_sets), int(self.n_train_sets + n))}) + + # filter subset coordinates present in data_variable + subset = {k: v for k, v in subset.items() if k in observations.coords} + + if prediction_data_variable is None: + prediction_data_variable = data_variable + + # select subset + if prediction_data_variable in predictions: + preds = predictions.sel(subset)[prediction_data_variable] + else: + raise KeyError( + f"{prediction_data_variable} was not found in the predictions "+ + "consider specifying the data variable for the predictions "+ + "explicitly with the option `prediction_data_variable`." + ) + try: + obs = observations.sel(subset)[data_variable] + except KeyError: + obs = preds.copy().mean(dim=("chain", "draw")) + obs.values = np.full_like(obs.values, np.nan) + + best_model_index = [x for x, y in enumerate(self.sort_models_by_global_loss2(self.optimized_models)) if y==0][0] + + if ax is None: + _, ax = plt.subplots(ncols=1, nrows=n, figsize=(5,3*n), constrained_layout = True) + + for j in jnp.arange(n): + + if n > 1: + current_axis = ax[j] + else: + current_axis = ax + + maxima = jnp.array([jnp.max(preds.values[0,:,j][:,i]) for i in jnp.arange(preds.values[0,:,j].shape[1])]) + minima = jnp.array([jnp.min(preds.values[0,:,j][:,i]) for i in jnp.arange(preds.values[0,:,j].shape[1])]) + + best_model_results = preds.values[0,best_model_index,j] + + if not plot_preds_without_obs: + current_axis.plot(obs[x_dim].values, obs.values[j], "o", markersize=3, label="observations") + current_axis.plot(obs[x_dim].values, best_model_results, c="grey", label="model with lowest loss") + current_axis.fill_between(obs[x_dim].values, minima, maxima, color="lightgrey", label="range of all models") + + current_axis.set(xlabel = x_dim, ylabel = data_variable) + + if n > 1: + ax[0].legend() + else: + ax.legend() + + return ax + + def plot(self): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def plot_diagnostics(self): + raise NotImplementedError("This method is currently not available for the Optax backend.") + + def transform_observations(self, observations): + ts = jnp.array(observations.time.values) + data_vars = [x for x in observations.data_vars] + ys_unstacked = jnp.array([y.values for (x,y) in observations.items()]) + ys = jnp.stack(ys_unstacked, axis=(len(ys_unstacked.shape)-1)) # check with Flo if this is a universal solution or if the stacked axis has to be adapted to the input data -> TODO + + return ts, ys, data_vars + + def transform_x_in(self, x_in): + ts = jnp.array(x_in.time.values) + ys = jnp.array([y.values for (x,y) in x_in.items()]) + + return ts, ys + + def transform_observations_backwards(self, ts, ys, data_vars): + datasets = jnp.arange(ys.shape[0]) + 1 + return xr.Dataset({var: xr.DataArray(ys[:,:,i], coords={"batch_id": datasets, "time": ts}) for var, i in zip(data_vars, range(len(data_vars)))}) + + def compile_make_step(self): + @eqx.filter_value_and_grad + def grad_loss(model, ti, yi, length_eval, x_in, loss_func): + y_pred = jnp.array(jax.vmap(self.simulation.evaluator._solver.standalone_solver, in_axes=(None, None, 0, None))(model, ti, yi[:, 0], x_in)) + y_pred = jnp.stack(y_pred, axis = (len(y_pred.shape)-1)) + + losses = loss_func(yi, y_pred) + + return jnp.mean(losses[:, : length_eval]) + + def make_step(ti, yi, x_in, length_eval, model, optim, opt_state, loss_func): + loss, grads = grad_loss(model, ti, yi, length_eval, x_in, loss_func) + updates, opt_state = optim.update(grads, opt_state, eqx.filter(model, eqx.is_inexact_array)) + model = eqx.apply_updates(model, updates) + return loss, model, opt_state + + make_step_jit = eqx.filter_jit(make_step) + + ts, ys, _ = self.simulation.inferer.transform_observations(self.simulation.observations) + + if "x_in" in self.simulation.model_parameters.keys() and [x for x in self.simulation.model_parameters["x_in"].data_vars] != []: + x_in_temp = self.transform_x_in(self.simulation.model_parameters["x_in"]) + x_in = (x_in_temp[0], x_in_temp[1][0]) + else: + x_in = None + + model = self.construct_model() + + clip = self.config.inference_optax.clip_strategy + lr = self.config.inference_optax.lr_strategy + + if clip != 0: + optim = optax.chain(optax.clip(clip), optax.adabelief(lr)) + else: + optim = optax.adabelief(lr) + opt_state = optim.init(eqx.filter(model, eqx.is_inexact_array)) + + def loss_func(y_obs, y_pred): + return self.simulation.model.loss(jnp.where(jnp.isnan(y_obs), y_pred, y_obs), y_pred) + + return make_step_jit.lower(ts, ys[0:self.config.inference_optax.batch_size], x_in, ys.shape[1], model, optim, opt_state, loss_func).compile() + + def compile_make_step2(self): + @eqx.filter_value_and_grad + def grad_loss(model, yi, batch, length_eval, evaluator, data_vars, loss_func): + evaluator.model = model + evaluator() + y_pred = jnp.array([evaluator.Y[data_var] for data_var in data_vars]) + y_pred = jnp.stack(y_pred, axis = (len(y_pred.shape)-1))[:,:yi.shape[1]] + + losses = loss_func(yi[batch], y_pred[batch]) + return jnp.mean(losses[:, : length_eval]) + + def make_step(yi, batch, length_eval, model, evaluator, data_vars, opt_state, loss_func): + loss, grads = grad_loss(model, yi, batch, length_eval, evaluator, data_vars, loss_func) + updates, opt_state = optim.update(grads, opt_state, eqx.filter(model, eqx.is_inexact_array)) + model = eqx.apply_updates(model, updates) + return loss, model, opt_state + + make_step_jit = eqx.filter_jit(make_step) + + ts, ys, data_vars = self.simulation.inferer.transform_observations(self.simulation.observations) + + if "x_in" in self.simulation.model_parameters.keys() and [x for x in self.simulation.model_parameters["x_in"].data_vars] != []: + x_in_temp = self.transform_x_in(self.simulation.model_parameters["x_in"]) + x_in = (x_in_temp[0], x_in_temp[1][0]) + else: + x_in = None + + model = self.construct_model() + + clip = self.config.inference_optax.clip_strategy + lr = self.config.inference_optax.lr_strategy + batch_size = self.config.inference_optax.batch_size + evaluator = self.simulation.dispatch() + + if clip != 0: + optim = optax.chain(optax.clip(clip), optax.adabelief(lr)) + else: + optim = optax.adabelief(lr) + opt_state = optim.init(eqx.filter(model, eqx.is_inexact_array)) + + def loss_func(y_obs, y_pred): + return self.simulation.model.loss(jnp.where(jnp.isnan(y_obs), y_pred, y_obs), y_pred) + + return make_step_jit.lower(model, ys[0:batch_size], jnp.arange(batch_size), ys.shape[1], evaluator, data_vars, loss_func).compile() + + class StopOptimizing(Exception): + pass + + def construct_model(self): + cfg = self.config + params = {} + + for key in cfg.model_parameters.fixed: + params[key] = (jnp.array(cfg.model_parameters[key].value), False) + + for key in cfg.model_parameters.free: + dist = OptaxBackend._distribution( + name=key, + random_variable=cfg.model_parameters[key].prior, + dims=(), + shape=() + ) + + sample = dist.construct(context=None, extra_kwargs={"key": jr.PRNGKey(np.random.randint(0,10000,()))}) + params[key] = (sample, True) + + dist = OptaxBackend._distribution( + name="weights", + random_variable=cfg.inference_optax.MLP_weight_dist, + dims=(), + shape=() + ) + + reference_model = self.simulation.model + mlp_size = (reference_model.mlp.in_size, reference_model.mlp.out_size, reference_model.mlp.width_size, reference_model.mlp.depth) + + weights = dist.construct(context=None, extra_kwargs={"shape": (mlp_size[0]*mlp_size[2] + (mlp_size[3] - 1)*mlp_size[2]**2 + mlp_size[2]*mlp_size[1]), "key": jr.PRNGKey(np.random.randint(0,10000,()))}) + + dist = OptaxBackend._distribution( + name="bias", + random_variable=cfg.inference_optax.MLP_bias_dist, + dims=(), + shape=() + ) + + bias = dist.construct(context=None, extra_kwargs={"shape": (mlp_size[3]*mlp_size[2] + mlp_size[1]), "key": jr.PRNGKey(np.random.randint(0,10000,()))}) + + model_type = type(reference_model) + + return model_type(params, weights, bias, key=jr.PRNGKey(0)) + + def optimize_model(self, model, pbar, make_step): + start_time = time.time() + # transform observations to suitable format + ts, ys, data_vars = self.transform_observations(self.simulation.observations) + if self.n_datasets > 1: + ys = ys[:self.n_train_sets] + else: + ys = jnp.expand_dims(ys,0) + length_size = len(ts) + + if "x_in" in self.simulation.model_parameters.keys() and [x for x in self.simulation.model_parameters["x_in"].data_vars] != []: + x_in_temp = self.transform_x_in(self.simulation.model_parameters["x_in"]) + x_in = (x_in_temp[0], x_in_temp[1][0]) + else: + x_in = None + + # optimize model + loader_key = jr.PRNGKey(np.random.randint(0,10000,())) + + last_model = model + lossev_single_model = [] + + def loss_func(y_obs, y_pred): + return self.simulation.model.loss(jnp.where(jnp.isnan(y_obs), y_pred, y_obs), y_pred) + + def dataloader(arrays, batch_size, *, key): + dataset_size = arrays[0].shape[0] + assert all(array.shape[0] == dataset_size for array in arrays) + indices = jnp.arange(dataset_size) + while True: + perm = jr.permutation(key, indices) + (key,) = jr.split(key, 1) + start = 0 + end = batch_size + while end < dataset_size: + batch_perm = perm[start:end] + yield tuple(array[batch_perm] for array in arrays) + start = end + end = start + batch_size + + for length in self.config.inference_optax.length_strategy: + + clip = self.config.inference_optax.clip_strategy + lr = self.config.inference_optax.lr_strategy + steps = self.config.inference_optax.steps_strategy + + if clip != 0: + optim = optax.chain(optax.clip(clip), optax.adabelief(lr)) + else: + optim = optax.adabelief(lr) + opt_state = optim.init(eqx.filter(model, eqx.is_inexact_array)) + length_eval = int(length_size * length) + _ts = ts + _ys = jnp.empty(ys.shape) + _ys = jnp.concatenate([ys[:, : length_eval], _ys.at[:].set(np.nan)[:, length_eval :]], axis=1) + + if self.n_datasets > 1: + for step, (yi,) in zip( + range(steps), dataloader((_ys,), self.config.inference_optax.batch_size, key=loader_key) + ): + last_model = model + loss, model, opt_state = make_step(_ts, yi, x_in, length_eval, model, optim, opt_state, loss_func) + lossev_single_model.append(loss) + pbar.update(1) + current_time = time.time() + if not jnp.isfinite(loss).all() or current_time - start_time > 1200: + return last_model, False, lossev_single_model + + else: + for step, (yi,) in zip( + range(steps), [[_ys]] * steps + ): + last_model = model + loss, model, opt_state = make_step(_ts, yi, length_eval, x_in, model, optim, opt_state, loss_func) + lossev_single_model.append(loss) + pbar.update(1) + current_time = time.time() + if not jnp.isfinite(loss).all() or current_time - start_time > 1200: + return last_model, False, lossev_single_model + + return model, True, lossev_single_model + + def optimize_model2(self, model, pbar, make_step): + start_time = time.time() + # transform observations to suitable format + ts, ys, data_vars = self.transform_observations(self.simulation.observations) + if self.n_datasets > 1: + ys = ys[:self.n_train_sets] + else: + ys = jnp.expand_dims(ys,0) + length_size = len(ts) + + # optimize model + loader_key = jr.PRNGKey(np.random.randint(0,10000,())) + + last_model = model + lossev_single_model = [] + + def loss_func(y_obs, y_pred): + return self.simulation.model.loss(jnp.where(jnp.isnan(y_obs), y_pred, y_obs), y_pred) + + def dataloader(batch_size, *, key): + indices = jnp.arange(self.n_train_sets) + while True: + perm = jr.permutation(key, indices) + (key,) = jr.split(key, 1) + start = 0 + end = batch_size + while end < self.n_train_sets: + batch_perm = perm[start:end] + yield batch_perm + start = end + end = start + batch_size + + for length in self.config.inference_optax.length_strategy: + + clip = self.config.inference_optax.clip_strategy + lr = self.config.inference_optax.lr_strategy + steps = self.config.inference_optax.steps_strategy + + if clip != 0: + optim = optax.chain(optax.clip(clip), optax.adabelief(lr)) + else: + optim = optax.adabelief(lr) + opt_state = optim.init(eqx.filter(model, eqx.is_inexact_array)) + length_eval = int(length_size * length) + _ys = jnp.empty(ys.shape) + _ys = jnp.concatenate([ys[:, : length_eval], _ys.at[:].set(np.nan)[:, length_eval :]], axis=1) + evaluator = self.simulation.dispatch() + + if self.n_datasets > 1: + for step, batch in zip( + range(steps), dataloader(self.config.inference_optax.batch_size, key=loader_key) + ): + last_model = model + loss, model, opt_state = make_step(_ys, batch, length_eval, model, evaluator, data_vars, opt_state, loss_func) + lossev_single_model.append(loss) + pbar.update(1) + current_time = time.time() + if not jnp.isfinite(loss).all() or current_time - start_time > 1200: + return last_model, False, lossev_single_model + + else: + for step in range(steps): + last_model = model + loss, model, opt_state = make_step(_ys, jnp.array([0]), model, evaluator, data_vars, opt_state, loss_func) + lossev_single_model.append(loss) + pbar.update(1) + current_time = time.time() + if not jnp.isfinite(loss).all() or current_time - start_time > 1200: + return last_model, False, lossev_single_model + + return model, True, lossev_single_model + + def optimize_multiple_runs(self, make_step): + cfg = self.config.inference_optax + + tried_runs = successful_runs = 0 + + models = [] + failed_models = [] + success = [] + lossev = [] + + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=TqdmWarning) + + pbar = tqdm(total = self.multiple_runs_target * cfg.steps_strategy * len(cfg.length_strategy), desc=f"{successful_runs} of {self.multiple_runs_target} runs completed") + + while tried_runs < cfg.multiple_runs_limit and successful_runs < self.multiple_runs_target: + + runstr = "run" if (tried_runs-successful_runs)==1 else "runs" + pbar.set_postfix_str(f"{tried_runs - successful_runs} unsuccessful {runstr} so far") + tried_runs += 1 + + # try: + + optimizable_model = self.construct_model() + optimized_model, success_run, lossev_single_run = self.optimize_model(optimizable_model, pbar, make_step) + + if success_run: + models.append(optimized_model) + successful_runs += 1 + pbar.set_description(f"{successful_runs} of {self.multiple_runs_target} runs completed") + success.append(True) + lossev.append(lossev_single_run) + else: + failed_models.append(optimized_model) + success.append(False) + lossev_single_run = lossev_single_run + [jnp.nan] * (cfg.steps_strategy * len(cfg.length_strategy) - len(lossev_single_run)) + lossev.append(lossev_single_run) + pbar.n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + pbar.last_print_n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + + # except self.StopOptimizing: + + # success.append(False) + # lossev_single_run = lossev_single_run + [jnp.nan] * (cfg.steps_strategy * len(cfg.length_strategy) - len(lossev_single_run)) + # lossev.append(lossev_single_run) + # pbar.n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + # pbar.last_print_n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + + # except EquinoxRuntimeError: + + # success.append(False) + # lossev_single_run = lossev_single_run + [jnp.nan] * (cfg.steps_strategy * len(cfg.length_strategy) - len(lossev_single_run)) + # lossev.append(lossev_single_run) + # pbar.n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + # pbar.last_print_n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + + if successful_runs < self.multiple_runs_target: + warnings.warn( + "Target number of successful runs was not reached before surpassing the " \ + f"allowed total number of runs. Only {successful_runs} optimized models were returned." + ) + + return models, failed_models, success, jnp.array(lossev) + + def optimize_multiple_runs2(self, make_step): + cfg = self.config.inference_optax + + tried_runs = successful_runs = 0 + + models = [] + failed_models = [] + success = [] + lossev = [] + + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=TqdmWarning) + + pbar = tqdm(total = self.multiple_runs_target * jnp.sum(jnp.array(cfg.steps_strategy)).item() * len(cfg.length_strategy), desc=f"{successful_runs} of {self.multiple_runs_target} runs completed") + + while tried_runs < cfg.multiple_runs_limit and successful_runs < self.multiple_runs_target: + + runstr = "run" if (tried_runs-successful_runs)==1 else "runs" + pbar.set_postfix_str(f"{tried_runs - successful_runs} unsuccessful {runstr} so far") + tried_runs += 1 + + # try: + + optimizable_model = self.construct_model() + optimized_model, success_run, lossev_single_run = self.optimize_model2(optimizable_model, pbar, make_step) + + if success_run: + models.append(optimized_model) + successful_runs += 1 + pbar.set_description(f"{successful_runs} of {self.multiple_runs_target} runs completed") + success.append(True) + lossev.append(lossev_single_run) + else: + failed_models.append(optimized_model) + success.append(False) + lossev_single_run = lossev_single_run + [jnp.nan] * (cfg.steps_strategy * len(cfg.length_strategy) - len(lossev_single_run)) + lossev.append(lossev_single_run) + pbar.n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + pbar.last_print_n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + + # except self.StopOptimizing: + + # success.append(False) + # lossev_single_run = lossev_single_run + [jnp.nan] * (cfg.steps_strategy * len(cfg.length_strategy) - len(lossev_single_run)) + # lossev.append(lossev_single_run) + # pbar.n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + # pbar.last_print_n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + + # except EquinoxRuntimeError: + + # success.append(False) + # lossev_single_run = lossev_single_run + [jnp.nan] * (cfg.steps_strategy * len(cfg.length_strategy) - len(lossev_single_run)) + # lossev.append(lossev_single_run) + # pbar.n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + # pbar.last_print_n = successful_runs * cfg.steps_strategy * len(cfg.length_strategy) + + if successful_runs < self.multiple_runs_target: + warnings.warn( + "Target number of successful runs was not reached before surpassing the " \ + f"allowed total number of runs. Only {successful_runs} optimized models were returned." + ) + + return models, failed_models, success, jnp.array(lossev) + + def global_loss(self, model): + ts, ys, data_vars = self.transform_observations(self.simulation.observations) + if self.n_datasets > 1: + ys = ys[self.n_train_sets:] + else: + ys = jnp.expand_dims(ys,0) + + if "x_in" in self.simulation.model_parameters.keys() and [x for x in self.simulation.model_parameters["x_in"].data_vars] != []: + x_in_temp = self.transform_x_in(self.simulation.model_parameters["x_in"]) + x_in = (x_in_temp[0], x_in_temp[1][0]) + else: + x_in = None + + def loss_func(y_obs, y_pred): + return self.simulation.model.loss(jnp.where(jnp.isnan(y_obs), y_pred, y_obs), y_pred) + + @eqx.filter_jit + def loss(model, ti, yi, loss_func): + y_pred = jnp.array(jax.vmap(self.simulation.evaluator._solver.standalone_solver, in_axes=(None, None, 0, None))(model, ti, yi[:, 0], x_in)) + y_pred = jnp.stack(y_pred, axis = (len(y_pred.shape)-1)) + + losses = loss_func(yi, y_pred) + return jnp.mean(losses) + + return loss(model, ts, ys, loss_func) + + def global_loss2(self, model): + ts, ys, data_vars = self.transform_observations(self.simulation.observations) + if self.n_datasets > 1: + ys = ys[self.n_train_sets:] + else: + ys = jnp.expand_dims(ys,0) + + def loss_func(y_obs, y_pred): + return self.simulation.model.loss(jnp.where(jnp.isnan(y_obs), y_pred, y_obs), y_pred) + + @eqx.filter_jit + def loss(model, ti, yi, evaluator, loss_func): + evaluator.model = model + evaluator() + y_pred = jnp.array([evaluator.Y[data_var] for data_var in data_vars]) + y_pred = jnp.stack(y_pred, axis = (len(y_pred.shape)-1)) + + if self.n_datasets > 1: + y_pred = y_pred[self.n_train_sets:] + + losses = loss_func(yi, y_pred) + return jnp.mean(losses) + + evaluator = self.simulation.dispatch() + + return loss(model, ts, ys, evaluator, loss_func) + + def sort_models_by_global_loss(self, models): + losses = [self.global_loss(model) for model in models] + + sorted_losses = [] + sorted_indices = [] + + for x, y in sorted(zip(losses, [i for i in range(len(losses))])): + sorted_losses.append(x) + sorted_indices.append(y) + + return sorted_indices + + def sort_models_by_global_loss2(self, models): + losses = [self.global_loss2(model) for model in models] + + sorted_losses = [] + sorted_indices = [] + + for x, y in sorted(zip(losses, [i for i in range(len(losses))])): + sorted_losses.append(x) + sorted_indices.append(y) + + return sorted_indices + + def create_idata(self): + list = [key for key in self.simulation.config.model_parameters.free.keys()] + ts, ys, data_vars = self.transform_observations(self.simulation.observations) + batch_ids = jnp.arange(self.n_datasets) + chain_ids = jnp.arange(1) + + if len(self.optimized_models) > 0: + + dict = {list[j]: np.array([getattr(self.optimized_models[i], list[j]) for i in np.arange(len(self.optimized_models))]) for j in np.arange(len(list))} + dict["weights"] = np.array([[transformWeights(getFuncWeights(model))[4] for model in self.optimized_models]]) + dict["bias"] = np.array([[transformBias(getFuncBias(model))[3] for model in self.optimized_models]]) + + idata = az.convert_to_inference_data( + dict, + dims = {"weights": ["chain","draw","n_weight"], "bias": ["chain","draw","n_bias"]}, + coords = {"n_weight": np.arange(len(dict["weights"][0,0])), "n_bias": np.arange(len(dict["bias"][0,0]))} + ) + + post_pred = {} + losses = {} + data_vars = self.simulation.observations.data_vars + evaluator = self.simulation.dispatch() + for x in data_vars: + post_pred[x] = [] + losses[x] = [] + + for model in self.optimized_models: + sol = jnp.array([evaluator._solver.standalone_solver(model, ts, y0[0], ()) for y0 in ys]) + for i, x in enumerate(data_vars): + post_pred[x].append(sol[:,i]) + losses[x].append(self.simulation.model.loss(self.simulation.observations[x].values, sol[:,i])) + + for x in data_vars: + post_pred[x] = jnp.array(post_pred[x]) + post_pred[x] = jnp.expand_dims(post_pred[x], 0) + losses[x] = jnp.array(losses[x]) + losses[x] = jnp.expand_dims(losses[x], 0) + + post_pred_xr = [] + losses_xr = [] + + model_ids = jnp.arange(len(self.optimized_models)) + + for x in data_vars: + if self.n_datasets == 1: + post_pred[x] = jnp.expand_dims(post_pred[x], 2) + losses[x] = jnp.expand_dims(losses[x], 2) + post_pred_xr.append(xr.DataArray(post_pred[x], coords={"chain": chain_ids, "draw": model_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + losses_xr.append(xr.DataArray(losses[x], coords={"chain": chain_ids, "draw": model_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + + post_pred_xr = xr.merge([x for x in post_pred_xr]) + losses_xr = xr.merge([x for x in losses_xr]) + + idata.add_groups({"observed_data": self.simulation.observations, "posterior_model_fits": post_pred_xr, "losses": losses_xr}) + idata.add_groups({"posterior_predictive": idata.posterior_model_fits, "log_likelihood": idata.losses}) + + else: + + idata = None + + if len(self.failed_models) > 0: + + dict_f = {list[j]: np.array([getattr(self.failed_models[i], list[j]) for i in np.arange(len(self.failed_models))]) for j in np.arange(len(list))} + dict_f["weights"] = np.array([[transformWeights(getFuncWeights(model))[4] for model in self.failed_models]]) + dict_f["bias"] = np.array([[transformBias(getFuncBias(model))[3] for model in self.failed_models]]) + + idata_f = az.convert_to_inference_data( + dict_f, + dims = {"weights": ["chain","draw","n_weight"], "bias": ["chain","draw","n_bias"]}, + coords = {"n_weight": np.arange(len(dict_f["weights"][0,0])), "n_bias": np.arange(len(dict_f["bias"][0,0]))} + ) + + post_pred_f = {} + losses_f = {} + data_vars = self.simulation.observations.data_vars + evaluator = self.simulation.dispatch() + for x in data_vars: + post_pred_f[x] = [] + losses_f[x] = [] + + for model in self.failed_models: + sol = jnp.array([evaluator._solver.standalone_solver(model, ts, y0[0], ()) for y0 in ys]) + for i, x in enumerate(data_vars): + post_pred_f[x].append(sol[:,i]) + losses_f[x].append(self.simulation.model.loss(self.simulation.observations[x].values, sol[:,i])) + + for x in data_vars: + post_pred_f[x] = jnp.array(post_pred_f[x]) + post_pred_f[x] = jnp.expand_dims(post_pred_f[x], 0) + losses_f[x] = jnp.array(losses_f[x]) + losses_f[x] = jnp.expand_dims(losses_f[x], 0) + + post_pred_f_xr = [] + losses_f_xr = [] + + model_f_ids = jnp.arange(len(self.failed_models)) + + for x in data_vars: + if self.n_datasets == 1: + post_pred_f[x] = jnp.expand_dims(post_pred_f[x], 2) + losses_f[x] = jnp.expand_dims(losses_f[x], 2) + post_pred_f_xr.append(xr.DataArray(post_pred_f[x], coords={"chain": chain_ids, "draw": model_f_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + losses_f_xr.append(xr.DataArray(losses_f[x], coords={"chain": chain_ids, "draw": model_f_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + + post_pred_f_xr = xr.merge([x for x in post_pred_f_xr]) + losses_f_xr = xr.merge([x for x in losses_f_xr]) + + idata_f.add_groups({"observed_data": self.simulation.observations, "posterior_model_fits": post_pred_f_xr, "losses": losses_f_xr}) + idata_f.add_groups({"posterior_predictive": idata_f.posterior_model_fits, "log_likelihood": idata_f.losses}) + + else: + + idata_f = None + + return idata, idata_f + + def create_idata2(self): + list = [key for key in self.simulation.config.model_parameters.free.keys()] + ts = self.simulation.observations.time.values + batch_ids = jnp.arange(self.n_datasets) + chain_ids = jnp.arange(1) + + if len(self.optimized_models) > 0: + + dict = {list[j]: np.array([getattr(self.optimized_models[i], list[j]) for i in np.arange(len(self.optimized_models))]) for j in np.arange(len(list))} + dict["weights"] = np.array([[transformWeights(getFuncWeights(model))[4] for model in self.optimized_models]]) + dict["bias"] = np.array([[transformBias(getFuncBias(model))[3] for model in self.optimized_models]]) + + idata = az.convert_to_inference_data( + dict, + dims = {"weights": ["chain","draw","n_weight"], "bias": ["chain","draw","n_bias"]}, + coords = {"n_weight": np.arange(len(dict["weights"][0,0])), "n_bias": np.arange(len(dict["bias"][0,0]))} + ) + + post_pred = {} + losses = {} + data_vars = self.simulation.observations.data_vars + evaluator = self.simulation.dispatch() + for x in data_vars: + post_pred[x] = [] + losses[x] = [] + + for model in self.optimized_models: + evaluator.model = model + evaluator() + + for x in data_vars: + post_pred[x].append(evaluator.Y[x]) + losses[x].append(self.simulation.model.loss(self.simulation.observations[x].values, evaluator.Y[x])) + + for x in data_vars: + post_pred[x] = jnp.array(post_pred[x]) + post_pred[x] = jnp.expand_dims(post_pred[x], 0) + losses[x] = jnp.array(losses[x]) + losses[x] = jnp.expand_dims(losses[x], 0) + + post_pred_xr = [] + losses_xr = [] + + model_ids = jnp.arange(len(self.optimized_models)) + + for x in data_vars: + if self.n_datasets == 1: + post_pred[x] = jnp.expand_dims(post_pred[x], 2) + losses[x] = jnp.expand_dims(losses[x], 2) + post_pred_xr.append(xr.DataArray(post_pred[x], coords={"chain": chain_ids, "draw": model_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + losses_xr.append(xr.DataArray(losses[x], coords={"chain": chain_ids, "draw": model_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + + post_pred_xr = xr.merge([x for x in post_pred_xr]) + losses_xr = xr.merge([x for x in losses_xr]) + + idata.add_groups({"observed_data": self.simulation.observations, "posterior_model_fits": post_pred_xr, "losses": losses_xr}) + idata.add_groups({"posterior_predictive": idata.posterior_model_fits, "log_likelihood": idata.losses}) + + else: + + idata = None + + if len(self.failed_models) > 0: + + dict_f = {list[j]: np.array([getattr(self.failed_models[i], list[j]) for i in np.arange(len(self.failed_models))]) for j in np.arange(len(list))} + dict_f["weights"] = np.array([[transformWeights(getFuncWeights(model))[4] for model in self.failed_models]]) + dict_f["bias"] = np.array([[transformBias(getFuncBias(model))[3] for model in self.failed_models]]) + + idata_f = az.convert_to_inference_data( + dict_f, + dims = {"weights": ["chain","draw","n_weight"], "bias": ["chain","draw","n_bias"]}, + coords = {"n_weight": np.arange(len(dict_f["weights"][0,0])), "n_bias": np.arange(len(dict_f["bias"][0,0]))} + ) + + post_pred_f = {} + losses_f = {} + data_vars = self.simulation.observations.data_vars + evaluator = self.simulation.dispatch() + for x in data_vars: + post_pred_f[x] = [] + losses_f[x] = [] + + for model in self.failed_models: + evaluator.model = model + evaluator() + + for x in data_vars: + post_pred_f[x].append(evaluator.Y[x]) + losses_f[x].append(self.simulation.model.loss(self.simulation.observations[x].values, evaluator.Y[x])) + + for x in data_vars: + post_pred_f[x] = jnp.array(post_pred_f[x]) + post_pred_f[x] = jnp.expand_dims(post_pred_f[x], 0) + losses_f[x] = jnp.array(losses_f[x]) + losses_f[x] = jnp.expand_dims(losses_f[x], 0) + + post_pred_f_xr = [] + losses_f_xr = [] + + model_f_ids = jnp.arange(len(self.failed_models)) + + for x in data_vars: + if self.n_datasets == 1: + post_pred_f[x] = jnp.expand_dims(post_pred_f[x], 2) + losses_f[x] = jnp.expand_dims(losses_f[x], 2) + post_pred_f_xr.append(xr.DataArray(post_pred_f[x], coords={"chain": chain_ids, "draw": model_f_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + losses_f_xr.append(xr.DataArray(losses_f[x], coords={"chain": chain_ids, "draw": model_f_ids, "data_batch": batch_ids, "time": ts}).to_dataset(name=x)) + + post_pred_f_xr = xr.merge([x for x in post_pred_f_xr]) + losses_f_xr = xr.merge([x for x in losses_f_xr]) + + idata_f.add_groups({"observed_data": self.simulation.observations, "posterior_model_fits": post_pred_f_xr, "losses": losses_f_xr}) + idata_f.add_groups({"posterior_predictive": idata_f.posterior_model_fits, "log_likelihood": idata_f.losses}) + + else: + + idata_f = None + + return idata, idata_f + + def store_results(self, output=None, output_f=None): + if self.idata != None: + if output is not None: + self.idata.to_netcdf(output) + else: + self.idata.to_netcdf(f"{self.simulation.output_path}/optax_idata.nc") + if self.idata_f != None: + if output_f is not None: + self.idata_f.to_netcdf(output_f) + else: + self.idata_f.to_netcdf(f"{self.simulation.output_path}/optax_idata_f.nc") + + def load_results(self, file="optax_idata.nc", cluster: Optional[int] = None): + idata = az.from_netcdf(f"{self.simulation.output_path}/{file}") + if cluster is not None: + self.select_cluster(idata, cluster) + + self.idata = idata + + def store_loss_evolution(self, output=None): + if output is not None: + self.lossev.to_netcdf(output) + else: + self.lossev.to_netcdf(f"{self.simulation.output_path}/loss_evolution.nc") + + def load_results(self, file="loss_evolution.nc", cluster: Optional[int] = None): + lossev = az.from_netcdf(f"{self.simulation.output_path}/{file}") + if cluster is not None: + self.select_cluster(lossev, cluster) + + self.lossev = lossev \ No newline at end of file diff --git a/pymob/sim/config.py b/pymob/sim/config.py index 6bd94051..172bc340 100644 --- a/pymob/sim/config.py +++ b/pymob/sim/config.py @@ -24,7 +24,7 @@ import pymob from pymob.utils.store_file import scenario_file, converters -from pymob.sim.parameters import Param, NumericArray, OptionRV +from pymob.sim.parameters import Param, NumericArray, OptionRV, to_rv # this loads at the import of the module default_path = sys.path.copy() @@ -174,6 +174,14 @@ def string_to_list(option: Union[List, str]) -> List: return [option] else: return [i.strip() for i in option.split(" ")] + + +def string_to_floatlist(option: Union[List, str]) -> List: + return [float(i) for i in string_to_list(option)] + + +def string_to_intlist(option: Union[List, str]) -> List: + return [int(i) for i in string_to_list(option)] def string_to_tuple(option: Union[List, str]) -> Tuple: @@ -792,6 +800,44 @@ class Numpyro(PymobModel): # svi parameters svi_iterations: Annotated[int, to_str] = 10_000 svi_learning_rate: Annotated[float, to_str] = 0.0001 + + +def string_to_modelparams(option:str|Modelparameters) -> Modelparameters: + if isinstance(option, Modelparameters): + return option + else: + modelparams_dict = Modelparameters() + if option != "": + for substring in option.split(" "): + name, value = substring.split(" = ") + setattr(modelparams_dict, name, string_to_param(value)) + return Modelparameters.model_validate(modelparams_dict, strict=False) + +def modelparams_to_string(mprms: Modelparameters): + string = "" + for (key, item) in mprms.all.items(): + string += key + " = " + param_to_string(item) + " " + return string + +serialize_modelparams_to_string = PlainSerializer( + modelparams_to_string, + return_type=str, + when_used="json" +) + +class Optax(PymobModel): + model_config = ConfigDict(validate_assignment=True, extra="ignore") + + MLP_weight_dist: OptionRV = to_rv("normal()") + MLP_bias_dist: OptionRV = to_rv("normal()") + length_strategy: Annotated[list, BeforeValidator(string_to_floatlist), serialize_list_to_string] = [0.1, 1] + steps_strategy: Annotated[int, to_str] = 1000 + lr_strategy: float = 1e-3 + clip_strategy: float = 0.1 + batch_size: Annotated[int, to_str] = 1 + data_split: float = 0.8 + multiple_runs_target: Annotated[int, to_str] = 10 + multiple_runs_limit: Annotated[int, to_str] = 50 class Report(PymobModel): model_config = ConfigDict(validate_assignment=True, extra="ignore") @@ -880,6 +926,7 @@ def __init__( inference_pyabc_redis: Redis = Field(default=Redis(), alias="inference.pyabc.redis") inference_pymoo: Pymoo = Field(default=Pymoo(), alias="inference.pymoo") inference_numpyro: Numpyro = Field(default=Numpyro(), alias="inference.numpyro") + inference_optax: Optax = Field(default=Optax(), alias="inference.optax") report: Report = Field(default=Report(), alias="report") @property @@ -932,7 +979,7 @@ def save(self, fp: Optional[str]=None, force=False): by_alias=True, mode="json", exclude_none=True, - exclude={"case_study": {"output_path", "data_path", "root", "init_root", "default_settings_path"}} + exclude={"case_study": {"output_path", "data_path", "root", "init_root", "default_settings_path"}, "inference_optax": {"loss_function"}} ) self._config.update(**settings) diff --git a/pymob/sim/evaluator.py b/pymob/sim/evaluator.py index faf0d93f..5507fb6d 100644 --- a/pymob/sim/evaluator.py +++ b/pymob/sim/evaluator.py @@ -6,6 +6,7 @@ import numpy as np from numpy.typing import NDArray from pymob.solvers.base import mappar, SolverBase +from pymob.utils.errors import import_optional_dependency def create_dataset_from_numpy(Y, Y_names, coordinates): DeprecationWarning( @@ -238,10 +239,20 @@ def __init__( }) solver_options.update(solver_extra_options) - + + model_solver = self.model + + equinox = import_optional_dependency( + "equinox", errors="ignore" + ) + if equinox is not None: + from pymob.solvers.diffrax import UDESolver + import equinox as eqx + if solver == UDESolver: + model_params, model_solver = eqx.partition(self.model, eqx.is_array) self._solver = solver( - model=self.model, + model=model_solver, post_processing=self.post_processing, coordinates=frozen_coordinates, @@ -347,9 +358,21 @@ def __call__(self, seed=None): if seed is not None: self._signature.update({"seed": seed}) - if isinstance(self._solver, SolverBase): + equinox = import_optional_dependency( + "equinox", errors="ignore" + ) + if equinox is not None: + from pymob.solvers.diffrax import UDESolver + import equinox as eqx + if isinstance(self._solver, UDESolver): + params, static = eqx.partition(self.model, eqx.is_array) + Y_ = self._solver(params, **self.parameters) + elif isinstance(self._solver, SolverBase): + Y_ = self._solver(**self.parameters) + else: + Y_ = self._solver(parameters=self.parameters, **self._signature) + elif isinstance(self._solver, SolverBase): Y_ = self._solver(**self.parameters) - else: Y_ = self._solver(parameters=self.parameters, **self._signature) diff --git a/pymob/sim/plot.py b/pymob/sim/plot.py index 5185332e..bdf77c91 100644 --- a/pymob/sim/plot.py +++ b/pymob/sim/plot.py @@ -5,6 +5,7 @@ import arviz as az import numpy as np import numpy.typing as npt +import jax.numpy as jnp from pymob.sim.config import Config from matplotlib import pyplot as plt @@ -326,6 +327,4 @@ def close(self): def save(self, filename): self.figure.savefig( f"{self.config.case_study.output_path}/{filename}" - ) - - \ No newline at end of file + ) \ No newline at end of file diff --git a/pymob/simulation.py b/pymob/simulation.py index 9901adb2..777f1e89 100644 --- a/pymob/simulation.py +++ b/pymob/simulation.py @@ -26,6 +26,7 @@ from pymob.sim.config import Config, ParameterDict, DataVariable, Param, NumericArray from pymob.sim.plot import SimulationPlot from pymob.sim.report import Report +from pymob.solvers.diffrax import UDESolver config_deprecation = "Direct access of config options will be deprecated. Use `Simulation.config.OPTION` API instead" MODULES = ["sim", "mod", "prob", "data", "plot"] @@ -563,7 +564,17 @@ def run_bench(): def infer_ode_states(self) -> int: if self.config.simulation.n_ode_states == -1: try: - return_args = get_return_arguments(self.model) + equinox = import_optional_dependency( + "equinox", errors="ignore" + ) + if equinox is not None: + from pymob.solvers.diffrax import UDESolver + if self.solver == UDESolver: + return_args = get_return_arguments(self.model.model) + else: + return_args = get_return_arguments(self.model) + else: + return_args = get_return_arguments(self.model) n_ode_states = len(return_args) warnings.warn( "The number of ODE states was not specified in " @@ -1148,6 +1159,18 @@ def set_inferer(self, backend: Literal["numpyro", "scipy", "pyabc", "pymoo"]): from pymob.inference.scipy_backend import ScipyBackend self.inferer = ScipyBackend(simulation=self) + + elif backend == "optax": + optax = import_optional_dependency( + "optax", errors="raise", extra=extra.format("optax") + ) + equinox = import_optional_dependency( + "equinox", errors="raise", extra=extra.format("equinox") + ) + if optax is not None and equinox is not None: + from pymob.inference.optax_backend import OptaxBackend + + self.inferer = OptaxBackend(simulation=self) @@ -1829,6 +1852,7 @@ def posterior_predictive_checks(self, **plot_kwargs): ) simplot.plot_data_variables() + simplot.save("posterior_predictive.png") diff --git a/pymob/solvers/diffrax.py b/pymob/solvers/diffrax.py index 23436eca..82fcf7d8 100644 --- a/pymob/solvers/diffrax.py +++ b/pymob/solvers/diffrax.py @@ -1,7 +1,7 @@ from functools import partial from types import ModuleType from collections import OrderedDict -from typing import Optional, List, Dict, Literal, Tuple, OrderedDict +from typing import Optional, List, Dict, Literal, Tuple, OrderedDict, Callable from pymob.solvers.base import mappar, SolverBase from frozendict import frozendict from dataclasses import dataclass, field @@ -9,6 +9,7 @@ from jax import Array import jax import diffrax +from pymob.utils.errors import import_optional_dependency from diffrax._solver.base import _MetaAbstractSolver from diffrax import ( diffeqsolve, @@ -22,6 +23,13 @@ RecursiveCheckpointAdjoint, LinearInterpolation, ) +equinox = import_optional_dependency( + "equinox", errors="raise", extra="set_inferer(backend='equinox') was not executed successfully, because " + "'equinox' dependencies were not found. They can be installed with " + "pip install pymob[equinox]. Alternatively:" +) +if equinox is not None: + import equinox as eqx Mode = Literal['r', 'rb', 'w', 'wb'] @@ -261,3 +269,267 @@ def odesolve_splitargs(self, *args, odestates, n_odeargs, n_ppargs, n_xin): res_dict = OrderedDict({v:val for v, val in zip(odestates, sol)}) return self.post_processing(res_dict, jnp.array(self.x), interp, *ppargs) + +class UDESolver(JaxSolver): + + model = None + + def __post_init__(self, *args, **kwargs): + super().__post_init__(*args, **kwargs) + + def __call__(self, model_params, **kwargs): + return self.solve(model_params, **kwargs) + + # @partial(eqx.filter_jit, static_argnames=["self"]) + @eqx.filter_jit + def solve(self, model_params, parameters: Dict, y0:Dict={}, x_in:Dict={}): + + + X_in = self.preprocess_x_in(x_in) + x_in_flat = [x for xi in X_in for x in xi] + + Y_0 = self.preprocess_y_0(y0) + + pp_args = self.preprocess_parameters(model_params, parameters) + + initialized_eval_func = partial( + self.odesolve_splitargs, + model_params = model_params, + odestates = tuple(y0.keys()), + n_ppargs=len(pp_args), + n_xin=len(x_in_flat) + ) + + loop_eval = jax.vmap( + initialized_eval_func, + in_axes=( + *[0 for _ in range(self.n_ode_states)], + *[0 for _ in range(len(pp_args))], + *[0 for _ in range(len(x_in_flat))], + ) + ) + result = loop_eval(*Y_0, *pp_args, *x_in_flat) + + # if self.batch_dimension not in self.coordinates: + # this is not yet stable, because it may remove extra dimensions + # if there is a batch dimension of explicitly one specified + + # there is an extra dimension added if no batch dimension is present + # this is added at the 0-axis + # if parameters are scalars, the returned shape is + for v, val in result.items(): + if self.batch_dimension not in self.data_structure_and_dimensionality[v]: + # otherwise it has a dummy dimension of length 1 + val_reduced = jnp.squeeze(val, 0) + else: + val_reduced = val + + expected_dims = tuple(self.data_structure_and_dimensionality[v].values()) + if len(expected_dims) != len(val_reduced.shape): + # if the number of present dims is larger than the number of + # expected dims, this is because the ODE "only" returned scalar + # values. This is broadcasted to array of ndim=1 + val_reduced = jnp.squeeze(val_reduced, -1) + else: + pass + + # si = [ + # s for dim, s in self.data_structure_and_dimensionality[v].items() + # if dim != self.batch_dimension + # ] + + # correct_shape = (s0, *si) + + # [i for i, vs in enumerate(val.shape) if vs not in expected_dims] + # jnp.permute_dims(val, expected_dims) + # val_reduced = val.permute_dims(expected_dims) + result.update({v: val_reduced}) + + return result + + # @partial(eqx.filter_jit, static_argnames=["self"]) + @eqx.filter_jit + def preprocess_parameters(self, model_params, parameters, num_backend: ModuleType = jnp): + model = eqx.combine(self.model, model_params) + pp_args = mappar( + self.post_processing, + parameters, + exclude=self.exclude_kwargs_postprocessing, + to="dict" + ) + pp_args_broadcasted = self._broadcast_args( + arg_dict=frozendict(pp_args), # type: ignore + num_backend=num_backend + ) + + return pp_args_broadcasted + + # @partial(eqx.filter_jit, static_argnames=["self"]) + @eqx.filter_jit + def odesolve(self, model_params, y0, x_in): + model = eqx.combine(self.model, model_params) + + y0 = jnp.array([x[0] for x in jnp.array(y0)]) + interp = () + + if len(x_in) > 0: + if len(x_in) > 2: + raise NotImplementedError( + "Currently only one interpolation is implemented, but "+ + "it should be relatively simple to implement multiple "+ + "interpolations. I assume, the interpolations could be "+ + "passed as a list and expanded in the model. If you are "+ + "dealing with this. Try pre-compute the interpolations. "+ + "This should speed up the solver. " + ) + + + if x_in[0].shape[0] != x_in[1].shape[0]: + raise ValueError( + "Mismatch in zero-th dimensions of x and y in interpolation "+ + "input 'x_in'. This often results of a problematic dimensional "+ + "order. Consider reordering the dimensions and reordering the "+ + "x dimension (e.g. time) after the batch dimension and before "+ + "any other dimension." + ) + interp = tuple([LinearInterpolation(ts=x_in[0], ys=x_in[1])]) + # jumps = x_in[0][self.coordinates_input_vars["x_in"][self.x_dim] < self.x[-1]] + jumps = jnp.array(self.x_in_jumps, dtype=float) + else: + interp = interp + jumps = None + + solver = self.diffrax_solver() # type: ignore (diffrax_solver is ensured + # to be _MetaAbstractSolver type during + # post_init) + saveat = SaveAt(ts=self.x) + t_min = self.x[0] + t_max = self.x[-1] + # jump only those ts that are smaller than the last observations + stepsize_controller = PIDController( + rtol=self.rtol, atol=self.atol, + pcoeff=self.pcoeff, icoeff=self.icoeff, dcoeff=self.dcoeff, + ) + + if jumps is not None: + stepsize_controller = ClipStepSizeController(stepsize_controller, jump_ts=jumps) + else: + pass + + sol = diffeqsolve( + terms=ODETerm(model), + solver=solver, + t0=t_min, + t1=t_max, + dt0=self.x[1]-self.x[0], + y0=y0, + args=interp, + saveat=saveat, + stepsize_controller=stepsize_controller, + adjoint=RecursiveCheckpointAdjoint(), + max_steps=int(self.max_steps), + # throw=False returns inf for all t > t_b, where t_b is the time + # at which the solver broke due to reaching max_steps. This behavior + # happens instead of throwing an exception. + throw=self.throw_exception + ) + + sol_y = tuple([sol.ys[:,i] for i in jnp.arange(sol.ys.shape[1])]) + + return tuple(sol_y), interp + + # @partial(eqx.filter_jit, static_argnames=["self", "odestates", "n_odeargs", "n_ppargs", "n_xin"]) + @eqx.filter_jit + def odesolve_splitargs(self, *args, model_params, odestates, n_ppargs, n_xin): + n_odestates = len(odestates) + y0 = args[:n_odestates] + ppargs = args[n_odestates:n_odestates+n_ppargs] + x_in = args[n_odestates+n_ppargs:n_odestates+n_ppargs+n_xin] + sol, interp = self.odesolve(model_params=model_params, y0=y0, x_in=x_in) + + res_dict = OrderedDict({v:val for v, val in zip(odestates, sol)}) + + return self.post_processing(res_dict, jnp.array(self.x), interp, *ppargs) + + def standalone_solver(self, model, ts, y0, x_in): + """ + Returns a time series (evaluated at the time points defined by ts) of the model + defined in Func starting from an initial condition y0. + + Parameters + ---------- + ts : jax.ArrayImpl + An array containing all the time points the timeseries should be evaluated for. + y0 : jax.ArrayImpl + An array containg the initial condition for the simulation. + + Returns: + -------- + jax.ArrayImpl + An array containing the simulated time series for both state variables. + """ + + if y0.shape == (): + y0 = jnp.array([y0]) + else: + y0 = jnp.array([x for x in jnp.array(y0)]) + + if x_in == None: + interp = () + jumps = None + else: + if len(x_in) > 0: + if len(x_in) > 2: + raise NotImplementedError( + "Currently only one interpolation is implemented, but "+ + "it should be relatively simple to implement multiple "+ + "interpolations. I assume, the interpolations could be "+ + "passed as a list and expanded in the model. If you are "+ + "dealing with this. Try pre-compute the interpolations. "+ + "This should speed up the solver. " + ) + + + if x_in[0].shape[0] != x_in[1].shape[0]: + raise ValueError( + "Mismatch in zero-th dimensions of x and y in interpolation "+ + "input 'x_in'. This often results of a problematic dimensional "+ + "order. Consider reordering the dimensions and reordering the "+ + "x dimension (e.g. time) after the batch dimension and before "+ + "any other dimension." + ) + interp = tuple([LinearInterpolation(ts=x_in[0], ys=x_in[1])]) + # jumps = x_in[0][self.coordinates_input_vars["x_in"][self.x_dim] < self.x[-1]] + jumps = jnp.array(self.x_in_jumps, dtype=float) + else: + interp = () + jumps = None + + stepsize_controller = PIDController( + rtol=self.rtol, atol=self.atol, + pcoeff=self.pcoeff, icoeff=self.icoeff, dcoeff=self.dcoeff, + ) + + if jumps is not None: + stepsize_controller = ClipStepSizeController(stepsize_controller, jump_ts=jumps) + else: + pass + + sol = diffrax.diffeqsolve( + diffrax.ODETerm(model), + self.diffrax_solver(), + t0=ts[0], + t1=ts[-1], + dt0=ts[1] - ts[0], + y0=y0, + args=interp, + stepsize_controller=stepsize_controller, + adjoint=RecursiveCheckpointAdjoint(), + saveat=diffrax.SaveAt(ts=ts), + max_steps=int(self.max_steps), + throw = self.throw_exception + ) + + sol_y = tuple([sol.ys[:,i] for i in jnp.arange(sol.ys.shape[1])]) + + return sol_y \ No newline at end of file diff --git a/pymob/utils/UDE.py b/pymob/utils/UDE.py new file mode 100644 index 00000000..8ae07ea2 --- /dev/null +++ b/pymob/utils/UDE.py @@ -0,0 +1,272 @@ +import equinox as eqx +import jax.numpy as jnp +import jax.tree_util as jtu +import jax.nn as jnn +import jax.lax as jl +from typing import Callable +from pymob.utils.errors import import_optional_dependency +equinox = import_optional_dependency( + "equinox", errors="raise", extra="set_inferer(backend='equinox') was not executed successfully, because " + "'equinox' dependencies were not found. They can be installed with " + "pip install pymob[equinox]. Alternatively:" +) +if equinox is not None: + import equinox as eqx + +def transformWeightsBackwards(in_size, out_size, width_size, depth, list): + """ + Transform a list of MLP weights to a nested Array/list structure + required to impute the weights into the MLP. + + Parameters: + ---------- + in_size : int + Length of the Array serving as input to the MLP. + out_size : int + Length of the Array being returned by the MLP as its result. + width_size : int + Width of the intermediate layers of the MLP. + depth : int + Number of layers excluding the input layer. + E.g., input layer + 2 intermediate layers + output layer => depth = 3 + list : list + Simple list containing all the weights in an unstructured manner. + + Returns: + ------- + res : list + List containing multiple Arrays with weights for the individual layers. + Can be imputed into an MLP using eqx.tree_at(). + + """ + countLayer = 0 + countElms = 0 + res = [] + while (countLayer <= depth): + if countLayer == 0: + elms = in_size * width_size + weights = jnp.array(list[countElms:countElms+elms]).reshape((width_size,in_size)) + countElms += elms + countLayer += 1 + res.append(weights) + elif countLayer == depth: + elms = width_size * out_size + weights = jnp.array(list[countElms:countElms+elms]).reshape((out_size,width_size)) + countElms += elms + countLayer += 1 + res.append(weights) + else: + elms = width_size * width_size + weights = jnp.array(list[countElms:countElms+elms]).reshape((width_size,width_size)) + countElms += elms + countLayer += 1 + res.append(weights) + return res + +def transformBiasBackwards(out_size, width_size, depth, list): + """ + Transform a list of MLP bias to a nested Array/list structure + required to impute the bias into the MLP. + + Parameters: + ---------- + out_size: int + Length of the Array being returned by the MLP as its result. + width_size: int + Width of the intermediate layers of the MLP. + depth: int + Number of layers excluding the input layer. + E.g., input layer + 2 intermediate layers + output layer => depth = 3 + + Returns: + ------- + res : list + List containing multiple Arrays with bias for the individual layers. + Can be imputed into an MLP using eqx.tree_at(). + + """ + countLayer = 0 + countElms = 0 + res = [] + while (countLayer <= depth): + if countLayer == depth: + elms = out_size + bias = jnp.array(list[countElms:countElms+elms]) + countElms += elms + countLayer += 1 + res.append(bias) + else: + elms = width_size + bias = jnp.array(list[countElms:countElms+elms]) + countElms += elms + countLayer += 1 + res.append(bias) + return res + +def transformWeights(weights): + """ + Transform a nested Array/list structure of MLP bias to a simple list. + + Parameters: + ---------- + weights : list + List containing multiple Arrays with bias for the individual layers. + + Returns: + ------- + in_size : int + Length of the Array serving as input to the MLP. + out_size : int + Length of the Array being returned by the MLP as its result. + width_size : int + Width of the intermediate layers of the MLP. + depth : int + Number of layers excluding the input layer. + E.g., input layer + 2 intermediate layers + output layer => depth = 3 + list : list + Simple list containing all the bias in an unstructured manner. + """ + depth = len(weights)-1 + width_size, in_size = weights[0].shape + out_size = weights[-1].shape[0] + list = [] + for layer in weights: + dims = layer.shape + elms = dims[0] * dims[1] + layerR = layer.reshape(elms) + for el in layerR: + list.append(el.item()) + return in_size, out_size, width_size, depth, list + +def transformBias(bias): + """ + Transform a nested Array/list structure of MLP bias to a simple list. + + Parameters: + ---------- + bias : list + List containing multiple Arrays with bias for the individual layers. + + Returns: + ------- + out_size : int + Length of the Array being returned by the MLP as its result. + width_size : int + Width of the intermediate layers of the MLP. + depth : int + Number of layers excluding the input layer. + E.g., input layer + 2 intermediate layers + output layer => depth = 3 + list : list + Simple list containing all the bias in an unstructured manner. + """ + depth = len(bias)-1 + width_size = len(bias[0]) + out_size = len(bias[-1]) + list = [] + for layer in bias: + for el in layer: + list.append(el.item()) + return out_size, width_size, depth, list + +def getFuncWeights(func): + """ + Returns the weights of the MLP inside a Func object in a nested + Array/list structure. + """ + is_linear = lambda x: isinstance(x, eqx.nn.Linear) + get_weights = lambda m: [x.weight for x in jtu.tree_leaves(m, is_leaf=is_linear) if is_linear(x)] + return get_weights(func.mlp) + +def getFuncBias(func): + """ + Returns the bias of the MLP inside a Func object in a nested + Array/list structure. + """ + is_linear = lambda x: isinstance(x, eqx.nn.Linear) + get_weights = lambda m: [x.bias for x in jtu.tree_leaves(m, is_leaf=is_linear) if is_linear(x)] + return get_weights(func.mlp) + +class UDEBase(eqx.Module): + + UDE_params: list + mlp: eqx.nn.MLP + + mlp_depth: int = 3 + mlp_width: int = 3 + mlp_in_size: int = 2 + mlp_out_size: int = 2 + mlp_activation: Callable = staticmethod(jnn.softplus) + mlp_final_activation: Callable = staticmethod(jnn.tanh) + + def init_MLP(self, weights=None, bias=None, *, key, **kwargs): + + mlp = eqx.nn.MLP(in_size=self.mlp_in_size, out_size=self.mlp_out_size, width_size=self.mlp_width, depth=self.mlp_depth, activation=self.mlp_activation, final_activation=self.mlp_final_activation, key=key) + + is_linear = lambda x: isinstance(x, eqx.nn.Linear) + + if weights != None: + get_weights = lambda m: [x.weight for x in jtu.tree_leaves(m, is_leaf=is_linear) if is_linear(x)] + new_weights = transformWeightsBackwards(in_size = mlp.in_size, out_size = mlp.out_size, width_size = mlp.width_size, depth = mlp.depth, list = weights) + mlp = eqx.tree_at(get_weights, mlp, new_weights) + + if bias != None: + get_bias = lambda m: [x.bias for x in jtu.tree_leaves(m, is_leaf=is_linear) if is_linear(x)] + new_bias = transformBiasBackwards(out_size = mlp.out_size, width_size = mlp.width_size, depth = mlp.depth, list = bias) + mlp = eqx.tree_at(get_bias, mlp, new_bias) + + self.mlp = mlp + + def init_params(self, params): + + self.UDE_params = [] + + for (key, value) in params.items(): + if isinstance(value, tuple): + setattr(self, key, jnp.array(value[0])) + else: + setattr(self, key, jnp.array(value)) + self.UDE_params.append((key, value)) + + def preprocess_params(self): + + params = {} + for param in self.UDE_params: + if isinstance(param[1], tuple) and param[1][1] == False: + params[param[0]] = jl.stop_gradient(param[1][0]) + elif isinstance(param[1], tuple): + params[param[0]] = param[1][0] + else: + params[param[0]] = param[1] + return params + + def __init__(self, params, weights=None, bias=None, *, key, **kwargs): + self.init_MLP(weights, bias, key=key) + self.init_params(params) + + def __call__(self, t, y, x_in): + params = self.preprocess_params() + derivatives = self.model(t, y, *x_in, self.mlp, **params) + if type(derivatives) == tuple: + return jnp.array([der.astype(float) for der in derivatives]) + else: + return jnp.array(derivatives) + + @staticmethod + def loss(y_obs, y_pred): + return (y_obs - y_pred)**2 + + def __hash__(self): + dynamic, static = eqx.partition(self, eqx.is_array) + hash1 = static.mlp.__hash__() + hash2 = 0 + if getattr(dynamic, self.UDE_params[0][0]) != None: + a = tuple([getattr(self, attr) for attr in [x[0] for x in self.UDE_params]]) + b1 = transformBias(getFuncBias(dynamic)) + b2 = transformWeights(getFuncWeights(dynamic)) + b = b2[0:4] + tuple(b1[3]) + tuple(b2[4]) + c = a + b + hash2 = c.__hash__() + return hash1 + hash2 + + def __eq__(self, other): + return type(self) == type(other) and self.__hash__() == other.__hash__() \ No newline at end of file diff --git a/tests/fixtures.py b/tests/fixtures.py index a651352b..90ec53f8 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -2,8 +2,10 @@ import numpy as np import xarray as xr import pytest +import jax.random as jr +import jax.numpy as jnp -from pymob.solvers.diffrax import JaxSolver +from pymob.solvers.diffrax import JaxSolver, UDESolver from pymob.sim.config import Config, DataVariable, Modelparameters from pymob.sim.parameters import Param, RandomVariable, Expression, OptionRV from pymob.simulation import SimulationBase @@ -11,6 +13,7 @@ from pymob.examples import linear_model from lotka_volterra_case_study.sim import Simulation +from lotka_volterra_UDE_case_study.mod import Func rng = np.random.default_rng(1) @@ -164,3 +167,18 @@ def create_simulation_for_test_numpyro_behavior(): sim.config.create_directory("scenario", force=True) sim.config.save(force=True) +def init_lotka_volterra_UDE_case_study_from_settings(option: str): + + config = Config(f"case_studies/lotka_volterra_UDE_case_study/scenarios/{option}/settings.cfg") + sim = SimulationBase(config) + sim.initialize(config) + + key = jr.PRNGKey(5678) + data_key, model_key, loader_key = jr.split(key, 3) + sim.model = Func({"alpha":jnp.array(1.3), "delta":jnp.array(1.8)},key=model_key) + + sim.solver = UDESolver + + sim.model_parameters["y0"] = sim.observations.sel(time = 0).drop_vars("time") + + return sim \ No newline at end of file diff --git a/tests/test_backend_optax.py b/tests/test_backend_optax.py new file mode 100644 index 00000000..f1efe705 --- /dev/null +++ b/tests/test_backend_optax.py @@ -0,0 +1,25 @@ +import numpy as np +from tests.fixtures import init_lotka_volterra_UDE_case_study_from_settings + +def test_convergence_optax_backend(): + sim = init_lotka_volterra_UDE_case_study_from_settings("InfererTest") + + sim.dispatch_constructor() + + sim.set_inferer("optax") + + sim.inferer.run() + + sim.model = sim.inferer.optimized_models[0] + + sim.dispatch_constructor() + + # Create an evaluator, run the simulation and obtain the results + evaluator = sim.dispatch() + evaluator() + + obs_prey = np.where(np.isnan(sim.observations.prey.values), evaluator.Y["prey"], sim.observations.prey.values) + np.testing.assert_allclose(evaluator.Y["prey"], obs_prey, atol = 1, rtol = 1) + + obs_predator = np.where(np.isnan(sim.observations.predator.values), evaluator.Y["predator"], sim.observations.predator.values) + np.testing.assert_allclose(evaluator.Y["predator"], obs_predator, atol = 1, rtol = 1) \ No newline at end of file diff --git a/tests/test_solvers.py b/tests/test_solvers.py index 0b5a83de..bc3ee800 100644 --- a/tests/test_solvers.py +++ b/tests/test_solvers.py @@ -2,6 +2,8 @@ import time import numpy as np import pytest +import diffrax +import jax.numpy as jnp from pymob.sim.config import Param, DataVariable from pymob.solvers import JaxSolver, SolverBase @@ -9,7 +11,8 @@ from tests.fixtures import ( init_simulation_casestudy_api, init_lotkavolterra_simulation_replicated, - setup_solver + setup_solver, + init_lotka_volterra_UDE_case_study_from_settings ) from pymob import SimulationBase @@ -171,6 +174,34 @@ def test_solver_dimensional_order(): (res_id_time.to_array() - res_time_id.to_array()).values, 0 ) +def test_UDE_solver(): + sim = init_lotka_volterra_UDE_case_study_from_settings("UDESolverTest") + + sim.dispatch_constructor() + + evaluator = sim.dispatch(theta={"delta":1.8}) + evaluator() + data_res = evaluator.results + + f = lambda t, y, args: sim.model(t, y, *args) + t = sim.coordinates["time"] + + data_res2 = diffrax.diffeqsolve(diffrax.ODETerm(f), + diffrax.Tsit5(), + t0=t[0], + t1=t[-1], + dt0=t[1] - t[0], + y0=jnp.array([sim.model_parameters["y0"]["prey"].to_numpy(), jnp.array(sim.model_parameters["y0"]["predator"].to_numpy())]), + args=(), + stepsize_controller=diffrax.PIDController(rtol=sim.evaluator._solver.rtol, atol=sim.evaluator._solver.atol, pcoeff=sim.evaluator._solver.pcoeff, icoeff=sim.evaluator._solver.icoeff, dcoeff=sim.evaluator._solver.dcoeff), + saveat=diffrax.SaveAt(ts=t), + max_steps=sim.config.jaxsolver.max_steps, + throw = False, + ) + + np.testing.assert_allclose(data_res["prey"].to_numpy(), data_res2.ys[:,0], atol = 1e-1, rtol = 1e-3) + np.testing.assert_allclose(data_res["predator"].to_numpy(), data_res2.ys[:,1], atol = 1e-1, rtol = 1e-3) +