diff --git a/CHANGELOG.md b/CHANGELOG.md index d80f022cfc..4add4b5ca7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ## Unreleased ### Added +- [#1432](https://github.com/pints-team/pints/pull/1432) Added 2 new stochastic models: production and degradation model, Schlogl's system of chemical reactions. Moved the stochastic logistic model into `pints.stochastic` to take advantage of the `MarkovJumpModel`. - [#1420](https://github.com/pints-team/pints/pull/1420) The `Optimiser` class now distinguishes between a best-visited point (`x_best`, with score `f_best`) and a best-guessed point (`x_guessed`, with approximate score `f_guessed`). For most optimisers, the two values are equivalent. The `OptimisationController` still tracks `x_best` and `f_best` by default, but this can be modified using the methods `set_f_guessed_tracking` and `f_guessed_tracking`. - [#1417](https://github.com/pints-team/pints/pull/1417) Added a module `toy.stochastic` for stochastic models. In particular, `toy.stochastic.MarkovJumpModel` implements Gillespie's algorithm for easier future implementation of stochastic models. diff --git a/docs/source/toy/index.rst b/docs/source/toy/index.rst index 36e0e9ca92..ae09649192 100644 --- a/docs/source/toy/index.rst +++ b/docs/source/toy/index.rst @@ -37,5 +37,4 @@ Some toy classes provide extra functionality defined in the simple_egg_box_logpdf simple_harmonic_oscillator_model sir_model - stochastic_logistic_model twisted_gaussian_logpdf diff --git a/docs/source/toy/stochastic/index.rst b/docs/source/toy/stochastic/index.rst index 586945bd24..e25c7a2a7f 100644 --- a/docs/source/toy/stochastic/index.rst +++ b/docs/source/toy/stochastic/index.rst @@ -12,4 +12,7 @@ examples. markov_jump_model stochastic_degradation_model + stochastic_logistic_model stochastic_michaelis_menten_model + stochastic_production_degradation_model + stochastic_schlogl_model diff --git a/docs/source/toy/stochastic_logistic_model.rst b/docs/source/toy/stochastic/stochastic_logistic_model.rst similarity index 53% rename from docs/source/toy/stochastic_logistic_model.rst rename to docs/source/toy/stochastic/stochastic_logistic_model.rst index a5fb8eec2a..4045e8c1ac 100644 --- a/docs/source/toy/stochastic_logistic_model.rst +++ b/docs/source/toy/stochastic/stochastic_logistic_model.rst @@ -2,6 +2,6 @@ Stochastic Logistic Model ************************* -.. currentmodule:: pints.toy +.. currentmodule:: pints.toy.stochastic -.. autoclass:: StochasticLogisticModel +.. autoclass:: LogisticModel diff --git a/docs/source/toy/stochastic/stochastic_production_degradation_model.rst b/docs/source/toy/stochastic/stochastic_production_degradation_model.rst new file mode 100644 index 0000000000..05925fbd3c --- /dev/null +++ b/docs/source/toy/stochastic/stochastic_production_degradation_model.rst @@ -0,0 +1,7 @@ +******************************************* +Stochastic production and degradation model +******************************************* + +.. currentmodule:: pints.toy.stochastic + +.. autoclass:: ProductionDegradationModel diff --git a/docs/source/toy/stochastic/stochastic_schlogl_model.rst b/docs/source/toy/stochastic/stochastic_schlogl_model.rst new file mode 100644 index 0000000000..1359267ab8 --- /dev/null +++ b/docs/source/toy/stochastic/stochastic_schlogl_model.rst @@ -0,0 +1,7 @@ +*************** +Schlogl's model +*************** + +.. currentmodule:: pints.toy.stochastic + +.. autoclass:: SchloglModel diff --git a/examples/README.md b/examples/README.md index 1a3961d2be..c795ee6d13 100644 --- a/examples/README.md +++ b/examples/README.md @@ -120,6 +120,8 @@ relevant code. - [Stochastic Degradation model](./toy/model-stochastic-degradation.ipynb) - [Stochastic Logistic model](./toy/model-stochastic-logistic-growth.ipynb) - [Stochastic Michaelis Menten model](./toy/model-stochastic-michaelis-menten.ipynb) +- [Stochastic Production Degradation model](toy/model-stochastic-production-degradation.ipynb) +- [Stochastic Schlogl model](toy/model-stochastic-schlogl.ipynb) ### Distributions - [Annulus](./toy/distribution-annulus.ipynb) diff --git a/examples/toy/model-stochastic-logistic-growth.ipynb b/examples/toy/model-stochastic-logistic-growth.ipynb index 1ccd30e0e5..7c3447dcee 100644 --- a/examples/toy/model-stochastic-logistic-growth.ipynb +++ b/examples/toy/model-stochastic-logistic-growth.ipynb @@ -12,23 +12,26 @@ "The population grows starting from an initial population size, $n_0$, to a carrying capacity $k$ following a rate according to the following model [(Simpson et al., 2019)](https://doi.org/10.1101/533182):\n", " $$A \\xrightarrow{b_0(1-\\frac{\\mathcal{C}(t)}{k})} 2A$$\n", "\n", - "The model is simulated according to the Gillespie stochastic simulation algorithm [(Gillespie, 1976)](https://doi.org/10.1016/0021-9991(76)90041-3), [(Erban et al., 2007)](https://arxiv.org/abs/0704.1908):\n", + "The model is simulated according to the Gillespie stochastic simulation algorithm [(Gillespie, 1976)](https://doi.org/10.1016/0021-9991%2876%2990041-3), [(Erban et al., 2007)](https://arxiv.org/abs/0704.1908):\n", " 1. Sample a random value r from a uniform distribution: $r \\sim \\text{Uniform}(0,1)$\n", " 2. Calculate the time ($\\tau$) until the next single reaction as follows:\n", " $$ \\tau = \\frac{-\\ln{r}}{\\mathcal{C}(t)b_{0} (1-\\frac{\\mathcal{C}(t)}{k})} $$\n", " 3. Update the population size at time t + $\\tau$ as: $ \\mathcal{C}(t + \\tau) = \\mathcal{C}(t) + 1 $\n", - " 4. Return to step (1) until population size reaches $k$\n", + " 4. Return to step (1)\n", " " ] }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "collapsed": true + }, "outputs": [], "source": [ "import pints\n", "import pints.toy\n", + "import pints.toy.stochastic\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] @@ -37,7 +40,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Specify initial population size, time points at which to record population values, initial birth rate $b_0$, and carrying capacity, $k$" + "We first perform a single simulation, where we specify the initial population size, time points at which to record population values, birth rate $b_0$, and carrying capacity, $k$." ] }, { @@ -47,7 +50,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -60,13 +63,15 @@ ], "source": [ "n_0 = 50\n", - "model = pints.toy.StochasticLogisticModel(n_0)\n", - "\n", - "times = np.linspace(0, 100, 101)\n", + "model = pints.toy.stochastic.LogisticModel(n_0)\n", "\n", - "# $b_0$ = 0.1, $k$ = 500\n", - "params = [0.1, 500]\n", + "# specify model parameters\n", + "b_0 = 0.1\n", + "k = 500\n", + "params = [b_0, k]\n", "\n", + "# simulate using Gillespie's algorithm\n", + "times = np.linspace(0, 100, 101)\n", "values = model.simulate(params, times)\n", "\n", "plt.step(times, values)\n", @@ -79,7 +84,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Given the stochastic nature of this model, every iteration returns a different result. However, averaging the population values at each time step, produces a reproducible result which tends towards a deterministic function as the the number of iterations tends to infinity: $$ \\mathcal{C}(t) = \\frac{k\\mathcal{C}(0)}{\\mathcal{C}(0) + e^{-b_{0}t}(k-\\mathcal{C}(0))} $$\n" + "Given the stochastic nature of this model, every iteration will likely return a different result. However, the process has a deterministic mean:\n", + "\n", + "$$ \\mathcal{C}(t) = \\frac{k\\mathcal{C}(0)}{\\mathcal{C}(0) + e^{-b_{0}t}(k-\\mathcal{C}(0))} $$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now show that, in the limit that we have a large number of simulations, their overall mean tends to the deterministic result above. First, we perform 5 simulations and plot their dynamics." ] }, { @@ -89,7 +103,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEGCAYAAACQO2mwAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nO3deXyc1X3v8c9Pu2RZNpKMLbxgDMKOjAmL2AJNgSQNGN8QWpYkLRCX1MltepP2kjakN7nl0nSh2ZqVC7fEAdIEgxNqEihN4kAChM02Bsc22MRYtmRrsy3LkqzF0u/+8Twjj5axZmzNotH3/XrppXmeeUZz5vXg+XHO75zfMXdHRERkNDnpboCIiGQuBQkREYlJQUJERGJSkBARkZgUJEREJKa8dDdgPFVWVvr8+fPT3QwRkQll/fr1re4+Y7TnsipIzJ8/n3Xr1qW7GSIiE4qZ1cV6TsNNIiISk4KEiIjEpCAhIiIxKUiIiEhMChIiIhJTSoOEme00s01mttHM1oXnys3s52a2Pfx9UnjezOwbZvaWmb1uZuelsq0iIpKensQV7n6Ou9eGx3cAa929GlgbHgNcDVSHPyuAe1LeUhGRSS4T1klcC1wePn4AeAb4bHj+QQ9qmb9oZtPNrMrd96allSKSdo9ue5QndzyZkvdqbu+htbMnaX//9zce4JItBxN6TefUizg89dxRn+vPb+MT//bX49G0IVIdJBz4mZk5cK+73wfMjPribwRmho9nA7ujXlsfnhsSJMxsBUFPg3nz5iWx6SKTSyq/kGHol3L0F2ie95HLEQAsx7kGKBmwuP5me9mldE6tHfvC0US22onvrRJW1ON0VUB3Yfxv0F1cHbz28PYRz+X2Hx63tkVLdZC4zN0bzOxk4Odm9kb0k+7uYQCJWxho7gOora3VDkoicXj0Z3/Fk3ueHXG+t3+Avv4BALYW9gPwjp5czn+9nyVv9B/zb57QFzIM+VIe8gUa2RjNgi/TXIeeOP+lt00JvlSnd478Uo2HmSUrRkChkVeSS0lpIl/DuzmzciuLT9408qlZS8atadFSGiTcvSH83WxmjwEXAk2RYSQzqwKaw8sbgLlRL58TnhORYxjSAzjUCJ0tAFQ2XURF6znBaVvEKSxiqudQ0uFM6Qq/daO+qN9P8IWc70Cfc6ASyI/9lXmiX8gQ9aU8/At0ygyYOivhv1cCnHnhTBb/3pXH3abJLmVBwsymADnufih8/AfAXcDjwK3AP4e/14QveRz4CzN7GLgIOKh8hEiUdSth02oAHqWDJ60zOG3BkE2tF1JZfzYVBz5Av+UyveMMANpK32LmISjtysGtkKKeLgC6C0vAID83h/zcYXNaiiCvooK8GaPWgAP0hZytUtmTmAk8ZkGXMQ/4gbs/ZWavAI+Y2W1AHXBjeP2TwFLgLaALWJ7CtopkjFg9A7rDpGfRNDqbz6O69XxKBowzgGn9OUwfMA72nAZAW2kO/bQxs/kVFry1mfn1bwKwc85CAHLeexXvv+OWVH4smSDMPXuG8Wtra11VYGUiiSc5vK4p+G+6dmYtvQ2vkXuki24roqr1Ysr3X8gRy2fWodkAFB2uH/H6mb07WJK3g65XXgGg5IILAChbtoyTbrpxxPUy+ZjZ+qhlCUNkwhRYkax2rEAQHQBiOTNnJu/e1857G7Yzt2cvW/xUvjb7a5y+q4n8/kIKelso6tnGzKZ1VM/pHfkHwn/lJRdcoMAgCVOQEEmyJ3c8yZv732Rh+cIRz9WWzGFpRxc37G0ecv6V9dW8dagmOBi4EICN5LAR8Nx8Prj3bdq9jNKOOi7L/w3kQ9knFABk/ClIiCRBdO/hzZZNLOyHlcMCAcDmrVPYdvhqHiuaRnd7HwNdwTTTtinVUBzMFHJy6Lc8CgqLh7y2zNo546IqTv2rB5P/gWTSUpAQGSfRgWFwGMkLWdh9kKWdnVAerBPd3LyEba3vAGDPoWCWd1thDpWddRT3D9BXUETR4XoOlvTy+GVnA3DtObP58EVaLCqppyAhMk6ih5VqvZClBw9wQ9k8KJwJtddDbTBB77k7f0N3VzcdxTnkH9nHzMZXWND9BrNadtF3WjUX/nBVmj+JyFEKEiInIOawUmNzsAJ2+RNsfraBbb9qgl9tAKC7pZvmnAHeqi7mo48+xJz99ZQtroGqsyhbtiydH0dkBAUJkQRFl7SIXrh2af3ZVO87n8fySoEboWcGfGUDe7a3AUenpxYPOGd3bmNF2266D+6haHENpz6kvIJkJgUJkQQ9uedZ3vRuFloRVzW+m+rW85lBLnsOzaUPoHo6+3ftgeZWoJXpPV3MbFpHX27r4N+oKC0ECilatEi9B8loChIiMcRa6RwJECs/uo7HvrKB1iMdMKeUk3NbmNn0Cqdu3Da4cC2yorn//Vdx9R2fSMvnEDkRChIiUWLNUIougXFp8+9Tfej3gwBR30HlnFKuu/08Xv7gTeS/vZ0tM+bROeN0dpx9KX/z7c+l66OIjAsFCZn0Rg0MM2uHzFDafPC9bDv8bpg6iz1vtwXDSifBwLQ8nunu5OF7X+APWzqgtIof3/BZIJi2KjLRKUjIpDdk6urMWpYuWMoNZ94AK6+Bspmw/Am2fWUDrQc7qJwKp1RPD6udzuZfPvlP/N7rzzOlMI9ZHXvpO62aVR+/JN0fSWTcKEjIpDRk6moYIFZetTIov/3894Kfxk1DNnKJDCv94KVd3LVxF2zZxQ2vP8/p7XsoP/ssTWGVrKQgIZNSdO9hYf40lu7dEfQc6p4LLjj1siBALLkegOZD3bR29PLwvS9Q/vST/OHuDZQV5zOrfQ99p1VrCqtkLQUJmTRi9h5WXgONb8OsJTSV17Km/12s7V3KrNYjnLy5Hx5+hqKOftpzB4BCPtC6iTmHmyhboAVwkv0UJGTSGNJ7KF/I0gVLjz4Zro7+1L0vsGVvOzUlcPKBfkoPD9BRnEN3aS6Lzj6Zu29ZQt1zZVClBXAyOShIyKQyVu5hVusRzu4opKajkNb+PioXlHHd7eelscUi6aUgIVkn1iY/kdpKx8o9RHoPECSqz7wwqNx6YNUjtP/0pwB0v/EGRYsWJf+DiGQABQnJOrE2+VnYD0sPHgimtZ56WRAYapez8sFN7Hl4Hzz8DMWd/XRMyR3Re2j/6U8Hg4NKachkoiAhWWlwWCla1LqHH7y0izXrG2D9C8x/vYOT+4O8w+EpuZxydsWof7No0SLlIWTSUZCQSemlX9RxRmMPJYV5lJJL0awibr/zXUOu0RCTiIKEZInRprcCQYJ60+rgcVSC+uQD/ZQO5DCvqgxgMPcQTUNMIgoSMoHFqrk0ZHrrptVHg0NUghqgozhnzJlLGmKSyU5BQiaUmMX4omsuDReugRCRxClIyIQSsxhftBhDTCsf3MSe1/cBUNzZz+EpuSP+vvIQIkMpSEjGi1lOI5YYQ0x7Xt83GBxizWJSHkJkKAUJyXjHLKcRSzjEFD3V9YyeIzAlj//15cuP+VLlIUSOUpCQCWHM3kMMQ6a6DuRQVFow4hoNMYnEpiAhWU1TXUVOjIKEZKSY6x5iiUpWv/bmSWw6fAV1n4ldZmO03oOGmERGykl3A0RGE8lDAPHlISLJamDT4Ss40DsHYMwENaDeg8gxqCchGWvMPERU72Hz9nK29f09FCxh35E2OqbkKEEtMg4UJCRjJDzEFDXVdVvfe2ntmU0lwUrq5pO0BkJkPChISMZIdKrr5uYlbNt/IxQsYW9POwcK4BelPWwp7aGmsmzE9UpQiyROQUIySiJTXbe1voPWrhlUAgcK4LWcXoxCaqrKuPac2aO+RkNMIolJeZAws1xgHdDg7svM7DTgYaACWA/c7O69ZlYIPAicD+wDbnL3naluryRXokNMm59tYNvLTQBBgChp4brbl/LwvS9gFLLq45ckvc0ik0k6Zjd9GtgadXw38DV3PwM4ANwWnr8NOBCe/1p4nWSZRGcxbVv7Gq07GqFxExW5b1Oav4Gb7n2BLXvbR73+wKpHqLv5FupuvmVwNpOIxC+lPQkzmwNcA/wD8D/NzIArgY+ElzwA3AncA1wbPgZYDXzLzMzdPZVtluRLaDV1ZwuVeZ1cV/MEm/ceZHVv0HOINcSkPITIiUn1cNO/An8DTA2PK4A2dz8SHtcDkX/ps4HdAO5+xMwOhte3Rv9BM1sBrACYN29eUhsv6dfbP0AfhdzU+3m29LZTU1U25hCT8hAixy9lQcLMlgHN7r7ezC4fr7/r7vcB9wHU1taql5GFNn//Uba91gXAwcOVFOUFOYljJahFZHyksidxKfABM1sKFAFlwNeB6WaWF/Ym5gAN4fUNwFyg3szygGkECWyZZLa91kVrRwWVpfsoKWimY3rvMXsPWg8hMn5Slrh298+5+xx3nw98CPilu/8x8DQQ2VPyVmBN+Pjx8Jjw+V8qH5EdHt32KMufWs7yp5YPJq3HUlm6j+u+dCs/qanh6VPOPea1KrkhMn4yYZ3EZ4GHzeyLwKvA/eH5+4GHzOwtYD9BYJEsEM+iueghptaOcooLmgdnMdVUjVwoN5zyECLjIy1Bwt2fAZ4JH+8ALhzlmm5glA2LJRuMNaMpeoipuKCZ+sJOQHkIkVTLhJ6EyKgiQ0w33fsCgBbKiaSBgoRkjNFWU8dLyWqR5FCQkJSIp/zGtrWv0doClSUtVOR2UJq/jZvuPTOuPIQWzYkkh4KEpERcFV4TXE09nJLVIuNPQUJSJq7yGwVTYPkT3BVHHkJDTCLJpyAhSRPPEFN0HqKlcwYl+XuPOdU1OjB0vfIKACUXXKAhJpEkUZCQpIlniCk6D1Ge10Fx4ZtATVwF+0ouuICyZcs46aYbU/BpRCYnBQlJqjGHmIblIZ4vvkIF+0QyiIKEpNWIqq4VZUFJ3yjKPYikj4KEpN66lbBpNQC5R5bS44WA9oQQyUQJBwkzmwJ0u3t/Etojk8Gm1dC4CWYtoduK6MidriEmkQw1ZpAwsxyC4np/DFwA9ACFZtYKPAHc6+5vJbWVMiFEz2aCY8xoal7Ctv03QsES9h1po6N4ZDFiDTGJZIZ4SoU/DZwOfA6Y5e5z3f1k4DLgReBuM/uTJLZRJojo/aoh9p7Vv21aSFNHJVv2ttOcM0DzSbkjrlG5b5HMEM9w03vdvW/4SXffD/wI+JGZ5Y97y2RCimfBXF//ACV5e3m6ejFQGHM1tYaYRNJvzCAxPECMlpMYLYiIRIveH6Kr92RKCppV1VVkAhhzuMnMcszsI2b2hJk1A28Ae81si5l9yczOSH4zZaKL7A8BhFuQ9qS5RSISj3iGm54GfkGQk/ituw8AmFk5cAVBTuIxd/9+8popmSqe0hsRw/eH+MSw55WsFsk88SSu3+vufw+0RwIEBDkJd/+Ru/8RsCppLZSMFp2sjlndNU5KVotknkRyEj8Gzot+zswudvcXlZOY3OKq7honJatFMks86yRuJAgOU83sHcCbUT2K+4Czk9g+mcCik9WtHeUUFzQfs8KriGSeeHISzwNFwMeArwILzawN2AMcTmLbJEPFm4eIJKsrS/dRXNBMfWEnEP8mQiKSfvEMNzUAD5rZ79z9eQAzqwDmE8x0kkkmrl3mQsOT1Zr2KjKxxDPcZB54PnLO3fcB+4Zfk6Q2SgYarzyEZjSJZLa4ynKY2f8ws3nRJ82swMyuNLMHgFuT0zzJdprRJJLZ4slJXAX8KfBDMzsNaCPIUeQCPwP+1d1fTV4TZaKI3ooUoLVrBpUlLWO+TjOaRDJXPDmJbuA7wHfCGk2VwGF3b0t242Ri2fZyE631HVTOKQWCLUnPrNya5laJyImIJyfxBWC/u387XA+xN/nNkomqck4p190eLqdZ+YVRr1EeQmTiiGe46UaCfSSGMLOPATPc/Z/GvVWSceKa9nqoETpbBoNDb8NrbM+Zz13D1kZopzmRiSOeINEXDjkN9xCwAVCQmATimvba2QK9nYOH23Pms7o3mPI6fG2E8hAiE0M8QaLXzKrcfcgwk7v3mJnKcUwio017jU5Wt3TOoCT/CDf1fh6ALb1B70FrI0QmrnimwH4FWGNmp0afNLOTAa2NmOQiyWqAkvy9nFT42uBz0b2HA6seoe7mW6i7+ZbBKa8ikvnimd30qJmVAOvN7EVgI0FwuQG4M7nNk4kgkqze/I+fAmDVx78x4hrlIUQmpnhXXD9gZj8GPgicBXQCH3H3V6KuUa8iyySyV0Q8lIcQmXji2nTIzH4ErHH3hyInIyuuCVZbPw18LzlNlHRJpEaTiGQnrbiWYxqzRlPUtNf5fTvYmb8gdY0TkaRL2YprMysCfg0Uhu+72t3/Lgw8DwMVwHrgZnfvNbNC4EHgfIJigje5+85E3lOSI3pGU2sLVOYF01535i/g+eIrWJzOxonIuIpndtMgd+9z973HWZKjB7jS3d8JnANcZWYXA3cDX3P3M4ADwG3h9bcBB8LzXwuvkwwQPaOprLCJ0ilvclPv5/lQ7xdYW6IhKZFsklCQOBFhufGO8DA//HHgSmB1eP4BguQ4wLXhMeHz7zEzS1FzZQyRGU1nVd7P9IKXgZEL5jTtVWTiiycnMW7MLJdgSOkM4NvA74A2dz8SXlIPRL5lZgO7Adz9iJkdJBiSah32N1cAKwDmzRtSzVyOw/HMaCopyB11wZymvYpMfCkNEu7eD5xjZtOBx4ATruzm7vcR7LVNbW2tpuGeoFgzmobkIer2U1nYEFeyWtNeRSa2uINEmEj+I4JtSwdf5+53Jfqm7t5mZk8DlwDTzSwv7E3MARrCyxqAuUC9meUB04jaDU+SZ7QZTdFlwCsLGzgz/xeAktUi2S6RnsQa4CDBcFFPom9kZjMIigW2mVkx8D6CZPTTwPUEM5xuDd8H4PHw+IXw+V9qwV56DZYBj5QAX/4Ed4V7V69gaAlwUBlwkWyQSJCY4+5XncB7VQEPhHmJHOARd/+pmW0BHjazLwKvAveH198PPGRmbwH7gQ+dwHvLOGo61E1rR88xS4CDtiMVyQaJBInfmNkSd990PG/k7q8D545yfgdw4SjnuwnqQ0mGae3ooau3H1AJcJFsl0iQuAz4qJm9TTDcZAQzW89OSssk7YYkq6O2JYXYM5pEJLskEiSuTlorJK1iTXuNTlYXFB6gdN+P2PyPn2Ju7+/YXXB6OpssIikSd5Bw9zozeyfwe+GpZ939tWO9RiaGYxXyiy4DPrf3d+zmdHYXnE5H9XWA9qsWyXaJTIH9NPBnwI/DU983s/vc/ZtJaZmk1JiF/IDdBaez+G+fG3JOC+ZEslsiw023ARe5eyeAmd1NMD1VQWKSU7JaJHslEiQM6I867g/PSRY5VrJaRCafRILESuAlM3ssPP4gR9c0yAQTT7K6ck4pZ144M53NFJE0SyRx/VUz+xVwaXhquTYbmrjiSVazbiVsWg1voQ2FRCaphAr8uft6grIckgUiyerNzzaw7SdNPMaGIUNMTb/5PqUHtrIzfwFdfiqvhjWaNKNJZPIYM0iY2XPufpmZHSLY/2HwKYLFdGVJa52kRKwhptaOHnb5qXy54ksAgyurNaNJZPKIZ/vSy8LfU5PfHEmXwSGmYWKtrNaMJpHJIZF1Ene7+2fHOieZK54NhX7w0i7WbAyqtX+mt5+SgtyUtlFEMksiOYn3AcMDwtWjnJMMFZ2svrR9GdU7zuexzUPzEB2/+X985uAvKCnIZb7V0VH6jjS3WkTSacw9rs3sv5vZJmChmb0e9fM2cFwVYSV9Isnqd3Vehe0rBhiSh7j08NPUWB2Lq6YxZd65zHzXn6SzuSKSZvH0JH4A/CfwT8AdUecPufv+pLRKUiJWHmJn/gIWL38iDS0SkUwTT+L6IMGOdB82s5OAaqAIwMxw918nt4mSCTTtVWRySiRx/THg0wT7UG8ELiao3XRlcpomqfLSo1+hdHuwkD5WGXBNexWZnBJJXH8auAB40d2vMLNFwD8mp1kyXqJnNPVvnkrN/otHJKtLtz82GByiy4APp2mvIpNPIkGi2927zQwzK3T3N8xs5BxKySjRM5pq9l9MWcfJUM6IukyjlQEXEUkkSNSb2XTgP4Cfm9kBoC45zZLxFJnR9NjmDVDOqMnq0SgPISKJFPiLjEHcaWZPA9OAp5LSKskIykOISEIF/iLc/Vfj3RBJsUiFV45d4VV5CJHJLZ7FdIfMrD38fWjYcXsqGilJsGk1NAZrIXfmL+D54ivS3CARyUTxrJNQYb8JJp4ZTU2Humn1edzV+3m29LZTU1HGinQ2WkQyUiLrJP73aOfd/a7xa46Mh3hmNLV29NDVG+xGW1NVNlgGXEQkWiI5ic6ox0XAMmDr+DZHxsuoM5qG7zRXsGDUMuAiIhGJzG76SvSxmX0Z+K9xb5Ecl3jKgA/mIWYtGcxDLB52iaa9iki0MRPXx1BCUKJDMkBkiAkYsWf1ELOWwPInuKviS6wtGXlNZNoroGmvIpJQTmITR7cvzQVmAMpHZJDIEFMsTYe6ae3o4a57X2DL3nZqqkbfeVbTXkUkIpGcRPT/Uh4Bmtz9yDi3R8bB5mcb2PZyE8CQGU1KVotIohIJEk3AnwOXEfQonjWz/+vu3UlpmRy3bS83DQaH4TWaYu1ZLSIymkSCxIPAIeCb4fFHgIeAG8a7UXLiYm0oJCKSiESCxFnuXhN1/LSZbRnvBsk4i6P8hmY0iUgsiQSJDWZ2sbu/CGBmFwHrktMsiUc8K6vjmfaqQn4iEksiQeJ84Ddmtis8nge8GZn15O5nj3vr5Jji3SticNrrvS8AjFp+QzOaRGQ0iQSJq07kjcxsLkFeYyZB4vs+d/+6mZUDq4D5wE7gRnc/YGYGfB1YCnQBH3X3DSfShmw01srqSC9iOA0xiUg84l5M5+51wHTgv4U/0929LvITx584Atwe5jUuBj5pZjXAHcBad68G1obHAFcD1eHPCuCeeNs66UVVeG2aUs19bedxU7g2IkKL5kQkHokspvs08GfAj8NT3zez+9z9m8d42SB33wvsDR8fMrOtwGzgWuDy8LIHgGeAz4bnH3R3B140s+lmVhX+HRlLOMT0qcjCuZKRayM0xCQiY0lkuOk24CJ37wQws7uBFzg6JTZuZjYfOBd4CZgZ9cXfSDAcBUEA2R31svrw3JAgYWYrCIfZ582bl2hTssehRuhsgZVfGDHEVFNVprURInJcEgkSBvRHHfeH5xJiZqXAj4C/dPf2IPUQcHc3M4/54lG4+33AfQC1tbUJvXYiilnIr7MFesNCvbOWwJLrR7xWeQgRSVQiQWIl8JKZPRYefxC4P5E3M7N8ggDx7+4eGbZqigwjmVkV0ByebwDmRr18TnhuUoue0XRp+zKqd5wfTHvtmkFlCbD8iZiv1VRXEUlUIqXCv2pmzxCU5QBY7u6vxvv6cLbS/cBWd/9q1FOPA7cC/xz+XhN1/i/M7GHgIuCg8hGBwRlNX9lA674OmAOVJS2cWTn29h7KQ4hIIsYMEmZWBHwCOAPYBHznOAv7XQrcDGwys43hub8lCA6PmNltQB1wY/jckwTTX98imAK7/DjeM+sNlt9Y+YV0N0VEslA8PYkHgD7gWYJpqe8A/jLRN3L354idw3jPKNc78MlE30fgBy/tYs3GYGTuWCXBRUTGEk+QqHH3JQBmdj/wcnKbJHGLMaNpzcaGweBwc8sGLt+4kbrn7lGyWkQSFs9iur7IA+0fkWGOMaMpMu31pvatTGt4G9CiORFJXDw9iXeaWWSprgHF4bERjAppLCPJYhbyi5rR9IOXdrFmfQOsH7nrnJLVInK8xuxJuHuuu5eFP1PdPS/qsQJECkTvXz1YyI+hM5oiQ0ygXedEZPwksk5C0mjUQn7DZjRpZbWIjDcFiSykldUiMl4UJDJUzPIbx6jRFKGV1SIyXhQkMlTM8hstUJkXzGhqmlLNmrbzWHuvktUikhxx7ychqRfJQ7yr8Rxsbz80bqIybydnnrIrKANe+EW+eTCokqJktYgkg3oSE0FnC5V5nVxXExbvG2U9xIFVj9D+rXuo+5byECIyfhQkMlTlzmoqds9XhVcRSSsFiQxVsXs+xQfLoVwVXkUkfRQkMkj0jKa5Ry6Dafu57varhqyHiC7eV/XsU7y/8TXqnivTEJOIJIUS1xkkemV1SV4x5cUVI66JXln9/sbXmLO/HlBdJhFJDvUkMkjlzmoW7n4fC8sX0drVQWV56ajXRZLVdc+VQVWNhphEJGnUk8ggg3kIoHJaB2ceeQRWXhMsmhMRSQP1JDLM4cE8RCQ4LBlRBlxEJFUUJNJseLK6JK/46JOzlowoA65ktYikkoab0kzJahHJZOpJZIDBMuAvPgkHG48ONUUV71OyWkTSQUEizYasrI4q3qc8hIhkAgWJNBu5snqX8hAikjEUJNIgnpXVkTxETVXZ0TxEVY3yECKSUgoSaRC9V0SsZPX5rz/DR998iZqqMroP7qFosfIQIpJ6mt2UJpFk9cLyRcwonjHi+SVvvsSsll2AZjGJSPqoJ5EGQ5LV9R1UzgnKbxzY2E77lg745S3MatlF44x5nKveg4ikkYJEigzJQ7x9GcWdYbJ6WgdnHnkSVn6BtlcbOXwgnzpvp7PsFHYsvIir09xuEZncFCRSZHgeoniWcd3t5w0pv3HYimiZXsb3bvgsgLYjFZG0U5BIocFFc5s3DJ4LhpgqYFYFPW176Zoxg1UfvySNrRQROUqJ63Q41Bj0HlZeQ9urjXQ29rBlbzu/KzuFTQsvSnfrREQGqSeRIrFWVmuISUQymYJEisRaWV337x8E0BCTiGQkBYkkimdltYhIJlOQSKKXf7mduW8He0QUd06nuDio8Nrb8Brbc+Zz170vcEPPEaYU6jaISGbSt9M4G74eoqJzNvNOO5new69RnbOWzXsP0r31ZNrrnI8W3c2s9j30nVad5laLiIwuZbObzOy7ZtZsZr+NOlduZj83s+3h75PC82Zm3zCzt8zsdTM7L1XtPFHDNxGKrIc4q/J++ot3cFfFl2humkdlVw81VWWUn30W1R/+ozS3WkRkdKmcAvs94Kph5+4A1rp7NbA2PAa4GqgOf1YA96SojeNisC5T/nRmhPitQXgAAAlPSURBVJsIze/bQUlBLqs+fgk1VWWUhQX7Tn3oQU666cZ0N1lEZFQpG25y91+b2fxhp68FLg8fPwA8A3w2PP+guzvwoplNN7Mqd9+bmtYmJnqIKbKqGqC3vYncI11s3nuQ3u2z6G4w6rbeoj0hRGTCSPdiuplRX/yNwMzw8Wxgd9R19eG5EcxshZmtM7N1LS0tyWvpMUQPMS0sX8jSBUsB6OsfoMsLuaviSzQ2zqP04GFAVV1FZOLImMS1u7uZ+XG87j7gPoDa2tqEX388onsOcLT3sPKqlWz+/qNsW9vFYzxAV/dMpnQ18C/P3aM9IURkQkp3T6LJzKoAwt/N4fkGYG7UdXPCcxkhuucAQ3sPv93QQUtHOZ29RyjpamBGY1CnSb0HEZmI0t2TeBy4Ffjn8PeaqPN/YWYPAxcBBzMtHxHpOQCwbiU8/z14/nvkHllKUV4TP6lZzEcfvZvppYWc+tCqNLZUROT4pSxImNkPCZLUlWZWD/wdQXB4xMxuA+qAyDSfJ4GlwFtAF7A8Ve08Hi88sZmGfUvptiI6+mYxUNTNqo9fQt1zZelumojICUnl7KYPx3jqPaNc68Ank9ui4xddrA9gz95gqKmtNIepPW0saNxE3c1rNItJRCa8dA83TRixdpYDmDbwO2Y1vUJ1WTddr7wSnLzgAuUhRGTCU5CIU/TOcnlWRFtRN78p7QHgC1u/Tk7bAJxTS8kFF1C2bJkWyIlIVlCQiFPlzmoW7n4fC8sXsae9ham5u7l+35cBKLYe+meUaHqriGQdBYk4Td15KoWHTmJLTzvz+nYxt/4FSt8INg7qPlhA0Wkzx/gLIiITj4LEMTy4+nH2vNoBQOmh6XQW7ea68gcpfrmJ3rZ8eGctAEWzUO5BRLKSgsQx7Fx3iNJD0zlQsp8jRQ2cMuV5FldNo66wk+IFMzS8JCJZL90rrjNaX/8A+4r2se2MM7iu4kGuqayH5U/ArCUwdVa6myciknTqSQwTPcR0Ulc5h4sbWFXwRQ5s30N7/TTqXlEVVxGZPNSTGGbPqx0Utk0D4HBxA1UlzwPQXj+N7n1B/UCtfxCRyUI9iWF6+53Okv1sm3cGdzz7SQp391H39rl0t7VQtHiR8hAiMqmoJzFMX/8AAwNBj6Fwdx85B/oB9R5EZHJST2KYio4epnb1s+L1P6d7fx9Fs4rVexCRSUtBAvjr/7qXX+/5GQAf63ofBb3B+aJZxZS9791pbJmISHopSABTf7KN2w79AUYO/flVDHgDp/781XQ3S0Qk7ZSTAE45tJCB/NmU4kzrqaembGu6myQikhHUkwAMJ7+3ng9f8ZPgxJLr09sgEZEMoSABWE5T8GD5E+ltiIhIhlGQAP505f9OdxNERDKSchIiIhKTgoSIiMSkICEiIjEpSIiISEwKEiIiEpOChIiIxKQgISIiMSlIiIhITObu6W7DuDGzFqDuOF9eCbSOY3MmAn3myUGfeXI4kc98qrvPGO2JrAoSJ8LM1rl7bbrbkUr6zJODPvPkkKzPrOEmERGJSUFCRERiUpA46r50NyAN9JknB33mySEpn1k5CRERiUk9CRERiUlBQkREYlKQAMzsKjN708zeMrM70t2eZDCzuWb2tJltMbPNZvbp8Hy5mf3czLaHv09Kd1vHk5nlmtmrZvbT8Pg0M3spvNerzKwg3W0cT2Y23cxWm9kbZrbVzC6ZBPf4r8L/pn9rZj80s6Jsu89m9l0zazaz30adG/W+WuAb4Wd/3czOO5H3nvRBwsxygW8DVwM1wIfNrCa9rUqKI8Dt7l4DXAx8MvycdwBr3b0aWBseZ5NPA1ujju8GvubuZwAHgNvS0qrk+TrwlLsvAt5J8Nmz9h6b2WzgU0Ctu58F5AIfIvvu8/eAq4adi3Vfrwaqw58VwD0n8saTPkgAFwJvufsOd+8FHgauTXObxp2773X3DeHjQwRfHrMJPusD4WUPAB9MTwvHn5nNAa4B/i08NuBKYHV4SbZ93mnAu4H7Ady9193byOJ7HMoDis0sDygB9pJl99ndfw3sH3Y61n29FnjQAy8C082s6njfW0Ei+KLcHXVcH57LWmY2HzgXeAmY6e57w6cagZlpalYy/CvwN8BAeFwBtLn7kfA42+71aUALsDIcYvs3M5tCFt9jd28AvgzsIggOB4H1ZPd9joh1X8f1O01BYpIxs1LgR8Bfunt79HMezIfOijnRZrYMaHb39eluSwrlAecB97j7uUAnw4aWsukeA4Tj8NcSBMhTgCmMHJbJesm8rwoS0ADMjTqeE57LOmaWTxAg/t3dfxyebop0RcPfzelq3zi7FPiAme0kGEK8kmC8fno4LAHZd6/rgXp3fyk8Xk0QNLL1HgO8F3jb3VvcvQ/4McG9z+b7HBHrvo7rd5qCBLwCVIezIQoIkl6Pp7lN4y4cj78f2OruX4166nHg1vDxrcCaVLctGdz9c+4+x93nE9zTX7r7HwNPA9eHl2XN5wVw90Zgt5ktDE+9B9hClt7j0C7gYjMrCf8bj3zmrL3PUWLd18eBW8JZThcDB6OGpRKmFdeAmS0lGL/OBb7r7v+Q5iaNOzO7DHgW2MTRMfq/JchLPALMIyizfqO7D0+QTWhmdjnwGXdfZmYLCHoW5cCrwJ+4e0862zeezOwcgkR9AbADWE7wP4NZe4/N7P8ANxHM4HsV+BjBGHzW3Gcz+yFwOUE58Cbg74D/YJT7GgbLbxEMu3UBy9193XG/t4KEiIjEouEmERGJSUFCRERiUpAQEZGYFCRERCQmBQkREYlJQULkOJhZhZltDH8azawhfNxhZt9Jd/tExoumwIqcIDO7E+hw9y+nuy0i4009CZFxZGaXR+1dcaeZPWBmz5pZnZn9oZn9i5ltMrOnwjIpmNn5ZvYrM1tvZv91IhU7RcabgoRIcp1OUDfqA8D3gafdfQlwGLgmDBTfBK539/OB7wJZt+JfJq68sS8RkRPwn+7eZ2abCMq+PBWe3wTMBxYCZwE/D6opkEtQ8lokIyhIiCRXD4C7D5hZnx9NAg4Q/PszYLO7X5KuBooci4abRNLrTWCGmV0CQTl3M1uc5jaJDFKQEEmjcMvc64G7zew1YCPwrvS2SuQoTYEVEZGY1JMQEZGYFCRERCQmBQkREYlJQUJERGJSkBARkZgUJEREJCYFCRERien/A69NvQsa/9oTAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] @@ -101,18 +115,10 @@ } ], "source": [ - "def simulate_n(n):\n", - " values = np.zeros(len(times))\n", - " for i in range(n):\n", - " values += model.simulate(params,times) / n\n", - " plt.plot(times, values, label=r'$n=%s$' % n)\n", - " \n", "for i in range(5):\n", " values = model.simulate(params, times)\n", " plt.step(times, values)\n", "\n", - "simulate_n(1000)\n", - "plt.title('Stochastic logistic growth across different iterations')\n", "plt.xlabel('Time')\n", "plt.ylabel(r'Population ($C(t)$)')\n", "plt.show()" @@ -122,7 +128,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "By running the model 1000 times and averaging the results we can see that indeed we converge on the deterministic mean:" + "Now, we perform 1000 simulations and calculate their mean at each time point. We then plot this empirical mean and the theoretical mean and show that they coincide." ] }, { @@ -132,7 +138,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -144,6 +150,12 @@ } ], "source": [ + "def simulate_n(n):\n", + " values = np.zeros(len(times))\n", + " for i in range(n):\n", + " values += model.simulate(params,times).reshape(-1) / n\n", + " plt.plot(times, values, label=r'$n=%s$' % n)\n", + "\n", "simulate_n(1000)\n", "plt.plot(times, model.mean(params, times), '--', label=\"Deterministic mean\")\n", "plt.legend()\n", @@ -169,7 +181,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.7.7" } }, "nbformat": 4, diff --git a/examples/toy/model-stochastic-production-degradation.ipynb b/examples/toy/model-stochastic-production-degradation.ipynb new file mode 100644 index 0000000000..9f54b2a331 --- /dev/null +++ b/examples/toy/model-stochastic-production-degradation.ipynb @@ -0,0 +1,148 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stochastic production and degradation model\n", + "\n", + "This example introduces the stochastic production and degradation model.\n", + "This model describes two stochastic chemical reactions: one, which increases the concentration of a substance by a unit; and, another, which decreases it by the same amount. Given an initial concentration of the substance, $n_0$, the substance degrades with rate $k_1$ while its concentration increases at rate $k_2$ following a rate constant, $k$, according to the following model ([Erban et al., 2007](https://arxiv.org/abs/0704.1908)):\n", + " $$A \\xrightarrow{k_1} \\emptyset$$\n", + " $$\\emptyset \\xrightarrow{k_2} A$$\n", + "\n", + "The model is simulated according to the Gillespie stochastic simulation algorithm [(Gillespie, 1976)](https://doi.org/10.1016/0021-9991%2876%2990041-3), which allows exact simulation of stochastic processes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We choose the initial count of species $A$ size to be zero and set $k_1=0.1$ and $k_2=1$. We then perform a single simulation of this stochastic model." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pints\n", + "import pints.toy as toy\n", + "import pints.toy.stochastic\n", + "\n", + "n_0 = 0\n", + "model = toy.stochastic.ProductionDegradationModel(n_0)\n", + "\n", + "# set parameters\n", + "k_1 = 0.1\n", + "k_2 = 1.0\n", + "k = [k_1, k_2]\n", + "\n", + "# perform a simulation\n", + "times = np.linspace(0, 100, 100)\n", + "values = model.simulate(k, times)\n", + "\n", + "# plot the result\n", + "plt.step(times, values)\n", + "plt.xlabel('time')\n", + "plt.ylabel('concentration (A(t))')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given the stochastic nature of this model, every iteration will likely return a different result. However, we can compute the expected value of this process $M(t)$. This function is described by the solution of the following Ordinary Differential Equation (ODE; [Erban et al., 2007](https://arxiv.org/abs/0704.1908)):\n", + "\n", + "$ \\frac{\\text{d}M}{\\text{d}t} = -k_1 M + k_2 $.\n", + "\n", + "We plot the ODE solution and compare it to 500 stochastic simulations, indicating the correspondence between the two processes." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# ode right-hand side\n", + "def pend(y, t):\n", + " dydt = [-k[0] * y[0] + k[1]]\n", + " return dydt\n", + "\n", + "x_0 = [0]\n", + "times = np.linspace(0, 100, 100)\n", + "\n", + "# solve ODE\n", + "from scipy.integrate import odeint\n", + "sol = odeint(pend, x_0, times)\n", + "\n", + "# perform 10 simulations of the stochastic process\n", + "for i in range(500):\n", + " values = model.simulate(k, times)\n", + " plt.step(times, values, color='blue', alpha=0.01)\n", + "\n", + "# plot ODE overlaid\n", + "plt.xlabel('time')\n", + "plt.ylabel('concentration (A(t))')\n", + "plt.plot(times, sol,'--', color='black', label='ode solution')\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "62b8c3045b77e73a8aab814fbf01ae024ab075fc3f7014742f3a4c5a8ac43e7b" + }, + "kernelspec": { + "display_name": "Python 3", + "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.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/toy/model-stochastic-schlogl.ipynb b/examples/toy/model-stochastic-schlogl.ipynb new file mode 100644 index 0000000000..92b2a592da --- /dev/null +++ b/examples/toy/model-stochastic-schlogl.ipynb @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Schlogl's model\n", + "\n", + "This example introduces Schlogl's model of a system of chemical reactions ([Schlogl, 1972](https://link.springer.com/content/pdf/10.1007/BF01379769.pdf)).\n", + "This model describes the stochastic process made of four chemical reactions that take place on a single molecule type, $A$.\n", + "\n", + "\n", + "Given an initial concentration of the substance, $n_0$, the process can be described by the following equations:\n", + "\n", + " $$2A \\xrightarrow{k_1} 3A$$\n", + " $$3A \\xrightarrow{k_2} 2A$$\n", + " $$\\emptyset \\xrightarrow{k_3} A$$\n", + " $$A \\xrightarrow{k_4} \\emptyset$$\n", + "\n", + "In PINTS, this model is simulated according to the Gillespie stochastic simulation algorithm [(Gillespie, 1976)](https://doi.org/10.1016/0021-9991%2876%2990041-3)." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pints\n", + "import pints.toy as toy\n", + "import pints.toy.stochastic" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We specify the initial population size, and here we use the default parameters given in the PINTS implementation, which are taken from [Erban et al., 2007](https://arxiv.org/abs/0704.1908)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "k = [1.80e-01 2.50e-04 2.20e+03 3.75e+01]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# instantiate model\n", + "n_0 = 0\n", + "model = toy.stochastic.SchloglModel(n_0)\n", + "\n", + "# get default parameters\n", + "k = model.suggested_parameters()\n", + "print(\"k = \", k)\n", + "\n", + "# simulate model\n", + "times = np.linspace(0, 100, 1000)\n", + "values = model.simulate(k, times)\n", + "\n", + "# plot\n", + "plt.step(times, values)\n", + "plt.xlabel('time')\n", + "plt.ylabel('concentration (A(t))')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Given the stochastic nature of this model, every iteration returns a different result. However, we can compute deterministically the solution to the equivalent ordinary differential equation ([Erban et al., 2007](https://arxiv.org/abs/0704.1908)):\n", + "\n", + "$ \\frac{\\text{d}a}{\\text{d}t} = -k_2 a^3 + k_1 a^2 - k_4 a + k_3 $.\n", + "\n", + "We then plot the ODE solution and compare it to the stochastic simulation. A key feature of this system is the random switching that is seen in the stochastic simulations, which is not captured by the ODE solution." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# solve ODE\n", + "def rhs(y, t):\n", + " dydt = [-k[1] * (y[0] ** 3) + k[0] * (y[0] ** 2) - k[3] * y[0] + k[2]]\n", + " return dydt\n", + "\n", + "x_0 = [0]\n", + "times = np.linspace(0, 100, 1000)\n", + "\n", + "from scipy.integrate import odeint\n", + "sol = odeint(rhs, x_0, times)\n", + "\n", + "# plot\n", + "plt.xlabel('time')\n", + "plt.ylabel('concentration (A(t))')\n", + "plt.plot(times, values, label='stochastic simulation')\n", + "plt.plot(times, sol,'--', color='black', label='ode solution')\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "62b8c3045b77e73a8aab814fbf01ae024ab075fc3f7014742f3a4c5a8ac43e7b" + }, + "kernelspec": { + "display_name": "Python 3", + "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.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pints/tests/test_toy_markov_jump_model.py b/pints/tests/test_toy_markov_jump_model.py index 905c9c418f..ee53bdb3c7 100644 --- a/pints/tests/test_toy_markov_jump_model.py +++ b/pints/tests/test_toy_markov_jump_model.py @@ -61,16 +61,13 @@ def test_simulate(self): def test_errors(self): model = DegradationModel(20) - # parameters, times cannot be negative - times = np.linspace(0, 100, 101) - parameters = [-0.1] - self.assertRaises(ValueError, model.simulate, parameters, times) - + # times cannot be negative times_2 = np.linspace(-10, 10, 21) parameters_2 = [0.1] self.assertRaises(ValueError, model.simulate, parameters_2, times_2) # this model should have 1 parameter + times = np.linspace(0, 100, 101) parameters_3 = [0.1, 1] self.assertRaises(ValueError, model.simulate, parameters_3, times) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 67fc040257..8f1172358f 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -10,6 +10,7 @@ import numpy as np import pints import pints.toy +import pints.toy.stochastic class TestStochasticLogisticModel(unittest.TestCase): @@ -22,7 +23,7 @@ def test_start_with_zero(self): # Set seed for random generator np.random.seed(1) - model = pints.toy.StochasticLogisticModel(0) + model = pints.toy.stochastic.LogisticModel(0) times = [0, 1, 2, 100, 1000] parameters = [0.1, 50] values = model.simulate(parameters, times) @@ -35,7 +36,7 @@ def test_start_with_one(self): # Set seed for random generator np.random.seed(1) - model = pints.toy.StochasticLogisticModel(1) + model = pints.toy.stochastic.LogisticModel(1) times = [0, 1, 2, 100, 1000] parameters = [0.1, 50] values = model.simulate(parameters, times) @@ -46,7 +47,7 @@ def test_start_with_one(self): def test_suggested(self): # Check suggested values - model = pints.toy.StochasticLogisticModel(1) + model = pints.toy.stochastic.LogisticModel(1) times = model.suggested_times() parameters = model.suggested_parameters() self.assertTrue(len(times) == 101) @@ -55,34 +56,32 @@ def test_suggested(self): def test_simulate(self): # Check each step in the simulation process np.random.seed(1) - model = pints.toy.StochasticLogisticModel(1) + model = pints.toy.stochastic.LogisticModel(1) times = np.linspace(0, 100, 101) - params = [0.1, 50] - time, raw_values = model._simulate_raw([0.1, 50]) - values = model._interpolate_values(time, raw_values, times, params) + time, raw_values = model.simulate_raw([0.1, 50], 100) + values = model.interpolate_mol_counts(time, raw_values, times) self.assertTrue(len(time), len(raw_values)) # Test output of Gillespie algorithm - self.assertTrue(np.all(raw_values == np.array(range(1, 51)))) + raw_values = np.concatenate(raw_values) + self.assertTrue(np.all(raw_values == np.array(range(1, 28)))) # Check simulate function returns expected values self.assertTrue(np.all(values[np.where(times < time[1])] == 1)) # Check interpolation function works as expected temp_time = np.array([np.random.uniform(time[0], time[1])]) - self.assertTrue(model._interpolate_values(time, raw_values, temp_time, - params)[0] == 1) + self.assertTrue(model.interpolate_mol_counts(time, raw_values, + temp_time)[0] == 1) temp_time = np.array([np.random.uniform(time[1], time[2])]) - self.assertTrue(model._interpolate_values(time, raw_values, temp_time, - params)[0] == 2) + self.assertTrue(model.interpolate_mol_counts(time, raw_values, + temp_time)[0] == 2) # Check parameters, times cannot be negative parameters_0 = [-0.1, 50] - self.assertRaises(ValueError, model.simulate, parameters_0, times) self.assertRaises(ValueError, model.mean, parameters_0, times) parameters_1 = [0.1, -50] - self.assertRaises(ValueError, model.simulate, parameters_1, times) self.assertRaises(ValueError, model.mean, parameters_1, times) times_2 = np.linspace(-10, 10, 21) @@ -96,21 +95,15 @@ def test_simulate(self): self.assertRaises(ValueError, model.mean, parameters_3, times) # Check initial value cannot be negative - self.assertRaises(ValueError, pints.toy.StochasticLogisticModel, -1) + self.assertRaises(ValueError, pints.toy.stochastic.LogisticModel, -1) - def test_mean_variance(self): + def test_mean(self): # Check the mean is what we expected - model = pints.toy.StochasticLogisticModel(1) + model = pints.toy.stochastic.LogisticModel(1) v_mean = model.mean([1, 10], [5, 10]) self.assertEqual(v_mean[0], 10 / (1 + 9 * np.exp(-5))) self.assertEqual(v_mean[1], 10 / (1 + 9 * np.exp(-10))) - # Check model variance is not implemented - times = np.linspace(0, 100, 101) - parameters = [0.1, 50] - self.assertRaises(NotImplementedError, model.variance, - parameters, times) - if __name__ == '__main__': unittest.main() diff --git a/pints/tests/test_toy_stochastic_michaelis_menten_model.py b/pints/tests/test_toy_stochastic_michaelis_menten_model.py index 35a6e6493e..4b1453699d 100644 --- a/pints/tests/test_toy_stochastic_michaelis_menten_model.py +++ b/pints/tests/test_toy_stochastic_michaelis_menten_model.py @@ -37,6 +37,11 @@ def test_propensities(self): model._propensities(x_0, k), np.array([200.0, 4000.0, 4000.0]))) + def test_n_outputs(self): + x_0 = [1e4, 2e3, 2e4, 0] + model = MichaelisMentenModel(x_0) + self.assertEqual(model.n_outputs(), 4) + if __name__ == '__main__': unittest.main() diff --git a/pints/tests/test_toy_stochastic_production_degradation_model.py b/pints/tests/test_toy_stochastic_production_degradation_model.py new file mode 100644 index 0000000000..9e7fae2858 --- /dev/null +++ b/pints/tests/test_toy_stochastic_production_degradation_model.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# +# Tests if the production and degradation (toy) model works. +# +# This file is part of PINTS (https://github.com/pints-team/pints/) which is +# released under the BSD 3-clause license. See accompanying LICENSE.md for +# copyright notice and full license details. +# +import unittest +import numpy as np +from pints.toy.stochastic import ProductionDegradationModel + + +class TestProductionDegradationModel(unittest.TestCase): + """ + Tests if the degradation (toy) model works. + """ + def test_n_parameters(self): + x_0 = 20 + model = ProductionDegradationModel(x_0) + self.assertEqual(model.n_parameters(), 2) + + def test_simulation_length(self): + x_0 = 20 + model = ProductionDegradationModel(x_0) + times = np.linspace(0, 1, 100) + k = [0.1, 0.2] + values = model.simulate(k, times) + self.assertEqual(len(values), 100) + + def test_propensities(self): + x_0 = 20 + k = [0.1, 0.2] + model = ProductionDegradationModel(x_0) + self.assertTrue( + np.allclose( + model._propensities([x_0], k), + np.array([2.0, 0.2]))) + + def test_suggested(self): + model = ProductionDegradationModel(20) + times = model.suggested_times() + parameters = model.suggested_parameters() + self.assertTrue(len(times) == 101) + self.assertTrue(np.all(parameters > 0)) + + +if __name__ == '__main__': + unittest.main() diff --git a/pints/tests/test_toy_stochastic_schlogl_model.py b/pints/tests/test_toy_stochastic_schlogl_model.py new file mode 100644 index 0000000000..eaf29d5594 --- /dev/null +++ b/pints/tests/test_toy_stochastic_schlogl_model.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# +# Tests if the Schlogl (toy) model works. +# +# This file is part of PINTS (https://github.com/pints-team/pints/) which is +# released under the BSD 3-clause license. See accompanying LICENSE.md for +# copyright notice and full license details. +# +import unittest +import numpy as np +from pints.toy.stochastic import SchloglModel + + +class TestSchloglModel(unittest.TestCase): + """ + Tests if the degradation (toy) model works. + """ + def test_n_parameters(self): + x_0 = 20 + model = SchloglModel(x_0) + self.assertEqual(model.n_parameters(), 4) + + def test_simulation_length(self): + x_0 = 20 + model = SchloglModel(x_0) + times = np.linspace(0, 1, 100) + k = [0.1, 0.2, 0.3, 0.4] + values = model.simulate(k, times) + self.assertEqual(len(values), 100) + + def test_propensities(self): + x_0 = 20 + model = SchloglModel(x_0) + k = model.suggested_parameters() + self.assertTrue( + np.allclose( + model._propensities([x_0], k), + np.array([68.4, 1.71, 2200.0, 750.0]))) + + def test_suggested(self): + model = SchloglModel(20) + times = model.suggested_times() + parameters = model.suggested_parameters() + self.assertTrue(len(times) == 101) + self.assertTrue(np.all(parameters > 0)) + + +if __name__ == '__main__': + unittest.main() diff --git a/pints/toy/__init__.py b/pints/toy/__init__.py index 7fc8b1d376..b8aee2d88c 100644 --- a/pints/toy/__init__.py +++ b/pints/toy/__init__.py @@ -32,4 +32,3 @@ from ._simple_egg_box import SimpleEggBoxLogPDF from ._sir_model import SIRModel from ._twisted_gaussian_banana import TwistedGaussianLogPDF -from ._stochastic_logistic_model import StochasticLogisticModel diff --git a/pints/toy/stochastic/__init__.py b/pints/toy/stochastic/__init__.py index a429108900..48ffa809b2 100644 --- a/pints/toy/stochastic/__init__.py +++ b/pints/toy/stochastic/__init__.py @@ -9,3 +9,6 @@ from ._markov_jump_model import MarkovJumpModel # noqa from ._michaelis_menten_model import MichaelisMentenModel # noqa from ._degradation_model import DegradationModel # noqa +from ._logistic_model import LogisticModel # noqa +from ._production_degradation_model import ProductionDegradationModel # noqa +from ._schlogl_model import SchloglModel # noqa \ No newline at end of file diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/stochastic/_logistic_model.py similarity index 50% rename from pints/toy/_stochastic_logistic_model.py rename to pints/toy/stochastic/_logistic_model.py index 89734d917a..10df3eda81 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/stochastic/_logistic_model.py @@ -1,18 +1,16 @@ # -# Stochastic logistic model. +# Stochastic logistic toy model. # # This file is part of PINTS (https://github.com/pints-team/pints/) which is # released under the BSD 3-clause license. See accompanying LICENSE.md for # copyright notice and full license details. # -import numpy as np -from scipy.interpolate import interp1d -import pints +from . import MarkovJumpModel -from . import ToyModel +import numpy as np -class StochasticLogisticModel(pints.ForwardModel, ToyModel): +class LogisticModel(MarkovJumpModel): r""" This model describes the growth of a population of individuals, where the birth rate per capita, initially :math:`b_0`, decreases to :math:`0` as the @@ -46,77 +44,24 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): of reaction-diffusion processes. arXiv. https://arxiv.org/abs/0704.1908v2 """ - def __init__(self, initial_molecule_count=50): - super(StochasticLogisticModel, self).__init__() - self._n0 = float(initial_molecule_count) - if self._n0 < 0: - raise ValueError('Initial molecule count cannot be negative.') + V = [[1]] + init_list = [initial_molecule_count] + super(LogisticModel, self).__init__(init_list, + V, self._propensities) def n_parameters(self): - """ See :meth:`pints.ForwardModel.n_parameters()`. """ - return 2 - - def _simulate_raw(self, parameters): """ - Returns tuple (raw times, population sizes) when reactions occur. + Default value must be overwritten because the number of parameters + does not correspond with the number of equations. """ - parameters = np.asarray(parameters) - if len(parameters) != self.n_parameters(): - raise ValueError('This model should have only 2 parameters.') - b = parameters[0] - k = parameters[1] - if b <= 0: - raise ValueError('Rate constant must be positive.') - - # Initial time and count - t = 0 - a = self._n0 - - # Run stochastic logistic birth-only algorithm, calculating time until - # next reaction and increasing population count by 1 at that time - mol_count = [a] - time = [t] - while a < k: - r = np.random.uniform(0, 1) - t += np.log(1 / r) / (a * b * (1 - a / k)) - a = a + 1 - time.append(t) - mol_count.append(a) - return time, mol_count - - def _interpolate_values(self, time, pop_size, output_times, parameters): - """ - Takes raw times and population size values as inputs and outputs - interpolated values at output_times. - """ - # Interpolate as step function, increasing pop_size by 1 at each - # event time point - interp_func = interp1d(time, pop_size, kind='previous') - - # Compute population size values at given time points using f1 - # at any time beyond the last event, pop_size = k - values = interp_func(output_times[np.where(output_times <= time[-1])]) - zero_vector = np.full( - len(output_times[np.where(output_times > time[-1])]), - parameters[1]) - values = np.concatenate((values, zero_vector)) - return values - - def simulate(self, parameters, times): - """ See :meth:`pints.ForwardModel.simulate()`. """ - times = np.asarray(times) - if np.any(times < 0): - raise ValueError('Negative times are not allowed.') - if self._n0 == 0: - return np.zeros(times.shape) - - # run Gillespie - time, pop_size = self._simulate_raw(parameters) + return 2 - # interpolate - values = self._interpolate_values(time, pop_size, times, parameters) - return values + @staticmethod + def _propensities(xs, ks): + return [ + ks[0] * (1 - xs[0] / ks[1]) * xs[0], + ] def mean(self, parameters, times): r""" @@ -142,16 +87,9 @@ def mean(self, parameters, times): times = np.asarray(times) if np.any(times < 0): raise ValueError('Negative times are not allowed.') - c0 = self._n0 + c0 = self._x0 return (c0 * k) / (c0 + np.exp(-b * times) * (k - c0)) - def variance(self, parameters, times): - r""" - Returns the deterministic variance of infinitely many stochastic - simulations. - """ - raise NotImplementedError - def suggested_parameters(self): """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ return np.array([0.1, 500]) diff --git a/pints/toy/stochastic/_markov_jump_model.py b/pints/toy/stochastic/_markov_jump_model.py index 4cd8a032b1..27098480bc 100644 --- a/pints/toy/stochastic/_markov_jump_model.py +++ b/pints/toy/stochastic/_markov_jump_model.py @@ -8,7 +8,6 @@ import numpy as np from scipy.interpolate import interp1d import pints -import random from .. import ToyModel @@ -112,7 +111,7 @@ def simulate_raw(self, rates, max_time): mol_count = [np.array(x)] time = [t] while prop_sum > 0 and t <= max_time: - r_1, r_2 = random.random(), random.random() + r_1, r_2 = np.random.uniform(0, 1), np.random.uniform(0, 1) t += -np.log(r_1) / (prop_sum) s = 0 r = 0 @@ -149,11 +148,12 @@ def simulate(self, parameters, times): times = np.asarray(times) if np.any(times < 0): raise ValueError('Negative times are not allowed.') - if np.all(self._x0 == 0): - return np.zeros(times.shape) # Run Gillespie time, mol_count = self.simulate_raw(parameters, max(times)) # Interpolate + if len(time) < 2: + time = np.append(time, time[0]) + mol_count = np.append(mol_count, mol_count[0]) values = self.interpolate_mol_counts(np.asarray(time), np.asarray(mol_count), times) return values diff --git a/pints/toy/stochastic/_michaelis_menten_model.py b/pints/toy/stochastic/_michaelis_menten_model.py index 644f9cc550..bac2934f44 100644 --- a/pints/toy/stochastic/_michaelis_menten_model.py +++ b/pints/toy/stochastic/_michaelis_menten_model.py @@ -42,3 +42,6 @@ def _propensities(xs, ks): xs[2] * ks[1], xs[2] * ks[2] ] + + def n_outputs(self): + return 4 diff --git a/pints/toy/stochastic/_production_degradation_model.py b/pints/toy/stochastic/_production_degradation_model.py new file mode 100644 index 0000000000..3d4a066ede --- /dev/null +++ b/pints/toy/stochastic/_production_degradation_model.py @@ -0,0 +1,49 @@ +# +# Stochastic production and degradation toy model. +# +# This file is part of PINTS (https://github.com/pints-team/pints/) which is +# released under the BSD 3-clause license. See accompanying LICENSE.md for +# copyright notice and full license details. +# +from . import MarkovJumpModel + +import numpy as np + + +class ProductionDegradationModel(MarkovJumpModel): + r""" + Stochastic production and degradation model of two separate chemical + reactions reaction starting from an initial molecule count :math:`A(0)` + and degrading to 0 with a fixed rate. + :math:`k`: + + .. math:: + A \xrightarrow{k1} 0, 0 \xrightarrow{k2} A + + Extends :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. + + Parameters + ---------- + initial_molecule_count + The initial molecule count :math:`A(0)`. + """ + def __init__(self, initial_molecule_count=20): + V = [[-1], [1]] + init_list = [initial_molecule_count] + super(ProductionDegradationModel, self).__init__(init_list, + V, self._propensities) + + @staticmethod + def _propensities(xs, ks): + return [ + xs[0] * ks[0], + ks[1] + ] + + def suggested_parameters(self): + """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ + return np.array([0.1, 0.2]) + + def suggested_times(self): + """ See "meth:`pints.toy.ToyModel.suggested_times()`.""" + return np.linspace(0, 100, 101) diff --git a/pints/toy/stochastic/_schlogl_model.py b/pints/toy/stochastic/_schlogl_model.py new file mode 100644 index 0000000000..2534905e1a --- /dev/null +++ b/pints/toy/stochastic/_schlogl_model.py @@ -0,0 +1,54 @@ +# +# Schlogl's stochastic toy model. +# +# This file is part of PINTS (https://github.com/pints-team/pints/) which is +# released under the BSD 3-clause license. See accompanying LICENSE.md for +# copyright notice and full license details. +# +from . import MarkovJumpModel + +import numpy as np + + +class SchloglModel(MarkovJumpModel): + r""" + Schlogl's system of chemical reactions has a single type of molecules and + starts with an initial count :math:`A(0)`. The evolution of the molecule + count is defined through the rates :math:`k_1`, :math:`k_2`, :math:`k_3` + and :math:`k_4` and the following equations: + + ..math:: + 2A \xrightarrow{k_1} 3A + 3A \xrightarrow{k_2} 2A + 0 \xrightarrow{k_3} A + A \xrightarrow{k_4} 0 + + Extends :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. + + Parameters + ---------- + initial_molecule_count + The initial molecule count :math:`A(0)`. + """ + def __init__(self, initial_molecule_count=20): + V = [[1], [-1], [1], [-1]] + init_list = [initial_molecule_count] + super(SchloglModel, self).__init__(init_list, + V, self._propensities) + + @staticmethod + def _propensities(xs, ks): + return [ + xs[0] * (xs[0] - 1) * ks[0], + xs[0] * (xs[0] - 1) * (xs[0] - 2) * ks[1], + ks[2], + xs[0] * ks[3] + ] + + def suggested_parameters(self): + """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ + return np.array([0.18, 0.00025, 2200, 37.5]) + + def suggested_times(self): + """ See "meth:`pints.toy.ToyModel.suggested_times()`.""" + return np.linspace(0, 100, 101)