From cdbecdb5cb568117fa12c0663d4f984bb5b37071 Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Tue, 3 Dec 2019 14:19:07 +0000 Subject: [PATCH 01/30] initial commit of stochastic logistic toy model using spacially implicity birth-only growth --- ...toy-model-stochastic-logistic-growth.ipynb | 192 ++++++++++++++++++ .../test_toy_stochastic_logistic_model.py | 105 ++++++++++ pints/toy/__init__.py | 1 + pints/toy/_stochastic_logistic_model.py | 131 ++++++++++++ 4 files changed, 429 insertions(+) create mode 100644 examples/toy-model-stochastic-logistic-growth.ipynb create mode 100755 pints/tests/test_toy_stochastic_logistic_model.py create mode 100644 pints/toy/_stochastic_logistic_model.py diff --git a/examples/toy-model-stochastic-logistic-growth.ipynb b/examples/toy-model-stochastic-logistic-growth.ipynb new file mode 100644 index 000000000..8d1678aac --- /dev/null +++ b/examples/toy-model-stochastic-logistic-growth.ipynb @@ -0,0 +1,192 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stochastic Logistic Growth model\n", + "\n", + "This example shows how the stochastic logistic growth model can be used.\n", + "This model describes the growth of a population of individuals, where the birth rate per capita, initially $b_0$, decreases to 0 as the population size, $\\mathcal{C}(t)$, approaches a carrying capacity, $k$.\n", + "\n", + "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):\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)\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", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import pints\n", + "import pints.toy\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import math" + ] + }, + { + "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$" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "n_0 = 1\n", + "model = pints.toy.StochasticLogisticModel(n_0)\n", + "\n", + "times = np.linspace(0, 100, 101)\n", + "\n", + "# $b_0$ = 0.1, $k$ = 50\n", + "params = [0.1, 50]\n", + "\n", + "values = model.simulate(params, times)\n", + "\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, 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" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "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=f'n={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('population (C(t))')\n", + "plt.show()" + ] + }, + { + "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:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "simulate_n(1000)\n", + "plt.plot(times, model.mean(params, times), label=\"deterministic mean\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "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.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py new file mode 100755 index 000000000..fe212239e --- /dev/null +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 +# +# Tests if the stochastic degradation (toy) model works. +# +# This file is part of PINTS. +# Copyright (c) 2017-2019, University of Oxford. +# For licensing information, see the LICENSE file distributed with the PINTS +# software package. +# +import unittest +import numpy as np +import pints +import pints.toy +from pints.toy import StochasticLogisticModel + + +class TestStochasticLogistic(unittest.TestCase): + """ + Tests if the stochastic degradation (toy) model works. + """ + def test_start_with_zero(self): + # Test the special case where the initial population count is zero + model = StochasticLogisticModel(0) + times = [0, 1, 2, 100, 1000] + parameters = [0.1, 50] + values = model.simulate(parameters, times) + self.assertEqual(len(values), len(times)) + self.assertTrue(np.all(values == np.zeros(5))) + + def test_start_with_one(self): + # Run small simulation + model = pints.toy.StochasticLogisticModel(1) + times = [0, 1, 2, 100, 1000] + parameters = [0.1, 50] + values = model.simulate(parameters, times) + self.assertEqual(len(values), len(times)) + self.assertEqual(values[0], 1) + self.assertEqual(values[-1], 50) + self.assertTrue(np.all(values[1:] >= values[:-1])) + + def test_suggested(self): + model = pints.toy.StochasticLogisticModel(1) + times = model.suggested_times() + parameters = model.suggested_parameters() + self.assertTrue(len(times) == 101) + self.assertTrue(np.all(parameters > 0)) + + def test_simulate(self): + times = np.linspace(0, 100, 101) + model = StochasticLogisticModel(1) + params = [0.1, 50] + time, mol_count = model.simulate_raw([0.1, 50]) + values = model.interpolate_mol_counts(time, mol_count, times, params) + self.assertTrue(len(time), len(mol_count)) + + # Test output of Gillespie algorithm + self.assertTrue(np.all(mol_count == + np.array(range(1, 51)))) + + # 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_mol_counts(time, mol_count, + temp_time, params)[0] == 1) + temp_time = np.array([np.random.uniform(time[1], time[2])]) + self.assertTrue(model.interpolate_mol_counts(time, mol_count, + temp_time, params)[0] == 2) + + def test_mean_variance(self): + # test mean + model = pints.toy.StochasticLogisticModel(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))) + + def test_errors(self): + model = pints.toy.StochasticLogisticModel(1) + # parameters, times cannot be negative + times = np.linspace(0, 100, 101) + parameters = [-0.1, 50] + self.assertRaises(ValueError, model.simulate, parameters, times) + self.assertRaises(ValueError, model.mean, parameters, times) + + parameters = [0.1, -50] + self.assertRaises(ValueError, model.simulate, parameters, times) + self.assertRaises(ValueError, model.mean, parameters, times) + + times_2 = np.linspace(-10, 10, 21) + parameters_2 = [0.1, 50] + self.assertRaises(ValueError, model.simulate, parameters_2, times_2) + self.assertRaises(ValueError, model.mean, parameters_2, times_2) + + # this model should have 2 parameters + parameters_3 = [0.1] + self.assertRaises(ValueError, model.simulate, parameters_3, times) + self.assertRaises(ValueError, model.mean, parameters_3, times) + + # Initial value can't be negative + self.assertRaises(ValueError, pints.toy.StochasticLogisticModel, -1) + + +if __name__ == '__main__': + unittest.main() diff --git a/pints/toy/__init__.py b/pints/toy/__init__.py index b8ad8b3f9..687312c40 100644 --- a/pints/toy/__init__.py +++ b/pints/toy/__init__.py @@ -34,3 +34,4 @@ from ._sir_model import SIRModel # noqa from ._twisted_gaussian_banana import TwistedGaussianLogPDF # noqa from ._stochastic_degradation_model import StochasticDegradationModel # noqa +from ._stochastic_logistic_model import StochasticLogisticModel # noqa diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py new file mode 100644 index 000000000..977521ab2 --- /dev/null +++ b/pints/toy/_stochastic_logistic_model.py @@ -0,0 +1,131 @@ +# +# Stochastic degradation toy model. +# +# This file is part of PINTS. +# Copyright (c) 2017-2019, University of Oxford. +# For licensing information, see the LICENSE file distributed with the PINTS +# software package. +# +from __future__ import absolute_import, division +from __future__ import print_function, unicode_literals +import numpy as np +from scipy.interpolate import interp1d +import pints + +from . import ToyModel + + +class StochasticLogisticModel(pints.ForwardModel, ToyModel): + r""" + + *Extends:* :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. + """ + + def __init__(self, initial_molecule_count=2): + super(StochasticLogisticModel, self).__init__() + self._n0 = float(initial_molecule_count) + if self._n0 < 0: + raise ValueError('Initial molecule count cannot be negative.') + + def n_parameters(self): + """ See :meth:`pints.ForwardModel.n_parameters()`. """ + return 2 + + def simulate_raw(self, parameters): + """ + Returns raw times, mol counts when reactions occur + """ + 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_mol_counts(self, time, mol_count, output_times, parameters): + """ + Takes raw times and inputs and mol counts and outputs interpolated + values at output_times + """ + # Interpolate as step function, decreasing mol_count by 1 at each + # reaction time point + interp_func = interp1d(time, mol_count, kind='previous') + + # Compute molecule count values at given time points using f1 + # at any time beyond the last reaction, molecule count = 0 + 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, mol_count = self.simulate_raw(parameters) + + # interpolate + values = self.interpolate_mol_counts(time, mol_count, times, parameters) + return values + + def mean(self, parameters, times): + r""" + Returns the deterministic mean of infinitely many stochastic + simulations, which follows :math:`A(0) \exp(-kt)`. + """ + parameters = np.asarray(parameters) + if len(parameters) != self.n_parameters(): + raise ValueError('This model should have only 2 parameters.') + + b = parameters[0] + if b <= 0: + raise ValueError('Rate constant must be positive.') + + k = parameters[1] + if k <= 0: + raise ValueError("Carrying capacity must be positive") + + times = np.asarray(times) + if np.any(times < 0): + raise ValueError('Negative times are not allowed.') + + return (self._n0 * k) / (self._n0 + np.exp(-b * times) * (k - self._n0)) + + def variance(self, parameters, times): + r""" + Returns the deterministic variance of infinitely many stochastic + simulations. + """ + return NotImplementedError() + + def suggested_parameters(self): + """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ + return np.array([0.1, 50]) + + def suggested_times(self): + """ See "meth:`pints.toy.ToyModel.suggested_times()`.""" + return np.linspace(0, 100, 101) From fdd6685987f1180d52844161465024b7f46493a8 Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Tue, 3 Dec 2019 15:16:11 +0000 Subject: [PATCH 02/30] remove references to mol count and enforce line length limit --- .../test_toy_stochastic_logistic_model.py | 20 +++++------ pints/toy/_stochastic_logistic_model.py | 34 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index fe212239e..c7b38328e 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 # -# Tests if the stochastic degradation (toy) model works. +# Tests if the stochastic logistic growth (toy) model works. # # This file is part of PINTS. # Copyright (c) 2017-2019, University of Oxford. @@ -16,7 +16,7 @@ class TestStochasticLogistic(unittest.TestCase): """ - Tests if the stochastic degradation (toy) model works. + Tests if the stochastic logistic growth (toy) model works. """ def test_start_with_zero(self): # Test the special case where the initial population count is zero @@ -49,12 +49,12 @@ def test_simulate(self): times = np.linspace(0, 100, 101) model = StochasticLogisticModel(1) params = [0.1, 50] - time, mol_count = model.simulate_raw([0.1, 50]) - values = model.interpolate_mol_counts(time, mol_count, times, params) - self.assertTrue(len(time), len(mol_count)) + time, values = model.simulate_raw([0.1, 50]) + values = model.interpolate_mol_counts(time, values, times, params) + self.assertTrue(len(time), len(values)) # Test output of Gillespie algorithm - self.assertTrue(np.all(mol_count == + self.assertTrue(np.all(values == np.array(range(1, 51)))) # Check simulate function returns expected values @@ -62,11 +62,11 @@ def test_simulate(self): # Check interpolation function works as expected temp_time = np.array([np.random.uniform(time[0], time[1])]) - self.assertTrue(model.interpolate_mol_counts(time, mol_count, - temp_time, params)[0] == 1) + self.assertTrue(model.interpolate_values(time, values, temp_time, + params)[0] == 1) temp_time = np.array([np.random.uniform(time[1], time[2])]) - self.assertTrue(model.interpolate_mol_counts(time, mol_count, - temp_time, params)[0] == 2) + self.assertTrue(model.interpolate_values(time, values, temp_time, + params)[0] == 2) def test_mean_variance(self): # test mean diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 977521ab2..48b5ac744 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -47,33 +47,33 @@ def simulate_raw(self, parameters): 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 + # 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)) + 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_mol_counts(self, time, mol_count, output_times, parameters): + def interpolate_values(self, time, pop_size, output_times, parameters): """ - Takes raw times and inputs and mol counts and outputs interpolated - values at output_times + Takes raw times and population size values as inputs + and outputs interpolated values at output_times """ - # Interpolate as step function, decreasing mol_count by 1 at each - # reaction time point - interp_func = interp1d(time, mol_count, kind='previous') + # Interpolate as step function, increasing pop_size by 1 at each + # event time point + interp_func = interp1d(time, pop_size, kind='previous') - # Compute molecule count values at given time points using f1 - # at any time beyond the last reaction, molecule count = 0 + # 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]) + len(output_times[np.where(output_times > time[-1])]), + parameters[1]) values = np.concatenate((values, zero_vector)) return values @@ -86,10 +86,10 @@ def simulate(self, parameters, times): return np.zeros(times.shape) # run Gillespie - time, mol_count = self.simulate_raw(parameters) + time, pop_size = self.simulate_raw(parameters) # interpolate - values = self.interpolate_mol_counts(time, mol_count, times, parameters) + values = self.interpolate_values(time, pop_size, times, parameters) return values def mean(self, parameters, times): @@ -112,8 +112,8 @@ def mean(self, parameters, times): times = np.asarray(times) if np.any(times < 0): raise ValueError('Negative times are not allowed.') - - return (self._n0 * k) / (self._n0 + np.exp(-b * times) * (k - self._n0)) + c0 = self._n0 + return (c0 * k) / (c0 + np.exp(-b * times) * (k - c0)) def variance(self, parameters, times): r""" From 658ef6ef218e8a3b44dd214b65827cc80c393fac Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Tue, 3 Dec 2019 15:26:29 +0000 Subject: [PATCH 03/30] Add missing test and fix a few comments --- pints/tests/test_toy_stochastic_logistic_model.py | 6 +++++- pints/toy/_stochastic_logistic_model.py | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index c7b38328e..89bded980 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -50,7 +50,7 @@ def test_simulate(self): model = StochasticLogisticModel(1) params = [0.1, 50] time, values = model.simulate_raw([0.1, 50]) - values = model.interpolate_mol_counts(time, values, times, params) + values = model.interpolate_values(time, values, times, params) self.assertTrue(len(time), len(values)) # Test output of Gillespie algorithm @@ -97,6 +97,10 @@ def test_errors(self): self.assertRaises(ValueError, model.simulate, parameters_3, times) self.assertRaises(ValueError, model.mean, parameters_3, times) + # model variance isn't implemented so we should throw a helpful error + parameters_4 = [0.1, 50] + self.assertRaises(NotImplementedError, model.variance, parameters_4, times) + # Initial value can't be negative self.assertRaises(ValueError, pints.toy.StochasticLogisticModel, -1) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 48b5ac744..4d59e0835 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -33,7 +33,7 @@ def n_parameters(self): def simulate_raw(self, parameters): """ - Returns raw times, mol counts when reactions occur + Returns raw times, population sizes when reactions occur """ parameters = np.asarray(parameters) if len(parameters) != self.n_parameters(): @@ -95,7 +95,8 @@ def simulate(self, parameters, times): def mean(self, parameters, times): r""" Returns the deterministic mean of infinitely many stochastic - simulations, which follows :math:`A(0) \exp(-kt)`. + simulations, which follows: + :math:`\frac{kC(0)}{C(0) + \exp{-kt}(k - C(0))}`. """ parameters = np.asarray(parameters) if len(parameters) != self.n_parameters(): From 7d02068957a2c72e9c65d2bd09fb7518b4ac1f59 Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Tue, 3 Dec 2019 15:40:21 +0000 Subject: [PATCH 04/30] fix failing test --- pints/tests/test_toy_stochastic_logistic_model.py | 12 ++++++------ pints/toy/_stochastic_logistic_model.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 89bded980..6ee696646 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -49,12 +49,12 @@ def test_simulate(self): times = np.linspace(0, 100, 101) model = StochasticLogisticModel(1) params = [0.1, 50] - time, values = model.simulate_raw([0.1, 50]) - values = model.interpolate_values(time, values, times, params) - self.assertTrue(len(time), len(values)) + time, raw_values = model.simulate_raw([0.1, 50]) + values = model.interpolate_values(time, raw_values, times, params) + self.assertTrue(len(time), len(raw_values)) # Test output of Gillespie algorithm - self.assertTrue(np.all(values == + self.assertTrue(np.all(raw_values == np.array(range(1, 51)))) # Check simulate function returns expected values @@ -62,10 +62,10 @@ def test_simulate(self): # Check interpolation function works as expected temp_time = np.array([np.random.uniform(time[0], time[1])]) - self.assertTrue(model.interpolate_values(time, values, temp_time, + self.assertTrue(model.interpolate_values(time, raw_values, temp_time, params)[0] == 1) temp_time = np.array([np.random.uniform(time[1], time[2])]) - self.assertTrue(model.interpolate_values(time, values, temp_time, + self.assertTrue(model.interpolate_values(time, raw_values, temp_time, params)[0] == 2) def test_mean_variance(self): diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 4d59e0835..dc47e9e09 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -121,7 +121,7 @@ def variance(self, parameters, times): Returns the deterministic variance of infinitely many stochastic simulations. """ - return NotImplementedError() + raise NotImplementedError() def suggested_parameters(self): """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ From 31ce1f2976804ebf1d2e81e5d075cd2787c58f9c Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Tue, 3 Dec 2019 15:49:14 +0000 Subject: [PATCH 05/30] reference new notebook in README --- examples/README.md | 1 + pints/tests/test_toy_stochastic_logistic_model.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index f48ac1c6f..7556698e5 100644 --- a/examples/README.md +++ b/examples/README.md @@ -91,6 +91,7 @@ relevant code. - [Simple Harmonic Oscillator model](./toy-model-simple-harmonic-oscillator.ipynb) - [SIR Epidemiology model](./toy-model-sir.ipynb) - [Stochastic Degradation model](./toy-model-stochastic-degradation.ipynb) +- [Stochastic Logistic model](./toy-model-stochastic-logistic-growth.ipynb) ### Distributions - [Annulus](./toy-distribution-annulus.ipynb) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 6ee696646..dfc67dd7b 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -99,7 +99,8 @@ def test_errors(self): # model variance isn't implemented so we should throw a helpful error parameters_4 = [0.1, 50] - self.assertRaises(NotImplementedError, model.variance, parameters_4, times) + self.assertRaises(NotImplementedError, model.variance, + parameters_4, times) # Initial value can't be negative self.assertRaises(ValueError, pints.toy.StochasticLogisticModel, -1) From c441d24ad612c5f1fdee89f00505b74fc6f5f6dd Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Thu, 16 Jan 2020 12:50:02 +0000 Subject: [PATCH 06/30] Add rst file for new model --- docs/source/toy/stochastic_logistic_model.rst | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/source/toy/stochastic_logistic_model.rst diff --git a/docs/source/toy/stochastic_logistic_model.rst b/docs/source/toy/stochastic_logistic_model.rst new file mode 100644 index 000000000..4ab7787be --- /dev/null +++ b/docs/source/toy/stochastic_logistic_model.rst @@ -0,0 +1,7 @@ +**************************** +Stochastic Logistic Model +**************************** + +.. currentmodule:: pints.toy + +.. autoclass:: StochasticLogisticModel From dd2ab757bfc64258018da761bb65dff7ec9831c8 Mon Sep 17 00:00:00 2001 From: Jack Arthur Date: Thu, 16 Jan 2020 13:00:48 +0000 Subject: [PATCH 07/30] add new rst file to toctree --- docs/source/toy/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/toy/index.rst b/docs/source/toy/index.rst index bb1718f4d..bee2a579e 100644 --- a/docs/source/toy/index.rst +++ b/docs/source/toy/index.rst @@ -35,4 +35,5 @@ Some toy classes provide extra functionality defined in the simple_harmonic_oscillator_model sir_model stochastic_degradation_model + stochastic_logistic_model twisted_gaussian_logpdf From e9ad19570953aee5ce9f8651d59af3ba9dda3496 Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Tue, 14 Apr 2020 12:35:25 +0100 Subject: [PATCH 08/30] Moved notebook --- examples/{ => toy}/toy-model-stochastic-logistic-growth.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{ => toy}/toy-model-stochastic-logistic-growth.ipynb (100%) diff --git a/examples/toy-model-stochastic-logistic-growth.ipynb b/examples/toy/toy-model-stochastic-logistic-growth.ipynb similarity index 100% rename from examples/toy-model-stochastic-logistic-growth.ipynb rename to examples/toy/toy-model-stochastic-logistic-growth.ipynb From 8768cf8198a32f6f8b0b81a01da549f3db067420 Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Tue, 14 Apr 2020 12:36:45 +0100 Subject: [PATCH 09/30] Updated copyright notice. --- pints/toy/_stochastic_logistic_model.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index dc47e9e09..b4ed96d87 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -1,10 +1,9 @@ # # Stochastic degradation toy model. # -# This file is part of PINTS. -# Copyright (c) 2017-2019, University of Oxford. -# For licensing information, see the LICENSE file distributed with the PINTS -# software package. +# 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 __future__ import absolute_import, division from __future__ import print_function, unicode_literals From 05cc3110120219cf0d63b7aca0ed5a6858fd6b4e Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Tue, 14 Apr 2020 12:37:53 +0100 Subject: [PATCH 10/30] Updated copyright notice. --- pints/tests/test_toy_stochastic_logistic_model.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index dfc67dd7b..a435e2990 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -2,10 +2,9 @@ # # Tests if the stochastic logistic growth (toy) model works. # -# This file is part of PINTS. -# Copyright (c) 2017-2019, University of Oxford. -# For licensing information, see the LICENSE file distributed with the PINTS -# software package. +# 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 0ca5232b49a3fc4a772d10d5c16ff78649a9de68 Mon Sep 17 00:00:00 2001 From: Michael Clerx Date: Tue, 14 Apr 2020 12:40:34 +0100 Subject: [PATCH 11/30] Fixed notebook name. --- ...gistic-growth.ipynb => model-stochastic-logistic-growth.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/toy/{toy-model-stochastic-logistic-growth.ipynb => model-stochastic-logistic-growth.ipynb} (100%) diff --git a/examples/toy/toy-model-stochastic-logistic-growth.ipynb b/examples/toy/model-stochastic-logistic-growth.ipynb similarity index 100% rename from examples/toy/toy-model-stochastic-logistic-growth.ipynb rename to examples/toy/model-stochastic-logistic-growth.ipynb From 1f99d354c0af0c9e756a0e39365e9b786c2a3edd Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 21:48:21 +0800 Subject: [PATCH 12/30] Tweaks and add random seed --- .../test_toy_stochastic_logistic_model.py | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index a435e2990..73487f35c 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -10,7 +10,6 @@ import numpy as np import pints import pints.toy -from pints.toy import StochasticLogisticModel class TestStochasticLogistic(unittest.TestCase): @@ -18,8 +17,11 @@ class TestStochasticLogistic(unittest.TestCase): Tests if the stochastic logistic growth (toy) model works. """ def test_start_with_zero(self): + # Set seed for random generator + np.random.seed(1) + # Test the special case where the initial population count is zero - model = StochasticLogisticModel(0) + model = pints.toy.StochasticLogisticModel(0) times = [0, 1, 2, 100, 1000] parameters = [0.1, 50] values = model.simulate(parameters, times) @@ -27,6 +29,9 @@ def test_start_with_zero(self): self.assertTrue(np.all(values == np.zeros(5))) def test_start_with_one(self): + # Set seed for random generator + np.random.seed(1) + # Run small simulation model = pints.toy.StochasticLogisticModel(1) times = [0, 1, 2, 100, 1000] @@ -38,6 +43,7 @@ def test_start_with_one(self): self.assertTrue(np.all(values[1:] >= values[:-1])) def test_suggested(self): + np.random.seed(1) model = pints.toy.StochasticLogisticModel(1) times = model.suggested_times() parameters = model.suggested_parameters() @@ -45,16 +51,16 @@ def test_suggested(self): self.assertTrue(np.all(parameters > 0)) def test_simulate(self): + np.random.seed(1) + model = pints.toy.StochasticLogisticModel(1) times = np.linspace(0, 100, 101) - model = StochasticLogisticModel(1) params = [0.1, 50] time, raw_values = model.simulate_raw([0.1, 50]) values = model.interpolate_values(time, raw_values, times, params) self.assertTrue(len(time), len(raw_values)) # Test output of Gillespie algorithm - self.assertTrue(np.all(raw_values == - np.array(range(1, 51)))) + self.assertTrue(np.all(raw_values == np.array(range(1, 51)))) # Check simulate function returns expected values self.assertTrue(np.all(values[np.where(times < time[1])] == 1)) @@ -69,15 +75,18 @@ def test_simulate(self): def test_mean_variance(self): # test mean + np.random.seed(1) model = pints.toy.StochasticLogisticModel(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))) def test_errors(self): + np.random.seed(1) model = pints.toy.StochasticLogisticModel(1) - # parameters, times cannot be negative times = np.linspace(0, 100, 101) + + # parameters, times cannot be negative parameters = [-0.1, 50] self.assertRaises(ValueError, model.simulate, parameters, times) self.assertRaises(ValueError, model.mean, parameters, times) From ceb16f8b3c5df6cf8fc00308d521793eed3a6ad2 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 21:54:03 +0800 Subject: [PATCH 13/30] Tiny fix --- docs/source/toy/stochastic_logistic_model.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/toy/stochastic_logistic_model.rst b/docs/source/toy/stochastic_logistic_model.rst index 4ab7787be..a5fb8eec2 100644 --- a/docs/source/toy/stochastic_logistic_model.rst +++ b/docs/source/toy/stochastic_logistic_model.rst @@ -1,6 +1,6 @@ -**************************** +************************* Stochastic Logistic Model -**************************** +************************* .. currentmodule:: pints.toy From 725e235ba3577d75c2d1a0074799fb62a265f08f Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 22:05:40 +0800 Subject: [PATCH 14/30] Adding model description --- pints/toy/_stochastic_logistic_model.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index b4ed96d87..e84624a8e 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -16,6 +16,10 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): r""" + This model describes the growth of a population of individuals, where the + birth rate per capita, initially $b_0$, decreases to $0$ as the population + size, $\mathcal{C}(t)$, approaches a carrying capacity, $k$, starting from + an initial population size, $n_0$. *Extends:* :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. """ From bead114b95798233c06a995819ad6314934ad3b9 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 22:22:39 +0800 Subject: [PATCH 15/30] Adding model description --- pints/toy/_stochastic_logistic_model.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index e84624a8e..33df2a4be 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -19,9 +19,29 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): This model describes the growth of a population of individuals, where the birth rate per capita, initially $b_0$, decreases to $0$ as the population size, $\mathcal{C}(t)$, approaches a carrying capacity, $k$, starting from - an initial population size, $n_0$. + an initial population size, $n_0$. This process follows a rate according + to [1]_ + + ..math:: + A \xrightarrow{b_0(1-\frac{\mathcal{C}(t)}{k})} 2A. + + The model is simulated using the Gillespie stochastic simulation algorithm + [2]_. *Extends:* :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. + + Parameters + ---------- + initial_molecule_count : float + Sets the initial population size :math:`n_0`. + + References + ---------- + .. [1] + .. [2] Gillespie, D. 1976. A General Method for Numerically Simulating the + Stochastic Time Evolution of Coupled Chemical Reactions. + Journal of Computational Physics. 22 (4): 403–434. + https://doi.org/10.1016/0021-9991(76)90041-3 """ def __init__(self, initial_molecule_count=2): From 4bb9441e7f7a04525a57d234a4b8153574ddf706 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 22:26:58 +0800 Subject: [PATCH 16/30] Make ref consistent --- pints/toy/_hes1_michaelis_menten.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pints/toy/_hes1_michaelis_menten.py b/pints/toy/_hes1_michaelis_menten.py index 719a6cf89..fc7b6643b 100644 --- a/pints/toy/_hes1_michaelis_menten.py +++ b/pints/toy/_hes1_michaelis_menten.py @@ -34,13 +34,6 @@ class Hes1Model(pints.ForwardModel, ToyModel): Extends :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. - References - ---------- - .. [1] Silk, D., el al. 2011. Designing attractive models via automated - identification of chaotic and oscillatory dynamical regimes. Nature - communications, 2, p.489. - https://doi.org/10.1038/ncomms1496 - Parameters ---------- y0 : float @@ -48,6 +41,13 @@ class Hes1Model(pints.ForwardModel, ToyModel): implicit_parameters The implicit parameter of the model that is not inferred, given as a vector ``[p1_0, p2_0, k_deg]`` with ``p1_0, p2_0, k_deg >= 0``. + + References + ---------- + .. [1] Silk, D., el al. 2011. Designing attractive models via automated + identification of chaotic and oscillatory dynamical regimes. Nature + communications, 2, p.489. + https://doi.org/10.1038/ncomms1496 """ def __init__(self, y0=None, implicit_parameters=None): if y0 is None: From 7a97f53695624f458624b42f3375597e2bf606aa Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 22:29:43 +0800 Subject: [PATCH 17/30] Adding model description --- pints/toy/_stochastic_logistic_model.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 33df2a4be..f6431d4c4 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -17,12 +17,12 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): r""" This model describes the growth of a population of individuals, where the - birth rate per capita, initially $b_0$, decreases to $0$ as the population - size, $\mathcal{C}(t)$, approaches a carrying capacity, $k$, starting from - an initial population size, $n_0$. This process follows a rate according - to [1]_ + birth rate per capita, initially :math:`b_0`, decreases to :math:`0` as the + population size, :math:`\mathcal{C}(t)`, starting from an initial + population size, :math:`n_0`, approaches a carrying capacity, :math:`k`. + This process follows a rate according to [1]_ - ..math:: + .. math:: A \xrightarrow{b_0(1-\frac{\mathcal{C}(t)}{k})} 2A. The model is simulated using the Gillespie stochastic simulation algorithm @@ -37,7 +37,7 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): References ---------- - .. [1] + .. [1] Simpson et al. 2019. .. [2] Gillespie, D. 1976. A General Method for Numerically Simulating the Stochastic Time Evolution of Coupled Chemical Reactions. Journal of Computational Physics. 22 (4): 403–434. From 268e3795bdfc304245818d31bab76acc85ffd114 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 22:35:37 +0800 Subject: [PATCH 18/30] Fix typos in docs --- pints/toy/_stochastic_logistic_model.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index f6431d4c4..6823d541e 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -56,7 +56,7 @@ def n_parameters(self): def simulate_raw(self, parameters): """ - Returns raw times, population sizes when reactions occur + Returns tuple (raw times, population sizes) when reactions occur. """ parameters = np.asarray(parameters) if len(parameters) != self.n_parameters(): @@ -84,8 +84,8 @@ def simulate_raw(self, parameters): 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 + 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 @@ -119,7 +119,7 @@ def mean(self, parameters, times): r""" Returns the deterministic mean of infinitely many stochastic simulations, which follows: - :math:`\frac{kC(0)}{C(0) + \exp{-kt}(k - C(0))}`. + :math:`\frac{kC(0)}{C(0) + (k - C(0)) \exp(-kt)}`. """ parameters = np.asarray(parameters) if len(parameters) != self.n_parameters(): @@ -151,5 +151,5 @@ def suggested_parameters(self): return np.array([0.1, 50]) def suggested_times(self): - """ See "meth:`pints.toy.ToyModel.suggested_times()`.""" + """ See :meth:`pints.toy.ToyModel.suggested_times()`.""" return np.linspace(0, 100, 101) From 69c8c37788f7a5f52f3063eedfd56c8f3b6d9d2f Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 22:46:41 +0800 Subject: [PATCH 19/30] Slight tweaks to the examples --- .../model-stochastic-logistic-growth.ipynb | 61 +++++++------------ 1 file changed, 22 insertions(+), 39 deletions(-) diff --git a/examples/toy/model-stochastic-logistic-growth.ipynb b/examples/toy/model-stochastic-logistic-growth.ipynb index 8d1678aac..d4e7a1e46 100644 --- a/examples/toy/model-stochastic-logistic-growth.ipynb +++ b/examples/toy/model-stochastic-logistic-growth.ipynb @@ -12,8 +12,8 @@ "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):\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)\n", - " 1. Sample a random value r from a uniform distribution: $r \\sim \\text{uniform}(0,1)$\n", + "The model is simulated according to the Gillespie stochastic simulation algorithm [(Gillespie, 1976)](https://doi.org/10.1016/0021-9991(76)90041-3):\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", @@ -23,15 +23,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pints\n", "import pints.toy\n", "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import math" + "import numpy as np" ] }, { @@ -43,12 +42,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADt0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjByYzEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy/xvVyzAAAWK0lEQVR4nO3df7BkdXnn8fcHxN8SQEZqZDSDinEnloKZWLi6W4jGQiPiWspKxKBSSyq6kaSyG3HdKspdk8VN/JWqaHbWX2OiAqJmkIiJTnDZ1SxmWFnEQYOiEMjgjD+AiWYR5Nk/zrmmudw7fe7lnu7bfd6vqq7b53T3Pc+pA8889+nv+X5TVUiShuOgaQcgSZosE78kDYyJX5IGxsQvSQNj4pekgXnAtAPo4sgjj6zNmzdPOwxJmilXXXXVd6tqw+L9M5H4N2/ezK5du6YdhiTNlCQ3LrXfVo8kDYyJX5IGxsQvSQNj4pekgTHxS9LA9DqqJ8m3gf3AT4C7q2prkiOAC4HNwLeB06rqB33GIUn6J5Oo+J9dVcdV1dZ2+1xgZ1UdC+xstyVJEzKNcfynAie2z7cDnwfeMIU4JGnVPnLlTey4+pZej7Hl0Ydy3ik/v+a/t++Kv4C/THJVkrPbfUdV1Z72+a3AUUt9MMnZSXYl2bVv376ew5Skldlx9S3s3nPHtMNYlb4r/mdV1S1JHgV8NsnXRl+sqkqy5EowVbUN2AawdetWV4uRtO5s2XgoF/7aM6Ydxor1WvFX1S3tz73AJ4GnA99JshGg/bm3zxgkSffWW8Wf5GHAQVW1v33+POA/AZcAZwLntz939BWDpOmaRB98WnbvuYMtGw+ddhir0mer5yjgk0kWjvORqvpMkr8BLkpyFnAjcFqPMUiaooU++KwmyAPZsvFQTj3u6GmHsSq9Jf6qugF46hL7vwc8p6/jSlpfZrUPPs+8c1eSBmYm5uOXtP506d/Pa5tn1lnxS1qVLuPYZ7kPPs+s+CWtmv372WTFL0kDY8UvzYj1Nibe/v3ssuKXZsR6mxvG/v3ssuKXZog9da0FK35JGhgrfmkdG+3r21PXWrHil9ax0b6+PXWtFSt+aZ2zr6+1ZsUvSQNj4pekgTHxS9LAmPglaWBM/JI0MI7qkdYZx+6rb1b80jrj2H31zYpfWoccu68+WfFL0sBY8UtTtnieffv66psVvzRli+fZt6+vvlnxS+uAPX1NkhW/JA2MiV+SBsZWjzQF3qSlabLil6bAm7Q0TVb80pT4ha6mxYpfkgbGil9apcU3Xq2EfX1NU+8Vf5KDk3w5yaXt9jFJrkzyjSQXJnlg3zFIfVh849VK2NfXNE2i4j8HuA5YKG/eCryjqi5I8sfAWcB7JhCHtObs02sW9VrxJ9kE/DLw3nY7wEnAxe1btgMv7jMGSdK99d3qeSfwO8A97fYjgduq6u52+2bAv3claYJ6S/xJXgjsraqrVvn5s5PsSrJr3759axydJA1XnxX/M4EXJfk2cAFNi+ddwGFJFr5b2AQsOSyiqrZV1daq2rphw4Yew5SkYekt8VfVG6tqU1VtBl4O/FVVvQK4HHhp+7YzgR19xSBJuq9pjON/A3BBkrcAXwbeN4UYpPtY6bh8x+JrVk0k8VfV54HPt89vAJ4+ieNKK7EwLr9rMncsvmaVd+5KIxyXryFwrh5JGhgTvyQNjIlfkgbGxC9JA2Pil6SBGTuqJ8mDgRcC/wJ4NPCPwLXAn1fVV/sNT+qXa99qiA5Y8Sd5M/AF4BnAlcB/Ay4C7gbOT/LZJE/pPUqpJ659qyEaV/F/qarOW+a1tyd5FPDYNY5JmijH7mtoDpj4q+rPx7y+F9i7phFJknrVpce/CTgdeBaLevzAZVV1zwE+LklaZw6Y+JN8gGahlEtplkzcCzwYeCJwMvCmJOdW1RV9BypJWhvjKv63VdW1S+y/FvhEu1C6PX5JmiEHHNWzkPSTnLP4tSTnVNWPq+obfQUnSVp7XWfnPJNm9axRr1pin7RudJlf37H7GqJxPf7TgV8BjklyychLjwC+32dg0v3VZX59x+5riMZV/F8E9gBHAm8b2b8fuKavoKS14hh96b7GJf6bqupGmjt3l5QkVVVrG5YkqS/jEv/lST4O7KiqmxZ2tqN5nkXT+78c+GBvEUpjLNfLt38vLW3c7JwnAz8BPprk75PsTvIt4Hqam7reWVUf7DlG6YBG59sZZf9eWtq4KRv+H/Bu4N1JDqHp9f9jVd02ieCkruzlS911no+/qu6qqj3AXUnOSHLAeXwkSetTp8Sf5IFJ/lWSj9GM8nkO8Me9RiZJ6sW4cfzPo+nlP4/mS9wPAb9YVa+eQGySpB6Mq/g/AzwOeFZVnVFVnwKcjVOSZti44ZxPA14OfC7JDcAFwMG9RyVJ6s24Sdqurqpzq+rxwHnAccAhSS5LcvZEIpQkramVjOr5YlX9BrAJeAdwQm9RSZJ6M26x9c2L91XVPVX1l1X1mjQ29RWcJGntjevx/36Sg4AdwFXAPpoVuJ4AnAg8l6YFdHOPMUqS1tC4O3dflmQL8ArgNcBG4EfAdcCngd9r7+6VJmp0fh7n5JFWZuxCLFW1G3jTBGKROhuda985eaSV6boC14oleTBwBfCg9jgXV9V5SY6hGRb6SJr20Sur6sd9xaH55fw80up0HtWzCncCJ1XVU2mGgZ6c5ATgrcA7quoJwA+As3qMQZK0SG+Jvxr/0G4e0j4KOAm4uN2/HXhxXzFIku6rc6snydHAz45+pqquGPOZg2naOU8A/gj4JnBbVd3dvuVmYMnmbHuD2NkAj33sY7uGKUkao1PiT/JW4F8Du2kWZoGmej9g4q+qnwDHJTkM+CTwpK6BVdU2YBvA1q1bXdpRktZI14r/xcDPVdWdqzlIVd2W5HKatXsPS/KAturfBNx3zTxJUm+6Jv4baHr0nRN/kg3AXW3SfwjwSzRf7F4OvJRmZM+ZNDeHST+13Bq6oxy7L61e18T/I+DqJDsZSf5V9foDfGYjsL3t8x8EXFRVlybZDVyQ5C3Al4H3rS50zavRMfrLcey+tHpdE/8l7aOzqroGOH6J/TcAT1/J79LwOEZf6k+nxF9V25M8EHhiu+vrVXVXf2FJkvrSdVTPiTRj7r8NBHhMkjPHDeeUJK0/XVs9bwOeV1VfB0jyROCjwC/0FZgkqR9d79w9ZCHpA1TV39KM8pEkzZiuFf+uJO8F/rTdfgWwq5+QJEl96pr4fx14HbAwfPN/Au/uJSINkvPrS5PTdVTPncDb24e05pxfX5qcAyb+JBdV1WlJvkIzN8+9VNVTeotMg+PYfWkyxlX857Q/X9h3IJKkyTjgqJ6q2tM+fW1V3Tj6AF7bf3iSpLXWdTjnLy2x7/lrGYgkaTLG9fh/naayf1ySa0ZeegTwhT4DkyT1Y1yP/yPAZcB/Ac4d2b+/qr7fW1SSpN4cMPFX1e3A7cDpAEkeBTwYeHiSh1fVTf2HqHnl2H1pOjr1+JOckuR64FvA/6CZrO2yHuPSACyM3Qfn15cmqeudu28BTgA+V1XHJ3k2cEZ/YWkoHLsvTV7XUT13VdX3gIOSHFRVlwNbe4xLktSTrhX/bUkeDlwBfDjJXuCH/YUlSepL14r/VJp1d38L+AzwTeCUvoKSJPVnbMXfLpZ+aVU9G7iHZiUuSdKMGlvxV9VPgHuS/MwE4pEk9axrj/8fgK8k+Swjvf2qev3yH5EkrUddE/8n2seo+0zTLEla/7om/sOq6l2jO5Kcs9ybJUnrV9dRPWcuse9VaxiHJGlCxs3OeTrwK8AxSS4ZeekRgJO0SdIMGtfq+SKwBzgSeNvI/v3ANUt+QpK0ro2bnfNG4EbAyVQkaU50nZ3zJUmuT3J7kjuS7E9yR9/BSZLWXtdRPf8VOKWqruszGElS/7qO6vmOSV+S5kPXin9XkguBPwPuXNhZVYtv6vqpJI8BPgQcRXOz17aqeleSI4ALgc00C7qcVlU/WFX0kqQV61rxH0ozO+fzaGblPAV44ZjP3A38dlVtoVnE5XVJttCs3buzqo4FdnLvtXwlST3rVPFX1atX+ourag/NUFCqan+S64CjaaZ4PrF923bg88AbVvr7JUmr03VUzxOT7Exybbv9lCT/setBkmwGjgeuBI5q/1EAuJWmFbTUZ85OsivJrn379nU9lCRpjK6tnv8OvBG4C6CqrgFe3uWD7cpdHwd+s6ruNQS0qoplJnurqm1VtbWqtm7YsKFjmJKkcbom/odW1ZcW7bt73IeSHEKT9D888kXwd5JsbF/fCOztGqwk6f7rOqrnu0keT1udJ3kpbf9+OUkCvA+4rqrePvLSJTSTvp3f/tyx0qA1mz5y5U3suPqWn27v3nMHWzYeOsWIpGHqmvhfB2wDnpTkFuBbwBljPvNM4JU0C7hc3e77DzQJ/6IkZ9FMB3HaiqPWTNpx9S33SvZbNh7KqccdPeWopOHpOqrnBuC5SR4GHFRV+zt85n8BWebl53QPUfNky8ZDufDXnPpJmqauo3p+L8lhVfXDdmjm4Une0ndwkqS11/XL3edX1W0LG+2dti/oJyRJUp+6Jv6DkzxoYSPJQ4AHHeD9kqR1quuXux8Gdib5QLv9apq7biVJM6brl7tvTXIN//Sl7H+uqr/oLyxJUl+6VvxU1WXAZT3GohmzeFz+OI7bl9YHV+DSqi2My+/KcfvS+uAKXLpfHJcvzR5X4JKkgeltBS7Np9G+vj17aTZ1TfyjK3AtKMDEPzCj8+3Ys5dmU28rcGl+2deXZlvXUT2bknwyyd728fEkm/oOTpK09rp+ufsBmnn0H90+PtXukyTNmK6Jf0NVfaCq7m4fHwRcD1GSZlDXxP+9JGckObh9nAF8r8/AJEn96Jr4X0OzUtatNEsuvpRmojZJ0ozpOqrnRuBFPceidcqx+9J86TqqZ3uSw0a2D0/y/v7C0noyOiePY/el2df1Bq6nLF6BK8nxPcWkdcix+9L86NrjPyjJ4QsbSY5gBVM6S5LWj67J+23AXyf5WLv9MuB3+wlJktSnrl/ufijJLuCkdtdLqmp3f2Fp2vxCV5pfK1mBazdgsh8IJ2OT5pd9ei3LL3Sl+dT1y11J0pww8UvSwJj4JWlgTPySNDAmfkkaGBO/JA1Mb4k/yfvbZRqvHdl3RJLPJrm+/Xn4gX6HJGnt9VnxfxA4edG+c4GdVXUssLPdliRNUG+Jv6quAL6/aPepwPb2+XbgxX0dX5K0tEnfuXtUVe1pn98KHDXh42uR0Tl5Rjk/jzS/pvblblUVUMu9nuTsJLuS7Nq3b98EIxuW0UVWRjk/jzS/Jl3xfyfJxqrak2QjsHe5N1bVNmAbwNatW5f9B0L3n3PySMMy6Yr/EuDM9vmZwI4JH1+SBq+3ij/JR4ETgSOT3AycB5wPXJTkLOBG4LS+jq/lOde+NGy9Jf6qOn2Zl57T1zHVjXPtS8PmfPwDZV9fGi6nbJCkgbHiHwj7+pIWWPEPxOh4ffv60rBZ8Q+IfX1JYMUvSYNjxT/H7OtLWooV/xyzry9pKVb8c86+vqTFrPglaWCs+OeMfX1J41jxzxn7+pLGseKfQ/b1JR2IFb8kDYwV/xywry9pJaz454B9fUkrYcU/J+zrS+rKil+SBsaKf4pGe/P3h319SSthxT9Fo735+8O+vqSVsOKfMnvzkibNil+SBsaKfwKW6+Xbm5c0DVb8E7BcL9/evKRpsOKfEHv5ktYLK35JGhgr/hVazdh7e/mS1hMr/hVazdh7e/mS1hMr/lWwXy9pllnxS9LAzHXF/+ZPfZXdf3//p0QYZb9e0qyz4l8h+/WSZt1UKv4kJwPvAg4G3ltV5/dxnPNO+fk+fq0kzbSJV/xJDgb+CHg+sAU4PcmWScchSUM1jVbP04FvVNUNVfVj4ALg1CnEIUmDNI3EfzTwdyPbN7f77iXJ2Ul2Jdm1b9++iQUnSfNu3X65W1XbqmprVW3dsGHDtMORpLkxjcR/C/CYke1N7T5J0gRMI/H/DXBskmOSPBB4OXDJFOKQpEGa+HDOqro7yb8F/oJmOOf7q+qrk45DkoZqKuP4q+rTwKencWxJGrpU1bRjGCvJPuDGVX78SOC7axjOLPCch8Fznn/393x/tqruMzpmJhL//ZFkV1VtnXYck+Q5D4PnPP/6Ot91O5xTktQPE78kDcwQEv+2aQcwBZ7zMHjO86+X8537Hr8k6d6GUPFLkkaY+CVpYOY68Sc5OcnXk3wjybnTjmetJXlMksuT7E7y1STntPuPSPLZJNe3Pw+fdqxrLcnBSb6c5NJ2+5gkV7bX+sJ2OpC5keSwJBcn+VqS65I8Y96vc5Lfav+7vjbJR5M8eN6uc5L3J9mb5NqRfUte1zT+sD33a5I8bbXHndvEP5AFX+4GfruqtgAnAK9rz/FcYGdVHQvsbLfnzTnAdSPbbwXeUVVPAH4AnDWVqPrzLuAzVfUk4Kk05z631znJ0cDrga1V9WSa6V1ezvxd5w8CJy/at9x1fT5wbPs4G3jPag86t4mfASz4UlV7qur/tM/30ySDo2nOc3v7tu3Ai6cTYT+SbAJ+GXhvux3gJODi9i1zdc5Jfgb4l8D7AKrqx1V1G3N+nWmmlHlIkgcADwX2MGfXuaquAL6/aPdy1/VU4EPV+N/AYUk2rua485z4Oy34Mi+SbAaOB64EjqqqPe1LtwJHTSmsvrwT+B3gnnb7kcBtVXV3uz1v1/oYYB/wgba99d4kD2OOr3NV3QL8AXATTcK/HbiK+b7OC5a7rmuW0+Y58Q9GkocDHwd+s6ruGH2tmvG6czNmN8kLgb1VddW0Y5mgBwBPA95TVccDP2RRW2cOr/PhNBXuMcCjgYdx35bI3Ovrus5z4h/Egi9JDqFJ+h+uqk+0u7+z8Cdg+3PvtOLrwTOBFyX5Nk377iSa/vdhbUsA5u9a3wzcXFVXttsX0/xDMM/X+bnAt6pqX1XdBXyC5trP83VesNx1XbOcNs+Jf+4XfGl72+8Drquqt4+8dAlwZvv8TGDHpGPrS1W9sao2VdVmmmv6V1X1CuBy4KXt2+btnG8F/i7Jz7W7ngPsZo6vM02L54QkD23/O18457m9ziOWu66XAL/aju45Abh9pCW0MlU1tw/gBcDfAt8E3jTteHo4v2fR/Bl4DXB1+3gBTc97J3A98DngiGnH2tP5nwhc2j5/HPAl4BvAx4AHTTu+NT7X44Bd7bX+M+Dweb/OwJuBrwHXAn8CPGjerjPwUZrvMO6i+cvurOWuKxCakYrfBL5CM+JpVcd1ygZJGph5bvVIkpZg4pekgTHxS9LAmPglaWBM/JI0MCZ+aZF2JszXts8fneTicZ+RZonDOaVF2nmPLq1mVkhp7jxg/FukwTkfeHySq2luovlnVfXkJK+imSnxYTRT4/4B8EDglcCdwAuq6vtJHk9zo80G4EfAv6mqr03+NKSl2eqR7utc4JtVdRzw7xe99mTgJcAvAr8L/KiaidP+GvjV9j3bgN+oql8A/h3w7olELXVkxS+tzOXVrH2wP8ntwKfa/V8BntLOlPrPgY81U8wAzVQD0rph4pdW5s6R5/eMbN9D8//TQTRzxh836cCkrmz1SPe1H3jEaj5YzXoI30ryMvjpOqlPXcvgpPvLxC8tUlXfA77QLoD9+6v4Fa8Azkryf4GvMmdLfmr2OZxTkgbGil+SBsbEL0kDY+KXpIEx8UvSwJj4JWlgTPySNDAmfkkamP8PhoVnBRfi7r4AAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -71,8 +70,8 @@ "values = model.simulate(params, times)\n", "\n", "plt.step(times, values)\n", - "plt.xlabel('time')\n", - "plt.ylabel('concentration (A(t))')\n", + "plt.xlabel('Time')\n", + "plt.ylabel(r'Concentration ($A(t)$)')\n", "plt.show()" ] }, @@ -80,17 +79,17 @@ "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 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" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -105,17 +104,17 @@ "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=f'n={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('population (C(t))')\n", + "plt.title('Stochastic logistic growth across different iterations')\n", + "plt.xlabel('Time')\n", + "plt.ylabel(r'Population ($C(t)$)')\n", "plt.show()" ] }, @@ -128,22 +127,12 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -156,16 +145,10 @@ ], "source": [ "simulate_n(1000)\n", - "plt.plot(times, model.mean(params, times), label=\"deterministic mean\")\n", - "plt.legend()" + "plt.plot(times, model.mean(params, times), label=\"Deterministic mean\")\n", + "plt.legend()\n", + "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -184,7 +167,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.8.5" } }, "nbformat": 4, From 2e52a4229fceb791cd6ea4a3bfb126a4594a8a1d Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 23:08:00 +0800 Subject: [PATCH 20/30] Add reference --- examples/toy/model-stochastic-logistic-growth.ipynb | 4 ++-- pints/toy/_stochastic_logistic_model.py | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/examples/toy/model-stochastic-logistic-growth.ipynb b/examples/toy/model-stochastic-logistic-growth.ipynb index d4e7a1e46..5fcd8e01d 100644 --- a/examples/toy/model-stochastic-logistic-growth.ipynb +++ b/examples/toy/model-stochastic-logistic-growth.ipynb @@ -9,10 +9,10 @@ "This example shows how the stochastic logistic growth model can be used.\n", "This model describes the growth of a population of individuals, where the birth rate per capita, initially $b_0$, decreases to 0 as the population size, $\\mathcal{C}(t)$, approaches a carrying capacity, $k$.\n", "\n", - "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):\n", + "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):\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", " 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", diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 6823d541e..bf3cc764d 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -26,7 +26,7 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): A \xrightarrow{b_0(1-\frac{\mathcal{C}(t)}{k})} 2A. The model is simulated using the Gillespie stochastic simulation algorithm - [2]_. + [2]_, [3]_. *Extends:* :class:`pints.ForwardModel`, :class:`pints.toy.ToyModel`. @@ -37,11 +37,16 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): References ---------- - .. [1] Simpson et al. 2019. + .. [1] Simpson, M. et al. 2019. Process noise distinguishes between + indistinguishable population dynamics. bioRxiv. + https://doi.org/10.1101/533182 .. [2] Gillespie, D. 1976. A General Method for Numerically Simulating the Stochastic Time Evolution of Coupled Chemical Reactions. Journal of Computational Physics. 22 (4): 403–434. https://doi.org/10.1016/0021-9991(76)90041-3 + .. [3] Erban R. et al. 2007. A practical guide to stochastic simulations + of reaction-diffusion processes. arXiv. + https://arxiv.org/abs/0704.1908v2 """ def __init__(self, initial_molecule_count=2): From e034d71c2812cdc947e5c8d34aab31413b586367 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 23:29:12 +0800 Subject: [PATCH 21/30] Non-ASCII issue --- pints/toy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pints/toy/__init__.py b/pints/toy/__init__.py index 44cf3ae1d..8c5b3ea8b 100644 --- a/pints/toy/__init__.py +++ b/pints/toy/__init__.py @@ -36,4 +36,4 @@ from ._sir_model import SIRModel from ._twisted_gaussian_banana import TwistedGaussianLogPDF from ._stochastic_degradation_model import StochasticDegradationModel -from ._stochastic_logistic_model import StochasticLogisticModel \ No newline at end of file +from ._stochastic_logistic model import StochasticLogisticModel From 25f57a023f978fca94bbeb9655a4d90f0b2d95f0 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 23:47:56 +0800 Subject: [PATCH 22/30] Fix typo --- pints/toy/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pints/toy/__init__.py b/pints/toy/__init__.py index 8c5b3ea8b..a6aee7fcf 100644 --- a/pints/toy/__init__.py +++ b/pints/toy/__init__.py @@ -36,4 +36,4 @@ from ._sir_model import SIRModel from ._twisted_gaussian_banana import TwistedGaussianLogPDF from ._stochastic_degradation_model import StochasticDegradationModel -from ._stochastic_logistic model import StochasticLogisticModel +from ._stochastic_logistic_model import StochasticLogisticModel From 8432e430fbb5b62fe84f437e7468b2a4f3948166 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Thu, 26 Nov 2020 23:55:35 +0800 Subject: [PATCH 23/30] Fix Non-ASCII character --- pints/toy/_stochastic_logistic_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index bf3cc764d..bebd5458f 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -42,7 +42,7 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): https://doi.org/10.1101/533182 .. [2] Gillespie, D. 1976. A General Method for Numerically Simulating the Stochastic Time Evolution of Coupled Chemical Reactions. - Journal of Computational Physics. 22 (4): 403–434. + Journal of Computational Physics. 22 (4): 403-434. https://doi.org/10.1016/0021-9991(76)90041-3 .. [3] Erban R. et al. 2007. A practical guide to stochastic simulations of reaction-diffusion processes. arXiv. From c24a8ab669a67b66076109adbf1c8e5fdc8ec3a5 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Fri, 27 Nov 2020 00:24:56 +0800 Subject: [PATCH 24/30] Fix bias in simulations --- .../toy/model-stochastic-logistic-growth.ipynb | 16 +++++++++------- pints/toy/_stochastic_logistic_model.py | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/toy/model-stochastic-logistic-growth.ipynb b/examples/toy/model-stochastic-logistic-growth.ipynb index 5fcd8e01d..1ccd30e0e 100644 --- a/examples/toy/model-stochastic-logistic-growth.ipynb +++ b/examples/toy/model-stochastic-logistic-growth.ipynb @@ -47,7 +47,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEGCAYAAAB/+QKOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAX1UlEQVR4nO3de9RddX3n8fdHELRojECkkZAJrSw7EStqFKx0FoLOAKJxHAreWmSwzJpaxZnOVO2sNVJrV2Xa8V4ZUlFDvSBLRZh6mbIw3ipkTASlgq6mSiCZQFAuIiqKfuePvR84xhNyTp5zP+/XWs96zv6dfZ7zPWvD+eb7++7926kqJEna1UPGHYAkaTKZICRJXZkgJEldmSAkSV2ZICRJXe077gAG5eCDD65Vq1aNOwxJmiqbN2/+blUt6/bczCSIVatWsWnTpnGHIUlTJcnW3T3nFJMkqSsThCSpKxOEJKkrE4QkqSsThCSpq5EliCQ3JrkuybVJNrVjBya5Isk/tb8f3Y4nyTuSbEny9SRPGVWckqTGqCuIZ1XVUVW1pt1+HXBlVR0BXNluA5wEHNH+nA2cP+I4JWnujfs6iLXAce3j9cDngNe24xdVsxb51UmWJlleVTvGEqUkLdKHNt7EZdduH8rfXv3YJbzheU8Y+N8dZYIo4O+TFHBBVa0DDun40r8FOKR9fChwc8drt7Vjv5AgkpxNU2GwcuXKIYYuaVYM84v6wWz8zu0AHH34gSN/7701ygRxbFVtT/IY4Iok3+x8sqqqTR49a5PMOoA1a9Z45yOpT+P6shyncX1RH334gaw96lBecvT0/GN2ZAmiqra3v3cmuRR4OnDrwtRRkuXAznb37cBhHS9f0Y5JehD9fuFP479qF2sav6jHZSQJIskBwEOq6u728b8G3ghcDpwBvLn9fVn7ksuBP0xyMXA0cJf9B6m7zqTQ7xe+X5Z6MKOqIA4BLk2y8J4fqqrPJPkKcEmSs4CtwGnt/p8CTga2AD8EzhxRnNJU2F1S8AtfgzSSBFFV3wae1GX8e8AJXcYLeOUIQpOm0mXXbuf6Hd9n9fIlJgUNzbhPc5XUo86qYSE5fOQ/PGPMUWmWmSCkCba7qaTVy5ew9qhDxxma5oAJQppgTiVpnEwQ0oRzKknjYoKQJky3XoM0DiYIaQLYa9AkMkFIY+K1DJp0JghphEwKmiYmCGmEPCtJ08QEIQ3RrovneYGbpon3pJaGaKFiWGDTWdPECkIaMisGTSsThDRgXsegWeEUkzRgndNKTilpmllBSAPgSquaRSYIaS959bNmnQlC2kte06BZZ4KQ+uBUkuaJTWqpDzagNU+sIKQ+WTVoXpggpD3wugbNKxOE1IVnKEkmCKkrz1CSTBDSbtlr0LwzQUgtew3SL/I0V6nlKazSL7KC0Fzzwjdp96wgNNesGqTds4LQ3LNqkLqzgpAkdWUFobnj2UpSb6wgNHfsO0i9sYLQXLLvIO2ZCUJzwWklqX9OMWkuOK0k9W+kFUSSfYBNwPaqOiXJ4cDFwEHAZuB3q+onSfYHLgKeCnwPOL2qbhxlrJo9TitJ/Rl1BXEOcEPH9nnAW6vqccAdwFnt+FnAHe34W9v9pL58aONNnH7BVZx+wVX3Vw+SejeyBJFkBfBc4D3tdoDjgY+2u6wHXtA+Xttu0z5/Qru/1DOnlaTFGeUU09uAPwYe2W4fBNxZVfe129uAhf+DDwVuBqiq+5Lc1e7/3c4/mORs4GyAlStdq1+/zGklae+NpIJIcgqws6o2D/LvVtW6qlpTVWuWLVs2yD8tSXNvVBXEM4HnJzkZeBiwBHg7sDTJvm0VsQLY3u6/HTgM2JZkX+BRNM1q6UF5Oqs0OCOpIKrq9VW1oqpWAS8CPltVLwU2AKe2u50BXNY+vrzdpn3+s1VVo4hV082+gzQ4475Q7rXAxUneBFwDXNiOXwj8bZItwO00SUXqyns6SMMx8gRRVZ8DPtc+/jbw9C77/Bj4nZEGpqm1UDWsXr7EqkEaoHFXENJAWDVIg9d3DyLJAe0V0ZKkGbbHCiLJQ2h6AC8FngbcC+yf5LvAJ4ELqmrLUKOUduHZStLw9VJBbAB+HXg98KtVdVhVPQY4FrgaOC/Jy4YYo/RLPFtJGr5eehDPrqqf7jpYVbcDHwM+luShA49M2gP7DtJw7bGC2DU5dOtBdEsgkqTptscEkeQhSV6S5JNJdgLfBHYkuT7JXyZ53PDDlCSNmj0ISVJXPfcgkqyqqp8vDNqDkKTZtscE0dFf+DjwlM7nkhxTVVfbg9AoeGqrNFq99CBOS/Jm4JFJ/mV7XcSCdcMLTfpFntoqjVYvU0z/QLNE9yuAtwCPT3In8P+AHw0xNumXeGqrNDq9TDFtBy5K8s9V9Q8ASQ4CVtGc0SQNjdNK0vj0MsUUgIXk0D7+XlVtrqp7OveRBs1pJWl8epli2pDkY8BlVXXTwmCS/WhOdT2D5lTY9w8lQs09p5Wk8eglQZwI/Hvgw0kOB+6k6UnsA/w98LaqumZ4IWreOK0kTYZeehA/Bt4NvLu93uFg4EdVdeewg9N88gZA0mTo64ZB7fUOOxa2kyw1UWgYnFaSxq+nBJHkAOAJwJEdv48EDgCWDi06SdLY9HLDoBuBhwLX05zWegPwYuCoqto51OgkSWPTSwXxv4HjgL+pqksAkvxXk4MGyca0NHl6uR/Eq4BTgJOTfCXJSUANPTLNFa93kCZPTz2IqtoKvDzJE4A/A341ybOqasNQo9NcsTEtTZZe7gdxv6r6RlW9EHgW8N+SfH44YUmSxq2XJnWq6hemlKpqI/DsJCfsbh9pT+w7SJOtpzvKJXlVkpWdg+1SGyRZT7PchtQX+w7SZHOpDY2VfQdpcrnUhiSpq0UttSH1y76DND36OotJWiz7DtL06KuCkAbBvoM0HXpOEEn2B/4dza1G739dVb1x8GFJksatnwriMuAuYDNw73DCkSRNin4SxIqqOnFokUiSJko/TeovJ3ni0CKRJE2UfhLEscDmJN9K8vUk1yX5ei8vTPKwJP83ydeSfCPJn7bjhyfZmGRLko90XJ29f7u9pX1+Vb8fTJK0OP1MMZ20iPe5Fzi+qn7QXmz3pSSfBv4z8NaqujjJ/wLOAs5vf99RVY9L8iLgPOD0Rby/JKlPPSeIqtqa5EnAb7dDX6yqr/X42gJ+0G4+tP0p4HjgJe34euBcmgSxtn0M8FHgXS4IOL28OE6aTj1PMSU5B/gg8Jj25wNJXtXH6/dJci2wE7gC+Gfgzqq6r91lG7Bw1dShwM0A7fN3AQd1+ZtnJ9mUZNNtt93WaygaMS+Ok6ZTP1NMZwFHV9U9AEnOA64C3tnLi6vqZ8BRSZYClwK/0Wes3f7mOmAdwJo1a6wuJpgXx0nTp58mdYCfdWz/rB3rS7vI3wbgGcDSJAtJagWwvX28HTgMoH3+UcD3+n0vSdLe6ydBvA/YmOTcJOcCVwMX9vLCJMvayoEkDweeA9xAkyhObXc7g+ZiPIDLeeAeE6cCn7X/IEmj1U+T+i3tLUaf2Q6d2cd9IJYD65PsQ5OULqmqv0tyPXBxkjcB1/BAwrkQ+NskW4DbgRf1GqckaTD6Xe57M81SG32pqq8DT+4y/m3g6V3Gfwz8Tr/vI0kanF7uSf2lqjo2yd00p6be/xTNGayesyhJM6iXO8od2/5+5PDDkSRNin6W+z6vql67pzEJvDhOmgX9nMX0nC5ji1l+QzPMi+Ok6ddLD+I/An8A/Noui/M9EvjysALT9PPiOGm69TLF9CHg08BfAK/rGL+7qm4fSlSSpLHrpUl9F81aSC9O8mjgCOBhAEmoqi8MN0RJ0jj006R+BXAOzZIY1wLH0KzFdPxwQtM06WxKg41paRb006Q+B3gasLWqnkVz4dudQ4lKU6ezKQ02pqVZ0M+V1D+uqh8nIcn+VfXNJI8fWmSaOjalpdnST4LY1i649wngiiR3AFuHE5Ykadx6ShBJAry6Xar73CQbaJbg/swwg5MkjU9PCaKqKsmngCe2258falSSpLHrp0n91SRPG1okkqSJ0k8P4mjgpUm2AvfwwGquvzmUyCRJY9VPgvg3Q4tCU8kF+aTZ1s8U0x9U1dbOH5o1mjSnXJBPmm39VBDPAXZd2vukLmOaI177IM2uvV3NNcAjcDXXueO0kjQ/XM1VfVmYVlq9fInTStKM63k11yRnAi8EVi28rl3N9Y1DjVATx2klaT7004P4BM2y35uBe4cTjiRpUvSTIFZU1YlDi0QTy76DNJ/6Oc31y0meOLRINLE8nVWaT/1UEMcCL0/yHZopJq+kniP2HaT500+COGloUUiSJk7PCaK9clpzwr6DpJ57EGm8LMl/b7dXJnn68ELTONl3kNTPFNO7gZ8DxwNvBO4GPkZzn2rNIPsO0nzra7nvqnpKkmsAquqOJPsNKS5J0pj1kyB+mmQfoACSLKOpKDQj7DtI6tTPdRDvAC4FHpPkz4Ev0azPpBlh30FSp37OYvpgks3ACTTXQLygqm4YWmQaC/sOkhb0cxbTeuCWqvrrqnoXcEuS9w4vNEnSOPUzxfSbVXXnwkZV3QE8efAhSZImQT9N6ockeXSbGEhyYK+vT3IYcBFwCE2Te11Vvb39Gx+hWUL8RuC09uyoAG8HTgZ+CLy8qr7aR6zqkY1pSbvTTwXxP4Grk/xZkjfR3E3uL3t87X3AH1XVauAY4JVJVtPcgOjKqjoCuJIHbkh0EnBE+3M2cH4fcaoPNqYl7U4/TeqLkmyiuVCugBdW1fU9vnYHsKN9fHeSG4BDgbXAce1u64HP0dzjei1wUVUVTVJammR5+3c0YDamJXXTT5N6f+AoYAlwEHDqwrIb/UiyiqZ3sRE4pONL/xaaKShoksfNHS/b1o7t+rfOTrIpyabbbrut31AkSQ+inymmy2j+ZX8fcE/HT8+SPIJmeY7XVNX3O59rq4Xq5+9V1bqqWlNVa5YtW9bPSyVJezCyO8oleShNcvhgVX28Hb51YeooyXJgZzu+HTis873bMQ2AjWlJvRjJHeXas5IuBG6oqrd0PHU5cEb7+AyaKmVh/PfaFWSPAe6y/zA4NqYl9WJUd5R7JvC7wHVJrm3H/gR4M3BJkrOArcBp7XOfojnFdQvNaa5n9hGnemBjWtKejOSOclX1JZqE0s0JXfYv4JV7+36SpMXzjnJzwr6DpH71U0GQ5EnAb7ebX6yqrw0+JA3DQt9h9fIl9h0k9aTnBJHkHOD3gYUzkD6QZF1VvXMokWng7DtI6kc/FcRZNHeVuwcgyXnAVYAJQpJmUD+nuQb4Wcf2z9h941mSNOX6qSDeB2xMcmm7/QKaaxs0oWxMS1qMPSaIJI+jWTPpLUk+R3M9BMCr8ermiWZjWtJi9FJBvA14PUB7T4avArRXVb8NeN7QotOi2ZiWtLd66UEcUlXX7TrYjq0aeESSpInQS4JY+iDPPXxQgUiSJksvU0ybkvx+Vf1N52CSVwCbhxOW9paNaUmD0kuCeA1waZKX8kBCWAPsB/zbYQWmvWNjWtKg7DFBVNWtwG8leRZwZDv8yar67FAj016zMS1pEPpZrG8DsGGIsWgvOa0kaRj6uZJaE8obAEkahr5Wc9Xk6FY1OK0kaZCsIKaUVYOkYbOCmGJWDZKGyQpCktSVFcQU8WwlSaNkBTFF7DtIGiUriClj30HSqFhBSJK6MkFIkrpyimnC2ZiWNC5WEBPOxrSkcbGCmAI2piWNgwliAjmtJGkSOMU0gZxWkjQJrCAmlNNKksbNBDEhnFaSNGmcYpoQTitJmjRWEBPEaSVJk8QEMUZOK0maZE4xjZHTSpIm2UgqiCTvBU4BdlbVke3YgcBHgFXAjcBpVXVHkgBvB04Gfgi8vKq+Ooo4x8FpJUmTalQVxPuBE3cZex1wZVUdAVzZbgOcBBzR/pwNnD+iGEfiQxtv4vQLruL0C666v3qQpEk0kgRRVV8Abt9leC2wvn28HnhBx/hF1bgaWJpk+SjiHAWnlSRNi3E2qQ+pqh3t41uAQ9rHhwI3d+y3rR3bwS6SnE1TZbBy5crhRTpgTitJmgYTcRZTVVWS2ovXrQPWAaxZs6bv14+KZytJmkbjPIvp1oWpo/b3znZ8O3BYx34r2rGp5bSSpGk0zgricuAM4M3t78s6xv8wycXA0cBdHVNRU8tpJUnTZlSnuX4YOA44OMk24A00ieGSJGcBW4HT2t0/RXOK6xaa01zPHEWMg+a0kqRpN5IEUVUv3s1TJ3TZt4BXDjei4VuYVlq9fInTSpKm0kQ0qWeV00qSpplLbUiSurKCGCD7DpJmiRXEAHk6q6RZYgWxSN2qBvsOkmaBFcQiWTVImlVWEH3qrBjAqkHS7LKC6FNnxQBWDZJmlxXEXrBikDQPTBA98PRVSfPIKaYe2IiWNI+sIDrs2oBeYCNa0jyyguiwawN6gVWDpHlkBbELKwVJasx9grABLUndzf0U02XXbmfjd24HnEqSpE5zX0GsfuwSVj92CW943hPGHYokTZS5TxAmBknqbu6nmCRJ3ZkgJEldmSAkSV2ZICRJXZkgJEldmSAkSV2ZICRJXZkgJEldparGHcNAJLkN2LqXLz8Y+O4Aw5kGfub54GeeD4v5zP+iqpZ1e2JmEsRiJNlUVWvGHcco+Znng595PgzrMzvFJEnqygQhSerKBNFYN+4AxsDPPB/8zPNhKJ/ZHoQkqSsrCElSVyYISVJXc58gkpyY5FtJtiR53bjjGYYkhyXZkOT6JN9Ick47fmCSK5L8U/v70eOOdZCS7JPkmiR/124fnmRje6w/kmS/ccc4SEmWJvlokm8muSHJM+bgGP+n9r/pf0zy4SQPm7XjnOS9SXYm+ceOsa7HNY13tJ/960mespj3nusEkWQf4K+Bk4DVwIuTrB5vVENxH/BHVbUaOAZ4Zfs5XwdcWVVHAFe227PkHOCGju3zgLdW1eOAO4CzxhLV8Lwd+ExV/QbwJJrPPrPHOMmhwKuBNVV1JLAP8CJm7zi/Hzhxl7HdHdeTgCPan7OB8xfzxnOdIICnA1uq6ttV9RPgYmDtmGMauKraUVVfbR/fTfPFcSjNZ13f7rYeeMF4Ihy8JCuA5wLvabcDHA98tN1l1j7vo4B/BVwIUFU/qao7meFj3NoXeHiSfYFfAXYwY8e5qr4A3L7L8O6O61rgompcDSxNsnxv33veE8ShwM0d29vasZmVZBXwZGAjcEhV7WifugU4ZExhDcPbgD8Gft5uHwTcWVX3tduzdqwPB24D3tdOq70nyQHM8DGuqu3AXwE30SSGu4DNzPZxXrC74zrQ77R5TxBzJckjgI8Br6mq73c+V835zjNxznOSU4CdVbV53LGM0L7AU4Dzq+rJwD3sMp00S8cYoJ13X0uTHB8LHMAvT8XMvGEe13lPENuBwzq2V7RjMyfJQ2mSwwer6uPt8K0L5Wf7e+e44huwZwLPT3IjzbTh8TTz80vbqQiYvWO9DdhWVRvb7Y/SJIxZPcYAzwa+U1W3VdVPgY/THPtZPs4LdndcB/qdNu8J4ivAEe1ZD/vRNLguH3NMA9fOv18I3FBVb+l46nLgjPbxGcBlo45tGKrq9VW1oqpW0RzTz1bVS4ENwKntbjPzeQGq6hbg5iSPb4dOAK5nRo9x6ybgmCS/0v43vvCZZ/Y4d9jdcb0c+L32bKZjgLs6pqL6NvdXUic5mWa+eh/gvVX152MOaeCSHAt8EbiOB+bk/4SmD3EJsJJmqfTTqmrXZthUS3Ic8F+q6pQkv0ZTURwIXAO8rKruHWd8g5TkKJqm/H7At4Ezaf4ROLPHOMmfAqfTnKl3DfAKmjn3mTnOST4MHEezpPetwBuAT9DluLaJ8l00U20/BM6sqk17/d7zniAkSd3N+xSTJGk3TBCSpK5MEJKkrkwQkqSuTBCSpK5MEFKfkhyU5Nr255Yk29vHP0jy7nHHJw2Kp7lKi5DkXOAHVfVX445FGjQrCGlAkhzXce+Jc5OsT/LFJFuTvDDJ/0hyXZLPtEufkOSpST6fZHOS/7OYlTelQTNBSMPz6zTrQD0f+ACwoaqeCPwIeG6bJN4JnFpVTwXeC8zclfyaXvvueRdJe+nTVfXTJNfRLOXymXb8OmAV8HjgSOCKZoUE9qFZtlqaCCYIaXjuBaiqnyf5aT3Q8Ps5zf97Ab5RVc8YV4DSg3GKSRqfbwHLkjwDmiXZkzxhzDFJ9zNBSGPS3ub2VOC8JF8DrgV+a7xRSQ/wNFdJUldWEJKkrkwQkqSuTBCSpK5MEJKkrkwQkqSuTBCSpK5MEJKkrv4/rlfX08Vi+jgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] @@ -59,13 +59,13 @@ } ], "source": [ - "n_0 = 1\n", + "n_0 = 50\n", "model = pints.toy.StochasticLogisticModel(n_0)\n", "\n", "times = np.linspace(0, 100, 101)\n", "\n", - "# $b_0$ = 0.1, $k$ = 50\n", - "params = [0.1, 50]\n", + "# $b_0$ = 0.1, $k$ = 500\n", + "params = [0.1, 500]\n", "\n", "values = model.simulate(params, times)\n", "\n", @@ -89,7 +89,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -132,7 +132,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAD4CAYAAAD1jb0+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dd3hUVfrA8e9JIZ2EhBBKKAkgGEJPqIqISBEBF3VXioCAgG1R14Kurj9sa2HtLthYVJqIFAVUiiCKQgg1IaETICGNkkrazJzfHzMgCCEJmcmUvJ/nmWfm3nvuve/lDu9zcubcc5TWGiGEEM7Hzd4BCCGEuDaSwIUQwklJAhdCCCclCVwIIZyUJHAhhHBSHjV5svr16+sWLVrU5CmFEMLpbd++/ZTWOvTP62s0gbdo0YL4+PiaPKUQQjg9pdSxK62XJhQhhHBSksCFEMJJSQIXQggnVaNt4FdSVlZGamoqxcXF9g5FOAhvb2/Cw8Px9PS0dyhCODS7J/DU1FQCAgJo0aIFSil7hyPsTGvN6dOnSU1NJSIiwt7hCOHQKtWEopRKUUolKKV2KaXiLeuClVJrlVIHLe/1riWA4uJiQkJCJHkLAJRShISEyF9kQlRCVdrAb9Zad9Jax1iWpwPrtdatgfWW5WsiyVtcTL4PQlROdZpQhgN9LZ8/BzYCT1czHiGEsA+TCQzF5pexFAwlYCwDY4l52Vhmeb/4c5n5ZTKA6fxno/mzyWB5Gc3v3R8AvxCrhlzZBK6BNUopDXyktf4YCNNap1u2ZwBhV9pRKTUZmAzQrFmzaoYrhKj1jAYoyYPiXPN7Sf6lr9ICKC20vAqg9ByUnX8VXfReDIYic6I+n7RtRblB+7vtlsBv0FqnKaUaAGuVUvsu3qi11pbkfhlLsv8YICYmRmaPEEL8wWSCojNQkAkFWVB4Cs6dgnOnLa8z5vfiHCiyvErzK3dsTz+o4wt1/P747OkD3o3Aw9v8+cK7F3icf/cC9zqWdy/wqGNedvO89LO7p/mzuye4eZhfF38+v6zcwc02PbYrlcC11mmW9yyl1DKgG5CplGqktU5XSjUCsmwSoZOZMGECK1eupEGDBiQmJl5Y/8MPPzBt2jSMRiOTJk1i+vTpFW672j5CODyTEfLTIecE5J6AvDTITYO8k+b1BZnml8lw+b7KDXzqgW8I+ARD3XAIaw8+QeAdaH551bW8B1hedcHL/4+EbaOkecVLNWlOF5aSnlPEyZwi0nJyycgt4nRhKWcsr4/u7UqjQB+rnrfCBK6U8gPctNb5ls8DgBeBb4FxwGuW9xVWjcxJjR8/nocffpixY8deWGc0GnnooYdYu3Yt4eHhxMbGMmzYMKKiosrd1qZNm3L3EcJhGA2QcwxOH/rjdTbF/Mo5fnly9g6Euk0goBE0iIKAMPAPA79Q8G9gfvetb07eNZiAr+Z8cj6ZU0Tq2SLScs5xMqeYzLxisvJLyMgtJiu/mDLjpQ0MXh5u1Pf3ItivDvX86mAwWr8BojI18DBgmaVngAewQGv9g1JqG7BYKTUROAb81erR1aARI0YQFRXFpk2bSElJYc6cOfTv37/Kx+nTpw8pKSmXrIuLi6NVq1ZERkYCcM8997BixQqioqLK3da3b99y9xGixmltTtSZe82vrCTI3m9O2Be3HXsHQXAENOoEUcMhqBkENoOgpubE7eVvv2u4CpNJczK3iMPZhRzNLuDoqUKOnCrk+JlzpOcUU2o0XVLe38uDsLpehNX1pltEMA0DvWkU6E3Dut40DvKhSZAPQb6eNu9RVWEC11ofATpeYf1p4BZrBjPju70kncyz5iGJalyXF4a2q7BcQkICvXr1YtOmTSxbtoz58+dfksBvvPFG8vMvb3ubOXNmhYk+LS2Npk2bXlgODw9n69atV912tX2EsCmtzbXntHhI2wHpuyF9D5TkWgooqNcCQttC6wFQ/zqo3xpCWoFvsD0jr1BBiYGj2YUcOVXA4awCDp8q5Eh2IUdPFVBc9keSDvDyIDLUjw7hQQxqZ07OjYN8CK/nS5N6PgT6OMZTwnZ/EtMRnDt3jtzcXB577DHA/Hh/UFDQJWV++eUXe4QmhO0ZDZCxG479Dsd/hxNxUGj5ScvdCxpGQ/s7oVFHCIs2J24HrUmfp7Um9WwRSel5JJ3MY+/JPJLT80jLKbpQxk1BeD1fWob60atlCC1D/YkM9SMy1I9Qfy+neB7BoRJ4ZWrKtpCUlETXrl1xd3cHYM+ePURHR19Spjo18CZNmnDixIkLy6mpqTRp0uSq2662jxDVojVkJcORDXB0E6Rs/qNnR70W0LIfhMdAeCyEtTP3pHBgBSUGktPz2JeRz/6MPPZn5LMvI5/8YnP7u5uCyFB/ujavx6juzYis70dkqD/NQ3zx9nS3c/TV41AJ3F4SEhLo1KnTheU9e/YwfPjwS8pUpwYeGxvLwYMHOXr0KE2aNGHRokUsWLDgqtvatGlT7j5CVFnpOXPCPvAjHFoPeanm9SGtoMPd0OIGaNYL6jayb5wVKDEYSTqZx87jOexOzSEhLZejpwrRlt8HA7w8aNMwgOGdGhPVKJDrGwXQpmEAvnVcM9W55lVVUUJCAt27d7+wnJiYeFkNvLJGjhzJxo0bOXXqFOHh4cyYMYOJEyfywQcfMHDgQIxGIxMmTKBdO/NfGx4eHuVuK2+9EJVSnAv7v4fk78xJ21AEdQKgZV+46SlodQsEhts7ynJprTmcXcjWo6fZcyKXxJO5HMjMv9Dbo2FdbzqEBzK8YxPaNa5LVOO6NAr0doqmD2tRWtfcszUxMTH6z1OqJScnc/3119dYDMI5yPfiGpUVw4HvIWEJHFxrfgy8bhNocxu0HQLNe5sfRnFAxWVGEtNy2XUih10ncth69AzZ+SUA1PP1JLpJIO0aB9KpaSCdmtajYaC3nSOuOUqp7ReNQ3WB1MCFcHZam3uL7JoHid+Ya97+DSFmAkTfaW7PdtBa6dnCUtYmZfLD3gx+PXjqQne9RoHe9IwMoWfLEHpEhtAixLdW1awrSxK4EM6qpAASvob4OZCxx/wo+PVDodMoiOgDbo73A12Z0UTc0TP8eugUvx06RUJaLiYNTYJ8GNOjOT0ig+nYNIiwurWndl0dksCFcDY5x2HrR7DjC/NgTmHRMOQ/5sGSvAPtHd1lzpUa+PXgKX7Ym8G6pEzyig14uCk6NQ3i4X6tufX6MKKb1JUa9jWQBC6Es8hIgF/fhr3Lzcvt7oDuU83d/Rws+WXmFfNDYgbr92Wx5chpSg0m6np70D8qjEHtGtKrVX38vST9VJf8Cwrh6FK3w6Y3zT9O1gmAng9Ctynmx9MdSO65MlYlpPPt7jS2Hj2D1hBZ348x3Ztzc9tQukeEUMfDMcY3cRWSwIVwVJl74aeXYf9q8+BOfZ+F7pPNnx2EwWhi4/5slu5MZV1SFqVGE5H1/fh7v9YM7diYVg0c+4lNZycJHHB3d6d9+/aUlZXh4eHB2LFjeeyxx3C7ymhoKSkp/Pbbb4waNcomMc2ePRtfX99LRjX8s/j4eL744gvee++9SsVYUXnhIHJTYf2LsGexeYjUfs+Zm0q8Auwd2QWZecUsjDvOwrjjZOaVEOJXh9E9mjGic7i0Z9cgSeCAj48Pu3btAiArK4tRo0aRl5fHjBkzyt0nJSWFBQsWVCmBGwwGPDwq908+derUCsvExMQQE3NZ19ByY6yovLCz0kLY/C5sfg/Q0Hua+eUgA0SZTJpfDp1i4dbjrEvOxKg1N10Xyst3NKdvm1A83aV5pMZprWvs1bVrV/1nSUlJl62raX5+fpcsHz58WAcHB2uTyaQNBoN+4okndExMjG7fvr2ePXu21lrr7t2767p16+qOHTvqt956q9xyGzZs0DfccIMeOnSobt26td6wYYPu06ePHjZsmI6IiNBPP/20njdvno6NjdXR0dH60KFDWmutX3jhBf3mm29qrbW+6aab9FNPPaVjY2N169at9aZNmy4ce8iQIVprrTdu3Kg7duyoO3bsqDt16qTz8vIui/Hi8vn5+Xr8+PE6Ojpat2/fXi9ZsuSyf5fmzZvr6dOn644dO+quXbvq7du36wEDBujIyEg9a9asC+XeeOONC9f9r3/968L64cOH6y5duuioqCj90UcfXfLv/eyzz+oOHTro7t2764yMjMvO7QjfixpjMmmduEzrmW21fqGu1l/fp/XZY/aO6oKcwlI9a+Mh3evf63Xzp1fqzi+u0a+uStIppwrsHVqtAcTrK+RUx6qBfz/d/Eu7NTVsD4Nfq9IukZGRGI1GsrKyWLFiBYGBgWzbto2SkhJ69+7NgAEDeO2115g5cyYrV64E4OOPP75iOYAdO3aQmJhIREQEGzduZPfu3SQnJxMcHExkZCSTJk0iLi6Od999l/fff5933nnnspgMBgNxcXGsXr2aGTNmsG7duku2z5w5kw8//JDevXtTUFCAt7f3ZTFu3LjxQvmXXnqJwMBAEhLM/95nz5694r9Fs2bN2LVrF4899hjjx49n8+bNFBcXEx0dzdSpU1mzZg0HDx4kLi4OrTXDhg1j06ZN9OnThzlz5hAcHExRURGxsbHceeedhISEUFhYSI8ePXjllVd46qmn+OSTT3juueeqdI9cxpmjsPpJOLQWGnaAu+dCs+4V7lYTUs+e49NfjrI4/gTnSo30iAzmmdvacmtUGF4ejtfHvDZyrATugNasWcOePXtYsmQJALm5uRw8eJA6depUuly3bt2IiIi4UDY2NpZGjcyDBrVs2fJCom/fvj0bNmy4YhwjRowAoGvXrpdNGAHQu3dvHn/8cUaPHs2IESMID7/6GBfr1q1j0aJFF5br1bvyD2PDhg27EFtBQQEBAQEEBATg5eVFTk4Oa9asYc2aNXTu3BmAgoICDh48SJ8+fXjvvfdYtmwZACdOnODgwYOEhIRQp04dbr/99gvXs3bt2qvG6pJMRtg6G9a/ZJ47cdBrEHs/uNv/v+Tx0+f478ZDLNmeilIwtGNjJt4QQbvGjtfHvLaz/7flYlWsKdvKkSNHcHd3p0GDBmitef/99xk4cOAlZS6uzQJXLefn53fJOi8vrwuf3dzcLiy7ublhMFxhfsCL9nF3d79imenTpzNkyBBWr15N7969+fHHHyt3sRW4OLY/x20wGNBa88wzzzBlypRL9tu4cSPr1q3j999/x9fXl759+1JcXAyAp+cfM5WUdz0u7fRhWP4gnNgC1w2C29+Guo3tHRWHsvKZtfEIK3al4eamGN29GVNuaknjIOvO4yisR351+JPs7GymTp3Kww8/jFKKgQMHMmvWLMrKygA4cOAAhYWFBAQEXDI+eHnlasrhw4dp3749Tz/9NLGxsezbt++yGC9266238uGHH15YLq8JpSIDBw5kzpw5FBQUAOYZhrKyssjNzaVevXr4+vqyb98+tmzZck3Hdylamx97n9UbspPhLx/ByEV2T967T+Qw+Yt4+r+1iVUJJxnTozmbnryZGcOjJXk7OMeqgdtJUVERnTp1utCN8N577+Xxxx8HYNKkSaSkpNClSxe01oSGhrJ8+XI6dOiAu7s7HTt2ZPz48UybNu2K5WrKO++8w4YNG3Bzc6Ndu3YMHjwYNze3S2I838wB8Nxzz/HQQw8RHR2Nu7s7L7zwwoVmmqoYMGAAycnJ9OzZEwB/f3/mzZvHoEGDmD17Ntdffz1t2rShR48eVrtWp3TuDHz7COxbaZ4wYfh/7T729u4TOby7/iA/7csi0MeTv9/SmvG9WhDs55ijFYrLyXCywiG51Pfi+Bb4+j4ozIb+/wc9HrTrjOsppwp5dXUya5IyCfL15P4bIxnXq4U82u7AZDhZIWqa1uYfKtc8B4FNYdI6aNyp4v1sJLeojA9+Osjc31Ko4+7G47dex329WxDg7dhTponySQIXwhZKC2HFw7B3KbQZAnf8F3yCKt7PBrTWLN2Rxr+/T+Z0YSl3dw3niQFtaCBDtjo9h0jgWmt59FZcUJPNejaRmwoL7zGPZXLLC9D7Ubs1mezLyONfy/cSl3KGzs2CmHtfN6KbSHdAV2H3BO7t7c3p06cJCQmRJC7QWnP69Gm8vZ20dnhiGywaBYZiGLUYWt9qlzDOFpby1toDzN96jEAfT16/sz13d22Km5v8H3Mldk/g4eHhpKamkp2dbe9QhIPw9vau8EEkh7R3GSydYu5dMu47aNC2xkMwGE3M23KMt9cdpKDEwL09mvNo/+uoJz1LXJLdE7inp+clTykK4ZS2zIYfpkPT7nDPAvALqfEQth45zQvf7mVfRj43tq7P87dHcV2Y44xgKKzP7glcCKdmMsG6F+C396Dt7XDnp+BZsw+/5J4rY8Z3e1m6M40mQT7MHtOVge3CpEmyFpAELsS1Mhnhu7/DznkQMxFue7PGJxL++UA2Ty/Zw6mCEh7p14oH+7bCp44MNFVbSAIX4loYy2DZFEj8Bvo8BTc/W6PzUhaXGXllVTJfbjlG6wb+fDouRnqX1EKSwIWoKkOJ+cnK/aug/wy44dEaPX3KqUIenL+DpPQ8Jt0QwRMD2+DtKbXu2kgSuBBVYSiBr+6Fgz/CbTOh2/01evqVe04y/ZsEPNwVc8bH0K9tWI2eXziWSidwpZQ7EA+kaa1vV0pFAIuAEGA7cK/WutQ2YQrhAAyl5pr3wR/NQ8DGTKixU58rNfDSyiQWxp2gc7MgPhjVhSYyUmCtV5XHw6YByRctvw68rbVuBZwFJlozMCEcirEMvplgbja5bWaNJu/k9DyGvv8ri7ad4IG+LVk8packbwFUMoErpcKBIcCnlmUF9AOWWIp8DtxhiwCFsDuTyTwBQ/J35plzaqjZRGvNl1uOMfzDzeQXG5g3sTtPD2orkweLCyrbhPIO8BRw/qmAECBHa31+KpVUoMmVdlRKTQYmg3l+RSGcitbww9OQsBj6PQ89HqiR0+YVl/HMNwmsSkinb5tQ/nN3R0L8vSreUdQqFSZwpdTtQJbWertSqm9VT6C1/hj4GMzjgVc5QiHs6efXIe5j6Pkw3PiPGjll0sk8ps7bTlpOEc8Mbsv9N0bKGCbiiipTA+8NDFNK3QZ4A3WBd4EgpZSHpRYeDqTZLkwh7GDbp7Dx39BpNAx4uUb6eS/fmcb0pXsI9PFk8ZQedG0ebPNzCudVYWOa1voZrXW41roFcA/wk9Z6NLABuMtSbBywwmZRClHT9n8Pq580Tzo89D2bJ2+D0cSM7/by6Fe76BAexMpHbpTkLSpUnX7gTwOLlFIvAzuBz6wTkhB2lrYDlkyAhh3grjngbtvHJfKKy3ho/g5+OXiK+3q34NnbrpcfKkWlVOmbqbXeCGy0fD4CdLN+SELY0dljsOBv4FffPJ53HT+bnu746XNM+HwbKacKef3O9vwtVn7oF5UnT2IKcV5JvnkmHWMJjF8JAbZ9ynH7sTPc/8V2TFrz5cTu9GxZ80PQCucmCVwIMI8s+M39kL0fxnwDoW1serrvdp/kH1/vpkmQD3PGxxJR37Y1feGaJIELAbD+RTjwvfkpy5Y32+w0Wmv+u/Ewb/64n9gW9fj43hiZLUdcM0ngQuxZDJvfMT8eHzvJZqcpM5p4fnkii7adYFjHxrxxVwcZRVBUiyRwUbul74FvH4HmvWHwGzbrLphfXMZDC3ay6UA2j/RrxeO3Xicz5ohqkwQuaq9zZ+CrMeATDHfPBXdPm5wmK7+YcXO2cSAzX3qaCKuSBC5qJ5MRlt4PeSfhvu/Bv4FNTpORW8yoT7aQkVfM/8bH0ue6UJucR9ROksBF7fTzG3BonXlc76axNjlFWk4Roz7ZwumCUr6Y0I2YFvJkpbAuSeCi9jm8wTxIVcdR0PU+m5zixJlzjPxkC7lFZXwxsRtdmtWzyXlE7SYJXNQu+RnmppPQNjBkpk1+tDyUlc/oT7dSXGZi/qTudAgPsvo5hABJ4KI2MRpgyUQoLYRxK23ymHxiWi5j58ThphRfTelB24Z1rX4OIc6TBC5qj01vwLFf4Y7Z0KCt1Q+/60QO9362lQAvD+bf30OerhQ2Jwlc1A4pm2HTm+Z2704jrX74Panm5F3Ptw4LJ/eQOStFjZAxK4XrKzoLSydDvRZw2xtWP3xiWi5jPt1KoI+nJG9Ro6QGLlyb1vDdNCjIgIlrwCug4n2qIOlkHmM+20qAtycL75fkLWqW1MCFa9v5JSStME9I3KSrVQ+9LyOP0Z9uwdfTnUWTe9A02NeqxxeiIpLAhes6cwS+nw4RfaDX36166IOZ+Yz+ZCt1PNxYcL8kb2EfksCFazIZYdlUcPOAO2aBm/W+6keyCxj5yVbc3BQL7+9BC+ltIuxE2sCFa9r8DpzYCiM+gcBwqx02I7eYez+LQ2vNosk9iAz1t9qxhagqqYEL15O+Gza8ClF3QPu7rXbYnHOljJ2zlZxzpcy9rxutGlj3B1Ehqkpq4MK1GErMTSe+IeaBqqz0qHxRqZGJn8eTcuocc++LpX14oFWOK0R1SAIXruXn1yEryTyjvK91Rv8rM5p4aMEOdhw/y4ejutCrVX2rHFeI6pImFOE60rbDr+9Ap9Fw3UCrHFJrzTNLE/hpXxYvDY/mtvaNrHJcIaxBErhwDWXFsPxB8A+Dga9a7bBv/LifJdtTmXZLa8b0aG614wphDdKEIlzDz69D9j4Y/Q34WGf41rmbjzJr42FGdW/Go/1bW+WYQliT1MCF8zu5Cza/C53HQOv+VjnkD4npzFiZxICoMF4aHi0TEAuHJAlcODdjGax4GPxCYcArVjlkfMoZpi3aReemQbw3sjPubpK8hWOSJhTh3Da/A5kJcM8CqzSdHM4uYNIX8TQJ8uHTcbF4e7pbIUghbENq4MJ5Ze0zT07cbgS0HVLtw2XnlzD+f3F4uCnm3teNYL86VghSCNuRGrhwTiYTfPsI1PGHwdUf47uwxMCEuds4lV/Kosk9aBYig1MJxycJXDin+M8gNQ7+8hH4h1brUAajiYcX7GDvyVw+GRtDx6YyCbFwDpLAhfPJTYN1MyDyZujwt2of7qWVSWzYn80rf4nmluvDrBCgEDWjwjZwpZS3UipOKbVbKbVXKTXDsj5CKbVVKXVIKfWVUkoaDEXN+P4pMBmsMtbJ4vgTfP77MSbdEMHo7vKgjnAulfkRswTop7XuCHQCBimlegCvA29rrVsBZ4GJtgtTCIukb2HfSug7HYIjqnWoXSdyeG5ZIje0qs/0wdafpV4IW6swgWuzAsuip+WlgX7AEsv6z4E7bBKhEOcV55lr32HtoedD1TpUVn4xU7/cTligF++P7IyHu3TIEs6nUt9apZS7UmoXkAWsBQ4DOVprg6VIKtCknH0nK6XilVLx2dnZ1ohZ1FY/vQz5GTD0XXD3vObDFJcZmfLldnKKSvloTAz1pLugcFKVSuBaa6PWuhMQDnQDKv33ptb6Y611jNY6JjS0er0FRC2WtgPiPobYSRB+7ZMTm0yafyzeza4TObzzt85ENa5rxSCFqFlV+rtRa50DbAB6AkFKqfO9WMKBNCvHJoSZ0QArHzWPNHjL89U61Jtr9rMqIZ1nB1/PoOiGVgpQCPuoTC+UUKVUkOWzD3ArkIw5kd9lKTYOWGGrIEUtt+0T8zRpg18D72ufCWdR3HFmbTzM6O7NmHRj9X4AFcIRVKYfeCPgc6WUO+aEv1hrvVIplQQsUkq9DOwEPrNhnKK2yjtpbvtudat5jstrtOlANv9cnkif60KZMaydjC4oXEKFCVxrvQfofIX1RzC3hwthOz88Y+7zfdub19znO+lkHg/O38F1YQH8d3QX6XEiXIZ8k4XjOrQOkpbDjU9cc5/vjNxiJszdhr+XB3PGx+DvJQ8fC9ch32bhmMqKYNUTENIaev/9mg5RVGpk0hfbKCgxsHhKTxoF+lg5SCHsSxK4cEy/vg1nj8LYFeDhVeXdtdY8sWQ3e0/m8dm4GOkuKFySNKEIx3P6sDmBR98FkX2v6RAfbjjEqj3pPD2oLf3aygBVwjVJAheORWtY/SR4eMPAa5sibc3eDGauOcAdnRozpU+klQMUwnFIAheOJflbOLwebn4WAqr+oM2hrAIeX7ybDuGBvHZnB+kuKFyaJHDhOEoKzN0Gw9pD7P1V3r2gxMCUL+Px8nBj9piuMp+lcHnyI6ZwHJvegLw0uOt/4F61r6bWmicW7ybl9Dm+nNiNxkHS40S4PqmBC8eQtQ9+/xA6j4Fm3au8++yfj/DD3gyeGdyWXi3r2yBAIRyPJHBhf1rD6ifMExT3n1Hl3X87dIo3f9zHkA6NmHiDjHEiag9pQhH2l/gNpPwCQ94Cv6rVntNzi3hk4U4iQ/15Q360FLWM1MCFfRXnwY//hMadoev4Ku1aajDx4PwdFJcZmT2mK37ymLyoZeQbL+zr59ehIBNGLgC3qvUaeWVVEjuP5/Df0V1o1cDfRgEK4bikBi7sJ3MvbJkFXcZCk6rNsnN+Nvn7b4zgtvaNbBSgEI5NEriwD63Ng1V5B0L//6vSrudnk+/dKoSnB8ls8qL2kiYUYR97FsPx32Doe+AbXOndzs8m36CuFx+MlLG9Re0mCVzUvOJcWPOcudmk872V3q3EYOTBeTvIKSpl6QO9ZTZ5UetJAhc1b8OrUJgNoxeDW+Vq0Fpr/rkskfhjZ/lglMwmLwRIG7ioael7IO5jiJlg7jpYSZ/8coQl21OZdktrbu/Q2IYBCuE8JIGLmmMywap/gE8w3PJ8pXdbn5zJv7/fx5D2jZh2S2sbBiiEc5EmFFFzds2H1DgY/l/wqVepXY6dLuTRRbto17guM+/uiJubPGkpxHlSAxc149wZWPcCNO0BHUdWapfiMiMPzt+Bm5ti9piu+NSR4WGFuJjUwEXNWP8iFOXAkP9U+ofLV1Yls/dkHp+OjSG8nq+NAxTC+UgNXNhe6nbYPhe6T4GG0ZXa5bvdJ/lyyzEm94mkf5TMaSnElUgCF7ZlMsKqx8A/DPo+U6ld9mfkM/2bPXRuFsSTA9vYOEAhnJc0oQjb2vYZpO+Gu+aAd8V9t88WljLpi234enkwa3RXPOVJSyHKJQlc2E5+Jvz0EkTeDO1GVFi8zGgeHjYzr6YlB6cAABMASURBVISvJvegYaB3DQQphPOS6o2wnTXPgaEYbpsJlZho4aWVSfx+5DSvjWhP52aV62YoRG0mCVzYxpGfIWEx9H4U6reqsPhX247zxe/mHy1HdAmvgQCFcH6SwIX1lRXDysegXgTc+HiFxXccP8vzy/dyY+v6MjysEFUgbeDC+n59G84chnuXgafPVYtm5RXzwLztNAz05v2RnXGXJy2FqLQKa+BKqaZKqQ1KqSSl1F6l1DTL+mCl1Fql1EHLuzRaCjh1EH59C6Lvgpb9rlq01GDigfk7yCsy8PHYrgT5yvCwQlRFZZpQDMA/tNZRQA/gIaVUFDAdWK+1bg2styyL2kxrWPU4ePjAwFcrLP7a9/vYfuwsb9zVgbYNZXhYIaqqwgSutU7XWu+wfM4HkoEmwHDgc0uxz4E7bBWkcBJ7voKjm6D/vyDg6k9Prk5IZ87mo4zv1YKhHWV4WCGuRZV+xFRKtQA6A1uBMK11umVTBnDF/7FKqclKqXilVHx2dnY1QhUOrfA0/PAMhHeDrhOuWvRIdgFPLdlDp6ZBPHvb9TUUoBCup9IJXCnlD3wDPKq1zrt4m9ZaA/pK+2mtP9Zax2itY0JDQ6sVrHBga/4JJXkw9N2rDlZVVGoeYdDTXfHh6C7U8ZCOUEJcq0r971FKeWJO3vO11kstqzOVUo0s2xsBWbYJUTi8wxtg90Jzn++wqHKLaa15Zuke9mfm8849nWkSdPUeKkKIq6tMLxQFfAYka63fumjTt8A4y+dxwArrhyccXlmRuc93cEvo8+RVi37+WwrLd53kH7dex03XyV9jQlRXZfqB9wbuBRKUUrss654FXgMWK6UmAseAv9omROHQNv4bzh6Fsd+CZ/ljl2xLOcPLq5Lpf30YD/at+MlMIUTFKkzgWutfgfKerrjFuuEIp3JyJ/z2PnQZC5E3lVssM6+YB+fvoGmwL2/9TaZFE8Ja5ElMcW2MZbDiEfBrALe+VG6xUoN5hMHCEgPzJnanrrdnDQYphGuTBC6uzeZ3ITMB7lkAPkHlFntx5V62HzvLh6O60KZhQA0GKITrkz5couqyD8DPr0O7v0DbIeUWWxx/gnlbjjPlpkiGdGhUgwEKUTtIAhdVYzLC8gegjh8MfqPcYntSc3hueSI3tKrPkwNkWjQhbEGaUETV/P4BpMXDnZ+Bf4MrFjlTWMoD83YQ6u/FeyM74yHToglhE5LAReVl74efXoG2t0P0nVcsYjCaeGThDrILSvhmai+C/WSEQSFsRapGonJMRlj+INTxhdvfLneKtJlrDrD50GleviOa9uGBNRykELWL1MBF5fz2XoVNJ9/uPsnsnw8zqnsz/hrTtIYDFKL2kRq4qFhGornpJGp4uU0nO46f5Ymvd9OtRTAvDC1/PBQhhPVIAhdXZyiBpZPBNxiGXLnpJPXsOSZ/EU+jQG9m39sVLw93OwQqRO0jTSji6ja8Cll7YdRi8Au5bHN+cRkT58ZTYjCxaHKs/GgpRA2SBC7Kd+x38xOXXcfDdQMv22w0af6+cCeHsgv4/L5utGrgX/MxClGLSROKuLKiHFh6P9RrAQNevmKRV1Yls2F/NjOGteOG1vVrNj4hhNTAxRWcn5w4Px0mrAGvy8cwmbflGHM2H2VC7wjG9GhuhyCFEFIDF5fbvQgSv4G+z0B418s2b9ifxQvf7qVf2wb8c4jMaSmEvUgCF5c6cwRWPwHNb4AbHrtsc9zRMzwwbzvXNwrg3Xs64S5jewthN5LAxR8MJfD1eHBzhxEfmd8vkpiWy8S522gc5MPn93UjQMb2FsKupA1c/GHN85C+2zzGd2D4JZuOnipk3Jw4Arw9+HJid0L8vewUpBDiPKmBC7OkbyHuI+jx4GVjfGflFzN2zlY08OWk7jKbvBAOQhK4gLMpsOJhaNwZ+s+4ZFN+cRn3/W8bp/JLmTM+lpah0tdbCEchTSi1XVkRLB5r/nzX/8DjjycpSw0mHpi3g30Z+Xw6LoZOTcufOk0IUfMkgdd2q58wt3uPXATBERdWl1nG9f710CnevKsDN7e58giEQgj7kSaU2mz757BzHvR5EtoMvrDaYDTx6KJd/Lg3kxeGRnG3DA0rhEOSBF5bpW03175b9jM/sGNhMJp4bPFuViWk89yQ67mvd8RVDiKEsCdJ4LVRfgYsGgP+DWHEpxf6extNmie+3s13u08yfXBbJt0YaedAhRBXI23gtU1ZMSwaDcW5MHHNhSFizyfv5btO8uTANky9qaWdAxVCVEQSeG2iNax8zDw12l+/hIbRgDl5P/n1bpbtTOOJAdfx0M2t7ByoEKIyJIHXJr+9B7sXQN9nIWoYYO5t8sTXu1mx6yT/uPU6Hu7X2s5BCiEqSxJ4bbF3Oaz9F7T7C9z0FADFZUYeWbiTtUmZPDWoDQ/2lZq3EM5EEnhtcCIOlk2Bpt3hjtmgFOdKDUz+Yju/HjrFi8PbMbZnC3tHKYSoIkngru7MEVh4D9RtDPcsBE9vzhSWct/cbSSk5jDz7o7c1TW84uMIIRxOhd0IlVJzlFJZSqnEi9YFK6XWKqUOWt7r2TZMcU3yM+HLEaBNMHoJ+IVw4sw57pr1G/vS85g9pqskbyGcWGX6gc8FBv1p3XRgvda6NbDesiwcSXEuzL8TCjJh1NcQ0pKkk3mMmPUbpwtLmT+pOwPaNbR3lEKIaqgwgWutNwFn/rR6OPC55fPnwB1WjktUR1kxLBwFWcnwty+haSzbj53hbx//joebYsnUnsS0CLZ3lEKIarrWNvAwrXW65XMGEGaleER1GUrNs+oc2wx3fgqt+vPrwVPc/0U8DQO9mSfjeQvhMqr9KL3WWgO6vO1KqclKqXilVHx2dnZ1TyeuxmiAbybCge9hyExofxc/7s1gwtxtNA/xZfGUnpK8hXAh15rAM5VSjQAs71nlFdRaf6y1jtFax4SGhl7j6USFTEZYNhmSv4VBr0HsJL7adpwH5m0nqnFdFk3uQWiATIMmhCu51gT+LTDO8nkcsMI64YhrYjTA8gcg8RvoPwPdfSofbjjE098kcEPrUBbc350g3zoVH0cI4VQqbANXSi0E+gL1lVKpwAvAa8BipdRE4BjwV1sGKa7CUApLJ0HSCuj3PCU9HuHF5YnM33qc4Z0a8+ZdHanjIYNOCuGKKkzgWuuR5Wy6xcqxiKoqKzb/YHngexj4Kqlt7+Oh2b+zOzWXKX0ieXpQW9zclL2jFELYiDyJ6axK8uGrMXBkIwz5Dz8HDmfa+79iMGpmj+nCoOhG9o5QCGFjksCdUUEWzL8LMhIxDf8vH57pxltL47iuQQCzxnQhUmaOF6JWkATubM4cMT8eX5BJ4Z3zmLY9lHXJBxjeqTH/HtEe3zpyS4WoLeR/uzM59jt8NRq0iZTbFzL+e03q2Wz+b2gU43q1QClp7xaiNpHuCc5i9yL4Yhh4B7Gu93wGLynmXKmRRZN7ML53hCRvIWohqYE7OpMRfnoZfn0LY/MbeaPus3y08izdWgTzwejONAjwtneEQgg7kQTuyM6dMT8af/gnTrcZyci0Ozmw/yyTbojg6cFt8XSXP6CEqM0kgTuqk7vgq3vRBRmsb/VPpiZEExrgxvxJ3endqr69oxNCOABJ4I5Ga9j6Eax9njKf+jzt/zpLE8MY3qkRLw6PJtDH094RCiEchCRwR1J4GlY8CAd+ICWkD3/LHEOZVzCzRkczuL08mCOEuJQkcEex/wf4bhqmc2f41G8Kr6b1YUBUQ14d0Z76/jKKoBDicpLA7a04F354BnbNJ9u3FRNLppGqWvP+yHbc3qGRdA8UQpRLEri9aA37VsLqpzAVZDLP425eOjOUwR2b8b+hUYRIrVsIUQFJ4PaQcwK+fwr2r+a4ZySPFL9AYWgn5t7TTnqYCCEqTRJ4TSorgt8+wPTLfzAYTfzHMJLFDOWBwW0Z3ytCxu0WQlSJJPCaoDUkLcf04/O45Z1grakbr5nGcGuvbmzo21JmyxFCXBNJ4LZ25GdMa/8Pt/QdHKI5/yp9jsadbmXegDYywbAQolokgdvKsd8xbvw37kd/Jov6zCybQnrz4Tw3JJroJoH2jk4I4QIkgVuT1nB0E2UbXsfzxGZyqcuHZWPY1/SvPHRrO3pGhki3QCGE1UgCtwZjGexdTtGmd/E5lcBZXY/Zhns5HvFXJt7cjudbhtg7QiGEC5IEXh35mZTFf44h7jN8ijI4aWrEXD0JOt7D2Bvb0joswN4RCiFcmCTwqjIZ0Ud+Jve3Ofgf/R5PbWCLMZpVvhNp2WsE/4htJr1KhBA1QhJ4ZWXtIyduAe57FhFQmgnajy/1AFJbjqRvr5682rI+bm7Svi2EqDmSwK/ClH2QzK2LcU9aSoNzhwjQil9MHdgZMpGG3f7CiE4RBPrK8K5CCPuQBH4xk5HiY/FkbFuGz+HvCStJoRGw3dSaVUFTqdNhBDfHdKCv9N8WQjiAWp/ADWdTObnrR0r2rSMsezN1Tbk01YrtXM/PDR7Gv8NwenbpRFc/adcWQjiWWpXAtdZkph4hM+EnTCm/0eDMNpoYTtAMOK0DiKvTlbzmN9Owy210vb4l3Tzc7R2yEEKUy6UT+LmCHFISt5B3aCue6dtpUriXhpyiIVCgfUiuE0Vi4+F4t+lHm4496R/ka++QhRCi0lwigWuTieyTR8k6tJPCE7vxzN5L/YL9hBvTiFIagHQVysmADhxvHENg25toHtWNWC9pFhFCOC+nSuCF+TlkHttPTmoyJRkHcD97mMDCozQpO04DVUQDS7l06pPh04rU+rfh26Ir4e160ahhM2RWSSGEK3GKBL71/bG0PP0z9ckh8qL12QST5dWUvfWGQP02+IVH06RtLI1CQiVZCyFcnlMkcFPdcI6YenMwqAV1QlsS2Pg6GkVGE1q3HqH2Dk4IIeykWglcKTUIeBdwBz7VWr9mlaj+pOe4V21xWCGEcGrXPIeXUsod+BAYDEQBI5VSUdYKTAghxNVVZxLGbsAhrfURrXUpsAgYbp2whBBCVKQ6CbwJcOKi5VTLuksopSYrpeKVUvHZ2dnVOJ0QQoiL2XwadK31x1rrGK11TGio/OQohBDWUp0EngY0vWg53LJOCCFEDahOAt8GtFZKRSil6gD3AN9aJywhhBAVueZuhFprg1LqYeBHzN0I52it91otMiGEEFdVrX7gWuvVwGorxSKEEKIKlNa65k6mVDZw7Bp3rw+csmI4zkCuuXaQa3Z91b3e5lrry3qB1GgCrw6lVLzWOsbecdQkuebaQa7Z9dnqem3ejVAIIYRtSAIXQggn5UwJ/GN7B2AHcs21g1yz67PJ9TpNG7gQQohLOVMNXAghxEUkgQshhJNyigSulBqklNqvlDqklJpu73isTSnVVCm1QSmVpJTaq5SaZlkfrJRaq5Q6aHmvZ+9YrU0p5a6U2qmUWmlZjlBKbbXc668swzS4DKVUkFJqiVJqn1IqWSnV09Xvs1LqMcv3OlEptVAp5e1q91kpNUcplaWUSrxo3RXvqzJ7z3Lte5RSXa71vA6fwGvJxBEG4B9a6yigB/CQ5RqnA+u11q2B9ZZlVzMNSL5o+XXgba11K+AsMNEuUdnOu8APWuu2QEfM1+6y91kp1QT4OxCjtY7GPOzGPbjefZ4LDPrTuvLu62CgteU1GZh1rSd1+AROLZg4QmudrrXeYfmcj/k/dRPM1/m5pdjnwB32idA2lFLhwBDgU8uyAvoBSyxFXOqalVKBQB/gMwCtdanWOgcXv8+Yh+zwUUp5AL5AOi52n7XWm4Azf1pd3n0dDnyhzbYAQUqpa5qH3RkSeKUmjnAVSqkWQGdgKxCmtU63bMoAwuwUlq28AzwFmCzLIUCO1tpgWXa1ex0BZAP/szQbfaqU8sOF77PWOg2YCRzHnLhzge249n0+r7z7arWc5gwJvNZQSvkD3wCPaq3zLt6mzf09XabPp1LqdiBLa73d3rHUIA+gCzBLa90ZKORPzSUueJ/rYa5xRgCNAT8ub2pweba6r86QwGvFxBFKKU/MyXu+1nqpZXXm+T+tLO9Z9orPBnoDw5RSKZibxfphbh8OsvypDa53r1OBVK31VsvyEswJ3ZXvc3/gqNY6W2tdBizFfO9d+T6fV959tVpOc4YE7vITR1jafj8DkrXWb1206VtgnOXzOGBFTcdmK1rrZ7TW4VrrFpjv6U9a69HABuAuSzFXu+YM4IRSqo1l1S1AEi58nzE3nfRQSvlavufnr9ll7/NFyruv3wJjLb1RegC5FzW1VI3W2uFfwG3AAeAw8E97x2OD67sB859Xe4BdltdtmNuE1wMHgXVAsL1jtdH19wVWWj5HAnHAIeBrwMve8Vn5WjsB8ZZ7vRyo5+r3GZgB7AMSgS8BL1e7z8BCzG38ZZj/0ppY3n0FFOaedYeBBMw9dK7pvPIovRBCOClnaEIRQghxBZLAhRDCSUkCF0IIJyUJXAghnJQkcCGEcFKSwIUQwklJAhdCCCf1/2rZ/Zn6+n/QAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -145,8 +145,10 @@ ], "source": [ "simulate_n(1000)\n", - "plt.plot(times, model.mean(params, times), label=\"Deterministic mean\")\n", + "plt.plot(times, model.mean(params, times), '--', label=\"Deterministic mean\")\n", "plt.legend()\n", + "plt.xlabel('Time')\n", + "plt.ylabel(r'Population ($C(t)$)')\n", "plt.show()" ] } diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index bebd5458f..59dd447ff 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -49,7 +49,7 @@ class StochasticLogisticModel(pints.ForwardModel, ToyModel): https://arxiv.org/abs/0704.1908v2 """ - def __init__(self, initial_molecule_count=2): + def __init__(self, initial_molecule_count=50): super(StochasticLogisticModel, self).__init__() self._n0 = float(initial_molecule_count) if self._n0 < 0: @@ -153,7 +153,7 @@ def variance(self, parameters, times): def suggested_parameters(self): """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ - return np.array([0.1, 50]) + return np.array([0.1, 500]) def suggested_times(self): """ See :meth:`pints.toy.ToyModel.suggested_times()`.""" From 384890dc56c4a93f6a85a385ed2619ae85b4f5fd Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Mon, 7 Dec 2020 12:59:47 +0800 Subject: [PATCH 25/30] Hide simulate_raw and interpolate_values --- pints/tests/test_toy_stochastic_logistic_model.py | 8 ++++---- pints/toy/_stochastic_logistic_model.py | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 73487f35c..c187c14f9 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -55,8 +55,8 @@ def test_simulate(self): model = pints.toy.StochasticLogisticModel(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]) + values = model._interpolate_values(time, raw_values, times, params) self.assertTrue(len(time), len(raw_values)) # Test output of Gillespie algorithm @@ -67,10 +67,10 @@ def test_simulate(self): # 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, + self.assertTrue(model._interpolate_values(time, raw_values, temp_time, params)[0] == 1) temp_time = np.array([np.random.uniform(time[1], time[2])]) - self.assertTrue(model.interpolate_values(time, raw_values, temp_time, + self.assertTrue(model._interpolate_values(time, raw_values, temp_time, params)[0] == 2) def test_mean_variance(self): diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 59dd447ff..6313a6976 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -1,5 +1,5 @@ # -# Stochastic degradation toy model. +# Stochastic logistic 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 @@ -59,7 +59,7 @@ def n_parameters(self): """ See :meth:`pints.ForwardModel.n_parameters()`. """ return 2 - def simulate_raw(self, parameters): + def _simulate_raw(self, parameters): """ Returns tuple (raw times, population sizes) when reactions occur. """ @@ -87,7 +87,7 @@ def simulate_raw(self, parameters): mol_count.append(a) return time, mol_count - def interpolate_values(self, time, pop_size, output_times, parameters): + 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. @@ -114,10 +114,10 @@ def simulate(self, parameters, times): return np.zeros(times.shape) # run Gillespie - time, pop_size = self.simulate_raw(parameters) + time, pop_size = self._simulate_raw(parameters) # interpolate - values = self.interpolate_values(time, pop_size, times, parameters) + values = self._interpolate_values(time, pop_size, times, parameters) return values def mean(self, parameters, times): From 78f0590e164976a808a65a84988993a3e5014f3e Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Mon, 7 Dec 2020 13:02:04 +0800 Subject: [PATCH 26/30] Fix style --- pints/tests/test_toy_stochastic_logistic_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index c187c14f9..3bde72e1e 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -68,10 +68,10 @@ def test_simulate(self): # 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) + params)[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) + params)[0] == 2) def test_mean_variance(self): # test mean From c68422da22adca9beeb1b87945d0d1810b20e514 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Mon, 7 Dec 2020 18:44:38 +0800 Subject: [PATCH 27/30] Change names, add comments to tests --- pints/tests/test_toy_logistic_model.py | 2 +- .../test_toy_stochastic_degradation_model.py | 2 +- .../tests/test_toy_stochastic_logistic_model.py | 16 +++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/pints/tests/test_toy_logistic_model.py b/pints/tests/test_toy_logistic_model.py index 11ae30630..0648048d5 100755 --- a/pints/tests/test_toy_logistic_model.py +++ b/pints/tests/test_toy_logistic_model.py @@ -12,7 +12,7 @@ import pints.toy -class TestLogistic(unittest.TestCase): +class TestLogisticModel(unittest.TestCase): """ Tests if the logistic (toy) model works. """ diff --git a/pints/tests/test_toy_stochastic_degradation_model.py b/pints/tests/test_toy_stochastic_degradation_model.py index a7262c90b..d5d34a5ba 100755 --- a/pints/tests/test_toy_stochastic_degradation_model.py +++ b/pints/tests/test_toy_stochastic_degradation_model.py @@ -13,7 +13,7 @@ from pints.toy import StochasticDegradationModel -class TestStochasticDegradation(unittest.TestCase): +class TestStochasticDegradationModel(unittest.TestCase): """ Tests if the stochastic degradation (toy) model works. """ diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 3bde72e1e..93e8f101a 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -12,15 +12,16 @@ import pints.toy -class TestStochasticLogistic(unittest.TestCase): +class TestStochasticLogisticModel(unittest.TestCase): """ Tests if the stochastic logistic growth (toy) model works. """ def test_start_with_zero(self): + # Test the special case where the initial population count is zero + # Set seed for random generator np.random.seed(1) - # Test the special case where the initial population count is zero model = pints.toy.StochasticLogisticModel(0) times = [0, 1, 2, 100, 1000] parameters = [0.1, 50] @@ -29,10 +30,11 @@ def test_start_with_zero(self): self.assertTrue(np.all(values == np.zeros(5))) def test_start_with_one(self): + # Run a small simulation and check it runs properly + # Set seed for random generator np.random.seed(1) - # Run small simulation model = pints.toy.StochasticLogisticModel(1) times = [0, 1, 2, 100, 1000] parameters = [0.1, 50] @@ -43,7 +45,7 @@ def test_start_with_one(self): self.assertTrue(np.all(values[1:] >= values[:-1])) def test_suggested(self): - np.random.seed(1) + # Check suggested values model = pints.toy.StochasticLogisticModel(1) times = model.suggested_times() parameters = model.suggested_parameters() @@ -51,6 +53,7 @@ def test_suggested(self): self.assertTrue(np.all(parameters > 0)) def test_simulate(self): + # Check each step in the simulation process np.random.seed(1) model = pints.toy.StochasticLogisticModel(1) times = np.linspace(0, 100, 101) @@ -74,15 +77,14 @@ def test_simulate(self): params)[0] == 2) def test_mean_variance(self): - # test mean - np.random.seed(1) + # Check the mean is what we expected model = pints.toy.StochasticLogisticModel(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))) def test_errors(self): - np.random.seed(1) + # Check the model is raising expected errors model = pints.toy.StochasticLogisticModel(1) times = np.linspace(0, 100, 101) From 988ae1151f968889f018b714515074cb81386ade Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Mon, 7 Dec 2020 19:55:04 +0800 Subject: [PATCH 28/30] Update docs --- pints/toy/_stochastic_logistic_model.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pints/toy/_stochastic_logistic_model.py b/pints/toy/_stochastic_logistic_model.py index 6313a6976..bf276e3f2 100644 --- a/pints/toy/_stochastic_logistic_model.py +++ b/pints/toy/_stochastic_logistic_model.py @@ -122,9 +122,12 @@ def simulate(self, parameters, times): def mean(self, parameters, times): r""" - Returns the deterministic mean of infinitely many stochastic - simulations, which follows: - :math:`\frac{kC(0)}{C(0) + (k - C(0)) \exp(-kt)}`. + Computes the deterministic mean of infinitely many stochastic + simulations with times :math:`t` and parameters (:math:`b`, :math:`k`), + which follows: + :math:`\frac{kC(0)}{C(0) + (k - C(0)) \exp(-bt)}`. + + Returns an array with the same length as `times`. """ parameters = np.asarray(parameters) if len(parameters) != self.n_parameters(): @@ -149,7 +152,7 @@ def variance(self, parameters, times): Returns the deterministic variance of infinitely many stochastic simulations. """ - raise NotImplementedError() + raise NotImplementedError def suggested_parameters(self): """ See :meth:`pints.toy.ToyModel.suggested_parameters()`. """ From 1c2607e31eb6a94df1385d9cd139515902940680 Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Tue, 15 Dec 2020 19:49:14 +0800 Subject: [PATCH 29/30] Move variance check around --- pints/tests/test_toy_stochastic_logistic_model.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 93e8f101a..9b1fa0c7c 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -83,6 +83,11 @@ def test_mean_variance(self): 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 isn't implemented + parameters_4 = [0.1, 50] + self.assertRaises(NotImplementedError, model.variance, + parameters_4, times) + def test_errors(self): # Check the model is raising expected errors model = pints.toy.StochasticLogisticModel(1) @@ -107,10 +112,6 @@ def test_errors(self): self.assertRaises(ValueError, model.simulate, parameters_3, times) self.assertRaises(ValueError, model.mean, parameters_3, times) - # model variance isn't implemented so we should throw a helpful error - parameters_4 = [0.1, 50] - self.assertRaises(NotImplementedError, model.variance, - parameters_4, times) # Initial value can't be negative self.assertRaises(ValueError, pints.toy.StochasticLogisticModel, -1) From af3262e66244b41ee4294c1b6649fda7a753c29a Mon Sep 17 00:00:00 2001 From: Chon Lok Lei Date: Tue, 15 Dec 2020 19:56:14 +0800 Subject: [PATCH 30/30] Rearrange tests --- .../test_toy_stochastic_logistic_model.py | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/pints/tests/test_toy_stochastic_logistic_model.py b/pints/tests/test_toy_stochastic_logistic_model.py index 9b1fa0c7c..67fc04025 100755 --- a/pints/tests/test_toy_stochastic_logistic_model.py +++ b/pints/tests/test_toy_stochastic_logistic_model.py @@ -76,46 +76,41 @@ def test_simulate(self): self.assertTrue(model._interpolate_values(time, raw_values, temp_time, params)[0] == 2) - def test_mean_variance(self): - # Check the mean is what we expected - model = pints.toy.StochasticLogisticModel(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 isn't implemented - parameters_4 = [0.1, 50] - self.assertRaises(NotImplementedError, model.variance, - parameters_4, times) - - def test_errors(self): - # Check the model is raising expected errors - model = pints.toy.StochasticLogisticModel(1) - times = np.linspace(0, 100, 101) - - # parameters, times cannot be negative - parameters = [-0.1, 50] - self.assertRaises(ValueError, model.simulate, parameters, times) - self.assertRaises(ValueError, model.mean, parameters, times) + # 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 = [0.1, -50] - self.assertRaises(ValueError, model.simulate, parameters, times) - self.assertRaises(ValueError, model.mean, parameters, 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) parameters_2 = [0.1, 50] self.assertRaises(ValueError, model.simulate, parameters_2, times_2) self.assertRaises(ValueError, model.mean, parameters_2, times_2) - # this model should have 2 parameters + # Check this model takes 2 parameters parameters_3 = [0.1] self.assertRaises(ValueError, model.simulate, parameters_3, times) self.assertRaises(ValueError, model.mean, parameters_3, times) - - # Initial value can't be negative + # Check initial value cannot be negative self.assertRaises(ValueError, pints.toy.StochasticLogisticModel, -1) + def test_mean_variance(self): + # Check the mean is what we expected + model = pints.toy.StochasticLogisticModel(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()