From 2d09b6de120c03e814efd09ba22a1b598e1631c7 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Fri, 10 Apr 2020 12:16:29 +0100 Subject: [PATCH 001/188] Negative Binomial and Gamma loss functions added --- notebooks/Loss function Calculations.ipynb | 658 +++++++ ...s functions fitted to simulated data.ipynb | 1613 +++++++++++++++++ pygom/loss/loss_type.py | 269 ++- pygom/loss/ode_loss.py | 40 +- pygom/utilR/distn.py | 100 + 5 files changed, 2675 insertions(+), 5 deletions(-) create mode 100644 notebooks/Loss function Calculations.ipynb create mode 100644 notebooks/Testing loss functions fitted to simulated data.ipynb diff --git a/notebooks/Loss function Calculations.ipynb b/notebooks/Loss function Calculations.ipynb new file mode 100644 index 00000000..3f46b706 --- /dev/null +++ b/notebooks/Loss function Calculations.ipynb @@ -0,0 +1,658 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Deriving derivative of loss class and testing markdown conversion for equation.#" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sympy as sym\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Negative binomial loss class ##" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1.1 Logliklihood function" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + " x, mu , k = sym.symbols('x mu k')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probability mass function (PMF) of negative binomial ${p}(x; \\mu,k) = \\frac{\\Gamma \\left(k+x\\right)}{\\Gamma \\left(k\\right)x!}(\\frac{k}{k+\\mu})^{k}(\\frac{\\mu}{k+\\mu})^{x}$ \n", + "This definition of the negative binomial distribution is often refered to as negative binomial 2. This parameterisation takes the mean (usually refered as $\\mu$, but in pygom $\\hat{y}$ as we are looking at a prediction) and $k$ (an overdispersion parameter). The variance = $\\mu+\\frac{\\mu^2}{k}$, some notation uses $\\alpha$, ($k=\\alpha^{-1}$). \n", + "See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\left(\\frac{k}{k + \\mu}\\right)^{k} \\left(\\frac{\\mu}{k + \\mu}\\right)^{x} \\Gamma\\left(k + x\\right)}{x! \\Gamma\\left(k\\right)}$" + ], + "text/plain": [ + "(k/(k + mu))**k*(mu/(k + mu))**x*gamma(k + x)/(factorial(x)*gamma(k))" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbpmf = (sym.gamma(k+x)/(sym.gamma(k)*sym.factorial(x)))*(k/(k+mu))**k*(mu/(k+mu))**x\n", + "nbpmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Due to the this PMF containing gamma functions and a factorial it is easier to calculate the sum of it's logged terms than to log it as one object (you end up with infinities otherwise). " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((k/(k + mu))**k, (mu/(k + mu))**x, 1/factorial(x), 1/gamma(k), gamma(k + x))" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbpmf.args" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle k \\left(\\log{\\left(k \\right)} - \\log{\\left(k + \\mu \\right)}\\right) + x \\left(\\log{\\left(\\mu \\right)} - \\log{\\left(k + \\mu \\right)}\\right) - \\log{\\left(x! \\right)} - \\log{\\left(\\Gamma\\left(k\\right) \\right)} + \\Gamma\\left(k + x\\right)$" + ], + "text/plain": [ + "k*(log(k) - log(k + mu)) + x*(log(mu) - log(k + mu)) - log(factorial(x)) - log(gamma(k)) + gamma(k + x)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logpmf_p1= k*(sym.ln(k)-sym.ln(k+mu))\n", + "logpmf_p2= x*(sym.ln(mu)-sym.ln(k+mu))\n", + "logpmf_p3= -sym.ln(sym.factorial(x))\n", + "logpmf_p4= -sym.ln(sym.gamma(k))\n", + "logpmf_p5= sym.gamma(k+x)\n", + "logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5\n", + "logpmf" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-log(factorial(x)),\n", + " -log(gamma(k)),\n", + " k*(log(k) - log(k + mu)),\n", + " x*(log(mu) - log(k + mu)),\n", + " gamma(k + x))" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logpmf.args" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.special import gammaln\n", + "def nb2logpmf(x, mu,k):\n", + " '''\n", + " The log probability mass function (pmf) of Negative Binomial 2 distribution. \n", + "\n", + " Parameters\n", + " ----------\n", + " x: array like observation.\n", + " mu: mean or prediction.\n", + " k: overdispersion parameter (variance = mean(1+mean/k)). Note some notation uses $\\alpha$, ($k=\\alpha^{-1}$).\n", + " See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press.\n", + "\n", + " Returns\n", + " -------\n", + " log pmf:\n", + " math:`\\\\mathcal\\\\ln({p}(x; \\\\mu,k)) = \\\\ln(\\\\frac{\\\\Gamma \\\\left(k+x\\\\right)}{\\\\Gamma \\\\left(k\\\\right)x!}(\\\\frac{k}{k+\\\\mu})^{k}(\\\\frac{\\\\mu}{k+\\\\mu})^{x})`\n", + "\n", + " '''\n", + " # note that we input k the overdispersion parameter here\n", + "\n", + "\n", + " logpmf_p1= -gammaln(x+1) \n", + " logpmf_p2= -gammaln(k)\n", + " logpmf_p3= k*(np.log(k) - np.log(k + mu)) \n", + " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", + " logpmf_p5= gammaln(k+x)\n", + " logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5\n", + " return logpmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our loss function is the negative of the logliklihood above." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "negloglikli=-logpmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1st derivative of -Loglikelihood of negative binomial loss with respect to $\\mu$." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{k \\left(\\mu - x\\right)}{\\mu \\left(k + \\mu\\right)}$" + ], + "text/plain": [ + "k*(mu - x)/(mu*(k + mu))" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbfirstderv= sym.diff(negloglikli,mu).simplify()\n", + "nbfirstderv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1st derivative of -Loglikelihood of negative binomial loss with respect to yhat: \n", + "$\\frac{k(\\mu-y)}{\\mu(k + \\mu)} $" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{k \\left(- \\mu \\left(k + \\mu\\right) + \\mu \\left(\\mu - x\\right) + \\left(k + \\mu\\right) \\left(\\mu - x\\right)\\right)}{\\mu^{2} \\left(k + \\mu\\right)^{2}}$" + ], + "text/plain": [ + "-k*(-mu*(k + mu) + mu*(mu - x) + (k + mu)*(mu - x))/(mu**2*(k + mu)**2)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbsecderv = sym.diff(nbfirstderv,mu).simplify()\n", + "nbsecderv.simplify()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2nd derivative of -Loglikelihood of negative binomial loss with respect to yhat: \n", + "$\\frac{k(\\mu(k + \\mu) + \\mu(y -\\mu) + (k + \\mu)(y - \\mu)}{\\mu^{2}(k + \\mu)^{2}} $" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(k, mu**(-2), (k + mu)**(-2), mu*(k + mu) - mu*(mu - x) - (k + mu)*(mu - x))" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbsecderv.args" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. Gamma loss class in terms of mean and shape" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + " a, s, x, mu= sym.symbols('a s x mu')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probability density function (PDF) of the gamma distribution is $\\frac{1}{s^a\\Gamma(a)}x^{a-1}e^{-x/s}$. However we need this in terms of mean (here $\\mu$), luckily we can subistitute in $s=\\frac{\\mu}{a}$ to get our likelihood function. But lets start with a log tranformation of the pdf.\n", + "\n", + "See Bolker, B. M. (2008). Gamma. In Ecological Models in R (pp. 131–133). Princeton University Press." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{s^{- a} x^{a - 1} e^{- \\frac{x}{s}}}{\\Gamma\\left(a\\right)}$" + ], + "text/plain": [ + "s**(-a)*x**(a - 1)*exp(-x/s)/gamma(a)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pdf_gamma = 1/(s**a*sym.gamma(a))*(x**(a-1)*sym.E**(-x/s))\n", + "pdf_gamma" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(s**(-a), x**(a - 1), 1/gamma(a), exp(-x/s))" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pdf_gamma.args" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - a \\log{\\left(s \\right)} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)} - \\frac{x}{s}$" + ], + "text/plain": [ + "-a*log(s) + (a - 1)*log(x) - log(gamma(a)) - x/s" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_pdf_gamma_p1 = -a*sym.ln(s)\n", + "log_pdf_gamma_p2 = (a-1)*sym.ln(x)\n", + "log_pdf_gamma_p3 = -sym.ln(sym.gamma(a))\n", + "log_pdf_gamma_p4 = -x/s\n", + "log_pdf_gamma= log_pdf_gamma_p1+log_pdf_gamma_p2+log_pdf_gamma_p3+log_pdf_gamma_p4\n", + "log_pdf_gamma" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - a \\log{\\left(\\frac{\\mu}{a} \\right)} - \\frac{a x}{\\mu} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}$" + ], + "text/plain": [ + "-a*log(mu/a) - a*x/mu + (a - 1)*log(x) - log(gamma(a))" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s_in_terms_mu_a = mu/a\n", + "log_pdf_mu_a_gamma = log_pdf_gamma.subs(s,s_in_terms_mu_a) \n", + "log_pdf_mu_a_gamma" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-log(gamma(a)), (a - 1)*log(x), -a*log(mu/a), -a*x/mu)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "log_pdf_mu_a_gamma.args" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- a \\log{\\left(\\frac{\\mu}{a} \\right)} - \\frac{a x}{\\mu} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}\n" + ] + } + ], + "source": [ + "sym.print_latex(log_pdf_mu_a_gamma)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.special import gamma, factorial, gammaln\n", + "def gamma_mu_shape_logpdf(x, mu,shape):\n", + " '''\n", + " The log probability density function (pdf) of gamma distrbution in terms of mean and shape. \n", + "\n", + " Parameters\n", + " ----------\n", + " x: array like observation.\n", + " mu: mean or prediction.\n", + " v: variance.\n", + " See Bolker, B. M. (2008). Gamma. In Ecological Models in R (pp. 131–133). Princeton University Press.\n", + "\n", + "\n", + " Returns\n", + " -------\n", + " log pdf, :math:`\\\\mathcal\\\\ln({p}(x; \\\\mu,a)) = - a \\log{\\left(\\frac{\\mu}{a} \\right)} - \\frac{a x}{\\mu} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}`\n", + "`\n", + "\n", + " '''\n", + "\n", + " logpdf_p1= -gammaln(shape)\n", + " logpdf_p2= (shape - 1)*np.log(x)\n", + " logpdf_p3= -shape*np.log(mu/shape)\n", + " logpdf_p4= -shape*x/mu\n", + " logpdf = logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4\n", + " return logpdf" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle a \\log{\\left(\\frac{\\mu}{a} \\right)} + \\frac{a x}{\\mu} - \\left(a - 1\\right) \\log{\\left(x \\right)} + \\log{\\left(\\Gamma\\left(a\\right) \\right)}$" + ], + "text/plain": [ + "a*log(mu/a) + a*x/mu - (a - 1)*log(x) + log(gamma(a))" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "negloglikli_gamma_mu_a = -log_pdf_mu_a_gamma\n", + "negloglikli_gamma_mu_a" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1st derivative of -Loglikelihood (gamma loss) with respect to $\\mu$." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a}{\\mu} - \\frac{a x}{\\mu^{2}}$" + ], + "text/plain": [ + "a/mu - a*x/mu**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a \\left(\\mu - x\\right)}{\\mu^{2}}$" + ], + "text/plain": [ + "a*(mu - x)/mu**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gammafirstderv= sym.diff(negloglikli_gamma_mu_a,mu)\n", + "display(gammafirstderv,gammafirstderv.simplify())" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\frac{a \\left(\\mu - x\\right)}{\\mu^{2}}\n" + ] + } + ], + "source": [ + "sym.print_latex(gammafirstderv.simplify())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2nd derivative of -Loglikelihood (gamma loss) with respect to $\\mu$.: " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a \\left(- \\mu + 2 x\\right)}{\\mu^{3}}$" + ], + "text/plain": [ + "a*(-mu + 2*x)/mu**3" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a \\left(- \\mu + 2 x\\right)}{\\mu^{3}}$" + ], + "text/plain": [ + "a*(-mu + 2*x)/mu**3" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "gammasecderv = sym.diff(gammafirstderv,mu).simplify()\n", + "display(gammasecderv,gammasecderv.simplify())" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\frac{a \\left(- \\mu + 2 x\\right)}{\\mu^{3}}\n" + ] + } + ], + "source": [ + "sym.print_latex(gammasecderv)" + ] + } + ], + "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.1" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/Testing loss functions fitted to simulated data.ipynb b/notebooks/Testing loss functions fitted to simulated data.ipynb new file mode 100644 index 00000000..c73591c1 --- /dev/null +++ b/notebooks/Testing loss functions fitted to simulated data.ipynb @@ -0,0 +1,1613 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Testing Negativ Binomail and Gamma loss Data fitting and parameter estimation within PyGOM\n", + "\n", + "This is an example of parameter fitting with an SIR model." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType, SimulateOde, SquareLoss, PoissonLoss, NormalLoss, NegBinomLoss, GammaLoss\n", + "import numpy as np\n", + "import scipy.integrate\n", + "import matplotlib.pyplot as plt\n", + "import copy\n", + "\n", + "from scipy.optimize import minimize" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Generate some data for fitting\n", + "\n", + "# Standard SIR model with 2 parameters\n", + "# construct model \n", + "states = ['S', 'I', 'R']\n", + "params = ['beta', 'gamma', 'N']\n", + "transitions = [Transition(origin='S', destination='I', equation='beta*S*I/N', \n", + " transition_type=TransitionType.T),\n", + " Transition(origin='I', destination='R', equation='gamma*I', \n", + " transition_type=TransitionType.T)]\n", + "model = SimulateOde(states, params, transition=transitions)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# initial conditions \n", + "N = 1e6\n", + "in_inf = 2\n", + "init_state = [N - in_inf, in_inf, 0.0]\n", + "# time \n", + "t = np.arange (0 , 51 , 0.25)\n", + "# deterministic parameter values\n", + "param_evals = [('beta', 3.6), ('gamma', 0.2), ('N', N)]\n", + "model.parameters = param_evals\n", + "model.initial_values = (init_state, t[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# run 1 simulations\n", + "data = model.integrate(t[1:])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Data over 100 days, with observations from every day for infected and removed populations." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(t,data[:,0], 'bo') # infected observations\n", + "plt.plot(t,data[:,1], 'ro') # infected observations\n", + "plt.plot(t,data[:,2], 'go') # removed observations (recoverd/died)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Adding random noise to produce Continuos Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our data needs to be have some noise so lets put it through a function for randomisation using the gamma distribution." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def runif_noise(x,noise_prop):\n", + " '''\n", + " Takes x and adds noise on the uniform distribution.\n", + " '''\n", + " i_len,j_len = x.shape\n", + " ans = copy.deepcopy(x)\n", + " for i in range(i_len):\n", + " for j in range(j_len):\n", + " ans[i,j]=x[i,j] + x[i,j]*np.random.uniform(low=-noise_prop,high=noise_prop,size=1)\n", + " \n", + " return ans" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([9.99998e+05, 2.00000e+00, 0.00000e+00])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[0,:]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":4: RuntimeWarning: invalid value encountered in true_divide\n", + " (noised_data-data)/data\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[ 0. , 0. , nan],\n", + " [-0.26594371, 0.0481614 , 0.14354852],\n", + " [ 0.18044689, -0.21459589, -0.23607263],\n", + " [-0.22631835, -0.25986512, 0.00977265],\n", + " [ 0.08317535, -0.24033984, -0.13717155],\n", + " [ 0.01893378, -0.30765339, -0.20936384],\n", + " [-0.1927195 , -0.20495292, 0.14883087],\n", + " [-0.31513136, 0.29092017, 0.20333613],\n", + " [-0.0144959 , -0.15434097, 0.15017585],\n", + " [-0.06943103, -0.04553612, 0.24527238],\n", + " [ 0.1423363 , -0.26289285, -0.27731679],\n", + " [ 0.22902387, -0.11970823, -0.0786823 ],\n", + " [ 0.24507763, 0.13939913, 0.19873885],\n", + " [ 0.0851626 , 0.33156697, -0.02946794],\n", + " [-0.18589297, 0.28048003, 0.15186529],\n", + " [ 0.10976604, -0.27140908, -0.29451267],\n", + " [-0.02481169, -0.01567338, 0.12217416],\n", + " [-0.00554871, -0.31163176, 0.09909475],\n", + " [ 0.20449806, -0.13271217, -0.21380146],\n", + " [ 0.23288222, -0.26931907, 0.17116807],\n", + " [-0.16775002, -0.08171666, 0.3285523 ],\n", + " [-0.13957109, -0.00980709, -0.0315168 ],\n", + " [ 0.06701958, 0.12872299, -0.03394576],\n", + " [-0.10946453, 0.20814074, -0.19773507],\n", + " [ 0.01024636, -0.18041067, -0.23682284],\n", + " [-0.07439538, 0.25262383, -0.17858645],\n", + " [ 0.29102576, 0.1511979 , -0.14440452],\n", + " [-0.11485163, 0.04940554, 0.06448306],\n", + " [ 0.10676958, 0.21332199, -0.10266298],\n", + " [ 0.05285174, 0.14572103, -0.30224747],\n", + " [ 0.21323456, -0.11097107, -0.09723039],\n", + " [-0.26727707, 0.18230789, -0.04970821],\n", + " [ 0.16396675, 0.30519932, 0.19783618],\n", + " [-0.29474402, 0.26031346, 0.15008278],\n", + " [ 0.1983954 , -0.09186773, 0.1033981 ],\n", + " [ 0.01819894, -0.30503091, -0.00801638],\n", + " [ 0.18546865, 0.17688293, 0.07902597],\n", + " [ 0.0076256 , -0.30361511, -0.15894734],\n", + " [-0.14879804, -0.19371648, -0.20285748],\n", + " [ 0.02042512, -0.03584361, 0.02819072],\n", + " [ 0.23491568, -0.06869137, -0.17772354],\n", + " [-0.06566397, -0.06776337, -0.12467524],\n", + " [-0.24064783, -0.02981388, -0.20090267],\n", + " [-0.2546167 , -0.09699615, 0.33171511],\n", + " [-0.28714369, -0.15456429, 0.17458153],\n", + " [ 0.30123993, 0.18002521, 0.1692988 ],\n", + " [ 0.02128767, -0.15262815, -0.32506278],\n", + " [ 0.33296938, 0.237988 , -0.30015583],\n", + " [-0.2934129 , 0.08130536, -0.09999738],\n", + " [-0.3235725 , 0.13686141, -0.2596026 ],\n", + " [ 0.15582601, -0.02119342, 0.0201688 ],\n", + " [-0.09663488, -0.00329313, -0.0186065 ],\n", + " [-0.13049885, -0.2873186 , 0.15998342],\n", + " [ 0.1820132 , 0.15728375, -0.17590421],\n", + " [ 0.32023337, -0.29931336, -0.07075369],\n", + " [-0.2687179 , 0.11859697, 0.19943461],\n", + " [-0.15646938, 0.32058394, 0.11942069],\n", + " [ 0.01135593, 0.20676602, -0.19312968],\n", + " [-0.12103279, 0.27442481, -0.06271944],\n", + " [ 0.16266687, 0.31851177, 0.00352883],\n", + " [-0.08580615, 0.18960581, 0.16840495],\n", + " [-0.08982207, 0.03192396, 0.1188008 ],\n", + " [-0.20494301, -0.01120558, 0.25235198],\n", + " [-0.1467698 , 0.22918715, -0.1282447 ],\n", + " [ 0.17906087, -0.10461238, 0.13495474],\n", + " [ 0.17601782, -0.03623687, -0.25142906],\n", + " [ 0.30978103, 0.00397469, 0.22194208],\n", + " [ 0.25752416, 0.1042392 , 0.25591297],\n", + " [-0.13772319, -0.11275306, 0.01176822],\n", + " [-0.1576899 , -0.07936526, -0.14969428],\n", + " [ 0.22779235, 0.15750085, -0.28242108],\n", + " [-0.0992169 , -0.24829993, -0.24564635],\n", + " [ 0.2802134 , -0.26679643, 0.14145995],\n", + " [-0.19666873, 0.10925674, -0.15420511],\n", + " [-0.15718523, -0.04667504, 0.10463 ],\n", + " [ 0.23934475, 0.23012487, 0.19921085],\n", + " [-0.05472834, -0.01380446, -0.2970063 ],\n", + " [ 0.10511899, -0.21625187, -0.00291365],\n", + " [-0.25868477, -0.10864835, -0.10815295],\n", + " [-0.0549668 , -0.26682451, 0.30208219],\n", + " [-0.2252228 , -0.28258864, 0.24447319],\n", + " [ 0.32262681, 0.24986113, -0.26776005],\n", + " [-0.28439645, 0.17894896, 0.04479451],\n", + " [ 0.23324145, 0.14693671, 0.03221976],\n", + " [ 0.19536078, 0.29770609, 0.28112025],\n", + " [ 0.26628981, -0.05904756, 0.25696101],\n", + " [ 0.26286499, -0.21866198, 0.25475143],\n", + " [-0.17818083, 0.21188372, 0.2483309 ],\n", + " [ 0.17844389, 0.08694361, 0.28079217],\n", + " [-0.2312997 , 0.06568179, 0.13610579],\n", + " [ 0.2905747 , -0.25361048, -0.05708808],\n", + " [ 0.22593571, 0.09708349, 0.07385119],\n", + " [ 0.01186936, -0.15807059, -0.08762729],\n", + " [-0.00639177, 0.0221159 , -0.03221789],\n", + " [-0.11634133, -0.23084855, -0.08819899],\n", + " [ 0.10440324, -0.2578205 , 0.04979053],\n", + " [ 0.19253324, 0.08374047, -0.32555527],\n", + " [-0.31328116, -0.31449333, -0.29090413],\n", + " [ 0.11266601, 0.02762068, 0.05099049],\n", + " [-0.009882 , 0.11925011, 0.29849163],\n", + " [ 0.07112188, -0.17385365, 0.06267588],\n", + " [-0.23180648, -0.02778307, -0.30315784],\n", + " [-0.10563222, 0.06910103, 0.2532015 ],\n", + " [ 0.07369744, 0.26329815, 0.15720732],\n", + " [ 0.12417477, 0.245335 , -0.04359579],\n", + " [-0.01950269, -0.22894254, 0.27712502],\n", + " [ 0.04573258, -0.04995886, 0.31596549],\n", + " [ 0.16523415, -0.17750199, -0.154256 ],\n", + " [-0.06935528, -0.11561912, -0.32852905],\n", + " [ 0.17573865, -0.16438354, 0.08092944],\n", + " [-0.14557532, -0.16221617, 0.20846123],\n", + " [-0.1530618 , 0.00607467, 0.1679275 ],\n", + " [ 0.2915459 , 0.03303514, 0.01665417],\n", + " [ 0.25416671, -0.13892646, -0.32628175],\n", + " [ 0.18898644, 0.21485992, -0.16411458],\n", + " [-0.31186503, -0.23293792, 0.24676476],\n", + " [ 0.01727794, -0.16295204, 0.29225053],\n", + " [-0.30057741, -0.19557768, 0.28403295],\n", + " [-0.08805621, -0.21801336, -0.14952844],\n", + " [ 0.17080778, -0.19999893, 0.10857179],\n", + " [-0.01016595, 0.03945573, -0.23341481],\n", + " [ 0.0889063 , -0.22661675, 0.27247754],\n", + " [-0.10284494, -0.21721198, -0.01215395],\n", + " [ 0.04750522, -0.05609498, -0.11760032],\n", + " [-0.12049032, 0.16369776, 0.22946754],\n", + " [-0.3259247 , 0.14942894, 0.01034819],\n", + " [ 0.30482666, 0.10876203, 0.18606517],\n", + " [-0.22421853, -0.1229635 , 0.31979197],\n", + " [-0.31666275, 0.18239926, -0.31941235],\n", + " [-0.15058556, 0.2803648 , 0.29741955],\n", + " [ 0.27943625, -0.31952391, -0.11504683],\n", + " [ 0.02835105, -0.15542857, -0.12654592],\n", + " [ 0.25274379, 0.06784749, -0.02814774],\n", + " [ 0.18619024, -0.15448604, -0.27449163],\n", + " [-0.19728779, 0.02537731, -0.00569949],\n", + " [-0.21443474, -0.01553967, 0.091896 ],\n", + " [-0.26827219, -0.05445831, -0.02413247],\n", + " [ 0.00827749, 0.1737784 , -0.02126288],\n", + " [ 0.23937747, 0.25076279, -0.00298444],\n", + " [-0.12216854, 0.29956893, 0.2265178 ],\n", + " [ 0.15886145, 0.1952358 , -0.10230103],\n", + " [-0.16707728, -0.11592906, 0.23063125],\n", + " [ 0.08048473, -0.28616788, 0.27649409],\n", + " [-0.2399056 , 0.17466809, 0.2670509 ],\n", + " [ 0.01100893, -0.22544906, 0.03502344],\n", + " [-0.24534992, -0.0282792 , 0.04012958],\n", + " [-0.32417314, 0.30503388, 0.07024417],\n", + " [-0.30165476, -0.03131702, -0.11390332],\n", + " [ 0.11602546, 0.17258092, 0.27320442],\n", + " [-0.01679539, 0.17988321, 0.07326227],\n", + " [ 0.32585914, -0.31318578, 0.21703063],\n", + " [-0.25118099, 0.08755176, 0.1418994 ],\n", + " [ 0.25308867, 0.27702219, -0.26432973],\n", + " [ 0.1694537 , 0.15167072, -0.24991087],\n", + " [ 0.32780948, -0.30710299, -0.16902237],\n", + " [ 0.25018489, -0.24231413, 0.03174931],\n", + " [ 0.05986629, 0.03359792, -0.30558626],\n", + " [-0.30815473, -0.11973154, 0.01174757],\n", + " [-0.13523555, -0.02621417, 0.18494329],\n", + " [ 0.19637621, -0.06536179, 0.16160518],\n", + " [ 0.16124011, 0.12639132, -0.02431527],\n", + " [ 0.19221785, 0.24196546, 0.00068597],\n", + " [ 0.08134284, 0.31422214, -0.20704816],\n", + " [ 0.1727692 , 0.02115635, -0.13793911],\n", + " [-0.28248369, 0.05719562, -0.09881328],\n", + " [-0.15519892, 0.30149671, 0.30585306],\n", + " [ 0.18343869, -0.18022277, 0.23596179],\n", + " [-0.09597099, 0.31572377, -0.02601189],\n", + " [-0.23722386, -0.20593368, -0.01834659],\n", + " [ 0.21902069, 0.24623962, -0.19736678],\n", + " [ 0.02226348, 0.21272945, -0.30751679],\n", + " [-0.24202336, -0.2567437 , 0.14965649],\n", + " [-0.25945811, 0.28880295, 0.33275319],\n", + " [ 0.28975049, 0.04492393, 0.24388337],\n", + " [-0.09991367, 0.11365879, -0.30462007],\n", + " [-0.33098441, -0.20249934, -0.32534145],\n", + " [-0.00702099, -0.2097019 , -0.11255923],\n", + " [ 0.23478388, 0.14543586, 0.32737759],\n", + " [-0.32148961, 0.03430904, -0.23725884],\n", + " [-0.15295436, -0.23766421, 0.16057446],\n", + " [ 0.24874516, 0.02814334, 0.05567249],\n", + " [ 0.18373544, 0.05456167, -0.00065203],\n", + " [ 0.29179694, -0.02776448, -0.27429118],\n", + " [ 0.19373542, -0.10868194, 0.10012632],\n", + " [-0.05908267, -0.20556755, -0.06223371],\n", + " [-0.08392523, -0.13577942, -0.14284998],\n", + " [ 0.10779361, 0.11329162, 0.17968936],\n", + " [-0.04555323, 0.22342669, 0.302655 ],\n", + " [ 0.31417606, 0.32366651, -0.24461707],\n", + " [ 0.25052832, 0.04730799, 0.0135891 ],\n", + " [ 0.24008863, 0.11260373, 0.10348191],\n", + " [ 0.26464085, -0.16812188, -0.23981266],\n", + " [-0.23031692, 0.25901614, 0.25404338],\n", + " [-0.08783901, 0.21082491, 0.09234899],\n", + " [-0.12828791, 0.23402825, -0.13942016],\n", + " [ 0.17317795, 0.06544127, -0.32470743],\n", + " [-0.01350832, -0.20846687, 0.06141013],\n", + " [ 0.08516377, -0.27381567, 0.19523863],\n", + " [-0.2885919 , 0.04913673, 0.27292814],\n", + " [-0.14942594, -0.11490962, -0.27067257],\n", + " [ 0.0428627 , 0.22205546, 0.16590721],\n", + " [ 0.16898513, -0.03668338, -0.06368085],\n", + " [ 0.30915912, -0.13559047, -0.05790722],\n", + " [ 0.28353642, -0.20041566, -0.00223925]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "noised_data = runif_noise(data,1/3)\n", + "#we stil want the first row from data\n", + "noised_data[0,:] = data[0,:]\n", + "(noised_data-data)/data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(t,noised_data[:,0], 'bo') # infected observations\n", + "plt.plot(t,noised_data[:,1], 'ro') # infected observations\n", + "plt.plot(t,noised_data[:,2], 'go') # removed observations (recoverd/died)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We provide a guess for $\\beta$ and $\\gamma$. \n", + "\n", + "This example assumes we have information about the infected and removed population, up to 50 days of the epidemic.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[4.90464096e+00, 1.80229297e-01],\n", + " [8.59843745e+00, 4.02088747e-01],\n", + " [1.89574734e+01, 1.40262775e+00],\n", + " [4.55221314e+01, 2.94002911e+00],\n", + " [9.70595088e+01, 6.42741549e+00],\n", + " [2.60715165e+02, 2.20294695e+01],\n", + " [9.89941096e+02, 5.41627913e+01],\n", + " [1.51549915e+03, 1.21234960e+02],\n", + " [3.99119374e+03, 3.06882053e+02],\n", + " [7.16646079e+03, 4.15491759e+02],\n", + " [1.97356855e+04, 1.23045676e+03],\n", + " [5.78166023e+04, 3.68388673e+03],\n", + " [1.46862042e+05, 6.72234947e+03],\n", + " [2.83221926e+05, 1.72384073e+04],\n", + " [2.82099064e+05, 2.11595297e+04],\n", + " [5.58399812e+05, 6.05232963e+04],\n", + " [4.82619234e+05, 9.44362098e+04],\n", + " [6.65765758e+05, 9.66241419e+04],\n", + " [5.72747123e+05, 1.89549046e+05],\n", + " [7.09146912e+05, 2.66809758e+05],\n", + " [7.40234990e+05, 2.31329292e+05],\n", + " [8.09839926e+05, 2.66144343e+05],\n", + " [8.28408036e+05, 2.49165951e+05],\n", + " [5.35922195e+05, 2.62582973e+05],\n", + " [7.80220803e+05, 3.08835399e+05],\n", + " [6.82617907e+05, 3.47689342e+05],\n", + " [5.92186788e+05, 4.63366922e+05],\n", + " [6.51475912e+05, 4.15308489e+05],\n", + " [5.85276935e+05, 3.41209635e+05],\n", + " [4.32046981e+05, 4.63958279e+05],\n", + " [5.46589709e+05, 5.10905271e+05],\n", + " [5.74001575e+05, 6.71000810e+05],\n", + " [5.27246397e+05, 6.68918229e+05],\n", + " [3.61392141e+05, 6.64278025e+05],\n", + " [2.63079400e+05, 6.16456105e+05],\n", + " [4.23783943e+05, 6.90468622e+05],\n", + " [2.38533388e+05, 5.52959981e+05],\n", + " [2.62709237e+05, 5.37407391e+05],\n", + " [2.98828587e+05, 7.09511325e+05],\n", + " [2.74571172e+05, 5.79847948e+05],\n", + " [2.61441068e+05, 6.29842262e+05],\n", + " [2.58814617e+05, 5.85922250e+05],\n", + " [2.29144409e+05, 9.93779854e+05],\n", + " [2.04073231e+05, 8.91056939e+05],\n", + " [2.70945802e+05, 9.00814781e+05],\n", + " [1.85076291e+05, 5.27522223e+05],\n", + " [2.57204604e+05, 5.54443973e+05],\n", + " [2.13695888e+05, 7.22136698e+05],\n", + " [2.13717852e+05, 6.01210232e+05],\n", + " [1.75031250e+05, 8.37740727e+05],\n", + " [1.69539766e+05, 8.14458217e+05],\n", + " [1.15314773e+05, 9.72293020e+05],\n", + " [1.78120848e+05, 6.97256650e+05],\n", + " [1.02585057e+05, 7.93198444e+05],\n", + " [1.55782711e+05, 1.03239372e+06],\n", + " [1.74943163e+05, 9.71126263e+05],\n", + " [1.52068538e+05, 7.05193833e+05],\n", + " [1.52762181e+05, 8.24930915e+05],\n", + " [1.50338761e+05, 8.89104794e+05],\n", + " [1.29025441e+05, 1.04167885e+06],\n", + " [1.06464615e+05, 1.00337291e+06],\n", + " [9.70395803e+04, 1.12944693e+06],\n", + " [1.14748290e+05, 7.90374269e+05],\n", + " [7.95105215e+04, 1.03417055e+06],\n", + " [8.14083834e+04, 6.85339633e+05],\n", + " [8.06690402e+04, 1.12375935e+06],\n", + " [8.43980836e+04, 1.15992224e+06],\n", + " [6.45058699e+04, 9.38209174e+05],\n", + " [6.36689048e+04, 7.91500558e+05],\n", + " [7.61459197e+04, 6.70373122e+05],\n", + " [4.70386884e+04, 7.07148873e+05],\n", + " [4.36435911e+04, 1.07351504e+06],\n", + " [6.28077554e+04, 7.97904695e+05],\n", + " [5.13460989e+04, 1.04513457e+06],\n", + " [6.30232768e+04, 1.13777135e+06],\n", + " [4.80618082e+04, 6.68733585e+05],\n", + " [3.63328010e+04, 9.50863634e+05],\n", + " [3.93058078e+04, 8.52519368e+05],\n", + " [3.07539481e+04, 1.24746471e+06],\n", + " [2.86250646e+04, 1.19481806e+06],\n", + " [4.74378807e+04, 7.04448109e+05],\n", + " [4.25641347e+04, 1.00707379e+06],\n", + " [3.93888722e+04, 9.96770546e+05],\n", + " [4.23931532e+04, 1.23926888e+06],\n", + " [2.92396611e+04, 1.21790150e+06],\n", + " [2.30955819e+04, 1.21766218e+06],\n", + " [3.40750253e+04, 1.21323104e+06],\n", + " [2.90715064e+04, 1.24653594e+06],\n", + " [2.71127364e+04, 1.10720133e+06],\n", + " [1.80632805e+04, 9.20092600e+05],\n", + " [2.52555051e+04, 1.04913048e+06],\n", + " [1.84364518e+04, 8.92393680e+05],\n", + " [2.12905604e+04, 9.47623291e+05],\n", + " [1.52399694e+04, 8.93734566e+05],\n", + " [1.39883494e+04, 1.03000441e+06],\n", + " [1.94297894e+04, 6.62352965e+05],\n", + " [1.16906798e+04, 6.97002881e+05],\n", + " [1.66704070e+04, 1.03394095e+06],\n", + " [1.72713306e+04, 1.27845437e+06],\n", + " [1.21266522e+04, 1.04707729e+06],\n", + " [1.35747674e+04, 6.87112352e+05],\n", + " [1.41995065e+04, 1.23655680e+06],\n", + " [1.59604690e+04, 1.14258717e+06],\n", + " [1.49661903e+04, 9.44910315e+05],\n", + " [8.81448811e+03, 1.26252531e+06],\n", + " [1.03308974e+04, 1.30165545e+06],\n", + " [8.50777068e+03, 8.36995757e+05],\n", + " [8.70172886e+03, 6.64864104e+05],\n", + " [7.82093131e+03, 1.07081249e+06],\n", + " [7.45879620e+03, 1.19770227e+06],\n", + " [8.52024863e+03, 1.15803653e+06],\n", + " [8.32189873e+03, 1.00846421e+06],\n", + " [6.59831222e+03, 6.68555612e+05],\n", + " [8.85531680e+03, 8.29792492e+05],\n", + " [5.31855548e+03, 1.23812008e+06],\n", + " [5.52075923e+03, 1.28372745e+06],\n", + " [5.04682049e+03, 1.27597711e+06],\n", + " [4.66679110e+03, 8.45396050e+05],\n", + " [4.54145355e+03, 1.10227862e+06],\n", + " [5.61300707e+03, 7.62445652e+05],\n", + " [3.97255243e+03, 1.26594133e+06],\n", + " [3.82476121e+03, 9.83019339e+05],\n", + " [4.38706165e+03, 8.78298467e+05],\n", + " [5.14482874e+03, 1.22403191e+06],\n", + " [4.83390522e+03, 1.00609917e+06],\n", + " [4.43546984e+03, 1.18132044e+06],\n", + " [3.33736908e+03, 1.31476977e+06],\n", + " [4.27992342e+03, 6.78124116e+05],\n", + " [4.40850014e+03, 1.29295231e+06],\n", + " [2.22871884e+03, 8.82054729e+05],\n", + " [2.63126192e+03, 8.70732818e+05],\n", + " [3.16462468e+03, 9.68972110e+05],\n", + " [2.38352132e+03, 7.23463131e+05],\n", + " [2.74958560e+03, 9.91634243e+05],\n", + " [2.51111756e+03, 1.08911082e+06],\n", + " [2.29421855e+03, 9.73499719e+05],\n", + " [2.70910290e+03, 9.76478163e+05],\n", + " [2.74599424e+03, 9.94826643e+05],\n", + " [2.71399644e+03, 1.22395635e+06],\n", + " [2.37437235e+03, 8.95915646e+05],\n", + " [1.67058137e+03, 1.22830577e+06],\n", + " [1.28310408e+03, 1.27419959e+06],\n", + " [2.00847418e+03, 1.26488445e+06],\n", + " [1.25975575e+03, 1.03334003e+06],\n", + " [1.50336053e+03, 1.03852036e+06],\n", + " [1.92056369e+03, 1.06866912e+06],\n", + " [1.35604430e+03, 8.84856232e+05],\n", + " [1.56142207e+03, 1.27150899e+06],\n", + " [1.49452022e+03, 1.07190279e+06],\n", + " [8.27536828e+02, 1.21556422e+06],\n", + " [1.24647414e+03, 1.14059062e+06],\n", + " [1.39224948e+03, 7.34868209e+05],\n", + " [1.19435169e+03, 7.49311234e+05],\n", + " [6.83530459e+02, 8.30157875e+05],\n", + " [7.10990264e+02, 1.03078113e+06],\n", + " [9.22595586e+02, 6.93793896e+05],\n", + " [7.47412178e+02, 1.01088851e+06],\n", + " [7.86491010e+02, 1.18398624e+06],\n", + " [7.18057337e+02, 1.16071273e+06],\n", + " [8.23171200e+02, 9.74971676e+05],\n", + " [8.63367455e+02, 9.99990314e+05],\n", + " [8.69040904e+02, 7.92427482e+05],\n", + " [6.42316325e+02, 8.61518628e+05],\n", + " [6.32553637e+02, 9.00647496e+05],\n", + " [7.40747779e+02, 1.30510982e+06],\n", + " [4.43821580e+02, 1.23529263e+06],\n", + " [6.77583106e+02, 9.73486505e+05],\n", + " [3.88991313e+02, 9.81172515e+05],\n", + " [5.80724252e+02, 8.02259191e+05],\n", + " [5.37548455e+02, 6.92176252e+05],\n", + " [3.13384546e+02, 1.14917174e+06],\n", + " [5.16905055e+02, 1.33221864e+06],\n", + " [3.98652245e+02, 1.24340879e+06],\n", + " [4.04154080e+02, 6.95127565e+05],\n", + " [2.75303132e+02, 6.74425641e+05],\n", + " [2.59511329e+02, 8.87149341e+05],\n", + " [3.57784433e+02, 1.32696295e+06],\n", + " [3.07316774e+02, 7.62514516e+05],\n", + " [2.15460438e+02, 1.16024642e+06],\n", + " [2.76414090e+02, 1.05538866e+06],\n", + " [2.69689336e+02, 9.99092387e+05],\n", + " [2.36509482e+02, 7.25532274e+05],\n", + " [2.06250526e+02, 1.09987173e+06],\n", + " [1.74865694e+02, 9.37559865e+05],\n", + " [1.80949557e+02, 8.56970535e+05],\n", + " [2.21731370e+02, 1.17945438e+06],\n", + " [2.31782922e+02, 1.30240818e+06],\n", + " [2.38543368e+02, 7.55246791e+05],\n", + " [1.79534727e+02, 1.01341533e+06],\n", + " [1.81426132e+02, 1.10330196e+06],\n", + " [1.29034045e+02, 7.60069418e+05],\n", + " [1.85763844e+02, 1.25385833e+06],\n", + " [1.69940356e+02, 1.09219566e+06],\n", + " [1.64750052e+02, 8.60464933e+05],\n", + " [1.35305439e+02, 6.75206798e+05],\n", + " [9.56181015e+01, 1.06128189e+06],\n", + " [8.34455489e+01, 1.19510127e+06],\n", + " [1.14676301e+02, 1.27278898e+06],\n", + " [9.20268352e+01, 7.29251586e+05],\n", + " [1.20865697e+02, 1.16579188e+06],\n", + " [9.06288530e+01, 9.36231050e+05],\n", + " [7.73574703e+01, 9.42008457e+05],\n", + " [6.80663206e+01, 9.97675798e+05]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_to_fit = noised_data[:,1:3]\n", + "data_to_fit = data_to_fit[1::,:]\n", + "data_to_fit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fitting Normal loss" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "param_evals" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "theta = [3, 0.15,1e6]\n", + "boxBounds = [(2,5),(0.0,1.0),(1e6,1e6)]\n", + "\n", + "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4209072260954.626" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\scipy\\optimize\\_minimize.py:521: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + " warn('Method %s cannot handle constraints nor bounds.' % method,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 3149715468391.5137\n", + " hess_inv: array([[ 1.02285673e-11, -3.28483610e-14, 3.23263121e-06],\n", + " [-3.28483423e-14, 5.00246087e-15, -3.92052034e-09],\n", + " [ 3.23263111e-06, -3.92052576e-09, 1.06428103e+00]])\n", + " jac: array([-1.89198473e+03, 2.05662437e+05, 6.51297284e-03])\n", + " message: 'Desired error not necessarily achieved due to precision loss.'\n", + " nfev: 74\n", + " nit: 10\n", + " njev: 62\n", + " status: 2\n", + " success: False\n", + " x: array([3.84976144e+00, 2.02859211e-01, 1.11835931e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='BFGS')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 3149715468391.6045\n", + " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", + " jac: array([ 2.80002429e+03, 1.18458645e+05, -9.63846812e-03])\n", + " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", + " nfev: 12\n", + " nit: 9\n", + " status: 0\n", + " success: True\n", + " x: array([3.44232967e+00, 2.02859211e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='L-BFGS-B')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 0.15, 1000000.0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[(2, 5), (0.0, 1.0), (1000000.0, 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(theta,boxBounds,param_evals)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fitting Gamma loss" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-1.17798986e+03, -1.40835509e+04, 3.53396958e-03])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.sensitivity()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5065.797364214306" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\scipy\\optimize\\_minimize.py:521: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + " warn('Method %s cannot handle constraints nor bounds.' % method,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 4716.804547726841\n", + " hess_inv: array([[ 1.93830562e-03, -1.55181618e-05, 1.36514445e-06],\n", + " [-1.55181618e-05, 1.96280251e-06, 1.90886878e-08],\n", + " [ 1.36514445e-06, 1.90886878e-08, 1.00000000e+00]])\n", + " jac: array([ 8.67860428e-08, -3.11402124e-06, -3.11981179e-13])\n", + " message: 'Optimization terminated successfully.'\n", + " nfev: 15\n", + " nit: 10\n", + " njev: 15\n", + " status: 0\n", + " success: True\n", + " x: array([3.59483138e+00, 1.99847237e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='BFGS')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", + " logpdf_p3= -shape*np.log(mu/shape)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 4716.804547726802\n", + " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", + " jac: array([-9.16923207e-05, -1.70890676e-03, 3.29618418e-10])\n", + " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", + " nfev: 15\n", + " nit: 10\n", + " status: 0\n", + " success: True\n", + " x: array([3.59483123e+00, 1.99847235e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='L-BFGS-B')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 0.15, 1000000.0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[(2, 5), (0.0, 1.0), (1000000.0, 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(theta,boxBounds,param_evals)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Adding random noise to produce Count Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our data needs to a be counts:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[5.000000e+00, 0.000000e+00],\n", + " [9.000000e+00, 0.000000e+00],\n", + " [1.900000e+01, 1.000000e+00],\n", + " [4.600000e+01, 3.000000e+00],\n", + " [9.700000e+01, 6.000000e+00],\n", + " [2.610000e+02, 2.200000e+01],\n", + " [9.900000e+02, 5.400000e+01],\n", + " [1.515000e+03, 1.210000e+02],\n", + " [3.991000e+03, 3.070000e+02],\n", + " [7.166000e+03, 4.150000e+02],\n", + " [1.973600e+04, 1.230000e+03],\n", + " [5.781700e+04, 3.684000e+03],\n", + " [1.468620e+05, 6.722000e+03],\n", + " [2.832220e+05, 1.723800e+04],\n", + " [2.820990e+05, 2.116000e+04],\n", + " [5.584000e+05, 6.052300e+04],\n", + " [4.826190e+05, 9.443600e+04],\n", + " [6.657660e+05, 9.662400e+04],\n", + " [5.727470e+05, 1.895490e+05],\n", + " [7.091470e+05, 2.668100e+05],\n", + " [7.402350e+05, 2.313290e+05],\n", + " [8.098400e+05, 2.661440e+05],\n", + " [8.284080e+05, 2.491660e+05],\n", + " [5.359220e+05, 2.625830e+05],\n", + " [7.802210e+05, 3.088350e+05],\n", + " [6.826180e+05, 3.476890e+05],\n", + " [5.921870e+05, 4.633670e+05],\n", + " [6.514760e+05, 4.153080e+05],\n", + " [5.852770e+05, 3.412100e+05],\n", + " [4.320470e+05, 4.639580e+05],\n", + " [5.465900e+05, 5.109050e+05],\n", + " [5.740020e+05, 6.710010e+05],\n", + " [5.272460e+05, 6.689180e+05],\n", + " [3.613920e+05, 6.642780e+05],\n", + " [2.630790e+05, 6.164560e+05],\n", + " [4.237840e+05, 6.904690e+05],\n", + " [2.385330e+05, 5.529600e+05],\n", + " [2.627090e+05, 5.374070e+05],\n", + " [2.988290e+05, 7.095110e+05],\n", + " [2.745710e+05, 5.798480e+05],\n", + " [2.614410e+05, 6.298420e+05],\n", + " [2.588150e+05, 5.859220e+05],\n", + " [2.291440e+05, 9.937800e+05],\n", + " [2.040730e+05, 8.910570e+05],\n", + " [2.709460e+05, 9.008150e+05],\n", + " [1.850760e+05, 5.275220e+05],\n", + " [2.572050e+05, 5.544440e+05],\n", + " [2.136960e+05, 7.221370e+05],\n", + " [2.137180e+05, 6.012100e+05],\n", + " [1.750310e+05, 8.377410e+05],\n", + " [1.695400e+05, 8.144580e+05],\n", + " [1.153150e+05, 9.722930e+05],\n", + " [1.781210e+05, 6.972570e+05],\n", + " [1.025850e+05, 7.931980e+05],\n", + " [1.557830e+05, 1.032394e+06],\n", + " [1.749430e+05, 9.711260e+05],\n", + " [1.520690e+05, 7.051940e+05],\n", + " [1.527620e+05, 8.249310e+05],\n", + " [1.503390e+05, 8.891050e+05],\n", + " [1.290250e+05, 1.041679e+06],\n", + " [1.064650e+05, 1.003373e+06],\n", + " [9.704000e+04, 1.129447e+06],\n", + " [1.147480e+05, 7.903740e+05],\n", + " [7.951100e+04, 1.034171e+06],\n", + " [8.140800e+04, 6.853400e+05],\n", + " [8.066900e+04, 1.123759e+06],\n", + " [8.439800e+04, 1.159922e+06],\n", + " [6.450600e+04, 9.382090e+05],\n", + " [6.366900e+04, 7.915010e+05],\n", + " [7.614600e+04, 6.703730e+05],\n", + " [4.703900e+04, 7.071490e+05],\n", + " [4.364400e+04, 1.073515e+06],\n", + " [6.280800e+04, 7.979050e+05],\n", + " [5.134600e+04, 1.045135e+06],\n", + " [6.302300e+04, 1.137771e+06],\n", + " [4.806200e+04, 6.687340e+05],\n", + " [3.633300e+04, 9.508640e+05],\n", + " [3.930600e+04, 8.525190e+05],\n", + " [3.075400e+04, 1.247465e+06],\n", + " [2.862500e+04, 1.194818e+06],\n", + " [4.743800e+04, 7.044480e+05],\n", + " [4.256400e+04, 1.007074e+06],\n", + " [3.938900e+04, 9.967710e+05],\n", + " [4.239300e+04, 1.239269e+06],\n", + " [2.924000e+04, 1.217901e+06],\n", + " [2.309600e+04, 1.217662e+06],\n", + " [3.407500e+04, 1.213231e+06],\n", + " [2.907200e+04, 1.246536e+06],\n", + " [2.711300e+04, 1.107201e+06],\n", + " [1.806300e+04, 9.200930e+05],\n", + " [2.525600e+04, 1.049130e+06],\n", + " [1.843600e+04, 8.923940e+05],\n", + " [2.129100e+04, 9.476230e+05],\n", + " [1.524000e+04, 8.937350e+05],\n", + " [1.398800e+04, 1.030004e+06],\n", + " [1.943000e+04, 6.623530e+05],\n", + " [1.169100e+04, 6.970030e+05],\n", + " [1.667000e+04, 1.033941e+06],\n", + " [1.727100e+04, 1.278454e+06],\n", + " [1.212700e+04, 1.047077e+06],\n", + " [1.357500e+04, 6.871120e+05],\n", + " [1.420000e+04, 1.236557e+06],\n", + " [1.596000e+04, 1.142587e+06],\n", + " [1.496600e+04, 9.449100e+05],\n", + " [8.814000e+03, 1.262525e+06],\n", + " [1.033100e+04, 1.301655e+06],\n", + " [8.508000e+03, 8.369960e+05],\n", + " [8.702000e+03, 6.648640e+05],\n", + " [7.821000e+03, 1.070812e+06],\n", + " [7.459000e+03, 1.197702e+06],\n", + " [8.520000e+03, 1.158037e+06],\n", + " [8.322000e+03, 1.008464e+06],\n", + " [6.598000e+03, 6.685560e+05],\n", + " [8.855000e+03, 8.297920e+05],\n", + " [5.319000e+03, 1.238120e+06],\n", + " [5.521000e+03, 1.283727e+06],\n", + " [5.047000e+03, 1.275977e+06],\n", + " [4.667000e+03, 8.453960e+05],\n", + " [4.541000e+03, 1.102279e+06],\n", + " [5.613000e+03, 7.624460e+05],\n", + " [3.973000e+03, 1.265941e+06],\n", + " [3.825000e+03, 9.830190e+05],\n", + " [4.387000e+03, 8.782980e+05],\n", + " [5.145000e+03, 1.224032e+06],\n", + " [4.834000e+03, 1.006099e+06],\n", + " [4.435000e+03, 1.181320e+06],\n", + " [3.337000e+03, 1.314770e+06],\n", + " [4.280000e+03, 6.781240e+05],\n", + " [4.409000e+03, 1.292952e+06],\n", + " [2.229000e+03, 8.820550e+05],\n", + " [2.631000e+03, 8.707330e+05],\n", + " [3.165000e+03, 9.689720e+05],\n", + " [2.384000e+03, 7.234630e+05],\n", + " [2.750000e+03, 9.916340e+05],\n", + " [2.511000e+03, 1.089111e+06],\n", + " [2.294000e+03, 9.735000e+05],\n", + " [2.709000e+03, 9.764780e+05],\n", + " [2.746000e+03, 9.948270e+05],\n", + " [2.714000e+03, 1.223956e+06],\n", + " [2.374000e+03, 8.959160e+05],\n", + " [1.671000e+03, 1.228306e+06],\n", + " [1.283000e+03, 1.274200e+06],\n", + " [2.008000e+03, 1.264884e+06],\n", + " [1.260000e+03, 1.033340e+06],\n", + " [1.503000e+03, 1.038520e+06],\n", + " [1.921000e+03, 1.068669e+06],\n", + " [1.356000e+03, 8.848560e+05],\n", + " [1.561000e+03, 1.271509e+06],\n", + " [1.495000e+03, 1.071903e+06],\n", + " [8.280000e+02, 1.215564e+06],\n", + " [1.246000e+03, 1.140591e+06],\n", + " [1.392000e+03, 7.348680e+05],\n", + " [1.194000e+03, 7.493110e+05],\n", + " [6.840000e+02, 8.301580e+05],\n", + " [7.110000e+02, 1.030781e+06],\n", + " [9.230000e+02, 6.937940e+05],\n", + " [7.470000e+02, 1.010889e+06],\n", + " [7.860000e+02, 1.183986e+06],\n", + " [7.180000e+02, 1.160713e+06],\n", + " [8.230000e+02, 9.749720e+05],\n", + " [8.630000e+02, 9.999900e+05],\n", + " [8.690000e+02, 7.924270e+05],\n", + " [6.420000e+02, 8.615190e+05],\n", + " [6.330000e+02, 9.006470e+05],\n", + " [7.410000e+02, 1.305110e+06],\n", + " [4.440000e+02, 1.235293e+06],\n", + " [6.780000e+02, 9.734870e+05],\n", + " [3.890000e+02, 9.811730e+05],\n", + " [5.810000e+02, 8.022590e+05],\n", + " [5.380000e+02, 6.921760e+05],\n", + " [3.130000e+02, 1.149172e+06],\n", + " [5.170000e+02, 1.332219e+06],\n", + " [3.990000e+02, 1.243409e+06],\n", + " [4.040000e+02, 6.951280e+05],\n", + " [2.750000e+02, 6.744260e+05],\n", + " [2.600000e+02, 8.871490e+05],\n", + " [3.580000e+02, 1.326963e+06],\n", + " [3.070000e+02, 7.625150e+05],\n", + " [2.150000e+02, 1.160246e+06],\n", + " [2.760000e+02, 1.055389e+06],\n", + " [2.700000e+02, 9.990920e+05],\n", + " [2.370000e+02, 7.255320e+05],\n", + " [2.060000e+02, 1.099872e+06],\n", + " [1.750000e+02, 9.375600e+05],\n", + " [1.810000e+02, 8.569710e+05],\n", + " [2.220000e+02, 1.179454e+06],\n", + " [2.320000e+02, 1.302408e+06],\n", + " [2.390000e+02, 7.552470e+05],\n", + " [1.800000e+02, 1.013415e+06],\n", + " [1.810000e+02, 1.103302e+06],\n", + " [1.290000e+02, 7.600690e+05],\n", + " [1.860000e+02, 1.253858e+06],\n", + " [1.700000e+02, 1.092196e+06],\n", + " [1.650000e+02, 8.604650e+05],\n", + " [1.350000e+02, 6.752070e+05],\n", + " [9.600000e+01, 1.061282e+06],\n", + " [8.300000e+01, 1.195101e+06],\n", + " [1.150000e+02, 1.272789e+06],\n", + " [9.200000e+01, 7.292520e+05],\n", + " [1.210000e+02, 1.165792e+06],\n", + " [9.100000e+01, 9.362310e+05],\n", + " [7.700000e+01, 9.420080e+05],\n", + " [6.800000e+01, 9.976760e+05]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "int_data_to_fit = np.around(data_to_fit)\n", + "int_data_to_fit " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Poisson loss" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = PoissonLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8329023.1484972015" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 3557908.6464113127\n", + " hess_inv: array([[ 1.27472646e-07, -3.23818317e-09, 2.26214178e-06],\n", + " [-3.23818317e-09, 9.56376557e-10, 2.13419691e-08],\n", + " [ 2.26214178e-06, 2.13419691e-08, 1.00001208e+00]])\n", + " jac: array([-6.34498993e-04, 1.86534335e-03, 2.25490671e-09])\n", + " message: 'Desired error not necessarily achieved due to precision loss.'\n", + " nfev: 109\n", + " nit: 11\n", + " njev: 97\n", + " status: 2\n", + " success: False\n", + " x: array([3.55378376e+00, 1.99169650e-01, 1.00000147e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='BFGS')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 3557908.646411574\n", + " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", + " jac: array([-2.83986623e-01, -4.04398552e-01, 1.00922556e-06])\n", + " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", + " nfev: 15\n", + " nit: 11\n", + " status: 0\n", + " success: True\n", + " x: array([3.55377851e+00, 1.99169650e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='L-BFGS-B')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 0.15, 1000000.0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[(2, 5), (0.0, 1.0), (1000000.0, 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(theta,boxBounds,param_evals)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NegBinom loss" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", + " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", + " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" + ] + } + ], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = NegBinomLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-2.92555910e+02, -3.50195352e+03, 8.77667731e-04])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.sensitivity()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5041.425763395273" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\scipy\\optimize\\_minimize.py:521: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + " warn('Method %s cannot handle constraints nor bounds.' % method,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 4867.899797539529\n", + " hess_inv: array([[ 7.67776936e-03, -5.97617430e-05, 1.74660277e-06],\n", + " [-5.97617430e-05, 7.85112146e-06, 1.25323010e-08],\n", + " [ 1.74660277e-06, 1.25323010e-08, 1.00000000e+00]])\n", + " jac: array([ 8.13167572e-09, -3.92696007e-06, -2.92247481e-14])\n", + " message: 'Optimization terminated successfully.'\n", + " nfev: 15\n", + " nit: 10\n", + " njev: 15\n", + " status: 0\n", + " success: True\n", + " x: array([3.59393939e+00, 1.99830691e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='BFGS')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", + " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 4867.899797547801\n", + " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", + " jac: array([ 4.12746856e-04, 1.84890228e-02, -1.48338804e-09])\n", + " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", + " nfev: 17\n", + " nit: 12\n", + " status: 0\n", + " success: True\n", + " x: array([3.59394146e+00, 1.99830811e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='L-BFGS-B')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 0.15, 1000000.0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[(2, 5), (0.0, 1.0), (1000000.0, 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(theta,boxBounds,param_evals)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 0263e163..457371c1 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -9,14 +9,16 @@ __all__ = [ 'Square', 'Normal', - 'Poisson' + 'Poisson', + 'Gamma', + 'NegBinom' ] import numpy as np from pygom.model._model_errors import InitializeError from pygom.model.ode_utils import check_array_type -from pygom.utilR.distn import dnorm, dpois +from pygom.utilR.distn import dnorm, dpois, gamma_mu_shape, dnbinom class InputError(Exception): ''' @@ -253,6 +255,133 @@ def residual(self, yhat): resid = self._y - yhat return resid + +class Gamma(object): + ''' + Gamma distribution loss object + + Parameters + ---------- + y: array like + observation + Shape: float + shape (a in latex equations) + ''' + + def __init__(self, y, shape=2.0): + err_str = "Shape is not of the correct " + self._y = check_array_type(y) + if isinstance(shape, np.ndarray): + if len(shape.shape) > 1: + if 1 in shape.shape: + shape = shape.flatten() + + if y.shape == shape.shape: + self._shape = shape + else: + raise InitializeError(err_str + "size") + else: + if y.shape == shape.shape: + self._shape = shape + else: + raise InitializeError(err_str + "size") + elif shape is None or shape == 2.0: + self._shape = 2*np.ones(self._y.shape) + else: + raise InitializeError(err_str + "type") + + self.loss(self._y) + + def loss(self, yhat): + ''' + The loss under a gamma distribution. Defined as the negative + log-likelihood of the gamma distirbution in terms of mean and shape. + See: Bolker, B. M. (2008). Gamma. In Ecological Models in R (pp. 131–133). Princeton University Press. + File "Loss function Calculations.ipnyb" + + Parameters + ---------- + yhat: array like + prediction + + + Returns + ------- + negative log-likelihood, :math:`\\mathcal{L}(\\hat{y}; y,a)` + + ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() + + return -gamma_mu_shape(x=self._y, mu=yhat,shape=self._shape,log=True).sum() + + def diff_loss(self, yhat): + ''' + Derivative of the loss function with respect to yhat which is + See: + File "Loss function Calculations.ipnyb" + + Parameters + ---------- + yhat: array like + prediction + + + Returns + ------- + first_deriv_yhat: array like + :math:`\\mathcal\\frac{a \\left(\\hat{y} - y\\right)}{\\hat{y}^{2}}` + + ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() + + return self._shape*(yhat-self._y)/yhat**2 + + def diff2Loss(self, yhat): + ''' + Twice derivative of the loss function with respect to yhat. + See: + Jupiter notebook "Loss function Calculations.ipnyb" + + Parameters + ---------- + yhat: array like + observation + + + Returns + ------- + scnd_deriv_yhat: array like + :math:`\\mathcal\\frac{a \\left(- \\hat{y} + 2 y\\right)}{\\hat{y}^{3}}` + + ''' + y = self._y + shape = self._shape + + return shape*(-yhat+2*y)/yhat**3 + + def residual(self, yhat): + ''' + Raw residuals + + Parameters + ---------- + yhat: array like + observation + + Returns + ------- + r: array like + residuals + + ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() + return self._y - yhat class Poisson(object): ''' @@ -344,3 +473,139 @@ def residual(self, yhat): yhat = yhat.ravel() return self._y - yhat +class NegBinom(object): + ''' + Negative Binomial distribution loss object + + Parameters + ---------- + y: array like + observation + k: float + Overdispersion parameter (k=mean+mean(mean/variance)) + ''' + + def __init__(self, y, k=1.0): + err_str = "k (the overdispersion parameter) is not of the correct " + self._y = check_array_type(y) + if isinstance(k, np.ndarray): + if len(k.shape) > 1: + if 1 in k.shape: + k = k.flatten() + + if y.shape == k.shape: + self._k = k + else: + raise InitializeError(err_str + "size") + else: + if y.shape == k.shape: + self._k = k + else: + raise InitializeError(err_str + "size") + elif k is None or k == 1.0: + self._k = np.ones(self._y.shape) + else: + raise InitializeError(err_str + "type") + + self.loss(self._y) + + def loss(self, yhat): + ''' + The loss under a Negative Binomial distribution. Defined as the + negative log-likelihood of the Negative Binomial 2 distribution. + + Parameters + ---------- + yhat: array like + observation + + Returns + ------- + negative log-likelihood, :math:`\\mathcal{L}(\\hat{y}; y,k)` + + ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() + + return (-dnbinom(self._y, mu=yhat,size=self._k,log=True)).sum() + + def diff_loss(self, yhat): + ''' + Derivative of the loss function with respect to yhat which is + See: + Jupiter notebook "Loss function Calculations.ipnyb" + Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press + + Parameters + ---------- + yhat: array like + observation + + k: array like + observation + + Returns + ------- + first_deriv_yhat: array like + :math:`\\frac{k(\\hat{y}-y)}{\\hat{y}(k + \\hat{y})}` + + ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() + + y = self._y + k = self._k + first_derivs_yhat = (k*(yhat-y))/(yhat*(k+yhat)) + return first_derivs_yhat + + def diff2Loss(self, yhat): + ''' + Twice derivative of the loss function with respect to yhat. + See: + Jupiter notebook "Loss function Calculations.ipnyb" + Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press + + Parameters + ---------- + yhat: array like + observation + + k: array like + observation + + Returns + ------- + scnd_deriv_yhat: array like + :math:`\\frac{k(\\hat{y}(k + \\hat{y}) + \\hat{y}(y -\\hat{y}) + (k + \\hat{y})(y - \\hat{y})}{\\hat{y}^{2}(k + \\hat{y})^{2}}` + + ''' + y = self._y + k = self._k + scnd_derivs_yhat_p1= k + scnd_derivs_yhat_p2= yhat**(-2) + scnd_derivs_yhat_p3= (k + yhat)**(-2) + scnd_derivs_yhat_p4= yhat*(k + yhat) - yhat*(yhat - x) - (k + yhat)*(yhat - x) + scnd_derivs_yhat= scnd_derivs_yhat_p1*scnd_derivs_yhat_p2*scnd_derivs_yhat_p3*scnd_derivs_yhat_p4 + return scnd_derivs_yhat + + def residual(self, yhat): + ''' + Raw residuals + + Parameters + ---------- + yhat: array like + observation + + Returns + ------- + r: array like + residuals + + ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() + return self._y - yhat diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index cdc19dfb..af461878 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -10,11 +10,13 @@ __all__ = [ 'SquareLoss', 'NormalLoss', - 'PoissonLoss' + 'PoissonLoss', + 'GammaLoss', + 'NegBinomLoss' ] from pygom.loss.base_loss import BaseLoss -from pygom.loss.loss_type import Normal, Square, Poisson +from pygom.loss.loss_type import Normal, Square, Poisson, Gamma, NegBinom from pygom.model.ode_utils import check_array_type class SquareLoss(BaseLoss): @@ -64,6 +66,22 @@ def _setLossType(self): return Normal(self._y, 1.0/self._stateWeight) else: return Normal(self._y, 1.0/self._stateWeight) + +class GammaLoss(BaseLoss): + ''' + Realizations from a Gamma distribution taking parameters mean and shape. + ''' + def __init__(self, theta, ode, x0, t0, t, y, state_name, + shape=2, target_param=None, target_state=None): + super(GammaLoss, self).__init__(theta, ode, x0, t0, t, y, + state_name, shape, + target_param, target_state) + + def __repr__(self): + return "GammaLoss" + self._get_model_str() + + def _setLossType(self): + return Gamma(self._y) class PoissonLoss(BaseLoss): ''' @@ -77,4 +95,20 @@ def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - return Poisson(self._y) \ No newline at end of file + return Poisson(self._y) + +class NegBinomLoss(BaseLoss): + ''' + Realizations from a Negative Binomial distribution + ''' + def __init__(self, theta, ode, x0, t0, t, y, state_name, + k=1, target_param=None, target_state=None): + super(NegBinomLoss, self).__init__(theta, ode, x0, t0, t, y, + state_name, k, + target_param, target_state) + + def __repr__(self): + return "NegBinomLoss" + self._get_model_str() + + def _setLossType(self): + return NegBinom(self._y) diff --git a/pygom/utilR/distn.py b/pygom/utilR/distn.py index 71d9ad55..8ebdca96 100644 --- a/pygom/utilR/distn.py +++ b/pygom/utilR/distn.py @@ -11,6 +11,7 @@ import scipy.stats as st import numpy as np +from scipy.special import gammaln ############################################################### # @@ -80,6 +81,38 @@ def dgamma(x, shape, rate=1.0, log=False): return st.gamma.logpdf(x, a=shape, scale=1.0/rate) else: return st.gamma.pdf(x, a=shape, scale=1.0/rate) + +def gamma_mu_shape(x, mu,shape,log=False): + ''' + The probability density function (pdf) of gamma distrbution in terms of mean and shape. + + Parameters + ---------- + x: array like observation. + mu: mean or prediction. + shape: shape (a in latex equation below). + log: if True the natural log of the pmf is given. + See: Bolker, B. M. (2008). Gamma. In Ecological Models in R (pp. 131–133). Princeton University Press. + Jupyter notebook titled "Loss function Calculations.ipnyb" + + + Returns + ------- + pdf, :math:`\\mathcal\\{p}(x; \\mu,a) = \\exp(- a \\ln{\\left(\\frac{\\mu}{a} \\right)} - \\frac{a x}{\\mu} + \\left(a - 1\\right) \\ln{\\left(x \\right)} - \\ln{\\left(\\Gamma\\left(a\\right) \\right)})` +` + + ''' + + logpdf_p1= -gammaln(shape) + logpdf_p2= (shape - 1)*np.log(x) + logpdf_p3= -shape*np.log(mu/shape) + logpdf_p4= -shape*x/mu + logpdf = logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4 + if log: + ans = logpdf + else: + ans = np.exp(logpdf) + return ans def pgamma(q, shape, rate=1.0, log=False): ''' @@ -381,6 +414,73 @@ def rbinom(n, size, prob, seed=None): else: return rvs(n=size, p=prob, size=n)[0] +##### Negative Binomial distribution +def nb2pmf(x, mu,k,log=False): + ''' + The probability mass function (pmf) of Negative Binomial 2 distribution. + This definition of the negative binomial distribution is often refered to as + negative binomial 2, or the ecological parameterisation. This parameterisation + takes the mean and k (an overdispersion parameter). The variance = mean(1+mean/k), + some notation uses alpha (k=1/alpha). + See: Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press. + Jupyter notebook titled "Loss function Calculations.ipnyb" + + Parameters + ---------- + x: array like observation. + mu: mean or prediction. + k: overdispersion parameter (variance = mean(1+mean/k)). Note some notation uses $\alpha$, ($k=\alpha^{-1}$). + log: if True the natural log of the pmf is given. + See: + Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press. + File "Loss function Calculations.ipnyb" + + Returns + ------- + log pmf: + math:`\\mathcal\\p(x; \\mu,k)) = \\exp(\\ln(\\frac{\\Gamma \\left(k+x\\right)}{\\Gamma \\left(k\\right)x!}(\\frac{k}{k+\\mu})^{k}(\\frac{\\mu}{k+\\mu})^{x}))` + + ''' + # note that we input k the overdispersion parameter here + + + logpmf_p1= -gammaln(x+1) + logpmf_p2= -gammaln(k) + logpmf_p3= k*(np.log(k) - np.log(k + mu)) + logpmf_p4= x*(np.log(mu) - np.log(k + mu)) + logpmf_p5= gammaln(k+x) + logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5 + if log: + ans= logpmf + else: + ans= np.exp(logpmf) + return ans + +def dnbinom(x, size, prob=None, mu=None, log =False): + ''' + See + https://stat.ethz.ch/R-manual/R-devel/library/stats/html/NegBinomial.html + ''' + if mu is None and prob is None: + raise Exception("Neither 'prob' or 'mu' were specified") + + if mu is not None: + if prob is not None: + raise Exception("'prob' and 'mu' both specified") + + if log: + ans =nb2pmf(x=x, mu=mu,k=size,log=True) + else: + ans =nb2pmf(x=x, mu=mu,k=size,log=False) + + else: + if log: + ans= st.nbinom.logpmf(x, n=size, p=prob) + else: + ans= st.nbinom.pmf(x, n=size, p=prob) + + return ans + def test_seed(seed): ''' Test the input type of `seed` and return a new random generator if From 1abe96f16c323419e28958ad4a8b991dff215fd4 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Thu, 18 Jun 2020 11:04:20 +0100 Subject: [PATCH 002/188] Fixed confusion with disrpersion and weighting. --- notebooks/Loss function Calculations.ipynb | 2 +- pygom/loss/loss_type.py | 4 ++-- pygom/loss/ode_loss.py | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/notebooks/Loss function Calculations.ipynb b/notebooks/Loss function Calculations.ipynb index 3f46b706..b870605a 100644 --- a/notebooks/Loss function Calculations.ipynb +++ b/notebooks/Loss function Calculations.ipynb @@ -650,7 +650,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.1" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 457371c1..b13c3602 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -485,7 +485,7 @@ class NegBinom(object): Overdispersion parameter (k=mean+mean(mean/variance)) ''' - def __init__(self, y, k=1.0): + def __init__(self, y, k=1.0,): err_str = "k (the overdispersion parameter) is not of the correct " self._y = check_array_type(y) if isinstance(k, np.ndarray): @@ -586,7 +586,7 @@ def diff2Loss(self, yhat): scnd_derivs_yhat_p1= k scnd_derivs_yhat_p2= yhat**(-2) scnd_derivs_yhat_p3= (k + yhat)**(-2) - scnd_derivs_yhat_p4= yhat*(k + yhat) - yhat*(yhat - x) - (k + yhat)*(yhat - x) + scnd_derivs_yhat_p4= yhat*(k + yhat) - yhat*(yhat - y) - (k + yhat)*(yhat - y) scnd_derivs_yhat= scnd_derivs_yhat_p1*scnd_derivs_yhat_p2*scnd_derivs_yhat_p3*scnd_derivs_yhat_p4 return scnd_derivs_yhat diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index af461878..7927e9f9 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -72,16 +72,16 @@ class GammaLoss(BaseLoss): Realizations from a Gamma distribution taking parameters mean and shape. ''' def __init__(self, theta, ode, x0, t0, t, y, state_name, - shape=2, target_param=None, target_state=None): + shape=2,state_weight=None, target_param=None, target_state=None): super(GammaLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, shape, + state_name, state_weight, target_param, target_state) def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): - return Gamma(self._y) + return Gamma(self._y,self._shape) class PoissonLoss(BaseLoss): ''' @@ -102,13 +102,13 @@ class NegBinomLoss(BaseLoss): Realizations from a Negative Binomial distribution ''' def __init__(self, theta, ode, x0, t0, t, y, state_name, - k=1, target_param=None, target_state=None): + k=1,state_weight=None, target_param=None, target_state=None): super(NegBinomLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, k, + state_name, state_weight, target_param, target_state) def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - return NegBinom(self._y) + return NegBinom(self._y,self._k) From ffb938712f30a41ac0fc7d2309c55cc8315b1c97 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Thu, 18 Jun 2020 12:03:01 +0100 Subject: [PATCH 003/188] Allows for different over dispersion parameters than default in neg binom and gamma loss. --- pygom/loss/loss_type.py | 6 +++++- pygom/loss/ode_loss.py | 10 ++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index b13c3602..a9621668 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -287,6 +287,8 @@ def __init__(self, y, shape=2.0): raise InitializeError(err_str + "size") elif shape is None or shape == 2.0: self._shape = 2*np.ones(self._y.shape) + elif isinstance(shape, (int, float)) and shape !=2: + self._shape = shape*np.ones(self._y.shape) else: raise InitializeError(err_str + "type") @@ -485,7 +487,7 @@ class NegBinom(object): Overdispersion parameter (k=mean+mean(mean/variance)) ''' - def __init__(self, y, k=1.0,): + def __init__(self, y, k=1.0): err_str = "k (the overdispersion parameter) is not of the correct " self._y = check_array_type(y) if isinstance(k, np.ndarray): @@ -504,6 +506,8 @@ def __init__(self, y, k=1.0,): raise InitializeError(err_str + "size") elif k is None or k == 1.0: self._k = np.ones(self._y.shape) + elif isinstance(k, (int, float)) and k >1: + self._k = k*np.ones(self._y.shape) else: raise InitializeError(err_str + "type") diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index 7927e9f9..c371107c 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -71,8 +71,9 @@ class GammaLoss(BaseLoss): ''' Realizations from a Gamma distribution taking parameters mean and shape. ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name, - shape=2,state_weight=None, target_param=None, target_state=None): + def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + shape=2, target_param=None, target_state=None): + self._shape = shape super(GammaLoss, self).__init__(theta, ode, x0, t0, t, y, state_name, state_weight, target_param, target_state) @@ -101,8 +102,9 @@ class NegBinomLoss(BaseLoss): ''' Realizations from a Negative Binomial distribution ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name, - k=1,state_weight=None, target_param=None, target_state=None): + def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + k=1, target_param=None, target_state=None): + self._k = k super(NegBinomLoss, self).__init__(theta, ode, x0, t0, t, y, state_name, state_weight, target_param, target_state) From 4de2bf01f7707addae93b6e1fff6c74025880254 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Thu, 18 Jun 2020 15:21:08 +0100 Subject: [PATCH 004/188] Weighted residuals can now be applied in neg binom, Poisson and gamma loss functions. --- pygom/loss/loss_type.py | 133 ++++++++++++++++++++++++++++++++++++---- pygom/loss/ode_loss.py | 8 +-- 2 files changed, 124 insertions(+), 17 deletions(-) diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index a9621668..d0ec6a95 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -154,7 +154,9 @@ def __init__(self, y, sigma=1.0): err_str = "Standard deviation not of the correct " self._y = check_array_type(y) if isinstance(sigma, np.ndarray): - if len(sigma.shape) > 1: + if np.any(sigma<0): + raise InitializeError('No elements in numpy array of sigma values should be negative') + elif len(sigma.shape) > 1: if 1 in sigma.shape: sigma = sigma.flatten() @@ -169,6 +171,11 @@ def __init__(self, y, sigma=1.0): raise InitializeError(err_str + "size") elif sigma is None or sigma == 1.0: self._sigma = np.ones(self._y.shape) + elif isinstance(sigma, (int, float)): + if sigma <0: + raise InitializeError('Sigma should not be negative') + else: + self._sigma = sigma*np.ones(self._y.shape) else: raise InitializeError(err_str + "type") @@ -268,11 +275,13 @@ class Gamma(object): shape (a in latex equations) ''' - def __init__(self, y, shape=2.0): + def __init__(self, y, shape=2.0, weights=None): err_str = "Shape is not of the correct " self._y = check_array_type(y) if isinstance(shape, np.ndarray): - if len(shape.shape) > 1: + if np.any(shape<0): + raise InitializeError('No elements in numpy array of shape values should be negative') + elif len(shape.shape) > 1: if 1 in shape.shape: shape = shape.flatten() @@ -287,11 +296,27 @@ def __init__(self, y, shape=2.0): raise InitializeError(err_str + "size") elif shape is None or shape == 2.0: self._shape = 2*np.ones(self._y.shape) - elif isinstance(shape, (int, float)) and shape !=2: - self._shape = shape*np.ones(self._y.shape) + elif isinstance(shape, (int, float)): + if shape <0: + raise InitializeError('Shape should not be negative') + else: + self._shape = shape*np.ones(self._y.shape) else: raise InitializeError(err_str + "type") + + if weights is None: + self._numVar = 0 + self._w = np.ones(self._y.shape) + else: + self._w = check_array_type(weights) + + if len(self._w.shape) > 1: + if self._w.shape[1] == 1: + self._w = self._w.flatten() + assert self._y.shape == self._w.shape, \ + "Input weight not of the same size as y" + self.loss(self._y) def loss(self, yhat): @@ -383,7 +408,24 @@ def residual(self, yhat): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return self._y - yhat + return self._weightedResidual(yhat) + + def _weightedResidual(self, yhat): + ''' + Find the weighted residuals. + ''' + # resid = self._y - yhat + # print "In weighted resid" + # print self._y.shape + if len(yhat.shape) > 1: + if 1 in yhat.shape: + resid = self._y - yhat.ravel() + else: + resid = self._y - yhat + else: + resid = self._y - yhat + + return resid * self._w class Poisson(object): ''' @@ -395,8 +437,21 @@ class Poisson(object): observation ''' - def __init__(self, y): + def __init__(self, y, weights=None): self._y = check_array_type(y) + if weights is None: + self._numVar = 0 + self._w = np.ones(self._y.shape) + else: + self._w = check_array_type(weights) + + if len(self._w.shape) > 1: + if self._w.shape[1] == 1: + self._w = self._w.flatten() + + assert self._y.shape == self._w.shape, \ + "Input weight not of the same size as y" + self.loss(self._y) def loss(self, yhat): @@ -473,7 +528,24 @@ def residual(self, yhat): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return self._y - yhat + return self._weightedResidual(yhat) + + def _weightedResidual(self, yhat): + ''' + Find the weighted residuals. + ''' + # resid = self._y - yhat + # print "In weighted resid" + # print self._y.shape + if len(yhat.shape) > 1: + if 1 in yhat.shape: + resid = self._y - yhat.ravel() + else: + resid = self._y - yhat + else: + resid = self._y - yhat + + return resid * self._w class NegBinom(object): ''' @@ -487,11 +559,13 @@ class NegBinom(object): Overdispersion parameter (k=mean+mean(mean/variance)) ''' - def __init__(self, y, k=1.0): + def __init__(self, y, k=1.0, weights=None): err_str = "k (the overdispersion parameter) is not of the correct " self._y = check_array_type(y) if isinstance(k, np.ndarray): - if len(k.shape) > 1: + if np.any(k<0): + raise InitializeError('No elements in numpy array of shape values should be negative') + elif len(k.shape) > 1: if 1 in k.shape: k = k.flatten() @@ -506,10 +580,26 @@ def __init__(self, y, k=1.0): raise InitializeError(err_str + "size") elif k is None or k == 1.0: self._k = np.ones(self._y.shape) - elif isinstance(k, (int, float)) and k >1: - self._k = k*np.ones(self._y.shape) + elif isinstance(k, (int, float)): + if k <0: + raise InitializeError('k should not be negative') + else: + self._k = k*np.ones(self._y.shape) else: raise InitializeError(err_str + "type") + + if weights is None: + self._numVar = 0 + self._w = np.ones(self._y.shape) + else: + self._w = check_array_type(weights) + + if len(self._w.shape) > 1: + if self._w.shape[1] == 1: + self._w = self._w.flatten() + + assert self._y.shape == self._w.shape, \ + "Input weight not of the same size as y" self.loss(self._y) @@ -612,4 +702,21 @@ def residual(self, yhat): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return self._y - yhat + return self._weightedResidual(yhat) + + def _weightedResidual(self, yhat): + ''' + Find the weighted residuals. + ''' + # resid = self._y - yhat + # print "In weighted resid" + # print self._y.shape + if len(yhat.shape) > 1: + if 1 in yhat.shape: + resid = self._y - yhat.ravel() + else: + resid = self._y - yhat + else: + resid = self._y - yhat + + return resid * self._w diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index c371107c..cf590fee 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -82,13 +82,13 @@ def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): - return Gamma(self._y,self._shape) + return Gamma(self._y,self._shape,self._state_weight)) class PoissonLoss(BaseLoss): ''' Realizations from a Poisson distribution ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name, + def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, target_param=None, target_state=None): super(PoissonLoss, self).__init__(theta, ode, x0, t0, t, y, state_name, None, target_param, target_state) @@ -96,7 +96,7 @@ def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - return Poisson(self._y) + return Poisson(self._y,self._state_weight)) class NegBinomLoss(BaseLoss): ''' @@ -113,4 +113,4 @@ def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - return NegBinom(self._y,self._k) + return NegBinom(self._y,self._k,self._state_weight) From 793219dae06757ecc01af278934f9d5d67ab5d21 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Mon, 22 Jun 2020 14:26:40 +0100 Subject: [PATCH 005/188] Weighted residuals taken account of in gamma, nomral, Posson, nb loss functions. --- notebooks/Loss function Calculations.ipynb | 1055 ++++++++++++++++---- pygom/loss/loss_type.py | 410 +++----- pygom/loss/ode_loss.py | 58 +- 3 files changed, 1050 insertions(+), 473 deletions(-) diff --git a/notebooks/Loss function Calculations.ipynb b/notebooks/Loss function Calculations.ipynb index b870605a..ab5c2eb3 100644 --- a/notebooks/Loss function Calculations.ipynb +++ b/notebooks/Loss function Calculations.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -17,299 +17,441 @@ "import numpy as np" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Negative binomial loss class ##" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1.1 Logliklihood function" - ] - }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - " x, mu , k = sym.symbols('x mu k')" + "# Setting up residual for replacement, so that weighted residuals can be applied in code.\n", + "r ,y, yhat = sym.symbols('r,y yhat')\n", + "r_eq = y-yhat\n", + "minus_r_eq = yhat-y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Probability mass function (PMF) of negative binomial ${p}(x; \\mu,k) = \\frac{\\Gamma \\left(k+x\\right)}{\\Gamma \\left(k\\right)x!}(\\frac{k}{k+\\mu})^{k}(\\frac{\\mu}{k+\\mu})^{x}$ \n", - "This definition of the negative binomial distribution is often refered to as negative binomial 2. This parameterisation takes the mean (usually refered as $\\mu$, but in pygom $\\hat{y}$ as we are looking at a prediction) and $k$ (an overdispersion parameter). The variance = $\\mu+\\frac{\\mu^2}{k}$, some notation uses $\\alpha$, ($k=\\alpha^{-1}$). \n", - "See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press." + "# 1. Square Loss class" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle \\frac{\\left(\\frac{k}{k + \\mu}\\right)^{k} \\left(\\frac{\\mu}{k + \\mu}\\right)^{x} \\Gamma\\left(k + x\\right)}{x! \\Gamma\\left(k\\right)}$" + "$\\displaystyle \\left(y - \\hat{y}\\right)^{2}$" ], "text/plain": [ - "(k/(k + mu))**k*(mu/(k + mu))**x*gamma(k + x)/(factorial(x)*gamma(k))" + "(y - yhat)**2" ] }, - "execution_count": 3, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nbpmf = (sym.gamma(k+x)/(sym.gamma(k)*sym.factorial(x)))*(k/(k+mu))**k*(mu/(k+mu))**x\n", - "nbpmf" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Due to the this PMF containing gamma functions and a factorial it is easier to calculate the sum of it's logged terms than to log it as one object (you end up with infinities otherwise). " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + "output_type": "display_data" + }, { "data": { + "text/latex": [ + "$\\displaystyle r^{2}$" + ], "text/plain": [ - "((k/(k + mu))**k, (mu/(k + mu))**x, 1/factorial(x), 1/gamma(k), gamma(k + x))" + "r**2" ] }, - "execution_count": 4, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle r^{2}$" + ], + "text/plain": [ + "r**2" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "nbpmf.args" + "square_loss=(y-yhat)**2\n", + "display(square_loss,square_loss.subs(r_eq,r),square_loss.subs(minus_r_eq,-r))" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle k \\left(\\log{\\left(k \\right)} - \\log{\\left(k + \\mu \\right)}\\right) + x \\left(\\log{\\left(\\mu \\right)} - \\log{\\left(k + \\mu \\right)}\\right) - \\log{\\left(x! \\right)} - \\log{\\left(\\Gamma\\left(k\\right) \\right)} + \\Gamma\\left(k + x\\right)$" + "$\\displaystyle - 2 y + 2 \\hat{y}$" ], "text/plain": [ - "k*(log(k) - log(k + mu)) + x*(log(mu) - log(k + mu)) - log(factorial(x)) - log(gamma(k)) + gamma(k + x)" + "-2*y + 2*yhat" ] }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - 2 y + 2 \\hat{y}$" + ], + "text/plain": [ + "-2*y + 2*yhat" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - 2 y + 2 \\hat{y}$" + ], + "text/plain": [ + "-2*y + 2*yhat" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "logpmf_p1= k*(sym.ln(k)-sym.ln(k+mu))\n", - "logpmf_p2= x*(sym.ln(mu)-sym.ln(k+mu))\n", - "logpmf_p3= -sym.ln(sym.factorial(x))\n", - "logpmf_p4= -sym.ln(sym.gamma(k))\n", - "logpmf_p5= sym.gamma(k+x)\n", - "logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5\n", - "logpmf" + "first_derv = sym.diff(square_loss,yhat).simplify()\n", + "display(first_derv,first_derv.simplify().subs(r_eq,r),first_derv.subs(minus_r_eq,-r))" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { + "text/latex": [ + "$\\displaystyle 2$" + ], "text/plain": [ - "(-log(factorial(x)),\n", - " -log(gamma(k)),\n", - " k*(log(k) - log(k + mu)),\n", - " x*(log(mu) - log(k + mu)),\n", - " gamma(k + x))" + "2" ] }, - "execution_count": 6, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "logpmf.args" + "scnd_derv= sym.diff(first_derv,yhat).simplify()\n", + "scnd_derv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. Normal Loss\n", + "## 2.1 Logliklihood function" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ - "from scipy.special import gammaln\n", - "def nb2logpmf(x, mu,k):\n", - " '''\n", - " The log probability mass function (pmf) of Negative Binomial 2 distribution. \n", - "\n", - " Parameters\n", - " ----------\n", - " x: array like observation.\n", - " mu: mean or prediction.\n", - " k: overdispersion parameter (variance = mean(1+mean/k)). Note some notation uses $\\alpha$, ($k=\\alpha^{-1}$).\n", - " See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press.\n", - "\n", - " Returns\n", - " -------\n", - " log pmf:\n", - " math:`\\\\mathcal\\\\ln({p}(x; \\\\mu,k)) = \\\\ln(\\\\frac{\\\\Gamma \\\\left(k+x\\\\right)}{\\\\Gamma \\\\left(k\\\\right)x!}(\\\\frac{k}{k+\\\\mu})^{k}(\\\\frac{\\\\mu}{k+\\\\mu})^{x})`\n", - "\n", - " '''\n", - " # note that we input k the overdispersion parameter here\n", - "\n", - "\n", - " logpmf_p1= -gammaln(x+1) \n", - " logpmf_p2= -gammaln(k)\n", - " logpmf_p3= k*(np.log(k) - np.log(k + mu)) \n", - " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", - " logpmf_p5= gammaln(k+x)\n", - " logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5\n", - " return logpmf" + "sigma, pi = sym.symbols('sigma pi')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Our loss function is the negative of the logliklihood above." + "Probability density function (PDF) of the normal distribution ${p}(y; \\hat{y},k) = \\frac{1}{\\sqrt {2 \\pi} \\sigma}e^{-\\frac {(y-\\hat{y}) ^{2}}{2 \\sigma ^{2}}$.\n", + "See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 129–130). Princeton University Press." ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 30, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\sqrt{2} e^{- \\frac{\\left(y - \\hat{y}\\right)^{2}}{2 \\sigma^{2}}}}{2 \\sqrt{\\pi} \\sigma}$" + ], + "text/plain": [ + "sqrt(2)*exp(-(y - yhat)**2/(2*sigma**2))/(2*sqrt(pi)*sigma)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\sqrt{2} e^{- \\frac{r^{2}}{2 \\sigma^{2}}}}{2 \\sqrt{\\pi} \\sigma}$" + ], + "text/plain": [ + "sqrt(2)*exp(-r**2/(2*sigma**2))/(2*sqrt(pi)*sigma)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\sqrt{2} e^{- \\frac{r^{2}}{2 \\sigma^{2}}}}{2 \\sqrt{\\pi} \\sigma}$" + ], + "text/plain": [ + "sqrt(2)*exp(-r**2/(2*sigma**2))/(2*sqrt(pi)*sigma)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "negloglikli=-logpmf" + "normpdf=1/(sym.sqrt(2*pi)*sigma) * sym.E**(-((y-yhat)**2/(2*sigma**2)))\n", + "display(normpdf,normpdf.subs(r_eq,r),normpdf.subs(minus_r_eq,-r))" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 41, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(1/2, sqrt(2), 1/sqrt(pi), 1/sigma, exp(-(y - yhat)**2/(2*sigma**2)))" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "1st derivative of -Loglikelihood of negative binomial loss with respect to $\\mu$." + "normpdf.args" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[-log(2),\n", + " log(2)/2,\n", + " -log(pi)/2,\n", + " log(1/sigma),\n", + " log(exp(-(y - yhat)**2/(2*sigma**2)))]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Our loss function is the negative of the logliklihood.\n", + "loglike_args= []\n", + "for arg in normpdf.args:\n", + " loglike_args.append(sym.ln(arg).simplify())\n", + " \n", + "loglike_args" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle \\frac{k \\left(\\mu - x\\right)}{\\mu \\left(k + \\mu\\right)}$" + "$\\displaystyle - \\frac{r^{2}}{2 \\sigma^{2}}$" ], "text/plain": [ - "k*(mu - x)/(mu*(k + mu))" + "-r**2/(2*sigma**2)" ] }, - "execution_count": 9, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "nbfirstderv= sym.diff(negloglikli,mu).simplify()\n", - "nbfirstderv" + "logpdf_p1= loglike_args[0]\n", + "logpdf_p2= loglike_args[1]\n", + "logpdf_p3= loglike_args[2]\n", + "logpdf_p4= loglike_args[3]\n", + "logpdf_p5= -(y - yhat)**2/(2*sigma**2)\n", + "# logpdf_p5 has residual in:\n", + "logpdf_p5_alt= -(r)**2/(2*sigma**2)\n", + "logpdf_p5_alt" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 50, "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{\\log{\\left(\\pi \\right)}}{2} + \\log{\\left(\\frac{1}{\\sigma} \\right)} - \\frac{\\log{\\left(2 \\right)}}{2} - \\frac{\\left(y - \\hat{y}\\right)^{2}}{2 \\sigma^{2}}$" + ], + "text/plain": [ + "-log(pi)/2 + log(1/sigma) - log(2)/2 - (y - yhat)**2/(2*sigma**2)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{r^{2}}{2 \\sigma^{2}} - \\frac{\\log{\\left(\\pi \\right)}}{2} + \\log{\\left(\\frac{1}{\\sigma} \\right)} - \\frac{\\log{\\left(2 \\right)}}{2}$" + ], + "text/plain": [ + "-r**2/(2*sigma**2) - log(pi)/2 + log(1/sigma) - log(2)/2" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "1st derivative of -Loglikelihood of negative binomial loss with respect to yhat: \n", - "$\\frac{k(\\mu-y)}{\\mu(k + \\mu)} $" + "logpdf = logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4+logpdf_p5\n", + "logpdf_alt = logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4+logpdf_p5_alt\n", + "display(logpdf,logpdf_alt)" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle - \\frac{k \\left(- \\mu \\left(k + \\mu\\right) + \\mu \\left(\\mu - x\\right) + \\left(k + \\mu\\right) \\left(\\mu - x\\right)\\right)}{\\mu^{2} \\left(k + \\mu\\right)^{2}}$" + "$\\displaystyle \\frac{\\log{\\left(\\pi \\right)}}{2} - \\log{\\left(\\frac{1}{\\sigma} \\right)} + \\frac{\\log{\\left(2 \\right)}}{2} + \\frac{\\left(y - \\hat{y}\\right)^{2}}{2 \\sigma^{2}}$" ], "text/plain": [ - "-k*(-mu*(k + mu) + mu*(mu - x) + (k + mu)*(mu - x))/(mu**2*(k + mu)**2)" + "log(pi)/2 - log(1/sigma) + log(2)/2 + (y - yhat)**2/(2*sigma**2)" ] }, - "execution_count": 10, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "nbsecderv = sym.diff(nbfirstderv,mu).simplify()\n", - "nbsecderv.simplify()" + "normloss=-logpdf\n", + "normloss" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 54, "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{- y + \\hat{y}}{\\sigma^{2}}$" + ], + "text/plain": [ + "(-y + yhat)/sigma**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{r}{\\sigma^{2}}$" + ], + "text/plain": [ + "-r/sigma**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{r}{\\sigma^{2}}$" + ], + "text/plain": [ + "-r/sigma**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "2nd derivative of -Loglikelihood of negative binomial loss with respect to yhat: \n", - "$\\frac{k(\\mu(k + \\mu) + \\mu(y -\\mu) + (k + \\mu)(y - \\mu)}{\\mu^{2}(k + \\mu)^{2}} $" + "first_derv = sym.diff(normloss,yhat).simplify()\n", + "display(first_derv,first_derv.subs(r_eq,r),first_derv.subs(minus_r_eq,-r))" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 56, "metadata": {}, "outputs": [ { "data": { + "text/latex": [ + "$\\displaystyle \\frac{1}{\\sigma^{2}}$" + ], "text/plain": [ - "(k, mu**(-2), (k + mu)**(-2), mu*(k + mu) - mu*(mu - x) - (k + mu)*(mu - x))" + "sigma**(-2)" ] }, - "execution_count": 11, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "nbsecderv.args" + "scnd_derv = sym.diff(first_derv,yhat).simplify()\n", + "scnd_derv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Gamma loss class in terms of mean and shape" + "# 3. Gamma loss class in terms of mean and shape" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ - " a, s, x, mu= sym.symbols('a s x mu')" + " a, s, y, yhat= sym.symbols('a s y yhat')" ] }, { @@ -323,40 +465,40 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle \\frac{s^{- a} x^{a - 1} e^{- \\frac{x}{s}}}{\\Gamma\\left(a\\right)}$" + "$\\displaystyle \\frac{s^{- a} y^{a - 1} e^{- \\frac{y}{s}}}{\\Gamma\\left(a\\right)}$" ], "text/plain": [ - "s**(-a)*x**(a - 1)*exp(-x/s)/gamma(a)" + "s**(-a)*y**(a - 1)*exp(-y/s)/gamma(a)" ] }, - "execution_count": 13, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pdf_gamma = 1/(s**a*sym.gamma(a))*(x**(a-1)*sym.E**(-x/s))\n", + "pdf_gamma = 1/(s**a*sym.gamma(a))*(y**(a-1)*sym.E**(-y/s))\n", "pdf_gamma" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(s**(-a), x**(a - 1), 1/gamma(a), exp(-x/s))" + "(s**(-a), y**(a - 1), 1/gamma(a), exp(-y/s))" ] }, - "execution_count": 14, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -367,69 +509,69 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle - a \\log{\\left(s \\right)} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)} - \\frac{x}{s}$" + "$\\displaystyle - a \\log{\\left(s \\right)} + \\left(a - 1\\right) \\log{\\left(y \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)} - \\frac{y}{s}$" ], "text/plain": [ - "-a*log(s) + (a - 1)*log(x) - log(gamma(a)) - x/s" + "-a*log(s) + (a - 1)*log(y) - log(gamma(a)) - y/s" ] }, - "execution_count": 15, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "log_pdf_gamma_p1 = -a*sym.ln(s)\n", - "log_pdf_gamma_p2 = (a-1)*sym.ln(x)\n", + "log_pdf_gamma_p2 = (a-1)*sym.ln(y)\n", "log_pdf_gamma_p3 = -sym.ln(sym.gamma(a))\n", - "log_pdf_gamma_p4 = -x/s\n", + "log_pdf_gamma_p4 = -y/s\n", "log_pdf_gamma= log_pdf_gamma_p1+log_pdf_gamma_p2+log_pdf_gamma_p3+log_pdf_gamma_p4\n", "log_pdf_gamma" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle - a \\log{\\left(\\frac{\\mu}{a} \\right)} - \\frac{a x}{\\mu} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}$" + "$\\displaystyle - \\frac{a y}{\\hat{y}} - a \\log{\\left(\\frac{\\hat{y}}{a} \\right)} + \\left(a - 1\\right) \\log{\\left(y \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}$" ], "text/plain": [ - "-a*log(mu/a) - a*x/mu + (a - 1)*log(x) - log(gamma(a))" + "-a*y/yhat - a*log(yhat/a) + (a - 1)*log(y) - log(gamma(a))" ] }, - "execution_count": 16, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "s_in_terms_mu_a = mu/a\n", + "s_in_terms_mu_a = yhat/a\n", "log_pdf_mu_a_gamma = log_pdf_gamma.subs(s,s_in_terms_mu_a) \n", "log_pdf_mu_a_gamma" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(-log(gamma(a)), (a - 1)*log(x), -a*log(mu/a), -a*x/mu)" + "(-log(gamma(a)), (a - 1)*log(y), -a*log(yhat/a), -a*y/yhat)" ] }, - "execution_count": 17, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -440,14 +582,14 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "- a \\log{\\left(\\frac{\\mu}{a} \\right)} - \\frac{a x}{\\mu} + \\left(a - 1\\right) \\log{\\left(x \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}\n" + "- \\frac{a y}{\\hat{y}} - a \\log{\\left(\\frac{\\hat{y}}{a} \\right)} + \\left(a - 1\\right) \\log{\\left(y \\right)} - \\log{\\left(\\Gamma\\left(a\\right) \\right)}\n" ] } ], @@ -457,7 +599,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 65, "metadata": {}, "outputs": [], "source": [ @@ -491,19 +633,19 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle a \\log{\\left(\\frac{\\mu}{a} \\right)} + \\frac{a x}{\\mu} - \\left(a - 1\\right) \\log{\\left(x \\right)} + \\log{\\left(\\Gamma\\left(a\\right) \\right)}$" + "$\\displaystyle \\frac{a y}{\\hat{y}} + a \\log{\\left(\\frac{\\hat{y}}{a} \\right)} - \\left(a - 1\\right) \\log{\\left(y \\right)} + \\log{\\left(\\Gamma\\left(a\\right) \\right)}$" ], "text/plain": [ - "a*log(mu/a) + a*x/mu - (a - 1)*log(x) + log(gamma(a))" + "a*y/yhat + a*log(yhat/a) - (a - 1)*log(y) + log(gamma(a))" ] }, - "execution_count": 20, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -522,7 +664,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 67, "metadata": { "scrolled": true }, @@ -530,10 +672,10 @@ { "data": { "text/latex": [ - "$\\displaystyle \\frac{a}{\\mu} - \\frac{a x}{\\mu^{2}}$" + "$\\displaystyle - \\frac{a y}{\\hat{y}^{2}} + \\frac{a}{\\hat{y}}$" ], "text/plain": [ - "a/mu - a*x/mu**2" + "-a*y/yhat**2 + a/yhat" ] }, "metadata": {}, @@ -542,10 +684,10 @@ { "data": { "text/latex": [ - "$\\displaystyle \\frac{a \\left(\\mu - x\\right)}{\\mu^{2}}$" + "$\\displaystyle \\frac{a \\left(- y + \\hat{y}\\right)}{\\hat{y}^{2}}$" ], "text/plain": [ - "a*(mu - x)/mu**2" + "a*(-y + yhat)/yhat**2" ] }, "metadata": {}, @@ -553,19 +695,43 @@ } ], "source": [ - "gammafirstderv= sym.diff(negloglikli_gamma_mu_a,mu)\n", + "gammafirstderv= sym.diff(negloglikli_gamma_mu_a,yhat)\n", "display(gammafirstderv,gammafirstderv.simplify())" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 69, "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{a r}{\\hat{y}^{2}}$" + ], + "text/plain": [ + "-a*r/yhat**2" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gammafirstderv=gammafirstderv.simplify()\n", + "gammafirstderv.subs(r_eq,r)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ "\\frac{a \\left(\\mu - x\\right)}{\\mu^{2}}\n" ] } @@ -583,16 +749,16 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle \\frac{a \\left(- \\mu + 2 x\\right)}{\\mu^{3}}$" + "$\\displaystyle \\frac{a \\left(2 y - \\hat{y}\\right)}{\\hat{y}^{3}}$" ], "text/plain": [ - "a*(-mu + 2*x)/mu**3" + "a*(2*y - yhat)/yhat**3" ] }, "metadata": {}, @@ -601,10 +767,10 @@ { "data": { "text/latex": [ - "$\\displaystyle \\frac{a \\left(- \\mu + 2 x\\right)}{\\mu^{3}}$" + "$\\displaystyle \\frac{a \\left(2 y - \\hat{y}\\right)}{\\hat{y}^{3}}$" ], "text/plain": [ - "a*(-mu + 2*x)/mu**3" + "a*(2*y - yhat)/yhat**3" ] }, "metadata": {}, @@ -612,10 +778,33 @@ } ], "source": [ - "gammasecderv = sym.diff(gammafirstderv,mu).simplify()\n", + "gammasecderv = sym.diff(gammafirstderv,yhat).simplify()\n", "display(gammasecderv,gammasecderv.simplify())" ] }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a \\left(2 y - \\hat{y}\\right)}{\\hat{y}^{3}}$" + ], + "text/plain": [ + "a*(2*y - yhat)/yhat**3" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gammasecderv.subs(r_eq,r)" + ] + }, { "cell_type": "code", "execution_count": 24, @@ -632,6 +821,524 @@ "source": [ "sym.print_latex(gammasecderv)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 4. Poisson" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probability density function (PDF) of the normal distribution ${p}(n;\\lambda) = \\frac{e^{-\\lambda}\\lambda^n}{n!}$.\n", + "See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 1222-123). Princeton University Press." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\hat{y}^{y} e^{- \\hat{y}}}{y!}$" + ], + "text/plain": [ + "yhat**y*exp(-yhat)/factorial(y)" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "poissonpmf = (sym.E**-yhat*yhat**y)/sym.factorial(y)\n", + "poissonpmf " + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(yhat**y, 1/factorial(y), exp(-yhat))" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "poissonpmf.args" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\hat{y} + \\log{\\left(\\hat{y}^{y} \\right)} - y!$" + ], + "text/plain": [ + "-yhat + log(yhat**y) - factorial(y)" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logpmf_p1 = sym.ln(yhat**y)\n", + "logpmf_p2 = -yhat\n", + "logpmf_p3 = -sym.factorial(y)\n", + "logpmf = logpmf_p1+logpmf_p2+logpmf_p3\n", + "logpmf" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [], + "source": [ + "possonloss=-logpmf" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{y}{\\hat{y}} + 1$" + ], + "text/plain": [ + "-y/yhat + 1" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{- y + \\hat{y}}{\\hat{y}}$" + ], + "text/plain": [ + "(-y + yhat)/yhat" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "possonfirstderv= sym.diff(possonloss,yhat)\n", + "display(possonfirstderv,possonfirstderv.simplify())" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{r}{\\hat{y}}$" + ], + "text/plain": [ + "-r/yhat" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "possonfirstderv.simplify().subs(r_eq,r)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{y}{\\hat{y}^{2}}$" + ], + "text/plain": [ + "y/yhat**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{y}{\\hat{y}^{2}}$" + ], + "text/plain": [ + "y/yhat**2" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "possonsecderv= sym.diff(possonfirstderv,yhat)\n", + "display(possonsecderv,possonsecderv.simplify())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 5. Negative binomial loss class ##" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "k = sym.symbols('k')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Probability mass function (PMF) of negative binomial distribution ${p}(x; \\mu,k) = \\frac{\\Gamma \\left(k+x\\right)}{\\Gamma \\left(k\\right)x!}(\\frac{k}{k+\\mu})^{k}(\\frac{\\mu}{k+\\mu})^{x}$ \n", + "This definition of the negative binomial distribution is often refered to as negative binomial 2. This parameterisation takes the mean (usually refered as $\\mu$, but in pygom $\\hat{y}$ as we are looking at a prediction) and $k$ (an overdispersion parameter). The variance = $\\mu+\\frac{\\mu^2}{k}$, some notation uses $\\alpha$, ($k=\\alpha^{-1}$). \n", + "See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press." + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{\\left(\\frac{k}{k + \\hat{y}}\\right)^{k} \\left(\\frac{\\hat{y}}{k + \\hat{y}}\\right)^{y} \\Gamma\\left(k + y\\right)}{y! \\Gamma\\left(k\\right)}$" + ], + "text/plain": [ + "(k/(k + yhat))**k*(yhat/(k + yhat))**y*gamma(k + y)/(factorial(y)*gamma(k))" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbpmf = (sym.gamma(k+y)/(sym.gamma(k)*sym.factorial(y)))*(k/(k+yhat))**k*(yhat/(k+yhat))**y\n", + "nbpmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Due to the this PMF containing gamma functions and a factorial it is easier to calculate the sum of it's logged terms than to log it as one object (you end up with infinities otherwise). " + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((k/(k + yhat))**k,\n", + " (yhat/(k + yhat))**y,\n", + " 1/factorial(y),\n", + " 1/gamma(k),\n", + " gamma(k + y))" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbpmf.args" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle k \\left(\\log{\\left(k \\right)} - \\log{\\left(k + \\hat{y} \\right)}\\right) + y \\left(\\log{\\left(\\hat{y} \\right)} - \\log{\\left(k + \\hat{y} \\right)}\\right) - \\log{\\left(y! \\right)} - \\log{\\left(\\Gamma\\left(k\\right) \\right)} + \\Gamma\\left(k + y\\right)$" + ], + "text/plain": [ + "k*(log(k) - log(k + yhat)) + y*(log(yhat) - log(k + yhat)) - log(factorial(y)) - log(gamma(k)) + gamma(k + y)" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logpmf_p1= k*(sym.ln(k)-sym.ln(k+yhat))\n", + "logpmf_p2= y*(sym.ln(yhat)-sym.ln(k+yhat))\n", + "logpmf_p3= -sym.ln(sym.factorial(y))\n", + "logpmf_p4= -sym.ln(sym.gamma(k))\n", + "logpmf_p5= sym.gamma(k+y)\n", + "logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5\n", + "logpmf" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(-log(factorial(y)),\n", + " -log(gamma(k)),\n", + " k*(log(k) - log(k + yhat)),\n", + " y*(log(yhat) - log(k + yhat)),\n", + " gamma(k + y))" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "logpmf.args" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.special import gammaln\n", + "def nb2logpmf(x, mu,k):\n", + " '''\n", + " The log probability mass function (pmf) of Negative Binomial 2 distribution. \n", + "\n", + " Parameters\n", + " ----------\n", + " x: array like observation.\n", + " mu: mean or prediction.\n", + " k: overdispersion parameter (variance = mean(1+mean/k)). Note some notation uses $\\alpha$, ($k=\\alpha^{-1}$).\n", + " See Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press.\n", + "\n", + " Returns\n", + " -------\n", + " log pmf:\n", + " math:`\\\\mathcal\\\\ln({p}(x; \\\\mu,k)) = \\\\ln(\\\\frac{\\\\Gamma \\\\left(k+x\\\\right)}{\\\\Gamma \\\\left(k\\\\right)x!}(\\\\frac{k}{k+\\\\mu})^{k}(\\\\frac{\\\\mu}{k+\\\\mu})^{x})`\n", + "\n", + " '''\n", + " # note that we input k the overdispersion parameter here\n", + "\n", + "\n", + " logpmf_p1= -gammaln(x+1) \n", + " logpmf_p2= -gammaln(k)\n", + " logpmf_p3= k*(np.log(k) - np.log(k + mu)) \n", + " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", + " logpmf_p5= gammaln(k+x)\n", + " logpmf = logpmf_p1+logpmf_p2+logpmf_p3+logpmf_p4+logpmf_p5\n", + " return logpmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our loss function is the negative of the logliklihood above." + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "negloglikli=-logpmf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1st derivative of -Loglikelihood of negative binomial loss with respect to $\\mu$." + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{k \\left(- y + \\hat{y}\\right)}{\\hat{y} \\left(k + \\hat{y}\\right)}$" + ], + "text/plain": [ + "k*(-y + yhat)/(yhat*(k + yhat))" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbfirstderv= sym.diff(negloglikli,yhat).simplify()\n", + "nbfirstderv" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle - \\frac{k r}{\\hat{y} \\left(k + \\hat{y}\\right)}$" + ], + "text/plain": [ + "-k*r/(yhat*(k + yhat))" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbfirstderv.subs(r_eq,r)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1st derivative of -Loglikelihood of negative binomial loss with respect to yhat: \n", + "$\\frac{k(\\mu-y)}{\\mu(k + \\mu)} $" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{k \\left(\\hat{y} \\left(k + \\hat{y}\\right) + \\hat{y} \\left(y - \\hat{y}\\right) + \\left(k + \\hat{y}\\right) \\left(y - \\hat{y}\\right)\\right)}{\\hat{y}^{2} \\left(k + \\hat{y}\\right)^{2}}$" + ], + "text/plain": [ + "k*(yhat*(k + yhat) + yhat*(y - yhat) + (k + yhat)*(y - yhat))/(yhat**2*(k + yhat)**2)" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbsecderv = sym.diff(nbfirstderv,yhat).simplify()\n", + "nbsecderv.simplify()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2nd derivative of -Loglikelihood of negative binomial loss with respect to yhat: \n", + "$\\frac{k(\\mu(k + \\mu) + \\mu(y -\\mu) + (k + \\mu)(y - \\mu)}{\\mu^{2}(k + \\mu)^{2}} $" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{k \\left(r \\hat{y} + r \\left(k + \\hat{y}\\right) + \\hat{y} \\left(k + \\hat{y}\\right)\\right)}{\\hat{y}^{2} \\left(k + \\hat{y}\\right)^{2}}$" + ], + "text/plain": [ + "k*(r*yhat + r*(k + yhat) + yhat*(k + yhat))/(yhat**2*(k + yhat)**2)" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbsecderv_alt=nbsecderv.simplify().subs(r_eq,r)\n", + "nbsecderv_alt" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(k, yhat**(-2), (k + yhat)**(-2), r*yhat + r*(k + yhat) + yhat*(k + yhat))" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nbsecderv_alt.args" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -650,7 +1357,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.8.1" } }, "nbformat": 4, diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index d0ec6a95..214a6662 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -26,36 +26,88 @@ class InputError(Exception): ''' pass -class Square(object): +class baseloss_type(object): ''' - Square loss object + This baseloss_type class provides common feature to be inherited by the + loss type objects, such as Square, Normal , etc. Parameters ---------- y: array like observations + state_weight: array like + weight for the observations ''' - def __init__(self, y, weights=None): + # There may be some some overlapp with these checks on weights and y within + # the base loss class object in base_loss.py, thus these checks maybe redundent (unless this + # module is being used without base_loss.py. + #Checks o n y: self._y = check_array_type(y) - self._numObv = len(self._y) - + #Checks on weights. if weights is None: self._numVar = 0 self._w = np.ones(self._y.shape) else: self._w = check_array_type(weights) - + if np.any(weights<0): + raise ValueError('No elements in numpy array of weights should be negative') if len(self._w.shape) > 1: - if self._w.shape[1] == 1: + if 1 in self._w.shape: self._w = self._w.flatten() - assert self._y.shape == self._w.shape, \ "Input weight not of the same size as y" + + def residual(self, yhat, weighting_applied = True): + ''' + Raw residuals returned if weighting_applied = False, else + the weighted residuals. + + Parameters + ---------- + yhat: array like + observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals returned. + + Returns + ------- + :math:`y_{i} - \\hat{y}_{i}` + + ''' + if isinstance(weighting_applied,bool)=False: + raise TypeError('weighting_applied should be boolean') + + if len(yhat.shape) > 1: + if 1 in yhat.shape: + resid = self._y - yhat.ravel() + else: + resid = self._y - yhat + else: + resid = self._y - yhat + if weighting_applied = True: + resid *= self._w + + return resid + + + +class Square(baseloss_type): + ''' + Square loss object + Parameters + ---------- + y: array like + observations + ''' + + def __init__(self, y, weights=None): + super().__init__(y, weights=None) self.loss(self._y) - def loss(self, yhat): + def loss(self, yhat, weighting_applied = True): ''' Loss under square loss. Not really saying much here @@ -63,14 +115,18 @@ def loss(self, yhat): ---------- yhat: array like observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. + Returns ------- - :math:`\\sum_{i=1}^{n} (\\hat{y} - y)^{2}` + :math:`\\sum_{i=1}^{n} (y-\\hat{y})^{2}` ''' - return (self.residual(yhat)**2).sum() + return (self.residual(yhat,weighting_applied)**2).sum() - def diff_loss(self, yhat): + def diff_loss(self, yhat,weighting_applied=True): ''' Derivative under square loss. Assuming that we are solving the minimization problem i.e. our objective function is the @@ -80,12 +136,15 @@ def diff_loss(self, yhat): ---------- yhat: array like observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- :math:`-2(y_{i} - \\hat{y}_{i})` ''' - return -2*self.residual(yhat) + return -2*self.residual(yhat,weighting_applied)) def diff2Loss(self, yhat): ''' @@ -102,43 +161,12 @@ def diff2Loss(self, yhat): either a scalar, vector or matrix depending on the shape of of the input yhat ''' - return self._weightedResidual(2*np.ones(yhat.shape)) - - def residual(self, yhat): - ''' - Raw residuals if no weights was initialized, else - the weighted residuals - - Parameters - ---------- - yhat: array like - observation - - Returns - ------- - :math:`y_{i} - \\hat{y}_{i}` - - ''' - return self._weightedResidual(yhat) - - def _weightedResidual(self, yhat): - ''' - Find the weighted residuals. - ''' - # resid = self._y - yhat - # print "In weighted resid" - # print self._y.shape if len(yhat.shape) > 1: if 1 in yhat.shape: - resid = self._y - yhat.ravel() - else: - resid = self._y - yhat - else: - resid = self._y - yhat - - return resid * self._w + yhat = yhat.ravel() + return 2*np.ones(yhat.shape) -class Normal(object): +class Normal(baseloss_type): ''' Normal distribution loss object @@ -148,18 +176,16 @@ class Normal(object): observation sigma: float standard deviation - ''' - - def __init__(self, y, sigma=1.0): + ''' + def __init__(self, y, sigma=1.0,weight=None): + super().__init__(y, weights=None) err_str = "Standard deviation not of the correct " - self._y = check_array_type(y) if isinstance(sigma, np.ndarray): if np.any(sigma<0): - raise InitializeError('No elements in numpy array of sigma values should be negative') + raise ValueError('No elements in numpy array of sigma values should be negative') elif len(sigma.shape) > 1: if 1 in sigma.shape: sigma = sigma.flatten() - if y.shape == sigma.shape: self._sigma = sigma else: @@ -173,16 +199,16 @@ def __init__(self, y, sigma=1.0): self._sigma = np.ones(self._y.shape) elif isinstance(sigma, (int, float)): if sigma <0: - raise InitializeError('Sigma should not be negative') + raise ValueError('Sigma should not be negative') else: self._sigma = sigma*np.ones(self._y.shape) else: - raise InitializeError(err_str + "type") + raise TypeError(err_str + "type") self._sigma2 = self._sigma**2 self.loss(self._y) - def loss(self, yhat): + def loss(self, yhat,weighting_applied=True): ''' The loss under a normal distribution. Defined as the negative log-likelihood here. @@ -191,19 +217,28 @@ def loss(self, yhat): ---------- yhat: array like observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- - negative log-likelihood, :math:`\\mathcal{L}(\\hat{y},y)` + negative log-likelihood, :math:`\\mathcal\\frac{1}{\\sqrt{2\\pi}\\sigma}e^{-\\frac{(y-\\hat{y})^{2}}{2\\sigma^{2}}` ''' - # note that we input the standard deviation here if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return (-dnorm(self._y, yhat, self._sigma, True)).sum() + + # Calculate negative likelihood (depending on weighting of residuals). + logpdf_p1= -np.log(2) + logpdf_p2= np.log(2)/2 + logpdf_p3= -np.log(pi)/2 + logpdf_p4= np.log(1/self._sigma) + logpdf_p5_alt=-self.residual(yhat,weighting_applied)**2/(2*sigma**2) + return (-(logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4+logpdf_p5_alt)).sum() - def diff_loss(self, yhat): + def diff_loss(self, yhat,weighting_applied=True): ''' Derivative of the loss function which is :math:`\\sigma^{-1}(y - \\hat{y})` @@ -212,6 +247,9 @@ def diff_loss(self, yhat): ---------- yhat: array like observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- @@ -219,7 +257,7 @@ def diff_loss(self, yhat): :math:`\\nabla \\mathcal{L}(\\hat{y}, y)` ''' - r = self.residual(yhat) + r = self.residual(yhat,weighting_applied) return -r/self._sigma2 def diff2Loss(self, yhat): @@ -236,34 +274,12 @@ def diff2Loss(self, yhat): s: array like inverse of the variance with shape = yhat.shape ''' - return np.ones(yhat.shape)/self._sigma2 - - def residual(self, yhat): - ''' - Residuals under a normal loss - - Parameters - ---------- - yhat: array like - observation - - Returns - ------- - r: array like - residuals - - ''' if len(yhat.shape) > 1: if 1 in yhat.shape: - resid = self._y - yhat.ravel() - else: - resid = self._y - yhat - else: - resid = self._y - yhat - - return resid + yhat = yhat.ravel() + return np.ones(yhat.shape)/self._sigma2 -class Gamma(object): +class Gamma(baseloss_type): ''' Gamma distribution loss object @@ -276,15 +292,14 @@ class Gamma(object): ''' def __init__(self, y, shape=2.0, weights=None): + super().__init__(y, weights=None) err_str = "Shape is not of the correct " - self._y = check_array_type(y) if isinstance(shape, np.ndarray): if np.any(shape<0): - raise InitializeError('No elements in numpy array of shape values should be negative') + raise ValueError('No elements in numpy array of shape values should be negative') elif len(shape.shape) > 1: if 1 in shape.shape: shape = shape.flatten() - if y.shape == shape.shape: self._shape = shape else: @@ -298,25 +313,11 @@ def __init__(self, y, shape=2.0, weights=None): self._shape = 2*np.ones(self._y.shape) elif isinstance(shape, (int, float)): if shape <0: - raise InitializeError('Shape should not be negative') + raise ValueError('Shape should not be negative') else: self._shape = shape*np.ones(self._y.shape) else: - raise InitializeError(err_str + "type") - - if weights is None: - self._numVar = 0 - self._w = np.ones(self._y.shape) - else: - self._w = check_array_type(weights) - - if len(self._w.shape) > 1: - if self._w.shape[1] == 1: - self._w = self._w.flatten() - - assert self._y.shape == self._w.shape, \ - "Input weight not of the same size as y" - + raise TypeError(err_str + "type") self.loss(self._y) def loss(self, yhat): @@ -343,7 +344,7 @@ def loss(self, yhat): return -gamma_mu_shape(x=self._y, mu=yhat,shape=self._shape,log=True).sum() - def diff_loss(self, yhat): + def diff_loss(self, yhat,weighting_applied=True): ''' Derivative of the loss function with respect to yhat which is See: @@ -353,19 +354,17 @@ def diff_loss(self, yhat): ---------- yhat: array like prediction + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. - Returns ------- first_deriv_yhat: array like :math:`\\mathcal\\frac{a \\left(\\hat{y} - y\\right)}{\\hat{y}^{2}}` ''' - if len(yhat.shape) > 1: - if 1 in yhat.shape: - yhat = yhat.ravel() - - return self._shape*(yhat-self._y)/yhat**2 + return self._shape*-self.residual(yhat,weighting_applied)/yhat**2 def diff2Loss(self, yhat): ''' @@ -385,49 +384,15 @@ def diff2Loss(self, yhat): :math:`\\mathcal\\frac{a \\left(- \\hat{y} + 2 y\\right)}{\\hat{y}^{3}}` ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() y = self._y shape = self._shape return shape*(-yhat+2*y)/yhat**3 - - def residual(self, yhat): - ''' - Raw residuals - - Parameters - ---------- - yhat: array like - observation - - Returns - ------- - r: array like - residuals - - ''' - if len(yhat.shape) > 1: - if 1 in yhat.shape: - yhat = yhat.ravel() - return self._weightedResidual(yhat) - - def _weightedResidual(self, yhat): - ''' - Find the weighted residuals. - ''' - # resid = self._y - yhat - # print "In weighted resid" - # print self._y.shape - if len(yhat.shape) > 1: - if 1 in yhat.shape: - resid = self._y - yhat.ravel() - else: - resid = self._y - yhat - else: - resid = self._y - yhat - - return resid * self._w -class Poisson(object): +class Poisson(baseloss_type): ''' Poisson distribution loss object @@ -438,20 +403,7 @@ class Poisson(object): ''' def __init__(self, y, weights=None): - self._y = check_array_type(y) - if weights is None: - self._numVar = 0 - self._w = np.ones(self._y.shape) - else: - self._w = check_array_type(weights) - - if len(self._w.shape) > 1: - if self._w.shape[1] == 1: - self._w = self._w.flatten() - - assert self._y.shape == self._w.shape, \ - "Input weight not of the same size as y" - + super().__init__(y, weights=None) self.loss(self._y) def loss(self, yhat): @@ -475,7 +427,7 @@ def loss(self, yhat): # note that we input the standard deviation here return (-dpois(self._y, yhat, True)).sum() - def diff_loss(self, yhat): + def diff_loss(self, yhat,weighting_applied=True): ''' Derivative of the loss function, :math:`1 - y\\hat{y}^{-1}` @@ -483,16 +435,22 @@ def diff_loss(self, yhat): ---------- yhat: array like observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- :math:`\\nabla \\mathcal{L}(\\hat{y},y)` ''' + if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return 1 - self._y/yhat + + r = self.residual(yhat,weighting_applied) + return -r/yhat def diff2Loss(self, yhat): ''' @@ -508,46 +466,12 @@ def diff2Loss(self, yhat): s: array like :math:`\\frac{y}{\\hat{y}^{2}}` with shape = yhat.shape ''' - return self.y/(yhat**2) - - def residual(self, yhat): - ''' - Raw residuals - - Parameters - ---------- - yhat: array like - observation - - Returns - ------- - r: array like - residuals - - ''' if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return self._weightedResidual(yhat) + return self._y/(yhat**2) - def _weightedResidual(self, yhat): - ''' - Find the weighted residuals. - ''' - # resid = self._y - yhat - # print "In weighted resid" - # print self._y.shape - if len(yhat.shape) > 1: - if 1 in yhat.shape: - resid = self._y - yhat.ravel() - else: - resid = self._y - yhat - else: - resid = self._y - yhat - - return resid * self._w - -class NegBinom(object): +class NegBinom(baseloss_type): ''' Negative Binomial distribution loss object @@ -560,15 +484,14 @@ class NegBinom(object): ''' def __init__(self, y, k=1.0, weights=None): + super().__init__(y, weights=None) err_str = "k (the overdispersion parameter) is not of the correct " - self._y = check_array_type(y) if isinstance(k, np.ndarray): if np.any(k<0): - raise InitializeError('No elements in numpy array of shape values should be negative') + raise ValueError('No elements in numpy array of shape values should be negative') elif len(k.shape) > 1: if 1 in k.shape: k = k.flatten() - if y.shape == k.shape: self._k = k else: @@ -582,25 +505,12 @@ def __init__(self, y, k=1.0, weights=None): self._k = np.ones(self._y.shape) elif isinstance(k, (int, float)): if k <0: - raise InitializeError('k should not be negative') + raise ValueError('k should not be negative') else: self._k = k*np.ones(self._y.shape) else: - raise InitializeError(err_str + "type") + raise TypeError(err_str + "type") - if weights is None: - self._numVar = 0 - self._w = np.ones(self._y.shape) - else: - self._w = check_array_type(weights) - - if len(self._w.shape) > 1: - if self._w.shape[1] == 1: - self._w = self._w.flatten() - - assert self._y.shape == self._w.shape, \ - "Input weight not of the same size as y" - self.loss(self._y) def loss(self, yhat): @@ -624,7 +534,7 @@ def loss(self, yhat): return (-dnbinom(self._y, mu=yhat,size=self._k,log=True)).sum() - def diff_loss(self, yhat): + def diff_loss(self, yhat,weighting_applied=True): ''' Derivative of the loss function with respect to yhat which is See: @@ -638,6 +548,10 @@ def diff_loss(self, yhat): k: array like observation + + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- @@ -651,10 +565,11 @@ def diff_loss(self, yhat): y = self._y k = self._k - first_derivs_yhat = (k*(yhat-y))/(yhat*(k+yhat)) + r = self.residual(yhat,weighting_applied) + first_derivs_yhat = k*-r/(yhat*(k+yhat)) return first_derivs_yhat - def diff2Loss(self, yhat): + def diff2Loss(self, yhat,weighting_applied=True): ''' Twice derivative of the loss function with respect to yhat. See: @@ -668,6 +583,10 @@ def diff2Loss(self, yhat): k: array like observation + + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- @@ -675,48 +594,15 @@ def diff2Loss(self, yhat): :math:`\\frac{k(\\hat{y}(k + \\hat{y}) + \\hat{y}(y -\\hat{y}) + (k + \\hat{y})(y - \\hat{y})}{\\hat{y}^{2}(k + \\hat{y})^{2}}` ''' + if len(yhat.shape) > 1: + if 1 in yhat.shape: + yhat = yhat.ravel() y = self._y k = self._k + r = self.residual(yhat,weighting_applied) scnd_derivs_yhat_p1= k scnd_derivs_yhat_p2= yhat**(-2) scnd_derivs_yhat_p3= (k + yhat)**(-2) - scnd_derivs_yhat_p4= yhat*(k + yhat) - yhat*(yhat - y) - (k + yhat)*(yhat - y) + scnd_derivs_yhat_p4= r*yhat + r*(k + yhat) + yhat*(k + yhat) scnd_derivs_yhat= scnd_derivs_yhat_p1*scnd_derivs_yhat_p2*scnd_derivs_yhat_p3*scnd_derivs_yhat_p4 - return scnd_derivs_yhat - - def residual(self, yhat): - ''' - Raw residuals - - Parameters - ---------- - yhat: array like - observation - - Returns - ------- - r: array like - residuals - - ''' - if len(yhat.shape) > 1: - if 1 in yhat.shape: - yhat = yhat.ravel() - return self._weightedResidual(yhat) - - def _weightedResidual(self, yhat): - ''' - Find the weighted residuals. - ''' - # resid = self._y - yhat - # print "In weighted resid" - # print self._y.shape - if len(yhat.shape) > 1: - if 1 in yhat.shape: - resid = self._y - yhat.ravel() - else: - resid = self._y - yhat - else: - resid = self._y - yhat - - return resid * self._w + return scnd_derivs_yhat \ No newline at end of file diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index cf590fee..3f70d32c 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -25,9 +25,8 @@ class SquareLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, target_param=None, target_state=None): - super(SquareLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, state_weight, - target_param, target_state) + super().__init__(theta, ode, x0, t0, t, y, + state_name, state_weight,target_param, target_state) def __repr__(self): return "SquareLoss" + self._get_model_str() @@ -40,32 +39,18 @@ class NormalLoss(BaseLoss): ''' Realizations from a Normal distribution ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name, - sigma=None, target_param=None, target_state=None): - if sigma is None: - super(NormalLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, sigma, - target_param, target_state) - else: - sigma = check_array_type(sigma) - super(NormalLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, 1.0/sigma, - target_param, target_state) + def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + sigma=1.0, target_param=None, target_state=None): + self._sigma=sigma + super().__init__(theta, ode, x0, t0, t, y, + state_name, state_weight,target_param, target_state) def __repr__(self): return "NormalLoss" + self._get_model_str() def _setLossType(self): - if self._stateWeight is None: - return Normal(self._y, 1.0) - else: - if len(self._stateWeight.shape) > 1: - if 1 in self._stateWeight.shape: - return Normal(self._y, 1.0/self._stateWeight.flatten()) - else: - return Normal(self._y, 1.0/self._stateWeight) - else: - return Normal(self._y, 1.0/self._stateWeight) + self._lossObj = Normal(self._y,self._sigma, self._stateWeight) + return self._lossObj class GammaLoss(BaseLoss): ''' @@ -73,16 +58,15 @@ class GammaLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, shape=2, target_param=None, target_state=None): - self._shape = shape - super(GammaLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, state_weight, - target_param, target_state) + self._shape=shape + super().__init__(theta, ode, x0, t0, t, y, + state_name, state_weight,target_param, target_state) def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): - return Gamma(self._y,self._shape,self._state_weight)) + return Gamma(self._y,self._shape,self._stateWeight)) class PoissonLoss(BaseLoss): ''' @@ -90,13 +74,14 @@ class PoissonLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, target_param=None, target_state=None): - super(PoissonLoss, self).__init__(theta, ode, x0, t0, t, y, state_name, - None, target_param, target_state) + super().__init__(theta, ode, x0, t0, t, y, + state_name, state_weight,target_param, target_state) + def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - return Poisson(self._y,self._state_weight)) + return Poisson(self._y,self._stateWeight)) class NegBinomLoss(BaseLoss): ''' @@ -104,13 +89,12 @@ class NegBinomLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, k=1, target_param=None, target_state=None): - self._k = k - super(NegBinomLoss, self).__init__(theta, ode, x0, t0, t, y, - state_name, state_weight, - target_param, target_state) + self._k=k + super().__init__(theta, ode, x0, t0, t, y, + state_name, state_weight,target_param, target_state) def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - return NegBinom(self._y,self._k,self._state_weight) + return NegBinom(self._y,self._k,self._stateWeight) From d82e8a5418ba0cf584d2de96806314b13f4ccb97 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Tue, 23 Jun 2020 10:02:24 +0100 Subject: [PATCH 006/188] Gama loss functions 2nd derivative takes weighted residuals --- notebooks/Loss function Calculations.ipynb | 245 ++++++++++----------- pygom/loss/loss_type.py | 9 +- tests/test_loss_types.py | 91 +++++++- 3 files changed, 213 insertions(+), 132 deletions(-) diff --git a/notebooks/Loss function Calculations.ipynb b/notebooks/Loss function Calculations.ipynb index ab5c2eb3..8af4da95 100644 --- a/notebooks/Loss function Calculations.ipynb +++ b/notebooks/Loss function Calculations.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -19,14 +19,13 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Setting up residual for replacement, so that weighted residuals can be applied in code.\n", "r ,y, yhat = sym.symbols('r,y yhat')\n", - "r_eq = y-yhat\n", - "minus_r_eq = yhat-y" + "r_eq = y-yhat" ] }, { @@ -38,7 +37,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -53,18 +52,6 @@ "metadata": {}, "output_type": "display_data" }, - { - "data": { - "text/latex": [ - "$\\displaystyle r^{2}$" - ], - "text/plain": [ - "r**2" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/latex": [ @@ -80,12 +67,12 @@ ], "source": [ "square_loss=(y-yhat)**2\n", - "display(square_loss,square_loss.subs(r_eq,r),square_loss.subs(minus_r_eq,-r))" + "display(square_loss,square_loss.subs(r_eq,r))" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -111,28 +98,39 @@ }, "metadata": {}, "output_type": "display_data" - }, + } + ], + "source": [ + "first_derv = sym.diff(square_loss,yhat).simplify()\n", + "display(first_derv,first_derv.simplify().subs(r_eq,r))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { "data": { "text/latex": [ - "$\\displaystyle - 2 y + 2 \\hat{y}$" + "$\\displaystyle - 2 r$" ], "text/plain": [ - "-2*y + 2*yhat" + "-2*r" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ - "first_derv = sym.diff(square_loss,yhat).simplify()\n", - "display(first_derv,first_derv.simplify().subs(r_eq,r),first_derv.subs(minus_r_eq,-r))" + "-2*r" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -144,7 +142,7 @@ "2" ] }, - "execution_count": 13, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -164,7 +162,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -181,7 +179,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -196,18 +194,6 @@ "metadata": {}, "output_type": "display_data" }, - { - "data": { - "text/latex": [ - "$\\displaystyle \\frac{\\sqrt{2} e^{- \\frac{r^{2}}{2 \\sigma^{2}}}}{2 \\sqrt{\\pi} \\sigma}$" - ], - "text/plain": [ - "sqrt(2)*exp(-r**2/(2*sigma**2))/(2*sqrt(pi)*sigma)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/latex": [ @@ -223,12 +209,12 @@ ], "source": [ "normpdf=1/(sym.sqrt(2*pi)*sigma) * sym.E**(-((y-yhat)**2/(2*sigma**2)))\n", - "display(normpdf,normpdf.subs(r_eq,r),normpdf.subs(minus_r_eq,-r))" + "display(normpdf,normpdf.subs(r_eq,r))" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -237,7 +223,7 @@ "(1/2, sqrt(2), 1/sqrt(pi), 1/sigma, exp(-(y - yhat)**2/(2*sigma**2)))" ] }, - "execution_count": 41, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -248,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 11, "metadata": { "scrolled": true }, @@ -263,7 +249,7 @@ " log(exp(-(y - yhat)**2/(2*sigma**2)))]" ] }, - "execution_count": 47, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -279,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -291,7 +277,7 @@ "-r**2/(2*sigma**2)" ] }, - "execution_count": 48, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -309,7 +295,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -345,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -357,7 +343,7 @@ "log(pi)/2 - log(1/sigma) + log(2)/2 + (y - yhat)**2/(2*sigma**2)" ] }, - "execution_count": 51, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -369,7 +355,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -384,18 +370,6 @@ "metadata": {}, "output_type": "display_data" }, - { - "data": { - "text/latex": [ - "$\\displaystyle - \\frac{r}{\\sigma^{2}}$" - ], - "text/plain": [ - "-r/sigma**2" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, { "data": { "text/latex": [ @@ -411,12 +385,12 @@ ], "source": [ "first_derv = sym.diff(normloss,yhat).simplify()\n", - "display(first_derv,first_derv.subs(r_eq,r),first_derv.subs(minus_r_eq,-r))" + "display(first_derv,first_derv.subs(r_eq,r))" ] }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -428,7 +402,7 @@ "sigma**(-2)" ] }, - "execution_count": 56, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -447,7 +421,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -465,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -477,7 +451,7 @@ "s**(-a)*y**(a - 1)*exp(-y/s)/gamma(a)" ] }, - "execution_count": 58, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -489,7 +463,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -498,7 +472,7 @@ "(s**(-a), y**(a - 1), 1/gamma(a), exp(-y/s))" ] }, - "execution_count": 59, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -509,7 +483,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -521,7 +495,7 @@ "-a*log(s) + (a - 1)*log(y) - log(gamma(a)) - y/s" ] }, - "execution_count": 61, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -537,7 +511,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -549,7 +523,7 @@ "-a*y/yhat - a*log(yhat/a) + (a - 1)*log(y) - log(gamma(a))" ] }, - "execution_count": 62, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -562,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -571,7 +545,7 @@ "(-log(gamma(a)), (a - 1)*log(y), -a*log(yhat/a), -a*y/yhat)" ] }, - "execution_count": 63, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -582,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -599,7 +573,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -633,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -645,7 +619,7 @@ "a*y/yhat + a*log(yhat/a) - (a - 1)*log(y) + log(gamma(a))" ] }, - "execution_count": 66, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -664,7 +638,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 26, "metadata": { "scrolled": true }, @@ -701,7 +675,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -713,7 +687,7 @@ "-a*r/yhat**2" ] }, - "execution_count": 69, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -725,14 +699,14 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\\frac{a \\left(\\mu - x\\right)}{\\mu^{2}}\n" + "- \\frac{a \\left(y - \\hat{y}\\right)}{\\hat{y}^{2}}\n" ] } ], @@ -749,7 +723,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -784,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -796,7 +770,7 @@ "a*(2*y - yhat)/yhat**3" ] }, - "execution_count": 72, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -807,14 +781,37 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{a \\left(r + y\\right)}{y^{3}}$" + ], + "text/plain": [ + "a*(r + y)/y**3" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a*(y+r)/y**3" + ] + }, + { + "cell_type": "code", + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\\frac{a \\left(- \\mu + 2 x\\right)}{\\mu^{3}}\n" + "\\frac{a \\left(2 y - \\hat{y}\\right)}{\\hat{y}^{3}}\n" ] } ], @@ -839,7 +836,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -851,7 +848,7 @@ "yhat**y*exp(-yhat)/factorial(y)" ] }, - "execution_count": 74, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -863,7 +860,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -872,7 +869,7 @@ "(yhat**y, 1/factorial(y), exp(-yhat))" ] }, - "execution_count": 76, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -883,7 +880,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -895,7 +892,7 @@ "-yhat + log(yhat**y) - factorial(y)" ] }, - "execution_count": 78, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -910,7 +907,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -919,7 +916,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -954,7 +951,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -966,7 +963,7 @@ "-r/yhat" ] }, - "execution_count": 81, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -977,7 +974,7 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1019,7 +1016,7 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -1037,7 +1034,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1049,7 +1046,7 @@ "(k/(k + yhat))**k*(yhat/(k + yhat))**y*gamma(k + y)/(factorial(y)*gamma(k))" ] }, - "execution_count": 86, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1068,7 +1065,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1081,7 +1078,7 @@ " gamma(k + y))" ] }, - "execution_count": 87, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1092,7 +1089,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1104,7 +1101,7 @@ "k*(log(k) - log(k + yhat)) + y*(log(yhat) - log(k + yhat)) - log(factorial(y)) - log(gamma(k)) + gamma(k + y)" ] }, - "execution_count": 89, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1121,7 +1118,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 44, "metadata": {}, "outputs": [ { @@ -1134,7 +1131,7 @@ " gamma(k + y))" ] }, - "execution_count": 90, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1145,7 +1142,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 45, "metadata": {}, "outputs": [], "source": [ @@ -1188,7 +1185,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -1204,7 +1201,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 47, "metadata": {}, "outputs": [ { @@ -1216,7 +1213,7 @@ "k*(-y + yhat)/(yhat*(k + yhat))" ] }, - "execution_count": 94, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -1228,7 +1225,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -1240,7 +1237,7 @@ "-k*r/(yhat*(k + yhat))" ] }, - "execution_count": 95, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1259,7 +1256,7 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -1271,7 +1268,7 @@ "k*(yhat*(k + yhat) + yhat*(y - yhat) + (k + yhat)*(y - yhat))/(yhat**2*(k + yhat)**2)" ] }, - "execution_count": 97, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1291,7 +1288,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -1303,7 +1300,7 @@ "k*(r*yhat + r*(k + yhat) + yhat*(k + yhat))/(yhat**2*(k + yhat)**2)" ] }, - "execution_count": 98, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1315,7 +1312,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -1324,7 +1321,7 @@ "(k, yhat**(-2), (k + yhat)**(-2), r*yhat + r*(k + yhat) + yhat*(k + yhat))" ] }, - "execution_count": 100, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 214a6662..5e0e6445 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -52,6 +52,8 @@ def __init__(self, y, weights=None): self._w = check_array_type(weights) if np.any(weights<0): raise ValueError('No elements in numpy array of weights should be negative') + if np.all(weights==0.0): + raise ValueError('All elements in numpy array of weights should not be 0.0') if len(self._w.shape) > 1: if 1 in self._w.shape: self._w = self._w.flatten() @@ -366,7 +368,7 @@ def diff_loss(self, yhat,weighting_applied=True): ''' return self._shape*-self.residual(yhat,weighting_applied)/yhat**2 - def diff2Loss(self, yhat): + def diff2Loss(self, yhat,weighting_applied=True): ''' Twice derivative of the loss function with respect to yhat. See: @@ -376,6 +378,9 @@ def diff2Loss(self, yhat): ---------- yhat: array like observation + weighting_applied: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns @@ -390,7 +395,7 @@ def diff2Loss(self, yhat): y = self._y shape = self._shape - return shape*(-yhat+2*y)/yhat**3 + return shape*(self.residual(yhat,weighting_applied)+y)/yhat**3 class Poisson(baseloss_type): ''' diff --git a/tests/test_loss_types.py b/tests/test_loss_types.py index 0d9bb29d..c0345fa3 100644 --- a/tests/test_loss_types.py +++ b/tests/test_loss_types.py @@ -2,10 +2,10 @@ import numpy as np -from pygom import SquareLoss, NormalLoss +from pygom import SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss from pygom.model import common_models -class TestLossTypes(TestCase): +class Test_Square_loss_class(TestCase): def setUp(self): # initial values @@ -49,6 +49,85 @@ def test_FH_Square_vector_weight(self): self.assertTrue(np.allclose(obj.cost(), s)) + + def test_FH_Square_1State_Fail(self): + ## totalFail = 0 + ## expectedFail = 4 + w_list = list() + + w_list.append([-1.]) + w_list.append([0]) + w_list.append([2.0, 3.0]) + w_list.append(np.random.rand(30)) + + for w in w_list: + self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,:], + 'R', w) + + def test_FH_Square_2State_Fail(self): + ## totalFail = 0 + ## expectedFail = 8 + w_list = list() + + w_list.append([-2.0]) + w_list.append([2.0, 3.0, 4.0]) + w_list.append([0.0, 0.0]) + w_list.append([1.0, -1.0]) + w_list.append(np.random.rand(30)) + w_list.append([np.random.rand(30), np.random.rand(31)]) + w_list.append([np.random.rand(31), np.random.rand(31)]) + w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) + + for w in w_list: + self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,:], + 'R', w) + +class Test_Normal_loss_class(TestCase): + + def setUp(self): + # initial values + self.x0 = [-1.0, 1.0] + # params + self.param_eval = [('a', 0.2), ('b', 0.2),('c', 3.0)] + # the time points for our observations + self.t = np.linspace(0, 20, 30).astype('float64') + self.ode = common_models.FitzHugh(self.param_eval) + self.ode.initial_values = (self.x0, self.t[0]) + + # Standard. Find the solution which we will be used as + # "observations later" + self.solution = self.ode.integrate(self.t[1::]) + # initial guess + self.theta = [0.5, 0.5, 0.5] + + obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], + self.t[1::], self.solution[1::,:], ['V', 'R']) + self.r = obj.residual() + + def test_FH_Normal_scalar_weight(self): + # weight for each component + w = [2.0, 3.0] + + s = 0 + for i in range(2): s += ((self.r[:,i]*w[i])**2).sum() + + obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], + self.t[1::], self.solution[1::,:], ['V', 'R'], w) + + self.assertTrue(np.allclose(obj.cost(), s)) + + def test_FH_Normal_vector_weight(self): + # now the weight is a vector + w = np.random.rand(29, 2) + obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], + self.t[1::], self.solution[1::,:], ['V', 'R'], w) + + s = ((self.r * np.array(w))**2).sum() + + self.assertTrue(np.allclose(obj.cost(), s)) + def test_FH_Normal(self): objFH = NormalLoss(self.theta, self.ode, self.x0, self.t[0], self.t[1::], self.solution[1::,:], ['V', 'R']) @@ -65,7 +144,7 @@ def test_FH_Normal(self): self.assertFalse(np.allclose(objFH.cost(), objFH1.cost())) self.assertFalse(np.allclose(objFH1.cost(), objFH2.cost())) - def test_FH_Square_1State_Fail(self): + def test_FH_Normal_1State_Fail(self): ## totalFail = 0 ## expectedFail = 4 w_list = list() @@ -76,11 +155,11 @@ def test_FH_Square_1State_Fail(self): w_list.append(np.random.rand(30)) for w in w_list: - self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, + self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, self.x0, self.t[0], self.t[1::], self.solution[1::,:], 'R', w) - def test_FH_Square_2State_Fail(self): + def test_FH_Normal_2State_Fail(self): ## totalFail = 0 ## expectedFail = 8 w_list = list() @@ -95,7 +174,7 @@ def test_FH_Square_2State_Fail(self): w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) for w in w_list: - self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, + self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, self.x0, self.t[0], self.t[1::], self.solution[1::,:], 'R', w) From 126fc99b4fdd3c90e42e22e1c88e00d1b1688588 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Wed, 24 Jun 2020 10:53:12 +0100 Subject: [PATCH 007/188] Corrected typo --- pygom/loss/ode_loss.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index 3f70d32c..d8882249 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -66,8 +66,9 @@ def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): - return Gamma(self._y,self._shape,self._stateWeight)) - + self._lossObj = Gamma(self._y,self._shape,self._stateWeight) + return self._lossObj + class PoissonLoss(BaseLoss): ''' Realizations from a Poisson distribution @@ -81,7 +82,8 @@ def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - return Poisson(self._y,self._stateWeight)) + self._lossObj = Poisson(self._y,self._stateWeight) + return self._lossObj class NegBinomLoss(BaseLoss): ''' @@ -97,4 +99,5 @@ def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - return NegBinom(self._y,self._k,self._stateWeight) + self._lossObj = NegBinom(self._y,self._k,self._stateWeight) + return self._lossObj \ No newline at end of file From 3f90a1da510de787ba1f01a0081cfdacd8558058 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Wed, 24 Jun 2020 12:14:06 +0100 Subject: [PATCH 008/188] Bugs in base_loss_type's handling of weights fixed --- ...s functions fitted to simulated data.ipynb | 1448 +++++++++-------- pygom/loss/base_loss.py | 2 +- pygom/loss/loss_type.py | 43 +- pygom/loss/ode_loss.py | 7 +- 4 files changed, 769 insertions(+), 731 deletions(-) diff --git a/notebooks/Testing loss functions fitted to simulated data.ipynb b/notebooks/Testing loss functions fitted to simulated data.ipynb index c73591c1..776f5847 100644 --- a/notebooks/Testing loss functions fitted to simulated data.ipynb +++ b/notebooks/Testing loss functions fitted to simulated data.ipynb @@ -87,7 +87,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -175,210 +175,210 @@ { "data": { "text/plain": [ - "array([[ 0. , 0. , nan],\n", - " [-0.26594371, 0.0481614 , 0.14354852],\n", - " [ 0.18044689, -0.21459589, -0.23607263],\n", - " [-0.22631835, -0.25986512, 0.00977265],\n", - " [ 0.08317535, -0.24033984, -0.13717155],\n", - " [ 0.01893378, -0.30765339, -0.20936384],\n", - " [-0.1927195 , -0.20495292, 0.14883087],\n", - " [-0.31513136, 0.29092017, 0.20333613],\n", - " [-0.0144959 , -0.15434097, 0.15017585],\n", - " [-0.06943103, -0.04553612, 0.24527238],\n", - " [ 0.1423363 , -0.26289285, -0.27731679],\n", - " [ 0.22902387, -0.11970823, -0.0786823 ],\n", - " [ 0.24507763, 0.13939913, 0.19873885],\n", - " [ 0.0851626 , 0.33156697, -0.02946794],\n", - " [-0.18589297, 0.28048003, 0.15186529],\n", - " [ 0.10976604, -0.27140908, -0.29451267],\n", - " [-0.02481169, -0.01567338, 0.12217416],\n", - " [-0.00554871, -0.31163176, 0.09909475],\n", - " [ 0.20449806, -0.13271217, -0.21380146],\n", - " [ 0.23288222, -0.26931907, 0.17116807],\n", - " [-0.16775002, -0.08171666, 0.3285523 ],\n", - " [-0.13957109, -0.00980709, -0.0315168 ],\n", - " [ 0.06701958, 0.12872299, -0.03394576],\n", - " [-0.10946453, 0.20814074, -0.19773507],\n", - " [ 0.01024636, -0.18041067, -0.23682284],\n", - " [-0.07439538, 0.25262383, -0.17858645],\n", - " [ 0.29102576, 0.1511979 , -0.14440452],\n", - " [-0.11485163, 0.04940554, 0.06448306],\n", - " [ 0.10676958, 0.21332199, -0.10266298],\n", - " [ 0.05285174, 0.14572103, -0.30224747],\n", - " [ 0.21323456, -0.11097107, -0.09723039],\n", - " [-0.26727707, 0.18230789, -0.04970821],\n", - " [ 0.16396675, 0.30519932, 0.19783618],\n", - " [-0.29474402, 0.26031346, 0.15008278],\n", - " [ 0.1983954 , -0.09186773, 0.1033981 ],\n", - " [ 0.01819894, -0.30503091, -0.00801638],\n", - " [ 0.18546865, 0.17688293, 0.07902597],\n", - " [ 0.0076256 , -0.30361511, -0.15894734],\n", - " [-0.14879804, -0.19371648, -0.20285748],\n", - " [ 0.02042512, -0.03584361, 0.02819072],\n", - " [ 0.23491568, -0.06869137, -0.17772354],\n", - " [-0.06566397, -0.06776337, -0.12467524],\n", - " [-0.24064783, -0.02981388, -0.20090267],\n", - " [-0.2546167 , -0.09699615, 0.33171511],\n", - " [-0.28714369, -0.15456429, 0.17458153],\n", - " [ 0.30123993, 0.18002521, 0.1692988 ],\n", - " [ 0.02128767, -0.15262815, -0.32506278],\n", - " [ 0.33296938, 0.237988 , -0.30015583],\n", - " [-0.2934129 , 0.08130536, -0.09999738],\n", - " [-0.3235725 , 0.13686141, -0.2596026 ],\n", - " [ 0.15582601, -0.02119342, 0.0201688 ],\n", - " [-0.09663488, -0.00329313, -0.0186065 ],\n", - " [-0.13049885, -0.2873186 , 0.15998342],\n", - " [ 0.1820132 , 0.15728375, -0.17590421],\n", - " [ 0.32023337, -0.29931336, -0.07075369],\n", - " [-0.2687179 , 0.11859697, 0.19943461],\n", - " [-0.15646938, 0.32058394, 0.11942069],\n", - " [ 0.01135593, 0.20676602, -0.19312968],\n", - " [-0.12103279, 0.27442481, -0.06271944],\n", - " [ 0.16266687, 0.31851177, 0.00352883],\n", - " [-0.08580615, 0.18960581, 0.16840495],\n", - " [-0.08982207, 0.03192396, 0.1188008 ],\n", - " [-0.20494301, -0.01120558, 0.25235198],\n", - " [-0.1467698 , 0.22918715, -0.1282447 ],\n", - " [ 0.17906087, -0.10461238, 0.13495474],\n", - " [ 0.17601782, -0.03623687, -0.25142906],\n", - " [ 0.30978103, 0.00397469, 0.22194208],\n", - " [ 0.25752416, 0.1042392 , 0.25591297],\n", - " [-0.13772319, -0.11275306, 0.01176822],\n", - " [-0.1576899 , -0.07936526, -0.14969428],\n", - " [ 0.22779235, 0.15750085, -0.28242108],\n", - " [-0.0992169 , -0.24829993, -0.24564635],\n", - " [ 0.2802134 , -0.26679643, 0.14145995],\n", - " [-0.19666873, 0.10925674, -0.15420511],\n", - " [-0.15718523, -0.04667504, 0.10463 ],\n", - " [ 0.23934475, 0.23012487, 0.19921085],\n", - " [-0.05472834, -0.01380446, -0.2970063 ],\n", - " [ 0.10511899, -0.21625187, -0.00291365],\n", - " [-0.25868477, -0.10864835, -0.10815295],\n", - " [-0.0549668 , -0.26682451, 0.30208219],\n", - " [-0.2252228 , -0.28258864, 0.24447319],\n", - " [ 0.32262681, 0.24986113, -0.26776005],\n", - " [-0.28439645, 0.17894896, 0.04479451],\n", - " [ 0.23324145, 0.14693671, 0.03221976],\n", - " [ 0.19536078, 0.29770609, 0.28112025],\n", - " [ 0.26628981, -0.05904756, 0.25696101],\n", - " [ 0.26286499, -0.21866198, 0.25475143],\n", - " [-0.17818083, 0.21188372, 0.2483309 ],\n", - " [ 0.17844389, 0.08694361, 0.28079217],\n", - " [-0.2312997 , 0.06568179, 0.13610579],\n", - " [ 0.2905747 , -0.25361048, -0.05708808],\n", - " [ 0.22593571, 0.09708349, 0.07385119],\n", - " [ 0.01186936, -0.15807059, -0.08762729],\n", - " [-0.00639177, 0.0221159 , -0.03221789],\n", - " [-0.11634133, -0.23084855, -0.08819899],\n", - " [ 0.10440324, -0.2578205 , 0.04979053],\n", - " [ 0.19253324, 0.08374047, -0.32555527],\n", - " [-0.31328116, -0.31449333, -0.29090413],\n", - " [ 0.11266601, 0.02762068, 0.05099049],\n", - " [-0.009882 , 0.11925011, 0.29849163],\n", - " [ 0.07112188, -0.17385365, 0.06267588],\n", - " [-0.23180648, -0.02778307, -0.30315784],\n", - " [-0.10563222, 0.06910103, 0.2532015 ],\n", - " [ 0.07369744, 0.26329815, 0.15720732],\n", - " [ 0.12417477, 0.245335 , -0.04359579],\n", - " [-0.01950269, -0.22894254, 0.27712502],\n", - " [ 0.04573258, -0.04995886, 0.31596549],\n", - " [ 0.16523415, -0.17750199, -0.154256 ],\n", - " [-0.06935528, -0.11561912, -0.32852905],\n", - " [ 0.17573865, -0.16438354, 0.08092944],\n", - " [-0.14557532, -0.16221617, 0.20846123],\n", - " [-0.1530618 , 0.00607467, 0.1679275 ],\n", - " [ 0.2915459 , 0.03303514, 0.01665417],\n", - " [ 0.25416671, -0.13892646, -0.32628175],\n", - " [ 0.18898644, 0.21485992, -0.16411458],\n", - " [-0.31186503, -0.23293792, 0.24676476],\n", - " [ 0.01727794, -0.16295204, 0.29225053],\n", - " [-0.30057741, -0.19557768, 0.28403295],\n", - " [-0.08805621, -0.21801336, -0.14952844],\n", - " [ 0.17080778, -0.19999893, 0.10857179],\n", - " [-0.01016595, 0.03945573, -0.23341481],\n", - " [ 0.0889063 , -0.22661675, 0.27247754],\n", - " [-0.10284494, -0.21721198, -0.01215395],\n", - " [ 0.04750522, -0.05609498, -0.11760032],\n", - " [-0.12049032, 0.16369776, 0.22946754],\n", - " [-0.3259247 , 0.14942894, 0.01034819],\n", - " [ 0.30482666, 0.10876203, 0.18606517],\n", - " [-0.22421853, -0.1229635 , 0.31979197],\n", - " [-0.31666275, 0.18239926, -0.31941235],\n", - " [-0.15058556, 0.2803648 , 0.29741955],\n", - " [ 0.27943625, -0.31952391, -0.11504683],\n", - " [ 0.02835105, -0.15542857, -0.12654592],\n", - " [ 0.25274379, 0.06784749, -0.02814774],\n", - " [ 0.18619024, -0.15448604, -0.27449163],\n", - " [-0.19728779, 0.02537731, -0.00569949],\n", - " [-0.21443474, -0.01553967, 0.091896 ],\n", - " [-0.26827219, -0.05445831, -0.02413247],\n", - " [ 0.00827749, 0.1737784 , -0.02126288],\n", - " [ 0.23937747, 0.25076279, -0.00298444],\n", - " [-0.12216854, 0.29956893, 0.2265178 ],\n", - " [ 0.15886145, 0.1952358 , -0.10230103],\n", - " [-0.16707728, -0.11592906, 0.23063125],\n", - " [ 0.08048473, -0.28616788, 0.27649409],\n", - " [-0.2399056 , 0.17466809, 0.2670509 ],\n", - " [ 0.01100893, -0.22544906, 0.03502344],\n", - " [-0.24534992, -0.0282792 , 0.04012958],\n", - " [-0.32417314, 0.30503388, 0.07024417],\n", - " [-0.30165476, -0.03131702, -0.11390332],\n", - " [ 0.11602546, 0.17258092, 0.27320442],\n", - " [-0.01679539, 0.17988321, 0.07326227],\n", - " [ 0.32585914, -0.31318578, 0.21703063],\n", - " [-0.25118099, 0.08755176, 0.1418994 ],\n", - " [ 0.25308867, 0.27702219, -0.26432973],\n", - " [ 0.1694537 , 0.15167072, -0.24991087],\n", - " [ 0.32780948, -0.30710299, -0.16902237],\n", - " [ 0.25018489, -0.24231413, 0.03174931],\n", - " [ 0.05986629, 0.03359792, -0.30558626],\n", - " [-0.30815473, -0.11973154, 0.01174757],\n", - " [-0.13523555, -0.02621417, 0.18494329],\n", - " [ 0.19637621, -0.06536179, 0.16160518],\n", - " [ 0.16124011, 0.12639132, -0.02431527],\n", - " [ 0.19221785, 0.24196546, 0.00068597],\n", - " [ 0.08134284, 0.31422214, -0.20704816],\n", - " [ 0.1727692 , 0.02115635, -0.13793911],\n", - " [-0.28248369, 0.05719562, -0.09881328],\n", - " [-0.15519892, 0.30149671, 0.30585306],\n", - " [ 0.18343869, -0.18022277, 0.23596179],\n", - " [-0.09597099, 0.31572377, -0.02601189],\n", - " [-0.23722386, -0.20593368, -0.01834659],\n", - " [ 0.21902069, 0.24623962, -0.19736678],\n", - " [ 0.02226348, 0.21272945, -0.30751679],\n", - " [-0.24202336, -0.2567437 , 0.14965649],\n", - " [-0.25945811, 0.28880295, 0.33275319],\n", - " [ 0.28975049, 0.04492393, 0.24388337],\n", - " [-0.09991367, 0.11365879, -0.30462007],\n", - " [-0.33098441, -0.20249934, -0.32534145],\n", - " [-0.00702099, -0.2097019 , -0.11255923],\n", - " [ 0.23478388, 0.14543586, 0.32737759],\n", - " [-0.32148961, 0.03430904, -0.23725884],\n", - " [-0.15295436, -0.23766421, 0.16057446],\n", - " [ 0.24874516, 0.02814334, 0.05567249],\n", - " [ 0.18373544, 0.05456167, -0.00065203],\n", - " [ 0.29179694, -0.02776448, -0.27429118],\n", - " [ 0.19373542, -0.10868194, 0.10012632],\n", - " [-0.05908267, -0.20556755, -0.06223371],\n", - " [-0.08392523, -0.13577942, -0.14284998],\n", - " [ 0.10779361, 0.11329162, 0.17968936],\n", - " [-0.04555323, 0.22342669, 0.302655 ],\n", - " [ 0.31417606, 0.32366651, -0.24461707],\n", - " [ 0.25052832, 0.04730799, 0.0135891 ],\n", - " [ 0.24008863, 0.11260373, 0.10348191],\n", - " [ 0.26464085, -0.16812188, -0.23981266],\n", - " [-0.23031692, 0.25901614, 0.25404338],\n", - " [-0.08783901, 0.21082491, 0.09234899],\n", - " [-0.12828791, 0.23402825, -0.13942016],\n", - " [ 0.17317795, 0.06544127, -0.32470743],\n", - " [-0.01350832, -0.20846687, 0.06141013],\n", - " [ 0.08516377, -0.27381567, 0.19523863],\n", - " [-0.2885919 , 0.04913673, 0.27292814],\n", - " [-0.14942594, -0.11490962, -0.27067257],\n", - " [ 0.0428627 , 0.22205546, 0.16590721],\n", - " [ 0.16898513, -0.03668338, -0.06368085],\n", - " [ 0.30915912, -0.13559047, -0.05790722],\n", - " [ 0.28353642, -0.20041566, -0.00223925]])" + "array([[ 0.00000000e+00, 0.00000000e+00, nan],\n", + " [-3.21943456e-01, 1.85865527e-01, -1.13217774e-01],\n", + " [-2.10940831e-01, -1.40000086e-01, 3.21150841e-01],\n", + " [ 1.81602995e-01, 1.28076820e-02, 2.49787871e-01],\n", + " [-1.99910787e-01, -3.21987422e-01, 6.59265374e-02],\n", + " [-3.07353570e-01, -2.27188132e-01, 2.17562011e-01],\n", + " [-5.63337347e-02, -1.89013740e-01, 2.84964767e-02],\n", + " [ 2.31501967e-01, 6.14997028e-02, -2.35895637e-01],\n", + " [ 2.23927782e-01, -1.01405449e-01, -1.98699260e-01],\n", + " [ 2.48735438e-01, -3.53640373e-02, 1.67031470e-01],\n", + " [ 4.94412026e-02, -1.52057161e-01, 2.09835766e-01],\n", + " [-2.06776227e-01, 3.13201462e-01, -4.29291297e-02],\n", + " [ 2.46433170e-02, -2.84114224e-01, 3.25711119e-03],\n", + " [ 1.92155506e-01, 2.17675626e-01, 5.62946687e-02],\n", + " [-1.44069462e-01, 1.35347749e-01, -1.82909871e-01],\n", + " [-8.29226910e-02, 3.23393603e-01, -2.81718008e-01],\n", + " [-3.76928728e-02, 3.23038547e-02, -2.86446432e-01],\n", + " [-3.11282664e-01, 1.27084504e-01, -2.59438059e-02],\n", + " [-2.62325766e-02, 2.69860578e-01, 1.18361484e-01],\n", + " [ 1.06221765e-01, -9.70804044e-02, -2.74947371e-01],\n", + " [-2.71437837e-02, -2.18447494e-01, -5.67370795e-02],\n", + " [-3.12189987e-01, 2.22512900e-01, -1.66663625e-01],\n", + " [-1.28018641e-01, -2.34923267e-01, 1.41683585e-02],\n", + " [ 2.32254315e-01, -3.26165428e-01, 2.34238143e-01],\n", + " [ 8.69678367e-02, 1.64301394e-01, -2.47656180e-01],\n", + " [ 1.40965168e-01, 6.32849105e-02, -9.45633773e-02],\n", + " [ 3.07096765e-01, -1.42502266e-01, -3.77726686e-02],\n", + " [-6.09429143e-02, 1.63808739e-01, 3.28916009e-01],\n", + " [ 3.82767127e-02, 3.20843549e-02, -7.79089580e-02],\n", + " [ 9.56398819e-02, 4.18597131e-02, 4.03213450e-02],\n", + " [ 1.27231497e-01, -8.30499409e-02, -7.31856628e-02],\n", + " [ 4.95710698e-02, 2.76706458e-01, 2.05492090e-01],\n", + " [-2.08266620e-01, 2.39049966e-01, 2.01173560e-01],\n", + " [-2.93349546e-01, -2.57007747e-01, 9.98727121e-03],\n", + " [-3.22996838e-01, 1.46160366e-01, 1.80225707e-01],\n", + " [-1.87518084e-01, -3.77615176e-02, -6.75263992e-02],\n", + " [ 1.79662877e-01, -1.35008808e-01, 2.83698888e-01],\n", + " [ 1.35604549e-02, -2.62201419e-01, -2.72549801e-01],\n", + " [ 3.88544297e-02, -5.52991492e-02, 1.35833062e-02],\n", + " [ 9.16412350e-04, -9.24962534e-02, 2.09220178e-01],\n", + " [ 3.25720195e-01, -1.13579915e-01, 6.44327795e-02],\n", + " [ 1.85011815e-01, 2.56123076e-01, -4.11627271e-02],\n", + " [-2.82554284e-01, 2.64315337e-01, -8.83167048e-02],\n", + " [-1.86349157e-01, 3.56996669e-02, 2.01663352e-01],\n", + " [-1.57759231e-01, 1.39231206e-01, -1.85782649e-01],\n", + " [ 7.03547306e-02, 1.01422084e-01, 1.23427057e-01],\n", + " [ 2.76699346e-02, -3.91221695e-02, 2.16061024e-01],\n", + " [ 1.59004020e-01, -2.21259419e-01, 3.27064373e-01],\n", + " [ 1.47263354e-01, -1.04940533e-01, 2.44662128e-01],\n", + " [-1.02896184e-01, -1.55783920e-01, 2.95573231e-01],\n", + " [-2.68855926e-01, 3.19496258e-01, -2.91857351e-01],\n", + " [ 1.13792396e-01, -1.79844552e-01, 3.31017884e-01],\n", + " [-2.88347996e-01, -2.13458276e-01, 7.44025583e-02],\n", + " [ 7.94402079e-02, -4.94810671e-02, -5.15517506e-02],\n", + " [ 2.73209861e-01, 4.98005575e-02, 3.17599430e-01],\n", + " [-1.26001530e-01, 1.86226792e-01, -2.41490855e-01],\n", + " [ 2.20762784e-01, 2.08149383e-01, -1.95067777e-01],\n", + " [ 7.66135816e-02, -2.49310855e-01, -9.13035120e-02],\n", + " [ 1.97046212e-01, -2.14907322e-02, 3.29487704e-01],\n", + " [ 1.55059587e-01, -2.26415078e-01, 1.59962712e-01],\n", + " [ 2.11096333e-01, -2.65176253e-01, -4.05930821e-03],\n", + " [ 2.79075501e-01, 1.92098721e-01, -8.23100303e-02],\n", + " [-3.08439506e-01, -7.98957238e-02, -5.01829836e-02],\n", + " [-2.03697278e-01, 2.05995436e-01, -9.14985961e-02],\n", + " [ 1.20521659e-01, 3.00440276e-01, 1.47263752e-02],\n", + " [-2.27957751e-01, -8.21201620e-02, -1.19488396e-02],\n", + " [ 1.59556225e-01, -2.82204036e-02, -2.21599601e-01],\n", + " [ 2.15680392e-01, 3.03996830e-01, -2.71423977e-01],\n", + " [ 1.77769288e-01, 2.09960478e-01, 8.39473619e-02],\n", + " [ 1.13717062e-01, -1.79358977e-01, -4.59715825e-03],\n", + " [-1.84322552e-01, -2.26755373e-01, -2.39767730e-01],\n", + " [ 1.86058326e-01, -3.21698703e-01, -2.46524540e-01],\n", + " [ 2.86200529e-01, -2.17887930e-01, 3.57893365e-02],\n", + " [-1.18158603e-01, -6.54001442e-02, -2.87505412e-01],\n", + " [-1.50315173e-01, 1.42851125e-01, 2.20421926e-01],\n", + " [-2.23556346e-01, -1.92795329e-01, 1.74674105e-01],\n", + " [-2.31639431e-01, -4.84220495e-02, -8.52286090e-02],\n", + " [ 1.20174394e-01, -1.96588635e-01, 2.49598607e-01],\n", + " [ 1.96578388e-01, -6.38269970e-02, 9.43425551e-02],\n", + " [-3.81314176e-02, 3.18781466e-01, 1.77470481e-01],\n", + " [ 4.32925130e-02, -2.00318211e-01, 4.17754219e-02],\n", + " [ 2.36790925e-01, -1.03921195e-01, -3.30797879e-02],\n", + " [ 1.99476702e-01, -1.43344835e-01, 5.64405904e-02],\n", + " [ 3.31310790e-01, 1.50853809e-01, 1.35732696e-01],\n", + " [-2.41321604e-01, 3.19392547e-01, -4.54542545e-02],\n", + " [-6.91929812e-03, -2.13076727e-01, -1.63392477e-01],\n", + " [-1.22865716e-01, -1.78234910e-01, 2.03967351e-01],\n", + " [ 3.30704049e-01, 9.71682583e-02, -3.08190158e-01],\n", + " [ 2.00774222e-01, -1.42644728e-01, -2.98044193e-01],\n", + " [-2.23396056e-01, -2.40914551e-01, 2.12421125e-01],\n", + " [ 7.12265936e-02, 2.47778623e-02, -2.88177768e-01],\n", + " [-2.60885258e-01, 3.13300871e-01, 1.71580578e-01],\n", + " [-1.36024349e-01, -6.65814427e-02, -6.26423574e-02],\n", + " [ 1.55892372e-01, 2.48340883e-01, -2.95586414e-01],\n", + " [-1.77048639e-01, 3.20849855e-02, 3.03433400e-01],\n", + " [ 1.31558930e-01, 2.33285122e-01, -2.34144482e-02],\n", + " [-9.99275328e-02, -8.26120829e-02, 2.48214915e-01],\n", + " [ 1.06138964e-01, 1.75757064e-01, -3.19240383e-01],\n", + " [ 1.62623817e-01, 2.72537446e-02, -5.92349069e-02],\n", + " [-1.50942703e-01, 8.10263676e-02, -2.45111595e-01],\n", + " [ 1.80449990e-01, 2.72827791e-01, 1.08298678e-01],\n", + " [-2.32438202e-01, 2.88886019e-01, -1.84345430e-01],\n", + " [ 2.49503066e-01, 3.10983987e-01, -2.86543276e-01],\n", + " [ 1.20511488e-01, 5.13694112e-03, 1.36225876e-01],\n", + " [ 2.68332086e-01, 3.15883069e-01, 4.00702873e-02],\n", + " [-2.69552790e-01, 1.13927547e-01, -1.31478459e-01],\n", + " [ 1.53144584e-01, 2.49076716e-01, -2.26674703e-01],\n", + " [-1.03603484e-01, -2.10210157e-02, -2.41978432e-01],\n", + " [ 1.96105677e-01, -2.68912665e-01, 2.84057482e-01],\n", + " [ 1.07999685e-01, 9.50813469e-02, 1.44150697e-01],\n", + " [ 1.18566775e-02, 1.67907743e-01, 8.67410283e-02],\n", + " [-1.40939249e-01, 2.15215929e-01, 1.36839282e-01],\n", + " [-9.05791123e-02, -1.79494555e-01, -3.22292115e-01],\n", + " [-1.62777658e-01, -1.38902568e-01, -1.04280378e-01],\n", + " [-2.48846862e-01, 5.49497354e-02, -2.55146872e-01],\n", + " [-1.92560097e-01, 2.75780669e-01, 1.38053097e-02],\n", + " [ 7.22306638e-02, 2.51954666e-01, 2.00025665e-01],\n", + " [-1.48601712e-01, -6.24716939e-02, 1.22190401e-01],\n", + " [ 2.96343742e-01, -9.16466617e-02, -2.79057616e-01],\n", + " [-9.44903089e-02, 2.02212337e-01, 1.30955098e-01],\n", + " [ 2.59779211e-01, -3.17918046e-01, 1.04952796e-01],\n", + " [-9.19699690e-02, 3.24716030e-01, 1.02188300e-01],\n", + " [-1.56266425e-01, 2.22184605e-01, 9.96280301e-02],\n", + " [-8.09897738e-02, 1.34471312e-01, -7.32451926e-02],\n", + " [-1.40359625e-01, -2.11776854e-02, -3.10384400e-01],\n", + " [-2.73853206e-01, -1.95512118e-01, 3.98482839e-02],\n", + " [-1.27223980e-01, -2.32593176e-01, 1.70883648e-01],\n", + " [ 4.92405598e-02, 8.50372783e-02, 4.05976680e-02],\n", + " [ 1.29315076e-01, 1.81514925e-01, 2.69971751e-01],\n", + " [ 5.07861648e-02, -7.40873609e-02, 1.65365118e-01],\n", + " [ 2.68151227e-01, -1.45063285e-01, -2.16386660e-02],\n", + " [-3.17820212e-01, 1.62066777e-01, -2.07795803e-01],\n", + " [-3.16812154e-01, 2.96508501e-01, 1.92175410e-01],\n", + " [ 1.96337705e-01, 8.81620255e-02, -1.02653817e-01],\n", + " [-1.93525139e-01, -2.03936400e-01, 1.70445013e-01],\n", + " [-2.87456720e-02, -1.07611842e-01, 2.49101875e-01],\n", + " [ 8.09404791e-02, -3.21299706e-02, 1.23033680e-01],\n", + " [ 2.59498758e-01, -2.55703800e-02, -2.66267193e-01],\n", + " [ 2.35573590e-01, -1.56838315e-01, 2.56689692e-01],\n", + " [ 1.30542822e-01, 2.69746313e-01, -2.57985160e-01],\n", + " [ 1.74263648e-01, 2.29095931e-01, 7.48744349e-02],\n", + " [ 2.86189769e-01, 2.79547063e-01, 6.85199411e-02],\n", + " [-1.05937815e-01, 1.79938630e-01, 7.44842201e-02],\n", + " [ 2.15354490e-01, 1.79798390e-01, 1.86155500e-01],\n", + " [-2.40897200e-01, -1.23944817e-01, 6.86891899e-05],\n", + " [ 1.92303073e-01, 2.93842299e-01, 1.69436631e-01],\n", + " [ 6.00638743e-02, -1.92023781e-01, -2.35632974e-01],\n", + " [ 1.08886035e-01, -3.11263490e-01, 6.42473250e-02],\n", + " [-2.28977828e-01, -2.88312273e-01, -4.60168657e-02],\n", + " [ 1.88477181e-03, -1.41546947e-01, 3.28242664e-01],\n", + " [-1.73354229e-01, 3.13080313e-01, 2.87096208e-01],\n", + " [ 4.29327556e-02, -1.06010816e-01, 2.17850274e-01],\n", + " [ 6.71826155e-02, 6.18062750e-03, -1.61497479e-01],\n", + " [ 1.03828416e-01, 1.42508637e-01, 3.30062436e-01],\n", + " [ 2.68190801e-01, -2.61865575e-02, -4.02513191e-02],\n", + " [-2.31829458e-01, -1.09360422e-01, -3.29300076e-01],\n", + " [-1.81418170e-01, -5.11671925e-02, -9.01593327e-02],\n", + " [-3.11486686e-01, 3.11728877e-02, -3.05828061e-01],\n", + " [ 1.86347159e-01, 2.36229401e-01, 3.01929479e-01],\n", + " [-2.92591029e-01, 9.08584343e-02, -1.40299446e-01],\n", + " [-1.05944855e-02, 1.61865581e-01, -2.50704225e-01],\n", + " [-2.45622639e-02, -3.16306034e-01, -2.69959629e-01],\n", + " [ 8.84372993e-02, -2.81337428e-01, 1.35729306e-01],\n", + " [-6.21876036e-02, -5.41408363e-02, 1.77717783e-01],\n", + " [ 2.05371132e-01, 1.73047469e-02, 3.20133765e-01],\n", + " [ 1.28758414e-01, 4.28390061e-03, 8.84307448e-02],\n", + " [ 2.02100596e-01, -6.90202732e-03, -1.15680333e-01],\n", + " [ 4.91767073e-02, 2.68686316e-01, 1.27224288e-01],\n", + " [ 1.53107746e-01, -2.24791872e-01, -2.82729565e-01],\n", + " [ 1.27456089e-01, 2.89267392e-02, -2.31685444e-01],\n", + " [ 1.21530019e-01, -1.50701614e-01, -2.20018436e-01],\n", + " [ 2.40944283e-01, -5.44516998e-02, 1.78625669e-01],\n", + " [-2.20691466e-01, 2.27806142e-01, -3.19788277e-01],\n", + " [ 5.43321208e-02, -1.68073613e-01, 2.88610851e-01],\n", + " [-5.14881733e-02, -2.17052746e-01, 8.46518610e-02],\n", + " [-3.26344726e-01, -2.65734801e-01, -3.29900167e-01],\n", + " [ 2.91065837e-01, -8.86418051e-02, 1.43952139e-01],\n", + " [-3.18629385e-01, 2.42564945e-01, -1.50746165e-01],\n", + " [ 1.31558589e-02, -1.37399607e-01, -3.10027779e-02],\n", + " [-2.82888143e-01, -1.97311938e-01, -1.71934170e-01],\n", + " [-3.26726159e-01, -1.46398217e-01, -2.67336805e-01],\n", + " [-2.50764400e-01, 2.40030847e-01, 1.90164020e-01],\n", + " [-1.86402443e-01, -1.59800689e-01, -1.24289238e-01],\n", + " [-3.23243518e-01, 1.64399910e-01, 1.89434490e-02],\n", + " [ 1.62444666e-01, 1.72003606e-01, 3.15533874e-01],\n", + " [ 4.11196377e-02, -8.77415417e-02, 1.23995207e-01],\n", + " [ 1.28272258e-01, -2.32939686e-02, 4.35417997e-02],\n", + " [-1.75479288e-01, 9.41603764e-02, 2.52966436e-01],\n", + " [-1.12455732e-01, 1.64264689e-01, -3.33227910e-01],\n", + " [-2.10629561e-02, 2.63683701e-01, -2.22926132e-01],\n", + " [ 4.89649368e-02, 1.17222997e-01, 2.04754960e-01],\n", + " [-1.00714628e-01, 7.93490662e-02, -7.47079386e-02],\n", + " [ 2.92136018e-03, 1.29087068e-01, -1.48908029e-01],\n", + " [ 1.13242124e-01, -1.04279228e-01, 2.47219125e-01],\n", + " [-2.18469863e-01, -1.99858094e-01, -3.11419043e-01],\n", + " [ 2.82152105e-01, -5.74810426e-02, 6.78507853e-02],\n", + " [ 1.90039518e-01, -2.49188273e-01, -2.24943614e-01],\n", + " [-1.39040280e-01, -1.70893861e-01, -9.90695495e-02],\n", + " [-1.54891812e-01, 2.19340978e-01, -2.86544108e-03],\n", + " [ 1.54253118e-01, 1.73852897e-01, -1.74464629e-01],\n", + " [-9.57521372e-02, 1.46961351e-01, 3.27614130e-01],\n", + " [ 3.20980053e-01, -1.54030722e-01, -3.70355927e-03],\n", + " [ 1.10411322e-01, -1.66169988e-01, -2.91024643e-01],\n", + " [ 2.03023170e-01, 2.57521968e-01, -1.37497649e-01]])" ] }, "execution_count": 8, @@ -400,7 +400,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -436,209 +436,209 @@ { "data": { "text/plain": [ - "array([[4.90464096e+00, 1.80229297e-01],\n", - " [8.59843745e+00, 4.02088747e-01],\n", - " [1.89574734e+01, 1.40262775e+00],\n", - " [4.55221314e+01, 2.94002911e+00],\n", - " [9.70595088e+01, 6.42741549e+00],\n", - " [2.60715165e+02, 2.20294695e+01],\n", - " [9.89941096e+02, 5.41627913e+01],\n", - " [1.51549915e+03, 1.21234960e+02],\n", - " [3.99119374e+03, 3.06882053e+02],\n", - " [7.16646079e+03, 4.15491759e+02],\n", - " [1.97356855e+04, 1.23045676e+03],\n", - " [5.78166023e+04, 3.68388673e+03],\n", - " [1.46862042e+05, 6.72234947e+03],\n", - " [2.83221926e+05, 1.72384073e+04],\n", - " [2.82099064e+05, 2.11595297e+04],\n", - " [5.58399812e+05, 6.05232963e+04],\n", - " [4.82619234e+05, 9.44362098e+04],\n", - " [6.65765758e+05, 9.66241419e+04],\n", - " [5.72747123e+05, 1.89549046e+05],\n", - " [7.09146912e+05, 2.66809758e+05],\n", - " [7.40234990e+05, 2.31329292e+05],\n", - " [8.09839926e+05, 2.66144343e+05],\n", - " [8.28408036e+05, 2.49165951e+05],\n", - " [5.35922195e+05, 2.62582973e+05],\n", - " [7.80220803e+05, 3.08835399e+05],\n", - " [6.82617907e+05, 3.47689342e+05],\n", - " [5.92186788e+05, 4.63366922e+05],\n", - " [6.51475912e+05, 4.15308489e+05],\n", - " [5.85276935e+05, 3.41209635e+05],\n", - " [4.32046981e+05, 4.63958279e+05],\n", - " [5.46589709e+05, 5.10905271e+05],\n", - " [5.74001575e+05, 6.71000810e+05],\n", - " [5.27246397e+05, 6.68918229e+05],\n", - " [3.61392141e+05, 6.64278025e+05],\n", - " [2.63079400e+05, 6.16456105e+05],\n", - " [4.23783943e+05, 6.90468622e+05],\n", - " [2.38533388e+05, 5.52959981e+05],\n", - " [2.62709237e+05, 5.37407391e+05],\n", - " [2.98828587e+05, 7.09511325e+05],\n", - " [2.74571172e+05, 5.79847948e+05],\n", - " [2.61441068e+05, 6.29842262e+05],\n", - " [2.58814617e+05, 5.85922250e+05],\n", - " [2.29144409e+05, 9.93779854e+05],\n", - " [2.04073231e+05, 8.91056939e+05],\n", - " [2.70945802e+05, 9.00814781e+05],\n", - " [1.85076291e+05, 5.27522223e+05],\n", - " [2.57204604e+05, 5.54443973e+05],\n", - " [2.13695888e+05, 7.22136698e+05],\n", - " [2.13717852e+05, 6.01210232e+05],\n", - " [1.75031250e+05, 8.37740727e+05],\n", - " [1.69539766e+05, 8.14458217e+05],\n", - " [1.15314773e+05, 9.72293020e+05],\n", - " [1.78120848e+05, 6.97256650e+05],\n", - " [1.02585057e+05, 7.93198444e+05],\n", - " [1.55782711e+05, 1.03239372e+06],\n", - " [1.74943163e+05, 9.71126263e+05],\n", - " [1.52068538e+05, 7.05193833e+05],\n", - " [1.52762181e+05, 8.24930915e+05],\n", - " [1.50338761e+05, 8.89104794e+05],\n", - " [1.29025441e+05, 1.04167885e+06],\n", - " [1.06464615e+05, 1.00337291e+06],\n", - " [9.70395803e+04, 1.12944693e+06],\n", - " [1.14748290e+05, 7.90374269e+05],\n", - " [7.95105215e+04, 1.03417055e+06],\n", - " [8.14083834e+04, 6.85339633e+05],\n", - " [8.06690402e+04, 1.12375935e+06],\n", - " [8.43980836e+04, 1.15992224e+06],\n", - " [6.45058699e+04, 9.38209174e+05],\n", - " [6.36689048e+04, 7.91500558e+05],\n", - " [7.61459197e+04, 6.70373122e+05],\n", - " [4.70386884e+04, 7.07148873e+05],\n", - " [4.36435911e+04, 1.07351504e+06],\n", - " [6.28077554e+04, 7.97904695e+05],\n", - " [5.13460989e+04, 1.04513457e+06],\n", - " [6.30232768e+04, 1.13777135e+06],\n", - " [4.80618082e+04, 6.68733585e+05],\n", - " [3.63328010e+04, 9.50863634e+05],\n", - " [3.93058078e+04, 8.52519368e+05],\n", - " [3.07539481e+04, 1.24746471e+06],\n", - " [2.86250646e+04, 1.19481806e+06],\n", - " [4.74378807e+04, 7.04448109e+05],\n", - " [4.25641347e+04, 1.00707379e+06],\n", - " [3.93888722e+04, 9.96770546e+05],\n", - " [4.23931532e+04, 1.23926888e+06],\n", - " [2.92396611e+04, 1.21790150e+06],\n", - " [2.30955819e+04, 1.21766218e+06],\n", - " [3.40750253e+04, 1.21323104e+06],\n", - " [2.90715064e+04, 1.24653594e+06],\n", - " [2.71127364e+04, 1.10720133e+06],\n", - " [1.80632805e+04, 9.20092600e+05],\n", - " [2.52555051e+04, 1.04913048e+06],\n", - " [1.84364518e+04, 8.92393680e+05],\n", - " [2.12905604e+04, 9.47623291e+05],\n", - " [1.52399694e+04, 8.93734566e+05],\n", - " [1.39883494e+04, 1.03000441e+06],\n", - " [1.94297894e+04, 6.62352965e+05],\n", - " [1.16906798e+04, 6.97002881e+05],\n", - " [1.66704070e+04, 1.03394095e+06],\n", - " [1.72713306e+04, 1.27845437e+06],\n", - " [1.21266522e+04, 1.04707729e+06],\n", - " [1.35747674e+04, 6.87112352e+05],\n", - " [1.41995065e+04, 1.23655680e+06],\n", - " [1.59604690e+04, 1.14258717e+06],\n", - " [1.49661903e+04, 9.44910315e+05],\n", - " [8.81448811e+03, 1.26252531e+06],\n", - " [1.03308974e+04, 1.30165545e+06],\n", - " [8.50777068e+03, 8.36995757e+05],\n", - " [8.70172886e+03, 6.64864104e+05],\n", - " [7.82093131e+03, 1.07081249e+06],\n", - " [7.45879620e+03, 1.19770227e+06],\n", - " [8.52024863e+03, 1.15803653e+06],\n", - " [8.32189873e+03, 1.00846421e+06],\n", - " [6.59831222e+03, 6.68555612e+05],\n", - " [8.85531680e+03, 8.29792492e+05],\n", - " [5.31855548e+03, 1.23812008e+06],\n", - " [5.52075923e+03, 1.28372745e+06],\n", - " [5.04682049e+03, 1.27597711e+06],\n", - " [4.66679110e+03, 8.45396050e+05],\n", - " [4.54145355e+03, 1.10227862e+06],\n", - " [5.61300707e+03, 7.62445652e+05],\n", - " [3.97255243e+03, 1.26594133e+06],\n", - " [3.82476121e+03, 9.83019339e+05],\n", - " [4.38706165e+03, 8.78298467e+05],\n", - " [5.14482874e+03, 1.22403191e+06],\n", - " [4.83390522e+03, 1.00609917e+06],\n", - " [4.43546984e+03, 1.18132044e+06],\n", - " [3.33736908e+03, 1.31476977e+06],\n", - " [4.27992342e+03, 6.78124116e+05],\n", - " [4.40850014e+03, 1.29295231e+06],\n", - " [2.22871884e+03, 8.82054729e+05],\n", - " [2.63126192e+03, 8.70732818e+05],\n", - " [3.16462468e+03, 9.68972110e+05],\n", - " [2.38352132e+03, 7.23463131e+05],\n", - " [2.74958560e+03, 9.91634243e+05],\n", - " [2.51111756e+03, 1.08911082e+06],\n", - " [2.29421855e+03, 9.73499719e+05],\n", - " [2.70910290e+03, 9.76478163e+05],\n", - " [2.74599424e+03, 9.94826643e+05],\n", - " [2.71399644e+03, 1.22395635e+06],\n", - " [2.37437235e+03, 8.95915646e+05],\n", - " [1.67058137e+03, 1.22830577e+06],\n", - " [1.28310408e+03, 1.27419959e+06],\n", - " [2.00847418e+03, 1.26488445e+06],\n", - " [1.25975575e+03, 1.03334003e+06],\n", - " [1.50336053e+03, 1.03852036e+06],\n", - " [1.92056369e+03, 1.06866912e+06],\n", - " [1.35604430e+03, 8.84856232e+05],\n", - " [1.56142207e+03, 1.27150899e+06],\n", - " [1.49452022e+03, 1.07190279e+06],\n", - " [8.27536828e+02, 1.21556422e+06],\n", - " [1.24647414e+03, 1.14059062e+06],\n", - " [1.39224948e+03, 7.34868209e+05],\n", - " [1.19435169e+03, 7.49311234e+05],\n", - " [6.83530459e+02, 8.30157875e+05],\n", - " [7.10990264e+02, 1.03078113e+06],\n", - " [9.22595586e+02, 6.93793896e+05],\n", - " [7.47412178e+02, 1.01088851e+06],\n", - " [7.86491010e+02, 1.18398624e+06],\n", - " [7.18057337e+02, 1.16071273e+06],\n", - " [8.23171200e+02, 9.74971676e+05],\n", - " [8.63367455e+02, 9.99990314e+05],\n", - " [8.69040904e+02, 7.92427482e+05],\n", - " [6.42316325e+02, 8.61518628e+05],\n", - " [6.32553637e+02, 9.00647496e+05],\n", - " [7.40747779e+02, 1.30510982e+06],\n", - " [4.43821580e+02, 1.23529263e+06],\n", - " [6.77583106e+02, 9.73486505e+05],\n", - " [3.88991313e+02, 9.81172515e+05],\n", - " [5.80724252e+02, 8.02259191e+05],\n", - " [5.37548455e+02, 6.92176252e+05],\n", - " [3.13384546e+02, 1.14917174e+06],\n", - " [5.16905055e+02, 1.33221864e+06],\n", - " [3.98652245e+02, 1.24340879e+06],\n", - " [4.04154080e+02, 6.95127565e+05],\n", - " [2.75303132e+02, 6.74425641e+05],\n", - " [2.59511329e+02, 8.87149341e+05],\n", - " [3.57784433e+02, 1.32696295e+06],\n", - " [3.07316774e+02, 7.62514516e+05],\n", - " [2.15460438e+02, 1.16024642e+06],\n", - " [2.76414090e+02, 1.05538866e+06],\n", - " [2.69689336e+02, 9.99092387e+05],\n", - " [2.36509482e+02, 7.25532274e+05],\n", - " [2.06250526e+02, 1.09987173e+06],\n", - " [1.74865694e+02, 9.37559865e+05],\n", - " [1.80949557e+02, 8.56970535e+05],\n", - " [2.21731370e+02, 1.17945438e+06],\n", - " [2.31782922e+02, 1.30240818e+06],\n", - " [2.38543368e+02, 7.55246791e+05],\n", - " [1.79534727e+02, 1.01341533e+06],\n", - " [1.81426132e+02, 1.10330196e+06],\n", - " [1.29034045e+02, 7.60069418e+05],\n", - " [1.85763844e+02, 1.25385833e+06],\n", - " [1.69940356e+02, 1.09219566e+06],\n", - " [1.64750052e+02, 8.60464933e+05],\n", - " [1.35305439e+02, 6.75206798e+05],\n", - " [9.56181015e+01, 1.06128189e+06],\n", - " [8.34455489e+01, 1.19510127e+06],\n", - " [1.14676301e+02, 1.27278898e+06],\n", - " [9.20268352e+01, 7.29251586e+05],\n", - " [1.20865697e+02, 1.16579188e+06],\n", - " [9.06288530e+01, 9.36231050e+05],\n", - " [7.73574703e+01, 9.42008457e+05],\n", - " [6.80663206e+01, 9.97675798e+05]])" + "array([[5.54899714e+00, 1.39761571e-01],\n", + " [9.41509648e+00, 6.95380093e-01],\n", + " [2.59415887e+01, 1.73602161e+00],\n", + " [4.06294543e+01, 3.63207199e+00],\n", + " [1.08339867e+02, 9.89807619e+00],\n", + " [2.65942008e+02, 1.97219908e+01],\n", + " [8.14010192e+02, 3.43927387e+01],\n", + " [1.61036450e+03, 8.44615745e+01],\n", + " [4.03372942e+03, 2.87600545e+02],\n", + " [8.24405119e+03, 6.95570046e+02],\n", + " [2.94412965e+04, 1.27820655e+03],\n", + " [3.63262375e+04, 3.08314488e+03],\n", + " [1.34300664e+05, 7.31638055e+03],\n", + " [2.51120961e+05, 1.22282810e+04],\n", + " [5.12397402e+05, 2.15432773e+04],\n", + " [5.85616873e+05, 3.84847695e+04],\n", + " [7.90205922e+05, 8.36926709e+04],\n", + " [9.74797129e+05, 1.37447113e+05],\n", + " [7.07757082e+05, 1.17346978e+05],\n", + " [6.03556137e+05, 1.89433078e+05],\n", + " [9.13909621e+05, 1.99048484e+05],\n", + " [5.48929799e+05, 2.79399602e+05],\n", + " [4.62040519e+05, 3.83327390e+05],\n", + " [7.61326355e+05, 2.58855593e+05],\n", + " [6.62287422e+05, 3.40426427e+05],\n", + " [5.08464539e+05, 3.91021455e+05],\n", + " [6.56745303e+05, 5.78473948e+05],\n", + " [5.54162951e+05, 4.26765230e+05],\n", + " [5.32220707e+05, 5.08730031e+05],\n", + " [4.45615989e+05, 4.76315527e+05],\n", + " [5.90230868e+05, 6.48108582e+05],\n", + " [5.44910361e+05, 6.72870334e+05],\n", + " [3.10827425e+05, 5.87435017e+05],\n", + " [4.56115660e+05, 7.10530498e+05],\n", + " [3.64253784e+05, 5.79474331e+05],\n", + " [3.11474802e+05, 8.21438803e+05],\n", + " [2.52718860e+05, 4.78270705e+05],\n", + " [3.07809391e+05, 6.83324686e+05],\n", + " [2.81269787e+05, 8.34432164e+05],\n", + " [2.61336999e+05, 7.50610280e+05],\n", + " [3.52273390e+05, 6.89933915e+05],\n", + " [3.37278880e+05, 6.68473671e+05],\n", + " [2.62817027e+05, 8.96729957e+05],\n", + " [2.74990268e+05, 6.17678724e+05],\n", + " [2.52897724e+05, 8.65475700e+05],\n", + " [2.09867373e+05, 9.50457602e+05],\n", + " [1.61791280e+05, 1.05135240e+06],\n", + " [1.76888541e+05, 9.98681754e+05],\n", + " [1.58703643e+05, 1.05201866e+06],\n", + " [2.35953746e+05, 5.81511546e+05],\n", + " [1.39508382e+05, 1.10461141e+06],\n", + " [1.27265676e+05, 9.00559518e+05],\n", + " [1.46297085e+05, 8.02469639e+05],\n", + " [1.53697592e+05, 1.12469407e+06],\n", + " [1.65201257e+05, 6.52874344e+05],\n", + " [1.60048497e+05, 6.98299422e+05],\n", + " [9.45967979e+04, 7.94188534e+05],\n", + " [1.17291509e+05, 1.17012509e+06],\n", + " [8.82053548e+04, 1.02770182e+06],\n", + " [7.96994745e+04, 8.87920192e+05],\n", + " [1.22990003e+05, 8.23010899e+05],\n", + " [9.02983786e+04, 8.56602566e+05],\n", + " [1.12583275e+05, 8.23690011e+05],\n", + " [1.15479244e+05, 9.24618482e+05],\n", + " [7.75326545e+04, 9.04591116e+05],\n", + " [7.80821749e+04, 7.15856130e+05],\n", + " [9.96657551e+04, 6.72890200e+05],\n", + " [8.79682412e+04, 1.00514064e+06],\n", + " [5.67535777e+04, 9.26563100e+05],\n", + " [5.08677148e+04, 7.10220532e+05],\n", + " [4.24456569e+04, 7.06325639e+05],\n", + " [4.65548460e+04, 9.74134427e+05],\n", + " [5.29184248e+04, 6.72152061e+05],\n", + " [6.15539817e+04, 1.15468993e+06],\n", + " [4.13557069e+04, 1.11449170e+06],\n", + " [4.63747352e+04, 8.70190374e+05],\n", + " [3.72443444e+04, 1.19166998e+06],\n", + " [4.12822885e+04, 1.04608545e+06],\n", + " [5.53179116e+04, 1.12807999e+06],\n", + " [3.19076952e+04, 1.00020804e+06],\n", + " [3.40102420e+04, 9.30221189e+05],\n", + " [3.09282140e+04, 1.01829940e+06],\n", + " [3.95233957e+04, 1.09672857e+06],\n", + " [4.31016012e+04, 9.23362846e+05],\n", + " [2.44532763e+04, 8.10610309e+05],\n", + " [2.42905662e+04, 1.16837923e+06],\n", + " [3.08495243e+04, 6.72357927e+05],\n", + " [2.29309129e+04, 6.83181207e+05],\n", + " [1.93124101e+04, 1.18157506e+06],\n", + " [2.48005224e+04, 6.94595493e+05],\n", + " [3.02329559e+04, 1.14461008e+06],\n", + " [2.04398683e+04, 9.16831496e+05],\n", + " [2.60028015e+04, 6.89740714e+05],\n", + " [2.04497354e+04, 1.27760714e+06],\n", + " [2.32445428e+04, 9.58179175e+05],\n", + " [1.64473455e+04, 1.22583633e+06],\n", + " [2.00514453e+04, 6.69149880e+05],\n", + " [1.66644545e+04, 9.25503667e+05],\n", + " [1.66814938e+04, 7.43239584e+05],\n", + " [1.86832999e+04, 1.09203041e+06],\n", + " [1.79963211e+04, 8.04265819e+05],\n", + " [1.74121296e+04, 7.03980774e+05],\n", + " [1.26988684e+04, 1.12187081e+06],\n", + " [1.58140231e+04, 1.02757091e+06],\n", + " [1.27340719e+04, 8.58592858e+05],\n", + " [1.35826575e+04, 7.64916022e+05],\n", + " [1.01263816e+04, 7.50180716e+05],\n", + " [7.19342074e+03, 1.27142317e+06],\n", + " [1.02493864e+04, 1.13344203e+06],\n", + " [1.03978921e+04, 1.07706574e+06],\n", + " [1.02914248e+04, 1.12721159e+06],\n", + " [6.60980734e+03, 6.72248410e+05],\n", + " [6.59849528e+03, 8.88855805e+05],\n", + " [7.68970477e+03, 7.39423756e+05],\n", + " [8.84584242e+03, 1.00677590e+06],\n", + " [8.25728105e+03, 1.19211086e+06],\n", + " [5.88190675e+03, 1.11514993e+06],\n", + " [5.42093057e+03, 7.16639885e+05],\n", + " [6.82473026e+03, 1.12453486e+06],\n", + " [3.68320721e+03, 1.09898609e+06],\n", + " [6.80452270e+03, 1.09652679e+06],\n", + " [5.97168604e+03, 1.09425515e+06],\n", + " [5.27277158e+03, 9.22447441e+05],\n", + " [4.32747516e+03, 6.86566727e+05],\n", + " [3.38326107e+03, 1.03547520e+06],\n", + " [3.06991919e+03, 1.16619965e+06],\n", + " [4.12887018e+03, 1.03663789e+06],\n", + " [4.27672242e+03, 1.26537482e+06],\n", + " [3.18806484e+03, 1.16135256e+06],\n", + " [2.80011832e+03, 9.75156955e+05],\n", + " [3.62041856e+03, 7.89736072e+05],\n", + " [3.84227414e+03, 1.18864231e+06],\n", + " [3.06755125e+03, 8.94816531e+05],\n", + " [2.13467277e+03, 1.16730640e+06],\n", + " [2.27626397e+03, 1.24591570e+06],\n", + " [2.34839501e+03, 1.12030879e+06],\n", + " [2.24900213e+03, 7.32039326e+05],\n", + " [1.85112410e+03, 1.25393067e+06],\n", + " [2.65171542e+03, 7.40465218e+05],\n", + " [2.44163654e+03, 1.07273915e+06],\n", + " [2.41789135e+03, 1.06650080e+06],\n", + " [2.12092455e+03, 1.07255283e+06],\n", + " [2.01724608e+03, 1.18412737e+06],\n", + " [1.42484567e+03, 9.98442128e+05],\n", + " [2.00171844e+03, 1.16762736e+06],\n", + " [1.18906475e+03, 7.63242127e+05],\n", + " [9.64151573e+02, 1.06275748e+06],\n", + " [9.47691461e+02, 9.52712785e+05],\n", + " [1.08737495e+03, 1.32656020e+06],\n", + " [1.58211972e+03, 1.28554538e+06],\n", + " [1.02462654e+03, 1.21645444e+06],\n", + " [1.09696954e+03, 8.37588347e+05],\n", + " [1.18485005e+03, 1.32868306e+06],\n", + " [9.60649471e+02, 9.58801891e+05],\n", + " [8.35750134e+02, 6.70070548e+05],\n", + " [8.46933749e+02, 9.09028524e+05],\n", + " [8.75541052e+02, 6.93582525e+05],\n", + " [9.98457029e+02, 1.30087794e+06],\n", + " [8.38077124e+02, 8.59040056e+05],\n", + " [8.49095933e+02, 7.48748175e+05],\n", + " [4.75278209e+02, 7.29532863e+05],\n", + " [4.75221920e+02, 1.13497828e+06],\n", + " [5.94953735e+02, 1.17697697e+06],\n", + " [6.08685663e+02, 1.31934387e+06],\n", + " [5.71588897e+02, 1.08781125e+06],\n", + " [5.37656203e+02, 8.83840889e+05],\n", + " [6.53359338e+02, 1.12664376e+06],\n", + " [3.79753204e+02, 7.16919053e+05],\n", + " [4.79460534e+02, 7.67956524e+05],\n", + " [3.76455799e+02, 7.79635821e+05],\n", + " [3.98678387e+02, 1.17812870e+06],\n", + " [4.92440834e+02, 6.79938898e+05],\n", + " [3.17390876e+02, 1.28811921e+06],\n", + " [2.84136696e+02, 1.08425822e+06],\n", + " [2.53473783e+02, 6.69868499e+05],\n", + " [2.99264007e+02, 1.14357648e+06],\n", + " [3.88123342e+02, 8.48988552e+05],\n", + " [2.56298225e+02, 9.68709296e+05],\n", + " [2.26865279e+02, 8.27831780e+05],\n", + " [2.29488974e+02, 7.32466208e+05],\n", + " [3.17120474e+02, 1.18985963e+06],\n", + " [2.04389883e+02, 8.75497720e+05],\n", + " [2.69441520e+02, 1.01870765e+06],\n", + " [2.57974385e+02, 1.31524429e+06],\n", + " [1.91007675e+02, 1.12375985e+06],\n", + " [1.94527978e+02, 1.04333394e+06],\n", + " [2.07292919e+02, 1.25272904e+06],\n", + " [2.09816912e+02, 6.66651918e+05],\n", + " [2.16626923e+02, 7.76940647e+05],\n", + " [1.82179370e+02, 1.20455849e+06],\n", + " [1.67419689e+02, 9.25148524e+05],\n", + " [1.66593221e+02, 8.50966382e+05],\n", + " [1.25715209e+02, 1.24704406e+06],\n", + " [1.06823665e+02, 6.88489017e+05],\n", + " [1.19694951e+02, 1.06771516e+06],\n", + " [9.06989100e+01, 7.74962746e+05],\n", + " [9.52722524e+01, 9.00826911e+05],\n", + " [1.33280543e+02, 9.97025552e+05],\n", + " [1.22050775e+02, 8.25449524e+05],\n", + " [1.13438619e+02, 1.32748280e+06],\n", + " [7.95888118e+01, 9.96202694e+05],\n", + " [7.46208572e+01, 7.08911899e+05],\n", + " [1.07049236e+02, 8.62428915e+05]])" ] }, "execution_count": 10, @@ -702,7 +702,7 @@ { "data": { "text/plain": [ - "4209072260954.626" + "NormalLoss([3.0, 0.15, 1000000.0], SimulateOde([ODEVariable('S', 'S', None, True), ODEVariable('I', 'I', None, True), ODEVariable('R', 'R', None, True)], [ODEVariable('beta', 'beta', None, True), ODEVariable('gamma', 'gamma', None, True), ODEVariable('N', 'N', None, True)], [], [Transition('S', 'beta*S*I/N', 'T', 'I', None, None), Transition('I', 'gamma*I', 'T', 'R', None, None)], [], []).setParameters({'beta': 3.6, 'gamma': 0.2, 'N': 1000000.0}), [999998.0, 2.0, 0.0], 0.0, [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 25.25, 25.5, 25.75, 26.0, 26.25, 26.5, 26.75, 27.0, 27.25, 27.5, 27.75, 28.0, 28.25, 28.5, 28.75, 29.0, 29.25, 29.5, 29.75, 30.0, 30.25, 30.5, 30.75, 31.0, 31.25, 31.5, 31.75, 32.0, 32.25, 32.5, 32.75, 33.0, 33.25, 33.5, 33.75, 34.0, 34.25, 34.5, 34.75, 35.0, 35.25, 35.5, 35.75, 36.0, 36.25, 36.5, 36.75, 37.0, 37.25, 37.5, 37.75, 38.0, 38.25, 38.5, 38.75, 39.0, 39.25, 39.5, 39.75, 40.0, 40.25, 40.5, 40.75, 41.0, 41.25, 41.5, 41.75, 42.0, 42.25, 42.5, 42.75, 43.0, 43.25, 43.5, 43.75, 44.0, 44.25, 44.5, 44.75, 45.0, 45.25, 45.5, 45.75, 46.0, 46.25, 46.5, 46.75, 47.0, 47.25, 47.5, 47.75, 48.0, 48.25, 48.5, 48.75, 49.0, 49.25, 49.5, 49.75, 50.0, 50.25, 50.5, 50.75], [[5.5489971387876365, 0.13976157088347727], [9.415096478582125, 0.6953800925736477], [25.941588724404888, 1.7360216096973626], [40.629454348405005, 3.6320719863452124], [108.33986724048995, 9.898076194201028], [265.94200822963205, 19.72199081288608], [814.0101919108965, 34.39273873132337], [1610.3645021087707, 84.46157450404837], [4033.7294190704292, 287.6005446141324], [8244.051192760833, 695.5700455200907], [29441.296547302398, 1278.206554206765], [36326.23747211643, 3083.1448823639666], [134300.6643766737, 7316.380551470222], [251120.96130046487, 12228.281008380864], [512397.4021229717, 21543.277252460124], [585616.8734093554, 38484.76952026679], [790205.921992304, 83692.67093281484], [974797.1285860298, 137447.11265771437], [707757.0823571573, 117346.97836716496], [603556.1371978847, 189433.07773085634], [913909.6207876124, 199048.48425080228], [548929.798690948, 279399.6024361307], [462040.51907899725, 383327.3895777905], [761326.3551628065, 258855.59336332348], [662287.4219836415, 340426.42697219475], [508464.53921417124, 391021.45531562675], [656745.3025785786, 578473.9477197772], [554162.9505283561, 426765.22955069266], [532220.7074438117, 508730.0308778309], [445615.9890674269, 476315.5274757456], [590230.8684803826, 648108.582432509], [544910.361061262, 672870.3344572515], [310827.4253700613, 587435.0165097215], [456115.65962565545, 710530.4983865325], [364253.7844819528, 579474.3308432746], [311474.8016733622, 821438.8027931447], [252718.85987592736, 478270.7054820163], [307809.39052484394, 683324.6855005894], [281269.7866456109, 834432.1640758143], [261336.99881665388, 750610.2799376069], [352273.3896491518, 689933.9153611241], [337278.8801262164, 668473.671079696], [262817.02738757816, 896729.9572193093], [274990.26820054883, 617678.724452312], [252897.72396917018, 865475.7000908976], [209867.3728636754, 950457.6023080612], [161791.28013060236, 1051352.395139691], [176888.54085288633, 998681.753684348], [158703.64323235105, 1052018.6625758626], [235953.74632457114, 581511.5462198751], [139508.3819811454, 1104611.4054220302], [127265.67567357987, 900559.5183912851], [146297.08454396683, 802469.639043949], [153697.59202897752, 1124694.0709555596], [165201.2568608659, 652874.3435597733], [160048.49667175754, 698299.422082141], [94596.797920066, 794188.5335791365], [117291.50891981134, 1170125.0942029145], [88205.35480368958, 1027701.8237791387], [79699.47446828452, 887920.1922399637], [122990.00315676956, 823010.8990972892], [90298.37858239123, 856602.5660494367], [112583.27458976842, 823690.0110776974], [115479.24360879252, 924618.4818930109], [77532.65451860701, 904591.1155288297], [78082.17487409341, 715856.1296537648], [99665.75506373866, 672890.1996274921], [87968.24120244425, 1005140.6416744539], [56753.577717708846, 926563.1004164796], [50867.71484676358, 710220.5323161592], [42445.65692219467, 706325.639191282], [46554.845983121624, 974134.4267906626], [52918.424828372394, 672152.061469812], [61553.98169533466, 1154689.9304881357], [41355.7068612865, 1114491.7048004952], [46374.73519731653, 870190.3739141857], [37244.34436743515, 1191669.9818033653], [41282.28851948546, 1046085.4493043608], [55317.91156340166, 1128079.994274354], [31907.69520572426, 1000208.0395347421], [34010.24198302409, 930221.1892817259], [30928.214034681547, 1018299.4007833744], [39523.39574481744, 1096728.5680754953], [43101.60123589903, 923362.8464453346], [24453.276252403833, 810610.3090453236], [24290.566238056355, 1168379.2311720226], [30849.52429767078, 672357.9273898688], [22930.91291882195, 683181.2065549527], [19312.410078810557, 1181575.0638825279], [24800.522354204797, 694595.4933711233], [30232.955889418034, 1144610.0789169455], [20439.868327523087, 916831.495611514], [26002.801545608865, 689740.713613447], [20449.735359676568, 1277607.1379225366], [23244.54282457448, 958179.1751528395], [16447.345530964347, 1225836.3266972792], [20051.445282210465, 669149.8800772146], [16664.454488900752, 925503.6673304131], [16681.49384056153, 743239.5841723487], [18683.299901770028, 1092030.4094499706], [17996.321050203427, 804265.8193114839], [17412.129570447687, 703980.773650898], [12698.868359882912, 1121870.8122240496], [15814.023105568453, 1027570.9081003398], [12734.071882360873, 858592.8580763217], [13582.657478279318, 764916.0217322799], [10126.381580399675, 750180.7159839582], [7193.420744583109, 1271423.1734558782], [10249.386414900197, 1133442.0264943778], [10397.892095036967, 1077065.7446887211], [10291.424793271395, 1127211.5938218776], [6609.807342544796, 672248.4104117213], [6598.495277349121, 888855.8050265535], [7689.704772788273, 739423.7561920357], [8845.842419921624, 1006775.9005513749], [8257.28104877651, 1192110.8618185048], [5881.906750996887, 1115149.93372143], [5420.930573114638, 716639.884819933], [6824.730262831377, 1124534.8621694546], [3683.207213311698, 1098986.08982435], [6804.52269756303, 1096526.7921533366], [5971.686041066522, 1094255.1464621811], [5272.7715814587045, 922447.4408174288], [4327.475161388193, 686566.7266654972], [3383.2610693392044, 1035475.2013402083], [3069.919189380042, 1166199.6484807285], [4128.870181022159, 1036637.8860012486], [4276.722417774954, 1265374.8212365832], [3188.0648383580597, 1161352.5607335398], [2800.118318839102, 975156.9553313118], [3620.4185579812274, 789736.0719286054], [3842.2741401842172, 1188642.3134196696], [3067.551247602438, 894816.5312599519], [2134.67276566011, 1167306.4045076708], [2276.263966733917, 1245915.7013382448], [2348.395010917235, 1120308.7855315015], [2249.0021255896513, 732039.3261821142], [1851.1240962192128, 1253930.6660519678], [2651.715415269909, 740465.2182037155], [2441.6365408681636, 1072739.1471042798], [2417.891347145136, 1066500.7995323706], [2120.9245483558825, 1072552.8316071504], [2017.2460815827417, 1184127.366115931], [1424.845670574932, 998442.1280909418], [2001.7184429807262, 1167627.3635968873], [1189.0647524983192, 763242.127352661], [964.1515731483933, 1062757.4849910974], [947.6914614570239, 952712.7846825029], [1087.3749471536023, 1326560.2010915559], [1582.1197247476741, 1285545.3759947247], [1024.6265416882222, 1216454.4422335515], [1096.9695443363794, 837588.3467235877], [1184.8500540757373, 1328683.061242117], [960.6494707281487, 958801.8911654096], [835.7501337173844, 670070.5483600695], [846.9337487099981, 909028.5240620613], [875.541052335431, 693582.5251296596], [998.4570286925696, 1300877.9383268403], [838.0771236697374, 859040.0555225008], [849.0959325990879, 748748.1751257956], [475.2782089274715, 729532.8627678553], [475.2219202114857, 1134978.277195852], [594.9537349672182, 1176976.9695724065], [608.6856630484652, 1319343.8667681955], [571.5888971056904, 1087811.2469301717], [537.6562029971528, 883840.8893521308], [653.3593380671064, 1126643.762739988], [379.7532039608197, 716919.052976874], [479.46053353989157, 767956.5237406924], [376.4557987859823, 779635.8208878567], [398.67838714418235, 1178128.6982785354], [492.4408336280881, 679938.8977216084], [317.3908756903431, 1288119.208934416], [284.13669569600165, 1084258.2171145338], [253.47378339180153, 669868.4988409674], [299.26400701038574, 1143576.4805791376], [388.12334228010513, 848988.5515813607], [256.2982253008446, 968709.2961185345], [226.86527870402017, 827831.7795352405], [229.48897424342212, 732466.208474486], [317.12047386383495, 1189859.6336752367], [204.38988338787306, 875497.7197789245], [269.4415199990759, 1018707.6504033973], [257.97438516355055, 1315244.2862689584], [191.00767526447387, 1123759.8491195813], [194.52797753681182, 1043333.9442222763], [207.29291902341845, 1252729.0376916449], [209.81691238951242, 666651.9180659578], [216.6269232166793, 776940.6467737745], [182.17936999016678, 1204558.48883258], [167.41968911549503, 925148.5235907574], [166.59322132383082, 850966.3818700697], [125.71520857960297, 1247044.057304752], [106.82366473307945, 688489.016953341], [119.69495136675988, 1067715.157561069], [90.69890996414178, 774962.7461366334], [95.27225242575679, 900826.9111966246], [133.28054285317748, 997025.5515197581], [122.05077509682275, 825449.5240761695], [113.43861907585058, 1327482.8035176208], [79.58881177281683, 996202.6939394812], [74.62085718615808, 708911.8992225014], [107.04923637866446, 862428.9150962183]], ['I', 'R'], [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])" ] }, "execution_count": 13, @@ -711,19 +711,39 @@ } ], "source": [ - "objSIR.cost()" + "objSIR" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4909533605860.806" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\scipy\\optimize\\_minimize.py:521: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", " warn('Method %s cannot handle constraints nor bounds.' % method,\n" ] }, @@ -731,18 +751,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 3149715468391.5137\n", - " hess_inv: array([[ 1.02285673e-11, -3.28483610e-14, 3.23263121e-06],\n", - " [-3.28483423e-14, 5.00246087e-15, -3.92052034e-09],\n", - " [ 3.23263111e-06, -3.92052576e-09, 1.06428103e+00]])\n", - " jac: array([-1.89198473e+03, 2.05662437e+05, 6.51297284e-03])\n", + " fun: 3257054048571.9863\n", + " hess_inv: array([[ 5.18410500e-11, -2.54658445e-12, 1.27206329e-05],\n", + " [-2.54658442e-12, 1.49261473e-13, -6.12083782e-07],\n", + " [ 1.27206329e-05, -6.12083790e-07, 3.12906462e+00]])\n", + " jac: array([-1.10600741e+00, -4.43260288e+00, 4.08760083e-06])\n", " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 74\n", - " nit: 10\n", - " njev: 62\n", + " nfev: 43\n", + " nit: 12\n", + " njev: 38\n", " status: 2\n", " success: False\n", - " x: array([3.84976144e+00, 2.02859211e-01, 1.11835931e+06])\n" + " x: array([5.52375636e+00, 2.03086137e-01, 1.49373372e+06])\n" ] } ], @@ -758,22 +778,23 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " fun: 3149715468391.6045\n", + " fun: 3257054048571.9043\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 2.80002429e+03, 1.18458645e+05, -9.63846812e-03])\n", + " jac: array([-8.79695180e+01, -1.47147132e+03, 3.25305614e-04])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 12\n", + " nfev: 14\n", " nit: 9\n", + " njev: 14\n", " status: 0\n", " success: True\n", - " x: array([3.44232967e+00, 2.02859211e-01, 1.00000000e+06])\n" + " x: array([3.69795251e+00, 2.03086137e-01, 1.00000000e+06])\n" ] } ], @@ -789,7 +810,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -833,7 +854,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "scrolled": false }, @@ -845,16 +866,16 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([-1.17798986e+03, -1.40835509e+04, 3.53396958e-03])" + "array([-5.77968064e+02, -6.98915605e+03, 1.73390419e-03])" ] }, - "execution_count": 18, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -865,16 +886,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5065.797364214306" + "5062.059868394187" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -885,14 +906,14 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\scipy\\optimize\\_minimize.py:521: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", " warn('Method %s cannot handle constraints nor bounds.' % method,\n" ] }, @@ -900,18 +921,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4716.804547726841\n", - " hess_inv: array([[ 1.93830562e-03, -1.55181618e-05, 1.36514445e-06],\n", - " [-1.55181618e-05, 1.96280251e-06, 1.90886878e-08],\n", - " [ 1.36514445e-06, 1.90886878e-08, 1.00000000e+00]])\n", - " jac: array([ 8.67860428e-08, -3.11402124e-06, -3.11981179e-13])\n", - " message: 'Optimization terminated successfully.'\n", - " nfev: 15\n", + " fun: 4717.565272474467\n", + " hess_inv: array([[ 3.84423633e-03, -3.01340148e-05, 1.56049513e-06],\n", + " [-3.01340148e-05, 3.82956903e-06, 1.49977083e-08],\n", + " [ 1.56049513e-06, 1.49977083e-08, 1.00000000e+00]])\n", + " jac: array([ 8.12454287e-07, -3.28990725e-04, -2.91902226e-12])\n", + " message: 'Desired error not necessarily achieved due to precision loss.'\n", + " nfev: 57\n", " nit: 10\n", - " njev: 15\n", - " status: 0\n", - " success: True\n", - " x: array([3.59483138e+00, 1.99847237e-01, 1.00000000e+06])\n" + " njev: 46\n", + " status: 2\n", + " success: False\n", + " x: array([3.59284491e+00, 1.99665537e-01, 1.00000000e+06])\n" ] } ], @@ -927,14 +948,14 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", " logpdf_p3= -shape*np.log(mu/shape)\n" ] }, @@ -942,15 +963,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4716.804547726802\n", + " fun: 4717.565272489127\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([-9.16923207e-05, -1.70890676e-03, 3.29618418e-10])\n", + " jac: array([ 1.06976387e-03, -7.18401978e-02, -3.84350237e-09])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 15\n", + " nfev: 17\n", " nit: 10\n", + " njev: 17\n", " status: 0\n", " success: True\n", - " x: array([3.59483123e+00, 1.99847235e-01, 1.00000000e+06])\n" + " x: array([3.59285115e+00, 1.99665226e-01, 1.00000000e+06])\n" ] } ], @@ -966,7 +988,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1017,218 +1039,218 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[5.000000e+00, 0.000000e+00],\n", - " [9.000000e+00, 0.000000e+00],\n", - " [1.900000e+01, 1.000000e+00],\n", - " [4.600000e+01, 3.000000e+00],\n", - " [9.700000e+01, 6.000000e+00],\n", - " [2.610000e+02, 2.200000e+01],\n", - " [9.900000e+02, 5.400000e+01],\n", - " [1.515000e+03, 1.210000e+02],\n", - " [3.991000e+03, 3.070000e+02],\n", - " [7.166000e+03, 4.150000e+02],\n", - " [1.973600e+04, 1.230000e+03],\n", - " [5.781700e+04, 3.684000e+03],\n", - " [1.468620e+05, 6.722000e+03],\n", - " [2.832220e+05, 1.723800e+04],\n", - " [2.820990e+05, 2.116000e+04],\n", - " [5.584000e+05, 6.052300e+04],\n", - " [4.826190e+05, 9.443600e+04],\n", - " [6.657660e+05, 9.662400e+04],\n", - " [5.727470e+05, 1.895490e+05],\n", - " [7.091470e+05, 2.668100e+05],\n", - " [7.402350e+05, 2.313290e+05],\n", - " [8.098400e+05, 2.661440e+05],\n", - " [8.284080e+05, 2.491660e+05],\n", - " [5.359220e+05, 2.625830e+05],\n", - " [7.802210e+05, 3.088350e+05],\n", - " [6.826180e+05, 3.476890e+05],\n", - " [5.921870e+05, 4.633670e+05],\n", - " [6.514760e+05, 4.153080e+05],\n", - " [5.852770e+05, 3.412100e+05],\n", - " [4.320470e+05, 4.639580e+05],\n", - " [5.465900e+05, 5.109050e+05],\n", - " [5.740020e+05, 6.710010e+05],\n", - " [5.272460e+05, 6.689180e+05],\n", - " [3.613920e+05, 6.642780e+05],\n", - " [2.630790e+05, 6.164560e+05],\n", - " [4.237840e+05, 6.904690e+05],\n", - " [2.385330e+05, 5.529600e+05],\n", - " [2.627090e+05, 5.374070e+05],\n", - " [2.988290e+05, 7.095110e+05],\n", - " [2.745710e+05, 5.798480e+05],\n", - " [2.614410e+05, 6.298420e+05],\n", - " [2.588150e+05, 5.859220e+05],\n", - " [2.291440e+05, 9.937800e+05],\n", - " [2.040730e+05, 8.910570e+05],\n", - " [2.709460e+05, 9.008150e+05],\n", - " [1.850760e+05, 5.275220e+05],\n", - " [2.572050e+05, 5.544440e+05],\n", - " [2.136960e+05, 7.221370e+05],\n", - " [2.137180e+05, 6.012100e+05],\n", - " [1.750310e+05, 8.377410e+05],\n", - " [1.695400e+05, 8.144580e+05],\n", - " [1.153150e+05, 9.722930e+05],\n", - " [1.781210e+05, 6.972570e+05],\n", - " [1.025850e+05, 7.931980e+05],\n", - " [1.557830e+05, 1.032394e+06],\n", - " [1.749430e+05, 9.711260e+05],\n", - " [1.520690e+05, 7.051940e+05],\n", - " [1.527620e+05, 8.249310e+05],\n", - " [1.503390e+05, 8.891050e+05],\n", - " [1.290250e+05, 1.041679e+06],\n", - " [1.064650e+05, 1.003373e+06],\n", - " [9.704000e+04, 1.129447e+06],\n", - " [1.147480e+05, 7.903740e+05],\n", - " [7.951100e+04, 1.034171e+06],\n", - " [8.140800e+04, 6.853400e+05],\n", - " [8.066900e+04, 1.123759e+06],\n", - " [8.439800e+04, 1.159922e+06],\n", - " [6.450600e+04, 9.382090e+05],\n", - " [6.366900e+04, 7.915010e+05],\n", - " [7.614600e+04, 6.703730e+05],\n", - " [4.703900e+04, 7.071490e+05],\n", - " [4.364400e+04, 1.073515e+06],\n", - " [6.280800e+04, 7.979050e+05],\n", - " [5.134600e+04, 1.045135e+06],\n", - " [6.302300e+04, 1.137771e+06],\n", - " [4.806200e+04, 6.687340e+05],\n", - " [3.633300e+04, 9.508640e+05],\n", - " [3.930600e+04, 8.525190e+05],\n", - " [3.075400e+04, 1.247465e+06],\n", - " [2.862500e+04, 1.194818e+06],\n", - " [4.743800e+04, 7.044480e+05],\n", - " [4.256400e+04, 1.007074e+06],\n", - " [3.938900e+04, 9.967710e+05],\n", - " [4.239300e+04, 1.239269e+06],\n", - " [2.924000e+04, 1.217901e+06],\n", - " [2.309600e+04, 1.217662e+06],\n", - " [3.407500e+04, 1.213231e+06],\n", - " [2.907200e+04, 1.246536e+06],\n", - " [2.711300e+04, 1.107201e+06],\n", - " [1.806300e+04, 9.200930e+05],\n", - " [2.525600e+04, 1.049130e+06],\n", - " [1.843600e+04, 8.923940e+05],\n", - " [2.129100e+04, 9.476230e+05],\n", - " [1.524000e+04, 8.937350e+05],\n", - " [1.398800e+04, 1.030004e+06],\n", - " [1.943000e+04, 6.623530e+05],\n", - " [1.169100e+04, 6.970030e+05],\n", - " [1.667000e+04, 1.033941e+06],\n", - " [1.727100e+04, 1.278454e+06],\n", - " [1.212700e+04, 1.047077e+06],\n", - " [1.357500e+04, 6.871120e+05],\n", - " [1.420000e+04, 1.236557e+06],\n", - " [1.596000e+04, 1.142587e+06],\n", - " [1.496600e+04, 9.449100e+05],\n", - " [8.814000e+03, 1.262525e+06],\n", - " [1.033100e+04, 1.301655e+06],\n", - " [8.508000e+03, 8.369960e+05],\n", - " [8.702000e+03, 6.648640e+05],\n", - " [7.821000e+03, 1.070812e+06],\n", - " [7.459000e+03, 1.197702e+06],\n", - " [8.520000e+03, 1.158037e+06],\n", - " [8.322000e+03, 1.008464e+06],\n", - " [6.598000e+03, 6.685560e+05],\n", - " [8.855000e+03, 8.297920e+05],\n", - " [5.319000e+03, 1.238120e+06],\n", - " [5.521000e+03, 1.283727e+06],\n", - " [5.047000e+03, 1.275977e+06],\n", - " [4.667000e+03, 8.453960e+05],\n", - " [4.541000e+03, 1.102279e+06],\n", - " [5.613000e+03, 7.624460e+05],\n", - " [3.973000e+03, 1.265941e+06],\n", - " [3.825000e+03, 9.830190e+05],\n", - " [4.387000e+03, 8.782980e+05],\n", - " [5.145000e+03, 1.224032e+06],\n", - " [4.834000e+03, 1.006099e+06],\n", - " [4.435000e+03, 1.181320e+06],\n", - " [3.337000e+03, 1.314770e+06],\n", - " [4.280000e+03, 6.781240e+05],\n", - " [4.409000e+03, 1.292952e+06],\n", - " [2.229000e+03, 8.820550e+05],\n", - " [2.631000e+03, 8.707330e+05],\n", - " [3.165000e+03, 9.689720e+05],\n", - " [2.384000e+03, 7.234630e+05],\n", - " [2.750000e+03, 9.916340e+05],\n", - " [2.511000e+03, 1.089111e+06],\n", - " [2.294000e+03, 9.735000e+05],\n", - " [2.709000e+03, 9.764780e+05],\n", - " [2.746000e+03, 9.948270e+05],\n", - " [2.714000e+03, 1.223956e+06],\n", - " [2.374000e+03, 8.959160e+05],\n", - " [1.671000e+03, 1.228306e+06],\n", - " [1.283000e+03, 1.274200e+06],\n", - " [2.008000e+03, 1.264884e+06],\n", - " [1.260000e+03, 1.033340e+06],\n", - " [1.503000e+03, 1.038520e+06],\n", - " [1.921000e+03, 1.068669e+06],\n", - " [1.356000e+03, 8.848560e+05],\n", - " [1.561000e+03, 1.271509e+06],\n", - " [1.495000e+03, 1.071903e+06],\n", - " [8.280000e+02, 1.215564e+06],\n", - " [1.246000e+03, 1.140591e+06],\n", - " [1.392000e+03, 7.348680e+05],\n", - " [1.194000e+03, 7.493110e+05],\n", - " [6.840000e+02, 8.301580e+05],\n", - " [7.110000e+02, 1.030781e+06],\n", - " [9.230000e+02, 6.937940e+05],\n", - " [7.470000e+02, 1.010889e+06],\n", - " [7.860000e+02, 1.183986e+06],\n", - " [7.180000e+02, 1.160713e+06],\n", - " [8.230000e+02, 9.749720e+05],\n", - " [8.630000e+02, 9.999900e+05],\n", - " [8.690000e+02, 7.924270e+05],\n", - " [6.420000e+02, 8.615190e+05],\n", - " [6.330000e+02, 9.006470e+05],\n", - " [7.410000e+02, 1.305110e+06],\n", - " [4.440000e+02, 1.235293e+06],\n", - " [6.780000e+02, 9.734870e+05],\n", - " [3.890000e+02, 9.811730e+05],\n", - " [5.810000e+02, 8.022590e+05],\n", - " [5.380000e+02, 6.921760e+05],\n", - " [3.130000e+02, 1.149172e+06],\n", - " [5.170000e+02, 1.332219e+06],\n", - " [3.990000e+02, 1.243409e+06],\n", - " [4.040000e+02, 6.951280e+05],\n", - " [2.750000e+02, 6.744260e+05],\n", - " [2.600000e+02, 8.871490e+05],\n", - " [3.580000e+02, 1.326963e+06],\n", - " [3.070000e+02, 7.625150e+05],\n", - " [2.150000e+02, 1.160246e+06],\n", - " [2.760000e+02, 1.055389e+06],\n", - " [2.700000e+02, 9.990920e+05],\n", - " [2.370000e+02, 7.255320e+05],\n", - " [2.060000e+02, 1.099872e+06],\n", - " [1.750000e+02, 9.375600e+05],\n", - " [1.810000e+02, 8.569710e+05],\n", - " [2.220000e+02, 1.179454e+06],\n", - " [2.320000e+02, 1.302408e+06],\n", - " [2.390000e+02, 7.552470e+05],\n", - " [1.800000e+02, 1.013415e+06],\n", - " [1.810000e+02, 1.103302e+06],\n", - " [1.290000e+02, 7.600690e+05],\n", - " [1.860000e+02, 1.253858e+06],\n", - " [1.700000e+02, 1.092196e+06],\n", - " [1.650000e+02, 8.604650e+05],\n", - " [1.350000e+02, 6.752070e+05],\n", - " [9.600000e+01, 1.061282e+06],\n", - " [8.300000e+01, 1.195101e+06],\n", - " [1.150000e+02, 1.272789e+06],\n", - " [9.200000e+01, 7.292520e+05],\n", - " [1.210000e+02, 1.165792e+06],\n", - " [9.100000e+01, 9.362310e+05],\n", - " [7.700000e+01, 9.420080e+05],\n", - " [6.800000e+01, 9.976760e+05]])" + "array([[6.000000e+00, 0.000000e+00],\n", + " [9.000000e+00, 1.000000e+00],\n", + " [2.600000e+01, 2.000000e+00],\n", + " [4.100000e+01, 4.000000e+00],\n", + " [1.080000e+02, 1.000000e+01],\n", + " [2.660000e+02, 2.000000e+01],\n", + " [8.140000e+02, 3.400000e+01],\n", + " [1.610000e+03, 8.400000e+01],\n", + " [4.034000e+03, 2.880000e+02],\n", + " [8.244000e+03, 6.960000e+02],\n", + " [2.944100e+04, 1.278000e+03],\n", + " [3.632600e+04, 3.083000e+03],\n", + " [1.343010e+05, 7.316000e+03],\n", + " [2.511210e+05, 1.222800e+04],\n", + " [5.123970e+05, 2.154300e+04],\n", + " [5.856170e+05, 3.848500e+04],\n", + " [7.902060e+05, 8.369300e+04],\n", + " [9.747970e+05, 1.374470e+05],\n", + " [7.077570e+05, 1.173470e+05],\n", + " [6.035560e+05, 1.894330e+05],\n", + " [9.139100e+05, 1.990480e+05],\n", + " [5.489300e+05, 2.794000e+05],\n", + " [4.620410e+05, 3.833270e+05],\n", + " [7.613260e+05, 2.588560e+05],\n", + " [6.622870e+05, 3.404260e+05],\n", + " [5.084650e+05, 3.910210e+05],\n", + " [6.567450e+05, 5.784740e+05],\n", + " [5.541630e+05, 4.267650e+05],\n", + " [5.322210e+05, 5.087300e+05],\n", + " [4.456160e+05, 4.763160e+05],\n", + " [5.902310e+05, 6.481090e+05],\n", + " [5.449100e+05, 6.728700e+05],\n", + " [3.108270e+05, 5.874350e+05],\n", + " [4.561160e+05, 7.105300e+05],\n", + " [3.642540e+05, 5.794740e+05],\n", + " [3.114750e+05, 8.214390e+05],\n", + " [2.527190e+05, 4.782710e+05],\n", + " [3.078090e+05, 6.833250e+05],\n", + " [2.812700e+05, 8.344320e+05],\n", + " [2.613370e+05, 7.506100e+05],\n", + " [3.522730e+05, 6.899340e+05],\n", + " [3.372790e+05, 6.684740e+05],\n", + " [2.628170e+05, 8.967300e+05],\n", + " [2.749900e+05, 6.176790e+05],\n", + " [2.528980e+05, 8.654760e+05],\n", + " [2.098670e+05, 9.504580e+05],\n", + " [1.617910e+05, 1.051352e+06],\n", + " [1.768890e+05, 9.986820e+05],\n", + " [1.587040e+05, 1.052019e+06],\n", + " [2.359540e+05, 5.815120e+05],\n", + " [1.395080e+05, 1.104611e+06],\n", + " [1.272660e+05, 9.005600e+05],\n", + " [1.462970e+05, 8.024700e+05],\n", + " [1.536980e+05, 1.124694e+06],\n", + " [1.652010e+05, 6.528740e+05],\n", + " [1.600480e+05, 6.982990e+05],\n", + " [9.459700e+04, 7.941890e+05],\n", + " [1.172920e+05, 1.170125e+06],\n", + " [8.820500e+04, 1.027702e+06],\n", + " [7.969900e+04, 8.879200e+05],\n", + " [1.229900e+05, 8.230110e+05],\n", + " [9.029800e+04, 8.566030e+05],\n", + " [1.125830e+05, 8.236900e+05],\n", + " [1.154790e+05, 9.246180e+05],\n", + " [7.753300e+04, 9.045910e+05],\n", + " [7.808200e+04, 7.158560e+05],\n", + " [9.966600e+04, 6.728900e+05],\n", + " [8.796800e+04, 1.005141e+06],\n", + " [5.675400e+04, 9.265630e+05],\n", + " [5.086800e+04, 7.102210e+05],\n", + " [4.244600e+04, 7.063260e+05],\n", + " [4.655500e+04, 9.741340e+05],\n", + " [5.291800e+04, 6.721520e+05],\n", + " [6.155400e+04, 1.154690e+06],\n", + " [4.135600e+04, 1.114492e+06],\n", + " [4.637500e+04, 8.701900e+05],\n", + " [3.724400e+04, 1.191670e+06],\n", + " [4.128200e+04, 1.046085e+06],\n", + " [5.531800e+04, 1.128080e+06],\n", + " [3.190800e+04, 1.000208e+06],\n", + " [3.401000e+04, 9.302210e+05],\n", + " [3.092800e+04, 1.018299e+06],\n", + " [3.952300e+04, 1.096729e+06],\n", + " [4.310200e+04, 9.233630e+05],\n", + " [2.445300e+04, 8.106100e+05],\n", + " [2.429100e+04, 1.168379e+06],\n", + " [3.085000e+04, 6.723580e+05],\n", + " [2.293100e+04, 6.831810e+05],\n", + " [1.931200e+04, 1.181575e+06],\n", + " [2.480100e+04, 6.945950e+05],\n", + " [3.023300e+04, 1.144610e+06],\n", + " [2.044000e+04, 9.168310e+05],\n", + " [2.600300e+04, 6.897410e+05],\n", + " [2.045000e+04, 1.277607e+06],\n", + " [2.324500e+04, 9.581790e+05],\n", + " [1.644700e+04, 1.225836e+06],\n", + " [2.005100e+04, 6.691500e+05],\n", + " [1.666400e+04, 9.255040e+05],\n", + " [1.668100e+04, 7.432400e+05],\n", + " [1.868300e+04, 1.092030e+06],\n", + " [1.799600e+04, 8.042660e+05],\n", + " [1.741200e+04, 7.039810e+05],\n", + " [1.269900e+04, 1.121871e+06],\n", + " [1.581400e+04, 1.027571e+06],\n", + " [1.273400e+04, 8.585930e+05],\n", + " [1.358300e+04, 7.649160e+05],\n", + " [1.012600e+04, 7.501810e+05],\n", + " [7.193000e+03, 1.271423e+06],\n", + " [1.024900e+04, 1.133442e+06],\n", + " [1.039800e+04, 1.077066e+06],\n", + " [1.029100e+04, 1.127212e+06],\n", + " [6.610000e+03, 6.722480e+05],\n", + " [6.598000e+03, 8.888560e+05],\n", + " [7.690000e+03, 7.394240e+05],\n", + " [8.846000e+03, 1.006776e+06],\n", + " [8.257000e+03, 1.192111e+06],\n", + " [5.882000e+03, 1.115150e+06],\n", + " [5.421000e+03, 7.166400e+05],\n", + " [6.825000e+03, 1.124535e+06],\n", + " [3.683000e+03, 1.098986e+06],\n", + " [6.805000e+03, 1.096527e+06],\n", + " [5.972000e+03, 1.094255e+06],\n", + " [5.273000e+03, 9.224470e+05],\n", + " [4.327000e+03, 6.865670e+05],\n", + " [3.383000e+03, 1.035475e+06],\n", + " [3.070000e+03, 1.166200e+06],\n", + " [4.129000e+03, 1.036638e+06],\n", + " [4.277000e+03, 1.265375e+06],\n", + " [3.188000e+03, 1.161353e+06],\n", + " [2.800000e+03, 9.751570e+05],\n", + " [3.620000e+03, 7.897360e+05],\n", + " [3.842000e+03, 1.188642e+06],\n", + " [3.068000e+03, 8.948170e+05],\n", + " [2.135000e+03, 1.167306e+06],\n", + " [2.276000e+03, 1.245916e+06],\n", + " [2.348000e+03, 1.120309e+06],\n", + " [2.249000e+03, 7.320390e+05],\n", + " [1.851000e+03, 1.253931e+06],\n", + " [2.652000e+03, 7.404650e+05],\n", + " [2.442000e+03, 1.072739e+06],\n", + " [2.418000e+03, 1.066501e+06],\n", + " [2.121000e+03, 1.072553e+06],\n", + " [2.017000e+03, 1.184127e+06],\n", + " [1.425000e+03, 9.984420e+05],\n", + " [2.002000e+03, 1.167627e+06],\n", + " [1.189000e+03, 7.632420e+05],\n", + " [9.640000e+02, 1.062757e+06],\n", + " [9.480000e+02, 9.527130e+05],\n", + " [1.087000e+03, 1.326560e+06],\n", + " [1.582000e+03, 1.285545e+06],\n", + " [1.025000e+03, 1.216454e+06],\n", + " [1.097000e+03, 8.375880e+05],\n", + " [1.185000e+03, 1.328683e+06],\n", + " [9.610000e+02, 9.588020e+05],\n", + " [8.360000e+02, 6.700710e+05],\n", + " [8.470000e+02, 9.090290e+05],\n", + " [8.760000e+02, 6.935830e+05],\n", + " [9.980000e+02, 1.300878e+06],\n", + " [8.380000e+02, 8.590400e+05],\n", + " [8.490000e+02, 7.487480e+05],\n", + " [4.750000e+02, 7.295330e+05],\n", + " [4.750000e+02, 1.134978e+06],\n", + " [5.950000e+02, 1.176977e+06],\n", + " [6.090000e+02, 1.319344e+06],\n", + " [5.720000e+02, 1.087811e+06],\n", + " [5.380000e+02, 8.838410e+05],\n", + " [6.530000e+02, 1.126644e+06],\n", + " [3.800000e+02, 7.169190e+05],\n", + " [4.790000e+02, 7.679570e+05],\n", + " [3.760000e+02, 7.796360e+05],\n", + " [3.990000e+02, 1.178129e+06],\n", + " [4.920000e+02, 6.799390e+05],\n", + " [3.170000e+02, 1.288119e+06],\n", + " [2.840000e+02, 1.084258e+06],\n", + " [2.530000e+02, 6.698680e+05],\n", + " [2.990000e+02, 1.143576e+06],\n", + " [3.880000e+02, 8.489890e+05],\n", + " [2.560000e+02, 9.687090e+05],\n", + " [2.270000e+02, 8.278320e+05],\n", + " [2.290000e+02, 7.324660e+05],\n", + " [3.170000e+02, 1.189860e+06],\n", + " [2.040000e+02, 8.754980e+05],\n", + " [2.690000e+02, 1.018708e+06],\n", + " [2.580000e+02, 1.315244e+06],\n", + " [1.910000e+02, 1.123760e+06],\n", + " [1.950000e+02, 1.043334e+06],\n", + " [2.070000e+02, 1.252729e+06],\n", + " [2.100000e+02, 6.666520e+05],\n", + " [2.170000e+02, 7.769410e+05],\n", + " [1.820000e+02, 1.204558e+06],\n", + " [1.670000e+02, 9.251490e+05],\n", + " [1.670000e+02, 8.509660e+05],\n", + " [1.260000e+02, 1.247044e+06],\n", + " [1.070000e+02, 6.884890e+05],\n", + " [1.200000e+02, 1.067715e+06],\n", + " [9.100000e+01, 7.749630e+05],\n", + " [9.500000e+01, 9.008270e+05],\n", + " [1.330000e+02, 9.970260e+05],\n", + " [1.220000e+02, 8.254500e+05],\n", + " [1.130000e+02, 1.327483e+06],\n", + " [8.000000e+01, 9.962030e+05],\n", + " [7.500000e+01, 7.089120e+05],\n", + " [1.070000e+02, 8.624290e+05]])" ] }, - "execution_count": 23, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -1247,7 +1269,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "scrolled": false }, @@ -1266,16 +1288,16 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "8329023.1484972015" + "9745677.652607694" ] }, - "execution_count": 25, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1286,25 +1308,33 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + " warn('Method %s cannot handle constraints nor bounds.' % method,\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - " fun: 3557908.6464113127\n", - " hess_inv: array([[ 1.27472646e-07, -3.23818317e-09, 2.26214178e-06],\n", - " [-3.23818317e-09, 9.56376557e-10, 2.13419691e-08],\n", - " [ 2.26214178e-06, 2.13419691e-08, 1.00001208e+00]])\n", - " jac: array([-6.34498993e-04, 1.86534335e-03, 2.25490671e-09])\n", + " fun: 3692407.814497117\n", + " hess_inv: array([[ 1.13964289e-07, -2.49061166e-09, 2.20264892e-06],\n", + " [-2.49061166e-09, 9.27756704e-10, 9.40250405e-09],\n", + " [ 2.20264892e-06, 9.40250405e-09, 1.00000987e+00]])\n", + " jac: array([ 1.33293688e-02, -2.07506277e-02, -4.87274588e-08])\n", " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 109\n", - " nit: 11\n", - " njev: 97\n", + " nfev: 54\n", + " nit: 10\n", + " njev: 42\n", " status: 2\n", " success: False\n", - " x: array([3.55378376e+00, 1.99169650e-01, 1.00000147e+06])\n" + " x: array([3.65564294e+00, 2.00162197e-01, 9.99999090e+05])\n" ] } ], @@ -1320,22 +1350,23 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " fun: 3557908.646411574\n", + " fun: 3692407.8145229938\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([-2.83986623e-01, -4.04398552e-01, 1.00922556e-06])\n", + " jac: array([ 9.92225896e-02, -2.34421856e+02, -3.62722747e-07])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 15\n", - " nit: 11\n", + " nfev: 14\n", + " nit: 10\n", + " njev: 14\n", " status: 0\n", " success: True\n", - " x: array([3.55377851e+00, 1.99169650e-01, 1.00000000e+06])\n" + " x: array([3.65564687e+00, 2.00161978e-01, 1.00000000e+06])\n" ] } ], @@ -1351,7 +1382,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1395,7 +1426,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": { "scrolled": false }, @@ -1404,9 +1435,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] } @@ -1418,16 +1449,16 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([-2.92555910e+02, -3.50195352e+03, 8.77667731e-04])" + "array([-2.87176322e+02, -3.47833060e+03, 8.61528965e-04])" ] }, - "execution_count": 30, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1438,16 +1469,16 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5041.425763395273" + "5041.270821570561" ] }, - "execution_count": 31, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1458,14 +1489,14 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\scipy\\optimize\\_minimize.py:521: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", " warn('Method %s cannot handle constraints nor bounds.' % method,\n" ] }, @@ -1473,18 +1504,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4867.899797539529\n", - " hess_inv: array([[ 7.67776936e-03, -5.97617430e-05, 1.74660277e-06],\n", - " [-5.97617430e-05, 7.85112146e-06, 1.25323010e-08],\n", - " [ 1.74660277e-06, 1.25323010e-08, 1.00000000e+00]])\n", - " jac: array([ 8.13167572e-09, -3.92696007e-06, -2.92247481e-14])\n", + " fun: 4869.743686474076\n", + " hess_inv: array([[ 7.82577440e-03, -6.12363068e-05, 1.76151491e-06],\n", + " [-6.12363068e-05, 7.85949196e-06, 1.45278667e-08],\n", + " [ 1.76151491e-06, 1.45278667e-08, 1.00000000e+00]])\n", + " jac: array([-2.72469402e-08, 1.25576726e-07, 9.79041863e-14])\n", " message: 'Optimization terminated successfully.'\n", - " nfev: 15\n", - " nit: 10\n", - " njev: 15\n", + " nfev: 16\n", + " nit: 11\n", + " njev: 16\n", " status: 0\n", " success: True\n", - " x: array([3.59393939e+00, 1.99830691e-01, 1.00000000e+06])\n" + " x: array([3.59321800e+00, 1.99662852e-01, 1.00000000e+06])\n" ] } ], @@ -1500,14 +1531,14 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygom_loss_20200410\\lib\\site-packages\\pygom-0.1.7.dev1+gbbd58f3.d20200410-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] }, @@ -1515,15 +1546,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4867.899797547801\n", + " fun: 4869.743686476613\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 4.12746856e-04, 1.84890228e-02, -1.48338804e-09])\n", + " jac: array([-1.47841000e-04, -9.54029439e-03, 5.31224858e-10])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 17\n", + " nfev: 18\n", " nit: 12\n", + " njev: 18\n", " status: 0\n", " success: True\n", - " x: array([3.59394146e+00, 1.99830811e-01, 1.00000000e+06])\n" + " x: array([3.59321743e+00, 1.99662786e-01, 1.00000000e+06])\n" ] } ], @@ -1539,7 +1571,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1605,7 +1637,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.3" } }, "nbformat": 4, diff --git a/pygom/loss/base_loss.py b/pygom/loss/base_loss.py index cca68359..68c582da 100644 --- a/pygom/loss/base_loss.py +++ b/pygom/loss/base_loss.py @@ -65,7 +65,7 @@ def __init__(self, theta, ode, y = ode_utils.check_array_type(y) if state_weight is None: - state_weight = 1.0 + state_weight = np.ones(y.shape) if len(y) == y.size: y = y.flatten() diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 5e0e6445..b326c7bb 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -18,7 +18,7 @@ from pygom.model._model_errors import InitializeError from pygom.model.ode_utils import check_array_type -from pygom.utilR.distn import dnorm, dpois, gamma_mu_shape, dnbinom +from pygom.utilR.distn import dpois, gamma_mu_shape, dnbinom class InputError(Exception): ''' @@ -50,13 +50,15 @@ def __init__(self, y, weights=None): self._w = np.ones(self._y.shape) else: self._w = check_array_type(weights) - if np.any(weights<0): - raise ValueError('No elements in numpy array of weights should be negative') - if np.all(weights==0.0): - raise ValueError('All elements in numpy array of weights should not be 0.0') if len(self._w.shape) > 1: if 1 in self._w.shape: self._w = self._w.flatten() + + if np.any(self._w<0.0): + raise ValueError('No elements in numpy array of weights should be negative') + if np.all(self._w==0.0): + raise ValueError('All elements in numpy array of weights should not be 0.0') + assert self._y.shape == self._w.shape, \ "Input weight not of the same size as y" @@ -78,7 +80,7 @@ def residual(self, yhat, weighting_applied = True): :math:`y_{i} - \\hat{y}_{i}` ''' - if isinstance(weighting_applied,bool)=False: + if isinstance(weighting_applied,bool)==False: raise TypeError('weighting_applied should be boolean') if len(yhat.shape) > 1: @@ -88,7 +90,7 @@ def residual(self, yhat, weighting_applied = True): resid = self._y - yhat else: resid = self._y - yhat - if weighting_applied = True: + if weighting_applied == True: resid *= self._w return resid @@ -146,7 +148,7 @@ def diff_loss(self, yhat,weighting_applied=True): ------- :math:`-2(y_{i} - \\hat{y}_{i})` ''' - return -2*self.residual(yhat,weighting_applied)) + return -2*self.residual(yhat,weighting_applied) def diff2Loss(self, yhat): ''' @@ -231,13 +233,16 @@ def loss(self, yhat,weighting_applied=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - + + r=self.residual(yhat,weighting_applied) + sigma=self._sigma + # Calculate negative likelihood (depending on weighting of residuals). logpdf_p1= -np.log(2) logpdf_p2= np.log(2)/2 - logpdf_p3= -np.log(pi)/2 - logpdf_p4= np.log(1/self._sigma) - logpdf_p5_alt=-self.residual(yhat,weighting_applied)**2/(2*sigma**2) + logpdf_p3= -np.log(np.pi)/2 + logpdf_p4= np.log(1/sigma) + logpdf_p5_alt= -r**2 / (2*sigma**2) return (-(logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4+logpdf_p5_alt)).sum() def diff_loss(self, yhat,weighting_applied=True): @@ -366,7 +371,9 @@ def diff_loss(self, yhat,weighting_applied=True): :math:`\\mathcal\\frac{a \\left(\\hat{y} - y\\right)}{\\hat{y}^{2}}` ''' - return self._shape*-self.residual(yhat,weighting_applied)/yhat**2 + shape = self._shape + r = self.residual(yhat,weighting_applied) + return shape*-r/yhat**2 def diff2Loss(self, yhat,weighting_applied=True): ''' @@ -394,8 +401,8 @@ def diff2Loss(self, yhat,weighting_applied=True): yhat = yhat.ravel() y = self._y shape = self._shape - - return shape*(self.residual(yhat,weighting_applied)+y)/yhat**3 + r = self.residual(yhat,weighting_applied) + return shape*(r+y)/yhat**3 class Poisson(baseloss_type): ''' @@ -474,7 +481,8 @@ def diff2Loss(self, yhat): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - return self._y/(yhat**2) + y=self._y + return y/(yhat**2) class NegBinom(baseloss_type): ''' @@ -568,7 +576,6 @@ def diff_loss(self, yhat,weighting_applied=True): if 1 in yhat.shape: yhat = yhat.ravel() - y = self._y k = self._k r = self.residual(yhat,weighting_applied) first_derivs_yhat = k*-r/(yhat*(k+yhat)) @@ -602,7 +609,7 @@ def diff2Loss(self, yhat,weighting_applied=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - y = self._y + k = self._k r = self.residual(yhat,weighting_applied) scnd_derivs_yhat_p1= k diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index d8882249..e4182f54 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -17,7 +17,6 @@ from pygom.loss.base_loss import BaseLoss from pygom.loss.loss_type import Normal, Square, Poisson, Gamma, NegBinom -from pygom.model.ode_utils import check_array_type class SquareLoss(BaseLoss): ''' @@ -66,7 +65,7 @@ def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Gamma(self._y,self._shape,self._stateWeight) + self._lossObj = Gamma(self._y,self._shape,self._stateWeight) return self._lossObj class PoissonLoss(BaseLoss): @@ -82,7 +81,7 @@ def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Poisson(self._y,self._stateWeight) + self._lossObj = Poisson(self._y,self._stateWeight) return self._lossObj class NegBinomLoss(BaseLoss): @@ -99,5 +98,5 @@ def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = NegBinom(self._y,self._k,self._stateWeight) + self._lossObj = NegBinom(self._y,self._k,self._stateWeight) return self._lossObj \ No newline at end of file From 9b40b86f275e61aa53c9cc88d301555c8c074d46 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Tue, 30 Jun 2020 13:34:28 +0100 Subject: [PATCH 009/188] Check_array excludes boolean values by default --- ...s functions fitted to simulated data.ipynb | 1610 +++++++++-------- pygom/loss/base_loss.py | 60 +- pygom/loss/loss_type.py | 149 +- .../model/ode_utils/checks_and_conversions.py | 40 +- tests/test_loss_types.py | 273 +-- 5 files changed, 1220 insertions(+), 912 deletions(-) diff --git a/notebooks/Testing loss functions fitted to simulated data.ipynb b/notebooks/Testing loss functions fitted to simulated data.ipynb index 776f5847..573ea491 100644 --- a/notebooks/Testing loss functions fitted to simulated data.ipynb +++ b/notebooks/Testing loss functions fitted to simulated data.ipynb @@ -176,209 +176,209 @@ "data": { "text/plain": [ "array([[ 0.00000000e+00, 0.00000000e+00, nan],\n", - " [-3.21943456e-01, 1.85865527e-01, -1.13217774e-01],\n", - " [-2.10940831e-01, -1.40000086e-01, 3.21150841e-01],\n", - " [ 1.81602995e-01, 1.28076820e-02, 2.49787871e-01],\n", - " [-1.99910787e-01, -3.21987422e-01, 6.59265374e-02],\n", - " [-3.07353570e-01, -2.27188132e-01, 2.17562011e-01],\n", - " [-5.63337347e-02, -1.89013740e-01, 2.84964767e-02],\n", - " [ 2.31501967e-01, 6.14997028e-02, -2.35895637e-01],\n", - " [ 2.23927782e-01, -1.01405449e-01, -1.98699260e-01],\n", - " [ 2.48735438e-01, -3.53640373e-02, 1.67031470e-01],\n", - " [ 4.94412026e-02, -1.52057161e-01, 2.09835766e-01],\n", - " [-2.06776227e-01, 3.13201462e-01, -4.29291297e-02],\n", - " [ 2.46433170e-02, -2.84114224e-01, 3.25711119e-03],\n", - " [ 1.92155506e-01, 2.17675626e-01, 5.62946687e-02],\n", - " [-1.44069462e-01, 1.35347749e-01, -1.82909871e-01],\n", - " [-8.29226910e-02, 3.23393603e-01, -2.81718008e-01],\n", - " [-3.76928728e-02, 3.23038547e-02, -2.86446432e-01],\n", - " [-3.11282664e-01, 1.27084504e-01, -2.59438059e-02],\n", - " [-2.62325766e-02, 2.69860578e-01, 1.18361484e-01],\n", - " [ 1.06221765e-01, -9.70804044e-02, -2.74947371e-01],\n", - " [-2.71437837e-02, -2.18447494e-01, -5.67370795e-02],\n", - " [-3.12189987e-01, 2.22512900e-01, -1.66663625e-01],\n", - " [-1.28018641e-01, -2.34923267e-01, 1.41683585e-02],\n", - " [ 2.32254315e-01, -3.26165428e-01, 2.34238143e-01],\n", - " [ 8.69678367e-02, 1.64301394e-01, -2.47656180e-01],\n", - " [ 1.40965168e-01, 6.32849105e-02, -9.45633773e-02],\n", - " [ 3.07096765e-01, -1.42502266e-01, -3.77726686e-02],\n", - " [-6.09429143e-02, 1.63808739e-01, 3.28916009e-01],\n", - " [ 3.82767127e-02, 3.20843549e-02, -7.79089580e-02],\n", - " [ 9.56398819e-02, 4.18597131e-02, 4.03213450e-02],\n", - " [ 1.27231497e-01, -8.30499409e-02, -7.31856628e-02],\n", - " [ 4.95710698e-02, 2.76706458e-01, 2.05492090e-01],\n", - " [-2.08266620e-01, 2.39049966e-01, 2.01173560e-01],\n", - " [-2.93349546e-01, -2.57007747e-01, 9.98727121e-03],\n", - " [-3.22996838e-01, 1.46160366e-01, 1.80225707e-01],\n", - " [-1.87518084e-01, -3.77615176e-02, -6.75263992e-02],\n", - " [ 1.79662877e-01, -1.35008808e-01, 2.83698888e-01],\n", - " [ 1.35604549e-02, -2.62201419e-01, -2.72549801e-01],\n", - " [ 3.88544297e-02, -5.52991492e-02, 1.35833062e-02],\n", - " [ 9.16412350e-04, -9.24962534e-02, 2.09220178e-01],\n", - " [ 3.25720195e-01, -1.13579915e-01, 6.44327795e-02],\n", - " [ 1.85011815e-01, 2.56123076e-01, -4.11627271e-02],\n", - " [-2.82554284e-01, 2.64315337e-01, -8.83167048e-02],\n", - " [-1.86349157e-01, 3.56996669e-02, 2.01663352e-01],\n", - " [-1.57759231e-01, 1.39231206e-01, -1.85782649e-01],\n", - " [ 7.03547306e-02, 1.01422084e-01, 1.23427057e-01],\n", - " [ 2.76699346e-02, -3.91221695e-02, 2.16061024e-01],\n", - " [ 1.59004020e-01, -2.21259419e-01, 3.27064373e-01],\n", - " [ 1.47263354e-01, -1.04940533e-01, 2.44662128e-01],\n", - " [-1.02896184e-01, -1.55783920e-01, 2.95573231e-01],\n", - " [-2.68855926e-01, 3.19496258e-01, -2.91857351e-01],\n", - " [ 1.13792396e-01, -1.79844552e-01, 3.31017884e-01],\n", - " [-2.88347996e-01, -2.13458276e-01, 7.44025583e-02],\n", - " [ 7.94402079e-02, -4.94810671e-02, -5.15517506e-02],\n", - " [ 2.73209861e-01, 4.98005575e-02, 3.17599430e-01],\n", - " [-1.26001530e-01, 1.86226792e-01, -2.41490855e-01],\n", - " [ 2.20762784e-01, 2.08149383e-01, -1.95067777e-01],\n", - " [ 7.66135816e-02, -2.49310855e-01, -9.13035120e-02],\n", - " [ 1.97046212e-01, -2.14907322e-02, 3.29487704e-01],\n", - " [ 1.55059587e-01, -2.26415078e-01, 1.59962712e-01],\n", - " [ 2.11096333e-01, -2.65176253e-01, -4.05930821e-03],\n", - " [ 2.79075501e-01, 1.92098721e-01, -8.23100303e-02],\n", - " [-3.08439506e-01, -7.98957238e-02, -5.01829836e-02],\n", - " [-2.03697278e-01, 2.05995436e-01, -9.14985961e-02],\n", - " [ 1.20521659e-01, 3.00440276e-01, 1.47263752e-02],\n", - " [-2.27957751e-01, -8.21201620e-02, -1.19488396e-02],\n", - " [ 1.59556225e-01, -2.82204036e-02, -2.21599601e-01],\n", - " [ 2.15680392e-01, 3.03996830e-01, -2.71423977e-01],\n", - " [ 1.77769288e-01, 2.09960478e-01, 8.39473619e-02],\n", - " [ 1.13717062e-01, -1.79358977e-01, -4.59715825e-03],\n", - " [-1.84322552e-01, -2.26755373e-01, -2.39767730e-01],\n", - " [ 1.86058326e-01, -3.21698703e-01, -2.46524540e-01],\n", - " [ 2.86200529e-01, -2.17887930e-01, 3.57893365e-02],\n", - " [-1.18158603e-01, -6.54001442e-02, -2.87505412e-01],\n", - " [-1.50315173e-01, 1.42851125e-01, 2.20421926e-01],\n", - " [-2.23556346e-01, -1.92795329e-01, 1.74674105e-01],\n", - " [-2.31639431e-01, -4.84220495e-02, -8.52286090e-02],\n", - " [ 1.20174394e-01, -1.96588635e-01, 2.49598607e-01],\n", - " [ 1.96578388e-01, -6.38269970e-02, 9.43425551e-02],\n", - " [-3.81314176e-02, 3.18781466e-01, 1.77470481e-01],\n", - " [ 4.32925130e-02, -2.00318211e-01, 4.17754219e-02],\n", - " [ 2.36790925e-01, -1.03921195e-01, -3.30797879e-02],\n", - " [ 1.99476702e-01, -1.43344835e-01, 5.64405904e-02],\n", - " [ 3.31310790e-01, 1.50853809e-01, 1.35732696e-01],\n", - " [-2.41321604e-01, 3.19392547e-01, -4.54542545e-02],\n", - " [-6.91929812e-03, -2.13076727e-01, -1.63392477e-01],\n", - " [-1.22865716e-01, -1.78234910e-01, 2.03967351e-01],\n", - " [ 3.30704049e-01, 9.71682583e-02, -3.08190158e-01],\n", - " [ 2.00774222e-01, -1.42644728e-01, -2.98044193e-01],\n", - " [-2.23396056e-01, -2.40914551e-01, 2.12421125e-01],\n", - " [ 7.12265936e-02, 2.47778623e-02, -2.88177768e-01],\n", - " [-2.60885258e-01, 3.13300871e-01, 1.71580578e-01],\n", - " [-1.36024349e-01, -6.65814427e-02, -6.26423574e-02],\n", - " [ 1.55892372e-01, 2.48340883e-01, -2.95586414e-01],\n", - " [-1.77048639e-01, 3.20849855e-02, 3.03433400e-01],\n", - " [ 1.31558930e-01, 2.33285122e-01, -2.34144482e-02],\n", - " [-9.99275328e-02, -8.26120829e-02, 2.48214915e-01],\n", - " [ 1.06138964e-01, 1.75757064e-01, -3.19240383e-01],\n", - " [ 1.62623817e-01, 2.72537446e-02, -5.92349069e-02],\n", - " [-1.50942703e-01, 8.10263676e-02, -2.45111595e-01],\n", - " [ 1.80449990e-01, 2.72827791e-01, 1.08298678e-01],\n", - " [-2.32438202e-01, 2.88886019e-01, -1.84345430e-01],\n", - " [ 2.49503066e-01, 3.10983987e-01, -2.86543276e-01],\n", - " [ 1.20511488e-01, 5.13694112e-03, 1.36225876e-01],\n", - " [ 2.68332086e-01, 3.15883069e-01, 4.00702873e-02],\n", - " [-2.69552790e-01, 1.13927547e-01, -1.31478459e-01],\n", - " [ 1.53144584e-01, 2.49076716e-01, -2.26674703e-01],\n", - " [-1.03603484e-01, -2.10210157e-02, -2.41978432e-01],\n", - " [ 1.96105677e-01, -2.68912665e-01, 2.84057482e-01],\n", - " [ 1.07999685e-01, 9.50813469e-02, 1.44150697e-01],\n", - " [ 1.18566775e-02, 1.67907743e-01, 8.67410283e-02],\n", - " [-1.40939249e-01, 2.15215929e-01, 1.36839282e-01],\n", - " [-9.05791123e-02, -1.79494555e-01, -3.22292115e-01],\n", - " [-1.62777658e-01, -1.38902568e-01, -1.04280378e-01],\n", - " [-2.48846862e-01, 5.49497354e-02, -2.55146872e-01],\n", - " [-1.92560097e-01, 2.75780669e-01, 1.38053097e-02],\n", - " [ 7.22306638e-02, 2.51954666e-01, 2.00025665e-01],\n", - " [-1.48601712e-01, -6.24716939e-02, 1.22190401e-01],\n", - " [ 2.96343742e-01, -9.16466617e-02, -2.79057616e-01],\n", - " [-9.44903089e-02, 2.02212337e-01, 1.30955098e-01],\n", - " [ 2.59779211e-01, -3.17918046e-01, 1.04952796e-01],\n", - " [-9.19699690e-02, 3.24716030e-01, 1.02188300e-01],\n", - " [-1.56266425e-01, 2.22184605e-01, 9.96280301e-02],\n", - " [-8.09897738e-02, 1.34471312e-01, -7.32451926e-02],\n", - " [-1.40359625e-01, -2.11776854e-02, -3.10384400e-01],\n", - " [-2.73853206e-01, -1.95512118e-01, 3.98482839e-02],\n", - " [-1.27223980e-01, -2.32593176e-01, 1.70883648e-01],\n", - " [ 4.92405598e-02, 8.50372783e-02, 4.05976680e-02],\n", - " [ 1.29315076e-01, 1.81514925e-01, 2.69971751e-01],\n", - " [ 5.07861648e-02, -7.40873609e-02, 1.65365118e-01],\n", - " [ 2.68151227e-01, -1.45063285e-01, -2.16386660e-02],\n", - " [-3.17820212e-01, 1.62066777e-01, -2.07795803e-01],\n", - " [-3.16812154e-01, 2.96508501e-01, 1.92175410e-01],\n", - " [ 1.96337705e-01, 8.81620255e-02, -1.02653817e-01],\n", - " [-1.93525139e-01, -2.03936400e-01, 1.70445013e-01],\n", - " [-2.87456720e-02, -1.07611842e-01, 2.49101875e-01],\n", - " [ 8.09404791e-02, -3.21299706e-02, 1.23033680e-01],\n", - " [ 2.59498758e-01, -2.55703800e-02, -2.66267193e-01],\n", - " [ 2.35573590e-01, -1.56838315e-01, 2.56689692e-01],\n", - " [ 1.30542822e-01, 2.69746313e-01, -2.57985160e-01],\n", - " [ 1.74263648e-01, 2.29095931e-01, 7.48744349e-02],\n", - " [ 2.86189769e-01, 2.79547063e-01, 6.85199411e-02],\n", - " [-1.05937815e-01, 1.79938630e-01, 7.44842201e-02],\n", - " [ 2.15354490e-01, 1.79798390e-01, 1.86155500e-01],\n", - " [-2.40897200e-01, -1.23944817e-01, 6.86891899e-05],\n", - " [ 1.92303073e-01, 2.93842299e-01, 1.69436631e-01],\n", - " [ 6.00638743e-02, -1.92023781e-01, -2.35632974e-01],\n", - " [ 1.08886035e-01, -3.11263490e-01, 6.42473250e-02],\n", - " [-2.28977828e-01, -2.88312273e-01, -4.60168657e-02],\n", - " [ 1.88477181e-03, -1.41546947e-01, 3.28242664e-01],\n", - " [-1.73354229e-01, 3.13080313e-01, 2.87096208e-01],\n", - " [ 4.29327556e-02, -1.06010816e-01, 2.17850274e-01],\n", - " [ 6.71826155e-02, 6.18062750e-03, -1.61497479e-01],\n", - " [ 1.03828416e-01, 1.42508637e-01, 3.30062436e-01],\n", - " [ 2.68190801e-01, -2.61865575e-02, -4.02513191e-02],\n", - " [-2.31829458e-01, -1.09360422e-01, -3.29300076e-01],\n", - " [-1.81418170e-01, -5.11671925e-02, -9.01593327e-02],\n", - " [-3.11486686e-01, 3.11728877e-02, -3.05828061e-01],\n", - " [ 1.86347159e-01, 2.36229401e-01, 3.01929479e-01],\n", - " [-2.92591029e-01, 9.08584343e-02, -1.40299446e-01],\n", - " [-1.05944855e-02, 1.61865581e-01, -2.50704225e-01],\n", - " [-2.45622639e-02, -3.16306034e-01, -2.69959629e-01],\n", - " [ 8.84372993e-02, -2.81337428e-01, 1.35729306e-01],\n", - " [-6.21876036e-02, -5.41408363e-02, 1.77717783e-01],\n", - " [ 2.05371132e-01, 1.73047469e-02, 3.20133765e-01],\n", - " [ 1.28758414e-01, 4.28390061e-03, 8.84307448e-02],\n", - " [ 2.02100596e-01, -6.90202732e-03, -1.15680333e-01],\n", - " [ 4.91767073e-02, 2.68686316e-01, 1.27224288e-01],\n", - " [ 1.53107746e-01, -2.24791872e-01, -2.82729565e-01],\n", - " [ 1.27456089e-01, 2.89267392e-02, -2.31685444e-01],\n", - " [ 1.21530019e-01, -1.50701614e-01, -2.20018436e-01],\n", - " [ 2.40944283e-01, -5.44516998e-02, 1.78625669e-01],\n", - " [-2.20691466e-01, 2.27806142e-01, -3.19788277e-01],\n", - " [ 5.43321208e-02, -1.68073613e-01, 2.88610851e-01],\n", - " [-5.14881733e-02, -2.17052746e-01, 8.46518610e-02],\n", - " [-3.26344726e-01, -2.65734801e-01, -3.29900167e-01],\n", - " [ 2.91065837e-01, -8.86418051e-02, 1.43952139e-01],\n", - " [-3.18629385e-01, 2.42564945e-01, -1.50746165e-01],\n", - " [ 1.31558589e-02, -1.37399607e-01, -3.10027779e-02],\n", - " [-2.82888143e-01, -1.97311938e-01, -1.71934170e-01],\n", - " [-3.26726159e-01, -1.46398217e-01, -2.67336805e-01],\n", - " [-2.50764400e-01, 2.40030847e-01, 1.90164020e-01],\n", - " [-1.86402443e-01, -1.59800689e-01, -1.24289238e-01],\n", - " [-3.23243518e-01, 1.64399910e-01, 1.89434490e-02],\n", - " [ 1.62444666e-01, 1.72003606e-01, 3.15533874e-01],\n", - " [ 4.11196377e-02, -8.77415417e-02, 1.23995207e-01],\n", - " [ 1.28272258e-01, -2.32939686e-02, 4.35417997e-02],\n", - " [-1.75479288e-01, 9.41603764e-02, 2.52966436e-01],\n", - " [-1.12455732e-01, 1.64264689e-01, -3.33227910e-01],\n", - " [-2.10629561e-02, 2.63683701e-01, -2.22926132e-01],\n", - " [ 4.89649368e-02, 1.17222997e-01, 2.04754960e-01],\n", - " [-1.00714628e-01, 7.93490662e-02, -7.47079386e-02],\n", - " [ 2.92136018e-03, 1.29087068e-01, -1.48908029e-01],\n", - " [ 1.13242124e-01, -1.04279228e-01, 2.47219125e-01],\n", - " [-2.18469863e-01, -1.99858094e-01, -3.11419043e-01],\n", - " [ 2.82152105e-01, -5.74810426e-02, 6.78507853e-02],\n", - " [ 1.90039518e-01, -2.49188273e-01, -2.24943614e-01],\n", - " [-1.39040280e-01, -1.70893861e-01, -9.90695495e-02],\n", - " [-1.54891812e-01, 2.19340978e-01, -2.86544108e-03],\n", - " [ 1.54253118e-01, 1.73852897e-01, -1.74464629e-01],\n", - " [-9.57521372e-02, 1.46961351e-01, 3.27614130e-01],\n", - " [ 3.20980053e-01, -1.54030722e-01, -3.70355927e-03],\n", - " [ 1.10411322e-01, -1.66169988e-01, -2.91024643e-01],\n", - " [ 2.03023170e-01, 2.57521968e-01, -1.37497649e-01]])" + " [-1.73465915e-01, -1.17281547e-01, -2.25860015e-02],\n", + " [ 2.18875989e-03, -1.41630417e-01, -1.20285204e-01],\n", + " [ 3.10984783e-01, -1.16333578e-01, 2.95271450e-01],\n", + " [-2.69029696e-01, -1.99213726e-01, -1.90606565e-01],\n", + " [ 1.35684509e-01, 1.78379344e-01, 1.80962883e-01],\n", + " [-8.77803140e-02, 2.49616076e-01, -3.00454033e-02],\n", + " [-3.04094678e-02, -3.10164909e-01, 6.59761925e-02],\n", + " [ 4.77262892e-02, -1.92819030e-01, -1.39817160e-01],\n", + " [ 1.70193324e-01, 1.94346231e-01, 2.65605367e-01],\n", + " [-1.07254972e-01, 3.92049280e-02, -4.60377530e-02],\n", + " [ 2.25368182e-01, 1.68391679e-01, 5.02529134e-02],\n", + " [-2.73480406e-02, -2.43459230e-01, -2.72124777e-01],\n", + " [ 3.25378306e-01, 3.11198994e-01, -3.19891929e-01],\n", + " [-3.02732680e-02, -7.38888142e-02, -1.42714821e-01],\n", + " [ 1.94084991e-01, -2.12622683e-01, -1.15964568e-01],\n", + " [ 2.48373612e-01, 2.61208788e-01, 2.24903683e-01],\n", + " [ 1.37001895e-01, -1.85852789e-01, -1.18528471e-01],\n", + " [ 1.95169073e-01, 2.33950828e-01, 2.61071600e-01],\n", + " [ 2.94426553e-01, 1.78731291e-01, 1.97572440e-01],\n", + " [ 1.04043589e-01, -1.48204811e-01, -2.49256282e-01],\n", + " [-2.09591210e-01, 1.27888057e-01, 4.29371010e-02],\n", + " [-1.43084416e-01, -2.20412193e-01, -3.25009447e-01],\n", + " [ 6.33522507e-02, 1.53844079e-02, 2.99794892e-01],\n", + " [ 2.11100728e-01, -1.74071212e-01, -2.25674301e-01],\n", + " [-2.14296968e-02, -2.65530317e-01, 3.25590647e-02],\n", + " [-1.62179509e-01, -2.81708892e-01, -3.75237265e-02],\n", + " [-1.09534418e-01, -2.96644636e-01, -1.46756635e-01],\n", + " [ 1.97785675e-01, 1.21368330e-01, -8.52835473e-02],\n", + " [ 6.19544052e-02, 2.56309699e-01, 6.11246356e-02],\n", + " [ 2.00808833e-01, -1.42135844e-01, -2.13179622e-01],\n", + " [-2.16077990e-01, -2.86104187e-01, -2.95618164e-01],\n", + " [ 3.21509098e-01, 2.54100768e-01, 1.48586067e-01],\n", + " [-1.77056121e-01, 3.14195690e-01, -7.89813198e-02],\n", + " [ 9.52571895e-02, -2.93934351e-01, 2.32526004e-01],\n", + " [ 3.25502678e-01, 2.31769642e-01, -1.07617135e-02],\n", + " [ 2.35964481e-01, -1.33138709e-01, -1.72244039e-01],\n", + " [-1.66454417e-01, 2.45896187e-02, 3.26641177e-01],\n", + " [ 1.84816860e-01, 2.32456914e-01, 1.99283036e-01],\n", + " [ 8.91630169e-02, -4.65652026e-02, -1.29383851e-02],\n", + " [ 4.91988839e-02, 7.28993711e-02, -6.48891682e-02],\n", + " [-7.55111005e-02, -3.01904206e-01, -5.57502552e-02],\n", + " [ 8.02339702e-03, -2.71726635e-01, -1.62495983e-02],\n", + " [-6.36690889e-02, -2.96569398e-01, -9.48426199e-02],\n", + " [-3.10261981e-01, 2.49488644e-02, 2.99644152e-01],\n", + " [ 1.45286030e-01, 3.06316140e-01, -7.45581102e-03],\n", + " [ 3.07300545e-01, -3.22020626e-01, 1.49929309e-01],\n", + " [ 1.40175328e-01, -1.85315900e-02, -1.02966849e-01],\n", + " [ 1.18323765e-01, 3.24544502e-03, -3.14290184e-01],\n", + " [-2.91429133e-01, 2.87166606e-01, 2.99142261e-02],\n", + " [-5.48979385e-02, 8.98441545e-02, 1.03955500e-01],\n", + " [ 3.04884296e-01, -1.37771353e-01, 1.01023789e-01],\n", + " [-1.33848241e-01, -1.11395555e-01, 4.99581753e-02],\n", + " [-3.78918481e-02, -3.23665755e-01, -1.47739901e-01],\n", + " [ 2.21314141e-01, 2.82572816e-01, 4.72580803e-02],\n", + " [ 5.22709247e-02, -3.23988777e-01, -3.31099138e-02],\n", + " [ 4.41287378e-04, 1.12372308e-01, 1.25004212e-01],\n", + " [ 7.91370306e-02, -1.43266719e-01, 5.20809368e-02],\n", + " [-2.71529409e-01, 9.58139850e-02, -4.10690930e-02],\n", + " [-7.58599886e-02, 2.11473953e-01, 6.59916787e-02],\n", + " [-1.98114673e-02, 3.25925174e-01, -1.88900522e-02],\n", + " [-2.15236733e-01, -6.61674151e-03, -7.97228069e-02],\n", + " [-8.52869474e-02, -4.54868991e-02, 1.81776124e-01],\n", + " [-3.17873872e-01, -5.00410695e-03, 2.74312022e-01],\n", + " [-2.56697406e-01, -2.52524664e-01, 8.48325600e-02],\n", + " [ 6.87283327e-02, 2.55013582e-01, -1.14591512e-01],\n", + " [-2.63254784e-01, 3.03913765e-01, -3.04301181e-01],\n", + " [ 2.49161251e-01, -1.57671710e-01, 8.75571120e-02],\n", + " [-1.98673502e-01, 2.14671912e-01, -1.89495051e-01],\n", + " [-4.59403003e-02, 2.04353868e-01, 2.27361836e-01],\n", + " [ 7.64131802e-02, 2.52120942e-01, -1.75540234e-01],\n", + " [-1.95232206e-01, 1.69610425e-02, -1.35020865e-01],\n", + " [-2.15817787e-01, 1.22040324e-01, -2.56928157e-01],\n", + " [-3.28443088e-01, 3.26392955e-01, 9.71235957e-02],\n", + " [ 6.52615418e-02, 1.62982784e-01, -2.77772468e-01],\n", + " [-1.06954476e-01, -1.82748624e-01, -2.30851985e-01],\n", + " [-1.03560258e-01, 2.49776694e-01, 2.39589555e-01],\n", + " [-2.51361697e-01, -2.62613604e-01, -3.43346629e-02],\n", + " [ 5.52044588e-02, 1.71414602e-01, -1.18827697e-01],\n", + " [ 2.04645160e-01, -1.57695147e-01, -7.46836992e-02],\n", + " [-2.54150013e-01, 2.00084150e-01, -2.77762288e-01],\n", + " [ 1.91226654e-01, -1.15839953e-01, 1.95446804e-01],\n", + " [ 3.25631354e-01, -1.55219633e-01, -1.36220152e-01],\n", + " [ 8.59434276e-02, 2.44324599e-01, -1.80598534e-01],\n", + " [-4.41759258e-02, 2.88086579e-01, 2.32770906e-01],\n", + " [-2.27196580e-01, 2.72331912e-01, -1.53109214e-01],\n", + " [ 1.47937296e-01, -1.28297016e-01, -2.28099160e-01],\n", + " [ 9.75527646e-02, 3.31250187e-01, 1.80018836e-01],\n", + " [-2.40869627e-03, -2.62345740e-01, -2.93019352e-01],\n", + " [ 1.42517039e-01, -3.26917253e-01, 3.24664042e-01],\n", + " [ 2.66350592e-01, -1.89474157e-01, -3.76501731e-02],\n", + " [ 3.00491876e-01, 7.70405853e-02, 1.38895227e-01],\n", + " [-2.24919571e-01, 1.38375653e-04, -1.22365187e-01],\n", + " [ 1.89472971e-01, -6.99390524e-02, 1.75359377e-01],\n", + " [ 2.40847084e-01, 2.17245088e-01, -1.29960940e-01],\n", + " [ 1.17031088e-01, 1.25207417e-01, -2.13111306e-01],\n", + " [-1.48790790e-01, 2.42009355e-01, -2.72889122e-01],\n", + " [-6.55964475e-03, -2.67211611e-01, -2.75637870e-01],\n", + " [-1.85542712e-01, -7.13208125e-02, -1.43045237e-01],\n", + " [ 2.14837170e-01, 3.09019053e-01, -1.03940169e-01],\n", + " [-2.08291133e-01, -1.55812903e-01, -2.71145936e-01],\n", + " [-1.55833854e-01, -2.88308172e-01, 2.45174658e-01],\n", + " [-3.11004925e-01, 1.66460354e-01, 1.48310637e-01],\n", + " [ 1.11900762e-01, 1.59711839e-01, -1.06092199e-01],\n", + " [ 2.52702535e-01, 2.63918522e-01, 8.81508771e-02],\n", + " [-2.96912130e-01, 2.00037590e-01, -1.35534414e-01],\n", + " [ 2.57644746e-01, 2.17801439e-01, -1.37936016e-01],\n", + " [-2.21287471e-02, 1.87488209e-01, 6.54050559e-02],\n", + " [-3.13781890e-01, 8.90421404e-02, -2.65601600e-03],\n", + " [ 1.73633876e-02, 4.70498687e-02, 1.99892821e-01],\n", + " [-1.75870723e-01, -2.34269032e-01, -1.44870264e-01],\n", + " [ 2.60912112e-01, 8.12053627e-02, 3.86306769e-02],\n", + " [ 2.07535825e-01, -2.98946883e-01, -2.94085800e-01],\n", + " [-2.28341327e-02, -1.05874587e-01, 3.06311986e-03],\n", + " [ 2.88008753e-01, 1.71295755e-01, -1.44628284e-03],\n", + " [-3.12911107e-01, -1.94018364e-01, 1.04187514e-01],\n", + " [-2.65559378e-01, 1.87606865e-01, -3.14186465e-01],\n", + " [ 3.12564575e-01, -1.41561571e-01, 2.97041688e-01],\n", + " [-1.61079637e-01, -6.04344631e-02, -3.16709214e-01],\n", + " [-9.79493115e-02, 2.56336113e-01, 2.40368610e-01],\n", + " [ 2.07487179e-01, 1.37615049e-01, 3.01609274e-01],\n", + " [ 2.98452807e-01, -1.98587552e-01, -9.27371231e-02],\n", + " [ 1.34487459e-01, 1.37004951e-01, -2.08067897e-01],\n", + " [-3.24649739e-01, 2.79299579e-01, 2.42697497e-01],\n", + " [ 1.48755627e-01, -2.56194465e-02, 2.16687251e-01],\n", + " [ 2.82086858e-01, -2.73028509e-01, 1.49601622e-01],\n", + " [-2.90566692e-01, -1.46843110e-01, -4.20095301e-02],\n", + " [-2.02395486e-01, 2.76415604e-01, 2.92878761e-01],\n", + " [ 1.29300728e-01, -2.25682761e-01, -1.39203475e-01],\n", + " [-2.94574241e-01, -1.60448086e-02, -1.33783822e-01],\n", + " [-1.80234848e-01, 1.27149669e-01, 3.46658132e-02],\n", + " [-3.28310685e-01, 2.48574245e-01, 1.82136367e-01],\n", + " [-2.24348578e-01, 7.15601086e-02, -1.00090791e-01],\n", + " [ 1.35871520e-01, 1.78353047e-01, 1.14648325e-01],\n", + " [-2.93504246e-02, -7.33876121e-02, 2.60776669e-01],\n", + " [-9.32936487e-02, 2.09428551e-02, -2.79570179e-01],\n", + " [ 6.37399122e-02, 2.17366633e-01, 3.02729114e-01],\n", + " [ 9.07693126e-02, 1.59002147e-01, 2.41856391e-02],\n", + " [ 3.29090325e-01, -1.17795784e-01, -2.89107948e-01],\n", + " [-3.24646432e-02, 1.63737182e-01, 2.09973144e-02],\n", + " [ 1.80119330e-01, -6.34746381e-02, 2.19125711e-01],\n", + " [-1.39888719e-01, -8.80666022e-02, -1.42371440e-01],\n", + " [ 3.31763098e-01, 8.68652514e-02, 3.15174893e-01],\n", + " [-2.97656020e-01, 8.69786170e-02, -3.21062047e-01],\n", + " [-5.32967716e-02, -3.10244442e-01, 5.49010428e-02],\n", + " [-5.42176967e-02, -7.62270050e-02, -5.57502908e-02],\n", + " [-8.98274483e-02, -1.12891073e-01, -1.41591575e-01],\n", + " [ 3.26933775e-02, 1.13416765e-01, 9.83869429e-02],\n", + " [-8.30560535e-02, -1.24896527e-01, -2.28530639e-02],\n", + " [-2.50228276e-01, 1.14537667e-02, -3.41017652e-03],\n", + " [-1.38776547e-01, -2.50449609e-01, -6.21100653e-02],\n", + " [ 1.44905560e-01, -2.75800643e-01, 2.65509337e-01],\n", + " [-3.20089696e-01, 3.27402651e-01, -1.72856493e-01],\n", + " [ 1.15474683e-01, -2.45068819e-01, -4.92954020e-02],\n", + " [ 2.05133386e-01, 3.27483684e-01, -1.93659902e-01],\n", + " [-2.17767265e-01, 8.70771976e-02, 1.87124947e-01],\n", + " [ 7.27246238e-02, -1.40465442e-01, -2.69193721e-01],\n", + " [-9.97701910e-03, 1.07729750e-01, -2.68065630e-01],\n", + " [ 3.03733136e-01, 3.22867206e-01, 1.49238218e-01],\n", + " [-2.78795783e-01, -1.14419874e-02, -7.20286782e-02],\n", + " [ 2.27085067e-01, 2.25468966e-03, 3.30907780e-01],\n", + " [ 8.96872448e-02, 1.61653251e-02, 1.85384909e-01],\n", + " [ 2.09636861e-02, 1.59974804e-01, -2.01092462e-01],\n", + " [ 2.89371780e-01, -1.56939225e-01, 3.21132503e-01],\n", + " [-1.60498331e-01, -1.18765721e-01, 1.13698025e-01],\n", + " [ 2.58419878e-01, -2.43509871e-01, -2.62146111e-01],\n", + " [-1.73732340e-01, 2.78540447e-01, -3.26039184e-01],\n", + " [-1.90956096e-02, -2.53887573e-01, -1.00832029e-01],\n", + " [ 1.90229262e-01, -1.72023628e-01, -2.31129213e-01],\n", + " [ 1.64831891e-01, 1.42491962e-01, -1.59541848e-01],\n", + " [-2.63697330e-01, 2.50564149e-01, 1.62164895e-01],\n", + " [-3.05547702e-01, 1.00183246e-01, 7.41942823e-02],\n", + " [ 4.07308835e-02, -2.31988517e-01, -3.25882263e-01],\n", + " [-1.53928260e-01, 2.11032128e-01, 2.48124476e-01],\n", + " [-4.75569094e-02, 1.11467076e-01, 1.61397329e-01],\n", + " [ 3.24990686e-01, -2.25966590e-01, 2.50815594e-01],\n", + " [-1.51945789e-01, 1.08083714e-01, -2.81320222e-01],\n", + " [-1.04216758e-01, -1.04818192e-01, 2.88203609e-01],\n", + " [-3.03459319e-01, 2.11989847e-01, -1.60581341e-01],\n", + " [ 1.34966390e-01, -1.17862102e-01, -2.43005916e-02],\n", + " [ 2.27585955e-01, 2.97513116e-01, 3.23156970e-01],\n", + " [ 1.01935503e-02, 2.84152144e-01, 2.22278818e-01],\n", + " [-1.39242592e-01, -9.10229412e-02, 3.25125351e-01],\n", + " [ 1.61950734e-01, -2.86648561e-01, -4.84271868e-02],\n", + " [-3.14874702e-01, 1.87709580e-01, 9.93054614e-02],\n", + " [ 1.88947588e-01, 1.83665135e-01, -1.59567842e-01],\n", + " [ 8.29825603e-02, 1.67331153e-01, 4.33415390e-02],\n", + " [-4.90594041e-02, -2.91446169e-01, -1.04161328e-01],\n", + " [ 1.60369798e-01, -1.49862405e-01, -2.93917315e-02],\n", + " [ 3.12709890e-01, -4.68877085e-02, -1.28360996e-01],\n", + " [ 2.49744887e-01, 3.28753915e-01, 2.21007900e-01],\n", + " [-9.28652790e-02, -6.89210427e-02, 2.25952258e-01],\n", + " [-2.44509281e-01, 3.04169434e-01, -2.59243410e-01],\n", + " [-2.23974760e-01, -3.15196226e-01, -9.50514355e-02],\n", + " [-8.94209698e-02, 2.46512550e-01, -2.44376339e-02],\n", + " [-1.88389365e-01, -6.98384260e-02, 2.25805610e-01],\n", + " [-1.12387378e-01, 1.24293193e-01, 2.60368640e-01],\n", + " [-7.04497617e-02, 1.72365737e-02, 1.95754470e-01],\n", + " [ 4.28703247e-02, -1.06070454e-01, -1.66811253e-01],\n", + " [ 1.76556407e-01, -1.65162532e-01, 9.66494270e-02],\n", + " [-2.20010409e-01, -4.73485568e-02, -1.48941583e-01],\n", + " [-2.12488717e-01, -5.77153871e-03, 2.86460630e-01],\n", + " [-2.66543889e-01, 3.10357896e-01, 9.10328100e-02],\n", + " [-1.77407989e-02, -2.32471504e-01, -2.99887659e-01]])" ] }, "execution_count": 8, @@ -400,7 +400,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -436,209 +436,209 @@ { "data": { "text/plain": [ - "array([[5.54899714e+00, 1.39761571e-01],\n", - " [9.41509648e+00, 6.95380093e-01],\n", - " [2.59415887e+01, 1.73602161e+00],\n", - " [4.06294543e+01, 3.63207199e+00],\n", - " [1.08339867e+02, 9.89807619e+00],\n", - " [2.65942008e+02, 1.97219908e+01],\n", - " [8.14010192e+02, 3.43927387e+01],\n", - " [1.61036450e+03, 8.44615745e+01],\n", - " [4.03372942e+03, 2.87600545e+02],\n", - " [8.24405119e+03, 6.95570046e+02],\n", - " [2.94412965e+04, 1.27820655e+03],\n", - " [3.63262375e+04, 3.08314488e+03],\n", - " [1.34300664e+05, 7.31638055e+03],\n", - " [2.51120961e+05, 1.22282810e+04],\n", - " [5.12397402e+05, 2.15432773e+04],\n", - " [5.85616873e+05, 3.84847695e+04],\n", - " [7.90205922e+05, 8.36926709e+04],\n", - " [9.74797129e+05, 1.37447113e+05],\n", - " [7.07757082e+05, 1.17346978e+05],\n", - " [6.03556137e+05, 1.89433078e+05],\n", - " [9.13909621e+05, 1.99048484e+05],\n", - " [5.48929799e+05, 2.79399602e+05],\n", - " [4.62040519e+05, 3.83327390e+05],\n", - " [7.61326355e+05, 2.58855593e+05],\n", - " [6.62287422e+05, 3.40426427e+05],\n", - " [5.08464539e+05, 3.91021455e+05],\n", - " [6.56745303e+05, 5.78473948e+05],\n", - " [5.54162951e+05, 4.26765230e+05],\n", - " [5.32220707e+05, 5.08730031e+05],\n", - " [4.45615989e+05, 4.76315527e+05],\n", - " [5.90230868e+05, 6.48108582e+05],\n", - " [5.44910361e+05, 6.72870334e+05],\n", - " [3.10827425e+05, 5.87435017e+05],\n", - " [4.56115660e+05, 7.10530498e+05],\n", - " [3.64253784e+05, 5.79474331e+05],\n", - " [3.11474802e+05, 8.21438803e+05],\n", - " [2.52718860e+05, 4.78270705e+05],\n", - " [3.07809391e+05, 6.83324686e+05],\n", - " [2.81269787e+05, 8.34432164e+05],\n", - " [2.61336999e+05, 7.50610280e+05],\n", - " [3.52273390e+05, 6.89933915e+05],\n", - " [3.37278880e+05, 6.68473671e+05],\n", - " [2.62817027e+05, 8.96729957e+05],\n", - " [2.74990268e+05, 6.17678724e+05],\n", - " [2.52897724e+05, 8.65475700e+05],\n", - " [2.09867373e+05, 9.50457602e+05],\n", - " [1.61791280e+05, 1.05135240e+06],\n", - " [1.76888541e+05, 9.98681754e+05],\n", - " [1.58703643e+05, 1.05201866e+06],\n", - " [2.35953746e+05, 5.81511546e+05],\n", - " [1.39508382e+05, 1.10461141e+06],\n", - " [1.27265676e+05, 9.00559518e+05],\n", - " [1.46297085e+05, 8.02469639e+05],\n", - " [1.53697592e+05, 1.12469407e+06],\n", - " [1.65201257e+05, 6.52874344e+05],\n", - " [1.60048497e+05, 6.98299422e+05],\n", - " [9.45967979e+04, 7.94188534e+05],\n", - " [1.17291509e+05, 1.17012509e+06],\n", - " [8.82053548e+04, 1.02770182e+06],\n", - " [7.96994745e+04, 8.87920192e+05],\n", - " [1.22990003e+05, 8.23010899e+05],\n", - " [9.02983786e+04, 8.56602566e+05],\n", - " [1.12583275e+05, 8.23690011e+05],\n", - " [1.15479244e+05, 9.24618482e+05],\n", - " [7.75326545e+04, 9.04591116e+05],\n", - " [7.80821749e+04, 7.15856130e+05],\n", - " [9.96657551e+04, 6.72890200e+05],\n", - " [8.79682412e+04, 1.00514064e+06],\n", - " [5.67535777e+04, 9.26563100e+05],\n", - " [5.08677148e+04, 7.10220532e+05],\n", - " [4.24456569e+04, 7.06325639e+05],\n", - " [4.65548460e+04, 9.74134427e+05],\n", - " [5.29184248e+04, 6.72152061e+05],\n", - " [6.15539817e+04, 1.15468993e+06],\n", - " [4.13557069e+04, 1.11449170e+06],\n", - " [4.63747352e+04, 8.70190374e+05],\n", - " [3.72443444e+04, 1.19166998e+06],\n", - " [4.12822885e+04, 1.04608545e+06],\n", - " [5.53179116e+04, 1.12807999e+06],\n", - " [3.19076952e+04, 1.00020804e+06],\n", - " [3.40102420e+04, 9.30221189e+05],\n", - " [3.09282140e+04, 1.01829940e+06],\n", - " [3.95233957e+04, 1.09672857e+06],\n", - " [4.31016012e+04, 9.23362846e+05],\n", - " [2.44532763e+04, 8.10610309e+05],\n", - " [2.42905662e+04, 1.16837923e+06],\n", - " [3.08495243e+04, 6.72357927e+05],\n", - " [2.29309129e+04, 6.83181207e+05],\n", - " [1.93124101e+04, 1.18157506e+06],\n", - " [2.48005224e+04, 6.94595493e+05],\n", - " [3.02329559e+04, 1.14461008e+06],\n", - " [2.04398683e+04, 9.16831496e+05],\n", - " [2.60028015e+04, 6.89740714e+05],\n", - " [2.04497354e+04, 1.27760714e+06],\n", - " [2.32445428e+04, 9.58179175e+05],\n", - " [1.64473455e+04, 1.22583633e+06],\n", - " [2.00514453e+04, 6.69149880e+05],\n", - " [1.66644545e+04, 9.25503667e+05],\n", - " [1.66814938e+04, 7.43239584e+05],\n", - " [1.86832999e+04, 1.09203041e+06],\n", - " [1.79963211e+04, 8.04265819e+05],\n", - " [1.74121296e+04, 7.03980774e+05],\n", - " [1.26988684e+04, 1.12187081e+06],\n", - " [1.58140231e+04, 1.02757091e+06],\n", - " [1.27340719e+04, 8.58592858e+05],\n", - " [1.35826575e+04, 7.64916022e+05],\n", - " [1.01263816e+04, 7.50180716e+05],\n", - " [7.19342074e+03, 1.27142317e+06],\n", - " [1.02493864e+04, 1.13344203e+06],\n", - " [1.03978921e+04, 1.07706574e+06],\n", - " [1.02914248e+04, 1.12721159e+06],\n", - " [6.60980734e+03, 6.72248410e+05],\n", - " [6.59849528e+03, 8.88855805e+05],\n", - " [7.68970477e+03, 7.39423756e+05],\n", - " [8.84584242e+03, 1.00677590e+06],\n", - " [8.25728105e+03, 1.19211086e+06],\n", - " [5.88190675e+03, 1.11514993e+06],\n", - " [5.42093057e+03, 7.16639885e+05],\n", - " [6.82473026e+03, 1.12453486e+06],\n", - " [3.68320721e+03, 1.09898609e+06],\n", - " [6.80452270e+03, 1.09652679e+06],\n", - " [5.97168604e+03, 1.09425515e+06],\n", - " [5.27277158e+03, 9.22447441e+05],\n", - " [4.32747516e+03, 6.86566727e+05],\n", - " [3.38326107e+03, 1.03547520e+06],\n", - " [3.06991919e+03, 1.16619965e+06],\n", - " [4.12887018e+03, 1.03663789e+06],\n", - " [4.27672242e+03, 1.26537482e+06],\n", - " [3.18806484e+03, 1.16135256e+06],\n", - " [2.80011832e+03, 9.75156955e+05],\n", - " [3.62041856e+03, 7.89736072e+05],\n", - " [3.84227414e+03, 1.18864231e+06],\n", - " [3.06755125e+03, 8.94816531e+05],\n", - " [2.13467277e+03, 1.16730640e+06],\n", - " [2.27626397e+03, 1.24591570e+06],\n", - " [2.34839501e+03, 1.12030879e+06],\n", - " [2.24900213e+03, 7.32039326e+05],\n", - " [1.85112410e+03, 1.25393067e+06],\n", - " [2.65171542e+03, 7.40465218e+05],\n", - " [2.44163654e+03, 1.07273915e+06],\n", - " [2.41789135e+03, 1.06650080e+06],\n", - " [2.12092455e+03, 1.07255283e+06],\n", - " [2.01724608e+03, 1.18412737e+06],\n", - " [1.42484567e+03, 9.98442128e+05],\n", - " [2.00171844e+03, 1.16762736e+06],\n", - " [1.18906475e+03, 7.63242127e+05],\n", - " [9.64151573e+02, 1.06275748e+06],\n", - " [9.47691461e+02, 9.52712785e+05],\n", - " [1.08737495e+03, 1.32656020e+06],\n", - " [1.58211972e+03, 1.28554538e+06],\n", - " [1.02462654e+03, 1.21645444e+06],\n", - " [1.09696954e+03, 8.37588347e+05],\n", - " [1.18485005e+03, 1.32868306e+06],\n", - " [9.60649471e+02, 9.58801891e+05],\n", - " [8.35750134e+02, 6.70070548e+05],\n", - " [8.46933749e+02, 9.09028524e+05],\n", - " [8.75541052e+02, 6.93582525e+05],\n", - " [9.98457029e+02, 1.30087794e+06],\n", - " [8.38077124e+02, 8.59040056e+05],\n", - " [8.49095933e+02, 7.48748175e+05],\n", - " [4.75278209e+02, 7.29532863e+05],\n", - " [4.75221920e+02, 1.13497828e+06],\n", - " [5.94953735e+02, 1.17697697e+06],\n", - " [6.08685663e+02, 1.31934387e+06],\n", - " [5.71588897e+02, 1.08781125e+06],\n", - " [5.37656203e+02, 8.83840889e+05],\n", - " [6.53359338e+02, 1.12664376e+06],\n", - " [3.79753204e+02, 7.16919053e+05],\n", - " [4.79460534e+02, 7.67956524e+05],\n", - " [3.76455799e+02, 7.79635821e+05],\n", - " [3.98678387e+02, 1.17812870e+06],\n", - " [4.92440834e+02, 6.79938898e+05],\n", - " [3.17390876e+02, 1.28811921e+06],\n", - " [2.84136696e+02, 1.08425822e+06],\n", - " [2.53473783e+02, 6.69868499e+05],\n", - " [2.99264007e+02, 1.14357648e+06],\n", - " [3.88123342e+02, 8.48988552e+05],\n", - " [2.56298225e+02, 9.68709296e+05],\n", - " [2.26865279e+02, 8.27831780e+05],\n", - " [2.29488974e+02, 7.32466208e+05],\n", - " [3.17120474e+02, 1.18985963e+06],\n", - " [2.04389883e+02, 8.75497720e+05],\n", - " [2.69441520e+02, 1.01870765e+06],\n", - " [2.57974385e+02, 1.31524429e+06],\n", - " [1.91007675e+02, 1.12375985e+06],\n", - " [1.94527978e+02, 1.04333394e+06],\n", - " [2.07292919e+02, 1.25272904e+06],\n", - " [2.09816912e+02, 6.66651918e+05],\n", - " [2.16626923e+02, 7.76940647e+05],\n", - " [1.82179370e+02, 1.20455849e+06],\n", - " [1.67419689e+02, 9.25148524e+05],\n", - " [1.66593221e+02, 8.50966382e+05],\n", - " [1.25715209e+02, 1.24704406e+06],\n", - " [1.06823665e+02, 6.88489017e+05],\n", - " [1.19694951e+02, 1.06771516e+06],\n", - " [9.06989100e+01, 7.74962746e+05],\n", - " [9.52722524e+01, 9.00826911e+05],\n", - " [1.33280543e+02, 9.97025552e+05],\n", - " [1.22050775e+02, 8.25449524e+05],\n", - " [1.13438619e+02, 1.32748280e+06],\n", - " [7.95888118e+01, 9.96202694e+05],\n", - " [7.46208572e+01, 7.08911899e+05],\n", - " [1.07049236e+02, 8.62428915e+05]])" + "array([[4.13048703e+00, 1.54045618e-01],\n", + " [9.39724796e+00, 4.63032787e-01],\n", + " [2.26338241e+01, 1.79920071e+00],\n", + " [4.79865867e+01, 2.75795293e+00],\n", + " [1.65196042e+02, 9.60054641e+00],\n", + " [4.09779333e+02, 1.85994178e+01],\n", + " [5.28999484e+02, 4.79801484e+01],\n", + " [1.44654291e+03, 9.06680768e+01],\n", + " [4.99428771e+03, 3.11892868e+02],\n", + " [1.01035804e+04, 5.48460859e+02],\n", + " [2.61947362e+04, 1.40265491e+03],\n", + " [3.83891964e+04, 2.23685907e+03],\n", + " [1.44615604e+05, 4.71073992e+03],\n", + " [2.04841144e+05, 1.28298259e+04],\n", + " [3.04860240e+05, 2.65146845e+04],\n", + " [7.15472624e+05, 6.60639061e+04],\n", + " [5.70803649e+05, 7.57376290e+04],\n", + " [9.47231329e+05, 1.54986248e+05],\n", + " [9.23953166e+05, 1.93822492e+05],\n", + " [6.57801248e+05, 1.50769939e+05],\n", + " [8.43171264e+05, 2.49113150e+05],\n", + " [5.59341253e+05, 1.85957381e+05],\n", + " [6.96237265e+05, 4.03687883e+05],\n", + " [5.40067509e+05, 2.66418801e+05],\n", + " [4.57478544e+05, 3.88221974e+05],\n", + " [4.25920143e+05, 3.91122618e+05],\n", + " [3.96908285e+05, 3.71414788e+05],\n", + " [6.02102705e+05, 4.23352098e+05],\n", + " [6.41769739e+05, 5.18903098e+05],\n", + " [4.16901641e+05, 4.04368759e+05],\n", + " [3.30039331e+05, 3.78696731e+05],\n", + " [5.51529415e+05, 6.43412007e+05],\n", + " [5.49787782e+05, 5.35688557e+05],\n", + " [2.80979529e+05, 7.42016812e+05],\n", + " [4.66284359e+05, 6.14750052e+05],\n", + " [3.12148206e+05, 5.29680965e+05],\n", + " [3.50953671e+05, 8.72215875e+05],\n", + " [4.01568191e+05, 8.08517365e+05],\n", + " [2.95505559e+05, 6.81129851e+05],\n", + " [3.16315375e+05, 6.59415810e+05],\n", + " [1.95777449e+05, 6.79437421e+05],\n", + " [1.94280033e+05, 7.21315446e+05],\n", + " [1.78501110e+05, 6.75465168e+05],\n", + " [2.47404532e+05, 9.85931509e+05],\n", + " [2.99943485e+05, 7.64644995e+05],\n", + " [1.48078919e+05, 8.98769907e+05],\n", + " [2.03910050e+05, 7.10664811e+05],\n", + " [1.98269087e+05, 5.50194199e+05],\n", + " [2.41973630e+05, 8.36300844e+05],\n", + " [1.94887109e+05, 9.06544564e+05],\n", + " [1.46665030e+05, 9.13739364e+05],\n", + " [1.43779842e+05, 8.80070344e+05],\n", + " [1.04096536e+05, 7.21086105e+05],\n", + " [1.87776956e+05, 8.93932501e+05],\n", + " [9.41454910e+04, 8.32234831e+05],\n", + " [1.47360515e+05, 9.75970111e+05],\n", + " [1.07959767e+05, 9.19504617e+05],\n", + " [1.31352538e+05, 8.43986082e+05],\n", + " [1.38134142e+05, 9.44445525e+05],\n", + " [1.43810730e+05, 8.74698002e+05],\n", + " [1.02488333e+05, 8.25331196e+05],\n", + " [9.36752361e+04, 1.06579735e+06],\n", + " [9.28858373e+04, 1.15535109e+06],\n", + " [6.63758943e+04, 9.88499224e+05],\n", + " [1.06010101e+05, 8.10618603e+05],\n", + " [1.04769047e+05, 6.39799600e+05],\n", + " [6.43799763e+04, 1.00443399e+06],\n", + " [8.83107785e+04, 7.51578437e+05],\n", + " [8.32902438e+04, 1.14248035e+06],\n", + " [8.23704800e+04, 7.70222834e+05],\n", + " [6.36377665e+04, 8.10851809e+05],\n", + " [6.67889123e+04, 6.98840815e+05],\n", + " [7.51023290e+04, 1.03500279e+06],\n", + " [6.26382732e+04, 6.83328316e+05],\n", + " [4.18704321e+04, 7.29742044e+05],\n", + " [6.09073205e+04, 1.17917865e+06],\n", + " [3.41835753e+04, 9.20899230e+05],\n", + " [5.16557040e+04, 8.42315342e+05],\n", + " [3.53315137e+04, 8.86502740e+05],\n", + " [4.78839456e+04, 6.93420051e+05],\n", + " [3.35578712e+04, 1.15007416e+06],\n", + " [3.04994928e+04, 8.32594383e+05],\n", + " [4.27334325e+04, 7.91261007e+05],\n", + " [4.20789053e+04, 1.19249901e+06],\n", + " [3.95371249e+04, 8.20574024e+05],\n", + " [2.57666812e+04, 7.49084192e+05],\n", + " [3.74313007e+04, 1.14683974e+06],\n", + " [1.97293773e+04, 6.88071653e+05],\n", + " [1.71243567e+04, 1.29096233e+06],\n", + " [1.96154357e+04, 9.39060095e+05],\n", + " [2.47941056e+04, 1.11267717e+06],\n", + " [2.19008895e+04, 8.58416469e+05],\n", + " [1.93730659e+04, 1.15087675e+06],\n", + " [2.41184982e+04, 8.52800084e+05],\n", + " [2.12075306e+04, 7.72057664e+05],\n", + " [2.22673055e+04, 7.14074890e+05],\n", + " [1.24970257e+04, 7.12008791e+05],\n", + " [1.50653450e+04, 8.43052938e+05],\n", + " [2.01996861e+04, 8.82232568e+05],\n", + " [1.23914648e+04, 7.18155510e+05],\n", + " [9.93713520e+03, 1.22778864e+06],\n", + " [1.54926063e+04, 1.13305907e+06],\n", + " [1.46517627e+04, 8.82614181e+05],\n", + " [1.51895234e+04, 1.07507367e+06],\n", + " [1.37184550e+04, 8.54583269e+05],\n", + " [1.32425652e+04, 8.52689748e+05],\n", + " [1.22831633e+04, 1.05438468e+06],\n", + " [1.07154617e+04, 9.87530754e+05],\n", + " [9.79983700e+03, 1.18866243e+06],\n", + " [6.81730901e+03, 8.47516493e+05],\n", + " [9.15651565e+03, 1.02983470e+06],\n", + " [5.64752625e+03, 7.00227501e+05],\n", + " [6.85158508e+03, 9.95376740e+05],\n", + " [8.53777034e+03, 9.91275075e+05],\n", + " [5.58841086e+03, 1.09653142e+06],\n", + " [7.83287441e+03, 6.81290232e+05],\n", + " [5.38570917e+03, 1.28890423e+06],\n", + " [5.60720078e+03, 6.79212987e+05],\n", + " [7.13198062e+03, 1.23332725e+06],\n", + " [6.14306233e+03, 1.29458063e+06],\n", + " [4.11652692e+03, 9.02602625e+05],\n", + " [5.55549183e+03, 7.88062650e+05],\n", + " [5.94590131e+03, 1.23692169e+06],\n", + " [4.30783767e+03, 1.21130813e+06],\n", + " [3.05726711e+03, 1.14476697e+06],\n", + " [3.41295207e+03, 9.54158128e+05],\n", + " [4.85711821e+03, 1.28795897e+06],\n", + " [2.80279142e+03, 8.57680691e+05],\n", + " [3.38791460e+03, 8.63233644e+05],\n", + " [3.69167961e+03, 1.03127702e+06],\n", + " [3.88993254e+03, 1.17845340e+06],\n", + " [3.17562723e+03, 8.97242264e+05],\n", + " [3.32180160e+03, 1.11150609e+06],\n", + " [2.48474397e+03, 1.25739583e+06],\n", + " [2.60417556e+03, 7.18592169e+05],\n", + " [2.95376202e+03, 1.29956821e+06],\n", + " [2.67499903e+03, 1.02182178e+06],\n", + " [1.93684024e+03, 7.09331309e+05],\n", + " [2.43032785e+03, 1.01886507e+06],\n", + " [1.86043618e+03, 1.21670386e+06],\n", + " [1.72323155e+03, 8.56007932e+05],\n", + " [1.95362634e+03, 1.31281086e+06],\n", + " [1.85854073e+03, 6.77777078e+05],\n", + " [1.12184168e+03, 1.05318530e+06],\n", + " [1.42917993e+03, 9.42788835e+05],\n", + " [1.30552104e+03, 8.57145128e+05],\n", + " [1.55865489e+03, 1.09684931e+06],\n", + " [1.16529772e+03, 9.75845741e+05],\n", + " [1.28117604e+03, 9.95327460e+05],\n", + " [9.03127133e+02, 9.36759864e+05],\n", + " [8.30025571e+02, 1.26405888e+06],\n", + " [1.44717583e+03, 8.26241716e+05],\n", + " [7.82908962e+02, 9.49718646e+05],\n", + " [1.30953881e+03, 8.05544645e+05],\n", + " [1.02008145e+03, 1.18601097e+06],\n", + " [7.67225606e+02, 7.30153946e+05],\n", + " [9.40543417e+02, 7.31312893e+05],\n", + " [1.06843120e+03, 1.14831000e+06],\n", + " [7.59482468e+02, 9.27258372e+05],\n", + " [7.32451666e+02, 1.32993513e+06],\n", + " [7.06399734e+02, 1.18456086e+06],\n", + " [7.67043499e+02, 7.98379241e+05],\n", + " [5.30292644e+02, 1.32030148e+06],\n", + " [5.27270391e+02, 1.11303165e+06],\n", + " [4.30556895e+02, 7.37433928e+05],\n", + " [6.92192735e+02, 6.73595928e+05],\n", + " [3.84239599e+02, 8.98704896e+05],\n", + " [4.05602919e+02, 7.68494127e+05],\n", + " [5.32379794e+02, 8.40066501e+05],\n", + " [5.54318875e+02, 1.16164974e+06],\n", + " [4.63878241e+02, 1.07374135e+06],\n", + " [3.08029258e+02, 6.73847356e+05],\n", + " [4.62024710e+02, 1.24764828e+06],\n", + " [4.03358695e+02, 1.16097583e+06],\n", + " [2.67202064e+02, 1.25038378e+06],\n", + " [3.63863050e+02, 7.18443773e+05],\n", + " [2.79615932e+02, 1.28780121e+06],\n", + " [3.60109790e+02, 8.39169235e+05],\n", + " [2.49320339e+02, 9.75423630e+05],\n", + " [3.48833566e+02, 1.32280122e+06],\n", + " [3.28403876e+02, 1.22196622e+06],\n", + " [2.21121004e+02, 1.32480298e+06],\n", + " [1.65069144e+02, 9.51352605e+05],\n", + " [2.61431490e+02, 1.09906347e+06],\n", + " [2.47834507e+02, 8.40256177e+05],\n", + " [2.32494283e+02, 1.04313372e+06],\n", + " [1.34238266e+02, 8.95668938e+05],\n", + " [1.53206781e+02, 9.70433336e+05],\n", + " [1.63387233e+02, 8.71489570e+05],\n", + " [2.16672546e+02, 1.22080878e+06],\n", + " [1.44421258e+02, 1.22576208e+06],\n", + " [1.92426070e+02, 7.40647282e+05],\n", + " [9.61128200e+01, 9.04821540e+05],\n", + " [1.66416779e+02, 9.75432108e+05],\n", + " [1.18125629e+02, 1.22564992e+06],\n", + " [1.35815896e+02, 1.26021637e+06],\n", + " [1.16890245e+02, 1.19561705e+06],\n", + " [9.77113189e+01, 8.33097662e+05],\n", + " [8.68018133e+01, 1.09653539e+06],\n", + " [9.42206676e+01, 8.50974231e+05],\n", + " [9.35370396e+01, 1.28633958e+06],\n", + " [1.17266143e+02, 1.09093515e+06],\n", + " [6.53374982e+01, 7.00052732e+05]])" ] }, "execution_count": 10, @@ -656,7 +656,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Fitting Normal loss" + "## Fitting Square l loss" ] }, { @@ -691,7 +691,7 @@ "theta = [3, 0.15,1e6]\n", "boxBounds = [(2,5),(0.0,1.0),(1e6,1e6)]\n", "\n", - "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + "objSIR = SquareLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" ] }, { @@ -702,7 +702,7 @@ { "data": { "text/plain": [ - "NormalLoss([3.0, 0.15, 1000000.0], SimulateOde([ODEVariable('S', 'S', None, True), ODEVariable('I', 'I', None, True), ODEVariable('R', 'R', None, True)], [ODEVariable('beta', 'beta', None, True), ODEVariable('gamma', 'gamma', None, True), ODEVariable('N', 'N', None, True)], [], [Transition('S', 'beta*S*I/N', 'T', 'I', None, None), Transition('I', 'gamma*I', 'T', 'R', None, None)], [], []).setParameters({'beta': 3.6, 'gamma': 0.2, 'N': 1000000.0}), [999998.0, 2.0, 0.0], 0.0, [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 25.25, 25.5, 25.75, 26.0, 26.25, 26.5, 26.75, 27.0, 27.25, 27.5, 27.75, 28.0, 28.25, 28.5, 28.75, 29.0, 29.25, 29.5, 29.75, 30.0, 30.25, 30.5, 30.75, 31.0, 31.25, 31.5, 31.75, 32.0, 32.25, 32.5, 32.75, 33.0, 33.25, 33.5, 33.75, 34.0, 34.25, 34.5, 34.75, 35.0, 35.25, 35.5, 35.75, 36.0, 36.25, 36.5, 36.75, 37.0, 37.25, 37.5, 37.75, 38.0, 38.25, 38.5, 38.75, 39.0, 39.25, 39.5, 39.75, 40.0, 40.25, 40.5, 40.75, 41.0, 41.25, 41.5, 41.75, 42.0, 42.25, 42.5, 42.75, 43.0, 43.25, 43.5, 43.75, 44.0, 44.25, 44.5, 44.75, 45.0, 45.25, 45.5, 45.75, 46.0, 46.25, 46.5, 46.75, 47.0, 47.25, 47.5, 47.75, 48.0, 48.25, 48.5, 48.75, 49.0, 49.25, 49.5, 49.75, 50.0, 50.25, 50.5, 50.75], [[5.5489971387876365, 0.13976157088347727], [9.415096478582125, 0.6953800925736477], [25.941588724404888, 1.7360216096973626], [40.629454348405005, 3.6320719863452124], [108.33986724048995, 9.898076194201028], [265.94200822963205, 19.72199081288608], [814.0101919108965, 34.39273873132337], [1610.3645021087707, 84.46157450404837], [4033.7294190704292, 287.6005446141324], [8244.051192760833, 695.5700455200907], [29441.296547302398, 1278.206554206765], [36326.23747211643, 3083.1448823639666], [134300.6643766737, 7316.380551470222], [251120.96130046487, 12228.281008380864], [512397.4021229717, 21543.277252460124], [585616.8734093554, 38484.76952026679], [790205.921992304, 83692.67093281484], [974797.1285860298, 137447.11265771437], [707757.0823571573, 117346.97836716496], [603556.1371978847, 189433.07773085634], [913909.6207876124, 199048.48425080228], [548929.798690948, 279399.6024361307], [462040.51907899725, 383327.3895777905], [761326.3551628065, 258855.59336332348], [662287.4219836415, 340426.42697219475], [508464.53921417124, 391021.45531562675], [656745.3025785786, 578473.9477197772], [554162.9505283561, 426765.22955069266], [532220.7074438117, 508730.0308778309], [445615.9890674269, 476315.5274757456], [590230.8684803826, 648108.582432509], [544910.361061262, 672870.3344572515], [310827.4253700613, 587435.0165097215], [456115.65962565545, 710530.4983865325], [364253.7844819528, 579474.3308432746], [311474.8016733622, 821438.8027931447], [252718.85987592736, 478270.7054820163], [307809.39052484394, 683324.6855005894], [281269.7866456109, 834432.1640758143], [261336.99881665388, 750610.2799376069], [352273.3896491518, 689933.9153611241], [337278.8801262164, 668473.671079696], [262817.02738757816, 896729.9572193093], [274990.26820054883, 617678.724452312], [252897.72396917018, 865475.7000908976], [209867.3728636754, 950457.6023080612], [161791.28013060236, 1051352.395139691], [176888.54085288633, 998681.753684348], [158703.64323235105, 1052018.6625758626], [235953.74632457114, 581511.5462198751], [139508.3819811454, 1104611.4054220302], [127265.67567357987, 900559.5183912851], [146297.08454396683, 802469.639043949], [153697.59202897752, 1124694.0709555596], [165201.2568608659, 652874.3435597733], [160048.49667175754, 698299.422082141], [94596.797920066, 794188.5335791365], [117291.50891981134, 1170125.0942029145], [88205.35480368958, 1027701.8237791387], [79699.47446828452, 887920.1922399637], [122990.00315676956, 823010.8990972892], [90298.37858239123, 856602.5660494367], [112583.27458976842, 823690.0110776974], [115479.24360879252, 924618.4818930109], [77532.65451860701, 904591.1155288297], [78082.17487409341, 715856.1296537648], [99665.75506373866, 672890.1996274921], [87968.24120244425, 1005140.6416744539], [56753.577717708846, 926563.1004164796], [50867.71484676358, 710220.5323161592], [42445.65692219467, 706325.639191282], [46554.845983121624, 974134.4267906626], [52918.424828372394, 672152.061469812], [61553.98169533466, 1154689.9304881357], [41355.7068612865, 1114491.7048004952], [46374.73519731653, 870190.3739141857], [37244.34436743515, 1191669.9818033653], [41282.28851948546, 1046085.4493043608], [55317.91156340166, 1128079.994274354], [31907.69520572426, 1000208.0395347421], [34010.24198302409, 930221.1892817259], [30928.214034681547, 1018299.4007833744], [39523.39574481744, 1096728.5680754953], [43101.60123589903, 923362.8464453346], [24453.276252403833, 810610.3090453236], [24290.566238056355, 1168379.2311720226], [30849.52429767078, 672357.9273898688], [22930.91291882195, 683181.2065549527], [19312.410078810557, 1181575.0638825279], [24800.522354204797, 694595.4933711233], [30232.955889418034, 1144610.0789169455], [20439.868327523087, 916831.495611514], [26002.801545608865, 689740.713613447], [20449.735359676568, 1277607.1379225366], [23244.54282457448, 958179.1751528395], [16447.345530964347, 1225836.3266972792], [20051.445282210465, 669149.8800772146], [16664.454488900752, 925503.6673304131], [16681.49384056153, 743239.5841723487], [18683.299901770028, 1092030.4094499706], [17996.321050203427, 804265.8193114839], [17412.129570447687, 703980.773650898], [12698.868359882912, 1121870.8122240496], [15814.023105568453, 1027570.9081003398], [12734.071882360873, 858592.8580763217], [13582.657478279318, 764916.0217322799], [10126.381580399675, 750180.7159839582], [7193.420744583109, 1271423.1734558782], [10249.386414900197, 1133442.0264943778], [10397.892095036967, 1077065.7446887211], [10291.424793271395, 1127211.5938218776], [6609.807342544796, 672248.4104117213], [6598.495277349121, 888855.8050265535], [7689.704772788273, 739423.7561920357], [8845.842419921624, 1006775.9005513749], [8257.28104877651, 1192110.8618185048], [5881.906750996887, 1115149.93372143], [5420.930573114638, 716639.884819933], [6824.730262831377, 1124534.8621694546], [3683.207213311698, 1098986.08982435], [6804.52269756303, 1096526.7921533366], [5971.686041066522, 1094255.1464621811], [5272.7715814587045, 922447.4408174288], [4327.475161388193, 686566.7266654972], [3383.2610693392044, 1035475.2013402083], [3069.919189380042, 1166199.6484807285], [4128.870181022159, 1036637.8860012486], [4276.722417774954, 1265374.8212365832], [3188.0648383580597, 1161352.5607335398], [2800.118318839102, 975156.9553313118], [3620.4185579812274, 789736.0719286054], [3842.2741401842172, 1188642.3134196696], [3067.551247602438, 894816.5312599519], [2134.67276566011, 1167306.4045076708], [2276.263966733917, 1245915.7013382448], [2348.395010917235, 1120308.7855315015], [2249.0021255896513, 732039.3261821142], [1851.1240962192128, 1253930.6660519678], [2651.715415269909, 740465.2182037155], [2441.6365408681636, 1072739.1471042798], [2417.891347145136, 1066500.7995323706], [2120.9245483558825, 1072552.8316071504], [2017.2460815827417, 1184127.366115931], [1424.845670574932, 998442.1280909418], [2001.7184429807262, 1167627.3635968873], [1189.0647524983192, 763242.127352661], [964.1515731483933, 1062757.4849910974], [947.6914614570239, 952712.7846825029], [1087.3749471536023, 1326560.2010915559], [1582.1197247476741, 1285545.3759947247], [1024.6265416882222, 1216454.4422335515], [1096.9695443363794, 837588.3467235877], [1184.8500540757373, 1328683.061242117], [960.6494707281487, 958801.8911654096], [835.7501337173844, 670070.5483600695], [846.9337487099981, 909028.5240620613], [875.541052335431, 693582.5251296596], [998.4570286925696, 1300877.9383268403], [838.0771236697374, 859040.0555225008], [849.0959325990879, 748748.1751257956], [475.2782089274715, 729532.8627678553], [475.2219202114857, 1134978.277195852], [594.9537349672182, 1176976.9695724065], [608.6856630484652, 1319343.8667681955], [571.5888971056904, 1087811.2469301717], [537.6562029971528, 883840.8893521308], [653.3593380671064, 1126643.762739988], [379.7532039608197, 716919.052976874], [479.46053353989157, 767956.5237406924], [376.4557987859823, 779635.8208878567], [398.67838714418235, 1178128.6982785354], [492.4408336280881, 679938.8977216084], [317.3908756903431, 1288119.208934416], [284.13669569600165, 1084258.2171145338], [253.47378339180153, 669868.4988409674], [299.26400701038574, 1143576.4805791376], [388.12334228010513, 848988.5515813607], [256.2982253008446, 968709.2961185345], [226.86527870402017, 827831.7795352405], [229.48897424342212, 732466.208474486], [317.12047386383495, 1189859.6336752367], [204.38988338787306, 875497.7197789245], [269.4415199990759, 1018707.6504033973], [257.97438516355055, 1315244.2862689584], [191.00767526447387, 1123759.8491195813], [194.52797753681182, 1043333.9442222763], [207.29291902341845, 1252729.0376916449], [209.81691238951242, 666651.9180659578], [216.6269232166793, 776940.6467737745], [182.17936999016678, 1204558.48883258], [167.41968911549503, 925148.5235907574], [166.59322132383082, 850966.3818700697], [125.71520857960297, 1247044.057304752], [106.82366473307945, 688489.016953341], [119.69495136675988, 1067715.157561069], [90.69890996414178, 774962.7461366334], [95.27225242575679, 900826.9111966246], [133.28054285317748, 997025.5515197581], [122.05077509682275, 825449.5240761695], [113.43861907585058, 1327482.8035176208], [79.58881177281683, 996202.6939394812], [74.62085718615808, 708911.8992225014], [107.04923637866446, 862428.9150962183]], ['I', 'R'], [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])" + "SquareLoss([3.0, 0.15, 1000000.0], SimulateOde([ODEVariable('S', 'S', None, True), ODEVariable('I', 'I', None, True), ODEVariable('R', 'R', None, True)], [ODEVariable('beta', 'beta', None, True), ODEVariable('gamma', 'gamma', None, True), ODEVariable('N', 'N', None, True)], [], [Transition('S', 'beta*S*I/N', 'T', 'I', None, None), Transition('I', 'gamma*I', 'T', 'R', None, None)], [], []).setParameters({'beta': 3.6, 'gamma': 0.2, 'N': 1000000.0}), [999998.0, 2.0, 0.0], 0.0, [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 25.25, 25.5, 25.75, 26.0, 26.25, 26.5, 26.75, 27.0, 27.25, 27.5, 27.75, 28.0, 28.25, 28.5, 28.75, 29.0, 29.25, 29.5, 29.75, 30.0, 30.25, 30.5, 30.75, 31.0, 31.25, 31.5, 31.75, 32.0, 32.25, 32.5, 32.75, 33.0, 33.25, 33.5, 33.75, 34.0, 34.25, 34.5, 34.75, 35.0, 35.25, 35.5, 35.75, 36.0, 36.25, 36.5, 36.75, 37.0, 37.25, 37.5, 37.75, 38.0, 38.25, 38.5, 38.75, 39.0, 39.25, 39.5, 39.75, 40.0, 40.25, 40.5, 40.75, 41.0, 41.25, 41.5, 41.75, 42.0, 42.25, 42.5, 42.75, 43.0, 43.25, 43.5, 43.75, 44.0, 44.25, 44.5, 44.75, 45.0, 45.25, 45.5, 45.75, 46.0, 46.25, 46.5, 46.75, 47.0, 47.25, 47.5, 47.75, 48.0, 48.25, 48.5, 48.75, 49.0, 49.25, 49.5, 49.75, 50.0, 50.25, 50.5, 50.75], [[4.130487025131687, 0.15404561775936773], [9.397247964980085, 0.46303278732171177], [22.633824079261842, 1.7992007113807156], [47.986586672487206, 2.7579529325485836], [165.196041952231, 9.600546411428384], [409.7793329814416, 18.59941777036534], [528.9994837079726, 47.98014835106094], [1446.5429145036974, 90.66807675329977], [4994.287706241389, 311.89286846212264], [10103.580369113544, 548.4608589124192], [26194.736213578377, 1402.654912118046], [38389.19639311862, 2236.8590689690504], [144615.6038613682, 4710.739919896741], [204841.14352293048, 12829.825865082867], [304860.2404249535, 26514.684493267272], [715472.6235634295, 66063.90607297285], [570803.6488074489, 75737.62898047472], [947231.3292945497, 154986.247976831], [923953.16649091, 193822.49178823238], [657801.2480252209, 150769.93914359063], [843171.2637992136, 249113.1495604983], [559341.2527328188, 185957.3813357946], [696237.264525381, 403687.88293160085], [540067.5094137926, 266418.8007305509], [457478.5443022633, 388221.974041893], [425920.1427231567, 391122.61823234084], [396908.2854576274, 371414.7879418473], [602102.7053746057, 423352.09770557744], [641769.7394061629, 518903.09780880454], [416901.64080071973, 404368.7588933208], [330039.3314030553, 378696.7305775569], [551529.4145009269, 643412.0070484518], [549787.7820911882, 535688.556709061], [280979.5285986585, 742016.811538869], [466284.35882357555, 614750.051516308], [312148.2058862273, 529680.9650844566], [350953.6705610238, 872215.874672448], [401568.19082765863, 808517.3646270183], [295505.55911352474, 681129.850659894], [316315.37513281166, 659415.8097179801], [195777.4490952229, 679437.4206703037], [194280.03265693723, 721315.4457581254], [178501.10961662387, 675465.1683738899], [247404.53170668957, 985931.5093514766], [299943.4851962682, 764644.9954514606], [148078.91870689174, 898769.9073671738], [203910.04957668108, 710664.8108294513], [198269.08657707038, 550194.198541208], [241973.63044169324, 836300.8441740677], [194887.10906344195, 906544.5642488404], [146665.03014024382, 913739.3641712739], [143779.84227086403, 880070.3435878769], [104096.5358741194, 721086.1047601945], [187776.95624604076, 893932.5009312815], [94145.49095393051, 832234.8307984242], [147360.51529741898, 975970.1109512364], [107959.76674711499, 919504.6172384012], [131352.53801677615, 843986.0818510734], [138134.14244997536, 944445.5248128581], [143810.73000588483, 874698.002250221], [102488.3325125742, 825331.1957907011], [93675.23614669341, 1065797.3512993983], [92885.83732391837, 1155351.0857456843], [66375.89434895372, 988499.2242781295], [106010.1011427728, 810618.6033656059], [104769.0474474182, 639799.6000771984], [64379.976276675065, 1004433.9910370467], [88310.77848764382, 751578.4374513394], [83290.24377534064, 1142480.3506778087], [82370.47996389655, 770222.8341590352], [63637.766473583026, 810851.8091807761], [66788.91229470367, 698840.8146168891], [75102.3290490617, 1035002.7902780143], [62638.27317992859, 683328.3156147334], [41870.43206330126, 729742.0444708264], [60907.32053788277, 1179178.6549844078], [34183.575255148746, 920899.2296020638], [51655.704042085505, 842315.3424291152], [35331.51366160177, 886502.7398532623], [47883.945613707736, 693420.0510623266], [33557.87124412175, 1150074.1571437381], [30499.492761509304, 832594.3834703927], [42733.43248401154, 791261.006569009], [42078.9053350363, 1192499.0062521168], [39537.12490267918, 820574.0244793433], [25766.68117003718, 749084.1915958913], [37431.3006839491, 1146839.7385431828], [19729.377253022878, 688071.6526254383], [17124.35674302549, 1290962.3295776465], [19615.43572022034, 939060.0950318159], [24794.10562003187, 1112677.165293667], [21900.889529328662, 858416.4692184512], [19373.06594088114, 1150876.7459370985], [24118.498247359745, 852800.0837341312], [21207.530605877277, 772057.6638792764], [22267.30551041926, 714074.8898722631], [12497.025723179937, 712008.7912734993], [15065.344990296639, 843052.9384454926], [20199.686086950154, 882232.5677295076], [12391.464759044167, 718155.5097697747], [9937.135196575824, 1227788.641219967], [15492.606340046807, 1133059.0676593857], [14651.76273816029, 882614.1807004922], [15189.523429391971, 1075073.6739545558], [13718.455011597003, 854583.2693140692], [13242.565179358064, 852689.7481448406], [12283.16329964135, 1054384.679136664], [10715.461680060893, 987530.7540134372], [9799.836999306235, 1188662.432761487], [6817.309005236672, 847516.4934806598], [9156.515653966426, 1029834.6994578489], [5647.526250134233, 700227.501149568], [6851.585075787405, 995376.7395363126], [8537.770338276303, 991275.0750426087], [5588.410860946238, 1096531.4230958493], [7832.874408306464, 681290.2321555684], [5385.709166136957, 1288904.2276863966], [5607.200777069934, 679212.9865083437], [7131.98062301099, 1233327.2530472076], [6143.062328777299, 1294580.6293236036], [4116.526919112113, 902602.6246132584], [5555.49183273859, 788062.6499769951], [5945.901312119126, 1236921.6936202012], [4307.837673987712, 1211308.1303755068], [3057.267111272262, 1144766.9718521282], [3412.952069021781, 954158.1280045257], [4857.118212156462, 1287958.9746543085], [2802.7914200776886, 857680.691013031], [3387.914599774963, 863233.6440396649], [3691.679610334573, 1031277.0232285978], [3889.932537061482, 1178453.4027236914], [3175.6272264942872, 897242.264150536], [3321.8016013704805, 1111506.090775924], [2484.743968904745, 1257395.831926505], [2604.1755637616475, 718592.1692915799], [2953.762015063723, 1299568.2114593633], [2674.99903287432, 1021821.7828949532], [1936.840241672874, 709331.3091161926], [2430.32784824078, 1018865.0657590512], [1860.436184602949, 1216703.8610504132], [1723.2315526850525, 856007.9319208895], [1953.6263447660579, 1312810.8625858119], [1858.5407262503563, 677777.0784941971], [1121.841683026275, 1053185.2996789496], [1429.1799261633125, 942788.834721557], [1305.5210429480653, 857145.1282976748], [1558.6548858562132, 1096849.3108424598], [1165.2977247587564, 975845.740861295], [1281.1760431911907, 995327.4595873987], [903.127132888626, 936759.8641734732], [830.0255705095318, 1264058.880523917], [1447.175826672647, 826241.7163334353], [782.9089616625392, 949718.6455322991], [1309.5388116616314, 805544.6451139126], [1020.0814509483284, 1186010.9653905143], [767.2256057638687, 730153.9456574344], [940.5434165348748, 731312.8929979993], [1068.431197781994, 1148310.00282886], [759.4824678568447, 927258.3721201726], [732.4516659883362, 1329935.1271868325], [706.3997339170826, 1184560.8555669347], [767.0434989984218, 798379.2411034874], [530.2926441714136, 1320301.478595184], [527.2703906339111, 1113031.6474556928], [430.5568953988018, 737433.9280313611], [692.1927353827714, 673595.9280200478], [384.23959921185053, 898704.8958790172], [405.6029193272436, 768494.1267053746], [532.3797944208193, 840066.5011984787], [554.3188745851079, 1161649.7413965538], [463.87824061723234, 1073741.3455026292], [308.0292581421485, 673847.3559565375], [462.02471007201643, 1247648.281420697], [403.35869455867373, 1160975.832082224], [267.2020640147793, 1250383.7841186798], [363.8630500648634, 718443.7734347496], [279.6159322070644, 1287801.210123048], [360.1097904304585, 839169.2354281674], [249.32033940693356, 975423.6296495761], [348.83356604943486, 1322801.2214118955], [328.40387580328803, 1221966.218413916], [221.1210037522975, 1324802.975776162], [165.06914366017043, 951352.6052332598], [261.4314897243031, 1099063.4721241775], [247.83450742057468, 840256.1768109152], [232.49428280316337, 1043133.7234717476], [134.23826614735785, 895668.9384443999], [153.20678095501415, 970433.3364156254], [163.3872329739676, 871489.5702094157], [216.6725459496833, 1220808.7783561496], [144.4212576438835, 1225762.0801782524], [192.42606995989752, 740647.2823234415], [96.11282000434359, 904821.5403045765], [166.41677897191434, 975432.1078972422], [118.12562865687576, 1225649.9201249767], [135.81589553462987, 1260216.3663823903], [116.89024486149172, 1195617.0482448642], [97.71131894635056, 833097.6624037084], [86.8018133066483, 1096535.386700453], [94.22066759538556, 850974.2314776242], [93.53703959337743, 1286339.5796547756], [117.26614306573515, 1090935.1549952293], [65.33749823040989, 700052.7320163958]], ['I', 'R'], [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])" ] }, "execution_count": 13, @@ -722,7 +722,7 @@ { "data": { "text/plain": [ - "4909533605860.806" + "9032988605419.916" ] }, "execution_count": 14, @@ -751,18 +751,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 3257054048571.9863\n", - " hess_inv: array([[ 5.18410500e-11, -2.54658445e-12, 1.27206329e-05],\n", - " [-2.54658442e-12, 1.49261473e-13, -6.12083782e-07],\n", - " [ 1.27206329e-05, -6.12083790e-07, 3.12906462e+00]])\n", - " jac: array([-1.10600741e+00, -4.43260288e+00, 4.08760083e-06])\n", + " fun: 6195089026101.063\n", + " hess_inv: array([[ 8.74144835e-12, -2.58712672e-14, 2.68445022e-06],\n", + " [-2.58712712e-14, 2.36956010e-15, -5.05342211e-09],\n", + " [ 2.68444976e-06, -5.05342099e-09, 8.41021723e-01]])\n", + " jac: array([ 4.61669282e+00, -8.58643370e+01, -1.67724298e-05])\n", " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 43\n", - " nit: 12\n", - " njev: 38\n", + " nfev: 57\n", + " nit: 11\n", + " njev: 46\n", " status: 2\n", " success: False\n", - " x: array([5.52375636e+00, 2.03086137e-01, 1.49373372e+06])\n" + " x: array([4.97711288e+00, 1.97932062e-01, 1.36982257e+06])\n" ] } ], @@ -785,16 +785,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 3257054048571.9043\n", + " fun: 6195089026101.077\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([-8.79695180e+01, -1.47147132e+03, 3.25305614e-04])\n", + " jac: array([ 7.75580656e+04, 3.96915387e+06, -2.81799456e-01])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 14\n", - " nit: 9\n", - " njev: 14\n", + " nfev: 16\n", + " nit: 10\n", + " njev: 16\n", " status: 0\n", " success: True\n", - " x: array([3.69795251e+00, 2.03086137e-01, 1.00000000e+06])\n" + " x: array([3.63339968e+00, 1.97932071e-01, 1.00000000e+06])\n" ] } ], @@ -849,53 +849,76 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Fitting Gamma loss" + "## Fitting Normal loss" ] }, { "cell_type": "code", "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "param_evals" + ] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": { "scrolled": false }, "outputs": [], "source": [ "# Initial guess of parameters, and bounding constraints\n", - "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + "theta = [3, 0.15,1e6]\n", + "boxBounds = [(2,5),(0.0,1.0),(1e6,1e6)]\n", + "\n", + "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([-5.77968064e+02, -6.98915605e+03, 1.73390419e-03])" + "NormalLoss([3.0, 0.15, 1000000.0], SimulateOde([ODEVariable('S', 'S', None, True), ODEVariable('I', 'I', None, True), ODEVariable('R', 'R', None, True)], [ODEVariable('beta', 'beta', None, True), ODEVariable('gamma', 'gamma', None, True), ODEVariable('N', 'N', None, True)], [], [Transition('S', 'beta*S*I/N', 'T', 'I', None, None), Transition('I', 'gamma*I', 'T', 'R', None, None)], [], []).setParameters({'beta': 3.6333996818761123, 'gamma': 0.19793207076619318, 'N': 1000000.0}), [999998.0, 2.0, 0.0], 0.0, [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 25.25, 25.5, 25.75, 26.0, 26.25, 26.5, 26.75, 27.0, 27.25, 27.5, 27.75, 28.0, 28.25, 28.5, 28.75, 29.0, 29.25, 29.5, 29.75, 30.0, 30.25, 30.5, 30.75, 31.0, 31.25, 31.5, 31.75, 32.0, 32.25, 32.5, 32.75, 33.0, 33.25, 33.5, 33.75, 34.0, 34.25, 34.5, 34.75, 35.0, 35.25, 35.5, 35.75, 36.0, 36.25, 36.5, 36.75, 37.0, 37.25, 37.5, 37.75, 38.0, 38.25, 38.5, 38.75, 39.0, 39.25, 39.5, 39.75, 40.0, 40.25, 40.5, 40.75, 41.0, 41.25, 41.5, 41.75, 42.0, 42.25, 42.5, 42.75, 43.0, 43.25, 43.5, 43.75, 44.0, 44.25, 44.5, 44.75, 45.0, 45.25, 45.5, 45.75, 46.0, 46.25, 46.5, 46.75, 47.0, 47.25, 47.5, 47.75, 48.0, 48.25, 48.5, 48.75, 49.0, 49.25, 49.5, 49.75, 50.0, 50.25, 50.5, 50.75], [[4.130487025131687, 0.15404561775936773], [9.397247964980085, 0.46303278732171177], [22.633824079261842, 1.7992007113807156], [47.986586672487206, 2.7579529325485836], [165.196041952231, 9.600546411428384], [409.7793329814416, 18.59941777036534], [528.9994837079726, 47.98014835106094], [1446.5429145036974, 90.66807675329977], [4994.287706241389, 311.89286846212264], [10103.580369113544, 548.4608589124192], [26194.736213578377, 1402.654912118046], [38389.19639311862, 2236.8590689690504], [144615.6038613682, 4710.739919896741], [204841.14352293048, 12829.825865082867], [304860.2404249535, 26514.684493267272], [715472.6235634295, 66063.90607297285], [570803.6488074489, 75737.62898047472], [947231.3292945497, 154986.247976831], [923953.16649091, 193822.49178823238], [657801.2480252209, 150769.93914359063], [843171.2637992136, 249113.1495604983], [559341.2527328188, 185957.3813357946], [696237.264525381, 403687.88293160085], [540067.5094137926, 266418.8007305509], [457478.5443022633, 388221.974041893], [425920.1427231567, 391122.61823234084], [396908.2854576274, 371414.7879418473], [602102.7053746057, 423352.09770557744], [641769.7394061629, 518903.09780880454], [416901.64080071973, 404368.7588933208], [330039.3314030553, 378696.7305775569], [551529.4145009269, 643412.0070484518], [549787.7820911882, 535688.556709061], [280979.5285986585, 742016.811538869], [466284.35882357555, 614750.051516308], [312148.2058862273, 529680.9650844566], [350953.6705610238, 872215.874672448], [401568.19082765863, 808517.3646270183], [295505.55911352474, 681129.850659894], [316315.37513281166, 659415.8097179801], [195777.4490952229, 679437.4206703037], [194280.03265693723, 721315.4457581254], [178501.10961662387, 675465.1683738899], [247404.53170668957, 985931.5093514766], [299943.4851962682, 764644.9954514606], [148078.91870689174, 898769.9073671738], [203910.04957668108, 710664.8108294513], [198269.08657707038, 550194.198541208], [241973.63044169324, 836300.8441740677], [194887.10906344195, 906544.5642488404], [146665.03014024382, 913739.3641712739], [143779.84227086403, 880070.3435878769], [104096.5358741194, 721086.1047601945], [187776.95624604076, 893932.5009312815], [94145.49095393051, 832234.8307984242], [147360.51529741898, 975970.1109512364], [107959.76674711499, 919504.6172384012], [131352.53801677615, 843986.0818510734], [138134.14244997536, 944445.5248128581], [143810.73000588483, 874698.002250221], [102488.3325125742, 825331.1957907011], [93675.23614669341, 1065797.3512993983], [92885.83732391837, 1155351.0857456843], [66375.89434895372, 988499.2242781295], [106010.1011427728, 810618.6033656059], [104769.0474474182, 639799.6000771984], [64379.976276675065, 1004433.9910370467], [88310.77848764382, 751578.4374513394], [83290.24377534064, 1142480.3506778087], [82370.47996389655, 770222.8341590352], [63637.766473583026, 810851.8091807761], [66788.91229470367, 698840.8146168891], [75102.3290490617, 1035002.7902780143], [62638.27317992859, 683328.3156147334], [41870.43206330126, 729742.0444708264], [60907.32053788277, 1179178.6549844078], [34183.575255148746, 920899.2296020638], [51655.704042085505, 842315.3424291152], [35331.51366160177, 886502.7398532623], [47883.945613707736, 693420.0510623266], [33557.87124412175, 1150074.1571437381], [30499.492761509304, 832594.3834703927], [42733.43248401154, 791261.006569009], [42078.9053350363, 1192499.0062521168], [39537.12490267918, 820574.0244793433], [25766.68117003718, 749084.1915958913], [37431.3006839491, 1146839.7385431828], [19729.377253022878, 688071.6526254383], [17124.35674302549, 1290962.3295776465], [19615.43572022034, 939060.0950318159], [24794.10562003187, 1112677.165293667], [21900.889529328662, 858416.4692184512], [19373.06594088114, 1150876.7459370985], [24118.498247359745, 852800.0837341312], [21207.530605877277, 772057.6638792764], [22267.30551041926, 714074.8898722631], [12497.025723179937, 712008.7912734993], [15065.344990296639, 843052.9384454926], [20199.686086950154, 882232.5677295076], [12391.464759044167, 718155.5097697747], [9937.135196575824, 1227788.641219967], [15492.606340046807, 1133059.0676593857], [14651.76273816029, 882614.1807004922], [15189.523429391971, 1075073.6739545558], [13718.455011597003, 854583.2693140692], [13242.565179358064, 852689.7481448406], [12283.16329964135, 1054384.679136664], [10715.461680060893, 987530.7540134372], [9799.836999306235, 1188662.432761487], [6817.309005236672, 847516.4934806598], [9156.515653966426, 1029834.6994578489], [5647.526250134233, 700227.501149568], [6851.585075787405, 995376.7395363126], [8537.770338276303, 991275.0750426087], [5588.410860946238, 1096531.4230958493], [7832.874408306464, 681290.2321555684], [5385.709166136957, 1288904.2276863966], [5607.200777069934, 679212.9865083437], [7131.98062301099, 1233327.2530472076], [6143.062328777299, 1294580.6293236036], [4116.526919112113, 902602.6246132584], [5555.49183273859, 788062.6499769951], [5945.901312119126, 1236921.6936202012], [4307.837673987712, 1211308.1303755068], [3057.267111272262, 1144766.9718521282], [3412.952069021781, 954158.1280045257], [4857.118212156462, 1287958.9746543085], [2802.7914200776886, 857680.691013031], [3387.914599774963, 863233.6440396649], [3691.679610334573, 1031277.0232285978], [3889.932537061482, 1178453.4027236914], [3175.6272264942872, 897242.264150536], [3321.8016013704805, 1111506.090775924], [2484.743968904745, 1257395.831926505], [2604.1755637616475, 718592.1692915799], [2953.762015063723, 1299568.2114593633], [2674.99903287432, 1021821.7828949532], [1936.840241672874, 709331.3091161926], [2430.32784824078, 1018865.0657590512], [1860.436184602949, 1216703.8610504132], [1723.2315526850525, 856007.9319208895], [1953.6263447660579, 1312810.8625858119], [1858.5407262503563, 677777.0784941971], [1121.841683026275, 1053185.2996789496], [1429.1799261633125, 942788.834721557], [1305.5210429480653, 857145.1282976748], [1558.6548858562132, 1096849.3108424598], [1165.2977247587564, 975845.740861295], [1281.1760431911907, 995327.4595873987], [903.127132888626, 936759.8641734732], [830.0255705095318, 1264058.880523917], [1447.175826672647, 826241.7163334353], [782.9089616625392, 949718.6455322991], [1309.5388116616314, 805544.6451139126], [1020.0814509483284, 1186010.9653905143], [767.2256057638687, 730153.9456574344], [940.5434165348748, 731312.8929979993], [1068.431197781994, 1148310.00282886], [759.4824678568447, 927258.3721201726], [732.4516659883362, 1329935.1271868325], [706.3997339170826, 1184560.8555669347], [767.0434989984218, 798379.2411034874], [530.2926441714136, 1320301.478595184], [527.2703906339111, 1113031.6474556928], [430.5568953988018, 737433.9280313611], [692.1927353827714, 673595.9280200478], [384.23959921185053, 898704.8958790172], [405.6029193272436, 768494.1267053746], [532.3797944208193, 840066.5011984787], [554.3188745851079, 1161649.7413965538], [463.87824061723234, 1073741.3455026292], [308.0292581421485, 673847.3559565375], [462.02471007201643, 1247648.281420697], [403.35869455867373, 1160975.832082224], [267.2020640147793, 1250383.7841186798], [363.8630500648634, 718443.7734347496], [279.6159322070644, 1287801.210123048], [360.1097904304585, 839169.2354281674], [249.32033940693356, 975423.6296495761], [348.83356604943486, 1322801.2214118955], [328.40387580328803, 1221966.218413916], [221.1210037522975, 1324802.975776162], [165.06914366017043, 951352.6052332598], [261.4314897243031, 1099063.4721241775], [247.83450742057468, 840256.1768109152], [232.49428280316337, 1043133.7234717476], [134.23826614735785, 895668.9384443999], [153.20678095501415, 970433.3364156254], [163.3872329739676, 871489.5702094157], [216.6725459496833, 1220808.7783561496], [144.4212576438835, 1225762.0801782524], [192.42606995989752, 740647.2823234415], [96.11282000434359, 904821.5403045765], [166.41677897191434, 975432.1078972422], [118.12562865687576, 1225649.9201249767], [135.81589553462987, 1260216.3663823903], [116.89024486149172, 1195617.0482448642], [97.71131894635056, 833097.6624037084], [86.8018133066483, 1096535.386700453], [94.22066759538556, 850974.2314776242], [93.53703959337743, 1286339.5796547756], [117.26614306573515, 1090935.1549952293], [65.33749823040989, 700052.7320163958]], ['I', 'R'], [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "objSIR.sensitivity()" + "objSIR" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5062.059868394187" + "4516494303083.047" ] }, - "execution_count": 20, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -906,7 +929,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -921,18 +944,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4717.565272474467\n", - " hess_inv: array([[ 3.84423633e-03, -3.01340148e-05, 1.56049513e-06],\n", - " [-3.01340148e-05, 3.82956903e-06, 1.49977083e-08],\n", - " [ 1.56049513e-06, 1.49977083e-08, 1.00000000e+00]])\n", - " jac: array([ 8.12454287e-07, -3.28990725e-04, -2.91902226e-12])\n", + " fun: 3097544513423.658\n", + " hess_inv: array([[ 1.03645359e-11, -4.61156610e-14, 3.16936003e-06],\n", + " [-4.61156587e-14, 4.75500055e-15, -8.98088545e-09],\n", + " [ 3.16936002e-06, -8.98088607e-09, 1.00244138e+00]])\n", + " jac: array([ 9.35430284e+04, -3.55363991e+05, -3.39879219e-01])\n", " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 57\n", - " nit: 10\n", + " nfev: 55\n", + " nit: 9\n", " njev: 46\n", " status: 2\n", " success: False\n", - " x: array([3.59284491e+00, 1.99665537e-01, 1.00000000e+06])\n" + " x: array([4.54710725e+00, 1.97932059e-01, 1.25147454e+06])\n" ] } ], @@ -948,14 +971,184 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 3097544513423.661\n", + " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", + " jac: array([ 3.87782251e+04, 1.98457720e+06, -1.40896750e-01])\n", + " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", + " nfev: 16\n", + " nit: 10\n", + " njev: 16\n", + " status: 0\n", + " success: True\n", + " x: array([3.63339968e+00, 1.97932071e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='L-BFGS-B')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[3, 0.15, 1000000.0]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[(2, 5), (0.0, 1.0), (1000000.0, 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(theta,boxBounds,param_evals)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fitting Gamma loss" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-5.77039500e+02, -6.96845671e+03, 1.73111850e-03])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.sensitivity()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5058.726988342257" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", + " warn('Method %s cannot handle constraints nor bounds.' % method,\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " fun: 4717.132458517435\n", + " hess_inv: array([[ 3.86858865e-03, -3.00734373e-05, 3.30190074e-06],\n", + " [-3.00734373e-05, 3.91747625e-06, 2.36516472e-08],\n", + " [ 3.30190074e-06, 2.36516472e-08, 1.00000000e+00]])\n", + " jac: array([ 2.13941642e-10, 3.42940432e-08, -7.68280694e-16])\n", + " message: 'Optimization terminated successfully.'\n", + " nfev: 28\n", + " nit: 12\n", + " njev: 27\n", + " status: 0\n", + " success: True\n", + " x: array([3.59089103e+00, 1.99441546e-01, 1.00000000e+06])\n" + ] + } + ], + "source": [ + "# perform optimization\n", + "res = minimize(fun=objSIR.cost,\n", + " jac=objSIR.sensitivity,\n", + " x0=theta,\n", + " bounds=boxBounds,\n", + " method='BFGS')\n", + "print(res)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", " logpdf_p3= -shape*np.log(mu/shape)\n" ] }, @@ -963,16 +1156,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4717.565272489127\n", + " fun: 4717.132458530734\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 1.06976387e-03, -7.18401978e-02, -3.84350237e-09])\n", + " jac: array([ 1.00361678e-03, -6.86270665e-02, -3.60388445e-09])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", " nfev: 17\n", " nit: 10\n", " njev: 17\n", " status: 0\n", " success: True\n", - " x: array([3.59285115e+00, 1.99665226e-01, 1.00000000e+06])\n" + " x: array([3.59089697e+00, 1.99441247e-01, 1.00000000e+06])\n" ] } ], @@ -988,7 +1181,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1039,218 +1232,218 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[6.000000e+00, 0.000000e+00],\n", - " [9.000000e+00, 1.000000e+00],\n", - " [2.600000e+01, 2.000000e+00],\n", - " [4.100000e+01, 4.000000e+00],\n", - " [1.080000e+02, 1.000000e+01],\n", - " [2.660000e+02, 2.000000e+01],\n", - " [8.140000e+02, 3.400000e+01],\n", - " [1.610000e+03, 8.400000e+01],\n", - " [4.034000e+03, 2.880000e+02],\n", - " [8.244000e+03, 6.960000e+02],\n", - " [2.944100e+04, 1.278000e+03],\n", - " [3.632600e+04, 3.083000e+03],\n", - " [1.343010e+05, 7.316000e+03],\n", - " [2.511210e+05, 1.222800e+04],\n", - " [5.123970e+05, 2.154300e+04],\n", - " [5.856170e+05, 3.848500e+04],\n", - " [7.902060e+05, 8.369300e+04],\n", - " [9.747970e+05, 1.374470e+05],\n", - " [7.077570e+05, 1.173470e+05],\n", - " [6.035560e+05, 1.894330e+05],\n", - " [9.139100e+05, 1.990480e+05],\n", - " [5.489300e+05, 2.794000e+05],\n", - " [4.620410e+05, 3.833270e+05],\n", - " [7.613260e+05, 2.588560e+05],\n", - " [6.622870e+05, 3.404260e+05],\n", - " [5.084650e+05, 3.910210e+05],\n", - " [6.567450e+05, 5.784740e+05],\n", - " [5.541630e+05, 4.267650e+05],\n", - " [5.322210e+05, 5.087300e+05],\n", - " [4.456160e+05, 4.763160e+05],\n", - " [5.902310e+05, 6.481090e+05],\n", - " [5.449100e+05, 6.728700e+05],\n", - " [3.108270e+05, 5.874350e+05],\n", - " [4.561160e+05, 7.105300e+05],\n", - " [3.642540e+05, 5.794740e+05],\n", - " [3.114750e+05, 8.214390e+05],\n", - " [2.527190e+05, 4.782710e+05],\n", - " [3.078090e+05, 6.833250e+05],\n", - " [2.812700e+05, 8.344320e+05],\n", - " [2.613370e+05, 7.506100e+05],\n", - " [3.522730e+05, 6.899340e+05],\n", - " [3.372790e+05, 6.684740e+05],\n", - " [2.628170e+05, 8.967300e+05],\n", - " [2.749900e+05, 6.176790e+05],\n", - " [2.528980e+05, 8.654760e+05],\n", - " [2.098670e+05, 9.504580e+05],\n", - " [1.617910e+05, 1.051352e+06],\n", - " [1.768890e+05, 9.986820e+05],\n", - " [1.587040e+05, 1.052019e+06],\n", - " [2.359540e+05, 5.815120e+05],\n", - " [1.395080e+05, 1.104611e+06],\n", - " [1.272660e+05, 9.005600e+05],\n", - " [1.462970e+05, 8.024700e+05],\n", - " [1.536980e+05, 1.124694e+06],\n", - " [1.652010e+05, 6.528740e+05],\n", - " [1.600480e+05, 6.982990e+05],\n", - " [9.459700e+04, 7.941890e+05],\n", - " [1.172920e+05, 1.170125e+06],\n", - " [8.820500e+04, 1.027702e+06],\n", - " [7.969900e+04, 8.879200e+05],\n", - " [1.229900e+05, 8.230110e+05],\n", - " [9.029800e+04, 8.566030e+05],\n", - " [1.125830e+05, 8.236900e+05],\n", - " [1.154790e+05, 9.246180e+05],\n", - " [7.753300e+04, 9.045910e+05],\n", - " [7.808200e+04, 7.158560e+05],\n", - " [9.966600e+04, 6.728900e+05],\n", - " [8.796800e+04, 1.005141e+06],\n", - " [5.675400e+04, 9.265630e+05],\n", - " [5.086800e+04, 7.102210e+05],\n", - " [4.244600e+04, 7.063260e+05],\n", - " [4.655500e+04, 9.741340e+05],\n", - " [5.291800e+04, 6.721520e+05],\n", - " [6.155400e+04, 1.154690e+06],\n", - " [4.135600e+04, 1.114492e+06],\n", - " [4.637500e+04, 8.701900e+05],\n", - " [3.724400e+04, 1.191670e+06],\n", - " [4.128200e+04, 1.046085e+06],\n", - " [5.531800e+04, 1.128080e+06],\n", - " [3.190800e+04, 1.000208e+06],\n", - " [3.401000e+04, 9.302210e+05],\n", - " [3.092800e+04, 1.018299e+06],\n", - " [3.952300e+04, 1.096729e+06],\n", - " [4.310200e+04, 9.233630e+05],\n", - " [2.445300e+04, 8.106100e+05],\n", - " [2.429100e+04, 1.168379e+06],\n", - " [3.085000e+04, 6.723580e+05],\n", - " [2.293100e+04, 6.831810e+05],\n", - " [1.931200e+04, 1.181575e+06],\n", - " [2.480100e+04, 6.945950e+05],\n", - " [3.023300e+04, 1.144610e+06],\n", - " [2.044000e+04, 9.168310e+05],\n", - " [2.600300e+04, 6.897410e+05],\n", - " [2.045000e+04, 1.277607e+06],\n", - " [2.324500e+04, 9.581790e+05],\n", - " [1.644700e+04, 1.225836e+06],\n", - " [2.005100e+04, 6.691500e+05],\n", - " [1.666400e+04, 9.255040e+05],\n", - " [1.668100e+04, 7.432400e+05],\n", - " [1.868300e+04, 1.092030e+06],\n", - " [1.799600e+04, 8.042660e+05],\n", - " [1.741200e+04, 7.039810e+05],\n", - " [1.269900e+04, 1.121871e+06],\n", - " [1.581400e+04, 1.027571e+06],\n", - " [1.273400e+04, 8.585930e+05],\n", - " [1.358300e+04, 7.649160e+05],\n", - " [1.012600e+04, 7.501810e+05],\n", - " [7.193000e+03, 1.271423e+06],\n", - " [1.024900e+04, 1.133442e+06],\n", - " [1.039800e+04, 1.077066e+06],\n", - " [1.029100e+04, 1.127212e+06],\n", - " [6.610000e+03, 6.722480e+05],\n", - " [6.598000e+03, 8.888560e+05],\n", - " [7.690000e+03, 7.394240e+05],\n", - " [8.846000e+03, 1.006776e+06],\n", - " [8.257000e+03, 1.192111e+06],\n", - " [5.882000e+03, 1.115150e+06],\n", - " [5.421000e+03, 7.166400e+05],\n", - " [6.825000e+03, 1.124535e+06],\n", - " [3.683000e+03, 1.098986e+06],\n", - " [6.805000e+03, 1.096527e+06],\n", - " [5.972000e+03, 1.094255e+06],\n", - " [5.273000e+03, 9.224470e+05],\n", - " [4.327000e+03, 6.865670e+05],\n", - " [3.383000e+03, 1.035475e+06],\n", - " [3.070000e+03, 1.166200e+06],\n", - " [4.129000e+03, 1.036638e+06],\n", - " [4.277000e+03, 1.265375e+06],\n", - " [3.188000e+03, 1.161353e+06],\n", - " [2.800000e+03, 9.751570e+05],\n", - " [3.620000e+03, 7.897360e+05],\n", - " [3.842000e+03, 1.188642e+06],\n", - " [3.068000e+03, 8.948170e+05],\n", - " [2.135000e+03, 1.167306e+06],\n", - " [2.276000e+03, 1.245916e+06],\n", - " [2.348000e+03, 1.120309e+06],\n", - " [2.249000e+03, 7.320390e+05],\n", - " [1.851000e+03, 1.253931e+06],\n", - " [2.652000e+03, 7.404650e+05],\n", - " [2.442000e+03, 1.072739e+06],\n", - " [2.418000e+03, 1.066501e+06],\n", - " [2.121000e+03, 1.072553e+06],\n", - " [2.017000e+03, 1.184127e+06],\n", - " [1.425000e+03, 9.984420e+05],\n", - " [2.002000e+03, 1.167627e+06],\n", - " [1.189000e+03, 7.632420e+05],\n", - " [9.640000e+02, 1.062757e+06],\n", - " [9.480000e+02, 9.527130e+05],\n", - " [1.087000e+03, 1.326560e+06],\n", - " [1.582000e+03, 1.285545e+06],\n", - " [1.025000e+03, 1.216454e+06],\n", - " [1.097000e+03, 8.375880e+05],\n", - " [1.185000e+03, 1.328683e+06],\n", - " [9.610000e+02, 9.588020e+05],\n", - " [8.360000e+02, 6.700710e+05],\n", - " [8.470000e+02, 9.090290e+05],\n", - " [8.760000e+02, 6.935830e+05],\n", - " [9.980000e+02, 1.300878e+06],\n", - " [8.380000e+02, 8.590400e+05],\n", - " [8.490000e+02, 7.487480e+05],\n", - " [4.750000e+02, 7.295330e+05],\n", - " [4.750000e+02, 1.134978e+06],\n", - " [5.950000e+02, 1.176977e+06],\n", - " [6.090000e+02, 1.319344e+06],\n", - " [5.720000e+02, 1.087811e+06],\n", - " [5.380000e+02, 8.838410e+05],\n", - " [6.530000e+02, 1.126644e+06],\n", - " [3.800000e+02, 7.169190e+05],\n", - " [4.790000e+02, 7.679570e+05],\n", - " [3.760000e+02, 7.796360e+05],\n", - " [3.990000e+02, 1.178129e+06],\n", - " [4.920000e+02, 6.799390e+05],\n", - " [3.170000e+02, 1.288119e+06],\n", - " [2.840000e+02, 1.084258e+06],\n", - " [2.530000e+02, 6.698680e+05],\n", - " [2.990000e+02, 1.143576e+06],\n", - " [3.880000e+02, 8.489890e+05],\n", - " [2.560000e+02, 9.687090e+05],\n", - " [2.270000e+02, 8.278320e+05],\n", - " [2.290000e+02, 7.324660e+05],\n", - " [3.170000e+02, 1.189860e+06],\n", - " [2.040000e+02, 8.754980e+05],\n", - " [2.690000e+02, 1.018708e+06],\n", - " [2.580000e+02, 1.315244e+06],\n", - " [1.910000e+02, 1.123760e+06],\n", - " [1.950000e+02, 1.043334e+06],\n", - " [2.070000e+02, 1.252729e+06],\n", - " [2.100000e+02, 6.666520e+05],\n", - " [2.170000e+02, 7.769410e+05],\n", - " [1.820000e+02, 1.204558e+06],\n", - " [1.670000e+02, 9.251490e+05],\n", - " [1.670000e+02, 8.509660e+05],\n", - " [1.260000e+02, 1.247044e+06],\n", - " [1.070000e+02, 6.884890e+05],\n", - " [1.200000e+02, 1.067715e+06],\n", - " [9.100000e+01, 7.749630e+05],\n", - " [9.500000e+01, 9.008270e+05],\n", - " [1.330000e+02, 9.970260e+05],\n", - " [1.220000e+02, 8.254500e+05],\n", - " [1.130000e+02, 1.327483e+06],\n", - " [8.000000e+01, 9.962030e+05],\n", - " [7.500000e+01, 7.089120e+05],\n", - " [1.070000e+02, 8.624290e+05]])" + "array([[4.000000e+00, 0.000000e+00],\n", + " [9.000000e+00, 0.000000e+00],\n", + " [2.300000e+01, 2.000000e+00],\n", + " [4.800000e+01, 3.000000e+00],\n", + " [1.650000e+02, 1.000000e+01],\n", + " [4.100000e+02, 1.900000e+01],\n", + " [5.290000e+02, 4.800000e+01],\n", + " [1.447000e+03, 9.100000e+01],\n", + " [4.994000e+03, 3.120000e+02],\n", + " [1.010400e+04, 5.480000e+02],\n", + " [2.619500e+04, 1.403000e+03],\n", + " [3.838900e+04, 2.237000e+03],\n", + " [1.446160e+05, 4.711000e+03],\n", + " [2.048410e+05, 1.283000e+04],\n", + " [3.048600e+05, 2.651500e+04],\n", + " [7.154730e+05, 6.606400e+04],\n", + " [5.708040e+05, 7.573800e+04],\n", + " [9.472310e+05, 1.549860e+05],\n", + " [9.239530e+05, 1.938220e+05],\n", + " [6.578010e+05, 1.507700e+05],\n", + " [8.431710e+05, 2.491130e+05],\n", + " [5.593410e+05, 1.859570e+05],\n", + " [6.962370e+05, 4.036880e+05],\n", + " [5.400680e+05, 2.664190e+05],\n", + " [4.574790e+05, 3.882220e+05],\n", + " [4.259200e+05, 3.911230e+05],\n", + " [3.969080e+05, 3.714150e+05],\n", + " [6.021030e+05, 4.233520e+05],\n", + " [6.417700e+05, 5.189030e+05],\n", + " [4.169020e+05, 4.043690e+05],\n", + " [3.300390e+05, 3.786970e+05],\n", + " [5.515290e+05, 6.434120e+05],\n", + " [5.497880e+05, 5.356890e+05],\n", + " [2.809800e+05, 7.420170e+05],\n", + " [4.662840e+05, 6.147500e+05],\n", + " [3.121480e+05, 5.296810e+05],\n", + " [3.509540e+05, 8.722160e+05],\n", + " [4.015680e+05, 8.085170e+05],\n", + " [2.955060e+05, 6.811300e+05],\n", + " [3.163150e+05, 6.594160e+05],\n", + " [1.957770e+05, 6.794370e+05],\n", + " [1.942800e+05, 7.213150e+05],\n", + " [1.785010e+05, 6.754650e+05],\n", + " [2.474050e+05, 9.859320e+05],\n", + " [2.999430e+05, 7.646450e+05],\n", + " [1.480790e+05, 8.987700e+05],\n", + " [2.039100e+05, 7.106650e+05],\n", + " [1.982690e+05, 5.501940e+05],\n", + " [2.419740e+05, 8.363010e+05],\n", + " [1.948870e+05, 9.065450e+05],\n", + " [1.466650e+05, 9.137390e+05],\n", + " [1.437800e+05, 8.800700e+05],\n", + " [1.040970e+05, 7.210860e+05],\n", + " [1.877770e+05, 8.939330e+05],\n", + " [9.414500e+04, 8.322350e+05],\n", + " [1.473610e+05, 9.759700e+05],\n", + " [1.079600e+05, 9.195050e+05],\n", + " [1.313530e+05, 8.439860e+05],\n", + " [1.381340e+05, 9.444460e+05],\n", + " [1.438110e+05, 8.746980e+05],\n", + " [1.024880e+05, 8.253310e+05],\n", + " [9.367500e+04, 1.065797e+06],\n", + " [9.288600e+04, 1.155351e+06],\n", + " [6.637600e+04, 9.884990e+05],\n", + " [1.060100e+05, 8.106190e+05],\n", + " [1.047690e+05, 6.398000e+05],\n", + " [6.438000e+04, 1.004434e+06],\n", + " [8.831100e+04, 7.515780e+05],\n", + " [8.329000e+04, 1.142480e+06],\n", + " [8.237000e+04, 7.702230e+05],\n", + " [6.363800e+04, 8.108520e+05],\n", + " [6.678900e+04, 6.988410e+05],\n", + " [7.510200e+04, 1.035003e+06],\n", + " [6.263800e+04, 6.833280e+05],\n", + " [4.187000e+04, 7.297420e+05],\n", + " [6.090700e+04, 1.179179e+06],\n", + " [3.418400e+04, 9.208990e+05],\n", + " [5.165600e+04, 8.423150e+05],\n", + " [3.533200e+04, 8.865030e+05],\n", + " [4.788400e+04, 6.934200e+05],\n", + " [3.355800e+04, 1.150074e+06],\n", + " [3.049900e+04, 8.325940e+05],\n", + " [4.273300e+04, 7.912610e+05],\n", + " [4.207900e+04, 1.192499e+06],\n", + " [3.953700e+04, 8.205740e+05],\n", + " [2.576700e+04, 7.490840e+05],\n", + " [3.743100e+04, 1.146840e+06],\n", + " [1.972900e+04, 6.880720e+05],\n", + " [1.712400e+04, 1.290962e+06],\n", + " [1.961500e+04, 9.390600e+05],\n", + " [2.479400e+04, 1.112677e+06],\n", + " [2.190100e+04, 8.584160e+05],\n", + " [1.937300e+04, 1.150877e+06],\n", + " [2.411800e+04, 8.528000e+05],\n", + " [2.120800e+04, 7.720580e+05],\n", + " [2.226700e+04, 7.140750e+05],\n", + " [1.249700e+04, 7.120090e+05],\n", + " [1.506500e+04, 8.430530e+05],\n", + " [2.020000e+04, 8.822330e+05],\n", + " [1.239100e+04, 7.181560e+05],\n", + " [9.937000e+03, 1.227789e+06],\n", + " [1.549300e+04, 1.133059e+06],\n", + " [1.465200e+04, 8.826140e+05],\n", + " [1.519000e+04, 1.075074e+06],\n", + " [1.371800e+04, 8.545830e+05],\n", + " [1.324300e+04, 8.526900e+05],\n", + " [1.228300e+04, 1.054385e+06],\n", + " [1.071500e+04, 9.875310e+05],\n", + " [9.800000e+03, 1.188662e+06],\n", + " [6.817000e+03, 8.475160e+05],\n", + " [9.157000e+03, 1.029835e+06],\n", + " [5.648000e+03, 7.002280e+05],\n", + " [6.852000e+03, 9.953770e+05],\n", + " [8.538000e+03, 9.912750e+05],\n", + " [5.588000e+03, 1.096531e+06],\n", + " [7.833000e+03, 6.812900e+05],\n", + " [5.386000e+03, 1.288904e+06],\n", + " [5.607000e+03, 6.792130e+05],\n", + " [7.132000e+03, 1.233327e+06],\n", + " [6.143000e+03, 1.294581e+06],\n", + " [4.117000e+03, 9.026030e+05],\n", + " [5.555000e+03, 7.880630e+05],\n", + " [5.946000e+03, 1.236922e+06],\n", + " [4.308000e+03, 1.211308e+06],\n", + " [3.057000e+03, 1.144767e+06],\n", + " [3.413000e+03, 9.541580e+05],\n", + " [4.857000e+03, 1.287959e+06],\n", + " [2.803000e+03, 8.576810e+05],\n", + " [3.388000e+03, 8.632340e+05],\n", + " [3.692000e+03, 1.031277e+06],\n", + " [3.890000e+03, 1.178453e+06],\n", + " [3.176000e+03, 8.972420e+05],\n", + " [3.322000e+03, 1.111506e+06],\n", + " [2.485000e+03, 1.257396e+06],\n", + " [2.604000e+03, 7.185920e+05],\n", + " [2.954000e+03, 1.299568e+06],\n", + " [2.675000e+03, 1.021822e+06],\n", + " [1.937000e+03, 7.093310e+05],\n", + " [2.430000e+03, 1.018865e+06],\n", + " [1.860000e+03, 1.216704e+06],\n", + " [1.723000e+03, 8.560080e+05],\n", + " [1.954000e+03, 1.312811e+06],\n", + " [1.859000e+03, 6.777770e+05],\n", + " [1.122000e+03, 1.053185e+06],\n", + " [1.429000e+03, 9.427890e+05],\n", + " [1.306000e+03, 8.571450e+05],\n", + " [1.559000e+03, 1.096849e+06],\n", + " [1.165000e+03, 9.758460e+05],\n", + " [1.281000e+03, 9.953270e+05],\n", + " [9.030000e+02, 9.367600e+05],\n", + " [8.300000e+02, 1.264059e+06],\n", + " [1.447000e+03, 8.262420e+05],\n", + " [7.830000e+02, 9.497190e+05],\n", + " [1.310000e+03, 8.055450e+05],\n", + " [1.020000e+03, 1.186011e+06],\n", + " [7.670000e+02, 7.301540e+05],\n", + " [9.410000e+02, 7.313130e+05],\n", + " [1.068000e+03, 1.148310e+06],\n", + " [7.590000e+02, 9.272580e+05],\n", + " [7.320000e+02, 1.329935e+06],\n", + " [7.060000e+02, 1.184561e+06],\n", + " [7.670000e+02, 7.983790e+05],\n", + " [5.300000e+02, 1.320301e+06],\n", + " [5.270000e+02, 1.113032e+06],\n", + " [4.310000e+02, 7.374340e+05],\n", + " [6.920000e+02, 6.735960e+05],\n", + " [3.840000e+02, 8.987050e+05],\n", + " [4.060000e+02, 7.684940e+05],\n", + " [5.320000e+02, 8.400670e+05],\n", + " [5.540000e+02, 1.161650e+06],\n", + " [4.640000e+02, 1.073741e+06],\n", + " [3.080000e+02, 6.738470e+05],\n", + " [4.620000e+02, 1.247648e+06],\n", + " [4.030000e+02, 1.160976e+06],\n", + " [2.670000e+02, 1.250384e+06],\n", + " [3.640000e+02, 7.184440e+05],\n", + " [2.800000e+02, 1.287801e+06],\n", + " [3.600000e+02, 8.391690e+05],\n", + " [2.490000e+02, 9.754240e+05],\n", + " [3.490000e+02, 1.322801e+06],\n", + " [3.280000e+02, 1.221966e+06],\n", + " [2.210000e+02, 1.324803e+06],\n", + " [1.650000e+02, 9.513530e+05],\n", + " [2.610000e+02, 1.099063e+06],\n", + " [2.480000e+02, 8.402560e+05],\n", + " [2.320000e+02, 1.043134e+06],\n", + " [1.340000e+02, 8.956690e+05],\n", + " [1.530000e+02, 9.704330e+05],\n", + " [1.630000e+02, 8.714900e+05],\n", + " [2.170000e+02, 1.220809e+06],\n", + " [1.440000e+02, 1.225762e+06],\n", + " [1.920000e+02, 7.406470e+05],\n", + " [9.600000e+01, 9.048220e+05],\n", + " [1.660000e+02, 9.754320e+05],\n", + " [1.180000e+02, 1.225650e+06],\n", + " [1.360000e+02, 1.260216e+06],\n", + " [1.170000e+02, 1.195617e+06],\n", + " [9.800000e+01, 8.330980e+05],\n", + " [8.700000e+01, 1.096535e+06],\n", + " [9.400000e+01, 8.509740e+05],\n", + " [9.400000e+01, 1.286340e+06],\n", + " [1.170000e+02, 1.090935e+06],\n", + " [6.500000e+01, 7.000530e+05]])" ] }, - "execution_count": 24, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1269,7 +1462,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 32, "metadata": { "scrolled": false }, @@ -1281,23 +1474,16 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 26, + "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "9745677.652607694" + "8999599.052695096" ] }, - "execution_count": 26, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1308,7 +1494,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 34, "metadata": {}, "outputs": [ { @@ -1323,18 +1509,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 3692407.814497117\n", - " hess_inv: array([[ 1.13964289e-07, -2.49061166e-09, 2.20264892e-06],\n", - " [-2.49061166e-09, 9.27756704e-10, 9.40250405e-09],\n", - " [ 2.20264892e-06, 9.40250405e-09, 1.00000987e+00]])\n", - " jac: array([ 1.33293688e-02, -2.07506277e-02, -4.87274588e-08])\n", + " fun: 3555725.9211099287\n", + " hess_inv: array([[ 1.12854102e-07, -2.48584571e-09, 2.27949584e-06],\n", + " [-2.48584571e-09, 9.25888041e-10, 9.47168312e-09],\n", + " [ 2.27949584e-06, 9.47168312e-09, 1.00000832e+00]])\n", + " jac: array([ 1.48618754e-02, -2.24162553e-02, -5.37171184e-08])\n", " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 54\n", - " nit: 10\n", - " njev: 42\n", + " nfev: 71\n", + " nit: 11\n", + " njev: 60\n", " status: 2\n", " success: False\n", - " x: array([3.65564294e+00, 2.00162197e-01, 9.99999090e+05])\n" + " x: array([3.61442328e+00, 1.98453976e-01, 9.99999326e+05])\n" ] } ], @@ -1350,23 +1536,23 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " fun: 3692407.8145229938\n", + " fun: 3555725.9211287573\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 9.92225896e-02, -2.34421856e+02, -3.62722747e-07])\n", + " jac: array([-7.98496027e-01, -2.01665131e+02, 2.88610490e-06])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", " nfev: 14\n", " nit: 10\n", " njev: 14\n", " status: 0\n", " success: True\n", - " x: array([3.65564687e+00, 2.00161978e-01, 1.00000000e+06])\n" + " x: array([3.61442613e+00, 1.98453791e-01, 1.00000000e+06])\n" ] } ], @@ -1382,7 +1568,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1426,7 +1612,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 37, "metadata": { "scrolled": false }, @@ -1435,9 +1621,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] } @@ -1449,16 +1635,16 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([-2.87176322e+02, -3.47833060e+03, 8.61528965e-04])" + "array([-2.86825346e+02, -3.46781844e+03, 8.60476039e-04])" ] }, - "execution_count": 31, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1469,16 +1655,16 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5041.270821570561" + "5038.2958154688895" ] }, - "execution_count": 32, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1489,7 +1675,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1504,18 +1690,18 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4869.743686474076\n", - " hess_inv: array([[ 7.82577440e-03, -6.12363068e-05, 1.76151491e-06],\n", - " [-6.12363068e-05, 7.85949196e-06, 1.45278667e-08],\n", - " [ 1.76151491e-06, 1.45278667e-08, 1.00000000e+00]])\n", - " jac: array([-2.72469402e-08, 1.25576726e-07, 9.79041863e-14])\n", + " fun: 4868.230711182974\n", + " hess_inv: array([[ 7.84349281e-03, -6.15336988e-05, 1.77314305e-06],\n", + " [-6.15336988e-05, 7.88477962e-06, 1.39267526e-08],\n", + " [ 1.77314305e-06, 1.39267526e-08, 1.00000000e+00]])\n", + " jac: array([-1.03570668e-08, 1.32455900e-07, 3.71928550e-14])\n", " message: 'Optimization terminated successfully.'\n", " nfev: 16\n", " nit: 11\n", " njev: 16\n", " status: 0\n", " success: True\n", - " x: array([3.59321800e+00, 1.99662852e-01, 1.00000000e+06])\n" + " x: array([3.59106407e+00, 1.99435913e-01, 1.00000000e+06])\n" ] } ], @@ -1531,14 +1717,14 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev7+g126fc99.d20200624-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] }, @@ -1546,16 +1732,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4869.743686476613\n", + " fun: 4868.230711171033\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([-1.47841000e-04, -9.54029439e-03, 5.31224858e-10])\n", + " jac: array([-8.31389989e-04, -6.80463204e-03, 2.98556969e-09])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 18\n", + " nfev: 26\n", " nit: 12\n", - " njev: 18\n", + " njev: 26\n", " status: 0\n", " success: True\n", - " x: array([3.59321743e+00, 1.99662786e-01, 1.00000000e+06])\n" + " x: array([3.59105802e+00, 1.99435910e-01, 1.00000000e+06])\n" ] } ], @@ -1571,7 +1757,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1613,6 +1799,20 @@ "outputs": [], "source": [] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/pygom/loss/base_loss.py b/pygom/loss/base_loss.py index 68c582da..9f6df6d3 100644 --- a/pygom/loss/base_loss.py +++ b/pygom/loss/base_loss.py @@ -65,7 +65,7 @@ def __init__(self, theta, ode, y = ode_utils.check_array_type(y) if state_weight is None: - state_weight = np.ones(y.shape) + state_weight = 1.0 if len(y) == y.size: y = y.flatten() @@ -149,9 +149,6 @@ def __init__(self, theta, ode, else: raise InputError("State name should be str or of type list/tuple") - # if self._stateWeight is not None: - if np.any(self._stateWeight <= 0): - raise InputError("Weights should be strictly positive") # finish ordering information # now get the index of target states @@ -918,7 +915,7 @@ def fisher_information(self, theta=None, full_output=False, method=None): # ############################################################ - def cost(self, theta=None): + def cost(self, theta=None, apply_weighting = True): """ Find the cost/loss given time points and the corresponding observations. @@ -927,6 +924,9 @@ def cost(self, theta=None): ---------- theta: array like input value of the parameters + apply_weighting: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- @@ -943,11 +943,11 @@ def cost(self, theta=None): """ yhat = self._getSolution(theta) - c = self._lossObj.loss(yhat) + c = self._lossObj.loss(yhat,apply_weighting = apply_weighting) return np.nan_to_num(c) if c == np.inf else c - def diff_loss(self, theta=None): + def diff_loss(self, theta=None, apply_weighting = True): """ Find the derivative of the loss function given time points and the corresponding observations, with initial conditions @@ -956,6 +956,9 @@ def diff_loss(self, theta=None): ---------- theta: array like input value of the parameters + apply_weighting: boolean + If True multiplies array of residuals by weightings, else raw + residuals are used. Returns ------- @@ -969,13 +972,13 @@ def diff_loss(self, theta=None): try: # the solution does not include the origin solution = self._getSolution(theta) - return self._lossObj.diff_loss(solution) + return self._lossObj.diff_loss(solution,apply_weighting = apply_weighting) except Exception as e: # print(e) # print("parameters = " +str(theta)) return np.nan_to_num((np.ones(self._y.shape)*np.inf)) - def residual(self, theta=None): + def residual(self, theta=None, apply_weighting = True): """ Find the residuals given time points and the corresponding observations, with initial conditions @@ -984,6 +987,9 @@ def residual(self, theta=None): ---------- theta: array like input value of the parameters + apply_weighting: boolean + If True multiplies array of residuals by weightings, else raw + residuals returned. Returns ------- @@ -1003,7 +1009,7 @@ def residual(self, theta=None): try: # the solution does not include the origin solution = self._getSolution(theta) - return self._lossObj.residual(solution) + return self._lossObj.residual(solution, apply_weighting = apply_weighting) except Exception as e: # print(e) return np.nan_to_num((np.ones(self._y.shape)*np.inf)) @@ -1014,7 +1020,7 @@ def residual(self, theta=None): # ############################################################ - def costIV(self, theta=None): + def costIV(self, theta=None, apply_weighting = True): """ Find the cost/loss given the parameters. The input theta here is assumed to include both the parameters as well as the @@ -1024,6 +1030,10 @@ def costIV(self, theta=None): ---------- theta: array like parameters and guess of initial values of the states + apply_weighting: boolean + If True multiplies array of residuals by weightings, else raw + residuals returned. + Returns ------- @@ -1039,9 +1049,9 @@ def costIV(self, theta=None): self._setParamStateInput(theta) solution = self._getSolution() - return self._lossObj.loss(solution) + return self._lossObj.loss(solution, apply_weighting = apply_weighting) - def diff_lossIV(self, theta=None): + def diff_lossIV(self, theta=None, apply_weighting = True): """ Find the derivative of the loss function w.r.t. the parameters given time points and the corresponding observations, with @@ -1051,6 +1061,9 @@ def diff_lossIV(self, theta=None): ---------- theta: array like parameters and initial values of the states + apply_weighting: boolean + If True multiplies array of residuals by weightings, else raw + residuals returned. Returns ------- @@ -1068,13 +1081,13 @@ def diff_lossIV(self, theta=None): try: # the solution does not include the origin solution = self._getSolution() - return self._lossObj.diff_loss(solution) + return self._lossObj.diff_loss(solution, apply_weighting = apply_weighting) except Exception as e: # print(e) # print("parameters = " + str(theta)) return np.nan_to_num((np.ones(self._y.shape)*np.inf)) - def residualIV(self, theta=None): + def residualIV(self, theta=None, apply_weighting = True): """ Find the residuals given time points and the corresponding observations, with initial conditions. @@ -1083,6 +1096,9 @@ def residualIV(self, theta=None): ---------- theta: array like parameters and initial values of the states + apply_weighting: boolean + If True multiplies array of residuals by weightings, else raw + residuals returned. Returns ------- @@ -1105,7 +1121,7 @@ def residualIV(self, theta=None): try: # the solution does not include the origin solution = self._getSolution() - return self._lossObj.residual(solution) + return self._lossObj.residual(solution, apply_weighting = apply_weighting) except Exception as e: # print(e) return np.nan_to_num((np.ones(self._y.shape)*np.inf)) @@ -1571,20 +1587,20 @@ def _setWeight(self, n, p, w): elif m == 1: self._stateWeight = np.ones((n, p))*w else: - raise InputError("Number of input weights is not equal " + - "to the number of observations") + raise AssertionError("Number of input weights is not equal " + + "to the number of observations") elif p == m: if q == 1: self._stateWeight = np.ones((n, p))*w else: - raise InputError("Number of input weights is not equal " + - "to number of states") + raise AssertionError("Number of input weights is not equal " + + "to number of states") else: if q == 1 and m == 1: self._stateWeight = np.ones((n, p))*w else: - raise InputError("Number of input weights differs from " + - "the number of observations") + raise AssertionError("Number of input weights differs from " + + "the number of observations") def _setX0(self, x0): """ diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index b326c7bb..584fe228 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -49,29 +49,28 @@ def __init__(self, y, weights=None): self._numVar = 0 self._w = np.ones(self._y.shape) else: - self._w = check_array_type(weights) + self._w = check_array_type(weights,accept_booleans=True) + if np.any(self._w<0.0): + raise ValueError('No elements in numpy array of weights should be negative') + if np.all(self._w==0.0): + raise ValueError('All elements in numpy array of weights should not be 0.0') if len(self._w.shape) > 1: if 1 in self._w.shape: self._w = self._w.flatten() - if np.any(self._w<0.0): - raise ValueError('No elements in numpy array of weights should be negative') - if np.all(self._w==0.0): - raise ValueError('All elements in numpy array of weights should not be 0.0') - assert self._y.shape == self._w.shape, \ "Input weight not of the same size as y" - def residual(self, yhat, weighting_applied = True): + def residual(self, yhat, apply_weighting = True): ''' - Raw residuals returned if weighting_applied = False, else + Raw residuals returned if apply_weighting = False, else the weighted residuals. Parameters ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals returned. @@ -80,8 +79,8 @@ def residual(self, yhat, weighting_applied = True): :math:`y_{i} - \\hat{y}_{i}` ''' - if isinstance(weighting_applied,bool)==False: - raise TypeError('weighting_applied should be boolean') + if isinstance(apply_weighting,bool)==False: + raise TypeError('apply_weighting should be boolean') if len(yhat.shape) > 1: if 1 in yhat.shape: @@ -90,7 +89,7 @@ def residual(self, yhat, weighting_applied = True): resid = self._y - yhat else: resid = self._y - yhat - if weighting_applied == True: + if apply_weighting == True: resid *= self._w return resid @@ -108,10 +107,10 @@ class Square(baseloss_type): ''' def __init__(self, y, weights=None): - super().__init__(y, weights=None) + super().__init__(y, weights) self.loss(self._y) - def loss(self, yhat, weighting_applied = True): + def loss(self, yhat, apply_weighting = True): ''' Loss under square loss. Not really saying much here @@ -119,18 +118,17 @@ def loss(self, yhat, weighting_applied = True): ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. - Returns ------- :math:`\\sum_{i=1}^{n} (y-\\hat{y})^{2}` ''' - return (self.residual(yhat,weighting_applied)**2).sum() + return (self.residual(yhat, apply_weighting)**2).sum() - def diff_loss(self, yhat,weighting_applied=True): + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative under square loss. Assuming that we are solving the minimization problem i.e. our objective function is the @@ -140,7 +138,7 @@ def diff_loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -148,9 +146,9 @@ def diff_loss(self, yhat,weighting_applied=True): ------- :math:`-2(y_{i} - \\hat{y}_{i})` ''' - return -2*self.residual(yhat,weighting_applied) + return -2*self.residual(yhat, apply_weighting) - def diff2Loss(self, yhat): + def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the square loss. Which is simply 2. @@ -158,6 +156,11 @@ def diff2Loss(self, yhat): ---------- yhat: array like observations + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -181,8 +184,8 @@ class Normal(baseloss_type): sigma: float standard deviation ''' - def __init__(self, y, sigma=1.0,weight=None): - super().__init__(y, weights=None) + def __init__(self, y, sigma=1.0, weights=None): + super().__init__(y, weights) err_str = "Standard deviation not of the correct " if isinstance(sigma, np.ndarray): if np.any(sigma<0): @@ -212,7 +215,7 @@ def __init__(self, y, sigma=1.0,weight=None): self._sigma2 = self._sigma**2 self.loss(self._y) - def loss(self, yhat,weighting_applied=True): + def loss(self, yhat, apply_weighting=True): ''' The loss under a normal distribution. Defined as the negative log-likelihood here. @@ -221,7 +224,7 @@ def loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -234,7 +237,7 @@ def loss(self, yhat,weighting_applied=True): if 1 in yhat.shape: yhat = yhat.ravel() - r=self.residual(yhat,weighting_applied) + r=self.residual(yhat, apply_weighting) sigma=self._sigma # Calculate negative likelihood (depending on weighting of residuals). @@ -245,7 +248,7 @@ def loss(self, yhat,weighting_applied=True): logpdf_p5_alt= -r**2 / (2*sigma**2) return (-(logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4+logpdf_p5_alt)).sum() - def diff_loss(self, yhat,weighting_applied=True): + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative of the loss function which is :math:`\\sigma^{-1}(y - \\hat{y})` @@ -254,7 +257,7 @@ def diff_loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -264,10 +267,10 @@ def diff_loss(self, yhat,weighting_applied=True): :math:`\\nabla \\mathcal{L}(\\hat{y}, y)` ''' - r = self.residual(yhat,weighting_applied) + r = self.residual(yhat, apply_weighting) return -r/self._sigma2 - def diff2Loss(self, yhat): + def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the normal loss. @@ -275,6 +278,11 @@ def diff2Loss(self, yhat): ---------- yhat: array like observations + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -299,7 +307,7 @@ class Gamma(baseloss_type): ''' def __init__(self, y, shape=2.0, weights=None): - super().__init__(y, weights=None) + super().__init__(y, weights) err_str = "Shape is not of the correct " if isinstance(shape, np.ndarray): if np.any(shape<0): @@ -327,7 +335,7 @@ def __init__(self, y, shape=2.0, weights=None): raise TypeError(err_str + "type") self.loss(self._y) - def loss(self, yhat): + def loss(self, yhat, apply_weighting=True): ''' The loss under a gamma distribution. Defined as the negative log-likelihood of the gamma distirbution in terms of mean and shape. @@ -338,7 +346,11 @@ def loss(self, yhat): ---------- yhat: array like prediction - + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -351,7 +363,7 @@ def loss(self, yhat): return -gamma_mu_shape(x=self._y, mu=yhat,shape=self._shape,log=True).sum() - def diff_loss(self, yhat,weighting_applied=True): + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative of the loss function with respect to yhat which is See: @@ -361,7 +373,7 @@ def diff_loss(self, yhat,weighting_applied=True): ---------- yhat: array like prediction - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -372,10 +384,10 @@ def diff_loss(self, yhat,weighting_applied=True): ''' shape = self._shape - r = self.residual(yhat,weighting_applied) + r = self.residual(yhat, apply_weighting) return shape*-r/yhat**2 - def diff2Loss(self, yhat,weighting_applied=True): + def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the loss function with respect to yhat. See: @@ -385,7 +397,7 @@ def diff2Loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -401,7 +413,7 @@ def diff2Loss(self, yhat,weighting_applied=True): yhat = yhat.ravel() y = self._y shape = self._shape - r = self.residual(yhat,weighting_applied) + r = self.residual(yhat, apply_weighting) return shape*(r+y)/yhat**3 class Poisson(baseloss_type): @@ -415,10 +427,10 @@ class Poisson(baseloss_type): ''' def __init__(self, y, weights=None): - super().__init__(y, weights=None) + super().__init__(y, weights) self.loss(self._y) - def loss(self, yhat): + def loss(self, yhat,apply_weighting=True): ''' The loss under a normal distribution. Defined as the negative log-likelihood here. @@ -427,6 +439,11 @@ def loss(self, yhat): ---------- yhat: array like observation + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -439,7 +456,7 @@ def loss(self, yhat): # note that we input the standard deviation here return (-dpois(self._y, yhat, True)).sum() - def diff_loss(self, yhat,weighting_applied=True): + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative of the loss function, :math:`1 - y\\hat{y}^{-1}` @@ -447,7 +464,7 @@ def diff_loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -461,10 +478,10 @@ def diff_loss(self, yhat,weighting_applied=True): if 1 in yhat.shape: yhat = yhat.ravel() - r = self.residual(yhat,weighting_applied) + r = self.residual(yhat, apply_weighting) return -r/yhat - def diff2Loss(self, yhat): + def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the Poisson loss. @@ -472,6 +489,11 @@ def diff2Loss(self, yhat): ---------- yhat: array like observations + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -497,7 +519,7 @@ class NegBinom(baseloss_type): ''' def __init__(self, y, k=1.0, weights=None): - super().__init__(y, weights=None) + super().__init__(y, weights) err_str = "k (the overdispersion parameter) is not of the correct " if isinstance(k, np.ndarray): if np.any(k<0): @@ -526,7 +548,7 @@ def __init__(self, y, k=1.0, weights=None): self.loss(self._y) - def loss(self, yhat): + def loss(self, yhat, apply_weighting=True): ''' The loss under a Negative Binomial distribution. Defined as the negative log-likelihood of the Negative Binomial 2 distribution. @@ -535,6 +557,11 @@ def loss(self, yhat): ---------- yhat: array like observation + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -547,7 +574,7 @@ def loss(self, yhat): return (-dnbinom(self._y, mu=yhat,size=self._k,log=True)).sum() - def diff_loss(self, yhat,weighting_applied=True): + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative of the loss function with respect to yhat which is See: @@ -558,11 +585,13 @@ def diff_loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. - k: array like - observation - - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -577,11 +606,11 @@ def diff_loss(self, yhat,weighting_applied=True): yhat = yhat.ravel() k = self._k - r = self.residual(yhat,weighting_applied) + r = self.residual(yhat, apply_weighting) first_derivs_yhat = k*-r/(yhat*(k+yhat)) return first_derivs_yhat - def diff2Loss(self, yhat,weighting_applied=True): + def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the loss function with respect to yhat. See: @@ -592,11 +621,13 @@ def diff2Loss(self, yhat,weighting_applied=True): ---------- yhat: array like observation - - k: array like - observation + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. - weighting_applied: boolean + apply_weighting: boolean If True multiplies array of residuals by weightings, else raw residuals are used. @@ -611,7 +642,7 @@ def diff2Loss(self, yhat,weighting_applied=True): yhat = yhat.ravel() k = self._k - r = self.residual(yhat,weighting_applied) + r = self.residual(yhat, apply_weighting) scnd_derivs_yhat_p1= k scnd_derivs_yhat_p2= yhat**(-2) scnd_derivs_yhat_p3= (k + yhat)**(-2) diff --git a/pygom/model/ode_utils/checks_and_conversions.py b/pygom/model/ode_utils/checks_and_conversions.py index 9a2a06db..b9817d85 100644 --- a/pygom/model/ode_utils/checks_and_conversions.py +++ b/pygom/model/ode_utils/checks_and_conversions.py @@ -4,12 +4,10 @@ @author: edwin.tye ''' import numpy as np -from numbers import Number -from pygom.model._model_errors import InputError, ArrayError -def check_array_type(x): +def check_array_type(x,accept_booleans=False): ''' Check to see if the type of input is suitable. Only operate on one or two dimension arrays @@ -18,32 +16,52 @@ def check_array_type(x): ---------- x: array like which can be either a :class:`numpy.ndarray` or list or tuple + accept_boolean: boolean + If true boolean elements are accepted, else they are not. Returns ------- x: :class:`numpy.ndarray` checked and converted array ''' - + accepted_types = (int,float,complex) + if accept_booleans==True: + type_error_message = 'Expecting elements/sub-elements to be of type float, int, complex or boolean' + if accept_booleans==False: + type_error_message = 'Expecting elements/sub-elements to be of type float, int or complex' + + if isinstance(x, np.ndarray): pass elif isinstance(x, (list, tuple)): - if isinstance(x[0], Number): - x = np.array(x) + if all(isinstance(item, accepted_types) for item in x): + if accept_booleans==True: + x = np.array(x) + elif accept_booleans==False and all(not isinstance(item, bool) for item in x): + x = np.array(x) + else: + TypeError(type_error_message) elif isinstance(x[0], (list, tuple, np.ndarray)): - if isinstance(x[0][0], Number): + sub_items_accepted = [] + for item in x: + if accept_booleans==False: + sub_items_accepted.append(all(isinstance(sub_item, accepted_types) for sub_item in item)*all(not isinstance(sub_item, bool) for sub_item in item)) + if accept_booleans==True: + sub_items_accepted.append(all(isinstance(sub_item, accepted_types) for sub_item in item)) + if all(sub_items_accepted): x = np.array(x) else: - raise ArrayError("Expecting elements of float or int") + raise TypeError(type_error_message) else: - raise ArrayError("Expecting elements of float or int") - elif isinstance(x, Number): + raise TypeError(type_error_message) + elif isinstance(x, accepted_types): x = np.array([x]) else: - raise ArrayError("Expecting an array like object, got %s" % type(x)) + raise TypeError("Expecting an array like object, got %s" % type(x)) return x + def check_dimension(x, y): ''' Compare the length of two array like objects. Converting both to a numpy diff --git a/tests/test_loss_types.py b/tests/test_loss_types.py index c0345fa3..c4d7fc88 100644 --- a/tests/test_loss_types.py +++ b/tests/test_loss_types.py @@ -27,7 +27,7 @@ def setUp(self): self.t[1::], self.solution[1::,:], ['V', 'R']) self.r = obj.residual() - def test_FH_Square_scalar_weight(self): + def test_FH_scalar_weights_for_two_states(self): # weight for each component w = [2.0, 3.0] @@ -39,10 +39,10 @@ def test_FH_Square_scalar_weight(self): self.assertTrue(np.allclose(obj.cost(), s)) - def test_FH_Square_vector_weight(self): + def test_FH_vector_weights_for_two_states(self): # now the weight is a vector w = np.random.rand(29, 2) - obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], + obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], self.t[1::], self.solution[1::,:], ['V', 'R'], w) s = ((self.r * np.array(w))**2).sum() @@ -50,133 +50,176 @@ def test_FH_Square_vector_weight(self): self.assertTrue(np.allclose(obj.cost(), s)) - def test_FH_Square_1State_Fail(self): - ## totalFail = 0 - ## expectedFail = 4 + def test_FH_1State_weights_Failures_TypeErrors(self): w_list = list() - - w_list.append([-1.]) - w_list.append([0]) - w_list.append([2.0, 3.0]) - w_list.append(np.random.rand(30)) - + w_list.append(['a']) + w_list.append([True]) + test_weight=np.ones(len(self.solution[1::,-1])) + test_weight[-1]=False + w_list.append(test_weight) for w in w_list: - self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - 'R', w) - - def test_FH_Square_2State_Fail(self): - ## totalFail = 0 - ## expectedFail = 8 + with self.subTest('Weightings',w=w): + self.assertRaises(TypeError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', w) + + def test_FH_1State_weights_Failures_ValueErrors(self): w_list = list() - - w_list.append([-2.0]) - w_list.append([2.0, 3.0, 4.0]) - w_list.append([0.0, 0.0]) - w_list.append([1.0, -1.0]) - w_list.append(np.random.rand(30)) - w_list.append([np.random.rand(30), np.random.rand(31)]) - w_list.append([np.random.rand(31), np.random.rand(31)]) - w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) - + test_weight=np.ones(len(self.solution[1::,-1])) + w_list.append(-test_weight) + test_weight[-1]=-1 + w_list.append(test_weight) + w_list.append(np.zeros(len(self.solution[1::,-1]))) for w in w_list: - self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - 'R', w) - -class Test_Normal_loss_class(TestCase): - - def setUp(self): - # initial values - self.x0 = [-1.0, 1.0] - # params - self.param_eval = [('a', 0.2), ('b', 0.2),('c', 3.0)] - # the time points for our observations - self.t = np.linspace(0, 20, 30).astype('float64') - self.ode = common_models.FitzHugh(self.param_eval) - self.ode.initial_values = (self.x0, self.t[0]) - - # Standard. Find the solution which we will be used as - # "observations later" - self.solution = self.ode.integrate(self.t[1::]) - # initial guess - self.theta = [0.5, 0.5, 0.5] - - obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R']) - self.r = obj.residual() - - def test_FH_Normal_scalar_weight(self): - # weight for each component - w = [2.0, 3.0] - - s = 0 - for i in range(2): s += ((self.r[:,i]*w[i])**2).sum() - - obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R'], w) - - self.assertTrue(np.allclose(obj.cost(), s)) - - def test_FH_Normal_vector_weight(self): - # now the weight is a vector - w = np.random.rand(29, 2) - obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R'], w) - - s = ((self.r * np.array(w))**2).sum() - - self.assertTrue(np.allclose(obj.cost(), s)) - - def test_FH_Normal(self): - objFH = NormalLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R']) - - w = [2.0, 3.0] - objFH1 = NormalLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R'], w) - - # now the weight is a vector - w = np.random.rand(29, 2) - objFH2 = NormalLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R'], w) - - self.assertFalse(np.allclose(objFH.cost(), objFH1.cost())) - self.assertFalse(np.allclose(objFH1.cost(), objFH2.cost())) - - def test_FH_Normal_1State_Fail(self): - ## totalFail = 0 - ## expectedFail = 4 - w_list = list() - - w_list.append([-1.]) - w_list.append([0]) + with self.subTest('Weightings',w=w): + self.assertRaises(ValueError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', w) + + def test_FH_1State_weights_Failures_ShapeErrors(self): + w_list = list() w_list.append([2.0, 3.0]) w_list.append(np.random.rand(30)) - for w in w_list: - self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - 'R', w) + with self.subTest('Weightings',w=w): + self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', w) - def test_FH_Normal_2State_Fail(self): - ## totalFail = 0 - ## expectedFail = 8 + def test_FH_2State_weights_Failures_TypeErrors(self): w_list = list() - - w_list.append([-2.0]) - w_list.append([2.0, 3.0, 4.0]) - w_list.append([0.0, 0.0]) + w_list.append(['a','b']) + w_list.append([True,False]) + test_weight=np.ones(self.solution[1::,:].shape) + test_weight[-1,-1]=False + w_list.append(test_weight) + for w in w_list: + with self.subTest('Weightings',w=w): + self.assertRaises(TypeError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,:], + ['V', 'R'], w) + + def test_FH_2State_weights_Failures_ValueErrors(self): + w_list = list() + test_weight=np.ones(self.solution[1::,:].shape) + w_list.append(-test_weight) + test_weight[-1,-1]=-1 + w_list.append(test_weight) + w_list.append(np.zeros(self.solution[1::,:].shape)) w_list.append([1.0, -1.0]) + w_list.append([0, 0]) + for w in w_list: + with self.subTest('Weightings',w=w): + self.assertRaises(ValueError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,:], + ['V', 'R'], w) + + def test_FH_2State_weights_Failures_ShapeErrors(self): + w_list = list() + w_list.append([2.0, 3.0, 4.0]) w_list.append(np.random.rand(30)) w_list.append([np.random.rand(30), np.random.rand(31)]) w_list.append([np.random.rand(31), np.random.rand(31)]) w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) - for w in w_list: - self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - 'R', w) + with self.subTest('Weightings',w=w): + self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, + self.x0, self.t[0], self.t[1::], self.solution[1::,:], + ['V', 'R'], w) + +# class Test_Normal_loss_class(TestCase): + +# def setUp(self): +# # initial values +# self.x0 = [-1.0, 1.0] +# # params +# self.param_eval = [('a', 0.2), ('b', 0.2),('c', 3.0)] +# # the time points for our observations +# self.t = np.linspace(0, 20, 30).astype('float64') +# self.ode = common_models.FitzHugh(self.param_eval) +# self.ode.initial_values = (self.x0, self.t[0]) + +# # Standard. Find the solution which we will be used as +# # "observations later" +# self.solution = self.ode.integrate(self.t[1::]) +# # initial guess +# self.theta = [0.5, 0.5, 0.5] + +# obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], +# self.t[1::], self.solution[1::,:], ['V', 'R']) +# self.r = obj.residual() + +# def test_FH_Normal_scalar_weight(self): +# # weight for each component +# w = [2.0, 3.0] + +# s = 0 +# for i in range(2): s += ((self.r[:,i]*w[i])**2).sum() + +# obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], +# self.t[1::], self.solution[1::,:], ['V', 'R'], w) + +# self.assertTrue(np.allclose(obj.cost(), s)) + +# def test_FH_Normal_vector_weight(self): +# # now the weight is a vector +# w = np.random.rand(29, 2) +# obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], +# self.t[1::], self.solution[1::,:], ['V', 'R'], w) + +# s = ((self.r * np.array(w))**2).sum() + +# self.assertTrue(np.allclose(obj.cost(), s)) + +# def test_FH_Normal(self): +# objFH = NormalLoss(self.theta, self.ode, self.x0, self.t[0], +# self.t[1::], self.solution[1::,:], ['V', 'R']) + +# w = [2.0, 3.0] +# objFH1 = NormalLoss(self.theta, self.ode, self.x0, self.t[0], +# self.t[1::], self.solution[1::,:], ['V', 'R'], w) + +# # now the weight is a vector +# w = np.random.rand(29, 2) +# objFH2 = NormalLoss(self.theta, self.ode, self.x0, self.t[0], +# self.t[1::], self.solution[1::,:], ['V', 'R'], w) + +# self.assertFalse(np.allclose(objFH.cost(), objFH1.cost())) +# self.assertFalse(np.allclose(objFH1.cost(), objFH2.cost())) + +# def test_FH_Normal_1State_Fail(self): +# ## totalFail = 0 +# ## expectedFail = 4 +# w_list = list() + +# w_list.append([-1.]) +# w_list.append([0]) +# w_list.append([2.0, 3.0]) +# w_list.append(np.random.rand(30)) + +# for w in w_list: +# self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, +# self.x0, self.t[0], self.t[1::], self.solution[1::,:], +# 'R', w) + +# def test_FH_Normal_2State_Fail(self): +# ## totalFail = 0 +# ## expectedFail = 8 +# w_list = list() + +# w_list.append([-2.0]) +# w_list.append([2.0, 3.0, 4.0]) +# w_list.append([0.0, 0.0]) +# w_list.append([1.0, -1.0]) +# w_list.append(np.random.rand(30)) +# w_list.append([np.random.rand(30), np.random.rand(31)]) +# w_list.append([np.random.rand(31), np.random.rand(31)]) +# w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) + +# for w in w_list: +# self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, +# self.x0, self.t[0], self.t[1::], self.solution[1::,:], +# 'R', w) if __name__ == '__main__': From 9708ace03726b7e6e9007ff71bf2f771976c87d9 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Tue, 30 Jun 2020 17:11:26 +0100 Subject: [PATCH 010/188] Square loss and residuals Weights Unit tested ok --- ...s functions fitted to simulated data.ipynb | 1707 +++++++---------- pygom/loss/loss_type.py | 31 +- tests/test_loss_types.py | 171 +- 3 files changed, 778 insertions(+), 1131 deletions(-) diff --git a/notebooks/Testing loss functions fitted to simulated data.ipynb b/notebooks/Testing loss functions fitted to simulated data.ipynb index 573ea491..150ab517 100644 --- a/notebooks/Testing loss functions fitted to simulated data.ipynb +++ b/notebooks/Testing loss functions fitted to simulated data.ipynb @@ -51,7 +51,7 @@ "source": [ "# initial conditions \n", "N = 1e6\n", - "in_inf = 2\n", + "in_inf = 1\n", "init_state = [N - in_inf, in_inf, 0.0]\n", "# time \n", "t = np.arange (0 , 51 , 0.25)\n", @@ -87,7 +87,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -125,6 +125,15 @@ "execution_count": 6, "metadata": {}, "outputs": [], + "source": [ + "np.random.seed(42)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], "source": [ "def runif_noise(x,noise_prop):\n", " '''\n", @@ -141,16 +150,16 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([9.99998e+05, 2.00000e+00, 0.00000e+00])" + "array([9.99999e+05, 1.00000e+00, 0.00000e+00])" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -161,227 +170,227 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - ":4: RuntimeWarning: invalid value encountered in true_divide\n", + ":4: RuntimeWarning: invalid value encountered in true_divide\n", " (noised_data-data)/data\n" ] }, { "data": { "text/plain": [ - "array([[ 0.00000000e+00, 0.00000000e+00, nan],\n", - " [-1.73465915e-01, -1.17281547e-01, -2.25860015e-02],\n", - " [ 2.18875989e-03, -1.41630417e-01, -1.20285204e-01],\n", - " [ 3.10984783e-01, -1.16333578e-01, 2.95271450e-01],\n", - " [-2.69029696e-01, -1.99213726e-01, -1.90606565e-01],\n", - " [ 1.35684509e-01, 1.78379344e-01, 1.80962883e-01],\n", - " [-8.77803140e-02, 2.49616076e-01, -3.00454033e-02],\n", - " [-3.04094678e-02, -3.10164909e-01, 6.59761925e-02],\n", - " [ 4.77262892e-02, -1.92819030e-01, -1.39817160e-01],\n", - " [ 1.70193324e-01, 1.94346231e-01, 2.65605367e-01],\n", - " [-1.07254972e-01, 3.92049280e-02, -4.60377530e-02],\n", - " [ 2.25368182e-01, 1.68391679e-01, 5.02529134e-02],\n", - " [-2.73480406e-02, -2.43459230e-01, -2.72124777e-01],\n", - " [ 3.25378306e-01, 3.11198994e-01, -3.19891929e-01],\n", - " [-3.02732680e-02, -7.38888142e-02, -1.42714821e-01],\n", - " [ 1.94084991e-01, -2.12622683e-01, -1.15964568e-01],\n", - " [ 2.48373612e-01, 2.61208788e-01, 2.24903683e-01],\n", - " [ 1.37001895e-01, -1.85852789e-01, -1.18528471e-01],\n", - " [ 1.95169073e-01, 2.33950828e-01, 2.61071600e-01],\n", - " [ 2.94426553e-01, 1.78731291e-01, 1.97572440e-01],\n", - " [ 1.04043589e-01, -1.48204811e-01, -2.49256282e-01],\n", - " [-2.09591210e-01, 1.27888057e-01, 4.29371010e-02],\n", - " [-1.43084416e-01, -2.20412193e-01, -3.25009447e-01],\n", - " [ 6.33522507e-02, 1.53844079e-02, 2.99794892e-01],\n", - " [ 2.11100728e-01, -1.74071212e-01, -2.25674301e-01],\n", - " [-2.14296968e-02, -2.65530317e-01, 3.25590647e-02],\n", - " [-1.62179509e-01, -2.81708892e-01, -3.75237265e-02],\n", - " [-1.09534418e-01, -2.96644636e-01, -1.46756635e-01],\n", - " [ 1.97785675e-01, 1.21368330e-01, -8.52835473e-02],\n", - " [ 6.19544052e-02, 2.56309699e-01, 6.11246356e-02],\n", - " [ 2.00808833e-01, -1.42135844e-01, -2.13179622e-01],\n", - " [-2.16077990e-01, -2.86104187e-01, -2.95618164e-01],\n", - " [ 3.21509098e-01, 2.54100768e-01, 1.48586067e-01],\n", - " [-1.77056121e-01, 3.14195690e-01, -7.89813198e-02],\n", - " [ 9.52571895e-02, -2.93934351e-01, 2.32526004e-01],\n", - " [ 3.25502678e-01, 2.31769642e-01, -1.07617135e-02],\n", - " [ 2.35964481e-01, -1.33138709e-01, -1.72244039e-01],\n", - " [-1.66454417e-01, 2.45896187e-02, 3.26641177e-01],\n", - " [ 1.84816860e-01, 2.32456914e-01, 1.99283036e-01],\n", - " [ 8.91630169e-02, -4.65652026e-02, -1.29383851e-02],\n", - " [ 4.91988839e-02, 7.28993711e-02, -6.48891682e-02],\n", - " [-7.55111005e-02, -3.01904206e-01, -5.57502552e-02],\n", - " [ 8.02339702e-03, -2.71726635e-01, -1.62495983e-02],\n", - " [-6.36690889e-02, -2.96569398e-01, -9.48426199e-02],\n", - " [-3.10261981e-01, 2.49488644e-02, 2.99644152e-01],\n", - " [ 1.45286030e-01, 3.06316140e-01, -7.45581102e-03],\n", - " [ 3.07300545e-01, -3.22020626e-01, 1.49929309e-01],\n", - " [ 1.40175328e-01, -1.85315900e-02, -1.02966849e-01],\n", - " [ 1.18323765e-01, 3.24544502e-03, -3.14290184e-01],\n", - " [-2.91429133e-01, 2.87166606e-01, 2.99142261e-02],\n", - " [-5.48979385e-02, 8.98441545e-02, 1.03955500e-01],\n", - " [ 3.04884296e-01, -1.37771353e-01, 1.01023789e-01],\n", - " [-1.33848241e-01, -1.11395555e-01, 4.99581753e-02],\n", - " [-3.78918481e-02, -3.23665755e-01, -1.47739901e-01],\n", - " [ 2.21314141e-01, 2.82572816e-01, 4.72580803e-02],\n", - " [ 5.22709247e-02, -3.23988777e-01, -3.31099138e-02],\n", - " [ 4.41287378e-04, 1.12372308e-01, 1.25004212e-01],\n", - " [ 7.91370306e-02, -1.43266719e-01, 5.20809368e-02],\n", - " [-2.71529409e-01, 9.58139850e-02, -4.10690930e-02],\n", - " [-7.58599886e-02, 2.11473953e-01, 6.59916787e-02],\n", - " [-1.98114673e-02, 3.25925174e-01, -1.88900522e-02],\n", - " [-2.15236733e-01, -6.61674151e-03, -7.97228069e-02],\n", - " [-8.52869474e-02, -4.54868991e-02, 1.81776124e-01],\n", - " [-3.17873872e-01, -5.00410695e-03, 2.74312022e-01],\n", - " [-2.56697406e-01, -2.52524664e-01, 8.48325600e-02],\n", - " [ 6.87283327e-02, 2.55013582e-01, -1.14591512e-01],\n", - " [-2.63254784e-01, 3.03913765e-01, -3.04301181e-01],\n", - " [ 2.49161251e-01, -1.57671710e-01, 8.75571120e-02],\n", - " [-1.98673502e-01, 2.14671912e-01, -1.89495051e-01],\n", - " [-4.59403003e-02, 2.04353868e-01, 2.27361836e-01],\n", - " [ 7.64131802e-02, 2.52120942e-01, -1.75540234e-01],\n", - " [-1.95232206e-01, 1.69610425e-02, -1.35020865e-01],\n", - " [-2.15817787e-01, 1.22040324e-01, -2.56928157e-01],\n", - " [-3.28443088e-01, 3.26392955e-01, 9.71235957e-02],\n", - " [ 6.52615418e-02, 1.62982784e-01, -2.77772468e-01],\n", - " [-1.06954476e-01, -1.82748624e-01, -2.30851985e-01],\n", - " [-1.03560258e-01, 2.49776694e-01, 2.39589555e-01],\n", - " [-2.51361697e-01, -2.62613604e-01, -3.43346629e-02],\n", - " [ 5.52044588e-02, 1.71414602e-01, -1.18827697e-01],\n", - " [ 2.04645160e-01, -1.57695147e-01, -7.46836992e-02],\n", - " [-2.54150013e-01, 2.00084150e-01, -2.77762288e-01],\n", - " [ 1.91226654e-01, -1.15839953e-01, 1.95446804e-01],\n", - " [ 3.25631354e-01, -1.55219633e-01, -1.36220152e-01],\n", - " [ 8.59434276e-02, 2.44324599e-01, -1.80598534e-01],\n", - " [-4.41759258e-02, 2.88086579e-01, 2.32770906e-01],\n", - " [-2.27196580e-01, 2.72331912e-01, -1.53109214e-01],\n", - " [ 1.47937296e-01, -1.28297016e-01, -2.28099160e-01],\n", - " [ 9.75527646e-02, 3.31250187e-01, 1.80018836e-01],\n", - " [-2.40869627e-03, -2.62345740e-01, -2.93019352e-01],\n", - " [ 1.42517039e-01, -3.26917253e-01, 3.24664042e-01],\n", - " [ 2.66350592e-01, -1.89474157e-01, -3.76501731e-02],\n", - " [ 3.00491876e-01, 7.70405853e-02, 1.38895227e-01],\n", - " [-2.24919571e-01, 1.38375653e-04, -1.22365187e-01],\n", - " [ 1.89472971e-01, -6.99390524e-02, 1.75359377e-01],\n", - " [ 2.40847084e-01, 2.17245088e-01, -1.29960940e-01],\n", - " [ 1.17031088e-01, 1.25207417e-01, -2.13111306e-01],\n", - " [-1.48790790e-01, 2.42009355e-01, -2.72889122e-01],\n", - " [-6.55964475e-03, -2.67211611e-01, -2.75637870e-01],\n", - " [-1.85542712e-01, -7.13208125e-02, -1.43045237e-01],\n", - " [ 2.14837170e-01, 3.09019053e-01, -1.03940169e-01],\n", - " [-2.08291133e-01, -1.55812903e-01, -2.71145936e-01],\n", - " [-1.55833854e-01, -2.88308172e-01, 2.45174658e-01],\n", - " [-3.11004925e-01, 1.66460354e-01, 1.48310637e-01],\n", - " [ 1.11900762e-01, 1.59711839e-01, -1.06092199e-01],\n", - " [ 2.52702535e-01, 2.63918522e-01, 8.81508771e-02],\n", - " [-2.96912130e-01, 2.00037590e-01, -1.35534414e-01],\n", - " [ 2.57644746e-01, 2.17801439e-01, -1.37936016e-01],\n", - " [-2.21287471e-02, 1.87488209e-01, 6.54050559e-02],\n", - " [-3.13781890e-01, 8.90421404e-02, -2.65601600e-03],\n", - " [ 1.73633876e-02, 4.70498687e-02, 1.99892821e-01],\n", - " [-1.75870723e-01, -2.34269032e-01, -1.44870264e-01],\n", - " [ 2.60912112e-01, 8.12053627e-02, 3.86306769e-02],\n", - " [ 2.07535825e-01, -2.98946883e-01, -2.94085800e-01],\n", - " [-2.28341327e-02, -1.05874587e-01, 3.06311986e-03],\n", - " [ 2.88008753e-01, 1.71295755e-01, -1.44628284e-03],\n", - " [-3.12911107e-01, -1.94018364e-01, 1.04187514e-01],\n", - " [-2.65559378e-01, 1.87606865e-01, -3.14186465e-01],\n", - " [ 3.12564575e-01, -1.41561571e-01, 2.97041688e-01],\n", - " [-1.61079637e-01, -6.04344631e-02, -3.16709214e-01],\n", - " [-9.79493115e-02, 2.56336113e-01, 2.40368610e-01],\n", - " [ 2.07487179e-01, 1.37615049e-01, 3.01609274e-01],\n", - " [ 2.98452807e-01, -1.98587552e-01, -9.27371231e-02],\n", - " [ 1.34487459e-01, 1.37004951e-01, -2.08067897e-01],\n", - " [-3.24649739e-01, 2.79299579e-01, 2.42697497e-01],\n", - " [ 1.48755627e-01, -2.56194465e-02, 2.16687251e-01],\n", - " [ 2.82086858e-01, -2.73028509e-01, 1.49601622e-01],\n", - " [-2.90566692e-01, -1.46843110e-01, -4.20095301e-02],\n", - " [-2.02395486e-01, 2.76415604e-01, 2.92878761e-01],\n", - " [ 1.29300728e-01, -2.25682761e-01, -1.39203475e-01],\n", - " [-2.94574241e-01, -1.60448086e-02, -1.33783822e-01],\n", - " [-1.80234848e-01, 1.27149669e-01, 3.46658132e-02],\n", - " [-3.28310685e-01, 2.48574245e-01, 1.82136367e-01],\n", - " [-2.24348578e-01, 7.15601086e-02, -1.00090791e-01],\n", - " [ 1.35871520e-01, 1.78353047e-01, 1.14648325e-01],\n", - " [-2.93504246e-02, -7.33876121e-02, 2.60776669e-01],\n", - " [-9.32936487e-02, 2.09428551e-02, -2.79570179e-01],\n", - " [ 6.37399122e-02, 2.17366633e-01, 3.02729114e-01],\n", - " [ 9.07693126e-02, 1.59002147e-01, 2.41856391e-02],\n", - " [ 3.29090325e-01, -1.17795784e-01, -2.89107948e-01],\n", - " [-3.24646432e-02, 1.63737182e-01, 2.09973144e-02],\n", - " [ 1.80119330e-01, -6.34746381e-02, 2.19125711e-01],\n", - " [-1.39888719e-01, -8.80666022e-02, -1.42371440e-01],\n", - " [ 3.31763098e-01, 8.68652514e-02, 3.15174893e-01],\n", - " [-2.97656020e-01, 8.69786170e-02, -3.21062047e-01],\n", - " [-5.32967716e-02, -3.10244442e-01, 5.49010428e-02],\n", - " [-5.42176967e-02, -7.62270050e-02, -5.57502908e-02],\n", - " [-8.98274483e-02, -1.12891073e-01, -1.41591575e-01],\n", - " [ 3.26933775e-02, 1.13416765e-01, 9.83869429e-02],\n", - " [-8.30560535e-02, -1.24896527e-01, -2.28530639e-02],\n", - " [-2.50228276e-01, 1.14537667e-02, -3.41017652e-03],\n", - " [-1.38776547e-01, -2.50449609e-01, -6.21100653e-02],\n", - " [ 1.44905560e-01, -2.75800643e-01, 2.65509337e-01],\n", - " [-3.20089696e-01, 3.27402651e-01, -1.72856493e-01],\n", - " [ 1.15474683e-01, -2.45068819e-01, -4.92954020e-02],\n", - " [ 2.05133386e-01, 3.27483684e-01, -1.93659902e-01],\n", - " [-2.17767265e-01, 8.70771976e-02, 1.87124947e-01],\n", - " [ 7.27246238e-02, -1.40465442e-01, -2.69193721e-01],\n", - " [-9.97701910e-03, 1.07729750e-01, -2.68065630e-01],\n", - " [ 3.03733136e-01, 3.22867206e-01, 1.49238218e-01],\n", - " [-2.78795783e-01, -1.14419874e-02, -7.20286782e-02],\n", - " [ 2.27085067e-01, 2.25468966e-03, 3.30907780e-01],\n", - " [ 8.96872448e-02, 1.61653251e-02, 1.85384909e-01],\n", - " [ 2.09636861e-02, 1.59974804e-01, -2.01092462e-01],\n", - " [ 2.89371780e-01, -1.56939225e-01, 3.21132503e-01],\n", - " [-1.60498331e-01, -1.18765721e-01, 1.13698025e-01],\n", - " [ 2.58419878e-01, -2.43509871e-01, -2.62146111e-01],\n", - " [-1.73732340e-01, 2.78540447e-01, -3.26039184e-01],\n", - " [-1.90956096e-02, -2.53887573e-01, -1.00832029e-01],\n", - " [ 1.90229262e-01, -1.72023628e-01, -2.31129213e-01],\n", - " [ 1.64831891e-01, 1.42491962e-01, -1.59541848e-01],\n", - " [-2.63697330e-01, 2.50564149e-01, 1.62164895e-01],\n", - " [-3.05547702e-01, 1.00183246e-01, 7.41942823e-02],\n", - " [ 4.07308835e-02, -2.31988517e-01, -3.25882263e-01],\n", - " [-1.53928260e-01, 2.11032128e-01, 2.48124476e-01],\n", - " [-4.75569094e-02, 1.11467076e-01, 1.61397329e-01],\n", - " [ 3.24990686e-01, -2.25966590e-01, 2.50815594e-01],\n", - " [-1.51945789e-01, 1.08083714e-01, -2.81320222e-01],\n", - " [-1.04216758e-01, -1.04818192e-01, 2.88203609e-01],\n", - " [-3.03459319e-01, 2.11989847e-01, -1.60581341e-01],\n", - " [ 1.34966390e-01, -1.17862102e-01, -2.43005916e-02],\n", - " [ 2.27585955e-01, 2.97513116e-01, 3.23156970e-01],\n", - " [ 1.01935503e-02, 2.84152144e-01, 2.22278818e-01],\n", - " [-1.39242592e-01, -9.10229412e-02, 3.25125351e-01],\n", - " [ 1.61950734e-01, -2.86648561e-01, -4.84271868e-02],\n", - " [-3.14874702e-01, 1.87709580e-01, 9.93054614e-02],\n", - " [ 1.88947588e-01, 1.83665135e-01, -1.59567842e-01],\n", - " [ 8.29825603e-02, 1.67331153e-01, 4.33415390e-02],\n", - " [-4.90594041e-02, -2.91446169e-01, -1.04161328e-01],\n", - " [ 1.60369798e-01, -1.49862405e-01, -2.93917315e-02],\n", - " [ 3.12709890e-01, -4.68877085e-02, -1.28360996e-01],\n", - " [ 2.49744887e-01, 3.28753915e-01, 2.21007900e-01],\n", - " [-9.28652790e-02, -6.89210427e-02, 2.25952258e-01],\n", - " [-2.44509281e-01, 3.04169434e-01, -2.59243410e-01],\n", - " [-2.23974760e-01, -3.15196226e-01, -9.50514355e-02],\n", - " [-8.94209698e-02, 2.46512550e-01, -2.44376339e-02],\n", - " [-1.88389365e-01, -6.98384260e-02, 2.25805610e-01],\n", - " [-1.12387378e-01, 1.24293193e-01, 2.60368640e-01],\n", - " [-7.04497617e-02, 1.72365737e-02, 1.95754470e-01],\n", - " [ 4.28703247e-02, -1.06070454e-01, -1.66811253e-01],\n", - " [ 1.76556407e-01, -1.65162532e-01, 9.66494270e-02],\n", - " [-2.20010409e-01, -4.73485568e-02, -1.48941583e-01],\n", - " [-2.12488717e-01, -5.77153871e-03, 2.86460630e-01],\n", - " [-2.66543889e-01, 3.10357896e-01, 9.10328100e-02],\n", - " [-1.77407989e-02, -2.32471504e-01, -2.99887659e-01]])" + "array([[ 0. , 0. , nan],\n", + " [ 0.06577232, -0.22932091, -0.22933699],\n", + " [-0.29461093, 0.24411743, 0.06741001],\n", + " [ 0.13871505, -0.31961034, 0.31327323],\n", + " [ 0.22162843, -0.19177393, -0.21211669],\n", + " [-0.21106366, -0.13050517, 0.01650429],\n", + " [-0.04536999, -0.13918057, 0.0745686 ],\n", + " [-0.24033743, -0.13857023, -0.0890921 ],\n", + " [-0.02928668, 0.19011731, -0.20021748],\n", + " [ 0.00948963, 0.06160971, -0.30236639],\n", + " [ 0.07169657, -0.21965058, -0.2899656 ],\n", + " [ 0.29925702, 0.31042136, 0.20559823],\n", + " [-0.13025749, -0.26821859, 0.12282202],\n", + " [-0.03989834, -0.25197451, -0.00321539],\n", + " [-0.31040765, 0.27288027, -0.16081335],\n", + " [ 0.10834819, -0.12552595, 0.01337868],\n", + " [ 0.03114019, -0.21009703, 0.31305642],\n", + " [ 0.18342188, 0.29299929, 0.26321823],\n", + " [ 0.06526665, 0.28124949, -0.27433833],\n", + " [-0.20267809, -0.30318181, -0.11644645],\n", + " [-0.07421514, -0.15243398, 0.21915834],\n", + " [-0.09549778, -0.14604366, 0.02846406],\n", + " [-0.23938385, 0.20146465, -0.2836329 ],\n", + " [ 0.32459129, 0.18149651, -0.20085621],\n", + " [-0.32965192, 0.21030762, 0.1379049 ],\n", + " [ 0.15267145, 0.1808469 , -0.28397023],\n", + " [-0.09435618, -0.25608729, 0.24206895],\n", + " [ 0.08219875, -0.11273465, -0.2909611 ],\n", + " [-0.12601179, -0.11654445, 0.15307079],\n", + " [ 0.09170498, 0.25814183, -0.01852338],\n", + " [-0.25360384, 0.14216319, 0.1738567 ],\n", + " [ 0.04085147, 0.18064479, -0.00413627],\n", + " [ 0.01515522, -0.04830599, -0.31638725],\n", + " [-0.26140572, -0.31238054, 0.09094027],\n", + " [-0.12376268, 0.00571379, 0.27171098],\n", + " [-0.16713851, -0.05974472, 0.17036743],\n", + " [-0.18080122, -0.28201339, -0.1401657 ],\n", + " [-0.22585248, 0.2864651 , 0.20541359],\n", + " [ 0.08893584, 0.24764039, 0.20244805],\n", + " [-0.20895329, 0.261706 , 0.02622816],\n", + " [ 0.2049601 , 0.26406087, -0.12133102],\n", + " [-0.25996538, -0.18137656, -0.04859481],\n", + " [ 0.21200984, 0.24048706, -0.32869858],\n", + " [ 0.00716487, -0.05505933, -0.18526146],\n", + " [-0.25342309, -0.10825655, 0.29527314],\n", + " [-0.11786471, 0.01252708, 0.13534597],\n", + " [-0.0909136 , 0.31452139, 0.3082982 ],\n", + " [-0.16547847, -0.00183433, -0.13274779],\n", + " [-0.14343967, -0.30874204, 0.07304289],\n", + " [ 0.00178602, -0.29901417, -0.14756902],\n", + " [ 0.27217726, -0.17362541, -0.23673675],\n", + " [-0.00703149, 0.32376697, -0.17196315],\n", + " [ 0.11475703, 0.17441308, -0.1749083 ],\n", + " [ 0.15214423, -0.08814458, 0.08820389],\n", + " [ 0.08901981, 0.02384979, -0.27314015],\n", + " [ 0.223535 , -0.11947996, -0.20898766],\n", + " [-0.30614991, 0.0605953 , 0.11837624],\n", + " [-0.32227478, 0.00806204, -0.18233615],\n", + " [ 0.09678186, -0.21708905, 0.12729183],\n", + " [-0.07550977, 0.29115333, -0.2416527 ],\n", + " [-0.10595577, -0.25768432, 0.28312908],\n", + " [ 0.25155957, -0.16137225, 0.10665603],\n", + " [ 0.21148147, 0.03680054, 0.01976705],\n", + " [-0.17209847, -0.27126482, 0.26481051],\n", + " [ 0.26694537, 0.0887343 , -0.10731347],\n", + " [-0.10052695, 0.15063712, 0.26474017],\n", + " [ 0.25805762, 0.1865837 , 0.09468776],\n", + " [-0.27724002, -0.22558086, 0.26570279],\n", + " [ 0.07095271, -0.32720197, -0.26568564],\n", + " [ 0.10900118, -0.32995894, -0.22612797],\n", + " [ 0.03248919, 0.12793013, 0.10130751],\n", + " [-0.18382046, 0.14145281, -0.17516728],\n", + " [-0.1164002 , 0.1643276 , 0.09975527],\n", + " [ 0.23281561, 0.10507526, 0.04553907],\n", + " [-0.27088349, -0.08818946, -0.15653175],\n", + " [-0.17067357, 0.31534037, -0.07126818],\n", + " [ 0.26136437, 0.08742575, 0.19654087],\n", + " [ 0.00175806, 0.05126926, -0.0049882 ],\n", + " [-0.20317134, 0.14830141, -0.14615176],\n", + " [-0.31712269, 0.09698153, -0.21525955],\n", + " [ 0.29363906, 0.30261905, 0.27657626],\n", + " [-0.08656087, -0.32302892, 0.28554571],\n", + " [-0.04787723, 0.31110321, 0.30907998],\n", + " [ 0.23533964, -0.13703407, -0.07660151],\n", + " [ 0.23409111, -0.122052 , -0.22033817],\n", + " [ 0.03786751, 0.29076985, 0.13068653],\n", + " [ 0.04670745, -0.268549 , 0.07667148],\n", + " [ 0.32670257, -0.23994399, 0.01221977],\n", + " [ 0.25158205, 0.16051241, 0.13134383],\n", + " [ 0.13498939, -0.09367257, -0.13760544],\n", + " [ 0.20624077, 0.20674226, 0.24471488],\n", + " [ 0.2754937 , 0.0075616 , 0.00101086],\n", + " [ 0.19886345, 0.09997595, 0.13464458],\n", + " [ 0.19719511, 0.26000356, -0.10800323],\n", + " [-0.0829447 , -0.27067871, 0.05218676],\n", + " [-0.30937182, -0.02293465, 0.02842976],\n", + " [-0.14230583, 0.06055551, -0.31299983],\n", + " [-0.30843454, 0.21506704, -0.09320624],\n", + " [-0.24862632, 0.01482884, 0.1799957 ],\n", + " [-0.18945265, 0.08192698, -0.27643502],\n", + " [-0.29887885, 0.02090309, 0.02709008],\n", + " [ 0.09161993, 0.15072756, 0.31723472],\n", + " [ 0.0108669 , -0.11802902, 0.1967908 ],\n", + " [-0.1527785 , -0.04068572, -0.28102908],\n", + " [-0.31643284, 0.30843228, 0.22398675],\n", + " [ 0.13064947, -0.06069804, -0.21780379],\n", + " [-0.22904197, -0.16650473, 0.03281778],\n", + " [ 0.14306395, 0.10679825, -0.14671074],\n", + " [ 0.30324352, 0.15859794, 0.03623604],\n", + " [ 0.0744805 , -0.05359996, -0.16817934],\n", + " [-0.09601821, 0.17189741, -0.32373767],\n", + " [-0.25595157, -0.30266491, -0.3061808 ],\n", + " [ 0.23697372, 0.13577191, -0.01721745],\n", + " [-0.26811056, -0.00558942, -0.01768549],\n", + " [-0.21786542, -0.0440989 , -0.06766351],\n", + " [ 0.0772334 , 0.09006243, -0.30313066],\n", + " [-0.08359159, 0.08390661, 0.00209084],\n", + " [ 0.23765989, 0.10579575, -0.22471038],\n", + " [-0.2862875 , 0.09494619, -0.31565913],\n", + " [ 0.05718372, 0.29348683, 0.05031612],\n", + " [-0.07455338, 0.09552548, -0.02783141],\n", + " [ 0.03041119, 0.29430987, -0.07593157],\n", + " [ 0.30746038, 0.27023376, -0.20280591],\n", + " [-0.28709247, -0.266148 , -0.32118545],\n", + " [-0.27037136, 0.12200452, -0.28587423],\n", + " [-0.12068291, 0.22991687, -0.31781871],\n", + " [ 0.20964566, -0.14543015, -0.25455678],\n", + " [ 0.13115811, 0.0859619 , 0.25164801],\n", + " [ 0.15671403, 0.20232062, -0.14531028],\n", + " [-0.2150403 , 0.1670765 , 0.20455649],\n", + " [ 0.32700343, -0.05825488, -0.08532128],\n", + " [ 0.18427531, -0.10613097, 0.28717155],\n", + " [ 0.23894183, -0.04733732, 0.16724738],\n", + " [ 0.16969525, -0.26458409, 0.2683686 ],\n", + " [ 0.00350158, 0.21763831, -0.11996693],\n", + " [ 0.26368215, -0.07386555, -0.32610823],\n", + " [ 0.27025465, -0.27247555, -0.12045757],\n", + " [ 0.30004131, 0.30040476, 0.04895859],\n", + " [ 0.08789147, -0.03436965, -0.13785949],\n", + " [-0.11422364, 0.1150123 , 0.16824969],\n", + " [ 0.19438603, 0.19307876, -0.27252926],\n", + " [-0.0037198 , -0.29496083, 0.03301925],\n", + " [-0.03897967, 0.25846946, -0.09938999],\n", + " [-0.25528866, -0.23800555, 0.17434042],\n", + " [ 0.07881204, -0.26591822, -0.27726213],\n", + " [ 0.13397942, -0.28482466, 0.21457337],\n", + " [ 0.13749482, -0.27910081, -0.27677486],\n", + " [ 0.32442639, -0.08381947, -0.08623857],\n", + " [ 0.20853304, 0.29816572, 0.32400071],\n", + " [ 0.16891879, -0.08249361, -0.27766619],\n", + " [ 0.18476461, 0.03893617, -0.05051866],\n", + " [ 0.27090292, -0.25920168, -0.0049166 ],\n", + " [-0.32576424, -0.02089291, -0.29579782],\n", + " [-0.25412139, -0.2549825 , 0.09947353],\n", + " [ 0.16402992, 0.05557918, 0.30811503],\n", + " [-0.08341961, -0.14285861, 0.24573275],\n", + " [-0.18426944, 0.30881503, -0.32523035],\n", + " [ 0.31325255, -0.30456006, 0.26076208],\n", + " [ 0.01846741, 0.3286432 , -0.28413562],\n", + " [ 0.03590286, 0.31286836, 0.01539856],\n", + " [ 0.08626576, 0.13049913, -0.03030596],\n", + " [ 0.08503872, 0.05620954, 0.26743867],\n", + " [-0.30303575, -0.14602454, 0.30027432],\n", + " [ 0.26017586, -0.02956216, 0.0800884 ],\n", + " [-0.14841254, -0.20791923, -0.02420106],\n", + " [-0.09776518, 0.05577074, -0.28151024],\n", + " [ 0.31626321, 0.3241405 , 0.13210781],\n", + " [ 0.02406424, -0.12698159, 0.20919668],\n", + " [ 0.12315412, -0.22492204, 0.27395146],\n", + " [ 0.21502483, 0.29986661, 0.15047967],\n", + " [ 0.07561013, -0.05450464, 0.28848566],\n", + " [ 0.24404259, -0.30318755, -0.31575535],\n", + " [-0.08235776, 0.20703555, 0.32485075],\n", + " [-0.23305541, 0.06275381, -0.0794061 ],\n", + " [ 0.31327627, 0.22807928, 0.22555247],\n", + " [-0.02087123, -0.056787 , -0.15106195],\n", + " [-0.29574967, 0.24314825, 0.20860067],\n", + " [ 0.33314512, 0.33109122, 0.03695447],\n", + " [ 0.17932494, 0.29651049, 0.23309826],\n", + " [-0.1684346 , -0.03297058, -0.24722706],\n", + " [ 0.30270068, 0.07078309, -0.1809048 ],\n", + " [ 0.11446712, 0.07875216, -0.09455819],\n", + " [-0.25762827, 0.11438213, 0.01353847],\n", + " [ 0.18154559, 0.01344233, 0.23478767],\n", + " [ 0.03460456, 0.04062531, 0.2511024 ],\n", + " [-0.06434476, -0.24398985, -0.31414488],\n", + " [ 0.1700915 , 0.08020637, 0.13605318],\n", + " [-0.19135723, -0.24241902, -0.32363689],\n", + " [-0.09960829, 0.05994512, -0.0718373 ],\n", + " [-0.04168339, 0.26943913, -0.10116302],\n", + " [ 0.00932633, 0.18910201, -0.06897148],\n", + " [ 0.08139113, 0.24157581, 0.29968042],\n", + " [-0.23528435, 0.28439175, -0.0052558 ],\n", + " [-0.16117041, -0.02724283, 0.32002172],\n", + " [-0.00492127, -0.11416559, 0.0889339 ],\n", + " [-0.17323625, -0.28275778, -0.24741352],\n", + " [-0.24796944, -0.23206487, -0.24078188],\n", + " [ 0.0939165 , -0.21207994, -0.10288848],\n", + " [ 0.26452561, -0.01735891, 0.11170516],\n", + " [-0.21845342, -0.20514065, -0.30608759],\n", + " [-0.22070996, -0.14760644, -0.21532634],\n", + " [-0.27419831, -0.25290942, -0.02614749],\n", + " [-0.19577752, -0.09048676, 0.00227818],\n", + " [ 0.12692989, -0.30712524, 0.19960693]])" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -395,12 +404,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEDCAYAAAAlRP8qAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO2dfZBc11mnn3dGM9kZO1bilsKCnZkJKQc2FcVhrQ0fyS4JWogtE5y4gI0ZK8IOTCkCStldSEKmFmOo4cN/UBZFZCOCHa3UOOUFkzhBIcsaQsICi22IozjBiSvRKMIUlkZEtjyqSJp594/bV7rTcz/O7ft9+32qpma6+3b3OXfufc85v/fjiKpiGIZhNJ+RqhtgGIZh5IMZdMMwjJZgBt0wDKMlmEE3DMNoCWbQDcMwWoIZdMMwjJZQqUEXkftE5FkR+YLj8T8uIl8UkSdF5A+Kbp9hGEaTkCrj0EXkPwFngP+pqq9JOPYa4EHgB1T1X0XkZar6bBntNAzDaAKVztBV9TPAqeBzIvJKEflTEXlcRD4rIt/Ze+mngQ+q6r/23mvG3DAMI0AdNfT9wM+p6nXAzwP7es+/CniViPxfEflbEbm+shYahmHUkA1VNyCIiFwOfB/wv0TEf/pFvd8bgGuANwFXA58Vkdeo6jfKbqdhGEYdqZVBx1sxfENVXxfy2nHgb1X1PPA1EXkKz8A/WmYDDcMw6kqtJBdVfQ7PWP8YgHhc23v5o8Cbe89vwpNgvlpJQw3DMGpI1WGLDwB/A3yHiBwXkXcBs8C7ROQJ4Engpt7hnwKWROSLwF8Av6CqS1W02zAMo45UGrZoGIZh5EetJBfDMAxjcCpzim7atElnZmaq+nrDMIxG8vjjj59U1c1hr1Vm0GdmZnjssceq+nrDMIxGIiKLUa+Z5GIYhtESzKAbhmG0BDPohmEYLcEMumEYRkswg24YhtESzKAbhlEK3SNdZu6eYeTOEWbunqF7pFt1k1pH3YpzGYbRQrpHusx9fI7l88sALJ5eZO7jcwDMbpkt/LvnH5nn2OljXDlxJQCnzp5iauMUC9sWCv/+Mqks9X/r1q1qceiGMRzM3D3D4un14dOdiQ6Xj1/OsdPHCjGw/QNJP5Njk+x/6/5GGXUReVxVt4a91njJpduFmRkYGfF+d20VZxjOlCWDHDt9LPT5pbNLLJ5eRNGLs/Y82zD/yHykMQdYPr/M/CPzuX1f1TTaoHe7MDcHi4ug6v2emzOjbhgu+LPXIg2qz9TGKafj8jawUQNJ2mOaQqMN+vw8LPcNvsvL3vOGUXeKnh0nfX7Y7LWoGevCtgUmxyadjs3TwLoMJK6DTRNotEE/FvF/j3reaCdNiZ4ItnPTXZu4/WO3O8+O0/bRZfYdZTiLmLHObpll/1v3M71xGkGY3jhNZ6ITemyeBjZpIJkcm2Rh20Ju31c1jTboUxH/96jnjfZRpmyQhf52Lp1d4tzKuTXHRM2OB+mjy+w7ynAWNWOd3TLL0fccZfWOVY6+5yh7b9i7ztjmYWCDg9/8I/PsvHbnxYGkM9GhM9G5OKiU4RAtc8LR6CgXX0MPyi6Tk7B/P8w2x2ltZCAqemJ64zRH33O0/AZFENXOfgRh9Y5Vp/fG9XHkzhGU9fd28PPDIkDKjvoIhhTmEeVShz4V3Z7WRrnMznrGe3oaRLzfZsyHizJlgyy4tidsdjxIH11m32EySNmGr3/WnvW7y/QL1LE9jTbo4Bnvo0dhddX7bcZ8uChbNhgUl/ZEyQ2D9DFMOw77/EENal39FnUb4MtuT+MNujHcuBquqglr59jImJOem6aPvqHd8dAOJjZMFKIX19lvUcUAHze4ld0eS/03Go1voPLUYYsgSztd39uv1y6dXWJybJKDNx/M9XzEyQhlnvewlP6ls0sIssZ/UOQAn1TSYGHbQqiGXlR7Gu0UNQzjEmU5iF0crkWTlNLvG/XpjdOFDvAu5zxvx2+cU9Rm6IZRI7Lc/GXptVMbp0KNWJl+i6SUft+YFx3p5HLOZ7fMlrZyMQ3dMHqU6egL+66s2nRZem0d/BZ1Semvm1PeDLphUK6jL+q79nxyT6YQt7IMbR3CHQdJ6R9kwPbfI3cKG35lA3KnrHnv9mu2I8ia91TplDcN3TAoN0HJNcnIJ4027SLZ5K3pVkHasriDJPjEfcfk2CQ7r93JgScOrHldEHZt3cW+G/dl6V4scRq6GXTDoFxHX9R3RdGZ6HDyvSdz+e66ZVJmIc3GFYMM2EkD76iMsqIrqT4zDzI5RUXkPuCHgWdV9TUhr88C7+s9PAO8W1WfyNBewyidMh19Ud/Vmejw3Def4/zq+TXPP3/uebpHurkY3LqEHOZBGmfjIA7jJA0+zJi7vK9IXDT0DwPXx7z+NeD7VfW1wK8C+3NoV2HYhhhGGGU6+qK+a+8Ne7niRVesO/7cyrncUsXrlklZFoM4L5MG81EZDX1e0cqyZxMNuqp+BjgV8/pfq+q/9h7+LXB1Tm3LHdsQo5mUEX0yiKNv0HbFfdeps+G3Wl4Gt25RGWUxyIAdV3p3cmySuevmIl+vKnvWSUMXkRngE2GSS99xPw98p6r+VNJnVqGhz8x4Rryf6WmvDoxRP+qq+RbVrqKds0Wfzzo7ZQf5Xv89i6cXL2rmwWSl4OthFKGnZ3aKuhh0EXkzsA94o6ouRRwzB8wBTE1NXbcYZl0LZGTEm5mvb5dX3MsohzQ3Vl3L4xbVrrQGN4uRytugurS9rgN0Vsp0qhdu0EXktcAfAzeo6pddGlWnGTp4s/SFBavWWDRpb+g6pJmHUWS7XA1u3YyjyyBX1wE6K2X2q9B66CIyBTwE7HA15mXjO0IXF73ZeBimp5dD2vrQddV8i2yXa0nbutX+dnG4DuqUjfJX1KWMbx2yZ8HBoIvIA8DfAN8hIsdF5F0isktEdvUO+SWgA+wTkc+JSK2Cy4OOUPAklyijbhtMR5PXjZP2hq7LjdJPHdpVt4gVl0FukIEwKrN295/srk0Z3zpkz8IQJBbFySxhmJ6+njyX9oNUp9t+zXYOf+XwGgkC3MrJFul8qzrjsm7yRdh1MjYyxhUvuuJiws/2a7avy65Mupai+llVYk/VtHYLOheOpZys2AbT63Fd2rvM4pNmtmGzsQNPHGBh28JFCQJInJmVUZsl7+3T+kk6n3VYJQTpn6V2JjqICEtnl9b8L4ObNrvMZKNWHHVM7KmaVhn0sKShKAPd6XgbSgeZnPQco8ZaXJb2rgY0aWnqMnjkdUydcTmfdVnmBwkOcpePX865lXNrXl8+v8zhrxxONRBGyTFRiT1V+1eqpDWSi6+VLwfu4clJ2LkTDhxY//z+Xj7r/Lw3i5+asiiXKMqMXnCJHsnrmDCqllF86ianDEJekUBRkl9Ycaw2hEAmMRSSy/z8WqMN3uPDhz3jPT3t6ePT097j2VnbYNoVl6V9Xg66vBxreTrfqnCy1c3hOQh5RQJFrUT23bivdiuUqmmNQY/Syo8dM8OdFZelfV43r8vgkdcx/dRJpqlruGYaXP8HLr6XKH9F0X6MptEagx6llZuTMx+Sbpy8HHQug0fcMVl2va/TrHiQ81mXmGwfl/9lnVZFbaD1GrovrxjFU7X+nDW8sm66dZrzWbesUVfqds6bwNBscNHtmpNzmMlqHIowimUNckXWlimy/VWWdiiyb0V+9tAYdGO4ycM45HkjljlrLsIwltH+qmboRfbNJcEqy3VlBt0YCuq2fK/DPqVZvquM9lclFRXZN5c9Y7P0cSjCFg0j78zJrE7GMp2sRWSNltH+tMlRVdUUyuOzgxQVPZW4p6hhNIVgtmlWyaR/5uhHXwS/J4ky9ynNs+8+ZbXfdW/QPP4nPkX2Leqz+yliYLcZuhFL3ULhksgrLjmPmPSya63kHZNdt1oxeeYJFNm3uK3rghQxsJtBNyIZ5hjhqNnT4ulF5wGujrVW4ugfvIFatT9PmaTI/01YkbLx0fE1xxQ1MLbaKWphjNmom5OxTKL6LsiaaJImxHq70IQ49iZfj3lGTw2lUzS4sYWq7Ug0CHXKnCybsGVzvzGHZlVwjKNOZQ+iKFImKVpaLKtEQWsNelSxLtuRyJ286ok0TYeH8CV5WJw3tGOAa8LgXZRM0iZpsbWSy8iINzPvx3YkciePZXgTlvKuxC35F7YtlFr2IO9MxCbLGVlpWt+HUnKxYl3ZyWNG1ISlvCtRS/7t12wvdYaXdkYZXCFtumsTm+7atG61VLeIljJpwurEldYa9IUF25EoD7Jqf226WaIGuMNfOVzqoJVmkOw3/ktnl9ZsCecPBE2LyMmTNpQq9mmt5AIW5VIHmracHYSyC0yl+T6XNPQ2/S8GoWmyYCbJRUTuE5FnReQLEa+LiPy2iDwtIp8XkX+ftcFRBPcM3bTJ+wnuH9qPbWxRPE3byLgIyp7hpfk+l5VQE1dLedKm1YmL5PJh4PqY128Arun9zAH3ZG/WevrDEJeWvB8LSayOpm5knDdRIY5+ElLeWnqaQdJlUHEdeJoYreRKW3Y+cpJcRGQG+ISqvibktd8FPq2qD/QePwW8SVX/Oe4z00ouMzOe4Y5jetqbibedqjaS6P/eM+fOsHR2ad1xbV/Ch51/8LTtxdOL6+LVBWHX1l3su3FfoW0IuwbC5IQgrtJC02SJNpO5fG6CQf8E8Buq+le9x48A71PVddZaRObwZvFMTU1dt5hkoQNEhSGu/fz2hyRWdWMlGYYgZWxOUBVJ5z8uw/TgzQcrMX5B43/lxJUAqetyD4MvpCkUHbYoIc+Fml5V3a+qW1V16+bNm1N9iUu44TCEJOYZBphmCR32vVE0MTrAlaTzH6VHK1pZqGZQTjj53pOcfO/JVNJC90g30rFad/29KJmorvJTHgb9OPDywOOrgWdy+Nw1hIUhBukPSQw6UKOcpk0krzDAtLHMrp/fNodnP0nnP24wq7vxC8O/TqKo8+A9aAZokrGuc2ZpHgb9YeCdvWiX7wFOJ+nngzA76234PD3tSSudjvcj4j0X3Ay6zXVc8oqoSDvTj/r8zkSn1Q7PfpLO/8K2BSR00Vpv4xdF3Mqs7oP3IKtZF2Nd52Q5l7DFB4C/Ab5DRI6LyLtEZJeI7Oodchj4KvA08HvA7qIaGwxDPHnS+wkLSWxzHZe8wgDTzvSjvnfvDXtbER3gStL5n90yy66tu9YZ9UGNX9VL+7hVRd0H70FWsy7Gus7JcokGXVVvUdVvVdUxVb1aVX9fVe9V1Xt7r6uq/oyqvlJVt4Q5Q8vmWMR5jXo+lJpqNnmFAaad6Q9D+KELLudh3437OHjzwcznqg5L+6jrYXrj9MX+VD3oRBF3jUe12cVY1zmztJWZolEhjs5hjb5mE5zmT06u1XUaTlS0xs5rd3L4K4dLD4nMSlWhnEVSVWRJf1TM8+ee59zKuYuvB6N66hzOGHeNH3jiQGib/dDTfoLnvOo+D11xrsx1XNqs2fQIm2n6F3odnT1x1GEmWwRVLO3Dar+oKp2JzsXddyY2TLDjoR3M3D3Dnk/uqa2ePEjtHRdJs86r1VbO0CFjHZchrb3b1FjjprY7iSr6lVQieNBchDqtoJJq4dSprWEM3Qwd4uu4JMrjUQHtIyO10dLzxNcTy441zkt7rbOTKgtV1MGJO5eD5iLUbQWVpIE3uQxA6wx6krF2CmmMCnpfWWlc/GOamNooinD25HmT19lJlYUqlvZx53LQXIS6hfm1uWBcqwy6i7F2ksf9oPfR0fVf0hAtvXuky6a7NnHrQ7emjqkNUtSFnudN3uYbtOzZYty5HDQXoW4rqKwDZV2jeqBlGrpLdEsqebwBWnpUoag4rTOowUbpif5xRemHedcQr7vuGUfd2h7VnkGjOwbxBdTtnATbVXVUT+biXEVQhEF3sb+pQhozxz8WS9TFNbFhIrQKYhBBKq2Y2FZHZlry2re1LOM3yHel7WOVRjOpf3W4bofGKeqyj2iqkMaa72MXJVskGXPgogTz3DefY3x0fM1rZcgVZdcQrytZpaeyHY6DSEBpJY6qNHeXc1k3+aifVhn0OPvrO0t37ICJieg6MGvoLyATe3D55HERnV89z4vHX1x6TG3wJgfW1BAvMwoiSg8tSyfNaiDq5nCMIs1AUJXRdDmXdXfAt8qgR9lfWL/b0dmzcPCgw9Z0Je5jl9aIxDmp+me/cZw6e2rNzQaUYsz8m3x64/Q6Pb3KGdnuP9ld2qw3q4Go+4xxEKoymlHnLLhqrLsDvlUGHcLtbxMSPwdZOscVzArOfpOoOma4bjOy/Y/vL23Wm9VA1H3GOAhVGc24c+bfB0Bts0ShhQY9jFyKdRXMIEvnOG3Sn/1GlXL1qUPMcN5GyXWlEzVgrOhKquOzkEZf9vsldwobfmUDcqdw5tyZSnwgRVJVan3YQBLEvw/qnHjUqiiXKGoerALkH8bnE5cBGhaWWFQ74sgzqiHss3x9vr+/UedmVEYjjTp4ktbeG/aWeiPHbQE4NjLGFS+6IvW2cnERHXUNGywav99R90ya+6Coczg0US5R1DxYBShu6Ry1fD1086E1swt/9hcVk17kEj7PGVnYCiPK2Rp1buaum4udqS2dXeL2j91O90i3NOdpXALY+dXzXD5+eept5aKktbql6pdJ0K8Thut9UNU5HAqDnluwSoE10ovSDV2MZVL6f5FLeN8g7nhoBwAHbz6YaRmbJIv4y2Z/9rR8fplR8TKC/XOz78Z9iT6Icyvn2PPJPaXdtEn9SisHxUlrdYucGWTQTPOesGOz3o9VncOhkFxyoYQa6Xkt0Vw+J3jMiIxESgxFZovGSS3AQOciTmIKMjk26STxxGXSRlFEkklSv9J+Z5y0BpQuu0UxiByX5j15X4N5SjZRtC5TNFNp3EFpghCP28Ucp8f2M71xujAdNcpIdSY6nL1wdiBN3aVvURp5mFF0HSCCFGH44vo1iL8hLuMRcMqGLENnHyQzM8178sz8dLn28hjsW6WhV7YBdBNCZXBb6rmWQfUzN4uSE6JkgqWzS6F92PPJPYnL6LCEpSCTY5OpolgWti0wNjK27vnx0XE6E53QzynC39Dfr36ZKK0hjZMUXOSGsjTiQUJa07wnz5DZqgrdBWmcQa8sptylrkANcLlAXS7WYOamT1B/TjKsLsekNXxLZ5ecDIjv2NI7NHRvzzQOr9kts9z/tvvXGO/ORIf7brqPvTfsLTVeOtivC790Ab1DB/Y3JIW8JvldytKIBwkWSPOePIMR4u6rskIvGye5VFYAsaR9RrMuY12WkHHhequ6ytTGqViZIUl/dtUwsxQXC+uXK3mHSQ5jeF9ZVTqr1NDTtr+swl2ZJRcRuV5EnhKRp0Xk/SGvbxSRj4vIEyLypIjclrXRUVQ2US6hrksey1iX5XLUMQfefuBi6FvULHZURgeSdMJmb1EzwbCZbxSDLI3zDJOsc5JJkbhkVaaNLAljkP9VmvfkeS3UoSxA4gxdREaBLwM/CBwHHgVuUdUvBo75ALBRVd8nIpuBp4B/q6rnwj4TBp+hlzRRroS8Rvi0US5hx0TNXKI0wqAjMI/kpGC0QFyiz7CV260LWRyAdagpXhRlrNjiZugbHN7/euBpVf1q78M+AtwEfDFwjAIvFhEBLgdOARcytToC32iXHuVSAnk5aHwdNMsx/mv9F2dUSFZwxhYl2aTRJf3vjzMaTU9xD9I06SZ4faTdizZuBVfnPrvgcu8ViYtBvwr4euDxceC7+475HeBh4BngxcB/UdV1UzERmQPmAKYyaCSzs+0w4P3kYQjzJOriDJtd9Us6Sce4EBc1UGR8fNn0z1iDhaDq3D//+ohaWUZdt22sEFkXXDT0sOpO/evptwCfA74NeB3wOyJyxbo3qe5X1a2qunXz5s2pG9t26qDBJZGkOcZlYKY1TlE3uCCp9eo67wNZt8zMtKS9bttYIbIuuBj048DLA4+vxpuJB7kNeEg9nga+BnxnPk0cHtI6aKoyUlGOwP4SAiu6cvHGHmSmmdeNX/faJE2fsaa9bl0HgDoPwnXFxSm6Ac8pug34Jzyn6E+o6pOBY+4B/kVVf1lEvgX4e+BaVT0Z9bmNS/2vGXV0LOUdtpVXH+uwD2QcdW9fEQzqlG+D4zQrmVP/RWQ7cDcwCtynqgsisgtAVe8VkW8DPgx8K55E8xuqeijuM82gZ6NORqDI+hV5OAurKAmcBjNe66nT9V03ska5oKqHgcN9z90b+PsZ4IeyNNJIR12W6S7ha1m00X7HrL8MT2Pg6+Zs7icqomhYjTnU5/puGo1L/c+bAivixn9vRn2wLo6lMutXDKqFN8XZPIwJSkGC98SIhJumKgfhJmj6rTDogxrlqgp9lZURWgZp61dkuSkGjQapakuzYSVsqzyXmuTBeyIskazKQbjujnWfxtVy6SdL5mhVFXHLzAgtmjR9yaoV110LNwYv8+tSX6hKGapOmn6ryuf2k6X6YlUVcQfRB8NmtmmX6UUsGdOsFLLGWxclMzVhKZ2WqvoUJ8HF/a+jrv1VXa30+k5qX900/cYb9CxGuT9Z9Ra6fI0ZLmixgnpaw+Sy3Eu6mItaMqaRM7LeFFllpjApYNNdm7j9Y7fXfimdhrD/9W0fvY1Nd20q3MAPulVe1sG6aEmkLj6rJBpv0LNUXwxuHn0LXX6POWZYZIRiBfW0hilpZutyMReZjei6Ush6U2TRwsOSnsCrsX5uZW0NuSZlaYYR9r8+v3qepbNLhQ9aSf/LqNfrvodnXXxWSTTeoAeNss/kpPd8EsGKuL/GPJeRQrvJEB6T1jAlzWxdLuYqloz9q4bt12zPfFMMGg3iukuTzyDnpS7SjUvbixq0wgyfT9z/OqvjuujrOy/HetHXSOOdopB9j9FuF265dcSbmfcTtnNGyTV8kxwyLs7Csp06UQ7Qndfu5PBXDoc6cot08qbd7HkQB3VdkoNc90EtypkcVvq46GJqdXJaRpHXNdJqpyh4NvToUc/uHj2a3qbOz8MxUmg3Je+Dl7Tcc5Eyyl4yRq0a7nnsHgAO3nwwsg6MqyyQZraTRuvMqzJkVdJN3Cw5SFH6b55b5bnSBEmkjGukFQY9K8eOwQdY4AXWXhAvEKHdlBAeEzRWez65Z81mx52JzppR3eViLjsWO26pm4fGn3YAiDNyYyNjdCY6mc5L3JI/+L/cdNemwp2T/f/rzkSH8dHxNceEbfpcB7loUJqQa1CG7NkKySUrfjz6LXT5NeaZ4hjHmOK3Ogv89smQC6LgAPakdHp/A+fgMrYOMelBXJb9weVw2hjzQZbYRUoBUe3pTHQ4e+Fs7CYdZRieuOujTnJRHrtt1ZW8ZKHMxbmKoE4GPbUkXrCG7qqBQn2LOLnUeMmi8dctySjLhtdV67x10Z9dBpY6DT5pMQ29JBL3f+6PaIFCN4xOswSra4hdcAkcRRaNv25xwVFL/lNnTyW+t+rklLokzbjIbnXyVaSlDFnIZuhJVLArdZoZOtQ/9d11ZpJmKd2UmVpa6akK6jJDd1l11W1lVgU2Q89CjhEtro6nhW0La5ygSdQtW60f15lJmhjzJjjBIDnipA6RGHWJEHFZddVtZVY3bIaexMiIV4qxn7D49H4CAfLd77+SuTc/z7JeykqMm1HKnW4Gvc7OK8MjeK6unLgSgFNnT9XqvNXh/9l2DT0vzCmahUEjWvqkmpn3wOJLQj4mYlkbFzVx+fjltb/xDGMQ2hzlkhdm0LMwqIbeNxCM3AEaMumO0v7qbDTrorkaxjBiGnoWEkNgIuhLMpo6HX5YlPZXZ424LlERhmGsxWboRdE3Q+9ugbm3wnIgYS+ptkldsRm6YVSHzdDLptuFM2fWPDV7BPZ/aozpDZdSzHdeu5MDTxxoXC3uukRFGIaxFieDLiLXi8hTIvK0iLw/4pg3icjnRORJEfnLfJvZIHzNfakvO7DTYfa/3s/R+ZMXw/IOf+VwI5Mk6iwHGcYwkyi5iMgo8GXgB4HjwKPALar6xcAxLwH+GrheVY+JyMtU9dm4z22t5JIiKsaSJAzDSEtWyeX1wNOq+lVVPQd8BLip75ifAB5S1WMASca81aSoxGhJEoZh5ImLQb8K+Hrg8fHec0FeBbxURD4tIo+LyDvDPkhE5kTkMRF57MSJE4O1uO6k2BPPtGjDMPLExaCHpSz26wQbgOuAG4G3AP9DRF617k2q+1V1q6pu3bx5c+rGlkaG7eXS7IlnWrRhGHmyweGY48DLA4+vBp4JOeakqr4AvCAinwGuxdPem0V/IpG/WTS4FePyj3HcE292y6wZcMMwcsFlhv4ocI2IvEJExoF3AA/3HfMx4D+KyAYRmQS+G/hSvk0tiaRiXC6z96x74hmGYQxAokFX1QvAzwKfwjPSD6rqkyKyS0R29Y75EvCnwOeBvwM+pKpfKK7ZBRLn1PRn74uLXsEuf/buKsn4g4EIbNjg/U4r6cR9fMO3ETMMIxuWKdpPXNghDL71XFhNGJ8c6qvXufaLYRj5YZmiaYhzakbN3hcXk2faASmnu8Wrvjhyh/e7+8rB6quv+fgG7+RiGEY+mEHvJ64YV1RIIiTLL73BwK/psvgSr/ri4kvgtptg048vZpJKrGCWYRhm0MOIcmqGzd6DxO1k1BsM5retLdAFcH4DLF1GpnoulqRkGIYZ9DQEZ+9RBGSZNU7Knz5D97oxjm1M/ppBpBJLUjIMwwx6WvzZe5RR783EfSflxUqKF5aY+xHhym+6nfK0UoklKRmG4ZJYZISxsBC+k1EvIzTUSannmHhph8kLZ9e91s8gUoklKRnGcGMz9EFJ2MkoaoZ96uypNTPpzkSH8dG1orpJJYZhDILFoRdEml19hn3TW8Mw3ImLQzfJpSAWti2EJvqEzbxNKjEMIw9McikIc1IahlE2JrkE6HadiyQahmFUgqX+O5C17lamLx609rphGEYAM+g9kqrmxjKoUa5sFDEMo42Y5NJjZMSzqf2IeBUAIgmrouhaPTHFhtKGYRhgkosTKbYCXUuWqX2KDaUNwzCSMIPeI8VWoGvJYpQHHkUMwzDWYwa9R0LiZzRZjPLAo4hhGMZ6zKAHGGgr0BCj3N0CM+9cSq5vPvAoYtGVl4AAABGASURBVBiGsR5ziubB7t1w772genEDi2DN88kLwv6PKbPPTVtwu2EYmTCnaNEcPnwxRCZsA4vlDcr8Niws0TCMQnEy6CJyvYg8JSJPi8j7Y477DyKyIiI/ml8T68mazSvevkh3i/d81AYWixsd9w+1RCPDMAYksTiXiIwCHwR+EDgOPCoiD6vqF0OO+03gU0U0tE74m1f4hbcWX+LJLABTp73H65DAcR9fJFR06Y9p92f0YDKNYRiJuMzQXw88rapfVdVzwEeAm0KO+zngj4Bnc2xfLQndvGIcbr3Zm4kT45ZYHof5t4xGfHCWdFXDMIYdF4N+FfD1wOPjvecuIiJXAW8H7o37IBGZE5HHROSxEydOpG1rbYjcHk4CP0qkYT92+UrEC5ZoZBjG4LgYdAl5rt9U3Q28T1UjLFXvTar7VXWrqm7dvHmzaxtrh9P2cAKjESUDRmQ0PJTREo0Mw8iAi0E/Drw88Phq4Jm+Y7YCHxGRo8CPAvtE5G25tLCGLGxbYHJsMvG4lREYvxDyvK4w9/G59UbdEo0Mw8iAi0F/FLhGRF4hIuPAO4CHgweo6itUdUZVZ4A/BHar6kdzb21NCG5eEYt4S5mRkEXO8vll5h/p08Yt0cgwjAwkGnRVvQD8LF70ypeAB1X1SRHZJSK7im5gXZndMsvR9xzl0M2HGBsZizzu/AZYjRDTQ7X4gdJVDcMwHOPQVfWwqr5KVV+pqgu95+5V1XVOUFX9SVX9w7wbWldmt8xy/9vupzPRSf3edVq8xaAbhpEByxTNgdkts5x878lICaYz0Vmnua/bMNo2uzAMIyNm0HMkzFk6OTbJ3hv2Jm8YbTHohmFkJDFT1HDHN9Dzj8xz7PQxpjZOsbBtwXu+22X2buAYMAVsBrYE3mwx6IZhZMSqLZaByzZ1th2dYRgOWLXFqnGRU8Ji0MfG4MwZc5IahuGEGfQySJJTut1LRn+0V+el0/Fi0ZeWzElqGIYTZtB9igwZjEvpD0a3AKysXJqpnzu39vj+Wb2FORqGEcAMOhQfMhiX0h8lxywthX9WcFZvYY6GYQQwpyiU45D0ZZVjx7yZub8V3cjIxd2OnPDbZE5UwxhKzCmaRBkhg/0p/eAZ5TTGXORSoS4LczQMow8z6FB+2dp+3dwV1UthjlZq1zCMPsygw8Bla9fsK3r3THiN8zDCdHOf6WkvwiXqtYxtNgyjvZhBh4HK1vr7ii6eXkRRFk8vhtc4DyNKFhHx5Ji9e5ONtZXaNQyjD3OKDsjM3TMsnl4vmUxvnOboe44mvHkm2aEZ5UQ1DGOoMadoTgQlljBjDjH7jQZxkUvi6qJb/LlhGCGYQQ8hzF72SyxROO03mkUucYk/N4NvGEOJSS59RNXRmvjADEsX4qNSJscm15fFzZskucalEJhhGI0lTnIxg95HlL3kjhGQ8HMlyNpSuUUSlYgk4skzlnBkGK0mzqBbPfQ+IvNyTk/BSwZ0gubJ1FS4wfbjzy3hyDCGFtPQ+4jKy+l8Lnw3ojXbyJVBkkPVEo4MY2gxg97nQDy0vRtqL/f+1GzyNnJlkORQtYQjwxheVDXxB7geeAp4Gnh/yOuzwOd7P38NXJv0mdddd51WzqFDqpOTqp4q7f1MTupn331Ip6dVRVSnp73Das+hQ6qdzqV+jIx4vxvTAcMwXAAe0wi7mjhDF5FR4IPADcCrgVtE5NV9h30N+H5VfS3wq8D+PAabwokoXfvGw/MXQ8AXPt5l/sQA6f150u3Cpk3ejFzE+7s/TPG229aW3F1d9X4vLnr9tNBFw2g9iVEuIvK9wC+r6lt6j38RQFV/PeL4lwJfUNWr4j63FlEuCREjfuz58vlLRn9sZIwrXnQFp86eKieyxTfW58+vfX58HO67z5NaIkNzAvihi2AZqIbRYLJGuVwFfD3w+Djw3THHvwv4ZERD5oA5gKk6OOkSIkbmH5lfY8wBzq+eZ+msNxP267cAxRn1+fn1xhy83Yx27vT+dolgWV6GPXvg7NlLqxI/KQnMqBtGC3BxikrIc6HTehF5M55Bf1/Y66q6X1W3qurWzZs3u7eyKBIciC5p/Mvnl5l/ZD7xuIGJM9YrK55BvvJKt89aWkrerNowjMbiYtCPAy8PPL4aeKb/IBF5LfAh4CZVjdg/rWYkRIw4pfHjWL9lUJJWMr6BHhsb/DssRt0wWoGLQX8UuEZEXiEi48A7gIeDB4jIFPAQsENVv5x/MwskpgjWwrb1sedhuBr+gVhYSDbWp07B/fdH11EHb+UR9Xod5C/DMDKTaNBV9QLws8CngC8BD6rqkyKyS0R29Q77JaAD7BORz4lI/XL6U9I90r2ooY/KKACdiQ7jo+Nrjis8uWh2NtlYT015x508eSkA89Ch9SsPlzrrhmE0FqfEIlU9rKqvUtVXqupC77l7VfXe3t8/paovVdXX9X5CPbC1I6IqYbCyIsCKriAIS2eXePH4i+lMdMpNLvKN9aFD6w3y2BicObO+sqK/8jh40Hu8Y4enle/cecnQdzowMeG9ZlUZDaPxDG9xrpiqhDMn5iPrnUNJVRWjCG58ceWV8PzzXsTLxcYFKiuG9VEEdu2CN7whvP87d8KDD16Kae90vJm9RcEYRi2waothxFQlHLntWGzNc6igKFcYSZUVo14X8QaDJUffdTDm3TCMSrEdi8KIqUp45YZkJ2GhkS2uJFVWjHpd1d2Yg7cCsNBGw6g9w2vQ46oS/p8FOBcf3VJoZIsrSZUV84xesdBGw6g9w2vQY5KKTv3lLHx8P3xj2kuh0rW5VZWUzQ0jqbLiwoInr4TR6ax/bxwW2mgYtWd4DXpMUtHUFHBkFu4+CncqPHSwZ9wrLJsbRlIp3dlZzwEaZdT9iJckxsfXhjYmFQszDKMShtcpGkPrtuXsdr06Lv26uR/V8qEPhdeLAS8ccnXVM/y+UU8qFmYYRmFYlMsABKMDW1GU0KUiY5DLLvOcp/21X+KwfUsNo3AsymUAYioCNJO0Ts0XXkhnzMEbMCxByTAqwwz6sFCWU3NxEW691bR1w6gAM+ghdI90mbnb26Vo08IMm97cXZdZ3zjCImKiiCvklYalJbj9dti9O7TEgmEY+eKywcXQ0D3SZc8n91zcwAJg6cIifN8cLMHikdnm7gfhN3h+Pl5LDzo/d+wI39EpDefOwT33XHpsm2oYRmHYDL2HX5AraMwvMr4M27xMyUbvB+E7BsKKfE1Oes/7DoOkkEeA0dHB2rG8DO98p83YDSNnzKD3CNtubg0bLzkVG580mRS/7rNvn1etMSpWfWVl8Dasrnqz/8VFbyUgYsbdMDJiYYs9Ru4ciS/I9Y1pL9GIIY3Oi9pQO29EvO/xpR+TZQxjDRa22E9IHfTY2iznJuERT1ce2v0gyoqS8QcNX2vfvXttVuro6KUImk2bTLYxjADDZ9D9NNDFxUtL/rk5Fl60PXS7uctHOlz25/u9UgB4+0EMJWFRMmNjXoZokMlJePe7s+1x6rO87DlUgxmuq6ve76Ul7yfwPzSjbgw7w2fQ9+xZnzCzvAwPPsjEhkvWujPR4dDNh7j320+in7+07F9aGlLbEaa733+/l+7fr8Xv25e8bV7e+N7q/tWXhUwaQ8Rwaejdrpf00v/0Fph7KywHJpv+rkTzb52N3UPCcCTi3FeGvxMTtKzGg9F2rJYLeAZl5851kRndLbDzbbASEoE3vXGaY//taKQv8NAhu/dTkbaeTBPoL15mF4RRMOYU3b3bC43rM+a7b4AdN4cbc/B2JYrzBfoZ7raSdyRNtmpT8DX9YMmDKn98p7HJTUOJ0wxdRK4H9gKjwIdU9Tf6Xpfe69uBZeAnVfXv4z5zkBl6957dzH91P4uXrSAa2HdCgUH/jsmbmd44zcLmo+tK6RqDcwtdfo15plgEhJGEvVt9/KNi/l1GH8HL3H/c/7z9Xf7fq4wgrPLM6DRH5xZ44750q7pMM3QRGQU+CNwAvBq4RURe3XfYDcA1vZ854B5ypnvPbub+6R4WL18BAR3BO0OC14tB/47A35XI9wUa+fAAs7yCo4yi3MpBjjLNKsIJOpygc/Hv57jM2ywKOEGHWQ4xyyFeoGUz/ALpv7zzuF3s7+x/j7LKCHD1yiLfdc8cf7U7v5VT4gxdRL4X+GVVfUvv8S8CqOqvB475XeDTqvpA7/FTwJtU9Z+jPjftDH3mFzZ4xrwERmWUA28/sGZXopmZ9sm/TWTQGb5h1JXjo9NcfeGo8/FZNfSrgK8Hv7/3XNpjEJE5EXlMRB47ceKEw1df4thl5RhzQdYZc4jfntMoj/AZPqwgF2f0z3FZb7YPFxhlFdbN+g2jLnzbSn61RFwMepgZ678nXI5BVfer6lZV3bp582aX9l1k6oUBC0GlQBB2bd0Vul+oS60qo1yCxn0Dq4ygjKBs5Awv4ySjKGNcYBTlZZxkI2cYQZnlECfohA4AwYFhtfc77m8bHIysPDOaXxa2i0E/Drw88Phq4JkBjsnEwrfPMRmx7WUedCY6HLz5IPtu3Bd5TFKtKqMZPMAsL+Nk6AAQHBhGe7/j/p7lUOgqwWUwKOJvG2CaxQtMcnQuv1oiLgb9UeAaEXmFiIwD7wAe7jvmYeCd4vE9wOk4/XwQZt+9j/1XvZvpM6OgIINc9SH4GaEn33sydGa+rh29CrSqXhy6b9xt5j6cRK0SXAaDIv4ODjBRclNVg4397f2sMMIqnnb+D+/enzrKJQ7XsMXtwN14YYv3qeqCiOwCUNV7e2GLvwNcjxe2eJuqxno861Zt0TAMownEOUWddixS1cPA4b7n7g38rcDPZGmkYRiGkY3hyBQ1DMMYAsygG4ZhtAQz6IZhGC3BDLphGEZLqKx8roicAAZNpt8EnMyxOXXH+tturL/tJu/+TqtqaGZmZQY9CyLyWFTYThux/rYb62+7KbO/JrkYhmG0BDPohmEYLaGpBn3YKpRbf9uN9bfdlNbfRmrohmEYxnqaOkM3DMMw+jCDbhiG0RIaZ9BF5HoReUpEnhaR91fdnrwRkftE5FkR+ULguStF5M9E5Cu93y+tso15IiIvF5G/EJEviciTIrKn93wr+ywi/0ZE/k5Enuj1987e863sL3j7EovIP4jIJ3qPW9tXABE5KiJHRORzIvJY77lS+twog+64YXXT+TBeGeIg7wceUdVrgEd6j9vCBeC/q+q/A74H+Jne/7Stff4m8AOqei3wOuD63h4Cbe0vwB7gS4HHbe6rz5tV9XWB+PNS+twogw68HnhaVb+qqueAjwA3VdymXFHVzwCn+p6+CTjQ+/sA8LZSG1UgqvrPqvr3vb+fx7vxr6KlfVaPM72HY70fpaX9FZGrgRuBDwWebmVfEyilz00z6E6bUbeQb/F3gOr9flnF7SkEEZkBvgv4f7S4zz0J4nPAs8CfqWqb+3s38F7W7hnW1r76KPC/ReRxEZnrPVdKn502uKgRTptRG81DRC4H/gh4j6o+Jy3e009VV4DXichLgD8WkddU3aYiEJEfBp5V1cdF5E1Vt6dE3qCqz4jIy4A/E5F/LOuLmzZDL3wz6pryLyLyrQC9389W3J5cEZExPGPeVdWHek+3us8AqvoN4NN4PpM29vcNwI+IyFE8efQHROQQ7ezrRVT1md7vZ4E/xpOKS+lz0wy6y4bVbeRhYGfv753AxypsS6709qP9feBLqvpbgZda2WcR2dybmSMiE8B/Bv6RFvZXVX9RVa9W1Rm8e/XPVfVWWthXHxG5TERe7P8N/BDwBUrqc+MyRcM2rK64SbkiIg8Ab8IrufkvwB3AR4EHgSngGPBjqtrvOG0kIvJG4LPAES7prB/A09Fb12cReS2eU2wUb0L1oKr+ioh0aGF/fXqSy8+r6g+3ua8i8u14s3LwJO0/UNWFsvrcOINuGIZhhNM0ycUwDMOIwAy6YRhGSzCDbhiG0RLMoBuGYbQEM+iGYRgtwQy6YRhGSzCDbhiG0RL+P73di9GXBp9aAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -430,268 +439,252 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[4.13048703e+00, 1.54045618e-01],\n", - " [9.39724796e+00, 4.63032787e-01],\n", - " [2.26338241e+01, 1.79920071e+00],\n", - " [4.79865867e+01, 2.75795293e+00],\n", - " [1.65196042e+02, 9.60054641e+00],\n", - " [4.09779333e+02, 1.85994178e+01],\n", - " [5.28999484e+02, 4.79801484e+01],\n", - " [1.44654291e+03, 9.06680768e+01],\n", - " [4.99428771e+03, 3.11892868e+02],\n", - " [1.01035804e+04, 5.48460859e+02],\n", - " [2.61947362e+04, 1.40265491e+03],\n", - " [3.83891964e+04, 2.23685907e+03],\n", - " [1.44615604e+05, 4.71073992e+03],\n", - " [2.04841144e+05, 1.28298259e+04],\n", - " [3.04860240e+05, 2.65146845e+04],\n", - " [7.15472624e+05, 6.60639061e+04],\n", - " [5.70803649e+05, 7.57376290e+04],\n", - " [9.47231329e+05, 1.54986248e+05],\n", - " [9.23953166e+05, 1.93822492e+05],\n", - " [6.57801248e+05, 1.50769939e+05],\n", - " [8.43171264e+05, 2.49113150e+05],\n", - " [5.59341253e+05, 1.85957381e+05],\n", - " [6.96237265e+05, 4.03687883e+05],\n", - " [5.40067509e+05, 2.66418801e+05],\n", - " [4.57478544e+05, 3.88221974e+05],\n", - " [4.25920143e+05, 3.91122618e+05],\n", - " [3.96908285e+05, 3.71414788e+05],\n", - " [6.02102705e+05, 4.23352098e+05],\n", - " [6.41769739e+05, 5.18903098e+05],\n", - " [4.16901641e+05, 4.04368759e+05],\n", - " [3.30039331e+05, 3.78696731e+05],\n", - " [5.51529415e+05, 6.43412007e+05],\n", - " [5.49787782e+05, 5.35688557e+05],\n", - " [2.80979529e+05, 7.42016812e+05],\n", - " [4.66284359e+05, 6.14750052e+05],\n", - " [3.12148206e+05, 5.29680965e+05],\n", - " [3.50953671e+05, 8.72215875e+05],\n", - " [4.01568191e+05, 8.08517365e+05],\n", - " [2.95505559e+05, 6.81129851e+05],\n", - " [3.16315375e+05, 6.59415810e+05],\n", - " [1.95777449e+05, 6.79437421e+05],\n", - " [1.94280033e+05, 7.21315446e+05],\n", - " [1.78501110e+05, 6.75465168e+05],\n", - " [2.47404532e+05, 9.85931509e+05],\n", - " [2.99943485e+05, 7.64644995e+05],\n", - " [1.48078919e+05, 8.98769907e+05],\n", - " [2.03910050e+05, 7.10664811e+05],\n", - " [1.98269087e+05, 5.50194199e+05],\n", - " [2.41973630e+05, 8.36300844e+05],\n", - " [1.94887109e+05, 9.06544564e+05],\n", - " [1.46665030e+05, 9.13739364e+05],\n", - " [1.43779842e+05, 8.80070344e+05],\n", - " [1.04096536e+05, 7.21086105e+05],\n", - " [1.87776956e+05, 8.93932501e+05],\n", - " [9.41454910e+04, 8.32234831e+05],\n", - " [1.47360515e+05, 9.75970111e+05],\n", - " [1.07959767e+05, 9.19504617e+05],\n", - " [1.31352538e+05, 8.43986082e+05],\n", - " [1.38134142e+05, 9.44445525e+05],\n", - " [1.43810730e+05, 8.74698002e+05],\n", - " [1.02488333e+05, 8.25331196e+05],\n", - " [9.36752361e+04, 1.06579735e+06],\n", - " [9.28858373e+04, 1.15535109e+06],\n", - " [6.63758943e+04, 9.88499224e+05],\n", - " [1.06010101e+05, 8.10618603e+05],\n", - " [1.04769047e+05, 6.39799600e+05],\n", - " [6.43799763e+04, 1.00443399e+06],\n", - " [8.83107785e+04, 7.51578437e+05],\n", - " [8.32902438e+04, 1.14248035e+06],\n", - " [8.23704800e+04, 7.70222834e+05],\n", - " [6.36377665e+04, 8.10851809e+05],\n", - " [6.67889123e+04, 6.98840815e+05],\n", - " [7.51023290e+04, 1.03500279e+06],\n", - " [6.26382732e+04, 6.83328316e+05],\n", - " [4.18704321e+04, 7.29742044e+05],\n", - " [6.09073205e+04, 1.17917865e+06],\n", - " [3.41835753e+04, 9.20899230e+05],\n", - " [5.16557040e+04, 8.42315342e+05],\n", - " [3.53315137e+04, 8.86502740e+05],\n", - " [4.78839456e+04, 6.93420051e+05],\n", - " [3.35578712e+04, 1.15007416e+06],\n", - " [3.04994928e+04, 8.32594383e+05],\n", - " [4.27334325e+04, 7.91261007e+05],\n", - " [4.20789053e+04, 1.19249901e+06],\n", - " [3.95371249e+04, 8.20574024e+05],\n", - " [2.57666812e+04, 7.49084192e+05],\n", - " [3.74313007e+04, 1.14683974e+06],\n", - " [1.97293773e+04, 6.88071653e+05],\n", - " [1.71243567e+04, 1.29096233e+06],\n", - " [1.96154357e+04, 9.39060095e+05],\n", - " [2.47941056e+04, 1.11267717e+06],\n", - " [2.19008895e+04, 8.58416469e+05],\n", - " [1.93730659e+04, 1.15087675e+06],\n", - " [2.41184982e+04, 8.52800084e+05],\n", - " [2.12075306e+04, 7.72057664e+05],\n", - " [2.22673055e+04, 7.14074890e+05],\n", - " [1.24970257e+04, 7.12008791e+05],\n", - " [1.50653450e+04, 8.43052938e+05],\n", - " [2.01996861e+04, 8.82232568e+05],\n", - " [1.23914648e+04, 7.18155510e+05],\n", - " [9.93713520e+03, 1.22778864e+06],\n", - " [1.54926063e+04, 1.13305907e+06],\n", - " [1.46517627e+04, 8.82614181e+05],\n", - " [1.51895234e+04, 1.07507367e+06],\n", - " [1.37184550e+04, 8.54583269e+05],\n", - " [1.32425652e+04, 8.52689748e+05],\n", - " [1.22831633e+04, 1.05438468e+06],\n", - " [1.07154617e+04, 9.87530754e+05],\n", - " [9.79983700e+03, 1.18866243e+06],\n", - " [6.81730901e+03, 8.47516493e+05],\n", - " [9.15651565e+03, 1.02983470e+06],\n", - " [5.64752625e+03, 7.00227501e+05],\n", - " [6.85158508e+03, 9.95376740e+05],\n", - " [8.53777034e+03, 9.91275075e+05],\n", - " [5.58841086e+03, 1.09653142e+06],\n", - " [7.83287441e+03, 6.81290232e+05],\n", - " [5.38570917e+03, 1.28890423e+06],\n", - " [5.60720078e+03, 6.79212987e+05],\n", - " [7.13198062e+03, 1.23332725e+06],\n", - " [6.14306233e+03, 1.29458063e+06],\n", - " [4.11652692e+03, 9.02602625e+05],\n", - " [5.55549183e+03, 7.88062650e+05],\n", - " [5.94590131e+03, 1.23692169e+06],\n", - " [4.30783767e+03, 1.21130813e+06],\n", - " [3.05726711e+03, 1.14476697e+06],\n", - " [3.41295207e+03, 9.54158128e+05],\n", - " [4.85711821e+03, 1.28795897e+06],\n", - " [2.80279142e+03, 8.57680691e+05],\n", - " [3.38791460e+03, 8.63233644e+05],\n", - " [3.69167961e+03, 1.03127702e+06],\n", - " [3.88993254e+03, 1.17845340e+06],\n", - " [3.17562723e+03, 8.97242264e+05],\n", - " [3.32180160e+03, 1.11150609e+06],\n", - " [2.48474397e+03, 1.25739583e+06],\n", - " [2.60417556e+03, 7.18592169e+05],\n", - " [2.95376202e+03, 1.29956821e+06],\n", - " [2.67499903e+03, 1.02182178e+06],\n", - " [1.93684024e+03, 7.09331309e+05],\n", - " [2.43032785e+03, 1.01886507e+06],\n", - " [1.86043618e+03, 1.21670386e+06],\n", - " [1.72323155e+03, 8.56007932e+05],\n", - " [1.95362634e+03, 1.31281086e+06],\n", - " [1.85854073e+03, 6.77777078e+05],\n", - " [1.12184168e+03, 1.05318530e+06],\n", - " [1.42917993e+03, 9.42788835e+05],\n", - " [1.30552104e+03, 8.57145128e+05],\n", - " [1.55865489e+03, 1.09684931e+06],\n", - " [1.16529772e+03, 9.75845741e+05],\n", - " [1.28117604e+03, 9.95327460e+05],\n", - " [9.03127133e+02, 9.36759864e+05],\n", - " [8.30025571e+02, 1.26405888e+06],\n", - " [1.44717583e+03, 8.26241716e+05],\n", - " [7.82908962e+02, 9.49718646e+05],\n", - " [1.30953881e+03, 8.05544645e+05],\n", - " [1.02008145e+03, 1.18601097e+06],\n", - " [7.67225606e+02, 7.30153946e+05],\n", - " [9.40543417e+02, 7.31312893e+05],\n", - " [1.06843120e+03, 1.14831000e+06],\n", - " [7.59482468e+02, 9.27258372e+05],\n", - " [7.32451666e+02, 1.32993513e+06],\n", - " [7.06399734e+02, 1.18456086e+06],\n", - " [7.67043499e+02, 7.98379241e+05],\n", - " [5.30292644e+02, 1.32030148e+06],\n", - " [5.27270391e+02, 1.11303165e+06],\n", - " [4.30556895e+02, 7.37433928e+05],\n", - " [6.92192735e+02, 6.73595928e+05],\n", - " [3.84239599e+02, 8.98704896e+05],\n", - " [4.05602919e+02, 7.68494127e+05],\n", - " [5.32379794e+02, 8.40066501e+05],\n", - " [5.54318875e+02, 1.16164974e+06],\n", - " [4.63878241e+02, 1.07374135e+06],\n", - " [3.08029258e+02, 6.73847356e+05],\n", - " [4.62024710e+02, 1.24764828e+06],\n", - " [4.03358695e+02, 1.16097583e+06],\n", - " [2.67202064e+02, 1.25038378e+06],\n", - " [3.63863050e+02, 7.18443773e+05],\n", - " [2.79615932e+02, 1.28780121e+06],\n", - " [3.60109790e+02, 8.39169235e+05],\n", - " [2.49320339e+02, 9.75423630e+05],\n", - " [3.48833566e+02, 1.32280122e+06],\n", - " [3.28403876e+02, 1.22196622e+06],\n", - " [2.21121004e+02, 1.32480298e+06],\n", - " [1.65069144e+02, 9.51352605e+05],\n", - " [2.61431490e+02, 1.09906347e+06],\n", - " [2.47834507e+02, 8.40256177e+05],\n", - " [2.32494283e+02, 1.04313372e+06],\n", - " [1.34238266e+02, 8.95668938e+05],\n", - " [1.53206781e+02, 9.70433336e+05],\n", - " [1.63387233e+02, 8.71489570e+05],\n", - " [2.16672546e+02, 1.22080878e+06],\n", - " [1.44421258e+02, 1.22576208e+06],\n", - " [1.92426070e+02, 7.40647282e+05],\n", - " [9.61128200e+01, 9.04821540e+05],\n", - " [1.66416779e+02, 9.75432108e+05],\n", - " [1.18125629e+02, 1.22564992e+06],\n", - " [1.35815896e+02, 1.26021637e+06],\n", - " [1.16890245e+02, 1.19561705e+06],\n", - " [9.77113189e+01, 8.33097662e+05],\n", - " [8.68018133e+01, 1.09653539e+06],\n", - " [9.42206676e+01, 8.50974231e+05],\n", - " [9.35370396e+01, 1.28633958e+06],\n", - " [1.17266143e+02, 1.09093515e+06],\n", - " [6.53374982e+01, 7.00052732e+05]])" + "array([[1.80311437e+00, 6.07303299e-02],\n", + " [6.81020026e+00, 2.80913227e-01],\n", + " [8.71370750e+00, 9.12109018e-01],\n", + " [2.42169873e+01, 1.34235092e+00],\n", + " [6.09515924e+01, 4.13195572e+00],\n", + " [1.41167502e+02, 1.03036634e+01],\n", + " [3.30434916e+02, 2.05046119e+01],\n", + " [1.06747087e+03, 4.21719281e+01],\n", + " [2.22482987e+03, 8.60625179e+01],\n", + " [3.81422589e+03, 2.04668918e+02],\n", + " [1.48765175e+04, 8.10186678e+02],\n", + " [1.91106445e+04, 1.75057103e+03],\n", + " [4.39774187e+04, 3.56615139e+03],\n", + " [1.60839355e+05, 6.72761840e+03],\n", + " [2.17044554e+05, 1.73587509e+04],\n", + " [3.32782784e+05, 4.42793038e+04],\n", + " [7.71699789e+05, 7.49162385e+04],\n", + " [9.20245905e+05, 6.71030358e+04],\n", + " [5.39115320e+05, 1.14872807e+05],\n", + " [6.63856042e+05, 2.06130817e+05],\n", + " [6.56161244e+05, 2.13853805e+05],\n", + " [8.91814913e+05, 1.76033244e+05],\n", + " [8.40842445e+05, 2.25430023e+05],\n", + " [8.22754076e+05, 3.60576445e+05],\n", + " [7.65299910e+05, 2.50661953e+05],\n", + " [4.59188090e+05, 4.74099529e+05],\n", + " [5.21338606e+05, 2.91994510e+05],\n", + " [4.93992370e+05, 5.07905133e+05],\n", + " [6.69362638e+05, 4.59090307e+05],\n", + " [5.78114721e+05, 5.79537815e+05],\n", + " [5.68504538e+05, 5.16246775e+05],\n", + " [4.35938773e+05, 3.70433217e+05],\n", + " [2.99626522e+05, 6.15526472e+05],\n", + " [4.16873583e+05, 7.44546487e+05],\n", + " [3.70740213e+05, 7.08873040e+05],\n", + " [2.69297057e+05, 5.37322869e+05],\n", + " [4.58989639e+05, 7.75330500e+05],\n", + " [4.23431065e+05, 7.94346373e+05],\n", + " [4.07323106e+05, 6.94920369e+05],\n", + " [3.88182427e+05, 6.08833786e+05],\n", + " [2.39132524e+05, 6.73482288e+05],\n", + " [3.44693419e+05, 4.84765764e+05],\n", + " [2.49764871e+05, 5.99386996e+05],\n", + " [2.24208791e+05, 9.69604078e+05],\n", + " [2.42161516e+05, 8.63809138e+05],\n", + " [2.99055510e+05, 1.01065728e+06],\n", + " [2.16009266e+05, 6.79572780e+05],\n", + " [1.42296901e+05, 8.52154097e+05],\n", + " [1.37261908e+05, 6.85513749e+05],\n", + " [1.53922890e+05, 6.21095325e+05],\n", + " [2.34543405e+05, 6.81325991e+05],\n", + " [1.97932893e+05, 6.86032368e+05],\n", + " [1.46186905e+05, 9.13744839e+05],\n", + " [1.56136380e+05, 6.16014054e+05],\n", + " [1.27729870e+05, 6.76266460e+05],\n", + " [1.46348499e+05, 9.64054512e+05],\n", + " [1.32315639e+05, 7.10339257e+05],\n", + " [9.77510931e+04, 9.86542568e+05],\n", + " [1.53345982e+05, 6.68280814e+05],\n", + " [8.38626423e+04, 1.13816824e+06],\n", + " [9.01227543e+04, 9.87729621e+05],\n", + " [1.05985330e+05, 9.15522846e+05],\n", + " [7.08607245e+04, 1.14182280e+06],\n", + " [1.00703153e+05, 8.10116863e+05],\n", + " [1.01238301e+05, 1.15346247e+06],\n", + " [9.93093522e+04, 1.00306943e+06],\n", + " [6.16528494e+04, 1.16493792e+06],\n", + " [5.09503401e+04, 6.78705406e+05],\n", + " [4.82668644e+04, 7.18125591e+05],\n", + " [7.72885514e+04, 1.02584315e+06],\n", + " [7.44005640e+04, 7.71069604e+05],\n", + " [7.21902844e+04, 1.03156852e+06],\n", + " [6.51749505e+04, 9.83875388e+05],\n", + " [5.11539002e+04, 7.96148412e+05],\n", + " [7.01936114e+04, 8.79169672e+05],\n", + " [5.52006691e+04, 1.13580118e+06],\n", + " [5.07626146e+04, 9.46965648e+05],\n", + " [5.27437746e+04, 8.14629259e+05],\n", + " [4.79291706e+04, 7.50453652e+05],\n", + " [5.41381377e+04, 1.22352045e+06],\n", + " [2.67634003e+04, 1.23472286e+06],\n", + " [4.93052703e+04, 1.25985076e+06],\n", + " [3.08699126e+04, 8.90366760e+05],\n", + " [2.98741690e+04, 7.53132050e+05],\n", + " [4.17792978e+04, 1.09408874e+06],\n", + " [2.25207498e+04, 1.04352166e+06],\n", + " [2.22601709e+04, 9.82574315e+05],\n", + " [3.23309132e+04, 1.09982550e+06],\n", + " [2.40180970e+04, 8.39540686e+05],\n", + " [3.04195844e+04, 1.21333805e+06],\n", + " [2.41599286e+04, 9.77007989e+05],\n", + " [2.50895294e+04, 1.10876427e+06],\n", + " [2.73379775e+04, 8.72643324e+05],\n", + " [1.50521586e+04, 1.03047109e+06],\n", + " [1.91817748e+04, 1.00823957e+06],\n", + " [1.98054113e+04, 6.74170724e+05],\n", + " [2.15842015e+04, 8.90685644e+05],\n", + " [1.71480141e+04, 1.16005677e+06],\n", + " [1.73901876e+04, 7.11934851e+05],\n", + " [1.56090372e+04, 1.01138643e+06],\n", + " [1.67359124e+04, 1.29807714e+06],\n", + " [1.22015909e+04, 1.18023382e+06],\n", + " [1.26243306e+04, 7.09509434e+05],\n", + " [1.63788717e+04, 1.20866494e+06],\n", + " [1.11846718e+04, 7.72882252e+05],\n", + " [9.44074866e+03, 1.02111934e+06],\n", + " [1.19249632e+04, 8.44095665e+05],\n", + " [1.18742618e+04, 1.02561582e+06],\n", + " [9.22643440e+03, 8.23711242e+05],\n", + " [1.08676095e+04, 6.69990984e+05],\n", + " [6.15136129e+03, 6.87698842e+05],\n", + " [9.53029004e+03, 9.74535983e+05],\n", + " [7.93717611e+03, 9.74473869e+05],\n", + " [7.25769181e+03, 9.25257696e+05],\n", + " [7.87267307e+03, 6.91836383e+05],\n", + " [7.44642794e+03, 9.95206467e+05],\n", + " [7.22630565e+03, 7.70223136e+05],\n", + " [6.80643132e+03, 6.80086846e+05],\n", + " [7.64845973e+03, 1.04410552e+06],\n", + " [6.16197226e+03, 9.66700447e+05],\n", + " [6.92501634e+03, 9.19124316e+05],\n", + " [6.46474610e+03, 7.93136825e+05],\n", + " [3.55272495e+03, 6.75528262e+05],\n", + " [5.16693491e+03, 7.10837138e+05],\n", + " [5.38765066e+03, 6.79192984e+05],\n", + " [3.56087326e+03, 7.42337048e+05],\n", + " [4.30436231e+03, 1.24668691e+06],\n", + " [4.53314708e+03, 8.51467238e+05],\n", + " [4.18566167e+03, 1.20023639e+06],\n", + " [3.21279826e+03, 9.11558249e+05],\n", + " [2.90074298e+03, 1.28299446e+06],\n", + " [2.94076146e+03, 1.16364420e+06],\n", + " [2.15942909e+03, 1.26464423e+06],\n", + " [3.40102255e+03, 8.77575006e+05],\n", + " [2.46065388e+03, 6.72101289e+05],\n", + " [1.83869361e+03, 8.77319518e+05],\n", + " [3.12626369e+03, 1.04643681e+06],\n", + " [2.20822459e+03, 8.60168939e+05],\n", + " [2.42547765e+03, 1.16570838e+06],\n", + " [2.46872102e+03, 7.25965440e+05],\n", + " [1.38771867e+03, 1.03098596e+06],\n", + " [2.35622165e+03, 8.98923790e+05],\n", + " [1.35709596e+03, 1.17224893e+06],\n", + " [1.24362223e+03, 7.21513455e+05],\n", + " [1.15250240e+03, 1.21261607e+06],\n", + " [1.10506832e+03, 7.22116498e+05],\n", + " [1.33592148e+03, 9.12429023e+05],\n", + " [1.80059190e+03, 1.32216426e+06],\n", + " [1.21054109e+03, 7.21380766e+05],\n", + " [1.30390090e+03, 9.48289693e+05],\n", + " [8.84384233e+02, 9.93895431e+05],\n", + " [1.11187632e+03, 7.03402479e+05],\n", + " [8.04781600e+02, 1.09828585e+06],\n", + " [1.08464511e+03, 1.30677088e+06],\n", + " [8.37788890e+02, 1.24451513e+06],\n", + " [1.21687420e+03, 6.74142270e+05],\n", + " [6.15052691e+02, 1.25964703e+06],\n", + " [1.11775428e+03, 7.15262127e+05],\n", + " [1.05061703e+03, 1.01458598e+06],\n", + " [8.60555272e+02, 9.68955881e+05],\n", + " [7.64793005e+02, 1.26652091e+06],\n", + " [5.88199287e+02, 1.29937870e+06],\n", + " [6.35816955e+02, 1.07938072e+06],\n", + " [4.93649996e+02, 9.75190773e+05],\n", + " [6.25899451e+02, 7.18063800e+05],\n", + " [7.46714007e+02, 1.13146937e+06],\n", + " [4.68305129e+02, 1.20854802e+06],\n", + " [3.95490614e+02, 1.27330139e+06],\n", + " [6.30920826e+02, 1.14992124e+06],\n", + " [4.36536697e+02, 1.28789074e+06],\n", + " [3.06028969e+02, 6.83944130e+05],\n", + " [5.04257056e+02, 1.32429726e+06],\n", + " [4.22327998e+02, 9.20228055e+05],\n", + " [4.64225390e+02, 1.22508918e+06],\n", + " [3.39154470e+02, 8.48632779e+05],\n", + " [4.25202659e+02, 1.20818727e+06],\n", + " [4.33078028e+02, 1.03661708e+06],\n", + " [4.01254251e+02, 1.23271661e+06],\n", + " [2.84687620e+02, 7.52551320e+05],\n", + " [2.99858028e+02, 8.18865815e+05],\n", + " [2.87356573e+02, 9.05200608e+05],\n", + " [2.82370211e+02, 1.01328163e+06],\n", + " [2.44269399e+02, 1.23449003e+06],\n", + " [2.38588600e+02, 1.25081554e+06],\n", + " [1.64880089e+02, 6.85705527e+05],\n", + " [2.24095224e+02, 1.13581748e+06],\n", + " [1.49499663e+02, 6.76229628e+05],\n", + " [1.98966432e+02, 9.27988454e+05],\n", + " [2.26669764e+02, 8.98676469e+05],\n", + " [2.01969647e+02, 9.30870372e+05],\n", + " [2.00597500e+02, 1.29947041e+06],\n", + " [1.97394508e+02, 9.94591301e+05],\n", + " [1.42209065e+02, 1.31982872e+06],\n", + " [1.23185805e+02, 1.08878246e+06],\n", + " [9.48766296e+01, 7.52486918e+05],\n", + " [9.66280510e+01, 7.59122572e+05],\n", + " [9.43074761e+01, 8.97004132e+05],\n", + " [1.11877865e+02, 1.11157857e+06],\n", + " [8.60844711e+01, 6.93837248e+05],\n", + " [8.78132340e+01, 7.84592807e+05],\n", + " [7.32113399e+01, 9.73757064e+05],\n", + " [8.47811693e+01, 1.00218474e+06],\n", + " [6.14370563e+01, 1.19950055e+06]])" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "data_to_fit = noised_data[:,1:3]\n", - "data_to_fit = data_to_fit[1::,:]\n", + "data_to_fit = noised_data[1::,1:3]\n", "data_to_fit" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Fitting Square l loss" - ] - }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" + "406" ] }, - "execution_count": 11, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "param_evals" + "np.prod(data_to_fit.shape)" ] }, { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": false - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "# Initial guess of parameters, and bounding constraints\n", - "theta = [3, 0.15,1e6]\n", - "boxBounds = [(2,5),(0.0,1.0),(1e6,1e6)]\n", - "\n", - "objSIR = SquareLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + "## Fitting Square l loss" ] }, { @@ -702,7 +695,7 @@ { "data": { "text/plain": [ - "SquareLoss([3.0, 0.15, 1000000.0], SimulateOde([ODEVariable('S', 'S', None, True), ODEVariable('I', 'I', None, True), ODEVariable('R', 'R', None, True)], [ODEVariable('beta', 'beta', None, True), ODEVariable('gamma', 'gamma', None, True), ODEVariable('N', 'N', None, True)], [], [Transition('S', 'beta*S*I/N', 'T', 'I', None, None), Transition('I', 'gamma*I', 'T', 'R', None, None)], [], []).setParameters({'beta': 3.6, 'gamma': 0.2, 'N': 1000000.0}), [999998.0, 2.0, 0.0], 0.0, [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 25.25, 25.5, 25.75, 26.0, 26.25, 26.5, 26.75, 27.0, 27.25, 27.5, 27.75, 28.0, 28.25, 28.5, 28.75, 29.0, 29.25, 29.5, 29.75, 30.0, 30.25, 30.5, 30.75, 31.0, 31.25, 31.5, 31.75, 32.0, 32.25, 32.5, 32.75, 33.0, 33.25, 33.5, 33.75, 34.0, 34.25, 34.5, 34.75, 35.0, 35.25, 35.5, 35.75, 36.0, 36.25, 36.5, 36.75, 37.0, 37.25, 37.5, 37.75, 38.0, 38.25, 38.5, 38.75, 39.0, 39.25, 39.5, 39.75, 40.0, 40.25, 40.5, 40.75, 41.0, 41.25, 41.5, 41.75, 42.0, 42.25, 42.5, 42.75, 43.0, 43.25, 43.5, 43.75, 44.0, 44.25, 44.5, 44.75, 45.0, 45.25, 45.5, 45.75, 46.0, 46.25, 46.5, 46.75, 47.0, 47.25, 47.5, 47.75, 48.0, 48.25, 48.5, 48.75, 49.0, 49.25, 49.5, 49.75, 50.0, 50.25, 50.5, 50.75], [[4.130487025131687, 0.15404561775936773], [9.397247964980085, 0.46303278732171177], [22.633824079261842, 1.7992007113807156], [47.986586672487206, 2.7579529325485836], [165.196041952231, 9.600546411428384], [409.7793329814416, 18.59941777036534], [528.9994837079726, 47.98014835106094], [1446.5429145036974, 90.66807675329977], [4994.287706241389, 311.89286846212264], [10103.580369113544, 548.4608589124192], [26194.736213578377, 1402.654912118046], [38389.19639311862, 2236.8590689690504], [144615.6038613682, 4710.739919896741], [204841.14352293048, 12829.825865082867], [304860.2404249535, 26514.684493267272], [715472.6235634295, 66063.90607297285], [570803.6488074489, 75737.62898047472], [947231.3292945497, 154986.247976831], [923953.16649091, 193822.49178823238], [657801.2480252209, 150769.93914359063], [843171.2637992136, 249113.1495604983], [559341.2527328188, 185957.3813357946], [696237.264525381, 403687.88293160085], [540067.5094137926, 266418.8007305509], [457478.5443022633, 388221.974041893], [425920.1427231567, 391122.61823234084], [396908.2854576274, 371414.7879418473], [602102.7053746057, 423352.09770557744], [641769.7394061629, 518903.09780880454], [416901.64080071973, 404368.7588933208], [330039.3314030553, 378696.7305775569], [551529.4145009269, 643412.0070484518], [549787.7820911882, 535688.556709061], [280979.5285986585, 742016.811538869], [466284.35882357555, 614750.051516308], [312148.2058862273, 529680.9650844566], [350953.6705610238, 872215.874672448], [401568.19082765863, 808517.3646270183], [295505.55911352474, 681129.850659894], [316315.37513281166, 659415.8097179801], [195777.4490952229, 679437.4206703037], [194280.03265693723, 721315.4457581254], [178501.10961662387, 675465.1683738899], [247404.53170668957, 985931.5093514766], [299943.4851962682, 764644.9954514606], [148078.91870689174, 898769.9073671738], [203910.04957668108, 710664.8108294513], [198269.08657707038, 550194.198541208], [241973.63044169324, 836300.8441740677], [194887.10906344195, 906544.5642488404], [146665.03014024382, 913739.3641712739], [143779.84227086403, 880070.3435878769], [104096.5358741194, 721086.1047601945], [187776.95624604076, 893932.5009312815], [94145.49095393051, 832234.8307984242], [147360.51529741898, 975970.1109512364], [107959.76674711499, 919504.6172384012], [131352.53801677615, 843986.0818510734], [138134.14244997536, 944445.5248128581], [143810.73000588483, 874698.002250221], [102488.3325125742, 825331.1957907011], [93675.23614669341, 1065797.3512993983], [92885.83732391837, 1155351.0857456843], [66375.89434895372, 988499.2242781295], [106010.1011427728, 810618.6033656059], [104769.0474474182, 639799.6000771984], [64379.976276675065, 1004433.9910370467], [88310.77848764382, 751578.4374513394], [83290.24377534064, 1142480.3506778087], [82370.47996389655, 770222.8341590352], [63637.766473583026, 810851.8091807761], [66788.91229470367, 698840.8146168891], [75102.3290490617, 1035002.7902780143], [62638.27317992859, 683328.3156147334], [41870.43206330126, 729742.0444708264], [60907.32053788277, 1179178.6549844078], [34183.575255148746, 920899.2296020638], [51655.704042085505, 842315.3424291152], [35331.51366160177, 886502.7398532623], [47883.945613707736, 693420.0510623266], [33557.87124412175, 1150074.1571437381], [30499.492761509304, 832594.3834703927], [42733.43248401154, 791261.006569009], [42078.9053350363, 1192499.0062521168], [39537.12490267918, 820574.0244793433], [25766.68117003718, 749084.1915958913], [37431.3006839491, 1146839.7385431828], [19729.377253022878, 688071.6526254383], [17124.35674302549, 1290962.3295776465], [19615.43572022034, 939060.0950318159], [24794.10562003187, 1112677.165293667], [21900.889529328662, 858416.4692184512], [19373.06594088114, 1150876.7459370985], [24118.498247359745, 852800.0837341312], [21207.530605877277, 772057.6638792764], [22267.30551041926, 714074.8898722631], [12497.025723179937, 712008.7912734993], [15065.344990296639, 843052.9384454926], [20199.686086950154, 882232.5677295076], [12391.464759044167, 718155.5097697747], [9937.135196575824, 1227788.641219967], [15492.606340046807, 1133059.0676593857], [14651.76273816029, 882614.1807004922], [15189.523429391971, 1075073.6739545558], [13718.455011597003, 854583.2693140692], [13242.565179358064, 852689.7481448406], [12283.16329964135, 1054384.679136664], [10715.461680060893, 987530.7540134372], [9799.836999306235, 1188662.432761487], [6817.309005236672, 847516.4934806598], [9156.515653966426, 1029834.6994578489], [5647.526250134233, 700227.501149568], [6851.585075787405, 995376.7395363126], [8537.770338276303, 991275.0750426087], [5588.410860946238, 1096531.4230958493], [7832.874408306464, 681290.2321555684], [5385.709166136957, 1288904.2276863966], [5607.200777069934, 679212.9865083437], [7131.98062301099, 1233327.2530472076], [6143.062328777299, 1294580.6293236036], [4116.526919112113, 902602.6246132584], [5555.49183273859, 788062.6499769951], [5945.901312119126, 1236921.6936202012], [4307.837673987712, 1211308.1303755068], [3057.267111272262, 1144766.9718521282], [3412.952069021781, 954158.1280045257], [4857.118212156462, 1287958.9746543085], [2802.7914200776886, 857680.691013031], [3387.914599774963, 863233.6440396649], [3691.679610334573, 1031277.0232285978], [3889.932537061482, 1178453.4027236914], [3175.6272264942872, 897242.264150536], [3321.8016013704805, 1111506.090775924], [2484.743968904745, 1257395.831926505], [2604.1755637616475, 718592.1692915799], [2953.762015063723, 1299568.2114593633], [2674.99903287432, 1021821.7828949532], [1936.840241672874, 709331.3091161926], [2430.32784824078, 1018865.0657590512], [1860.436184602949, 1216703.8610504132], [1723.2315526850525, 856007.9319208895], [1953.6263447660579, 1312810.8625858119], [1858.5407262503563, 677777.0784941971], [1121.841683026275, 1053185.2996789496], [1429.1799261633125, 942788.834721557], [1305.5210429480653, 857145.1282976748], [1558.6548858562132, 1096849.3108424598], [1165.2977247587564, 975845.740861295], [1281.1760431911907, 995327.4595873987], [903.127132888626, 936759.8641734732], [830.0255705095318, 1264058.880523917], [1447.175826672647, 826241.7163334353], [782.9089616625392, 949718.6455322991], [1309.5388116616314, 805544.6451139126], [1020.0814509483284, 1186010.9653905143], [767.2256057638687, 730153.9456574344], [940.5434165348748, 731312.8929979993], [1068.431197781994, 1148310.00282886], [759.4824678568447, 927258.3721201726], [732.4516659883362, 1329935.1271868325], [706.3997339170826, 1184560.8555669347], [767.0434989984218, 798379.2411034874], [530.2926441714136, 1320301.478595184], [527.2703906339111, 1113031.6474556928], [430.5568953988018, 737433.9280313611], [692.1927353827714, 673595.9280200478], [384.23959921185053, 898704.8958790172], [405.6029193272436, 768494.1267053746], [532.3797944208193, 840066.5011984787], [554.3188745851079, 1161649.7413965538], [463.87824061723234, 1073741.3455026292], [308.0292581421485, 673847.3559565375], [462.02471007201643, 1247648.281420697], [403.35869455867373, 1160975.832082224], [267.2020640147793, 1250383.7841186798], [363.8630500648634, 718443.7734347496], [279.6159322070644, 1287801.210123048], [360.1097904304585, 839169.2354281674], [249.32033940693356, 975423.6296495761], [348.83356604943486, 1322801.2214118955], [328.40387580328803, 1221966.218413916], [221.1210037522975, 1324802.975776162], [165.06914366017043, 951352.6052332598], [261.4314897243031, 1099063.4721241775], [247.83450742057468, 840256.1768109152], [232.49428280316337, 1043133.7234717476], [134.23826614735785, 895668.9384443999], [153.20678095501415, 970433.3364156254], [163.3872329739676, 871489.5702094157], [216.6725459496833, 1220808.7783561496], [144.4212576438835, 1225762.0801782524], [192.42606995989752, 740647.2823234415], [96.11282000434359, 904821.5403045765], [166.41677897191434, 975432.1078972422], [118.12562865687576, 1225649.9201249767], [135.81589553462987, 1260216.3663823903], [116.89024486149172, 1195617.0482448642], [97.71131894635056, 833097.6624037084], [86.8018133066483, 1096535.386700453], [94.22066759538556, 850974.2314776242], [93.53703959337743, 1286339.5796547756], [117.26614306573515, 1090935.1549952293], [65.33749823040989, 700052.7320163958]], ['I', 'R'], [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])" + "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" ] }, "execution_count": 13, @@ -711,21 +704,36 @@ } ], "source": [ - "objSIR" + "param_evals" ] }, { "cell_type": "code", "execution_count": 14, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "theta = [3, 0.15,N]\n", + "boxBounds = [(2,5),(0.0,1.0),(N,N)]\n", + "\n", + "objSIR = SquareLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "9032988605419.916" + "9494886226076.777" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -734,48 +742,6 @@ "objSIR.cost()" ] }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", - " warn('Method %s cannot handle constraints nor bounds.' % method,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " fun: 6195089026101.063\n", - " hess_inv: array([[ 8.74144835e-12, -2.58712672e-14, 2.68445022e-06],\n", - " [-2.58712712e-14, 2.36956010e-15, -5.05342211e-09],\n", - " [ 2.68444976e-06, -5.05342099e-09, 8.41021723e-01]])\n", - " jac: array([ 4.61669282e+00, -8.58643370e+01, -1.67724298e-05])\n", - " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 57\n", - " nit: 11\n", - " njev: 46\n", - " status: 2\n", - " success: False\n", - " x: array([4.97711288e+00, 1.97932062e-01, 1.36982257e+06])\n" - ] - } - ], - "source": [ - "# perform optimization\n", - "res = minimize(fun=objSIR.cost,\n", - " jac=objSIR.sensitivity,\n", - " x0=theta,\n", - " bounds=boxBounds,\n", - " method='BFGS')\n", - "print(res)" - ] - }, { "cell_type": "code", "execution_count": 16, @@ -785,16 +751,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 6195089026101.077\n", + " fun: 6793822783898.12\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 7.75580656e+04, 3.96915387e+06, -2.81799456e-01])\n", + " jac: array([ 3.71447419e+06, 1.99495082e+07, -1.34416872e+01])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 16\n", - " nit: 10\n", - " njev: 16\n", + " nfev: 13\n", + " nit: 9\n", + " njev: 13\n", " status: 0\n", " success: True\n", - " x: array([3.63339968e+00, 1.97932071e-01, 1.00000000e+06])\n" + " x: array([3.61873217e+00, 1.95448280e-01, 1.00000000e+06])\n" ] } ], @@ -855,70 +821,27 @@ { "cell_type": "code", "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "param_evals" - ] - }, - { - "cell_type": "code", - "execution_count": 19, "metadata": { "scrolled": false }, "outputs": [], "source": [ "# Initial guess of parameters, and bounding constraints\n", - "theta = [3, 0.15,1e6]\n", - "boxBounds = [(2,5),(0.0,1.0),(1e6,1e6)]\n", - "\n", "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" ] }, { "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "NormalLoss([3.0, 0.15, 1000000.0], SimulateOde([ODEVariable('S', 'S', None, True), ODEVariable('I', 'I', None, True), ODEVariable('R', 'R', None, True)], [ODEVariable('beta', 'beta', None, True), ODEVariable('gamma', 'gamma', None, True), ODEVariable('N', 'N', None, True)], [], [Transition('S', 'beta*S*I/N', 'T', 'I', None, None), Transition('I', 'gamma*I', 'T', 'R', None, None)], [], []).setParameters({'beta': 3.6333996818761123, 'gamma': 0.19793207076619318, 'N': 1000000.0}), [999998.0, 2.0, 0.0], 0.0, [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0, 5.25, 5.5, 5.75, 6.0, 6.25, 6.5, 6.75, 7.0, 7.25, 7.5, 7.75, 8.0, 8.25, 8.5, 8.75, 9.0, 9.25, 9.5, 9.75, 10.0, 10.25, 10.5, 10.75, 11.0, 11.25, 11.5, 11.75, 12.0, 12.25, 12.5, 12.75, 13.0, 13.25, 13.5, 13.75, 14.0, 14.25, 14.5, 14.75, 15.0, 15.25, 15.5, 15.75, 16.0, 16.25, 16.5, 16.75, 17.0, 17.25, 17.5, 17.75, 18.0, 18.25, 18.5, 18.75, 19.0, 19.25, 19.5, 19.75, 20.0, 20.25, 20.5, 20.75, 21.0, 21.25, 21.5, 21.75, 22.0, 22.25, 22.5, 22.75, 23.0, 23.25, 23.5, 23.75, 24.0, 24.25, 24.5, 24.75, 25.0, 25.25, 25.5, 25.75, 26.0, 26.25, 26.5, 26.75, 27.0, 27.25, 27.5, 27.75, 28.0, 28.25, 28.5, 28.75, 29.0, 29.25, 29.5, 29.75, 30.0, 30.25, 30.5, 30.75, 31.0, 31.25, 31.5, 31.75, 32.0, 32.25, 32.5, 32.75, 33.0, 33.25, 33.5, 33.75, 34.0, 34.25, 34.5, 34.75, 35.0, 35.25, 35.5, 35.75, 36.0, 36.25, 36.5, 36.75, 37.0, 37.25, 37.5, 37.75, 38.0, 38.25, 38.5, 38.75, 39.0, 39.25, 39.5, 39.75, 40.0, 40.25, 40.5, 40.75, 41.0, 41.25, 41.5, 41.75, 42.0, 42.25, 42.5, 42.75, 43.0, 43.25, 43.5, 43.75, 44.0, 44.25, 44.5, 44.75, 45.0, 45.25, 45.5, 45.75, 46.0, 46.25, 46.5, 46.75, 47.0, 47.25, 47.5, 47.75, 48.0, 48.25, 48.5, 48.75, 49.0, 49.25, 49.5, 49.75, 50.0, 50.25, 50.5, 50.75], [[4.130487025131687, 0.15404561775936773], [9.397247964980085, 0.46303278732171177], [22.633824079261842, 1.7992007113807156], [47.986586672487206, 2.7579529325485836], [165.196041952231, 9.600546411428384], [409.7793329814416, 18.59941777036534], [528.9994837079726, 47.98014835106094], [1446.5429145036974, 90.66807675329977], [4994.287706241389, 311.89286846212264], [10103.580369113544, 548.4608589124192], [26194.736213578377, 1402.654912118046], [38389.19639311862, 2236.8590689690504], [144615.6038613682, 4710.739919896741], [204841.14352293048, 12829.825865082867], [304860.2404249535, 26514.684493267272], [715472.6235634295, 66063.90607297285], [570803.6488074489, 75737.62898047472], [947231.3292945497, 154986.247976831], [923953.16649091, 193822.49178823238], [657801.2480252209, 150769.93914359063], [843171.2637992136, 249113.1495604983], [559341.2527328188, 185957.3813357946], [696237.264525381, 403687.88293160085], [540067.5094137926, 266418.8007305509], [457478.5443022633, 388221.974041893], [425920.1427231567, 391122.61823234084], [396908.2854576274, 371414.7879418473], [602102.7053746057, 423352.09770557744], [641769.7394061629, 518903.09780880454], [416901.64080071973, 404368.7588933208], [330039.3314030553, 378696.7305775569], [551529.4145009269, 643412.0070484518], [549787.7820911882, 535688.556709061], [280979.5285986585, 742016.811538869], [466284.35882357555, 614750.051516308], [312148.2058862273, 529680.9650844566], [350953.6705610238, 872215.874672448], [401568.19082765863, 808517.3646270183], [295505.55911352474, 681129.850659894], [316315.37513281166, 659415.8097179801], [195777.4490952229, 679437.4206703037], [194280.03265693723, 721315.4457581254], [178501.10961662387, 675465.1683738899], [247404.53170668957, 985931.5093514766], [299943.4851962682, 764644.9954514606], [148078.91870689174, 898769.9073671738], [203910.04957668108, 710664.8108294513], [198269.08657707038, 550194.198541208], [241973.63044169324, 836300.8441740677], [194887.10906344195, 906544.5642488404], [146665.03014024382, 913739.3641712739], [143779.84227086403, 880070.3435878769], [104096.5358741194, 721086.1047601945], [187776.95624604076, 893932.5009312815], [94145.49095393051, 832234.8307984242], [147360.51529741898, 975970.1109512364], [107959.76674711499, 919504.6172384012], [131352.53801677615, 843986.0818510734], [138134.14244997536, 944445.5248128581], [143810.73000588483, 874698.002250221], [102488.3325125742, 825331.1957907011], [93675.23614669341, 1065797.3512993983], [92885.83732391837, 1155351.0857456843], [66375.89434895372, 988499.2242781295], [106010.1011427728, 810618.6033656059], [104769.0474474182, 639799.6000771984], [64379.976276675065, 1004433.9910370467], [88310.77848764382, 751578.4374513394], [83290.24377534064, 1142480.3506778087], [82370.47996389655, 770222.8341590352], [63637.766473583026, 810851.8091807761], [66788.91229470367, 698840.8146168891], [75102.3290490617, 1035002.7902780143], [62638.27317992859, 683328.3156147334], [41870.43206330126, 729742.0444708264], [60907.32053788277, 1179178.6549844078], [34183.575255148746, 920899.2296020638], [51655.704042085505, 842315.3424291152], [35331.51366160177, 886502.7398532623], [47883.945613707736, 693420.0510623266], [33557.87124412175, 1150074.1571437381], [30499.492761509304, 832594.3834703927], [42733.43248401154, 791261.006569009], [42078.9053350363, 1192499.0062521168], [39537.12490267918, 820574.0244793433], [25766.68117003718, 749084.1915958913], [37431.3006839491, 1146839.7385431828], [19729.377253022878, 688071.6526254383], [17124.35674302549, 1290962.3295776465], [19615.43572022034, 939060.0950318159], [24794.10562003187, 1112677.165293667], [21900.889529328662, 858416.4692184512], [19373.06594088114, 1150876.7459370985], [24118.498247359745, 852800.0837341312], [21207.530605877277, 772057.6638792764], [22267.30551041926, 714074.8898722631], [12497.025723179937, 712008.7912734993], [15065.344990296639, 843052.9384454926], [20199.686086950154, 882232.5677295076], [12391.464759044167, 718155.5097697747], [9937.135196575824, 1227788.641219967], [15492.606340046807, 1133059.0676593857], [14651.76273816029, 882614.1807004922], [15189.523429391971, 1075073.6739545558], [13718.455011597003, 854583.2693140692], [13242.565179358064, 852689.7481448406], [12283.16329964135, 1054384.679136664], [10715.461680060893, 987530.7540134372], [9799.836999306235, 1188662.432761487], [6817.309005236672, 847516.4934806598], [9156.515653966426, 1029834.6994578489], [5647.526250134233, 700227.501149568], [6851.585075787405, 995376.7395363126], [8537.770338276303, 991275.0750426087], [5588.410860946238, 1096531.4230958493], [7832.874408306464, 681290.2321555684], [5385.709166136957, 1288904.2276863966], [5607.200777069934, 679212.9865083437], [7131.98062301099, 1233327.2530472076], [6143.062328777299, 1294580.6293236036], [4116.526919112113, 902602.6246132584], [5555.49183273859, 788062.6499769951], [5945.901312119126, 1236921.6936202012], [4307.837673987712, 1211308.1303755068], [3057.267111272262, 1144766.9718521282], [3412.952069021781, 954158.1280045257], [4857.118212156462, 1287958.9746543085], [2802.7914200776886, 857680.691013031], [3387.914599774963, 863233.6440396649], [3691.679610334573, 1031277.0232285978], [3889.932537061482, 1178453.4027236914], [3175.6272264942872, 897242.264150536], [3321.8016013704805, 1111506.090775924], [2484.743968904745, 1257395.831926505], [2604.1755637616475, 718592.1692915799], [2953.762015063723, 1299568.2114593633], [2674.99903287432, 1021821.7828949532], [1936.840241672874, 709331.3091161926], [2430.32784824078, 1018865.0657590512], [1860.436184602949, 1216703.8610504132], [1723.2315526850525, 856007.9319208895], [1953.6263447660579, 1312810.8625858119], [1858.5407262503563, 677777.0784941971], [1121.841683026275, 1053185.2996789496], [1429.1799261633125, 942788.834721557], [1305.5210429480653, 857145.1282976748], [1558.6548858562132, 1096849.3108424598], [1165.2977247587564, 975845.740861295], [1281.1760431911907, 995327.4595873987], [903.127132888626, 936759.8641734732], [830.0255705095318, 1264058.880523917], [1447.175826672647, 826241.7163334353], [782.9089616625392, 949718.6455322991], [1309.5388116616314, 805544.6451139126], [1020.0814509483284, 1186010.9653905143], [767.2256057638687, 730153.9456574344], [940.5434165348748, 731312.8929979993], [1068.431197781994, 1148310.00282886], [759.4824678568447, 927258.3721201726], [732.4516659883362, 1329935.1271868325], [706.3997339170826, 1184560.8555669347], [767.0434989984218, 798379.2411034874], [530.2926441714136, 1320301.478595184], [527.2703906339111, 1113031.6474556928], [430.5568953988018, 737433.9280313611], [692.1927353827714, 673595.9280200478], [384.23959921185053, 898704.8958790172], [405.6029193272436, 768494.1267053746], [532.3797944208193, 840066.5011984787], [554.3188745851079, 1161649.7413965538], [463.87824061723234, 1073741.3455026292], [308.0292581421485, 673847.3559565375], [462.02471007201643, 1247648.281420697], [403.35869455867373, 1160975.832082224], [267.2020640147793, 1250383.7841186798], [363.8630500648634, 718443.7734347496], [279.6159322070644, 1287801.210123048], [360.1097904304585, 839169.2354281674], [249.32033940693356, 975423.6296495761], [348.83356604943486, 1322801.2214118955], [328.40387580328803, 1221966.218413916], [221.1210037522975, 1324802.975776162], [165.06914366017043, 951352.6052332598], [261.4314897243031, 1099063.4721241775], [247.83450742057468, 840256.1768109152], [232.49428280316337, 1043133.7234717476], [134.23826614735785, 895668.9384443999], [153.20678095501415, 970433.3364156254], [163.3872329739676, 871489.5702094157], [216.6725459496833, 1220808.7783561496], [144.4212576438835, 1225762.0801782524], [192.42606995989752, 740647.2823234415], [96.11282000434359, 904821.5403045765], [166.41677897191434, 975432.1078972422], [118.12562865687576, 1225649.9201249767], [135.81589553462987, 1260216.3663823903], [116.89024486149172, 1195617.0482448642], [97.71131894635056, 833097.6624037084], [86.8018133066483, 1096535.386700453], [94.22066759538556, 850974.2314776242], [93.53703959337743, 1286339.5796547756], [117.26614306573515, 1090935.1549952293], [65.33749823040989, 700052.7320163958]], ['I', 'R'], [[1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0], [1.0, 1.0]])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "objSIR" - ] - }, - { - "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "4516494303083.047" + "4747443113411.479" ] }, - "execution_count": 21, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -929,65 +852,23 @@ }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", - " warn('Method %s cannot handle constraints nor bounds.' % method,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " fun: 3097544513423.658\n", - " hess_inv: array([[ 1.03645359e-11, -4.61156610e-14, 3.16936003e-06],\n", - " [-4.61156587e-14, 4.75500055e-15, -8.98088545e-09],\n", - " [ 3.16936002e-06, -8.98088607e-09, 1.00244138e+00]])\n", - " jac: array([ 9.35430284e+04, -3.55363991e+05, -3.39879219e-01])\n", - " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 55\n", - " nit: 9\n", - " njev: 46\n", - " status: 2\n", - " success: False\n", - " x: array([4.54710725e+00, 1.97932059e-01, 1.25147454e+06])\n" - ] - } - ], - "source": [ - "# perform optimization\n", - "res = minimize(fun=objSIR.cost,\n", - " jac=objSIR.sensitivity,\n", - " x0=theta,\n", - " bounds=boxBounds,\n", - " method='BFGS')\n", - "print(res)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " fun: 3097544513423.661\n", + " fun: 3396911392322.0205\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 3.87782251e+04, 1.98457720e+06, -1.40896750e-01])\n", + " jac: array([ 1.85722536e+06, 9.97472077e+06, -6.72080114e+00])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 16\n", - " nit: 10\n", - " njev: 16\n", + " nfev: 13\n", + " nit: 9\n", + " njev: 13\n", " status: 0\n", " success: True\n", - " x: array([3.63339968e+00, 1.97932071e-01, 1.00000000e+06])\n" + " x: array([3.61873217e+00, 1.95448280e-01, 1.00000000e+06])\n" ] } ], @@ -1003,7 +884,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1047,7 +928,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 22, "metadata": { "scrolled": false }, @@ -1059,36 +940,16 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-5.77039500e+02, -6.96845671e+03, 1.73111850e-03])" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "objSIR.sensitivity()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, + "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5058.726988342257" + "5066.230498539779" ] }, - "execution_count": 27, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1099,56 +960,14 @@ }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", - " warn('Method %s cannot handle constraints nor bounds.' % method,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " fun: 4717.132458517435\n", - " hess_inv: array([[ 3.86858865e-03, -3.00734373e-05, 3.30190074e-06],\n", - " [-3.00734373e-05, 3.91747625e-06, 2.36516472e-08],\n", - " [ 3.30190074e-06, 2.36516472e-08, 1.00000000e+00]])\n", - " jac: array([ 2.13941642e-10, 3.42940432e-08, -7.68280694e-16])\n", - " message: 'Optimization terminated successfully.'\n", - " nfev: 28\n", - " nit: 12\n", - " njev: 27\n", - " status: 0\n", - " success: True\n", - " x: array([3.59089103e+00, 1.99441546e-01, 1.00000000e+06])\n" - ] - } - ], - "source": [ - "# perform optimization\n", - "res = minimize(fun=objSIR.cost,\n", - " jac=objSIR.sensitivity,\n", - " x0=theta,\n", - " bounds=boxBounds,\n", - " method='BFGS')\n", - "print(res)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, + "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", " logpdf_p3= -shape*np.log(mu/shape)\n" ] }, @@ -1156,16 +975,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4717.132458530734\n", + " fun: 4699.518465235284\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([ 1.00361678e-03, -6.86270665e-02, -3.60388445e-09])\n", + " jac: array([-2.55035382e-03, 1.18874416e-01, 9.14788362e-09])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", " nfev: 17\n", " nit: 10\n", " njev: 17\n", " status: 0\n", " success: True\n", - " x: array([3.59089697e+00, 1.99441247e-01, 1.00000000e+06])\n" + " x: array([3.58690764e+00, 1.99822701e-01, 1.00000000e+06])\n" ] } ], @@ -1181,7 +1000,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -1232,218 +1051,218 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[4.000000e+00, 0.000000e+00],\n", - " [9.000000e+00, 0.000000e+00],\n", - " [2.300000e+01, 2.000000e+00],\n", - " [4.800000e+01, 3.000000e+00],\n", - " [1.650000e+02, 1.000000e+01],\n", - " [4.100000e+02, 1.900000e+01],\n", - " [5.290000e+02, 4.800000e+01],\n", - " [1.447000e+03, 9.100000e+01],\n", - " [4.994000e+03, 3.120000e+02],\n", - " [1.010400e+04, 5.480000e+02],\n", - " [2.619500e+04, 1.403000e+03],\n", - " [3.838900e+04, 2.237000e+03],\n", - " [1.446160e+05, 4.711000e+03],\n", - " [2.048410e+05, 1.283000e+04],\n", - " [3.048600e+05, 2.651500e+04],\n", - " [7.154730e+05, 6.606400e+04],\n", - " [5.708040e+05, 7.573800e+04],\n", - " [9.472310e+05, 1.549860e+05],\n", - " [9.239530e+05, 1.938220e+05],\n", - " [6.578010e+05, 1.507700e+05],\n", - " [8.431710e+05, 2.491130e+05],\n", - " [5.593410e+05, 1.859570e+05],\n", - " [6.962370e+05, 4.036880e+05],\n", - " [5.400680e+05, 2.664190e+05],\n", - " [4.574790e+05, 3.882220e+05],\n", - " [4.259200e+05, 3.911230e+05],\n", - " [3.969080e+05, 3.714150e+05],\n", - " [6.021030e+05, 4.233520e+05],\n", - " [6.417700e+05, 5.189030e+05],\n", - " [4.169020e+05, 4.043690e+05],\n", - " [3.300390e+05, 3.786970e+05],\n", - " [5.515290e+05, 6.434120e+05],\n", - " [5.497880e+05, 5.356890e+05],\n", - " [2.809800e+05, 7.420170e+05],\n", - " [4.662840e+05, 6.147500e+05],\n", - " [3.121480e+05, 5.296810e+05],\n", - " [3.509540e+05, 8.722160e+05],\n", - " [4.015680e+05, 8.085170e+05],\n", - " [2.955060e+05, 6.811300e+05],\n", - " [3.163150e+05, 6.594160e+05],\n", - " [1.957770e+05, 6.794370e+05],\n", - " [1.942800e+05, 7.213150e+05],\n", - " [1.785010e+05, 6.754650e+05],\n", - " [2.474050e+05, 9.859320e+05],\n", - " [2.999430e+05, 7.646450e+05],\n", - " [1.480790e+05, 8.987700e+05],\n", - " [2.039100e+05, 7.106650e+05],\n", - " [1.982690e+05, 5.501940e+05],\n", - " [2.419740e+05, 8.363010e+05],\n", - " [1.948870e+05, 9.065450e+05],\n", - " [1.466650e+05, 9.137390e+05],\n", - " [1.437800e+05, 8.800700e+05],\n", - " [1.040970e+05, 7.210860e+05],\n", - " [1.877770e+05, 8.939330e+05],\n", - " [9.414500e+04, 8.322350e+05],\n", - " [1.473610e+05, 9.759700e+05],\n", - " [1.079600e+05, 9.195050e+05],\n", - " [1.313530e+05, 8.439860e+05],\n", - " [1.381340e+05, 9.444460e+05],\n", - " [1.438110e+05, 8.746980e+05],\n", - " [1.024880e+05, 8.253310e+05],\n", - " [9.367500e+04, 1.065797e+06],\n", - " [9.288600e+04, 1.155351e+06],\n", - " [6.637600e+04, 9.884990e+05],\n", - " [1.060100e+05, 8.106190e+05],\n", - " [1.047690e+05, 6.398000e+05],\n", - " [6.438000e+04, 1.004434e+06],\n", - " [8.831100e+04, 7.515780e+05],\n", - " [8.329000e+04, 1.142480e+06],\n", - " [8.237000e+04, 7.702230e+05],\n", - " [6.363800e+04, 8.108520e+05],\n", - " [6.678900e+04, 6.988410e+05],\n", - " [7.510200e+04, 1.035003e+06],\n", - " [6.263800e+04, 6.833280e+05],\n", - " [4.187000e+04, 7.297420e+05],\n", - " [6.090700e+04, 1.179179e+06],\n", - " [3.418400e+04, 9.208990e+05],\n", - " [5.165600e+04, 8.423150e+05],\n", - " [3.533200e+04, 8.865030e+05],\n", - " [4.788400e+04, 6.934200e+05],\n", - " [3.355800e+04, 1.150074e+06],\n", - " [3.049900e+04, 8.325940e+05],\n", - " [4.273300e+04, 7.912610e+05],\n", - " [4.207900e+04, 1.192499e+06],\n", - " [3.953700e+04, 8.205740e+05],\n", - " [2.576700e+04, 7.490840e+05],\n", - " [3.743100e+04, 1.146840e+06],\n", - " [1.972900e+04, 6.880720e+05],\n", - " [1.712400e+04, 1.290962e+06],\n", - " [1.961500e+04, 9.390600e+05],\n", - " [2.479400e+04, 1.112677e+06],\n", - " [2.190100e+04, 8.584160e+05],\n", - " [1.937300e+04, 1.150877e+06],\n", - " [2.411800e+04, 8.528000e+05],\n", - " [2.120800e+04, 7.720580e+05],\n", - " [2.226700e+04, 7.140750e+05],\n", - " [1.249700e+04, 7.120090e+05],\n", - " [1.506500e+04, 8.430530e+05],\n", - " [2.020000e+04, 8.822330e+05],\n", - " [1.239100e+04, 7.181560e+05],\n", - " [9.937000e+03, 1.227789e+06],\n", - " [1.549300e+04, 1.133059e+06],\n", - " [1.465200e+04, 8.826140e+05],\n", - " [1.519000e+04, 1.075074e+06],\n", - " [1.371800e+04, 8.545830e+05],\n", - " [1.324300e+04, 8.526900e+05],\n", - " [1.228300e+04, 1.054385e+06],\n", - " [1.071500e+04, 9.875310e+05],\n", - " [9.800000e+03, 1.188662e+06],\n", - " [6.817000e+03, 8.475160e+05],\n", - " [9.157000e+03, 1.029835e+06],\n", - " [5.648000e+03, 7.002280e+05],\n", - " [6.852000e+03, 9.953770e+05],\n", - " [8.538000e+03, 9.912750e+05],\n", - " [5.588000e+03, 1.096531e+06],\n", - " [7.833000e+03, 6.812900e+05],\n", - " [5.386000e+03, 1.288904e+06],\n", - " [5.607000e+03, 6.792130e+05],\n", - " [7.132000e+03, 1.233327e+06],\n", - " [6.143000e+03, 1.294581e+06],\n", - " [4.117000e+03, 9.026030e+05],\n", - " [5.555000e+03, 7.880630e+05],\n", - " [5.946000e+03, 1.236922e+06],\n", - " [4.308000e+03, 1.211308e+06],\n", - " [3.057000e+03, 1.144767e+06],\n", - " [3.413000e+03, 9.541580e+05],\n", - " [4.857000e+03, 1.287959e+06],\n", - " [2.803000e+03, 8.576810e+05],\n", - " [3.388000e+03, 8.632340e+05],\n", - " [3.692000e+03, 1.031277e+06],\n", - " [3.890000e+03, 1.178453e+06],\n", - " [3.176000e+03, 8.972420e+05],\n", - " [3.322000e+03, 1.111506e+06],\n", - " [2.485000e+03, 1.257396e+06],\n", - " [2.604000e+03, 7.185920e+05],\n", - " [2.954000e+03, 1.299568e+06],\n", - " [2.675000e+03, 1.021822e+06],\n", - " [1.937000e+03, 7.093310e+05],\n", - " [2.430000e+03, 1.018865e+06],\n", - " [1.860000e+03, 1.216704e+06],\n", - " [1.723000e+03, 8.560080e+05],\n", - " [1.954000e+03, 1.312811e+06],\n", - " [1.859000e+03, 6.777770e+05],\n", - " [1.122000e+03, 1.053185e+06],\n", - " [1.429000e+03, 9.427890e+05],\n", - " [1.306000e+03, 8.571450e+05],\n", - " [1.559000e+03, 1.096849e+06],\n", - " [1.165000e+03, 9.758460e+05],\n", - " [1.281000e+03, 9.953270e+05],\n", - " [9.030000e+02, 9.367600e+05],\n", - " [8.300000e+02, 1.264059e+06],\n", - " [1.447000e+03, 8.262420e+05],\n", - " [7.830000e+02, 9.497190e+05],\n", - " [1.310000e+03, 8.055450e+05],\n", - " [1.020000e+03, 1.186011e+06],\n", - " [7.670000e+02, 7.301540e+05],\n", - " [9.410000e+02, 7.313130e+05],\n", - " [1.068000e+03, 1.148310e+06],\n", - " [7.590000e+02, 9.272580e+05],\n", - " [7.320000e+02, 1.329935e+06],\n", - " [7.060000e+02, 1.184561e+06],\n", - " [7.670000e+02, 7.983790e+05],\n", - " [5.300000e+02, 1.320301e+06],\n", - " [5.270000e+02, 1.113032e+06],\n", - " [4.310000e+02, 7.374340e+05],\n", - " [6.920000e+02, 6.735960e+05],\n", - " [3.840000e+02, 8.987050e+05],\n", - " [4.060000e+02, 7.684940e+05],\n", - " [5.320000e+02, 8.400670e+05],\n", - " [5.540000e+02, 1.161650e+06],\n", - " [4.640000e+02, 1.073741e+06],\n", - " [3.080000e+02, 6.738470e+05],\n", - " [4.620000e+02, 1.247648e+06],\n", - " [4.030000e+02, 1.160976e+06],\n", - " [2.670000e+02, 1.250384e+06],\n", - " [3.640000e+02, 7.184440e+05],\n", - " [2.800000e+02, 1.287801e+06],\n", - " [3.600000e+02, 8.391690e+05],\n", - " [2.490000e+02, 9.754240e+05],\n", - " [3.490000e+02, 1.322801e+06],\n", - " [3.280000e+02, 1.221966e+06],\n", - " [2.210000e+02, 1.324803e+06],\n", - " [1.650000e+02, 9.513530e+05],\n", - " [2.610000e+02, 1.099063e+06],\n", - " [2.480000e+02, 8.402560e+05],\n", - " [2.320000e+02, 1.043134e+06],\n", - " [1.340000e+02, 8.956690e+05],\n", - " [1.530000e+02, 9.704330e+05],\n", - " [1.630000e+02, 8.714900e+05],\n", - " [2.170000e+02, 1.220809e+06],\n", - " [1.440000e+02, 1.225762e+06],\n", - " [1.920000e+02, 7.406470e+05],\n", - " [9.600000e+01, 9.048220e+05],\n", - " [1.660000e+02, 9.754320e+05],\n", - " [1.180000e+02, 1.225650e+06],\n", - " [1.360000e+02, 1.260216e+06],\n", - " [1.170000e+02, 1.195617e+06],\n", - " [9.800000e+01, 8.330980e+05],\n", - " [8.700000e+01, 1.096535e+06],\n", - " [9.400000e+01, 8.509740e+05],\n", - " [9.400000e+01, 1.286340e+06],\n", - " [1.170000e+02, 1.090935e+06],\n", - " [6.500000e+01, 7.000530e+05]])" + "array([[2.000000e+00, 0.000000e+00],\n", + " [7.000000e+00, 0.000000e+00],\n", + " [9.000000e+00, 1.000000e+00],\n", + " [2.400000e+01, 1.000000e+00],\n", + " [6.100000e+01, 4.000000e+00],\n", + " [1.410000e+02, 1.000000e+01],\n", + " [3.300000e+02, 2.100000e+01],\n", + " [1.067000e+03, 4.200000e+01],\n", + " [2.225000e+03, 8.600000e+01],\n", + " [3.814000e+03, 2.050000e+02],\n", + " [1.487700e+04, 8.100000e+02],\n", + " [1.911100e+04, 1.751000e+03],\n", + " [4.397700e+04, 3.566000e+03],\n", + " [1.608390e+05, 6.728000e+03],\n", + " [2.170450e+05, 1.735900e+04],\n", + " [3.327830e+05, 4.427900e+04],\n", + " [7.717000e+05, 7.491600e+04],\n", + " [9.202460e+05, 6.710300e+04],\n", + " [5.391150e+05, 1.148730e+05],\n", + " [6.638560e+05, 2.061310e+05],\n", + " [6.561610e+05, 2.138540e+05],\n", + " [8.918150e+05, 1.760330e+05],\n", + " [8.408420e+05, 2.254300e+05],\n", + " [8.227540e+05, 3.605760e+05],\n", + " [7.653000e+05, 2.506620e+05],\n", + " [4.591880e+05, 4.741000e+05],\n", + " [5.213390e+05, 2.919950e+05],\n", + " [4.939920e+05, 5.079050e+05],\n", + " [6.693630e+05, 4.590900e+05],\n", + " [5.781150e+05, 5.795380e+05],\n", + " [5.685050e+05, 5.162470e+05],\n", + " [4.359390e+05, 3.704330e+05],\n", + " [2.996270e+05, 6.155260e+05],\n", + " [4.168740e+05, 7.445460e+05],\n", + " [3.707400e+05, 7.088730e+05],\n", + " [2.692970e+05, 5.373230e+05],\n", + " [4.589900e+05, 7.753300e+05],\n", + " [4.234310e+05, 7.943460e+05],\n", + " [4.073230e+05, 6.949200e+05],\n", + " [3.881820e+05, 6.088340e+05],\n", + " [2.391330e+05, 6.734820e+05],\n", + " [3.446930e+05, 4.847660e+05],\n", + " [2.497650e+05, 5.993870e+05],\n", + " [2.242090e+05, 9.696040e+05],\n", + " [2.421620e+05, 8.638090e+05],\n", + " [2.990560e+05, 1.010657e+06],\n", + " [2.160090e+05, 6.795730e+05],\n", + " [1.422970e+05, 8.521540e+05],\n", + " [1.372620e+05, 6.855140e+05],\n", + " [1.539230e+05, 6.210950e+05],\n", + " [2.345430e+05, 6.813260e+05],\n", + " [1.979330e+05, 6.860320e+05],\n", + " [1.461870e+05, 9.137450e+05],\n", + " [1.561360e+05, 6.160140e+05],\n", + " [1.277300e+05, 6.762660e+05],\n", + " [1.463480e+05, 9.640550e+05],\n", + " [1.323160e+05, 7.103390e+05],\n", + " [9.775100e+04, 9.865430e+05],\n", + " [1.533460e+05, 6.682810e+05],\n", + " [8.386300e+04, 1.138168e+06],\n", + " [9.012300e+04, 9.877300e+05],\n", + " [1.059850e+05, 9.155230e+05],\n", + " [7.086100e+04, 1.141823e+06],\n", + " [1.007030e+05, 8.101170e+05],\n", + " [1.012380e+05, 1.153462e+06],\n", + " [9.930900e+04, 1.003069e+06],\n", + " [6.165300e+04, 1.164938e+06],\n", + " [5.095000e+04, 6.787050e+05],\n", + " [4.826700e+04, 7.181260e+05],\n", + " [7.728900e+04, 1.025843e+06],\n", + " [7.440100e+04, 7.710700e+05],\n", + " [7.219000e+04, 1.031569e+06],\n", + " [6.517500e+04, 9.838750e+05],\n", + " [5.115400e+04, 7.961480e+05],\n", + " [7.019400e+04, 8.791700e+05],\n", + " [5.520100e+04, 1.135801e+06],\n", + " [5.076300e+04, 9.469660e+05],\n", + " [5.274400e+04, 8.146290e+05],\n", + " [4.792900e+04, 7.504540e+05],\n", + " [5.413800e+04, 1.223520e+06],\n", + " [2.676300e+04, 1.234723e+06],\n", + " [4.930500e+04, 1.259851e+06],\n", + " [3.087000e+04, 8.903670e+05],\n", + " [2.987400e+04, 7.531320e+05],\n", + " [4.177900e+04, 1.094089e+06],\n", + " [2.252100e+04, 1.043522e+06],\n", + " [2.226000e+04, 9.825740e+05],\n", + " [3.233100e+04, 1.099825e+06],\n", + " [2.401800e+04, 8.395410e+05],\n", + " [3.042000e+04, 1.213338e+06],\n", + " [2.416000e+04, 9.770080e+05],\n", + " [2.509000e+04, 1.108764e+06],\n", + " [2.733800e+04, 8.726430e+05],\n", + " [1.505200e+04, 1.030471e+06],\n", + " [1.918200e+04, 1.008240e+06],\n", + " [1.980500e+04, 6.741710e+05],\n", + " [2.158400e+04, 8.906860e+05],\n", + " [1.714800e+04, 1.160057e+06],\n", + " [1.739000e+04, 7.119350e+05],\n", + " [1.560900e+04, 1.011386e+06],\n", + " [1.673600e+04, 1.298077e+06],\n", + " [1.220200e+04, 1.180234e+06],\n", + " [1.262400e+04, 7.095090e+05],\n", + " [1.637900e+04, 1.208665e+06],\n", + " [1.118500e+04, 7.728820e+05],\n", + " [9.441000e+03, 1.021119e+06],\n", + " [1.192500e+04, 8.440960e+05],\n", + " [1.187400e+04, 1.025616e+06],\n", + " [9.226000e+03, 8.237110e+05],\n", + " [1.086800e+04, 6.699910e+05],\n", + " [6.151000e+03, 6.876990e+05],\n", + " [9.530000e+03, 9.745360e+05],\n", + " [7.937000e+03, 9.744740e+05],\n", + " [7.258000e+03, 9.252580e+05],\n", + " [7.873000e+03, 6.918360e+05],\n", + " [7.446000e+03, 9.952060e+05],\n", + " [7.226000e+03, 7.702230e+05],\n", + " [6.806000e+03, 6.800870e+05],\n", + " [7.648000e+03, 1.044106e+06],\n", + " [6.162000e+03, 9.667000e+05],\n", + " [6.925000e+03, 9.191240e+05],\n", + " [6.465000e+03, 7.931370e+05],\n", + " [3.553000e+03, 6.755280e+05],\n", + " [5.167000e+03, 7.108370e+05],\n", + " [5.388000e+03, 6.791930e+05],\n", + " [3.561000e+03, 7.423370e+05],\n", + " [4.304000e+03, 1.246687e+06],\n", + " [4.533000e+03, 8.514670e+05],\n", + " [4.186000e+03, 1.200236e+06],\n", + " [3.213000e+03, 9.115580e+05],\n", + " [2.901000e+03, 1.282994e+06],\n", + " [2.941000e+03, 1.163644e+06],\n", + " [2.159000e+03, 1.264644e+06],\n", + " [3.401000e+03, 8.775750e+05],\n", + " [2.461000e+03, 6.721010e+05],\n", + " [1.839000e+03, 8.773200e+05],\n", + " [3.126000e+03, 1.046437e+06],\n", + " [2.208000e+03, 8.601690e+05],\n", + " [2.425000e+03, 1.165708e+06],\n", + " [2.469000e+03, 7.259650e+05],\n", + " [1.388000e+03, 1.030986e+06],\n", + " [2.356000e+03, 8.989240e+05],\n", + " [1.357000e+03, 1.172249e+06],\n", + " [1.244000e+03, 7.215130e+05],\n", + " [1.153000e+03, 1.212616e+06],\n", + " [1.105000e+03, 7.221160e+05],\n", + " [1.336000e+03, 9.124290e+05],\n", + " [1.801000e+03, 1.322164e+06],\n", + " [1.211000e+03, 7.213810e+05],\n", + " [1.304000e+03, 9.482900e+05],\n", + " [8.840000e+02, 9.938950e+05],\n", + " [1.112000e+03, 7.034020e+05],\n", + " [8.050000e+02, 1.098286e+06],\n", + " [1.085000e+03, 1.306771e+06],\n", + " [8.380000e+02, 1.244515e+06],\n", + " [1.217000e+03, 6.741420e+05],\n", + " [6.150000e+02, 1.259647e+06],\n", + " [1.118000e+03, 7.152620e+05],\n", + " [1.051000e+03, 1.014586e+06],\n", + " [8.610000e+02, 9.689560e+05],\n", + " [7.650000e+02, 1.266521e+06],\n", + " [5.880000e+02, 1.299379e+06],\n", + " [6.360000e+02, 1.079381e+06],\n", + " [4.940000e+02, 9.751910e+05],\n", + " [6.260000e+02, 7.180640e+05],\n", + " [7.470000e+02, 1.131469e+06],\n", + " [4.680000e+02, 1.208548e+06],\n", + " [3.950000e+02, 1.273301e+06],\n", + " [6.310000e+02, 1.149921e+06],\n", + " [4.370000e+02, 1.287891e+06],\n", + " [3.060000e+02, 6.839440e+05],\n", + " [5.040000e+02, 1.324297e+06],\n", + " [4.220000e+02, 9.202280e+05],\n", + " [4.640000e+02, 1.225089e+06],\n", + " [3.390000e+02, 8.486330e+05],\n", + " [4.250000e+02, 1.208187e+06],\n", + " [4.330000e+02, 1.036617e+06],\n", + " [4.010000e+02, 1.232717e+06],\n", + " [2.850000e+02, 7.525510e+05],\n", + " [3.000000e+02, 8.188660e+05],\n", + " [2.870000e+02, 9.052010e+05],\n", + " [2.820000e+02, 1.013282e+06],\n", + " [2.440000e+02, 1.234490e+06],\n", + " [2.390000e+02, 1.250816e+06],\n", + " [1.650000e+02, 6.857060e+05],\n", + " [2.240000e+02, 1.135817e+06],\n", + " [1.490000e+02, 6.762300e+05],\n", + " [1.990000e+02, 9.279880e+05],\n", + " [2.270000e+02, 8.986760e+05],\n", + " [2.020000e+02, 9.308700e+05],\n", + " [2.010000e+02, 1.299470e+06],\n", + " [1.970000e+02, 9.945910e+05],\n", + " [1.420000e+02, 1.319829e+06],\n", + " [1.230000e+02, 1.088782e+06],\n", + " [9.500000e+01, 7.524870e+05],\n", + " [9.700000e+01, 7.591230e+05],\n", + " [9.400000e+01, 8.970040e+05],\n", + " [1.120000e+02, 1.111579e+06],\n", + " [8.600000e+01, 6.938370e+05],\n", + " [8.800000e+01, 7.845930e+05],\n", + " [7.300000e+01, 9.737570e+05],\n", + " [8.500000e+01, 1.002185e+06],\n", + " [6.100000e+01, 1.199501e+06]])" ] }, - "execution_count": 31, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1462,7 +1281,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 27, "metadata": { "scrolled": false }, @@ -1474,16 +1293,16 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "8999599.052695096" + "9531545.662791345" ] }, - "execution_count": 33, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1494,65 +1313,23 @@ }, { "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", - " warn('Method %s cannot handle constraints nor bounds.' % method,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " fun: 3555725.9211099287\n", - " hess_inv: array([[ 1.12854102e-07, -2.48584571e-09, 2.27949584e-06],\n", - " [-2.48584571e-09, 9.25888041e-10, 9.47168312e-09],\n", - " [ 2.27949584e-06, 9.47168312e-09, 1.00000832e+00]])\n", - " jac: array([ 1.48618754e-02, -2.24162553e-02, -5.37171184e-08])\n", - " message: 'Desired error not necessarily achieved due to precision loss.'\n", - " nfev: 71\n", - " nit: 11\n", - " njev: 60\n", - " status: 2\n", - " success: False\n", - " x: array([3.61442328e+00, 1.98453976e-01, 9.99999326e+05])\n" - ] - } - ], - "source": [ - "# perform optimization\n", - "res = minimize(fun=objSIR.cost,\n", - " jac=objSIR.sensitivity,\n", - " x0=theta,\n", - " bounds=boxBounds,\n", - " method='BFGS')\n", - "print(res)" - ] - }, - { - "cell_type": "code", - "execution_count": 35, + "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " fun: 3555725.9211287573\n", + " fun: 3907922.0850938573\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([-7.98496027e-01, -2.01665131e+02, 2.88610490e-06])\n", + " jac: array([-1.00647944e-01, -9.22317346e+01, 3.62277449e-07])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", " nfev: 14\n", " nit: 10\n", " njev: 14\n", " status: 0\n", " success: True\n", - " x: array([3.61442613e+00, 1.98453791e-01, 1.00000000e+06])\n" + " x: array([3.59945214e+00, 1.98189223e-01, 1.00000000e+06])\n" ] } ], @@ -1568,7 +1345,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1612,7 +1389,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 31, "metadata": { "scrolled": false }, @@ -1621,9 +1398,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] } @@ -1635,36 +1412,16 @@ }, { "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-2.86825346e+02, -3.46781844e+03, 8.60476039e-04])" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "objSIR.sensitivity()" - ] - }, - { - "cell_type": "code", - "execution_count": 39, + "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "5038.2958154688895" + "5033.73795866175" ] }, - "execution_count": 39, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -1675,56 +1432,14 @@ }, { "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Local\\Continuum\\anaconda3\\envs\\pygomloss20200624\\lib\\site-packages\\scipy\\optimize\\_minimize.py:533: RuntimeWarning: Method BFGS cannot handle constraints nor bounds.\n", - " warn('Method %s cannot handle constraints nor bounds.' % method,\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - " fun: 4868.230711182974\n", - " hess_inv: array([[ 7.84349281e-03, -6.15336988e-05, 1.77314305e-06],\n", - " [-6.15336988e-05, 7.88477962e-06, 1.39267526e-08],\n", - " [ 1.77314305e-06, 1.39267526e-08, 1.00000000e+00]])\n", - " jac: array([-1.03570668e-08, 1.32455900e-07, 3.71928550e-14])\n", - " message: 'Optimization terminated successfully.'\n", - " nfev: 16\n", - " nit: 11\n", - " njev: 16\n", - " status: 0\n", - " success: True\n", - " x: array([3.59106407e+00, 1.99435913e-01, 1.00000000e+06])\n" - ] - } - ], - "source": [ - "# perform optimization\n", - "res = minimize(fun=objSIR.cost,\n", - " jac=objSIR.sensitivity,\n", - " x0=theta,\n", - " bounds=boxBounds,\n", - " method='BFGS')\n", - "print(res)" - ] - }, - { - "cell_type": "code", - "execution_count": 41, + "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev8+g3f90a1d.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] }, @@ -1732,16 +1447,16 @@ "name": "stdout", "output_type": "stream", "text": [ - " fun: 4868.230711171033\n", + " fun: 4851.585921020361\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>\n", - " jac: array([-8.31389989e-04, -6.80463204e-03, 2.98556969e-09])\n", + " jac: array([-1.51180907e-03, -1.39068296e-02, 5.42136740e-09])\n", " message: b'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'\n", - " nfev: 26\n", - " nit: 12\n", - " njev: 26\n", + " nfev: 17\n", + " nit: 11\n", + " njev: 17\n", " status: 0\n", " success: True\n", - " x: array([3.59105802e+00, 1.99435910e-01, 1.00000000e+06])\n" + " x: array([3.58601328e+00, 1.99815114e-01, 1.00000000e+06])\n" ] } ], @@ -1757,7 +1472,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 34, "metadata": {}, "outputs": [ { diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 584fe228..9363e735 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -16,7 +16,6 @@ import numpy as np -from pygom.model._model_errors import InitializeError from pygom.model.ode_utils import check_array_type from pygom.utilR.distn import dpois, gamma_mu_shape, dnbinom @@ -50,16 +49,14 @@ def __init__(self, y, weights=None): self._w = np.ones(self._y.shape) else: self._w = check_array_type(weights,accept_booleans=True) - if np.any(self._w<0.0): + if (self._w<0).any(): raise ValueError('No elements in numpy array of weights should be negative') - if np.all(self._w==0.0): + if (self._w==0).all(): raise ValueError('All elements in numpy array of weights should not be 0.0') if len(self._w.shape) > 1: if 1 in self._w.shape: - self._w = self._w.flatten() - - assert self._y.shape == self._w.shape, \ - "Input weight not of the same size as y" + self._w = self._w.flatten() + assert self._y.shape == self._w.shape, "Input weight not of the same size as y" def residual(self, yhat, apply_weighting = True): ''' @@ -188,7 +185,7 @@ def __init__(self, y, sigma=1.0, weights=None): super().__init__(y, weights) err_str = "Standard deviation not of the correct " if isinstance(sigma, np.ndarray): - if np.any(sigma<0): + if (sigma<0).any(): raise ValueError('No elements in numpy array of sigma values should be negative') elif len(sigma.shape) > 1: if 1 in sigma.shape: @@ -196,12 +193,12 @@ def __init__(self, y, sigma=1.0, weights=None): if y.shape == sigma.shape: self._sigma = sigma else: - raise InitializeError(err_str + "size") + raise AssertionError(err_str + "size") else: if y.shape == sigma.shape: self._sigma = sigma else: - raise InitializeError(err_str + "size") + raise AssertionError(err_str + "size") elif sigma is None or sigma == 1.0: self._sigma = np.ones(self._y.shape) elif isinstance(sigma, (int, float)): @@ -310,7 +307,7 @@ def __init__(self, y, shape=2.0, weights=None): super().__init__(y, weights) err_str = "Shape is not of the correct " if isinstance(shape, np.ndarray): - if np.any(shape<0): + if (shape<0).any(): raise ValueError('No elements in numpy array of shape values should be negative') elif len(shape.shape) > 1: if 1 in shape.shape: @@ -318,12 +315,12 @@ def __init__(self, y, shape=2.0, weights=None): if y.shape == shape.shape: self._shape = shape else: - raise InitializeError(err_str + "size") + raise AssertionError(err_str + "size") else: if y.shape == shape.shape: self._shape = shape else: - raise InitializeError(err_str + "size") + raise AssertionError(err_str + "size") elif shape is None or shape == 2.0: self._shape = 2*np.ones(self._y.shape) elif isinstance(shape, (int, float)): @@ -522,20 +519,20 @@ def __init__(self, y, k=1.0, weights=None): super().__init__(y, weights) err_str = "k (the overdispersion parameter) is not of the correct " if isinstance(k, np.ndarray): - if np.any(k<0): - raise ValueError('No elements in numpy array of shape values should be negative') + if (k<0).any(): + raise ValueError('No elements in numpy array of k values should be negative') elif len(k.shape) > 1: if 1 in k.shape: k = k.flatten() if y.shape == k.shape: self._k = k else: - raise InitializeError(err_str + "size") + raise AssertionError(err_str + "size") else: if y.shape == k.shape: self._k = k else: - raise InitializeError(err_str + "size") + raise AssertionError(err_str + "size") elif k is None or k == 1.0: self._k = np.ones(self._y.shape) elif isinstance(k, (int, float)): diff --git a/tests/test_loss_types.py b/tests/test_loss_types.py index c4d7fc88..6b073328 100644 --- a/tests/test_loss_types.py +++ b/tests/test_loss_types.py @@ -2,48 +2,58 @@ import numpy as np -from pygom import SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss + +from pygom import Transition, TransitionType, SimulateOde, SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss from pygom.model import common_models class Test_Square_loss_class(TestCase): def setUp(self): # initial values - self.x0 = [-1.0, 1.0] + N = 1e6 + in_inf = 1 + self.init_state = [N - in_inf, in_inf, 0.0] # params - self.param_eval = [('a', 0.2), ('b', 0.2),('c', 3.0)] + self.param_eval = [('beta', 3.6), ('gamma', 0.2), ('N', N)] # the time points for our observations - self.t = np.linspace(0, 20, 30).astype('float64') - self.ode = common_models.FitzHugh(self.param_eval) - self.ode.initial_values = (self.x0, self.t[0]) + self.t = np.arange (0 , 51 , 0.25) + states = ['S', 'I', 'R'] + params = ['beta', 'gamma', 'N'] + transitions = [Transition(origin='S', destination='I', equation='beta*S*I/N', + transition_type=TransitionType.T), + Transition(origin='I', destination='R', equation='gamma*I', + transition_type=TransitionType.T)] + self.ode = SimulateOde(states, params, transition=transitions) + self.ode.parameters = self.param_eval + self.ode.initial_values = (self.init_state, self.t[0]) # Standard. Find the solution which we will be used as # "observations later" - self.solution = self.ode.integrate(self.t[1::]) + self.solution = self.ode.integrate(self.t[1:]) # initial guess - self.theta = [0.5, 0.5, 0.5] + self.theta = [3, 0.15,N] - obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R']) + obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) self.r = obj.residual() def test_FH_scalar_weights_for_two_states(self): # weight for each component w = [2.0, 3.0] - + s = 0 for i in range(2): s += ((self.r[:,i]*w[i])**2).sum() - obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R'], w) + obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) self.assertTrue(np.allclose(obj.cost(), s)) def test_FH_vector_weights_for_two_states(self): # now the weight is a vector - w = np.random.rand(29, 2) - obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], - self.t[1::], self.solution[1::,:], ['V', 'R'], w) + w = np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]) + obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) s = ((self.r * np.array(w))**2).sum() @@ -52,15 +62,14 @@ def test_FH_vector_weights_for_two_states(self): def test_FH_1State_weights_Failures_TypeErrors(self): w_list = list() - w_list.append(['a']) - w_list.append([True]) - test_weight=np.ones(len(self.solution[1::,-1])) - test_weight[-1]=False + w_list.append('a') + test_weight=np.ones(len(self.solution[1::,-1])).tolist() + test_weight[-1]='b' w_list.append(test_weight) for w in w_list: with self.subTest('Weightings',w=w): self.assertRaises(TypeError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,-1], + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], 'R', w) def test_FH_1State_weights_Failures_ValueErrors(self): @@ -73,153 +82,79 @@ def test_FH_1State_weights_Failures_ValueErrors(self): for w in w_list: with self.subTest('Weightings',w=w): self.assertRaises(ValueError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,-1], + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], 'R', w) def test_FH_1State_weights_Failures_ShapeErrors(self): w_list = list() w_list.append([2.0, 3.0]) - w_list.append(np.random.rand(30)) + w_list.append(np.random.rand(self.solution[1::,-1].shape[0]+1).tolist()) for w in w_list: with self.subTest('Weightings',w=w): self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,-1], + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], 'R', w) def test_FH_2State_weights_Failures_TypeErrors(self): w_list = list() w_list.append(['a','b']) - w_list.append([True,False]) - test_weight=np.ones(self.solution[1::,:].shape) - test_weight[-1,-1]=False + test_weight=np.ones(self.solution[1::,1:3].shape).tolist() + test_weight[-1][-1]='c' w_list.append(test_weight) for w in w_list: with self.subTest('Weightings',w=w): self.assertRaises(TypeError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - ['V', 'R'], w) + self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], + ['I', 'R'], w) def test_FH_2State_weights_Failures_ValueErrors(self): w_list = list() - test_weight=np.ones(self.solution[1::,:].shape) + test_weight=np.ones(self.solution[1::,1:3].shape) w_list.append(-test_weight) test_weight[-1,-1]=-1 w_list.append(test_weight) - w_list.append(np.zeros(self.solution[1::,:].shape)) + w_list.append(np.zeros(self.solution[1::,1:3].shape)) w_list.append([1.0, -1.0]) w_list.append([0, 0]) for w in w_list: with self.subTest('Weightings',w=w): self.assertRaises(ValueError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - ['V', 'R'], w) + self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], + ['I', 'R'], w) def test_FH_2State_weights_Failures_ShapeErrors(self): w_list = list() w_list.append([2.0, 3.0, 4.0]) - w_list.append(np.random.rand(30)) - w_list.append([np.random.rand(30), np.random.rand(31)]) - w_list.append([np.random.rand(31), np.random.rand(31)]) - w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) + w_list.append(np.random.rand(self.solution[1::,1:3].shape[0])) + w_list.append(np.random.rand(self.solution[1::,1:3].shape[0]+1,self.solution[1::,1:3].shape[1]).tolist()) + w_list.append(np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]+1).tolist()) for w in w_list: with self.subTest('Weightings',w=w): self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, - self.x0, self.t[0], self.t[1::], self.solution[1::,:], - ['V', 'R'], w) + self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], + ['I', 'R'], w) # class Test_Normal_loss_class(TestCase): -# def setUp(self): -# # initial values -# self.x0 = [-1.0, 1.0] -# # params -# self.param_eval = [('a', 0.2), ('b', 0.2),('c', 3.0)] -# # the time points for our observations -# self.t = np.linspace(0, 20, 30).astype('float64') -# self.ode = common_models.FitzHugh(self.param_eval) -# self.ode.initial_values = (self.x0, self.t[0]) - -# # Standard. Find the solution which we will be used as -# # "observations later" -# self.solution = self.ode.integrate(self.t[1::]) -# # initial guess -# self.theta = [0.5, 0.5, 0.5] - -# obj = SquareLoss(self.theta, self.ode, self.x0, self.t[0], -# self.t[1::], self.solution[1::,:], ['V', 'R']) -# self.r = obj.residual() - -# def test_FH_Normal_scalar_weight(self): -# # weight for each component -# w = [2.0, 3.0] - -# s = 0 -# for i in range(2): s += ((self.r[:,i]*w[i])**2).sum() - -# obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], -# self.t[1::], self.solution[1::,:], ['V', 'R'], w) -# self.assertTrue(np.allclose(obj.cost(), s)) - -# def test_FH_Normal_vector_weight(self): -# # now the weight is a vector -# w = np.random.rand(29, 2) -# obj = NormalLoss(self.theta, self.ode, self.x0, self.t[0], -# self.t[1::], self.solution[1::,:], ['V', 'R'], w) - -# s = ((self.r * np.array(w))**2).sum() - -# self.assertTrue(np.allclose(obj.cost(), s)) # def test_FH_Normal(self): -# objFH = NormalLoss(self.theta, self.ode, self.x0, self.t[0], -# self.t[1::], self.solution[1::,:], ['V', 'R']) +# objFH = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], +# self.t[1::], self.solution[1::,1:3], ['I', 'R']) # w = [2.0, 3.0] -# objFH1 = NormalLoss(self.theta, self.ode, self.x0, self.t[0], -# self.t[1::], self.solution[1::,:], ['V', 'R'], w) +# objFH1 = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], +# self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) # # now the weight is a vector # w = np.random.rand(29, 2) -# objFH2 = NormalLoss(self.theta, self.ode, self.x0, self.t[0], -# self.t[1::], self.solution[1::,:], ['V', 'R'], w) +# objFH2 = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], +# self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) # self.assertFalse(np.allclose(objFH.cost(), objFH1.cost())) # self.assertFalse(np.allclose(objFH1.cost(), objFH2.cost())) -# def test_FH_Normal_1State_Fail(self): -# ## totalFail = 0 -# ## expectedFail = 4 -# w_list = list() - -# w_list.append([-1.]) -# w_list.append([0]) -# w_list.append([2.0, 3.0]) -# w_list.append(np.random.rand(30)) - -# for w in w_list: -# self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, -# self.x0, self.t[0], self.t[1::], self.solution[1::,:], -# 'R', w) - -# def test_FH_Normal_2State_Fail(self): -# ## totalFail = 0 -# ## expectedFail = 8 -# w_list = list() - -# w_list.append([-2.0]) -# w_list.append([2.0, 3.0, 4.0]) -# w_list.append([0.0, 0.0]) -# w_list.append([1.0, -1.0]) -# w_list.append(np.random.rand(30)) -# w_list.append([np.random.rand(30), np.random.rand(31)]) -# w_list.append([np.random.rand(31), np.random.rand(31)]) -# w_list.append([np.random.rand(30), np.random.rand(30), np.random.rand(30)]) - -# for w in w_list: -# self.assertRaises(AssertionError, NormalLoss, self.theta, self.ode, -# self.x0, self.t[0], self.t[1::], self.solution[1::,:], -# 'R', w) + if __name__ == '__main__': From 990f8769fb802566f0bd3218e7c36fada5830813 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Wed, 1 Jul 2020 17:12:37 +0100 Subject: [PATCH 011/188] Unittests for weightings and comparison of costs done --- pygom/loss/base_loss.py | 51 ++- pygom/loss/loss_type.py | 6 +- pygom/loss/ode_loss.py | 27 +- .../model/ode_utils/checks_and_conversions.py | 7 +- tests/test_loss_types.py | 337 ++++++++++++++---- 5 files changed, 314 insertions(+), 114 deletions(-) diff --git a/pygom/loss/base_loss.py b/pygom/loss/base_loss.py index 9f6df6d3..e908c33d 100644 --- a/pygom/loss/base_loss.py +++ b/pygom/loss/base_loss.py @@ -44,8 +44,12 @@ class BaseLoss(object): observations state_name: str the state which the observations came from - state_weight: array like + state_weight: array like or none weight for the observations + spread_param: array like or none + spead parameter for obsevations + (e.g. normal, negative binomial and gamma distributions sigma, k and + shape, respectivly). target_param: str or array like parameters that are not fixed target_state: str or array like @@ -55,7 +59,7 @@ class BaseLoss(object): def __init__(self, theta, ode, x0, t0, t, y, - state_name, state_weight=None, + state_name, state_weight=None,spread_param=None, target_param=None, target_state=None): ### Execute all the checks first @@ -136,7 +140,9 @@ def __init__(self, theta, ode, # then if if solution.shape[1] == p: state_name = [str(i) for i in self._ode._iterStateList()] - self._setWeight(n, p, state_weight) + self._weight = self._setWeight_or_spread(n, p, state_weight,is_weights= True) + if spread_param is not None: + self._spread_param = self._setWeight_or_spread(n, p, spread_param,is_weights= False) else: raise InputError("Expecting the name of states " + "for the observations") @@ -145,7 +151,9 @@ def __init__(self, theta, ode, state_name = [state_name] assert p == len(state_name), "len(state_name) and len(y[0]) not equal" - self._setWeight(n, p, state_weight) + self._weight = self._setWeight_or_spread(n, p, state_weight,is_weights= True) + if spread_param is not None: + self._spread_param = self._setWeight_or_spread(n, p, spread_param,is_weights= False) else: raise InputError("State name should be str or of type list/tuple") @@ -1570,37 +1578,46 @@ def _setParam(self, theta): theta = ode_utils.check_array_type(theta) self._theta = np.copy(theta) - def _setWeight(self, n, p, w): + def _setWeight_or_spread(self, n, p, x,is_weights): # note that we NEVER scale the weights # also note that we can use the weights as a control # with normalized input - - w = ode_utils.check_array_type(w) - if len(w) == w.size: - m, q = len(w), 1 + x = ode_utils.check_array_type(x,accept_booleans=is_weights) + + if is_weights== True: + object_type='weights' + else: + object_type='spread parameter values' + + if len(x) == x.size: + m, q = len(x), 1 else: - m, q = w.shape + m, q = x.shape if p == q: if n == m: - self._stateWeight = w + x = x elif m == 1: - self._stateWeight = np.ones((n, p))*w + x = np.ones((n, p))*x else: - raise AssertionError("Number of input weights is not equal " + + raise AssertionError("Number of input " + object_type + + " is not equal " + "to the number of observations") elif p == m: if q == 1: - self._stateWeight = np.ones((n, p))*w + x = np.ones((n, p))*x else: - raise AssertionError("Number of input weights is not equal " + + raise AssertionError("Number of input " + object_type + + " is not equal " + "to number of states") else: if q == 1 and m == 1: - self._stateWeight = np.ones((n, p))*w + x = np.ones((n, p))*x else: - raise AssertionError("Number of input weights differs from " + + raise AssertionError("Number of input " + object_type + + " differs from " + "the number of observations") + return x def _setX0(self, x0): """ diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 9363e735..745fd4ea 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -181,7 +181,7 @@ class Normal(baseloss_type): sigma: float standard deviation ''' - def __init__(self, y, sigma=1.0, weights=None): + def __init__(self, y, weights=None, sigma=1.0): super().__init__(y, weights) err_str = "Standard deviation not of the correct " if isinstance(sigma, np.ndarray): @@ -303,7 +303,7 @@ class Gamma(baseloss_type): shape (a in latex equations) ''' - def __init__(self, y, shape=2.0, weights=None): + def __init__(self, y, weights=None, shape=2.0): super().__init__(y, weights) err_str = "Shape is not of the correct " if isinstance(shape, np.ndarray): @@ -515,7 +515,7 @@ class NegBinom(baseloss_type): Overdispersion parameter (k=mean+mean(mean/variance)) ''' - def __init__(self, y, k=1.0, weights=None): + def __init__(self, y, weights=None, k=1.0): super().__init__(y, weights) err_str = "k (the overdispersion parameter) is not of the correct " if isinstance(k, np.ndarray): diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index e4182f54..ae0992ff 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -24,14 +24,14 @@ class SquareLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, target_param=None, target_state=None): - super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight,target_param, target_state) + super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, + None, target_param, target_state) def __repr__(self): return "SquareLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Square(self._y, self._stateWeight) + self._lossObj = Square(self._y, self._weight) return self._lossObj class NormalLoss(BaseLoss): @@ -40,15 +40,14 @@ class NormalLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, sigma=1.0, target_param=None, target_state=None): - self._sigma=sigma super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight,target_param, target_state) + state_name, state_weight, sigma, target_param, target_state) def __repr__(self): return "NormalLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Normal(self._y,self._sigma, self._stateWeight) + self._lossObj = Normal(self._y, self._weight, self._spread_param) return self._lossObj class GammaLoss(BaseLoss): @@ -57,15 +56,14 @@ class GammaLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, shape=2, target_param=None, target_state=None): - self._shape=shape super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight,target_param, target_state) + state_name, state_weight, shape,target_param, target_state) def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Gamma(self._y,self._shape,self._stateWeight) + self._lossObj = Gamma(self._y, self._weight, self._spread_param) return self._lossObj class PoissonLoss(BaseLoss): @@ -74,14 +72,14 @@ class PoissonLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, target_param=None, target_state=None): - super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight,target_param, target_state) + super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, + None,target_param, target_state) def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Poisson(self._y,self._stateWeight) + self._lossObj = Poisson(self._y,self._weight) return self._lossObj class NegBinomLoss(BaseLoss): @@ -90,13 +88,12 @@ class NegBinomLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, k=1, target_param=None, target_state=None): - self._k=k super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight,target_param, target_state) + state_name, state_weight, k, target_param, target_state) def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = NegBinom(self._y,self._k,self._stateWeight) + self._lossObj = NegBinom(self._y, self._weight,self._spread_param) return self._lossObj \ No newline at end of file diff --git a/pygom/model/ode_utils/checks_and_conversions.py b/pygom/model/ode_utils/checks_and_conversions.py index b9817d85..9d24c5a3 100644 --- a/pygom/model/ode_utils/checks_and_conversions.py +++ b/pygom/model/ode_utils/checks_and_conversions.py @@ -55,7 +55,12 @@ def check_array_type(x,accept_booleans=False): else: raise TypeError(type_error_message) elif isinstance(x, accepted_types): - x = np.array([x]) + if accept_booleans==True: + x = np.array(x) + elif accept_booleans==False and not isinstance(x, bool): + x = np.array(x) + else: + TypeError("Not expecting Boolean value") else: raise TypeError("Expecting an array like object, got %s" % type(x)) diff --git a/tests/test_loss_types.py b/tests/test_loss_types.py index 6b073328..0a923a9a 100644 --- a/tests/test_loss_types.py +++ b/tests/test_loss_types.py @@ -4,9 +4,8 @@ from pygom import Transition, TransitionType, SimulateOde, SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss -from pygom.model import common_models -class Test_Square_loss_class(TestCase): +class Test_loss_classes(TestCase): def setUp(self): # initial values @@ -32,83 +31,170 @@ def setUp(self): self.solution = self.ode.integrate(self.t[1:]) # initial guess self.theta = [3, 0.15,N] + + def test_all_Loss_functions_produce_different_costs(self): + Square_obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + Normal_obj = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + Gamma_obj = GammaLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + Poisson_obj = PoissonLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + NegBinom_obj = NegBinomLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + + comparisons = [[Square_obj.cost(),Normal_obj.cost(),'SquareLoss compared to NormalLoss'], + [Square_obj.cost(),Gamma_obj.cost(),'SquareLoss compared to GammaLoss'], + [Square_obj.cost(),Poisson_obj.cost(),'SquareLoss compared to PossionLoss'], + [Square_obj.cost(),NegBinom_obj.cost(),'SquareLoss compared to NegBinomLoss'], + [Normal_obj.cost(),Gamma_obj.cost(),'NormalLoss compared to GammaLoss'], + [Normal_obj.cost(),Poisson_obj.cost(),'NormalLoss compared to PossionLoss'], + [Normal_obj.cost(),NegBinom_obj.cost(),'NormalLoss compared to NegBinomLoss'], + [Gamma_obj.cost(),Poisson_obj.cost(),'GammaLoss compared to PossionLoss'], + [Gamma_obj.cost(),NegBinom_obj.cost(),'GammaLoss compared to NegBinomLoss'], + [Poisson_obj.cost(),NegBinom_obj.cost(),'PoissonLoss compared to NegBinomLoss'] + ] + + for comparison in comparisons: + message = comparison[-1] + with self.subTest(message): + self.assertNotAlmostEqual(comparison[0],comparison[1],places=2) - obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], - self.t[1::], self.solution[1::,1:3], ['I', 'R']) - self.r = obj.residual() - def test_FH_scalar_weights_for_two_states(self): + def test_Square_and_Normal_Loss_cost_scalar_weights_for_two_states(self): + loss_functions = [SquareLoss, NormalLoss] # weight for each component w = [2.0, 3.0] - s = 0 - for i in range(2): s += ((self.r[:,i]*w[i])**2).sum() - obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], - self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - - self.assertTrue(np.allclose(obj.cost(), s)) + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + self.r = obj.residual() + residual = [] + for i in range(2): + residual.append(self.r[:,i]*w[i]) + + residual = np.array(residual) + + square_cost = (residual**2).sum() + sigma= 1 + norm_logpdf_p1= -np.log(2) + norm_logpdf_p2= np.log(2)/2 + norm_logpdf_p3= -np.log(np.pi)/2 + norm_logpdf_p4= np.log(1/sigma) + norm_logpdf_p5_alt= -residual**2 / (2*sigma**2) + norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + test_answers=[square_cost,norm_cost] + + for loss_function_index in range(len(loss_functions)): + loss_function= loss_functions[loss_function_index] + message = str(loss_function) + with self.subTest(message): + obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=2) - def test_FH_vector_weights_for_two_states(self): + def test_Square_and_Normal_Loss_cost_vector_weights_for_two_states(self): + loss_functions = [SquareLoss, NormalLoss] + obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R']) + self.r = obj.residual() # now the weight is a vector w = np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]) - obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], - self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - - s = ((self.r * np.array(w))**2).sum() - - self.assertTrue(np.allclose(obj.cost(), s)) - + + residual = self.r* np.array(w) + square_cost = (residual**2).sum() + sigma= 1 + norm_logpdf_p1= -np.log(2) + norm_logpdf_p2= np.log(2)/2 + norm_logpdf_p3= -np.log(np.pi)/2 + norm_logpdf_p4= np.log(1/sigma) + norm_logpdf_p5_alt= -residual**2 / (2*sigma**2) + norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + + test_answers=[square_cost,norm_cost] - def test_FH_1State_weights_Failures_TypeErrors(self): + for loss_function_index in range(len(loss_functions)): + loss_function= loss_functions[loss_function_index] + message = str(loss_function) + with self.subTest(message): + obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=2) + + + def test_All_Loss_functions_1State_weights_Failures_TypeErrors(self): + loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() w_list.append('a') test_weight=np.ones(len(self.solution[1::,-1])).tolist() test_weight[-1]='b' w_list.append(test_weight) - for w in w_list: - with self.subTest('Weightings',w=w): - self.assertRaises(TypeError, SquareLoss, self.theta, self.ode, - self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], - 'R', w) + for loss_function in loss_functions: + for weight_index in range(len(w_list)): + w = w_list[weight_index] + message = str(loss_function)+' with weighting '+str(weight_index) + with self.subTest(message): + self.assertRaises(TypeError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', w) - def test_FH_1State_weights_Failures_ValueErrors(self): + def test_AllLoss_1State_weights_Failures_ValueErrors(self): + loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() + w_list.append(-1) + w_list.append(0) test_weight=np.ones(len(self.solution[1::,-1])) w_list.append(-test_weight) test_weight[-1]=-1 w_list.append(test_weight) w_list.append(np.zeros(len(self.solution[1::,-1]))) - for w in w_list: - with self.subTest('Weightings',w=w): - self.assertRaises(ValueError, SquareLoss, self.theta, self.ode, - self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], - 'R', w) + for loss_function in loss_functions: + for weight_index in range(len(w_list)): + w = w_list[weight_index] + message = str(loss_function)+' with weighting '+str(weight_index) + with self.subTest(message): + self.assertRaises(ValueError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', w) - def test_FH_1State_weights_Failures_ShapeErrors(self): + def test_AllLoss_1State_weights_Failures_ShapeErrors(self): + loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() w_list.append([2.0, 3.0]) w_list.append(np.random.rand(self.solution[1::,-1].shape[0]+1).tolist()) - for w in w_list: - with self.subTest('Weightings',w=w): - self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, - self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], - 'R', w) + for loss_function in loss_functions: + for weight_index in range(len(w_list)): + w = w_list[weight_index] + message = str(loss_function)+' with weighting '+str(weight_index) + with self.subTest(message): + self.assertRaises(AssertionError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', w) - def test_FH_2State_weights_Failures_TypeErrors(self): + def test_AllLoss_2State_weights_Failures_TypeErrors(self): + loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() w_list.append(['a','b']) test_weight=np.ones(self.solution[1::,1:3].shape).tolist() test_weight[-1][-1]='c' w_list.append(test_weight) - for w in w_list: - with self.subTest('Weightings',w=w): - self.assertRaises(TypeError, SquareLoss, self.theta, self.ode, - self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], - ['I', 'R'], w) + for loss_function in loss_functions: + for weight_index in range(len(w_list)): + w = w_list[weight_index] + message = str(loss_function)+' with weighting '+str(weight_index) + with self.subTest(message): + self.assertRaises(TypeError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], + self.solution[1::,1:3],['I', 'R'], w) - def test_FH_2State_weights_Failures_ValueErrors(self): + def test_AllLoss_2State_weights_Failures_ValueErrors(self): + loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() + w_list.append(-1) + w_list.append(0) test_weight=np.ones(self.solution[1::,1:3].shape) w_list.append(-test_weight) test_weight[-1,-1]=-1 @@ -116,46 +202,141 @@ def test_FH_2State_weights_Failures_ValueErrors(self): w_list.append(np.zeros(self.solution[1::,1:3].shape)) w_list.append([1.0, -1.0]) w_list.append([0, 0]) - for w in w_list: - with self.subTest('Weightings',w=w): - self.assertRaises(ValueError, SquareLoss, self.theta, self.ode, - self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], - ['I', 'R'], w) + for loss_function in loss_functions: + for weight_index in range(len(w_list)): + w = w_list[weight_index] + message = str(loss_function)+' with weighting '+str(weight_index) + with self.subTest(message): + self.assertRaises(ValueError, loss_function, self.theta, + self.ode,self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], + ['I', 'R'], w) - def test_FH_2State_weights_Failures_ShapeErrors(self): + def test_AllLoss_2State_weights_Failures_ShapeErrors(self): + loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() w_list.append([2.0, 3.0, 4.0]) w_list.append(np.random.rand(self.solution[1::,1:3].shape[0])) w_list.append(np.random.rand(self.solution[1::,1:3].shape[0]+1,self.solution[1::,1:3].shape[1]).tolist()) w_list.append(np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]+1).tolist()) - for w in w_list: - with self.subTest('Weightings',w=w): - self.assertRaises(AssertionError, SquareLoss, self.theta, self.ode, - self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], - ['I', 'R'], w) - -# class Test_Normal_loss_class(TestCase): - - - -# def test_FH_Normal(self): -# objFH = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], -# self.t[1::], self.solution[1::,1:3], ['I', 'R']) - -# w = [2.0, 3.0] -# objFH1 = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], -# self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - -# # now the weight is a vector -# w = np.random.rand(29, 2) -# objFH2 = NormalLoss(self.theta, self.ode, self.init_state, self.t[0], -# self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - -# self.assertFalse(np.allclose(objFH.cost(), objFH1.cost())) -# self.assertFalse(np.allclose(objFH1.cost(), objFH2.cost())) - - + for loss_function in loss_functions: + for weight_index in range(len(w_list)): + w = w_list[weight_index] + message = str(loss_function)+' with weighting '+str(weight_index) + with self.subTest(message): + self.assertRaises(AssertionError, loss_function, self.theta, + self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], + ['I', 'R'], w) + + + def test_Applicable_Loss_functions_1State_spread_param_Failures_TypeErrors(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + spread_param_list = list() + spread_param_list.append('a') + spread_param_list.append(True) + test_spread_param=np.ones(len(self.solution[1::,-1])).tolist() + test_spread_param[-1]='b' + spread_param_list.append(test_spread_param) + test_spread_param[-1]=False + spread_param_list.append(test_spread_param) + for loss_function in loss_functions: + for spread_param_index in range(len(spread_param_list)): + spread_param = spread_param_list[spread_param_index] + message = str(loss_function)+' with spread params '+str(spread_param_index) + with self.subTest(message): + self.assertRaises(TypeError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', None,spread_param) + + def test_Applicable_Loss_functionss_1State_spread_param_Failures_ValueErrors(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + spread_param_list = list() + spread_param_list.append(-1) + test_spread_param=np.ones(len(self.solution[1::,-1])) + spread_param_list.append(-test_spread_param) + test_spread_param[-1]=-1 + spread_param_list.append(test_spread_param) + for loss_function in loss_functions: + for spread_param_index in range(len(spread_param_list)): + spread_param = spread_param_list[spread_param_index] + message = str(loss_function)+' with spread params'+str(spread_param_index) + with self.subTest(message): + self.assertRaises(ValueError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', None,spread_param) + + def test_Applicable_Loss_functions_1State_spread_param_Failures_ShapeErrors(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + spread_param_list = list() + spread_param_list.append([2.0, 3.0]) + spread_param_list.append(np.random.rand(self.solution[1::,-1].shape[0]+1).tolist()) + for loss_function in loss_functions: + for spread_param_index in range(len(spread_param_list)): + spread_param = spread_param_list[spread_param_index] + message = str(loss_function)+' with spread params'+str(spread_param_index) + with self.subTest(message): + self.assertRaises(AssertionError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], + 'R', None,spread_param) + def test_Applicable_Loss_functions_2State_spread_param_Failures_TypeErrors(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + spread_param_list = list() + spread_param_list.append('a') + spread_param_list.append(True) + spread_param_list.append(['a','b']) + spread_param_list.append([True,False]) + test_spread_param=np.ones(self.solution[1::,1:3].shape).tolist() + test_spread_param[-1][-1]='c' + spread_param_list.append(test_spread_param) + test_spread_param[-1][-1]=False + spread_param_list.append(test_spread_param) + for loss_function in loss_functions: + for spread_param_index in range(len(spread_param_list)): + spread_param = spread_param_list[spread_param_index] + message = str(loss_function)+' with spread params'+str(spread_param_index) + with self.subTest(message): + self.assertRaises(TypeError, loss_function, self.theta, self.ode, + self.init_state, self.t[0], self.t[1::], + self.solution[1::,1:3],['I', 'R'], None,spread_param) + + def test_Applicable_Loss_functions_2State_spread_param_Failures_ValueErrors(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + spread_param_list = list() + spread_param_list.append(-1) + test_spread_param=np.ones(self.solution[1::,1:3].shape) + spread_param_list.append(-test_spread_param) + test_spread_param[-1,-1]=-1 + spread_param_list.append(test_spread_param) + spread_param_list.append([1.0, -1.0]) + spread_param_list.append([-1.0, -1.0]) + for loss_function in loss_functions: + for spread_param_index in range(len(spread_param_list)): + spread_param = spread_param_list[spread_param_index] + message = str(loss_function)+' with spread params'+str(spread_param_index) + with self.subTest(message): + self.assertRaises(ValueError, loss_function, self.theta, + self.ode,self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], + ['I', 'R'], None,spread_param) + + def test_Applicable_Loss_functions_2State_spread_param_Failures_ShapeErrors(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + spread_param_list = list() + spread_param_list.append([2.0, 3.0, 4.0]) + spread_param_list.append(np.random.rand(self.solution[1::,1:3].shape[0])) + spread_param_list.append(np.random.rand(self.solution[1::,1:3].shape[0]+1,self.solution[1::,1:3].shape[1]).tolist()) + spread_param_list.append(np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]+1).tolist()) + for loss_function in loss_functions: + for spread_param_index in range(len(spread_param_list)): + spread_param = spread_param_list[spread_param_index] + message = str(loss_function)+' with spread params'+str(spread_param_index) + with self.subTest(message): + self.assertRaises(AssertionError, loss_function, self.theta, + self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], + ['I', 'R'], None,spread_param) if __name__ == '__main__': main() From 2395c5544640d4de1fa9513c1a405b1ba40f1414 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Thu, 2 Jul 2020 13:28:11 +0100 Subject: [PATCH 012/188] Finished unittesting new loss functions, leading to several bug fixes and improvements --- ...s functions fitted to simulated data.ipynb | 294 ++++++++++-------- pygom/loss/base_loss.py | 23 +- .../model/ode_utils/checks_and_conversions.py | 28 +- tests/test_loss_types.py | 171 ++++++---- 4 files changed, 302 insertions(+), 214 deletions(-) diff --git a/notebooks/Testing loss functions fitted to simulated data.ipynb b/notebooks/Testing loss functions fitted to simulated data.ipynb index 150ab517..dc0c813b 100644 --- a/notebooks/Testing loss functions fitted to simulated data.ipynb +++ b/notebooks/Testing loss functions fitted to simulated data.ipynb @@ -660,26 +660,6 @@ "data_to_fit" ] }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "406" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.prod(data_to_fit.shape)" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -689,7 +669,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -698,7 +678,7 @@ "[('beta', 3.6), ('gamma', 0.2), ('N', 1000000.0)]" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -709,22 +689,7 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Initial guess of parameters, and bounding constraints\n", - "theta = [3, 0.15,N]\n", - "boxBounds = [(2,5),(0.0,1.0),(N,N)]\n", - "\n", - "objSIR = SquareLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" - ] - }, - { - "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -733,18 +698,24 @@ "9494886226076.777" ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "theta = [3, 0.15,N]\n", + "boxBounds = [(2,5),(0.0,1.0),(N,N)]\n", + "\n", + "objSIR = SquareLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])\n", + "\n", "objSIR.cost()" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -776,7 +747,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -820,19 +791,7 @@ }, { "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Initial guess of parameters, and bounding constraints\n", - "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" - ] - }, - { - "cell_type": "code", - "execution_count": 19, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -841,18 +800,21 @@ "4747443113411.479" ] }, - "execution_count": 19, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])\n", + "\n", "objSIR.cost()" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -884,7 +846,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -920,27 +882,61 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 20, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "18989772452245.23" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "## Fitting Gamma loss" + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'],sigma=0.5)\n", + "\n", + "objSIR.cost()" ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": false - }, - "outputs": [], + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5804367986465.104" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Initial guess of parameters, and bounding constraints\n", - "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])" + "objSIR = NormalLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'],sigma=[0.5,1.5])\n", + "\n", + "objSIR.cost()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fitting Gamma loss" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -949,25 +945,28 @@ "5066.230498539779" ] }, - "execution_count": 23, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'])\n", + "\n", "objSIR.cost()" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev11+g990f876.d20200702-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:108: RuntimeWarning: invalid value encountered in log\n", " logpdf_p3= -shape*np.log(mu/shape)\n" ] }, @@ -1000,7 +999,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -1035,6 +1034,52 @@ "display(theta,boxBounds,param_evals)" ] }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5105.389439344021" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'],shape=0.5)\n", + "\n", + "objSIR.cost()" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5044.423929863387" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = GammaLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=data_to_fit, state_name=['I','R'],shape=[0.5,1])\n", + "\n", + "objSIR.cost()" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1051,7 +1096,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1262,7 +1307,7 @@ " [6.100000e+01, 1.199501e+06]])" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1279,18 +1324,6 @@ "## Poisson loss" ] }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Initial guess of parameters, and bounding constraints\n", - "objSIR = PoissonLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'])" - ] - }, { "cell_type": "code", "execution_count": 28, @@ -1308,6 +1341,9 @@ } ], "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = PoissonLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'])\n", + "\n", "objSIR.cost()" ] }, @@ -1390,56 +1426,46 @@ { "cell_type": "code", "execution_count": 31, - "metadata": { - "scrolled": false - }, + "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev11+g990f876.d20200702-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: divide by zero encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n", - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev11+g990f876.d20200702-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in multiply\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] - } - ], - "source": [ - "# Initial guess of parameters, and bounding constraints\n", - "objSIR = NegBinomLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'])" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ + }, { "data": { "text/plain": [ "5033.73795866175" ] }, - "execution_count": 32, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = NegBinomLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'])\n", + "\n", "objSIR.cost()" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev9+g9b40b86.d20200630-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", + "C:\\Users\\martin.grunnill\\AppData\\Roaming\\Python\\Python38\\site-packages\\pygom-0.1.7.dev11+g990f876.d20200702-py3.8-win-amd64.egg\\pygom\\utilR\\distn.py:450: RuntimeWarning: invalid value encountered in log\n", " logpmf_p4= x*(np.log(mu) - np.log(k + mu))\n" ] }, @@ -1472,7 +1498,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -1509,31 +1535,49 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "5107.155188410919" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = NegBinomLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'],k=0.5)\n", + "\n", + "objSIR.cost()" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "5024.382571986069" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Initial guess of parameters, and bounding constraints\n", + "objSIR = NegBinomLoss(theta, model, x0=data[0,:], t0=t[0], t=t[1::], y=int_data_to_fit, state_name=['I','R'],k=[0.5,1.5])\n", + "\n", + "objSIR.cost()" + ] } ], "metadata": { diff --git a/pygom/loss/base_loss.py b/pygom/loss/base_loss.py index e908c33d..826ad453 100644 --- a/pygom/loss/base_loss.py +++ b/pygom/loss/base_loss.py @@ -207,8 +207,8 @@ def _get_model_str(self): self._observeT.tolist(), self._y.tolist(), self._stateName) - if self._stateWeight is not None: - model_str += ", %s" % self._stateWeight.tolist() + if self._weight is not None: + model_str += ", %s" % self._weight.tolist() if self._targetParam is not None: model_str += ", %s" % self._targetParam if self._targetState is not None: @@ -1169,7 +1169,7 @@ def sens_to_grad(self, sens, diff_loss): sens = np.reshape(sens, (n, num_s, num_out), 'F') for j in range(num_out): - sens[:, :, j] *= self._stateWeight + sens[:, :, j] *= self._weight grad = functools.reduce(np.add,map(np.dot, diff_loss, sens)).ravel() @@ -1209,7 +1209,7 @@ def sens_to_jtj(self, sens, resid=None): sens = np.reshape(sens, (n, num_s, num_out), 'F') for j in range(num_out): - sens[:,:,j] *= self._stateWeight + sens[:,:,j] *= self._weight for i, s in enumerate(sens): if resid is None: @@ -1581,13 +1581,12 @@ def _setParam(self, theta): def _setWeight_or_spread(self, n, p, x,is_weights): # note that we NEVER scale the weights # also note that we can use the weights as a control - # with normalized input + # with normalized input x = ode_utils.check_array_type(x,accept_booleans=is_weights) - if is_weights== True: - object_type='weights' + object_contents='weights' else: - object_type='spread parameter values' + object_contents='spread parameter values' if len(x) == x.size: m, q = len(x), 1 @@ -1600,21 +1599,21 @@ def _setWeight_or_spread(self, n, p, x,is_weights): elif m == 1: x = np.ones((n, p))*x else: - raise AssertionError("Number of input " + object_type + + raise AssertionError("Number of input " + object_contents + " is not equal " + "to the number of observations") elif p == m: if q == 1: x = np.ones((n, p))*x else: - raise AssertionError("Number of input " + object_type + + raise AssertionError("Number of input " + object_contents + " is not equal " + "to number of states") else: if q == 1 and m == 1: x = np.ones((n, p))*x else: - raise AssertionError("Number of input " + object_type + + raise AssertionError("Number of input " + object_contents + " differs from " + "the number of observations") return x @@ -1633,7 +1632,7 @@ def _setLossType(self): be override in the module odeLoss. Basically, all other operations remains but this will change. """ - self._lossObj = Square(self._y, self._stateWeight) + self._lossObj = Square(self._y, self._weight) return self._lossObj def _unrollParam(self, theta): diff --git a/pygom/model/ode_utils/checks_and_conversions.py b/pygom/model/ode_utils/checks_and_conversions.py index 9d24c5a3..8ca427fc 100644 --- a/pygom/model/ode_utils/checks_and_conversions.py +++ b/pygom/model/ode_utils/checks_and_conversions.py @@ -37,28 +37,26 @@ def check_array_type(x,accept_booleans=False): if all(isinstance(item, accepted_types) for item in x): if accept_booleans==True: x = np.array(x) - elif accept_booleans==False and all(not isinstance(item, bool) for item in x): + elif accept_booleans==False: + if any(isinstance(item, bool) for item in x): + raise TypeError('No elements of array type object should be Boolean values') x = np.array(x) else: TypeError(type_error_message) elif isinstance(x[0], (list, tuple, np.ndarray)): - sub_items_accepted = [] for item in x: - if accept_booleans==False: - sub_items_accepted.append(all(isinstance(sub_item, accepted_types) for sub_item in item)*all(not isinstance(sub_item, bool) for sub_item in item)) - if accept_booleans==True: - sub_items_accepted.append(all(isinstance(sub_item, accepted_types) for sub_item in item)) - if all(sub_items_accepted): - x = np.array(x) - else: - raise TypeError(type_error_message) + if any(not isinstance(sub_item, accepted_types) for sub_item in item): + raise TypeError(type_error_message) + if accept_booleans==False and any(isinstance(sub_item, bool) for sub_item in item): + raise TypeError('No elements of array type object should be Boolean values') + x = np.array(x) else: raise TypeError(type_error_message) elif isinstance(x, accepted_types): if accept_booleans==True: - x = np.array(x) + x = np.array([x]) elif accept_booleans==False and not isinstance(x, bool): - x = np.array(x) + x = np.array([x]) else: TypeError("Not expecting Boolean value") else: @@ -91,8 +89,8 @@ def check_dimension(x, y): x = check_array_type(x) if len(y) != len(x): - raise InputError("The number of observations and time points " + - "should have the same length") + raise AssertionError("The number of observations and time points " + + "should have the same length") return (x, y) @@ -137,7 +135,7 @@ def str_or_list(x): elif isinstance(x, str): return [x] else: - raise InputError("Expecting a string or list") + raise TypeError("Expecting a string or list") def none_or_empty_list(x): diff --git a/tests/test_loss_types.py b/tests/test_loss_types.py index 0a923a9a..8de89766 100644 --- a/tests/test_loss_types.py +++ b/tests/test_loss_types.py @@ -4,6 +4,8 @@ from pygom import Transition, TransitionType, SimulateOde, SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss +from pygom.utilR.distn import gamma_mu_shape, dnbinom +import copy class Test_loss_classes(TestCase): @@ -30,7 +32,10 @@ def setUp(self): # "observations later" self.solution = self.ode.integrate(self.t[1:]) # initial guess - self.theta = [3, 0.15,N] + self.theta = [3.6, 0.2,N] + self.yhat_ode=copy.deepcopy(self.ode) + self.yhat_ode.parameters = [('beta', self.theta[0]), ('gamma', self.theta[1]), ('N', N)] + self.yhat= self.yhat_ode.integrate(self.t[1:]) def test_all_Loss_functions_produce_different_costs(self): Square_obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], @@ -45,34 +50,31 @@ def test_all_Loss_functions_produce_different_costs(self): self.t[1::], self.solution[1::,1:3], ['I', 'R']) comparisons = [[Square_obj.cost(),Normal_obj.cost(),'SquareLoss compared to NormalLoss'], - [Square_obj.cost(),Gamma_obj.cost(),'SquareLoss compared to GammaLoss'], - [Square_obj.cost(),Poisson_obj.cost(),'SquareLoss compared to PossionLoss'], - [Square_obj.cost(),NegBinom_obj.cost(),'SquareLoss compared to NegBinomLoss'], - [Normal_obj.cost(),Gamma_obj.cost(),'NormalLoss compared to GammaLoss'], - [Normal_obj.cost(),Poisson_obj.cost(),'NormalLoss compared to PossionLoss'], - [Normal_obj.cost(),NegBinom_obj.cost(),'NormalLoss compared to NegBinomLoss'], - [Gamma_obj.cost(),Poisson_obj.cost(),'GammaLoss compared to PossionLoss'], - [Gamma_obj.cost(),NegBinom_obj.cost(),'GammaLoss compared to NegBinomLoss'], - [Poisson_obj.cost(),NegBinom_obj.cost(),'PoissonLoss compared to NegBinomLoss'] - ] + [Square_obj.cost(),Gamma_obj.cost(),'SquareLoss compared to GammaLoss'], + [Square_obj.cost(),Poisson_obj.cost(),'SquareLoss compared to PossionLoss'], + [Square_obj.cost(),NegBinom_obj.cost(),'SquareLoss compared to NegBinomLoss'], + [Normal_obj.cost(),Gamma_obj.cost(),'NormalLoss compared to GammaLoss'], + [Normal_obj.cost(),Poisson_obj.cost(),'NormalLoss compared to PossionLoss'], + [Normal_obj.cost(),NegBinom_obj.cost(),'NormalLoss compared to NegBinomLoss'], + [Gamma_obj.cost(),Poisson_obj.cost(),'GammaLoss compared to PossionLoss'], + [Gamma_obj.cost(),NegBinom_obj.cost(),'GammaLoss compared to NegBinomLoss'], + [Poisson_obj.cost(),NegBinom_obj.cost(),'PoissonLoss compared to NegBinomLoss'] + ] for comparison in comparisons: message = comparison[-1] with self.subTest(message): - self.assertNotAlmostEqual(comparison[0],comparison[1],places=2) + self.assertNotAlmostEqual(comparison[0],comparison[1],places=0) def test_Square_and_Normal_Loss_cost_scalar_weights_for_two_states(self): loss_functions = [SquareLoss, NormalLoss] # weight for each component w = [2.0, 3.0] - - obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], - self.t[1::], self.solution[1::,1:3], ['I', 'R']) - self.r = obj.residual() + r = self.solution[1::,1:3]-self.yhat[1::,1:3] residual = [] for i in range(2): - residual.append(self.r[:,i]*w[i]) + residual.append(r[:,i]*w[i]) residual = np.array(residual) @@ -84,7 +86,7 @@ def test_Square_and_Normal_Loss_cost_scalar_weights_for_two_states(self): norm_logpdf_p4= np.log(1/sigma) norm_logpdf_p5_alt= -residual**2 / (2*sigma**2) norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ - norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() test_answers=[square_cost,norm_cost] for loss_function_index in range(len(loss_functions)): @@ -93,17 +95,15 @@ def test_Square_and_Normal_Loss_cost_scalar_weights_for_two_states(self): with self.subTest(message): obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=2) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) def test_Square_and_Normal_Loss_cost_vector_weights_for_two_states(self): loss_functions = [SquareLoss, NormalLoss] - obj = SquareLoss(self.theta, self.ode, self.init_state, self.t[0], - self.t[1::], self.solution[1::,1:3], ['I', 'R']) - self.r = obj.residual() + r = self.solution[1::,1:3]-self.yhat[1::,1:3] # now the weight is a vector w = np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]) - residual = self.r* np.array(w) + residual = r* w square_cost = (residual**2).sum() sigma= 1 norm_logpdf_p1= -np.log(2) @@ -112,7 +112,7 @@ def test_Square_and_Normal_Loss_cost_vector_weights_for_two_states(self): norm_logpdf_p4= np.log(1/sigma) norm_logpdf_p5_alt= -residual**2 / (2*sigma**2) norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ - norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() test_answers=[square_cost,norm_cost] @@ -122,7 +122,7 @@ def test_Square_and_Normal_Loss_cost_vector_weights_for_two_states(self): with self.subTest(message): obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=2) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) def test_All_Loss_functions_1State_weights_Failures_TypeErrors(self): @@ -133,9 +133,8 @@ def test_All_Loss_functions_1State_weights_Failures_TypeErrors(self): test_weight[-1]='b' w_list.append(test_weight) for loss_function in loss_functions: - for weight_index in range(len(w_list)): - w = w_list[weight_index] - message = str(loss_function)+' with weighting '+str(weight_index) + for w in w_list: + message = str(loss_function)+' with weighting '+str(w) with self.subTest(message): self.assertRaises(TypeError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], @@ -152,9 +151,8 @@ def test_AllLoss_1State_weights_Failures_ValueErrors(self): w_list.append(test_weight) w_list.append(np.zeros(len(self.solution[1::,-1]))) for loss_function in loss_functions: - for weight_index in range(len(w_list)): - w = w_list[weight_index] - message = str(loss_function)+' with weighting '+str(weight_index) + for w in w_list: + message = str(loss_function)+' with weighting '+str(w) with self.subTest(message): self.assertRaises(ValueError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], @@ -166,9 +164,8 @@ def test_AllLoss_1State_weights_Failures_ShapeErrors(self): w_list.append([2.0, 3.0]) w_list.append(np.random.rand(self.solution[1::,-1].shape[0]+1).tolist()) for loss_function in loss_functions: - for weight_index in range(len(w_list)): - w = w_list[weight_index] - message = str(loss_function)+' with weighting '+str(weight_index) + for w in w_list: + message = str(loss_function)+' with weighting '+str(w) with self.subTest(message): self.assertRaises(AssertionError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], @@ -182,9 +179,8 @@ def test_AllLoss_2State_weights_Failures_TypeErrors(self): test_weight[-1][-1]='c' w_list.append(test_weight) for loss_function in loss_functions: - for weight_index in range(len(w_list)): - w = w_list[weight_index] - message = str(loss_function)+' with weighting '+str(weight_index) + for w in w_list: + message = str(loss_function)+' with weighting '+str(w) with self.subTest(message): self.assertRaises(TypeError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], @@ -203,9 +199,8 @@ def test_AllLoss_2State_weights_Failures_ValueErrors(self): w_list.append([1.0, -1.0]) w_list.append([0, 0]) for loss_function in loss_functions: - for weight_index in range(len(w_list)): - w = w_list[weight_index] - message = str(loss_function)+' with weighting '+str(weight_index) + for w in w_list: + message = str(loss_function)+' with weighting '+str(w) with self.subTest(message): self.assertRaises(ValueError, loss_function, self.theta, self.ode,self.init_state, self.t[0], @@ -220,15 +215,73 @@ def test_AllLoss_2State_weights_Failures_ShapeErrors(self): w_list.append(np.random.rand(self.solution[1::,1:3].shape[0]+1,self.solution[1::,1:3].shape[1]).tolist()) w_list.append(np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]+1).tolist()) for loss_function in loss_functions: - for weight_index in range(len(w_list)): - w = w_list[weight_index] - message = str(loss_function)+' with weighting '+str(weight_index) + for w in w_list: + message = str(loss_function)+' with weighting '+str(w) with self.subTest(message): self.assertRaises(AssertionError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - + + def test_Applicable_Loss_functions_cost_scalar_spread_params_for_two_states(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + # weight for each component + spread_params = [0.5, 1.5] + spread_params_unraveled = np.array([spread_params[0]* + np.ones(self.solution[1::,1:3].shape[0]), + spread_params[1]* + np.ones(self.solution[1::,1:3].shape[0])]).transpose().flatten() + y=self.solution[1::,1:3].flatten() + yhat = self.yhat[1::,1:3].flatten() + residual = y-yhat + norm_logpdf_p1= -np.log(2) + norm_logpdf_p2= np.log(2)/2 + norm_logpdf_p3= -np.log(np.pi)/2 + norm_logpdf_p4= np.log(1/spread_params_unraveled) + norm_logpdf_p5_alt= -residual**2 / (2*spread_params_unraveled**2) + norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + + gamma_cost=(-gamma_mu_shape(x=y, mu=yhat,shape=spread_params_unraveled,log=True)).sum() + NegBinom_cost=(-dnbinom(x=y, mu=yhat,size=spread_params_unraveled,log=True)).sum() + + test_answers=[norm_cost,gamma_cost,NegBinom_cost] + + for loss_function_index in range(len(loss_functions)): + loss_function= loss_functions[loss_function_index] + message = str(loss_function) + with self.subTest(message): + obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R'], None,spread_params) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) + + def test_Applicable_Loss_functions_cost_vector_spread_params_for_two_states(self): + loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] + y=self.solution[1::,1:3].flatten() + yhat = self.yhat[1::,1:3].flatten() + residual = y-yhat + # now the weight is a vector + spread_params = np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]) + spread_params_unraveled=spread_params.flatten() + norm_logpdf_p1= -np.log(2) + norm_logpdf_p2= np.log(2)/2 + norm_logpdf_p3= -np.log(np.pi)/2 + norm_logpdf_p4= np.log(1/spread_params_unraveled) + norm_logpdf_p5_alt= -residual**2 / (2*spread_params_unraveled**2) + norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + gamma_cost=(-gamma_mu_shape(x=y, mu=yhat,shape=spread_params_unraveled,log=True)).sum() + NegBinom_cost=(-dnbinom(x=y, mu=yhat,size=spread_params_unraveled,log=True)).sum() + + test_answers=[norm_cost,gamma_cost,NegBinom_cost] + + for loss_function_index in range(len(loss_functions)): + loss_function= loss_functions[loss_function_index] + message = str(loss_function) + with self.subTest(message): + obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], + self.t[1::], self.solution[1::,1:3], ['I', 'R'], None,spread_params) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) def test_Applicable_Loss_functions_1State_spread_param_Failures_TypeErrors(self): loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] @@ -241,9 +294,8 @@ def test_Applicable_Loss_functions_1State_spread_param_Failures_TypeErrors(self) test_spread_param[-1]=False spread_param_list.append(test_spread_param) for loss_function in loss_functions: - for spread_param_index in range(len(spread_param_list)): - spread_param = spread_param_list[spread_param_index] - message = str(loss_function)+' with spread params '+str(spread_param_index) + for spread_param in spread_param_list: + message = str(loss_function)+' with spread params '+str(spread_param) with self.subTest(message): self.assertRaises(TypeError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], @@ -258,9 +310,8 @@ def test_Applicable_Loss_functionss_1State_spread_param_Failures_ValueErrors(sel test_spread_param[-1]=-1 spread_param_list.append(test_spread_param) for loss_function in loss_functions: - for spread_param_index in range(len(spread_param_list)): - spread_param = spread_param_list[spread_param_index] - message = str(loss_function)+' with spread params'+str(spread_param_index) + for spread_param in spread_param_list: + message = str(loss_function)+' with spread params '+str(spread_param) with self.subTest(message): self.assertRaises(ValueError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], @@ -272,9 +323,8 @@ def test_Applicable_Loss_functions_1State_spread_param_Failures_ShapeErrors(self spread_param_list.append([2.0, 3.0]) spread_param_list.append(np.random.rand(self.solution[1::,-1].shape[0]+1).tolist()) for loss_function in loss_functions: - for spread_param_index in range(len(spread_param_list)): - spread_param = spread_param_list[spread_param_index] - message = str(loss_function)+' with spread params'+str(spread_param_index) + for spread_param in spread_param_list: + message = str(loss_function)+' with spread params '+str(spread_param) with self.subTest(message): self.assertRaises(AssertionError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], @@ -293,9 +343,8 @@ def test_Applicable_Loss_functions_2State_spread_param_Failures_TypeErrors(self) test_spread_param[-1][-1]=False spread_param_list.append(test_spread_param) for loss_function in loss_functions: - for spread_param_index in range(len(spread_param_list)): - spread_param = spread_param_list[spread_param_index] - message = str(loss_function)+' with spread params'+str(spread_param_index) + for spread_param in spread_param_list: + message = str(loss_function)+' with spread params '+str(spread_param) with self.subTest(message): self.assertRaises(TypeError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], @@ -312,9 +361,8 @@ def test_Applicable_Loss_functions_2State_spread_param_Failures_ValueErrors(self spread_param_list.append([1.0, -1.0]) spread_param_list.append([-1.0, -1.0]) for loss_function in loss_functions: - for spread_param_index in range(len(spread_param_list)): - spread_param = spread_param_list[spread_param_index] - message = str(loss_function)+' with spread params'+str(spread_param_index) + for spread_param in spread_param_list: + message = str(loss_function)+' with spread params '+str(spread_param) with self.subTest(message): self.assertRaises(ValueError, loss_function, self.theta, self.ode,self.init_state, self.t[0], @@ -329,9 +377,8 @@ def test_Applicable_Loss_functions_2State_spread_param_Failures_ShapeErrors(self spread_param_list.append(np.random.rand(self.solution[1::,1:3].shape[0]+1,self.solution[1::,1:3].shape[1]).tolist()) spread_param_list.append(np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]+1).tolist()) for loss_function in loss_functions: - for spread_param_index in range(len(spread_param_list)): - spread_param = spread_param_list[spread_param_index] - message = str(loss_function)+' with spread params'+str(spread_param_index) + for spread_param in spread_param_list: + message = str(loss_function)+' with spread params '+str(spread_param) with self.subTest(message): self.assertRaises(AssertionError, loss_function, self.theta, self.ode, self.init_state, self.t[0], From 9844fd34e1189790df5373d6612d9c1e6e13a274 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Thu, 2 Jul 2020 14:55:42 +0100 Subject: [PATCH 013/188] Unittest hopefully finished --- tests/test_loss_types.py | 64 +++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/tests/test_loss_types.py b/tests/test_loss_types.py index 8de89766..32657b6c 100644 --- a/tests/test_loss_types.py +++ b/tests/test_loss_types.py @@ -69,15 +69,13 @@ def test_all_Loss_functions_produce_different_costs(self): def test_Square_and_Normal_Loss_cost_scalar_weights_for_two_states(self): loss_functions = [SquareLoss, NormalLoss] - # weight for each component + y=self.solution[1::,1:3].flatten() + yhat = self.yhat[1::,1:3].flatten() + residual = y-yhat w = [2.0, 3.0] - r = self.solution[1::,1:3]-self.yhat[1::,1:3] - residual = [] - for i in range(2): - residual.append(r[:,i]*w[i]) - - residual = np.array(residual) - + w_unraveled = np.array([w[0]*np.ones(self.solution[1::,1:3].shape[0]), + w[1]*np.ones(self.solution[1::,1:3].shape[0])]).transpose().flatten() + residual =residual*w_unraveled square_cost = (residual**2).sum() sigma= 1 norm_logpdf_p1= -np.log(2) @@ -95,15 +93,17 @@ def test_Square_and_Normal_Loss_cost_scalar_weights_for_two_states(self): with self.subTest(message): obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=1) def test_Square_and_Normal_Loss_cost_vector_weights_for_two_states(self): loss_functions = [SquareLoss, NormalLoss] - r = self.solution[1::,1:3]-self.yhat[1::,1:3] - # now the weight is a vector - w = np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]) - - residual = r* w + y=self.solution[1::,1:3].flatten() + yhat = self.yhat[1::,1:3].flatten() + residual = y-yhat + w = [2.0, 3.0] + w = np.array([w[0]*np.ones(self.solution[1::,1:3].shape[0]), + w[1]*np.ones(self.solution[1::,1:3].shape[0])]).transpose() + residual = residual*w.flatten() square_cost = (residual**2).sum() sigma= 1 norm_logpdf_p1= -np.log(2) @@ -122,7 +122,7 @@ def test_Square_and_Normal_Loss_cost_vector_weights_for_two_states(self): with self.subTest(message): obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=1) def test_All_Loss_functions_1State_weights_Failures_TypeErrors(self): @@ -170,7 +170,7 @@ def test_AllLoss_1State_weights_Failures_ShapeErrors(self): self.assertRaises(AssertionError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], 'R', w) - + def test_AllLoss_2State_weights_Failures_TypeErrors(self): loss_functions = [SquareLoss, NormalLoss, GammaLoss, PoissonLoss, NegBinomLoss] w_list = list() @@ -222,25 +222,25 @@ def test_AllLoss_2State_weights_Failures_ShapeErrors(self): self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], w) - + def test_Applicable_Loss_functions_cost_scalar_spread_params_for_two_states(self): loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] - # weight for each component + y=self.solution[1::,1:3].flatten() + yhat = self.yhat[1::,1:3].flatten() + residual = y-yhat + # spread parameter for each component spread_params = [0.5, 1.5] spread_params_unraveled = np.array([spread_params[0]* np.ones(self.solution[1::,1:3].shape[0]), spread_params[1]* np.ones(self.solution[1::,1:3].shape[0])]).transpose().flatten() - y=self.solution[1::,1:3].flatten() - yhat = self.yhat[1::,1:3].flatten() - residual = y-yhat norm_logpdf_p1= -np.log(2) norm_logpdf_p2= np.log(2)/2 norm_logpdf_p3= -np.log(np.pi)/2 norm_logpdf_p4= np.log(1/spread_params_unraveled) norm_logpdf_p5_alt= -residual**2 / (2*spread_params_unraveled**2) norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ - norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() gamma_cost=(-gamma_mu_shape(x=y, mu=yhat,shape=spread_params_unraveled,log=True)).sum() NegBinom_cost=(-dnbinom(x=y, mu=yhat,size=spread_params_unraveled,log=True)).sum() @@ -253,15 +253,19 @@ def test_Applicable_Loss_functions_cost_scalar_spread_params_for_two_states(self with self.subTest(message): obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], None,spread_params) - self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) - + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=1) + def test_Applicable_Loss_functions_cost_vector_spread_params_for_two_states(self): loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] y=self.solution[1::,1:3].flatten() yhat = self.yhat[1::,1:3].flatten() residual = y-yhat - # now the weight is a vector - spread_params = np.random.rand(self.solution[1::,1:3].shape[0],self.solution[1::,1:3].shape[1]) + # now the spread parameter is a vector + spread_params = [0.5, 1.5] + spread_params = np.array([spread_params[0]* + np.ones(self.solution[1::,1:3].shape[0]), + spread_params[1]* + np.ones(self.solution[1::,1:3].shape[0])]).transpose() spread_params_unraveled=spread_params.flatten() norm_logpdf_p1= -np.log(2) norm_logpdf_p2= np.log(2)/2 @@ -269,19 +273,19 @@ def test_Applicable_Loss_functions_cost_vector_spread_params_for_two_states(self norm_logpdf_p4= np.log(1/spread_params_unraveled) norm_logpdf_p5_alt= -residual**2 / (2*spread_params_unraveled**2) norm_cost = (-(norm_logpdf_p1+norm_logpdf_p2+norm_logpdf_p3+ - norm_logpdf_p4+norm_logpdf_p5_alt)).sum() + norm_logpdf_p4+norm_logpdf_p5_alt)).sum() gamma_cost=(-gamma_mu_shape(x=y, mu=yhat,shape=spread_params_unraveled,log=True)).sum() NegBinom_cost=(-dnbinom(x=y, mu=yhat,size=spread_params_unraveled,log=True)).sum() test_answers=[norm_cost,gamma_cost,NegBinom_cost] - + for loss_function_index in range(len(loss_functions)): loss_function= loss_functions[loss_function_index] message = str(loss_function) with self.subTest(message): obj = loss_function(self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,1:3], ['I', 'R'], None,spread_params) - self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=0) + self.assertAlmostEqual(obj.cost(), test_answers[loss_function_index],places=1) def test_Applicable_Loss_functions_1State_spread_param_Failures_TypeErrors(self): loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] @@ -329,7 +333,7 @@ def test_Applicable_Loss_functions_1State_spread_param_Failures_ShapeErrors(self self.assertRaises(AssertionError, loss_function, self.theta, self.ode, self.init_state, self.t[0], self.t[1::], self.solution[1::,-1], 'R', None,spread_param) - + def test_Applicable_Loss_functions_2State_spread_param_Failures_TypeErrors(self): loss_functions = [NormalLoss, GammaLoss, NegBinomLoss] spread_param_list = list() From a2f01fe3cbdb1da5d1f94e93b049136ac107a472 Mon Sep 17 00:00:00 2001 From: MGrunnill Date: Thu, 2 Jul 2020 16:41:02 +0100 Subject: [PATCH 014/188] odeloss.py and lossype.py files checked with pylint --- pygom/loss/loss_type.py | 280 +++++++++++++++++++--------------------- pygom/loss/ode_loss.py | 35 ++--- 2 files changed, 153 insertions(+), 162 deletions(-) diff --git a/pygom/loss/loss_type.py b/pygom/loss/loss_type.py index 745fd4ea..f1385e65 100644 --- a/pygom/loss/loss_type.py +++ b/pygom/loss/loss_type.py @@ -19,16 +19,10 @@ from pygom.model.ode_utils import check_array_type from pygom.utilR.distn import dpois, gamma_mu_shape, dnbinom -class InputError(Exception): +class Baseloss_Type(object): ''' - As the name suggest. - ''' - pass - -class baseloss_type(object): - ''' - This baseloss_type class provides common feature to be inherited by the - loss type objects, such as Square, Normal , etc. + This Baseloss_Type class provides common feature to be inherited by the + loss type objects, such as Square, Normal , etc. Parameters ---------- @@ -43,22 +37,22 @@ def __init__(self, y, weights=None): # module is being used without base_loss.py. #Checks o n y: self._y = check_array_type(y) - #Checks on weights. + #Checks on weights. if weights is None: self._numVar = 0 self._w = np.ones(self._y.shape) else: - self._w = check_array_type(weights,accept_booleans=True) - if (self._w<0).any(): + self._w = check_array_type(weights, accept_booleans=True) + if (self._w < 0).any(): raise ValueError('No elements in numpy array of weights should be negative') - if (self._w==0).all(): + if (self._w == 0).all(): raise ValueError('All elements in numpy array of weights should not be 0.0') if len(self._w.shape) > 1: if 1 in self._w.shape: - self._w = self._w.flatten() + self._w = self._w.flatten() assert self._y.shape == self._w.shape, "Input weight not of the same size as y" - - def residual(self, yhat, apply_weighting = True): + + def residual(self, yhat, apply_weighting=True): ''' Raw residuals returned if apply_weighting = False, else the weighted residuals. @@ -68,7 +62,7 @@ def residual(self, yhat, apply_weighting = True): yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals returned. Returns @@ -76,9 +70,9 @@ def residual(self, yhat, apply_weighting = True): :math:`y_{i} - \\hat{y}_{i}` ''' - if isinstance(apply_weighting,bool)==False: + if not isinstance(apply_weighting, bool): raise TypeError('apply_weighting should be boolean') - + if len(yhat.shape) > 1: if 1 in yhat.shape: resid = self._y - yhat.ravel() @@ -86,14 +80,12 @@ def residual(self, yhat, apply_weighting = True): resid = self._y - yhat else: resid = self._y - yhat - if apply_weighting == True: + if apply_weighting: resid *= self._w - + return resid - - -class Square(baseloss_type): +class Square(Baseloss_Type): ''' Square loss object @@ -107,7 +99,7 @@ def __init__(self, y, weights=None): super().__init__(y, weights) self.loss(self._y) - def loss(self, yhat, apply_weighting = True): + def loss(self, yhat, apply_weighting=True): ''' Loss under square loss. Not really saying much here @@ -116,7 +108,7 @@ def loss(self, yhat, apply_weighting = True): yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns @@ -136,7 +128,7 @@ def diff_loss(self, yhat, apply_weighting=True): yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns @@ -154,9 +146,9 @@ def diff2Loss(self, yhat, apply_weighting=True): yhat: array like observations apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so without it missing arguments errors could occur. Returns @@ -170,7 +162,7 @@ def diff2Loss(self, yhat, apply_weighting=True): yhat = yhat.ravel() return 2*np.ones(yhat.shape) -class Normal(baseloss_type): +class Normal(Baseloss_Type): ''' Normal distribution loss object @@ -180,14 +172,14 @@ class Normal(baseloss_type): observation sigma: float standard deviation - ''' + ''' def __init__(self, y, weights=None, sigma=1.0): super().__init__(y, weights) err_str = "Standard deviation not of the correct " if isinstance(sigma, np.ndarray): - if (sigma<0).any(): + if (sigma < 0).any(): raise ValueError('No elements in numpy array of sigma values should be negative') - elif len(sigma.shape) > 1: + if len(sigma.shape) > 1: if 1 in sigma.shape: sigma = sigma.flatten() if y.shape == sigma.shape: @@ -202,10 +194,9 @@ def __init__(self, y, weights=None, sigma=1.0): elif sigma is None or sigma == 1.0: self._sigma = np.ones(self._y.shape) elif isinstance(sigma, (int, float)): - if sigma <0: + if sigma < 0: raise ValueError('Sigma should not be negative') - else: - self._sigma = sigma*np.ones(self._y.shape) + self._sigma = sigma*np.ones(self._y.shape) else: raise TypeError(err_str + "type") @@ -222,27 +213,28 @@ def loss(self, yhat, apply_weighting=True): yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns ------- - negative log-likelihood, :math:`\\mathcal\\frac{1}{\\sqrt{2\\pi}\\sigma}e^{-\\frac{(y-\\hat{y})^{2}}{2\\sigma^{2}}` + negative log-likelihood, :math: + `\\mathcal\\frac{1}{\\sqrt{2\\pi}\\sigma}e^{-\\frac{(y-\\hat{y})^{2}}{2\\sigma^{2}}` ''' if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - - r=self.residual(yhat, apply_weighting) - sigma=self._sigma - + + residual = self.residual(yhat, apply_weighting) + sigma = self._sigma + # Calculate negative likelihood (depending on weighting of residuals). - logpdf_p1= -np.log(2) - logpdf_p2= np.log(2)/2 - logpdf_p3= -np.log(np.pi)/2 - logpdf_p4= np.log(1/sigma) - logpdf_p5_alt= -r**2 / (2*sigma**2) + logpdf_p1 = -np.log(2) + logpdf_p2 = np.log(2)/2 + logpdf_p3 = -np.log(np.pi)/2 + logpdf_p4 = np.log(1/sigma) + logpdf_p5_alt = -residual**2 / (2*sigma**2) return (-(logpdf_p1+logpdf_p2+logpdf_p3+logpdf_p4+logpdf_p5_alt)).sum() def diff_loss(self, yhat, apply_weighting=True): @@ -255,7 +247,7 @@ def diff_loss(self, yhat, apply_weighting=True): yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns @@ -264,8 +256,8 @@ def diff_loss(self, yhat, apply_weighting=True): :math:`\\nabla \\mathcal{L}(\\hat{y}, y)` ''' - r = self.residual(yhat, apply_weighting) - return -r/self._sigma2 + residual = self.residual(yhat, apply_weighting) + return -residual/self._sigma2 def diff2Loss(self, yhat, apply_weighting=True): ''' @@ -276,9 +268,9 @@ def diff2Loss(self, yhat, apply_weighting=True): yhat: array like observations apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so without it missing arguments errors could occur. Returns @@ -290,8 +282,8 @@ def diff2Loss(self, yhat, apply_weighting=True): if 1 in yhat.shape: yhat = yhat.ravel() return np.ones(yhat.shape)/self._sigma2 - -class Gamma(baseloss_type): + +class Gamma(Baseloss_Type): ''' Gamma distribution loss object @@ -299,17 +291,17 @@ class Gamma(baseloss_type): ---------- y: array like observation - Shape: float + Shape: float shape (a in latex equations) ''' - + def __init__(self, y, weights=None, shape=2.0): super().__init__(y, weights) err_str = "Shape is not of the correct " if isinstance(shape, np.ndarray): - if (shape<0).any(): + if (shape < 0).any(): raise ValueError('No elements in numpy array of shape values should be negative') - elif len(shape.shape) > 1: + if len(shape.shape) > 1: if 1 in shape.shape: shape = shape.flatten() if y.shape == shape.shape: @@ -324,19 +316,19 @@ def __init__(self, y, weights=None, shape=2.0): elif shape is None or shape == 2.0: self._shape = 2*np.ones(self._y.shape) elif isinstance(shape, (int, float)): - if shape <0: + if shape < 0: raise ValueError('Shape should not be negative') - else: - self._shape = shape*np.ones(self._y.shape) + self._shape = shape*np.ones(self._y.shape) else: raise TypeError(err_str + "type") self.loss(self._y) - + def loss(self, yhat, apply_weighting=True): ''' - The loss under a gamma distribution. Defined as the negative + The loss under a gamma distribution. Defined as the negative log-likelihood of the gamma distirbution in terms of mean and shape. - See: Bolker, B. M. (2008). Gamma. In Ecological Models in R (pp. 131–133). Princeton University Press. + See: Bolker, B. M. (2008). Gamma. In Ecological Models in R (pp. 131–133). + Princeton University Press. File "Loss function Calculations.ipnyb" Parameters @@ -344,10 +336,10 @@ def loss(self, yhat, apply_weighting=True): yhat: array like prediction apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so - without it missing arguments errors could occur. + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur. Returns ------- @@ -357,23 +349,23 @@ def loss(self, yhat, apply_weighting=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - - return -gamma_mu_shape(x=self._y, mu=yhat,shape=self._shape,log=True).sum() - + + return -gamma_mu_shape(x=self._y, mu=yhat, shape=self._shape, log=True).sum() + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative of the loss function with respect to yhat which is - See: + See: File "Loss function Calculations.ipnyb" - + Parameters ---------- yhat: array like prediction apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. - + Returns ------- first_deriv_yhat: array like @@ -381,23 +373,22 @@ def diff_loss(self, yhat, apply_weighting=True): ''' shape = self._shape - r = self.residual(yhat, apply_weighting) - return shape*-r/yhat**2 + residual = self.residual(yhat, apply_weighting) + return shape*-residual/yhat**2 def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the loss function with respect to yhat. - See: + See: Jupiter notebook "Loss function Calculations.ipnyb" - + Parameters ---------- yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. - Returns ------- @@ -408,12 +399,11 @@ def diff2Loss(self, yhat, apply_weighting=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - y = self._y shape = self._shape - r = self.residual(yhat, apply_weighting) - return shape*(r+y)/yhat**3 + residual = self.residual(yhat, apply_weighting) + return shape*(residual+self._y)/yhat**3 -class Poisson(baseloss_type): +class Poisson(Baseloss_Type): ''' Poisson distribution loss object @@ -427,7 +417,7 @@ def __init__(self, y, weights=None): super().__init__(y, weights) self.loss(self._y) - def loss(self, yhat,apply_weighting=True): + def loss(self, yhat, apply_weighting=True): ''' The loss under a normal distribution. Defined as the negative log-likelihood here. @@ -437,9 +427,9 @@ def loss(self, yhat,apply_weighting=True): yhat: array like observation apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so without it missing arguments errors could occur. Returns @@ -462,7 +452,7 @@ def diff_loss(self, yhat, apply_weighting=True): yhat: array like observation apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns @@ -470,13 +460,12 @@ def diff_loss(self, yhat, apply_weighting=True): :math:`\\nabla \\mathcal{L}(\\hat{y},y)` ''' - if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - - r = self.residual(yhat, apply_weighting) - return -r/yhat + + residual = self.residual(yhat, apply_weighting) + return -residual/yhat def diff2Loss(self, yhat, apply_weighting=True): ''' @@ -487,9 +476,9 @@ def diff2Loss(self, yhat, apply_weighting=True): yhat: array like observations apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so without it missing arguments errors could occur. Returns @@ -500,10 +489,9 @@ def diff2Loss(self, yhat, apply_weighting=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - y=self._y - return y/(yhat**2) + return self._y/(yhat**2) -class NegBinom(baseloss_type): +class NegBinom(Baseloss_Type): ''' Negative Binomial distribution loss object @@ -511,17 +499,16 @@ class NegBinom(baseloss_type): ---------- y: array like observation - k: float + k: float Overdispersion parameter (k=mean+mean(mean/variance)) ''' - - def __init__(self, y, weights=None, k=1.0): + def __init__(self, y, weights=None, k=1.0): super().__init__(y, weights) err_str = "k (the overdispersion parameter) is not of the correct " if isinstance(k, np.ndarray): - if (k<0).any(): + if (k < 0).any(): raise ValueError('No elements in numpy array of k values should be negative') - elif len(k.shape) > 1: + if len(k.shape) > 1: if 1 in k.shape: k = k.flatten() if y.shape == k.shape: @@ -536,15 +523,14 @@ def __init__(self, y, weights=None, k=1.0): elif k is None or k == 1.0: self._k = np.ones(self._y.shape) elif isinstance(k, (int, float)): - if k <0: + if k < 0: raise ValueError('k should not be negative') - else: - self._k = k*np.ones(self._y.shape) + self._k = k*np.ones(self._y.shape) else: raise TypeError(err_str + "type") - + self.loss(self._y) - + def loss(self, yhat, apply_weighting=True): ''' The loss under a Negative Binomial distribution. Defined as the @@ -555,9 +541,9 @@ def loss(self, yhat, apply_weighting=True): yhat: array like observation apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so without it missing arguments errors could occur. Returns @@ -568,28 +554,29 @@ def loss(self, yhat, apply_weighting=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - - return (-dnbinom(self._y, mu=yhat,size=self._k,log=True)).sum() - + + return (-dnbinom(self._y, mu=yhat, size=self._k, log=True)).sum() + def diff_loss(self, yhat, apply_weighting=True): ''' Derivative of the loss function with respect to yhat which is - See: + See: Jupiter notebook "Loss function Calculations.ipnyb" - Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press + Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). + Princeton University Press Parameters ---------- yhat: array like observation + apply_weighting: boolean + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so + without it missing arguments errors could occur + apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so - without it missing arguments errors could occur. - - apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns @@ -601,37 +588,40 @@ def diff_loss(self, yhat, apply_weighting=True): if len(yhat.shape) > 1: if 1 in yhat.shape: yhat = yhat.ravel() - + k = self._k - r = self.residual(yhat, apply_weighting) - first_derivs_yhat = k*-r/(yhat*(k+yhat)) + residual = self.residual(yhat, apply_weighting) + first_derivs_yhat = k*-residual/(yhat*(k+yhat)) return first_derivs_yhat def diff2Loss(self, yhat, apply_weighting=True): ''' Twice derivative of the loss function with respect to yhat. - See: + See: Jupiter notebook "Loss function Calculations.ipnyb" - Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). Princeton University Press + Bolker, B. M. (2008). Negative Binomial. In Ecological Models in R (pp. 124–126). + Princeton University Press Parameters ---------- yhat: array like observation apply_weighting: boolean - Residuals are not used in calculation, as such True or False - argument makes no difference. Argument has been kept as the equivalent - calculation is made with residuals for other loss functions, so + Residuals are not used in calculation, as such True or False + argument makes no difference. Argument has been kept as the equivalent + calculation is made with residuals for other loss functions, so without it missing arguments errors could occur. - + apply_weighting: boolean - If True multiplies array of residuals by weightings, else raw + If True multiplies array of residuals by weightings, else raw residuals are used. Returns ------- scnd_deriv_yhat: array like - :math:`\\frac{k(\\hat{y}(k + \\hat{y}) + \\hat{y}(y -\\hat{y}) + (k + \\hat{y})(y - \\hat{y})}{\\hat{y}^{2}(k + \\hat{y})^{2}}` + :math: + `\\frac{k(\\hat{y}(k + \\hat{y}) + \\hat{y}(y -\\hat{y}) + (k + + \\hat{y})(y - \\hat{y})}{\\hat{y}^{2}(k + \\hat{y})^{2}}` ''' if len(yhat.shape) > 1: @@ -639,10 +629,10 @@ def diff2Loss(self, yhat, apply_weighting=True): yhat = yhat.ravel() k = self._k - r = self.residual(yhat, apply_weighting) - scnd_derivs_yhat_p1= k - scnd_derivs_yhat_p2= yhat**(-2) - scnd_derivs_yhat_p3= (k + yhat)**(-2) - scnd_derivs_yhat_p4= r*yhat + r*(k + yhat) + yhat*(k + yhat) - scnd_derivs_yhat= scnd_derivs_yhat_p1*scnd_derivs_yhat_p2*scnd_derivs_yhat_p3*scnd_derivs_yhat_p4 - return scnd_derivs_yhat \ No newline at end of file + residual = self.residual(yhat, apply_weighting) + scnd_derivs_yhat_p1 = k + scnd_derivs_yhat_p2 = yhat**(-2) + scnd_derivs_yhat_p3 = (k + yhat)**(-2) + scnd_derivs_yhat_p4 = residual*yhat + residual*(k + yhat) + yhat*(k + yhat) + scnd_derivs_yhat = scnd_derivs_yhat_p1*scnd_derivs_yhat_p2*scnd_derivs_yhat_p3*scnd_derivs_yhat_p4 + return scnd_derivs_yhat diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index ae0992ff..a4a950f0 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -24,7 +24,7 @@ class SquareLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, target_param=None, target_state=None): - super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, + super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, None, target_param, target_state) def __repr__(self): @@ -38,7 +38,7 @@ class NormalLoss(BaseLoss): ''' Realizations from a Normal distribution ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, sigma=1.0, target_param=None, target_state=None): super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, sigma, target_param, target_state) @@ -49,51 +49,52 @@ def __repr__(self): def _setLossType(self): self._lossObj = Normal(self._y, self._weight, self._spread_param) return self._lossObj - + class GammaLoss(BaseLoss): ''' Realizations from a Gamma distribution taking parameters mean and shape. ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, shape=2, target_param=None, target_state=None): super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight, shape,target_param, target_state) - + state_name, state_weight, shape, target_param, target_state) + def __repr__(self): return "GammaLoss" + self._get_model_str() def _setLossType(self): self._lossObj = Gamma(self._y, self._weight, self._spread_param) return self._lossObj - + class PoissonLoss(BaseLoss): ''' Realizations from a Poisson distribution ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, target_param=None, target_state=None): super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, - None,target_param, target_state) - + None, target_param, target_state) + def __repr__(self): return "PoissonLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = Poisson(self._y,self._weight) - return self._lossObj - + self._lossObj = Poisson(self._y, self._weight) + return self._lossObj + class NegBinomLoss(BaseLoss): ''' Realizations from a Negative Binomial distribution ''' - def __init__(self, theta, ode, x0, t0, t, y, state_name,state_weight=None, + def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, k=1, target_param=None, target_state=None): super().__init__(theta, ode, x0, t0, t, y, state_name, state_weight, k, target_param, target_state) - + def __repr__(self): return "NegBinomLoss" + self._get_model_str() def _setLossType(self): - self._lossObj = NegBinom(self._y, self._weight,self._spread_param) - return self._lossObj \ No newline at end of file + self._lossObj = NegBinom(self._y, self._weight, self._spread_param) + return self._lossObj + \ No newline at end of file From 01f5961befd49483d06a2a18234ec8a360da34a1 Mon Sep 17 00:00:00 2001 From: "Jonathan.Carruthers" Date: Tue, 7 Jul 2020 11:45:41 +0100 Subject: [PATCH 015/188] loss type to string --- .../approximate_bayesian_computation.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py index 1012fc2c..c756d68d 100644 --- a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py +++ b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py @@ -155,14 +155,16 @@ def create_loss(loss_type, parameters, ode, x0, t0, t, y, state_name, target_state = _get_target(parameters, ode.state_list) theta = [param.random_sample() for param in parameters if param.name in target_param] - if loss_type == SquareLoss: + if loss_type == "SquareLoss": return SquareLoss(theta, ode, x0, t0, t, y, state_name, state_weight, target_param, target_state) - elif loss_type == NormalLoss: + elif loss_type == "NormalLoss": return NormalLoss(theta, ode, x0, t0, t, y, state_name, sigma, target_param, target_state) - elif loss_type == PoissonLoss: + elif loss_type == "PoissonLoss": return PoissonLoss(theta, ode, x0, t0, t, y, state_name, target_param, target_state) + else: + raise ValueError("Please choose from the available loss functions") #%% """ ABC class and methods for obtaining an approximate posterior sample/plotting the results """ From cea7964d31bde57e5afff534d1c1e56490e2f8e7 Mon Sep 17 00:00:00 2001 From: "Jonathan.Carruthers" Date: Tue, 7 Jul 2020 11:48:44 +0100 Subject: [PATCH 016/188] update abc tests --- tests/test_abc.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_abc.py b/tests/test_abc.py index 9584ec53..b63f2fd5 100644 --- a/tests/test_abc.py +++ b/tests/test_abc.py @@ -32,7 +32,7 @@ def test_SIR_abc_SquareLoss(self): pgabc.Parameter('gamma', 'unif', 0, 3, logscale=False)] # creating the loss and abc objects - sir_obj = pgabc.create_loss(SquareLoss, parameters, self.ode, self.x0, self.t[0], + sir_obj = pgabc.create_loss("SquareLoss", parameters, self.ode, self.x0, self.t[0], self.t[1::], y, ['I', 'R']) sir_abc = pgabc.ABC(sir_obj, parameters) @@ -50,7 +50,7 @@ def test_SIR_abc_SquareLoss_MNN(self): y = self.solution[1::, 1:3] parameters = [pgabc.Parameter('beta', 'unif', 0, 3, logscale=False), pgabc.Parameter('gamma', 'unif', 0, 3, logscale=False)] - sir_obj = pgabc.create_loss(SquareLoss, parameters, self.ode, self.x0, self.t[0], + sir_obj = pgabc.create_loss("SquareLoss", parameters, self.ode, self.x0, self.t[0], self.t[1::], y, ['I', 'R']) sir_abc = pgabc.ABC(sir_obj, parameters) sir_abc.get_posterior_sample(N=100, tol=np.inf, G=10, q=0.5, M=50) @@ -63,7 +63,7 @@ def test_SIR_abc_NormalLoss(self): y = self.solution[1::, 1:3] parameters = [pgabc.Parameter('beta', 'unif', 0, 3, logscale=False), pgabc.Parameter('gamma', 'unif', 0, 3, logscale=False)] - sir_obj = pgabc.create_loss(NormalLoss, parameters, self.ode, self.x0, self.t[0], + sir_obj = pgabc.create_loss("NormalLoss", parameters, self.ode, self.x0, self.t[0], self.t[1::], y, ['I', 'R']) sir_abc = pgabc.ABC(sir_obj, parameters) sir_abc.get_posterior_sample(N=100, tol=np.inf, G=10, q=0.5) From 2c5e0bf5605833e94d2bb7d8f3462c2144de4d44 Mon Sep 17 00:00:00 2001 From: "Jonathan.Carruthers" Date: Tue, 7 Jul 2020 16:11:55 +0100 Subject: [PATCH 017/188] git test --- .../approximate_bayesian_computation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py index c756d68d..d532332a 100644 --- a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py +++ b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py @@ -27,6 +27,7 @@ selected states and plot posterior histograms/pairs plots for specific parameters. """ +print("git test") #%% def _log_limits(par, logscale): From 9e24995688f8a4a39345951bc63faea72faecb00 Mon Sep 17 00:00:00 2001 From: "Jonathan.Carruthers" Date: Tue, 7 Jul 2020 16:13:02 +0100 Subject: [PATCH 018/188] undo git test --- .../approximate_bayesian_computation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py index d532332a..c756d68d 100644 --- a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py +++ b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py @@ -27,7 +27,6 @@ selected states and plot posterior histograms/pairs plots for specific parameters. """ -print("git test") #%% def _log_limits(par, logscale): From e1a8fc9179538d46188c41fa14a3d52f23c9b506 Mon Sep 17 00:00:00 2001 From: "Jonathan.Carruthers" Date: Fri, 31 Jul 2020 15:35:41 +0100 Subject: [PATCH 019/188] corrected issue with parameter order --- .../approximate_bayesian_computation.py | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py index c756d68d..3f38a2b0 100644 --- a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py +++ b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py @@ -41,15 +41,24 @@ def get_length(attr): return len(attr) else: return 0 - -def _get_target(parameters,target): - # used to separate target_param and target_state from a single list of parameters + +def _get_target_parameters(parameters,target): + # used to separate target_param from a single list of parameters target_list = [param.name for param in parameters if param.name in target] if len(target_list) == 0: return None else: return target_list +def _get_target_states(parameters,target): + # used to separate and re-order target_state from a single list of parameters + parameter_names = [parameter.name for parameter in parameters] + target_list = [tar.name for tar in target if tar in parameter_names] + if len(target_list) == 0: + return None + else: + return target_list + def get_function(str): # gets a function from a string for a distribution - is there a better way to write this? """ @@ -151,8 +160,8 @@ def create_loss(loss_type, parameters, ode, x0, t0, t, y, state_name, assert t0 != t[0], "Make sure that the times, t, do not include t0" assert all(param.name in (ode.param_list+ode.state_list) for param in parameters), "Parameters have been provided that are not in the model" - target_param = _get_target(parameters, ode.param_list) - target_state = _get_target(parameters, ode.state_list) + target_param = _get_target_parameters(parameters, ode.param_list) + target_state = _get_target_states(parameters, ode.state_list) theta = [param.random_sample() for param in parameters if param.name in target_param] if loss_type == "SquareLoss": @@ -192,6 +201,10 @@ def __init__(self, loss_object, parameters, constraint=None): self.log = np.array([param.logscale for param in self.parameters]) self.prior_range = np.array([(param.prior_high-param.prior_low) for param in self.parameters]) + + ordered_parameters = (_get_target_parameters(parameters,self.obj._ode.param_list) or []) + (_get_target_states(parameters,self.obj._ode.state_list) or []) + parameter_names = [par.name for par in parameters] + self.par_order = [parameter_names.index(par) for par in ordered_parameters] if constraint is not None: self.pop_size = constraint[0] @@ -282,7 +295,7 @@ def get_posterior_sample_original(self, N, tol, G=1, q=None, M=None, progress=Fa if w1: # converting from log-scale and ensuring total population size is conserved model_params = self._log_parameters(trial_params.copy()) - par_update(model_params) + par_update(model_params[self.par_order]) if hasattr(self,"con_state"): self.obj._x0[self.con_state] = self.pop_size - self.obj._x0[self.con_state_indices].sum() @@ -432,7 +445,7 @@ def _perform_generation(self, if w1: # converting from log-scale and ensuring total population size is conserved model_params = self._log_parameters(trial_params.copy()) - par_update(model_params) + par_update(model_params[self.par_order]) if hasattr(self,"con_state"): self.obj._x0[self.con_state] = self.pop_size - self.obj._x0[self.con_state_indices].sum() @@ -580,7 +593,7 @@ def plot_pointwise_predictions(self,plot_states=None,new_time=None,max_ncol=3): for i in range(self.N): params = self.res[i].copy() params = self._log_parameters(params) - par_update(params) + par_update(params[self.par_order]) if hasattr(self,"con_state"): self.obj._x0[self.con_state] = self.pop_size - self.obj._x0[self.con_state_indices].sum() self.obj._ode.parameters = self.obj._theta From 4be295e858b285ecd2aa3e4d3dd063022e0faca9 Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 14:14:10 +0000 Subject: [PATCH 020/188] Update the supported and tested versions of Python in CI --- .travis.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45ba3248..5eec188c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,11 @@ # specify the language and which version language: python python: - - 3.5 - - 3.6 - 3.7 - 3.8 + - 3.9 + - 3.10 + - 3.11 before_install: - pip install -U pip @@ -33,4 +34,4 @@ deploy: secure: S+o0vhiAGM3qto2tQ8xoozMY3JuhDTlynzjMK2AyRMrWWI0Jvbp9u6TebD3zT3TNh/341t6JLY7VPj8KOam/7LzmpI56ouSyTKKHH7Uk2L2ZuJ4dPm4mS0htO26YBYUtjBpyc55VOmVxqUMXo3iym0jQ+uukrWrr+fY3wTTl1rn+RU5wdoQ+1Z9hi+txo2i24tGi9RCzRr5yCX88Q++MFtlNs2/Q4AtR9oQHY5muiPtlbxd1/JtmK43doxsUc+v0A+RJFpDMmURsUt+zoUeSm8Xz65EP9vjGL03YCn+SUp/2Iidfk3GLaBIDvNxKk6XB9njm6V+bXPpzgsM5fzFJ3XtXp3hoIcMlwoa03Hn3fGUw/W/KKsvJaPBDnjZ9qK2gHBNQuz5jbK/ijNuSuZWQvInGhA5Tt/6DOJwX/Q2d0H4hENwZKs5MnY+RXm6VDRJYnImyQLCW1HsxJa/q/2hTpOvlDHCWJNwWB59BTVOxRsW1gKVgiaF5K9hWd5x1DJvnxG15wNey/STOx+8bpaX7DPfZmqqGqbDNnCTKr2+X3EfTqglOWWM20fB9BY62GuvXPNS3/60aKXZfn7z7eI19b+0KMx2wHlnsP7oQmAQS4XK2wMOs3pD8iQzd/4jIVLa+k3YSYfhb0mKxJBkQtd+1s2GtoaHWnNRlpCUlwv1OU38= on: tags: true - python: 3.7 \ No newline at end of file + python: 3.7 From 0341400bd798652ee0babd9bce20dfee20d1ade4 Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 15:15:25 +0000 Subject: [PATCH 021/188] An updated version of the .c file that should work with newer versions of gcc --- pygom/model/_tau_leap.c | 8174 +++++++++++++++++---------------------- 1 file changed, 3651 insertions(+), 4523 deletions(-) diff --git a/pygom/model/_tau_leap.c b/pygom/model/_tau_leap.c index 8267fe60..b6af6e0a 100644 --- a/pygom/model/_tau_leap.c +++ b/pygom/model/_tau_leap.c @@ -1,14 +1,16 @@ -/* Generated by Cython 0.29.15 */ +/* Generated by Cython 0.29.33 */ +#ifndef PY_SSIZE_T_CLEAN #define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else -#define CYTHON_ABI "0_29_15" -#define CYTHON_HEX_VERSION 0x001D0FF0 +#define CYTHON_ABI "0_29_33" +#define CYTHON_HEX_VERSION 0x001D21F0 #define CYTHON_FUTURE_DIVISION 0 #include #ifndef offsetof @@ -47,6 +49,7 @@ #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_NOGIL 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP @@ -83,10 +86,14 @@ #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif @@ -124,10 +131,59 @@ #define CYTHON_USE_DICT_VERSIONS 0 #undef CYTHON_USE_EXC_INFO_STACK #define CYTHON_USE_EXC_INFO_STACK 0 + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 + #endif +#elif defined(PY_NOGIL) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #define CYTHON_COMPILING_IN_NOGIL 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #ifndef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 1 + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 1 + #endif + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 + #define CYTHON_COMPILING_IN_NOGIL 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif @@ -155,7 +211,7 @@ #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif - #if PY_VERSION_HEX < 0x030300F0 + #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) @@ -170,11 +226,14 @@ #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif - #ifndef CYTHON_FAST_THREAD_STATE + #if PY_VERSION_HEX >= 0x030B00A4 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #elif !defined(CYTHON_FAST_THREAD_STATE) #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 + #define CYTHON_FAST_PYCALL (PY_VERSION_HEX < 0x030A0000) #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) @@ -185,15 +244,23 @@ #ifndef CYTHON_USE_DICT_VERSIONS #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) #endif - #ifndef CYTHON_USE_EXC_INFO_STACK + #if PY_VERSION_HEX >= 0x030B00A4 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 + #elif !defined(CYTHON_USE_EXC_INFO_STACK) #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) #endif + #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC + #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 + #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS - #include "longintrepr.h" + #if PY_MAJOR_VERSION < 3 + #include "longintrepr.h" + #endif #undef SHIFT #undef BASE #undef MASK @@ -310,9 +377,68 @@ #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" -#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 - #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#if PY_VERSION_HEX >= 0x030B00A1 + static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int k, int l, int s, int f, + PyObject *code, PyObject *c, PyObject* n, PyObject *v, + PyObject *fv, PyObject *cell, PyObject* fn, + PyObject *name, int fline, PyObject *lnos) { + PyObject *kwds=NULL, *argcount=NULL, *posonlyargcount=NULL, *kwonlyargcount=NULL; + PyObject *nlocals=NULL, *stacksize=NULL, *flags=NULL, *replace=NULL, *call_result=NULL, *empty=NULL; + const char *fn_cstr=NULL; + const char *name_cstr=NULL; + PyCodeObject* co=NULL; + PyObject *type, *value, *traceback; + PyErr_Fetch(&type, &value, &traceback); + if (!(kwds=PyDict_New())) goto end; + if (!(argcount=PyLong_FromLong(a))) goto end; + if (PyDict_SetItemString(kwds, "co_argcount", argcount) != 0) goto end; + if (!(posonlyargcount=PyLong_FromLong(0))) goto end; + if (PyDict_SetItemString(kwds, "co_posonlyargcount", posonlyargcount) != 0) goto end; + if (!(kwonlyargcount=PyLong_FromLong(k))) goto end; + if (PyDict_SetItemString(kwds, "co_kwonlyargcount", kwonlyargcount) != 0) goto end; + if (!(nlocals=PyLong_FromLong(l))) goto end; + if (PyDict_SetItemString(kwds, "co_nlocals", nlocals) != 0) goto end; + if (!(stacksize=PyLong_FromLong(s))) goto end; + if (PyDict_SetItemString(kwds, "co_stacksize", stacksize) != 0) goto end; + if (!(flags=PyLong_FromLong(f))) goto end; + if (PyDict_SetItemString(kwds, "co_flags", flags) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_code", code) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_consts", c) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_names", n) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_varnames", v) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_freevars", fv) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_cellvars", cell) != 0) goto end; + if (PyDict_SetItemString(kwds, "co_linetable", lnos) != 0) goto end; + if (!(fn_cstr=PyUnicode_AsUTF8AndSize(fn, NULL))) goto end; + if (!(name_cstr=PyUnicode_AsUTF8AndSize(name, NULL))) goto end; + if (!(co = PyCode_NewEmpty(fn_cstr, name_cstr, fline))) goto end; + if (!(replace = PyObject_GetAttrString((PyObject*)co, "replace"))) goto cleanup_code_too; + if (!(empty = PyTuple_New(0))) goto cleanup_code_too; // unfortunately __pyx_empty_tuple isn't available here + if (!(call_result = PyObject_Call(replace, empty, kwds))) goto cleanup_code_too; + Py_XDECREF((PyObject*)co); + co = (PyCodeObject*)call_result; + call_result = NULL; + if (0) { + cleanup_code_too: + Py_XDECREF((PyObject*)co); + co = NULL; + } + end: + Py_XDECREF(kwds); + Py_XDECREF(argcount); + Py_XDECREF(posonlyargcount); + Py_XDECREF(kwonlyargcount); + Py_XDECREF(nlocals); + Py_XDECREF(stacksize); + Py_XDECREF(replace); + Py_XDECREF(call_result); + Py_XDECREF(empty); + if (type) { + PyErr_Restore(type, value, traceback); + } + return co; + } #else #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) @@ -426,8 +552,12 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_READY(op) (0) + #else + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #endif #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) @@ -435,7 +565,15 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #if PY_VERSION_HEX >= 0x030C0000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #else + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #endif #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 @@ -484,8 +622,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode #define PyObject_Unicode PyObject_Str #endif +#endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) @@ -496,6 +636,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif #if CYTHON_ASSUME_SAFE_MACROS #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) #else @@ -529,13 +676,13 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t PyInt_AsLong + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t + #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : (Py_INCREF(func), func)) + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif @@ -557,8 +704,10 @@ static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { } __Pyx_PyAsyncMethodsStruct; #endif -#if defined(WIN32) || defined(MS_WINDOWS) - #define _USE_MATH_DEFINES +#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) + #if !defined(_USE_MATH_DEFINES) + #define _USE_MATH_DEFINES + #endif #endif #include #ifdef NAN @@ -576,11 +725,10 @@ static CYTHON_INLINE float __PYX_NAN() { #define __Pyx_truncl truncl #endif - +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ -{ \ - __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ -} + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } #ifndef __PYX_EXTERN_C #ifdef __cplusplus @@ -596,7 +744,13 @@ static CYTHON_INLINE float __PYX_NAN() { #include #include #include "numpy/arrayobject.h" +#include "numpy/ndarrayobject.h" +#include "numpy/ndarraytypes.h" +#include "numpy/arrayscalars.h" #include "numpy/ufuncobject.h" + + /* NumPy API declarations from "numpy/__init__.pxd" */ + #include #include "pythread.h" #include @@ -697,6 +851,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else @@ -888,30 +1043,26 @@ typedef struct { #ifndef CYTHON_ATOMICS #define CYTHON_ATOMICS 1 #endif +#define __PYX_CYTHON_ATOMICS_ENABLED() CYTHON_ATOMICS #define __pyx_atomic_int_type int -#if CYTHON_ATOMICS && __GNUC__ >= 4 && (__GNUC_MINOR__ > 1 ||\ - (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL >= 2)) &&\ - !defined(__i386__) - #define __pyx_atomic_incr_aligned(value, lock) __sync_fetch_and_add(value, 1) - #define __pyx_atomic_decr_aligned(value, lock) __sync_fetch_and_sub(value, 1) +#if CYTHON_ATOMICS && (__GNUC__ >= 5 || (__GNUC__ == 4 &&\ + (__GNUC_MINOR__ > 1 ||\ + (__GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ >= 2)))) + #define __pyx_atomic_incr_aligned(value) __sync_fetch_and_add(value, 1) + #define __pyx_atomic_decr_aligned(value) __sync_fetch_and_sub(value, 1) #ifdef __PYX_DEBUG_ATOMICS #warning "Using GNU atomics" #endif -#elif CYTHON_ATOMICS && defined(_MSC_VER) && 0 - #include +#elif CYTHON_ATOMICS && defined(_MSC_VER) && CYTHON_COMPILING_IN_NOGIL + #include #undef __pyx_atomic_int_type - #define __pyx_atomic_int_type LONG - #define __pyx_atomic_incr_aligned(value, lock) InterlockedIncrement(value) - #define __pyx_atomic_decr_aligned(value, lock) InterlockedDecrement(value) + #define __pyx_atomic_int_type long + #pragma intrinsic (_InterlockedExchangeAdd) + #define __pyx_atomic_incr_aligned(value) _InterlockedExchangeAdd(value, 1) + #define __pyx_atomic_decr_aligned(value) _InterlockedExchangeAdd(value, -1) #ifdef __PYX_DEBUG_ATOMICS #pragma message ("Using MSVC atomics") #endif -#elif CYTHON_ATOMICS && (defined(__ICC) || defined(__INTEL_COMPILER)) && 0 - #define __pyx_atomic_incr_aligned(value, lock) _InterlockedIncrement(value) - #define __pyx_atomic_decr_aligned(value, lock) _InterlockedDecrement(value) - #ifdef __PYX_DEBUG_ATOMICS - #warning "Using Intel atomics" - #endif #else #undef CYTHON_ATOMICS #define CYTHON_ATOMICS 0 @@ -922,9 +1073,9 @@ typedef struct { typedef volatile __pyx_atomic_int_type __pyx_atomic_int; #if CYTHON_ATOMICS #define __pyx_add_acquisition_count(memview)\ - __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) + __pyx_atomic_incr_aligned(__pyx_get_slice_count_pointer(memview)) #define __pyx_sub_acquisition_count(memview)\ - __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview), memview->lock) + __pyx_atomic_decr_aligned(__pyx_get_slice_count_pointer(memview)) #else #define __pyx_add_acquisition_count(memview)\ __pyx_add_acquisition_count_locked(__pyx_get_slice_count_pointer(memview), memview->lock) @@ -945,7 +1096,7 @@ typedef volatile __pyx_atomic_int_type __pyx_atomic_int; #define __Pyx_FastGilFuncInit() -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":776 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":689 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< @@ -954,7 +1105,7 @@ typedef volatile __pyx_atomic_int_type __pyx_atomic_int; */ typedef npy_int8 __pyx_t_5numpy_int8_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":777 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":690 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< @@ -963,7 +1114,7 @@ typedef npy_int8 __pyx_t_5numpy_int8_t; */ typedef npy_int16 __pyx_t_5numpy_int16_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":778 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":691 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< @@ -972,7 +1123,7 @@ typedef npy_int16 __pyx_t_5numpy_int16_t; */ typedef npy_int32 __pyx_t_5numpy_int32_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":779 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":692 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< @@ -981,7 +1132,7 @@ typedef npy_int32 __pyx_t_5numpy_int32_t; */ typedef npy_int64 __pyx_t_5numpy_int64_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":783 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":696 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< @@ -990,7 +1141,7 @@ typedef npy_int64 __pyx_t_5numpy_int64_t; */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":784 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":697 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< @@ -999,7 +1150,7 @@ typedef npy_uint8 __pyx_t_5numpy_uint8_t; */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":785 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":698 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< @@ -1008,7 +1159,7 @@ typedef npy_uint16 __pyx_t_5numpy_uint16_t; */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":786 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":699 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< @@ -1017,7 +1168,7 @@ typedef npy_uint32 __pyx_t_5numpy_uint32_t; */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":790 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":703 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< @@ -1026,7 +1177,7 @@ typedef npy_uint64 __pyx_t_5numpy_uint64_t; */ typedef npy_float32 __pyx_t_5numpy_float32_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":791 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":704 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< @@ -1035,7 +1186,7 @@ typedef npy_float32 __pyx_t_5numpy_float32_t; */ typedef npy_float64 __pyx_t_5numpy_float64_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":800 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":713 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< @@ -1044,7 +1195,7 @@ typedef npy_float64 __pyx_t_5numpy_float64_t; */ typedef npy_long __pyx_t_5numpy_int_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":801 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":714 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< @@ -1053,7 +1204,7 @@ typedef npy_long __pyx_t_5numpy_int_t; */ typedef npy_longlong __pyx_t_5numpy_long_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":802 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":715 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< @@ -1062,7 +1213,7 @@ typedef npy_longlong __pyx_t_5numpy_long_t; */ typedef npy_longlong __pyx_t_5numpy_longlong_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":804 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":717 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< @@ -1071,7 +1222,7 @@ typedef npy_longlong __pyx_t_5numpy_longlong_t; */ typedef npy_ulong __pyx_t_5numpy_uint_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":805 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":718 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< @@ -1080,7 +1231,7 @@ typedef npy_ulong __pyx_t_5numpy_uint_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":806 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":719 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< @@ -1089,7 +1240,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":808 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":721 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< @@ -1098,7 +1249,7 @@ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; */ typedef npy_intp __pyx_t_5numpy_intp_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":809 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":722 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< @@ -1107,7 +1258,7 @@ typedef npy_intp __pyx_t_5numpy_intp_t; */ typedef npy_uintp __pyx_t_5numpy_uintp_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":811 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":724 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< @@ -1116,7 +1267,7 @@ typedef npy_uintp __pyx_t_5numpy_uintp_t; */ typedef npy_double __pyx_t_5numpy_float_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":812 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":725 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< @@ -1125,7 +1276,7 @@ typedef npy_double __pyx_t_5numpy_float_t; */ typedef npy_double __pyx_t_5numpy_double_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":813 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":726 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< @@ -1164,7 +1315,7 @@ struct __pyx_MemviewEnum_obj; struct __pyx_memoryview_obj; struct __pyx_memoryviewslice_obj; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":815 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":728 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< @@ -1173,7 +1324,7 @@ struct __pyx_memoryviewslice_obj; */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":816 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":729 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< @@ -1182,7 +1333,7 @@ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":817 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":730 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< @@ -1191,7 +1342,7 @@ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":819 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":732 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< @@ -1199,8 +1350,80 @@ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_jn; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_jn; +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_yn; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_yn; +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_in; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_in; +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_kn; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_kn; + +/* "scipy/special/cython_special.pxd":8 + * double + * + * cpdef number_t spherical_jn(long n, number_t z, bint derivative=*) nogil # <<<<<<<<<<<<<< + * cpdef number_t spherical_yn(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_in(long n, number_t z, bint derivative=*) nogil + */ +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_jn { + int __pyx_n; + int derivative; +}; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_jn { + int __pyx_n; + int derivative; +}; + +/* "scipy/special/cython_special.pxd":9 + * + * cpdef number_t spherical_jn(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_yn(long n, number_t z, bint derivative=*) nogil # <<<<<<<<<<<<<< + * cpdef number_t spherical_in(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_kn(long n, number_t z, bint derivative=*) nogil + */ +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_yn { + int __pyx_n; + int derivative; +}; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_yn { + int __pyx_n; + int derivative; +}; + +/* "scipy/special/cython_special.pxd":10 + * cpdef number_t spherical_jn(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_yn(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_in(long n, number_t z, bint derivative=*) nogil # <<<<<<<<<<<<<< + * cpdef number_t spherical_kn(long n, number_t z, bint derivative=*) nogil + * + */ +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_in { + int __pyx_n; + int derivative; +}; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_in { + int __pyx_n; + int derivative; +}; + +/* "scipy/special/cython_special.pxd":11 + * cpdef number_t spherical_yn(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_in(long n, number_t z, bint derivative=*) nogil + * cpdef number_t spherical_kn(long n, number_t z, bint derivative=*) nogil # <<<<<<<<<<<<<< + * + * ctypedef fused Dd_number_t: + */ +struct __pyx_fuse_0__pyx_opt_args_5scipy_7special_14cython_special_spherical_kn { + int __pyx_n; + int derivative; +}; +struct __pyx_fuse_1__pyx_opt_args_5scipy_7special_14cython_special_spherical_kn { + int __pyx_n; + int derivative; +}; -/* "View.MemoryView":105 +/* "View.MemoryView":106 * * @cname("__pyx_array") * cdef class array: # <<<<<<<<<<<<<< @@ -1225,7 +1448,7 @@ struct __pyx_array_obj { }; -/* "View.MemoryView":279 +/* "View.MemoryView":280 * * @cname('__pyx_MemviewEnum') * cdef class Enum(object): # <<<<<<<<<<<<<< @@ -1238,7 +1461,7 @@ struct __pyx_MemviewEnum_obj { }; -/* "View.MemoryView":330 +/* "View.MemoryView":331 * * @cname('__pyx_memoryview') * cdef class memoryview(object): # <<<<<<<<<<<<<< @@ -1261,7 +1484,7 @@ struct __pyx_memoryview_obj { }; -/* "View.MemoryView":965 +/* "View.MemoryView":967 * * @cname('__pyx_memoryviewslice') * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< @@ -1278,7 +1501,7 @@ struct __pyx_memoryviewslice_obj { -/* "View.MemoryView":105 +/* "View.MemoryView":106 * * @cname("__pyx_array") * cdef class array: # <<<<<<<<<<<<<< @@ -1292,7 +1515,7 @@ struct __pyx_vtabstruct_array { static struct __pyx_vtabstruct_array *__pyx_vtabptr_array; -/* "View.MemoryView":330 +/* "View.MemoryView":331 * * @cname('__pyx_memoryview') * cdef class memoryview(object): # <<<<<<<<<<<<<< @@ -1312,7 +1535,7 @@ struct __pyx_vtabstruct_memoryview { static struct __pyx_vtabstruct_memoryview *__pyx_vtabptr_memoryview; -/* "View.MemoryView":965 +/* "View.MemoryView":967 * * @cname('__pyx_memoryviewslice') * cdef class _memoryviewslice(memoryview): # <<<<<<<<<<<<<< @@ -1466,18 +1689,18 @@ static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UIN /* GetModuleGlobalName.proto */ #if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) {\ +#define __Pyx_GetModuleGlobalName(var, name) do {\ static PY_UINT64_T __pyx_dict_version = 0;\ static PyObject *__pyx_dict_cached_value = NULL;\ (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} -#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ +} while(0) +#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ PY_UINT64_T __pyx_dict_version;\ PyObject *__pyx_dict_cached_value;\ (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} +} while(0) static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); #else #define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) @@ -1506,13 +1729,21 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, #ifndef Py_MEMBER_SIZE #define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) #endif +#if CYTHON_FAST_PYCALL static size_t __pyx_pyframe_localsplus_offset = 0; #include "frameobject.h" +#if PY_VERSION_HEX >= 0x030b00a6 + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif #define __Pxy_PyFrame_Initialize_Offsets()\ ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) #define __Pyx_PyFrame_GetLocalsplus(frame)\ (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif // CYTHON_FAST_PYCALL #endif /* PyObjectCall.proto */ @@ -1595,32 +1826,6 @@ static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* DictGetItem.proto */ -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY -static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); -#define __Pyx_PyObject_Dict_GetItem(obj, name)\ - (likely(PyDict_CheckExact(obj)) ?\ - __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) -#else -#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) -#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) -#endif - -/* RaiseTooManyValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -/* RaiseNeedMoreValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -/* RaiseNoneIterError.proto */ -static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); - -/* ExtTypeTest.proto */ -static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); - /* GetTopmostException.proto */ #if CYTHON_USE_EXC_INFO_STACK static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); @@ -1653,6 +1858,9 @@ static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + /* IncludeStringH.proto */ #include @@ -1669,7 +1877,7 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #define __Pyx_PyString_Equals __Pyx_PyBytes_Equals #endif -/* None.proto */ +/* DivInt[Py_ssize_t].proto */ static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); /* UnaryNegOverflows.proto */ @@ -1733,6 +1941,18 @@ static CYTHON_INLINE PyObject* __Pyx_decode_c_string( /* GetAttr3.proto */ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + /* SwapException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) @@ -1766,7 +1986,7 @@ static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { if (likely(L->allocated > len)) { Py_INCREF(x); PyList_SET_ITEM(list, len, x); - Py_SIZE(list) = len+1; + __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); @@ -1804,7 +2024,7 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { Py_INCREF(x); PyList_SET_ITEM(list, len, x); - Py_SIZE(list) = len+1; + __Pyx_SET_SIZE(list, len + 1); return 0; } return PyList_Append(list, x); @@ -1816,9 +2036,15 @@ static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { /* None.proto */ static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); -/* None.proto */ +/* DivInt[long].proto */ static CYTHON_INLINE long __Pyx_div_long(long, long); +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + /* ImportFrom.proto */ static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); @@ -1842,6 +2068,9 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam /* SetVTable.proto */ static int __Pyx_SetVtable(PyObject *dict, void *vtable); +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + /* SetupReduce.proto */ static int __Pyx_setup_reduce(PyObject* type_obj); @@ -1916,8 +2145,30 @@ static int __pyx_slices_overlap(__Pyx_memviewslice *slice1, /* Capsule.proto */ static CYTHON_INLINE PyObject *__pyx_capsule_create(void *p, const char *sig); -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); +/* TypeInfoCompare.proto */ +static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); + +/* MemviewSliceValidateAndInit.proto */ +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_double(PyObject *, int writable_flag); + +/* ObjectToMemviewSlice.proto */ +static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); + +/* GCCDiagnostics.proto */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif /* RealImag.proto */ #if CYTHON_CCOMPLEX @@ -2017,12 +2268,6 @@ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); #endif #endif -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); - /* MemviewSliceCopyTemplate.proto */ static __Pyx_memviewslice __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, @@ -2030,6 +2275,9 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, size_t sizeof_dtype, int contig_flag, int dtype_is_object); +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value); + /* CIntFromPy.proto */ static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *); @@ -2039,32 +2287,15 @@ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *); -/* TypeInfoCompare.proto */ -static int __pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b); - -/* MemviewSliceValidateAndInit.proto */ -static int __Pyx_ValidateAndInit_memviewslice( - int *axes_specs, - int c_or_f_flag, - int buf_flags, - int ndim, - __Pyx_TypeInfo *dtype, - __Pyx_BufFmt_StackElem stack[], - __Pyx_memviewslice *memviewslice, - PyObject *original_obj); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_double(PyObject *, int writable_flag); - -/* ObjectToMemviewSlice.proto */ -static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *, int writable_flag); - /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); @@ -2111,8 +2342,17 @@ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_generic = 0; +static PyTypeObject *__pyx_ptype_5numpy_number = 0; +static PyTypeObject *__pyx_ptype_5numpy_integer = 0; +static PyTypeObject *__pyx_ptype_5numpy_signedinteger = 0; +static PyTypeObject *__pyx_ptype_5numpy_unsignedinteger = 0; +static PyTypeObject *__pyx_ptype_5numpy_inexact = 0; +static PyTypeObject *__pyx_ptype_5numpy_floating = 0; +static PyTypeObject *__pyx_ptype_5numpy_complexfloating = 0; +static PyTypeObject *__pyx_ptype_5numpy_flexible = 0; +static PyTypeObject *__pyx_ptype_5numpy_character = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; -static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ /* Module declarations from 'scipy.special.cython_special' */ static double (*__pyx_f_5scipy_7special_14cython_special_pdtr)(double, double, int __pyx_skip_dispatch); /*proto*/ @@ -2177,9 +2417,8 @@ int __pyx_module_is_main_pygom__model___tau_leap = 0; /* Implementation of 'pygom.model._tau_leap' */ static PyObject *__pyx_builtin_range; -static PyObject *__pyx_builtin_ValueError; -static PyObject *__pyx_builtin_RuntimeError; static PyObject *__pyx_builtin_ImportError; +static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_MemoryError; static PyObject *__pyx_builtin_enumerate; static PyObject *__pyx_builtin_TypeError; @@ -2256,7 +2495,6 @@ static const char __pyx_k_ImportError[] = "ImportError"; static const char __pyx_k_MemoryError[] = "MemoryError"; static const char __pyx_k_PickleError[] = "PickleError"; static const char __pyx_k_n_reactants[] = "n_reactants"; -static const char __pyx_k_RuntimeError[] = "RuntimeError"; static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; static const char __pyx_k_reactant_mat[] = "reactant_mat"; static const char __pyx_k_stringsource[] = "stringsource"; @@ -2282,29 +2520,23 @@ static const char __pyx_k_Cannot_index_with_type_s[] = "Cannot index with type ' static const char __pyx_k_Invalid_shape_in_axis_d_d[] = "Invalid shape in axis %d: %d."; static const char __pyx_k_pygom_model__tau_leap_pyx[] = "pygom/model/_tau_leap.pyx"; static const char __pyx_k_itemsize_0_for_cython_array[] = "itemsize <= 0 for cython.array"; -static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; static const char __pyx_k_unable_to_allocate_array_data[] = "unable to allocate array data."; static const char __pyx_k_strided_and_direct_or_indirect[] = ""; static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; -static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; static const char __pyx_k_Buffer_view_does_not_expose_stri[] = "Buffer view does not expose strides"; static const char __pyx_k_Can_only_create_a_buffer_that_is[] = "Can only create a buffer that is contiguous in memory."; static const char __pyx_k_Cannot_assign_to_read_only_memor[] = "Cannot assign to read-only memoryview"; static const char __pyx_k_Cannot_create_writable_memory_vi[] = "Cannot create writable memory view from read-only memoryview"; static const char __pyx_k_Empty_shape_tuple_for_cython_arr[] = "Empty shape tuple for cython.array"; -static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; -static const char __pyx_k_Incompatible_checksums_s_vs_0xb0[] = "Incompatible checksums (%s vs 0xb068931 = (name))"; +static const char __pyx_k_Incompatible_checksums_0x_x_vs_0[] = "Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))"; static const char __pyx_k_Indirect_dimensions_not_supporte[] = "Indirect dimensions not supported"; static const char __pyx_k_Invalid_mode_expected_c_or_fortr[] = "Invalid mode, expected 'c' or 'fortran', got %s"; -static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; static const char __pyx_k_Out_of_bounds_on_buffer_access_a[] = "Out of bounds on buffer access (axis %d)"; static const char __pyx_k_Unable_to_convert_item_to_object[] = "Unable to convert item to object"; static const char __pyx_k_got_differing_extents_in_dimensi[] = "got differing extents in dimension %d (got %d and %d)"; -static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; static const char __pyx_k_no_default___reduce___due_to_non[] = "no default __reduce__ due to non-trivial __cinit__"; static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; static const char __pyx_k_unable_to_allocate_shape_and_str[] = "unable to allocate shape and strides."; -static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; static PyObject *__pyx_n_s_ASCII; static PyObject *__pyx_kp_s_Buffer_view_does_not_expose_stri; static PyObject *__pyx_kp_s_Can_only_create_a_buffer_that_is; @@ -2313,10 +2545,8 @@ static PyObject *__pyx_kp_s_Cannot_create_writable_memory_vi; static PyObject *__pyx_kp_s_Cannot_index_with_type_s; static PyObject *__pyx_n_s_Ellipsis; static PyObject *__pyx_kp_s_Empty_shape_tuple_for_cython_arr; -static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; -static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; static PyObject *__pyx_n_s_ImportError; -static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0xb0; +static PyObject *__pyx_kp_s_Incompatible_checksums_0x_x_vs_0; static PyObject *__pyx_n_s_IndexError; static PyObject *__pyx_kp_s_Indirect_dimensions_not_supporte; static PyObject *__pyx_kp_s_Invalid_mode_expected_c_or_fortr; @@ -2324,11 +2554,9 @@ static PyObject *__pyx_kp_s_Invalid_shape_in_axis_d_d; static PyObject *__pyx_n_s_MemoryError; static PyObject *__pyx_kp_s_MemoryView_of_r_at_0x_x; static PyObject *__pyx_kp_s_MemoryView_of_r_object; -static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; static PyObject *__pyx_n_b_O; static PyObject *__pyx_kp_s_Out_of_bounds_on_buffer_access_a; static PyObject *__pyx_n_s_PickleError; -static PyObject *__pyx_n_s_RuntimeError; static PyObject *__pyx_n_s_TypeError; static PyObject *__pyx_kp_s_Unable_to_convert_item_to_object; static PyObject *__pyx_n_s_ValueError; @@ -2371,8 +2599,6 @@ static PyObject *__pyx_n_s_n_rates; static PyObject *__pyx_n_s_n_reactants; static PyObject *__pyx_n_s_name; static PyObject *__pyx_n_s_name_2; -static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; -static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; static PyObject *__pyx_n_s_ndim; static PyObject *__pyx_n_s_new; static PyObject *__pyx_n_s_new_cdf; @@ -2421,14 +2647,11 @@ static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_total_rate; static PyObject *__pyx_kp_s_unable_to_allocate_array_data; static PyObject *__pyx_kp_s_unable_to_allocate_shape_and_str; -static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; static PyObject *__pyx_n_s_unpack; static PyObject *__pyx_n_s_update; static PyObject *__pyx_n_s_x; static PyObject *__pyx_n_s_x_view; static PyObject *__pyx_pf_5pygom_5model_9_tau_leap__cy_test_tau_leap_safety(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_x, PyArrayObject *__pyx_v_reactant_mat, PyArrayObject *__pyx_v_rates, double __pyx_v_tau_scale, double __pyx_v_epsilon); /* proto */ -static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ -static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __pyx_array_obj *__pyx_v_self, PyObject *__pyx_v_shape, Py_ssize_t __pyx_v_itemsize, PyObject *__pyx_v_format, PyObject *__pyx_v_mode, int __pyx_v_allocate_buffer); /* proto */ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(struct __pyx_array_obj *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struct __pyx_array_obj *__pyx_v_self); /* proto */ @@ -2477,6 +2700,8 @@ static PyObject *__pyx_tp_new_memoryview(PyTypeObject *t, PyObject *a, PyObject static PyObject *__pyx_tp_new__memoryviewslice(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ static PyObject *__pyx_int_0; static PyObject *__pyx_int_1; +static PyObject *__pyx_int_112105877; +static PyObject *__pyx_int_136983863; static PyObject *__pyx_int_184977713; static PyObject *__pyx_int_neg_1; static PyObject *__pyx_tuple_; @@ -2488,7 +2713,7 @@ static PyObject *__pyx_tuple__6; static PyObject *__pyx_tuple__7; static PyObject *__pyx_tuple__8; static PyObject *__pyx_tuple__9; -static PyObject *__pyx_slice__22; +static PyObject *__pyx_slice__17; static PyObject *__pyx_tuple__10; static PyObject *__pyx_tuple__11; static PyObject *__pyx_tuple__12; @@ -2496,23 +2721,19 @@ static PyObject *__pyx_tuple__13; static PyObject *__pyx_tuple__14; static PyObject *__pyx_tuple__15; static PyObject *__pyx_tuple__16; -static PyObject *__pyx_tuple__17; static PyObject *__pyx_tuple__18; static PyObject *__pyx_tuple__19; static PyObject *__pyx_tuple__20; static PyObject *__pyx_tuple__21; -static PyObject *__pyx_tuple__23; +static PyObject *__pyx_tuple__22; static PyObject *__pyx_tuple__24; static PyObject *__pyx_tuple__25; static PyObject *__pyx_tuple__26; +static PyObject *__pyx_tuple__27; static PyObject *__pyx_tuple__28; static PyObject *__pyx_tuple__29; -static PyObject *__pyx_tuple__30; -static PyObject *__pyx_tuple__31; -static PyObject *__pyx_tuple__32; -static PyObject *__pyx_tuple__33; -static PyObject *__pyx_codeobj__27; -static PyObject *__pyx_codeobj__34; +static PyObject *__pyx_codeobj__23; +static PyObject *__pyx_codeobj__30; /* Late includes */ /* "pygom/model/_tau_leap.pyx":11 @@ -2533,6 +2754,9 @@ static PyObject *__pyx_pw_5pygom_5model_9_tau_leap_1_cy_test_tau_leap_safety(PyO PyArrayObject *__pyx_v_rates = 0; double __pyx_v_tau_scale; double __pyx_v_epsilon; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_cy_test_tau_leap_safety (wrapper)", 0); @@ -2664,9 +2888,10 @@ static PyObject *__pyx_pf_5pygom_5model_9_tau_leap__cy_test_tau_leap_safety(CYTH __pyx_t_5numpy_int64_t __pyx_t_13; __pyx_t_5numpy_int64_t __pyx_t_14; __pyx_t_5numpy_int64_t __pyx_t_15; - __pyx_t_5numpy_int64_t __pyx_t_16; - __pyx_t_5numpy_int64_t __pyx_t_17; - int __pyx_t_18; + int __pyx_t_16; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_cy_test_tau_leap_safety", 0); __pyx_pybuffer_x.pybuffer.buf = NULL; __pyx_pybuffer_x.refcount = 0; @@ -2862,8 +3087,8 @@ static PyObject *__pyx_pf_5pygom_5model_9_tau_leap__cy_test_tau_leap_safety(CYTH * new_cdf = csc.pdtr(floor(x_view[i]), mu) * if new_cdf < cdf_val: */ - __pyx_t_16 = __pyx_v_i; - __pyx_v_mu = ((*((double *) ( /* dim=0 */ (__pyx_v_rates_view.data + __pyx_t_16 * __pyx_v_rates_view.strides[0]) ))) * __pyx_v_tau_scale); + __pyx_t_15 = __pyx_v_i; + __pyx_v_mu = ((*((double *) ( /* dim=0 */ (__pyx_v_rates_view.data + __pyx_t_15 * __pyx_v_rates_view.strides[0]) ))) * __pyx_v_tau_scale); /* "pygom/model/_tau_leap.pyx":41 * if reactant_mat_view[j, i] == 1: @@ -2872,8 +3097,8 @@ static PyObject *__pyx_pf_5pygom_5model_9_tau_leap__cy_test_tau_leap_safety(CYTH * if new_cdf < cdf_val: * cdf_val = new_cdf */ - __pyx_t_17 = __pyx_v_i; - __pyx_v_new_cdf = __pyx_f_5scipy_7special_14cython_special_pdtr(floor((*((double *) ( /* dim=0 */ (__pyx_v_x_view.data + __pyx_t_17 * __pyx_v_x_view.strides[0]) )))), __pyx_v_mu, 0); + __pyx_t_15 = __pyx_v_i; + __pyx_v_new_cdf = __pyx_f_5scipy_7special_14cython_special_pdtr(floor((*((double *) ( /* dim=0 */ (__pyx_v_x_view.data + __pyx_t_15 * __pyx_v_x_view.strides[0]) )))), __pyx_v_mu, 0); /* "pygom/model/_tau_leap.pyx":39 * #new_cdf = _ppois(xi, mu=tau_scale*r).min() @@ -2999,14 +3224,14 @@ static PyObject *__pyx_pf_5pygom_5model_9_tau_leap__cy_test_tau_leap_safety(CYTH * return False * count += 1 */ - __pyx_t_18 = (((__pyx_v_tau_scale * __pyx_v_total_rate) <= 1.0) != 0); - if (!__pyx_t_18) { + __pyx_t_16 = (((__pyx_v_tau_scale * __pyx_v_total_rate) <= 1.0) != 0); + if (!__pyx_t_16) { } else { - __pyx_t_7 = __pyx_t_18; + __pyx_t_7 = __pyx_t_16; goto __pyx_L14_bool_binop_done; } - __pyx_t_18 = ((__pyx_v_count > 0x100) != 0); - __pyx_t_7 = __pyx_t_18; + __pyx_t_16 = ((__pyx_v_count > 0x100) != 0); + __pyx_t_7 = __pyx_t_16; __pyx_L14_bool_binop_done:; if (__pyx_t_7) { @@ -3100,1918 +3325,331 @@ static PyObject *__pyx_pf_5pygom_5model_9_tau_leap__cy_test_tau_leap_safety(CYTH return __pyx_r; } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":258 - * # experimental exception made for __getbuffer__ and __releasebuffer__ - * # -- the details of this may change. - * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< - * # This implementation of getbuffer is geared towards Cython - * # requirements, and does not yet fulfill the PEP. +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":734 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * */ -/* Python wrapper */ -static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ -static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_r; +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); - __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":735 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 735, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":734 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { - int __pyx_v_i; - int __pyx_v_ndim; - int __pyx_v_endian_detector; - int __pyx_v_little_endian; - int __pyx_v_t; - char *__pyx_v_f; - PyArray_Descr *__pyx_v_descr = 0; - int __pyx_v_offset; - int __pyx_r; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - int __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - int __pyx_t_5; - int __pyx_t_6; - PyArray_Descr *__pyx_t_7; - PyObject *__pyx_t_8 = NULL; - char *__pyx_t_9; - if (__pyx_v_info == NULL) { - PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); - return -1; - } - __Pyx_RefNannySetupContext("__getbuffer__", 0); - __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(__pyx_v_info->obj); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":265 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":737 + * return PyArray_MultiIterNew(1, a) * - * cdef int i, ndim - * cdef int endian_detector = 1 # <<<<<<<<<<<<<< - * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) * */ - __pyx_v_endian_detector = 1; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":266 - * cdef int i, ndim - * cdef int endian_detector = 1 - * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< - * - * ndim = PyArray_NDIM(self) - */ - __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":268 - * cdef bint little_endian = ((&endian_detector)[0] != 0) + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":738 * - * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * cdef inline object PyArray_MultiIterNew3(a, b, c): */ - __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 738, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 - * ndim = PyArray_NDIM(self) - * - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)): - * raise ValueError(u"ndarray is not C contiguous") - */ - __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":271 - * - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< - * raise ValueError(u"ndarray is not C contiguous") - * - */ - __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_ARRAY_C_CONTIGUOUS) != 0)) != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 - * ndim = PyArray_NDIM(self) - * - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)): - * raise ValueError(u"ndarray is not C contiguous") - */ - if (unlikely(__pyx_t_1)) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":272 - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)): - * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":737 + * return PyArray_MultiIterNew(1, a) * - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 272, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 272, __pyx_L1_error) - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":270 - * ndim = PyArray_NDIM(self) + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) * - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)): - * raise ValueError(u"ndarray is not C contiguous") */ - } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 - * raise ValueError(u"ndarray is not C contiguous") - * - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)): - * raise ValueError(u"ndarray is not Fortran contiguous") - */ - __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L7_bool_binop_done; - } + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":275 - * - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< - * raise ValueError(u"ndarray is not Fortran contiguous") +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":740 + * return PyArray_MultiIterNew(2, a, b) * - */ - __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_ARRAY_F_CONTIGUOUS) != 0)) != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L7_bool_binop_done:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 - * raise ValueError(u"ndarray is not C contiguous") + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) * - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)): - * raise ValueError(u"ndarray is not Fortran contiguous") */ - if (unlikely(__pyx_t_1)) { - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":276 - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)): - * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< - * - * info.buf = PyArray_DATA(self) - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 276, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 276, __pyx_L1_error) +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":274 - * raise ValueError(u"ndarray is not C contiguous") + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":741 * - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)): - * raise ValueError(u"ndarray is not Fortran contiguous") - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":278 - * raise ValueError(u"ndarray is not Fortran contiguous") + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * - * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< - * info.ndim = ndim - * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ - __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 741, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":279 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":740 + * return PyArray_MultiIterNew(2, a, b) * - * info.buf = PyArray_DATA(self) - * info.ndim = ndim # <<<<<<<<<<<<<< - * if sizeof(npy_intp) != sizeof(Py_ssize_t): - * # Allocate new buffer for strides and shape info. - */ - __pyx_v_info->ndim = __pyx_v_ndim; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":280 - * info.buf = PyArray_DATA(self) - * info.ndim = ndim - * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< - * # Allocate new buffer for strides and shape info. - * # This is allocated as one block, strides first. - */ - __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); - if (__pyx_t_1) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":283 - * # Allocate new buffer for strides and shape info. - * # This is allocated as one block, strides first. - * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) # <<<<<<<<<<<<<< - * info.shape = info.strides + ndim - * for i in range(ndim): - */ - __pyx_v_info->strides = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * 2) * ((size_t)__pyx_v_ndim)))); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":284 - * # This is allocated as one block, strides first. - * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) - * info.shape = info.strides + ndim # <<<<<<<<<<<<<< - * for i in range(ndim): - * info.strides[i] = PyArray_STRIDES(self)[i] - */ - __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":285 - * info.strides = PyObject_Malloc(sizeof(Py_ssize_t) * 2 * ndim) - * info.shape = info.strides + ndim - * for i in range(ndim): # <<<<<<<<<<<<<< - * info.strides[i] = PyArray_STRIDES(self)[i] - * info.shape[i] = PyArray_DIMS(self)[i] - */ - __pyx_t_4 = __pyx_v_ndim; - __pyx_t_5 = __pyx_t_4; - for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { - __pyx_v_i = __pyx_t_6; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":286 - * info.shape = info.strides + ndim - * for i in range(ndim): - * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< - * info.shape[i] = PyArray_DIMS(self)[i] - * else: - */ - (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":287 - * for i in range(ndim): - * info.strides[i] = PyArray_STRIDES(self)[i] - * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< - * else: - * info.strides = PyArray_STRIDES(self) - */ - (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":280 - * info.buf = PyArray_DATA(self) - * info.ndim = ndim - * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< - * # Allocate new buffer for strides and shape info. - * # This is allocated as one block, strides first. - */ - goto __pyx_L9; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":289 - * info.shape[i] = PyArray_DIMS(self)[i] - * else: - * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< - * info.shape = PyArray_DIMS(self) - * info.suboffsets = NULL - */ - /*else*/ { - __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":290 - * else: - * info.strides = PyArray_STRIDES(self) - * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< - * info.suboffsets = NULL - * info.itemsize = PyArray_ITEMSIZE(self) - */ - __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); - } - __pyx_L9:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":291 - * info.strides = PyArray_STRIDES(self) - * info.shape = PyArray_DIMS(self) - * info.suboffsets = NULL # <<<<<<<<<<<<<< - * info.itemsize = PyArray_ITEMSIZE(self) - * info.readonly = not PyArray_ISWRITEABLE(self) - */ - __pyx_v_info->suboffsets = NULL; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":292 - * info.shape = PyArray_DIMS(self) - * info.suboffsets = NULL - * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< - * info.readonly = not PyArray_ISWRITEABLE(self) + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) * */ - __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":293 - * info.suboffsets = NULL - * info.itemsize = PyArray_ITEMSIZE(self) - * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< - * - * cdef int t - */ - __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":296 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":743 + * return PyArray_MultiIterNew(3, a, b, c) * - * cdef int t - * cdef char* f = NULL # <<<<<<<<<<<<<< - * cdef dtype descr = PyArray_DESCR(self) - * cdef int offset - */ - __pyx_v_f = NULL; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":297 - * cdef int t - * cdef char* f = NULL - * cdef dtype descr = PyArray_DESCR(self) # <<<<<<<<<<<<<< - * cdef int offset + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) * */ - __pyx_t_7 = PyArray_DESCR(__pyx_v_self); - __pyx_t_3 = ((PyObject *)__pyx_t_7); - __Pyx_INCREF(__pyx_t_3); - __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); - __pyx_t_3 = 0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":300 - * cdef int offset - * - * info.obj = self # <<<<<<<<<<<<<< - * - * if not PyDataType_HASFIELDS(descr): - */ - __Pyx_INCREF(((PyObject *)__pyx_v_self)); - __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); - __pyx_v_info->obj = ((PyObject *)__pyx_v_self); +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":302 - * info.obj = self + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":744 * - * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< - * t = descr.type_num - * if ((descr.byteorder == c'>' and little_endian) or - */ - __pyx_t_1 = ((!(PyDataType_HASFIELDS(__pyx_v_descr) != 0)) != 0); - if (__pyx_t_1) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":303 + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * - * if not PyDataType_HASFIELDS(descr): - * t = descr.type_num # <<<<<<<<<<<<<< - * if ((descr.byteorder == c'>' and little_endian) or - * (descr.byteorder == c'<' and not little_endian)): - */ - __pyx_t_4 = __pyx_v_descr->type_num; - __pyx_v_t = __pyx_t_4; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":304 - * if not PyDataType_HASFIELDS(descr): - * t = descr.type_num - * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (descr.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); - if (!__pyx_t_2) { - goto __pyx_L15_next_or; - } else { - } - __pyx_t_2 = (__pyx_v_little_endian != 0); - if (!__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L14_bool_binop_done; - } - __pyx_L15_next_or:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":305 - * t = descr.type_num - * if ((descr.byteorder == c'>' and little_endian) or - * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< - * raise ValueError(u"Non-native byte order not supported") - * if t == NPY_BYTE: f = "b" - */ - __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L14_bool_binop_done; - } - __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); - __pyx_t_1 = __pyx_t_2; - __pyx_L14_bool_binop_done:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":304 - * if not PyDataType_HASFIELDS(descr): - * t = descr.type_num - * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (descr.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - if (unlikely(__pyx_t_1)) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":306 - * if ((descr.byteorder == c'>' and little_endian) or - * (descr.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< - * if t == NPY_BYTE: f = "b" - * elif t == NPY_UBYTE: f = "B" - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 306, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 306, __pyx_L1_error) - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":304 - * if not PyDataType_HASFIELDS(descr): - * t = descr.type_num - * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (descr.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":307 - * (descr.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< - * elif t == NPY_UBYTE: f = "B" - * elif t == NPY_SHORT: f = "h" - */ - switch (__pyx_v_t) { - case NPY_BYTE: - __pyx_v_f = ((char *)"b"); - break; - case NPY_UBYTE: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":308 - * raise ValueError(u"Non-native byte order not supported") - * if t == NPY_BYTE: f = "b" - * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< - * elif t == NPY_SHORT: f = "h" - * elif t == NPY_USHORT: f = "H" - */ - __pyx_v_f = ((char *)"B"); - break; - case NPY_SHORT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":309 - * if t == NPY_BYTE: f = "b" - * elif t == NPY_UBYTE: f = "B" - * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< - * elif t == NPY_USHORT: f = "H" - * elif t == NPY_INT: f = "i" - */ - __pyx_v_f = ((char *)"h"); - break; - case NPY_USHORT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":310 - * elif t == NPY_UBYTE: f = "B" - * elif t == NPY_SHORT: f = "h" - * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< - * elif t == NPY_INT: f = "i" - * elif t == NPY_UINT: f = "I" - */ - __pyx_v_f = ((char *)"H"); - break; - case NPY_INT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":311 - * elif t == NPY_SHORT: f = "h" - * elif t == NPY_USHORT: f = "H" - * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< - * elif t == NPY_UINT: f = "I" - * elif t == NPY_LONG: f = "l" - */ - __pyx_v_f = ((char *)"i"); - break; - case NPY_UINT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":312 - * elif t == NPY_USHORT: f = "H" - * elif t == NPY_INT: f = "i" - * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< - * elif t == NPY_LONG: f = "l" - * elif t == NPY_ULONG: f = "L" - */ - __pyx_v_f = ((char *)"I"); - break; - case NPY_LONG: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":313 - * elif t == NPY_INT: f = "i" - * elif t == NPY_UINT: f = "I" - * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< - * elif t == NPY_ULONG: f = "L" - * elif t == NPY_LONGLONG: f = "q" - */ - __pyx_v_f = ((char *)"l"); - break; - case NPY_ULONG: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":314 - * elif t == NPY_UINT: f = "I" - * elif t == NPY_LONG: f = "l" - * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< - * elif t == NPY_LONGLONG: f = "q" - * elif t == NPY_ULONGLONG: f = "Q" - */ - __pyx_v_f = ((char *)"L"); - break; - case NPY_LONGLONG: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":315 - * elif t == NPY_LONG: f = "l" - * elif t == NPY_ULONG: f = "L" - * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< - * elif t == NPY_ULONGLONG: f = "Q" - * elif t == NPY_FLOAT: f = "f" - */ - __pyx_v_f = ((char *)"q"); - break; - case NPY_ULONGLONG: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":316 - * elif t == NPY_ULONG: f = "L" - * elif t == NPY_LONGLONG: f = "q" - * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< - * elif t == NPY_FLOAT: f = "f" - * elif t == NPY_DOUBLE: f = "d" - */ - __pyx_v_f = ((char *)"Q"); - break; - case NPY_FLOAT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":317 - * elif t == NPY_LONGLONG: f = "q" - * elif t == NPY_ULONGLONG: f = "Q" - * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< - * elif t == NPY_DOUBLE: f = "d" - * elif t == NPY_LONGDOUBLE: f = "g" - */ - __pyx_v_f = ((char *)"f"); - break; - case NPY_DOUBLE: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":318 - * elif t == NPY_ULONGLONG: f = "Q" - * elif t == NPY_FLOAT: f = "f" - * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< - * elif t == NPY_LONGDOUBLE: f = "g" - * elif t == NPY_CFLOAT: f = "Zf" - */ - __pyx_v_f = ((char *)"d"); - break; - case NPY_LONGDOUBLE: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":319 - * elif t == NPY_FLOAT: f = "f" - * elif t == NPY_DOUBLE: f = "d" - * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< - * elif t == NPY_CFLOAT: f = "Zf" - * elif t == NPY_CDOUBLE: f = "Zd" - */ - __pyx_v_f = ((char *)"g"); - break; - case NPY_CFLOAT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":320 - * elif t == NPY_DOUBLE: f = "d" - * elif t == NPY_LONGDOUBLE: f = "g" - * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< - * elif t == NPY_CDOUBLE: f = "Zd" - * elif t == NPY_CLONGDOUBLE: f = "Zg" - */ - __pyx_v_f = ((char *)"Zf"); - break; - case NPY_CDOUBLE: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":321 - * elif t == NPY_LONGDOUBLE: f = "g" - * elif t == NPY_CFLOAT: f = "Zf" - * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< - * elif t == NPY_CLONGDOUBLE: f = "Zg" - * elif t == NPY_OBJECT: f = "O" - */ - __pyx_v_f = ((char *)"Zd"); - break; - case NPY_CLONGDOUBLE: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":322 - * elif t == NPY_CFLOAT: f = "Zf" - * elif t == NPY_CDOUBLE: f = "Zd" - * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< - * elif t == NPY_OBJECT: f = "O" - * else: - */ - __pyx_v_f = ((char *)"Zg"); - break; - case NPY_OBJECT: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":323 - * elif t == NPY_CDOUBLE: f = "Zd" - * elif t == NPY_CLONGDOUBLE: f = "Zg" - * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - */ - __pyx_v_f = ((char *)"O"); - break; - default: - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":325 - * elif t == NPY_OBJECT: f = "O" - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< - * info.format = f - * return - */ - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 325, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 325, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 325, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 325, __pyx_L1_error) - break; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":326 - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - * info.format = f # <<<<<<<<<<<<<< - * return - * else: - */ - __pyx_v_info->format = __pyx_v_f; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":327 - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - * info.format = f - * return # <<<<<<<<<<<<<< - * else: - * info.format = PyObject_Malloc(_buffer_format_string_len) + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ - __pyx_r = 0; - goto __pyx_L0; + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 744, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":302 - * info.obj = self + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":743 + * return PyArray_MultiIterNew(3, a, b, c) * - * if not PyDataType_HASFIELDS(descr): # <<<<<<<<<<<<<< - * t = descr.type_num - * if ((descr.byteorder == c'>' and little_endian) or - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":329 - * return - * else: - * info.format = PyObject_Malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< - * info.format[0] = c'^' # Native data types, manual alignment - * offset = 0 - */ - /*else*/ { - __pyx_v_info->format = ((char *)PyObject_Malloc(0xFF)); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":330 - * else: - * info.format = PyObject_Malloc(_buffer_format_string_len) - * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< - * offset = 0 - * f = _util_dtypestring(descr, info.format + 1, - */ - (__pyx_v_info->format[0]) = '^'; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":331 - * info.format = PyObject_Malloc(_buffer_format_string_len) - * info.format[0] = c'^' # Native data types, manual alignment - * offset = 0 # <<<<<<<<<<<<<< - * f = _util_dtypestring(descr, info.format + 1, - * info.format + _buffer_format_string_len, - */ - __pyx_v_offset = 0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":332 - * info.format[0] = c'^' # Native data types, manual alignment - * offset = 0 - * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< - * info.format + _buffer_format_string_len, - * &offset) - */ - __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 332, __pyx_L1_error) - __pyx_v_f = __pyx_t_9; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":335 - * info.format + _buffer_format_string_len, - * &offset) - * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) * - * def __releasebuffer__(ndarray self, Py_buffer* info): - */ - (__pyx_v_f[0]) = '\x00'; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":258 - * # experimental exception made for __getbuffer__ and __releasebuffer__ - * # -- the details of this may change. - * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< - * # This implementation of getbuffer is geared towards Cython - * # requirements, and does not yet fulfill the PEP. */ /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - if (__pyx_v_info->obj != NULL) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - goto __pyx_L2; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; __pyx_L0:; - if (__pyx_v_info->obj == Py_None) { - __Pyx_GOTREF(__pyx_v_info->obj); - __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = 0; - } - __pyx_L2:; - __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":337 - * f[0] = c'\0' # Terminate format string - * - * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< - * if PyArray_HASFIELDS(self): - * PyObject_Free(info.format) - */ - -/* Python wrapper */ -static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ -static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); - __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("__releasebuffer__", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":338 - * - * def __releasebuffer__(ndarray self, Py_buffer* info): - * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< - * PyObject_Free(info.format) - * if sizeof(npy_intp) != sizeof(Py_ssize_t): - */ - __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); - if (__pyx_t_1) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":339 - * def __releasebuffer__(ndarray self, Py_buffer* info): - * if PyArray_HASFIELDS(self): - * PyObject_Free(info.format) # <<<<<<<<<<<<<< - * if sizeof(npy_intp) != sizeof(Py_ssize_t): - * PyObject_Free(info.strides) - */ - PyObject_Free(__pyx_v_info->format); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":338 - * - * def __releasebuffer__(ndarray self, Py_buffer* info): - * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< - * PyObject_Free(info.format) - * if sizeof(npy_intp) != sizeof(Py_ssize_t): - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":340 - * if PyArray_HASFIELDS(self): - * PyObject_Free(info.format) - * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< - * PyObject_Free(info.strides) - * # info.shape was stored after info.strides in the same block - */ - __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); - if (__pyx_t_1) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":341 - * PyObject_Free(info.format) - * if sizeof(npy_intp) != sizeof(Py_ssize_t): - * PyObject_Free(info.strides) # <<<<<<<<<<<<<< - * # info.shape was stored after info.strides in the same block - * - */ - PyObject_Free(__pyx_v_info->strides); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":340 - * if PyArray_HASFIELDS(self): - * PyObject_Free(info.format) - * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< - * PyObject_Free(info.strides) - * # info.shape was stored after info.strides in the same block - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":337 - * f[0] = c'\0' # Terminate format string - * - * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< - * if PyArray_HASFIELDS(self): - * PyObject_Free(info.format) - */ - - /* function exit code */ - __Pyx_RefNannyFinishContext(); -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":821 - * ctypedef npy_cdouble complex_t - * - * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(1, a) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":822 - * - * cdef inline object PyArray_MultiIterNew1(a): - * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew2(a, b): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 822, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":821 - * ctypedef npy_cdouble complex_t - * - * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(1, a) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":824 - * return PyArray_MultiIterNew(1, a) - * - * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(2, a, b) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":825 - * - * cdef inline object PyArray_MultiIterNew2(a, b): - * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 825, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":824 - * return PyArray_MultiIterNew(1, a) - * - * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(2, a, b) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":827 - * return PyArray_MultiIterNew(2, a, b) - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(3, a, b, c) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":828 - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): - * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 828, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":827 - * return PyArray_MultiIterNew(2, a, b) - * - * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(3, a, b, c) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":830 - * return PyArray_MultiIterNew(3, a, b, c) - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(4, a, b, c, d) - * - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":831 - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): - * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 831, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":830 - * return PyArray_MultiIterNew(3, a, b, c) - * - * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(4, a, b, c, d) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":833 - * return PyArray_MultiIterNew(4, a, b, c, d) - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(5, a, b, c, d, e) +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":746 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":834 - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): - * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< - * - * cdef inline tuple PyDataType_SHAPE(dtype d): - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 834, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":833 - * return PyArray_MultiIterNew(4, a, b, c, d) - * - * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":836 - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< - * if PyDataType_HASSUBARRAY(d): - * return d.subarray.shape - */ - -static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":837 - * - * cdef inline tuple PyDataType_SHAPE(dtype d): - * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< - * return d.subarray.shape - * else: - */ - __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); - if (__pyx_t_1) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":838 - * cdef inline tuple PyDataType_SHAPE(dtype d): - * if PyDataType_HASSUBARRAY(d): - * return d.subarray.shape # <<<<<<<<<<<<<< - * else: - * return () - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); - __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); - goto __pyx_L0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":837 - * - * cdef inline tuple PyDataType_SHAPE(dtype d): - * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< - * return d.subarray.shape - * else: - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":840 - * return d.subarray.shape - * else: - * return () # <<<<<<<<<<<<<< - * - * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: - */ - /*else*/ { - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_empty_tuple); - __pyx_r = __pyx_empty_tuple; - goto __pyx_L0; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":836 - * return PyArray_MultiIterNew(5, a, b, c, d, e) - * - * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< - * if PyDataType_HASSUBARRAY(d): - * return d.subarray.shape - */ - - /* function exit code */ - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":842 - * return () - * - * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< - * # Recursive utility function used in __getbuffer__ to get format - * # string. The new location in the format string is returned. - */ - -static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { - PyArray_Descr *__pyx_v_child = 0; - int __pyx_v_endian_detector; - int __pyx_v_little_endian; - PyObject *__pyx_v_fields = 0; - PyObject *__pyx_v_childname = NULL; - PyObject *__pyx_v_new_offset = NULL; - PyObject *__pyx_v_t = NULL; - char *__pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - Py_ssize_t __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - int __pyx_t_5; - int __pyx_t_6; - int __pyx_t_7; - long __pyx_t_8; - char *__pyx_t_9; - __Pyx_RefNannySetupContext("_util_dtypestring", 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":847 - * - * cdef dtype child - * cdef int endian_detector = 1 # <<<<<<<<<<<<<< - * cdef bint little_endian = ((&endian_detector)[0] != 0) - * cdef tuple fields - */ - __pyx_v_endian_detector = 1; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":848 - * cdef dtype child - * cdef int endian_detector = 1 - * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< - * cdef tuple fields - * - */ - __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":851 - * cdef tuple fields - * - * for childname in descr.names: # <<<<<<<<<<<<<< - * fields = descr.fields[childname] - * child, new_offset = fields - */ - if (unlikely(__pyx_v_descr->names == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); - __PYX_ERR(1, 851, __pyx_L1_error) - } - __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; - for (;;) { - if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 851, __pyx_L1_error) - #else - __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 851, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - #endif - __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); - __pyx_t_3 = 0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":852 - * - * for childname in descr.names: - * fields = descr.fields[childname] # <<<<<<<<<<<<<< - * child, new_offset = fields - * - */ - if (unlikely(__pyx_v_descr->fields == Py_None)) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); - __PYX_ERR(1, 852, __pyx_L1_error) - } - __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 852, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 852, __pyx_L1_error) - __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); - __pyx_t_3 = 0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":853 - * for childname in descr.names: - * fields = descr.fields[childname] - * child, new_offset = fields # <<<<<<<<<<<<<< - * - * if (end - f) - (new_offset - offset[0]) < 15: - */ - if (likely(__pyx_v_fields != Py_None)) { - PyObject* sequence = __pyx_v_fields; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(1, 853, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 853, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 853, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - #endif - } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 853, __pyx_L1_error) - } - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 853, __pyx_L1_error) - __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); - __pyx_t_3 = 0; - __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); - __pyx_t_4 = 0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":855 - * child, new_offset = fields - * - * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - */ - __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 855, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 855, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 855, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); - if (unlikely(__pyx_t_6)) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":856 - * - * if (end - f) - (new_offset - offset[0]) < 15: - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * - * if ((child.byteorder == c'>' and little_endian) or - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 856, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 856, __pyx_L1_error) - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":855 - * child, new_offset = fields - * - * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":858 - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); - if (!__pyx_t_7) { - goto __pyx_L8_next_or; - } else { - } - __pyx_t_7 = (__pyx_v_little_endian != 0); - if (!__pyx_t_7) { - } else { - __pyx_t_6 = __pyx_t_7; - goto __pyx_L7_bool_binop_done; - } - __pyx_L8_next_or:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":859 - * - * if ((child.byteorder == c'>' and little_endian) or - * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< - * raise ValueError(u"Non-native byte order not supported") - * # One could encode it in the format string and have Cython - */ - __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); - if (__pyx_t_7) { - } else { - __pyx_t_6 = __pyx_t_7; - goto __pyx_L7_bool_binop_done; - } - __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); - __pyx_t_6 = __pyx_t_7; - __pyx_L7_bool_binop_done:; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":858 - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - if (unlikely(__pyx_t_6)) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":860 - * if ((child.byteorder == c'>' and little_endian) or - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< - * # One could encode it in the format string and have Cython - * # complain instead, BUT: < and > in format strings also imply - */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 860, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(1, 860, __pyx_L1_error) - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":858 - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") - * - * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< - * (child.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":870 - * - * # Output padding bytes - * while offset[0] < new_offset: # <<<<<<<<<<<<<< - * f[0] = 120 # "x"; pad byte - * f += 1 - */ - while (1) { - __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 870, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 870, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 870, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (!__pyx_t_6) break; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":871 - * # Output padding bytes - * while offset[0] < new_offset: - * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< - * f += 1 - * offset[0] += 1 - */ - (__pyx_v_f[0]) = 0x78; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":872 - * while offset[0] < new_offset: - * f[0] = 120 # "x"; pad byte - * f += 1 # <<<<<<<<<<<<<< - * offset[0] += 1 - * - */ - __pyx_v_f = (__pyx_v_f + 1); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":873 - * f[0] = 120 # "x"; pad byte - * f += 1 - * offset[0] += 1 # <<<<<<<<<<<<<< - * - * offset[0] += child.itemsize - */ - __pyx_t_8 = 0; - (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":875 - * offset[0] += 1 - * - * offset[0] += child.itemsize # <<<<<<<<<<<<<< - * - * if not PyDataType_HASFIELDS(child): - */ - __pyx_t_8 = 0; - (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":877 - * offset[0] += child.itemsize - * - * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< - * t = child.type_num - * if end - f < 5: - */ - __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); - if (__pyx_t_6) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":878 - * - * if not PyDataType_HASFIELDS(child): - * t = child.type_num # <<<<<<<<<<<<<< - * if end - f < 5: - * raise RuntimeError(u"Format string allocated too short.") - */ - __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 878, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); - __pyx_t_4 = 0; - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":879 - * if not PyDataType_HASFIELDS(child): - * t = child.type_num - * if end - f < 5: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short.") - * - */ - __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); - if (unlikely(__pyx_t_6)) { - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":880 - * t = child.type_num - * if end - f < 5: - * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * - * # Until ticket #99 is fixed, use integers to avoid warnings - */ - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 880, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 880, __pyx_L1_error) - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":879 - * if not PyDataType_HASFIELDS(child): - * t = child.type_num - * if end - f < 5: # <<<<<<<<<<<<<< - * raise RuntimeError(u"Format string allocated too short.") - * - */ - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":883 - * - * # Until ticket #99 is fixed, use integers to avoid warnings - * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< - * elif t == NPY_UBYTE: f[0] = 66 #"B" - * elif t == NPY_SHORT: f[0] = 104 #"h" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 883, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 883, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 883, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 98; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":884 - * # Until ticket #99 is fixed, use integers to avoid warnings - * if t == NPY_BYTE: f[0] = 98 #"b" - * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< - * elif t == NPY_SHORT: f[0] = 104 #"h" - * elif t == NPY_USHORT: f[0] = 72 #"H" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 884, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 884, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 884, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 66; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":885 - * if t == NPY_BYTE: f[0] = 98 #"b" - * elif t == NPY_UBYTE: f[0] = 66 #"B" - * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< - * elif t == NPY_USHORT: f[0] = 72 #"H" - * elif t == NPY_INT: f[0] = 105 #"i" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 885, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 885, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 885, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x68; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":886 - * elif t == NPY_UBYTE: f[0] = 66 #"B" - * elif t == NPY_SHORT: f[0] = 104 #"h" - * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< - * elif t == NPY_INT: f[0] = 105 #"i" - * elif t == NPY_UINT: f[0] = 73 #"I" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 886, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 886, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 886, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 72; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":887 - * elif t == NPY_SHORT: f[0] = 104 #"h" - * elif t == NPY_USHORT: f[0] = 72 #"H" - * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< - * elif t == NPY_UINT: f[0] = 73 #"I" - * elif t == NPY_LONG: f[0] = 108 #"l" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 887, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 887, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 887, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x69; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":888 - * elif t == NPY_USHORT: f[0] = 72 #"H" - * elif t == NPY_INT: f[0] = 105 #"i" - * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< - * elif t == NPY_LONG: f[0] = 108 #"l" - * elif t == NPY_ULONG: f[0] = 76 #"L" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 888, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 888, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 888, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 73; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":889 - * elif t == NPY_INT: f[0] = 105 #"i" - * elif t == NPY_UINT: f[0] = 73 #"I" - * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< - * elif t == NPY_ULONG: f[0] = 76 #"L" - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 889, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 889, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 889, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x6C; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":890 - * elif t == NPY_UINT: f[0] = 73 #"I" - * elif t == NPY_LONG: f[0] = 108 #"l" - * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 890, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 890, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 890, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 76; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":891 - * elif t == NPY_LONG: f[0] = 108 #"l" - * elif t == NPY_ULONG: f[0] = 76 #"L" - * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - * elif t == NPY_FLOAT: f[0] = 102 #"f" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 891, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 891, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 891, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x71; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":892 - * elif t == NPY_ULONG: f[0] = 76 #"L" - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< - * elif t == NPY_FLOAT: f[0] = 102 #"f" - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 892, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 892, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 892, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 81; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":893 - * elif t == NPY_LONGLONG: f[0] = 113 #"q" - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 893, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 893, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 893, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x66; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":894 - * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" - * elif t == NPY_FLOAT: f[0] = 102 #"f" - * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 894, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 894, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 894, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x64; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":895 - * elif t == NPY_FLOAT: f[0] = 102 #"f" - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 895, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 895, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 895, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 0x67; - goto __pyx_L15; - } - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":896 - * elif t == NPY_DOUBLE: f[0] = 100 #"d" - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg - */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 896, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 896, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 896, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 90; - (__pyx_v_f[1]) = 0x66; - __pyx_v_f = (__pyx_v_f + 1); - goto __pyx_L15; - } + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":897 - * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg - * elif t == NPY_OBJECT: f[0] = 79 #"O" + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":747 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline tuple PyDataType_SHAPE(dtype d): */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 897, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 897, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 897, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 90; - (__pyx_v_f[1]) = 0x64; - __pyx_v_f = (__pyx_v_f + 1); - goto __pyx_L15; - } + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 747, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":898 - * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< - * elif t == NPY_OBJECT: f[0] = 79 #"O" - * else: + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":746 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * */ - __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 898, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 898, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 898, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (__pyx_t_6) { - (__pyx_v_f[0]) = 90; - (__pyx_v_f[1]) = 0x67; - __pyx_v_f = (__pyx_v_f + 1); - goto __pyx_L15; - } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":899 - * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd - * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg - * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - */ - __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 899, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 899, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 899, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (likely(__pyx_t_6)) { - (__pyx_v_f[0]) = 79; - goto __pyx_L15; - } + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":901 - * elif t == NPY_OBJECT: f[0] = 79 #"O" - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< - * f += 1 - * else: +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":749 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape */ - /*else*/ { - __pyx_t_3 = __Pyx_PyUnicode_FormatSafe(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 901, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 901, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __Pyx_Raise(__pyx_t_4, 0, 0, 0); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(1, 901, __pyx_L1_error) - } - __pyx_L15:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":902 - * else: - * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) - * f += 1 # <<<<<<<<<<<<<< - * else: - * # Cython ignores struct boundary information ("T{...}"), - */ - __pyx_v_f = (__pyx_v_f + 1); +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyDataType_SHAPE(PyArray_Descr *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("PyDataType_SHAPE", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":877 - * offset[0] += child.itemsize + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":750 * - * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< - * t = child.type_num - * if end - f < 5: + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: */ - goto __pyx_L13; - } + __pyx_t_1 = (PyDataType_HASSUBARRAY(__pyx_v_d) != 0); + if (__pyx_t_1) { - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":906 - * # Cython ignores struct boundary information ("T{...}"), - * # so don't output it - * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< - * return f - * + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":751 + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape # <<<<<<<<<<<<<< + * else: + * return () */ - /*else*/ { - __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == ((char *)NULL))) __PYX_ERR(1, 906, __pyx_L1_error) - __pyx_v_f = __pyx_t_9; - } - __pyx_L13:; + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_d->subarray->shape)); + __pyx_r = ((PyObject*)__pyx_v_d->subarray->shape); + goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":851 - * cdef tuple fields + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":750 * - * for childname in descr.names: # <<<<<<<<<<<<<< - * fields = descr.fields[childname] - * child, new_offset = fields + * cdef inline tuple PyDataType_SHAPE(dtype d): + * if PyDataType_HASSUBARRAY(d): # <<<<<<<<<<<<<< + * return d.subarray.shape + * else: */ } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":907 - * # so don't output it - * f = _util_dtypestring(child, f, end, offset) - * return f # <<<<<<<<<<<<<< + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":753 + * return d.subarray.shape + * else: + * return () # <<<<<<<<<<<<<< * * */ - __pyx_r = __pyx_v_f; - goto __pyx_L0; + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_r = __pyx_empty_tuple; + goto __pyx_L0; + } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":842 - * return () + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":749 + * return PyArray_MultiIterNew(5, a, b, c, d, e) * - * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< - * # Recursive utility function used in __getbuffer__ to get format - * # string. The new location in the format string is returned. + * cdef inline tuple PyDataType_SHAPE(dtype d): # <<<<<<<<<<<<<< + * if PyDataType_HASSUBARRAY(d): + * return d.subarray.shape */ /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; __pyx_L0:; - __Pyx_XDECREF((PyObject *)__pyx_v_child); - __Pyx_XDECREF(__pyx_v_fields); - __Pyx_XDECREF(__pyx_v_childname); - __Pyx_XDECREF(__pyx_v_new_offset); - __Pyx_XDECREF(__pyx_v_t); + __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1022 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":928 * int _import_umath() except -1 * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -5023,7 +3661,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set_array_base", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1023 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":929 * * cdef inline void set_array_base(ndarray arr, object base): * Py_INCREF(base) # important to do this before stealing the reference below! # <<<<<<<<<<<<<< @@ -5032,7 +3670,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ Py_INCREF(__pyx_v_base); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1024 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":930 * cdef inline void set_array_base(ndarray arr, object base): * Py_INCREF(base) # important to do this before stealing the reference below! * PyArray_SetBaseObject(arr, base) # <<<<<<<<<<<<<< @@ -5041,7 +3679,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a */ (void)(PyArray_SetBaseObject(__pyx_v_arr, __pyx_v_base)); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1022 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":928 * int _import_umath() except -1 * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< @@ -5053,7 +3691,7 @@ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_a __Pyx_RefNannyFinishContext(); } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1026 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":932 * PyArray_SetBaseObject(arr, base) * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -5068,7 +3706,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1027 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":933 * * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) # <<<<<<<<<<<<<< @@ -5077,7 +3715,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ __pyx_v_base = PyArray_BASE(__pyx_v_arr); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1028 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":934 * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) * if base is NULL: # <<<<<<<<<<<<<< @@ -5087,7 +3725,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_t_1 = ((__pyx_v_base == NULL) != 0); if (__pyx_t_1) { - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1029 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":935 * base = PyArray_BASE(arr) * if base is NULL: * return None # <<<<<<<<<<<<<< @@ -5098,7 +3736,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1028 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":934 * cdef inline object get_array_base(ndarray arr): * base = PyArray_BASE(arr) * if base is NULL: # <<<<<<<<<<<<<< @@ -5107,7 +3745,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py */ } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1030 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":936 * if base is NULL: * return None * return base # <<<<<<<<<<<<<< @@ -5119,7 +3757,7 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py __pyx_r = ((PyObject *)__pyx_v_base); goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1026 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":932 * PyArray_SetBaseObject(arr, base) * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< @@ -5134,12 +3772,12 @@ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__py return __pyx_r; } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1034 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":940 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: - * _import_array() + * __pyx_import_array() */ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { @@ -5153,13 +3791,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_array", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1035 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":941 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< - * _import_array() + * __pyx_import_array() * except Exception: */ { @@ -5171,20 +3812,20 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1036 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":942 * cdef inline int import_array() except -1: * try: - * _import_array() # <<<<<<<<<<<<<< + * __pyx_import_array() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.multiarray failed to import") */ - __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1036, __pyx_L3_error) + __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 942, __pyx_L3_error) - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1035 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":941 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< - * _import_array() + * __pyx_import_array() * except Exception: */ } @@ -5194,9 +3835,9 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1037 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":943 * try: - * _import_array() + * __pyx_import_array() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.multiarray failed to import") * @@ -5204,32 +3845,32 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1037, __pyx_L5_except_error) + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 943, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1038 - * _import_array() + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":944 + * __pyx_import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1038, __pyx_L5_except_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 944, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 1038, __pyx_L5_except_error) + __PYX_ERR(1, 944, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1035 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":941 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< - * _import_array() + * __pyx_import_array() * except Exception: */ __Pyx_XGIVEREF(__pyx_t_1); @@ -5240,12 +3881,12 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { __pyx_L8_try_end:; } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1034 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":940 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: - * _import_array() + * __pyx_import_array() */ /* function exit code */ @@ -5263,7 +3904,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { return __pyx_r; } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1040 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":946 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -5282,9 +3923,12 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_umath", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1041 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":947 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -5300,16 +3944,16 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1042 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":948 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ - __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1042, __pyx_L3_error) + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 948, __pyx_L3_error) - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1041 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":947 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -5323,7 +3967,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { goto __pyx_L8_try_end; __pyx_L3_error:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1043 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":949 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< @@ -5333,28 +3977,28 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1043, __pyx_L5_except_error) + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 949, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1044 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":950 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1044, __pyx_L5_except_error) + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 950, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 1044, __pyx_L5_except_error) + __PYX_ERR(1, 950, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1041 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":947 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< @@ -5369,7 +4013,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { __pyx_L8_try_end:; } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1040 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":946 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< @@ -5392,7 +4036,7 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { return __pyx_r; } -/* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1046 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":952 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< @@ -5411,9 +4055,12 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("import_ufunc", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1047 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":953 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< @@ -5429,96 +4076,273 @@ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1048 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":954 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ - __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 1048, __pyx_L3_error) + __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 954, __pyx_L3_error) + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":953 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + } + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L8_try_end; + __pyx_L3_error:; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":955 + * try: + * _import_umath() + * except Exception: # <<<<<<<<<<<<<< + * raise ImportError("numpy.core.umath failed to import") + * + */ + __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); + if (__pyx_t_4) { + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 955, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":956 + * _import_umath() + * except Exception: + * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + * + * cdef extern from *: + */ + __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 956, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_Raise(__pyx_t_8, 0, 0, 0); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __PYX_ERR(1, 956, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":953 + * + * cdef inline int import_ufunc() except -1: + * try: # <<<<<<<<<<<<<< + * _import_umath() + * except Exception: + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L8_try_end:; + } + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":952 + * raise ImportError("numpy.core.umath failed to import") + * + * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< + * try: + * _import_umath() + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":966 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_timedelta64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_timedelta64_object", 0); + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":978 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyTimedeltaArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyTimedeltaArrType_Type)); + goto __pyx_L0; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":966 + * + * + * cdef inline bint is_timedelta64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.timedelta64)` + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":981 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + +static CYTHON_INLINE int __pyx_f_5numpy_is_datetime64_object(PyObject *__pyx_v_obj) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("is_datetime64_object", 0); + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":993 + * bool + * """ + * return PyObject_TypeCheck(obj, &PyDatetimeArrType_Type) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = PyObject_TypeCheck(__pyx_v_obj, (&PyDatetimeArrType_Type)); + goto __pyx_L0; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":981 + * + * + * cdef inline bint is_datetime64_object(object obj): # <<<<<<<<<<<<<< + * """ + * Cython equivalent of `isinstance(obj, np.datetime64)` + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":996 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + +static CYTHON_INLINE npy_datetime __pyx_f_5numpy_get_datetime64_value(PyObject *__pyx_v_obj) { + npy_datetime __pyx_r; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1003 + * also needed. That can be found using `get_datetime64_unit`. + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = ((PyDatetimeScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":996 + * + * + * cdef inline npy_datetime get_datetime64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy datetime64 object + */ + + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1047 +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1006 * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L8_try_end; - __pyx_L3_error:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1049 - * try: - * _import_umath() - * except Exception: # <<<<<<<<<<<<<< - * raise ImportError("numpy.core.umath failed to import") +static CYTHON_INLINE npy_timedelta __pyx_f_5numpy_get_timedelta64_value(PyObject *__pyx_v_obj) { + npy_timedelta __pyx_r; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1010 + * returns the int64 value underlying scalar numpy timedelta64 object + * """ + * return (obj).obval # <<<<<<<<<<<<<< + * + * */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); - if (__pyx_t_4) { - __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1049, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GOTREF(__pyx_t_7); + __pyx_r = ((PyTimedeltaScalarObject *)__pyx_v_obj)->obval; + goto __pyx_L0; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1050 - * _import_umath() - * except Exception: - * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1006 + * + * + * cdef inline npy_timedelta get_timedelta64_value(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the int64 value underlying scalar numpy timedelta64 object */ - __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1050, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_Raise(__pyx_t_8, 0, 0, 0); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __PYX_ERR(1, 1050, __pyx_L5_except_error) - } - goto __pyx_L5_except_error; - __pyx_L5_except_error:; - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1047 + /* function exit code */ + __pyx_L0:; + return __pyx_r; +} + +/* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1013 * - * cdef inline int import_ufunc() except -1: - * try: # <<<<<<<<<<<<<< - * _import_umath() - * except Exception: + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. */ - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L8_try_end:; - } - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1046 - * raise ImportError("numpy.core.umath failed to import") +static CYTHON_INLINE NPY_DATETIMEUNIT __pyx_f_5numpy_get_datetime64_unit(PyObject *__pyx_v_obj) { + NPY_DATETIMEUNIT __pyx_r; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1017 + * returns the unit part of the dtype for a numpy datetime64 object. + * """ + * return (obj).obmeta.base # <<<<<<<<<<<<<< + */ + __pyx_r = ((NPY_DATETIMEUNIT)((PyDatetimeScalarObject *)__pyx_v_obj)->obmeta.base); + goto __pyx_L0; + + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":1013 * - * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< - * try: - * _import_umath() + * + * cdef inline NPY_DATETIMEUNIT get_datetime64_unit(object obj) nogil: # <<<<<<<<<<<<<< + * """ + * returns the unit part of the dtype for a numpy datetime64 object. */ /* function exit code */ - __pyx_r = 0; - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; __pyx_L0:; - __Pyx_RefNannyFinishContext(); return __pyx_r; } -/* "View.MemoryView":122 +/* "View.MemoryView":123 * cdef bint dtype_is_object * * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< @@ -5534,6 +4358,9 @@ static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, P PyObject *__pyx_v_format = 0; PyObject *__pyx_v_mode = 0; int __pyx_v_allocate_buffer; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); @@ -5567,13 +4394,13 @@ static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, P case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_itemsize)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(2, 122, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 1); __PYX_ERR(2, 123, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_format)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(2, 122, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, 2); __PYX_ERR(2, 123, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: @@ -5589,7 +4416,7 @@ static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, P } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 122, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 123, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -5605,14 +4432,14 @@ static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, P } } __pyx_v_shape = ((PyObject*)values[0]); - __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 122, __pyx_L3_error) + __pyx_v_itemsize = __Pyx_PyIndex_AsSsize_t(values[1]); if (unlikely((__pyx_v_itemsize == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 123, __pyx_L3_error) __pyx_v_format = values[2]; __pyx_v_mode = values[3]; if (values[4]) { - __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 123, __pyx_L3_error) + __pyx_v_allocate_buffer = __Pyx_PyObject_IsTrue(values[4]); if (unlikely((__pyx_v_allocate_buffer == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 124, __pyx_L3_error) } else { - /* "View.MemoryView":123 + /* "View.MemoryView":124 * * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, * mode="c", bint allocate_buffer=True): # <<<<<<<<<<<<<< @@ -5624,19 +4451,19 @@ static int __pyx_array___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, P } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 122, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 123, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("View.MemoryView.array.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; - if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(2, 122, __pyx_L1_error) + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_shape), (&PyTuple_Type), 1, "shape", 1))) __PYX_ERR(2, 123, __pyx_L1_error) if (unlikely(((PyObject *)__pyx_v_format) == Py_None)) { - PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(2, 122, __pyx_L1_error) + PyErr_Format(PyExc_TypeError, "Argument '%.200s' must not be None", "format"); __PYX_ERR(2, 123, __pyx_L1_error) } __pyx_r = __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(((struct __pyx_array_obj *)__pyx_v_self), __pyx_v_shape, __pyx_v_itemsize, __pyx_v_format, __pyx_v_mode, __pyx_v_allocate_buffer); - /* "View.MemoryView":122 + /* "View.MemoryView":123 * cdef bint dtype_is_object * * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< @@ -5672,10 +4499,13 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ Py_ssize_t __pyx_t_9; PyObject *__pyx_t_10 = NULL; Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__cinit__", 0); __Pyx_INCREF(__pyx_v_format); - /* "View.MemoryView":129 + /* "View.MemoryView":130 * cdef PyObject **p * * self.ndim = len(shape) # <<<<<<<<<<<<<< @@ -5684,12 +4514,12 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ if (unlikely(__pyx_v_shape == Py_None)) { PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); - __PYX_ERR(2, 129, __pyx_L1_error) + __PYX_ERR(2, 130, __pyx_L1_error) } - __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(2, 129, __pyx_L1_error) + __pyx_t_1 = PyTuple_GET_SIZE(__pyx_v_shape); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(2, 130, __pyx_L1_error) __pyx_v_self->ndim = ((int)__pyx_t_1); - /* "View.MemoryView":130 + /* "View.MemoryView":131 * * self.ndim = len(shape) * self.itemsize = itemsize # <<<<<<<<<<<<<< @@ -5698,7 +4528,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_self->itemsize = __pyx_v_itemsize; - /* "View.MemoryView":132 + /* "View.MemoryView":133 * self.itemsize = itemsize * * if not self.ndim: # <<<<<<<<<<<<<< @@ -5708,20 +4538,20 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_2 = ((!(__pyx_v_self->ndim != 0)) != 0); if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":133 + /* "View.MemoryView":134 * * if not self.ndim: * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< * * if itemsize <= 0: */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 133, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 134, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 133, __pyx_L1_error) + __PYX_ERR(2, 134, __pyx_L1_error) - /* "View.MemoryView":132 + /* "View.MemoryView":133 * self.itemsize = itemsize * * if not self.ndim: # <<<<<<<<<<<<<< @@ -5730,7 +4560,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":135 + /* "View.MemoryView":136 * raise ValueError("Empty shape tuple for cython.array") * * if itemsize <= 0: # <<<<<<<<<<<<<< @@ -5740,20 +4570,20 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_2 = ((__pyx_v_itemsize <= 0) != 0); if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":136 + /* "View.MemoryView":137 * * if itemsize <= 0: * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< * * if not isinstance(format, bytes): */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 136, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 137, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 136, __pyx_L1_error) + __PYX_ERR(2, 137, __pyx_L1_error) - /* "View.MemoryView":135 + /* "View.MemoryView":136 * raise ValueError("Empty shape tuple for cython.array") * * if itemsize <= 0: # <<<<<<<<<<<<<< @@ -5762,7 +4592,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":138 + /* "View.MemoryView":139 * raise ValueError("itemsize <= 0 for cython.array") * * if not isinstance(format, bytes): # <<<<<<<<<<<<<< @@ -5773,14 +4603,14 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0); if (__pyx_t_4) { - /* "View.MemoryView":139 + /* "View.MemoryView":140 * * if not isinstance(format, bytes): * format = format.encode('ASCII') # <<<<<<<<<<<<<< * self._format = format # keep a reference to the byte string * self.format = self._format */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 139, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_format, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { @@ -5794,13 +4624,13 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ } __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_6, __pyx_n_s_ASCII) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_n_s_ASCII); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 139, __pyx_L1_error) + if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF_SET(__pyx_v_format, __pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":138 + /* "View.MemoryView":139 * raise ValueError("itemsize <= 0 for cython.array") * * if not isinstance(format, bytes): # <<<<<<<<<<<<<< @@ -5809,14 +4639,14 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":140 + /* "View.MemoryView":141 * if not isinstance(format, bytes): * format = format.encode('ASCII') * self._format = format # keep a reference to the byte string # <<<<<<<<<<<<<< * self.format = self._format * */ - if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(2, 140, __pyx_L1_error) + if (!(likely(PyBytes_CheckExact(__pyx_v_format))||((__pyx_v_format) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_format)->tp_name), 0))) __PYX_ERR(2, 141, __pyx_L1_error) __pyx_t_3 = __pyx_v_format; __Pyx_INCREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); @@ -5825,7 +4655,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_v_self->_format = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":141 + /* "View.MemoryView":142 * format = format.encode('ASCII') * self._format = format # keep a reference to the byte string * self.format = self._format # <<<<<<<<<<<<<< @@ -5834,12 +4664,12 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ if (unlikely(__pyx_v_self->_format == Py_None)) { PyErr_SetString(PyExc_TypeError, "expected bytes, NoneType found"); - __PYX_ERR(2, 141, __pyx_L1_error) + __PYX_ERR(2, 142, __pyx_L1_error) } - __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(2, 141, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyBytes_AsWritableString(__pyx_v_self->_format); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) __PYX_ERR(2, 142, __pyx_L1_error) __pyx_v_self->format = __pyx_t_7; - /* "View.MemoryView":144 + /* "View.MemoryView":145 * * * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) # <<<<<<<<<<<<<< @@ -5848,7 +4678,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_self->_shape = ((Py_ssize_t *)PyObject_Malloc((((sizeof(Py_ssize_t)) * __pyx_v_self->ndim) * 2))); - /* "View.MemoryView":145 + /* "View.MemoryView":146 * * self._shape = PyObject_Malloc(sizeof(Py_ssize_t)*self.ndim*2) * self._strides = self._shape + self.ndim # <<<<<<<<<<<<<< @@ -5857,7 +4687,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_self->_strides = (__pyx_v_self->_shape + __pyx_v_self->ndim); - /* "View.MemoryView":147 + /* "View.MemoryView":148 * self._strides = self._shape + self.ndim * * if not self._shape: # <<<<<<<<<<<<<< @@ -5867,20 +4697,20 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_4 = ((!(__pyx_v_self->_shape != 0)) != 0); if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":148 + /* "View.MemoryView":149 * * if not self._shape: * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< * * */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 148, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 149, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 148, __pyx_L1_error) + __PYX_ERR(2, 149, __pyx_L1_error) - /* "View.MemoryView":147 + /* "View.MemoryView":148 * self._strides = self._shape + self.ndim * * if not self._shape: # <<<<<<<<<<<<<< @@ -5889,7 +4719,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":151 + /* "View.MemoryView":152 * * * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< @@ -5901,18 +4731,18 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ for (;;) { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(2, 151, __pyx_L1_error) + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_1); __Pyx_INCREF(__pyx_t_5); __pyx_t_1++; if (unlikely(0 < 0)) __PYX_ERR(2, 152, __pyx_L1_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 151, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif - __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 151, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 152, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_dim = __pyx_t_9; __pyx_v_idx = __pyx_t_8; __pyx_t_8 = (__pyx_t_8 + 1); - /* "View.MemoryView":152 + /* "View.MemoryView":153 * * for idx, dim in enumerate(shape): * if dim <= 0: # <<<<<<<<<<<<<< @@ -5922,18 +4752,18 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_4 = ((__pyx_v_dim <= 0) != 0); if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":153 + /* "View.MemoryView":154 * for idx, dim in enumerate(shape): * if dim <= 0: * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) # <<<<<<<<<<<<<< * self._shape[idx] = dim * */ - __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 153, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_idx); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 153, __pyx_L1_error) + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 153, __pyx_L1_error) + __pyx_t_10 = PyTuple_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_5); @@ -5941,17 +4771,17 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_6); __pyx_t_5 = 0; __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 153, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyString_Format(__pyx_kp_s_Invalid_shape_in_axis_d_d, __pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 153, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_6); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 154, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_Raise(__pyx_t_10, 0, 0, 0); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 153, __pyx_L1_error) + __PYX_ERR(2, 154, __pyx_L1_error) - /* "View.MemoryView":152 + /* "View.MemoryView":153 * * for idx, dim in enumerate(shape): * if dim <= 0: # <<<<<<<<<<<<<< @@ -5960,7 +4790,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":154 + /* "View.MemoryView":155 * if dim <= 0: * raise ValueError("Invalid shape in axis %d: %d." % (idx, dim)) * self._shape[idx] = dim # <<<<<<<<<<<<<< @@ -5969,7 +4799,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ (__pyx_v_self->_shape[__pyx_v_idx]) = __pyx_v_dim; - /* "View.MemoryView":151 + /* "View.MemoryView":152 * * * for idx, dim in enumerate(shape): # <<<<<<<<<<<<<< @@ -5979,17 +4809,17 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":157 + /* "View.MemoryView":158 * * cdef char order * if mode == 'fortran': # <<<<<<<<<<<<<< * order = b'F' * self.mode = u'fortran' */ - __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 157, __pyx_L1_error) + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_fortran, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 158, __pyx_L1_error) if (__pyx_t_4) { - /* "View.MemoryView":158 + /* "View.MemoryView":159 * cdef char order * if mode == 'fortran': * order = b'F' # <<<<<<<<<<<<<< @@ -5998,7 +4828,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_order = 'F'; - /* "View.MemoryView":159 + /* "View.MemoryView":160 * if mode == 'fortran': * order = b'F' * self.mode = u'fortran' # <<<<<<<<<<<<<< @@ -6011,7 +4841,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __Pyx_DECREF(__pyx_v_self->mode); __pyx_v_self->mode = __pyx_n_u_fortran; - /* "View.MemoryView":157 + /* "View.MemoryView":158 * * cdef char order * if mode == 'fortran': # <<<<<<<<<<<<<< @@ -6021,17 +4851,17 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ goto __pyx_L10; } - /* "View.MemoryView":160 + /* "View.MemoryView":161 * order = b'F' * self.mode = u'fortran' * elif mode == 'c': # <<<<<<<<<<<<<< * order = b'C' * self.mode = u'c' */ - __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 160, __pyx_L1_error) + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_mode, __pyx_n_s_c, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(2, 161, __pyx_L1_error) if (likely(__pyx_t_4)) { - /* "View.MemoryView":161 + /* "View.MemoryView":162 * self.mode = u'fortran' * elif mode == 'c': * order = b'C' # <<<<<<<<<<<<<< @@ -6040,7 +4870,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_order = 'C'; - /* "View.MemoryView":162 + /* "View.MemoryView":163 * elif mode == 'c': * order = b'C' * self.mode = u'c' # <<<<<<<<<<<<<< @@ -6053,7 +4883,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __Pyx_DECREF(__pyx_v_self->mode); __pyx_v_self->mode = __pyx_n_u_c; - /* "View.MemoryView":160 + /* "View.MemoryView":161 * order = b'F' * self.mode = u'fortran' * elif mode == 'c': # <<<<<<<<<<<<<< @@ -6063,7 +4893,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ goto __pyx_L10; } - /* "View.MemoryView":164 + /* "View.MemoryView":165 * self.mode = u'c' * else: * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) # <<<<<<<<<<<<<< @@ -6071,18 +4901,18 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ * self.len = fill_contig_strides_array(self._shape, self._strides, */ /*else*/ { - __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 164, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_v_mode); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 165, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 164, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 165, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_10, 0, 0, 0); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 164, __pyx_L1_error) + __PYX_ERR(2, 165, __pyx_L1_error) } __pyx_L10:; - /* "View.MemoryView":166 + /* "View.MemoryView":167 * raise ValueError("Invalid mode, expected 'c' or 'fortran', got %s" % mode) * * self.len = fill_contig_strides_array(self._shape, self._strides, # <<<<<<<<<<<<<< @@ -6091,7 +4921,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_self->len = __pyx_fill_contig_strides_array(__pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_itemsize, __pyx_v_self->ndim, __pyx_v_order); - /* "View.MemoryView":169 + /* "View.MemoryView":170 * itemsize, self.ndim, order) * * self.free_data = allocate_buffer # <<<<<<<<<<<<<< @@ -6100,19 +4930,19 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_self->free_data = __pyx_v_allocate_buffer; - /* "View.MemoryView":170 + /* "View.MemoryView":171 * * self.free_data = allocate_buffer * self.dtype_is_object = format == b'O' # <<<<<<<<<<<<<< * if allocate_buffer: * */ - __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 170, __pyx_L1_error) - __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 170, __pyx_L1_error) + __pyx_t_10 = PyObject_RichCompare(__pyx_v_format, __pyx_n_b_O, Py_EQ); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 171, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 171, __pyx_L1_error) __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __pyx_v_self->dtype_is_object = __pyx_t_4; - /* "View.MemoryView":171 + /* "View.MemoryView":172 * self.free_data = allocate_buffer * self.dtype_is_object = format == b'O' * if allocate_buffer: # <<<<<<<<<<<<<< @@ -6122,7 +4952,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_4 = (__pyx_v_allocate_buffer != 0); if (__pyx_t_4) { - /* "View.MemoryView":174 + /* "View.MemoryView":175 * * * self.data = malloc(self.len) # <<<<<<<<<<<<<< @@ -6131,7 +4961,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_self->data = ((char *)malloc(__pyx_v_self->len)); - /* "View.MemoryView":175 + /* "View.MemoryView":176 * * self.data = malloc(self.len) * if not self.data: # <<<<<<<<<<<<<< @@ -6141,20 +4971,20 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_4 = ((!(__pyx_v_self->data != 0)) != 0); if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":176 + /* "View.MemoryView":177 * self.data = malloc(self.len) * if not self.data: * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< * * if self.dtype_is_object: */ - __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 176, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_MemoryError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(2, 177, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __Pyx_Raise(__pyx_t_10, 0, 0, 0); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __PYX_ERR(2, 176, __pyx_L1_error) + __PYX_ERR(2, 177, __pyx_L1_error) - /* "View.MemoryView":175 + /* "View.MemoryView":176 * * self.data = malloc(self.len) * if not self.data: # <<<<<<<<<<<<<< @@ -6163,7 +4993,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":178 + /* "View.MemoryView":179 * raise MemoryError("unable to allocate array data.") * * if self.dtype_is_object: # <<<<<<<<<<<<<< @@ -6173,7 +5003,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ __pyx_t_4 = (__pyx_v_self->dtype_is_object != 0); if (__pyx_t_4) { - /* "View.MemoryView":179 + /* "View.MemoryView":180 * * if self.dtype_is_object: * p = self.data # <<<<<<<<<<<<<< @@ -6182,7 +5012,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ __pyx_v_p = ((PyObject **)__pyx_v_self->data); - /* "View.MemoryView":180 + /* "View.MemoryView":181 * if self.dtype_is_object: * p = self.data * for i in range(self.len / itemsize): # <<<<<<<<<<<<<< @@ -6191,18 +5021,18 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ if (unlikely(__pyx_v_itemsize == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(2, 180, __pyx_L1_error) + __PYX_ERR(2, 181, __pyx_L1_error) } else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_self->len))) { PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); - __PYX_ERR(2, 180, __pyx_L1_error) + __PYX_ERR(2, 181, __pyx_L1_error) } __pyx_t_1 = __Pyx_div_Py_ssize_t(__pyx_v_self->len, __pyx_v_itemsize); __pyx_t_9 = __pyx_t_1; for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_9; __pyx_t_11+=1) { __pyx_v_i = __pyx_t_11; - /* "View.MemoryView":181 + /* "View.MemoryView":182 * p = self.data * for i in range(self.len / itemsize): * p[i] = Py_None # <<<<<<<<<<<<<< @@ -6211,7 +5041,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ (__pyx_v_p[__pyx_v_i]) = Py_None; - /* "View.MemoryView":182 + /* "View.MemoryView":183 * for i in range(self.len / itemsize): * p[i] = Py_None * Py_INCREF(Py_None) # <<<<<<<<<<<<<< @@ -6221,7 +5051,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ Py_INCREF(Py_None); } - /* "View.MemoryView":178 + /* "View.MemoryView":179 * raise MemoryError("unable to allocate array data.") * * if self.dtype_is_object: # <<<<<<<<<<<<<< @@ -6230,7 +5060,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":171 + /* "View.MemoryView":172 * self.free_data = allocate_buffer * self.dtype_is_object = format == b'O' * if allocate_buffer: # <<<<<<<<<<<<<< @@ -6239,7 +5069,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ */ } - /* "View.MemoryView":122 + /* "View.MemoryView":123 * cdef bint dtype_is_object * * def __cinit__(array self, tuple shape, Py_ssize_t itemsize, format not None, # <<<<<<<<<<<<<< @@ -6263,7 +5093,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array___cinit__(struct __ return __pyx_r; } -/* "View.MemoryView":185 +/* "View.MemoryView":186 * * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< @@ -6295,6 +5125,9 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru Py_ssize_t __pyx_t_5; int __pyx_t_6; Py_ssize_t *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; if (__pyx_v_info == NULL) { PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); return -1; @@ -6303,7 +5136,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "View.MemoryView":186 + /* "View.MemoryView":187 * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): * cdef int bufmode = -1 # <<<<<<<<<<<<<< @@ -6312,18 +5145,18 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru */ __pyx_v_bufmode = -1; - /* "View.MemoryView":187 + /* "View.MemoryView":188 * def __getbuffer__(self, Py_buffer *info, int flags): * cdef int bufmode = -1 * if self.mode == u"c": # <<<<<<<<<<<<<< * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * elif self.mode == u"fortran": */ - __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 187, __pyx_L1_error) + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_c, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 188, __pyx_L1_error) __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":188 + /* "View.MemoryView":189 * cdef int bufmode = -1 * if self.mode == u"c": * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< @@ -6332,7 +5165,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru */ __pyx_v_bufmode = (PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - /* "View.MemoryView":187 + /* "View.MemoryView":188 * def __getbuffer__(self, Py_buffer *info, int flags): * cdef int bufmode = -1 * if self.mode == u"c": # <<<<<<<<<<<<<< @@ -6342,18 +5175,18 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru goto __pyx_L3; } - /* "View.MemoryView":189 + /* "View.MemoryView":190 * if self.mode == u"c": * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * elif self.mode == u"fortran": # <<<<<<<<<<<<<< * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * if not (flags & bufmode): */ - __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 189, __pyx_L1_error) + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_self->mode, __pyx_n_u_fortran, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 190, __pyx_L1_error) __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { - /* "View.MemoryView":190 + /* "View.MemoryView":191 * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * elif self.mode == u"fortran": * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS # <<<<<<<<<<<<<< @@ -6362,7 +5195,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru */ __pyx_v_bufmode = (PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS); - /* "View.MemoryView":189 + /* "View.MemoryView":190 * if self.mode == u"c": * bufmode = PyBUF_C_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * elif self.mode == u"fortran": # <<<<<<<<<<<<<< @@ -6372,7 +5205,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru } __pyx_L3:; - /* "View.MemoryView":191 + /* "View.MemoryView":192 * elif self.mode == u"fortran": * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * if not (flags & bufmode): # <<<<<<<<<<<<<< @@ -6382,20 +5215,20 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_1 = ((!((__pyx_v_flags & __pyx_v_bufmode) != 0)) != 0); if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":192 + /* "View.MemoryView":193 * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * if not (flags & bufmode): * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< * info.buf = self.data * info.len = self.len */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 192, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 192, __pyx_L1_error) + __PYX_ERR(2, 193, __pyx_L1_error) - /* "View.MemoryView":191 + /* "View.MemoryView":192 * elif self.mode == u"fortran": * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * if not (flags & bufmode): # <<<<<<<<<<<<<< @@ -6404,7 +5237,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru */ } - /* "View.MemoryView":193 + /* "View.MemoryView":194 * if not (flags & bufmode): * raise ValueError("Can only create a buffer that is contiguous in memory.") * info.buf = self.data # <<<<<<<<<<<<<< @@ -6414,7 +5247,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_4 = __pyx_v_self->data; __pyx_v_info->buf = __pyx_t_4; - /* "View.MemoryView":194 + /* "View.MemoryView":195 * raise ValueError("Can only create a buffer that is contiguous in memory.") * info.buf = self.data * info.len = self.len # <<<<<<<<<<<<<< @@ -6424,7 +5257,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_5 = __pyx_v_self->len; __pyx_v_info->len = __pyx_t_5; - /* "View.MemoryView":195 + /* "View.MemoryView":196 * info.buf = self.data * info.len = self.len * info.ndim = self.ndim # <<<<<<<<<<<<<< @@ -6434,7 +5267,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_6 = __pyx_v_self->ndim; __pyx_v_info->ndim = __pyx_t_6; - /* "View.MemoryView":196 + /* "View.MemoryView":197 * info.len = self.len * info.ndim = self.ndim * info.shape = self._shape # <<<<<<<<<<<<<< @@ -6444,7 +5277,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_7 = __pyx_v_self->_shape; __pyx_v_info->shape = __pyx_t_7; - /* "View.MemoryView":197 + /* "View.MemoryView":198 * info.ndim = self.ndim * info.shape = self._shape * info.strides = self._strides # <<<<<<<<<<<<<< @@ -6454,7 +5287,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_7 = __pyx_v_self->_strides; __pyx_v_info->strides = __pyx_t_7; - /* "View.MemoryView":198 + /* "View.MemoryView":199 * info.shape = self._shape * info.strides = self._strides * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -6463,7 +5296,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru */ __pyx_v_info->suboffsets = NULL; - /* "View.MemoryView":199 + /* "View.MemoryView":200 * info.strides = self._strides * info.suboffsets = NULL * info.itemsize = self.itemsize # <<<<<<<<<<<<<< @@ -6473,7 +5306,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_5 = __pyx_v_self->itemsize; __pyx_v_info->itemsize = __pyx_t_5; - /* "View.MemoryView":200 + /* "View.MemoryView":201 * info.suboffsets = NULL * info.itemsize = self.itemsize * info.readonly = 0 # <<<<<<<<<<<<<< @@ -6482,7 +5315,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru */ __pyx_v_info->readonly = 0; - /* "View.MemoryView":202 + /* "View.MemoryView":203 * info.readonly = 0 * * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< @@ -6492,7 +5325,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); if (__pyx_t_1) { - /* "View.MemoryView":203 + /* "View.MemoryView":204 * * if flags & PyBUF_FORMAT: * info.format = self.format # <<<<<<<<<<<<<< @@ -6502,7 +5335,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __pyx_t_4 = __pyx_v_self->format; __pyx_v_info->format = __pyx_t_4; - /* "View.MemoryView":202 + /* "View.MemoryView":203 * info.readonly = 0 * * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< @@ -6512,7 +5345,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru goto __pyx_L5; } - /* "View.MemoryView":205 + /* "View.MemoryView":206 * info.format = self.format * else: * info.format = NULL # <<<<<<<<<<<<<< @@ -6524,7 +5357,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru } __pyx_L5:; - /* "View.MemoryView":207 + /* "View.MemoryView":208 * info.format = NULL * * info.obj = self # <<<<<<<<<<<<<< @@ -6537,7 +5370,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "View.MemoryView":185 + /* "View.MemoryView":186 * * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< @@ -6567,7 +5400,7 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_2__getbuffer__(stru return __pyx_r; } -/* "View.MemoryView":211 +/* "View.MemoryView":212 * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") * * def __dealloc__(array self): # <<<<<<<<<<<<<< @@ -6591,7 +5424,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc int __pyx_t_1; __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "View.MemoryView":212 + /* "View.MemoryView":213 * * def __dealloc__(array self): * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< @@ -6601,7 +5434,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc __pyx_t_1 = ((__pyx_v_self->callback_free_data != NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":213 + /* "View.MemoryView":214 * def __dealloc__(array self): * if self.callback_free_data != NULL: * self.callback_free_data(self.data) # <<<<<<<<<<<<<< @@ -6610,7 +5443,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc */ __pyx_v_self->callback_free_data(__pyx_v_self->data); - /* "View.MemoryView":212 + /* "View.MemoryView":213 * * def __dealloc__(array self): * if self.callback_free_data != NULL: # <<<<<<<<<<<<<< @@ -6620,7 +5453,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc goto __pyx_L3; } - /* "View.MemoryView":214 + /* "View.MemoryView":215 * if self.callback_free_data != NULL: * self.callback_free_data(self.data) * elif self.free_data: # <<<<<<<<<<<<<< @@ -6630,7 +5463,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc __pyx_t_1 = (__pyx_v_self->free_data != 0); if (__pyx_t_1) { - /* "View.MemoryView":215 + /* "View.MemoryView":216 * self.callback_free_data(self.data) * elif self.free_data: * if self.dtype_is_object: # <<<<<<<<<<<<<< @@ -6640,7 +5473,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc __pyx_t_1 = (__pyx_v_self->dtype_is_object != 0); if (__pyx_t_1) { - /* "View.MemoryView":216 + /* "View.MemoryView":217 * elif self.free_data: * if self.dtype_is_object: * refcount_objects_in_slice(self.data, self._shape, # <<<<<<<<<<<<<< @@ -6649,7 +5482,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc */ __pyx_memoryview_refcount_objects_in_slice(__pyx_v_self->data, __pyx_v_self->_shape, __pyx_v_self->_strides, __pyx_v_self->ndim, 0); - /* "View.MemoryView":215 + /* "View.MemoryView":216 * self.callback_free_data(self.data) * elif self.free_data: * if self.dtype_is_object: # <<<<<<<<<<<<<< @@ -6658,7 +5491,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc */ } - /* "View.MemoryView":218 + /* "View.MemoryView":219 * refcount_objects_in_slice(self.data, self._shape, * self._strides, self.ndim, False) * free(self.data) # <<<<<<<<<<<<<< @@ -6667,7 +5500,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc */ free(__pyx_v_self->data); - /* "View.MemoryView":214 + /* "View.MemoryView":215 * if self.callback_free_data != NULL: * self.callback_free_data(self.data) * elif self.free_data: # <<<<<<<<<<<<<< @@ -6677,7 +5510,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc } __pyx_L3:; - /* "View.MemoryView":219 + /* "View.MemoryView":220 * self._strides, self.ndim, False) * free(self.data) * PyObject_Free(self._shape) # <<<<<<<<<<<<<< @@ -6686,7 +5519,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc */ PyObject_Free(__pyx_v_self->_shape); - /* "View.MemoryView":211 + /* "View.MemoryView":212 * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") * * def __dealloc__(array self): # <<<<<<<<<<<<<< @@ -6698,7 +5531,7 @@ static void __pyx_array___pyx_pf_15View_dot_MemoryView_5array_4__dealloc__(struc __Pyx_RefNannyFinishContext(); } -/* "View.MemoryView":222 +/* "View.MemoryView":223 * * @property * def memview(self): # <<<<<<<<<<<<<< @@ -6723,9 +5556,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct _ PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":223 + /* "View.MemoryView":224 * @property * def memview(self): * return self.get_memview() # <<<<<<<<<<<<<< @@ -6733,13 +5569,13 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct _ * @cname('get_memview') */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 223, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_array *)__pyx_v_self->__pyx_vtab)->get_memview(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 224, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "View.MemoryView":222 + /* "View.MemoryView":223 * * @property * def memview(self): # <<<<<<<<<<<<<< @@ -6758,7 +5594,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_5array_7memview___get__(struct _ return __pyx_r; } -/* "View.MemoryView":226 +/* "View.MemoryView":227 * * @cname('get_memview') * cdef get_memview(self): # <<<<<<<<<<<<<< @@ -6773,9 +5609,12 @@ static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_memview", 0); - /* "View.MemoryView":227 + /* "View.MemoryView":228 * @cname('get_memview') * cdef get_memview(self): * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE # <<<<<<<<<<<<<< @@ -6784,7 +5623,7 @@ static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { */ __pyx_v_flags = ((PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) | PyBUF_WRITABLE); - /* "View.MemoryView":228 + /* "View.MemoryView":229 * cdef get_memview(self): * flags = PyBUF_ANY_CONTIGUOUS|PyBUF_FORMAT|PyBUF_WRITABLE * return memoryview(self, flags, self.dtype_is_object) # <<<<<<<<<<<<<< @@ -6792,11 +5631,11 @@ static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { * def __len__(self): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 228, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 229, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 228, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 229, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 228, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 229, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_v_self)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); @@ -6807,14 +5646,14 @@ static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); __pyx_t_1 = 0; __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 228, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 229, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":226 + /* "View.MemoryView":227 * * @cname('get_memview') * cdef get_memview(self): # <<<<<<<<<<<<<< @@ -6835,7 +5674,7 @@ static PyObject *__pyx_array_get_memview(struct __pyx_array_obj *__pyx_v_self) { return __pyx_r; } -/* "View.MemoryView":230 +/* "View.MemoryView":231 * return memoryview(self, flags, self.dtype_is_object) * * def __len__(self): # <<<<<<<<<<<<<< @@ -6861,7 +5700,7 @@ static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(str __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__len__", 0); - /* "View.MemoryView":231 + /* "View.MemoryView":232 * * def __len__(self): * return self._shape[0] # <<<<<<<<<<<<<< @@ -6871,7 +5710,7 @@ static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(str __pyx_r = (__pyx_v_self->_shape[0]); goto __pyx_L0; - /* "View.MemoryView":230 + /* "View.MemoryView":231 * return memoryview(self, flags, self.dtype_is_object) * * def __len__(self): # <<<<<<<<<<<<<< @@ -6885,7 +5724,7 @@ static Py_ssize_t __pyx_array___pyx_pf_15View_dot_MemoryView_5array_6__len__(str return __pyx_r; } -/* "View.MemoryView":233 +/* "View.MemoryView":234 * return self._shape[0] * * def __getattr__(self, attr): # <<<<<<<<<<<<<< @@ -6911,9 +5750,12 @@ static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__( __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getattr__", 0); - /* "View.MemoryView":234 + /* "View.MemoryView":235 * * def __getattr__(self, attr): * return getattr(self.memview, attr) # <<<<<<<<<<<<<< @@ -6921,16 +5763,16 @@ static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__( * def __getitem__(self, item): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 234, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 235, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 234, __pyx_L1_error) + __pyx_t_2 = __Pyx_GetAttr(__pyx_t_1, __pyx_v_attr); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 235, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":233 + /* "View.MemoryView":234 * return self._shape[0] * * def __getattr__(self, attr): # <<<<<<<<<<<<<< @@ -6950,7 +5792,7 @@ static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_8__getattr__( return __pyx_r; } -/* "View.MemoryView":236 +/* "View.MemoryView":237 * return getattr(self.memview, attr) * * def __getitem__(self, item): # <<<<<<<<<<<<<< @@ -6976,9 +5818,12 @@ static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__ __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getitem__", 0); - /* "View.MemoryView":237 + /* "View.MemoryView":238 * * def __getitem__(self, item): * return self.memview[item] # <<<<<<<<<<<<<< @@ -6986,16 +5831,16 @@ static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__ * def __setitem__(self, item, value): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 237, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 238, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 237, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(__pyx_t_1, __pyx_v_item); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 238, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":236 + /* "View.MemoryView":237 * return getattr(self.memview, attr) * * def __getitem__(self, item): # <<<<<<<<<<<<<< @@ -7015,7 +5860,7 @@ static PyObject *__pyx_array___pyx_pf_15View_dot_MemoryView_5array_10__getitem__ return __pyx_r; } -/* "View.MemoryView":239 +/* "View.MemoryView":240 * return self.memview[item] * * def __setitem__(self, item, value): # <<<<<<<<<<<<<< @@ -7040,21 +5885,24 @@ static int __pyx_array___pyx_pf_15View_dot_MemoryView_5array_12__setitem__(struc int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setitem__", 0); - /* "View.MemoryView":240 + /* "View.MemoryView":241 * * def __setitem__(self, item, value): * self.memview[item] = value # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 240, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_memview); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 241, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(2, 240, __pyx_L1_error) + if (unlikely(PyObject_SetItem(__pyx_t_1, __pyx_v_item, __pyx_v_value) < 0)) __PYX_ERR(2, 241, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":239 + /* "View.MemoryView":240 * return self.memview[item] * * def __setitem__(self, item, value): # <<<<<<<<<<<<<< @@ -7097,6 +5945,9 @@ static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __p PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":2 @@ -7105,7 +5956,7 @@ static PyObject *__pyx_pf___pyx_array___reduce_cython__(CYTHON_UNUSED struct __p * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -7151,6 +6002,9 @@ static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":4 @@ -7158,7 +6012,7 @@ static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -7181,7 +6035,7 @@ static PyObject *__pyx_pf___pyx_array_2__setstate_cython__(CYTHON_UNUSED struct return __pyx_r; } -/* "View.MemoryView":244 +/* "View.MemoryView":245 * * @cname("__pyx_array_new") * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< @@ -7198,9 +6052,12 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("array_cwrapper", 0); - /* "View.MemoryView":248 + /* "View.MemoryView":249 * cdef array result * * if buf == NULL: # <<<<<<<<<<<<<< @@ -7210,20 +6067,20 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":249 + /* "View.MemoryView":250 * * if buf == NULL: * result = array(shape, itemsize, format, mode.decode('ASCII')) # <<<<<<<<<<<<<< * else: * result = array(shape, itemsize, format, mode.decode('ASCII'), */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_4 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_shape); __Pyx_GIVEREF(__pyx_v_shape); @@ -7237,13 +6094,13 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 249, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_4); __pyx_t_4 = 0; - /* "View.MemoryView":248 + /* "View.MemoryView":249 * cdef array result * * if buf == NULL: # <<<<<<<<<<<<<< @@ -7253,7 +6110,7 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize goto __pyx_L3; } - /* "View.MemoryView":251 + /* "View.MemoryView":252 * result = array(shape, itemsize, format, mode.decode('ASCII')) * else: * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< @@ -7261,13 +6118,13 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize * result.data = buf */ /*else*/ { - __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 251, __pyx_L1_error) + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_itemsize); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 251, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_format); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 251, __pyx_L1_error) + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_mode, 0, strlen(__pyx_v_mode), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 251, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_shape); __Pyx_GIVEREF(__pyx_v_shape); @@ -7282,32 +6139,32 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize __pyx_t_5 = 0; __pyx_t_3 = 0; - /* "View.MemoryView":252 + /* "View.MemoryView":253 * else: * result = array(shape, itemsize, format, mode.decode('ASCII'), * allocate_buffer=False) # <<<<<<<<<<<<<< * result.data = buf * */ - __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 252, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 253, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(2, 252, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_allocate_buffer, Py_False) < 0) __PYX_ERR(2, 253, __pyx_L1_error) - /* "View.MemoryView":251 + /* "View.MemoryView":252 * result = array(shape, itemsize, format, mode.decode('ASCII')) * else: * result = array(shape, itemsize, format, mode.decode('ASCII'), # <<<<<<<<<<<<<< * allocate_buffer=False) * result.data = buf */ - __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 251, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_array_type), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_result = ((struct __pyx_array_obj *)__pyx_t_5); __pyx_t_5 = 0; - /* "View.MemoryView":253 + /* "View.MemoryView":254 * result = array(shape, itemsize, format, mode.decode('ASCII'), * allocate_buffer=False) * result.data = buf # <<<<<<<<<<<<<< @@ -7318,7 +6175,7 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize } __pyx_L3:; - /* "View.MemoryView":255 + /* "View.MemoryView":256 * result.data = buf * * return result # <<<<<<<<<<<<<< @@ -7330,7 +6187,7 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize __pyx_r = __pyx_v_result; goto __pyx_L0; - /* "View.MemoryView":244 + /* "View.MemoryView":245 * * @cname("__pyx_array_new") * cdef array array_cwrapper(tuple shape, Py_ssize_t itemsize, char *format, # <<<<<<<<<<<<<< @@ -7353,7 +6210,7 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize return __pyx_r; } -/* "View.MemoryView":281 +/* "View.MemoryView":282 * cdef class Enum(object): * cdef object name * def __init__(self, name): # <<<<<<<<<<<<<< @@ -7365,6 +6222,9 @@ static struct __pyx_array_obj *__pyx_array_new(PyObject *__pyx_v_shape, Py_ssize static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_name = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); @@ -7387,7 +6247,7 @@ static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_ar else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(2, 281, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(2, 282, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; @@ -7398,7 +6258,7 @@ static int __pyx_MemviewEnum___init__(PyObject *__pyx_v_self, PyObject *__pyx_ar } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 281, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 282, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("View.MemoryView.Enum.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7416,7 +6276,7 @@ static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struc __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); - /* "View.MemoryView":282 + /* "View.MemoryView":283 * cdef object name * def __init__(self, name): * self.name = name # <<<<<<<<<<<<<< @@ -7429,7 +6289,7 @@ static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struc __Pyx_DECREF(__pyx_v_self->name); __pyx_v_self->name = __pyx_v_name; - /* "View.MemoryView":281 + /* "View.MemoryView":282 * cdef class Enum(object): * cdef object name * def __init__(self, name): # <<<<<<<<<<<<<< @@ -7443,7 +6303,7 @@ static int __pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum___init__(struc return __pyx_r; } -/* "View.MemoryView":283 +/* "View.MemoryView":284 * def __init__(self, name): * self.name = name * def __repr__(self): # <<<<<<<<<<<<<< @@ -7469,7 +6329,7 @@ static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr_ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__repr__", 0); - /* "View.MemoryView":284 + /* "View.MemoryView":285 * self.name = name * def __repr__(self): * return self.name # <<<<<<<<<<<<<< @@ -7481,7 +6341,7 @@ static PyObject *__pyx_MemviewEnum___pyx_pf_15View_dot_MemoryView_4Enum_2__repr_ __pyx_r = __pyx_v_self->name; goto __pyx_L0; - /* "View.MemoryView":283 + /* "View.MemoryView":284 * def __init__(self, name): * self.name = name * def __repr__(self): # <<<<<<<<<<<<<< @@ -7526,6 +6386,9 @@ static PyObject *__pyx_pf___pyx_MemviewEnum___reduce_cython__(struct __pyx_Memvi int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":5 @@ -7751,6 +6614,9 @@ static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_Me PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":17 @@ -7758,7 +6624,7 @@ static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_Me * def __setstate_cython__(self, __pyx_state): * __pyx_unpickle_Enum__set_state(self, __pyx_state) # <<<<<<<<<<<<<< */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 17, __pyx_L1_error) + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 17, __pyx_L1_error) __pyx_t_1 = __pyx_unpickle_Enum__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 17, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -7783,7 +6649,7 @@ static PyObject *__pyx_pf___pyx_MemviewEnum_2__setstate_cython__(struct __pyx_Me return __pyx_r; } -/* "View.MemoryView":298 +/* "View.MemoryView":299 * * @cname('__pyx_align_pointer') * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< @@ -7797,7 +6663,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) void *__pyx_r; int __pyx_t_1; - /* "View.MemoryView":300 + /* "View.MemoryView":301 * cdef void *align_pointer(void *memory, size_t alignment) nogil: * "Align pointer memory on a given boundary" * cdef Py_intptr_t aligned_p = memory # <<<<<<<<<<<<<< @@ -7806,7 +6672,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) */ __pyx_v_aligned_p = ((Py_intptr_t)__pyx_v_memory); - /* "View.MemoryView":304 + /* "View.MemoryView":305 * * with cython.cdivision(True): * offset = aligned_p % alignment # <<<<<<<<<<<<<< @@ -7815,7 +6681,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) */ __pyx_v_offset = (__pyx_v_aligned_p % __pyx_v_alignment); - /* "View.MemoryView":306 + /* "View.MemoryView":307 * offset = aligned_p % alignment * * if offset > 0: # <<<<<<<<<<<<<< @@ -7825,7 +6691,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) __pyx_t_1 = ((__pyx_v_offset > 0) != 0); if (__pyx_t_1) { - /* "View.MemoryView":307 + /* "View.MemoryView":308 * * if offset > 0: * aligned_p += alignment - offset # <<<<<<<<<<<<<< @@ -7834,7 +6700,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) */ __pyx_v_aligned_p = (__pyx_v_aligned_p + (__pyx_v_alignment - __pyx_v_offset)); - /* "View.MemoryView":306 + /* "View.MemoryView":307 * offset = aligned_p % alignment * * if offset > 0: # <<<<<<<<<<<<<< @@ -7843,7 +6709,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) */ } - /* "View.MemoryView":309 + /* "View.MemoryView":310 * aligned_p += alignment - offset * * return aligned_p # <<<<<<<<<<<<<< @@ -7853,7 +6719,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) __pyx_r = ((void *)__pyx_v_aligned_p); goto __pyx_L0; - /* "View.MemoryView":298 + /* "View.MemoryView":299 * * @cname('__pyx_align_pointer') * cdef void *align_pointer(void *memory, size_t alignment) nogil: # <<<<<<<<<<<<<< @@ -7866,7 +6732,7 @@ static void *__pyx_align_pointer(void *__pyx_v_memory, size_t __pyx_v_alignment) return __pyx_r; } -/* "View.MemoryView":345 +/* "View.MemoryView":346 * cdef __Pyx_TypeInfo *typeinfo * * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< @@ -7880,6 +6746,9 @@ static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_ar PyObject *__pyx_v_obj = 0; int __pyx_v_flags; int __pyx_v_dtype_is_object; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); @@ -7908,7 +6777,7 @@ static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_ar case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_flags)) != 0)) kw_args--; else { - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(2, 345, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, 1); __PYX_ERR(2, 346, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: @@ -7918,7 +6787,7 @@ static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_ar } } if (unlikely(kw_args > 0)) { - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 345, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(2, 346, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { @@ -7931,16 +6800,16 @@ static int __pyx_memoryview___cinit__(PyObject *__pyx_v_self, PyObject *__pyx_ar } } __pyx_v_obj = values[0]; - __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 345, __pyx_L3_error) + __pyx_v_flags = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_flags == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 346, __pyx_L3_error) if (values[2]) { - __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 345, __pyx_L3_error) + __pyx_v_dtype_is_object = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_dtype_is_object == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 346, __pyx_L3_error) } else { __pyx_v_dtype_is_object = ((int)0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 345, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(2, 346, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("View.MemoryView.memoryview.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); @@ -7960,9 +6829,12 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ int __pyx_t_2; int __pyx_t_3; int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__cinit__", 0); - /* "View.MemoryView":346 + /* "View.MemoryView":347 * * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): * self.obj = obj # <<<<<<<<<<<<<< @@ -7975,7 +6847,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ __Pyx_DECREF(__pyx_v_self->obj); __pyx_v_self->obj = __pyx_v_obj; - /* "View.MemoryView":347 + /* "View.MemoryView":348 * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): * self.obj = obj * self.flags = flags # <<<<<<<<<<<<<< @@ -7984,7 +6856,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ */ __pyx_v_self->flags = __pyx_v_flags; - /* "View.MemoryView":348 + /* "View.MemoryView":349 * self.obj = obj * self.flags = flags * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< @@ -8004,16 +6876,16 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ __pyx_L4_bool_binop_done:; if (__pyx_t_1) { - /* "View.MemoryView":349 + /* "View.MemoryView":350 * self.flags = flags * if type(self) is memoryview or obj is not None: * __Pyx_GetBuffer(obj, &self.view, flags) # <<<<<<<<<<<<<< * if self.view.obj == NULL: * (<__pyx_buffer *> &self.view).obj = Py_None */ - __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 349, __pyx_L1_error) + __pyx_t_4 = __Pyx_GetBuffer(__pyx_v_obj, (&__pyx_v_self->view), __pyx_v_flags); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(2, 350, __pyx_L1_error) - /* "View.MemoryView":350 + /* "View.MemoryView":351 * if type(self) is memoryview or obj is not None: * __Pyx_GetBuffer(obj, &self.view, flags) * if self.view.obj == NULL: # <<<<<<<<<<<<<< @@ -8023,7 +6895,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ __pyx_t_1 = ((((PyObject *)__pyx_v_self->view.obj) == NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":351 + /* "View.MemoryView":352 * __Pyx_GetBuffer(obj, &self.view, flags) * if self.view.obj == NULL: * (<__pyx_buffer *> &self.view).obj = Py_None # <<<<<<<<<<<<<< @@ -8032,16 +6904,16 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ */ ((Py_buffer *)(&__pyx_v_self->view))->obj = Py_None; - /* "View.MemoryView":352 + /* "View.MemoryView":353 * if self.view.obj == NULL: * (<__pyx_buffer *> &self.view).obj = Py_None * Py_INCREF(Py_None) # <<<<<<<<<<<<<< * - * global __pyx_memoryview_thread_locks_used + * if not __PYX_CYTHON_ATOMICS_ENABLED(): */ Py_INCREF(Py_None); - /* "View.MemoryView":350 + /* "View.MemoryView":351 * if type(self) is memoryview or obj is not None: * __Pyx_GetBuffer(obj, &self.view, flags) * if self.view.obj == NULL: # <<<<<<<<<<<<<< @@ -8050,7 +6922,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ */ } - /* "View.MemoryView":348 + /* "View.MemoryView":349 * self.obj = obj * self.flags = flags * if type(self) is memoryview or obj is not None: # <<<<<<<<<<<<<< @@ -8060,100 +6932,119 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ } /* "View.MemoryView":355 + * Py_INCREF(Py_None) * - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: */ - __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); + __pyx_t_1 = ((!(__PYX_CYTHON_ATOMICS_ENABLED() != 0)) != 0); if (__pyx_t_1) { - /* "View.MemoryView":356 - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: - */ - __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - /* "View.MemoryView":357 - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 */ - __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); + __pyx_t_1 = ((__pyx_memoryview_thread_locks_used < 8) != 0); + if (__pyx_t_1) { - /* "View.MemoryView":355 - * - * global __pyx_memoryview_thread_locks_used - * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 + /* "View.MemoryView":358 + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] # <<<<<<<<<<<<<< + * __pyx_memoryview_thread_locks_used += 1 + * if self.lock is NULL: */ - } + __pyx_v_self->lock = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); - /* "View.MemoryView":358 - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: # <<<<<<<<<<<<<< - * self.lock = PyThread_allocate_lock() + /* "View.MemoryView":359 + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 # <<<<<<<<<<<<<< * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() */ - __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); - if (__pyx_t_1) { + __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used + 1); - /* "View.MemoryView":359 - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< - * if self.lock is NULL: - * raise MemoryError + /* "View.MemoryView":357 + * if not __PYX_CYTHON_ATOMICS_ENABLED(): + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: # <<<<<<<<<<<<<< + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 */ - __pyx_v_self->lock = PyThread_allocate_lock(); + } /* "View.MemoryView":360 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 * if self.lock is NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: */ __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); - if (unlikely(__pyx_t_1)) { + if (__pyx_t_1) { /* "View.MemoryView":361 - * self.lock = PyThread_allocate_lock() + * __pyx_memoryview_thread_locks_used += 1 * if self.lock is NULL: - * raise MemoryError # <<<<<<<<<<<<<< + * self.lock = PyThread_allocate_lock() # <<<<<<<<<<<<<< + * if self.lock is NULL: + * raise MemoryError + */ + __pyx_v_self->lock = PyThread_allocate_lock(); + + /* "View.MemoryView":362 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + __pyx_t_1 = ((__pyx_v_self->lock == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "View.MemoryView":363 + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: + * raise MemoryError # <<<<<<<<<<<<<< * * if flags & PyBUF_FORMAT: */ - PyErr_NoMemory(); __PYX_ERR(2, 361, __pyx_L1_error) + PyErr_NoMemory(); __PYX_ERR(2, 363, __pyx_L1_error) + + /* "View.MemoryView":362 + * if self.lock is NULL: + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: # <<<<<<<<<<<<<< + * raise MemoryError + * + */ + } /* "View.MemoryView":360 - * if self.lock is NULL: - * self.lock = PyThread_allocate_lock() + * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] + * __pyx_memoryview_thread_locks_used += 1 * if self.lock is NULL: # <<<<<<<<<<<<<< - * raise MemoryError - * + * self.lock = PyThread_allocate_lock() + * if self.lock is NULL: */ } - /* "View.MemoryView":358 - * self.lock = __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] - * __pyx_memoryview_thread_locks_used += 1 - * if self.lock is NULL: # <<<<<<<<<<<<<< - * self.lock = PyThread_allocate_lock() - * if self.lock is NULL: + /* "View.MemoryView":355 + * Py_INCREF(Py_None) + * + * if not __PYX_CYTHON_ATOMICS_ENABLED(): # <<<<<<<<<<<<<< + * global __pyx_memoryview_thread_locks_used + * if __pyx_memoryview_thread_locks_used < THREAD_LOCKS_PREALLOCATED: */ } - /* "View.MemoryView":363 - * raise MemoryError + /* "View.MemoryView":365 + * raise MemoryError * * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') @@ -8162,7 +7053,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); if (__pyx_t_1) { - /* "View.MemoryView":364 + /* "View.MemoryView":366 * * if flags & PyBUF_FORMAT: * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') # <<<<<<<<<<<<<< @@ -8173,24 +7064,24 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ if (__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; - goto __pyx_L11_bool_binop_done; + goto __pyx_L12_bool_binop_done; } __pyx_t_2 = (((__pyx_v_self->view.format[1]) == '\x00') != 0); __pyx_t_1 = __pyx_t_2; - __pyx_L11_bool_binop_done:; + __pyx_L12_bool_binop_done:; __pyx_v_self->dtype_is_object = __pyx_t_1; - /* "View.MemoryView":363 - * raise MemoryError + /* "View.MemoryView":365 + * raise MemoryError * * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') * else: */ - goto __pyx_L10; + goto __pyx_L11; } - /* "View.MemoryView":366 + /* "View.MemoryView":368 * self.dtype_is_object = (self.view.format[0] == b'O' and self.view.format[1] == b'\0') * else: * self.dtype_is_object = dtype_is_object # <<<<<<<<<<<<<< @@ -8200,9 +7091,9 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ /*else*/ { __pyx_v_self->dtype_is_object = __pyx_v_dtype_is_object; } - __pyx_L10:; + __pyx_L11:; - /* "View.MemoryView":368 + /* "View.MemoryView":370 * self.dtype_is_object = dtype_is_object * * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( # <<<<<<<<<<<<<< @@ -8211,7 +7102,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ */ __pyx_v_self->acquisition_count_aligned_p = ((__pyx_atomic_int *)__pyx_align_pointer(((void *)(&(__pyx_v_self->acquisition_count[0]))), (sizeof(__pyx_atomic_int)))); - /* "View.MemoryView":370 + /* "View.MemoryView":372 * self.acquisition_count_aligned_p = <__pyx_atomic_int *> align_pointer( * &self.acquisition_count[0], sizeof(__pyx_atomic_int)) * self.typeinfo = NULL # <<<<<<<<<<<<<< @@ -8220,7 +7111,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ */ __pyx_v_self->typeinfo = NULL; - /* "View.MemoryView":345 + /* "View.MemoryView":346 * cdef __Pyx_TypeInfo *typeinfo * * def __cinit__(memoryview self, object obj, int flags, bint dtype_is_object=False): # <<<<<<<<<<<<<< @@ -8239,7 +7130,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview___cinit_ return __pyx_r; } -/* "View.MemoryView":372 +/* "View.MemoryView":374 * self.typeinfo = NULL * * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< @@ -8270,7 +7161,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal PyThread_type_lock __pyx_t_7; __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "View.MemoryView":373 + /* "View.MemoryView":375 * * def __dealloc__(memoryview self): * if self.obj is not None: # <<<<<<<<<<<<<< @@ -8281,7 +7172,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":374 + /* "View.MemoryView":376 * def __dealloc__(memoryview self): * if self.obj is not None: * __Pyx_ReleaseBuffer(&self.view) # <<<<<<<<<<<<<< @@ -8290,7 +7181,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ __Pyx_ReleaseBuffer((&__pyx_v_self->view)); - /* "View.MemoryView":373 + /* "View.MemoryView":375 * * def __dealloc__(memoryview self): * if self.obj is not None: # <<<<<<<<<<<<<< @@ -8300,7 +7191,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal goto __pyx_L3; } - /* "View.MemoryView":375 + /* "View.MemoryView":377 * if self.obj is not None: * __Pyx_ReleaseBuffer(&self.view) * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< @@ -8310,7 +7201,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __pyx_t_2 = ((((Py_buffer *)(&__pyx_v_self->view))->obj == Py_None) != 0); if (__pyx_t_2) { - /* "View.MemoryView":377 + /* "View.MemoryView":379 * elif (<__pyx_buffer *> &self.view).obj == Py_None: * * (<__pyx_buffer *> &self.view).obj = NULL # <<<<<<<<<<<<<< @@ -8319,7 +7210,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ ((Py_buffer *)(&__pyx_v_self->view))->obj = NULL; - /* "View.MemoryView":378 + /* "View.MemoryView":380 * * (<__pyx_buffer *> &self.view).obj = NULL * Py_DECREF(Py_None) # <<<<<<<<<<<<<< @@ -8328,7 +7219,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ Py_DECREF(Py_None); - /* "View.MemoryView":375 + /* "View.MemoryView":377 * if self.obj is not None: * __Pyx_ReleaseBuffer(&self.view) * elif (<__pyx_buffer *> &self.view).obj == Py_None: # <<<<<<<<<<<<<< @@ -8338,7 +7229,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal } __pyx_L3:; - /* "View.MemoryView":382 + /* "View.MemoryView":384 * cdef int i * global __pyx_memoryview_thread_locks_used * if self.lock != NULL: # <<<<<<<<<<<<<< @@ -8348,7 +7239,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __pyx_t_2 = ((__pyx_v_self->lock != NULL) != 0); if (__pyx_t_2) { - /* "View.MemoryView":383 + /* "View.MemoryView":385 * global __pyx_memoryview_thread_locks_used * if self.lock != NULL: * for i in range(__pyx_memoryview_thread_locks_used): # <<<<<<<<<<<<<< @@ -8360,7 +7251,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_i = __pyx_t_5; - /* "View.MemoryView":384 + /* "View.MemoryView":386 * if self.lock != NULL: * for i in range(__pyx_memoryview_thread_locks_used): * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< @@ -8370,7 +7261,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __pyx_t_2 = (((__pyx_memoryview_thread_locks[__pyx_v_i]) == __pyx_v_self->lock) != 0); if (__pyx_t_2) { - /* "View.MemoryView":385 + /* "View.MemoryView":387 * for i in range(__pyx_memoryview_thread_locks_used): * if __pyx_memoryview_thread_locks[i] is self.lock: * __pyx_memoryview_thread_locks_used -= 1 # <<<<<<<<<<<<<< @@ -8379,7 +7270,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ __pyx_memoryview_thread_locks_used = (__pyx_memoryview_thread_locks_used - 1); - /* "View.MemoryView":386 + /* "View.MemoryView":388 * if __pyx_memoryview_thread_locks[i] is self.lock: * __pyx_memoryview_thread_locks_used -= 1 * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< @@ -8389,7 +7280,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __pyx_t_2 = ((__pyx_v_i != __pyx_memoryview_thread_locks_used) != 0); if (__pyx_t_2) { - /* "View.MemoryView":388 + /* "View.MemoryView":390 * if i != __pyx_memoryview_thread_locks_used: * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) # <<<<<<<<<<<<<< @@ -8399,7 +7290,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __pyx_t_6 = (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]); __pyx_t_7 = (__pyx_memoryview_thread_locks[__pyx_v_i]); - /* "View.MemoryView":387 + /* "View.MemoryView":389 * __pyx_memoryview_thread_locks_used -= 1 * if i != __pyx_memoryview_thread_locks_used: * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( # <<<<<<<<<<<<<< @@ -8409,7 +7300,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal (__pyx_memoryview_thread_locks[__pyx_v_i]) = __pyx_t_6; (__pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used]) = __pyx_t_7; - /* "View.MemoryView":386 + /* "View.MemoryView":388 * if __pyx_memoryview_thread_locks[i] is self.lock: * __pyx_memoryview_thread_locks_used -= 1 * if i != __pyx_memoryview_thread_locks_used: # <<<<<<<<<<<<<< @@ -8418,7 +7309,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ } - /* "View.MemoryView":389 + /* "View.MemoryView":391 * __pyx_memoryview_thread_locks[i], __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used] = ( * __pyx_memoryview_thread_locks[__pyx_memoryview_thread_locks_used], __pyx_memoryview_thread_locks[i]) * break # <<<<<<<<<<<<<< @@ -8427,7 +7318,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ goto __pyx_L6_break; - /* "View.MemoryView":384 + /* "View.MemoryView":386 * if self.lock != NULL: * for i in range(__pyx_memoryview_thread_locks_used): * if __pyx_memoryview_thread_locks[i] is self.lock: # <<<<<<<<<<<<<< @@ -8438,7 +7329,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal } /*else*/ { - /* "View.MemoryView":391 + /* "View.MemoryView":393 * break * else: * PyThread_free_lock(self.lock) # <<<<<<<<<<<<<< @@ -8449,7 +7340,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal } __pyx_L6_break:; - /* "View.MemoryView":382 + /* "View.MemoryView":384 * cdef int i * global __pyx_memoryview_thread_locks_used * if self.lock != NULL: # <<<<<<<<<<<<<< @@ -8458,7 +7349,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal */ } - /* "View.MemoryView":372 + /* "View.MemoryView":374 * self.typeinfo = NULL * * def __dealloc__(memoryview self): # <<<<<<<<<<<<<< @@ -8470,7 +7361,7 @@ static void __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_2__deal __Pyx_RefNannyFinishContext(); } -/* "View.MemoryView":393 +/* "View.MemoryView":395 * PyThread_free_lock(self.lock) * * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< @@ -8491,9 +7382,12 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py PyObject *__pyx_t_5 = NULL; Py_ssize_t __pyx_t_6; char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_item_pointer", 0); - /* "View.MemoryView":395 + /* "View.MemoryView":397 * cdef char *get_item_pointer(memoryview self, object index) except NULL: * cdef Py_ssize_t dim * cdef char *itemp = self.view.buf # <<<<<<<<<<<<<< @@ -8502,7 +7396,7 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py */ __pyx_v_itemp = ((char *)__pyx_v_self->view.buf); - /* "View.MemoryView":397 + /* "View.MemoryView":399 * cdef char *itemp = self.view.buf * * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< @@ -8514,26 +7408,26 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py __pyx_t_2 = __pyx_v_index; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0; __pyx_t_4 = NULL; } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 399, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 399, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_4)) { if (likely(PyList_CheckExact(__pyx_t_2))) { if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 399, __pyx_L1_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 399, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif } else { if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(2, 399, __pyx_L1_error) #else - __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 397, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 399, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif } @@ -8543,7 +7437,7 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 397, __pyx_L1_error) + else __PYX_ERR(2, 399, __pyx_L1_error) } break; } @@ -8554,18 +7448,18 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py __pyx_v_dim = __pyx_t_1; __pyx_t_1 = (__pyx_t_1 + 1); - /* "View.MemoryView":398 + /* "View.MemoryView":400 * * for dim, idx in enumerate(index): * itemp = pybuffer_index(&self.view, itemp, idx, dim) # <<<<<<<<<<<<<< * * return itemp */ - __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 398, __pyx_L1_error) - __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(2, 398, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_v_idx); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 400, __pyx_L1_error) + __pyx_t_7 = __pyx_pybuffer_index((&__pyx_v_self->view), __pyx_v_itemp, __pyx_t_6, __pyx_v_dim); if (unlikely(__pyx_t_7 == ((char *)NULL))) __PYX_ERR(2, 400, __pyx_L1_error) __pyx_v_itemp = __pyx_t_7; - /* "View.MemoryView":397 + /* "View.MemoryView":399 * cdef char *itemp = self.view.buf * * for dim, idx in enumerate(index): # <<<<<<<<<<<<<< @@ -8575,7 +7469,7 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":400 + /* "View.MemoryView":402 * itemp = pybuffer_index(&self.view, itemp, idx, dim) * * return itemp # <<<<<<<<<<<<<< @@ -8585,7 +7479,7 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py __pyx_r = __pyx_v_itemp; goto __pyx_L0; - /* "View.MemoryView":393 + /* "View.MemoryView":395 * PyThread_free_lock(self.lock) * * cdef char *get_item_pointer(memoryview self, object index) except NULL: # <<<<<<<<<<<<<< @@ -8605,7 +7499,7 @@ static char *__pyx_memoryview_get_item_pointer(struct __pyx_memoryview_obj *__py return __pyx_r; } -/* "View.MemoryView":403 +/* "View.MemoryView":405 * * * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< @@ -8638,9 +7532,12 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; char *__pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getitem__", 0); - /* "View.MemoryView":404 + /* "View.MemoryView":406 * * def __getitem__(memoryview self, object index): * if index is Ellipsis: # <<<<<<<<<<<<<< @@ -8651,7 +7548,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":405 + /* "View.MemoryView":407 * def __getitem__(memoryview self, object index): * if index is Ellipsis: * return self # <<<<<<<<<<<<<< @@ -8663,7 +7560,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ __pyx_r = ((PyObject *)__pyx_v_self); goto __pyx_L0; - /* "View.MemoryView":404 + /* "View.MemoryView":406 * * def __getitem__(memoryview self, object index): * if index is Ellipsis: # <<<<<<<<<<<<<< @@ -8672,14 +7569,14 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ */ } - /* "View.MemoryView":407 + /* "View.MemoryView":409 * return self * * have_slices, indices = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< * * cdef char *itemp */ - __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 407, __pyx_L1_error) + __pyx_t_3 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 409, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (likely(__pyx_t_3 != Py_None)) { PyObject* sequence = __pyx_t_3; @@ -8687,7 +7584,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(2, 407, __pyx_L1_error) + __PYX_ERR(2, 409, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); @@ -8695,31 +7592,31 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(__pyx_t_5); #else - __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 407, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 409, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 407, __pyx_L1_error) + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 409, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); #endif __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 407, __pyx_L1_error) + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 409, __pyx_L1_error) } __pyx_v_have_slices = __pyx_t_4; __pyx_t_4 = 0; __pyx_v_indices = __pyx_t_5; __pyx_t_5 = 0; - /* "View.MemoryView":410 + /* "View.MemoryView":412 * * cdef char *itemp * if have_slices: # <<<<<<<<<<<<<< * return memview_slice(self, indices) * else: */ - __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 410, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 412, __pyx_L1_error) if (__pyx_t_2) { - /* "View.MemoryView":411 + /* "View.MemoryView":413 * cdef char *itemp * if have_slices: * return memview_slice(self, indices) # <<<<<<<<<<<<<< @@ -8727,13 +7624,13 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ * itemp = self.get_item_pointer(indices) */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 411, __pyx_L1_error) + __pyx_t_3 = ((PyObject *)__pyx_memview_slice(__pyx_v_self, __pyx_v_indices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 413, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "View.MemoryView":410 + /* "View.MemoryView":412 * * cdef char *itemp * if have_slices: # <<<<<<<<<<<<<< @@ -8742,7 +7639,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ */ } - /* "View.MemoryView":413 + /* "View.MemoryView":415 * return memview_slice(self, indices) * else: * itemp = self.get_item_pointer(indices) # <<<<<<<<<<<<<< @@ -8750,10 +7647,10 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ * */ /*else*/ { - __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(2, 413, __pyx_L1_error) + __pyx_t_6 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_indices); if (unlikely(__pyx_t_6 == ((char *)NULL))) __PYX_ERR(2, 415, __pyx_L1_error) __pyx_v_itemp = __pyx_t_6; - /* "View.MemoryView":414 + /* "View.MemoryView":416 * else: * itemp = self.get_item_pointer(indices) * return self.convert_item_to_object(itemp) # <<<<<<<<<<<<<< @@ -8761,14 +7658,14 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ * def __setitem__(memoryview self, object index, object value): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 414, __pyx_L1_error) + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->convert_item_to_object(__pyx_v_self, __pyx_v_itemp); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 416, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; } - /* "View.MemoryView":403 + /* "View.MemoryView":405 * * * def __getitem__(memoryview self, object index): # <<<<<<<<<<<<<< @@ -8791,7 +7688,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_4_ return __pyx_r; } -/* "View.MemoryView":416 +/* "View.MemoryView":418 * return self.convert_item_to_object(itemp) * * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< @@ -8821,10 +7718,13 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setitem__", 0); __Pyx_INCREF(__pyx_v_index); - /* "View.MemoryView":417 + /* "View.MemoryView":419 * * def __setitem__(memoryview self, object index, object value): * if self.view.readonly: # <<<<<<<<<<<<<< @@ -8834,20 +7734,20 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit __pyx_t_1 = (__pyx_v_self->view.readonly != 0); if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":418 + /* "View.MemoryView":420 * def __setitem__(memoryview self, object index, object value): * if self.view.readonly: * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< * * have_slices, index = _unellipsify(index, self.view.ndim) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 418, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 418, __pyx_L1_error) + __PYX_ERR(2, 420, __pyx_L1_error) - /* "View.MemoryView":417 + /* "View.MemoryView":419 * * def __setitem__(memoryview self, object index, object value): * if self.view.readonly: # <<<<<<<<<<<<<< @@ -8856,14 +7756,14 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit */ } - /* "View.MemoryView":420 + /* "View.MemoryView":422 * raise TypeError("Cannot assign to read-only memoryview") * * have_slices, index = _unellipsify(index, self.view.ndim) # <<<<<<<<<<<<<< * * if have_slices: */ - __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 420, __pyx_L1_error) + __pyx_t_2 = _unellipsify(__pyx_v_index, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 422, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (likely(__pyx_t_2 != Py_None)) { PyObject* sequence = __pyx_t_2; @@ -8871,7 +7771,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(2, 420, __pyx_L1_error) + __PYX_ERR(2, 422, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); @@ -8879,67 +7779,67 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 420, __pyx_L1_error) + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 422, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 420, __pyx_L1_error) + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 422, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); #endif __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } else { - __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 420, __pyx_L1_error) + __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(2, 422, __pyx_L1_error) } __pyx_v_have_slices = __pyx_t_3; __pyx_t_3 = 0; __Pyx_DECREF_SET(__pyx_v_index, __pyx_t_4); __pyx_t_4 = 0; - /* "View.MemoryView":422 + /* "View.MemoryView":424 * have_slices, index = _unellipsify(index, self.view.ndim) * * if have_slices: # <<<<<<<<<<<<<< * obj = self.is_slice(value) * if obj: */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 422, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_have_slices); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 424, __pyx_L1_error) if (__pyx_t_1) { - /* "View.MemoryView":423 + /* "View.MemoryView":425 * * if have_slices: * obj = self.is_slice(value) # <<<<<<<<<<<<<< * if obj: * self.setitem_slice_assignment(self[index], obj) */ - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 423, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->is_slice(__pyx_v_self, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 425, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_v_obj = __pyx_t_2; __pyx_t_2 = 0; - /* "View.MemoryView":424 + /* "View.MemoryView":426 * if have_slices: * obj = self.is_slice(value) * if obj: # <<<<<<<<<<<<<< * self.setitem_slice_assignment(self[index], obj) * else: */ - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 424, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_obj); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 426, __pyx_L1_error) if (__pyx_t_1) { - /* "View.MemoryView":425 + /* "View.MemoryView":427 * obj = self.is_slice(value) * if obj: * self.setitem_slice_assignment(self[index], obj) # <<<<<<<<<<<<<< * else: * self.setitem_slice_assign_scalar(self[index], value) */ - __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 425, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 427, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 425, __pyx_L1_error) + __pyx_t_4 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assignment(__pyx_v_self, __pyx_t_2, __pyx_v_obj); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 427, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - /* "View.MemoryView":424 + /* "View.MemoryView":426 * if have_slices: * obj = self.is_slice(value) * if obj: # <<<<<<<<<<<<<< @@ -8949,7 +7849,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit goto __pyx_L5; } - /* "View.MemoryView":427 + /* "View.MemoryView":429 * self.setitem_slice_assignment(self[index], obj) * else: * self.setitem_slice_assign_scalar(self[index], value) # <<<<<<<<<<<<<< @@ -8957,17 +7857,17 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit * self.setitem_indexed(index, value) */ /*else*/ { - __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 427, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_GetItem(((PyObject *)__pyx_v_self), __pyx_v_index); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(2, 427, __pyx_L1_error) - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 427, __pyx_L1_error) + if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_memoryview_type))))) __PYX_ERR(2, 429, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_slice_assign_scalar(__pyx_v_self, ((struct __pyx_memoryview_obj *)__pyx_t_4), __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_L5:; - /* "View.MemoryView":422 + /* "View.MemoryView":424 * have_slices, index = _unellipsify(index, self.view.ndim) * * if have_slices: # <<<<<<<<<<<<<< @@ -8977,7 +7877,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit goto __pyx_L4; } - /* "View.MemoryView":429 + /* "View.MemoryView":431 * self.setitem_slice_assign_scalar(self[index], value) * else: * self.setitem_indexed(index, value) # <<<<<<<<<<<<<< @@ -8985,13 +7885,13 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit * cdef is_slice(self, obj): */ /*else*/ { - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 429, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->setitem_indexed(__pyx_v_self, __pyx_v_index, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 431, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __pyx_L4:; - /* "View.MemoryView":416 + /* "View.MemoryView":418 * return self.convert_item_to_object(itemp) * * def __setitem__(memoryview self, object index, object value): # <<<<<<<<<<<<<< @@ -9016,7 +7916,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_6__setit return __pyx_r; } -/* "View.MemoryView":431 +/* "View.MemoryView":433 * self.setitem_indexed(index, value) * * cdef is_slice(self, obj): # <<<<<<<<<<<<<< @@ -9036,10 +7936,13 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("is_slice", 0); __Pyx_INCREF(__pyx_v_obj); - /* "View.MemoryView":432 + /* "View.MemoryView":434 * * cdef is_slice(self, obj): * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< @@ -9050,7 +7953,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":433 + /* "View.MemoryView":435 * cdef is_slice(self, obj): * if not isinstance(obj, memoryview): * try: # <<<<<<<<<<<<<< @@ -9066,34 +7969,34 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ __Pyx_XGOTREF(__pyx_t_5); /*try:*/ { - /* "View.MemoryView":434 + /* "View.MemoryView":436 * if not isinstance(obj, memoryview): * try: * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< * self.dtype_is_object) * except TypeError: */ - __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 434, __pyx_L4_error) + __pyx_t_6 = __Pyx_PyInt_From_int(((__pyx_v_self->flags & (~PyBUF_WRITABLE)) | PyBUF_ANY_CONTIGUOUS)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 436, __pyx_L4_error) __Pyx_GOTREF(__pyx_t_6); - /* "View.MemoryView":435 + /* "View.MemoryView":437 * try: * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, * self.dtype_is_object) # <<<<<<<<<<<<<< * except TypeError: * return None */ - __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 435, __pyx_L4_error) + __pyx_t_7 = __Pyx_PyBool_FromLong(__pyx_v_self->dtype_is_object); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 437, __pyx_L4_error) __Pyx_GOTREF(__pyx_t_7); - /* "View.MemoryView":434 + /* "View.MemoryView":436 * if not isinstance(obj, memoryview): * try: * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, # <<<<<<<<<<<<<< * self.dtype_is_object) * except TypeError: */ - __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 434, __pyx_L4_error) + __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 436, __pyx_L4_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_v_obj); __Pyx_GIVEREF(__pyx_v_obj); @@ -9104,13 +8007,13 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_7); __pyx_t_6 = 0; __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 434, __pyx_L4_error) + __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 436, __pyx_L4_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF_SET(__pyx_v_obj, __pyx_t_7); __pyx_t_7 = 0; - /* "View.MemoryView":433 + /* "View.MemoryView":435 * cdef is_slice(self, obj): * if not isinstance(obj, memoryview): * try: # <<<<<<<<<<<<<< @@ -9127,7 +8030,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; - /* "View.MemoryView":436 + /* "View.MemoryView":438 * obj = memoryview(obj, self.flags & ~PyBUF_WRITABLE | PyBUF_ANY_CONTIGUOUS, * self.dtype_is_object) * except TypeError: # <<<<<<<<<<<<<< @@ -9137,12 +8040,12 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError); if (__pyx_t_9) { __Pyx_AddTraceback("View.MemoryView.memoryview.is_slice", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(2, 436, __pyx_L6_except_error) + if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_6) < 0) __PYX_ERR(2, 438, __pyx_L6_except_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GOTREF(__pyx_t_8); __Pyx_GOTREF(__pyx_t_6); - /* "View.MemoryView":437 + /* "View.MemoryView":439 * self.dtype_is_object) * except TypeError: * return None # <<<<<<<<<<<<<< @@ -9159,7 +8062,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ goto __pyx_L6_except_error; __pyx_L6_except_error:; - /* "View.MemoryView":433 + /* "View.MemoryView":435 * cdef is_slice(self, obj): * if not isinstance(obj, memoryview): * try: # <<<<<<<<<<<<<< @@ -9180,7 +8083,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ __pyx_L9_try_end:; } - /* "View.MemoryView":432 + /* "View.MemoryView":434 * * cdef is_slice(self, obj): * if not isinstance(obj, memoryview): # <<<<<<<<<<<<<< @@ -9189,7 +8092,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ */ } - /* "View.MemoryView":439 + /* "View.MemoryView":441 * return None * * return obj # <<<<<<<<<<<<<< @@ -9201,7 +8104,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ __pyx_r = __pyx_v_obj; goto __pyx_L0; - /* "View.MemoryView":431 + /* "View.MemoryView":433 * self.setitem_indexed(index, value) * * cdef is_slice(self, obj): # <<<<<<<<<<<<<< @@ -9223,7 +8126,7 @@ static PyObject *__pyx_memoryview_is_slice(struct __pyx_memoryview_obj *__pyx_v_ return __pyx_r; } -/* "View.MemoryView":441 +/* "View.MemoryView":443 * return obj * * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< @@ -9242,54 +8145,57 @@ static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryvi int __pyx_t_4; int __pyx_t_5; int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("setitem_slice_assignment", 0); - /* "View.MemoryView":445 + /* "View.MemoryView":447 * cdef __Pyx_memviewslice src_slice * * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< * get_slice_from_memview(dst, &dst_slice)[0], * src.ndim, dst.ndim, self.dtype_is_object) */ - if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(2, 445, __pyx_L1_error) - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 445, __pyx_L1_error) + if (!(likely(((__pyx_v_src) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_src, __pyx_memoryview_type))))) __PYX_ERR(2, 447, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_src), (&__pyx_v_src_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 447, __pyx_L1_error) - /* "View.MemoryView":446 + /* "View.MemoryView":448 * * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], * get_slice_from_memview(dst, &dst_slice)[0], # <<<<<<<<<<<<<< * src.ndim, dst.ndim, self.dtype_is_object) * */ - if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(2, 446, __pyx_L1_error) - __pyx_t_2 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_2 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 446, __pyx_L1_error) + if (!(likely(((__pyx_v_dst) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_dst, __pyx_memoryview_type))))) __PYX_ERR(2, 448, __pyx_L1_error) + __pyx_t_2 = __pyx_memoryview_get_slice_from_memoryview(((struct __pyx_memoryview_obj *)__pyx_v_dst), (&__pyx_v_dst_slice)); if (unlikely(__pyx_t_2 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 448, __pyx_L1_error) - /* "View.MemoryView":447 + /* "View.MemoryView":449 * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], * get_slice_from_memview(dst, &dst_slice)[0], * src.ndim, dst.ndim, self.dtype_is_object) # <<<<<<<<<<<<<< * * cdef setitem_slice_assign_scalar(self, memoryview dst, value): */ - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 447, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_src, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 449, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 447, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 449, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 447, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_dst, __pyx_n_s_ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 449, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 447, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(2, 449, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":445 + /* "View.MemoryView":447 * cdef __Pyx_memviewslice src_slice * * memoryview_copy_contents(get_slice_from_memview(src, &src_slice)[0], # <<<<<<<<<<<<<< * get_slice_from_memview(dst, &dst_slice)[0], * src.ndim, dst.ndim, self.dtype_is_object) */ - __pyx_t_6 = __pyx_memoryview_copy_contents((__pyx_t_1[0]), (__pyx_t_2[0]), __pyx_t_4, __pyx_t_5, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 445, __pyx_L1_error) + __pyx_t_6 = __pyx_memoryview_copy_contents((__pyx_t_1[0]), (__pyx_t_2[0]), __pyx_t_4, __pyx_t_5, __pyx_v_self->dtype_is_object); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 447, __pyx_L1_error) - /* "View.MemoryView":441 + /* "View.MemoryView":443 * return obj * * cdef setitem_slice_assignment(self, dst, src): # <<<<<<<<<<<<<< @@ -9310,7 +8216,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assignment(struct __pyx_memoryvi return __pyx_r; } -/* "View.MemoryView":449 +/* "View.MemoryView":451 * src.ndim, dst.ndim, self.dtype_is_object) * * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< @@ -9338,9 +8244,12 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("setitem_slice_assign_scalar", 0); - /* "View.MemoryView":451 + /* "View.MemoryView":453 * cdef setitem_slice_assign_scalar(self, memoryview dst, value): * cdef int array[128] * cdef void *tmp = NULL # <<<<<<<<<<<<<< @@ -9349,17 +8258,17 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ __pyx_v_tmp = NULL; - /* "View.MemoryView":456 + /* "View.MemoryView":458 * cdef __Pyx_memviewslice *dst_slice * cdef __Pyx_memviewslice tmp_slice * dst_slice = get_slice_from_memview(dst, &tmp_slice) # <<<<<<<<<<<<<< * * if self.view.itemsize > sizeof(array): */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 456, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_dst, (&__pyx_v_tmp_slice)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 458, __pyx_L1_error) __pyx_v_dst_slice = __pyx_t_1; - /* "View.MemoryView":458 + /* "View.MemoryView":460 * dst_slice = get_slice_from_memview(dst, &tmp_slice) * * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< @@ -9369,7 +8278,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor __pyx_t_2 = ((((size_t)__pyx_v_self->view.itemsize) > (sizeof(__pyx_v_array))) != 0); if (__pyx_t_2) { - /* "View.MemoryView":459 + /* "View.MemoryView":461 * * if self.view.itemsize > sizeof(array): * tmp = PyMem_Malloc(self.view.itemsize) # <<<<<<<<<<<<<< @@ -9378,7 +8287,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ __pyx_v_tmp = PyMem_Malloc(__pyx_v_self->view.itemsize); - /* "View.MemoryView":460 + /* "View.MemoryView":462 * if self.view.itemsize > sizeof(array): * tmp = PyMem_Malloc(self.view.itemsize) * if tmp == NULL: # <<<<<<<<<<<<<< @@ -9388,16 +8297,16 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor __pyx_t_2 = ((__pyx_v_tmp == NULL) != 0); if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":461 + /* "View.MemoryView":463 * tmp = PyMem_Malloc(self.view.itemsize) * if tmp == NULL: * raise MemoryError # <<<<<<<<<<<<<< * item = tmp * else: */ - PyErr_NoMemory(); __PYX_ERR(2, 461, __pyx_L1_error) + PyErr_NoMemory(); __PYX_ERR(2, 463, __pyx_L1_error) - /* "View.MemoryView":460 + /* "View.MemoryView":462 * if self.view.itemsize > sizeof(array): * tmp = PyMem_Malloc(self.view.itemsize) * if tmp == NULL: # <<<<<<<<<<<<<< @@ -9406,7 +8315,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ } - /* "View.MemoryView":462 + /* "View.MemoryView":464 * if tmp == NULL: * raise MemoryError * item = tmp # <<<<<<<<<<<<<< @@ -9415,7 +8324,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ __pyx_v_item = __pyx_v_tmp; - /* "View.MemoryView":458 + /* "View.MemoryView":460 * dst_slice = get_slice_from_memview(dst, &tmp_slice) * * if self.view.itemsize > sizeof(array): # <<<<<<<<<<<<<< @@ -9425,7 +8334,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor goto __pyx_L3; } - /* "View.MemoryView":464 + /* "View.MemoryView":466 * item = tmp * else: * item = array # <<<<<<<<<<<<<< @@ -9437,7 +8346,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor } __pyx_L3:; - /* "View.MemoryView":466 + /* "View.MemoryView":468 * item = array * * try: # <<<<<<<<<<<<<< @@ -9446,7 +8355,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ /*try:*/ { - /* "View.MemoryView":467 + /* "View.MemoryView":469 * * try: * if self.dtype_is_object: # <<<<<<<<<<<<<< @@ -9456,7 +8365,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor __pyx_t_2 = (__pyx_v_self->dtype_is_object != 0); if (__pyx_t_2) { - /* "View.MemoryView":468 + /* "View.MemoryView":470 * try: * if self.dtype_is_object: * ( item)[0] = value # <<<<<<<<<<<<<< @@ -9465,7 +8374,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ (((PyObject **)__pyx_v_item)[0]) = ((PyObject *)__pyx_v_value); - /* "View.MemoryView":467 + /* "View.MemoryView":469 * * try: * if self.dtype_is_object: # <<<<<<<<<<<<<< @@ -9475,7 +8384,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor goto __pyx_L8; } - /* "View.MemoryView":470 + /* "View.MemoryView":472 * ( item)[0] = value * else: * self.assign_item_from_object( item, value) # <<<<<<<<<<<<<< @@ -9483,13 +8392,13 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor * */ /*else*/ { - __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 470, __pyx_L6_error) + __pyx_t_3 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, ((char *)__pyx_v_item), __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 472, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_L8:; - /* "View.MemoryView":474 + /* "View.MemoryView":476 * * * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< @@ -9499,18 +8408,18 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor __pyx_t_2 = ((__pyx_v_self->view.suboffsets != NULL) != 0); if (__pyx_t_2) { - /* "View.MemoryView":475 + /* "View.MemoryView":477 * * if self.view.suboffsets != NULL: * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) # <<<<<<<<<<<<<< * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, * item, self.dtype_is_object) */ - __pyx_t_3 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 475, __pyx_L6_error) + __pyx_t_3 = assert_direct_dimensions(__pyx_v_self->view.suboffsets, __pyx_v_self->view.ndim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 477, __pyx_L6_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":474 + /* "View.MemoryView":476 * * * if self.view.suboffsets != NULL: # <<<<<<<<<<<<<< @@ -9519,7 +8428,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor */ } - /* "View.MemoryView":476 + /* "View.MemoryView":478 * if self.view.suboffsets != NULL: * assert_direct_dimensions(self.view.suboffsets, self.view.ndim) * slice_assign_scalar(dst_slice, dst.view.ndim, self.view.itemsize, # <<<<<<<<<<<<<< @@ -9529,7 +8438,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor __pyx_memoryview_slice_assign_scalar(__pyx_v_dst_slice, __pyx_v_dst->view.ndim, __pyx_v_self->view.itemsize, __pyx_v_item, __pyx_v_self->dtype_is_object); } - /* "View.MemoryView":479 + /* "View.MemoryView":481 * item, self.dtype_is_object) * finally: * PyMem_Free(tmp) # <<<<<<<<<<<<<< @@ -9576,7 +8485,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor __pyx_L7:; } - /* "View.MemoryView":449 + /* "View.MemoryView":451 * src.ndim, dst.ndim, self.dtype_is_object) * * cdef setitem_slice_assign_scalar(self, memoryview dst, value): # <<<<<<<<<<<<<< @@ -9597,7 +8506,7 @@ static PyObject *__pyx_memoryview_setitem_slice_assign_scalar(struct __pyx_memor return __pyx_r; } -/* "View.MemoryView":481 +/* "View.MemoryView":483 * PyMem_Free(tmp) * * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< @@ -9611,30 +8520,33 @@ static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *_ __Pyx_RefNannyDeclarations char *__pyx_t_1; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("setitem_indexed", 0); - /* "View.MemoryView":482 + /* "View.MemoryView":484 * * cdef setitem_indexed(self, index, value): * cdef char *itemp = self.get_item_pointer(index) # <<<<<<<<<<<<<< * self.assign_item_from_object(itemp, value) * */ - __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(2, 482, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->get_item_pointer(__pyx_v_self, __pyx_v_index); if (unlikely(__pyx_t_1 == ((char *)NULL))) __PYX_ERR(2, 484, __pyx_L1_error) __pyx_v_itemp = __pyx_t_1; - /* "View.MemoryView":483 + /* "View.MemoryView":485 * cdef setitem_indexed(self, index, value): * cdef char *itemp = self.get_item_pointer(index) * self.assign_item_from_object(itemp, value) # <<<<<<<<<<<<<< * * cdef convert_item_to_object(self, char *itemp): */ - __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 483, __pyx_L1_error) + __pyx_t_2 = ((struct __pyx_vtabstruct_memoryview *)__pyx_v_self->__pyx_vtab)->assign_item_from_object(__pyx_v_self, __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 485, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":481 + /* "View.MemoryView":483 * PyMem_Free(tmp) * * cdef setitem_indexed(self, index, value): # <<<<<<<<<<<<<< @@ -9655,7 +8567,7 @@ static PyObject *__pyx_memoryview_setitem_indexed(struct __pyx_memoryview_obj *_ return __pyx_r; } -/* "View.MemoryView":485 +/* "View.MemoryView":487 * self.assign_item_from_object(itemp, value) * * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< @@ -9680,33 +8592,36 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview PyObject *__pyx_t_9 = NULL; size_t __pyx_t_10; int __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("convert_item_to_object", 0); - /* "View.MemoryView":488 + /* "View.MemoryView":490 * """Only used if instantiated manually by the user, or if Cython doesn't * know how to convert the type""" * import struct # <<<<<<<<<<<<<< * cdef bytes bytesitem * */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 488, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_struct = __pyx_t_1; __pyx_t_1 = 0; - /* "View.MemoryView":491 + /* "View.MemoryView":493 * cdef bytes bytesitem * * bytesitem = itemp[:self.view.itemsize] # <<<<<<<<<<<<<< * try: * result = struct.unpack(self.view.format, bytesitem) */ - __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 491, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_itemp + 0, __pyx_v_self->view.itemsize - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_bytesitem = ((PyObject*)__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":492 + /* "View.MemoryView":494 * * bytesitem = itemp[:self.view.itemsize] * try: # <<<<<<<<<<<<<< @@ -9722,16 +8637,16 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview __Pyx_XGOTREF(__pyx_t_4); /*try:*/ { - /* "View.MemoryView":493 + /* "View.MemoryView":495 * bytesitem = itemp[:self.view.itemsize] * try: * result = struct.unpack(self.view.format, bytesitem) # <<<<<<<<<<<<<< * except struct.error: * raise ValueError("Unable to convert item to object") */ - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 493, __pyx_L3_error) + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_unpack); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 495, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 493, __pyx_L3_error) + __pyx_t_6 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 495, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = NULL; __pyx_t_8 = 0; @@ -9748,7 +8663,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; - __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 495, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; @@ -9757,14 +8672,14 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_6, __pyx_v_bytesitem}; - __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 495, __pyx_L3_error) __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } else #endif { - __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 493, __pyx_L3_error) + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 495, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_9); if (__pyx_t_7) { __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; @@ -9775,7 +8690,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview __Pyx_GIVEREF(__pyx_v_bytesitem); PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_v_bytesitem); __pyx_t_6 = 0; - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 493, __pyx_L3_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 495, __pyx_L3_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } @@ -9783,7 +8698,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview __pyx_v_result = __pyx_t_1; __pyx_t_1 = 0; - /* "View.MemoryView":492 + /* "View.MemoryView":494 * * bytesitem = itemp[:self.view.itemsize] * try: # <<<<<<<<<<<<<< @@ -9792,7 +8707,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview */ } - /* "View.MemoryView":497 + /* "View.MemoryView":499 * raise ValueError("Unable to convert item to object") * else: * if len(self.view.format) == 1: # <<<<<<<<<<<<<< @@ -9804,7 +8719,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview __pyx_t_11 = ((__pyx_t_10 == 1) != 0); if (__pyx_t_11) { - /* "View.MemoryView":498 + /* "View.MemoryView":500 * else: * if len(self.view.format) == 1: * return result[0] # <<<<<<<<<<<<<< @@ -9812,13 +8727,13 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 498, __pyx_L5_except_error) + __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_result, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 500, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L6_except_return; - /* "View.MemoryView":497 + /* "View.MemoryView":499 * raise ValueError("Unable to convert item to object") * else: * if len(self.view.format) == 1: # <<<<<<<<<<<<<< @@ -9827,7 +8742,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview */ } - /* "View.MemoryView":499 + /* "View.MemoryView":501 * if len(self.view.format) == 1: * return result[0] * return result # <<<<<<<<<<<<<< @@ -9846,7 +8761,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - /* "View.MemoryView":494 + /* "View.MemoryView":496 * try: * result = struct.unpack(self.view.format, bytesitem) * except struct.error: # <<<<<<<<<<<<<< @@ -9854,7 +8769,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview * else: */ __Pyx_ErrFetch(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9); - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 494, __pyx_L5_except_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_error); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 496, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = __Pyx_PyErr_GivenExceptionMatches(__pyx_t_1, __pyx_t_6); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; @@ -9862,28 +8777,28 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview __pyx_t_1 = 0; __pyx_t_5 = 0; __pyx_t_9 = 0; if (__pyx_t_8) { __Pyx_AddTraceback("View.MemoryView.memoryview.convert_item_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(2, 494, __pyx_L5_except_error) + if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_5, &__pyx_t_1) < 0) __PYX_ERR(2, 496, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_1); - /* "View.MemoryView":495 + /* "View.MemoryView":497 * result = struct.unpack(self.view.format, bytesitem) * except struct.error: * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< * else: * if len(self.view.format) == 1: */ - __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 495, __pyx_L5_except_error) + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 497, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_Raise(__pyx_t_6, 0, 0, 0); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __PYX_ERR(2, 495, __pyx_L5_except_error) + __PYX_ERR(2, 497, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; - /* "View.MemoryView":492 + /* "View.MemoryView":494 * * bytesitem = itemp[:self.view.itemsize] * try: # <<<<<<<<<<<<<< @@ -9903,7 +8818,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview goto __pyx_L0; } - /* "View.MemoryView":485 + /* "View.MemoryView":487 * self.assign_item_from_object(itemp, value) * * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< @@ -9929,7 +8844,7 @@ static PyObject *__pyx_memoryview_convert_item_to_object(struct __pyx_memoryview return __pyx_r; } -/* "View.MemoryView":501 +/* "View.MemoryView":503 * return result * * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< @@ -9958,21 +8873,24 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie char *__pyx_t_12; char *__pyx_t_13; char *__pyx_t_14; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("assign_item_from_object", 0); - /* "View.MemoryView":504 + /* "View.MemoryView":506 * """Only used if instantiated manually by the user, or if Cython doesn't * know how to convert the type""" * import struct # <<<<<<<<<<<<<< * cdef char c * cdef bytes bytesvalue */ - __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 504, __pyx_L1_error) + __pyx_t_1 = __Pyx_Import(__pyx_n_s_struct, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 506, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_v_struct = __pyx_t_1; __pyx_t_1 = 0; - /* "View.MemoryView":509 + /* "View.MemoryView":511 * cdef Py_ssize_t i * * if isinstance(value, tuple): # <<<<<<<<<<<<<< @@ -9983,37 +8901,37 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { - /* "View.MemoryView":510 + /* "View.MemoryView":512 * * if isinstance(value, tuple): * bytesvalue = struct.pack(self.view.format, *value) # <<<<<<<<<<<<<< * else: * bytesvalue = struct.pack(self.view.format, value) */ - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 510, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 510, __pyx_L1_error) + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) + __pyx_t_4 = __Pyx_PySequence_Tuple(__pyx_v_value); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 510, __pyx_L1_error) + __pyx_t_6 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 510, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 510, __pyx_L1_error) + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 512, __pyx_L1_error) __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; - /* "View.MemoryView":509 + /* "View.MemoryView":511 * cdef Py_ssize_t i * * if isinstance(value, tuple): # <<<<<<<<<<<<<< @@ -10023,7 +8941,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie goto __pyx_L3; } - /* "View.MemoryView":512 + /* "View.MemoryView":514 * bytesvalue = struct.pack(self.view.format, *value) * else: * bytesvalue = struct.pack(self.view.format, value) # <<<<<<<<<<<<<< @@ -10031,9 +8949,9 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie * for i, c in enumerate(bytesvalue): */ /*else*/ { - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 512, __pyx_L1_error) + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_struct, __pyx_n_s_pack); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 512, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyBytes_FromString(__pyx_v_self->view.format); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = NULL; __pyx_t_7 = 0; @@ -10050,7 +8968,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; - __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 514, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -10059,14 +8977,14 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_1, __pyx_v_value}; - __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_7, 2+__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 514, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } else #endif { - __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 512, __pyx_L1_error) + __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); if (__pyx_t_5) { __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL; @@ -10077,18 +8995,18 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie __Pyx_GIVEREF(__pyx_v_value); PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_v_value); __pyx_t_1 = 0; - __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 512, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 514, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 512, __pyx_L1_error) + if (!(likely(PyBytes_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(2, 514, __pyx_L1_error) __pyx_v_bytesvalue = ((PyObject*)__pyx_t_4); __pyx_t_4 = 0; } __pyx_L3:; - /* "View.MemoryView":514 + /* "View.MemoryView":516 * bytesvalue = struct.pack(self.view.format, value) * * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< @@ -10098,7 +9016,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie __pyx_t_9 = 0; if (unlikely(__pyx_v_bytesvalue == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); - __PYX_ERR(2, 514, __pyx_L1_error) + __PYX_ERR(2, 516, __pyx_L1_error) } __Pyx_INCREF(__pyx_v_bytesvalue); __pyx_t_10 = __pyx_v_bytesvalue; @@ -10108,7 +9026,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie __pyx_t_11 = __pyx_t_14; __pyx_v_c = (__pyx_t_11[0]); - /* "View.MemoryView":515 + /* "View.MemoryView":517 * * for i, c in enumerate(bytesvalue): * itemp[i] = c # <<<<<<<<<<<<<< @@ -10117,7 +9035,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie */ __pyx_v_i = __pyx_t_9; - /* "View.MemoryView":514 + /* "View.MemoryView":516 * bytesvalue = struct.pack(self.view.format, value) * * for i, c in enumerate(bytesvalue): # <<<<<<<<<<<<<< @@ -10126,7 +9044,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie */ __pyx_t_9 = (__pyx_t_9 + 1); - /* "View.MemoryView":515 + /* "View.MemoryView":517 * * for i, c in enumerate(bytesvalue): * itemp[i] = c # <<<<<<<<<<<<<< @@ -10137,7 +9055,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie } __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - /* "View.MemoryView":501 + /* "View.MemoryView":503 * return result * * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< @@ -10165,7 +9083,7 @@ static PyObject *__pyx_memoryview_assign_item_from_object(struct __pyx_memoryvie return __pyx_r; } -/* "View.MemoryView":518 +/* "View.MemoryView":520 * * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< @@ -10197,6 +9115,9 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu void *__pyx_t_6; int __pyx_t_7; Py_ssize_t __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; if (__pyx_v_info == NULL) { PyErr_SetString(PyExc_BufferError, "PyObject_GetBuffer: view==NULL argument is obsolete"); return -1; @@ -10205,7 +9126,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); - /* "View.MemoryView":519 + /* "View.MemoryView":521 * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< @@ -10223,20 +9144,20 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_L4_bool_binop_done:; if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":520 + /* "View.MemoryView":522 * def __getbuffer__(self, Py_buffer *info, int flags): * if flags & PyBUF_WRITABLE and self.view.readonly: * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< * * if flags & PyBUF_ND: */ - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 520, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 522, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 520, __pyx_L1_error) + __PYX_ERR(2, 522, __pyx_L1_error) - /* "View.MemoryView":519 + /* "View.MemoryView":521 * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): * if flags & PyBUF_WRITABLE and self.view.readonly: # <<<<<<<<<<<<<< @@ -10245,7 +9166,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu */ } - /* "View.MemoryView":522 + /* "View.MemoryView":524 * raise ValueError("Cannot create writable memory view from read-only memoryview") * * if flags & PyBUF_ND: # <<<<<<<<<<<<<< @@ -10255,7 +9176,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_1 = ((__pyx_v_flags & PyBUF_ND) != 0); if (__pyx_t_1) { - /* "View.MemoryView":523 + /* "View.MemoryView":525 * * if flags & PyBUF_ND: * info.shape = self.view.shape # <<<<<<<<<<<<<< @@ -10265,7 +9186,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_4 = __pyx_v_self->view.shape; __pyx_v_info->shape = __pyx_t_4; - /* "View.MemoryView":522 + /* "View.MemoryView":524 * raise ValueError("Cannot create writable memory view from read-only memoryview") * * if flags & PyBUF_ND: # <<<<<<<<<<<<<< @@ -10275,7 +9196,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu goto __pyx_L6; } - /* "View.MemoryView":525 + /* "View.MemoryView":527 * info.shape = self.view.shape * else: * info.shape = NULL # <<<<<<<<<<<<<< @@ -10287,7 +9208,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu } __pyx_L6:; - /* "View.MemoryView":527 + /* "View.MemoryView":529 * info.shape = NULL * * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< @@ -10297,7 +9218,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_1 = ((__pyx_v_flags & PyBUF_STRIDES) != 0); if (__pyx_t_1) { - /* "View.MemoryView":528 + /* "View.MemoryView":530 * * if flags & PyBUF_STRIDES: * info.strides = self.view.strides # <<<<<<<<<<<<<< @@ -10307,7 +9228,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_4 = __pyx_v_self->view.strides; __pyx_v_info->strides = __pyx_t_4; - /* "View.MemoryView":527 + /* "View.MemoryView":529 * info.shape = NULL * * if flags & PyBUF_STRIDES: # <<<<<<<<<<<<<< @@ -10317,7 +9238,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu goto __pyx_L7; } - /* "View.MemoryView":530 + /* "View.MemoryView":532 * info.strides = self.view.strides * else: * info.strides = NULL # <<<<<<<<<<<<<< @@ -10329,7 +9250,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu } __pyx_L7:; - /* "View.MemoryView":532 + /* "View.MemoryView":534 * info.strides = NULL * * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< @@ -10339,7 +9260,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_1 = ((__pyx_v_flags & PyBUF_INDIRECT) != 0); if (__pyx_t_1) { - /* "View.MemoryView":533 + /* "View.MemoryView":535 * * if flags & PyBUF_INDIRECT: * info.suboffsets = self.view.suboffsets # <<<<<<<<<<<<<< @@ -10349,7 +9270,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_4 = __pyx_v_self->view.suboffsets; __pyx_v_info->suboffsets = __pyx_t_4; - /* "View.MemoryView":532 + /* "View.MemoryView":534 * info.strides = NULL * * if flags & PyBUF_INDIRECT: # <<<<<<<<<<<<<< @@ -10359,7 +9280,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu goto __pyx_L8; } - /* "View.MemoryView":535 + /* "View.MemoryView":537 * info.suboffsets = self.view.suboffsets * else: * info.suboffsets = NULL # <<<<<<<<<<<<<< @@ -10371,7 +9292,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu } __pyx_L8:; - /* "View.MemoryView":537 + /* "View.MemoryView":539 * info.suboffsets = NULL * * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< @@ -10381,7 +9302,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_1 = ((__pyx_v_flags & PyBUF_FORMAT) != 0); if (__pyx_t_1) { - /* "View.MemoryView":538 + /* "View.MemoryView":540 * * if flags & PyBUF_FORMAT: * info.format = self.view.format # <<<<<<<<<<<<<< @@ -10391,7 +9312,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_5 = __pyx_v_self->view.format; __pyx_v_info->format = __pyx_t_5; - /* "View.MemoryView":537 + /* "View.MemoryView":539 * info.suboffsets = NULL * * if flags & PyBUF_FORMAT: # <<<<<<<<<<<<<< @@ -10401,7 +9322,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu goto __pyx_L9; } - /* "View.MemoryView":540 + /* "View.MemoryView":542 * info.format = self.view.format * else: * info.format = NULL # <<<<<<<<<<<<<< @@ -10413,7 +9334,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu } __pyx_L9:; - /* "View.MemoryView":542 + /* "View.MemoryView":544 * info.format = NULL * * info.buf = self.view.buf # <<<<<<<<<<<<<< @@ -10423,7 +9344,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_6 = __pyx_v_self->view.buf; __pyx_v_info->buf = __pyx_t_6; - /* "View.MemoryView":543 + /* "View.MemoryView":545 * * info.buf = self.view.buf * info.ndim = self.view.ndim # <<<<<<<<<<<<<< @@ -10433,7 +9354,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_7 = __pyx_v_self->view.ndim; __pyx_v_info->ndim = __pyx_t_7; - /* "View.MemoryView":544 + /* "View.MemoryView":546 * info.buf = self.view.buf * info.ndim = self.view.ndim * info.itemsize = self.view.itemsize # <<<<<<<<<<<<<< @@ -10443,7 +9364,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_8 = __pyx_v_self->view.itemsize; __pyx_v_info->itemsize = __pyx_t_8; - /* "View.MemoryView":545 + /* "View.MemoryView":547 * info.ndim = self.view.ndim * info.itemsize = self.view.itemsize * info.len = self.view.len # <<<<<<<<<<<<<< @@ -10453,7 +9374,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_8 = __pyx_v_self->view.len; __pyx_v_info->len = __pyx_t_8; - /* "View.MemoryView":546 + /* "View.MemoryView":548 * info.itemsize = self.view.itemsize * info.len = self.view.len * info.readonly = self.view.readonly # <<<<<<<<<<<<<< @@ -10463,7 +9384,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __pyx_t_1 = __pyx_v_self->view.readonly; __pyx_v_info->readonly = __pyx_t_1; - /* "View.MemoryView":547 + /* "View.MemoryView":549 * info.len = self.view.len * info.readonly = self.view.readonly * info.obj = self # <<<<<<<<<<<<<< @@ -10476,7 +9397,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); - /* "View.MemoryView":518 + /* "View.MemoryView":520 * * @cname('getbuffer') * def __getbuffer__(self, Py_buffer *info, int flags): # <<<<<<<<<<<<<< @@ -10506,7 +9427,7 @@ static int __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_8__getbu return __pyx_r; } -/* "View.MemoryView":553 +/* "View.MemoryView":555 * * @property * def T(self): # <<<<<<<<<<<<<< @@ -10533,31 +9454,34 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct _ __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":554 + /* "View.MemoryView":556 * @property * def T(self): * cdef _memoryviewslice result = memoryview_copy(self) # <<<<<<<<<<<<<< * transpose_memslice(&result.from_slice) * return result */ - __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 554, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_copy_object(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 556, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(2, 554, __pyx_L1_error) + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_memoryviewslice_type))))) __PYX_ERR(2, 556, __pyx_L1_error) __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":555 + /* "View.MemoryView":557 * def T(self): * cdef _memoryviewslice result = memoryview_copy(self) * transpose_memslice(&result.from_slice) # <<<<<<<<<<<<<< * return result * */ - __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 555, __pyx_L1_error) + __pyx_t_2 = __pyx_memslice_transpose((&__pyx_v_result->from_slice)); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 557, __pyx_L1_error) - /* "View.MemoryView":556 + /* "View.MemoryView":558 * cdef _memoryviewslice result = memoryview_copy(self) * transpose_memslice(&result.from_slice) * return result # <<<<<<<<<<<<<< @@ -10569,7 +9493,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct _ __pyx_r = ((PyObject *)__pyx_v_result); goto __pyx_L0; - /* "View.MemoryView":553 + /* "View.MemoryView":555 * * @property * def T(self): # <<<<<<<<<<<<<< @@ -10589,7 +9513,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_1T___get__(struct _ return __pyx_r; } -/* "View.MemoryView":559 +/* "View.MemoryView":561 * * @property * def base(self): # <<<<<<<<<<<<<< @@ -10615,7 +9539,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struc __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":560 + /* "View.MemoryView":562 * @property * def base(self): * return self.obj # <<<<<<<<<<<<<< @@ -10627,7 +9551,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struc __pyx_r = __pyx_v_self->obj; goto __pyx_L0; - /* "View.MemoryView":559 + /* "View.MemoryView":561 * * @property * def base(self): # <<<<<<<<<<<<<< @@ -10642,7 +9566,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4base___get__(struc return __pyx_r; } -/* "View.MemoryView":563 +/* "View.MemoryView":565 * * @property * def shape(self): # <<<<<<<<<<<<<< @@ -10672,9 +9596,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(stru Py_ssize_t *__pyx_t_3; Py_ssize_t *__pyx_t_4; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":564 + /* "View.MemoryView":566 * @property * def shape(self): * return tuple([length for length in self.view.shape[:self.view.ndim]]) # <<<<<<<<<<<<<< @@ -10682,25 +9609,25 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(stru * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 564, __pyx_L1_error) + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 566, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); for (__pyx_t_4 = __pyx_v_self->view.shape; __pyx_t_4 < __pyx_t_3; __pyx_t_4++) { __pyx_t_2 = __pyx_t_4; __pyx_v_length = (__pyx_t_2[0]); - __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 564, __pyx_L1_error) + __pyx_t_5 = PyInt_FromSsize_t(__pyx_v_length); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 566, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 564, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(2, 566, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; } - __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 564, __pyx_L1_error) + __pyx_t_5 = PyList_AsTuple(((PyObject*)__pyx_t_1)); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 566, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "View.MemoryView":563 + /* "View.MemoryView":565 * * @property * def shape(self): # <<<<<<<<<<<<<< @@ -10720,7 +9647,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_5shape___get__(stru return __pyx_r; } -/* "View.MemoryView":567 +/* "View.MemoryView":569 * * @property * def strides(self): # <<<<<<<<<<<<<< @@ -10751,9 +9678,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(st Py_ssize_t *__pyx_t_4; Py_ssize_t *__pyx_t_5; PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":568 + /* "View.MemoryView":570 * @property * def strides(self): * if self.view.strides == NULL: # <<<<<<<<<<<<<< @@ -10763,20 +9693,20 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(st __pyx_t_1 = ((__pyx_v_self->view.strides == NULL) != 0); if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":570 + /* "View.MemoryView":572 * if self.view.strides == NULL: * * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< * * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 570, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 570, __pyx_L1_error) + __PYX_ERR(2, 572, __pyx_L1_error) - /* "View.MemoryView":568 + /* "View.MemoryView":570 * @property * def strides(self): * if self.view.strides == NULL: # <<<<<<<<<<<<<< @@ -10785,7 +9715,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(st */ } - /* "View.MemoryView":572 + /* "View.MemoryView":574 * raise ValueError("Buffer view does not expose strides") * * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) # <<<<<<<<<<<<<< @@ -10793,25 +9723,25 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(st * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 572, __pyx_L1_error) + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = (__pyx_v_self->view.strides + __pyx_v_self->view.ndim); for (__pyx_t_5 = __pyx_v_self->view.strides; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { __pyx_t_3 = __pyx_t_5; __pyx_v_stride = (__pyx_t_3[0]); - __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 572, __pyx_L1_error) + __pyx_t_6 = PyInt_FromSsize_t(__pyx_v_stride); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(2, 572, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_6))) __PYX_ERR(2, 574, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; } - __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 572, __pyx_L1_error) + __pyx_t_6 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_6; __pyx_t_6 = 0; goto __pyx_L0; - /* "View.MemoryView":567 + /* "View.MemoryView":569 * * @property * def strides(self): # <<<<<<<<<<<<<< @@ -10831,7 +9761,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_7strides___get__(st return __pyx_r; } -/* "View.MemoryView":575 +/* "View.MemoryView":577 * * @property * def suboffsets(self): # <<<<<<<<<<<<<< @@ -10862,9 +9792,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ Py_ssize_t *__pyx_t_4; Py_ssize_t *__pyx_t_5; Py_ssize_t *__pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":576 + /* "View.MemoryView":578 * @property * def suboffsets(self): * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< @@ -10874,7 +9807,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ __pyx_t_1 = ((__pyx_v_self->view.suboffsets == NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":577 + /* "View.MemoryView":579 * def suboffsets(self): * if self.view.suboffsets == NULL: * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< @@ -10882,16 +9815,16 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 577, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__19, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 577, __pyx_L1_error) + __pyx_t_3 = PyNumber_Multiply(__pyx_tuple__14, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 579, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; - /* "View.MemoryView":576 + /* "View.MemoryView":578 * @property * def suboffsets(self): * if self.view.suboffsets == NULL: # <<<<<<<<<<<<<< @@ -10900,7 +9833,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ */ } - /* "View.MemoryView":579 + /* "View.MemoryView":581 * return (-1,) * self.view.ndim * * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) # <<<<<<<<<<<<<< @@ -10908,25 +9841,25 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 579, __pyx_L1_error) + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = (__pyx_v_self->view.suboffsets + __pyx_v_self->view.ndim); for (__pyx_t_6 = __pyx_v_self->view.suboffsets; __pyx_t_6 < __pyx_t_5; __pyx_t_6++) { __pyx_t_4 = __pyx_t_6; __pyx_v_suboffset = (__pyx_t_4[0]); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_suboffset); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(2, 579, __pyx_L1_error) + if (unlikely(__Pyx_ListComp_Append(__pyx_t_3, (PyObject*)__pyx_t_2))) __PYX_ERR(2, 581, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } - __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 579, __pyx_L1_error) + __pyx_t_2 = PyList_AsTuple(((PyObject*)__pyx_t_3)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":575 + /* "View.MemoryView":577 * * @property * def suboffsets(self): # <<<<<<<<<<<<<< @@ -10946,7 +9879,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_10suboffsets___get_ return __pyx_r; } -/* "View.MemoryView":582 +/* "View.MemoryView":584 * * @property * def ndim(self): # <<<<<<<<<<<<<< @@ -10971,9 +9904,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struc PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":583 + /* "View.MemoryView":585 * @property * def ndim(self): * return self.view.ndim # <<<<<<<<<<<<<< @@ -10981,13 +9917,13 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struc * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 583, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->view.ndim); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 585, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "View.MemoryView":582 + /* "View.MemoryView":584 * * @property * def ndim(self): # <<<<<<<<<<<<<< @@ -11006,7 +9942,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4ndim___get__(struc return __pyx_r; } -/* "View.MemoryView":586 +/* "View.MemoryView":588 * * @property * def itemsize(self): # <<<<<<<<<<<<<< @@ -11031,9 +9967,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(s PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":587 + /* "View.MemoryView":589 * @property * def itemsize(self): * return self.view.itemsize # <<<<<<<<<<<<<< @@ -11041,13 +9980,13 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(s * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 587, __pyx_L1_error) + __pyx_t_1 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 589, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "View.MemoryView":586 + /* "View.MemoryView":588 * * @property * def itemsize(self): # <<<<<<<<<<<<<< @@ -11066,7 +10005,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_8itemsize___get__(s return __pyx_r; } -/* "View.MemoryView":590 +/* "View.MemoryView":592 * * @property * def nbytes(self): # <<<<<<<<<<<<<< @@ -11093,9 +10032,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(str PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":591 + /* "View.MemoryView":593 * @property * def nbytes(self): * return self.size * self.view.itemsize # <<<<<<<<<<<<<< @@ -11103,11 +10045,11 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(str * @property */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 591, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_size); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 591, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_self->view.itemsize); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 591, __pyx_L1_error) + __pyx_t_3 = PyNumber_Multiply(__pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; @@ -11115,7 +10057,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(str __pyx_t_3 = 0; goto __pyx_L0; - /* "View.MemoryView":590 + /* "View.MemoryView":592 * * @property * def nbytes(self): # <<<<<<<<<<<<<< @@ -11136,7 +10078,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_6nbytes___get__(str return __pyx_r; } -/* "View.MemoryView":594 +/* "View.MemoryView":596 * * @property * def size(self): # <<<<<<<<<<<<<< @@ -11168,9 +10110,12 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc Py_ssize_t *__pyx_t_4; Py_ssize_t *__pyx_t_5; PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":595 + /* "View.MemoryView":597 * @property * def size(self): * if self._size is None: # <<<<<<<<<<<<<< @@ -11181,7 +10126,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":596 + /* "View.MemoryView":598 * def size(self): * if self._size is None: * result = 1 # <<<<<<<<<<<<<< @@ -11191,7 +10136,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc __Pyx_INCREF(__pyx_int_1); __pyx_v_result = __pyx_int_1; - /* "View.MemoryView":598 + /* "View.MemoryView":600 * result = 1 * * for length in self.view.shape[:self.view.ndim]: # <<<<<<<<<<<<<< @@ -11201,25 +10146,25 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc __pyx_t_4 = (__pyx_v_self->view.shape + __pyx_v_self->view.ndim); for (__pyx_t_5 = __pyx_v_self->view.shape; __pyx_t_5 < __pyx_t_4; __pyx_t_5++) { __pyx_t_3 = __pyx_t_5; - __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 598, __pyx_L1_error) + __pyx_t_6 = PyInt_FromSsize_t((__pyx_t_3[0])); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 600, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_6); __pyx_t_6 = 0; - /* "View.MemoryView":599 + /* "View.MemoryView":601 * * for length in self.view.shape[:self.view.ndim]: * result *= length # <<<<<<<<<<<<<< * * self._size = result */ - __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 599, __pyx_L1_error) + __pyx_t_6 = PyNumber_InPlaceMultiply(__pyx_v_result, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF_SET(__pyx_v_result, __pyx_t_6); __pyx_t_6 = 0; } - /* "View.MemoryView":601 + /* "View.MemoryView":603 * result *= length * * self._size = result # <<<<<<<<<<<<<< @@ -11232,7 +10177,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc __Pyx_DECREF(__pyx_v_self->_size); __pyx_v_self->_size = __pyx_v_result; - /* "View.MemoryView":595 + /* "View.MemoryView":597 * @property * def size(self): * if self._size is None: # <<<<<<<<<<<<<< @@ -11241,7 +10186,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc */ } - /* "View.MemoryView":603 + /* "View.MemoryView":605 * self._size = result * * return self._size # <<<<<<<<<<<<<< @@ -11253,7 +10198,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc __pyx_r = __pyx_v_self->_size; goto __pyx_L0; - /* "View.MemoryView":594 + /* "View.MemoryView":596 * * @property * def size(self): # <<<<<<<<<<<<<< @@ -11274,7 +10219,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_10memoryview_4size___get__(struc return __pyx_r; } -/* "View.MemoryView":605 +/* "View.MemoryView":607 * return self._size * * def __len__(self): # <<<<<<<<<<<<<< @@ -11301,7 +10246,7 @@ static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_1 int __pyx_t_1; __Pyx_RefNannySetupContext("__len__", 0); - /* "View.MemoryView":606 + /* "View.MemoryView":608 * * def __len__(self): * if self.view.ndim >= 1: # <<<<<<<<<<<<<< @@ -11311,7 +10256,7 @@ static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_1 __pyx_t_1 = ((__pyx_v_self->view.ndim >= 1) != 0); if (__pyx_t_1) { - /* "View.MemoryView":607 + /* "View.MemoryView":609 * def __len__(self): * if self.view.ndim >= 1: * return self.view.shape[0] # <<<<<<<<<<<<<< @@ -11321,7 +10266,7 @@ static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_1 __pyx_r = (__pyx_v_self->view.shape[0]); goto __pyx_L0; - /* "View.MemoryView":606 + /* "View.MemoryView":608 * * def __len__(self): * if self.view.ndim >= 1: # <<<<<<<<<<<<<< @@ -11330,7 +10275,7 @@ static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_1 */ } - /* "View.MemoryView":609 + /* "View.MemoryView":611 * return self.view.shape[0] * * return 0 # <<<<<<<<<<<<<< @@ -11340,7 +10285,7 @@ static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_1 __pyx_r = 0; goto __pyx_L0; - /* "View.MemoryView":605 + /* "View.MemoryView":607 * return self._size * * def __len__(self): # <<<<<<<<<<<<<< @@ -11354,7 +10299,7 @@ static Py_ssize_t __pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_1 return __pyx_r; } -/* "View.MemoryView":611 +/* "View.MemoryView":613 * return 0 * * def __repr__(self): # <<<<<<<<<<<<<< @@ -11381,9 +10326,12 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12 PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__repr__", 0); - /* "View.MemoryView":612 + /* "View.MemoryView":614 * * def __repr__(self): * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< @@ -11391,33 +10339,33 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 612, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 614, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 612, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 614, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 612, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 614, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":613 + /* "View.MemoryView":615 * def __repr__(self): * return "" % (self.base.__class__.__name__, * id(self)) # <<<<<<<<<<<<<< * * def __str__(self): */ - __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 613, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_id, ((PyObject *)__pyx_v_self)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 615, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - /* "View.MemoryView":612 + /* "View.MemoryView":614 * * def __repr__(self): * return "" % (self.base.__class__.__name__, # <<<<<<<<<<<<<< * id(self)) * */ - __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 612, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 614, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); @@ -11425,14 +10373,14 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12 PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); __pyx_t_1 = 0; __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 612, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 614, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":611 + /* "View.MemoryView":613 * return 0 * * def __repr__(self): # <<<<<<<<<<<<<< @@ -11453,7 +10401,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_12 return __pyx_r; } -/* "View.MemoryView":615 +/* "View.MemoryView":617 * id(self)) * * def __str__(self): # <<<<<<<<<<<<<< @@ -11479,9 +10427,12 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14 __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__str__", 0); - /* "View.MemoryView":616 + /* "View.MemoryView":618 * * def __str__(self): * return "" % (self.base.__class__.__name__,) # <<<<<<<<<<<<<< @@ -11489,27 +10440,27 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_base); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 618, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 616, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_class); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 618, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_name_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 618, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 616, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 618, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 616, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_MemoryView_of_r_object, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 618, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "View.MemoryView":615 + /* "View.MemoryView":617 * id(self)) * * def __str__(self): # <<<<<<<<<<<<<< @@ -11529,7 +10480,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_14 return __pyx_r; } -/* "View.MemoryView":619 +/* "View.MemoryView":621 * * * def is_c_contig(self): # <<<<<<<<<<<<<< @@ -11557,19 +10508,22 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16 __Pyx_RefNannyDeclarations __Pyx_memviewslice *__pyx_t_1; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("is_c_contig", 0); - /* "View.MemoryView":622 + /* "View.MemoryView":624 * cdef __Pyx_memviewslice *mslice * cdef __Pyx_memviewslice tmp * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< * return slice_is_contig(mslice[0], 'C', self.view.ndim) * */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 622, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 624, __pyx_L1_error) __pyx_v_mslice = __pyx_t_1; - /* "View.MemoryView":623 + /* "View.MemoryView":625 * cdef __Pyx_memviewslice tmp * mslice = get_slice_from_memview(self, &tmp) * return slice_is_contig(mslice[0], 'C', self.view.ndim) # <<<<<<<<<<<<<< @@ -11577,13 +10531,13 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16 * def is_f_contig(self): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 623, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'C', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 625, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":619 + /* "View.MemoryView":621 * * * def is_c_contig(self): # <<<<<<<<<<<<<< @@ -11602,7 +10556,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_16 return __pyx_r; } -/* "View.MemoryView":625 +/* "View.MemoryView":627 * return slice_is_contig(mslice[0], 'C', self.view.ndim) * * def is_f_contig(self): # <<<<<<<<<<<<<< @@ -11630,19 +10584,22 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18 __Pyx_RefNannyDeclarations __Pyx_memviewslice *__pyx_t_1; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("is_f_contig", 0); - /* "View.MemoryView":628 + /* "View.MemoryView":630 * cdef __Pyx_memviewslice *mslice * cdef __Pyx_memviewslice tmp * mslice = get_slice_from_memview(self, &tmp) # <<<<<<<<<<<<<< * return slice_is_contig(mslice[0], 'F', self.view.ndim) * */ - __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 628, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_get_slice_from_memoryview(__pyx_v_self, (&__pyx_v_tmp)); if (unlikely(__pyx_t_1 == ((__Pyx_memviewslice *)NULL))) __PYX_ERR(2, 630, __pyx_L1_error) __pyx_v_mslice = __pyx_t_1; - /* "View.MemoryView":629 + /* "View.MemoryView":631 * cdef __Pyx_memviewslice tmp * mslice = get_slice_from_memview(self, &tmp) * return slice_is_contig(mslice[0], 'F', self.view.ndim) # <<<<<<<<<<<<<< @@ -11650,13 +10607,13 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18 * def copy(self): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 629, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_memviewslice_is_contig((__pyx_v_mslice[0]), 'F', __pyx_v_self->view.ndim)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 631, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":625 + /* "View.MemoryView":627 * return slice_is_contig(mslice[0], 'C', self.view.ndim) * * def is_f_contig(self): # <<<<<<<<<<<<<< @@ -11675,7 +10632,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_18 return __pyx_r; } -/* "View.MemoryView":631 +/* "View.MemoryView":633 * return slice_is_contig(mslice[0], 'F', self.view.ndim) * * def copy(self): # <<<<<<<<<<<<<< @@ -11703,9 +10660,12 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20 __Pyx_RefNannyDeclarations __Pyx_memviewslice __pyx_t_1; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("copy", 0); - /* "View.MemoryView":633 + /* "View.MemoryView":635 * def copy(self): * cdef __Pyx_memviewslice mslice * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS # <<<<<<<<<<<<<< @@ -11714,7 +10674,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20 */ __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_F_CONTIGUOUS)); - /* "View.MemoryView":635 + /* "View.MemoryView":637 * cdef int flags = self.flags & ~PyBUF_F_CONTIGUOUS * * slice_copy(self, &mslice) # <<<<<<<<<<<<<< @@ -11723,17 +10683,17 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20 */ __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_mslice)); - /* "View.MemoryView":636 + /* "View.MemoryView":638 * * slice_copy(self, &mslice) * mslice = slice_copy_contig(&mslice, "c", self.view.ndim, # <<<<<<<<<<<<<< * self.view.itemsize, * flags|PyBUF_C_CONTIGUOUS, */ - __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 636, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_mslice), ((char *)"c"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_C_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 638, __pyx_L1_error) __pyx_v_mslice = __pyx_t_1; - /* "View.MemoryView":641 + /* "View.MemoryView":643 * self.dtype_is_object) * * return memoryview_copy_from_slice(self, &mslice) # <<<<<<<<<<<<<< @@ -11741,13 +10701,13 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20 * def copy_fortran(self): */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 641, __pyx_L1_error) + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_mslice)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 643, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":631 + /* "View.MemoryView":633 * return slice_is_contig(mslice[0], 'F', self.view.ndim) * * def copy(self): # <<<<<<<<<<<<<< @@ -11766,7 +10726,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_20 return __pyx_r; } -/* "View.MemoryView":643 +/* "View.MemoryView":645 * return memoryview_copy_from_slice(self, &mslice) * * def copy_fortran(self): # <<<<<<<<<<<<<< @@ -11795,9 +10755,12 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22 __Pyx_RefNannyDeclarations __Pyx_memviewslice __pyx_t_1; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("copy_fortran", 0); - /* "View.MemoryView":645 + /* "View.MemoryView":647 * def copy_fortran(self): * cdef __Pyx_memviewslice src, dst * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS # <<<<<<<<<<<<<< @@ -11806,7 +10769,7 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22 */ __pyx_v_flags = (__pyx_v_self->flags & (~PyBUF_C_CONTIGUOUS)); - /* "View.MemoryView":647 + /* "View.MemoryView":649 * cdef int flags = self.flags & ~PyBUF_C_CONTIGUOUS * * slice_copy(self, &src) # <<<<<<<<<<<<<< @@ -11815,17 +10778,17 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22 */ __pyx_memoryview_slice_copy(__pyx_v_self, (&__pyx_v_src)); - /* "View.MemoryView":648 + /* "View.MemoryView":650 * * slice_copy(self, &src) * dst = slice_copy_contig(&src, "fortran", self.view.ndim, # <<<<<<<<<<<<<< * self.view.itemsize, * flags|PyBUF_F_CONTIGUOUS, */ - __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 648, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_copy_new_contig((&__pyx_v_src), ((char *)"fortran"), __pyx_v_self->view.ndim, __pyx_v_self->view.itemsize, (__pyx_v_flags | PyBUF_F_CONTIGUOUS), __pyx_v_self->dtype_is_object); if (unlikely(PyErr_Occurred())) __PYX_ERR(2, 650, __pyx_L1_error) __pyx_v_dst = __pyx_t_1; - /* "View.MemoryView":653 + /* "View.MemoryView":655 * self.dtype_is_object) * * return memoryview_copy_from_slice(self, &dst) # <<<<<<<<<<<<<< @@ -11833,13 +10796,13 @@ static PyObject *__pyx_memoryview___pyx_pf_15View_dot_MemoryView_10memoryview_22 * */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 653, __pyx_L1_error) + __pyx_t_2 = __pyx_memoryview_copy_object_from_slice(__pyx_v_self, (&__pyx_v_dst)); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 655, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":643 + /* "View.MemoryView":645 * return memoryview_copy_from_slice(self, &mslice) * * def copy_fortran(self): # <<<<<<<<<<<<<< @@ -11881,6 +10844,9 @@ static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struc PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":2 @@ -11889,7 +10855,7 @@ static PyObject *__pyx_pf___pyx_memoryview___reduce_cython__(CYTHON_UNUSED struc * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -11935,6 +10901,9 @@ static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED st PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":4 @@ -11942,7 +10911,7 @@ static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED st * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -11965,7 +10934,7 @@ static PyObject *__pyx_pf___pyx_memoryview_2__setstate_cython__(CYTHON_UNUSED st return __pyx_r; } -/* "View.MemoryView":657 +/* "View.MemoryView":659 * * @cname('__pyx_memoryview_new') * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< @@ -11980,20 +10949,23 @@ static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, in PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("memoryview_cwrapper", 0); - /* "View.MemoryView":658 + /* "View.MemoryView":660 * @cname('__pyx_memoryview_new') * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): * cdef memoryview result = memoryview(o, flags, dtype_is_object) # <<<<<<<<<<<<<< * result.typeinfo = typeinfo * return result */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 658, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_flags); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 660, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 658, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 660, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 658, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 660, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_o); __Pyx_GIVEREF(__pyx_v_o); @@ -12004,13 +10976,13 @@ static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, in PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); __pyx_t_1 = 0; __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 658, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryview_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 660, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_result = ((struct __pyx_memoryview_obj *)__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":659 + /* "View.MemoryView":661 * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): * cdef memoryview result = memoryview(o, flags, dtype_is_object) * result.typeinfo = typeinfo # <<<<<<<<<<<<<< @@ -12019,7 +10991,7 @@ static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, in */ __pyx_v_result->typeinfo = __pyx_v_typeinfo; - /* "View.MemoryView":660 + /* "View.MemoryView":662 * cdef memoryview result = memoryview(o, flags, dtype_is_object) * result.typeinfo = typeinfo * return result # <<<<<<<<<<<<<< @@ -12031,7 +11003,7 @@ static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, in __pyx_r = ((PyObject *)__pyx_v_result); goto __pyx_L0; - /* "View.MemoryView":657 + /* "View.MemoryView":659 * * @cname('__pyx_memoryview_new') * cdef memoryview_cwrapper(object o, int flags, bint dtype_is_object, __Pyx_TypeInfo *typeinfo): # <<<<<<<<<<<<<< @@ -12053,7 +11025,7 @@ static PyObject *__pyx_memoryview_new(PyObject *__pyx_v_o, int __pyx_v_flags, in return __pyx_r; } -/* "View.MemoryView":663 +/* "View.MemoryView":665 * * @cname('__pyx_memoryview_check') * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< @@ -12067,7 +11039,7 @@ static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { int __pyx_t_1; __Pyx_RefNannySetupContext("memoryview_check", 0); - /* "View.MemoryView":664 + /* "View.MemoryView":666 * @cname('__pyx_memoryview_check') * cdef inline bint memoryview_check(object o): * return isinstance(o, memoryview) # <<<<<<<<<<<<<< @@ -12078,7 +11050,7 @@ static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { __pyx_r = __pyx_t_1; goto __pyx_L0; - /* "View.MemoryView":663 + /* "View.MemoryView":665 * * @cname('__pyx_memoryview_check') * cdef inline bint memoryview_check(object o): # <<<<<<<<<<<<<< @@ -12092,7 +11064,7 @@ static CYTHON_INLINE int __pyx_memoryview_check(PyObject *__pyx_v_o) { return __pyx_r; } -/* "View.MemoryView":666 +/* "View.MemoryView":668 * return isinstance(o, memoryview) * * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< @@ -12121,9 +11093,12 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { int __pyx_t_9; int __pyx_t_10; PyObject *__pyx_t_11 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_unellipsify", 0); - /* "View.MemoryView":671 + /* "View.MemoryView":673 * full slices. * """ * if not isinstance(index, tuple): # <<<<<<<<<<<<<< @@ -12134,14 +11109,14 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":672 + /* "View.MemoryView":674 * """ * if not isinstance(index, tuple): * tup = (index,) # <<<<<<<<<<<<<< * else: * tup = index */ - __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 672, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 674, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_index); __Pyx_GIVEREF(__pyx_v_index); @@ -12149,7 +11124,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_v_tup = __pyx_t_3; __pyx_t_3 = 0; - /* "View.MemoryView":671 + /* "View.MemoryView":673 * full slices. * """ * if not isinstance(index, tuple): # <<<<<<<<<<<<<< @@ -12159,7 +11134,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { goto __pyx_L3; } - /* "View.MemoryView":674 + /* "View.MemoryView":676 * tup = (index,) * else: * tup = index # <<<<<<<<<<<<<< @@ -12172,19 +11147,19 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { } __pyx_L3:; - /* "View.MemoryView":676 + /* "View.MemoryView":678 * tup = index * * result = [] # <<<<<<<<<<<<<< * have_slices = False * seen_ellipsis = False */ - __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 676, __pyx_L1_error) + __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 678, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_v_result = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":677 + /* "View.MemoryView":679 * * result = [] * have_slices = False # <<<<<<<<<<<<<< @@ -12193,7 +11168,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { */ __pyx_v_have_slices = 0; - /* "View.MemoryView":678 + /* "View.MemoryView":680 * result = [] * have_slices = False * seen_ellipsis = False # <<<<<<<<<<<<<< @@ -12202,7 +11177,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { */ __pyx_v_seen_ellipsis = 0; - /* "View.MemoryView":679 + /* "View.MemoryView":681 * have_slices = False * seen_ellipsis = False * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< @@ -12215,26 +11190,26 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_4 = __pyx_v_tup; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; __pyx_t_6 = NULL; } else { - __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_v_tup); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 681, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(2, 681, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_6)) { if (likely(PyList_CheckExact(__pyx_t_4))) { if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 681, __pyx_L1_error) #else - __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 681, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); #endif } else { if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_7); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(2, 681, __pyx_L1_error) #else - __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 681, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); #endif } @@ -12244,7 +11219,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 679, __pyx_L1_error) + else __PYX_ERR(2, 681, __pyx_L1_error) } break; } @@ -12254,13 +11229,13 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_7 = 0; __Pyx_INCREF(__pyx_t_3); __Pyx_XDECREF_SET(__pyx_v_idx, __pyx_t_3); - __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 679, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyInt_AddObjC(__pyx_t_3, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 681, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = __pyx_t_7; __pyx_t_7 = 0; - /* "View.MemoryView":680 + /* "View.MemoryView":682 * seen_ellipsis = False * for idx, item in enumerate(tup): * if item is Ellipsis: # <<<<<<<<<<<<<< @@ -12271,7 +11246,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { - /* "View.MemoryView":681 + /* "View.MemoryView":683 * for idx, item in enumerate(tup): * if item is Ellipsis: * if not seen_ellipsis: # <<<<<<<<<<<<<< @@ -12281,27 +11256,27 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_1 = ((!(__pyx_v_seen_ellipsis != 0)) != 0); if (__pyx_t_1) { - /* "View.MemoryView":682 + /* "View.MemoryView":684 * if item is Ellipsis: * if not seen_ellipsis: * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< * seen_ellipsis = True * else: */ - __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(2, 682, __pyx_L1_error) - __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 682, __pyx_L1_error) + __pyx_t_8 = PyObject_Length(__pyx_v_tup); if (unlikely(__pyx_t_8 == ((Py_ssize_t)-1))) __PYX_ERR(2, 684, __pyx_L1_error) + __pyx_t_7 = PyList_New(1 * ((((__pyx_v_ndim - __pyx_t_8) + 1)<0) ? 0:((__pyx_v_ndim - __pyx_t_8) + 1))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 684, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < ((__pyx_v_ndim - __pyx_t_8) + 1); __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__22); - __Pyx_GIVEREF(__pyx_slice__22); - PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__22); + __Pyx_INCREF(__pyx_slice__17); + __Pyx_GIVEREF(__pyx_slice__17); + PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_slice__17); } } - __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 682, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_7); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 684, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - /* "View.MemoryView":683 + /* "View.MemoryView":685 * if not seen_ellipsis: * result.extend([slice(None)] * (ndim - len(tup) + 1)) * seen_ellipsis = True # <<<<<<<<<<<<<< @@ -12310,7 +11285,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { */ __pyx_v_seen_ellipsis = 1; - /* "View.MemoryView":681 + /* "View.MemoryView":683 * for idx, item in enumerate(tup): * if item is Ellipsis: * if not seen_ellipsis: # <<<<<<<<<<<<<< @@ -12320,7 +11295,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { goto __pyx_L7; } - /* "View.MemoryView":685 + /* "View.MemoryView":687 * seen_ellipsis = True * else: * result.append(slice(None)) # <<<<<<<<<<<<<< @@ -12328,11 +11303,11 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { * else: */ /*else*/ { - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__22); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 685, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_slice__17); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 687, __pyx_L1_error) } __pyx_L7:; - /* "View.MemoryView":686 + /* "View.MemoryView":688 * else: * result.append(slice(None)) * have_slices = True # <<<<<<<<<<<<<< @@ -12341,7 +11316,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { */ __pyx_v_have_slices = 1; - /* "View.MemoryView":680 + /* "View.MemoryView":682 * seen_ellipsis = False * for idx, item in enumerate(tup): * if item is Ellipsis: # <<<<<<<<<<<<<< @@ -12351,7 +11326,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { goto __pyx_L6; } - /* "View.MemoryView":688 + /* "View.MemoryView":690 * have_slices = True * else: * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< @@ -12371,23 +11346,23 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_L9_bool_binop_done:; if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":689 + /* "View.MemoryView":691 * else: * if not isinstance(item, slice) and not PyIndex_Check(item): * raise TypeError("Cannot index with type '%s'" % type(item)) # <<<<<<<<<<<<<< * * have_slices = have_slices or isinstance(item, slice) */ - __pyx_t_7 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 689, __pyx_L1_error) + __pyx_t_7 = __Pyx_PyString_FormatSafe(__pyx_kp_s_Cannot_index_with_type_s, ((PyObject *)Py_TYPE(__pyx_v_item))); if (unlikely(!__pyx_t_7)) __PYX_ERR(2, 691, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); - __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 689, __pyx_L1_error) + __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_7); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 691, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_Raise(__pyx_t_11, 0, 0, 0); __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __PYX_ERR(2, 689, __pyx_L1_error) + __PYX_ERR(2, 691, __pyx_L1_error) - /* "View.MemoryView":688 + /* "View.MemoryView":690 * have_slices = True * else: * if not isinstance(item, slice) and not PyIndex_Check(item): # <<<<<<<<<<<<<< @@ -12396,7 +11371,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { */ } - /* "View.MemoryView":691 + /* "View.MemoryView":693 * raise TypeError("Cannot index with type '%s'" % type(item)) * * have_slices = have_slices or isinstance(item, slice) # <<<<<<<<<<<<<< @@ -12415,18 +11390,18 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_L11_bool_binop_done:; __pyx_v_have_slices = __pyx_t_1; - /* "View.MemoryView":692 + /* "View.MemoryView":694 * * have_slices = have_slices or isinstance(item, slice) * result.append(item) # <<<<<<<<<<<<<< * * nslices = ndim - len(result) */ - __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 692, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_result, __pyx_v_item); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 694, __pyx_L1_error) } __pyx_L6:; - /* "View.MemoryView":679 + /* "View.MemoryView":681 * have_slices = False * seen_ellipsis = False * for idx, item in enumerate(tup): # <<<<<<<<<<<<<< @@ -12437,17 +11412,17 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":694 + /* "View.MemoryView":696 * result.append(item) * * nslices = ndim - len(result) # <<<<<<<<<<<<<< * if nslices: * result.extend([slice(None)] * nslices) */ - __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(2, 694, __pyx_L1_error) + __pyx_t_5 = PyList_GET_SIZE(__pyx_v_result); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(2, 696, __pyx_L1_error) __pyx_v_nslices = (__pyx_v_ndim - __pyx_t_5); - /* "View.MemoryView":695 + /* "View.MemoryView":697 * * nslices = ndim - len(result) * if nslices: # <<<<<<<<<<<<<< @@ -12457,26 +11432,26 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_1 = (__pyx_v_nslices != 0); if (__pyx_t_1) { - /* "View.MemoryView":696 + /* "View.MemoryView":698 * nslices = ndim - len(result) * if nslices: * result.extend([slice(None)] * nslices) # <<<<<<<<<<<<<< * * return have_slices or nslices, tuple(result) */ - __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 696, __pyx_L1_error) + __pyx_t_3 = PyList_New(1 * ((__pyx_v_nslices<0) ? 0:__pyx_v_nslices)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 698, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); { Py_ssize_t __pyx_temp; for (__pyx_temp=0; __pyx_temp < __pyx_v_nslices; __pyx_temp++) { - __Pyx_INCREF(__pyx_slice__22); - __Pyx_GIVEREF(__pyx_slice__22); - PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__22); + __Pyx_INCREF(__pyx_slice__17); + __Pyx_GIVEREF(__pyx_slice__17); + PyList_SET_ITEM(__pyx_t_3, __pyx_temp, __pyx_slice__17); } } - __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 696, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyList_Extend(__pyx_v_result, __pyx_t_3); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 698, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":695 + /* "View.MemoryView":697 * * nslices = ndim - len(result) * if nslices: # <<<<<<<<<<<<<< @@ -12485,7 +11460,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { */ } - /* "View.MemoryView":698 + /* "View.MemoryView":700 * result.extend([slice(None)] * nslices) * * return have_slices or nslices, tuple(result) # <<<<<<<<<<<<<< @@ -12495,20 +11470,20 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __Pyx_XDECREF(__pyx_r); if (!__pyx_v_have_slices) { } else { - __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_have_slices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 700, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L14_bool_binop_done; } - __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) + __pyx_t_4 = PyInt_FromSsize_t(__pyx_v_nslices); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 700, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __pyx_t_4; __pyx_t_4 = 0; __pyx_L14_bool_binop_done:; - __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 698, __pyx_L1_error) + __pyx_t_4 = PyList_AsTuple(__pyx_v_result); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 700, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); - __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 698, __pyx_L1_error) + __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(2, 700, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_3); @@ -12520,7 +11495,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { __pyx_t_11 = 0; goto __pyx_L0; - /* "View.MemoryView":666 + /* "View.MemoryView":668 * return isinstance(o, memoryview) * * cdef tuple _unellipsify(object index, int ndim): # <<<<<<<<<<<<<< @@ -12546,7 +11521,7 @@ static PyObject *_unellipsify(PyObject *__pyx_v_index, int __pyx_v_ndim) { return __pyx_r; } -/* "View.MemoryView":700 +/* "View.MemoryView":702 * return have_slices or nslices, tuple(result) * * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< @@ -12563,9 +11538,12 @@ static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __ Py_ssize_t *__pyx_t_3; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("assert_direct_dimensions", 0); - /* "View.MemoryView":701 + /* "View.MemoryView":703 * * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): * for suboffset in suboffsets[:ndim]: # <<<<<<<<<<<<<< @@ -12577,7 +11555,7 @@ static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __ __pyx_t_1 = __pyx_t_3; __pyx_v_suboffset = (__pyx_t_1[0]); - /* "View.MemoryView":702 + /* "View.MemoryView":704 * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): * for suboffset in suboffsets[:ndim]: * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -12587,20 +11565,20 @@ static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __ __pyx_t_4 = ((__pyx_v_suboffset >= 0) != 0); if (unlikely(__pyx_t_4)) { - /* "View.MemoryView":703 + /* "View.MemoryView":705 * for suboffset in suboffsets[:ndim]: * if suboffset >= 0: * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< * * */ - __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 703, __pyx_L1_error) + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 705, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __PYX_ERR(2, 703, __pyx_L1_error) + __PYX_ERR(2, 705, __pyx_L1_error) - /* "View.MemoryView":702 + /* "View.MemoryView":704 * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): * for suboffset in suboffsets[:ndim]: * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -12610,7 +11588,7 @@ static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __ } } - /* "View.MemoryView":700 + /* "View.MemoryView":702 * return have_slices or nslices, tuple(result) * * cdef assert_direct_dimensions(Py_ssize_t *suboffsets, int ndim): # <<<<<<<<<<<<<< @@ -12631,7 +11609,7 @@ static PyObject *assert_direct_dimensions(Py_ssize_t *__pyx_v_suboffsets, int __ return __pyx_r; } -/* "View.MemoryView":710 +/* "View.MemoryView":712 * * @cname('__pyx_memview_slice') * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< @@ -12670,9 +11648,12 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ Py_ssize_t __pyx_t_10; int __pyx_t_11; Py_ssize_t __pyx_t_12; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("memview_slice", 0); - /* "View.MemoryView":711 + /* "View.MemoryView":713 * @cname('__pyx_memview_slice') * cdef memoryview memview_slice(memoryview memview, object indices): * cdef int new_ndim = 0, suboffset_dim = -1, dim # <<<<<<<<<<<<<< @@ -12682,7 +11663,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_v_new_ndim = 0; __pyx_v_suboffset_dim = -1; - /* "View.MemoryView":718 + /* "View.MemoryView":720 * * * memset(&dst, 0, sizeof(dst)) # <<<<<<<<<<<<<< @@ -12691,7 +11672,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ (void)(memset((&__pyx_v_dst), 0, (sizeof(__pyx_v_dst)))); - /* "View.MemoryView":722 + /* "View.MemoryView":724 * cdef _memoryviewslice memviewsliceobj * * assert memview.view.ndim > 0 # <<<<<<<<<<<<<< @@ -12702,12 +11683,12 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ if (unlikely(!Py_OptimizeFlag)) { if (unlikely(!((__pyx_v_memview->view.ndim > 0) != 0))) { PyErr_SetNone(PyExc_AssertionError); - __PYX_ERR(2, 722, __pyx_L1_error) + __PYX_ERR(2, 724, __pyx_L1_error) } } #endif - /* "View.MemoryView":724 + /* "View.MemoryView":726 * assert memview.view.ndim > 0 * * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -12718,20 +11699,20 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":725 + /* "View.MemoryView":727 * * if isinstance(memview, _memoryviewslice): * memviewsliceobj = memview # <<<<<<<<<<<<<< * p_src = &memviewsliceobj.from_slice * else: */ - if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 725, __pyx_L1_error) + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 727, __pyx_L1_error) __pyx_t_3 = ((PyObject *)__pyx_v_memview); __Pyx_INCREF(__pyx_t_3); __pyx_v_memviewsliceobj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":726 + /* "View.MemoryView":728 * if isinstance(memview, _memoryviewslice): * memviewsliceobj = memview * p_src = &memviewsliceobj.from_slice # <<<<<<<<<<<<<< @@ -12740,7 +11721,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ __pyx_v_p_src = (&__pyx_v_memviewsliceobj->from_slice); - /* "View.MemoryView":724 + /* "View.MemoryView":726 * assert memview.view.ndim > 0 * * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -12750,7 +11731,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ goto __pyx_L3; } - /* "View.MemoryView":728 + /* "View.MemoryView":730 * p_src = &memviewsliceobj.from_slice * else: * slice_copy(memview, &src) # <<<<<<<<<<<<<< @@ -12760,7 +11741,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ /*else*/ { __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_src)); - /* "View.MemoryView":729 + /* "View.MemoryView":731 * else: * slice_copy(memview, &src) * p_src = &src # <<<<<<<<<<<<<< @@ -12771,7 +11752,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ } __pyx_L3:; - /* "View.MemoryView":735 + /* "View.MemoryView":737 * * * dst.memview = p_src.memview # <<<<<<<<<<<<<< @@ -12781,7 +11762,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_4 = __pyx_v_p_src->memview; __pyx_v_dst.memview = __pyx_t_4; - /* "View.MemoryView":736 + /* "View.MemoryView":738 * * dst.memview = p_src.memview * dst.data = p_src.data # <<<<<<<<<<<<<< @@ -12791,7 +11772,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_5 = __pyx_v_p_src->data; __pyx_v_dst.data = __pyx_t_5; - /* "View.MemoryView":741 + /* "View.MemoryView":743 * * * cdef __Pyx_memviewslice *p_dst = &dst # <<<<<<<<<<<<<< @@ -12800,7 +11781,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ __pyx_v_p_dst = (&__pyx_v_dst); - /* "View.MemoryView":742 + /* "View.MemoryView":744 * * cdef __Pyx_memviewslice *p_dst = &dst * cdef int *p_suboffset_dim = &suboffset_dim # <<<<<<<<<<<<<< @@ -12809,7 +11790,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ __pyx_v_p_suboffset_dim = (&__pyx_v_suboffset_dim); - /* "View.MemoryView":746 + /* "View.MemoryView":748 * cdef bint have_start, have_stop, have_step * * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< @@ -12821,26 +11802,26 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_3 = __pyx_v_indices; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0; __pyx_t_8 = NULL; } else { - __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 746, __pyx_L1_error) + __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_indices); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 746, __pyx_L1_error) + __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(2, 748, __pyx_L1_error) } for (;;) { if (likely(!__pyx_t_8)) { if (likely(PyList_CheckExact(__pyx_t_3))) { if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 746, __pyx_L1_error) + __pyx_t_9 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 748, __pyx_L1_error) #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 746, __pyx_L1_error) + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); #endif } else { if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 746, __pyx_L1_error) + __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(2, 748, __pyx_L1_error) #else - __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 746, __pyx_L1_error) + __pyx_t_9 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 748, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); #endif } @@ -12850,7 +11831,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ PyObject* exc_type = PyErr_Occurred(); if (exc_type) { if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(2, 746, __pyx_L1_error) + else __PYX_ERR(2, 748, __pyx_L1_error) } break; } @@ -12861,7 +11842,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_v_dim = __pyx_t_6; __pyx_t_6 = (__pyx_t_6 + 1); - /* "View.MemoryView":747 + /* "View.MemoryView":749 * * for dim, index in enumerate(indices): * if PyIndex_Check(index): # <<<<<<<<<<<<<< @@ -12871,25 +11852,25 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_2 = (PyIndex_Check(__pyx_v_index) != 0); if (__pyx_t_2) { - /* "View.MemoryView":751 + /* "View.MemoryView":753 * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], * dim, new_ndim, p_suboffset_dim, * index, 0, 0, # start, stop, step # <<<<<<<<<<<<<< * 0, 0, 0, # have_{start,stop,step} * False) */ - __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 751, __pyx_L1_error) + __pyx_t_10 = __Pyx_PyIndex_AsSsize_t(__pyx_v_index); if (unlikely((__pyx_t_10 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 753, __pyx_L1_error) - /* "View.MemoryView":748 + /* "View.MemoryView":750 * for dim, index in enumerate(indices): * if PyIndex_Check(index): * slice_memviewslice( # <<<<<<<<<<<<<< * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], * dim, new_ndim, p_suboffset_dim, */ - __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 748, __pyx_L1_error) + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_t_10, 0, 0, 0, 0, 0, 0); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 750, __pyx_L1_error) - /* "View.MemoryView":747 + /* "View.MemoryView":749 * * for dim, index in enumerate(indices): * if PyIndex_Check(index): # <<<<<<<<<<<<<< @@ -12899,7 +11880,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ goto __pyx_L6; } - /* "View.MemoryView":754 + /* "View.MemoryView":756 * 0, 0, 0, # have_{start,stop,step} * False) * elif index is None: # <<<<<<<<<<<<<< @@ -12910,7 +11891,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_1 = (__pyx_t_2 != 0); if (__pyx_t_1) { - /* "View.MemoryView":755 + /* "View.MemoryView":757 * False) * elif index is None: * p_dst.shape[new_ndim] = 1 # <<<<<<<<<<<<<< @@ -12919,7 +11900,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ (__pyx_v_p_dst->shape[__pyx_v_new_ndim]) = 1; - /* "View.MemoryView":756 + /* "View.MemoryView":758 * elif index is None: * p_dst.shape[new_ndim] = 1 * p_dst.strides[new_ndim] = 0 # <<<<<<<<<<<<<< @@ -12928,7 +11909,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ (__pyx_v_p_dst->strides[__pyx_v_new_ndim]) = 0; - /* "View.MemoryView":757 + /* "View.MemoryView":759 * p_dst.shape[new_ndim] = 1 * p_dst.strides[new_ndim] = 0 * p_dst.suboffsets[new_ndim] = -1 # <<<<<<<<<<<<<< @@ -12937,7 +11918,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ (__pyx_v_p_dst->suboffsets[__pyx_v_new_ndim]) = -1L; - /* "View.MemoryView":758 + /* "View.MemoryView":760 * p_dst.strides[new_ndim] = 0 * p_dst.suboffsets[new_ndim] = -1 * new_ndim += 1 # <<<<<<<<<<<<<< @@ -12946,7 +11927,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ __pyx_v_new_ndim = (__pyx_v_new_ndim + 1); - /* "View.MemoryView":754 + /* "View.MemoryView":756 * 0, 0, 0, # have_{start,stop,step} * False) * elif index is None: # <<<<<<<<<<<<<< @@ -12956,7 +11937,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ goto __pyx_L6; } - /* "View.MemoryView":760 + /* "View.MemoryView":762 * new_ndim += 1 * else: * start = index.start or 0 # <<<<<<<<<<<<<< @@ -12964,13 +11945,13 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ * step = index.step or 0 */ /*else*/ { - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 760, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 762, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 760, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 762, __pyx_L1_error) if (!__pyx_t_1) { __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 760, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 762, __pyx_L1_error) __pyx_t_10 = __pyx_t_12; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L7_bool_binop_done; @@ -12979,20 +11960,20 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_L7_bool_binop_done:; __pyx_v_start = __pyx_t_10; - /* "View.MemoryView":761 + /* "View.MemoryView":763 * else: * start = index.start or 0 * stop = index.stop or 0 # <<<<<<<<<<<<<< * step = index.step or 0 * */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 761, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 763, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 761, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 763, __pyx_L1_error) if (!__pyx_t_1) { __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 761, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 763, __pyx_L1_error) __pyx_t_10 = __pyx_t_12; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L9_bool_binop_done; @@ -13001,20 +11982,20 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_L9_bool_binop_done:; __pyx_v_stop = __pyx_t_10; - /* "View.MemoryView":762 + /* "View.MemoryView":764 * start = index.start or 0 * stop = index.stop or 0 * step = index.step or 0 # <<<<<<<<<<<<<< * * have_start = index.start is not None */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 762, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 764, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); - __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 762, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(2, 764, __pyx_L1_error) if (!__pyx_t_1) { __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; } else { - __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 762, __pyx_L1_error) + __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_t_9); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 764, __pyx_L1_error) __pyx_t_10 = __pyx_t_12; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; goto __pyx_L11_bool_binop_done; @@ -13023,55 +12004,55 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_L11_bool_binop_done:; __pyx_v_step = __pyx_t_10; - /* "View.MemoryView":764 + /* "View.MemoryView":766 * step = index.step or 0 * * have_start = index.start is not None # <<<<<<<<<<<<<< * have_stop = index.stop is not None * have_step = index.step is not None */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 764, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_start); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 766, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_1 = (__pyx_t_9 != Py_None); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_v_have_start = __pyx_t_1; - /* "View.MemoryView":765 + /* "View.MemoryView":767 * * have_start = index.start is not None * have_stop = index.stop is not None # <<<<<<<<<<<<<< * have_step = index.step is not None * */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 765, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_stop); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 767, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_1 = (__pyx_t_9 != Py_None); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_v_have_stop = __pyx_t_1; - /* "View.MemoryView":766 + /* "View.MemoryView":768 * have_start = index.start is not None * have_stop = index.stop is not None * have_step = index.step is not None # <<<<<<<<<<<<<< * * slice_memviewslice( */ - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 766, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_index, __pyx_n_s_step); if (unlikely(!__pyx_t_9)) __PYX_ERR(2, 768, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_1 = (__pyx_t_9 != Py_None); __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_v_have_step = __pyx_t_1; - /* "View.MemoryView":768 + /* "View.MemoryView":770 * have_step = index.step is not None * * slice_memviewslice( # <<<<<<<<<<<<<< * p_dst, p_src.shape[dim], p_src.strides[dim], p_src.suboffsets[dim], * dim, new_ndim, p_suboffset_dim, */ - __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 768, __pyx_L1_error) + __pyx_t_11 = __pyx_memoryview_slice_memviewslice(__pyx_v_p_dst, (__pyx_v_p_src->shape[__pyx_v_dim]), (__pyx_v_p_src->strides[__pyx_v_dim]), (__pyx_v_p_src->suboffsets[__pyx_v_dim]), __pyx_v_dim, __pyx_v_new_ndim, __pyx_v_p_suboffset_dim, __pyx_v_start, __pyx_v_stop, __pyx_v_step, __pyx_v_have_start, __pyx_v_have_stop, __pyx_v_have_step, 1); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(2, 770, __pyx_L1_error) - /* "View.MemoryView":774 + /* "View.MemoryView":776 * have_start, have_stop, have_step, * True) * new_ndim += 1 # <<<<<<<<<<<<<< @@ -13082,7 +12063,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ } __pyx_L6:; - /* "View.MemoryView":746 + /* "View.MemoryView":748 * cdef bint have_start, have_stop, have_step * * for dim, index in enumerate(indices): # <<<<<<<<<<<<<< @@ -13092,7 +12073,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ } __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":776 + /* "View.MemoryView":778 * new_ndim += 1 * * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -13103,7 +12084,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":777 + /* "View.MemoryView":779 * * if isinstance(memview, _memoryviewslice): * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< @@ -13112,39 +12093,39 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ __Pyx_XDECREF(((PyObject *)__pyx_r)); - /* "View.MemoryView":778 + /* "View.MemoryView":780 * if isinstance(memview, _memoryviewslice): * return memoryview_fromslice(dst, new_ndim, * memviewsliceobj.to_object_func, # <<<<<<<<<<<<<< * memviewsliceobj.to_dtype_func, * memview.dtype_is_object) */ - if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 778, __pyx_L1_error) } + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 780, __pyx_L1_error) } - /* "View.MemoryView":779 + /* "View.MemoryView":781 * return memoryview_fromslice(dst, new_ndim, * memviewsliceobj.to_object_func, * memviewsliceobj.to_dtype_func, # <<<<<<<<<<<<<< * memview.dtype_is_object) * else: */ - if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 779, __pyx_L1_error) } + if (unlikely(!__pyx_v_memviewsliceobj)) { __Pyx_RaiseUnboundLocalError("memviewsliceobj"); __PYX_ERR(2, 781, __pyx_L1_error) } - /* "View.MemoryView":777 + /* "View.MemoryView":779 * * if isinstance(memview, _memoryviewslice): * return memoryview_fromslice(dst, new_ndim, # <<<<<<<<<<<<<< * memviewsliceobj.to_object_func, * memviewsliceobj.to_dtype_func, */ - __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 777, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, __pyx_v_memviewsliceobj->to_object_func, __pyx_v_memviewsliceobj->to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 779, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 777, __pyx_L1_error) + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 779, __pyx_L1_error) __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L0; - /* "View.MemoryView":776 + /* "View.MemoryView":778 * new_ndim += 1 * * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -13153,7 +12134,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ */ } - /* "View.MemoryView":782 + /* "View.MemoryView":784 * memview.dtype_is_object) * else: * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< @@ -13163,30 +12144,30 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ /*else*/ { __Pyx_XDECREF(((PyObject *)__pyx_r)); - /* "View.MemoryView":783 + /* "View.MemoryView":785 * else: * return memoryview_fromslice(dst, new_ndim, NULL, NULL, * memview.dtype_is_object) # <<<<<<<<<<<<<< * * */ - __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 782, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_dst, __pyx_v_new_ndim, NULL, NULL, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 784, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - /* "View.MemoryView":782 + /* "View.MemoryView":784 * memview.dtype_is_object) * else: * return memoryview_fromslice(dst, new_ndim, NULL, NULL, # <<<<<<<<<<<<<< * memview.dtype_is_object) * */ - if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 782, __pyx_L1_error) + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_memoryview_type))))) __PYX_ERR(2, 784, __pyx_L1_error) __pyx_r = ((struct __pyx_memoryview_obj *)__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L0; } - /* "View.MemoryView":710 + /* "View.MemoryView":712 * * @cname('__pyx_memview_slice') * cdef memoryview memview_slice(memoryview memview, object indices): # <<<<<<<<<<<<<< @@ -13208,7 +12189,7 @@ static struct __pyx_memoryview_obj *__pyx_memview_slice(struct __pyx_memoryview_ return __pyx_r; } -/* "View.MemoryView":807 +/* "View.MemoryView":809 * * @cname('__pyx_memoryview_slice_memviewslice') * cdef int slice_memviewslice( # <<<<<<<<<<<<<< @@ -13223,8 +12204,11 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; - /* "View.MemoryView":827 + /* "View.MemoryView":829 * cdef bint negative_step * * if not is_slice: # <<<<<<<<<<<<<< @@ -13234,7 +12218,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_1 = ((!(__pyx_v_is_slice != 0)) != 0); if (__pyx_t_1) { - /* "View.MemoryView":829 + /* "View.MemoryView":831 * if not is_slice: * * if start < 0: # <<<<<<<<<<<<<< @@ -13244,7 +12228,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_1 = ((__pyx_v_start < 0) != 0); if (__pyx_t_1) { - /* "View.MemoryView":830 + /* "View.MemoryView":832 * * if start < 0: * start += shape # <<<<<<<<<<<<<< @@ -13253,7 +12237,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_start = (__pyx_v_start + __pyx_v_shape); - /* "View.MemoryView":829 + /* "View.MemoryView":831 * if not is_slice: * * if start < 0: # <<<<<<<<<<<<<< @@ -13262,7 +12246,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":831 + /* "View.MemoryView":833 * if start < 0: * start += shape * if not 0 <= start < shape: # <<<<<<<<<<<<<< @@ -13276,16 +12260,16 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":832 + /* "View.MemoryView":834 * start += shape * if not 0 <= start < shape: * _err_dim(IndexError, "Index out of bounds (axis %d)", dim) # <<<<<<<<<<<<<< * else: * */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 832, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"Index out of bounds (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 834, __pyx_L1_error) - /* "View.MemoryView":831 + /* "View.MemoryView":833 * if start < 0: * start += shape * if not 0 <= start < shape: # <<<<<<<<<<<<<< @@ -13294,7 +12278,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":827 + /* "View.MemoryView":829 * cdef bint negative_step * * if not is_slice: # <<<<<<<<<<<<<< @@ -13304,7 +12288,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L3; } - /* "View.MemoryView":835 + /* "View.MemoryView":837 * else: * * negative_step = have_step != 0 and step < 0 # <<<<<<<<<<<<<< @@ -13323,7 +12307,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_L6_bool_binop_done:; __pyx_v_negative_step = __pyx_t_2; - /* "View.MemoryView":837 + /* "View.MemoryView":839 * negative_step = have_step != 0 and step < 0 * * if have_step and step == 0: # <<<<<<<<<<<<<< @@ -13341,16 +12325,16 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_L9_bool_binop_done:; if (__pyx_t_2) { - /* "View.MemoryView":838 + /* "View.MemoryView":840 * * if have_step and step == 0: * _err_dim(ValueError, "Step may not be zero (axis %d)", dim) # <<<<<<<<<<<<<< * * */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 838, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Step may not be zero (axis %d)"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 840, __pyx_L1_error) - /* "View.MemoryView":837 + /* "View.MemoryView":839 * negative_step = have_step != 0 and step < 0 * * if have_step and step == 0: # <<<<<<<<<<<<<< @@ -13359,7 +12343,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":841 + /* "View.MemoryView":843 * * * if have_start: # <<<<<<<<<<<<<< @@ -13369,7 +12353,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (__pyx_v_have_start != 0); if (__pyx_t_2) { - /* "View.MemoryView":842 + /* "View.MemoryView":844 * * if have_start: * if start < 0: # <<<<<<<<<<<<<< @@ -13379,7 +12363,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_start < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":843 + /* "View.MemoryView":845 * if have_start: * if start < 0: * start += shape # <<<<<<<<<<<<<< @@ -13388,7 +12372,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_start = (__pyx_v_start + __pyx_v_shape); - /* "View.MemoryView":844 + /* "View.MemoryView":846 * if start < 0: * start += shape * if start < 0: # <<<<<<<<<<<<<< @@ -13398,7 +12382,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_start < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":845 + /* "View.MemoryView":847 * start += shape * if start < 0: * start = 0 # <<<<<<<<<<<<<< @@ -13407,7 +12391,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_start = 0; - /* "View.MemoryView":844 + /* "View.MemoryView":846 * if start < 0: * start += shape * if start < 0: # <<<<<<<<<<<<<< @@ -13416,7 +12400,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":842 + /* "View.MemoryView":844 * * if have_start: * if start < 0: # <<<<<<<<<<<<<< @@ -13426,7 +12410,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L12; } - /* "View.MemoryView":846 + /* "View.MemoryView":848 * if start < 0: * start = 0 * elif start >= shape: # <<<<<<<<<<<<<< @@ -13436,7 +12420,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_start >= __pyx_v_shape) != 0); if (__pyx_t_2) { - /* "View.MemoryView":847 + /* "View.MemoryView":849 * start = 0 * elif start >= shape: * if negative_step: # <<<<<<<<<<<<<< @@ -13446,7 +12430,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (__pyx_v_negative_step != 0); if (__pyx_t_2) { - /* "View.MemoryView":848 + /* "View.MemoryView":850 * elif start >= shape: * if negative_step: * start = shape - 1 # <<<<<<<<<<<<<< @@ -13455,7 +12439,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_start = (__pyx_v_shape - 1); - /* "View.MemoryView":847 + /* "View.MemoryView":849 * start = 0 * elif start >= shape: * if negative_step: # <<<<<<<<<<<<<< @@ -13465,7 +12449,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L14; } - /* "View.MemoryView":850 + /* "View.MemoryView":852 * start = shape - 1 * else: * start = shape # <<<<<<<<<<<<<< @@ -13477,7 +12461,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L14:; - /* "View.MemoryView":846 + /* "View.MemoryView":848 * if start < 0: * start = 0 * elif start >= shape: # <<<<<<<<<<<<<< @@ -13487,7 +12471,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L12:; - /* "View.MemoryView":841 + /* "View.MemoryView":843 * * * if have_start: # <<<<<<<<<<<<<< @@ -13497,7 +12481,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L11; } - /* "View.MemoryView":852 + /* "View.MemoryView":854 * start = shape * else: * if negative_step: # <<<<<<<<<<<<<< @@ -13508,7 +12492,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (__pyx_v_negative_step != 0); if (__pyx_t_2) { - /* "View.MemoryView":853 + /* "View.MemoryView":855 * else: * if negative_step: * start = shape - 1 # <<<<<<<<<<<<<< @@ -13517,7 +12501,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_start = (__pyx_v_shape - 1); - /* "View.MemoryView":852 + /* "View.MemoryView":854 * start = shape * else: * if negative_step: # <<<<<<<<<<<<<< @@ -13527,7 +12511,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L15; } - /* "View.MemoryView":855 + /* "View.MemoryView":857 * start = shape - 1 * else: * start = 0 # <<<<<<<<<<<<<< @@ -13541,7 +12525,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L11:; - /* "View.MemoryView":857 + /* "View.MemoryView":859 * start = 0 * * if have_stop: # <<<<<<<<<<<<<< @@ -13551,7 +12535,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (__pyx_v_have_stop != 0); if (__pyx_t_2) { - /* "View.MemoryView":858 + /* "View.MemoryView":860 * * if have_stop: * if stop < 0: # <<<<<<<<<<<<<< @@ -13561,7 +12545,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_stop < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":859 + /* "View.MemoryView":861 * if have_stop: * if stop < 0: * stop += shape # <<<<<<<<<<<<<< @@ -13570,7 +12554,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_stop = (__pyx_v_stop + __pyx_v_shape); - /* "View.MemoryView":860 + /* "View.MemoryView":862 * if stop < 0: * stop += shape * if stop < 0: # <<<<<<<<<<<<<< @@ -13580,7 +12564,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_stop < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":861 + /* "View.MemoryView":863 * stop += shape * if stop < 0: * stop = 0 # <<<<<<<<<<<<<< @@ -13589,7 +12573,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_stop = 0; - /* "View.MemoryView":860 + /* "View.MemoryView":862 * if stop < 0: * stop += shape * if stop < 0: # <<<<<<<<<<<<<< @@ -13598,7 +12582,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":858 + /* "View.MemoryView":860 * * if have_stop: * if stop < 0: # <<<<<<<<<<<<<< @@ -13608,7 +12592,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L17; } - /* "View.MemoryView":862 + /* "View.MemoryView":864 * if stop < 0: * stop = 0 * elif stop > shape: # <<<<<<<<<<<<<< @@ -13618,7 +12602,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_stop > __pyx_v_shape) != 0); if (__pyx_t_2) { - /* "View.MemoryView":863 + /* "View.MemoryView":865 * stop = 0 * elif stop > shape: * stop = shape # <<<<<<<<<<<<<< @@ -13627,7 +12611,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_stop = __pyx_v_shape; - /* "View.MemoryView":862 + /* "View.MemoryView":864 * if stop < 0: * stop = 0 * elif stop > shape: # <<<<<<<<<<<<<< @@ -13637,7 +12621,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L17:; - /* "View.MemoryView":857 + /* "View.MemoryView":859 * start = 0 * * if have_stop: # <<<<<<<<<<<<<< @@ -13647,7 +12631,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L16; } - /* "View.MemoryView":865 + /* "View.MemoryView":867 * stop = shape * else: * if negative_step: # <<<<<<<<<<<<<< @@ -13658,7 +12642,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (__pyx_v_negative_step != 0); if (__pyx_t_2) { - /* "View.MemoryView":866 + /* "View.MemoryView":868 * else: * if negative_step: * stop = -1 # <<<<<<<<<<<<<< @@ -13667,7 +12651,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_stop = -1L; - /* "View.MemoryView":865 + /* "View.MemoryView":867 * stop = shape * else: * if negative_step: # <<<<<<<<<<<<<< @@ -13677,7 +12661,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L19; } - /* "View.MemoryView":868 + /* "View.MemoryView":870 * stop = -1 * else: * stop = shape # <<<<<<<<<<<<<< @@ -13691,7 +12675,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L16:; - /* "View.MemoryView":870 + /* "View.MemoryView":872 * stop = shape * * if not have_step: # <<<<<<<<<<<<<< @@ -13701,7 +12685,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((!(__pyx_v_have_step != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":871 + /* "View.MemoryView":873 * * if not have_step: * step = 1 # <<<<<<<<<<<<<< @@ -13710,7 +12694,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_step = 1; - /* "View.MemoryView":870 + /* "View.MemoryView":872 * stop = shape * * if not have_step: # <<<<<<<<<<<<<< @@ -13719,7 +12703,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":875 + /* "View.MemoryView":877 * * with cython.cdivision(True): * new_shape = (stop - start) // step # <<<<<<<<<<<<<< @@ -13728,7 +12712,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_new_shape = ((__pyx_v_stop - __pyx_v_start) / __pyx_v_step); - /* "View.MemoryView":877 + /* "View.MemoryView":879 * new_shape = (stop - start) // step * * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< @@ -13738,7 +12722,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (((__pyx_v_stop - __pyx_v_start) - (__pyx_v_step * __pyx_v_new_shape)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":878 + /* "View.MemoryView":880 * * if (stop - start) - step * new_shape: * new_shape += 1 # <<<<<<<<<<<<<< @@ -13747,7 +12731,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_new_shape = (__pyx_v_new_shape + 1); - /* "View.MemoryView":877 + /* "View.MemoryView":879 * new_shape = (stop - start) // step * * if (stop - start) - step * new_shape: # <<<<<<<<<<<<<< @@ -13756,7 +12740,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":880 + /* "View.MemoryView":882 * new_shape += 1 * * if new_shape < 0: # <<<<<<<<<<<<<< @@ -13766,7 +12750,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_new_shape < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":881 + /* "View.MemoryView":883 * * if new_shape < 0: * new_shape = 0 # <<<<<<<<<<<<<< @@ -13775,7 +12759,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_new_shape = 0; - /* "View.MemoryView":880 + /* "View.MemoryView":882 * new_shape += 1 * * if new_shape < 0: # <<<<<<<<<<<<<< @@ -13784,7 +12768,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":884 + /* "View.MemoryView":886 * * * dst.strides[new_ndim] = stride * step # <<<<<<<<<<<<<< @@ -13793,7 +12777,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ (__pyx_v_dst->strides[__pyx_v_new_ndim]) = (__pyx_v_stride * __pyx_v_step); - /* "View.MemoryView":885 + /* "View.MemoryView":887 * * dst.strides[new_ndim] = stride * step * dst.shape[new_ndim] = new_shape # <<<<<<<<<<<<<< @@ -13802,7 +12786,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ (__pyx_v_dst->shape[__pyx_v_new_ndim]) = __pyx_v_new_shape; - /* "View.MemoryView":886 + /* "View.MemoryView":888 * dst.strides[new_ndim] = stride * step * dst.shape[new_ndim] = new_shape * dst.suboffsets[new_ndim] = suboffset # <<<<<<<<<<<<<< @@ -13813,7 +12797,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L3:; - /* "View.MemoryView":889 + /* "View.MemoryView":891 * * * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< @@ -13823,7 +12807,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = (((__pyx_v_suboffset_dim[0]) < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":890 + /* "View.MemoryView":892 * * if suboffset_dim[0] < 0: * dst.data += start * stride # <<<<<<<<<<<<<< @@ -13832,7 +12816,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_dst->data = (__pyx_v_dst->data + (__pyx_v_start * __pyx_v_stride)); - /* "View.MemoryView":889 + /* "View.MemoryView":891 * * * if suboffset_dim[0] < 0: # <<<<<<<<<<<<<< @@ -13842,7 +12826,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L23; } - /* "View.MemoryView":892 + /* "View.MemoryView":894 * dst.data += start * stride * else: * dst.suboffsets[suboffset_dim[0]] += start * stride # <<<<<<<<<<<<<< @@ -13855,7 +12839,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L23:; - /* "View.MemoryView":894 + /* "View.MemoryView":896 * dst.suboffsets[suboffset_dim[0]] += start * stride * * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -13865,7 +12849,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":895 + /* "View.MemoryView":897 * * if suboffset >= 0: * if not is_slice: # <<<<<<<<<<<<<< @@ -13875,7 +12859,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((!(__pyx_v_is_slice != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":896 + /* "View.MemoryView":898 * if suboffset >= 0: * if not is_slice: * if new_ndim == 0: # <<<<<<<<<<<<<< @@ -13885,7 +12869,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_t_2 = ((__pyx_v_new_ndim == 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":897 + /* "View.MemoryView":899 * if not is_slice: * if new_ndim == 0: * dst.data = ( dst.data)[0] + suboffset # <<<<<<<<<<<<<< @@ -13894,7 +12878,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ __pyx_v_dst->data = ((((char **)__pyx_v_dst->data)[0]) + __pyx_v_suboffset); - /* "View.MemoryView":896 + /* "View.MemoryView":898 * if suboffset >= 0: * if not is_slice: * if new_ndim == 0: # <<<<<<<<<<<<<< @@ -13904,7 +12888,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L26; } - /* "View.MemoryView":899 + /* "View.MemoryView":901 * dst.data = ( dst.data)[0] + suboffset * else: * _err_dim(IndexError, "All dimensions preceding dimension %d " # <<<<<<<<<<<<<< @@ -13913,18 +12897,18 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ /*else*/ { - /* "View.MemoryView":900 + /* "View.MemoryView":902 * else: * _err_dim(IndexError, "All dimensions preceding dimension %d " * "must be indexed and not sliced", dim) # <<<<<<<<<<<<<< * else: * suboffset_dim[0] = new_ndim */ - __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 899, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_err_dim(__pyx_builtin_IndexError, ((char *)"All dimensions preceding dimension %d must be indexed and not sliced"), __pyx_v_dim); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 901, __pyx_L1_error) } __pyx_L26:; - /* "View.MemoryView":895 + /* "View.MemoryView":897 * * if suboffset >= 0: * if not is_slice: # <<<<<<<<<<<<<< @@ -13934,7 +12918,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, goto __pyx_L25; } - /* "View.MemoryView":902 + /* "View.MemoryView":904 * "must be indexed and not sliced", dim) * else: * suboffset_dim[0] = new_ndim # <<<<<<<<<<<<<< @@ -13946,7 +12930,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, } __pyx_L25:; - /* "View.MemoryView":894 + /* "View.MemoryView":896 * dst.suboffsets[suboffset_dim[0]] += start * stride * * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -13955,7 +12939,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, */ } - /* "View.MemoryView":904 + /* "View.MemoryView":906 * suboffset_dim[0] = new_ndim * * return 0 # <<<<<<<<<<<<<< @@ -13965,7 +12949,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, __pyx_r = 0; goto __pyx_L0; - /* "View.MemoryView":807 + /* "View.MemoryView":809 * * @cname('__pyx_memoryview_slice_memviewslice') * cdef int slice_memviewslice( # <<<<<<<<<<<<<< @@ -13989,7 +12973,7 @@ static int __pyx_memoryview_slice_memviewslice(__Pyx_memviewslice *__pyx_v_dst, return __pyx_r; } -/* "View.MemoryView":910 +/* "View.MemoryView":912 * * @cname('__pyx_pybuffer_index') * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< @@ -14009,9 +12993,12 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P int __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("pybuffer_index", 0); - /* "View.MemoryView":912 + /* "View.MemoryView":914 * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, * Py_ssize_t dim) except NULL: * cdef Py_ssize_t shape, stride, suboffset = -1 # <<<<<<<<<<<<<< @@ -14020,7 +13007,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_suboffset = -1L; - /* "View.MemoryView":913 + /* "View.MemoryView":915 * Py_ssize_t dim) except NULL: * cdef Py_ssize_t shape, stride, suboffset = -1 * cdef Py_ssize_t itemsize = view.itemsize # <<<<<<<<<<<<<< @@ -14030,7 +13017,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_1 = __pyx_v_view->itemsize; __pyx_v_itemsize = __pyx_t_1; - /* "View.MemoryView":916 + /* "View.MemoryView":918 * cdef char *resultp * * if view.ndim == 0: # <<<<<<<<<<<<<< @@ -14040,7 +13027,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_2 = ((__pyx_v_view->ndim == 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":917 + /* "View.MemoryView":919 * * if view.ndim == 0: * shape = view.len / itemsize # <<<<<<<<<<<<<< @@ -14049,15 +13036,15 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ if (unlikely(__pyx_v_itemsize == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(2, 917, __pyx_L1_error) + __PYX_ERR(2, 919, __pyx_L1_error) } else if (sizeof(Py_ssize_t) == sizeof(long) && (!(((Py_ssize_t)-1) > 0)) && unlikely(__pyx_v_itemsize == (Py_ssize_t)-1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(__pyx_v_view->len))) { PyErr_SetString(PyExc_OverflowError, "value too large to perform division"); - __PYX_ERR(2, 917, __pyx_L1_error) + __PYX_ERR(2, 919, __pyx_L1_error) } __pyx_v_shape = __Pyx_div_Py_ssize_t(__pyx_v_view->len, __pyx_v_itemsize); - /* "View.MemoryView":918 + /* "View.MemoryView":920 * if view.ndim == 0: * shape = view.len / itemsize * stride = itemsize # <<<<<<<<<<<<<< @@ -14066,7 +13053,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_stride = __pyx_v_itemsize; - /* "View.MemoryView":916 + /* "View.MemoryView":918 * cdef char *resultp * * if view.ndim == 0: # <<<<<<<<<<<<<< @@ -14076,7 +13063,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P goto __pyx_L3; } - /* "View.MemoryView":920 + /* "View.MemoryView":922 * stride = itemsize * else: * shape = view.shape[dim] # <<<<<<<<<<<<<< @@ -14086,7 +13073,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P /*else*/ { __pyx_v_shape = (__pyx_v_view->shape[__pyx_v_dim]); - /* "View.MemoryView":921 + /* "View.MemoryView":923 * else: * shape = view.shape[dim] * stride = view.strides[dim] # <<<<<<<<<<<<<< @@ -14095,7 +13082,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_stride = (__pyx_v_view->strides[__pyx_v_dim]); - /* "View.MemoryView":922 + /* "View.MemoryView":924 * shape = view.shape[dim] * stride = view.strides[dim] * if view.suboffsets != NULL: # <<<<<<<<<<<<<< @@ -14105,7 +13092,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_2 = ((__pyx_v_view->suboffsets != NULL) != 0); if (__pyx_t_2) { - /* "View.MemoryView":923 + /* "View.MemoryView":925 * stride = view.strides[dim] * if view.suboffsets != NULL: * suboffset = view.suboffsets[dim] # <<<<<<<<<<<<<< @@ -14114,7 +13101,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_suboffset = (__pyx_v_view->suboffsets[__pyx_v_dim]); - /* "View.MemoryView":922 + /* "View.MemoryView":924 * shape = view.shape[dim] * stride = view.strides[dim] * if view.suboffsets != NULL: # <<<<<<<<<<<<<< @@ -14125,7 +13112,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P } __pyx_L3:; - /* "View.MemoryView":925 + /* "View.MemoryView":927 * suboffset = view.suboffsets[dim] * * if index < 0: # <<<<<<<<<<<<<< @@ -14135,7 +13122,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_2 = ((__pyx_v_index < 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":926 + /* "View.MemoryView":928 * * if index < 0: * index += view.shape[dim] # <<<<<<<<<<<<<< @@ -14144,7 +13131,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_index = (__pyx_v_index + (__pyx_v_view->shape[__pyx_v_dim])); - /* "View.MemoryView":927 + /* "View.MemoryView":929 * if index < 0: * index += view.shape[dim] * if index < 0: # <<<<<<<<<<<<<< @@ -14154,26 +13141,26 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_2 = ((__pyx_v_index < 0) != 0); if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":928 + /* "View.MemoryView":930 * index += view.shape[dim] * if index < 0: * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< * * if index >= shape: */ - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 928, __pyx_L1_error) + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 930, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 928, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 930, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 928, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 930, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 928, __pyx_L1_error) + __PYX_ERR(2, 930, __pyx_L1_error) - /* "View.MemoryView":927 + /* "View.MemoryView":929 * if index < 0: * index += view.shape[dim] * if index < 0: # <<<<<<<<<<<<<< @@ -14182,7 +13169,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ } - /* "View.MemoryView":925 + /* "View.MemoryView":927 * suboffset = view.suboffsets[dim] * * if index < 0: # <<<<<<<<<<<<<< @@ -14191,7 +13178,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ } - /* "View.MemoryView":930 + /* "View.MemoryView":932 * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * * if index >= shape: # <<<<<<<<<<<<<< @@ -14201,26 +13188,26 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_2 = ((__pyx_v_index >= __pyx_v_shape) != 0); if (unlikely(__pyx_t_2)) { - /* "View.MemoryView":931 + /* "View.MemoryView":933 * * if index >= shape: * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) # <<<<<<<<<<<<<< * * resultp = bufp + index * stride */ - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 931, __pyx_L1_error) + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 933, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 931, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 933, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 931, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_IndexError, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 933, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __PYX_ERR(2, 931, __pyx_L1_error) + __PYX_ERR(2, 933, __pyx_L1_error) - /* "View.MemoryView":930 + /* "View.MemoryView":932 * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * * if index >= shape: # <<<<<<<<<<<<<< @@ -14229,7 +13216,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ } - /* "View.MemoryView":933 + /* "View.MemoryView":935 * raise IndexError("Out of bounds on buffer access (axis %d)" % dim) * * resultp = bufp + index * stride # <<<<<<<<<<<<<< @@ -14238,7 +13225,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_resultp = (__pyx_v_bufp + (__pyx_v_index * __pyx_v_stride)); - /* "View.MemoryView":934 + /* "View.MemoryView":936 * * resultp = bufp + index * stride * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -14248,7 +13235,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_t_2 = ((__pyx_v_suboffset >= 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":935 + /* "View.MemoryView":937 * resultp = bufp + index * stride * if suboffset >= 0: * resultp = ( resultp)[0] + suboffset # <<<<<<<<<<<<<< @@ -14257,7 +13244,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ __pyx_v_resultp = ((((char **)__pyx_v_resultp)[0]) + __pyx_v_suboffset); - /* "View.MemoryView":934 + /* "View.MemoryView":936 * * resultp = bufp + index * stride * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -14266,7 +13253,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P */ } - /* "View.MemoryView":937 + /* "View.MemoryView":939 * resultp = ( resultp)[0] + suboffset * * return resultp # <<<<<<<<<<<<<< @@ -14276,7 +13263,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P __pyx_r = __pyx_v_resultp; goto __pyx_L0; - /* "View.MemoryView":910 + /* "View.MemoryView":912 * * @cname('__pyx_pybuffer_index') * cdef char *pybuffer_index(Py_buffer *view, char *bufp, Py_ssize_t index, # <<<<<<<<<<<<<< @@ -14295,7 +13282,7 @@ static char *__pyx_pybuffer_index(Py_buffer *__pyx_v_view, char *__pyx_v_bufp, P return __pyx_r; } -/* "View.MemoryView":943 +/* "View.MemoryView":945 * * @cname('__pyx_memslice_transpose') * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< @@ -14319,8 +13306,11 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; - /* "View.MemoryView":944 + /* "View.MemoryView":946 * @cname('__pyx_memslice_transpose') * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: * cdef int ndim = memslice.memview.view.ndim # <<<<<<<<<<<<<< @@ -14330,7 +13320,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { __pyx_t_1 = __pyx_v_memslice->memview->view.ndim; __pyx_v_ndim = __pyx_t_1; - /* "View.MemoryView":946 + /* "View.MemoryView":948 * cdef int ndim = memslice.memview.view.ndim * * cdef Py_ssize_t *shape = memslice.shape # <<<<<<<<<<<<<< @@ -14340,7 +13330,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { __pyx_t_2 = __pyx_v_memslice->shape; __pyx_v_shape = __pyx_t_2; - /* "View.MemoryView":947 + /* "View.MemoryView":949 * * cdef Py_ssize_t *shape = memslice.shape * cdef Py_ssize_t *strides = memslice.strides # <<<<<<<<<<<<<< @@ -14350,7 +13340,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { __pyx_t_2 = __pyx_v_memslice->strides; __pyx_v_strides = __pyx_t_2; - /* "View.MemoryView":951 + /* "View.MemoryView":953 * * cdef int i, j * for i in range(ndim / 2): # <<<<<<<<<<<<<< @@ -14362,7 +13352,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) { __pyx_v_i = __pyx_t_1; - /* "View.MemoryView":952 + /* "View.MemoryView":954 * cdef int i, j * for i in range(ndim / 2): * j = ndim - 1 - i # <<<<<<<<<<<<<< @@ -14371,7 +13361,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { */ __pyx_v_j = ((__pyx_v_ndim - 1) - __pyx_v_i); - /* "View.MemoryView":953 + /* "View.MemoryView":955 * for i in range(ndim / 2): * j = ndim - 1 - i * strides[i], strides[j] = strides[j], strides[i] # <<<<<<<<<<<<<< @@ -14383,7 +13373,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { (__pyx_v_strides[__pyx_v_i]) = __pyx_t_5; (__pyx_v_strides[__pyx_v_j]) = __pyx_t_6; - /* "View.MemoryView":954 + /* "View.MemoryView":956 * j = ndim - 1 - i * strides[i], strides[j] = strides[j], strides[i] * shape[i], shape[j] = shape[j], shape[i] # <<<<<<<<<<<<<< @@ -14395,7 +13385,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { (__pyx_v_shape[__pyx_v_i]) = __pyx_t_6; (__pyx_v_shape[__pyx_v_j]) = __pyx_t_5; - /* "View.MemoryView":956 + /* "View.MemoryView":958 * shape[i], shape[j] = shape[j], shape[i] * * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< @@ -14413,16 +13403,16 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { __pyx_L6_bool_binop_done:; if (__pyx_t_7) { - /* "View.MemoryView":957 + /* "View.MemoryView":959 * * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") # <<<<<<<<<<<<<< * * return 1 */ - __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 957, __pyx_L1_error) + __pyx_t_9 = __pyx_memoryview_err(__pyx_builtin_ValueError, ((char *)"Cannot transpose memoryview with indirect dimensions")); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(2, 959, __pyx_L1_error) - /* "View.MemoryView":956 + /* "View.MemoryView":958 * shape[i], shape[j] = shape[j], shape[i] * * if memslice.suboffsets[i] >= 0 or memslice.suboffsets[j] >= 0: # <<<<<<<<<<<<<< @@ -14432,7 +13422,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { } } - /* "View.MemoryView":959 + /* "View.MemoryView":961 * _err(ValueError, "Cannot transpose memoryview with indirect dimensions") * * return 1 # <<<<<<<<<<<<<< @@ -14442,7 +13432,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { __pyx_r = 1; goto __pyx_L0; - /* "View.MemoryView":943 + /* "View.MemoryView":945 * * @cname('__pyx_memslice_transpose') * cdef int transpose_memslice(__Pyx_memviewslice *memslice) nogil except 0: # <<<<<<<<<<<<<< @@ -14466,7 +13456,7 @@ static int __pyx_memslice_transpose(__Pyx_memviewslice *__pyx_v_memslice) { return __pyx_r; } -/* "View.MemoryView":976 +/* "View.MemoryView":978 * cdef int (*to_dtype_func)(char *, object) except 0 * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -14489,7 +13479,7 @@ static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewsl __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__dealloc__", 0); - /* "View.MemoryView":977 + /* "View.MemoryView":979 * * def __dealloc__(self): * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) # <<<<<<<<<<<<<< @@ -14498,7 +13488,7 @@ static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewsl */ __PYX_XDEC_MEMVIEW((&__pyx_v_self->from_slice), 1); - /* "View.MemoryView":976 + /* "View.MemoryView":978 * cdef int (*to_dtype_func)(char *, object) except 0 * * def __dealloc__(self): # <<<<<<<<<<<<<< @@ -14510,7 +13500,7 @@ static void __pyx_memoryviewslice___pyx_pf_15View_dot_MemoryView_16_memoryviewsl __Pyx_RefNannyFinishContext(); } -/* "View.MemoryView":979 +/* "View.MemoryView":981 * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) * * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< @@ -14523,9 +13513,12 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor __Pyx_RefNannyDeclarations int __pyx_t_1; PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("convert_item_to_object", 0); - /* "View.MemoryView":980 + /* "View.MemoryView":982 * * cdef convert_item_to_object(self, char *itemp): * if self.to_object_func != NULL: # <<<<<<<<<<<<<< @@ -14535,7 +13528,7 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor __pyx_t_1 = ((__pyx_v_self->to_object_func != NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":981 + /* "View.MemoryView":983 * cdef convert_item_to_object(self, char *itemp): * if self.to_object_func != NULL: * return self.to_object_func(itemp) # <<<<<<<<<<<<<< @@ -14543,13 +13536,13 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor * return memoryview.convert_item_to_object(self, itemp) */ __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 981, __pyx_L1_error) + __pyx_t_2 = __pyx_v_self->to_object_func(__pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 983, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; - /* "View.MemoryView":980 + /* "View.MemoryView":982 * * cdef convert_item_to_object(self, char *itemp): * if self.to_object_func != NULL: # <<<<<<<<<<<<<< @@ -14558,7 +13551,7 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor */ } - /* "View.MemoryView":983 + /* "View.MemoryView":985 * return self.to_object_func(itemp) * else: * return memoryview.convert_item_to_object(self, itemp) # <<<<<<<<<<<<<< @@ -14567,14 +13560,14 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor */ /*else*/ { __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 983, __pyx_L1_error) + __pyx_t_2 = __pyx_memoryview_convert_item_to_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 985, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0; } - /* "View.MemoryView":979 + /* "View.MemoryView":981 * __PYX_XDEC_MEMVIEW(&self.from_slice, 1) * * cdef convert_item_to_object(self, char *itemp): # <<<<<<<<<<<<<< @@ -14593,7 +13586,7 @@ static PyObject *__pyx_memoryviewslice_convert_item_to_object(struct __pyx_memor return __pyx_r; } -/* "View.MemoryView":985 +/* "View.MemoryView":987 * return memoryview.convert_item_to_object(self, itemp) * * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< @@ -14607,9 +13600,12 @@ static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memo int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("assign_item_from_object", 0); - /* "View.MemoryView":986 + /* "View.MemoryView":988 * * cdef assign_item_from_object(self, char *itemp, object value): * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< @@ -14619,16 +13615,16 @@ static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memo __pyx_t_1 = ((__pyx_v_self->to_dtype_func != NULL) != 0); if (__pyx_t_1) { - /* "View.MemoryView":987 + /* "View.MemoryView":989 * cdef assign_item_from_object(self, char *itemp, object value): * if self.to_dtype_func != NULL: * self.to_dtype_func(itemp, value) # <<<<<<<<<<<<<< * else: * memoryview.assign_item_from_object(self, itemp, value) */ - __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 987, __pyx_L1_error) + __pyx_t_2 = __pyx_v_self->to_dtype_func(__pyx_v_itemp, __pyx_v_value); if (unlikely(__pyx_t_2 == ((int)0))) __PYX_ERR(2, 989, __pyx_L1_error) - /* "View.MemoryView":986 + /* "View.MemoryView":988 * * cdef assign_item_from_object(self, char *itemp, object value): * if self.to_dtype_func != NULL: # <<<<<<<<<<<<<< @@ -14638,7 +13634,7 @@ static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memo goto __pyx_L3; } - /* "View.MemoryView":989 + /* "View.MemoryView":991 * self.to_dtype_func(itemp, value) * else: * memoryview.assign_item_from_object(self, itemp, value) # <<<<<<<<<<<<<< @@ -14646,13 +13642,13 @@ static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memo * @property */ /*else*/ { - __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 989, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_assign_item_from_object(((struct __pyx_memoryview_obj *)__pyx_v_self), __pyx_v_itemp, __pyx_v_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 991, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } __pyx_L3:; - /* "View.MemoryView":985 + /* "View.MemoryView":987 * return memoryview.convert_item_to_object(self, itemp) * * cdef assign_item_from_object(self, char *itemp, object value): # <<<<<<<<<<<<<< @@ -14673,7 +13669,7 @@ static PyObject *__pyx_memoryviewslice_assign_item_from_object(struct __pyx_memo return __pyx_r; } -/* "View.MemoryView":992 +/* "View.MemoryView":994 * * @property * def base(self): # <<<<<<<<<<<<<< @@ -14699,7 +13695,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__ __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__get__", 0); - /* "View.MemoryView":993 + /* "View.MemoryView":995 * @property * def base(self): * return self.from_object # <<<<<<<<<<<<<< @@ -14711,7 +13707,7 @@ static PyObject *__pyx_pf_15View_dot_MemoryView_16_memoryviewslice_4base___get__ __pyx_r = __pyx_v_self->from_object; goto __pyx_L0; - /* "View.MemoryView":992 + /* "View.MemoryView":994 * * @property * def base(self): # <<<<<<<<<<<<<< @@ -14749,6 +13745,9 @@ static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce_cython__", 0); /* "(tree fragment)":2 @@ -14757,7 +13756,7 @@ static PyObject *__pyx_pf___pyx_memoryviewslice___reduce_cython__(CYTHON_UNUSED * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -14803,6 +13802,9 @@ static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUS PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__setstate_cython__", 0); /* "(tree fragment)":4 @@ -14810,7 +13812,7 @@ static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUS * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; @@ -14833,7 +13835,7 @@ static PyObject *__pyx_pf___pyx_memoryviewslice_2__setstate_cython__(CYTHON_UNUS return __pyx_r; } -/* "View.MemoryView":999 +/* "View.MemoryView":1001 * * @cname('__pyx_memoryview_fromslice') * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< @@ -14856,9 +13858,12 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl Py_ssize_t *__pyx_t_7; Py_ssize_t *__pyx_t_8; Py_ssize_t __pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("memoryview_fromslice", 0); - /* "View.MemoryView":1007 + /* "View.MemoryView":1009 * cdef _memoryviewslice result * * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< @@ -14868,7 +13873,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_1 = ((((PyObject *)__pyx_v_memviewslice.memview) == Py_None) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1008 + /* "View.MemoryView":1010 * * if memviewslice.memview == Py_None: * return None # <<<<<<<<<<<<<< @@ -14879,7 +13884,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; - /* "View.MemoryView":1007 + /* "View.MemoryView":1009 * cdef _memoryviewslice result * * if memviewslice.memview == Py_None: # <<<<<<<<<<<<<< @@ -14888,16 +13893,16 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ } - /* "View.MemoryView":1013 + /* "View.MemoryView":1015 * * * result = _memoryviewslice(None, 0, dtype_is_object) # <<<<<<<<<<<<<< * * result.from_slice = memviewslice */ - __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_dtype_is_object); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1015, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1013, __pyx_L1_error) + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1015, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); @@ -14908,13 +13913,13 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1013, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_memoryviewslice_type), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1015, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_result = ((struct __pyx_memoryviewslice_obj *)__pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":1015 + /* "View.MemoryView":1017 * result = _memoryviewslice(None, 0, dtype_is_object) * * result.from_slice = memviewslice # <<<<<<<<<<<<<< @@ -14923,7 +13928,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->from_slice = __pyx_v_memviewslice; - /* "View.MemoryView":1016 + /* "View.MemoryView":1018 * * result.from_slice = memviewslice * __PYX_INC_MEMVIEW(&memviewslice, 1) # <<<<<<<<<<<<<< @@ -14932,14 +13937,14 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __PYX_INC_MEMVIEW((&__pyx_v_memviewslice), 1); - /* "View.MemoryView":1018 + /* "View.MemoryView":1020 * __PYX_INC_MEMVIEW(&memviewslice, 1) * * result.from_object = ( memviewslice.memview).base # <<<<<<<<<<<<<< * result.typeinfo = memviewslice.memview.typeinfo * */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1018, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_memviewslice.memview), __pyx_n_s_base); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1020, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __Pyx_GOTREF(__pyx_v_result->from_object); @@ -14947,7 +13952,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_v_result->from_object = __pyx_t_2; __pyx_t_2 = 0; - /* "View.MemoryView":1019 + /* "View.MemoryView":1021 * * result.from_object = ( memviewslice.memview).base * result.typeinfo = memviewslice.memview.typeinfo # <<<<<<<<<<<<<< @@ -14957,7 +13962,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_4 = __pyx_v_memviewslice.memview->typeinfo; __pyx_v_result->__pyx_base.typeinfo = __pyx_t_4; - /* "View.MemoryView":1021 + /* "View.MemoryView":1023 * result.typeinfo = memviewslice.memview.typeinfo * * result.view = memviewslice.memview.view # <<<<<<<<<<<<<< @@ -14967,7 +13972,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_5 = __pyx_v_memviewslice.memview->view; __pyx_v_result->__pyx_base.view = __pyx_t_5; - /* "View.MemoryView":1022 + /* "View.MemoryView":1024 * * result.view = memviewslice.memview.view * result.view.buf = memviewslice.data # <<<<<<<<<<<<<< @@ -14976,7 +13981,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.view.buf = ((void *)__pyx_v_memviewslice.data); - /* "View.MemoryView":1023 + /* "View.MemoryView":1025 * result.view = memviewslice.memview.view * result.view.buf = memviewslice.data * result.view.ndim = ndim # <<<<<<<<<<<<<< @@ -14985,7 +13990,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.view.ndim = __pyx_v_ndim; - /* "View.MemoryView":1024 + /* "View.MemoryView":1026 * result.view.buf = memviewslice.data * result.view.ndim = ndim * (<__pyx_buffer *> &result.view).obj = Py_None # <<<<<<<<<<<<<< @@ -14994,7 +13999,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ ((Py_buffer *)(&__pyx_v_result->__pyx_base.view))->obj = Py_None; - /* "View.MemoryView":1025 + /* "View.MemoryView":1027 * result.view.ndim = ndim * (<__pyx_buffer *> &result.view).obj = Py_None * Py_INCREF(Py_None) # <<<<<<<<<<<<<< @@ -15003,7 +14008,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ Py_INCREF(Py_None); - /* "View.MemoryView":1027 + /* "View.MemoryView":1029 * Py_INCREF(Py_None) * * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -15013,7 +14018,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_1 = ((((struct __pyx_memoryview_obj *)__pyx_v_memviewslice.memview)->flags & PyBUF_WRITABLE) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1028 + /* "View.MemoryView":1030 * * if (memviewslice.memview).flags & PyBUF_WRITABLE: * result.flags = PyBUF_RECORDS # <<<<<<<<<<<<<< @@ -15022,7 +14027,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.flags = PyBUF_RECORDS; - /* "View.MemoryView":1027 + /* "View.MemoryView":1029 * Py_INCREF(Py_None) * * if (memviewslice.memview).flags & PyBUF_WRITABLE: # <<<<<<<<<<<<<< @@ -15032,7 +14037,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl goto __pyx_L4; } - /* "View.MemoryView":1030 + /* "View.MemoryView":1032 * result.flags = PyBUF_RECORDS * else: * result.flags = PyBUF_RECORDS_RO # <<<<<<<<<<<<<< @@ -15044,7 +14049,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl } __pyx_L4:; - /* "View.MemoryView":1032 + /* "View.MemoryView":1034 * result.flags = PyBUF_RECORDS_RO * * result.view.shape = result.from_slice.shape # <<<<<<<<<<<<<< @@ -15053,7 +14058,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.view.shape = ((Py_ssize_t *)__pyx_v_result->from_slice.shape); - /* "View.MemoryView":1033 + /* "View.MemoryView":1035 * * result.view.shape = result.from_slice.shape * result.view.strides = result.from_slice.strides # <<<<<<<<<<<<<< @@ -15062,7 +14067,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.view.strides = ((Py_ssize_t *)__pyx_v_result->from_slice.strides); - /* "View.MemoryView":1036 + /* "View.MemoryView":1038 * * * result.view.suboffsets = NULL # <<<<<<<<<<<<<< @@ -15071,7 +14076,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.view.suboffsets = NULL; - /* "View.MemoryView":1037 + /* "View.MemoryView":1039 * * result.view.suboffsets = NULL * for suboffset in result.from_slice.suboffsets[:ndim]: # <<<<<<<<<<<<<< @@ -15083,7 +14088,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_6 = __pyx_t_8; __pyx_v_suboffset = (__pyx_t_6[0]); - /* "View.MemoryView":1038 + /* "View.MemoryView":1040 * result.view.suboffsets = NULL * for suboffset in result.from_slice.suboffsets[:ndim]: * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -15093,7 +14098,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_1 = ((__pyx_v_suboffset >= 0) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1039 + /* "View.MemoryView":1041 * for suboffset in result.from_slice.suboffsets[:ndim]: * if suboffset >= 0: * result.view.suboffsets = result.from_slice.suboffsets # <<<<<<<<<<<<<< @@ -15102,7 +14107,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->__pyx_base.view.suboffsets = ((Py_ssize_t *)__pyx_v_result->from_slice.suboffsets); - /* "View.MemoryView":1040 + /* "View.MemoryView":1042 * if suboffset >= 0: * result.view.suboffsets = result.from_slice.suboffsets * break # <<<<<<<<<<<<<< @@ -15111,7 +14116,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ goto __pyx_L6_break; - /* "View.MemoryView":1038 + /* "View.MemoryView":1040 * result.view.suboffsets = NULL * for suboffset in result.from_slice.suboffsets[:ndim]: * if suboffset >= 0: # <<<<<<<<<<<<<< @@ -15122,7 +14127,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl } __pyx_L6_break:; - /* "View.MemoryView":1042 + /* "View.MemoryView":1044 * break * * result.view.len = result.view.itemsize # <<<<<<<<<<<<<< @@ -15132,7 +14137,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_9 = __pyx_v_result->__pyx_base.view.itemsize; __pyx_v_result->__pyx_base.view.len = __pyx_t_9; - /* "View.MemoryView":1043 + /* "View.MemoryView":1045 * * result.view.len = result.view.itemsize * for length in result.view.shape[:ndim]: # <<<<<<<<<<<<<< @@ -15142,29 +14147,29 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_t_7 = (__pyx_v_result->__pyx_base.view.shape + __pyx_v_ndim); for (__pyx_t_8 = __pyx_v_result->__pyx_base.view.shape; __pyx_t_8 < __pyx_t_7; __pyx_t_8++) { __pyx_t_6 = __pyx_t_8; - __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1043, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_6[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1045, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_XDECREF_SET(__pyx_v_length, __pyx_t_2); __pyx_t_2 = 0; - /* "View.MemoryView":1044 + /* "View.MemoryView":1046 * result.view.len = result.view.itemsize * for length in result.view.shape[:ndim]: * result.view.len *= length # <<<<<<<<<<<<<< * * result.to_object_func = to_object_func */ - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1044, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_result->__pyx_base.view.len); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1046, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1044, __pyx_L1_error) + __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_t_2, __pyx_v_length); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1046, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 1044, __pyx_L1_error) + __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(2, 1046, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_result->__pyx_base.view.len = __pyx_t_9; } - /* "View.MemoryView":1046 + /* "View.MemoryView":1048 * result.view.len *= length * * result.to_object_func = to_object_func # <<<<<<<<<<<<<< @@ -15173,7 +14178,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->to_object_func = __pyx_v_to_object_func; - /* "View.MemoryView":1047 + /* "View.MemoryView":1049 * * result.to_object_func = to_object_func * result.to_dtype_func = to_dtype_func # <<<<<<<<<<<<<< @@ -15182,7 +14187,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl */ __pyx_v_result->to_dtype_func = __pyx_v_to_dtype_func; - /* "View.MemoryView":1049 + /* "View.MemoryView":1051 * result.to_dtype_func = to_dtype_func * * return result # <<<<<<<<<<<<<< @@ -15194,7 +14199,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl __pyx_r = ((PyObject *)__pyx_v_result); goto __pyx_L0; - /* "View.MemoryView":999 + /* "View.MemoryView":1001 * * @cname('__pyx_memoryview_fromslice') * cdef memoryview_fromslice(__Pyx_memviewslice memviewslice, # <<<<<<<<<<<<<< @@ -15216,7 +14221,7 @@ static PyObject *__pyx_memoryview_fromslice(__Pyx_memviewslice __pyx_v_memviewsl return __pyx_r; } -/* "View.MemoryView":1052 +/* "View.MemoryView":1054 * * @cname('__pyx_memoryview_get_slice_from_memoryview') * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< @@ -15231,9 +14236,12 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("get_slice_from_memview", 0); - /* "View.MemoryView":1055 + /* "View.MemoryView":1057 * __Pyx_memviewslice *mslice) except NULL: * cdef _memoryviewslice obj * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -15244,20 +14252,20 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":1056 + /* "View.MemoryView":1058 * cdef _memoryviewslice obj * if isinstance(memview, _memoryviewslice): * obj = memview # <<<<<<<<<<<<<< * return &obj.from_slice * else: */ - if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 1056, __pyx_L1_error) + if (!(likely(((((PyObject *)__pyx_v_memview)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_memview), __pyx_memoryviewslice_type))))) __PYX_ERR(2, 1058, __pyx_L1_error) __pyx_t_3 = ((PyObject *)__pyx_v_memview); __Pyx_INCREF(__pyx_t_3); __pyx_v_obj = ((struct __pyx_memoryviewslice_obj *)__pyx_t_3); __pyx_t_3 = 0; - /* "View.MemoryView":1057 + /* "View.MemoryView":1059 * if isinstance(memview, _memoryviewslice): * obj = memview * return &obj.from_slice # <<<<<<<<<<<<<< @@ -15267,7 +14275,7 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p __pyx_r = (&__pyx_v_obj->from_slice); goto __pyx_L0; - /* "View.MemoryView":1055 + /* "View.MemoryView":1057 * __Pyx_memviewslice *mslice) except NULL: * cdef _memoryviewslice obj * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -15276,7 +14284,7 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p */ } - /* "View.MemoryView":1059 + /* "View.MemoryView":1061 * return &obj.from_slice * else: * slice_copy(memview, mslice) # <<<<<<<<<<<<<< @@ -15286,7 +14294,7 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p /*else*/ { __pyx_memoryview_slice_copy(__pyx_v_memview, __pyx_v_mslice); - /* "View.MemoryView":1060 + /* "View.MemoryView":1062 * else: * slice_copy(memview, mslice) * return mslice # <<<<<<<<<<<<<< @@ -15297,7 +14305,7 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p goto __pyx_L0; } - /* "View.MemoryView":1052 + /* "View.MemoryView":1054 * * @cname('__pyx_memoryview_get_slice_from_memoryview') * cdef __Pyx_memviewslice *get_slice_from_memview(memoryview memview, # <<<<<<<<<<<<<< @@ -15316,7 +14324,7 @@ static __Pyx_memviewslice *__pyx_memoryview_get_slice_from_memoryview(struct __p return __pyx_r; } -/* "View.MemoryView":1063 +/* "View.MemoryView":1065 * * @cname('__pyx_memoryview_slice_copy') * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< @@ -15337,7 +14345,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem Py_ssize_t __pyx_t_5; __Pyx_RefNannySetupContext("slice_copy", 0); - /* "View.MemoryView":1067 + /* "View.MemoryView":1069 * cdef (Py_ssize_t*) shape, strides, suboffsets * * shape = memview.view.shape # <<<<<<<<<<<<<< @@ -15347,7 +14355,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem __pyx_t_1 = __pyx_v_memview->view.shape; __pyx_v_shape = __pyx_t_1; - /* "View.MemoryView":1068 + /* "View.MemoryView":1070 * * shape = memview.view.shape * strides = memview.view.strides # <<<<<<<<<<<<<< @@ -15357,7 +14365,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem __pyx_t_1 = __pyx_v_memview->view.strides; __pyx_v_strides = __pyx_t_1; - /* "View.MemoryView":1069 + /* "View.MemoryView":1071 * shape = memview.view.shape * strides = memview.view.strides * suboffsets = memview.view.suboffsets # <<<<<<<<<<<<<< @@ -15367,7 +14375,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem __pyx_t_1 = __pyx_v_memview->view.suboffsets; __pyx_v_suboffsets = __pyx_t_1; - /* "View.MemoryView":1071 + /* "View.MemoryView":1073 * suboffsets = memview.view.suboffsets * * dst.memview = <__pyx_memoryview *> memview # <<<<<<<<<<<<<< @@ -15376,7 +14384,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem */ __pyx_v_dst->memview = ((struct __pyx_memoryview_obj *)__pyx_v_memview); - /* "View.MemoryView":1072 + /* "View.MemoryView":1074 * * dst.memview = <__pyx_memoryview *> memview * dst.data = memview.view.buf # <<<<<<<<<<<<<< @@ -15385,7 +14393,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem */ __pyx_v_dst->data = ((char *)__pyx_v_memview->view.buf); - /* "View.MemoryView":1074 + /* "View.MemoryView":1076 * dst.data = memview.view.buf * * for dim in range(memview.view.ndim): # <<<<<<<<<<<<<< @@ -15397,7 +14405,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_dim = __pyx_t_4; - /* "View.MemoryView":1075 + /* "View.MemoryView":1077 * * for dim in range(memview.view.ndim): * dst.shape[dim] = shape[dim] # <<<<<<<<<<<<<< @@ -15406,7 +14414,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem */ (__pyx_v_dst->shape[__pyx_v_dim]) = (__pyx_v_shape[__pyx_v_dim]); - /* "View.MemoryView":1076 + /* "View.MemoryView":1078 * for dim in range(memview.view.ndim): * dst.shape[dim] = shape[dim] * dst.strides[dim] = strides[dim] # <<<<<<<<<<<<<< @@ -15415,7 +14423,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem */ (__pyx_v_dst->strides[__pyx_v_dim]) = (__pyx_v_strides[__pyx_v_dim]); - /* "View.MemoryView":1077 + /* "View.MemoryView":1079 * dst.shape[dim] = shape[dim] * dst.strides[dim] = strides[dim] * dst.suboffsets[dim] = suboffsets[dim] if suboffsets else -1 # <<<<<<<<<<<<<< @@ -15430,7 +14438,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem (__pyx_v_dst->suboffsets[__pyx_v_dim]) = __pyx_t_5; } - /* "View.MemoryView":1063 + /* "View.MemoryView":1065 * * @cname('__pyx_memoryview_slice_copy') * cdef void slice_copy(memoryview memview, __Pyx_memviewslice *dst): # <<<<<<<<<<<<<< @@ -15442,7 +14450,7 @@ static void __pyx_memoryview_slice_copy(struct __pyx_memoryview_obj *__pyx_v_mem __Pyx_RefNannyFinishContext(); } -/* "View.MemoryView":1080 +/* "View.MemoryView":1082 * * @cname('__pyx_memoryview_copy_object') * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< @@ -15455,9 +14463,12 @@ static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("memoryview_copy", 0); - /* "View.MemoryView":1083 + /* "View.MemoryView":1085 * "Create a new memoryview object" * cdef __Pyx_memviewslice memviewslice * slice_copy(memview, &memviewslice) # <<<<<<<<<<<<<< @@ -15466,7 +14477,7 @@ static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx */ __pyx_memoryview_slice_copy(__pyx_v_memview, (&__pyx_v_memviewslice)); - /* "View.MemoryView":1084 + /* "View.MemoryView":1086 * cdef __Pyx_memviewslice memviewslice * slice_copy(memview, &memviewslice) * return memoryview_copy_from_slice(memview, &memviewslice) # <<<<<<<<<<<<<< @@ -15474,13 +14485,13 @@ static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx * @cname('__pyx_memoryview_copy_object_from_slice') */ __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1084, __pyx_L1_error) + __pyx_t_1 = __pyx_memoryview_copy_object_from_slice(__pyx_v_memview, (&__pyx_v_memviewslice)); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1086, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; - /* "View.MemoryView":1080 + /* "View.MemoryView":1082 * * @cname('__pyx_memoryview_copy_object') * cdef memoryview_copy(memoryview memview): # <<<<<<<<<<<<<< @@ -15499,7 +14510,7 @@ static PyObject *__pyx_memoryview_copy_object(struct __pyx_memoryview_obj *__pyx return __pyx_r; } -/* "View.MemoryView":1087 +/* "View.MemoryView":1089 * * @cname('__pyx_memoryview_copy_object_from_slice') * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< @@ -15517,9 +14528,12 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview PyObject *(*__pyx_t_3)(char *); int (*__pyx_t_4)(char *, PyObject *); PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("memoryview_copy_from_slice", 0); - /* "View.MemoryView":1094 + /* "View.MemoryView":1096 * cdef int (*to_dtype_func)(char *, object) except 0 * * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -15530,7 +14544,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { - /* "View.MemoryView":1095 + /* "View.MemoryView":1097 * * if isinstance(memview, _memoryviewslice): * to_object_func = (<_memoryviewslice> memview).to_object_func # <<<<<<<<<<<<<< @@ -15540,7 +14554,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview __pyx_t_3 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_object_func; __pyx_v_to_object_func = __pyx_t_3; - /* "View.MemoryView":1096 + /* "View.MemoryView":1098 * if isinstance(memview, _memoryviewslice): * to_object_func = (<_memoryviewslice> memview).to_object_func * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func # <<<<<<<<<<<<<< @@ -15550,7 +14564,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview __pyx_t_4 = ((struct __pyx_memoryviewslice_obj *)__pyx_v_memview)->to_dtype_func; __pyx_v_to_dtype_func = __pyx_t_4; - /* "View.MemoryView":1094 + /* "View.MemoryView":1096 * cdef int (*to_dtype_func)(char *, object) except 0 * * if isinstance(memview, _memoryviewslice): # <<<<<<<<<<<<<< @@ -15560,7 +14574,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview goto __pyx_L3; } - /* "View.MemoryView":1098 + /* "View.MemoryView":1100 * to_dtype_func = (<_memoryviewslice> memview).to_dtype_func * else: * to_object_func = NULL # <<<<<<<<<<<<<< @@ -15570,7 +14584,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview /*else*/ { __pyx_v_to_object_func = NULL; - /* "View.MemoryView":1099 + /* "View.MemoryView":1101 * else: * to_object_func = NULL * to_dtype_func = NULL # <<<<<<<<<<<<<< @@ -15581,7 +14595,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview } __pyx_L3:; - /* "View.MemoryView":1101 + /* "View.MemoryView":1103 * to_dtype_func = NULL * * return memoryview_fromslice(memviewslice[0], memview.view.ndim, # <<<<<<<<<<<<<< @@ -15590,20 +14604,20 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview */ __Pyx_XDECREF(__pyx_r); - /* "View.MemoryView":1103 + /* "View.MemoryView":1105 * return memoryview_fromslice(memviewslice[0], memview.view.ndim, * to_object_func, to_dtype_func, * memview.dtype_is_object) # <<<<<<<<<<<<<< * * */ - __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1101, __pyx_L1_error) + __pyx_t_5 = __pyx_memoryview_fromslice((__pyx_v_memviewslice[0]), __pyx_v_memview->view.ndim, __pyx_v_to_object_func, __pyx_v_to_dtype_func, __pyx_v_memview->dtype_is_object); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 1103, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; - /* "View.MemoryView":1087 + /* "View.MemoryView":1089 * * @cname('__pyx_memoryview_copy_object_from_slice') * cdef memoryview_copy_from_slice(memoryview memview, __Pyx_memviewslice *memviewslice): # <<<<<<<<<<<<<< @@ -15622,7 +14636,7 @@ static PyObject *__pyx_memoryview_copy_object_from_slice(struct __pyx_memoryview return __pyx_r; } -/* "View.MemoryView":1109 +/* "View.MemoryView":1111 * * * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< @@ -15634,7 +14648,7 @@ static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { Py_ssize_t __pyx_r; int __pyx_t_1; - /* "View.MemoryView":1110 + /* "View.MemoryView":1112 * * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: * if arg < 0: # <<<<<<<<<<<<<< @@ -15644,7 +14658,7 @@ static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { __pyx_t_1 = ((__pyx_v_arg < 0) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1111 + /* "View.MemoryView":1113 * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: * if arg < 0: * return -arg # <<<<<<<<<<<<<< @@ -15654,7 +14668,7 @@ static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { __pyx_r = (-__pyx_v_arg); goto __pyx_L0; - /* "View.MemoryView":1110 + /* "View.MemoryView":1112 * * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: * if arg < 0: # <<<<<<<<<<<<<< @@ -15663,7 +14677,7 @@ static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { */ } - /* "View.MemoryView":1113 + /* "View.MemoryView":1115 * return -arg * else: * return arg # <<<<<<<<<<<<<< @@ -15675,7 +14689,7 @@ static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { goto __pyx_L0; } - /* "View.MemoryView":1109 + /* "View.MemoryView":1111 * * * cdef Py_ssize_t abs_py_ssize_t(Py_ssize_t arg) nogil: # <<<<<<<<<<<<<< @@ -15688,7 +14702,7 @@ static Py_ssize_t abs_py_ssize_t(Py_ssize_t __pyx_v_arg) { return __pyx_r; } -/* "View.MemoryView":1116 +/* "View.MemoryView":1118 * * @cname('__pyx_get_best_slice_order') * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< @@ -15706,7 +14720,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ int __pyx_t_3; int __pyx_t_4; - /* "View.MemoryView":1121 + /* "View.MemoryView":1123 * """ * cdef int i * cdef Py_ssize_t c_stride = 0 # <<<<<<<<<<<<<< @@ -15715,7 +14729,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ __pyx_v_c_stride = 0; - /* "View.MemoryView":1122 + /* "View.MemoryView":1124 * cdef int i * cdef Py_ssize_t c_stride = 0 * cdef Py_ssize_t f_stride = 0 # <<<<<<<<<<<<<< @@ -15724,7 +14738,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ __pyx_v_f_stride = 0; - /* "View.MemoryView":1124 + /* "View.MemoryView":1126 * cdef Py_ssize_t f_stride = 0 * * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< @@ -15734,7 +14748,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { __pyx_v_i = __pyx_t_1; - /* "View.MemoryView":1125 + /* "View.MemoryView":1127 * * for i in range(ndim - 1, -1, -1): * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< @@ -15744,7 +14758,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1126 + /* "View.MemoryView":1128 * for i in range(ndim - 1, -1, -1): * if mslice.shape[i] > 1: * c_stride = mslice.strides[i] # <<<<<<<<<<<<<< @@ -15753,7 +14767,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ __pyx_v_c_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - /* "View.MemoryView":1127 + /* "View.MemoryView":1129 * if mslice.shape[i] > 1: * c_stride = mslice.strides[i] * break # <<<<<<<<<<<<<< @@ -15762,7 +14776,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ goto __pyx_L4_break; - /* "View.MemoryView":1125 + /* "View.MemoryView":1127 * * for i in range(ndim - 1, -1, -1): * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< @@ -15773,7 +14787,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ } __pyx_L4_break:; - /* "View.MemoryView":1129 + /* "View.MemoryView":1131 * break * * for i in range(ndim): # <<<<<<<<<<<<<< @@ -15785,7 +14799,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1130 + /* "View.MemoryView":1132 * * for i in range(ndim): * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< @@ -15795,7 +14809,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ __pyx_t_2 = (((__pyx_v_mslice->shape[__pyx_v_i]) > 1) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1131 + /* "View.MemoryView":1133 * for i in range(ndim): * if mslice.shape[i] > 1: * f_stride = mslice.strides[i] # <<<<<<<<<<<<<< @@ -15804,7 +14818,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ __pyx_v_f_stride = (__pyx_v_mslice->strides[__pyx_v_i]); - /* "View.MemoryView":1132 + /* "View.MemoryView":1134 * if mslice.shape[i] > 1: * f_stride = mslice.strides[i] * break # <<<<<<<<<<<<<< @@ -15813,7 +14827,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ goto __pyx_L7_break; - /* "View.MemoryView":1130 + /* "View.MemoryView":1132 * * for i in range(ndim): * if mslice.shape[i] > 1: # <<<<<<<<<<<<<< @@ -15824,7 +14838,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ } __pyx_L7_break:; - /* "View.MemoryView":1134 + /* "View.MemoryView":1136 * break * * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< @@ -15834,7 +14848,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ __pyx_t_2 = ((abs_py_ssize_t(__pyx_v_c_stride) <= abs_py_ssize_t(__pyx_v_f_stride)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1135 + /* "View.MemoryView":1137 * * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): * return 'C' # <<<<<<<<<<<<<< @@ -15844,7 +14858,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ __pyx_r = 'C'; goto __pyx_L0; - /* "View.MemoryView":1134 + /* "View.MemoryView":1136 * break * * if abs_py_ssize_t(c_stride) <= abs_py_ssize_t(f_stride): # <<<<<<<<<<<<<< @@ -15853,7 +14867,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ */ } - /* "View.MemoryView":1137 + /* "View.MemoryView":1139 * return 'C' * else: * return 'F' # <<<<<<<<<<<<<< @@ -15865,7 +14879,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ goto __pyx_L0; } - /* "View.MemoryView":1116 + /* "View.MemoryView":1118 * * @cname('__pyx_get_best_slice_order') * cdef char get_best_order(__Pyx_memviewslice *mslice, int ndim) nogil: # <<<<<<<<<<<<<< @@ -15878,7 +14892,7 @@ static char __pyx_get_best_slice_order(__Pyx_memviewslice *__pyx_v_mslice, int _ return __pyx_r; } -/* "View.MemoryView":1140 +/* "View.MemoryView":1142 * * @cython.cdivision(True) * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< @@ -15899,7 +14913,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v Py_ssize_t __pyx_t_5; Py_ssize_t __pyx_t_6; - /* "View.MemoryView":1147 + /* "View.MemoryView":1149 * * cdef Py_ssize_t i * cdef Py_ssize_t src_extent = src_shape[0] # <<<<<<<<<<<<<< @@ -15908,7 +14922,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ __pyx_v_src_extent = (__pyx_v_src_shape[0]); - /* "View.MemoryView":1148 + /* "View.MemoryView":1150 * cdef Py_ssize_t i * cdef Py_ssize_t src_extent = src_shape[0] * cdef Py_ssize_t dst_extent = dst_shape[0] # <<<<<<<<<<<<<< @@ -15917,7 +14931,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ __pyx_v_dst_extent = (__pyx_v_dst_shape[0]); - /* "View.MemoryView":1149 + /* "View.MemoryView":1151 * cdef Py_ssize_t src_extent = src_shape[0] * cdef Py_ssize_t dst_extent = dst_shape[0] * cdef Py_ssize_t src_stride = src_strides[0] # <<<<<<<<<<<<<< @@ -15926,7 +14940,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ __pyx_v_src_stride = (__pyx_v_src_strides[0]); - /* "View.MemoryView":1150 + /* "View.MemoryView":1152 * cdef Py_ssize_t dst_extent = dst_shape[0] * cdef Py_ssize_t src_stride = src_strides[0] * cdef Py_ssize_t dst_stride = dst_strides[0] # <<<<<<<<<<<<<< @@ -15935,7 +14949,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ __pyx_v_dst_stride = (__pyx_v_dst_strides[0]); - /* "View.MemoryView":1152 + /* "View.MemoryView":1154 * cdef Py_ssize_t dst_stride = dst_strides[0] * * if ndim == 1: # <<<<<<<<<<<<<< @@ -15945,7 +14959,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1153 + /* "View.MemoryView":1155 * * if ndim == 1: * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< @@ -15965,7 +14979,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v goto __pyx_L5_bool_binop_done; } - /* "View.MemoryView":1154 + /* "View.MemoryView":1156 * if ndim == 1: * if (src_stride > 0 and dst_stride > 0 and * src_stride == itemsize == dst_stride): # <<<<<<<<<<<<<< @@ -15980,7 +14994,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v __pyx_t_1 = __pyx_t_3; __pyx_L5_bool_binop_done:; - /* "View.MemoryView":1153 + /* "View.MemoryView":1155 * * if ndim == 1: * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< @@ -15989,7 +15003,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ if (__pyx_t_1) { - /* "View.MemoryView":1155 + /* "View.MemoryView":1157 * if (src_stride > 0 and dst_stride > 0 and * src_stride == itemsize == dst_stride): * memcpy(dst_data, src_data, itemsize * dst_extent) # <<<<<<<<<<<<<< @@ -15998,7 +15012,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, (__pyx_v_itemsize * __pyx_v_dst_extent))); - /* "View.MemoryView":1153 + /* "View.MemoryView":1155 * * if ndim == 1: * if (src_stride > 0 and dst_stride > 0 and # <<<<<<<<<<<<<< @@ -16008,7 +15022,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v goto __pyx_L4; } - /* "View.MemoryView":1157 + /* "View.MemoryView":1159 * memcpy(dst_data, src_data, itemsize * dst_extent) * else: * for i in range(dst_extent): # <<<<<<<<<<<<<< @@ -16021,7 +15035,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1158 + /* "View.MemoryView":1160 * else: * for i in range(dst_extent): * memcpy(dst_data, src_data, itemsize) # <<<<<<<<<<<<<< @@ -16030,7 +15044,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ (void)(memcpy(__pyx_v_dst_data, __pyx_v_src_data, __pyx_v_itemsize)); - /* "View.MemoryView":1159 + /* "View.MemoryView":1161 * for i in range(dst_extent): * memcpy(dst_data, src_data, itemsize) * src_data += src_stride # <<<<<<<<<<<<<< @@ -16039,7 +15053,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); - /* "View.MemoryView":1160 + /* "View.MemoryView":1162 * memcpy(dst_data, src_data, itemsize) * src_data += src_stride * dst_data += dst_stride # <<<<<<<<<<<<<< @@ -16051,7 +15065,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v } __pyx_L4:; - /* "View.MemoryView":1152 + /* "View.MemoryView":1154 * cdef Py_ssize_t dst_stride = dst_strides[0] * * if ndim == 1: # <<<<<<<<<<<<<< @@ -16061,7 +15075,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v goto __pyx_L3; } - /* "View.MemoryView":1162 + /* "View.MemoryView":1164 * dst_data += dst_stride * else: * for i in range(dst_extent): # <<<<<<<<<<<<<< @@ -16074,7 +15088,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1163 + /* "View.MemoryView":1165 * else: * for i in range(dst_extent): * _copy_strided_to_strided(src_data, src_strides + 1, # <<<<<<<<<<<<<< @@ -16083,7 +15097,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ _copy_strided_to_strided(__pyx_v_src_data, (__pyx_v_src_strides + 1), __pyx_v_dst_data, (__pyx_v_dst_strides + 1), (__pyx_v_src_shape + 1), (__pyx_v_dst_shape + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize); - /* "View.MemoryView":1167 + /* "View.MemoryView":1169 * src_shape + 1, dst_shape + 1, * ndim - 1, itemsize) * src_data += src_stride # <<<<<<<<<<<<<< @@ -16092,7 +15106,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v */ __pyx_v_src_data = (__pyx_v_src_data + __pyx_v_src_stride); - /* "View.MemoryView":1168 + /* "View.MemoryView":1170 * ndim - 1, itemsize) * src_data += src_stride * dst_data += dst_stride # <<<<<<<<<<<<<< @@ -16104,7 +15118,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v } __pyx_L3:; - /* "View.MemoryView":1140 + /* "View.MemoryView":1142 * * @cython.cdivision(True) * cdef void _copy_strided_to_strided(char *src_data, Py_ssize_t *src_strides, # <<<<<<<<<<<<<< @@ -16115,7 +15129,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v /* function exit code */ } -/* "View.MemoryView":1170 +/* "View.MemoryView":1172 * dst_data += dst_stride * * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< @@ -16125,7 +15139,7 @@ static void _copy_strided_to_strided(char *__pyx_v_src_data, Py_ssize_t *__pyx_v static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize) { - /* "View.MemoryView":1173 + /* "View.MemoryView":1175 * __Pyx_memviewslice *dst, * int ndim, size_t itemsize) nogil: * _copy_strided_to_strided(src.data, src.strides, dst.data, dst.strides, # <<<<<<<<<<<<<< @@ -16134,7 +15148,7 @@ static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memvi */ _copy_strided_to_strided(__pyx_v_src->data, __pyx_v_src->strides, __pyx_v_dst->data, __pyx_v_dst->strides, __pyx_v_src->shape, __pyx_v_dst->shape, __pyx_v_ndim, __pyx_v_itemsize); - /* "View.MemoryView":1170 + /* "View.MemoryView":1172 * dst_data += dst_stride * * cdef void copy_strided_to_strided(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< @@ -16145,7 +15159,7 @@ static void copy_strided_to_strided(__Pyx_memviewslice *__pyx_v_src, __Pyx_memvi /* function exit code */ } -/* "View.MemoryView":1177 +/* "View.MemoryView":1179 * * @cname('__pyx_memoryview_slice_get_size') * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< @@ -16162,7 +15176,7 @@ static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_sr Py_ssize_t *__pyx_t_3; Py_ssize_t *__pyx_t_4; - /* "View.MemoryView":1179 + /* "View.MemoryView":1181 * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: * "Return the size of the memory occupied by the slice in number of bytes" * cdef Py_ssize_t shape, size = src.memview.view.itemsize # <<<<<<<<<<<<<< @@ -16172,7 +15186,7 @@ static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_sr __pyx_t_1 = __pyx_v_src->memview->view.itemsize; __pyx_v_size = __pyx_t_1; - /* "View.MemoryView":1181 + /* "View.MemoryView":1183 * cdef Py_ssize_t shape, size = src.memview.view.itemsize * * for shape in src.shape[:ndim]: # <<<<<<<<<<<<<< @@ -16184,7 +15198,7 @@ static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_sr __pyx_t_2 = __pyx_t_4; __pyx_v_shape = (__pyx_t_2[0]); - /* "View.MemoryView":1182 + /* "View.MemoryView":1184 * * for shape in src.shape[:ndim]: * size *= shape # <<<<<<<<<<<<<< @@ -16194,7 +15208,7 @@ static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_sr __pyx_v_size = (__pyx_v_size * __pyx_v_shape); } - /* "View.MemoryView":1184 + /* "View.MemoryView":1186 * size *= shape * * return size # <<<<<<<<<<<<<< @@ -16204,7 +15218,7 @@ static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_sr __pyx_r = __pyx_v_size; goto __pyx_L0; - /* "View.MemoryView":1177 + /* "View.MemoryView":1179 * * @cname('__pyx_memoryview_slice_get_size') * cdef Py_ssize_t slice_get_size(__Pyx_memviewslice *src, int ndim) nogil: # <<<<<<<<<<<<<< @@ -16217,7 +15231,7 @@ static Py_ssize_t __pyx_memoryview_slice_get_size(__Pyx_memviewslice *__pyx_v_sr return __pyx_r; } -/* "View.MemoryView":1187 +/* "View.MemoryView":1189 * * @cname('__pyx_fill_contig_strides_array') * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< @@ -16233,7 +15247,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ int __pyx_t_3; int __pyx_t_4; - /* "View.MemoryView":1196 + /* "View.MemoryView":1198 * cdef int idx * * if order == 'F': # <<<<<<<<<<<<<< @@ -16243,7 +15257,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ __pyx_t_1 = ((__pyx_v_order == 'F') != 0); if (__pyx_t_1) { - /* "View.MemoryView":1197 + /* "View.MemoryView":1199 * * if order == 'F': * for idx in range(ndim): # <<<<<<<<<<<<<< @@ -16255,7 +15269,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_idx = __pyx_t_4; - /* "View.MemoryView":1198 + /* "View.MemoryView":1200 * if order == 'F': * for idx in range(ndim): * strides[idx] = stride # <<<<<<<<<<<<<< @@ -16264,7 +15278,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ */ (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; - /* "View.MemoryView":1199 + /* "View.MemoryView":1201 * for idx in range(ndim): * strides[idx] = stride * stride *= shape[idx] # <<<<<<<<<<<<<< @@ -16274,7 +15288,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ __pyx_v_stride = (__pyx_v_stride * (__pyx_v_shape[__pyx_v_idx])); } - /* "View.MemoryView":1196 + /* "View.MemoryView":1198 * cdef int idx * * if order == 'F': # <<<<<<<<<<<<<< @@ -16284,7 +15298,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ goto __pyx_L3; } - /* "View.MemoryView":1201 + /* "View.MemoryView":1203 * stride *= shape[idx] * else: * for idx in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< @@ -16295,7 +15309,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ for (__pyx_t_2 = (__pyx_v_ndim - 1); __pyx_t_2 > -1; __pyx_t_2-=1) { __pyx_v_idx = __pyx_t_2; - /* "View.MemoryView":1202 + /* "View.MemoryView":1204 * else: * for idx in range(ndim - 1, -1, -1): * strides[idx] = stride # <<<<<<<<<<<<<< @@ -16304,7 +15318,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ */ (__pyx_v_strides[__pyx_v_idx]) = __pyx_v_stride; - /* "View.MemoryView":1203 + /* "View.MemoryView":1205 * for idx in range(ndim - 1, -1, -1): * strides[idx] = stride * stride *= shape[idx] # <<<<<<<<<<<<<< @@ -16316,7 +15330,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ } __pyx_L3:; - /* "View.MemoryView":1205 + /* "View.MemoryView":1207 * stride *= shape[idx] * * return stride # <<<<<<<<<<<<<< @@ -16326,7 +15340,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ __pyx_r = __pyx_v_stride; goto __pyx_L0; - /* "View.MemoryView":1187 + /* "View.MemoryView":1189 * * @cname('__pyx_fill_contig_strides_array') * cdef Py_ssize_t fill_contig_strides_array( # <<<<<<<<<<<<<< @@ -16339,7 +15353,7 @@ static Py_ssize_t __pyx_fill_contig_strides_array(Py_ssize_t *__pyx_v_shape, Py_ return __pyx_r; } -/* "View.MemoryView":1208 +/* "View.MemoryView":1210 * * @cname('__pyx_memoryview_copy_data_to_temp') * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< @@ -16359,8 +15373,11 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, struct __pyx_memoryview_obj *__pyx_t_4; int __pyx_t_5; int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; - /* "View.MemoryView":1219 + /* "View.MemoryView":1221 * cdef void *result * * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< @@ -16370,7 +15387,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __pyx_t_1 = __pyx_v_src->memview->view.itemsize; __pyx_v_itemsize = __pyx_t_1; - /* "View.MemoryView":1220 + /* "View.MemoryView":1222 * * cdef size_t itemsize = src.memview.view.itemsize * cdef size_t size = slice_get_size(src, ndim) # <<<<<<<<<<<<<< @@ -16379,7 +15396,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ __pyx_v_size = __pyx_memoryview_slice_get_size(__pyx_v_src, __pyx_v_ndim); - /* "View.MemoryView":1222 + /* "View.MemoryView":1224 * cdef size_t size = slice_get_size(src, ndim) * * result = malloc(size) # <<<<<<<<<<<<<< @@ -16388,7 +15405,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ __pyx_v_result = malloc(__pyx_v_size); - /* "View.MemoryView":1223 + /* "View.MemoryView":1225 * * result = malloc(size) * if not result: # <<<<<<<<<<<<<< @@ -16398,16 +15415,16 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __pyx_t_2 = ((!(__pyx_v_result != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1224 + /* "View.MemoryView":1226 * result = malloc(size) * if not result: * _err(MemoryError, NULL) # <<<<<<<<<<<<<< * * */ - __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 1224, __pyx_L1_error) + __pyx_t_3 = __pyx_memoryview_err(__pyx_builtin_MemoryError, NULL); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(2, 1226, __pyx_L1_error) - /* "View.MemoryView":1223 + /* "View.MemoryView":1225 * * result = malloc(size) * if not result: # <<<<<<<<<<<<<< @@ -16416,7 +15433,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ } - /* "View.MemoryView":1227 + /* "View.MemoryView":1229 * * * tmpslice.data = result # <<<<<<<<<<<<<< @@ -16425,7 +15442,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ __pyx_v_tmpslice->data = ((char *)__pyx_v_result); - /* "View.MemoryView":1228 + /* "View.MemoryView":1230 * * tmpslice.data = result * tmpslice.memview = src.memview # <<<<<<<<<<<<<< @@ -16435,7 +15452,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __pyx_t_4 = __pyx_v_src->memview; __pyx_v_tmpslice->memview = __pyx_t_4; - /* "View.MemoryView":1229 + /* "View.MemoryView":1231 * tmpslice.data = result * tmpslice.memview = src.memview * for i in range(ndim): # <<<<<<<<<<<<<< @@ -16447,7 +15464,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1230 + /* "View.MemoryView":1232 * tmpslice.memview = src.memview * for i in range(ndim): * tmpslice.shape[i] = src.shape[i] # <<<<<<<<<<<<<< @@ -16456,7 +15473,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ (__pyx_v_tmpslice->shape[__pyx_v_i]) = (__pyx_v_src->shape[__pyx_v_i]); - /* "View.MemoryView":1231 + /* "View.MemoryView":1233 * for i in range(ndim): * tmpslice.shape[i] = src.shape[i] * tmpslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< @@ -16466,7 +15483,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, (__pyx_v_tmpslice->suboffsets[__pyx_v_i]) = -1L; } - /* "View.MemoryView":1233 + /* "View.MemoryView":1235 * tmpslice.suboffsets[i] = -1 * * fill_contig_strides_array(&tmpslice.shape[0], &tmpslice.strides[0], itemsize, # <<<<<<<<<<<<<< @@ -16475,7 +15492,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ (void)(__pyx_fill_contig_strides_array((&(__pyx_v_tmpslice->shape[0])), (&(__pyx_v_tmpslice->strides[0])), __pyx_v_itemsize, __pyx_v_ndim, __pyx_v_order)); - /* "View.MemoryView":1237 + /* "View.MemoryView":1239 * * * for i in range(ndim): # <<<<<<<<<<<<<< @@ -16487,7 +15504,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; - /* "View.MemoryView":1238 + /* "View.MemoryView":1240 * * for i in range(ndim): * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< @@ -16497,7 +15514,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __pyx_t_2 = (((__pyx_v_tmpslice->shape[__pyx_v_i]) == 1) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1239 + /* "View.MemoryView":1241 * for i in range(ndim): * if tmpslice.shape[i] == 1: * tmpslice.strides[i] = 0 # <<<<<<<<<<<<<< @@ -16506,7 +15523,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ (__pyx_v_tmpslice->strides[__pyx_v_i]) = 0; - /* "View.MemoryView":1238 + /* "View.MemoryView":1240 * * for i in range(ndim): * if tmpslice.shape[i] == 1: # <<<<<<<<<<<<<< @@ -16516,7 +15533,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, } } - /* "View.MemoryView":1241 + /* "View.MemoryView":1243 * tmpslice.strides[i] = 0 * * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< @@ -16526,7 +15543,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __pyx_t_2 = (__pyx_memviewslice_is_contig((__pyx_v_src[0]), __pyx_v_order, __pyx_v_ndim) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1242 + /* "View.MemoryView":1244 * * if slice_is_contig(src[0], order, ndim): * memcpy(result, src.data, size) # <<<<<<<<<<<<<< @@ -16535,7 +15552,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, */ (void)(memcpy(__pyx_v_result, __pyx_v_src->data, __pyx_v_size)); - /* "View.MemoryView":1241 + /* "View.MemoryView":1243 * tmpslice.strides[i] = 0 * * if slice_is_contig(src[0], order, ndim): # <<<<<<<<<<<<<< @@ -16545,7 +15562,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, goto __pyx_L9; } - /* "View.MemoryView":1244 + /* "View.MemoryView":1246 * memcpy(result, src.data, size) * else: * copy_strided_to_strided(src, tmpslice, ndim, itemsize) # <<<<<<<<<<<<<< @@ -16557,7 +15574,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, } __pyx_L9:; - /* "View.MemoryView":1246 + /* "View.MemoryView":1248 * copy_strided_to_strided(src, tmpslice, ndim, itemsize) * * return result # <<<<<<<<<<<<<< @@ -16567,7 +15584,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, __pyx_r = __pyx_v_result; goto __pyx_L0; - /* "View.MemoryView":1208 + /* "View.MemoryView":1210 * * @cname('__pyx_memoryview_copy_data_to_temp') * cdef void *copy_data_to_temp(__Pyx_memviewslice *src, # <<<<<<<<<<<<<< @@ -16591,7 +15608,7 @@ static void *__pyx_memoryview_copy_data_to_temp(__Pyx_memviewslice *__pyx_v_src, return __pyx_r; } -/* "View.MemoryView":1251 +/* "View.MemoryView":1253 * * @cname('__pyx_memoryview_err_extents') * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< @@ -16606,25 +15623,28 @@ static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif __Pyx_RefNannySetupContext("_err_extents", 0); - /* "View.MemoryView":1254 + /* "View.MemoryView":1256 * Py_ssize_t extent2) except -1 with gil: * raise ValueError("got differing extents in dimension %d (got %d and %d)" % * (i, extent1, extent2)) # <<<<<<<<<<<<<< * * @cname('__pyx_memoryview_err_dim') */ - __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1254, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1256, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1254, __pyx_L1_error) + __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_extent1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1256, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1254, __pyx_L1_error) + __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_extent2); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1256, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1254, __pyx_L1_error) + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1256, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); @@ -16636,24 +15656,24 @@ static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent __pyx_t_2 = 0; __pyx_t_3 = 0; - /* "View.MemoryView":1253 + /* "View.MemoryView":1255 * cdef int _err_extents(int i, Py_ssize_t extent1, * Py_ssize_t extent2) except -1 with gil: * raise ValueError("got differing extents in dimension %d (got %d and %d)" % # <<<<<<<<<<<<<< * (i, extent1, extent2)) * */ - __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1253, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_got_differing_extents_in_dimensi, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1253, __pyx_L1_error) + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_ValueError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __PYX_ERR(2, 1253, __pyx_L1_error) + __PYX_ERR(2, 1255, __pyx_L1_error) - /* "View.MemoryView":1251 + /* "View.MemoryView":1253 * * @cname('__pyx_memoryview_err_extents') * cdef int _err_extents(int i, Py_ssize_t extent1, # <<<<<<<<<<<<<< @@ -16676,7 +15696,7 @@ static int __pyx_memoryview_err_extents(int __pyx_v_i, Py_ssize_t __pyx_v_extent return __pyx_r; } -/* "View.MemoryView":1257 +/* "View.MemoryView":1259 * * @cname('__pyx_memoryview_err_dim') * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< @@ -16691,24 +15711,27 @@ static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif __Pyx_RefNannySetupContext("_err_dim", 0); __Pyx_INCREF(__pyx_v_error); - /* "View.MemoryView":1258 + /* "View.MemoryView":1260 * @cname('__pyx_memoryview_err_dim') * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: * raise error(msg.decode('ascii') % dim) # <<<<<<<<<<<<<< * * @cname('__pyx_memoryview_err') */ - __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1258, __pyx_L1_error) + __pyx_t_2 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1258, __pyx_L1_error) + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_dim); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1258, __pyx_L1_error) + __pyx_t_4 = PyUnicode_Format(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 1260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; @@ -16726,14 +15749,14 @@ static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1258, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 1260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(2, 1258, __pyx_L1_error) + __PYX_ERR(2, 1260, __pyx_L1_error) - /* "View.MemoryView":1257 + /* "View.MemoryView":1259 * * @cname('__pyx_memoryview_err_dim') * cdef int _err_dim(object error, char *msg, int dim) except -1 with gil: # <<<<<<<<<<<<<< @@ -16757,7 +15780,7 @@ static int __pyx_memoryview_err_dim(PyObject *__pyx_v_error, char *__pyx_v_msg, return __pyx_r; } -/* "View.MemoryView":1261 +/* "View.MemoryView":1263 * * @cname('__pyx_memoryview_err') * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< @@ -16773,13 +15796,16 @@ static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; #ifdef WITH_THREAD PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure(); #endif __Pyx_RefNannySetupContext("_err", 0); __Pyx_INCREF(__pyx_v_error); - /* "View.MemoryView":1262 + /* "View.MemoryView":1264 * @cname('__pyx_memoryview_err') * cdef int _err(object error, char *msg) except -1 with gil: * if msg != NULL: # <<<<<<<<<<<<<< @@ -16789,14 +15815,14 @@ static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { __pyx_t_1 = ((__pyx_v_msg != NULL) != 0); if (unlikely(__pyx_t_1)) { - /* "View.MemoryView":1263 + /* "View.MemoryView":1265 * cdef int _err(object error, char *msg) except -1 with gil: * if msg != NULL: * raise error(msg.decode('ascii')) # <<<<<<<<<<<<<< * else: * raise error */ - __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1263, __pyx_L1_error) + __pyx_t_3 = __Pyx_decode_c_string(__pyx_v_msg, 0, strlen(__pyx_v_msg), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 1265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(__pyx_v_error); __pyx_t_4 = __pyx_v_error; __pyx_t_5 = NULL; @@ -16812,14 +15838,14 @@ static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1263, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 1265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(2, 1263, __pyx_L1_error) + __PYX_ERR(2, 1265, __pyx_L1_error) - /* "View.MemoryView":1262 + /* "View.MemoryView":1264 * @cname('__pyx_memoryview_err') * cdef int _err(object error, char *msg) except -1 with gil: * if msg != NULL: # <<<<<<<<<<<<<< @@ -16828,7 +15854,7 @@ static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { */ } - /* "View.MemoryView":1265 + /* "View.MemoryView":1267 * raise error(msg.decode('ascii')) * else: * raise error # <<<<<<<<<<<<<< @@ -16837,10 +15863,10 @@ static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { */ /*else*/ { __Pyx_Raise(__pyx_v_error, 0, 0, 0); - __PYX_ERR(2, 1265, __pyx_L1_error) + __PYX_ERR(2, 1267, __pyx_L1_error) } - /* "View.MemoryView":1261 + /* "View.MemoryView":1263 * * @cname('__pyx_memoryview_err') * cdef int _err(object error, char *msg) except -1 with gil: # <<<<<<<<<<<<<< @@ -16864,7 +15890,7 @@ static int __pyx_memoryview_err(PyObject *__pyx_v_error, char *__pyx_v_msg) { return __pyx_r; } -/* "View.MemoryView":1268 +/* "View.MemoryView":1270 * * @cname('__pyx_memoryview_copy_contents') * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< @@ -16890,8 +15916,11 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ int __pyx_t_6; void *__pyx_t_7; int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; - /* "View.MemoryView":1276 + /* "View.MemoryView":1278 * Check for overlapping memory and verify the shapes. * """ * cdef void *tmpdata = NULL # <<<<<<<<<<<<<< @@ -16900,7 +15929,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_tmpdata = NULL; - /* "View.MemoryView":1277 + /* "View.MemoryView":1279 * """ * cdef void *tmpdata = NULL * cdef size_t itemsize = src.memview.view.itemsize # <<<<<<<<<<<<<< @@ -16910,7 +15939,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_1 = __pyx_v_src.memview->view.itemsize; __pyx_v_itemsize = __pyx_t_1; - /* "View.MemoryView":1279 + /* "View.MemoryView":1281 * cdef size_t itemsize = src.memview.view.itemsize * cdef int i * cdef char order = get_best_order(&src, src_ndim) # <<<<<<<<<<<<<< @@ -16919,7 +15948,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_src), __pyx_v_src_ndim); - /* "View.MemoryView":1280 + /* "View.MemoryView":1282 * cdef int i * cdef char order = get_best_order(&src, src_ndim) * cdef bint broadcasting = False # <<<<<<<<<<<<<< @@ -16928,7 +15957,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_broadcasting = 0; - /* "View.MemoryView":1281 + /* "View.MemoryView":1283 * cdef char order = get_best_order(&src, src_ndim) * cdef bint broadcasting = False * cdef bint direct_copy = False # <<<<<<<<<<<<<< @@ -16937,7 +15966,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_direct_copy = 0; - /* "View.MemoryView":1284 + /* "View.MemoryView":1286 * cdef __Pyx_memviewslice tmp * * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< @@ -16947,7 +15976,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = ((__pyx_v_src_ndim < __pyx_v_dst_ndim) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1285 + /* "View.MemoryView":1287 * * if src_ndim < dst_ndim: * broadcast_leading(&src, src_ndim, dst_ndim) # <<<<<<<<<<<<<< @@ -16956,7 +15985,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_memoryview_broadcast_leading((&__pyx_v_src), __pyx_v_src_ndim, __pyx_v_dst_ndim); - /* "View.MemoryView":1284 + /* "View.MemoryView":1286 * cdef __Pyx_memviewslice tmp * * if src_ndim < dst_ndim: # <<<<<<<<<<<<<< @@ -16966,7 +15995,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ goto __pyx_L3; } - /* "View.MemoryView":1286 + /* "View.MemoryView":1288 * if src_ndim < dst_ndim: * broadcast_leading(&src, src_ndim, dst_ndim) * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< @@ -16976,7 +16005,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = ((__pyx_v_dst_ndim < __pyx_v_src_ndim) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1287 + /* "View.MemoryView":1289 * broadcast_leading(&src, src_ndim, dst_ndim) * elif dst_ndim < src_ndim: * broadcast_leading(&dst, dst_ndim, src_ndim) # <<<<<<<<<<<<<< @@ -16985,7 +16014,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_memoryview_broadcast_leading((&__pyx_v_dst), __pyx_v_dst_ndim, __pyx_v_src_ndim); - /* "View.MemoryView":1286 + /* "View.MemoryView":1288 * if src_ndim < dst_ndim: * broadcast_leading(&src, src_ndim, dst_ndim) * elif dst_ndim < src_ndim: # <<<<<<<<<<<<<< @@ -16995,7 +16024,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ } __pyx_L3:; - /* "View.MemoryView":1289 + /* "View.MemoryView":1291 * broadcast_leading(&dst, dst_ndim, src_ndim) * * cdef int ndim = max(src_ndim, dst_ndim) # <<<<<<<<<<<<<< @@ -17011,7 +16040,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ } __pyx_v_ndim = __pyx_t_5; - /* "View.MemoryView":1291 + /* "View.MemoryView":1293 * cdef int ndim = max(src_ndim, dst_ndim) * * for i in range(ndim): # <<<<<<<<<<<<<< @@ -17023,7 +16052,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1292 + /* "View.MemoryView":1294 * * for i in range(ndim): * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< @@ -17033,7 +16062,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) != (__pyx_v_dst.shape[__pyx_v_i])) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1293 + /* "View.MemoryView":1295 * for i in range(ndim): * if src.shape[i] != dst.shape[i]: * if src.shape[i] == 1: # <<<<<<<<<<<<<< @@ -17043,7 +16072,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (((__pyx_v_src.shape[__pyx_v_i]) == 1) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1294 + /* "View.MemoryView":1296 * if src.shape[i] != dst.shape[i]: * if src.shape[i] == 1: * broadcasting = True # <<<<<<<<<<<<<< @@ -17052,7 +16081,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_broadcasting = 1; - /* "View.MemoryView":1295 + /* "View.MemoryView":1297 * if src.shape[i] == 1: * broadcasting = True * src.strides[i] = 0 # <<<<<<<<<<<<<< @@ -17061,7 +16090,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ (__pyx_v_src.strides[__pyx_v_i]) = 0; - /* "View.MemoryView":1293 + /* "View.MemoryView":1295 * for i in range(ndim): * if src.shape[i] != dst.shape[i]: * if src.shape[i] == 1: # <<<<<<<<<<<<<< @@ -17071,7 +16100,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ goto __pyx_L7; } - /* "View.MemoryView":1297 + /* "View.MemoryView":1299 * src.strides[i] = 0 * else: * _err_extents(i, dst.shape[i], src.shape[i]) # <<<<<<<<<<<<<< @@ -17079,11 +16108,11 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ * if src.suboffsets[i] >= 0: */ /*else*/ { - __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1297, __pyx_L1_error) + __pyx_t_6 = __pyx_memoryview_err_extents(__pyx_v_i, (__pyx_v_dst.shape[__pyx_v_i]), (__pyx_v_src.shape[__pyx_v_i])); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1299, __pyx_L1_error) } __pyx_L7:; - /* "View.MemoryView":1292 + /* "View.MemoryView":1294 * * for i in range(ndim): * if src.shape[i] != dst.shape[i]: # <<<<<<<<<<<<<< @@ -17092,7 +16121,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ } - /* "View.MemoryView":1299 + /* "View.MemoryView":1301 * _err_extents(i, dst.shape[i], src.shape[i]) * * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< @@ -17102,16 +16131,16 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (((__pyx_v_src.suboffsets[__pyx_v_i]) >= 0) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1300 + /* "View.MemoryView":1302 * * if src.suboffsets[i] >= 0: * _err_dim(ValueError, "Dimension %d is not direct", i) # <<<<<<<<<<<<<< * * if slices_overlap(&src, &dst, ndim, itemsize): */ - __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1300, __pyx_L1_error) + __pyx_t_6 = __pyx_memoryview_err_dim(__pyx_builtin_ValueError, ((char *)"Dimension %d is not direct"), __pyx_v_i); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(2, 1302, __pyx_L1_error) - /* "View.MemoryView":1299 + /* "View.MemoryView":1301 * _err_extents(i, dst.shape[i], src.shape[i]) * * if src.suboffsets[i] >= 0: # <<<<<<<<<<<<<< @@ -17121,7 +16150,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ } } - /* "View.MemoryView":1302 + /* "View.MemoryView":1304 * _err_dim(ValueError, "Dimension %d is not direct", i) * * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< @@ -17131,7 +16160,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (__pyx_slices_overlap((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1304 + /* "View.MemoryView":1306 * if slices_overlap(&src, &dst, ndim, itemsize): * * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< @@ -17141,7 +16170,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = ((!(__pyx_memviewslice_is_contig(__pyx_v_src, __pyx_v_order, __pyx_v_ndim) != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1305 + /* "View.MemoryView":1307 * * if not slice_is_contig(src, order, ndim): * order = get_best_order(&dst, ndim) # <<<<<<<<<<<<<< @@ -17150,7 +16179,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_order = __pyx_get_best_slice_order((&__pyx_v_dst), __pyx_v_ndim); - /* "View.MemoryView":1304 + /* "View.MemoryView":1306 * if slices_overlap(&src, &dst, ndim, itemsize): * * if not slice_is_contig(src, order, ndim): # <<<<<<<<<<<<<< @@ -17159,17 +16188,17 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ } - /* "View.MemoryView":1307 + /* "View.MemoryView":1309 * order = get_best_order(&dst, ndim) * * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) # <<<<<<<<<<<<<< * src = tmp * */ - __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(2, 1307, __pyx_L1_error) + __pyx_t_7 = __pyx_memoryview_copy_data_to_temp((&__pyx_v_src), (&__pyx_v_tmp), __pyx_v_order, __pyx_v_ndim); if (unlikely(__pyx_t_7 == ((void *)NULL))) __PYX_ERR(2, 1309, __pyx_L1_error) __pyx_v_tmpdata = __pyx_t_7; - /* "View.MemoryView":1308 + /* "View.MemoryView":1310 * * tmpdata = copy_data_to_temp(&src, &tmp, order, ndim) * src = tmp # <<<<<<<<<<<<<< @@ -17178,7 +16207,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_src = __pyx_v_tmp; - /* "View.MemoryView":1302 + /* "View.MemoryView":1304 * _err_dim(ValueError, "Dimension %d is not direct", i) * * if slices_overlap(&src, &dst, ndim, itemsize): # <<<<<<<<<<<<<< @@ -17187,7 +16216,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ } - /* "View.MemoryView":1310 + /* "View.MemoryView":1312 * src = tmp * * if not broadcasting: # <<<<<<<<<<<<<< @@ -17197,7 +16226,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = ((!(__pyx_v_broadcasting != 0)) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1313 + /* "View.MemoryView":1315 * * * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< @@ -17207,7 +16236,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'C', __pyx_v_ndim) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1314 + /* "View.MemoryView":1316 * * if slice_is_contig(src, 'C', ndim): * direct_copy = slice_is_contig(dst, 'C', ndim) # <<<<<<<<<<<<<< @@ -17216,7 +16245,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'C', __pyx_v_ndim); - /* "View.MemoryView":1313 + /* "View.MemoryView":1315 * * * if slice_is_contig(src, 'C', ndim): # <<<<<<<<<<<<<< @@ -17226,7 +16255,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ goto __pyx_L12; } - /* "View.MemoryView":1315 + /* "View.MemoryView":1317 * if slice_is_contig(src, 'C', ndim): * direct_copy = slice_is_contig(dst, 'C', ndim) * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< @@ -17236,7 +16265,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (__pyx_memviewslice_is_contig(__pyx_v_src, 'F', __pyx_v_ndim) != 0); if (__pyx_t_2) { - /* "View.MemoryView":1316 + /* "View.MemoryView":1318 * direct_copy = slice_is_contig(dst, 'C', ndim) * elif slice_is_contig(src, 'F', ndim): * direct_copy = slice_is_contig(dst, 'F', ndim) # <<<<<<<<<<<<<< @@ -17245,7 +16274,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_v_direct_copy = __pyx_memviewslice_is_contig(__pyx_v_dst, 'F', __pyx_v_ndim); - /* "View.MemoryView":1315 + /* "View.MemoryView":1317 * if slice_is_contig(src, 'C', ndim): * direct_copy = slice_is_contig(dst, 'C', ndim) * elif slice_is_contig(src, 'F', ndim): # <<<<<<<<<<<<<< @@ -17255,7 +16284,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ } __pyx_L12:; - /* "View.MemoryView":1318 + /* "View.MemoryView":1320 * direct_copy = slice_is_contig(dst, 'F', ndim) * * if direct_copy: # <<<<<<<<<<<<<< @@ -17265,7 +16294,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_2 = (__pyx_v_direct_copy != 0); if (__pyx_t_2) { - /* "View.MemoryView":1320 + /* "View.MemoryView":1322 * if direct_copy: * * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< @@ -17274,7 +16303,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - /* "View.MemoryView":1321 + /* "View.MemoryView":1323 * * refcount_copying(&dst, dtype_is_object, ndim, False) * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) # <<<<<<<<<<<<<< @@ -17283,7 +16312,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ (void)(memcpy(__pyx_v_dst.data, __pyx_v_src.data, __pyx_memoryview_slice_get_size((&__pyx_v_src), __pyx_v_ndim))); - /* "View.MemoryView":1322 + /* "View.MemoryView":1324 * refcount_copying(&dst, dtype_is_object, ndim, False) * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< @@ -17292,7 +16321,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - /* "View.MemoryView":1323 + /* "View.MemoryView":1325 * memcpy(dst.data, src.data, slice_get_size(&src, ndim)) * refcount_copying(&dst, dtype_is_object, ndim, True) * free(tmpdata) # <<<<<<<<<<<<<< @@ -17301,7 +16330,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ free(__pyx_v_tmpdata); - /* "View.MemoryView":1324 + /* "View.MemoryView":1326 * refcount_copying(&dst, dtype_is_object, ndim, True) * free(tmpdata) * return 0 # <<<<<<<<<<<<<< @@ -17311,7 +16340,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_r = 0; goto __pyx_L0; - /* "View.MemoryView":1318 + /* "View.MemoryView":1320 * direct_copy = slice_is_contig(dst, 'F', ndim) * * if direct_copy: # <<<<<<<<<<<<<< @@ -17320,7 +16349,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ } - /* "View.MemoryView":1310 + /* "View.MemoryView":1312 * src = tmp * * if not broadcasting: # <<<<<<<<<<<<<< @@ -17329,7 +16358,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ } - /* "View.MemoryView":1326 + /* "View.MemoryView":1328 * return 0 * * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< @@ -17343,25 +16372,25 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_t_8 = (__pyx_t_2 != 0); if (__pyx_t_8) { - /* "View.MemoryView":1329 + /* "View.MemoryView":1331 * * * transpose_memslice(&src) # <<<<<<<<<<<<<< * transpose_memslice(&dst) * */ - __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1329, __pyx_L1_error) + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_src)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1331, __pyx_L1_error) - /* "View.MemoryView":1330 + /* "View.MemoryView":1332 * * transpose_memslice(&src) * transpose_memslice(&dst) # <<<<<<<<<<<<<< * * refcount_copying(&dst, dtype_is_object, ndim, False) */ - __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1330, __pyx_L1_error) + __pyx_t_5 = __pyx_memslice_transpose((&__pyx_v_dst)); if (unlikely(__pyx_t_5 == ((int)0))) __PYX_ERR(2, 1332, __pyx_L1_error) - /* "View.MemoryView":1326 + /* "View.MemoryView":1328 * return 0 * * if order == 'F' == get_best_order(&dst, ndim): # <<<<<<<<<<<<<< @@ -17370,7 +16399,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ } - /* "View.MemoryView":1332 + /* "View.MemoryView":1334 * transpose_memslice(&dst) * * refcount_copying(&dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< @@ -17379,7 +16408,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - /* "View.MemoryView":1333 + /* "View.MemoryView":1335 * * refcount_copying(&dst, dtype_is_object, ndim, False) * copy_strided_to_strided(&src, &dst, ndim, itemsize) # <<<<<<<<<<<<<< @@ -17388,7 +16417,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ copy_strided_to_strided((&__pyx_v_src), (&__pyx_v_dst), __pyx_v_ndim, __pyx_v_itemsize); - /* "View.MemoryView":1334 + /* "View.MemoryView":1336 * refcount_copying(&dst, dtype_is_object, ndim, False) * copy_strided_to_strided(&src, &dst, ndim, itemsize) * refcount_copying(&dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< @@ -17397,7 +16426,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ __pyx_memoryview_refcount_copying((&__pyx_v_dst), __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - /* "View.MemoryView":1336 + /* "View.MemoryView":1338 * refcount_copying(&dst, dtype_is_object, ndim, True) * * free(tmpdata) # <<<<<<<<<<<<<< @@ -17406,7 +16435,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ */ free(__pyx_v_tmpdata); - /* "View.MemoryView":1337 + /* "View.MemoryView":1339 * * free(tmpdata) * return 0 # <<<<<<<<<<<<<< @@ -17416,7 +16445,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ __pyx_r = 0; goto __pyx_L0; - /* "View.MemoryView":1268 + /* "View.MemoryView":1270 * * @cname('__pyx_memoryview_copy_contents') * cdef int memoryview_copy_contents(__Pyx_memviewslice src, # <<<<<<<<<<<<<< @@ -17440,7 +16469,7 @@ static int __pyx_memoryview_copy_contents(__Pyx_memviewslice __pyx_v_src, __Pyx_ return __pyx_r; } -/* "View.MemoryView":1340 +/* "View.MemoryView":1342 * * @cname('__pyx_memoryview_broadcast_leading') * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< @@ -17455,7 +16484,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic int __pyx_t_2; int __pyx_t_3; - /* "View.MemoryView":1344 + /* "View.MemoryView":1346 * int ndim_other) nogil: * cdef int i * cdef int offset = ndim_other - ndim # <<<<<<<<<<<<<< @@ -17464,7 +16493,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic */ __pyx_v_offset = (__pyx_v_ndim_other - __pyx_v_ndim); - /* "View.MemoryView":1346 + /* "View.MemoryView":1348 * cdef int offset = ndim_other - ndim * * for i in range(ndim - 1, -1, -1): # <<<<<<<<<<<<<< @@ -17474,7 +16503,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic for (__pyx_t_1 = (__pyx_v_ndim - 1); __pyx_t_1 > -1; __pyx_t_1-=1) { __pyx_v_i = __pyx_t_1; - /* "View.MemoryView":1347 + /* "View.MemoryView":1349 * * for i in range(ndim - 1, -1, -1): * mslice.shape[i + offset] = mslice.shape[i] # <<<<<<<<<<<<<< @@ -17483,7 +16512,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic */ (__pyx_v_mslice->shape[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->shape[__pyx_v_i]); - /* "View.MemoryView":1348 + /* "View.MemoryView":1350 * for i in range(ndim - 1, -1, -1): * mslice.shape[i + offset] = mslice.shape[i] * mslice.strides[i + offset] = mslice.strides[i] # <<<<<<<<<<<<<< @@ -17492,7 +16521,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic */ (__pyx_v_mslice->strides[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->strides[__pyx_v_i]); - /* "View.MemoryView":1349 + /* "View.MemoryView":1351 * mslice.shape[i + offset] = mslice.shape[i] * mslice.strides[i + offset] = mslice.strides[i] * mslice.suboffsets[i + offset] = mslice.suboffsets[i] # <<<<<<<<<<<<<< @@ -17502,7 +16531,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic (__pyx_v_mslice->suboffsets[(__pyx_v_i + __pyx_v_offset)]) = (__pyx_v_mslice->suboffsets[__pyx_v_i]); } - /* "View.MemoryView":1351 + /* "View.MemoryView":1353 * mslice.suboffsets[i + offset] = mslice.suboffsets[i] * * for i in range(offset): # <<<<<<<<<<<<<< @@ -17514,7 +16543,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; - /* "View.MemoryView":1352 + /* "View.MemoryView":1354 * * for i in range(offset): * mslice.shape[i] = 1 # <<<<<<<<<<<<<< @@ -17523,7 +16552,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic */ (__pyx_v_mslice->shape[__pyx_v_i]) = 1; - /* "View.MemoryView":1353 + /* "View.MemoryView":1355 * for i in range(offset): * mslice.shape[i] = 1 * mslice.strides[i] = mslice.strides[0] # <<<<<<<<<<<<<< @@ -17532,7 +16561,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic */ (__pyx_v_mslice->strides[__pyx_v_i]) = (__pyx_v_mslice->strides[0]); - /* "View.MemoryView":1354 + /* "View.MemoryView":1356 * mslice.shape[i] = 1 * mslice.strides[i] = mslice.strides[0] * mslice.suboffsets[i] = -1 # <<<<<<<<<<<<<< @@ -17542,7 +16571,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic (__pyx_v_mslice->suboffsets[__pyx_v_i]) = -1L; } - /* "View.MemoryView":1340 + /* "View.MemoryView":1342 * * @cname('__pyx_memoryview_broadcast_leading') * cdef void broadcast_leading(__Pyx_memviewslice *mslice, # <<<<<<<<<<<<<< @@ -17553,7 +16582,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic /* function exit code */ } -/* "View.MemoryView":1362 +/* "View.MemoryView":1364 * * @cname('__pyx_memoryview_refcount_copying') * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< @@ -17564,7 +16593,7 @@ static void __pyx_memoryview_broadcast_leading(__Pyx_memviewslice *__pyx_v_mslic static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_dtype_is_object, int __pyx_v_ndim, int __pyx_v_inc) { int __pyx_t_1; - /* "View.MemoryView":1366 + /* "View.MemoryView":1368 * * * if dtype_is_object: # <<<<<<<<<<<<<< @@ -17574,7 +16603,7 @@ static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, i __pyx_t_1 = (__pyx_v_dtype_is_object != 0); if (__pyx_t_1) { - /* "View.MemoryView":1367 + /* "View.MemoryView":1369 * * if dtype_is_object: * refcount_objects_in_slice_with_gil(dst.data, dst.shape, # <<<<<<<<<<<<<< @@ -17583,7 +16612,7 @@ static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, i */ __pyx_memoryview_refcount_objects_in_slice_with_gil(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_inc); - /* "View.MemoryView":1366 + /* "View.MemoryView":1368 * * * if dtype_is_object: # <<<<<<<<<<<<<< @@ -17592,7 +16621,7 @@ static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, i */ } - /* "View.MemoryView":1362 + /* "View.MemoryView":1364 * * @cname('__pyx_memoryview_refcount_copying') * cdef void refcount_copying(__Pyx_memviewslice *dst, bint dtype_is_object, # <<<<<<<<<<<<<< @@ -17603,7 +16632,7 @@ static void __pyx_memoryview_refcount_copying(__Pyx_memviewslice *__pyx_v_dst, i /* function exit code */ } -/* "View.MemoryView":1371 +/* "View.MemoryView":1373 * * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< @@ -17618,7 +16647,7 @@ static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_da #endif __Pyx_RefNannySetupContext("refcount_objects_in_slice_with_gil", 0); - /* "View.MemoryView":1374 + /* "View.MemoryView":1376 * Py_ssize_t *strides, int ndim, * bint inc) with gil: * refcount_objects_in_slice(data, shape, strides, ndim, inc) # <<<<<<<<<<<<<< @@ -17627,7 +16656,7 @@ static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_da */ __pyx_memoryview_refcount_objects_in_slice(__pyx_v_data, __pyx_v_shape, __pyx_v_strides, __pyx_v_ndim, __pyx_v_inc); - /* "View.MemoryView":1371 + /* "View.MemoryView":1373 * * @cname('__pyx_memoryview_refcount_objects_in_slice_with_gil') * cdef void refcount_objects_in_slice_with_gil(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< @@ -17642,7 +16671,7 @@ static void __pyx_memoryview_refcount_objects_in_slice_with_gil(char *__pyx_v_da #endif } -/* "View.MemoryView":1377 +/* "View.MemoryView":1379 * * @cname('__pyx_memoryview_refcount_objects_in_slice') * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< @@ -17659,7 +16688,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss int __pyx_t_4; __Pyx_RefNannySetupContext("refcount_objects_in_slice", 0); - /* "View.MemoryView":1381 + /* "View.MemoryView":1383 * cdef Py_ssize_t i * * for i in range(shape[0]): # <<<<<<<<<<<<<< @@ -17671,7 +16700,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3; - /* "View.MemoryView":1382 + /* "View.MemoryView":1384 * * for i in range(shape[0]): * if ndim == 1: # <<<<<<<<<<<<<< @@ -17681,7 +16710,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss __pyx_t_4 = ((__pyx_v_ndim == 1) != 0); if (__pyx_t_4) { - /* "View.MemoryView":1383 + /* "View.MemoryView":1385 * for i in range(shape[0]): * if ndim == 1: * if inc: # <<<<<<<<<<<<<< @@ -17691,7 +16720,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss __pyx_t_4 = (__pyx_v_inc != 0); if (__pyx_t_4) { - /* "View.MemoryView":1384 + /* "View.MemoryView":1386 * if ndim == 1: * if inc: * Py_INCREF(( data)[0]) # <<<<<<<<<<<<<< @@ -17700,7 +16729,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss */ Py_INCREF((((PyObject **)__pyx_v_data)[0])); - /* "View.MemoryView":1383 + /* "View.MemoryView":1385 * for i in range(shape[0]): * if ndim == 1: * if inc: # <<<<<<<<<<<<<< @@ -17710,7 +16739,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss goto __pyx_L6; } - /* "View.MemoryView":1386 + /* "View.MemoryView":1388 * Py_INCREF(( data)[0]) * else: * Py_DECREF(( data)[0]) # <<<<<<<<<<<<<< @@ -17722,7 +16751,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss } __pyx_L6:; - /* "View.MemoryView":1382 + /* "View.MemoryView":1384 * * for i in range(shape[0]): * if ndim == 1: # <<<<<<<<<<<<<< @@ -17732,7 +16761,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss goto __pyx_L5; } - /* "View.MemoryView":1388 + /* "View.MemoryView":1390 * Py_DECREF(( data)[0]) * else: * refcount_objects_in_slice(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< @@ -17741,7 +16770,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss */ /*else*/ { - /* "View.MemoryView":1389 + /* "View.MemoryView":1391 * else: * refcount_objects_in_slice(data, shape + 1, strides + 1, * ndim - 1, inc) # <<<<<<<<<<<<<< @@ -17752,7 +16781,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss } __pyx_L5:; - /* "View.MemoryView":1391 + /* "View.MemoryView":1393 * ndim - 1, inc) * * data += strides[0] # <<<<<<<<<<<<<< @@ -17762,7 +16791,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss __pyx_v_data = (__pyx_v_data + (__pyx_v_strides[0])); } - /* "View.MemoryView":1377 + /* "View.MemoryView":1379 * * @cname('__pyx_memoryview_refcount_objects_in_slice') * cdef void refcount_objects_in_slice(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< @@ -17774,7 +16803,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss __Pyx_RefNannyFinishContext(); } -/* "View.MemoryView":1397 +/* "View.MemoryView":1399 * * @cname('__pyx_memoryview_slice_assign_scalar') * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< @@ -17784,7 +16813,7 @@ static void __pyx_memoryview_refcount_objects_in_slice(char *__pyx_v_data, Py_ss static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst, int __pyx_v_ndim, size_t __pyx_v_itemsize, void *__pyx_v_item, int __pyx_v_dtype_is_object) { - /* "View.MemoryView":1400 + /* "View.MemoryView":1402 * size_t itemsize, void *item, * bint dtype_is_object) nogil: * refcount_copying(dst, dtype_is_object, ndim, False) # <<<<<<<<<<<<<< @@ -17793,7 +16822,7 @@ static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst */ __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 0); - /* "View.MemoryView":1401 + /* "View.MemoryView":1403 * bint dtype_is_object) nogil: * refcount_copying(dst, dtype_is_object, ndim, False) * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, # <<<<<<<<<<<<<< @@ -17802,7 +16831,7 @@ static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst */ __pyx_memoryview__slice_assign_scalar(__pyx_v_dst->data, __pyx_v_dst->shape, __pyx_v_dst->strides, __pyx_v_ndim, __pyx_v_itemsize, __pyx_v_item); - /* "View.MemoryView":1403 + /* "View.MemoryView":1405 * _slice_assign_scalar(dst.data, dst.shape, dst.strides, ndim, * itemsize, item) * refcount_copying(dst, dtype_is_object, ndim, True) # <<<<<<<<<<<<<< @@ -17811,7 +16840,7 @@ static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst */ __pyx_memoryview_refcount_copying(__pyx_v_dst, __pyx_v_dtype_is_object, __pyx_v_ndim, 1); - /* "View.MemoryView":1397 + /* "View.MemoryView":1399 * * @cname('__pyx_memoryview_slice_assign_scalar') * cdef void slice_assign_scalar(__Pyx_memviewslice *dst, int ndim, # <<<<<<<<<<<<<< @@ -17822,7 +16851,7 @@ static void __pyx_memoryview_slice_assign_scalar(__Pyx_memviewslice *__pyx_v_dst /* function exit code */ } -/* "View.MemoryView":1407 +/* "View.MemoryView":1409 * * @cname('__pyx_memoryview__slice_assign_scalar') * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< @@ -17839,7 +16868,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t Py_ssize_t __pyx_t_3; Py_ssize_t __pyx_t_4; - /* "View.MemoryView":1411 + /* "View.MemoryView":1413 * size_t itemsize, void *item) nogil: * cdef Py_ssize_t i * cdef Py_ssize_t stride = strides[0] # <<<<<<<<<<<<<< @@ -17848,7 +16877,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t */ __pyx_v_stride = (__pyx_v_strides[0]); - /* "View.MemoryView":1412 + /* "View.MemoryView":1414 * cdef Py_ssize_t i * cdef Py_ssize_t stride = strides[0] * cdef Py_ssize_t extent = shape[0] # <<<<<<<<<<<<<< @@ -17857,7 +16886,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t */ __pyx_v_extent = (__pyx_v_shape[0]); - /* "View.MemoryView":1414 + /* "View.MemoryView":1416 * cdef Py_ssize_t extent = shape[0] * * if ndim == 1: # <<<<<<<<<<<<<< @@ -17867,7 +16896,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t __pyx_t_1 = ((__pyx_v_ndim == 1) != 0); if (__pyx_t_1) { - /* "View.MemoryView":1415 + /* "View.MemoryView":1417 * * if ndim == 1: * for i in range(extent): # <<<<<<<<<<<<<< @@ -17879,7 +16908,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1416 + /* "View.MemoryView":1418 * if ndim == 1: * for i in range(extent): * memcpy(data, item, itemsize) # <<<<<<<<<<<<<< @@ -17888,7 +16917,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t */ (void)(memcpy(__pyx_v_data, __pyx_v_item, __pyx_v_itemsize)); - /* "View.MemoryView":1417 + /* "View.MemoryView":1419 * for i in range(extent): * memcpy(data, item, itemsize) * data += stride # <<<<<<<<<<<<<< @@ -17898,7 +16927,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t __pyx_v_data = (__pyx_v_data + __pyx_v_stride); } - /* "View.MemoryView":1414 + /* "View.MemoryView":1416 * cdef Py_ssize_t extent = shape[0] * * if ndim == 1: # <<<<<<<<<<<<<< @@ -17908,7 +16937,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t goto __pyx_L3; } - /* "View.MemoryView":1419 + /* "View.MemoryView":1421 * data += stride * else: * for i in range(extent): # <<<<<<<<<<<<<< @@ -17921,7 +16950,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4; - /* "View.MemoryView":1420 + /* "View.MemoryView":1422 * else: * for i in range(extent): * _slice_assign_scalar(data, shape + 1, strides + 1, # <<<<<<<<<<<<<< @@ -17930,7 +16959,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t */ __pyx_memoryview__slice_assign_scalar(__pyx_v_data, (__pyx_v_shape + 1), (__pyx_v_strides + 1), (__pyx_v_ndim - 1), __pyx_v_itemsize, __pyx_v_item); - /* "View.MemoryView":1422 + /* "View.MemoryView":1424 * _slice_assign_scalar(data, shape + 1, strides + 1, * ndim - 1, itemsize, item) * data += stride # <<<<<<<<<<<<<< @@ -17942,7 +16971,7 @@ static void __pyx_memoryview__slice_assign_scalar(char *__pyx_v_data, Py_ssize_t } __pyx_L3:; - /* "View.MemoryView":1407 + /* "View.MemoryView":1409 * * @cname('__pyx_memoryview__slice_assign_scalar') * cdef void _slice_assign_scalar(char *data, Py_ssize_t *shape, # <<<<<<<<<<<<<< @@ -17966,6 +16995,9 @@ static PyObject *__pyx_pw_15View_dot_MemoryView_1__pyx_unpickle_Enum(PyObject *_ PyObject *__pyx_v___pyx_type = 0; long __pyx_v___pyx_checksum; PyObject *__pyx_v___pyx_state = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__pyx_unpickle_Enum (wrapper)", 0); @@ -18037,125 +17069,132 @@ static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSE PyObject *__pyx_v___pyx_result = 0; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; - int __pyx_t_6; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_Enum", 0); /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * if __pyx_checksum not in (0xb068931, 0x82a3537, 0x6ae9995): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) */ - __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xb068931) != 0); - if (__pyx_t_1) { + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_tuple__21, Py_NE)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { /* "(tree fragment)":5 * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: + * if __pyx_checksum not in (0xb068931, 0x82a3537, 0x6ae9995): * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) * __pyx_result = Enum.__new__(__pyx_type) */ - __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_n_s_PickleError); __Pyx_GIVEREF(__pyx_n_s_PickleError); - PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); - __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 5, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_2); - __pyx_v___pyx_PickleError = __pyx_t_2; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_PickleError); + __pyx_t_4 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_1, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_t_1); + __pyx_v___pyx_PickleError = __pyx_t_1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":6 - * if __pyx_checksum != 0xb068931: + * if __pyx_checksum not in (0xb068931, 0x82a3537, 0x6ae9995): * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) # <<<<<<<<<<<<<< * __pyx_result = Enum.__new__(__pyx_type) * if __pyx_state is not None: */ - __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_INCREF(__pyx_v___pyx_PickleError); - __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; - if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); + __pyx_t_1 = __pyx_v___pyx_PickleError; __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); + __Pyx_DECREF_SET(__pyx_t_1, function); } } - __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 6, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_Raise(__pyx_t_3, 0, 0, 0); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(2, 6, __pyx_L1_error) /* "(tree fragment)":4 * cdef object __pyx_PickleError * cdef object __pyx_result - * if __pyx_checksum != 0xb068931: # <<<<<<<<<<<<<< + * if __pyx_checksum not in (0xb068931, 0x82a3537, 0x6ae9995): # <<<<<<<<<<<<<< * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) */ } /* "(tree fragment)":7 * from pickle import PickleError as __pyx_PickleError - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) * __pyx_result = Enum.__new__(__pyx_type) # <<<<<<<<<<<<<< * if __pyx_state is not None: * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(2, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = NULL; - if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_4)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_4); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_MemviewEnum_type), __pyx_n_s_new); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_1))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); + __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); + __Pyx_DECREF_SET(__pyx_t_1, function); } } - __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); - __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 7, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v___pyx_result = __pyx_t_3; - __pyx_t_3 = 0; + __pyx_t_4 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v___pyx_type); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result = __pyx_t_4; + __pyx_t_4 = 0; /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) * __pyx_result = Enum.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) * return __pyx_result */ - __pyx_t_1 = (__pyx_v___pyx_state != Py_None); - __pyx_t_6 = (__pyx_t_1 != 0); - if (__pyx_t_6) { + __pyx_t_3 = (__pyx_v___pyx_state != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + if (__pyx_t_2) { /* "(tree fragment)":9 * __pyx_result = Enum.__new__(__pyx_type) @@ -18164,13 +17203,13 @@ static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSE * return __pyx_result * cdef __pyx_unpickle_Enum__set_state(Enum __pyx_result, tuple __pyx_state): */ - if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 9, __pyx_L1_error) - __pyx_t_3 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(2, 9, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||((void)PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(2, 9, __pyx_L1_error) + __pyx_t_4 = __pyx_unpickle_Enum__set_state(((struct __pyx_MemviewEnum_obj *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_4)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* "(tree fragment)":8 - * raise __pyx_PickleError("Incompatible checksums (%s vs 0xb068931 = (name))" % __pyx_checksum) + * raise __pyx_PickleError("Incompatible checksums (0x%x vs (0xb068931, 0x82a3537, 0x6ae9995) = (name))" % __pyx_checksum) * __pyx_result = Enum.__new__(__pyx_type) * if __pyx_state is not None: # <<<<<<<<<<<<<< * __pyx_unpickle_Enum__set_state( __pyx_result, __pyx_state) @@ -18198,10 +17237,10 @@ static PyObject *__pyx_pf_15View_dot_MemoryView___pyx_unpickle_Enum(CYTHON_UNUSE /* function exit code */ __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("View.MemoryView.__pyx_unpickle_Enum", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; @@ -18231,6 +17270,9 @@ static PyObject *__pyx_unpickle_Enum__set_state(struct __pyx_MemviewEnum_obj *__ PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__pyx_unpickle_Enum__set_state", 0); /* "(tree fragment)":12 @@ -18372,9 +17414,9 @@ static void __pyx_tp_dealloc_array(PyObject *o) { { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); - ++Py_REFCNT(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); __pyx_array___dealloc__(o); - --Py_REFCNT(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); PyErr_Restore(etype, eval, etb); } Py_CLEAR(p->mode); @@ -18522,12 +17564,15 @@ static PyTypeObject __pyx_type___pyx_array = { #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif - #if PY_VERSION_HEX >= 0x030800b1 + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 + 0, /*tp_pypy_flags*/ + #endif }; static PyObject *__pyx_tp_new_Enum(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { @@ -18641,12 +17686,15 @@ static PyTypeObject __pyx_type___pyx_MemviewEnum = { #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif - #if PY_VERSION_HEX >= 0x030800b1 + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 + 0, /*tp_pypy_flags*/ + #endif }; static struct __pyx_vtabstruct_memoryview __pyx_vtable_memoryview; @@ -18683,9 +17731,9 @@ static void __pyx_tp_dealloc_memoryview(PyObject *o) { { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); - ++Py_REFCNT(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); __pyx_memoryview___dealloc__(o); - --Py_REFCNT(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); PyErr_Restore(etype, eval, etb); } Py_CLEAR(p->obj); @@ -18902,12 +17950,15 @@ static PyTypeObject __pyx_type___pyx_memoryview = { #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif - #if PY_VERSION_HEX >= 0x030800b1 + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 + 0, /*tp_pypy_flags*/ + #endif }; static struct __pyx_vtabstruct__memoryviewslice __pyx_vtable__memoryviewslice; @@ -18933,9 +17984,9 @@ static void __pyx_tp_dealloc__memoryviewslice(PyObject *o) { { PyObject *etype, *eval, *etb; PyErr_Fetch(&etype, &eval, &etb); - ++Py_REFCNT(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); __pyx_memoryviewslice___dealloc__(o); - --Py_REFCNT(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); PyErr_Restore(etype, eval, etb); } Py_CLEAR(p->from_object); @@ -19048,12 +18099,15 @@ static PyTypeObject __pyx_type___pyx_memoryviewslice = { #if PY_VERSION_HEX >= 0x030400a1 0, /*tp_finalize*/ #endif - #if PY_VERSION_HEX >= 0x030800b1 + #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) 0, /*tp_vectorcall*/ #endif #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 0, /*tp_print*/ #endif + #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 + 0, /*tp_pypy_flags*/ + #endif }; static PyMethodDef __pyx_methods[] = { @@ -19110,10 +18164,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_Cannot_index_with_type_s, __pyx_k_Cannot_index_with_type_s, sizeof(__pyx_k_Cannot_index_with_type_s), 0, 0, 1, 0}, {&__pyx_n_s_Ellipsis, __pyx_k_Ellipsis, sizeof(__pyx_k_Ellipsis), 0, 0, 1, 1}, {&__pyx_kp_s_Empty_shape_tuple_for_cython_arr, __pyx_k_Empty_shape_tuple_for_cython_arr, sizeof(__pyx_k_Empty_shape_tuple_for_cython_arr), 0, 0, 1, 0}, - {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, - {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, - {&__pyx_kp_s_Incompatible_checksums_s_vs_0xb0, __pyx_k_Incompatible_checksums_s_vs_0xb0, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xb0), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_0x_x_vs_0, __pyx_k_Incompatible_checksums_0x_x_vs_0, sizeof(__pyx_k_Incompatible_checksums_0x_x_vs_0), 0, 0, 1, 0}, {&__pyx_n_s_IndexError, __pyx_k_IndexError, sizeof(__pyx_k_IndexError), 0, 0, 1, 1}, {&__pyx_kp_s_Indirect_dimensions_not_supporte, __pyx_k_Indirect_dimensions_not_supporte, sizeof(__pyx_k_Indirect_dimensions_not_supporte), 0, 0, 1, 0}, {&__pyx_kp_s_Invalid_mode_expected_c_or_fortr, __pyx_k_Invalid_mode_expected_c_or_fortr, sizeof(__pyx_k_Invalid_mode_expected_c_or_fortr), 0, 0, 1, 0}, @@ -19121,11 +18173,9 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, {&__pyx_kp_s_MemoryView_of_r_at_0x_x, __pyx_k_MemoryView_of_r_at_0x_x, sizeof(__pyx_k_MemoryView_of_r_at_0x_x), 0, 0, 1, 0}, {&__pyx_kp_s_MemoryView_of_r_object, __pyx_k_MemoryView_of_r_object, sizeof(__pyx_k_MemoryView_of_r_object), 0, 0, 1, 0}, - {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, {&__pyx_n_b_O, __pyx_k_O, sizeof(__pyx_k_O), 0, 0, 0, 1}, {&__pyx_kp_s_Out_of_bounds_on_buffer_access_a, __pyx_k_Out_of_bounds_on_buffer_access_a, sizeof(__pyx_k_Out_of_bounds_on_buffer_access_a), 0, 0, 1, 0}, {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, - {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, {&__pyx_kp_s_Unable_to_convert_item_to_object, __pyx_k_Unable_to_convert_item_to_object, sizeof(__pyx_k_Unable_to_convert_item_to_object), 0, 0, 1, 0}, {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, @@ -19168,8 +18218,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_n_reactants, __pyx_k_n_reactants, sizeof(__pyx_k_n_reactants), 0, 0, 1, 1}, {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, {&__pyx_n_s_name_2, __pyx_k_name_2, sizeof(__pyx_k_name_2), 0, 0, 1, 1}, - {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, - {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, {&__pyx_n_s_ndim, __pyx_k_ndim, sizeof(__pyx_k_ndim), 0, 0, 1, 1}, {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, {&__pyx_n_s_new_cdf, __pyx_k_new_cdf, sizeof(__pyx_k_new_cdf), 0, 0, 1, 1}, @@ -19218,7 +18266,6 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_n_s_total_rate, __pyx_k_total_rate, sizeof(__pyx_k_total_rate), 0, 0, 1, 1}, {&__pyx_kp_s_unable_to_allocate_array_data, __pyx_k_unable_to_allocate_array_data, sizeof(__pyx_k_unable_to_allocate_array_data), 0, 0, 1, 0}, {&__pyx_kp_s_unable_to_allocate_shape_and_str, __pyx_k_unable_to_allocate_shape_and_str, sizeof(__pyx_k_unable_to_allocate_shape_and_str), 0, 0, 1, 0}, - {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, {&__pyx_n_s_unpack, __pyx_k_unpack, sizeof(__pyx_k_unpack), 0, 0, 1, 1}, {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1}, @@ -19227,15 +18274,14 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = { }; static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 35, __pyx_L1_error) - __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 272, __pyx_L1_error) - __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 856, __pyx_L1_error) - __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 1038, __pyx_L1_error) - __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(2, 148, __pyx_L1_error) - __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(2, 151, __pyx_L1_error) + __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 944, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(2, 134, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(2, 149, __pyx_L1_error) + __pyx_builtin_enumerate = __Pyx_GetBuiltinName(__pyx_n_s_enumerate); if (!__pyx_builtin_enumerate) __PYX_ERR(2, 152, __pyx_L1_error) __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(2, 2, __pyx_L1_error) - __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(2, 404, __pyx_L1_error) - __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(2, 613, __pyx_L1_error) - __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(2, 832, __pyx_L1_error) + __pyx_builtin_Ellipsis = __Pyx_GetBuiltinName(__pyx_n_s_Ellipsis); if (!__pyx_builtin_Ellipsis) __PYX_ERR(2, 406, __pyx_L1_error) + __pyx_builtin_id = __Pyx_GetBuiltinName(__pyx_n_s_id); if (!__pyx_builtin_id) __PYX_ERR(2, 615, __pyx_L1_error) + __pyx_builtin_IndexError = __Pyx_GetBuiltinName(__pyx_n_s_IndexError); if (!__pyx_builtin_IndexError) __PYX_ERR(2, 834, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; @@ -19245,137 +18291,82 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":272 - * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_C_CONTIGUOUS)): - * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< - * - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) - */ - __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 272, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple_); - __Pyx_GIVEREF(__pyx_tuple_); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":276 - * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) - * and not PyArray_CHKFLAGS(self, NPY_ARRAY_F_CONTIGUOUS)): - * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< - * - * info.buf = PyArray_DATA(self) - */ - __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 276, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__2); - __Pyx_GIVEREF(__pyx_tuple__2); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":306 - * if ((descr.byteorder == c'>' and little_endian) or - * (descr.byteorder == c'<' and not little_endian)): - * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< - * if t == NPY_BYTE: f = "b" - * elif t == NPY_UBYTE: f = "B" - */ - __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(1, 306, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__3); - __Pyx_GIVEREF(__pyx_tuple__3); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":856 - * - * if (end - f) - (new_offset - offset[0]) < 15: - * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< - * - * if ((child.byteorder == c'>' and little_endian) or - */ - __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 856, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__4); - __Pyx_GIVEREF(__pyx_tuple__4); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":880 - * t = child.type_num - * if end - f < 5: - * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< - * - * # Until ticket #99 is fixed, use integers to avoid warnings - */ - __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 880, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__5); - __Pyx_GIVEREF(__pyx_tuple__5); - - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1038 - * _import_array() + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":944 + * __pyx_import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ - __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 1038, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__6); - __Pyx_GIVEREF(__pyx_tuple__6); + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple_)) __PYX_ERR(1, 944, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); - /* "../../anaconda3/lib/python3.7/site-packages/Cython/Includes/numpy/__init__.pxd":1044 + /* "../../anaconda3/envs/pygom_test_3.10/lib/python3.10/site-packages/numpy/__init__.pxd":950 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ - __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 1044, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__7); - __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 950, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); - /* "View.MemoryView":133 + /* "View.MemoryView":134 * * if not self.ndim: * raise ValueError("Empty shape tuple for cython.array") # <<<<<<<<<<<<<< * * if itemsize <= 0: */ - __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(2, 133, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__8); - __Pyx_GIVEREF(__pyx_tuple__8); + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_Empty_shape_tuple_for_cython_arr); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(2, 134, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); - /* "View.MemoryView":136 + /* "View.MemoryView":137 * * if itemsize <= 0: * raise ValueError("itemsize <= 0 for cython.array") # <<<<<<<<<<<<<< * * if not isinstance(format, bytes): */ - __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 136, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__9); - __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_itemsize_0_for_cython_array); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(2, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); - /* "View.MemoryView":148 + /* "View.MemoryView":149 * * if not self._shape: * raise MemoryError("unable to allocate shape and strides.") # <<<<<<<<<<<<<< * * */ - __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 148, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__10); - __Pyx_GIVEREF(__pyx_tuple__10); + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_shape_and_str); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(2, 149, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); - /* "View.MemoryView":176 + /* "View.MemoryView":177 * self.data = malloc(self.len) * if not self.data: * raise MemoryError("unable to allocate array data.") # <<<<<<<<<<<<<< * * if self.dtype_is_object: */ - __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(2, 176, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__11); - __Pyx_GIVEREF(__pyx_tuple__11); + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_unable_to_allocate_array_data); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(2, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); - /* "View.MemoryView":192 + /* "View.MemoryView":193 * bufmode = PyBUF_F_CONTIGUOUS | PyBUF_ANY_CONTIGUOUS * if not (flags & bufmode): * raise ValueError("Can only create a buffer that is contiguous in memory.") # <<<<<<<<<<<<<< * info.buf = self.data * info.len = self.len */ - __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(2, 192, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__12); - __Pyx_GIVEREF(__pyx_tuple__12); + __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_Can_only_create_a_buffer_that_is); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(2, 193, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); /* "(tree fragment)":2 * def __reduce_cython__(self): @@ -19383,76 +18374,76 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__13); - __Pyx_GIVEREF(__pyx_tuple__13); + __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__8); + __Pyx_GIVEREF(__pyx_tuple__8); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__14); - __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); - /* "View.MemoryView":418 + /* "View.MemoryView":420 * def __setitem__(memoryview self, object index, object value): * if self.view.readonly: * raise TypeError("Cannot assign to read-only memoryview") # <<<<<<<<<<<<<< * * have_slices, index = _unellipsify(index, self.view.ndim) */ - __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 418, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__15); - __Pyx_GIVEREF(__pyx_tuple__15); + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Cannot_assign_to_read_only_memor); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(2, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); - /* "View.MemoryView":495 + /* "View.MemoryView":497 * result = struct.unpack(self.view.format, bytesitem) * except struct.error: * raise ValueError("Unable to convert item to object") # <<<<<<<<<<<<<< * else: * if len(self.view.format) == 1: */ - __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 495, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__16); - __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_Unable_to_convert_item_to_object); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(2, 497, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); - /* "View.MemoryView":520 + /* "View.MemoryView":522 * def __getbuffer__(self, Py_buffer *info, int flags): * if flags & PyBUF_WRITABLE and self.view.readonly: * raise ValueError("Cannot create writable memory view from read-only memoryview") # <<<<<<<<<<<<<< * * if flags & PyBUF_ND: */ - __pyx_tuple__17 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(2, 520, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__17); - __Pyx_GIVEREF(__pyx_tuple__17); + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Cannot_create_writable_memory_vi); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(2, 522, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); - /* "View.MemoryView":570 + /* "View.MemoryView":572 * if self.view.strides == NULL: * * raise ValueError("Buffer view does not expose strides") # <<<<<<<<<<<<<< * * return tuple([stride for stride in self.view.strides[:self.view.ndim]]) */ - __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 570, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__18); - __Pyx_GIVEREF(__pyx_tuple__18); + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_Buffer_view_does_not_expose_stri); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(2, 572, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); - /* "View.MemoryView":577 + /* "View.MemoryView":579 * def suboffsets(self): * if self.view.suboffsets == NULL: * return (-1,) * self.view.ndim # <<<<<<<<<<<<<< * * return tuple([suboffset for suboffset in self.view.suboffsets[:self.view.ndim]]) */ - __pyx_tuple__19 = PyTuple_New(1); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 577, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__19); + __pyx_tuple__14 = PyTuple_New(1); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(2, 579, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); __Pyx_INCREF(__pyx_int_neg_1); __Pyx_GIVEREF(__pyx_int_neg_1); - PyTuple_SET_ITEM(__pyx_tuple__19, 0, __pyx_int_neg_1); - __Pyx_GIVEREF(__pyx_tuple__19); + PyTuple_SET_ITEM(__pyx_tuple__14, 0, __pyx_int_neg_1); + __Pyx_GIVEREF(__pyx_tuple__14); /* "(tree fragment)":2 * def __reduce_cython__(self): @@ -19460,40 +18451,40 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__20); - __Pyx_GIVEREF(__pyx_tuple__20); + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__21); - __Pyx_GIVEREF(__pyx_tuple__21); + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); - /* "View.MemoryView":682 + /* "View.MemoryView":684 * if item is Ellipsis: * if not seen_ellipsis: * result.extend([slice(None)] * (ndim - len(tup) + 1)) # <<<<<<<<<<<<<< * seen_ellipsis = True * else: */ - __pyx_slice__22 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__22)) __PYX_ERR(2, 682, __pyx_L1_error) - __Pyx_GOTREF(__pyx_slice__22); - __Pyx_GIVEREF(__pyx_slice__22); + __pyx_slice__17 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__17)) __PYX_ERR(2, 684, __pyx_L1_error) + __Pyx_GOTREF(__pyx_slice__17); + __Pyx_GIVEREF(__pyx_slice__17); - /* "View.MemoryView":703 + /* "View.MemoryView":705 * for suboffset in suboffsets[:ndim]: * if suboffset >= 0: * raise ValueError("Indirect dimensions not supported") # <<<<<<<<<<<<<< * * */ - __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(2, 703, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__23); - __Pyx_GIVEREF(__pyx_tuple__23); + __pyx_tuple__18 = PyTuple_Pack(1, __pyx_kp_s_Indirect_dimensions_not_supporte); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(2, 705, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__18); + __Pyx_GIVEREF(__pyx_tuple__18); /* "(tree fragment)":2 * def __reduce_cython__(self): @@ -19501,18 +18492,21 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") */ - __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(2, 2, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__24); - __Pyx_GIVEREF(__pyx_tuple__24); + __pyx_tuple__19 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(2, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__19); + __Pyx_GIVEREF(__pyx_tuple__19); /* "(tree fragment)":4 * raise TypeError("no default __reduce__ due to non-trivial __cinit__") * def __setstate_cython__(self, __pyx_state): * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< */ - __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(2, 4, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__25); - __Pyx_GIVEREF(__pyx_tuple__25); + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + __pyx_tuple__21 = PyTuple_Pack(3, __pyx_int_184977713, __pyx_int_136983863, __pyx_int_112105877); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(2, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); /* "pygom/model/_tau_leap.pyx":11 * @cython.wraparound(False) # Deactivate negative indexing. @@ -19521,75 +18515,75 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { * np.ndarray[np.int64_t, ndim=2] reactant_mat, * np.ndarray[np.float64_t] rates, */ - __pyx_tuple__26 = PyTuple_Pack(19, __pyx_n_s_x, __pyx_n_s_reactant_mat, __pyx_n_s_rates, __pyx_n_s_tau_scale, __pyx_n_s_epsilon, __pyx_n_s_rates_view, __pyx_n_s_n_rates, __pyx_n_s_x_view, __pyx_n_s_reactant_mat_view, __pyx_n_s_n_reactants, __pyx_n_s_mu, __pyx_n_s_max_cdf, __pyx_n_s_new_cdf, __pyx_n_s_total_rate, __pyx_n_s_safe, __pyx_n_s_count, __pyx_n_s_cdf_val, __pyx_n_s_i, __pyx_n_s_j); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 11, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__26); - __Pyx_GIVEREF(__pyx_tuple__26); - __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(5, 0, 19, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pygom_model__tau_leap_pyx, __pyx_n_s_cy_test_tau_leap_safety, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 11, __pyx_L1_error) + __pyx_tuple__22 = PyTuple_Pack(19, __pyx_n_s_x, __pyx_n_s_reactant_mat, __pyx_n_s_rates, __pyx_n_s_tau_scale, __pyx_n_s_epsilon, __pyx_n_s_rates_view, __pyx_n_s_n_rates, __pyx_n_s_x_view, __pyx_n_s_reactant_mat_view, __pyx_n_s_n_reactants, __pyx_n_s_mu, __pyx_n_s_max_cdf, __pyx_n_s_new_cdf, __pyx_n_s_total_rate, __pyx_n_s_safe, __pyx_n_s_count, __pyx_n_s_cdf_val, __pyx_n_s_i, __pyx_n_s_j); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(5, 0, 19, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_pygom_model__tau_leap_pyx, __pyx_n_s_cy_test_tau_leap_safety, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 11, __pyx_L1_error) - /* "View.MemoryView":286 + /* "View.MemoryView":287 * return self.name * * cdef generic = Enum("") # <<<<<<<<<<<<<< * cdef strided = Enum("") # default * cdef indirect = Enum("") */ - __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(2, 286, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__28); - __Pyx_GIVEREF(__pyx_tuple__28); + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct_or_indirect); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(2, 287, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); - /* "View.MemoryView":287 + /* "View.MemoryView":288 * * cdef generic = Enum("") * cdef strided = Enum("") # default # <<<<<<<<<<<<<< * cdef indirect = Enum("") * */ - __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(2, 287, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__29); - __Pyx_GIVEREF(__pyx_tuple__29); + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_s_strided_and_direct); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(2, 288, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); - /* "View.MemoryView":288 + /* "View.MemoryView":289 * cdef generic = Enum("") * cdef strided = Enum("") # default * cdef indirect = Enum("") # <<<<<<<<<<<<<< * * */ - __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(2, 288, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__30); - __Pyx_GIVEREF(__pyx_tuple__30); + __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_strided_and_indirect); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(2, 289, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); - /* "View.MemoryView":291 + /* "View.MemoryView":292 * * * cdef contiguous = Enum("") # <<<<<<<<<<<<<< * cdef indirect_contiguous = Enum("") * */ - __pyx_tuple__31 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(2, 291, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__31); - __Pyx_GIVEREF(__pyx_tuple__31); + __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_direct); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(2, 292, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); - /* "View.MemoryView":292 + /* "View.MemoryView":293 * * cdef contiguous = Enum("") * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< * * */ - __pyx_tuple__32 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(2, 292, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__32); - __Pyx_GIVEREF(__pyx_tuple__32); + __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_contiguous_and_indirect); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(2, 293, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); /* "(tree fragment)":1 * def __pyx_unpickle_Enum(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< * cdef object __pyx_PickleError * cdef object __pyx_result */ - __pyx_tuple__33 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(2, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__33); - __Pyx_GIVEREF(__pyx_tuple__33); - __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(2, 1, __pyx_L1_error) + __pyx_tuple__29 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(2, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_Enum, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(2, 1, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -19598,9 +18592,11 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { } static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_112105877 = PyInt_FromLong(112105877L); if (unlikely(!__pyx_int_112105877)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_136983863 = PyInt_FromLong(136983863L); if (unlikely(!__pyx_int_136983863)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_184977713 = PyInt_FromLong(184977713L); if (unlikely(!__pyx_int_184977713)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; @@ -19647,25 +18643,28 @@ static int __Pyx_modinit_function_export_code(void) { static int __Pyx_modinit_type_init_code(void) { __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); /*--- Type init code ---*/ __pyx_vtabptr_array = &__pyx_vtable_array; __pyx_vtable_array.get_memview = (PyObject *(*)(struct __pyx_array_obj *))__pyx_array_get_memview; - if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 106, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_array.tp_print = 0; #endif - if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 105, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type___pyx_array.tp_dict, __pyx_vtabptr_array) < 0) __PYX_ERR(2, 106, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_array) < 0) __PYX_ERR(2, 106, __pyx_L1_error) __pyx_array_type = &__pyx_type___pyx_array; - if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 279, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 280, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_MemviewEnum.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_MemviewEnum.tp_dictoffset && __pyx_type___pyx_MemviewEnum.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type___pyx_MemviewEnum.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 279, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_MemviewEnum) < 0) __PYX_ERR(2, 280, __pyx_L1_error) __pyx_MemviewEnum_type = &__pyx_type___pyx_MemviewEnum; __pyx_vtabptr_memoryview = &__pyx_vtable_memoryview; __pyx_vtable_memoryview.get_item_pointer = (char *(*)(struct __pyx_memoryview_obj *, PyObject *))__pyx_memoryview_get_item_pointer; @@ -19675,30 +18674,30 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_vtable_memoryview.setitem_indexed = (PyObject *(*)(struct __pyx_memoryview_obj *, PyObject *, PyObject *))__pyx_memoryview_setitem_indexed; __pyx_vtable_memoryview.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryview_convert_item_to_object; __pyx_vtable_memoryview.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryview_assign_item_from_object; - if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 331, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_memoryview.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryview.tp_dictoffset && __pyx_type___pyx_memoryview.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type___pyx_memoryview.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 330, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type___pyx_memoryview.tp_dict, __pyx_vtabptr_memoryview) < 0) __PYX_ERR(2, 331, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryview) < 0) __PYX_ERR(2, 331, __pyx_L1_error) __pyx_memoryview_type = &__pyx_type___pyx_memoryview; __pyx_vtabptr__memoryviewslice = &__pyx_vtable__memoryviewslice; __pyx_vtable__memoryviewslice.__pyx_base = *__pyx_vtabptr_memoryview; __pyx_vtable__memoryviewslice.__pyx_base.convert_item_to_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *))__pyx_memoryviewslice_convert_item_to_object; __pyx_vtable__memoryviewslice.__pyx_base.assign_item_from_object = (PyObject *(*)(struct __pyx_memoryview_obj *, char *, PyObject *))__pyx_memoryviewslice_assign_item_from_object; __pyx_type___pyx_memoryviewslice.tp_base = __pyx_memoryview_type; - if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) + if (PyType_Ready(&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 967, __pyx_L1_error) #if PY_VERSION_HEX < 0x030800B1 __pyx_type___pyx_memoryviewslice.tp_print = 0; #endif if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type___pyx_memoryviewslice.tp_dictoffset && __pyx_type___pyx_memoryviewslice.tp_getattro == PyObject_GenericGetAttr)) { __pyx_type___pyx_memoryviewslice.tp_getattro = __Pyx_PyObject_GenericGetAttr; } - if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) - if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 965, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_type___pyx_memoryviewslice.tp_dict, __pyx_vtabptr__memoryviewslice) < 0) __PYX_ERR(2, 967, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type___pyx_memoryviewslice) < 0) __PYX_ERR(2, 967, __pyx_L1_error) __pyx_memoryviewslice_type = &__pyx_type___pyx_memoryviewslice; __Pyx_RefNannyFinishContext(); return 0; @@ -19710,6 +18709,9 @@ static int __Pyx_modinit_type_init_code(void) { static int __Pyx_modinit_type_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) @@ -19723,18 +18725,38 @@ static int __Pyx_modinit_type_import_code(void) { __Pyx_ImportType_CheckSize_Warn); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 206, __pyx_L1_error) + __pyx_t_1 = PyImport_ImportModule("numpy"); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 199, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_5numpy_dtype = __Pyx_ImportType(__pyx_t_1, "numpy", "dtype", sizeof(PyArray_Descr), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 206, __pyx_L1_error) - __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 229, __pyx_L1_error) - __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 233, __pyx_L1_error) + if (!__pyx_ptype_5numpy_dtype) __PYX_ERR(1, 199, __pyx_L1_error) + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(__pyx_t_1, "numpy", "flatiter", sizeof(PyArrayIterObject), __Pyx_ImportType_CheckSize_Ignore); + if (!__pyx_ptype_5numpy_flatiter) __PYX_ERR(1, 222, __pyx_L1_error) + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(__pyx_t_1, "numpy", "broadcast", sizeof(PyArrayMultiIterObject), __Pyx_ImportType_CheckSize_Ignore); + if (!__pyx_ptype_5numpy_broadcast) __PYX_ERR(1, 226, __pyx_L1_error) __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(__pyx_t_1, "numpy", "ndarray", sizeof(PyArrayObject), __Pyx_ImportType_CheckSize_Ignore); - if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 242, __pyx_L1_error) - __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Warn); - if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 918, __pyx_L1_error) + if (!__pyx_ptype_5numpy_ndarray) __PYX_ERR(1, 238, __pyx_L1_error) + __pyx_ptype_5numpy_generic = __Pyx_ImportType(__pyx_t_1, "numpy", "generic", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_generic) __PYX_ERR(1, 770, __pyx_L1_error) + __pyx_ptype_5numpy_number = __Pyx_ImportType(__pyx_t_1, "numpy", "number", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_number) __PYX_ERR(1, 772, __pyx_L1_error) + __pyx_ptype_5numpy_integer = __Pyx_ImportType(__pyx_t_1, "numpy", "integer", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_integer) __PYX_ERR(1, 774, __pyx_L1_error) + __pyx_ptype_5numpy_signedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "signedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_signedinteger) __PYX_ERR(1, 776, __pyx_L1_error) + __pyx_ptype_5numpy_unsignedinteger = __Pyx_ImportType(__pyx_t_1, "numpy", "unsignedinteger", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_unsignedinteger) __PYX_ERR(1, 778, __pyx_L1_error) + __pyx_ptype_5numpy_inexact = __Pyx_ImportType(__pyx_t_1, "numpy", "inexact", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_inexact) __PYX_ERR(1, 780, __pyx_L1_error) + __pyx_ptype_5numpy_floating = __Pyx_ImportType(__pyx_t_1, "numpy", "floating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_floating) __PYX_ERR(1, 782, __pyx_L1_error) + __pyx_ptype_5numpy_complexfloating = __Pyx_ImportType(__pyx_t_1, "numpy", "complexfloating", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_complexfloating) __PYX_ERR(1, 784, __pyx_L1_error) + __pyx_ptype_5numpy_flexible = __Pyx_ImportType(__pyx_t_1, "numpy", "flexible", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_flexible) __PYX_ERR(1, 786, __pyx_L1_error) + __pyx_ptype_5numpy_character = __Pyx_ImportType(__pyx_t_1, "numpy", "character", sizeof(PyObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_5numpy_character) __PYX_ERR(1, 788, __pyx_L1_error) + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(__pyx_t_1, "numpy", "ufunc", sizeof(PyUFuncObject), __Pyx_ImportType_CheckSize_Ignore); + if (!__pyx_ptype_5numpy_ufunc) __PYX_ERR(1, 826, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; @@ -19755,11 +18777,15 @@ static int __Pyx_modinit_variable_import_code(void) { static int __Pyx_modinit_function_import_code(void) { __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); /*--- Function import code ---*/ __pyx_t_1 = PyImport_ImportModule("scipy.special.cython_special"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); if (__Pyx_ImportFunction(__pyx_t_1, "pdtr", (void (**)(void))&__pyx_f_5scipy_7special_14cython_special_pdtr, "double (double, double, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error) - Py_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; @@ -19769,17 +18795,19 @@ static int __Pyx_modinit_function_import_code(void) { } -#if PY_MAJOR_VERSION < 3 -#ifdef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC void -#else +#ifndef CYTHON_NO_PYINIT_EXPORT #define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void #endif #else -#ifdef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyObject * +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * #else -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#define __Pyx_PyMODINIT_FUNC PyObject * #endif #endif @@ -19862,6 +18890,9 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec__tau_leap(PyObject *__pyx_pyinit_m { PyObject *__pyx_t_1 = NULL; static PyThread_type_lock __pyx_t_2[8]; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m) { @@ -19909,11 +18940,9 @@ if (!__Pyx_RefNanny) { #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ - #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - #ifdef WITH_THREAD /* Python build with threading support? */ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS PyEval_InitThreads(); #endif - #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; @@ -19932,7 +18961,7 @@ if (!__Pyx_RefNanny) { Py_INCREF(__pyx_b); __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_cython_runtime); - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) @@ -19950,17 +18979,17 @@ if (!__Pyx_RefNanny) { } #endif /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) goto __pyx_L1_error; + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) goto __pyx_L1_error; + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global type/function init code ---*/ (void)__Pyx_modinit_global_init_code(); (void)__Pyx_modinit_variable_export_code(); (void)__Pyx_modinit_function_export_code(); - if (unlikely(__Pyx_modinit_type_init_code() != 0)) goto __pyx_L1_error; - if (unlikely(__Pyx_modinit_type_import_code() != 0)) goto __pyx_L1_error; + if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) (void)__Pyx_modinit_variable_import_code(); - if (unlikely(__Pyx_modinit_function_import_code() != 0)) goto __pyx_L1_error; + if (unlikely(__Pyx_modinit_function_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) @@ -19998,90 +19027,90 @@ if (!__Pyx_RefNanny) { if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":209 + /* "View.MemoryView":210 * info.obj = self * * __pyx_getbuffer = capsule( &__pyx_array_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< * * def __dealloc__(array self): */ - __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 209, __pyx_L1_error) + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_array_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 210, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 209, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_array_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 210, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyType_Modified(__pyx_array_type); - /* "View.MemoryView":286 + /* "View.MemoryView":287 * return self.name * * cdef generic = Enum("") # <<<<<<<<<<<<<< * cdef strided = Enum("") # default * cdef indirect = Enum("") */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 286, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 287, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(generic); __Pyx_DECREF_SET(generic, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":287 + /* "View.MemoryView":288 * * cdef generic = Enum("") * cdef strided = Enum("") # default # <<<<<<<<<<<<<< * cdef indirect = Enum("") * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 287, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 288, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(strided); __Pyx_DECREF_SET(strided, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":288 + /* "View.MemoryView":289 * cdef generic = Enum("") * cdef strided = Enum("") # default * cdef indirect = Enum("") # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 288, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 289, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(indirect); __Pyx_DECREF_SET(indirect, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":291 + /* "View.MemoryView":292 * * * cdef contiguous = Enum("") # <<<<<<<<<<<<<< * cdef indirect_contiguous = Enum("") * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__31, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 291, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 292, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(contiguous); __Pyx_DECREF_SET(contiguous, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":292 + /* "View.MemoryView":293 * * cdef contiguous = Enum("") * cdef indirect_contiguous = Enum("") # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 292, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_MemviewEnum_type), __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 293, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XGOTREF(indirect_contiguous); __Pyx_DECREF_SET(indirect_contiguous, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; - /* "View.MemoryView":316 + /* "View.MemoryView":317 * * DEF THREAD_LOCKS_PREALLOCATED = 8 * cdef int __pyx_memoryview_thread_locks_used = 0 # <<<<<<<<<<<<<< @@ -20090,7 +19119,7 @@ if (!__Pyx_RefNanny) { */ __pyx_memoryview_thread_locks_used = 0; - /* "View.MemoryView":317 + /* "View.MemoryView":318 * DEF THREAD_LOCKS_PREALLOCATED = 8 * cdef int __pyx_memoryview_thread_locks_used = 0 * cdef PyThread_type_lock[THREAD_LOCKS_PREALLOCATED] __pyx_memoryview_thread_locks = [ # <<<<<<<<<<<<<< @@ -20107,29 +19136,29 @@ if (!__Pyx_RefNanny) { __pyx_t_2[7] = PyThread_allocate_lock(); memcpy(&(__pyx_memoryview_thread_locks[0]), __pyx_t_2, sizeof(__pyx_memoryview_thread_locks[0]) * (8)); - /* "View.MemoryView":549 + /* "View.MemoryView":551 * info.obj = self * * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 549, __pyx_L1_error) + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 551, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 549, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_memoryview_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 551, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyType_Modified(__pyx_memoryview_type); - /* "View.MemoryView":995 + /* "View.MemoryView":997 * return self.from_object * * __pyx_getbuffer = capsule( &__pyx_memoryview_getbuffer, "getbuffer(obj, view, flags)") # <<<<<<<<<<<<<< * * */ - __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 995, __pyx_L1_error) + __pyx_t_1 = __pyx_capsule_create(((void *)(&__pyx_memoryview_getbuffer)), ((char *)"getbuffer(obj, view, flags)")); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 997, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 995, __pyx_L1_error) + if (PyDict_SetItem((PyObject *)__pyx_memoryviewslice_type->tp_dict, __pyx_n_s_pyx_getbuffer, __pyx_t_1) < 0) __PYX_ERR(2, 997, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; PyType_Modified(__pyx_memoryviewslice_type); @@ -20283,7 +19312,7 @@ static int __Pyx_ParseOptionalKeywords( } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 - if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + if (likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { @@ -20310,7 +19339,7 @@ static int __Pyx_ParseOptionalKeywords( while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; @@ -20326,7 +19355,7 @@ static int __Pyx_ParseOptionalKeywords( while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; @@ -20722,9 +19751,7 @@ static PyObject * __pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) { const char *ts = *tsp; - int i = 0, number; - int ndim = ctx->head->field->type->ndim; -; + int i = 0, number, ndim; ++ts; if (ctx->new_count != 1) { PyErr_SetString(PyExc_ValueError, @@ -20732,6 +19759,7 @@ __pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ndim = ctx->head->field->type->ndim; while (*ts && *ts != ')') { switch (*ts) { case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; @@ -20861,8 +19889,8 @@ static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const cha case 'l': case 'L': case 'q': case 'Q': case 'f': case 'd': case 'g': case 'O': case 'p': - if (ctx->enc_type == *ts && got_Z == ctx->is_complex && - ctx->enc_packmode == ctx->new_packmode) { + if ((ctx->enc_type == *ts) && (got_Z == ctx->is_complex) && + (ctx->enc_packmode == ctx->new_packmode) && (!ctx->is_valid_array)) { ctx->enc_count += ctx->new_count; ctx->new_count = 1; got_Z = 0; @@ -21152,7 +20180,7 @@ static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; - ternaryfunc call = func->ob_type->tp_call; + ternaryfunc call = Py_TYPE(func)->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) @@ -21239,7 +20267,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObjec if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { return __Pyx_PyObject_CallMethO(func, arg); #if CYTHON_FAST_PYCCALL - } else if (PyCFunction_GET_FLAGS(func) & METH_FASTCALL) { + } else if (__Pyx_PyFastCFunction_Check(func)) { return __Pyx_PyCFunction_FastCall(func, &arg, 1); #endif } @@ -21268,7 +20296,7 @@ __Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, int i, retval=-1; Py_buffer *buf = &memview->view; __Pyx_RefNannySetupContext("init_memviewslice", 0); - if (memviewslice->memview || memviewslice->data) { + if (unlikely(memviewslice->memview || memviewslice->data)) { PyErr_SetString(PyExc_ValueError, "memviewslice is already initialized!"); goto fail; @@ -21313,7 +20341,7 @@ __Pyx_init_memviewslice(struct __pyx_memoryview_obj *memview, static void __pyx_fatalerror(const char *fmt, ...) Py_NO_RETURN { va_list vargs; char msg[200]; -#ifdef HAVE_STDARG_PROTOTYPES +#if PY_VERSION_HEX >= 0x030A0000 || defined(HAVE_STDARG_PROTOTYPES) va_start(vargs, fmt); #else va_start(vargs); @@ -21338,296 +20366,80 @@ __pyx_sub_acquisition_count_locked(__pyx_atomic_int *acquisition_count, { int result; PyThread_acquire_lock(lock, 1); - result = (*acquisition_count)--; - PyThread_release_lock(lock); - return result; -} -static CYTHON_INLINE void -__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) -{ - int first_time; - struct __pyx_memoryview_obj *memview = memslice->memview; - if (!memview || (PyObject *) memview == Py_None) - return; - if (__pyx_get_slice_count(memview) < 0) - __pyx_fatalerror("Acquisition count is %d (line %d)", - __pyx_get_slice_count(memview), lineno); - first_time = __pyx_add_acquisition_count(memview) == 0; - if (first_time) { - if (have_gil) { - Py_INCREF((PyObject *) memview); - } else { - PyGILState_STATE _gilstate = PyGILState_Ensure(); - Py_INCREF((PyObject *) memview); - PyGILState_Release(_gilstate); - } - } -} -static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, - int have_gil, int lineno) { - int last_time; - struct __pyx_memoryview_obj *memview = memslice->memview; - if (!memview ) { - return; - } else if ((PyObject *) memview == Py_None) { - memslice->memview = NULL; - return; - } - if (__pyx_get_slice_count(memview) <= 0) - __pyx_fatalerror("Acquisition count is %d (line %d)", - __pyx_get_slice_count(memview), lineno); - last_time = __pyx_sub_acquisition_count(memview) == 1; - memslice->data = NULL; - if (last_time) { - if (have_gil) { - Py_CLEAR(memslice->memview); - } else { - PyGILState_STATE _gilstate = PyGILState_Ensure(); - Py_CLEAR(memslice->memview); - PyGILState_Release(_gilstate); - } - } else { - memslice->memview = NULL; - } -} - -/* PyErrFetchRestore */ - #if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -} -#endif - -/* RaiseException */ - #if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, - CYTHON_UNUSED PyObject *cause) { - __Pyx_PyThreadState_declare - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { -#if CYTHON_COMPILING_IN_PYPY - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#else - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); + result = (*acquisition_count)--; + PyThread_release_lock(lock); + return result; +} +static CYTHON_INLINE void +__Pyx_INC_MEMVIEW(__Pyx_memviewslice *memslice, int have_gil, int lineno) +{ + int first_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) + return; + if (unlikely(__pyx_get_slice_count(memview) < 0)) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + first_time = __pyx_add_acquisition_count(memview) == 0; + if (unlikely(first_time)) { + if (have_gil) { + Py_INCREF((PyObject *) memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_INCREF((PyObject *) memview); + PyGILState_Release(_gilstate); } -#endif } -bad: - Py_XDECREF(owned_instance); - return; } -#endif - -/* DictGetItem */ - #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY -static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { - PyObject *value; - value = PyDict_GetItemWithError(d, key); - if (unlikely(!value)) { - if (!PyErr_Occurred()) { - if (unlikely(PyTuple_Check(key))) { - PyObject* args = PyTuple_Pack(1, key); - if (likely(args)) { - PyErr_SetObject(PyExc_KeyError, args); - Py_DECREF(args); - } - } else { - PyErr_SetObject(PyExc_KeyError, key); - } +static CYTHON_INLINE void __Pyx_XDEC_MEMVIEW(__Pyx_memviewslice *memslice, + int have_gil, int lineno) { + int last_time; + struct __pyx_memoryview_obj *memview = memslice->memview; + if (unlikely(!memview || (PyObject *) memview == Py_None)) { + memslice->memview = NULL; + return; + } + if (unlikely(__pyx_get_slice_count(memview) <= 0)) + __pyx_fatalerror("Acquisition count is %d (line %d)", + __pyx_get_slice_count(memview), lineno); + last_time = __pyx_sub_acquisition_count(memview) == 1; + memslice->data = NULL; + if (unlikely(last_time)) { + if (have_gil) { + Py_CLEAR(memslice->memview); + } else { + PyGILState_STATE _gilstate = PyGILState_Ensure(); + Py_CLEAR(memslice->memview); + PyGILState_Release(_gilstate); } - return NULL; + } else { + memslice->memview = NULL; } - Py_INCREF(value); - return value; -} -#endif - -/* RaiseTooManyValuesToUnpack */ - static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } -/* RaiseNeedMoreValuesToUnpack */ - static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); -} - -/* RaiseNoneIterError */ - static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { - PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +/* PyErrFetchRestore */ + #if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); } - -/* ExtTypeTest */ - static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { - if (unlikely(!type)) { - PyErr_SetString(PyExc_SystemError, "Missing type object"); - return 0; - } - if (likely(__Pyx_TypeCheck(obj, type))) - return 1; - PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", - Py_TYPE(obj)->tp_name, type->tp_name); - return 0; +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; } +#endif /* GetTopmostException */ #if CYTHON_USE_EXC_INFO_STACK @@ -21784,6 +20596,165 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) return -1; } +/* RaiseException */ + #if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + /* BytesEquals */ static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { #if CYTHON_COMPILING_IN_PYPY @@ -21804,7 +20775,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) return (equals == Py_EQ); } else { int result; -#if CYTHON_USE_UNICODE_INTERNALS +#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) Py_hash_t hash1, hash2; hash1 = ((PyBytesObject*)s1)->ob_shash; hash2 = ((PyBytesObject*)s2)->ob_shash; @@ -21933,7 +20904,7 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) #endif } -/* None */ +/* DivInt[Py_ssize_t] */ static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b) { Py_ssize_t q = a / b; Py_ssize_t r = a - q*b; @@ -22044,7 +21015,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, /* ObjectGetItem */ #if CYTHON_USE_TYPE_SLOTS static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { - PyObject *runerr; + PyObject *runerr = NULL; Py_ssize_t key_value; PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; if (unlikely(!(m && m->sq_item))) { @@ -22092,9 +21063,9 @@ static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { if (stop < 0) stop += length; } + if (unlikely(stop <= start)) + return __Pyx_NewRef(__pyx_empty_unicode); length = stop - start; - if (unlikely(length <= 0)) - return PyUnicode_FromUnicode(NULL, 0); cstring += start; if (decode_func) { return decode_func(cstring, length, errors); @@ -22118,6 +21089,37 @@ static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject return (likely(r)) ? r : __Pyx_GetAttr3Default(d); } +/* RaiseTooManyValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ + static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseNoneIterError */ + static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* ExtTypeTest */ + static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + /* SwapException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { @@ -22183,7 +21185,7 @@ static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, { #if PY_MAJOR_VERSION >= 3 if (level == -1) { - if (strchr(__Pyx_MODULE_NAME, '.')) { + if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); if (!module) { @@ -22447,7 +21449,7 @@ static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, CYTHON_UNUSED PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); } -/* None */ +/* DivInt[long] */ static CYTHON_INLINE long __Pyx_div_long(long a, long b) { long q = a / b; long r = a - q*b; @@ -22555,6 +21557,28 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam return -1; } +/* PyObjectGetAttrStrNoError */ + static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +} + /* SetupReduce */ static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { int ret; @@ -22575,17 +21599,35 @@ static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_nam static int __Pyx_setup_reduce(PyObject* type_obj) { int ret = 0; PyObject *object_reduce = NULL; + PyObject *object_getstate = NULL; PyObject *object_reduce_ex = NULL; PyObject *reduce = NULL; PyObject *reduce_ex = NULL; PyObject *reduce_cython = NULL; PyObject *setstate = NULL; PyObject *setstate_cython = NULL; + PyObject *getstate = NULL; #if CYTHON_USE_PYTYPE_LOOKUP - if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; + getstate = _PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate); #else - if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; + getstate = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_getstate); + if (!getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } +#endif + if (getstate) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_getstate = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_getstate); +#else + object_getstate = __Pyx_PyObject_GetAttrStrNoError((PyObject*)&PyBaseObject_Type, __pyx_n_s_getstate); + if (!object_getstate && PyErr_Occurred()) { + goto __PYX_BAD; + } #endif + if (object_getstate != getstate) { + goto __PYX_GOOD; + } + } #if CYTHON_USE_PYTYPE_LOOKUP object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; #else @@ -22600,15 +21642,23 @@ static int __Pyx_setup_reduce(PyObject* type_obj) { #endif reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { - reduce_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_cython); if (unlikely(!reduce_cython)) goto __PYX_BAD; - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); if (!setstate) PyErr_Clear(); if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { - setstate_cython = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate_cython); if (unlikely(!setstate_cython)) goto __PYX_BAD; - ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; - ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } } PyType_Modified((PyTypeObject*)type_obj); } @@ -22622,6 +21672,8 @@ static int __Pyx_setup_reduce(PyObject* type_obj) { #if !CYTHON_USE_PYTYPE_LOOKUP Py_XDECREF(object_reduce); Py_XDECREF(object_reduce_ex); + Py_XDECREF(object_getstate); + Py_XDECREF(getstate); #endif Py_XDECREF(reduce); Py_XDECREF(reduce_ex); @@ -22694,7 +21746,7 @@ static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { +static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON @@ -22724,7 +21776,7 @@ static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { } if (!use_cline) { c_line = 0; - PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { c_line = 0; @@ -22798,7 +21850,7 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } @@ -22818,33 +21870,40 @@ static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { #include "compile.h" #include "frameobject.h" #include "traceback.h" +#if PY_VERSION_HEX >= 0x030b00a6 + #ifndef Py_BUILD_CORE + #define Py_BUILD_CORE 1 + #endif + #include "internal/pycore_frame.h" +#endif static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyObject *py_srcfile = 0; - PyObject *py_funcname = 0; + PyCodeObject *py_code = NULL; + PyObject *py_funcname = NULL; #if PY_MAJOR_VERSION < 3 + PyObject *py_srcfile = NULL; py_srcfile = PyString_FromString(filename); - #else - py_srcfile = PyUnicode_FromString(filename); - #endif if (!py_srcfile) goto bad; + #endif if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + if (!py_funcname) goto bad; + funcname = PyUnicode_AsUTF8(py_funcname); + if (!funcname) goto bad; #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); - #else - py_funcname = PyUnicode_FromString(funcname); + if (!py_funcname) goto bad; #endif } - if (!py_funcname) goto bad; + #if PY_MAJOR_VERSION < 3 py_code = __Pyx_PyCode_New( 0, 0, @@ -22863,11 +21922,16 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); - Py_DECREF(py_funcname); + #else + py_code = PyCode_NewEmpty(filename, funcname, py_line); + #endif + Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline return py_code; bad: - Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_srcfile); + #endif return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, @@ -22875,14 +21939,24 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject *ptype, *pvalue, *ptraceback; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); - if (!py_code) goto bad; + if (!py_code) { + /* If the code object creation fails, then we should clear the + fetched exception references and propagate the new exception */ + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + goto bad; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( @@ -22902,7 +21976,6 @@ static void __Pyx_AddTraceback(const char *funcname, int c_line, #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); - if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); if (__Pyx_TypeCheck(obj, __pyx_array_type)) return __pyx_array_getbuffer(obj, view, flags); if (__Pyx_TypeCheck(obj, __pyx_memoryview_type)) return __pyx_memoryview_getbuffer(obj, view, flags); PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); @@ -22916,7 +21989,6 @@ static void __Pyx_ReleaseBuffer(Py_buffer *view) { return; } if ((0)) {} - else if (__Pyx_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); view->obj = NULL; Py_DECREF(obj); } @@ -22944,85 +22016,322 @@ __pyx_memviewslice_is_contig(const __Pyx_memviewslice mvs, char order, int ndim) } return 1; } - -/* OverlappingSlices */ - static void -__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, - void **out_start, void **out_end, - int ndim, size_t itemsize) + +/* OverlappingSlices */ + static void +__pyx_get_array_memory_extents(__Pyx_memviewslice *slice, + void **out_start, void **out_end, + int ndim, size_t itemsize) +{ + char *start, *end; + int i; + start = end = slice->data; + for (i = 0; i < ndim; i++) { + Py_ssize_t stride = slice->strides[i]; + Py_ssize_t extent = slice->shape[i]; + if (extent == 0) { + *out_start = *out_end = start; + return; + } else { + if (stride > 0) + end += stride * (extent - 1); + else + start += stride * (extent - 1); + } + } + *out_start = start; + *out_end = end + itemsize; +} +static int +__pyx_slices_overlap(__Pyx_memviewslice *slice1, + __Pyx_memviewslice *slice2, + int ndim, size_t itemsize) +{ + void *start1, *end1, *start2, *end2; + __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); + __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); + return (start1 < end2) && (start2 < end1); +} + +/* Capsule */ + static CYTHON_INLINE PyObject * +__pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) +{ + PyObject *cobj; +#if PY_VERSION_HEX >= 0x02070000 + cobj = PyCapsule_New(p, sig, NULL); +#else + cobj = PyCObject_FromVoidPtr(p, NULL); +#endif + return cobj; +} + +/* TypeInfoCompare */ + static int +__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) +{ + int i; + if (!a || !b) + return 0; + if (a == b) + return 1; + if (a->size != b->size || a->typegroup != b->typegroup || + a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { + if (a->typegroup == 'H' || b->typegroup == 'H') { + return a->size == b->size; + } else { + return 0; + } + } + if (a->ndim) { + for (i = 0; i < a->ndim; i++) + if (a->arraysize[i] != b->arraysize[i]) + return 0; + } + if (a->typegroup == 'S') { + if (a->flags != b->flags) + return 0; + if (a->fields || b->fields) { + if (!(a->fields && b->fields)) + return 0; + for (i = 0; a->fields[i].type && b->fields[i].type; i++) { + __Pyx_StructField *field_a = a->fields + i; + __Pyx_StructField *field_b = b->fields + i; + if (field_a->offset != field_b->offset || + !__pyx_typeinfo_cmp(field_a->type, field_b->type)) + return 0; + } + return !a->fields[i].type && !b->fields[i].type; + } + } + return 1; +} + +/* MemviewSliceValidateAndInit */ + static int +__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) +{ + if (buf->shape[dim] <= 1) + return 1; + if (buf->strides) { + if (spec & __Pyx_MEMVIEW_CONTIG) { + if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { + if (unlikely(buf->strides[dim] != sizeof(void *))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly contiguous " + "in dimension %d.", dim); + goto fail; + } + } else if (unlikely(buf->strides[dim] != buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_FOLLOW) { + Py_ssize_t stride = buf->strides[dim]; + if (stride < 0) + stride = -stride; + if (unlikely(stride < buf->itemsize)) { + PyErr_SetString(PyExc_ValueError, + "Buffer and memoryview are not contiguous " + "in the same dimension."); + goto fail; + } + } + } else { + if (unlikely(spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1)) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not contiguous in " + "dimension %d", dim); + goto fail; + } else if (unlikely(spec & (__Pyx_MEMVIEW_PTR))) { + PyErr_Format(PyExc_ValueError, + "C-contiguous buffer is not indirect in " + "dimension %d", dim); + goto fail; + } else if (unlikely(buf->suboffsets)) { + PyErr_SetString(PyExc_ValueError, + "Buffer exposes suboffsets but no strides"); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) +{ + if (spec & __Pyx_MEMVIEW_DIRECT) { + if (unlikely(buf->suboffsets && buf->suboffsets[dim] >= 0)) { + PyErr_Format(PyExc_ValueError, + "Buffer not compatible with direct access " + "in dimension %d.", dim); + goto fail; + } + } + if (spec & __Pyx_MEMVIEW_PTR) { + if (unlikely(!buf->suboffsets || (buf->suboffsets[dim] < 0))) { + PyErr_Format(PyExc_ValueError, + "Buffer is not indirectly accessible " + "in dimension %d.", dim); + goto fail; + } + } + return 1; +fail: + return 0; +} +static int +__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) +{ + int i; + if (c_or_f_flag & __Pyx_IS_F_CONTIG) { + Py_ssize_t stride = 1; + for (i = 0; i < ndim; i++) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not fortran contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { + Py_ssize_t stride = 1; + for (i = ndim - 1; i >- 1; i--) { + if (unlikely(stride * buf->itemsize != buf->strides[i] && buf->shape[i] > 1)) { + PyErr_SetString(PyExc_ValueError, + "Buffer not C contiguous."); + goto fail; + } + stride = stride * buf->shape[i]; + } + } + return 1; +fail: + return 0; +} +static int __Pyx_ValidateAndInit_memviewslice( + int *axes_specs, + int c_or_f_flag, + int buf_flags, + int ndim, + __Pyx_TypeInfo *dtype, + __Pyx_BufFmt_StackElem stack[], + __Pyx_memviewslice *memviewslice, + PyObject *original_obj) { - char *start, *end; - int i; - start = end = slice->data; - for (i = 0; i < ndim; i++) { - Py_ssize_t stride = slice->strides[i]; - Py_ssize_t extent = slice->shape[i]; - if (extent == 0) { - *out_start = *out_end = start; - return; - } else { - if (stride > 0) - end += stride * (extent - 1); - else - start += stride * (extent - 1); + struct __pyx_memoryview_obj *memview, *new_memview; + __Pyx_RefNannyDeclarations + Py_buffer *buf; + int i, spec = 0, retval = -1; + __Pyx_BufFmt_Context ctx; + int from_memoryview = __pyx_memoryview_check(original_obj); + __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); + if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) + original_obj)->typeinfo)) { + memview = (struct __pyx_memoryview_obj *) original_obj; + new_memview = NULL; + } else { + memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( + original_obj, buf_flags, 0, dtype); + new_memview = memview; + if (unlikely(!memview)) + goto fail; + } + buf = &memview->view; + if (unlikely(buf->ndim != ndim)) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + ndim, buf->ndim); + goto fail; + } + if (new_memview) { + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (unlikely(!__Pyx_BufFmt_CheckString(&ctx, buf->format))) goto fail; + } + if (unlikely((unsigned) buf->itemsize != dtype->size)) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " + "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", + buf->itemsize, + (buf->itemsize > 1) ? "s" : "", + dtype->name, + dtype->size, + (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->len > 0) { + for (i = 0; i < ndim; i++) { + spec = axes_specs[i]; + if (unlikely(!__pyx_check_strides(buf, i, ndim, spec))) + goto fail; + if (unlikely(!__pyx_check_suboffsets(buf, i, ndim, spec))) + goto fail; } + if (unlikely(buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag))) + goto fail; } - *out_start = start; - *out_end = end + itemsize; -} -static int -__pyx_slices_overlap(__Pyx_memviewslice *slice1, - __Pyx_memviewslice *slice2, - int ndim, size_t itemsize) -{ - void *start1, *end1, *start2, *end2; - __pyx_get_array_memory_extents(slice1, &start1, &end1, ndim, itemsize); - __pyx_get_array_memory_extents(slice2, &start2, &end2, ndim, itemsize); - return (start1 < end2) && (start2 < end1); + if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, + new_memview != NULL) == -1)) { + goto fail; + } + retval = 0; + goto no_fail; +fail: + Py_XDECREF(new_memview); + retval = -1; +no_fail: + __Pyx_RefNannyFinishContext(); + return retval; } -/* Capsule */ - static CYTHON_INLINE PyObject * -__pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) -{ - PyObject *cobj; -#if PY_VERSION_HEX >= 0x02070000 - cobj = PyCapsule_New(p, sig, NULL); -#else - cobj = PyCObject_FromVoidPtr(p, NULL); -#endif - return cobj; +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_double(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; + } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 1, + &__Pyx_TypeInfo_double, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; } -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { - const npy_int64 neg_one = (npy_int64) ((npy_int64) 0 - (npy_int64) 1), const_zero = (npy_int64) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(npy_int64) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(npy_int64) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(npy_int64), - little, !is_unsigned); +/* ObjectToMemviewSlice */ + static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { + __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; + __Pyx_BufFmt_StackElem stack[1]; + int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; + int retcode; + if (obj == Py_None) { + result.memview = (struct __pyx_memoryview_obj *) Py_None; + return result; } + retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, + PyBUF_RECORDS_RO | writable_flag, 2, + &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, + &result, obj); + if (unlikely(retcode == -1)) + goto __pyx_fail; + return result; +__pyx_fail: + result.memview = NULL; + result.data = NULL; + return result; } /* CIntFromPyVerify */ @@ -23176,7 +22485,7 @@ __pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) if (a.imag == 0) { if (a.real == 0) { return a; - } else if (b.imag == 0) { + } else if ((b.imag == 0) && (a.real >= 0)) { z.real = powf(a.real, b.real); z.imag = 0; return z; @@ -23314,108 +22623,46 @@ __pyx_capsule_create(void *p, CYTHON_UNUSED const char *sig) case 0: z.real = 1; z.imag = 0; - return z; - case 1: - return a; - case 2: - return __Pyx_c_prod_double(a, a); - case 3: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, a); - case 4: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if (b.imag == 0) { - z.real = pow(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2(0.0, -1.0); - } - } else { - r = __Pyx_c_abs_double(a); - theta = atan2(a.imag, a.real); - } - lnr = log(r); - z_r = exp(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cos(z_theta); - z.imag = z_r * sin(z_theta); - return z; - } - #endif -#endif - -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { - const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); - } -} - -/* CIntToPy */ - static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { - const enum NPY_TYPES neg_one = (enum NPY_TYPES) ((enum NPY_TYPES) 0 - (enum NPY_TYPES) 1), const_zero = (enum NPY_TYPES) 0; - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(enum NPY_TYPES) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif + return z; + case 1: + return a; + case 2: + return __Pyx_c_prod_double(a, a); + case 3: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, a); + case 4: + z = __Pyx_c_prod_double(a, a); + return __Pyx_c_prod_double(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } else if ((b.imag == 0) && (a.real >= 0)) { + z.real = pow(a.real, b.real); + z.imag = 0; + return z; + } else if (a.real > 0) { + r = a.real; + theta = 0; + } else { + r = -a.real; + theta = atan2(0.0, -1.0); + } + } else { + r = __Pyx_c_abs_double(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; } - } else { - if (sizeof(enum NPY_TYPES) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); + #endif #endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; - return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), - little, !is_unsigned); - } -} /* MemviewSliceCopyTemplate */ static __Pyx_memviewslice @@ -23435,7 +22682,7 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, struct __pyx_memoryview_obj *memview_obj = NULL; __Pyx_RefNannySetupContext("__pyx_memoryview_copy_new_contig", 0); for (i = 0; i < ndim; i++) { - if (from_mvs->suboffsets[i] >= 0) { + if (unlikely(from_mvs->suboffsets[i] >= 0)) { PyErr_Format(PyExc_ValueError, "Cannot copy memoryview slice with " "indirect dimensions (axis %d)", i); goto fail; @@ -23484,9 +22731,54 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, return new_mvs; } +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_npy_int64(npy_int64 value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(npy_int64) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(npy_int64) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(npy_int64) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(npy_int64) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(npy_int64), + little, !is_unsigned); + } +} + /* CIntFromPy */ static CYTHON_INLINE npy_int64 __Pyx_PyInt_As_npy_int64(PyObject *x) { - const npy_int64 neg_one = (npy_int64) ((npy_int64) 0 - (npy_int64) 1), const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const npy_int64 neg_one = (npy_int64) -1, const_zero = (npy_int64) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { @@ -23675,7 +22967,14 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { - const int neg_one = (int) ((int) 0 - (int) 1), const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { @@ -23864,7 +23163,14 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { - const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { @@ -24051,9 +23357,54 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, return (long) -1; } +/* CIntToPy */ + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { - const long neg_one = (long) ((long) 0 - (long) 1), const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { @@ -24084,7 +23435,14 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, /* CIntFromPy */ static CYTHON_INLINE char __Pyx_PyInt_As_char(PyObject *x) { - const char neg_one = (char) ((char) 0 - (char) 1), const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const char neg_one = (char) -1, const_zero = (char) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { @@ -24197,356 +23555,109 @@ __pyx_memoryview_copy_new_contig(const __Pyx_memviewslice *from_mvs, return (char) ((((((((char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); } } - break; - case -4: - if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { - return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - case 4: - if (8 * sizeof(char) > 3 * PyLong_SHIFT) { - if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { - __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { - return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); - } - } - break; - } -#endif - if (sizeof(char) <= sizeof(long)) { - __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { - __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { -#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) - PyErr_SetString(PyExc_RuntimeError, - "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); -#else - char val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); - #if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } - #endif - if (likely(v)) { - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - int ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); - Py_DECREF(v); - if (likely(!ret)) - return val; - } -#endif - return (char) -1; - } - } else { - char val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (char) -1; - val = __Pyx_PyInt_As_char(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to char"); - return (char) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to char"); - return (char) -1; -} - -/* TypeInfoCompare */ - static int -__pyx_typeinfo_cmp(__Pyx_TypeInfo *a, __Pyx_TypeInfo *b) -{ - int i; - if (!a || !b) - return 0; - if (a == b) - return 1; - if (a->size != b->size || a->typegroup != b->typegroup || - a->is_unsigned != b->is_unsigned || a->ndim != b->ndim) { - if (a->typegroup == 'H' || b->typegroup == 'H') { - return a->size == b->size; - } else { - return 0; - } - } - if (a->ndim) { - for (i = 0; i < a->ndim; i++) - if (a->arraysize[i] != b->arraysize[i]) - return 0; - } - if (a->typegroup == 'S') { - if (a->flags != b->flags) - return 0; - if (a->fields || b->fields) { - if (!(a->fields && b->fields)) - return 0; - for (i = 0; a->fields[i].type && b->fields[i].type; i++) { - __Pyx_StructField *field_a = a->fields + i; - __Pyx_StructField *field_b = b->fields + i; - if (field_a->offset != field_b->offset || - !__pyx_typeinfo_cmp(field_a->type, field_b->type)) - return 0; - } - return !a->fields[i].type && !b->fields[i].type; - } - } - return 1; -} - -/* MemviewSliceValidateAndInit */ - static int -__pyx_check_strides(Py_buffer *buf, int dim, int ndim, int spec) -{ - if (buf->shape[dim] <= 1) - return 1; - if (buf->strides) { - if (spec & __Pyx_MEMVIEW_CONTIG) { - if (spec & (__Pyx_MEMVIEW_PTR|__Pyx_MEMVIEW_FULL)) { - if (buf->strides[dim] != sizeof(void *)) { - PyErr_Format(PyExc_ValueError, - "Buffer is not indirectly contiguous " - "in dimension %d.", dim); - goto fail; - } - } else if (buf->strides[dim] != buf->itemsize) { - PyErr_SetString(PyExc_ValueError, - "Buffer and memoryview are not contiguous " - "in the same dimension."); - goto fail; + break; + case -4: + if (8 * sizeof(char) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) (((char)-1)*(((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(char) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(char, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(char) - 1 > 4 * PyLong_SHIFT) { + return (char) ((((((((((char)digits[3]) << PyLong_SHIFT) | (char)digits[2]) << PyLong_SHIFT) | (char)digits[1]) << PyLong_SHIFT) | (char)digits[0]))); + } + } + break; } - } - if (spec & __Pyx_MEMVIEW_FOLLOW) { - Py_ssize_t stride = buf->strides[dim]; - if (stride < 0) - stride = -stride; - if (stride < buf->itemsize) { - PyErr_SetString(PyExc_ValueError, - "Buffer and memoryview are not contiguous " - "in the same dimension."); - goto fail; +#endif + if (sizeof(char) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(char, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(char) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(char, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif } } - } else { - if (spec & __Pyx_MEMVIEW_CONTIG && dim != ndim - 1) { - PyErr_Format(PyExc_ValueError, - "C-contiguous buffer is not contiguous in " - "dimension %d", dim); - goto fail; - } else if (spec & (__Pyx_MEMVIEW_PTR)) { - PyErr_Format(PyExc_ValueError, - "C-contiguous buffer is not indirect in " - "dimension %d", dim); - goto fail; - } else if (buf->suboffsets) { - PyErr_SetString(PyExc_ValueError, - "Buffer exposes suboffsets but no strides"); - goto fail; - } - } - return 1; -fail: - return 0; -} -static int -__pyx_check_suboffsets(Py_buffer *buf, int dim, CYTHON_UNUSED int ndim, int spec) -{ - if (spec & __Pyx_MEMVIEW_DIRECT) { - if (buf->suboffsets && buf->suboffsets[dim] >= 0) { - PyErr_Format(PyExc_ValueError, - "Buffer not compatible with direct access " - "in dimension %d.", dim); - goto fail; - } - } - if (spec & __Pyx_MEMVIEW_PTR) { - if (!buf->suboffsets || (buf->suboffsets[dim] < 0)) { - PyErr_Format(PyExc_ValueError, - "Buffer is not indirectly accessible " - "in dimension %d.", dim); - goto fail; - } - } - return 1; -fail: - return 0; -} -static int -__pyx_verify_contig(Py_buffer *buf, int ndim, int c_or_f_flag) -{ - int i; - if (c_or_f_flag & __Pyx_IS_F_CONTIG) { - Py_ssize_t stride = 1; - for (i = 0; i < ndim; i++) { - if (stride * buf->itemsize != buf->strides[i] && - buf->shape[i] > 1) - { - PyErr_SetString(PyExc_ValueError, - "Buffer not fortran contiguous."); - goto fail; + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + char val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); } - stride = stride * buf->shape[i]; - } - } else if (c_or_f_flag & __Pyx_IS_C_CONTIG) { - Py_ssize_t stride = 1; - for (i = ndim - 1; i >- 1; i--) { - if (stride * buf->itemsize != buf->strides[i] && - buf->shape[i] > 1) { - PyErr_SetString(PyExc_ValueError, - "Buffer not C contiguous."); - goto fail; + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; } - stride = stride * buf->shape[i]; +#endif + return (char) -1; } - } - return 1; -fail: - return 0; -} -static int __Pyx_ValidateAndInit_memviewslice( - int *axes_specs, - int c_or_f_flag, - int buf_flags, - int ndim, - __Pyx_TypeInfo *dtype, - __Pyx_BufFmt_StackElem stack[], - __Pyx_memviewslice *memviewslice, - PyObject *original_obj) -{ - struct __pyx_memoryview_obj *memview, *new_memview; - __Pyx_RefNannyDeclarations - Py_buffer *buf; - int i, spec = 0, retval = -1; - __Pyx_BufFmt_Context ctx; - int from_memoryview = __pyx_memoryview_check(original_obj); - __Pyx_RefNannySetupContext("ValidateAndInit_memviewslice", 0); - if (from_memoryview && __pyx_typeinfo_cmp(dtype, ((struct __pyx_memoryview_obj *) - original_obj)->typeinfo)) { - memview = (struct __pyx_memoryview_obj *) original_obj; - new_memview = NULL; } else { - memview = (struct __pyx_memoryview_obj *) __pyx_memoryview_new( - original_obj, buf_flags, 0, dtype); - new_memview = memview; - if (unlikely(!memview)) - goto fail; - } - buf = &memview->view; - if (buf->ndim != ndim) { - PyErr_Format(PyExc_ValueError, - "Buffer has wrong number of dimensions (expected %d, got %d)", - ndim, buf->ndim); - goto fail; - } - if (new_memview) { - __Pyx_BufFmt_Init(&ctx, stack, dtype); - if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; - } - if ((unsigned) buf->itemsize != dtype->size) { - PyErr_Format(PyExc_ValueError, - "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "u byte%s) " - "does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "u byte%s)", - buf->itemsize, - (buf->itemsize > 1) ? "s" : "", - dtype->name, - dtype->size, - (dtype->size > 1) ? "s" : ""); - goto fail; - } - for (i = 0; i < ndim; i++) { - spec = axes_specs[i]; - if (!__pyx_check_strides(buf, i, ndim, spec)) - goto fail; - if (!__pyx_check_suboffsets(buf, i, ndim, spec)) - goto fail; - } - if (buf->strides && !__pyx_verify_contig(buf, ndim, c_or_f_flag)) - goto fail; - if (unlikely(__Pyx_init_memviewslice(memview, ndim, memviewslice, - new_memview != NULL) == -1)) { - goto fail; - } - retval = 0; - goto no_fail; -fail: - Py_XDECREF(new_memview); - retval = -1; -no_fail: - __Pyx_RefNannyFinishContext(); - return retval; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_ds_double(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; - } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, - PyBUF_RECORDS_RO | writable_flag, 1, - &__Pyx_TypeInfo_double, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; -} - -/* ObjectToMemviewSlice */ - static CYTHON_INLINE __Pyx_memviewslice __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_int64_t(PyObject *obj, int writable_flag) { - __Pyx_memviewslice result = { 0, 0, { 0 }, { 0 }, { 0 } }; - __Pyx_BufFmt_StackElem stack[1]; - int axes_specs[] = { (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED), (__Pyx_MEMVIEW_DIRECT | __Pyx_MEMVIEW_STRIDED) }; - int retcode; - if (obj == Py_None) { - result.memview = (struct __pyx_memoryview_obj *) Py_None; - return result; + char val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (char) -1; + val = __Pyx_PyInt_As_char(tmp); + Py_DECREF(tmp); + return val; } - retcode = __Pyx_ValidateAndInit_memviewslice(axes_specs, 0, - PyBUF_RECORDS_RO | writable_flag, 2, - &__Pyx_TypeInfo_nn___pyx_t_5numpy_int64_t, stack, - &result, obj); - if (unlikely(retcode == -1)) - goto __pyx_fail; - return result; -__pyx_fail: - result.memview = NULL; - result.data = NULL; - return result; +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to char"); + return (char) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to char"); + return (char) -1; } /* CheckBinaryVersion */ static int __Pyx_check_binary_version(void) { - char ctversion[4], rtversion[4]; - PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); - PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); - if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char ctversion[5]; + int same=1, i, found_dot; + const char* rt_from_call = Py_GetVersion(); + PyOS_snprintf(ctversion, 5, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + found_dot = 0; + for (i = 0; i < 4; i++) { + if (!ctversion[i]) { + same = (rt_from_call[i] < '0' || rt_from_call[i] > '9'); + break; + } + if (rt_from_call[i] != ctversion[i]) { + same = 0; + break; + } + } + if (!same) { + char rtversion[5] = {'\0'}; char message[200]; + for (i=0; i<4; ++i) { + if (rt_from_call[i] == '.') { + if (found_dot) break; + found_dot = 1; + } else if (rt_from_call[i] < '0' || rt_from_call[i] > '9') { + break; + } + rtversion[i] = rt_from_call[i]; + } PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", @@ -24858,6 +23969,23 @@ static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_DECREF(x); return ival; } +static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { + if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { + return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); +#if PY_MAJOR_VERSION < 3 + } else if (likely(PyInt_CheckExact(o))) { + return PyInt_AS_LONG(o); +#endif + } else { + Py_ssize_t ival; + PyObject *x; + x = PyNumber_Index(o); + if (!x) return -1; + ival = PyInt_AsLong(x); + Py_DECREF(x); + return ival; + } +} static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); } From 5fb761d11a67d39f2ee30510aecbf3f0dcccea96 Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 15:52:12 +0000 Subject: [PATCH 022/188] Fix calls removed from numpy --- tests/test_fh_estimate.py | 2 +- tests/test_ode_func.py | 2 +- tests/test_sir_discrete_estimate.py | 2 +- tests/test_sir_estimate.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_fh_estimate.py b/tests/test_fh_estimate.py index af24324d..c435b6dd 100644 --- a/tests/test_fh_estimate.py +++ b/tests/test_fh_estimate.py @@ -28,7 +28,7 @@ def setUp(self): g = self.obj.gradient() assert np.linalg.norm(g) > 0 - EPSILON = np.sqrt(np.finfo(np.float).eps) + EPSILON = np.sqrt(np.finfo(float).eps) self.box_bounds = [(EPSILON, 5.0)]*len(self.theta) diff --git a/tests/test_ode_func.py b/tests/test_ode_func.py index b39daa6f..22e660ef 100644 --- a/tests/test_ode_func.py +++ b/tests/test_ode_func.py @@ -11,7 +11,7 @@ class TestJacobians(TestCase): def setUp(self): - self.h = np.sqrt(np.finfo(np.float).eps) + self.h = np.sqrt(np.finfo(float).eps) # initial time self.t0 = 0 # the initial state, normalized to zero one diff --git a/tests/test_sir_discrete_estimate.py b/tests/test_sir_discrete_estimate.py index e991effe..ed904f49 100644 --- a/tests/test_sir_discrete_estimate.py +++ b/tests/test_sir_discrete_estimate.py @@ -38,7 +38,7 @@ def setUp(self): self.theta = np.array([0.4, 0.3]) # constraints - EPSILON = np.sqrt(np.finfo(np.float).eps) + EPSILON = np.sqrt(np.finfo(float).eps) self.box_bounds = [(EPSILON, 2), (EPSILON, 2)] self.target = np.array([0.5, 1.0/3.0]) diff --git a/tests/test_sir_estimate.py b/tests/test_sir_estimate.py index a3e9f060..629bcc99 100644 --- a/tests/test_sir_estimate.py +++ b/tests/test_sir_estimate.py @@ -27,7 +27,7 @@ def setUp(self): self.target = np.array([0.5, 1.0/3.0]) # constraints - EPSILON = np.sqrt(np.finfo(np.float).eps) + EPSILON = np.sqrt(np.finfo(float).eps) self.box_bounds = [(EPSILON, 5), (EPSILON, 5)] From cff95c7c0482971772c83590b24caa46f2b2406e Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 19:44:37 +0000 Subject: [PATCH 023/188] Give a bit more detail in the error message for incorrect types. --- pygom/model/ode_utils/checks_and_conversions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygom/model/ode_utils/checks_and_conversions.py b/pygom/model/ode_utils/checks_and_conversions.py index 8ca427fc..83d76719 100644 --- a/pygom/model/ode_utils/checks_and_conversions.py +++ b/pygom/model/ode_utils/checks_and_conversions.py @@ -51,7 +51,7 @@ def check_array_type(x,accept_booleans=False): raise TypeError('No elements of array type object should be Boolean values') x = np.array(x) else: - raise TypeError(type_error_message) + raise TypeError(type_error_message + ' got ' + str(type(x))) elif isinstance(x, accepted_types): if accept_booleans==True: x = np.array([x]) From 74f580627b185985e269667b0e0cdbd000645365 Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 20:15:01 +0000 Subject: [PATCH 024/188] Remove Travis CI and move to GitHub actions --- .github/workflows/main.yml | 2 +- .travis.yml | 37 ------------------------------------- README.rst | 2 -- 3 files changed, 1 insertion(+), 40 deletions(-) delete mode 100644 .travis.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a59d3801..3ff9aca9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.5, 3.6, 3.7, 3.8] + python-version: [3.7, 3.8, 3.9, 3.10, 3.11] steps: - uses: actions/checkout@v2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5eec188c..00000000 --- a/.travis.yml +++ /dev/null @@ -1,37 +0,0 @@ -# specify the language and which version -language: python -python: - - 3.7 - - 3.8 - - 3.9 - - 3.10 - - 3.11 - -before_install: - - pip install -U pip - - pip install codecov - -install: - - pip install -r requirements.txt - - python setup.py build - - python setup.py install - -# Runs test with coverage -script: - - coverage run setup.py test - -# Push the result to -after_success: - - codecov - -# deploy to PyPI -deploy: - provider: pypi - twine_version: 1.13.0 - skip_existing: true - user: twomagpi - password: - secure: S+o0vhiAGM3qto2tQ8xoozMY3JuhDTlynzjMK2AyRMrWWI0Jvbp9u6TebD3zT3TNh/341t6JLY7VPj8KOam/7LzmpI56ouSyTKKHH7Uk2L2ZuJ4dPm4mS0htO26YBYUtjBpyc55VOmVxqUMXo3iym0jQ+uukrWrr+fY3wTTl1rn+RU5wdoQ+1Z9hi+txo2i24tGi9RCzRr5yCX88Q++MFtlNs2/Q4AtR9oQHY5muiPtlbxd1/JtmK43doxsUc+v0A+RJFpDMmURsUt+zoUeSm8Xz65EP9vjGL03YCn+SUp/2Iidfk3GLaBIDvNxKk6XB9njm6V+bXPpzgsM5fzFJ3XtXp3hoIcMlwoa03Hn3fGUw/W/KKsvJaPBDnjZ9qK2gHBNQuz5jbK/ijNuSuZWQvInGhA5Tt/6DOJwX/Q2d0H4hENwZKs5MnY+RXm6VDRJYnImyQLCW1HsxJa/q/2hTpOvlDHCWJNwWB59BTVOxRsW1gKVgiaF5K9hWd5x1DJvnxG15wNey/STOx+8bpaX7DPfZmqqGqbDNnCTKr2+X3EfTqglOWWM20fB9BY62GuvXPNS3/60aKXZfn7z7eI19b+0KMx2wHlnsP7oQmAQS4XK2wMOs3pD8iQzd/4jIVLa+k3YSYfhb0mKxJBkQtd+1s2GtoaHWnNRlpCUlwv1OU38= - on: - tags: true - python: 3.7 diff --git a/README.rst b/README.rst index 87ec1e3c..092aa624 100644 --- a/README.rst +++ b/README.rst @@ -6,8 +6,6 @@ pygom - ODE modelling in Python .. |pypi version| image:: https://img.shields.io/pypi/v/pygom.svg :target: https://pypi.python.org/pypi/pygom -.. |Build status| image:: https://travis-ci.org/PublicHealthEngland/pygom.svg?branch=master - :target: https://travis-ci.org/PublicHealthEngland/pygom .. |Documentation Status| image:: https://readthedocs.org/projects/pygom/badge/?version=master :target: https://pygom.readthedocs.io/en/master/?badge=master .. |licence| image:: https://img.shields.io/pypi/l/pygom?color=green :alt: PyPI - License From c884ab599c933c6784a7194e119f5d8ed9067b7a Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 20:28:31 +0000 Subject: [PATCH 025/188] In versioning 3.10 != 3.1 --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3ff9aca9..fd6f95b9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.7, 3.8, 3.9, 3.10, 3.11] + python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v2 From 30cbc1a6bdd86d8f45447a6a4ee86924727e2de8 Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Thu, 26 Jan 2023 20:40:47 +0000 Subject: [PATCH 026/188] I don't like enabling insecure workflow commands but it seems (currently) that MS VS needs this (or we don't test windows). --- .github/workflows/main.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fd6f95b9..41b80bc4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,6 +11,9 @@ on: branches: - master +env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true + jobs: build: runs-on: ${{ matrix.os }} From ee11e09baf3167c5f040d0a54fbeed85183b75cb Mon Sep 17 00:00:00 2001 From: Thomas Finnie Date: Fri, 27 Jan 2023 21:00:13 +0000 Subject: [PATCH 027/188] Fix the test for ABC with normal loss by adding a value for sigma --- README.rst | 2 +- .../approximate_bayesian_computation.py | 13 +++++++++++-- pygom/loss/ode_loss.py | 15 ++++++++++++--- tests/test_abc.py | 2 +- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 092aa624..60af8b40 100644 --- a/README.rst +++ b/README.rst @@ -2,7 +2,7 @@ pygom - ODE modelling in Python =============================== -|Build status| |Github actions| |Documentation Status| |pypi version| |licence| +|Github actions| |Documentation Status| |pypi version| |licence| .. |pypi version| image:: https://img.shields.io/pypi/v/pygom.svg :target: https://pypi.python.org/pypi/pygom diff --git a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py index 1012fc2c..4b125bff 100644 --- a/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py +++ b/pygom/approximate_bayesian_computation/approximate_bayesian_computation.py @@ -159,8 +159,17 @@ def create_loss(loss_type, parameters, ode, x0, t0, t, y, state_name, return SquareLoss(theta, ode, x0, t0, t, y, state_name, state_weight, target_param, target_state) elif loss_type == NormalLoss: - return NormalLoss(theta, ode, x0, t0, t, y, state_name, sigma, target_param, target_state) - + return NormalLoss(theta=theta, + ode=ode, + x0=x0, + t0=t0, + t=t, + y=y, + state_name=state_name, + sigma=sigma, + target_param=target_param, + target_state=target_state) + elif loss_type == PoissonLoss: return PoissonLoss(theta, ode, x0, t0, t, y, state_name, target_param, target_state) diff --git a/pygom/loss/ode_loss.py b/pygom/loss/ode_loss.py index a4a950f0..b7352422 100644 --- a/pygom/loss/ode_loss.py +++ b/pygom/loss/ode_loss.py @@ -40,9 +40,18 @@ class NormalLoss(BaseLoss): ''' def __init__(self, theta, ode, x0, t0, t, y, state_name, state_weight=None, sigma=1.0, target_param=None, target_state=None): - super().__init__(theta, ode, x0, t0, t, y, - state_name, state_weight, sigma, target_param, target_state) - + super().__init__(theta=theta, + ode=ode, + x0=x0, + t0=t0, + t=t, + y=y, + state_name=state_name, + state_weight=state_weight, + spread_param=sigma, + target_param=target_param, + target_state=target_state) + def __repr__(self): return "NormalLoss" + self._get_model_str() diff --git a/tests/test_abc.py b/tests/test_abc.py index 9584ec53..7985f0f6 100644 --- a/tests/test_abc.py +++ b/tests/test_abc.py @@ -64,7 +64,7 @@ def test_SIR_abc_NormalLoss(self): parameters = [pgabc.Parameter('beta', 'unif', 0, 3, logscale=False), pgabc.Parameter('gamma', 'unif', 0, 3, logscale=False)] sir_obj = pgabc.create_loss(NormalLoss, parameters, self.ode, self.x0, self.t[0], - self.t[1::], y, ['I', 'R']) + self.t[1::], y, ['I', 'R'], sigma=1.0) sir_abc = pgabc.ABC(sir_obj, parameters) sir_abc.get_posterior_sample(N=100, tol=np.inf, G=10, q=0.5) sir_abc.continue_posterior_sample(N=100, tol=sir_abc.next_tol, G=10, q=0.5) From a4078def27bdc7c73ddb22e18ad5819b24d454fc Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 30 Jan 2023 20:07:02 +0000 Subject: [PATCH 028/188] Add todo for readthedocs --- doc/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/conf.py b/doc/source/conf.py index 7b711798..2870ab90 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -136,6 +136,7 @@ else: # RTD will time out if we try to build the whole of the documentation so # ignore some of the longer bits and perhaps add them later + # // TODO: speed up runtime for longer examples for readthedocs exclude_patterns = ['common_models/*.rst', # 'bvpSimple.rst', 'epi.rst', From 22ff76d3935072f99f7aa46223bafcf83e0d1419 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 30 Jan 2023 20:07:34 +0000 Subject: [PATCH 029/188] Typos --- doc/source/getting_started.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/source/getting_started.rst b/doc/source/getting_started.rst index e16f2fca..cf58249b 100644 --- a/doc/source/getting_started.rst +++ b/doc/source/getting_started.rst @@ -10,8 +10,8 @@ What this package does ====================== The purpose of this package is to allow the end user to easily define a set of -ordinary differential equations (ode) and obtain information about the ode by -simply invoking the the appropriate methods. Here, we define the set of ode's +ordinary differential equations (ODE) and obtain information about the ODE by +invoking the the appropriate methods. Here, we define the set of ODE's as .. math:: @@ -19,11 +19,11 @@ as where :math:`\mathbf{x} = \left(x_{1},x_{2},\ldots,x_{n}\right)` is the state vector with :math:`d` state and :math:`\boldsymbol{\theta}` the parameters of -:math:`p` dimension. Currently, this package allows the end user to find the -algebraic expression of the ode, Jacobian, gradient and forward sensitivity of -the ode. A numerical output is given when all the state and parameter values -are provided. Note that the only important class is :file:`DeterministicOde` -all the functionality described previously are exposed. +:math:`p` dimension. Currently, this package allows the user to find the +algebraic expression of the ODE, Jacobian, gradient and forward sensitivity of +the ODE. A numerical output is given when all the state and parameter values +are provided. Note that the only important class is :file:`DeterministicOde` +where all the functionality described previously are exposed. The current plan is to extend the functionality to include @@ -61,7 +61,7 @@ The package is currently as follows:: requirements.txt setup.py -with files in each of the three main folder not shown. You can install the +with files in each of the three main folders not shown. You can install the package via command line:: python setup.py install From 8b11d9b30edb2a7e256b64058aa5cf973a5ee3a2 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 30 Jan 2023 20:13:16 +0000 Subject: [PATCH 030/188] Comment out toctree for readding --- doc/source/index.rst | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 732af680..f2c08c9d 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -6,6 +6,8 @@ pygom is a package that aims to facilitate the application of ordinary different This is an open source project hosted on `Github `_. +Insert intro text + ################## User Documentation ################## @@ -14,20 +16,20 @@ User Documentation :maxdepth: 5 getting_started.rst - sir.rst - transition.rst - stochastic.rst - unrollOde.rst - epi.rst - epijson.rst - bvpSimple.rst - gradient.rst - fh.rst - estimate1.rst - estimate2.rst - initialGuess.rst - profile.rst - common_models.rst + #sir.rst + #transition.rst + #stochastic.rst + #unrollOde.rst + #epi.rst + #epijson.rst + #bvpSimple.rst + #gradient.rst + #fh.rst + #estimate1.rst + #estimate2.rst + #initialGuess.rst + #profile.rst + #common_models.rst ########################## Code Documentation and FAQ @@ -36,8 +38,8 @@ Code Documentation and FAQ .. toctree:: :maxdepth: 5 - faq.rst - mod/index.rst + #faq.rst + #mod/index.rst ########## References @@ -45,7 +47,7 @@ References .. toctree:: - ref.rst + #ref.rst ################## Indices and tables From 7eeb9a91408424b33410ea51298a1e1bb420db31 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 30 Jan 2023 20:22:42 +0000 Subject: [PATCH 031/188] include jupyter notebook extension --- doc/source/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index 2870ab90..d7ef04b0 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -45,7 +45,8 @@ 'matplotlib.sphinxext.plot_directive', 'numpydoc', 'IPython.sphinxext.ipython_console_highlighting', - 'IPython.sphinxext.ipython_directive' + 'IPython.sphinxext.ipython_directive', + 'nbsphinx' ] # the mapping for code in other packages From 12306678fcd196921ebfacb90b26bf3cd4198f6f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 12:42:09 +0000 Subject: [PATCH 032/188] temporarily remove original rsts and paths for jupyter conversion --- doc/source/conf.py | 1 + doc/source/index.rst | 1 + 2 files changed, 2 insertions(+) diff --git a/doc/source/conf.py b/doc/source/conf.py index d7ef04b0..aedce28d 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -134,6 +134,7 @@ import sphinx_rtd_theme html_theme = 'sphinx_rtd_theme' html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + exclude_patterns = ['doc_to_sort.*'] else: # RTD will time out if we try to build the whole of the documentation so # ignore some of the longer bits and perhaps add them later diff --git a/doc/source/index.rst b/doc/source/index.rst index f2c08c9d..e9560e51 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -17,6 +17,7 @@ User Documentation getting_started.rst #sir.rst + #notebooks/sir.ipynb #transition.rst #stochastic.rst #unrollOde.rst From 9508502652c8557b40724d9407d1f3ea8f324cc9 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 12:49:36 +0000 Subject: [PATCH 033/188] temporarily move rst documentation for converting to jupyter notebooks --- doc/{source => doc_to_sort}/bvpSimple.rst | 374 ++++++------ doc/{source => doc_to_sort}/common_models.rst | 0 .../common_models/FitzHugh.rst | 0 .../common_models/Legrand_Ebola_SEIHFR.rst | 0 .../common_models/Lorenz.rst | 0 .../common_models/Lotka_Volterra.rst | 0 .../common_models/Lotka_Volterra_4State.rst | 0 .../common_models/Robertson.rst | 0 .../common_models/SEIR.rst | 0 .../common_models/SEIR_Birth_Death.rst | 0 .../SEIR_Birth_Death_Periodic.rst | 0 .../common_models/SEIR_Multiple.rst | 0 .../common_models/SIR.rst | 0 .../common_models/SIR_Birth_Death.rst | 0 .../common_models/SIS.rst | 0 .../common_models/SIS_Periodic.rst | 0 .../common_models/vanDelPol.rst | 0 doc/{source => doc_to_sort}/epi.rst | 0 doc/{source => doc_to_sort}/epijson.rst | 0 doc/{source => doc_to_sort}/estimate1.rst | 0 doc/{source => doc_to_sort}/estimate2.rst | 570 +++++++++--------- doc/{source => doc_to_sort}/faq.rst | 120 ++-- doc/{source => doc_to_sort}/fh.rst | 0 doc/{source => doc_to_sort}/gradient.rst | 0 doc/{source => doc_to_sort}/initialGuess.rst | 0 .../mod/common_models.rst | 0 .../mod/confidence_interval.rst | 0 .../mod/deterministic.rst | 0 .../mod/epi_analysis.rst | 0 doc/{source => doc_to_sort}/mod/get_init.rst | 0 doc/{source => doc_to_sort}/mod/index.rst | 0 doc/{source => doc_to_sort}/mod/losstype.rst | 0 doc/{source => doc_to_sort}/mod/odeloss.rst | 0 doc/{source => doc_to_sort}/mod/odeutils.rst | 0 doc/{source => doc_to_sort}/mod/simulate.rst | 0 .../mod/transition.rst | 0 doc/{source => doc_to_sort}/profile.rst | 0 doc/{source => doc_to_sort}/ref.rst | 0 doc/{source => doc_to_sort}/stochastic.rst | 0 doc/{source => doc_to_sort}/transition.rst | 0 .../unroll/unrollBD.rst | 0 .../unroll/unrollHard.rst | 0 .../unroll/unrollSimple.rst | 0 doc/{source => doc_to_sort}/unrollOde.rst | 0 44 files changed, 532 insertions(+), 532 deletions(-) rename doc/{source => doc_to_sort}/bvpSimple.rst (97%) rename doc/{source => doc_to_sort}/common_models.rst (100%) rename doc/{source => doc_to_sort}/common_models/FitzHugh.rst (100%) rename doc/{source => doc_to_sort}/common_models/Legrand_Ebola_SEIHFR.rst (100%) rename doc/{source => doc_to_sort}/common_models/Lorenz.rst (100%) rename doc/{source => doc_to_sort}/common_models/Lotka_Volterra.rst (100%) rename doc/{source => doc_to_sort}/common_models/Lotka_Volterra_4State.rst (100%) rename doc/{source => doc_to_sort}/common_models/Robertson.rst (100%) rename doc/{source => doc_to_sort}/common_models/SEIR.rst (100%) rename doc/{source => doc_to_sort}/common_models/SEIR_Birth_Death.rst (100%) rename doc/{source => doc_to_sort}/common_models/SEIR_Birth_Death_Periodic.rst (100%) rename doc/{source => doc_to_sort}/common_models/SEIR_Multiple.rst (100%) rename doc/{source => doc_to_sort}/common_models/SIR.rst (100%) rename doc/{source => doc_to_sort}/common_models/SIR_Birth_Death.rst (100%) rename doc/{source => doc_to_sort}/common_models/SIS.rst (100%) rename doc/{source => doc_to_sort}/common_models/SIS_Periodic.rst (100%) rename doc/{source => doc_to_sort}/common_models/vanDelPol.rst (100%) rename doc/{source => doc_to_sort}/epi.rst (100%) rename doc/{source => doc_to_sort}/epijson.rst (100%) rename doc/{source => doc_to_sort}/estimate1.rst (100%) rename doc/{source => doc_to_sort}/estimate2.rst (97%) rename doc/{source => doc_to_sort}/faq.rst (98%) rename doc/{source => doc_to_sort}/fh.rst (100%) rename doc/{source => doc_to_sort}/gradient.rst (100%) rename doc/{source => doc_to_sort}/initialGuess.rst (100%) rename doc/{source => doc_to_sort}/mod/common_models.rst (100%) rename doc/{source => doc_to_sort}/mod/confidence_interval.rst (100%) rename doc/{source => doc_to_sort}/mod/deterministic.rst (100%) rename doc/{source => doc_to_sort}/mod/epi_analysis.rst (100%) rename doc/{source => doc_to_sort}/mod/get_init.rst (100%) rename doc/{source => doc_to_sort}/mod/index.rst (100%) rename doc/{source => doc_to_sort}/mod/losstype.rst (100%) rename doc/{source => doc_to_sort}/mod/odeloss.rst (100%) rename doc/{source => doc_to_sort}/mod/odeutils.rst (100%) rename doc/{source => doc_to_sort}/mod/simulate.rst (100%) rename doc/{source => doc_to_sort}/mod/transition.rst (100%) rename doc/{source => doc_to_sort}/profile.rst (100%) rename doc/{source => doc_to_sort}/ref.rst (100%) rename doc/{source => doc_to_sort}/stochastic.rst (100%) rename doc/{source => doc_to_sort}/transition.rst (100%) rename doc/{source => doc_to_sort}/unroll/unrollBD.rst (100%) rename doc/{source => doc_to_sort}/unroll/unrollHard.rst (100%) rename doc/{source => doc_to_sort}/unroll/unrollSimple.rst (100%) rename doc/{source => doc_to_sort}/unrollOde.rst (100%) diff --git a/doc/source/bvpSimple.rst b/doc/doc_to_sort/bvpSimple.rst similarity index 97% rename from doc/source/bvpSimple.rst rename to doc/doc_to_sort/bvpSimple.rst index c4f6b1c0..e5de0d61 100644 --- a/doc/source/bvpSimple.rst +++ b/doc/doc_to_sort/bvpSimple.rst @@ -1,187 +1,187 @@ -.. _bvpSimple: - -******************************* -Solving Boundary Value Problems -******************************* - -In addition to finding solutions for an IVP and estimate the unknown parameters, this package also allows you to solve BVP with a little bit of imagination. Here, we are going to show how a BVP can be solved by treating it as a parameter estimation problem. Essentially, a shooting method where the first boundary condition defines the initial condition of an IVP and the second boundary condition is an observation. Two examples, both from MATLAB [1]_, will be shown here. - -Simple model 1 -============== - -We are trying to find the solution to the second order differential equation - -.. math:: - \nabla^{2} y + |y| = 0 - -subject to the boundary conditions :math:`y(0) = 0` and :math:`y(4) = -2`. Convert this into a set of first order ODE - -.. math:: - - \frac{d y_{0}}{dt} &= y_{1} \\ - \frac{d y_{1}}{dt} &= -|y_{0}| - -using an auxiliary variable :math:`y_{1} = \nabla y` and :math:`y_{0} = y`. Setting up the system below - -.. ipython:: - - In [1]: from pygom import Transition, TransitionType, DeterministicOde, SquareLoss - - In [1]: import matplotlib.pyplot as plt - - In [2]: stateList = ['y0', 'y1'] - - In [3]: paramList = [] - - In [4]: ode1 = Transition(origin='y0', - ...: equation='y1', - ...: transition_type=TransitionType.ODE) - - In [5]: ode2 = Transition(origin='y1', - ...: equation='-abs(y0)', - ...: transition_type=TransitionType.ODE) - - In [6]: model = DeterministicOde(stateList, - ...: paramList, - ...: ode=[ode1, ode2]) - - In [7]: model.get_ode_eqn() - -We check that the equations are correct before proceeding to set up our loss function. - -.. ipython:: - - In [1]: import numpy - - In [2]: from scipy.optimize import minimize - - In [3]: initialState = [0.0, 1.0] - - In [4]: t = numpy.linspace(0, 4, 100) - - In [5]: model.initial_values = (initialState, t[0]) - - In [6]: solution = model.integrate(t[1::]) - - In [7]: f = plt.figure() - - @savefig bvp1_random_guess_plot.png - In [8]: model.plot() - - In [9]: plt.close() - -Setting up the second boundary condition :math:`y(4) = -2` is easy, because that -is just a single observation attached to the state :math:`y_{1}`. Enforcing the -first boundary condition requires us to set it as the initial condition. -Because the condition only states that :math:`y(0) = 0`, the starting value of -the other state :math:`y_1` is free. We let our loss object know that it is -free through the targetState input argument. - -.. ipython:: - - In [10]: theta = [0.0] - - In [11]: obj = SquareLoss(theta=theta, - ....: ode=model, - ....: x0=initialState, - ....: t0=t[0], - ....: t=t[-1], - ....: y=[-2], - ....: state_name=['y0'], - ....: target_state=['y1']) - - In [12]: thetaHat = minimize(fun=obj.costIV, x0=[0.0]) - - In [13]: print(thetaHat) - - In [14]: model.initial_values = ([0.0] + thetaHat['x'].tolist(), t[0]) - - In [15]: solution = model.integrate(t[1::]) - - In [16]: f = plt.figure() - - @savefig bvp1_solution_plot.png - In [17]: model.plot() - - In [18]: plt.close() - -We are going to visualize the solution, and also check the boundary condition. The first became our initial condition, so it is always satisfied and only the latter is of concern, which is zero (subject to numerical error) from thetaHat. - -Simple model 2 -============== - -Our second example is different as it involves an actual parameter and also time. We have the Mathieu's Equation - -.. math:: - - \nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0 - -and the aim is to compute the fourth eigenvalue :math:`q=5`. There are three boundary conditions - -.. math:: - - \nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1 - -and we aim to solve it by converting it to a first order ODE and tackle it as an IVP. As our model object does not allow the use of the time component in the equations, we introduce a anxiliary state :math:`\tau` that replaces time :math:`t`. Rewrite the equations using :math:`y_{0} = y, y_{1} = \nabla y` and define our model as - -.. ipython:: - - In [1]: stateList = ['y0', 'y1', 'tau'] - - In [2]: paramList = ['p'] - - In [3]: ode1 = Transition('y0', 'y1', TransitionType.ODE) - - In [4]: ode2 = Transition('y1', '-(p - 2*5*cos(2*tau))*y0', TransitionType.ODE) - - In [5]: ode3 = Transition('tau', '1', TransitionType.ODE) - - In [6]: model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3]) - - In [7]: theta = [1.0, 1.0, 0.0] - - In [8]: p = 15.0 - - In [9]: t = numpy.linspace(0, numpy.pi) - - In [10]: model.parameters = [('p',p)] - - In [11]: model.initial_values = (theta, t[0]) - - In [12]: solution = model.integrate(t[1::]) - - In [13]: f = plt.figure() - - @savefig bvp2_random_guess_plot.png - In [14]: model.plot() - - In [15]: plt.close() - -Now we are ready to setup the estimation. Like before, we setup the second boundary condition by pretending that it is an observation. We have all the initial conditions defined by the first boundary condition - -.. ipython:: - - In [1]: obj = SquareLoss(15.0, model, x0=[1.0, 0.0, 0.0], t0=0.0, t=numpy.pi, y=0.0, state_name='y1') - - In [2]: xhatObj = minimize(obj.cost,[15]) - - In [3]: print(xhatObj) - - In [4]: model.parameters = [('p', xhatObj['x'][0])] - - In [5]: model.initial_values = ([1.0, 0.0, 0.0], t[0]) - - In [5]: solution = model.integrate(t[1::]) - - In [6]: f = plt.figure() - - @savefig bvp2_solution_plot.png - In [7]: model.plot() - - In [8]: plt.close() - -The plot of the solution shows the path that satisfies all boundary condition. The last subplot is time which obvious is redundant here but the :meth:`DeterministicOde.plot` method is not yet able to recognize the time component. Possible speed up can be achieved through the use of derivative information or via root finding method that tackles the gradient directly, instead of the cost function. - -**Reference** - -.. [1] http://uk.mathworks.com/help/matlab/ref/bvp4c.html +.. _bvpSimple: + +******************************* +Solving Boundary Value Problems +******************************* + +In addition to finding solutions for an IVP and estimate the unknown parameters, this package also allows you to solve BVP with a little bit of imagination. Here, we are going to show how a BVP can be solved by treating it as a parameter estimation problem. Essentially, a shooting method where the first boundary condition defines the initial condition of an IVP and the second boundary condition is an observation. Two examples, both from MATLAB [1]_, will be shown here. + +Simple model 1 +============== + +We are trying to find the solution to the second order differential equation + +.. math:: + \nabla^{2} y + |y| = 0 + +subject to the boundary conditions :math:`y(0) = 0` and :math:`y(4) = -2`. Convert this into a set of first order ODE + +.. math:: + + \frac{d y_{0}}{dt} &= y_{1} \\ + \frac{d y_{1}}{dt} &= -|y_{0}| + +using an auxiliary variable :math:`y_{1} = \nabla y` and :math:`y_{0} = y`. Setting up the system below + +.. ipython:: + + In [1]: from pygom import Transition, TransitionType, DeterministicOde, SquareLoss + + In [1]: import matplotlib.pyplot as plt + + In [2]: stateList = ['y0', 'y1'] + + In [3]: paramList = [] + + In [4]: ode1 = Transition(origin='y0', + ...: equation='y1', + ...: transition_type=TransitionType.ODE) + + In [5]: ode2 = Transition(origin='y1', + ...: equation='-abs(y0)', + ...: transition_type=TransitionType.ODE) + + In [6]: model = DeterministicOde(stateList, + ...: paramList, + ...: ode=[ode1, ode2]) + + In [7]: model.get_ode_eqn() + +We check that the equations are correct before proceeding to set up our loss function. + +.. ipython:: + + In [1]: import numpy + + In [2]: from scipy.optimize import minimize + + In [3]: initialState = [0.0, 1.0] + + In [4]: t = numpy.linspace(0, 4, 100) + + In [5]: model.initial_values = (initialState, t[0]) + + In [6]: solution = model.integrate(t[1::]) + + In [7]: f = plt.figure() + + @savefig bvp1_random_guess_plot.png + In [8]: model.plot() + + In [9]: plt.close() + +Setting up the second boundary condition :math:`y(4) = -2` is easy, because that +is just a single observation attached to the state :math:`y_{1}`. Enforcing the +first boundary condition requires us to set it as the initial condition. +Because the condition only states that :math:`y(0) = 0`, the starting value of +the other state :math:`y_1` is free. We let our loss object know that it is +free through the targetState input argument. + +.. ipython:: + + In [10]: theta = [0.0] + + In [11]: obj = SquareLoss(theta=theta, + ....: ode=model, + ....: x0=initialState, + ....: t0=t[0], + ....: t=t[-1], + ....: y=[-2], + ....: state_name=['y0'], + ....: target_state=['y1']) + + In [12]: thetaHat = minimize(fun=obj.costIV, x0=[0.0]) + + In [13]: print(thetaHat) + + In [14]: model.initial_values = ([0.0] + thetaHat['x'].tolist(), t[0]) + + In [15]: solution = model.integrate(t[1::]) + + In [16]: f = plt.figure() + + @savefig bvp1_solution_plot.png + In [17]: model.plot() + + In [18]: plt.close() + +We are going to visualize the solution, and also check the boundary condition. The first became our initial condition, so it is always satisfied and only the latter is of concern, which is zero (subject to numerical error) from thetaHat. + +Simple model 2 +============== + +Our second example is different as it involves an actual parameter and also time. We have the Mathieu's Equation + +.. math:: + + \nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0 + +and the aim is to compute the fourth eigenvalue :math:`q=5`. There are three boundary conditions + +.. math:: + + \nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1 + +and we aim to solve it by converting it to a first order ODE and tackle it as an IVP. As our model object does not allow the use of the time component in the equations, we introduce a anxiliary state :math:`\tau` that replaces time :math:`t`. Rewrite the equations using :math:`y_{0} = y, y_{1} = \nabla y` and define our model as + +.. ipython:: + + In [1]: stateList = ['y0', 'y1', 'tau'] + + In [2]: paramList = ['p'] + + In [3]: ode1 = Transition('y0', 'y1', TransitionType.ODE) + + In [4]: ode2 = Transition('y1', '-(p - 2*5*cos(2*tau))*y0', TransitionType.ODE) + + In [5]: ode3 = Transition('tau', '1', TransitionType.ODE) + + In [6]: model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3]) + + In [7]: theta = [1.0, 1.0, 0.0] + + In [8]: p = 15.0 + + In [9]: t = numpy.linspace(0, numpy.pi) + + In [10]: model.parameters = [('p',p)] + + In [11]: model.initial_values = (theta, t[0]) + + In [12]: solution = model.integrate(t[1::]) + + In [13]: f = plt.figure() + + @savefig bvp2_random_guess_plot.png + In [14]: model.plot() + + In [15]: plt.close() + +Now we are ready to setup the estimation. Like before, we setup the second boundary condition by pretending that it is an observation. We have all the initial conditions defined by the first boundary condition + +.. ipython:: + + In [1]: obj = SquareLoss(15.0, model, x0=[1.0, 0.0, 0.0], t0=0.0, t=numpy.pi, y=0.0, state_name='y1') + + In [2]: xhatObj = minimize(obj.cost,[15]) + + In [3]: print(xhatObj) + + In [4]: model.parameters = [('p', xhatObj['x'][0])] + + In [5]: model.initial_values = ([1.0, 0.0, 0.0], t[0]) + + In [5]: solution = model.integrate(t[1::]) + + In [6]: f = plt.figure() + + @savefig bvp2_solution_plot.png + In [7]: model.plot() + + In [8]: plt.close() + +The plot of the solution shows the path that satisfies all boundary condition. The last subplot is time which obvious is redundant here but the :meth:`DeterministicOde.plot` method is not yet able to recognize the time component. Possible speed up can be achieved through the use of derivative information or via root finding method that tackles the gradient directly, instead of the cost function. + +**Reference** + +.. [1] http://uk.mathworks.com/help/matlab/ref/bvp4c.html diff --git a/doc/source/common_models.rst b/doc/doc_to_sort/common_models.rst similarity index 100% rename from doc/source/common_models.rst rename to doc/doc_to_sort/common_models.rst diff --git a/doc/source/common_models/FitzHugh.rst b/doc/doc_to_sort/common_models/FitzHugh.rst similarity index 100% rename from doc/source/common_models/FitzHugh.rst rename to doc/doc_to_sort/common_models/FitzHugh.rst diff --git a/doc/source/common_models/Legrand_Ebola_SEIHFR.rst b/doc/doc_to_sort/common_models/Legrand_Ebola_SEIHFR.rst similarity index 100% rename from doc/source/common_models/Legrand_Ebola_SEIHFR.rst rename to doc/doc_to_sort/common_models/Legrand_Ebola_SEIHFR.rst diff --git a/doc/source/common_models/Lorenz.rst b/doc/doc_to_sort/common_models/Lorenz.rst similarity index 100% rename from doc/source/common_models/Lorenz.rst rename to doc/doc_to_sort/common_models/Lorenz.rst diff --git a/doc/source/common_models/Lotka_Volterra.rst b/doc/doc_to_sort/common_models/Lotka_Volterra.rst similarity index 100% rename from doc/source/common_models/Lotka_Volterra.rst rename to doc/doc_to_sort/common_models/Lotka_Volterra.rst diff --git a/doc/source/common_models/Lotka_Volterra_4State.rst b/doc/doc_to_sort/common_models/Lotka_Volterra_4State.rst similarity index 100% rename from doc/source/common_models/Lotka_Volterra_4State.rst rename to doc/doc_to_sort/common_models/Lotka_Volterra_4State.rst diff --git a/doc/source/common_models/Robertson.rst b/doc/doc_to_sort/common_models/Robertson.rst similarity index 100% rename from doc/source/common_models/Robertson.rst rename to doc/doc_to_sort/common_models/Robertson.rst diff --git a/doc/source/common_models/SEIR.rst b/doc/doc_to_sort/common_models/SEIR.rst similarity index 100% rename from doc/source/common_models/SEIR.rst rename to doc/doc_to_sort/common_models/SEIR.rst diff --git a/doc/source/common_models/SEIR_Birth_Death.rst b/doc/doc_to_sort/common_models/SEIR_Birth_Death.rst similarity index 100% rename from doc/source/common_models/SEIR_Birth_Death.rst rename to doc/doc_to_sort/common_models/SEIR_Birth_Death.rst diff --git a/doc/source/common_models/SEIR_Birth_Death_Periodic.rst b/doc/doc_to_sort/common_models/SEIR_Birth_Death_Periodic.rst similarity index 100% rename from doc/source/common_models/SEIR_Birth_Death_Periodic.rst rename to doc/doc_to_sort/common_models/SEIR_Birth_Death_Periodic.rst diff --git a/doc/source/common_models/SEIR_Multiple.rst b/doc/doc_to_sort/common_models/SEIR_Multiple.rst similarity index 100% rename from doc/source/common_models/SEIR_Multiple.rst rename to doc/doc_to_sort/common_models/SEIR_Multiple.rst diff --git a/doc/source/common_models/SIR.rst b/doc/doc_to_sort/common_models/SIR.rst similarity index 100% rename from doc/source/common_models/SIR.rst rename to doc/doc_to_sort/common_models/SIR.rst diff --git a/doc/source/common_models/SIR_Birth_Death.rst b/doc/doc_to_sort/common_models/SIR_Birth_Death.rst similarity index 100% rename from doc/source/common_models/SIR_Birth_Death.rst rename to doc/doc_to_sort/common_models/SIR_Birth_Death.rst diff --git a/doc/source/common_models/SIS.rst b/doc/doc_to_sort/common_models/SIS.rst similarity index 100% rename from doc/source/common_models/SIS.rst rename to doc/doc_to_sort/common_models/SIS.rst diff --git a/doc/source/common_models/SIS_Periodic.rst b/doc/doc_to_sort/common_models/SIS_Periodic.rst similarity index 100% rename from doc/source/common_models/SIS_Periodic.rst rename to doc/doc_to_sort/common_models/SIS_Periodic.rst diff --git a/doc/source/common_models/vanDelPol.rst b/doc/doc_to_sort/common_models/vanDelPol.rst similarity index 100% rename from doc/source/common_models/vanDelPol.rst rename to doc/doc_to_sort/common_models/vanDelPol.rst diff --git a/doc/source/epi.rst b/doc/doc_to_sort/epi.rst similarity index 100% rename from doc/source/epi.rst rename to doc/doc_to_sort/epi.rst diff --git a/doc/source/epijson.rst b/doc/doc_to_sort/epijson.rst similarity index 100% rename from doc/source/epijson.rst rename to doc/doc_to_sort/epijson.rst diff --git a/doc/source/estimate1.rst b/doc/doc_to_sort/estimate1.rst similarity index 100% rename from doc/source/estimate1.rst rename to doc/doc_to_sort/estimate1.rst diff --git a/doc/source/estimate2.rst b/doc/doc_to_sort/estimate2.rst similarity index 97% rename from doc/source/estimate2.rst rename to doc/doc_to_sort/estimate2.rst index ebd7d7c5..10d27b23 100644 --- a/doc/source/estimate2.rst +++ b/doc/doc_to_sort/estimate2.rst @@ -1,285 +1,285 @@ -.. _estimate2: - -******************************* -Example: Parameter Estimation 2 -******************************* - -Continuing from the :ref:`estimate1`, we show why estimating the parameters for ode's are hard. This is especially true if there is a lack of data or when there are too much flexibility in the model. Note that for reproducibility purposes, only deterministic models are used here and a fixed seed whenever a stochastic algorithm is needed. - -Standard SEIR model -=================== - -We demonstrate the estimation on the recent Ebola outbreak in West Africa. We use the number of deaths in Guinea and its corresponding time the data was recorded. These data are publicly available and they can be obtained easily on the internet such as https://github.com/cmrivers/ebola. It is stated out here for simplicity. - -.. ipython:: - - In [34]: # the number of deaths and cases in Guinea - - In [35]: yDeath = [29.0, 59.0, 60.0, 62.0, 66.0, 70.0, 70.0, 80.0, 83.0, 86.0, 95.0, 101.0, 106.0, 108.0, - ....: 122.0, 129.0, 136.0, 141.0, 143.0, 149.0, 155.0, 157.0, 158.0, 157.0, 171.0, 174.0, - ....: 186.0, 193.0, 208.0, 215.0, 226.0, 264.0, 267.0, 270.0, 303.0, 305.0, 307.0, 309.0, - ....: 304.0, 310.0, 310.0, 314.0, 319.0, 339.0, 346.0, 358.0, 363.0, 367.0, 373.0, 377.0, - ....: 380.0, 394.0, 396.0, 406.0, 430.0, 494.0, 517.0, 557.0, 568.0, 595.0, 601.0, 632.0, - ....: 635.0, 648.0, 710.0, 739.0, 768.0, 778.0, 843.0, 862.0, 904.0, 926.0, 997.0] - - In [35]: yCase = [49.0, 86.0, 86.0, 86.0, 103.0, 112.0, 112.0, 122.0, 127.0, 143.0, 151.0, 158.0, - ....: 159.0, 168.0, 197.0, 203.0, 208.0, 218.0, 224.0, 226.0, 231.0, 235.0, 236.0, - ....: 233.0, 248.0, 258.0, 281.0, 291.0, 328.0, 344.0, 351.0, 398.0, 390.0, 390.0, - ....: 413.0, 412.0, 408.0, 409.0, 406.0, 411.0, 410.0, 415.0, 427.0, 460.0, 472.0, - ....: 485.0, 495.0, 495.0, 506.0, 510.0, 519.0, 543.0, 579.0, 607.0, 648.0, 771.0, - ....: 812.0, 861.0, 899.0, 936.0, 942.0, 1008.0, 1022.0, 1074.0, 1157.0, 1199.0, 1298.0, - ....: 1350.0, 1472.0, 1519.0, 1540.0, 1553.0, 1906.0] - - In [36]: # the corresponding time - - In [37]: t = [0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0, 13.0, 16.0, 18.0, 20.0, 23.0, 25.0, 26.0, 29.0, - ....: 32.0, 35.0, 40.0, 42.0, 44.0, 46.0, 49.0, 51.0, 62.0, 66.0, 67.0, 71.0, 73.0, 80.0, 86.0, 88.0, - ....: 90.0, 100.0, 102.0, 106.0, 108.0, 112.0, 114.0, 117.0, 120.0, 123.0, 126.0, 129.0, 132.0, 135.0, - ....: 137.0, 140.0, 142.0, 144.0, 147.0, 149.0, 151.0, 157.0, 162.0, 167.0, 169.0, 172.0, 175.0, 176.0, - ....: 181.0, 183.0, 185.0, 190.0, 193.0, 197.0, 199.0, 204.0, 206.0, 211.0, 213.0, 218.0] - -Simple estimation ------------------ - -First ,we are going to fit a standard **SEIR** model to the data. Details of the models can be found in :mod:`common_models` Defining the model as usual with some random guess on what the parameters might be, here, we choose the values to be the mid point of our feasible region (defined by our box constraints later) - -.. ipython:: - - In [1]: from pygom import SquareLoss, common_models - - In [1]: import numpy, scipy.optimize - - In [1]: import matplotlib.pyplot as plt - - In [1]: theta = numpy.array([5.0, 5.0, 5.0]) - - In [2]: ode = common_models.SEIR(theta) - - In [3]: population = 1175e4 - - In [4]: y = numpy.reshape(numpy.append(numpy.array(yCase), numpy.array(yDeath)), (len(yCase),2), 'F')/population - - In [5]: x0 = [1., 0., 49.0/population, 29.0/population] - - In [6]: t0 = t[0] - - In [7]: objLegrand = SquareLoss(theta, ode, x0, t0, t[1::], y[1::,:], ['I','R'], numpy.sqrt([population]*2)) - -Then we optimize, first, assuming that the initial conditions are accurate. Some relatively large bounds are used for this particular problem. - -.. ipython:: - - In [8]: boxBounds = [ (0.0,10.0), (0.0,10.0), (0.0,10.0) ] - - In [9]: res = scipy.optimize.minimize(fun=objLegrand.cost, - ...: jac=objLegrand.sensitivity, - ...: x0=theta, - ...: bounds=boxBounds, - ...: method='l-bfgs-b') - - In [10]: print(res) - - In [11]: f = plt.figure() - - @savefig ebola_seir_straight.png - In [12]: objLegrand.plot() - - In [13]: plt.close() - -We can see from our visual confirmation that the estimated parameters are not exactly ideal. This is confirmed by the information returned from the :func:`scipy.optimize.minimize` routine, and probably caused by the poor starting point. An attempt to find a more suitable value can be done by some form of parameter space exploration. Given that the evaluation of the objective function is not expensive here, we have plenty of options to choose from. To reduce the number of packages required to build this documentation, routines from :mod:`scipy.optimize` remains our preferred option. - -Improved initial guess ----------------------- - -.. ipython:: - - In [8]: resDE = scipy.optimize.differential_evolution(objLegrand.cost, bounds=boxBounds, polish=False, seed=20921391) - - In [9]: print(objLegrand.sensitivity(resDE['x'])) - - In [10]: f = plt.figure() - - @savefig ebola_seir_de.png - In [11]: objLegrand.plot() - - In [12]: plt.close() - -Looking at the output of the estimates (below this paragraph), we can see our inference on Ebola is wrong when compared to the *known* values (from field observation) even though the graphs looks *``reasonable"*. Namely, :math:`\gamma^{-1}` the third element in the vector below, our time from infectious to death, is within the expected range but :math:`\alpha^{-1}` (second element), the incubation period, is a lot higher than expected. - -.. ipython:: - - In [1]: 1/resDE['x'] - -Multimodal surface ------------------- - -A reason for this type of behavior is that we simply lack the information/data to make proper inference. Without data on the state :math:`E`, the parameters :math:`\beta,\alpha` for the two states :math:`I` and :math:`E` are dependent only on observations on :math:`I`. Hence, some other random combination of :math:`\beta,\alpha` that is capable of generating realization close to observations in :math:`I` is feasible. In such cases, the only requirement is that there exist some :math:`\gamma` in the feasible region that can compensate for the ill suited :math:`\beta,\alpha`. For example, we know (obtained elsewhere and not shown here) that there is another set of parameters capable of generating a similar looking curves as before. Note the reversal of magnitude in :math:`\beta` and :math:`\alpha`. - -.. ipython:: - - In [11]: objLegrand.cost([3.26106524e+00, 2.24798702e-04, 1.23660721e-02]) - - In [12]: ## objLegrand.cost([ 0.02701867, 9.00004776, 0.01031861]) # similar graph - - @savefig ebola_seir_prior.png - In [13]: objLegrand.plot() - - In [14]: plt.close() - -With initial values as parameters ---------------------------------- - -Obviously, the assumption that the whole population being susceptible is an overestimate. We now try to estimate the initial conditions of the ode as well. Given previous estimates of the parameters :math:`\hat{\beta}, \hat{\alpha}, \hat{\gamma}` it is appropriate to start our initial guess there. - -Furthermore, given that we now estimate the initial values for all the states, we can use the first time point as our observation. So our time begins at :math:`t = -1` where our observations include the previous initial condition, i.e. 49 and 29 for the number of cases and death at :math:`t = 0` respectively. The following code block demonstrates how we would do that; feel free to try it out yourself to see the much improved result. - -.. ipython:: - :verbatim: - - In [1]: thetaIV = theta.tolist() + x0 - - In [2]: thetaIV[3] -= 1e-8 # to make sure that the initial guess satisfy the constraints - - In [3]: boxBoundsIV = boxBounds + [(0.,1.), (0.,1.), (0.,1.), (0.,1.)] - - In [4]: objLegrand = SquareLoss(theta, ode, x0, -1, t, y, ['I','R'], numpy.sqrt([population]*2)) - - In [5]: resDEIV = scipy.optimize.differential_evolution(objLegrand.costIV, bounds=boxBoundsIV, polish=False, seed=20921391) - - In [6]: print(resDEIV) - - In [7]: f = plt.figure() - - In [8]: objLegrand.plot() - - In [9]: plt.close() - - -Legrand Ebola SEIHFR Model -========================== - -Next, we demonstrate the estimation on a model that is widely used in the recent Ebola outbreak in west Africa. Again, the model has been defined in :mod:`.common_models` already. - -.. ipython:: - - In [1]: ode = common_models.Legrand_Ebola_SEIHFR() - - In [27]: # initial guess from the paper that studied the outbreak in Congo - - In [28]: theta = numpy.array([0.588,0.794,7.653, ### the beta - ....: 10.0,9.6,5.0,2.0, ### the omega - ....: 7.0,0.81,0.80, ### alpha, delta, theta - ....: 100.,1.0]) ### kappa,intervention time - - In [29]: # initial conditions, note that we have a 0.0 at the end because the model is a non-automonous ode which we have converted the time component out - - In [30]: x0 = numpy.array([population, 0.0, 49.0, 0.0, 0.0, 29.0, 0.0])/population - - In [30]: ode.parameters = theta - - In [31]: ode.initial_values = (x0, t[0]) - - In [32]: objLegrand = SquareLoss(theta, ode, x0, t[0], t[1::], y[1::,:], ['I','R'], numpy.sqrt([population]*2)) - -Now, it is important to set additional constraints accurately because a simply box constraint is much larger than the feasible set. Namely, :math:`\omega_{I}, \omega_{D}` are the time taken from onset until end of infectious/death, which has to be bigger than :math:`\omega_{H}`, onset to hospitalization given the nature of the disease. Therefore, we create extra inequality constraints in addition to the box constraints - -.. ipython:: - - In [549]: boxBounds = [ - .....: (0.001, 100.), # \beta_I - .....: (0.001, 100.), # \beta_H - .....: (0.001, 100.), # \beta_F - .....: (0.001, 100.), # \omega_I - .....: (0.001, 100.), # \omega_D - .....: (0.001, 100.), # \omega_H - .....: (0.001, 100.), # \omega_F - .....: (0.001, 100.), # \alpha^{-1} - .....: (0.0001, 1.), # \delta - .....: (0.0001, 1.), # \theta - .....: (0.001, 1000.), # \kappa - .....: (0.,218.) # intervention tine - .....: ] - - In [550]: cons = ({'type': 'ineq', 'fun' : lambda x: numpy.array([x[3]-x[5], x[4]-x[5]])}) - -We can now try to find the optimal values, but because this is a difficult problem that can take a very long time without guarantee on the quality of solution - -.. ipython:: - :okexcept: - :okwarning: - - In [213]: res = scipy.optimize.minimize(fun=objLegrand.cost, - .....: jac=objLegrand.sensitivity, - .....: x0=theta, - .....: constraints=cons, - .....: bounds=boxBounds, - .....: method='SLSQP') - - In [214]: print(res) - - In [215]: f = plt.figure() - - @savefig ebola_legrand_runtime.png - In [216]: objLegrand.plot() - - In [217]: plt.close() - -Evidently, the estimated parameters are very much unrealistic given that a lot of them are near the boundaries. It is also known from other sources that some of the epidemiology properties of Ebola, with incubation period of around 2 weeks and a mortality rate of around 80 percent. - -As the estimate does not appear to provide anything sensible, we also provide a set of values previously obtained (that looks semi-reasonable) here plot the epidemic curve with the observations layered on top - -.. ipython:: - :okexcept: - :okwarning: - - In [1]: theta = numpy.array([3.96915071e-02, 1.72302620e+01, 1.99749990e+01, - ...: 2.67759445e+01, 4.99999990e+01, 5.56122691e+00, - ...: 4.99999990e+01, 8.51599523e+00, 9.99999000e-01, - ...: 1.00000000e-06, 3.85807562e+00, 1.88385318e+00]) - - In [2]: print(objLegrand.cost(theta)) - - In [2]: solution = ode.integrate(t[1::]) - - In [3]: f, axarr = plt.subplots(2,3) - - In [4]: axarr[0,0].plot(t, solution[:,0]); - - In [5]: axarr[0,0].set_title('Susceptible'); - - In [6]: axarr[0,1].plot(t, solution[:,1]); - - In [7]: axarr[0,1].set_title('Exposed'); - - In [8]: axarr[0,2].plot(t, solution[:,2]); - - In [9]: axarr[0,2].plot(t, y[:,0], 'r'); - - In [10]: axarr[0,2].set_title('Infectious'); - - In [11]: axarr[1,0].plot(t, solution[:,3]); - - In [12]: axarr[1,0].set_title('Hospitalised'); - - In [13]: axarr[1,1].plot(t, solution[:,4]); - - In [14]: axarr[1,1].set_title('Awaiting Burial'); - - In [15]: axarr[1,2].plot(t, solution[:,5]); - - In [16]: axarr[1,2].plot(t, y[:,1], 'r'); - - In [17]: axarr[1,2].set_title('Removed'); - - In [18]: f.text(0.5, 0.04, 'Days from outbreak', ha='center'); - - In [19]: f.text(0.01, 0.5, 'Population', va='center', rotation='vertical'); - - In [20]: f.tight_layout(); - - @savefig ebola_seihfr_straight_prior.png - In [21]: plt.show() - - In [22]: plt.close() - - +.. _estimate2: + +******************************* +Example: Parameter Estimation 2 +******************************* + +Continuing from the :ref:`estimate1`, we show why estimating the parameters for ode's are hard. This is especially true if there is a lack of data or when there are too much flexibility in the model. Note that for reproducibility purposes, only deterministic models are used here and a fixed seed whenever a stochastic algorithm is needed. + +Standard SEIR model +=================== + +We demonstrate the estimation on the recent Ebola outbreak in West Africa. We use the number of deaths in Guinea and its corresponding time the data was recorded. These data are publicly available and they can be obtained easily on the internet such as https://github.com/cmrivers/ebola. It is stated out here for simplicity. + +.. ipython:: + + In [34]: # the number of deaths and cases in Guinea + + In [35]: yDeath = [29.0, 59.0, 60.0, 62.0, 66.0, 70.0, 70.0, 80.0, 83.0, 86.0, 95.0, 101.0, 106.0, 108.0, + ....: 122.0, 129.0, 136.0, 141.0, 143.0, 149.0, 155.0, 157.0, 158.0, 157.0, 171.0, 174.0, + ....: 186.0, 193.0, 208.0, 215.0, 226.0, 264.0, 267.0, 270.0, 303.0, 305.0, 307.0, 309.0, + ....: 304.0, 310.0, 310.0, 314.0, 319.0, 339.0, 346.0, 358.0, 363.0, 367.0, 373.0, 377.0, + ....: 380.0, 394.0, 396.0, 406.0, 430.0, 494.0, 517.0, 557.0, 568.0, 595.0, 601.0, 632.0, + ....: 635.0, 648.0, 710.0, 739.0, 768.0, 778.0, 843.0, 862.0, 904.0, 926.0, 997.0] + + In [35]: yCase = [49.0, 86.0, 86.0, 86.0, 103.0, 112.0, 112.0, 122.0, 127.0, 143.0, 151.0, 158.0, + ....: 159.0, 168.0, 197.0, 203.0, 208.0, 218.0, 224.0, 226.0, 231.0, 235.0, 236.0, + ....: 233.0, 248.0, 258.0, 281.0, 291.0, 328.0, 344.0, 351.0, 398.0, 390.0, 390.0, + ....: 413.0, 412.0, 408.0, 409.0, 406.0, 411.0, 410.0, 415.0, 427.0, 460.0, 472.0, + ....: 485.0, 495.0, 495.0, 506.0, 510.0, 519.0, 543.0, 579.0, 607.0, 648.0, 771.0, + ....: 812.0, 861.0, 899.0, 936.0, 942.0, 1008.0, 1022.0, 1074.0, 1157.0, 1199.0, 1298.0, + ....: 1350.0, 1472.0, 1519.0, 1540.0, 1553.0, 1906.0] + + In [36]: # the corresponding time + + In [37]: t = [0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0, 13.0, 16.0, 18.0, 20.0, 23.0, 25.0, 26.0, 29.0, + ....: 32.0, 35.0, 40.0, 42.0, 44.0, 46.0, 49.0, 51.0, 62.0, 66.0, 67.0, 71.0, 73.0, 80.0, 86.0, 88.0, + ....: 90.0, 100.0, 102.0, 106.0, 108.0, 112.0, 114.0, 117.0, 120.0, 123.0, 126.0, 129.0, 132.0, 135.0, + ....: 137.0, 140.0, 142.0, 144.0, 147.0, 149.0, 151.0, 157.0, 162.0, 167.0, 169.0, 172.0, 175.0, 176.0, + ....: 181.0, 183.0, 185.0, 190.0, 193.0, 197.0, 199.0, 204.0, 206.0, 211.0, 213.0, 218.0] + +Simple estimation +----------------- + +First ,we are going to fit a standard **SEIR** model to the data. Details of the models can be found in :mod:`common_models` Defining the model as usual with some random guess on what the parameters might be, here, we choose the values to be the mid point of our feasible region (defined by our box constraints later) + +.. ipython:: + + In [1]: from pygom import SquareLoss, common_models + + In [1]: import numpy, scipy.optimize + + In [1]: import matplotlib.pyplot as plt + + In [1]: theta = numpy.array([5.0, 5.0, 5.0]) + + In [2]: ode = common_models.SEIR(theta) + + In [3]: population = 1175e4 + + In [4]: y = numpy.reshape(numpy.append(numpy.array(yCase), numpy.array(yDeath)), (len(yCase),2), 'F')/population + + In [5]: x0 = [1., 0., 49.0/population, 29.0/population] + + In [6]: t0 = t[0] + + In [7]: objLegrand = SquareLoss(theta, ode, x0, t0, t[1::], y[1::,:], ['I','R'], numpy.sqrt([population]*2)) + +Then we optimize, first, assuming that the initial conditions are accurate. Some relatively large bounds are used for this particular problem. + +.. ipython:: + + In [8]: boxBounds = [ (0.0,10.0), (0.0,10.0), (0.0,10.0) ] + + In [9]: res = scipy.optimize.minimize(fun=objLegrand.cost, + ...: jac=objLegrand.sensitivity, + ...: x0=theta, + ...: bounds=boxBounds, + ...: method='l-bfgs-b') + + In [10]: print(res) + + In [11]: f = plt.figure() + + @savefig ebola_seir_straight.png + In [12]: objLegrand.plot() + + In [13]: plt.close() + +We can see from our visual confirmation that the estimated parameters are not exactly ideal. This is confirmed by the information returned from the :func:`scipy.optimize.minimize` routine, and probably caused by the poor starting point. An attempt to find a more suitable value can be done by some form of parameter space exploration. Given that the evaluation of the objective function is not expensive here, we have plenty of options to choose from. To reduce the number of packages required to build this documentation, routines from :mod:`scipy.optimize` remains our preferred option. + +Improved initial guess +---------------------- + +.. ipython:: + + In [8]: resDE = scipy.optimize.differential_evolution(objLegrand.cost, bounds=boxBounds, polish=False, seed=20921391) + + In [9]: print(objLegrand.sensitivity(resDE['x'])) + + In [10]: f = plt.figure() + + @savefig ebola_seir_de.png + In [11]: objLegrand.plot() + + In [12]: plt.close() + +Looking at the output of the estimates (below this paragraph), we can see our inference on Ebola is wrong when compared to the *known* values (from field observation) even though the graphs looks *``reasonable"*. Namely, :math:`\gamma^{-1}` the third element in the vector below, our time from infectious to death, is within the expected range but :math:`\alpha^{-1}` (second element), the incubation period, is a lot higher than expected. + +.. ipython:: + + In [1]: 1/resDE['x'] + +Multimodal surface +------------------ + +A reason for this type of behavior is that we simply lack the information/data to make proper inference. Without data on the state :math:`E`, the parameters :math:`\beta,\alpha` for the two states :math:`I` and :math:`E` are dependent only on observations on :math:`I`. Hence, some other random combination of :math:`\beta,\alpha` that is capable of generating realization close to observations in :math:`I` is feasible. In such cases, the only requirement is that there exist some :math:`\gamma` in the feasible region that can compensate for the ill suited :math:`\beta,\alpha`. For example, we know (obtained elsewhere and not shown here) that there is another set of parameters capable of generating a similar looking curves as before. Note the reversal of magnitude in :math:`\beta` and :math:`\alpha`. + +.. ipython:: + + In [11]: objLegrand.cost([3.26106524e+00, 2.24798702e-04, 1.23660721e-02]) + + In [12]: ## objLegrand.cost([ 0.02701867, 9.00004776, 0.01031861]) # similar graph + + @savefig ebola_seir_prior.png + In [13]: objLegrand.plot() + + In [14]: plt.close() + +With initial values as parameters +--------------------------------- + +Obviously, the assumption that the whole population being susceptible is an overestimate. We now try to estimate the initial conditions of the ode as well. Given previous estimates of the parameters :math:`\hat{\beta}, \hat{\alpha}, \hat{\gamma}` it is appropriate to start our initial guess there. + +Furthermore, given that we now estimate the initial values for all the states, we can use the first time point as our observation. So our time begins at :math:`t = -1` where our observations include the previous initial condition, i.e. 49 and 29 for the number of cases and death at :math:`t = 0` respectively. The following code block demonstrates how we would do that; feel free to try it out yourself to see the much improved result. + +.. ipython:: + :verbatim: + + In [1]: thetaIV = theta.tolist() + x0 + + In [2]: thetaIV[3] -= 1e-8 # to make sure that the initial guess satisfy the constraints + + In [3]: boxBoundsIV = boxBounds + [(0.,1.), (0.,1.), (0.,1.), (0.,1.)] + + In [4]: objLegrand = SquareLoss(theta, ode, x0, -1, t, y, ['I','R'], numpy.sqrt([population]*2)) + + In [5]: resDEIV = scipy.optimize.differential_evolution(objLegrand.costIV, bounds=boxBoundsIV, polish=False, seed=20921391) + + In [6]: print(resDEIV) + + In [7]: f = plt.figure() + + In [8]: objLegrand.plot() + + In [9]: plt.close() + + +Legrand Ebola SEIHFR Model +========================== + +Next, we demonstrate the estimation on a model that is widely used in the recent Ebola outbreak in west Africa. Again, the model has been defined in :mod:`.common_models` already. + +.. ipython:: + + In [1]: ode = common_models.Legrand_Ebola_SEIHFR() + + In [27]: # initial guess from the paper that studied the outbreak in Congo + + In [28]: theta = numpy.array([0.588,0.794,7.653, ### the beta + ....: 10.0,9.6,5.0,2.0, ### the omega + ....: 7.0,0.81,0.80, ### alpha, delta, theta + ....: 100.,1.0]) ### kappa,intervention time + + In [29]: # initial conditions, note that we have a 0.0 at the end because the model is a non-automonous ode which we have converted the time component out + + In [30]: x0 = numpy.array([population, 0.0, 49.0, 0.0, 0.0, 29.0, 0.0])/population + + In [30]: ode.parameters = theta + + In [31]: ode.initial_values = (x0, t[0]) + + In [32]: objLegrand = SquareLoss(theta, ode, x0, t[0], t[1::], y[1::,:], ['I','R'], numpy.sqrt([population]*2)) + +Now, it is important to set additional constraints accurately because a simply box constraint is much larger than the feasible set. Namely, :math:`\omega_{I}, \omega_{D}` are the time taken from onset until end of infectious/death, which has to be bigger than :math:`\omega_{H}`, onset to hospitalization given the nature of the disease. Therefore, we create extra inequality constraints in addition to the box constraints + +.. ipython:: + + In [549]: boxBounds = [ + .....: (0.001, 100.), # \beta_I + .....: (0.001, 100.), # \beta_H + .....: (0.001, 100.), # \beta_F + .....: (0.001, 100.), # \omega_I + .....: (0.001, 100.), # \omega_D + .....: (0.001, 100.), # \omega_H + .....: (0.001, 100.), # \omega_F + .....: (0.001, 100.), # \alpha^{-1} + .....: (0.0001, 1.), # \delta + .....: (0.0001, 1.), # \theta + .....: (0.001, 1000.), # \kappa + .....: (0.,218.) # intervention tine + .....: ] + + In [550]: cons = ({'type': 'ineq', 'fun' : lambda x: numpy.array([x[3]-x[5], x[4]-x[5]])}) + +We can now try to find the optimal values, but because this is a difficult problem that can take a very long time without guarantee on the quality of solution + +.. ipython:: + :okexcept: + :okwarning: + + In [213]: res = scipy.optimize.minimize(fun=objLegrand.cost, + .....: jac=objLegrand.sensitivity, + .....: x0=theta, + .....: constraints=cons, + .....: bounds=boxBounds, + .....: method='SLSQP') + + In [214]: print(res) + + In [215]: f = plt.figure() + + @savefig ebola_legrand_runtime.png + In [216]: objLegrand.plot() + + In [217]: plt.close() + +Evidently, the estimated parameters are very much unrealistic given that a lot of them are near the boundaries. It is also known from other sources that some of the epidemiology properties of Ebola, with incubation period of around 2 weeks and a mortality rate of around 80 percent. + +As the estimate does not appear to provide anything sensible, we also provide a set of values previously obtained (that looks semi-reasonable) here plot the epidemic curve with the observations layered on top + +.. ipython:: + :okexcept: + :okwarning: + + In [1]: theta = numpy.array([3.96915071e-02, 1.72302620e+01, 1.99749990e+01, + ...: 2.67759445e+01, 4.99999990e+01, 5.56122691e+00, + ...: 4.99999990e+01, 8.51599523e+00, 9.99999000e-01, + ...: 1.00000000e-06, 3.85807562e+00, 1.88385318e+00]) + + In [2]: print(objLegrand.cost(theta)) + + In [2]: solution = ode.integrate(t[1::]) + + In [3]: f, axarr = plt.subplots(2,3) + + In [4]: axarr[0,0].plot(t, solution[:,0]); + + In [5]: axarr[0,0].set_title('Susceptible'); + + In [6]: axarr[0,1].plot(t, solution[:,1]); + + In [7]: axarr[0,1].set_title('Exposed'); + + In [8]: axarr[0,2].plot(t, solution[:,2]); + + In [9]: axarr[0,2].plot(t, y[:,0], 'r'); + + In [10]: axarr[0,2].set_title('Infectious'); + + In [11]: axarr[1,0].plot(t, solution[:,3]); + + In [12]: axarr[1,0].set_title('Hospitalised'); + + In [13]: axarr[1,1].plot(t, solution[:,4]); + + In [14]: axarr[1,1].set_title('Awaiting Burial'); + + In [15]: axarr[1,2].plot(t, solution[:,5]); + + In [16]: axarr[1,2].plot(t, y[:,1], 'r'); + + In [17]: axarr[1,2].set_title('Removed'); + + In [18]: f.text(0.5, 0.04, 'Days from outbreak', ha='center'); + + In [19]: f.text(0.01, 0.5, 'Population', va='center', rotation='vertical'); + + In [20]: f.tight_layout(); + + @savefig ebola_seihfr_straight_prior.png + In [21]: plt.show() + + In [22]: plt.close() + + diff --git a/doc/source/faq.rst b/doc/doc_to_sort/faq.rst similarity index 98% rename from doc/source/faq.rst rename to doc/doc_to_sort/faq.rst index f14c71e4..a57c2675 100644 --- a/doc/source/faq.rst +++ b/doc/doc_to_sort/faq.rst @@ -1,60 +1,60 @@ -.. _faq: - -************************ -Frequent asked questions -************************ - -Code runs slowly -================ - -This is because the package is not optimized for speed. Although the some of the main functions are lambdified using :mod:`sympy` or compiled against :mod:`cython` when available, there are many more optimization that can be done. One example is the lines: - -.. python: - - J = self.Jacobian(state,t) - G = self.Grad(state,t) - A = numpy.dot(J,S) + G - -in :func:`.DeterministicOde.evalSensitivity`. The first two operations can be inlined into the third and the third line itself can be rewritten as: - -.. python: - - G += numpy.dot(J,S) - -and save the explicit copy operation by :mod:`numpy` when making A. If desired, we could have also made used of the :mod:`numexpr` package that provides further speed up on elementwise operations in place of numpy. - -Why not compile the numeric computation form sympy against Theano -================================================================= - -Setup of the package has been simplified as much as possible. If you look closely enough, you will realize that the current code generation only uses :mod:`cython` and not :mod:`f2py`. This is because we are not prepared to do all the system checks, i.e. does a fortran compiler exist, is gcc installed, was python built as a shared library etc. We are very much aware of the benefit, especially considering the possibility of GPU computation in :mod:`theano`. - -Why not use mpmath library throughout? -====================================== - -This is because we have a fair number of operations that depends on :mod:`scipy`. Obviously, we can solve ode using :mod:`mpmath` and do standard linear algebra. Unfortunately, optimization and statistics packages and routine are mostly based on :mod:`numpy`. - -Computing the gradient using :class:`.SquareLoss` is slow -========================================================= - -It will always be slow on the first operation. This is due to the design where the initialization of the class is fast and only find derivative information/compile function during runtime. After the first calculation, things should be significantly faster. - -**Why some of my code is not a fortran object?** - -When we detec either a :math:`\exp` or a :math:`\log` in the equations, we automatically force the compile to use mpmath to ensure that we obtain the highest precision. To turn this on/off will be considered as a feature in the future. - -Can you not convert a non-autonumous system to an autonomous system for me automatically -======================================================================================== - -Although we can do that, it is not, and will not be implemented. This is to ensure that the end user such as yourself are fully aware of the equations being defined. - -Getting the sensitivities from :class:`.SquareLoss` did not get a speed up when I used a restricted set of parameters -===================================================================================================================== - -This is because we currently evaluate the full set of sensitivities before extracting them out. Speeding this up for a restrictive set is being considered. A main reason that stopped us from implementing is that we find the symbolic gradient of the ode before compiling it. Which means that one function call to the compiled file will return the full set of sensitivities and we would only be extracting the appropriate elements from the matrix. This only amounts to a small speed up. The best method would be to compile only the necessary elements of the gradient matrix, but this would require much more work both within the code, and later on when variables are being added/deleted as all these compilation are perfromed in runtime. - -Why do not have the option to obtain gradient via complex differencing -====================================================================== - -It is currently not implemented. Feature under consideration. - - +.. _faq: + +************************ +Frequent asked questions +************************ + +Code runs slowly +================ + +This is because the package is not optimized for speed. Although the some of the main functions are lambdified using :mod:`sympy` or compiled against :mod:`cython` when available, there are many more optimization that can be done. One example is the lines: + +.. python: + + J = self.Jacobian(state,t) + G = self.Grad(state,t) + A = numpy.dot(J,S) + G + +in :func:`.DeterministicOde.evalSensitivity`. The first two operations can be inlined into the third and the third line itself can be rewritten as: + +.. python: + + G += numpy.dot(J,S) + +and save the explicit copy operation by :mod:`numpy` when making A. If desired, we could have also made used of the :mod:`numexpr` package that provides further speed up on elementwise operations in place of numpy. + +Why not compile the numeric computation form sympy against Theano +================================================================= + +Setup of the package has been simplified as much as possible. If you look closely enough, you will realize that the current code generation only uses :mod:`cython` and not :mod:`f2py`. This is because we are not prepared to do all the system checks, i.e. does a fortran compiler exist, is gcc installed, was python built as a shared library etc. We are very much aware of the benefit, especially considering the possibility of GPU computation in :mod:`theano`. + +Why not use mpmath library throughout? +====================================== + +This is because we have a fair number of operations that depends on :mod:`scipy`. Obviously, we can solve ode using :mod:`mpmath` and do standard linear algebra. Unfortunately, optimization and statistics packages and routine are mostly based on :mod:`numpy`. + +Computing the gradient using :class:`.SquareLoss` is slow +========================================================= + +It will always be slow on the first operation. This is due to the design where the initialization of the class is fast and only find derivative information/compile function during runtime. After the first calculation, things should be significantly faster. + +**Why some of my code is not a fortran object?** + +When we detec either a :math:`\exp` or a :math:`\log` in the equations, we automatically force the compile to use mpmath to ensure that we obtain the highest precision. To turn this on/off will be considered as a feature in the future. + +Can you not convert a non-autonumous system to an autonomous system for me automatically +======================================================================================== + +Although we can do that, it is not, and will not be implemented. This is to ensure that the end user such as yourself are fully aware of the equations being defined. + +Getting the sensitivities from :class:`.SquareLoss` did not get a speed up when I used a restricted set of parameters +===================================================================================================================== + +This is because we currently evaluate the full set of sensitivities before extracting them out. Speeding this up for a restrictive set is being considered. A main reason that stopped us from implementing is that we find the symbolic gradient of the ode before compiling it. Which means that one function call to the compiled file will return the full set of sensitivities and we would only be extracting the appropriate elements from the matrix. This only amounts to a small speed up. The best method would be to compile only the necessary elements of the gradient matrix, but this would require much more work both within the code, and later on when variables are being added/deleted as all these compilation are perfromed in runtime. + +Why do not have the option to obtain gradient via complex differencing +====================================================================== + +It is currently not implemented. Feature under consideration. + + diff --git a/doc/source/fh.rst b/doc/doc_to_sort/fh.rst similarity index 100% rename from doc/source/fh.rst rename to doc/doc_to_sort/fh.rst diff --git a/doc/source/gradient.rst b/doc/doc_to_sort/gradient.rst similarity index 100% rename from doc/source/gradient.rst rename to doc/doc_to_sort/gradient.rst diff --git a/doc/source/initialGuess.rst b/doc/doc_to_sort/initialGuess.rst similarity index 100% rename from doc/source/initialGuess.rst rename to doc/doc_to_sort/initialGuess.rst diff --git a/doc/source/mod/common_models.rst b/doc/doc_to_sort/mod/common_models.rst similarity index 100% rename from doc/source/mod/common_models.rst rename to doc/doc_to_sort/mod/common_models.rst diff --git a/doc/source/mod/confidence_interval.rst b/doc/doc_to_sort/mod/confidence_interval.rst similarity index 100% rename from doc/source/mod/confidence_interval.rst rename to doc/doc_to_sort/mod/confidence_interval.rst diff --git a/doc/source/mod/deterministic.rst b/doc/doc_to_sort/mod/deterministic.rst similarity index 100% rename from doc/source/mod/deterministic.rst rename to doc/doc_to_sort/mod/deterministic.rst diff --git a/doc/source/mod/epi_analysis.rst b/doc/doc_to_sort/mod/epi_analysis.rst similarity index 100% rename from doc/source/mod/epi_analysis.rst rename to doc/doc_to_sort/mod/epi_analysis.rst diff --git a/doc/source/mod/get_init.rst b/doc/doc_to_sort/mod/get_init.rst similarity index 100% rename from doc/source/mod/get_init.rst rename to doc/doc_to_sort/mod/get_init.rst diff --git a/doc/source/mod/index.rst b/doc/doc_to_sort/mod/index.rst similarity index 100% rename from doc/source/mod/index.rst rename to doc/doc_to_sort/mod/index.rst diff --git a/doc/source/mod/losstype.rst b/doc/doc_to_sort/mod/losstype.rst similarity index 100% rename from doc/source/mod/losstype.rst rename to doc/doc_to_sort/mod/losstype.rst diff --git a/doc/source/mod/odeloss.rst b/doc/doc_to_sort/mod/odeloss.rst similarity index 100% rename from doc/source/mod/odeloss.rst rename to doc/doc_to_sort/mod/odeloss.rst diff --git a/doc/source/mod/odeutils.rst b/doc/doc_to_sort/mod/odeutils.rst similarity index 100% rename from doc/source/mod/odeutils.rst rename to doc/doc_to_sort/mod/odeutils.rst diff --git a/doc/source/mod/simulate.rst b/doc/doc_to_sort/mod/simulate.rst similarity index 100% rename from doc/source/mod/simulate.rst rename to doc/doc_to_sort/mod/simulate.rst diff --git a/doc/source/mod/transition.rst b/doc/doc_to_sort/mod/transition.rst similarity index 100% rename from doc/source/mod/transition.rst rename to doc/doc_to_sort/mod/transition.rst diff --git a/doc/source/profile.rst b/doc/doc_to_sort/profile.rst similarity index 100% rename from doc/source/profile.rst rename to doc/doc_to_sort/profile.rst diff --git a/doc/source/ref.rst b/doc/doc_to_sort/ref.rst similarity index 100% rename from doc/source/ref.rst rename to doc/doc_to_sort/ref.rst diff --git a/doc/source/stochastic.rst b/doc/doc_to_sort/stochastic.rst similarity index 100% rename from doc/source/stochastic.rst rename to doc/doc_to_sort/stochastic.rst diff --git a/doc/source/transition.rst b/doc/doc_to_sort/transition.rst similarity index 100% rename from doc/source/transition.rst rename to doc/doc_to_sort/transition.rst diff --git a/doc/source/unroll/unrollBD.rst b/doc/doc_to_sort/unroll/unrollBD.rst similarity index 100% rename from doc/source/unroll/unrollBD.rst rename to doc/doc_to_sort/unroll/unrollBD.rst diff --git a/doc/source/unroll/unrollHard.rst b/doc/doc_to_sort/unroll/unrollHard.rst similarity index 100% rename from doc/source/unroll/unrollHard.rst rename to doc/doc_to_sort/unroll/unrollHard.rst diff --git a/doc/source/unroll/unrollSimple.rst b/doc/doc_to_sort/unroll/unrollSimple.rst similarity index 100% rename from doc/source/unroll/unrollSimple.rst rename to doc/doc_to_sort/unroll/unrollSimple.rst diff --git a/doc/source/unrollOde.rst b/doc/doc_to_sort/unrollOde.rst similarity index 100% rename from doc/source/unrollOde.rst rename to doc/doc_to_sort/unrollOde.rst From 272a31f63ff4839edd574d38a4f7291f34bc695c Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:09:06 +0000 Subject: [PATCH 034/188] Ammended intro text --- doc/source/index.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index e9560e51..e4625e13 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -2,11 +2,16 @@ Welcome to the documentation of pygom ##################################### -pygom is a package that aims to facilitate the application of ordinary differential equations (ODEs) in the real world, with a focus in epidemiology. This package helps the end user define their ODE system in an intuitive manner and provides convenience functions - making use of various algebraic and numerical libraries in the backend - that can be used in a straight forward fashion. +PyGOM (Python Generic ODE Model) is a Python package that aims to facilitate the application of ordinary differential equations (ODEs) in the real world, +with a focus in epidemiology. +This package helps the user define their ODE system in an intuitive manner and provides convenience functions - +making use of various algebraic and numerical libraries in the backend - that can be used in a straight forward fashion. This is an open source project hosted on `Github `_. -Insert intro text +A manuscript containing a shortened motivation and use is hosted on `arxXiv `_. + +# // TODO Insert intro text ################## User Documentation From b7b0324519b356827afa902422eff89176670299 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:15:49 +0000 Subject: [PATCH 035/188] ammend instructions to check documentation build, ignore tests --- .travis.yml | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45ba3248..30f7704c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,10 @@ # specify the language and which version language: python + +branches: + only: + - install-fix-docs + python: - 3.5 - 3.6 @@ -8,29 +13,13 @@ python: before_install: - pip install -U pip - - pip install codecov install: - pip install -r requirements.txt - python setup.py build - python setup.py install + - pip install doc/requirements.txt # Runs test with coverage script: - - coverage run setup.py test - -# Push the result to -after_success: - - codecov - -# deploy to PyPI -deploy: - provider: pypi - twine_version: 1.13.0 - skip_existing: true - user: twomagpi - password: - secure: S+o0vhiAGM3qto2tQ8xoozMY3JuhDTlynzjMK2AyRMrWWI0Jvbp9u6TebD3zT3TNh/341t6JLY7VPj8KOam/7LzmpI56ouSyTKKHH7Uk2L2ZuJ4dPm4mS0htO26YBYUtjBpyc55VOmVxqUMXo3iym0jQ+uukrWrr+fY3wTTl1rn+RU5wdoQ+1Z9hi+txo2i24tGi9RCzRr5yCX88Q++MFtlNs2/Q4AtR9oQHY5muiPtlbxd1/JtmK43doxsUc+v0A+RJFpDMmURsUt+zoUeSm8Xz65EP9vjGL03YCn+SUp/2Iidfk3GLaBIDvNxKk6XB9njm6V+bXPpzgsM5fzFJ3XtXp3hoIcMlwoa03Hn3fGUw/W/KKsvJaPBDnjZ9qK2gHBNQuz5jbK/ijNuSuZWQvInGhA5Tt/6DOJwX/Q2d0H4hENwZKs5MnY+RXm6VDRJYnImyQLCW1HsxJa/q/2hTpOvlDHCWJNwWB59BTVOxRsW1gKVgiaF5K9hWd5x1DJvnxG15wNey/STOx+8bpaX7DPfZmqqGqbDNnCTKr2+X3EfTqglOWWM20fB9BY62GuvXPNS3/60aKXZfn7z7eI19b+0KMx2wHlnsP7oQmAQS4XK2wMOs3pD8iQzd/4jIVLa+k3YSYfhb0mKxJBkQtd+1s2GtoaHWnNRlpCUlwv1OU38= - on: - tags: true - python: 3.7 \ No newline at end of file + - cd doc; make html linkcheck \ No newline at end of file From fef6f1295d8f01ab762c2b6c37ef6b7320bd9d7f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:26:44 +0000 Subject: [PATCH 036/188] CI for documentation build, removed tests - this branch only --- .github/workflows/main.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a59d3801..e0f26a73 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,15 +1,11 @@ -name: pygom +name: pygom-docbuild -on: +on: push: branches: - - master - - dev - - feature/* - - bugfix/* - pull_request: - branches: - - master + only: + - install-fix-docs + jobs: build: @@ -72,15 +68,19 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt + pip install -r doc/requirements.txt - name: Build and install package for c files run: | python setup.py build python setup.py install + - name: Fix matplotlib backend for MacOS if: startsWith(runner.os, 'macOS') run: | mkdir ~/.matplotlib echo "backend: TkAgg" >> ~/.matplotlib/matplotlibrc - - name: Test and coverage - run: python setup.py test + - name: Build documentation + run: | + cd doc + make html linkcheck \ No newline at end of file From 524afd42c36a8f76d05cededc0a459864686c8af Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:29:09 +0000 Subject: [PATCH 037/188] remove branch command --- .github/workflows/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e0f26a73..84645955 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,8 +3,7 @@ name: pygom-docbuild on: push: branches: - only: - - install-fix-docs + - install-fix-docs jobs: From f2db3e6d0cfb103bc5b0c2241cb2bdf5b9ab99ef Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:34:41 +0000 Subject: [PATCH 038/188] update python versions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 84645955..a7f8ab80 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.5, 3.6, 3.7, 3.8] + python-version: [3.6, 3.7, 3.8, 3.9, 3.10] steps: - uses: actions/checkout@v2 From b7cd1d4236f3ec79b9a7db757f33ac7fb36c311c Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:35:38 +0000 Subject: [PATCH 039/188] update python versions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a7f8ab80..a1a9357a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.6, 3.7, 3.8, 3.9, 3.10] + python-version: [3.6, 3.7, 3.8, 3.9] steps: - uses: actions/checkout@v2 From 4e0021cc4f9d1216a6dc3773cc2ee71ab78b1cef Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 2 Feb 2023 13:41:45 +0000 Subject: [PATCH 040/188] update python versions --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a1a9357a..ead1bdbb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v2 From 135f5e9e45b86a25fa18914e92e3aeda8533a161 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 08:30:39 +0000 Subject: [PATCH 041/188] only test documentation build on windows - remove mac and linux --- .github/workflows/main.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ead1bdbb..b9937c92 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -15,22 +15,7 @@ jobs: python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v1 - if: startsWith(runner.os, 'Linux') - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - - uses: actions/cache@v1 - if: startsWith(runner.os, 'macOS') - with: - path: ~/Library/Caches/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} - restore-keys: | - ${{ runner.os }}-pip- - uses: actions/cache@v1 if: startsWith(runner.os, 'Windows') with: From c354bf762196304f11d78669913a89ccd88355a9 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 08:33:32 +0000 Subject: [PATCH 042/188] only test documentation build on windows - remove mac and linux from os specification --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b9937c92..de870eae 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,7 +11,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [windows-latest] python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: From 0ab7744a74992a5d1bcd560726a8fa0c5844f90a Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 08:40:33 +0000 Subject: [PATCH 043/188] pull updates to github action workflow from dev --- .github/workflows/main.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index de870eae..467fe698 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,10 +1,15 @@ -name: pygom-docbuild +name: pygom -on: +on: push: branches: - install-fix-docs + pull_request: + branches: + - install-fix-docs +env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true jobs: build: @@ -14,8 +19,7 @@ jobs: os: [windows-latest] python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] - steps: - + steps: - uses: actions/cache@v1 if: startsWith(runner.os, 'Windows') with: @@ -52,19 +56,15 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt - pip install -r doc/requirements.txt - name: Build and install package for c files run: | python setup.py build python setup.py install - - name: Fix matplotlib backend for MacOS if: startsWith(runner.os, 'macOS') run: | mkdir ~/.matplotlib echo "backend: TkAgg" >> ~/.matplotlib/matplotlibrc - - name: Build documentation - run: | - cd doc - make html linkcheck \ No newline at end of file + - name: Test and coverage + run: python setup.py test From 286699833df31d9b02a26f5e1275d6816a870fae Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 08:50:42 +0000 Subject: [PATCH 044/188] remove model tests, point to requirements files --- .github/workflows/main.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 467fe698..a17c93e1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: pygom +name: Test-docs on: push: @@ -17,7 +17,7 @@ jobs: strategy: matrix: os: [windows-latest] - python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.7"]#, "3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/cache@v1 @@ -55,16 +55,15 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt + pip install -r '**/requirements.txt' - name: Build and install package for c files run: | python setup.py build python setup.py install - - name: Fix matplotlib backend for MacOS - if: startsWith(runner.os, 'macOS') + + - name: Test documentation run: | - mkdir ~/.matplotlib - echo "backend: TkAgg" >> ~/.matplotlib/matplotlibrc - - name: Test and coverage - run: python setup.py test + pip install doc/requirements.txt + make html + From 019f4c7d81ad53505fff87b8e739362342dec3a0 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 10:27:31 +0000 Subject: [PATCH 045/188] check working directory for github action --- .github/workflows/main.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a17c93e1..6a212056 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,10 +52,13 @@ jobs: Get-Command rc.exe | Format-Table -AutoSize echo "::add-path::$(Get-Command rc.exe | Split-Path)" + - name: check working directory + run: pwd + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r '**/requirements.txt' + pip install -r home/requirements.txt - name: Build and install package for c files run: | @@ -64,6 +67,6 @@ jobs: - name: Test documentation run: | - pip install doc/requirements.txt + pip install -r home/doc/requirements.txt make html From f89a334b9f0758887ea55f41953218fc43ed7b70 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 10:30:10 +0000 Subject: [PATCH 046/188] correct path --- .github/workflows/main.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6a212056..532a5679 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -53,12 +53,14 @@ jobs: echo "::add-path::$(Get-Command rc.exe | Split-Path)" - name: check working directory - run: pwd - + run: | + pwd + ls + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r home/requirements.txt + pip install -r requirements.txt - name: Build and install package for c files run: | From 5ffd91ccc2b5879117e65fd628657f807cc9db99 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 10:33:23 +0000 Subject: [PATCH 047/188] correct requirements paths --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 532a5679..e246d1e8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,4 +1,4 @@ -name: Test-docs +name: test-docs on: push: @@ -55,12 +55,12 @@ jobs: - name: check working directory run: | pwd - ls + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install -r requirements.txt + pip install -r ../requirements.txt - name: Build and install package for c files run: | @@ -69,6 +69,6 @@ jobs: - name: Test documentation run: | - pip install -r home/doc/requirements.txt + pip install -r ../doc/requirements.txt make html From 968220221ccaa21f220721dcab77341d000e0bd2 Mon Sep 17 00:00:00 2001 From: Hannah Williams Date: Fri, 3 Feb 2023 10:42:09 +0000 Subject: [PATCH 048/188] trying to locate requirements file --- .github/workflows/main.yml | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e246d1e8..aed6f525 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -55,20 +55,21 @@ jobs: - name: check working directory run: | pwd + find '**requirements.txt' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r ../requirements.txt - - - name: Build and install package for c files - run: | - python setup.py build - python setup.py install +# - name: Install dependencies +# run: | +# python -m pip install --upgrade pip +# pip install -r ../requirements.txt +# +# - name: Build and install package for c files +# run: | +# python setup.py build +# python setup.py install - - name: Test documentation - run: | - pip install -r ../doc/requirements.txt - make html +# - name: Test documentation +# run: | +# pip install -r ../doc/requirements.txt +# make html From 1dbacf9faaa2ab5f225296be76be5cc405b1ec63 Mon Sep 17 00:00:00 2001 From: Hannah Williams Date: Fri, 3 Feb 2023 10:50:53 +0000 Subject: [PATCH 049/188] add list files command --- .github/workflows/main.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index aed6f525..fd4423d8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,6 +20,8 @@ jobs: python-version: ["3.7"]#, "3.8", "3.9", "3.10", "3.11"] steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v1 if: startsWith(runner.os, 'Windows') with: @@ -55,7 +57,9 @@ jobs: - name: check working directory run: | pwd - find '**requirements.txt' + + - name: list files + run: ls # - name: Install dependencies From 46c07904a3f0be8e6903e92309e6378121589845 Mon Sep 17 00:00:00 2001 From: Hannah Williams Date: Fri, 3 Feb 2023 10:53:33 +0000 Subject: [PATCH 050/188] reinclude install dependencies --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fd4423d8..739e34f4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -62,10 +62,10 @@ jobs: run: ls -# - name: Install dependencies -# run: | -# python -m pip install --upgrade pip -# pip install -r ../requirements.txt + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt # # - name: Build and install package for c files # run: | From b2877255714cb1fcd1930c018744241f6a7a40d8 Mon Sep 17 00:00:00 2001 From: Hannah Williams Date: Fri, 3 Feb 2023 10:58:18 +0000 Subject: [PATCH 051/188] reinclude documentation requirements and build --- .github/workflows/main.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 739e34f4..e0b119be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -66,14 +66,14 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt -# -# - name: Build and install package for c files -# run: | -# python setup.py build -# python setup.py install + + - name: Build and install package for c files + run: | + python setup.py build + python setup.py install -# - name: Test documentation -# run: | -# pip install -r ../doc/requirements.txt -# make html + - name: Test documentation + run: | + pip install -r doc/requirements.txt + make html From c7b8f05ae6b343fae8619d41a733e7eca9ffee5b Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 11:32:43 +0000 Subject: [PATCH 052/188] include make in environment install --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e0b119be..db4e1f69 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -74,6 +74,7 @@ jobs: - name: Test documentation run: | + conda install make pip install -r doc/requirements.txt make html From 02bf205e3f62ba3713156a60dbcac349fb19884f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 11:49:10 +0000 Subject: [PATCH 053/188] include make in requirements --- .github/workflows/main.yml | 1 - requirements.txt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index db4e1f69..e0b119be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -74,7 +74,6 @@ jobs: - name: Test documentation run: | - conda install make pip install -r doc/requirements.txt make html diff --git a/requirements.txt b/requirements.txt index c4928941..e71335bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,3 +10,4 @@ numpydoc>=0.6.0 sphinx>=1.4.1 sphinx_rtd_theme>=0.2.0 cython>=0.29 +make From d67229a48979a8ab08164344bbc75d5cd8c792e6 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 12:22:29 +0000 Subject: [PATCH 054/188] fix environment to use make --- .github/workflows/main.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e0b119be..109cd7be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,6 +21,8 @@ jobs: steps: - uses: actions/checkout@v2 + with: + fetch-depth: 1 - uses: actions/cache@v1 if: startsWith(runner.os, 'Windows') @@ -53,14 +55,6 @@ jobs: Invoke-VSDevEnvironment Get-Command rc.exe | Format-Table -AutoSize echo "::add-path::$(Get-Command rc.exe | Split-Path)" - - - name: check working directory - run: | - pwd - - - name: list files - run: ls - - name: Install dependencies run: | @@ -72,8 +66,11 @@ jobs: python setup.py build python setup.py install - - name: Test documentation + - name: Install documentation dependencies run: | pip install -r doc/requirements.txt + + - name: make html documentation + run: | make html From 6717c9db363dd306ab09fec81cbd89f7f2cc9aa7 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 12:38:44 +0000 Subject: [PATCH 055/188] trying to fix make html --- .github/workflows/main.yml | 2 ++ requirements.txt | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 109cd7be..6f207416 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -69,8 +69,10 @@ jobs: - name: Install documentation dependencies run: | pip install -r doc/requirements.txt + pip install make - name: make html documentation run: | + make clean make html diff --git a/requirements.txt b/requirements.txt index e71335bd..81cb7e2d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,5 +9,4 @@ sympy>=1.0.0 numpydoc>=0.6.0 sphinx>=1.4.1 sphinx_rtd_theme>=0.2.0 -cython>=0.29 -make +cython>=0.29 \ No newline at end of file From 7b9034f888152e8f18da3b45877cde7cc37a485b Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Feb 2023 12:48:44 +0000 Subject: [PATCH 056/188] navigate to doc location --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6f207416..fb240d57 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -73,6 +73,7 @@ jobs: - name: make html documentation run: | + cd doc make clean make html From 06b51ca1d6dc842d91b247a4ccb0d23f9e7af51a Mon Sep 17 00:00:00 2001 From: HWilliams-PHE <36919240+HWilliams-PHE@users.noreply.github.com> Date: Thu, 16 Feb 2023 14:36:33 +0000 Subject: [PATCH 057/188] Comment out graphviz hack to check if CI will run --- doc/source/conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/conf.py b/doc/source/conf.py index aedce28d..dc804650 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -13,8 +13,8 @@ import warnings #slight hack for graphvis on windows to ensure conda path is correct -if sys.platform == 'win32': - os.environ['PATH'] += os.pathsep + os.environ['CONDA_PREFIX'] + r'\Library\bin\graphviz' +#if sys.platform == 'win32': +# os.environ['PATH'] += os.pathsep + os.environ['CONDA_PREFIX'] + r'\Library\bin\graphviz' import sphinx if sphinx.__version__ < '1.4.1': From 90603f8a64f2863ad16d114cdd1ca3d65b713d46 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 3 Mar 2023 15:58:34 +0000 Subject: [PATCH 058/188] add nbsphinx to requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 81cb7e2d..36e653d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,5 @@ sympy>=1.0.0 numpydoc>=0.6.0 sphinx>=1.4.1 sphinx_rtd_theme>=0.2.0 -cython>=0.29 \ No newline at end of file +cython>=0.29 +nbsphinx \ No newline at end of file From 69f51e3ecb04a1ce5cc9d748151b6c55d42a80da Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 1 Jun 2023 12:34:54 +0100 Subject: [PATCH 059/188] restart building jupyter book --- doc/doc/pygom-doc/_config.yml | 32 +++++++ doc/doc/pygom-doc/_toc.yml | 9 ++ doc/doc/pygom-doc/intro.md | 11 +++ doc/doc/pygom-doc/logo.png | Bin 0 -> 9854 bytes doc/doc/pygom-doc/markdown-notebooks.md | 53 ++++++++++ doc/doc/pygom-doc/markdown.md | 55 +++++++++++ doc/doc/pygom-doc/notebooks.ipynb | 122 ++++++++++++++++++++++++ doc/doc/pygom-doc/references.bib | 56 +++++++++++ doc/doc/pygom-doc/requirements.txt | 3 + 9 files changed, 341 insertions(+) create mode 100644 doc/doc/pygom-doc/_config.yml create mode 100644 doc/doc/pygom-doc/_toc.yml create mode 100644 doc/doc/pygom-doc/intro.md create mode 100644 doc/doc/pygom-doc/logo.png create mode 100644 doc/doc/pygom-doc/markdown-notebooks.md create mode 100644 doc/doc/pygom-doc/markdown.md create mode 100644 doc/doc/pygom-doc/notebooks.ipynb create mode 100644 doc/doc/pygom-doc/references.bib create mode 100644 doc/doc/pygom-doc/requirements.txt diff --git a/doc/doc/pygom-doc/_config.yml b/doc/doc/pygom-doc/_config.yml new file mode 100644 index 00000000..5f534f80 --- /dev/null +++ b/doc/doc/pygom-doc/_config.yml @@ -0,0 +1,32 @@ +# Book settings +# Learn more at https://jupyterbook.org/customize/config.html + +title: My sample book +author: The Jupyter Book Community +logo: logo.png + +# Force re-execution of notebooks on each build. +# See https://jupyterbook.org/content/execute.html +execute: + execute_notebooks: force + +# Define the name of the latex output file for PDF builds +latex: + latex_documents: + targetname: book.tex + +# Add a bibtex file so that we can create citations +bibtex_bibfiles: + - references.bib + +# Information about where the book exists on the web +repository: + url: https://github.com/executablebooks/jupyter-book # Online location of your book + path_to_book: docs # Optional path to your book, relative to the repository root + branch: master # Which branch of the repository should be used when creating links (optional) + +# Add GitHub buttons to your book +# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository +html: + use_issues_button: true + use_repository_button: true diff --git a/doc/doc/pygom-doc/_toc.yml b/doc/doc/pygom-doc/_toc.yml new file mode 100644 index 00000000..74d5c710 --- /dev/null +++ b/doc/doc/pygom-doc/_toc.yml @@ -0,0 +1,9 @@ +# Table of contents +# Learn more at https://jupyterbook.org/customize/toc.html + +format: jb-book +root: intro +chapters: +- file: markdown +- file: notebooks +- file: markdown-notebooks diff --git a/doc/doc/pygom-doc/intro.md b/doc/doc/pygom-doc/intro.md new file mode 100644 index 00000000..f8cdc73c --- /dev/null +++ b/doc/doc/pygom-doc/intro.md @@ -0,0 +1,11 @@ +# Welcome to your Jupyter Book + +This is a small sample book to give you a feel for how book content is +structured. +It shows off a few of the major file types, as well as some sample content. +It does not go in-depth into any particular topic - check out [the Jupyter Book documentation](https://jupyterbook.org) for more information. + +Check out the content pages bundled with this sample book to see more. + +```{tableofcontents} +``` diff --git a/doc/doc/pygom-doc/logo.png b/doc/doc/pygom-doc/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..06d56f40c838b64eb048a63e036125964a069a3a GIT binary patch literal 9854 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 L>8MsHTOs~GC;Fmw literal 0 HcmV?d00001 diff --git a/doc/doc/pygom-doc/markdown-notebooks.md b/doc/doc/pygom-doc/markdown-notebooks.md new file mode 100644 index 00000000..a057a320 --- /dev/null +++ b/doc/doc/pygom-doc/markdown-notebooks.md @@ -0,0 +1,53 @@ +--- +jupytext: + formats: md:myst + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.11.5 +kernelspec: + display_name: Python 3 + language: python + name: python3 +--- + +# Notebooks with MyST Markdown + +Jupyter Book also lets you write text-based notebooks using MyST Markdown. +See [the Notebooks with MyST Markdown documentation](https://jupyterbook.org/file-types/myst-notebooks.html) for more detailed instructions. +This page shows off a notebook written in MyST Markdown. + +## An example cell + +With MyST Markdown, you can define code cells with a directive like so: + +```{code-cell} +print(2 + 2) +``` + +When your book is built, the contents of any `{code-cell}` blocks will be +executed with your default Jupyter kernel, and their outputs will be displayed +in-line with the rest of your content. + +```{seealso} +Jupyter Book uses [Jupytext](https://jupytext.readthedocs.io/en/latest/) to convert text-based files to notebooks, and can support [many other text-based notebook files](https://jupyterbook.org/file-types/jupytext.html). +``` + +## Create a notebook with MyST Markdown + +MyST Markdown notebooks are defined by two things: + +1. YAML metadata that is needed to understand if / how it should convert text files to notebooks (including information about the kernel needed). + See the YAML at the top of this page for example. +2. The presence of `{code-cell}` directives, which will be executed with your book. + +That's all that is needed to get started! + +## Quickly add YAML metadata for MyST Notebooks + +If you have a markdown file and you'd like to quickly add YAML metadata to it, so that Jupyter Book will treat it as a MyST Markdown Notebook, run the following command: + +``` +jupyter-book myst init path/to/markdownfile.md +``` diff --git a/doc/doc/pygom-doc/markdown.md b/doc/doc/pygom-doc/markdown.md new file mode 100644 index 00000000..0ddaab3f --- /dev/null +++ b/doc/doc/pygom-doc/markdown.md @@ -0,0 +1,55 @@ +# Markdown Files + +Whether you write your book's content in Jupyter Notebooks (`.ipynb`) or +in regular markdown files (`.md`), you'll write in the same flavor of markdown +called **MyST Markdown**. +This is a simple file to help you get started and show off some syntax. + +## What is MyST? + +MyST stands for "Markedly Structured Text". It +is a slight variation on a flavor of markdown called "CommonMark" markdown, +with small syntax extensions to allow you to write **roles** and **directives** +in the Sphinx ecosystem. + +For more about MyST, see [the MyST Markdown Overview](https://jupyterbook.org/content/myst.html). + +## Sample Roles and Directives + +Roles and directives are two of the most powerful tools in Jupyter Book. They +are kind of like functions, but written in a markup language. They both +serve a similar purpose, but **roles are written in one line**, whereas +**directives span many lines**. They both accept different kinds of inputs, +and what they do with those inputs depends on the specific role or directive +that is being called. + +Here is a "note" directive: + +```{note} +Here is a note +``` + +It will be rendered in a special box when you build your book. + +Here is an inline directive to refer to a document: {doc}`markdown-notebooks`. + + +## Citations + +You can also cite references that are stored in a `bibtex` file. For example, +the following syntax: `` {cite}`holdgraf_evidence_2014` `` will render like +this: {cite}`holdgraf_evidence_2014`. + +Moreover, you can insert a bibliography into your page with this syntax: +The `{bibliography}` directive must be used for all the `{cite}` roles to +render properly. +For example, if the references for your book are stored in `references.bib`, +then the bibliography is inserted with: + +```{bibliography} +``` + +## Learn more + +This is just a simple starter to get you started. +You can learn a lot more at [jupyterbook.org](https://jupyterbook.org). diff --git a/doc/doc/pygom-doc/notebooks.ipynb b/doc/doc/pygom-doc/notebooks.ipynb new file mode 100644 index 00000000..fdb7176c --- /dev/null +++ b/doc/doc/pygom-doc/notebooks.ipynb @@ -0,0 +1,122 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Content with notebooks\n", + "\n", + "You can also create content with Jupyter Notebooks. This means that you can include\n", + "code blocks and their outputs in your book.\n", + "\n", + "## Markdown + notebooks\n", + "\n", + "As it is markdown, you can embed images, HTML, etc into your posts!\n", + "\n", + "![](https://myst-parser.readthedocs.io/en/latest/_static/logo-wide.svg)\n", + "\n", + "You can also $add_{math}$ and\n", + "\n", + "$$\n", + "math^{blocks}\n", + "$$\n", + "\n", + "or\n", + "\n", + "$$\n", + "\\begin{aligned}\n", + "\\mbox{mean} la_{tex} \\\\ \\\\\n", + "math blocks\n", + "\\end{aligned}\n", + "$$\n", + "\n", + "But make sure you \\$Escape \\$your \\$dollar signs \\$you want to keep!\n", + "\n", + "## MyST markdown\n", + "\n", + "MyST markdown works in Jupyter Notebooks as well. For more information about MyST markdown, check\n", + "out [the MyST guide in Jupyter Book](https://jupyterbook.org/content/myst.html),\n", + "or see [the MyST markdown documentation](https://myst-parser.readthedocs.io/en/latest/).\n", + "\n", + "## Code blocks and outputs\n", + "\n", + "Jupyter Book will also embed your code blocks and output in your book.\n", + "For example, here's some sample Matplotlib code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import rcParams, cycler\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "plt.ion()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Fixing random state for reproducibility\n", + "np.random.seed(19680801)\n", + "\n", + "N = 10\n", + "data = [np.logspace(0, 1, 100) + np.random.randn(100) + ii for ii in range(N)]\n", + "data = np.array(data).T\n", + "cmap = plt.cm.coolwarm\n", + "rcParams['axes.prop_cycle'] = cycler(color=cmap(np.linspace(0, 1, N)))\n", + "\n", + "\n", + "from matplotlib.lines import Line2D\n", + "custom_lines = [Line2D([0], [0], color=cmap(0.), lw=4),\n", + " Line2D([0], [0], color=cmap(.5), lw=4),\n", + " Line2D([0], [0], color=cmap(1.), lw=4)]\n", + "\n", + "fig, ax = plt.subplots(figsize=(10, 5))\n", + "lines = ax.plot(data)\n", + "ax.legend(custom_lines, ['Cold', 'Medium', 'Hot']);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is a lot more that you can do with outputs (such as including interactive outputs)\n", + "with your book. For more information about this, see [the Jupyter Book documentation](https://jupyterbook.org)" + ] + } + ], + "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" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/doc/doc/pygom-doc/references.bib b/doc/doc/pygom-doc/references.bib new file mode 100644 index 00000000..783ec6aa --- /dev/null +++ b/doc/doc/pygom-doc/references.bib @@ -0,0 +1,56 @@ +--- +--- + +@inproceedings{holdgraf_evidence_2014, + address = {Brisbane, Australia, Australia}, + title = {Evidence for {Predictive} {Coding} in {Human} {Auditory} {Cortex}}, + booktitle = {International {Conference} on {Cognitive} {Neuroscience}}, + publisher = {Frontiers in Neuroscience}, + author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Knight, Robert T.}, + year = {2014} +} + +@article{holdgraf_rapid_2016, + title = {Rapid tuning shifts in human auditory cortex enhance speech intelligibility}, + volume = {7}, + issn = {2041-1723}, + url = {http://www.nature.com/doifinder/10.1038/ncomms13654}, + doi = {10.1038/ncomms13654}, + number = {May}, + journal = {Nature Communications}, + author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Rieger, Jochem W. and Crone, Nathan and Lin, Jack J. and Knight, Robert T. and Theunissen, Frédéric E.}, + year = {2016}, + pages = {13654}, + file = {Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:C\:\\Users\\chold\\Zotero\\storage\\MDQP3JWE\\Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:application/pdf} +} + +@inproceedings{holdgraf_portable_2017, + title = {Portable learning environments for hands-on computational instruction using container-and cloud-based technology to teach data science}, + volume = {Part F1287}, + isbn = {978-1-4503-5272-7}, + doi = {10.1145/3093338.3093370}, + abstract = {© 2017 ACM. There is an increasing interest in learning outside of the traditional classroom setting. This is especially true for topics covering computational tools and data science, as both are challenging to incorporate in the standard curriculum. These atypical learning environments offer new opportunities for teaching, particularly when it comes to combining conceptual knowledge with hands-on experience/expertise with methods and skills. Advances in cloud computing and containerized environments provide an attractive opportunity to improve the effciency and ease with which students can learn. This manuscript details recent advances towards using commonly-Available cloud computing services and advanced cyberinfrastructure support for improving the learning experience in bootcamp-style events. We cover the benets (and challenges) of using a server hosted remotely instead of relying on student laptops, discuss the technology that was used in order to make this possible, and give suggestions for how others could implement and improve upon this model for pedagogy and reproducibility.}, + booktitle = {{ACM} {International} {Conference} {Proceeding} {Series}}, + author = {Holdgraf, Christopher Ramsay and Culich, A. and Rokem, A. and Deniz, F. and Alegro, M. and Ushizima, D.}, + year = {2017}, + keywords = {Teaching, Bootcamps, Cloud computing, Data science, Docker, Pedagogy} +} + +@article{holdgraf_encoding_2017, + title = {Encoding and decoding models in cognitive electrophysiology}, + volume = {11}, + issn = {16625137}, + doi = {10.3389/fnsys.2017.00061}, + abstract = {© 2017 Holdgraf, Rieger, Micheli, Martin, Knight and Theunissen. Cognitive neuroscience has seen rapid growth in the size and complexity of data recorded from the human brain as well as in the computational tools available to analyze this data. This data explosion has resulted in an increased use of multivariate, model-based methods for asking neuroscience questions, allowing scientists to investigate multiple hypotheses with a single dataset, to use complex, time-varying stimuli, and to study the human brain under more naturalistic conditions. These tools come in the form of “Encoding” models, in which stimulus features are used to model brain activity, and “Decoding” models, in which neural features are used to generated a stimulus output. Here we review the current state of encoding and decoding models in cognitive electrophysiology and provide a practical guide toward conducting experiments and analyses in this emerging field. Our examples focus on using linear models in the study of human language and audition. We show how to calculate auditory receptive fields from natural sounds as well as how to decode neural recordings to predict speech. The paper aims to be a useful tutorial to these approaches, and a practical introduction to using machine learning and applied statistics to build models of neural activity. The data analytic approaches we discuss may also be applied to other sensory modalities, motor systems, and cognitive systems, and we cover some examples in these areas. In addition, a collection of Jupyter notebooks is publicly available as a complement to the material covered in this paper, providing code examples and tutorials for predictive modeling in python. The aimis to provide a practical understanding of predictivemodeling of human brain data and to propose best-practices in conducting these analyses.}, + journal = {Frontiers in Systems Neuroscience}, + author = {Holdgraf, Christopher Ramsay and Rieger, J.W. and Micheli, C. and Martin, S. and Knight, R.T. and Theunissen, F.E.}, + year = {2017}, + keywords = {Decoding models, Encoding models, Electrocorticography (ECoG), Electrophysiology/evoked potentials, Machine learning applied to neuroscience, Natural stimuli, Predictive modeling, Tutorials} +} + +@book{ruby, + title = {The Ruby Programming Language}, + author = {Flanagan, David and Matsumoto, Yukihiro}, + year = {2008}, + publisher = {O'Reilly Media} +} diff --git a/doc/doc/pygom-doc/requirements.txt b/doc/doc/pygom-doc/requirements.txt new file mode 100644 index 00000000..7e821e45 --- /dev/null +++ b/doc/doc/pygom-doc/requirements.txt @@ -0,0 +1,3 @@ +jupyter-book +matplotlib +numpy From 1dd60c737344287965b5e9ed53ce1f77f5c1a156 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 2 Jun 2023 12:08:21 +0100 Subject: [PATCH 060/188] Edit default config file --- doc/doc/pygom-doc/_config.yml | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/doc/doc/pygom-doc/_config.yml b/doc/doc/pygom-doc/_config.yml index 5f534f80..fd486944 100644 --- a/doc/doc/pygom-doc/_config.yml +++ b/doc/doc/pygom-doc/_config.yml @@ -1,14 +1,20 @@ # Book settings # Learn more at https://jupyterbook.org/customize/config.html -title: My sample book -author: The Jupyter Book Community -logo: logo.png +title: PyGOM documentation +author: Public Health England / UK Health Security Agency +logo: ukhsa.png -# Force re-execution of notebooks on each build. +# build files in table of contents +# used as alternative to exclude patterns +only_build_toc_files: true + +# cache notebook outputs to save time +# TODO check what is required for readthedocs +# this could avoid the issue of execution timing out # See https://jupyterbook.org/content/execute.html execute: - execute_notebooks: force + execute_notebooks: cache # Define the name of the latex output file for PDF builds latex: @@ -16,12 +22,16 @@ latex: targetname: book.tex # Add a bibtex file so that we can create citations -bibtex_bibfiles: - - references.bib +# use sphinx to specify style +sphinx: + config: + bibtex_reference_style: author_year + # TODO change md to bibtex + bibtex_bibfiles: "ref.md" # Information about where the book exists on the web repository: - url: https://github.com/executablebooks/jupyter-book # Online location of your book + url: https://github.com/ukhsa-collaboration/pygom # Online location of your book path_to_book: docs # Optional path to your book, relative to the repository root branch: master # Which branch of the repository should be used when creating links (optional) From 91d27f6a6cd3be71e7b13c479f5687447d1f19b7 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 15 Jun 2023 09:58:17 +0100 Subject: [PATCH 061/188] convert rst files to md and ipynb - maintains subdirectories except ones without --- doc/doc/pygom-doc/rst_to_md.sh | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 doc/doc/pygom-doc/rst_to_md.sh diff --git a/doc/doc/pygom-doc/rst_to_md.sh b/doc/doc/pygom-doc/rst_to_md.sh new file mode 100644 index 00000000..290f6df2 --- /dev/null +++ b/doc/doc/pygom-doc/rst_to_md.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# convert rst to md using pandoc + +INDIR=$(realpath -e "$1") +OUTDIR=$(realpath -e "$2") + + +for f in $(find "${INDIR}" -iname '*.rst') +do + # extract filename without extension + FILESTRIP=$(basename "${f%.*}") + # extract directory of file + FILEDIR="$(dirname "${f}")" + # extract subdirectory of file + # NB this takes the last directory + SUBDIR="$(basename "${FILEDIR}")" + NEWDIR="${OUTDIR}"/"${SUBDIR}" + mkdir -p "${NEWDIR}" + echo "converting ${f} to ${NEWDIR}/$FILESTRIP.md" + pandoc "${f}" -f rst -t markdown -o "${NEWDIR}/${FILESTRIP}.md" + pandoc "${NEWDIR}/${FILESTRIP}.md" -o "${NEWDIR}/${FILESTRIP}.ipynb" +done + + From dff5acf4b51e3c3724c401ce75866f170b027592 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 15 Jun 2023 10:29:55 +0100 Subject: [PATCH 062/188] Converted files (md and ipynb) to edit --- doc/doc/pygom-doc/mdconvert/common_models/.md | 35 ++ .../mdconvert/common_models/FitzHugh.ipynb | 54 ++ .../mdconvert/common_models/FitzHugh.md | 44 ++ .../common_models/Legrand_Ebola_SEIHFR.ipynb | 103 ++++ .../common_models/Legrand_Ebola_SEIHFR.md | 96 ++++ .../mdconvert/common_models/Lorenz.ipynb | 45 ++ .../mdconvert/common_models/Lorenz.md | 34 ++ .../common_models/Lotka_Volterra.ipynb | 107 ++++ .../mdconvert/common_models/Lotka_Volterra.md | 103 ++++ .../common_models/Lotka_Volterra_4State.ipynb | 67 +++ .../common_models/Lotka_Volterra_4State.md | 60 +++ .../mdconvert/common_models/Robertson.ipynb | 94 ++++ .../mdconvert/common_models/Robertson.md | 89 +++ .../mdconvert/common_models/SEIR.ipynb | 46 ++ .../pygom-doc/mdconvert/common_models/SEIR.md | 35 ++ .../common_models/SEIR_Birth_Death.ipynb | 49 ++ .../common_models/SEIR_Birth_Death.md | 38 ++ .../SEIR_Birth_Death_Periodic.ipynb | 76 +++ .../SEIR_Birth_Death_Periodic.md | 70 +++ .../common_models/SEIR_Multiple.ipynb | 59 ++ .../mdconvert/common_models/SEIR_Multiple.md | 51 ++ .../mdconvert/common_models/SIR.ipynb | 55 ++ .../pygom-doc/mdconvert/common_models/SIR.md | 46 ++ .../common_models/SIR_Birth_Death.ipynb | 46 ++ .../common_models/SIR_Birth_Death.md | 35 ++ .../mdconvert/common_models/SIS.ipynb | 46 ++ .../pygom-doc/mdconvert/common_models/SIS.md | 35 ++ .../common_models/SIS_Periodic.ipynb | 45 ++ .../mdconvert/common_models/SIS_Periodic.md | 34 ++ .../mdconvert/common_models/vanDelPol.ipynb | 83 +++ .../mdconvert/common_models/vanDelPol.md | 74 +++ doc/doc/pygom-doc/mdconvert/doc_to_sort/.md | 201 +++++++ .../mdconvert/doc_to_sort/bvpSimple.ipynb | 198 +++++++ .../mdconvert/doc_to_sort/bvpSimple.md | 201 +++++++ .../mdconvert/doc_to_sort/common_models.ipynb | 31 ++ .../mdconvert/doc_to_sort/common_models.md | 20 + .../pygom-doc/mdconvert/doc_to_sort/epi.ipynb | 70 +++ .../pygom-doc/mdconvert/doc_to_sort/epi.md | 65 +++ .../mdconvert/doc_to_sort/epijson.ipynb | 65 +++ .../mdconvert/doc_to_sort/epijson.md | 58 ++ .../mdconvert/doc_to_sort/estimate1.ipynb | 139 +++++ .../mdconvert/doc_to_sort/estimate1.md | 144 +++++ .../mdconvert/doc_to_sort/estimate2.ipynb | 324 +++++++++++ .../mdconvert/doc_to_sort/estimate2.md | 353 ++++++++++++ .../pygom-doc/mdconvert/doc_to_sort/faq.ipynb | 83 +++ .../pygom-doc/mdconvert/doc_to_sort/faq.md | 76 +++ .../pygom-doc/mdconvert/doc_to_sort/fh.ipynb | 135 +++++ doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.md | 141 +++++ .../mdconvert/doc_to_sort/gradient.ipynb | 356 ++++++++++++ .../mdconvert/doc_to_sort/gradient.md | 372 +++++++++++++ .../mdconvert/doc_to_sort/initialGuess.ipynb | 68 +++ .../mdconvert/doc_to_sort/initialGuess.md | 59 ++ .../mdconvert/doc_to_sort/profile.ipynb | 485 +++++++++++++++++ .../mdconvert/doc_to_sort/profile.md | 506 ++++++++++++++++++ .../pygom-doc/mdconvert/doc_to_sort/ref.ipynb | 103 ++++ .../pygom-doc/mdconvert/doc_to_sort/ref.md | 113 ++++ .../mdconvert/doc_to_sort/stochastic.ipynb | 328 ++++++++++++ .../mdconvert/doc_to_sort/stochastic.md | 341 ++++++++++++ .../mdconvert/doc_to_sort/transition.ipynb | 211 ++++++++ .../mdconvert/doc_to_sort/transition.md | 230 ++++++++ .../mdconvert/doc_to_sort/unrollOde.ipynb | 23 + .../mdconvert/doc_to_sort/unrollOde.md | 13 + doc/doc/pygom-doc/mdconvert/mod/.md | 5 + .../mdconvert/mod/common_models.ipynb | 16 + .../pygom-doc/mdconvert/mod/common_models.md | 5 + .../mdconvert/mod/confidence_interval.ipynb | 16 + .../mdconvert/mod/confidence_interval.md | 5 + .../mdconvert/mod/deterministic.ipynb | 16 + .../pygom-doc/mdconvert/mod/deterministic.md | 5 + .../mdconvert/mod/epi_analysis.ipynb | 16 + .../pygom-doc/mdconvert/mod/epi_analysis.md | 5 + .../pygom-doc/mdconvert/mod/get_init.ipynb | 16 + doc/doc/pygom-doc/mdconvert/mod/get_init.md | 5 + doc/doc/pygom-doc/mdconvert/mod/index.ipynb | 22 + doc/doc/pygom-doc/mdconvert/mod/index.md | 13 + .../pygom-doc/mdconvert/mod/losstype.ipynb | 16 + doc/doc/pygom-doc/mdconvert/mod/losstype.md | 5 + doc/doc/pygom-doc/mdconvert/mod/odeloss.ipynb | 24 + doc/doc/pygom-doc/mdconvert/mod/odeloss.md | 16 + .../pygom-doc/mdconvert/mod/odeutils.ipynb | 16 + doc/doc/pygom-doc/mdconvert/mod/odeutils.md | 5 + .../pygom-doc/mdconvert/mod/simulate.ipynb | 16 + doc/doc/pygom-doc/mdconvert/mod/simulate.md | 5 + .../pygom-doc/mdconvert/mod/transition.ipynb | 16 + doc/doc/pygom-doc/mdconvert/mod/transition.md | 5 + doc/doc/pygom-doc/mdconvert/unroll/.md | 57 ++ .../pygom-doc/mdconvert/unroll/unrollBD.ipynb | 64 +++ .../pygom-doc/mdconvert/unroll/unrollBD.md | 60 +++ .../mdconvert/unroll/unrollHard.ipynb | 90 ++++ .../pygom-doc/mdconvert/unroll/unrollHard.md | 89 +++ .../mdconvert/unroll/unrollSimple.ipynb | 61 +++ .../mdconvert/unroll/unrollSimple.md | 57 ++ 92 files changed, 8113 insertions(+) create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Lorenz.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Lorenz.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Robertson.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/Robertson.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIR.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIR.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIS.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIS.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.md create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.md create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/common_models.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/common_models.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/confidence_interval.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/confidence_interval.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/deterministic.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/deterministic.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/epi_analysis.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/epi_analysis.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/get_init.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/get_init.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/index.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/index.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/losstype.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/losstype.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/odeloss.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/odeloss.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/odeutils.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/odeutils.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/simulate.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/simulate.md create mode 100644 doc/doc/pygom-doc/mdconvert/mod/transition.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/mod/transition.md create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/.md create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/unrollBD.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/unrollBD.md create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/unrollHard.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/unrollHard.md create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.ipynb create mode 100644 doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.md diff --git a/doc/doc/pygom-doc/mdconvert/common_models/.md b/doc/doc/pygom-doc/mdconvert/common_models/.md new file mode 100644 index 00000000..7aa8ca23 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/.md @@ -0,0 +1,35 @@ +# `.SIR_Birth_Death`{.interpreted-text role="func"} + +Next, we look at an SIR model with birth death + +$$\begin{aligned} +\frac{dS}{dt} &= B -\beta SI - \mu S \\ +\frac{dI}{dt} &= \beta SI - \gamma I - \mu I \\ +\frac{dR}{dt} &= \gamma I +\end{aligned}$$ + +Continuing from the example above, but now with a much longer time +frame. Note that the birth and death rate are the same. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: B = 126372.0/365.0 + +In \[1\]: N = 7781984.0 + +In \[1\]: ode = common_models.SIR_Birth_Death({\'beta\':3.6, +\'gamma\':0.2, \'B\':B/N, \'mu\':B/N}) + +In \[1\]: t = numpy.linspace(0, 35\*365, 10001) + +In \[1\]: x0 = \[0.065, 123.0\*(5.0/30.0)/N, 0.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_sir_bd.png In \[1\]: ode.plot() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.ipynb new file mode 100644 index 00000000..a94f5f0e --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.ipynb @@ -0,0 +1,54 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.FitzHugh`\n", + "\n", + "The FitzHugh model [\\[FitzHugh1961\\]]() without external external\n", + "stimulus. This is a commonly used model when developing new methodology\n", + "with regard to ode's, see [\\[Ramsay2007\\]]() and [\\[Girolami2011\\]]()\n", + "and reference therein.\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dV}{dt} &= c ( V - \\frac{V^{3}}{3} + R) \\\\\n", + "\\frac{dR}{dt} &= -\\frac{1}{c}(V - a + bR).\n", + "\\end{aligned}$$\n", + "\n", + "An example would be\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: ode = common_models.FitzHugh({'a':0.2, 'b':0.2, 'c':3.0})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 20, 101)\n", + "\n", + "In \\[1\\]: x0 = \\[1.0, -1.0\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_fh_1.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "In \\[1\\]: fig = plt.figure()\n", + "\n", + "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,1\\], 'b')\n", + "\n", + "@savefig common_models_fh_2.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.md b/doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.md new file mode 100644 index 00000000..6b563e6b --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/FitzHugh.md @@ -0,0 +1,44 @@ +# `.FitzHugh`{.interpreted-text role="func"} + +The FitzHugh model [\[FitzHugh1961\]]() without external external +stimulus. This is a commonly used model when developing new methodology +with regard to ode\'s, see [\[Ramsay2007\]]() and [\[Girolami2011\]]() +and reference therein. + +$$\begin{aligned} +\frac{dV}{dt} &= c ( V - \frac{V^{3}}{3} + R) \\ +\frac{dR}{dt} &= -\frac{1}{c}(V - a + bR). +\end{aligned}$$ + +An example would be + +::: {.ipython} +In \[1\]: import numpy + +In \[1\]: from pygom import common_models + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: ode = common_models.FitzHugh({\'a\':0.2, \'b\':0.2, +\'c\':3.0}) + +In \[1\]: t = numpy.linspace(0, 20, 101) + +In \[1\]: x0 = \[1.0, -1.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_fh_1.png In \[1\]: ode.plot() + +In \[1\]: plt.close() + +In \[1\]: fig = plt.figure() + +In \[1\]: plt.plot(solution\[:,0\], solution\[:,1\], \'b\') + +\@savefig common_models_fh_2.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.ipynb new file mode 100644 index 00000000..cab8043e --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.ipynb @@ -0,0 +1,103 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.Legrand_Ebola_SEIHFR`\n", + "\n", + "A commonly used model in the literature to model Ebola outbreaks is the\n", + "SEIHFR model proposed by [\\[Legrand2007\\]](). There are two extra\n", + "compartments on top of the standard SEIR, $H$ for hospitialization and\n", + "$F$ for funeral. A total of ten parameters (with some describing the\n", + "inverse) are required for the model, they are:\n", + "\n", + "| Symbol | Process |\n", + "|:-------------|:--------------------------------------------|\n", + "| $\\beta_{I}$ | Transmission rate in community |\n", + "| $\\beta_{H}$ | Transmission rate in hospital |\n", + "| $\\beta_{F}$ | Transmission rate in funeral |\n", + "| $\\gamma_{I}$ | (inverse) Onset to end of infectious |\n", + "| $\\gamma_{D}$ | (inverse) Onset to death |\n", + "| $\\gamma_{H}$ | (inverse) Onset of hospitilization |\n", + "| $\\gamma_{F}$ | (inverse) Death to burial |\n", + "| $\\alpha$ | (inverse) Duration of the incubation period |\n", + "| $\\theta$ | Proportional of cases hospitalized |\n", + "| $\\delta$ | Case--ftality ratio |\n", + "\n", + "The **(inverse)** denotes the parameter should be inverted to make\n", + "epidemiological sense. We use the parameters in their more natural from\n", + "in `.Legrand_Ebola_SEIHFR` and replace all the $\\gamma$'s with\n", + "$\\omega$'s, i.e. $\\omega_{i} = \\gamma_{i}^{-1}$ for $i \\in \\{I,D,H,F\\}$.\n", + "We also used $\\alpha^{-1}$ in our model instead of $\\alpha$ so that\n", + "reading the parameters directly gives a more intuitive meaning. There\n", + "arw five additional parameters that is derived. The two derived case\n", + "fatality ratio as\n", + "\n", + "$$\\begin{aligned}\n", + "\\delta_{1} &= \\frac{\\delta \\gamma_{I}}{\\delta \\gamma_{I} + (1-\\delta)\\gamma_{D}} \\\\\n", + "\\delta_{2} &= \\frac{\\delta \\gamma_{IH}}{\\delta \\gamma_{IH} + (1-\\delta)\\gamma_{DH}},\n", + "\\end{aligned}$$\n", + "\n", + "with an adjusted hospitalization parameter\n", + "\n", + "$$\\theta_{1} = \\frac{\\theta(\\gamma_{I}(1-\\delta_{1}) + \\gamma_{D}\\delta_{1})}{\\theta(\\gamma_{I}(1-\\delta_{1}) + \\gamma_{D}\\delta_{1}) + (1-\\theta)\\gamma_{H}},$$\n", + "\n", + "and the derived infectious period\n", + "\n", + "$$\\begin{aligned}\n", + "\\gamma_{IH} &= (\\gamma_{I}^{-1} - \\gamma_{H}^{-1})^{-1} \\\\\n", + "\\gamma_{DH} &= (\\gamma_{D}^{-1} - \\gamma_{H}^{-1})^{-1}.\n", + "\\end{aligned}$$\n", + "\n", + "Now we are ready to state the full set of ode's,\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -N^{-1} (\\beta_{I}SI + \\beta_{H}SH + \\beta_{F}(t) SF) \\\\\n", + "\\frac{dE}{dt} &= N^{-1} (\\beta_{I}SI + \\beta_{H}SH + \\beta_{F}(t) SF) - \\alpha E \\\\\n", + "\\frac{dI}{dt} &= \\alpha E - (\\gamma_{H} \\theta_{1} + \\gamma_{I}(1-\\theta_{1})(1-\\delta_{1}) + \\gamma_{D}(1-\\theta_{1})\\delta_{1})I \\\\\n", + "\\frac{dH}{dt} &= \\gamma_{H}\\theta_{1}I - (\\gamma_{DH}\\delta_{2} + \\gamma_{IH}(1-\\delta_{2}))H \\\\\n", + "\\frac{dF}{dt} &= \\gamma_{D}(1-\\theta_{1})\\delta_{1}I + \\gamma_{DH}\\delta_{2}H - \\gamma_{F}F \\\\\n", + "\\frac{dR}{dt} &= \\gamma_{I}(1-\\theta_{1})(1-\\delta_{1})I + \\gamma_{IH}(1-\\delta_{2})H + \\gamma_{F}F.\n", + "\\end{aligned}$$\n", + "\n", + "with $\\beta_{F}(t) = \\beta_{F}$ if $t > c$ and $0$ otherwise. We use a\n", + "slightly modified version by replacing the delta function with a sigmoid\n", + "function namely, the logistic function\n", + "\n", + "$$\\beta_{F}(t) = \\beta_{F} \\left(1 - \\frac{1}{1 + \\exp(-\\kappa (t - c))} \\right)$$\n", + "\n", + "A brief example (from \\[3\\]) is given here with a slightly more in depth\n", + "example in `estimate2`.\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: x0 = \\[1.0, 3.0/200000.0, 0.0, 0.0, 0.0, 0.0, 0.0\\]\n", + "\n", + "In \\[1\\]: t = numpy.linspace(1, 25, 100)\n", + "\n", + "In \\[1\\]: ode = common_models.Legrand_Ebola_SEIHFR(\\[ \n", + "...: ('beta_I',0.588), ...: ('beta_H',0.794), ...: ('beta_F',7.653),\n", + "...: ('omega_I',10.0/7.0), ...: ('omega_D',9.6/7.0), ...:\n", + "('omega_H',5.0/7.0), ...: ('omega_F',2.0/7.0), ...:\n", + "('alphaInv',7.0/7.0), ...: ('delta',0.81), ...: ('theta',0.80), ...:\n", + "('kappa',300.0), ...: ('interventionTime',7.0) ...: \\])\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t)\n", + "\n", + "@savefig common_models_seihfr.png In \\[1\\]: ode.plot()\n", + "\n", + "Note also that we have again standardized so that the number of\n", + "susceptible is 1 and equal to the whole population, i.e. $N$ does not\n", + "exist in our set of ode's as defined in `.common_models`." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md b/doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md new file mode 100644 index 00000000..52141c92 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md @@ -0,0 +1,96 @@ +# `.Legrand_Ebola_SEIHFR`{.interpreted-text role="func"} + +A commonly used model in the literature to model Ebola outbreaks is the +SEIHFR model proposed by [\[Legrand2007\]](). There are two extra +compartments on top of the standard SEIR, $H$ for hospitialization and +$F$ for funeral. A total of ten parameters (with some describing the +inverse) are required for the model, they are: + + Symbol Process + -------------- --------------------------------------------- + $\beta_{I}$ Transmission rate in community + $\beta_{H}$ Transmission rate in hospital + $\beta_{F}$ Transmission rate in funeral + $\gamma_{I}$ (inverse) Onset to end of infectious + $\gamma_{D}$ (inverse) Onset to death + $\gamma_{H}$ (inverse) Onset of hospitilization + $\gamma_{F}$ (inverse) Death to burial + $\alpha$ (inverse) Duration of the incubation period + $\theta$ Proportional of cases hospitalized + $\delta$ Case\--ftality ratio + +The **(inverse)** denotes the parameter should be inverted to make +epidemiological sense. We use the parameters in their more natural from +in `.Legrand_Ebola_SEIHFR`{.interpreted-text role="func"} and replace +all the $\gamma$\'s with $\omega$\'s, i.e. +$\omega_{i} = \gamma_{i}^{-1}$ for $i \in \{I,D,H,F\}$. We also used +$\alpha^{-1}$ in our model instead of $\alpha$ so that reading the +parameters directly gives a more intuitive meaning. There arw five +additional parameters that is derived. The two derived case fatality +ratio as + +$$\begin{aligned} +\delta_{1} &= \frac{\delta \gamma_{I}}{\delta \gamma_{I} + (1-\delta)\gamma_{D}} \\ +\delta_{2} &= \frac{\delta \gamma_{IH}}{\delta \gamma_{IH} + (1-\delta)\gamma_{DH}}, +\end{aligned}$$ + +with an adjusted hospitalization parameter + +$$\theta_{1} = \frac{\theta(\gamma_{I}(1-\delta_{1}) + \gamma_{D}\delta_{1})}{\theta(\gamma_{I}(1-\delta_{1}) + \gamma_{D}\delta_{1}) + (1-\theta)\gamma_{H}},$$ + +and the derived infectious period + +$$\begin{aligned} +\gamma_{IH} &= (\gamma_{I}^{-1} - \gamma_{H}^{-1})^{-1} \\ +\gamma_{DH} &= (\gamma_{D}^{-1} - \gamma_{H}^{-1})^{-1}. +\end{aligned}$$ + +Now we are ready to state the full set of ode\'s, + +$$\begin{aligned} +\frac{dS}{dt} &= -N^{-1} (\beta_{I}SI + \beta_{H}SH + \beta_{F}(t) SF) \\ +\frac{dE}{dt} &= N^{-1} (\beta_{I}SI + \beta_{H}SH + \beta_{F}(t) SF) - \alpha E \\ +\frac{dI}{dt} &= \alpha E - (\gamma_{H} \theta_{1} + \gamma_{I}(1-\theta_{1})(1-\delta_{1}) + \gamma_{D}(1-\theta_{1})\delta_{1})I \\ +\frac{dH}{dt} &= \gamma_{H}\theta_{1}I - (\gamma_{DH}\delta_{2} + \gamma_{IH}(1-\delta_{2}))H \\ +\frac{dF}{dt} &= \gamma_{D}(1-\theta_{1})\delta_{1}I + \gamma_{DH}\delta_{2}H - \gamma_{F}F \\ +\frac{dR}{dt} &= \gamma_{I}(1-\theta_{1})(1-\delta_{1})I + \gamma_{IH}(1-\delta_{2})H + \gamma_{F}F. +\end{aligned}$$ + +with $\beta_{F}(t) = \beta_{F}$ if $t > c$ and $0$ otherwise. We use a +slightly modified version by replacing the delta function with a sigmoid +function namely, the logistic function + +$$\beta_{F}(t) = \beta_{F} \left(1 - \frac{1}{1 + \exp(-\kappa (t - c))} \right)$$ + +A brief example (from \[3\]) is given here with a slightly more in depth +example in `estimate2`{.interpreted-text role="ref"}. + +::: {.ipython} +In \[1\]: import numpy + +In \[1\]: from pygom import common_models + +In \[1\]: x0 = \[1.0, 3.0/200000.0, 0.0, 0.0, 0.0, 0.0, 0.0\] + +In \[1\]: t = numpy.linspace(1, 25, 100) + +In \[1\]: ode = common_models.Legrand_Ebola_SEIHFR(\[ + +: \...: (\'beta_I\',0.588), \...: (\'beta_H\',0.794), \...: + (\'beta_F\',7.653), \...: (\'omega_I\',10.0/7.0), \...: + (\'omega_D\',9.6/7.0), \...: (\'omega_H\',5.0/7.0), \...: + (\'omega_F\',2.0/7.0), \...: (\'alphaInv\',7.0/7.0), \...: + (\'delta\',0.81), \...: (\'theta\',0.80), \...: (\'kappa\',300.0), + \...: (\'interventionTime\',7.0) \...: \]) + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t) + +\@savefig common_models_seihfr.png In \[1\]: ode.plot() +::: + +Note also that we have again standardized so that the number of +susceptible is 1 and equal to the whole population, i.e. $N$ does not +exist in our set of ode\'s as defined in +`.common_models`{.interpreted-text role="mod"}. diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Lorenz.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/Lorenz.ipynb new file mode 100644 index 00000000..74b29ea3 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Lorenz.ipynb @@ -0,0 +1,45 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.Lorenz`\n", + "\n", + "The Lorenz attractor [\\[Lorenz1963\\]]() defined by the equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dx}{dt} &= \\sigma (y-x) \\\\\n", + "\\frac{dy}{dt} &= x (\\rho - z) - y \\\\\n", + "\\frac{dz}{dt} &= xy - \\beta z\n", + "\\end{aligned}$$\n", + "\n", + "A classic example is\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 100, 20000)\n", + "\n", + "In \\[1\\]: ode = common_models.Lorenz({'beta':8.0/3.0, 'sigma':10.0,\n", + "'rho':28.0})\n", + "\n", + "In \\[1\\]: ode.initial_values = (\\[1., 1., 1.\\], t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "In \\[1\\]: f = plt.figure()\n", + "\n", + "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,2\\]);\n", + "\n", + "@savefig common_models_Lorenz.png In \\[1\\]: plt.show()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Lorenz.md b/doc/doc/pygom-doc/mdconvert/common_models/Lorenz.md new file mode 100644 index 00000000..907311ce --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Lorenz.md @@ -0,0 +1,34 @@ +# `.Lorenz`{.interpreted-text role="func"} + +The Lorenz attractor [\[Lorenz1963\]]() defined by the equations + +$$\begin{aligned} +\frac{dx}{dt} &= \sigma (y-x) \\ +\frac{dy}{dt} &= x (\rho - z) - y \\ +\frac{dz}{dt} &= xy - \beta z +\end{aligned}$$ + +A classic example is + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: t = numpy.linspace(0, 100, 20000) + +In \[1\]: ode = common_models.Lorenz({\'beta\':8.0/3.0, \'sigma\':10.0, +\'rho\':28.0}) + +In \[1\]: ode.initial_values = (\[1., 1., 1.\], t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +In \[1\]: f = plt.figure() + +In \[1\]: plt.plot(solution\[:,0\], solution\[:,2\]); + +\@savefig common_models_Lorenz.png In \[1\]: plt.show() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.ipynb new file mode 100644 index 00000000..8063348d --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.ipynb @@ -0,0 +1,107 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.Lotka_Volterra`\n", + "\n", + "A standard Lotka-Volterra (preditor and prey) model with two states and\n", + "four parameters [\\[Lotka1920\\]]().\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dx}{dt} &= \\alpha x - cxy \\\\\n", + "\\frac{dy}{dt} &= -\\delta y + \\gamma xy\n", + "\\end{aligned}$$\n", + "\n", + "with both birth and death processes.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: x0 = \\[2.0, 6.0\\]\n", + "\n", + "In \\[1\\]: ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3,\n", + "'c':2, 'gamma':6})\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, 0)\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0.1, 100, 10000)\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t)\n", + "\n", + "@savefig common_models_Lotka_Volterra.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "Then we generate the graph at [Wolfram\n", + "Alpha](http://www.wolframalpha.com/input/?i=lotka-volterra+equations)\n", + "with varying initial conditions.\n", + "\n", + "In \\[1\\]: x1List = numpy.linspace(0.2, 2.0, 5)\n", + "\n", + "In \\[1\\]: x2List = numpy.linspace(0.6, 6.0, 5)\n", + "\n", + "In \\[1\\]: fig = plt.figure()\n", + "\n", + "In \\[1\\]: solutionList = list()\n", + "\n", + "In \\[1\\]: ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3,\n", + "'c':2, 'gamma':6})\n", + "\n", + "In \\[1\\]: for i in range(len(x1List)): \n", + "...: ode.initial_values = (\\[x1List\\[i\\], x2List\\[i\\]\\], 0) ...:\n", + "solutionList += \\[ode.integrate(t)\\]\n", + "\n", + "In \\[1\\]: for i in range(len(x1List)):\n", + "plt.plot(solutionList\\[i\\]\\[100::,0\\], solutionList\\[i\\]\\[100::,1\\],\n", + "'b')\n", + "\n", + "In \\[1\\]: plt.xlabel('x')\n", + "\n", + "In \\[1\\]: plt.ylabel('y')\n", + "\n", + "@savefig common_models_Lotka_Volterra_initial_condition.png In \\[1\\]:\n", + "plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "We also know that the system has the critical points at\n", + "$x = \\delta / \\gamma$ and $y=\\alpha / c$. If we changes the parameters\n", + "in such a way that the ration between $x$ and $y$ remains the same, then\n", + "we get a figure as below\n", + "\n", + "In \\[1\\]: cList = numpy.linspace(0.1, 2.0, 5)\n", + "\n", + "In \\[1\\]: gammaList = numpy.linspace(0.6, 6.0, 5)\n", + "\n", + "In \\[1\\]: fig = plt.figure()\n", + "\n", + "In \\[1\\]: for i in range(len(x1List)): \n", + "...: ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3,\n", + "'c':cList\\[i\\], 'gamma':gammaList\\[i\\]}) ...: ode.initial_values =\n", + "(x0, 0) ...: solutionList += \\[ode.integrate(t)\\]\n", + "\n", + "In \\[1\\]: for i in range(len(cList)):\n", + "plt.plot(solutionList\\[i\\]\\[100::,0\\], solutionList\\[i\\]\\[100::,1\\])\n", + "\n", + "In \\[1\\]: plt.xlabel('x')\n", + "\n", + "In \\[1\\]: plt.ylabel('y')\n", + "\n", + "@savefig common_models_Lotka_Volterra_critical_point.png In \\[1\\]:\n", + "plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "where all the cycles goes through the same points." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.md b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.md new file mode 100644 index 00000000..c98870b1 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra.md @@ -0,0 +1,103 @@ +# `.Lotka_Volterra`{.interpreted-text role="func"} + +A standard Lotka-Volterra (preditor and prey) model with two states and +four parameters [\[Lotka1920\]](). + +$$\begin{aligned} +\frac{dx}{dt} &= \alpha x - cxy \\ +\frac{dy}{dt} &= -\delta y + \gamma xy +\end{aligned}$$ + +with both birth and death processes. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: x0 = \[2.0, 6.0\] + +In \[1\]: ode = common_models.Lotka_Volterra({\'alpha\':1, \'delta\':3, +\'c\':2, \'gamma\':6}) + +In \[1\]: ode.initial_values = (x0, 0) + +In \[1\]: t = numpy.linspace(0.1, 100, 10000) + +In \[1\]: solution = ode.integrate(t) + +\@savefig common_models_Lotka_Volterra.png In \[1\]: ode.plot() + +In \[1\]: plt.close() +::: + +Then we generate the graph at [Wolfram +Alpha](http://www.wolframalpha.com/input/?i=lotka-volterra+equations) +with varying initial conditions. + +::: {.ipython} +In \[1\]: x1List = numpy.linspace(0.2, 2.0, 5) + +In \[1\]: x2List = numpy.linspace(0.6, 6.0, 5) + +In \[1\]: fig = plt.figure() + +In \[1\]: solutionList = list() + +In \[1\]: ode = common_models.Lotka_Volterra({\'alpha\':1, \'delta\':3, +\'c\':2, \'gamma\':6}) + +In \[1\]: for i in range(len(x1List)): + +: \...: ode.initial_values = (\[x1List\[i\], x2List\[i\]\], 0) \...: + solutionList += \[ode.integrate(t)\] + +In \[1\]: for i in range(len(x1List)): +plt.plot(solutionList\[i\]\[100::,0\], solutionList\[i\]\[100::,1\], +\'b\') + +In \[1\]: plt.xlabel(\'x\') + +In \[1\]: plt.ylabel(\'y\') + +\@savefig common_models_Lotka_Volterra_initial_condition.png In \[1\]: +plt.show() + +In \[1\]: plt.close() +::: + +We also know that the system has the critical points at +$x = \delta / \gamma$ and $y=\alpha / c$. If we changes the parameters +in such a way that the ration between $x$ and $y$ remains the same, then +we get a figure as below + +::: {.ipython} +In \[1\]: cList = numpy.linspace(0.1, 2.0, 5) + +In \[1\]: gammaList = numpy.linspace(0.6, 6.0, 5) + +In \[1\]: fig = plt.figure() + +In \[1\]: for i in range(len(x1List)): + +: \...: ode = common_models.Lotka_Volterra({\'alpha\':1, \'delta\':3, + \'c\':cList\[i\], \'gamma\':gammaList\[i\]}) \...: + ode.initial_values = (x0, 0) \...: solutionList += + \[ode.integrate(t)\] + +In \[1\]: for i in range(len(cList)): +plt.plot(solutionList\[i\]\[100::,0\], solutionList\[i\]\[100::,1\]) + +In \[1\]: plt.xlabel(\'x\') + +In \[1\]: plt.ylabel(\'y\') + +\@savefig common_models_Lotka_Volterra_critical_point.png In \[1\]: +plt.show() + +In \[1\]: plt.close() +::: + +where all the cycles goes through the same points. diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.ipynb new file mode 100644 index 00000000..34ec9f82 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.Lotka_Volterra_4State`\n", + "\n", + "The Lotka-Volterra model with four states and three parameters\n", + "[\\[Lotka1920\\]](), explained by the following three transitions\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{da}{dt} &= k_{0} a x \\\\\n", + "\\frac{dx}{dt} &= k_{0} a x - k_{1} x y \\\\\n", + "\\frac{dy}{dt} &= k_{1} x y - k_{2} y \\\\\n", + "\\frac{db}{dt} &= k_{2} y.\n", + "\\end{aligned}$$\n", + "\n", + "First, we show the deterministic approach. Then we also show the\n", + "different process path using the parameters from [\\[Press2007\\]](). Note\n", + "that although the model is defined in `common_models`, it is based on\n", + "outputting an `OperateOdeModel` rather than `SimulateOdeModel`.\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType, ode_utils,\n", + "SimulateOde\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: stateList = \\['a', 'x', 'y', 'b'\\]\n", + "\n", + "In \\[1\\]: paramList = \\['k0', 'k1', 'k2'\\]\n", + "\n", + "In \\[1\\]: transitionList = \\[ \n", + "...: Transition(origin='a', destination='x', equation='k0\\*a\\*x',\n", + "transition_type=TransitionType.T), ...: Transition(origin='x',\n", + "destination='y', equation='k1\\*x\\*y', transition_type=TransitionType.T),\n", + "...: Transition(origin='y', destination='b', equation='k2\\*y',\n", + "transition_type=TransitionType.T) ...: \\]\n", + "\n", + "In \\[1\\]: ode = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: x0 = \\[150.0, 10.0, 10.0, 0.0\\]\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 15, 100)\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: ode.parameters = \\[0.01, 0.1, 1.0\\]\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_Lotka_Volterra_4State.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: simX, simT = ode.simulate_jump(t\\[1::\\], 5, full_output=True)\n", + "\n", + "@savefig common_models_Lotka_Volterra_Sim.png In \\[1\\]: ode.plot(simX,\n", + "simT)" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md new file mode 100644 index 00000000..af9ce277 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md @@ -0,0 +1,60 @@ +# `.Lotka_Volterra_4State`{.interpreted-text role="func"} + +The Lotka-Volterra model with four states and three parameters +[\[Lotka1920\]](), explained by the following three transitions + +$$\begin{aligned} +\frac{da}{dt} &= k_{0} a x \\ +\frac{dx}{dt} &= k_{0} a x - k_{1} x y \\ +\frac{dy}{dt} &= k_{1} x y - k_{2} y \\ +\frac{db}{dt} &= k_{2} y. +\end{aligned}$$ + +First, we show the deterministic approach. Then we also show the +different process path using the parameters from [\[Press2007\]](). Note +that although the model is defined in `common_models`{.interpreted-text +role="mod"}, it is based on outputting an +`OperateOdeModel`{.interpreted-text role="class"} rather than +`SimulateOdeModel`{.interpreted-text role="class"}. + +::: {.ipython} +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: from pygom import Transition, TransitionType, ode_utils, +SimulateOde + +In \[1\]: import numpy + +In \[1\]: stateList = \[\'a\', \'x\', \'y\', \'b\'\] + +In \[1\]: paramList = \[\'k0\', \'k1\', \'k2\'\] + +In \[1\]: transitionList = \[ + +: \...: Transition(origin=\'a\', destination=\'x\', + equation=\'k0\*a\*x\', transition_type=TransitionType.T), \...: + Transition(origin=\'x\', destination=\'y\', equation=\'k1\*x\*y\', + transition_type=TransitionType.T), \...: Transition(origin=\'y\', + destination=\'b\', equation=\'k2\*y\', + transition_type=TransitionType.T) \...: \] + +In \[1\]: ode = SimulateOde(stateList, paramList, +transition=transitionList) + +In \[1\]: x0 = \[150.0, 10.0, 10.0, 0.0\] + +In \[1\]: t = numpy.linspace(0, 15, 100) + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: ode.parameters = \[0.01, 0.1, 1.0\] + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_Lotka_Volterra_4State.png In \[1\]: ode.plot() + +In \[1\]: simX, simT = ode.simulate_jump(t\[1::\], 5, full_output=True) + +\@savefig common_models_Lotka_Volterra_Sim.png In \[1\]: ode.plot(simX, +simT) +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Robertson.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/Robertson.ipynb new file mode 100644 index 00000000..fc1eb714 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Robertson.ipynb @@ -0,0 +1,94 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.Robertson`\n", + "\n", + "The Robertson problem [\\[Robertson1966\\]]()\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dy_{1}}{dt} &= -0.04 y_{1} + 1 \\cdot 10^{4} y_{2} y_{3} \\\\\n", + "\\frac{dy_{2}}{dt} &= 0.04 y_{1} - 1 \\cdot 10^{4} y_{2} y_{3} + 3 \\cdot 10^{7} y_{2}^{2} \\\\\n", + "\\frac{dy_{3}}{dt} &= 3 \\cdot 10^{7} y_{2}^{2}.\n", + "\\end{aligned}$$\n", + "\n", + "This is a problem that describes an autocatalytic reaction. One of those\n", + "commonly used to test stiff ode solvers. As the parameters in the\n", + "literature is fixed, we show here how to define the states in a slightly\n", + "more compact format\n", + "\n", + "In \\[1\\]: from pygom import DeterministicOde, Transition, TransitionType\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: t = numpy.append(0, 4\\*numpy.logspace(-6, 6, 1000))\n", + "\n", + "In \\[1\\]: \\# note how we define the states\n", + "\n", + "In \\[1\\]: stateList = \\['y1:4'\\]\n", + "\n", + "In \\[1\\]: paramList = \\[\\]\n", + "\n", + "In \\[1\\]: transitionList = \\[ \n", + "...: Transition(origin='y1', destination='y2', equation='0.04\\*y1',\n", + "transition_type=TransitionType.T), ...: Transition(origin='y2',\n", + "destination='y1', equation='1e4\\*y2\\*y3',\n", + "transition_type=TransitionType.T), ...: Transition(origin='y2',\n", + "destination='y3', equation='3e7\\*y2\\*y2',\n", + "transition_type=TransitionType.T) ...: \\]\n", + "\n", + "In \\[1\\]: ode = DeterministicOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: ode.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "\n", + "In \\[1\\]: solution, output = ode.integrate(t\\[1::\\], full_output=True)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1, 3)\n", + "\n", + "In \\[1\\]: for i in range(3): \n", + "...: axarr\\[i\\].plot(t, solution\\[:,i\\]) ...:\n", + "axarr\\[i\\].set_xscale('log')\n", + "\n", + "In \\[1\\]: f.tight_layout();\n", + "\n", + "@savefig common_models_Robertson_1.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "To simplify even further, we can use y\n", + "with the corresponding subscript directly instead of y1,y2,y3. Again, we do not have any parameters\n", + "as they are hard coded into our models.\n", + "\n", + "In \\[1\\]: stateList = \\['y1:4'\\]\n", + "\n", + "In \\[1\\]: transitionList = \\[ \n", + "...: Transition(origin='y\\[0\\]', destination='y\\[1\\]',\n", + "equation='0.04\\*y\\[0\\]', transition_type=TransitionType.T), ...:\n", + "Transition(origin='y\\[1\\]', destination='y\\[0\\]',\n", + "equation='1e4\\*y\\[1\\]*y\\[2\\]', transition_type=TransitionType.T), ...:\n", + "Transition(origin='y\\[1\\]', destination='y\\[2\\]',\n", + "equation='3e7*y\\[1\\]\\*y\\[1\\]', transition_type=TransitionType.T) ...: \\]\n", + "\n", + "In \\[1\\]: ode = DeterministicOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: ode.initial_values =(\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "\n", + "In \\[1\\]: solution2 = ode.integrate(t\\[1::\\])\n", + "\n", + "In \\[1\\]: numpy.max(solution - solution2)\n", + "\n", + "and we have the identical solution as shown in the last line above." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/Robertson.md b/doc/doc/pygom-doc/mdconvert/common_models/Robertson.md new file mode 100644 index 00000000..1b55174a --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/Robertson.md @@ -0,0 +1,89 @@ +# `.Robertson`{.interpreted-text role="func"} + +The Robertson problem [\[Robertson1966\]]() + +$$\begin{aligned} +\frac{dy_{1}}{dt} &= -0.04 y_{1} + 1 \cdot 10^{4} y_{2} y_{3} \\ +\frac{dy_{2}}{dt} &= 0.04 y_{1} - 1 \cdot 10^{4} y_{2} y_{3} + 3 \cdot 10^{7} y_{2}^{2} \\ +\frac{dy_{3}}{dt} &= 3 \cdot 10^{7} y_{2}^{2}. +\end{aligned}$$ + +This is a problem that describes an autocatalytic reaction. One of those +commonly used to test stiff ode solvers. As the parameters in the +literature is fixed, we show here how to define the states in a slightly +more compact format + +::: {.ipython} +In \[1\]: from pygom import DeterministicOde, Transition, TransitionType + +In \[1\]: import numpy + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: t = numpy.append(0, 4\*numpy.logspace(-6, 6, 1000)) + +In \[1\]: \# note how we define the states + +In \[1\]: stateList = \[\'y1:4\'\] + +In \[1\]: paramList = \[\] + +In \[1\]: transitionList = \[ + +: \...: Transition(origin=\'y1\', destination=\'y2\', + equation=\'0.04\*y1\', transition_type=TransitionType.T), \...: + Transition(origin=\'y2\', destination=\'y1\', + equation=\'1e4\*y2\*y3\', transition_type=TransitionType.T), \...: + Transition(origin=\'y2\', destination=\'y3\', + equation=\'3e7\*y2\*y2\', transition_type=TransitionType.T) \...: \] + +In \[1\]: ode = DeterministicOde(stateList, paramList, +transition=transitionList) + +In \[1\]: ode.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) + +In \[1\]: solution, output = ode.integrate(t\[1::\], full_output=True) + +In \[1\]: f, axarr = plt.subplots(1, 3) + +In \[1\]: for i in range(3): + +: \...: axarr\[i\].plot(t, solution\[:,i\]) \...: + axarr\[i\].set_xscale(\'log\') + +In \[1\]: f.tight_layout(); + +\@savefig common_models_Robertson_1.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +To simplify even further, we can use [y]{.title-ref} with the +corresponding subscript directly instead of [y1,y2,y3]{.title-ref}. +Again, we do not have any parameters as they are hard coded into our +models. + +::: {.ipython} +In \[1\]: stateList = \[\'y1:4\'\] + +In \[1\]: transitionList = \[ + +: \...: Transition(origin=\'y\[0\]\', destination=\'y\[1\]\', + equation=\'0.04\*y\[0\]\', transition_type=TransitionType.T), \...: + Transition(origin=\'y\[1\]\', destination=\'y\[0\]\', + equation=\'1e4\*y\[1\]*y\[2\]\', transition_type=TransitionType.T), + \...: Transition(origin=\'y\[1\]\', destination=\'y\[2\]\', + equation=\'3e7*y\[1\]\*y\[1\]\', transition_type=TransitionType.T) + \...: \] + +In \[1\]: ode = DeterministicOde(stateList, paramList, +transition=transitionList) + +In \[1\]: ode.initial_values =(\[1.0, 0.0, 0.0\], t\[0\]) + +In \[1\]: solution2 = ode.integrate(t\[1::\]) + +In \[1\]: numpy.max(solution - solution2) +::: + +and we have the identical solution as shown in the last line above. diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SEIR.ipynb new file mode 100644 index 00000000..dea8d27b --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR.ipynb @@ -0,0 +1,46 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SEIR`\n", + "\n", + "A natural extension to the SIR is the SEIR model. An extra parameter\n", + "$\\alpha$, which is the inverse of the incubation period is introduced.\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\end{aligned}$$$$\\begin{aligned}\n", + "\\frac{dE}{dt} &= \\beta SI - \\alpha E \\\\\n", + "\\end{aligned}$$$$\\begin{aligned}\n", + "\\frac{dI}{dt} &= \\alpha E - \\gamma I \\\\\n", + "\\end{aligned}$$$$\\frac{dR}{dt} &= \\gamma I$$\n", + "\n", + "We use the parameters from \\[Aron1984\\] here to generate our plots,\n", + "which does not yield a *nice* and *sensible* epidemic curve as the birth\n", + "and death processes are missing.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: ode = common_models.SEIR({'beta':1800, 'gamma':100,\n", + "'alpha':35.84})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 50, 1001)\n", + "\n", + "In \\[1\\]: x0 = \\[0.0658, 0.0007, 0.0002, 0.0\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_seir.png In \\[1\\]: ode.plot()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR.md b/doc/doc/pygom-doc/mdconvert/common_models/SEIR.md new file mode 100644 index 00000000..57d3c813 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR.md @@ -0,0 +1,35 @@ +# `.SEIR`{.interpreted-text role="func"} + +A natural extension to the SIR is the SEIR model. An extra parameter +$\alpha$, which is the inverse of the incubation period is introduced. + +$$\begin{aligned} +\frac{dS}{dt} &= -\beta SI \\ +\end{aligned}$$$$\begin{aligned} +\frac{dE}{dt} &= \beta SI - \alpha E \\ +\end{aligned}$$$$\begin{aligned} +\frac{dI}{dt} &= \alpha E - \gamma I \\ +\end{aligned}$$$$\frac{dR}{dt} &= \gamma I$$ + +We use the parameters from \[Aron1984\] here to generate our plots, +which does not yield a *nice* and *sensible* epidemic curve as the birth +and death processes are missing. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: ode = common_models.SEIR({\'beta\':1800, \'gamma\':100, +\'alpha\':35.84}) + +In \[1\]: t = numpy.linspace(0, 50, 1001) + +In \[1\]: x0 = \[0.0658, 0.0007, 0.0002, 0.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_seir.png In \[1\]: ode.plot() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.ipynb new file mode 100644 index 00000000..a886b59d --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.ipynb @@ -0,0 +1,49 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SEIR_Birth_Death`\n", + "\n", + "Extending it to also include birth death process with equal rate $\\mu$\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= \\mu - \\beta SI - \\mu S \\\\\n", + "\\frac{dE}{dt} &= \\beta SI - (\\mu + \\alpha) E \\\\\n", + "\\frac{dI}{dt} &= \\alpha E - (\\mu + \\gamma) I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I\n", + "\\end{aligned}$$\n", + "\n", + "Same parameters value taken from [\\[Aron1984\\]]() as the SEIR example\n", + "above is used here. Observe how the introduction of a birth and a death\n", + "process changes the graph even though the rest of the parameters remains\n", + "the same.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: ode = common_models.SEIR_Birth_Death({'beta':1800,\n", + "'gamma':100, 'alpha':35.84, 'mu':0.02})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 50, 1001)\n", + "\n", + "In \\[1\\]: x0 = \\[0.0658, 0.0007, 0.0002, 0.0\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\], full_output=True)\n", + "\n", + "@savefig common_models_seir_bd.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md new file mode 100644 index 00000000..83623160 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md @@ -0,0 +1,38 @@ +# `.SEIR_Birth_Death`{.interpreted-text role="func"} + +Extending it to also include birth death process with equal rate $\mu$ + +$$\begin{aligned} +\frac{dS}{dt} &= \mu - \beta SI - \mu S \\ +\frac{dE}{dt} &= \beta SI - (\mu + \alpha) E \\ +\frac{dI}{dt} &= \alpha E - (\mu + \gamma) I \\ +\frac{dR}{dt} &= \gamma I +\end{aligned}$$ + +Same parameters value taken from [\[Aron1984\]]() as the SEIR example +above is used here. Observe how the introduction of a birth and a death +process changes the graph even though the rest of the parameters remains +the same. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: import numpy + +In \[1\]: ode = common_models.SEIR_Birth_Death({\'beta\':1800, +\'gamma\':100, \'alpha\':35.84, \'mu\':0.02}) + +In \[1\]: t = numpy.linspace(0, 50, 1001) + +In \[1\]: x0 = \[0.0658, 0.0007, 0.0002, 0.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\], full_output=True) + +\@savefig common_models_seir_bd.png In \[1\]: ode.plot() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.ipynb new file mode 100644 index 00000000..cd2a67d7 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.ipynb @@ -0,0 +1,76 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SEIR_Birth_Death_Periodic`\n", + "\n", + "Now extending the SEIR to also have periodic contact, as in\n", + "[\\[Aron1984\\]]().\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= \\mu - \\beta(t)SI - \\mu S \\\\\n", + "\\frac{dE}{dt} &= \\beta(t)SI - (\\mu + \\alpha) E \\\\\n", + "\\frac{dI}{dt} &= \\alpha E - (\\mu + \\gamma) I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: ode = common_models.SEIR_Birth_Death_Periodic({'beta_0':1800,\n", + "'beta_1':0.2, 'gamma':100, 'alpha':35.84, 'mu':0.02})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 50, 1001)\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: x0 = \\[0.0658, 0.0007, 0.0002, 0.0\\]\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_seir_bd_periodic1.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "The periodicity is obvious when looking at the the plot between states\n", + "$S$ and $E$, in logarithmic scale.\n", + "\n", + "In \\[1\\]: fig = plt.figure();\n", + "\n", + "In \\[1\\]: plt.plot(numpy.log(solution\\[:,0\\]),\n", + "numpy.log(solution\\[:,1\\]));\n", + "\n", + "In \\[1\\]: plt.xlabel('log of S');\n", + "\n", + "In \\[1\\]: plt.ylabel('log of E');\n", + "\n", + "@savefig common_models_seir_bd_periodic2.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "Similarly, we can see the same thing between the states $E$ and $I$.\n", + "\n", + "In \\[1\\]: fig = plt.figure();\n", + "\n", + "In \\[1\\]: plt.plot(numpy.log(solution\\[:,1\\]),\n", + "numpy.log(solution\\[:,2\\]));\n", + "\n", + "In \\[1\\]: plt.xlabel('log of E');\n", + "\n", + "In \\[1\\]: plt.ylabel('log of I');\n", + "\n", + "@savefig common_models_seir_bd_periodic3.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md new file mode 100644 index 00000000..736c1947 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md @@ -0,0 +1,70 @@ +# `.SEIR_Birth_Death_Periodic`{.interpreted-text role="func"} + +Now extending the SEIR to also have periodic contact, as in +[\[Aron1984\]](). + +$$\begin{aligned} +\frac{dS}{dt} &= \mu - \beta(t)SI - \mu S \\ +\frac{dE}{dt} &= \beta(t)SI - (\mu + \alpha) E \\ +\frac{dI}{dt} &= \alpha E - (\mu + \gamma) I \\ +\frac{dR}{dt} &= \gamma I. +\end{aligned}$$ + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: ode = +common_models.SEIR_Birth_Death_Periodic({\'beta_0\':1800, +\'beta_1\':0.2, \'gamma\':100, \'alpha\':35.84, \'mu\':0.02}) + +In \[1\]: t = numpy.linspace(0, 50, 1001) + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: x0 = \[0.0658, 0.0007, 0.0002, 0.0\] + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_seir_bd_periodic1.png In \[1\]: ode.plot() + +In \[1\]: plt.close() +::: + +The periodicity is obvious when looking at the the plot between states +$S$ and $E$, in logarithmic scale. + +::: {.ipython} +In \[1\]: fig = plt.figure(); + +In \[1\]: plt.plot(numpy.log(solution\[:,0\]), +numpy.log(solution\[:,1\])); + +In \[1\]: plt.xlabel(\'log of S\'); + +In \[1\]: plt.ylabel(\'log of E\'); + +\@savefig common_models_seir_bd_periodic2.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +Similarly, we can see the same thing between the states $E$ and $I$. + +::: {.ipython} +In \[1\]: fig = plt.figure(); + +In \[1\]: plt.plot(numpy.log(solution\[:,1\]), +numpy.log(solution\[:,2\])); + +In \[1\]: plt.xlabel(\'log of E\'); + +In \[1\]: plt.ylabel(\'log of I\'); + +\@savefig common_models_seir_bd_periodic3.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.ipynb new file mode 100644 index 00000000..e47426be --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.ipynb @@ -0,0 +1,59 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SEIR_Multiple`\n", + "\n", + "Multiple SEIR coupled together, without any birth death process.\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS_{i}}{dt} &= dN_{i} - dS_{i} - \\lambda_{i}S_{i} \\\\\n", + "\\frac{dE_{i}}{dt} &= \\lambda_{i}S_{i} - (d+\\epsilon)E_{i} \\\\\n", + "\\frac{dI_{i}}{dt} &= \\epsilon E_{i} - (d+\\gamma) I_{i} \\\\\n", + "\\frac{dR_{i}}{dt} &= \\gamma I_{i} - dR_{i}\n", + "\\end{aligned}$$\n", + "\n", + "where\n", + "\n", + "$$\\lambda_{i} = \\sum_{j=1}^{n} \\beta_{i,j} I_{j} (1\\{i\\neq j\\} p)$$\n", + "\n", + "with $n$ being the number of patch and $p$ the coupled factor.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[2\\]: import numpy\n", + "\n", + "In \\[3\\]: paramEval = {'beta_00':0.0010107,'beta_01':0.0010107,'beta_10':0.0010107, \n", + "...: 'beta_11':0.0010107,'d':0.02,'epsilon':45.6,'gamma':73.0, ...:\n", + "'N_0':10\\**6,'N_1':10*\\*6,'p':0.01}\n", + "\n", + "In \\[4\\]: x0 = \\[36139.3224081278, 422.560577637822, 263.883351688369,\n", + "963174.233662546\\]\n", + "\n", + "In \\[5\\]: ode = common_models.SEIR_Multiple(param=paramEval)\n", + "\n", + "In \\[6\\]: t = numpy.linspace(0, 40, 100)\n", + "\n", + "In \\[7\\]: x01 = \\[\\]\n", + "\n", + "In \\[8\\]: for s in x0: \n", + "...: x01 += 2\\*\\[s\\]\n", + "\n", + "In \\[9\\]: ode.initial_values = (numpy.array(x01, float),t\\[0\\])\n", + "\n", + "In \\[10\\]: solution, output = ode.integrate(t\\[1::\\], full_output=True)\n", + "\n", + "@savefig common_models_seir_multiple.png In \\[11\\]: ode.plot()\n", + "\n", + "The initial conditions are those derived by using the stability\n", + "condition as stated in [\\[Lloyd1996\\]]() while the notations is taken\n", + "from [\\[Brauer2008\\]]()." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.md b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.md new file mode 100644 index 00000000..c7048c67 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SEIR_Multiple.md @@ -0,0 +1,51 @@ +# `.SEIR_Multiple`{.interpreted-text role="func"} + +Multiple SEIR coupled together, without any birth death process. + +$$\begin{aligned} +\frac{dS_{i}}{dt} &= dN_{i} - dS_{i} - \lambda_{i}S_{i} \\ +\frac{dE_{i}}{dt} &= \lambda_{i}S_{i} - (d+\epsilon)E_{i} \\ +\frac{dI_{i}}{dt} &= \epsilon E_{i} - (d+\gamma) I_{i} \\ +\frac{dR_{i}}{dt} &= \gamma I_{i} - dR_{i} +\end{aligned}$$ + +where + +$$\lambda_{i} = \sum_{j=1}^{n} \beta_{i,j} I_{j} (1\{i\neq j\} p)$$ + +with $n$ being the number of patch and $p$ the coupled factor. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[2\]: import numpy + +In \[3\]: paramEval = {\'beta_00\':0.0010107,\'beta_01\':0.0010107,\'beta_10\':0.0010107, + +: \...: + \'beta_11\':0.0010107,\'d\':0.02,\'epsilon\':45.6,\'gamma\':73.0, + \...: \'N_0\':10\**6,\'N_1\':10*\*6,\'p\':0.01} + +In \[4\]: x0 = \[36139.3224081278, 422.560577637822, 263.883351688369, +963174.233662546\] + +In \[5\]: ode = common_models.SEIR_Multiple(param=paramEval) + +In \[6\]: t = numpy.linspace(0, 40, 100) + +In \[7\]: x01 = \[\] + +In \[8\]: for s in x0: + +: \...: x01 += 2\*\[s\] + +In \[9\]: ode.initial_values = (numpy.array(x01, float),t\[0\]) + +In \[10\]: solution, output = ode.integrate(t\[1::\], full_output=True) + +\@savefig common_models_seir_multiple.png In \[11\]: ode.plot() +::: + +The initial conditions are those derived by using the stability +condition as stated in [\[Lloyd1996\]]() while the notations is taken +from [\[Brauer2008\]](). diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIR.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SIR.ipynb new file mode 100644 index 00000000..fd293399 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIR.ipynb @@ -0,0 +1,55 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SIR`\n", + "\n", + "A standard SIR model defined by the equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\frac{dI}{dt} &= \\beta SI - \\gamma I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I\n", + "\\end{aligned}$$\n", + "\n", + "Note that the examples and parameters are taken from [\\[Brauer2008\\]](),\n", + "namely Figure 1.4. Hence, the first one below may not appear to make\n", + "much sense.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: ode = common_models.SIR({'beta':3.6, 'gamma':0.2})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 730, 1001)\n", + "\n", + "In \\[1\\]: N = 7781984.0\n", + "\n", + "In \\[1\\]: x0 = \\[1.0, 10.0/N, 0.0\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_sir.png In \\[1\\]: ode.plot()\n", + "\n", + "Now we have the more sensible plot, where the initial susceptibles is\n", + "only a fraction of 1.\n", + "\n", + "In \\[1\\]: x0 = \\[0.065, 123\\*(5.0/30.0)/N, 0.0\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_sir_realistic.png In \\[1\\]: ode.plot()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIR.md b/doc/doc/pygom-doc/mdconvert/common_models/SIR.md new file mode 100644 index 00000000..6b0ce30f --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIR.md @@ -0,0 +1,46 @@ +# `.SIR`{.interpreted-text role="func"} + +A standard SIR model defined by the equations + +$$\begin{aligned} +\frac{dS}{dt} &= -\beta SI \\ +\frac{dI}{dt} &= \beta SI - \gamma I \\ +\frac{dR}{dt} &= \gamma I +\end{aligned}$$ + +Note that the examples and parameters are taken from [\[Brauer2008\]](), +namely Figure 1.4. Hence, the first one below may not appear to make +much sense. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: ode = common_models.SIR({\'beta\':3.6, \'gamma\':0.2}) + +In \[1\]: t = numpy.linspace(0, 730, 1001) + +In \[1\]: N = 7781984.0 + +In \[1\]: x0 = \[1.0, 10.0/N, 0.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_sir.png In \[1\]: ode.plot() +::: + +Now we have the more sensible plot, where the initial susceptibles is +only a fraction of 1. + +::: {.ipython} +In \[1\]: x0 = \[0.065, 123\*(5.0/30.0)/N, 0.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_sir_realistic.png In \[1\]: ode.plot() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.ipynb new file mode 100644 index 00000000..f58c7552 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.ipynb @@ -0,0 +1,46 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SIR_Birth_Death`\n", + "\n", + "Next, we look at an SIR model with birth death\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= B -\\beta SI - \\mu S \\\\\n", + "\\frac{dI}{dt} &= \\beta SI - \\gamma I - \\mu I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I\n", + "\\end{aligned}$$\n", + "\n", + "Continuing from the example above, but now with a much longer time\n", + "frame. Note that the birth and death rate are the same.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: B = 126372.0/365.0\n", + "\n", + "In \\[1\\]: N = 7781984.0\n", + "\n", + "In \\[1\\]: ode = common_models.SIR_Birth_Death({'beta':3.6, 'gamma':0.2,\n", + "'B':B/N, 'mu':B/N})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 35\\*365, 10001)\n", + "\n", + "In \\[1\\]: x0 = \\[0.065, 123.0\\*(5.0/30.0)/N, 0.0\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_sir_bd.png In \\[1\\]: ode.plot()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md b/doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md new file mode 100644 index 00000000..7aa8ca23 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md @@ -0,0 +1,35 @@ +# `.SIR_Birth_Death`{.interpreted-text role="func"} + +Next, we look at an SIR model with birth death + +$$\begin{aligned} +\frac{dS}{dt} &= B -\beta SI - \mu S \\ +\frac{dI}{dt} &= \beta SI - \gamma I - \mu I \\ +\frac{dR}{dt} &= \gamma I +\end{aligned}$$ + +Continuing from the example above, but now with a much longer time +frame. Note that the birth and death rate are the same. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: B = 126372.0/365.0 + +In \[1\]: N = 7781984.0 + +In \[1\]: ode = common_models.SIR_Birth_Death({\'beta\':3.6, +\'gamma\':0.2, \'B\':B/N, \'mu\':B/N}) + +In \[1\]: t = numpy.linspace(0, 35\*365, 10001) + +In \[1\]: x0 = \[0.065, 123.0\*(5.0/30.0)/N, 0.0\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_sir_bd.png In \[1\]: ode.plot() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIS.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SIS.ipynb new file mode 100644 index 00000000..ba80a5c7 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIS.ipynb @@ -0,0 +1,46 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SIS`\n", + "\n", + "A standard SIS model without the total population $N$. We assume here\n", + "that $S + I = N$ so we can always normalize to 1. Evidently, the state\n", + "$S$ is not required for understanding the model because it is a\n", + "deterministic function of state $I$.\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta S I + \\gamma I \\\\\n", + "\\frac{dI}{dt} &= \\beta S I - \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "An example would be\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: ode = common_models.SIS({'beta':0.5,'gamma':0.2})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 20, 101)\n", + "\n", + "In \\[1\\]: x0 = \\[1.0, 0.1\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_sis.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIS.md b/doc/doc/pygom-doc/mdconvert/common_models/SIS.md new file mode 100644 index 00000000..e7d79d8e --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIS.md @@ -0,0 +1,35 @@ +# `.SIS`{.interpreted-text role="func"} + +A standard SIS model without the total population $N$. We assume here +that $S + I = N$ so we can always normalize to 1. Evidently, the state +$S$ is not required for understanding the model because it is a +deterministic function of state $I$. + +$$\begin{aligned} +\frac{dS}{dt} &= -\beta S I + \gamma I \\ +\frac{dI}{dt} &= \beta S I - \gamma I. +\end{aligned}$$ + +An example would be + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: import numpy + +In \[1\]: ode = common_models.SIS({\'beta\':0.5,\'gamma\':0.2}) + +In \[1\]: t = numpy.linspace(0, 20, 101) + +In \[1\]: x0 = \[1.0, 0.1\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_sis.png In \[1\]: ode.plot() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.ipynb new file mode 100644 index 00000000..4c2d7066 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.ipynb @@ -0,0 +1,45 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.SIS_Periodic`\n", + "\n", + "Now we look at an extension of the SIS model by incorporating periodic\n", + "contact rate. Note how our equation is defined by a single ode for state\n", + "**I**.\n", + "\n", + "$$\\frac{dI}{dt} = (\\beta(t)N - \\alpha) I - \\beta(t)I^{2}$$\n", + "\n", + "where $\\beta(t) = 2 - 1.8 \\cos(5t)$. As the name suggests, it achieves a\n", + "(stable) periodic solution. Note how the plots have two sub-graphs,\n", + "where $\\tau$ is in fact our time component which we have taken out of\n", + "the original equation when converting it to a automonous system.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: ode = common_models.SIS_Periodic({'alpha':1.0})\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 10, 101)\n", + "\n", + "In \\[1\\]: x0 = \\[0.1,0.\\]\n", + "\n", + "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_sis_periodic.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.md b/doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.md new file mode 100644 index 00000000..1f46029d --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/SIS_Periodic.md @@ -0,0 +1,34 @@ +# `.SIS_Periodic`{.interpreted-text role="func"} + +Now we look at an extension of the SIS model by incorporating periodic +contact rate. Note how our equation is defined by a single ode for state +**I**. + +$$\frac{dI}{dt} = (\beta(t)N - \alpha) I - \beta(t)I^{2}$$ + +where $\beta(t) = 2 - 1.8 \cos(5t)$. As the name suggests, it achieves a +(stable) periodic solution. Note how the plots have two sub-graphs, +where $\tau$ is in fact our time component which we have taken out of +the original equation when converting it to a automonous system. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: import numpy + +In \[1\]: ode = common_models.SIS_Periodic({\'alpha\':1.0}) + +In \[1\]: t = numpy.linspace(0, 10, 101) + +In \[1\]: x0 = \[0.1,0.\] + +In \[1\]: ode.initial_values = (x0, t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_sis_periodic.png In \[1\]: ode.plot() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.ipynb b/doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.ipynb new file mode 100644 index 00000000..eceaacda --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.ipynb @@ -0,0 +1,83 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `.vanDelPol`\n", + "\n", + "The van Del Pol oscillator [\\[vanderpol1926\\]]()\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dx}{dt} &= \\sigma (y-x) \\\\\n", + "\\frac{dy}{dt} &= x (\\rho - z) - y \\\\\n", + "\\frac{dz}{dt} &= xy - \\beta z\n", + "\\end{aligned}$$\n", + "\n", + "A classic example is\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 20, 1000)\n", + "\n", + "In \\[1\\]: ode = common_models.vanDelPol({'mu':1.0})\n", + "\n", + "In \\[1\\]: ode.initial_values = (\\[2.0, 0.0\\], t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "@savefig common_models_vanDelPol.png In \\[1\\]: ode.plot()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "In \\[1\\]: f = plt.figure()\n", + "\n", + "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,1\\]);\n", + "\n", + "@savefig common_models_vanDelPol_yprime_y\\_1.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "When we change the value, as per\n", + "[Wolfram](http://mathworld.wolfram.com/vanderPolEquation.html)\n", + "\n", + "In \\[1\\]: t = numpy.linspace(0, 100, 1000)\n", + "\n", + "In \\[1\\]: ode.parameters = {'mu':1.0}\n", + "\n", + "In \\[1\\]: ode.initial_values = (\\[0.0, 0.2\\], t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "In \\[1\\]: f = plt.figure()\n", + "\n", + "In \\[1\\]: plt.plot(solution\\[:,0\\],solution\\[:,1\\]);\n", + "\n", + "@savefig common_models_vanDelPol_yprime_y\\_2.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "In \\[1\\]: ode.parameters = {'mu':0.2}\n", + "\n", + "In \\[1\\]: ode.initial_values = (\\[0.0, 0.2\\], t\\[0\\])\n", + "\n", + "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "In \\[1\\]: f = plt.figure()\n", + "\n", + "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,1\\]);\n", + "\n", + "@savefig common_models_vanDelPol_yprime_y\\_3.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.md b/doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.md new file mode 100644 index 00000000..a8c0879d --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/common_models/vanDelPol.md @@ -0,0 +1,74 @@ +# `.vanDelPol`{.interpreted-text role="func"} + +The van Del Pol oscillator [\[vanderpol1926\]]() + +$$\begin{aligned} +\frac{dx}{dt} &= \sigma (y-x) \\ +\frac{dy}{dt} &= x (\rho - z) - y \\ +\frac{dz}{dt} &= xy - \beta z +\end{aligned}$$ + +A classic example is + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[1\]: import numpy + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: t = numpy.linspace(0, 20, 1000) + +In \[1\]: ode = common_models.vanDelPol({\'mu\':1.0}) + +In \[1\]: ode.initial_values = (\[2.0, 0.0\], t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +\@savefig common_models_vanDelPol.png In \[1\]: ode.plot() + +In \[1\]: plt.close() + +In \[1\]: f = plt.figure() + +In \[1\]: plt.plot(solution\[:,0\], solution\[:,1\]); + +\@savefig common_models_vanDelPol_yprime_y\_1.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +When we change the value, as per +[Wolfram](http://mathworld.wolfram.com/vanderPolEquation.html) + +::: {.ipython} +In \[1\]: t = numpy.linspace(0, 100, 1000) + +In \[1\]: ode.parameters = {\'mu\':1.0} + +In \[1\]: ode.initial_values = (\[0.0, 0.2\], t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +In \[1\]: f = plt.figure() + +In \[1\]: plt.plot(solution\[:,0\],solution\[:,1\]); + +\@savefig common_models_vanDelPol_yprime_y\_2.png In \[1\]: plt.show() + +In \[1\]: plt.close() + +In \[1\]: ode.parameters = {\'mu\':0.2} + +In \[1\]: ode.initial_values = (\[0.0, 0.2\], t\[0\]) + +In \[1\]: solution = ode.integrate(t\[1::\]) + +In \[1\]: f = plt.figure() + +In \[1\]: plt.plot(solution\[:,0\], solution\[:,1\]); + +\@savefig common_models_vanDelPol_yprime_y\_3.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/.md new file mode 100644 index 00000000..07745c25 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/.md @@ -0,0 +1,201 @@ +# Solving Boundary Value Problems {#bvpSimple} + +In addition to finding solutions for an IVP and estimate the unknown +parameters, this package also allows you to solve BVP with a little bit +of imagination. Here, we are going to show how a BVP can be solved by +treating it as a parameter estimation problem. Essentially, a shooting +method where the first boundary condition defines the initial condition +of an IVP and the second boundary condition is an observation. Two +examples, both from MATLAB[^1], will be shown here. + +## Simple model 1 + +We are trying to find the solution to the second order differential +equation + +$$\nabla^{2} y + |y| = 0$$ + +subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert +this into a set of first order ODE + +$$\begin{aligned} +\frac{d y_{0}}{dt} &= y_{1} \\ +\frac{d y_{1}}{dt} &= -|y_{0}| +\end{aligned}$$ + +using an auxiliary variable $y_{1} = \nabla y$ and $y_{0} = y$. Setting +up the system below + +::: {.ipython} +In \[1\]: from pygom import Transition, TransitionType, +DeterministicOde, SquareLoss + +In \[1\]: import matplotlib.pyplot as plt + +In \[2\]: stateList = \[\'y0\', \'y1\'\] + +In \[3\]: paramList = \[\] + +In \[4\]: ode1 = Transition(origin=\'y0\', + +: \...: equation=\'y1\', \...: transition_type=TransitionType.ODE) + +In \[5\]: ode2 = Transition(origin=\'y1\', + +: \...: equation=\'-abs(y0)\', \...: + transition_type=TransitionType.ODE) + +In \[6\]: model = DeterministicOde(stateList, + +: \...: paramList, \...: ode=\[ode1, ode2\]) + +In \[7\]: model.get_ode_eqn() +::: + +We check that the equations are correct before proceeding to set up our +loss function. + +::: {.ipython} +In \[1\]: import numpy + +In \[2\]: from scipy.optimize import minimize + +In \[3\]: initialState = \[0.0, 1.0\] + +In \[4\]: t = numpy.linspace(0, 4, 100) + +In \[5\]: model.initial_values = (initialState, t\[0\]) + +In \[6\]: solution = model.integrate(t\[1::\]) + +In \[7\]: f = plt.figure() + +\@savefig bvp1_random_guess_plot.png In \[8\]: model.plot() + +In \[9\]: plt.close() +::: + +Setting up the second boundary condition $y(4) = -2$ is easy, because +that is just a single observation attached to the state $y_{1}$. +Enforcing the first boundary condition requires us to set it as the +initial condition. Because the condition only states that $y(0) = 0$, +the starting value of the other state $y_1$ is free. We let our loss +object know that it is free through the targetState input argument. + +::: {.ipython} +In \[10\]: theta = \[0.0\] + +In \[11\]: obj = SquareLoss(theta=theta, + +: \....: ode=model, \....: x0=initialState, \....: t0=t\[0\], \....: + t=t\[-1\], \....: y=\[-2\], \....: state_name=\[\'y0\'\], \....: + target_state=\[\'y1\'\]) + +In \[12\]: thetaHat = minimize(fun=obj.costIV, x0=\[0.0\]) + +In \[13\]: print(thetaHat) + +In \[14\]: model.initial_values = (\[0.0\] + thetaHat\[\'x\'\].tolist(), +t\[0\]) + +In \[15\]: solution = model.integrate(t\[1::\]) + +In \[16\]: f = plt.figure() + +\@savefig bvp1_solution_plot.png In \[17\]: model.plot() + +In \[18\]: plt.close() +::: + +We are going to visualize the solution, and also check the boundary +condition. The first became our initial condition, so it is always +satisfied and only the latter is of concern, which is zero (subject to +numerical error) from thetaHat. + +## Simple model 2 + +Our second example is different as it involves an actual parameter and +also time. We have the Mathieu\'s Equation + +$$\nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0$$ + +and the aim is to compute the fourth eigenvalue $q=5$. There are three +boundary conditions + +$$\nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1$$ + +and we aim to solve it by converting it to a first order ODE and tackle +it as an IVP. As our model object does not allow the use of the time +component in the equations, we introduce a anxiliary state $\tau$ that +replaces time $t$. Rewrite the equations using +$y_{0} = y, y_{1} = \nabla y$ and define our model as + +::: {.ipython} +In \[1\]: stateList = \[\'y0\', \'y1\', \'tau\'\] + +In \[2\]: paramList = \[\'p\'\] + +In \[3\]: ode1 = Transition(\'y0\', \'y1\', TransitionType.ODE) + +In \[4\]: ode2 = Transition(\'y1\', \'-(p - 2\*5\*cos(2\*tau))\*y0\', +TransitionType.ODE) + +In \[5\]: ode3 = Transition(\'tau\', \'1\', TransitionType.ODE) + +In \[6\]: model = DeterministicOde(stateList, paramList, ode=\[ode1, +ode2, ode3\]) + +In \[7\]: theta = \[1.0, 1.0, 0.0\] + +In \[8\]: p = 15.0 + +In \[9\]: t = numpy.linspace(0, numpy.pi) + +In \[10\]: model.parameters = \[(\'p\',p)\] + +In \[11\]: model.initial_values = (theta, t\[0\]) + +In \[12\]: solution = model.integrate(t\[1::\]) + +In \[13\]: f = plt.figure() + +\@savefig bvp2_random_guess_plot.png In \[14\]: model.plot() + +In \[15\]: plt.close() +::: + +Now we are ready to setup the estimation. Like before, we setup the +second boundary condition by pretending that it is an observation. We +have all the initial conditions defined by the first boundary condition + +::: {.ipython} +In \[1\]: obj = SquareLoss(15.0, model, x0=\[1.0, 0.0, 0.0\], t0=0.0, +t=numpy.pi, y=0.0, state_name=\'y1\') + +In \[2\]: xhatObj = minimize(obj.cost,\[15\]) + +In \[3\]: print(xhatObj) + +In \[4\]: model.parameters = \[(\'p\', xhatObj\[\'x\'\]\[0\])\] + +In \[5\]: model.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) + +In \[5\]: solution = model.integrate(t\[1::\]) + +In \[6\]: f = plt.figure() + +\@savefig bvp2_solution_plot.png In \[7\]: model.plot() + +In \[8\]: plt.close() +::: + +The plot of the solution shows the path that satisfies all boundary +condition. The last subplot is time which obvious is redundant here but +the `DeterministicOde.plot`{.interpreted-text role="meth"} method is not +yet able to recognize the time component. Possible speed up can be +achieved through the use of derivative information or via root finding +method that tackles the gradient directly, instead of the cost function. + +**Reference** + +[^1]: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.ipynb new file mode 100644 index 00000000..6ca0ce57 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.ipynb @@ -0,0 +1,198 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solving Boundary Value Problems\n", + "\n", + "In addition to finding solutions for an IVP and estimate the unknown\n", + "parameters, this package also allows you to solve BVP with a little bit\n", + "of imagination. Here, we are going to show how a BVP can be solved by\n", + "treating it as a parameter estimation problem. Essentially, a shooting\n", + "method where the first boundary condition defines the initial condition\n", + "of an IVP and the second boundary condition is an observation. Two\n", + "examples, both from MATLAB[1], will be shown here.\n", + "\n", + "## Simple model 1\n", + "\n", + "We are trying to find the solution to the second order differential\n", + "equation\n", + "\n", + "$$\\nabla^{2} y + |y| = 0$$\n", + "\n", + "subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert\n", + "this into a set of first order ODE\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{d y_{0}}{dt} &= y_{1} \\\\\n", + "\\frac{d y_{1}}{dt} &= -|y_{0}|\n", + "\\end{aligned}$$\n", + "\n", + "using an auxiliary variable $y_{1} = \\nabla y$ and $y_{0} = y$. Setting\n", + "up the system below\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType,\n", + "DeterministicOde, SquareLoss\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[2\\]: stateList = \\['y0', 'y1'\\]\n", + "\n", + "In \\[3\\]: paramList = \\[\\]\n", + "\n", + "In \\[4\\]: ode1 = Transition(origin='y0', \n", + "...: equation='y1', ...: transition_type=TransitionType.ODE)\n", + "\n", + "In \\[5\\]: ode2 = Transition(origin='y1', \n", + "...: equation='-abs(y0)', ...: transition_type=TransitionType.ODE)\n", + "\n", + "In \\[6\\]: model = DeterministicOde(stateList, \n", + "...: paramList, ...: ode=\\[ode1, ode2\\])\n", + "\n", + "In \\[7\\]: model.get_ode_eqn()\n", + "\n", + "We check that the equations are correct before proceeding to set up our\n", + "loss function.\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[2\\]: from scipy.optimize import minimize\n", + "\n", + "In \\[3\\]: initialState = \\[0.0, 1.0\\]\n", + "\n", + "In \\[4\\]: t = numpy.linspace(0, 4, 100)\n", + "\n", + "In \\[5\\]: model.initial_values = (initialState, t\\[0\\])\n", + "\n", + "In \\[6\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[7\\]: f = plt.figure()\n", + "\n", + "@savefig bvp1_random_guess_plot.png In \\[8\\]: model.plot()\n", + "\n", + "In \\[9\\]: plt.close()\n", + "\n", + "Setting up the second boundary condition $y(4) = -2$ is easy, because\n", + "that is just a single observation attached to the state $y_{1}$.\n", + "Enforcing the first boundary condition requires us to set it as the\n", + "initial condition. Because the condition only states that $y(0) = 0$,\n", + "the starting value of the other state $y_1$ is free. We let our loss\n", + "object know that it is free through the targetState input argument.\n", + "\n", + "In \\[10\\]: theta = \\[0.0\\]\n", + "\n", + "In \\[11\\]: obj = SquareLoss(theta=theta, \n", + ".…: ode=model, .…: x0=initialState, .…: t0=t\\[0\\], .…: t=t\\[-1\\], .…:\n", + "y=\\[-2\\], .…: state_name=\\['y0'\\], .…: target_state=\\['y1'\\])\n", + "\n", + "In \\[12\\]: thetaHat = minimize(fun=obj.costIV, x0=\\[0.0\\])\n", + "\n", + "In \\[13\\]: print(thetaHat)\n", + "\n", + "In \\[14\\]: model.initial_values = (\\[0.0\\] + thetaHat\\['x'\\].tolist(),\n", + "t\\[0\\])\n", + "\n", + "In \\[15\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[16\\]: f = plt.figure()\n", + "\n", + "@savefig bvp1_solution_plot.png In \\[17\\]: model.plot()\n", + "\n", + "In \\[18\\]: plt.close()\n", + "\n", + "We are going to visualize the solution, and also check the boundary\n", + "condition. The first became our initial condition, so it is always\n", + "satisfied and only the latter is of concern, which is zero (subject to\n", + "numerical error) from thetaHat.\n", + "\n", + "## Simple model 2\n", + "\n", + "Our second example is different as it involves an actual parameter and\n", + "also time. We have the Mathieu's Equation\n", + "\n", + "$$\\nabla^{2} y + \\left(p - 2q \\cos(2x)\\right)y = 0$$\n", + "\n", + "and the aim is to compute the fourth eigenvalue $q=5$. There are three\n", + "boundary conditions\n", + "\n", + "$$\\nabla y(0) = 0, \\quad \\nabla y(\\pi) = 0, \\quad y(0) = 1$$\n", + "\n", + "and we aim to solve it by converting it to a first order ODE and tackle\n", + "it as an IVP. As our model object does not allow the use of the time\n", + "component in the equations, we introduce a anxiliary state $\\tau$ that\n", + "replaces time $t$. Rewrite the equations using\n", + "$y_{0} = y, y_{1} = \\nabla y$ and define our model as\n", + "\n", + "In \\[1\\]: stateList = \\['y0', 'y1', 'tau'\\]\n", + "\n", + "In \\[2\\]: paramList = \\['p'\\]\n", + "\n", + "In \\[3\\]: ode1 = Transition('y0', 'y1', TransitionType.ODE)\n", + "\n", + "In \\[4\\]: ode2 = Transition('y1', '-(p - 2\\*5\\*cos(2\\*tau))\\*y0',\n", + "TransitionType.ODE)\n", + "\n", + "In \\[5\\]: ode3 = Transition('tau', '1', TransitionType.ODE)\n", + "\n", + "In \\[6\\]: model = DeterministicOde(stateList, paramList, ode=\\[ode1,\n", + "ode2, ode3\\])\n", + "\n", + "In \\[7\\]: theta = \\[1.0, 1.0, 0.0\\]\n", + "\n", + "In \\[8\\]: p = 15.0\n", + "\n", + "In \\[9\\]: t = numpy.linspace(0, numpy.pi)\n", + "\n", + "In \\[10\\]: model.parameters = \\[('p',p)\\]\n", + "\n", + "In \\[11\\]: model.initial_values = (theta, t\\[0\\])\n", + "\n", + "In \\[12\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[13\\]: f = plt.figure()\n", + "\n", + "@savefig bvp2_random_guess_plot.png In \\[14\\]: model.plot()\n", + "\n", + "In \\[15\\]: plt.close()\n", + "\n", + "Now we are ready to setup the estimation. Like before, we setup the\n", + "second boundary condition by pretending that it is an observation. We\n", + "have all the initial conditions defined by the first boundary condition\n", + "\n", + "In \\[1\\]: obj = SquareLoss(15.0, model, x0=\\[1.0, 0.0, 0.0\\], t0=0.0,\n", + "t=numpy.pi, y=0.0, state_name='y1')\n", + "\n", + "In \\[2\\]: xhatObj = minimize(obj.cost,\\[15\\])\n", + "\n", + "In \\[3\\]: print(xhatObj)\n", + "\n", + "In \\[4\\]: model.parameters = \\[('p', xhatObj\\['x'\\]\\[0\\])\\]\n", + "\n", + "In \\[5\\]: model.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "\n", + "In \\[5\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[6\\]: f = plt.figure()\n", + "\n", + "@savefig bvp2_solution_plot.png In \\[7\\]: model.plot()\n", + "\n", + "In \\[8\\]: plt.close()\n", + "\n", + "The plot of the solution shows the path that satisfies all boundary\n", + "condition. The last subplot is time which obvious is redundant here but\n", + "the `DeterministicOde.plot` method is not yet able to recognize the time\n", + "component. Possible speed up can be achieved through the use of\n", + "derivative information or via root finding method that tackles the\n", + "gradient directly, instead of the cost function.\n", + "\n", + "**Reference**\n", + "\n", + "[1] " + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md new file mode 100644 index 00000000..07745c25 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md @@ -0,0 +1,201 @@ +# Solving Boundary Value Problems {#bvpSimple} + +In addition to finding solutions for an IVP and estimate the unknown +parameters, this package also allows you to solve BVP with a little bit +of imagination. Here, we are going to show how a BVP can be solved by +treating it as a parameter estimation problem. Essentially, a shooting +method where the first boundary condition defines the initial condition +of an IVP and the second boundary condition is an observation. Two +examples, both from MATLAB[^1], will be shown here. + +## Simple model 1 + +We are trying to find the solution to the second order differential +equation + +$$\nabla^{2} y + |y| = 0$$ + +subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert +this into a set of first order ODE + +$$\begin{aligned} +\frac{d y_{0}}{dt} &= y_{1} \\ +\frac{d y_{1}}{dt} &= -|y_{0}| +\end{aligned}$$ + +using an auxiliary variable $y_{1} = \nabla y$ and $y_{0} = y$. Setting +up the system below + +::: {.ipython} +In \[1\]: from pygom import Transition, TransitionType, +DeterministicOde, SquareLoss + +In \[1\]: import matplotlib.pyplot as plt + +In \[2\]: stateList = \[\'y0\', \'y1\'\] + +In \[3\]: paramList = \[\] + +In \[4\]: ode1 = Transition(origin=\'y0\', + +: \...: equation=\'y1\', \...: transition_type=TransitionType.ODE) + +In \[5\]: ode2 = Transition(origin=\'y1\', + +: \...: equation=\'-abs(y0)\', \...: + transition_type=TransitionType.ODE) + +In \[6\]: model = DeterministicOde(stateList, + +: \...: paramList, \...: ode=\[ode1, ode2\]) + +In \[7\]: model.get_ode_eqn() +::: + +We check that the equations are correct before proceeding to set up our +loss function. + +::: {.ipython} +In \[1\]: import numpy + +In \[2\]: from scipy.optimize import minimize + +In \[3\]: initialState = \[0.0, 1.0\] + +In \[4\]: t = numpy.linspace(0, 4, 100) + +In \[5\]: model.initial_values = (initialState, t\[0\]) + +In \[6\]: solution = model.integrate(t\[1::\]) + +In \[7\]: f = plt.figure() + +\@savefig bvp1_random_guess_plot.png In \[8\]: model.plot() + +In \[9\]: plt.close() +::: + +Setting up the second boundary condition $y(4) = -2$ is easy, because +that is just a single observation attached to the state $y_{1}$. +Enforcing the first boundary condition requires us to set it as the +initial condition. Because the condition only states that $y(0) = 0$, +the starting value of the other state $y_1$ is free. We let our loss +object know that it is free through the targetState input argument. + +::: {.ipython} +In \[10\]: theta = \[0.0\] + +In \[11\]: obj = SquareLoss(theta=theta, + +: \....: ode=model, \....: x0=initialState, \....: t0=t\[0\], \....: + t=t\[-1\], \....: y=\[-2\], \....: state_name=\[\'y0\'\], \....: + target_state=\[\'y1\'\]) + +In \[12\]: thetaHat = minimize(fun=obj.costIV, x0=\[0.0\]) + +In \[13\]: print(thetaHat) + +In \[14\]: model.initial_values = (\[0.0\] + thetaHat\[\'x\'\].tolist(), +t\[0\]) + +In \[15\]: solution = model.integrate(t\[1::\]) + +In \[16\]: f = plt.figure() + +\@savefig bvp1_solution_plot.png In \[17\]: model.plot() + +In \[18\]: plt.close() +::: + +We are going to visualize the solution, and also check the boundary +condition. The first became our initial condition, so it is always +satisfied and only the latter is of concern, which is zero (subject to +numerical error) from thetaHat. + +## Simple model 2 + +Our second example is different as it involves an actual parameter and +also time. We have the Mathieu\'s Equation + +$$\nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0$$ + +and the aim is to compute the fourth eigenvalue $q=5$. There are three +boundary conditions + +$$\nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1$$ + +and we aim to solve it by converting it to a first order ODE and tackle +it as an IVP. As our model object does not allow the use of the time +component in the equations, we introduce a anxiliary state $\tau$ that +replaces time $t$. Rewrite the equations using +$y_{0} = y, y_{1} = \nabla y$ and define our model as + +::: {.ipython} +In \[1\]: stateList = \[\'y0\', \'y1\', \'tau\'\] + +In \[2\]: paramList = \[\'p\'\] + +In \[3\]: ode1 = Transition(\'y0\', \'y1\', TransitionType.ODE) + +In \[4\]: ode2 = Transition(\'y1\', \'-(p - 2\*5\*cos(2\*tau))\*y0\', +TransitionType.ODE) + +In \[5\]: ode3 = Transition(\'tau\', \'1\', TransitionType.ODE) + +In \[6\]: model = DeterministicOde(stateList, paramList, ode=\[ode1, +ode2, ode3\]) + +In \[7\]: theta = \[1.0, 1.0, 0.0\] + +In \[8\]: p = 15.0 + +In \[9\]: t = numpy.linspace(0, numpy.pi) + +In \[10\]: model.parameters = \[(\'p\',p)\] + +In \[11\]: model.initial_values = (theta, t\[0\]) + +In \[12\]: solution = model.integrate(t\[1::\]) + +In \[13\]: f = plt.figure() + +\@savefig bvp2_random_guess_plot.png In \[14\]: model.plot() + +In \[15\]: plt.close() +::: + +Now we are ready to setup the estimation. Like before, we setup the +second boundary condition by pretending that it is an observation. We +have all the initial conditions defined by the first boundary condition + +::: {.ipython} +In \[1\]: obj = SquareLoss(15.0, model, x0=\[1.0, 0.0, 0.0\], t0=0.0, +t=numpy.pi, y=0.0, state_name=\'y1\') + +In \[2\]: xhatObj = minimize(obj.cost,\[15\]) + +In \[3\]: print(xhatObj) + +In \[4\]: model.parameters = \[(\'p\', xhatObj\[\'x\'\]\[0\])\] + +In \[5\]: model.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) + +In \[5\]: solution = model.integrate(t\[1::\]) + +In \[6\]: f = plt.figure() + +\@savefig bvp2_solution_plot.png In \[7\]: model.plot() + +In \[8\]: plt.close() +::: + +The plot of the solution shows the path that satisfies all boundary +condition. The last subplot is time which obvious is redundant here but +the `DeterministicOde.plot`{.interpreted-text role="meth"} method is not +yet able to recognize the time component. Possible speed up can be +achieved through the use of derivative information or via root finding +method that tackles the gradient directly, instead of the cost function. + +**Reference** + +[^1]: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb new file mode 100644 index 00000000..938fed10 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb @@ -0,0 +1,31 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pre-defined Example common_models\n", + "\n", + "We have defined a set of models `common_models`, most of them commonly\n", + "used in epidemiology. They are there as examples and also save time for\n", + "end users. Most of them are of the compartmental type, and we use\n", + "standard naming conventions i.e. **S** = Susceptible, **E** = Exposed,\n", + "**I** = Infectious, **R** = Recovered. Extra state symbol will be\n", + "introduced when required.\n", + "\n", + "common_models/SIS.rst common_models/SIS_Periodic.rst\n", + "common_models/SIR.rst common_models/SIR_Birth_Death.rst\n", + "common_models/SEIR.rst common_models/SEIR_Multiple.rst\n", + "common_models/SEIR_Birth_Death.rst\n", + "common_models/SEIR_Birth_Death_Periodic.rst\n", + "common_models/Legrand_Ebola_SEIHFR.rst common_models/Lotka_Volterra.rst\n", + "common_models/Lotka_Volterra_4State.rst common_models/FitzHugh.rst\n", + "common_models/Lorenz.rst common_models/vanDelPol.rst\n", + "common_models/Robertson.rst" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.md new file mode 100644 index 00000000..994a2546 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/common_models.md @@ -0,0 +1,20 @@ +# Pre-defined Example common_models {#common_models} + +We have defined a set of models `common_models`{.interpreted-text +role="mod"}, most of them commonly used in epidemiology. They are there +as examples and also save time for end users. Most of them are of the +compartmental type, and we use standard naming conventions i.e. **S** = +Susceptible, **E** = Exposed, **I** = Infectious, **R** = Recovered. +Extra state symbol will be introduced when required. + +::: {.toctree} +common_models/SIS.rst common_models/SIS_Periodic.rst +common_models/SIR.rst common_models/SIR_Birth_Death.rst +common_models/SEIR.rst common_models/SEIR_Multiple.rst +common_models/SEIR_Birth_Death.rst +common_models/SEIR_Birth_Death_Periodic.rst +common_models/Legrand_Ebola_SEIHFR.rst common_models/Lotka_Volterra.rst +common_models/Lotka_Volterra_4State.rst common_models/FitzHugh.rst +common_models/Lorenz.rst common_models/vanDelPol.rst +common_models/Robertson.rst +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.ipynb new file mode 100644 index 00000000..48711b33 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.ipynb @@ -0,0 +1,70 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple Epidemic Analysis\n", + "\n", + "A common application of ordinary differential equations is in the field\n", + "of epidemiology modeling. More concretely, compartmental models that is\n", + "used to describe disease progression. We demonstrate some of the simple\n", + "algebraic analysis one may wish to take when given a compartment model.\n", + "Our use one of the simplest model, an SIR model with birth and death\n", + "processes, which is an extension of the one in `sir`. First, we\n", + "initialize the model below.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[2\\]: ode = common_models.SIR_Birth_Death()\n", + "\n", + "In \\[3\\]: print(ode.get_ode_eqn())\n", + "\n", + "## Obtaining the R0\n", + "\n", + "The reproduction number, also known as the $R_{0}$, is the single most\n", + "powerful piece and reduced piece of information available from a\n", + "compartmental model. In a nutshell, it provides a single number - if the\n", + "parameters are known - which can the intuitive interpretation where\n", + "$R_{0} = 1$ defines the tipping point of an outbreak. A $R_{0}$ value of\n", + "more than one signifies an potential outbreak where less than one\n", + "indicates that the disease will stop spreading naturally.\n", + "\n", + "To obtain the $R_{0}$, we simply have to tell the function which states\n", + "represent the *disease state*, which in this case is the state **I**.\n", + "\n", + "In \\[1\\]: from pygom.model.epi_analysis import \\*\n", + "\n", + "In \\[2\\]: print(R0(ode, 'I'))\n", + "\n", + "## Algebraic R0\n", + "\n", + "We may also wish to get the $R_{0}$ in pure algebraic term. This can be\n", + "achieved by the following few lines. Note that the result below is\n", + "slightly different from the one above. The difference is due to the\n", + "internal working of the functions, where `getR0` computes the\n", + "disease-free equilibrium value for the states and substitute them back\n", + "into the equation.\n", + "\n", + "In \\[1\\]: F, V = disease_progression_matrices(ode, 'I')\n", + "\n", + "In \\[2\\]: e = R0_from_matrix(F, V)\n", + "\n", + "In \\[3\\]: print(e)\n", + "\n", + "To replicate the output before, we have to find the values where the\n", + "disease-free equilibrium will be achieved. Substitution can then be\n", + "performed to retrieve $R_{0}$ in pure parameters.\n", + "\n", + "In \\[1\\]: dfe = DFE(ode, \\['I'\\])\n", + "\n", + "In \\[2\\]: print(dfe)\n", + "\n", + "In \\[3\\]: print(e\\[0\\].subs(dfe))" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.md new file mode 100644 index 00000000..d10988f1 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epi.md @@ -0,0 +1,65 @@ +# Simple Epidemic Analysis {#epi} + +A common application of ordinary differential equations is in the field +of epidemiology modeling. More concretely, compartmental models that is +used to describe disease progression. We demonstrate some of the simple +algebraic analysis one may wish to take when given a compartment model. +Our use one of the simplest model, an SIR model with birth and death +processes, which is an extension of the one in `sir`{.interpreted-text +role="ref"}. First, we initialize the model below. + +::: {.ipython} +In \[1\]: from pygom import common_models + +In \[2\]: ode = common_models.SIR_Birth_Death() + +In \[3\]: print(ode.get_ode_eqn()) +::: + +## Obtaining the R0 + +The reproduction number, also known as the $R_{0}$, is the single most +powerful piece and reduced piece of information available from a +compartmental model. In a nutshell, it provides a single number - if the +parameters are known - which can the intuitive interpretation where +$R_{0} = 1$ defines the tipping point of an outbreak. A $R_{0}$ value of +more than one signifies an potential outbreak where less than one +indicates that the disease will stop spreading naturally. + +To obtain the $R_{0}$, we simply have to tell the function which states +represent the *disease state*, which in this case is the state **I**. + +::: {.ipython} +In \[1\]: from pygom.model.epi_analysis import \* + +In \[2\]: print(R0(ode, \'I\')) +::: + +## Algebraic R0 + +We may also wish to get the $R_{0}$ in pure algebraic term. This can be +achieved by the following few lines. Note that the result below is +slightly different from the one above. The difference is due to the +internal working of the functions, where `getR0`{.interpreted-text +role="func"} computes the disease-free equilibrium value for the states +and substitute them back into the equation. + +::: {.ipython} +In \[1\]: F, V = disease_progression_matrices(ode, \'I\') + +In \[2\]: e = R0_from_matrix(F, V) + +In \[3\]: print(e) +::: + +To replicate the output before, we have to find the values where the +disease-free equilibrium will be achieved. Substitution can then be +performed to retrieve $R_{0}$ in pure parameters. + +::: {.ipython} +In \[1\]: dfe = DFE(ode, \[\'I\'\]) + +In \[2\]: print(dfe) + +In \[3\]: print(e\[0\].subs(dfe)) +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.ipynb new file mode 100644 index 00000000..1df66d51 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.ipynb @@ -0,0 +1,65 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Reading and using EpiJSON data\n", + "\n", + "Epidemiology data is complicated due to the many different stages a\n", + "patient can go through and whether a modeling technique is applicable\n", + "depends heavily on the recording of data. EpiJSON is a framework whih\n", + "tries to captures all the information [\\[Finnie2016\\]](), in a JSON\n", + "format as the name suggests.\n", + "\n", + "This package provides the functionality to process EpiJSON data. Due to\n", + "the nature of this package, modeling of ode, it processes the data file\n", + "with this in mind. The output is therefore in the cumulative form as\n", + "default, shown below, in a `pandas.DataFrame` format. The input can be\n", + "in a string format, a file or already a `dict`.\n", + "\n", + "In \\[1\\]: from pygom.loss.read_epijson import epijson_to_data_frame\n", + "\n", + "In \\[2\\]: import pkgutil\n", + "\n", + "In \\[3\\]: data = pkgutil.get_data('pygom', 'data/eg1.json')\n", + "\n", + "In \\[3\\]: df = epijson_to_data_frame(data)\n", + "\n", + "In \\[4\\]: print(df)\n", + "\n", + "Given that the aim of loading the data is usually for model fitting, we\n", + "allow EpiJSON as input directly to the loss class\n", + "`pygom.loss.EpijsonLoss` which uses the Poisson loss under the hood.\n", + "\n", + "In \\[1\\]: from pygom.model import common_models\n", + "\n", + "In \\[2\\]: from pygom.loss.epijson_loss import EpijsonLoss\n", + "\n", + "In \\[3\\]: ode = common_models.SIR(\\[0.5, 0.3\\])\n", + "\n", + "In \\[4\\]: obj = EpijsonLoss(\\[0.005, 0.03\\], ode, data, 'Death', 'R',\n", + "\\[300, 2, 0\\])\n", + "\n", + "In \\[5\\]: print(obj.cost())\n", + "\n", + "In \\[6\\]: print(obj.\\_df)\n", + "\n", + "Given an initialized object, all the operations are inherited from\n", + "`pygom.loss.BaseLoss`. We demonstrated above how to calculate the cost\n", + "and the rest will not be shown for brevity. The data frame is stored\n", + "inside of the loss object and can be retrieved for inspection at any\n", + "time point.\n", + "\n", + "Rather unfortunately, initial values for the states is still required,\n", + "but the time is not. When the time is not supplied, then the first time\n", + "point in the data will be treated as $t0$. The input Death indicate which column of the data is used\n", + "and $R$ the corresponding state the data belongs to." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.md new file mode 100644 index 00000000..166bf3f7 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/epijson.md @@ -0,0 +1,58 @@ +# Reading and using EpiJSON data {#epijson} + +Epidemiology data is complicated due to the many different stages a +patient can go through and whether a modeling technique is applicable +depends heavily on the recording of data. EpiJSON is a framework whih +tries to captures all the information [\[Finnie2016\]](), in a JSON +format as the name suggests. + +This package provides the functionality to process EpiJSON data. Due to +the nature of this package, modeling of ode, it processes the data file +with this in mind. The output is therefore in the cumulative form as +default, shown below, in a `pandas.DataFrame`{.interpreted-text +role="class"} format. The input can be in a string format, a file or +already a `dict`{.interpreted-text role="class"}. + +::: {.ipython} +In \[1\]: from pygom.loss.read_epijson import epijson_to_data_frame + +In \[2\]: import pkgutil + +In \[3\]: data = pkgutil.get_data(\'pygom\', \'data/eg1.json\') + +In \[3\]: df = epijson_to_data_frame(data) + +In \[4\]: print(df) +::: + +Given that the aim of loading the data is usually for model fitting, we +allow EpiJSON as input directly to the loss class +`pygom.loss.EpijsonLoss`{.interpreted-text role="class"} which uses the +Poisson loss under the hood. + +::: {.ipython} +In \[1\]: from pygom.model import common_models + +In \[2\]: from pygom.loss.epijson_loss import EpijsonLoss + +In \[3\]: ode = common_models.SIR(\[0.5, 0.3\]) + +In \[4\]: obj = EpijsonLoss(\[0.005, 0.03\], ode, data, \'Death\', +\'R\', \[300, 2, 0\]) + +In \[5\]: print(obj.cost()) + +In \[6\]: print(obj.\_df) +::: + +Given an initialized object, all the operations are inherited from +`pygom.loss.BaseLoss`{.interpreted-text role="class"}. We demonstrated +above how to calculate the cost and the rest will not be shown for +brevity. The data frame is stored inside of the loss object and can be +retrieved for inspection at any time point. + +Rather unfortunately, initial values for the states is still required, +but the time is not. When the time is not supplied, then the first time +point in the data will be treated as $t0$. The input [Death]{.title-ref} +indicate which column of the data is used and $R$ the corresponding +state the data belongs to. diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.ipynb new file mode 100644 index 00000000..332c081f --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.ipynb @@ -0,0 +1,139 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example: Parameter Estimation 1\n", + "\n", + "## Estimation under square loss\n", + "\n", + "To ease the estimation process when given data, a separate module\n", + "`ode_loss` has been constructed for observations coming from a single\n", + "state. We demonstrate how to do it via two examples, first, a standard\n", + "SIR model, then the Legrand SEIHFR model from [\\[Legrand2007\\]]() used\n", + "for Ebola in `estimate2`.\n", + "\n", + "### SIR Model\n", + "\n", + "We set up an SIR model as seen previously in `sir`.\n", + "\n", + "In \\[176\\]: from pygom import SquareLoss, common_models\n", + "\n", + "In \\[179\\]: import numpy\n", + "\n", + "In \\[180\\]: import scipy.integrate\n", + "\n", + "In \\[184\\]: import matplotlib.pyplot\n", + "\n", + "In \\[185\\]: \\# Again, standard SIR model with 2 parameter. See the first\n", + "script!\n", + "\n", + "In \\[191\\]: \\# define the parameters\n", + "\n", + "In \\[192\\]: paramEval = \\[('beta',0.5), ('gamma',1.0/3.0)\\]\n", + "\n", + "In \\[189\\]: \\# initialize the model\n", + "\n", + "In \\[190\\]: ode = common_models.SIR(paramEval)\n", + "\n", + "and we assume that we have perfect information about the $R$\n", + "compartment.\n", + "\n", + "In \\[196\\]: x0 = \\[1, 1.27e-6, 0\\]\n", + "\n", + "In \\[197\\]: \\# Time, including the initial time t0 at t=0\n", + "\n", + "In \\[198\\]: t = numpy.linspace(0, 150, 1000)\n", + "\n", + "In \\[200\\]: \\# Standard. Find the solution.\n", + "\n", + "In \\[201\\]: solution = scipy.integrate.odeint(ode.ode, x0, t)\n", + "\n", + "In \\[202\\]: y = solution\\[:,1:3\\].copy()\n", + "\n", + "Initialize the class with some initial guess\n", + "\n", + "In \\[209\\]: \\# our initial guess\n", + "\n", + "In \\[210\\]: theta = \\[0.2, 0.2\\]\n", + "\n", + "In \\[176\\]: objSIR = SquareLoss(theta, ode, x0, t\\[0\\], t\\[1::\\],\n", + "y\\[1::,:\\], \\['I','R'\\])\n", + "\n", + "Note that we need to provide the initial values, $x_{0}$ and $t_{0}$\n", + "differently to the observations $y$ and the corresponding time $t$.\n", + "Additionally, the state which the observation lies needs to be\n", + "specified. Either a single state, or multiple states are allowed, as\n", + "seen above.\n", + "\n", + "### Difference in gradient\n", + "\n", + "We have provided two different ways of obtaining the gradient, these are\n", + "explained in `gradient` in a bit more detail. First, lets see how\n", + "similar the output of the two methods are\n", + "\n", + "In \\[22\\]: objSIR.sensitivity()\n", + "\n", + "In \\[25\\]: objSIR.adjoint()\n", + "\n", + "and the time required to obtain the gradient for the SIR model under\n", + "$\\theta = (0.2,0.2)$, previously entered.\n", + "\n", + "In \\[22\\]: %timeit objSIR.sensitivity()\n", + "\n", + "In \\[25\\]: %timeit objSIR.adjoint()\n", + "\n", + "Obviously, the amount of time taken for both method is dependent on the\n", + "number of observations as well as the number of states. The effect on\n", + "the adjoint method as the number of observations differs can be quite\n", + "evident. This is because the adjoint method is under a discretization\n", + "which loops in Python where as the forward sensitivity equations are\n", + "solved simply via an integration. As the number of observation gets\n", + "larger, the affect of the Python loop becomes more obvious.\n", + "\n", + "Difference in gradient is larger when there are less observations. This\n", + "is because the adjoint method use interpolations on the output of the\n", + "ode between each consecutive time points. Given solution over the same\n", + "length of time, fewer discretization naturally leads to a less accurate\n", + "interpolation. Note that the interpolation is currently performed using\n", + "univaraite spline, due to the limitation of python packages. Ideally,\n", + "one would prefer to use an (adaptive) Hermite or Chebyshev\n", + "interpolation. Note how we ran the two gradient functions once before\n", + "timing it, that is because we only find the properties (Jacobian,\n", + "gradient) of the ode during runtime.\n", + "\n", + "### Optimized result\n", + "\n", + "Then standard optimization procedures with some suitable initial guess\n", + "should yield the correct result. It is important to set the boundaries\n", + "for compartmental models as we know that all the parameters are strictly\n", + "positive. We put a less restrictive inequality here for demonstration\n", + "purpose.\n", + "\n", + "In \\[211\\]: \\# what we think the bounds are\n", + "\n", + "In \\[212\\]: boxBounds = \\[(0.0,2.0),(0.0,2.0)\\]\n", + "\n", + "Then using the optimization routines in `scipy.optimize`, for example,\n", + "the *SLSQP* method with the gradient obtained by forward sensitivity.\n", + "\n", + "In \\[208\\]: from scipy.optimize import minimize\n", + "\n", + "In \\[213\\]: res = minimize(fun=objSIR.cost, \n", + ".….: jac=objSIR.sensitivity, .….: x0=theta, .….: bounds=boxBounds, .….:\n", + "method='SLSQP')\n", + "\n", + "In \\[214\\]: print(res)\n", + "\n", + "Other methods available in `scipy.optimize.minimize` can also be used,\n", + "such as the *L-BFGS-B* and *TNC*. We can also use methods that accepts\n", + "the exact Hessian such as *trust-ncg* but that should not be necessary\n", + "most of the time." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.md new file mode 100644 index 00000000..05f1fee7 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate1.md @@ -0,0 +1,144 @@ +# Example: Parameter Estimation 1 {#estimate1} + +## Estimation under square loss + +To ease the estimation process when given data, a separate module +`ode_loss`{.interpreted-text role="mod"} has been constructed for +observations coming from a single state. We demonstrate how to do it via +two examples, first, a standard SIR model, then the Legrand SEIHFR model +from [\[Legrand2007\]]() used for Ebola in `estimate2`{.interpreted-text +role="ref"}. + +### SIR Model + +We set up an SIR model as seen previously in `sir`{.interpreted-text +role="ref"}. + +::: {.ipython} +In \[176\]: from pygom import SquareLoss, common_models + +In \[179\]: import numpy + +In \[180\]: import scipy.integrate + +In \[184\]: import matplotlib.pyplot + +In \[185\]: \# Again, standard SIR model with 2 parameter. See the first +script! + +In \[191\]: \# define the parameters + +In \[192\]: paramEval = \[(\'beta\',0.5), (\'gamma\',1.0/3.0)\] + +In \[189\]: \# initialize the model + +In \[190\]: ode = common_models.SIR(paramEval) +::: + +and we assume that we have perfect information about the $R$ +compartment. + +::: {.ipython} +In \[196\]: x0 = \[1, 1.27e-6, 0\] + +In \[197\]: \# Time, including the initial time t0 at t=0 + +In \[198\]: t = numpy.linspace(0, 150, 1000) + +In \[200\]: \# Standard. Find the solution. + +In \[201\]: solution = scipy.integrate.odeint(ode.ode, x0, t) + +In \[202\]: y = solution\[:,1:3\].copy() +::: + +Initialize the class with some initial guess + +::: {.ipython} +In \[209\]: \# our initial guess + +In \[210\]: theta = \[0.2, 0.2\] + +In \[176\]: objSIR = SquareLoss(theta, ode, x0, t\[0\], t\[1::\], +y\[1::,:\], \[\'I\',\'R\'\]) +::: + +Note that we need to provide the initial values, $x_{0}$ and $t_{0}$ +differently to the observations $y$ and the corresponding time $t$. +Additionally, the state which the observation lies needs to be +specified. Either a single state, or multiple states are allowed, as +seen above. + +### Difference in gradient + +We have provided two different ways of obtaining the gradient, these are +explained in `gradient`{.interpreted-text role="ref"} in a bit more +detail. First, lets see how similar the output of the two methods are + +::: {.ipython} +In \[22\]: objSIR.sensitivity() + +In \[25\]: objSIR.adjoint() +::: + +and the time required to obtain the gradient for the SIR model under +$\theta = (0.2,0.2)$, previously entered. + +::: {.ipython} +In \[22\]: %timeit objSIR.sensitivity() + +In \[25\]: %timeit objSIR.adjoint() +::: + +Obviously, the amount of time taken for both method is dependent on the +number of observations as well as the number of states. The effect on +the adjoint method as the number of observations differs can be quite +evident. This is because the adjoint method is under a discretization +which loops in Python where as the forward sensitivity equations are +solved simply via an integration. As the number of observation gets +larger, the affect of the Python loop becomes more obvious. + +Difference in gradient is larger when there are less observations. This +is because the adjoint method use interpolations on the output of the +ode between each consecutive time points. Given solution over the same +length of time, fewer discretization naturally leads to a less accurate +interpolation. Note that the interpolation is currently performed using +univaraite spline, due to the limitation of python packages. Ideally, +one would prefer to use an (adaptive) Hermite or Chebyshev +interpolation. Note how we ran the two gradient functions once before +timing it, that is because we only find the properties (Jacobian, +gradient) of the ode during runtime. + +### Optimized result + +Then standard optimization procedures with some suitable initial guess +should yield the correct result. It is important to set the boundaries +for compartmental models as we know that all the parameters are strictly +positive. We put a less restrictive inequality here for demonstration +purpose. + +::: {.ipython} +In \[211\]: \# what we think the bounds are + +In \[212\]: boxBounds = \[(0.0,2.0),(0.0,2.0)\] +::: + +Then using the optimization routines in +`scipy.optimize`{.interpreted-text role="mod"}, for example, the *SLSQP* +method with the gradient obtained by forward sensitivity. + +::: {.ipython} +In \[208\]: from scipy.optimize import minimize + +In \[213\]: res = minimize(fun=objSIR.cost, + +: \.....: jac=objSIR.sensitivity, \.....: x0=theta, \.....: + bounds=boxBounds, \.....: method=\'SLSQP\') + +In \[214\]: print(res) +::: + +Other methods available in `scipy.optimize.minimize`{.interpreted-text +role="func"} can also be used, such as the *L-BFGS-B* and *TNC*. We can +also use methods that accepts the exact Hessian such as *trust-ncg* but +that should not be necessary most of the time. diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.ipynb new file mode 100644 index 00000000..898eb686 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.ipynb @@ -0,0 +1,324 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example: Parameter Estimation 2\n", + "\n", + "Continuing from the `estimate1`, we show why estimating the parameters\n", + "for ode's are hard. This is especially true if there is a lack of data\n", + "or when there are too much flexibility in the model. Note that for\n", + "reproducibility purposes, only deterministic models are used here and a\n", + "fixed seed whenever a stochastic algorithm is needed.\n", + "\n", + "## Standard SEIR model\n", + "\n", + "We demonstrate the estimation on the recent Ebola outbreak in West\n", + "Africa. We use the number of deaths in Guinea and its corresponding time\n", + "the data was recorded. These data are publicly available and they can be\n", + "obtained easily on the internet such as\n", + ". It is stated out here for\n", + "simplicity.\n", + "\n", + "In \\[34\\]: \\# the number of deaths and cases in Guinea\n", + "\n", + "In \\[35\\]: yDeath = \\[29.0, 59.0, 60.0, 62.0, 66.0, 70.0, 70.0, 80.0, 83.0, 86.0, 95.0, 101.0, 106.0, 108.0, \n", + ".…: 122.0, 129.0, 136.0, 141.0, 143.0, 149.0, 155.0, 157.0, 158.0,\n", + "157.0, 171.0, 174.0, .…: 186.0, 193.0, 208.0, 215.0, 226.0, 264.0,\n", + "267.0, 270.0, 303.0, 305.0, 307.0, 309.0, .…: 304.0, 310.0, 310.0,\n", + "314.0, 319.0, 339.0, 346.0, 358.0, 363.0, 367.0, 373.0, 377.0, .…:\n", + "380.0, 394.0, 396.0, 406.0, 430.0, 494.0, 517.0, 557.0, 568.0, 595.0,\n", + "601.0, 632.0, .…: 635.0, 648.0, 710.0, 739.0, 768.0, 778.0, 843.0,\n", + "862.0, 904.0, 926.0, 997.0\\]\n", + "\n", + "In \\[35\\]: yCase = \\[49.0, 86.0, 86.0, 86.0, 103.0, 112.0, 112.0, 122.0, 127.0, 143.0, 151.0, 158.0, \n", + ".…: 159.0, 168.0, 197.0, 203.0, 208.0, 218.0, 224.0, 226.0, 231.0,\n", + "235.0, 236.0, .…: 233.0, 248.0, 258.0, 281.0, 291.0, 328.0, 344.0,\n", + "351.0, 398.0, 390.0, 390.0, .…: 413.0, 412.0, 408.0, 409.0, 406.0,\n", + "411.0, 410.0, 415.0, 427.0, 460.0, 472.0, .…: 485.0, 495.0, 495.0,\n", + "506.0, 510.0, 519.0, 543.0, 579.0, 607.0, 648.0, 771.0, .…: 812.0,\n", + "861.0, 899.0, 936.0, 942.0, 1008.0, 1022.0, 1074.0, 1157.0, 1199.0,\n", + "1298.0, .…: 1350.0, 1472.0, 1519.0, 1540.0, 1553.0, 1906.0\\]\n", + "\n", + "In \\[36\\]: \\# the corresponding time\n", + "\n", + "In \\[37\\]: t = \\[0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0, 13.0, 16.0, 18.0, 20.0, 23.0, 25.0, 26.0, 29.0, \n", + ".…: 32.0, 35.0, 40.0, 42.0, 44.0, 46.0, 49.0, 51.0, 62.0, 66.0, 67.0,\n", + "71.0, 73.0, 80.0, 86.0, 88.0, .…: 90.0, 100.0, 102.0, 106.0, 108.0,\n", + "112.0, 114.0, 117.0, 120.0, 123.0, 126.0, 129.0, 132.0, 135.0, .…:\n", + "137.0, 140.0, 142.0, 144.0, 147.0, 149.0, 151.0, 157.0, 162.0, 167.0,\n", + "169.0, 172.0, 175.0, 176.0, .…: 181.0, 183.0, 185.0, 190.0, 193.0,\n", + "197.0, 199.0, 204.0, 206.0, 211.0, 213.0, 218.0\\]\n", + "\n", + "### Simple estimation\n", + "\n", + "First ,we are going to fit a standard **SEIR** model to the data.\n", + "Details of the models can be found in `common_models` Defining the model\n", + "as usual with some random guess on what the parameters might be, here,\n", + "we choose the values to be the mid point of our feasible region (defined\n", + "by our box constraints later)\n", + "\n", + "In \\[1\\]: from pygom import SquareLoss, common_models\n", + "\n", + "In \\[1\\]: import numpy, scipy.optimize\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: theta = numpy.array(\\[5.0, 5.0, 5.0\\])\n", + "\n", + "In \\[2\\]: ode = common_models.SEIR(theta)\n", + "\n", + "In \\[3\\]: population = 1175e4\n", + "\n", + "In \\[4\\]: y = numpy.reshape(numpy.append(numpy.array(yCase),\n", + "numpy.array(yDeath)), (len(yCase),2), 'F')/population\n", + "\n", + "In \\[5\\]: x0 = \\[1., 0., 49.0/population, 29.0/population\\]\n", + "\n", + "In \\[6\\]: t0 = t\\[0\\]\n", + "\n", + "In \\[7\\]: objLegrand = SquareLoss(theta, ode, x0, t0, t\\[1::\\],\n", + "y\\[1::,:\\], \\['I','R'\\], numpy.sqrt(\\[population\\]\\*2))\n", + "\n", + "Then we optimize, first, assuming that the initial conditions are\n", + "accurate. Some relatively large bounds are used for this particular\n", + "problem.\n", + "\n", + "In \\[8\\]: boxBounds = \\[ (0.0,10.0), (0.0,10.0), (0.0,10.0) \\]\n", + "\n", + "In \\[9\\]: res = scipy.optimize.minimize(fun=objLegrand.cost, \n", + "...: jac=objLegrand.sensitivity, ...: x0=theta, ...: bounds=boxBounds,\n", + "...: method='l-bfgs-b')\n", + "\n", + "In \\[10\\]: print(res)\n", + "\n", + "In \\[11\\]: f = plt.figure()\n", + "\n", + "@savefig ebola_seir_straight.png In \\[12\\]: objLegrand.plot()\n", + "\n", + "In \\[13\\]: plt.close()\n", + "\n", + "We can see from our visual confirmation that the estimated parameters\n", + "are not exactly ideal. This is confirmed by the information returned\n", + "from the `scipy.optimize.minimize` routine, and probably caused by the\n", + "poor starting point. An attempt to find a more suitable value can be\n", + "done by some form of parameter space exploration. Given that the\n", + "evaluation of the objective function is not expensive here, we have\n", + "plenty of options to choose from. To reduce the number of packages\n", + "required to build this documentation, routines from `scipy.optimize`\n", + "remains our preferred option.\n", + "\n", + "### Improved initial guess\n", + "\n", + "In \\[8\\]: resDE = scipy.optimize.differential_evolution(objLegrand.cost,\n", + "bounds=boxBounds, polish=False, seed=20921391)\n", + "\n", + "In \\[9\\]: print(objLegrand.sensitivity(resDE\\['x'\\]))\n", + "\n", + "In \\[10\\]: f = plt.figure()\n", + "\n", + "@savefig ebola_seir_de.png In \\[11\\]: objLegrand.plot()\n", + "\n", + "In \\[12\\]: plt.close()\n", + "\n", + "Looking at the output of the estimates (below this paragraph), we can\n", + "see our inference on Ebola is wrong when compared to the *known* values\n", + "(from field observation) even though the graphs looks *\\`\\`reasonable\"*.\n", + "Namely, $\\gamma^{-1}$ the third element in the vector below, our time\n", + "from infectious to death, is within the expected range but $\\alpha^{-1}$\n", + "(second element), the incubation period, is a lot higher than expected.\n", + "\n", + "In \\[1\\]: 1/resDE\\['x'\\]\n", + "\n", + "### Multimodal surface\n", + "\n", + "A reason for this type of behavior is that we simply lack the\n", + "information/data to make proper inference. Without data on the state\n", + "$E$, the parameters $\\beta,\\alpha$ for the two states $I$ and $E$ are\n", + "dependent only on observations on $I$. Hence, some other random\n", + "combination of $\\beta,\\alpha$ that is capable of generating realization\n", + "close to observations in $I$ is feasible. In such cases, the only\n", + "requirement is that there exist some $\\gamma$ in the feasible region\n", + "that can compensate for the ill suited $\\beta,\\alpha$. For example, we\n", + "know (obtained elsewhere and not shown here) that there is another set\n", + "of parameters capable of generating a similar looking curves as before.\n", + "Note the reversal of magnitude in $\\beta$ and $\\alpha$.\n", + "\n", + "In \\[11\\]: objLegrand.cost(\\[3.26106524e+00, 2.24798702e-04,\n", + "1.23660721e-02\\])\n", + "\n", + "In \\[12\\]: \\#\\# objLegrand.cost(\\[ 0.02701867, 9.00004776, 0.01031861\\])\n", + "\\# similar graph\n", + "\n", + "@savefig ebola_seir_prior.png In \\[13\\]: objLegrand.plot()\n", + "\n", + "In \\[14\\]: plt.close()\n", + "\n", + "### With initial values as parameters\n", + "\n", + "Obviously, the assumption that the whole population being susceptible is\n", + "an overestimate. We now try to estimate the initial conditions of the\n", + "ode as well. Given previous estimates of the parameters\n", + "$\\hat{\\beta}, \\hat{\\alpha}, \\hat{\\gamma}$ it is appropriate to start our\n", + "initial guess there.\n", + "\n", + "Furthermore, given that we now estimate the initial values for all the\n", + "states, we can use the first time point as our observation. So our time\n", + "begins at $t = -1$ where our observations include the previous initial\n", + "condition, i.e. 49 and 29 for the number of cases and death at $t = 0$\n", + "respectively. The following code block demonstrates how we would do\n", + "that; feel free to try it out yourself to see the much improved result.\n", + "\n", + "In \\[1\\]: thetaIV = theta.tolist() + x0\n", + "\n", + "In \\[2\\]: thetaIV\\[3\\] -= 1e-8 \\# to make sure that the initial guess\n", + "satisfy the constraints\n", + "\n", + "In \\[3\\]: boxBoundsIV = boxBounds + \\[(0.,1.), (0.,1.), (0.,1.),\n", + "(0.,1.)\\]\n", + "\n", + "In \\[4\\]: objLegrand = SquareLoss(theta, ode, x0, -1, t, y, \\['I','R'\\],\n", + "numpy.sqrt(\\[population\\]\\*2))\n", + "\n", + "In \\[5\\]: resDEIV =\n", + "scipy.optimize.differential_evolution(objLegrand.costIV,\n", + "bounds=boxBoundsIV, polish=False, seed=20921391)\n", + "\n", + "In \\[6\\]: print(resDEIV)\n", + "\n", + "In \\[7\\]: f = plt.figure()\n", + "\n", + "In \\[8\\]: objLegrand.plot()\n", + "\n", + "In \\[9\\]: plt.close()\n", + "\n", + "## Legrand Ebola SEIHFR Model\n", + "\n", + "Next, we demonstrate the estimation on a model that is widely used in\n", + "the recent Ebola outbreak in west Africa. Again, the model has been\n", + "defined in `.common_models` already.\n", + "\n", + "In \\[1\\]: ode = common_models.Legrand_Ebola_SEIHFR()\n", + "\n", + "In \\[27\\]: \\# initial guess from the paper that studied the outbreak in\n", + "Congo\n", + "\n", + "In \\[28\\]: theta = numpy.array(\\[0.588,0.794,7.653, \\#\\#\\# the beta \n", + ".…: 10.0,9.6,5.0,2.0, \\#\\#\\# the omega .…: 7.0,0.81,0.80, \\#\\#\\# alpha,\n", + "delta, theta .…: 100.,1.0\\]) \\#\\#\\# kappa,intervention time\n", + "\n", + "In \\[29\\]: \\# initial conditions, note that we have a 0.0 at the end\n", + "because the model is a non-automonous ode which we have converted the\n", + "time component out\n", + "\n", + "In \\[30\\]: x0 = numpy.array(\\[population, 0.0, 49.0, 0.0, 0.0, 29.0,\n", + "0.0\\])/population\n", + "\n", + "In \\[30\\]: ode.parameters = theta\n", + "\n", + "In \\[31\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[32\\]: objLegrand = SquareLoss(theta, ode, x0, t\\[0\\], t\\[1::\\],\n", + "y\\[1::,:\\], \\['I','R'\\], numpy.sqrt(\\[population\\]\\*2))\n", + "\n", + "Now, it is important to set additional constraints accurately because a\n", + "simply box constraint is much larger than the feasible set. Namely,\n", + "$\\omega_{I}, \\omega_{D}$ are the time taken from onset until end of\n", + "infectious/death, which has to be bigger than $\\omega_{H}$, onset to\n", + "hospitalization given the nature of the disease. Therefore, we create\n", + "extra inequality constraints in addition to the box constraints\n", + "\n", + "In \\[549\\]: boxBounds = \\[ \n", + ".….: (0.001, 100.), \\# beta_I .….: (0.001, 100.), \\# beta_H .….: (0.001,\n", + "100.), \\# beta_F .….: (0.001, 100.), \\# omega_I .….: (0.001, 100.), \\#\n", + "omega_D .….: (0.001, 100.), \\# omega_H .….: (0.001, 100.), \\# omega_F\n", + ".….: (0.001, 100.), \\# alpha^{-1} .….: (0.0001, 1.), \\# delta .….:\n", + "(0.0001, 1.), \\# theta .….: (0.001, 1000.), \\# kappa .….: (0.,218.) \\#\n", + "intervention tine .….: \\]\n", + "\n", + "In \\[550\\]: cons = ({'type': 'ineq', 'fun' : lambda x:\n", + "numpy.array(\\[x\\[3\\]-x\\[5\\], x\\[4\\]-x\\[5\\]\\])})\n", + "\n", + "We can now try to find the optimal values, but because this is a\n", + "difficult problem that can take a very long time without guarantee on\n", + "the quality of solution\n", + "\n", + "In \\[213\\]: res = scipy.optimize.minimize(fun=objLegrand.cost, \n", + ".….: jac=objLegrand.sensitivity, .….: x0=theta, .….: constraints=cons,\n", + ".….: bounds=boxBounds, .….: method='SLSQP')\n", + "\n", + "In \\[214\\]: print(res)\n", + "\n", + "In \\[215\\]: f = plt.figure()\n", + "\n", + "@savefig ebola_legrand_runtime.png In \\[216\\]: objLegrand.plot()\n", + "\n", + "In \\[217\\]: plt.close()\n", + "\n", + "Evidently, the estimated parameters are very much unrealistic given that\n", + "a lot of them are near the boundaries. It is also known from other\n", + "sources that some of the epidemiology properties of Ebola, with\n", + "incubation period of around 2 weeks and a mortality rate of around 80\n", + "percent.\n", + "\n", + "As the estimate does not appear to provide anything sensible, we also\n", + "provide a set of values previously obtained (that looks semi-reasonable)\n", + "here plot the epidemic curve with the observations layered on top\n", + "\n", + "In \\[1\\]: theta = numpy.array(\\[3.96915071e-02, 1.72302620e+01, 1.99749990e+01, \n", + "...: 2.67759445e+01, 4.99999990e+01, 5.56122691e+00, ...:\n", + "4.99999990e+01, 8.51599523e+00, 9.99999000e-01, ...: 1.00000000e-06,\n", + "3.85807562e+00, 1.88385318e+00\\])\n", + "\n", + "In \\[2\\]: print(objLegrand.cost(theta))\n", + "\n", + "In \\[2\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "In \\[3\\]: f, axarr = plt.subplots(2,3)\n", + "\n", + "In \\[4\\]: axarr\\[0,0\\].plot(t, solution\\[:,0\\]);\n", + "\n", + "In \\[5\\]: axarr\\[0,0\\].set_title('Susceptible');\n", + "\n", + "In \\[6\\]: axarr\\[0,1\\].plot(t, solution\\[:,1\\]);\n", + "\n", + "In \\[7\\]: axarr\\[0,1\\].set_title('Exposed');\n", + "\n", + "In \\[8\\]: axarr\\[0,2\\].plot(t, solution\\[:,2\\]);\n", + "\n", + "In \\[9\\]: axarr\\[0,2\\].plot(t, y\\[:,0\\], 'r');\n", + "\n", + "In \\[10\\]: axarr\\[0,2\\].set_title('Infectious');\n", + "\n", + "In \\[11\\]: axarr\\[1,0\\].plot(t, solution\\[:,3\\]);\n", + "\n", + "In \\[12\\]: axarr\\[1,0\\].set_title('Hospitalised');\n", + "\n", + "In \\[13\\]: axarr\\[1,1\\].plot(t, solution\\[:,4\\]);\n", + "\n", + "In \\[14\\]: axarr\\[1,1\\].set_title('Awaiting Burial');\n", + "\n", + "In \\[15\\]: axarr\\[1,2\\].plot(t, solution\\[:,5\\]);\n", + "\n", + "In \\[16\\]: axarr\\[1,2\\].plot(t, y\\[:,1\\], 'r');\n", + "\n", + "In \\[17\\]: axarr\\[1,2\\].set_title('Removed');\n", + "\n", + "In \\[18\\]: f.text(0.5, 0.04, 'Days from outbreak', ha='center');\n", + "\n", + "In \\[19\\]: f.text(0.01, 0.5, 'Population', va='center',\n", + "rotation='vertical');\n", + "\n", + "In \\[20\\]: f.tight_layout();\n", + "\n", + "@savefig ebola_seihfr_straight_prior.png In \\[21\\]: plt.show()\n", + "\n", + "In \\[22\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.md new file mode 100644 index 00000000..aae49819 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/estimate2.md @@ -0,0 +1,353 @@ +# Example: Parameter Estimation 2 {#estimate2} + +Continuing from the `estimate1`{.interpreted-text role="ref"}, we show +why estimating the parameters for ode\'s are hard. This is especially +true if there is a lack of data or when there are too much flexibility +in the model. Note that for reproducibility purposes, only deterministic +models are used here and a fixed seed whenever a stochastic algorithm is +needed. + +## Standard SEIR model + +We demonstrate the estimation on the recent Ebola outbreak in West +Africa. We use the number of deaths in Guinea and its corresponding time +the data was recorded. These data are publicly available and they can be +obtained easily on the internet such as +. It is stated out here for +simplicity. + +::: {.ipython} +In \[34\]: \# the number of deaths and cases in Guinea + +In \[35\]: yDeath = \[29.0, 59.0, 60.0, 62.0, 66.0, 70.0, 70.0, 80.0, 83.0, 86.0, 95.0, 101.0, 106.0, 108.0, + +: \....: 122.0, 129.0, 136.0, 141.0, 143.0, 149.0, 155.0, 157.0, + 158.0, 157.0, 171.0, 174.0, \....: 186.0, 193.0, 208.0, 215.0, + 226.0, 264.0, 267.0, 270.0, 303.0, 305.0, 307.0, 309.0, \....: + 304.0, 310.0, 310.0, 314.0, 319.0, 339.0, 346.0, 358.0, 363.0, + 367.0, 373.0, 377.0, \....: 380.0, 394.0, 396.0, 406.0, 430.0, + 494.0, 517.0, 557.0, 568.0, 595.0, 601.0, 632.0, \....: 635.0, + 648.0, 710.0, 739.0, 768.0, 778.0, 843.0, 862.0, 904.0, 926.0, + 997.0\] + +In \[35\]: yCase = \[49.0, 86.0, 86.0, 86.0, 103.0, 112.0, 112.0, 122.0, 127.0, 143.0, 151.0, 158.0, + +: \....: 159.0, 168.0, 197.0, 203.0, 208.0, 218.0, 224.0, 226.0, + 231.0, 235.0, 236.0, \....: 233.0, 248.0, 258.0, 281.0, 291.0, + 328.0, 344.0, 351.0, 398.0, 390.0, 390.0, \....: 413.0, 412.0, + 408.0, 409.0, 406.0, 411.0, 410.0, 415.0, 427.0, 460.0, 472.0, + \....: 485.0, 495.0, 495.0, 506.0, 510.0, 519.0, 543.0, 579.0, + 607.0, 648.0, 771.0, \....: 812.0, 861.0, 899.0, 936.0, 942.0, + 1008.0, 1022.0, 1074.0, 1157.0, 1199.0, 1298.0, \....: 1350.0, + 1472.0, 1519.0, 1540.0, 1553.0, 1906.0\] + +In \[36\]: \# the corresponding time + +In \[37\]: t = \[0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0, 13.0, 16.0, 18.0, 20.0, 23.0, 25.0, 26.0, 29.0, + +: \....: 32.0, 35.0, 40.0, 42.0, 44.0, 46.0, 49.0, 51.0, 62.0, 66.0, + 67.0, 71.0, 73.0, 80.0, 86.0, 88.0, \....: 90.0, 100.0, 102.0, + 106.0, 108.0, 112.0, 114.0, 117.0, 120.0, 123.0, 126.0, 129.0, + 132.0, 135.0, \....: 137.0, 140.0, 142.0, 144.0, 147.0, 149.0, + 151.0, 157.0, 162.0, 167.0, 169.0, 172.0, 175.0, 176.0, \....: + 181.0, 183.0, 185.0, 190.0, 193.0, 197.0, 199.0, 204.0, 206.0, + 211.0, 213.0, 218.0\] +::: + +### Simple estimation + +First ,we are going to fit a standard **SEIR** model to the data. +Details of the models can be found in `common_models`{.interpreted-text +role="mod"} Defining the model as usual with some random guess on what +the parameters might be, here, we choose the values to be the mid point +of our feasible region (defined by our box constraints later) + +::: {.ipython} +In \[1\]: from pygom import SquareLoss, common_models + +In \[1\]: import numpy, scipy.optimize + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: theta = numpy.array(\[5.0, 5.0, 5.0\]) + +In \[2\]: ode = common_models.SEIR(theta) + +In \[3\]: population = 1175e4 + +In \[4\]: y = numpy.reshape(numpy.append(numpy.array(yCase), +numpy.array(yDeath)), (len(yCase),2), \'F\')/population + +In \[5\]: x0 = \[1., 0., 49.0/population, 29.0/population\] + +In \[6\]: t0 = t\[0\] + +In \[7\]: objLegrand = SquareLoss(theta, ode, x0, t0, t\[1::\], +y\[1::,:\], \[\'I\',\'R\'\], numpy.sqrt(\[population\]\*2)) +::: + +Then we optimize, first, assuming that the initial conditions are +accurate. Some relatively large bounds are used for this particular +problem. + +::: {.ipython} +In \[8\]: boxBounds = \[ (0.0,10.0), (0.0,10.0), (0.0,10.0) \] + +In \[9\]: res = scipy.optimize.minimize(fun=objLegrand.cost, + +: \...: jac=objLegrand.sensitivity, \...: x0=theta, \...: + bounds=boxBounds, \...: method=\'l-bfgs-b\') + +In \[10\]: print(res) + +In \[11\]: f = plt.figure() + +\@savefig ebola_seir_straight.png In \[12\]: objLegrand.plot() + +In \[13\]: plt.close() +::: + +We can see from our visual confirmation that the estimated parameters +are not exactly ideal. This is confirmed by the information returned +from the `scipy.optimize.minimize`{.interpreted-text role="func"} +routine, and probably caused by the poor starting point. An attempt to +find a more suitable value can be done by some form of parameter space +exploration. Given that the evaluation of the objective function is not +expensive here, we have plenty of options to choose from. To reduce the +number of packages required to build this documentation, routines from +`scipy.optimize`{.interpreted-text role="mod"} remains our preferred +option. + +### Improved initial guess + +::: {.ipython} +In \[8\]: resDE = scipy.optimize.differential_evolution(objLegrand.cost, +bounds=boxBounds, polish=False, seed=20921391) + +In \[9\]: print(objLegrand.sensitivity(resDE\[\'x\'\])) + +In \[10\]: f = plt.figure() + +\@savefig ebola_seir_de.png In \[11\]: objLegrand.plot() + +In \[12\]: plt.close() +::: + +Looking at the output of the estimates (below this paragraph), we can +see our inference on Ebola is wrong when compared to the *known* values +(from field observation) even though the graphs looks +*\`\`reasonable\"*. Namely, $\gamma^{-1}$ the third element in the +vector below, our time from infectious to death, is within the expected +range but $\alpha^{-1}$ (second element), the incubation period, is a +lot higher than expected. + +::: {.ipython} +In \[1\]: 1/resDE\[\'x\'\] +::: + +### Multimodal surface + +A reason for this type of behavior is that we simply lack the +information/data to make proper inference. Without data on the state +$E$, the parameters $\beta,\alpha$ for the two states $I$ and $E$ are +dependent only on observations on $I$. Hence, some other random +combination of $\beta,\alpha$ that is capable of generating realization +close to observations in $I$ is feasible. In such cases, the only +requirement is that there exist some $\gamma$ in the feasible region +that can compensate for the ill suited $\beta,\alpha$. For example, we +know (obtained elsewhere and not shown here) that there is another set +of parameters capable of generating a similar looking curves as before. +Note the reversal of magnitude in $\beta$ and $\alpha$. + +::: {.ipython} +In \[11\]: objLegrand.cost(\[3.26106524e+00, 2.24798702e-04, +1.23660721e-02\]) + +In \[12\]: \#\# objLegrand.cost(\[ 0.02701867, 9.00004776, 0.01031861\]) +\# similar graph + +\@savefig ebola_seir_prior.png In \[13\]: objLegrand.plot() + +In \[14\]: plt.close() +::: + +### With initial values as parameters + +Obviously, the assumption that the whole population being susceptible is +an overestimate. We now try to estimate the initial conditions of the +ode as well. Given previous estimates of the parameters +$\hat{\beta}, \hat{\alpha}, \hat{\gamma}$ it is appropriate to start our +initial guess there. + +Furthermore, given that we now estimate the initial values for all the +states, we can use the first time point as our observation. So our time +begins at $t = -1$ where our observations include the previous initial +condition, i.e. 49 and 29 for the number of cases and death at $t = 0$ +respectively. The following code block demonstrates how we would do +that; feel free to try it out yourself to see the much improved result. + +::: {.ipython verbatim=""} +In \[1\]: thetaIV = theta.tolist() + x0 + +In \[2\]: thetaIV\[3\] -= 1e-8 \# to make sure that the initial guess +satisfy the constraints + +In \[3\]: boxBoundsIV = boxBounds + \[(0.,1.), (0.,1.), (0.,1.), +(0.,1.)\] + +In \[4\]: objLegrand = SquareLoss(theta, ode, x0, -1, t, y, +\[\'I\',\'R\'\], numpy.sqrt(\[population\]\*2)) + +In \[5\]: resDEIV = +scipy.optimize.differential_evolution(objLegrand.costIV, +bounds=boxBoundsIV, polish=False, seed=20921391) + +In \[6\]: print(resDEIV) + +In \[7\]: f = plt.figure() + +In \[8\]: objLegrand.plot() + +In \[9\]: plt.close() +::: + +## Legrand Ebola SEIHFR Model + +Next, we demonstrate the estimation on a model that is widely used in +the recent Ebola outbreak in west Africa. Again, the model has been +defined in `.common_models`{.interpreted-text role="mod"} already. + +::: {.ipython} +In \[1\]: ode = common_models.Legrand_Ebola_SEIHFR() + +In \[27\]: \# initial guess from the paper that studied the outbreak in +Congo + +In \[28\]: theta = numpy.array(\[0.588,0.794,7.653, \#\#\# the beta + +: \....: 10.0,9.6,5.0,2.0, \#\#\# the omega \....: 7.0,0.81,0.80, + \#\#\# alpha, delta, theta \....: 100.,1.0\]) \#\#\# + kappa,intervention time + +In \[29\]: \# initial conditions, note that we have a 0.0 at the end +because the model is a non-automonous ode which we have converted the +time component out + +In \[30\]: x0 = numpy.array(\[population, 0.0, 49.0, 0.0, 0.0, 29.0, +0.0\])/population + +In \[30\]: ode.parameters = theta + +In \[31\]: ode.initial_values = (x0, t\[0\]) + +In \[32\]: objLegrand = SquareLoss(theta, ode, x0, t\[0\], t\[1::\], +y\[1::,:\], \[\'I\',\'R\'\], numpy.sqrt(\[population\]\*2)) +::: + +Now, it is important to set additional constraints accurately because a +simply box constraint is much larger than the feasible set. Namely, +$\omega_{I}, \omega_{D}$ are the time taken from onset until end of +infectious/death, which has to be bigger than $\omega_{H}$, onset to +hospitalization given the nature of the disease. Therefore, we create +extra inequality constraints in addition to the box constraints + +::: {.ipython} + +In \[549\]: boxBounds = \[ + +: \.....: (0.001, 100.), \# beta_I \.....: (0.001, 100.), \# beta_H + \.....: (0.001, 100.), \# beta_F \.....: (0.001, 100.), \# omega_I + \.....: (0.001, 100.), \# omega_D \.....: (0.001, 100.), \# omega_H + \.....: (0.001, 100.), \# omega_F \.....: (0.001, 100.), \# + alpha\^{-1} \.....: (0.0001, 1.), \# delta \.....: (0.0001, 1.), \# + theta \.....: (0.001, 1000.), \# kappa \.....: (0.,218.) \# + intervention tine \.....: \] + +In \[550\]: cons = ({\'type\': \'ineq\', \'fun\' : lambda x: +numpy.array(\[x\[3\]-x\[5\], x\[4\]-x\[5\]\])}) +::: + +We can now try to find the optimal values, but because this is a +difficult problem that can take a very long time without guarantee on +the quality of solution + +::: {.ipython okexcept="" okwarning=""} + +In \[213\]: res = scipy.optimize.minimize(fun=objLegrand.cost, + +: \.....: jac=objLegrand.sensitivity, \.....: x0=theta, \.....: + constraints=cons, \.....: bounds=boxBounds, \.....: + method=\'SLSQP\') + +In \[214\]: print(res) + +In \[215\]: f = plt.figure() + +\@savefig ebola_legrand_runtime.png In \[216\]: objLegrand.plot() + +In \[217\]: plt.close() +::: + +Evidently, the estimated parameters are very much unrealistic given that +a lot of them are near the boundaries. It is also known from other +sources that some of the epidemiology properties of Ebola, with +incubation period of around 2 weeks and a mortality rate of around 80 +percent. + +As the estimate does not appear to provide anything sensible, we also +provide a set of values previously obtained (that looks semi-reasonable) +here plot the epidemic curve with the observations layered on top + +::: {.ipython okexcept="" okwarning=""} + +In \[1\]: theta = numpy.array(\[3.96915071e-02, 1.72302620e+01, 1.99749990e+01, + +: \...: 2.67759445e+01, 4.99999990e+01, 5.56122691e+00, \...: + 4.99999990e+01, 8.51599523e+00, 9.99999000e-01, \...: + 1.00000000e-06, 3.85807562e+00, 1.88385318e+00\]) + +In \[2\]: print(objLegrand.cost(theta)) + +In \[2\]: solution = ode.integrate(t\[1::\]) + +In \[3\]: f, axarr = plt.subplots(2,3) + +In \[4\]: axarr\[0,0\].plot(t, solution\[:,0\]); + +In \[5\]: axarr\[0,0\].set_title(\'Susceptible\'); + +In \[6\]: axarr\[0,1\].plot(t, solution\[:,1\]); + +In \[7\]: axarr\[0,1\].set_title(\'Exposed\'); + +In \[8\]: axarr\[0,2\].plot(t, solution\[:,2\]); + +In \[9\]: axarr\[0,2\].plot(t, y\[:,0\], \'r\'); + +In \[10\]: axarr\[0,2\].set_title(\'Infectious\'); + +In \[11\]: axarr\[1,0\].plot(t, solution\[:,3\]); + +In \[12\]: axarr\[1,0\].set_title(\'Hospitalised\'); + +In \[13\]: axarr\[1,1\].plot(t, solution\[:,4\]); + +In \[14\]: axarr\[1,1\].set_title(\'Awaiting Burial\'); + +In \[15\]: axarr\[1,2\].plot(t, solution\[:,5\]); + +In \[16\]: axarr\[1,2\].plot(t, y\[:,1\], \'r\'); + +In \[17\]: axarr\[1,2\].set_title(\'Removed\'); + +In \[18\]: f.text(0.5, 0.04, \'Days from outbreak\', ha=\'center\'); + +In \[19\]: f.text(0.01, 0.5, \'Population\', va=\'center\', +rotation=\'vertical\'); + +In \[20\]: f.tight_layout(); + +\@savefig ebola_seihfr_straight_prior.png In \[21\]: plt.show() + +In \[22\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.ipynb new file mode 100644 index 00000000..016ed7b5 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.ipynb @@ -0,0 +1,83 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Frequent asked questions\n", + "\n", + "## Code runs slowly\n", + "\n", + "This is because the package is not optimized for speed. Although the\n", + "some of the main functions are lambdified using `sympy` or compiled\n", + "against `cython` when available, there are many more optimization that\n", + "can be done. One example is the lines:\n", + "\n", + "in `.DeterministicOde.evalSensitivity`. The first two operations can be\n", + "inlined into the third and the third line itself can be rewritten as:\n", + "\n", + "and save the explicit copy operation by `numpy` when making A. If\n", + "desired, we could have also made used of the `numexpr` package that\n", + "provides further speed up on elementwise operations in place of numpy.\n", + "\n", + "## Why not compile the numeric computation form sympy against Theano\n", + "\n", + "Setup of the package has been simplified as much as possible. If you\n", + "look closely enough, you will realize that the current code generation\n", + "only uses `cython` and not `f2py`. This is because we are not prepared\n", + "to do all the system checks, i.e. does a fortran compiler exist, is gcc\n", + "installed, was python built as a shared library etc. We are very much\n", + "aware of the benefit, especially considering the possibility of GPU\n", + "computation in `theano`.\n", + "\n", + "## Why not use mpmath library throughout?\n", + "\n", + "This is because we have a fair number of operations that depends on\n", + "`scipy`. Obviously, we can solve ode using `mpmath` and do standard\n", + "linear algebra. Unfortunately, optimization and statistics packages and\n", + "routine are mostly based on `numpy`.\n", + "\n", + "## Computing the gradient using `.SquareLoss` is slow\n", + "\n", + "It will always be slow on the first operation. This is due to the design\n", + "where the initialization of the class is fast and only find derivative\n", + "information/compile function during runtime. After the first\n", + "calculation, things should be significantly faster.\n", + "\n", + "**Why some of my code is not a fortran object?**\n", + "\n", + "When we detec either a $\\exp$ or a $\\log$ in the equations, we\n", + "automatically force the compile to use mpmath to ensure that we obtain\n", + "the highest precision. To turn this on/off will be considered as a\n", + "feature in the future.\n", + "\n", + "## Can you not convert a non-autonumous system to an autonomous system for me automatically\n", + "\n", + "Although we can do that, it is not, and will not be implemented. This is\n", + "to ensure that the end user such as yourself are fully aware of the\n", + "equations being defined.\n", + "\n", + "## Getting the sensitivities from `.SquareLoss` did not get a speed up when I used a restricted set of parameters\n", + "\n", + "This is because we currently evaluate the full set of sensitivities\n", + "before extracting them out. Speeding this up for a restrictive set is\n", + "being considered. A main reason that stopped us from implementing is\n", + "that we find the symbolic gradient of the ode before compiling it. Which\n", + "means that one function call to the compiled file will return the full\n", + "set of sensitivities and we would only be extracting the appropriate\n", + "elements from the matrix. This only amounts to a small speed up. The\n", + "best method would be to compile only the necessary elements of the\n", + "gradient matrix, but this would require much more work both within the\n", + "code, and later on when variables are being added/deleted as all these\n", + "compilation are perfromed in runtime.\n", + "\n", + "## Why do not have the option to obtain gradient via complex differencing\n", + "\n", + "It is currently not implemented. Feature under consideration." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.md new file mode 100644 index 00000000..a22e19d8 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/faq.md @@ -0,0 +1,76 @@ +# Frequent asked questions {#faq} + +## Code runs slowly + +This is because the package is not optimized for speed. Although the +some of the main functions are lambdified using +`sympy`{.interpreted-text role="mod"} or compiled against +`cython`{.interpreted-text role="mod"} when available, there are many +more optimization that can be done. One example is the lines: + +in `.DeterministicOde.evalSensitivity`{.interpreted-text role="func"}. +The first two operations can be inlined into the third and the third +line itself can be rewritten as: + +and save the explicit copy operation by `numpy`{.interpreted-text +role="mod"} when making A. If desired, we could have also made used of +the `numexpr`{.interpreted-text role="mod"} package that provides +further speed up on elementwise operations in place of numpy. + +## Why not compile the numeric computation form sympy against Theano + +Setup of the package has been simplified as much as possible. If you +look closely enough, you will realize that the current code generation +only uses `cython`{.interpreted-text role="mod"} and not +`f2py`{.interpreted-text role="mod"}. This is because we are not +prepared to do all the system checks, i.e. does a fortran compiler +exist, is gcc installed, was python built as a shared library etc. We +are very much aware of the benefit, especially considering the +possibility of GPU computation in `theano`{.interpreted-text +role="mod"}. + +## Why not use mpmath library throughout? + +This is because we have a fair number of operations that depends on +`scipy`{.interpreted-text role="mod"}. Obviously, we can solve ode using +`mpmath`{.interpreted-text role="mod"} and do standard linear algebra. +Unfortunately, optimization and statistics packages and routine are +mostly based on `numpy`{.interpreted-text role="mod"}. + +## Computing the gradient using `.SquareLoss`{.interpreted-text role="class"} is slow + +It will always be slow on the first operation. This is due to the design +where the initialization of the class is fast and only find derivative +information/compile function during runtime. After the first +calculation, things should be significantly faster. + +**Why some of my code is not a fortran object?** + +When we detec either a $\exp$ or a $\log$ in the equations, we +automatically force the compile to use mpmath to ensure that we obtain +the highest precision. To turn this on/off will be considered as a +feature in the future. + +## Can you not convert a non-autonumous system to an autonomous system for me automatically + +Although we can do that, it is not, and will not be implemented. This is +to ensure that the end user such as yourself are fully aware of the +equations being defined. + +## Getting the sensitivities from `.SquareLoss`{.interpreted-text role="class"} did not get a speed up when I used a restricted set of parameters + +This is because we currently evaluate the full set of sensitivities +before extracting them out. Speeding this up for a restrictive set is +being considered. A main reason that stopped us from implementing is +that we find the symbolic gradient of the ode before compiling it. Which +means that one function call to the compiled file will return the full +set of sensitivities and we would only be extracting the appropriate +elements from the matrix. This only amounts to a small speed up. The +best method would be to compile only the necessary elements of the +gradient matrix, but this would require much more work both within the +code, and later on when variables are being added/deleted as all these +compilation are perfromed in runtime. + +## Why do not have the option to obtain gradient via complex differencing + +It is currently not implemented. Feature under consideration. diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.ipynb new file mode 100644 index 00000000..24e06f9a --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.ipynb @@ -0,0 +1,135 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example: Fitz Hugh\n", + "\n", + "## Defining the model\n", + "\n", + "We are going to investigate another classic model here, the\n", + "FitzHugh-Nagumo, or simply FitzHugh here. The model has already been\n", + "defined in `common_models` so we can load it easily\n", + "\n", + "In \\[1\\]: from pygom import SquareLoss, common_models\n", + "\n", + "In \\[2\\]: import numpy\n", + "\n", + "In \\[3\\]: import scipy.integrate, scipy.optimize\n", + "\n", + "In \\[4\\]: import math,time,copy\n", + "\n", + "In \\[5\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: x0 = \\[-1.0, 1.0\\]\n", + "\n", + "In \\[2\\]: t0 = 0\n", + "\n", + "In \\[3\\]: \\# params\n", + "\n", + "In \\[4\\]: paramEval = \\[('a',0.2), ('b',0.2), ('c',3.0)\\]\n", + "\n", + "In \\[5\\]: ode = common_models.FitzHugh(paramEval)\n", + "\n", + "In \\[5\\]: ode.initial_values = (x0, t0)\n", + "\n", + "Define a set of time points and lets see how the two states $V$ and $R$\n", + "are suppose to behave.\n", + "\n", + "In \\[6\\]: t = numpy.linspace(1, 20, 30).astype('float64')\n", + "\n", + "In \\[7\\]: solution = ode.integrate(t)\n", + "\n", + "@savefig fh_plot.png In \\[8\\]: ode.plot()\n", + "\n", + "## Estimate the parameters\n", + "\n", + "Obtaining the correct parameters for the FitzHugh model is well known to\n", + "be difficult, this is because the surface is multimodal. Although this\n", + "has been shown many times in the literature, so we will omit the\n", + "details. Regardless, we give it a go with some initial guess. with some\n", + "luck, we will be able to recover the original parameters. First, we try\n", + "it out with only one target state\n", + "\n", + "In \\[26\\]: theta = \\[0.5, 0.5, 0.5\\]\n", + "\n", + "In \\[27\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", + "'R')\n", + "\n", + "In \\[28\\]: boxBounds = \\[ \n", + ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0) .…: \\]\n", + "\n", + "In \\[29\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", + ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", + "method='L-BFGS-B')\n", + "\n", + "In \\[30\\]: print(res)\n", + "\n", + "Then we try the same again but with both state as our target. Now we\n", + "won't look at the iterations because they are pretty pointless.\n", + "\n", + "In \\[30\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", + "\\['V','R'\\])\n", + "\n", + "In \\[31\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", + ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", + "method='L-BFGS-B')\n", + "\n", + "In \\[32\\]: print(res)\n", + "\n", + "Note how the estimates are the same, unlike other models.\n", + "\n", + "## Estimate initial value\n", + "\n", + "We can further assume that we have no idea about the initial values for\n", + "$V$ and $R$ as well. We also provide guesstimate to set off the\n", + "optimization. The input vector $\\theta$ must have the parameters first,\n", + "then the initial values, along with the corresponding bounds.\n", + "\n", + "First, only a single target state, i.e. we only have observations for\n", + "one of states which is $R$ in this case\n", + "\n", + "In \\[35\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", + "'R')\n", + "\n", + "In \\[35\\]: boxBounds = \\[ \n", + ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0), .…: (None,None), .…:\n", + "(None,None) .…: \\]\n", + "\n", + "In \\[36\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", + ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5,0.5\\], .…:\n", + "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "\n", + "In \\[37\\]: print(res)\n", + "\n", + "then both state as target at the same time\n", + "\n", + "In \\[38\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", + "\\['V','R'\\])\n", + "\n", + "In \\[38\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", + ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5, 0.5\\], .…:\n", + "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "\n", + "In \\[39\\]: print(res)\n", + "\n", + "See the difference between the two estimate with the latter, both state\n", + "were used, yielding superior estimates. Note that only the forward\n", + "sensitivity method is implemented when estimating the initial value, and\n", + "it is assumed that the starting condition for all the states are\n", + "unknown.\n", + "\n", + "The choice of algorithm here is the **L-BFGS-B** which is a better\n", + "choice because the parameter space of the FitzHugh is rough (i.e. large\n", + "second derivative) as well as being multimodal. This means that the\n", + "Hessian is not guaranteed to be positive definite and approximation\n", + "using $J^{\\top}J$ is poor, with $J$ being the Jacobian of the objective\n", + "function." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.md new file mode 100644 index 00000000..a7b26a14 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/fh.md @@ -0,0 +1,141 @@ +# Example: Fitz Hugh {#fh} + +## Defining the model + +We are going to investigate another classic model here, the +FitzHugh-Nagumo, or simply FitzHugh here. The model has already been +defined in `common_models`{.interpreted-text role="mod"} so we can load +it easily + +::: {.ipython} +In \[1\]: from pygom import SquareLoss, common_models + +In \[2\]: import numpy + +In \[3\]: import scipy.integrate, scipy.optimize + +In \[4\]: import math,time,copy + +In \[5\]: import matplotlib.pyplot as plt + +In \[1\]: x0 = \[-1.0, 1.0\] + +In \[2\]: t0 = 0 + +In \[3\]: \# params + +In \[4\]: paramEval = \[(\'a\',0.2), (\'b\',0.2), (\'c\',3.0)\] + +In \[5\]: ode = common_models.FitzHugh(paramEval) + +In \[5\]: ode.initial_values = (x0, t0) +::: + +Define a set of time points and lets see how the two states $V$ and $R$ +are suppose to behave. + +::: {.ipython} +In \[6\]: t = numpy.linspace(1, 20, 30).astype(\'float64\') + +In \[7\]: solution = ode.integrate(t) + +\@savefig fh_plot.png In \[8\]: ode.plot() +::: + +## Estimate the parameters + +Obtaining the correct parameters for the FitzHugh model is well known to +be difficult, this is because the surface is multimodal. Although this +has been shown many times in the literature, so we will omit the +details. Regardless, we give it a go with some initial guess. with some +luck, we will be able to recover the original parameters. First, we try +it out with only one target state + +::: {.ipython} +In \[26\]: theta = \[0.5, 0.5, 0.5\] + +In \[27\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,1\], +\'R\') + +In \[28\]: boxBounds = \[ + +: \....: (0.0,5.0), \....: (0.0,5.0), \....: (0.0,5.0) \....: \] + +In \[29\]: res = scipy.optimize.minimize(fun=objFH.cost, + +: \....: jac=objFH.sensitivity, \....: x0=theta, \....: + bounds=boxBounds, \....: method=\'L-BFGS-B\') + +In \[30\]: print(res) +::: + +Then we try the same again but with both state as our target. Now we +won\'t look at the iterations because they are pretty pointless. + +::: {.ipython} +In \[30\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,:\], +\[\'V\',\'R\'\]) + +In \[31\]: res = scipy.optimize.minimize(fun=objFH.cost, + +: \....: jac=objFH.sensitivity, \....: x0=theta, \....: + bounds=boxBounds, \....: method=\'L-BFGS-B\') + +In \[32\]: print(res) +::: + +Note how the estimates are the same, unlike other models. + +## Estimate initial value + +We can further assume that we have no idea about the initial values for +$V$ and $R$ as well. We also provide guesstimate to set off the +optimization. The input vector $\theta$ must have the parameters first, +then the initial values, along with the corresponding bounds. + +First, only a single target state, i.e. we only have observations for +one of states which is $R$ in this case + +::: {.ipython} +In \[35\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,1\], +\'R\') + +In \[35\]: boxBounds = \[ + +: \....: (0.0,5.0), \....: (0.0,5.0), \....: (0.0,5.0), \....: + (None,None), \....: (None,None) \....: \] + +In \[36\]: res = scipy.optimize.minimize(fun=objFH.costIV, + +: \....: jac=objFH.sensitivityIV, \....: x0=theta + \[-0.5,0.5\], + \....: bounds=boxBounds, \....: method=\'L-BFGS-B\') + +In \[37\]: print(res) +::: + +then both state as target at the same time + +::: {.ipython} +In \[38\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,:\], +\[\'V\',\'R\'\]) + +In \[38\]: res = scipy.optimize.minimize(fun=objFH.costIV, + +: \....: jac=objFH.sensitivityIV, \....: x0=theta + \[-0.5, 0.5\], + \....: bounds=boxBounds, \....: method=\'L-BFGS-B\') + +In \[39\]: print(res) +::: + +See the difference between the two estimate with the latter, both state +were used, yielding superior estimates. Note that only the forward +sensitivity method is implemented when estimating the initial value, and +it is assumed that the starting condition for all the states are +unknown. + +The choice of algorithm here is the **L-BFGS-B** which is a better +choice because the parameter space of the FitzHugh is rough (i.e. large +second derivative) as well as being multimodal. This means that the +Hessian is not guaranteed to be positive definite and approximation +using $J^{\top}J$ is poor, with $J$ being the Jacobian of the objective +function. diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.ipynb new file mode 100644 index 00000000..e67c71b3 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gradient estimation under square loss\n", + "\n", + "Assuming that we have a set of $N$ observations $y_{i}$ at specific time\n", + "points $t_{i}$, $i = 1,\\ldots,N$, we may wish to test out a set of ode\n", + "to see whether it fits to the data. The most natural way to test such\n", + "*fit* is to minimize the sum of squares between our observations $y$ and\n", + "see whether the resulting solution of the ode and the estimationed\n", + "parameters makes sense.\n", + "\n", + "We assume that this estimation process will be tackled through a\n", + "non-linear optimization point of view. However, it should be noted that\n", + "such estimates can also be performed via MCMC or from a global\n", + "optimization perspective. A key element in non-linear optimization is\n", + "the gradient, which is the focus of this page.\n", + "\n", + "Multiple ways of obtaining the gradient have been implemented. All of\n", + "them serve a certain purpose and may not be a viable/appropriate options\n", + "depending on the type of ode. More generally, let $d,p$ be the number of\n", + "states and paramters respectively. Then finite difference methods have a\n", + "run order of $O(p+1)$ of the original ode, forward sensitivity require\n", + "an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint\n", + "method require two run of size $d$ in principle, but actual run time is\n", + "dependent on the number of observations.\n", + "\n", + "For the details of the classes and methods, please refer to `mod`.\n", + "\n", + "## Notation\n", + "\n", + "We introduce the notations that will be used in the rest of the page,\n", + "some of which may be slightly unconventional but necessary due to the\n", + "complexity of the problem. Let $x \\in \\mathbb{R}^{d}$ and\n", + "$\\theta \\in \\mathbb{R}^{p}$ be the states and parameters respectively.\n", + "The term *state* or *simulation* are used interchangeably, even though\n", + "strictly speaking a state is $x$ whereas $x(t)$ is the simulation. An\n", + "ode is defined as\n", + "\n", + "$$f(x,\\theta) = \\dot{x} = \\frac{\\partial x}{\\partial t}$$\n", + "\n", + "and usually comes with a set of initial conditions $(x_0,t_0)$ where\n", + "$t_0 \\le t_{i} \\forall i$. Let $g(x,\\theta)$ be a function that maps the\n", + "set of states to the observations,\n", + "$g : \\mathbb{R}^{d} \\rightarrow \\mathbb{R}^{m}$. For compartmental\n", + "problems, which is our focus, $\\nabla_{\\theta}g(x,\\theta)$ is usually\n", + "zero and $\\nabla_{x}g(x,\\theta)$ is an identity function for some or all\n", + "of the states $x$. Denote $l(x_{0},\\theta,x)$ as our cost function\n", + "$l : \\mathbb{R}^{m} \\rightarrow \\mathbb{R}$ and $L(x_{0},\\theta,x)$ be\n", + "the sum of $l(\\cdot)$. Both $x$ and $x_{0}$ are usually dropped for\n", + "simplicity. We will be dealing exclusively with square loss here, which\n", + "means that\n", + "\n", + "$$L(\\theta) = \\sum_{i=1}^{N} \\left\\| y_{i} - g(x(t_{i})) \\right\\|^{2} = \\mathbf{e}^{\\top} \\mathbf{e}$$\n", + "\n", + "where $\\mathbf{e}$ is the residual vector, with elements\n", + "\n", + "$$e_{i} = y_{i} - x(t_{i}).$$\n", + "\n", + "## Model setup\n", + "\n", + "Again, we demonstrate the functionalities of our classes using an SIR\n", + "model.\n", + "\n", + "In \\[1\\]: from pygom import SquareLoss, common_models\n", + "\n", + "In \\[2\\]: import copy,time,numpy\n", + "\n", + "In \\[2\\]: ode = common_models.SIR()\n", + "\n", + "In \\[3\\]: paramEval = \\[('beta',0.5), ('gamma',1.0/3.0) \\]\n", + "\n", + "In \\[7\\]: \\# the initial state, normalized to zero one\n", + "\n", + "In \\[8\\]: x0 = \\[1., 1.27e-6, 0.\\]\n", + "\n", + "In \\[5\\]: \\# initial time\n", + "\n", + "In \\[6\\]: t0 = 0\n", + "\n", + "In \\[5\\]: ode.parameters = paramEval\n", + "\n", + "In \\[6\\]: ode.initial_values = (x0, t0)\n", + "\n", + "In \\[9\\]: \\# set the time sequence that we would like to observe\n", + "\n", + "In \\[10\\]: t = numpy.linspace(1, 150, 100)\n", + "\n", + "In \\[11\\]: numStep = len(t)\n", + "\n", + "In \\[11\\]: solution = ode.integrate(t)\n", + "\n", + "In \\[12\\]: y = solution\\[1::,2\\].copy()\n", + "\n", + "In \\[13\\]: y += numpy.random.normal(0, 0.1, y.shape)\n", + "\n", + "Now we have set up the model along with some observations, obtaining the\n", + "gradient only requires the end user to put the appropriate information\n", + "it into the class `SquareLoss`. Given the initial guess $\\theta$\n", + "\n", + "In \\[210\\]: theta = \\[0.2, 0.2\\]\n", + "\n", + "We initialize the `SquareLoss` simply as\n", + "\n", + "In \\[20\\]: objSIR = SquareLoss(theta, ode, x0, t0, t, y, 'R')\n", + "\n", + "where the we also have to specify the state our observations are from.\n", + "Now, we demonstrate the different methods in obtaining the gradient and\n", + "mathematics behind it.\n", + "\n", + "## Forward sensitivity\n", + "\n", + "The forward sensitivity equations are derived by differentiating the\n", + "states implicitly, which yields\n", + "\n", + "$$\\frac{d\\dot{x}}{d\\theta} = \\frac{\\partial f}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial f}{\\partial \\theta}.$$\n", + "\n", + "So finding the sensitivies $\\frac{dx}{d\\theta}$ simply require another\n", + "integration of a $p$ coupled ode of $d$ dimension, each with the same\n", + "Jacobian as the original ode. This integration is performed along with\n", + "the original ode because of possible non-linearity.\n", + "\n", + "A direct call to the method `sensitivity `\n", + "computed the gradient\n", + "\n", + "In \\[33\\]: gradSens = objSIR.sensitivity()\n", + "\n", + "whereas `.jac` will allow the end user to obtain the Jacobian (of the\n", + "objective function) and the residuals, the information required to get\n", + "the gradient as we see next.\n", + "\n", + "In \\[33\\]: objJac, output = objSIR.jac(full_output=True)\n", + "\n", + "## Gradient\n", + "\n", + "Just the sensitivities alone are not enough to obtain the gradient, but\n", + "we are $90\\%$ there. Differentiating the loss function\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dL}{d\\theta} &= \\nabla_{\\theta} \\sum_{i=1}^{N}\\frac{dl}{dg} \\\\\n", + " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial \\theta} \\\\\n", + " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial \\theta}\n", + "\\end{aligned}$$\n", + "\n", + "via chain rule. When $\\frac{\\partial g}{\\partial \\theta} = 0$, the total\n", + "gradient simplifies to\n", + "\n", + "$$\\frac{dL}{d\\theta} = \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta}$$\n", + "\n", + "Obviously, the time indicies are dropped above but all the terms above\n", + "are evaluated only at the observed time points. More concretely, this\n", + "means that\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{\\partial l(x(j),\\theta)}{\\partial g} = \\left\\{ \\begin{array}{ll} -2(y_{i} - x(j)) & , \\; j = t_{i} \\\\ 0 & \\; \\text{otherwise} \\end{array} \\right.\n", + "\\end{aligned}$$\n", + "\n", + "When $g(\\cdot)$ is an identity function (which is assumed to be the case\n", + "in `SquareLoss`)\n", + "\n", + "$$\\frac{\\partial g(x(t_{i}),\\theta)}{\\partial x} = I_{d}$$\n", + "\n", + "then the gradient simplifies even further as it is simply\n", + "\n", + "$$\\frac{dL}{d\\theta} = -2\\mathbf{e}^{\\top}\\mathbf{S}$$\n", + "\n", + "where $\\mathbf{e}$ is the vector of residuals and\n", + "$\\mathbf{S} = \\left[\\mathbf{s}_{1},\\mathbf{s}_{2},\\ldots,\\mathbf{s}_{n}\\right]$\n", + "with elements\n", + "\n", + "$$\\mathbf{s}_{i} = \\frac{dx}{d\\theta}(t_{i}),$$\n", + "\n", + "the solution of the forward sensitivies at time $t_{i}$, obtained from\n", + "solving the coupled ode as mentioned previously.\n", + "\n", + "## Jacobian\n", + "\n", + "Now note how the gradient simplifies to $-2\\mathbf{e}^{\\top}\\mathbf{S}$.\n", + "Recall that a standard result in non-linear programming states that the\n", + "gradient of a sum of sqaures objective function $L(\\theta,y,x)$ is\n", + "\n", + "$$\\nabla_{\\theta} L(\\theta,y,x) = -2(\\mathbf{J}^{T} \\left[\\mathbf{y} - \\mathbf{f}(x,\\boldsymbol{\\theta}) \\right] )^{\\top}$$\n", + "\n", + "with $f(x,\\theta)$ our non-linear function and $J$ our Jacobian with\n", + "elements\n", + "\n", + "$$J_{i} = \\frac{\\partial f(x_{i},\\boldsymbol{\\theta})}{\\partial \\boldsymbol{\\theta}}.$$\n", + "\n", + "This is exactly what we have seen previously, substituting in reveals\n", + "that $J = \\mathbf{S}$. Hence, the Jacobian is (a necessary)by product\n", + "when we wish to obtain the gradient. In fact, this is exactly how we\n", + "proceed in `sensitivity ` where it makes\n", + "an internal call to `jac ` to obtain the Jacobian\n", + "first. This allows the end user to have more options when choosing which\n", + "type of algorithms to use, i.e. Gauss-Newton or Levenberg-Marquardt.\n", + "\n", + "To check that the output is in fact the same\n", + "\n", + "In \\[1\\]: objJac.transpose().dot(-2\\*output\\['resid'\\]) - gradSens\n", + "\n", + "## Adjoint\n", + "\n", + "When the number of parameters increases, the number of sensitivies also\n", + "increases. The time required scales directly with the number of\n", + "parameters. We describe another method which does not depend on the\n", + "number of parameters, but rather, the number of states and observations.\n", + "\n", + "The full derivations will not be shown here, but we aim to provide\n", + "enough information to work out the steps performed in the our code. Let\n", + "write our optimization problem as\n", + "\n", + "$$\\begin{aligned}\n", + "min_{\\theta} \\quad & \\int_{t_{0}}^{T} l(x_{0},\\theta,x(t)) dt \\\\\n", + "s.t. \\quad & \\dot{x} = f(x,\\theta)\n", + "\\end{aligned}$$\n", + "\n", + "which is identical to the original problem but in a continuous setting.\n", + "Now write the constrained problem in the Lagrangian form\n", + "\n", + "$$min_{\\theta} \\; L(\\theta) + \\int_{t_{0}}^{T} \\lambda^{\\top}(\\dot{x} - f(x,\\theta))$$\n", + "\n", + "with Lagrangian multiplier $\\lambda \\ge 0$. After some algebraic\n", + "manipulation, it can be shown that the total derivative of the\n", + "Lagrangian function is\n", + "\n", + "$$\\frac{dL}{d\\theta} = \\int_{t_{0}}^{T} \\left(\\frac{\\partial l}{\\partial \\theta} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta} \\right) dt.$$\n", + "\n", + "Using previously defined loss functions (the identity), the first term\n", + "is zero and evaluating $\\frac{\\partial f}{\\partial \\theta}$ is trivial.\n", + "What remains is the calculation of $\\lambda(t)$ for\n", + "$t \\in \\left[t_{0},T\\right]$.\n", + "\n", + "Although this still seem to be ill-posed problem when Looking at the\n", + "Lagrangian function, one can actually obtain the *adjoint equation*,\n", + "after certain assumptions and\n", + "\n", + "$$\\frac{d\\lambda^{\\top}}{dt} = \\frac{\\partial l}{\\partial x} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta}.$$\n", + "\n", + "which is again an integration. An unfortunate situation arise here for\n", + "non-linear systems because we use the minus Jacobian in the adjoint\n", + "equation. So if the eigenvalues of the Jacobian indicate that our\n", + "original ode is stable, such as -1, the minus eigenvalues (now 1)\n", + "implies that the adjoint equation is not stable. Therefore, one must\n", + "integrate backward in time to solve the adjoint equation and it cannot\n", + "be solved simultaneously as the ode, unlike the forward sensitivity\n", + "equations.\n", + "\n", + "Given a non-linearity ode, we must store information about the states\n", + "between $t_{0}$ and $T$ in order to perform the integration. There are\n", + "two options, both require storing many evaluated $x(j)$ within the\n", + "interval $\\left[t_{0},T\\right]$. Unfortunately, only one is available;\n", + "interpolation over all states and integrate using the interpolating\n", + "functions. The alternative of using observed $x(j)'s$ at fixed points is\n", + "not competitive because we are unable to use fortran routines for the\n", + "integration\n", + "\n", + "The method of choice here to perform the adjoint calcuation is to run a\n", + "forward integration, then perform an interpolation using splines with\n", + "explicit knots at the observed time points.\n", + "\n", + "In \\[326\\]: odeSIRAdjoint, outputAdjoint =\n", + "objSIR.adjoint(full_output=True)\n", + "\n", + "This is because evaluating the Jacobian may be expensive and Runge-kutta\n", + "method suffers as the complexity increases. In non-linear model such as\n", + "those found in epidemiology, each element of the Jacobian may be the\n", + "result of a complicated equation where linear step method will shine as\n", + "it makes as little function evaluation as possible. Note that\n", + "derivations in the literature, the initial condition when evaluating the\n", + "adjoint equation is $\\lambda(T)=0$. But in our code we used\n", + "$\\lambda(T) = -2(y(T)-x(T))$. Recall that we have observation $y(T)$ and\n", + "simulation $x(T)$, so that the adjoint equation evaluated at time $T$\n", + "\n", + "$$\\frac{\\partial \\lambda^{\\top}}{\\partial t} \\Big|_{T} = -2(y-f(x,\\theta))\\Big|_{T} - \\lambda(T)\\frac{\\partial f}{\\partial \\theta}\\Big|_{T}$$\n", + "\n", + "with the second term equal to zero. Integration under step size $h$\n", + "implies that\n", + "$\\lambda(T) \\approx \\lim_{h \\to 0} \\lambda(T-h) = -2(y(T)-x(T))$.\n", + "\n", + "## Time Comparison\n", + "\n", + "A simple time comparison between the different methods reveals that the\n", + "forward sensitivity method dominates the others by a wide margin. It\n", + "will be tempting to conclude that it is the best and should be the\n", + "default at all times but that is not true, due to the complexity of each\n", + "method mentioned previously. We leave it to the end user to find out the\n", + "best method for their specific problem.\n", + "\n", + "In \\[319\\]: %timeit gradSens = objSIR.sensitivity()\n", + "\n", + "In \\[326\\]: %timeit odeSIRAdjoint,outputAdjoint =\n", + "objSIR.adjoint(full_output=True)\n", + "\n", + "## Hessian\n", + "\n", + "The Hessian is defined by\n", + "\n", + "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\frac{\\partial l}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\frac{\\partial x}{\\partial \\theta}^{\\top}\\frac{\\partial^{2} l}{\\partial x^{2}}\\frac{\\partial x}{\\partial \\theta}$$\n", + "\n", + "where $\\otimes$ is the Kronecker product. Note that $\\nabla_{\\theta} x$\n", + "is the sensitivity and the second order sensitivities can be found again\n", + "via the forward method, which involve another set of ode's, namely the\n", + "forward-forward sensitivities\n", + "\n", + "$$\\frac{\\partial}{\\partial t}\\left(\\frac{\\partial^{2} x}{\\partial \\theta^{2}}\\right) = \\left( \\frac{\\partial f}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\left( I_{d} \\otimes \\frac{\\partial x}{\\partial \\theta}^{\\top} \\right) \\frac{\\partial^{2} f}{\\partial x^{2}} \\frac{\\partial x}{\\partial \\theta}.$$\n", + "\n", + "From before, we know that\n", + "\n", + "$$\\frac{\\partial l}{\\partial x} = (-2y+2x) \\quad and \\quad \\frac{\\partial^{2} l}{\\partial x^{2}} = 2I_{d}$$\n", + "\n", + "so our Hessian reduces to\n", + "\n", + "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\left(-2y+2x\\right) \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + 2S^{\\top}S,$$\n", + "\n", + "where the second term is a good approximation to the Hessian as\n", + "mentioned previously. This is the only implementation in place so far\n", + "even though obtaining the estimate this way is relatively slow.\n", + "\n", + "Just to demonstate how it works, lets look at the Hessian at the optimal\n", + "point. First, we obtain the optimal value\n", + "\n", + "In \\[211\\]: import scipy.linalg,scipy.optimize\n", + "\n", + "In \\[212\\]: boxBounds = \\[(0.0, 2.0), (0.0, 2.0)\\]\n", + "\n", + "In \\[213\\]: res = scipy.optimize.minimize(fun=objSIR.cost, \n", + ".….: jac=objSIR.sensitivity, .….: x0=theta, .….: bounds=boxBounds, .….:\n", + "method='L-BFGS-B')\n", + "\n", + "Then compare again the least square estimate of the covariance matrix\n", + "against our version\n", + "\n", + "In \\[211\\]: resLS, cov_x, infodict, mesg, ier =\n", + "scipy.optimize.leastsq(func=objSIR.residual, x0=res\\['x'\\],\n", + "full_output=True)\n", + "\n", + "In \\[212\\]: HJTJ, outputHJTJ = objSIR.hessian(full_output=True)\n", + "\n", + "In \\[311\\]: print(scipy.linalg.inv(HJTJ))\n", + "\n", + "In \\[312\\]: print(cov_x)\n", + "\n", + "also note the difference between the Hessian and the approximation using\n", + "the Jacobian, which is in fact what the least squares routine uses.\n", + "\n", + "In \\[313\\]: print(scipy.linalg.inv(outputHJTJ\\['JTJ'\\]))" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.md new file mode 100644 index 00000000..d0755502 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/gradient.md @@ -0,0 +1,372 @@ +# Gradient estimation under square loss {#gradient} + +Assuming that we have a set of $N$ observations $y_{i}$ at specific time +points $t_{i}$, $i = 1,\ldots,N$, we may wish to test out a set of ode +to see whether it fits to the data. The most natural way to test such +*fit* is to minimize the sum of squares between our observations $y$ and +see whether the resulting solution of the ode and the estimationed +parameters makes sense. + +We assume that this estimation process will be tackled through a +non-linear optimization point of view. However, it should be noted that +such estimates can also be performed via MCMC or from a global +optimization perspective. A key element in non-linear optimization is +the gradient, which is the focus of this page. + +Multiple ways of obtaining the gradient have been implemented. All of +them serve a certain purpose and may not be a viable/appropriate options +depending on the type of ode. More generally, let $d,p$ be the number of +states and paramters respectively. Then finite difference methods have a +run order of $O(p+1)$ of the original ode, forward sensitivity require +an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint +method require two run of size $d$ in principle, but actual run time is +dependent on the number of observations. + +For the details of the classes and methods, please refer to +`mod`{.interpreted-text role="ref"}. + +## Notation + +We introduce the notations that will be used in the rest of the page, +some of which may be slightly unconventional but necessary due to the +complexity of the problem. Let $x \in \mathbb{R}^{d}$ and +$\theta \in \mathbb{R}^{p}$ be the states and parameters respectively. +The term *state* or *simulation* are used interchangeably, even though +strictly speaking a state is $x$ whereas $x(t)$ is the simulation. An +ode is defined as + +$$f(x,\theta) = \dot{x} = \frac{\partial x}{\partial t}$$ + +and usually comes with a set of initial conditions $(x_0,t_0)$ where +$t_0 \le t_{i} \forall i$. Let $g(x,\theta)$ be a function that maps the +set of states to the observations, +$g : \mathbb{R}^{d} \rightarrow \mathbb{R}^{m}$. For compartmental +problems, which is our focus, $\nabla_{\theta}g(x,\theta)$ is usually +zero and $\nabla_{x}g(x,\theta)$ is an identity function for some or all +of the states $x$. Denote $l(x_{0},\theta,x)$ as our cost function +$l : \mathbb{R}^{m} \rightarrow \mathbb{R}$ and $L(x_{0},\theta,x)$ be +the sum of $l(\cdot)$. Both $x$ and $x_{0}$ are usually dropped for +simplicity. We will be dealing exclusively with square loss here, which +means that + +$$L(\theta) = \sum_{i=1}^{N} \left\| y_{i} - g(x(t_{i})) \right\|^{2} = \mathbf{e}^{\top} \mathbf{e}$$ + +where $\mathbf{e}$ is the residual vector, with elements + +$$e_{i} = y_{i} - x(t_{i}).$$ + +## Model setup + +Again, we demonstrate the functionalities of our classes using an SIR +model. + +::: {.ipython} +In \[1\]: from pygom import SquareLoss, common_models + +In \[2\]: import copy,time,numpy + +In \[2\]: ode = common_models.SIR() + +In \[3\]: paramEval = \[(\'beta\',0.5), (\'gamma\',1.0/3.0) \] + +In \[7\]: \# the initial state, normalized to zero one + +In \[8\]: x0 = \[1., 1.27e-6, 0.\] + +In \[5\]: \# initial time + +In \[6\]: t0 = 0 + +In \[5\]: ode.parameters = paramEval + +In \[6\]: ode.initial_values = (x0, t0) + +In \[9\]: \# set the time sequence that we would like to observe + +In \[10\]: t = numpy.linspace(1, 150, 100) + +In \[11\]: numStep = len(t) + +In \[11\]: solution = ode.integrate(t) + +In \[12\]: y = solution\[1::,2\].copy() + +In \[13\]: y += numpy.random.normal(0, 0.1, y.shape) +::: + +Now we have set up the model along with some observations, obtaining the +gradient only requires the end user to put the appropriate information +it into the class `SquareLoss`{.interpreted-text role="class"}. Given +the initial guess $\theta$ + +::: {.ipython} +In \[210\]: theta = \[0.2, 0.2\] +::: + +We initialize the `SquareLoss`{.interpreted-text role="class"} simply as + +::: {.ipython} +In \[20\]: objSIR = SquareLoss(theta, ode, x0, t0, t, y, \'R\') +::: + +where the we also have to specify the state our observations are from. +Now, we demonstrate the different methods in obtaining the gradient and +mathematics behind it. + +## Forward sensitivity + +The forward sensitivity equations are derived by differentiating the +states implicitly, which yields + +$$\frac{d\dot{x}}{d\theta} = \frac{\partial f}{\partial x}\frac{dx}{d\theta} + \frac{\partial f}{\partial \theta}.$$ + +So finding the sensitivies $\frac{dx}{d\theta}$ simply require another +integration of a $p$ coupled ode of $d$ dimension, each with the same +Jacobian as the original ode. This integration is performed along with +the original ode because of possible non-linearity. + +A direct call to the method +`sensitivity `{.interpreted-text +role="meth"} computed the gradient + +::: {.ipython} +In \[33\]: gradSens = objSIR.sensitivity() +::: + +whereas `.jac`{.interpreted-text role="meth"} will allow the end user to +obtain the Jacobian (of the objective function) and the residuals, the +information required to get the gradient as we see next. + +::: {.ipython} +In \[33\]: objJac, output = objSIR.jac(full_output=True) +::: + +## Gradient + +Just the sensitivities alone are not enough to obtain the gradient, but +we are $90\%$ there. Differentiating the loss function + +$$\begin{aligned} +\frac{dL}{d\theta} &= \nabla_{\theta} \sum_{i=1}^{N}\frac{dl}{dg} \\ + &= \sum_{i=1}^{N} \frac{\partial l}{\partial x}\frac{dx}{d\theta} + \frac{\partial l}{\partial \theta} \\ + &= \sum_{i=1}^{N} \frac{\partial l}{\partial g}\frac{\partial g}{\partial x}\frac{dx}{d\theta} + \frac{\partial l}{\partial g}\frac{\partial g}{\partial \theta} +\end{aligned}$$ + +via chain rule. When $\frac{\partial g}{\partial \theta} = 0$, the total +gradient simplifies to + +$$\frac{dL}{d\theta} = \sum_{i=1}^{N} \frac{\partial l}{\partial g}\frac{\partial g}{\partial x}\frac{dx}{d\theta}$$ + +Obviously, the time indicies are dropped above but all the terms above +are evaluated only at the observed time points. More concretely, this +means that + +$$\begin{aligned} +\frac{\partial l(x(j),\theta)}{\partial g} = \left\{ \begin{array}{ll} -2(y_{i} - x(j)) & , \; j = t_{i} \\ 0 & \; \text{otherwise} \end{array} \right. +\end{aligned}$$ + +When $g(\cdot)$ is an identity function (which is assumed to be the case +in `SquareLoss`{.interpreted-text role="class"}) + +$$\frac{\partial g(x(t_{i}),\theta)}{\partial x} = I_{d}$$ + +then the gradient simplifies even further as it is simply + +$$\frac{dL}{d\theta} = -2\mathbf{e}^{\top}\mathbf{S}$$ + +where $\mathbf{e}$ is the vector of residuals and +$\mathbf{S} = \left[\mathbf{s}_{1},\mathbf{s}_{2},\ldots,\mathbf{s}_{n}\right]$ +with elements + +$$\mathbf{s}_{i} = \frac{dx}{d\theta}(t_{i}),$$ + +the solution of the forward sensitivies at time $t_{i}$, obtained from +solving the coupled ode as mentioned previously. + +## Jacobian + +Now note how the gradient simplifies to $-2\mathbf{e}^{\top}\mathbf{S}$. +Recall that a standard result in non-linear programming states that the +gradient of a sum of sqaures objective function $L(\theta,y,x)$ is + +$$\nabla_{\theta} L(\theta,y,x) = -2(\mathbf{J}^{T} \left[\mathbf{y} - \mathbf{f}(x,\boldsymbol{\theta}) \right] )^{\top}$$ + +with $f(x,\theta)$ our non-linear function and $J$ our Jacobian with +elements + +$$J_{i} = \frac{\partial f(x_{i},\boldsymbol{\theta})}{\partial \boldsymbol{\theta}}.$$ + +This is exactly what we have seen previously, substituting in reveals +that $J = \mathbf{S}$. Hence, the Jacobian is (a necessary)by product +when we wish to obtain the gradient. In fact, this is exactly how we +proceed in +`sensitivity `{.interpreted-text +role="func"} where it makes an internal call to +`jac `{.interpreted-text role="func"} to obtain +the Jacobian first. This allows the end user to have more options when +choosing which type of algorithms to use, i.e. Gauss-Newton or +Levenberg-Marquardt. + +To check that the output is in fact the same + +::: {.ipython} +In \[1\]: objJac.transpose().dot(-2\*output\[\'resid\'\]) - gradSens +::: + +## Adjoint + +When the number of parameters increases, the number of sensitivies also +increases. The time required scales directly with the number of +parameters. We describe another method which does not depend on the +number of parameters, but rather, the number of states and observations. + +The full derivations will not be shown here, but we aim to provide +enough information to work out the steps performed in the our code. Let +write our optimization problem as + +$$\begin{aligned} +min_{\theta} \quad & \int_{t_{0}}^{T} l(x_{0},\theta,x(t)) dt \\ +s.t. \quad & \dot{x} = f(x,\theta) +\end{aligned}$$ + +which is identical to the original problem but in a continuous setting. +Now write the constrained problem in the Lagrangian form + +$$min_{\theta} \; L(\theta) + \int_{t_{0}}^{T} \lambda^{\top}(\dot{x} - f(x,\theta))$$ + +with Lagrangian multiplier $\lambda \ge 0$. After some algebraic +manipulation, it can be shown that the total derivative of the +Lagrangian function is + +$$\frac{dL}{d\theta} = \int_{t_{0}}^{T} \left(\frac{\partial l}{\partial \theta} - \lambda^{\top}\frac{\partial f}{\partial \theta} \right) dt.$$ + +Using previously defined loss functions (the identity), the first term +is zero and evaluating $\frac{\partial f}{\partial \theta}$ is trivial. +What remains is the calculation of $\lambda(t)$ for +$t \in \left[t_{0},T\right]$. + +Although this still seem to be ill-posed problem when Looking at the +Lagrangian function, one can actually obtain the *adjoint equation*, +after certain assumptions and + +$$\frac{d\lambda^{\top}}{dt} = \frac{\partial l}{\partial x} - \lambda^{\top}\frac{\partial f}{\partial \theta}.$$ + +which is again an integration. An unfortunate situation arise here for +non-linear systems because we use the minus Jacobian in the adjoint +equation. So if the eigenvalues of the Jacobian indicate that our +original ode is stable, such as -1, the minus eigenvalues (now 1) +implies that the adjoint equation is not stable. Therefore, one must +integrate backward in time to solve the adjoint equation and it cannot +be solved simultaneously as the ode, unlike the forward sensitivity +equations. + +Given a non-linearity ode, we must store information about the states +between $t_{0}$ and $T$ in order to perform the integration. There are +two options, both require storing many evaluated $x(j)$ within the +interval $\left[t_{0},T\right]$. Unfortunately, only one is available; +interpolation over all states and integrate using the interpolating +functions. The alternative of using observed $x(j)'s$ at fixed points is +not competitive because we are unable to use fortran routines for the +integration + +The method of choice here to perform the adjoint calcuation is to run a +forward integration, then perform an interpolation using splines with +explicit knots at the observed time points. + +::: {.ipython} +In \[326\]: odeSIRAdjoint, outputAdjoint = +objSIR.adjoint(full_output=True) +::: + +This is because evaluating the Jacobian may be expensive and Runge-kutta +method suffers as the complexity increases. In non-linear model such as +those found in epidemiology, each element of the Jacobian may be the +result of a complicated equation where linear step method will shine as +it makes as little function evaluation as possible. Note that +derivations in the literature, the initial condition when evaluating the +adjoint equation is $\lambda(T)=0$. But in our code we used +$\lambda(T) = -2(y(T)-x(T))$. Recall that we have observation $y(T)$ and +simulation $x(T)$, so that the adjoint equation evaluated at time $T$ + +$$\frac{\partial \lambda^{\top}}{\partial t} \Big|_{T} = -2(y-f(x,\theta))\Big|_{T} - \lambda(T)\frac{\partial f}{\partial \theta}\Big|_{T}$$ + +with the second term equal to zero. Integration under step size $h$ +implies that +$\lambda(T) \approx \lim_{h \to 0} \lambda(T-h) = -2(y(T)-x(T))$. + +## Time Comparison + +A simple time comparison between the different methods reveals that the +forward sensitivity method dominates the others by a wide margin. It +will be tempting to conclude that it is the best and should be the +default at all times but that is not true, due to the complexity of each +method mentioned previously. We leave it to the end user to find out the +best method for their specific problem. + +::: {.ipython} +In \[319\]: %timeit gradSens = objSIR.sensitivity() + +In \[326\]: %timeit odeSIRAdjoint,outputAdjoint = +objSIR.adjoint(full_output=True) +::: + +## Hessian + +The Hessian is defined by + +$$\frac{\partial^{2} l}{\partial \theta^{2}} = \left( \frac{\partial l}{\partial x} \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + \frac{\partial x}{\partial \theta}^{\top}\frac{\partial^{2} l}{\partial x^{2}}\frac{\partial x}{\partial \theta}$$ + +where $\otimes$ is the Kronecker product. Note that $\nabla_{\theta} x$ +is the sensitivity and the second order sensitivities can be found again +via the forward method, which involve another set of ode\'s, namely the +forward-forward sensitivities + +$$\frac{\partial}{\partial t}\left(\frac{\partial^{2} x}{\partial \theta^{2}}\right) = \left( \frac{\partial f}{\partial x} \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + \left( I_{d} \otimes \frac{\partial x}{\partial \theta}^{\top} \right) \frac{\partial^{2} f}{\partial x^{2}} \frac{\partial x}{\partial \theta}.$$ + +From before, we know that + +$$\frac{\partial l}{\partial x} = (-2y+2x) \quad and \quad \frac{\partial^{2} l}{\partial x^{2}} = 2I_{d}$$ + +so our Hessian reduces to + +$$\frac{\partial^{2} l}{\partial \theta^{2}} = \left( \left(-2y+2x\right) \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + 2S^{\top}S,$$ + +where the second term is a good approximation to the Hessian as +mentioned previously. This is the only implementation in place so far +even though obtaining the estimate this way is relatively slow. + +Just to demonstate how it works, lets look at the Hessian at the optimal +point. First, we obtain the optimal value + +::: {.ipython} +In \[211\]: import scipy.linalg,scipy.optimize + +In \[212\]: boxBounds = \[(0.0, 2.0), (0.0, 2.0)\] + +In \[213\]: res = scipy.optimize.minimize(fun=objSIR.cost, + +: \.....: jac=objSIR.sensitivity, \.....: x0=theta, \.....: + bounds=boxBounds, \.....: method=\'L-BFGS-B\') +::: + +Then compare again the least square estimate of the covariance matrix +against our version + +::: {.ipython} +In \[211\]: resLS, cov_x, infodict, mesg, ier = +scipy.optimize.leastsq(func=objSIR.residual, x0=res\[\'x\'\], +full_output=True) + +In \[212\]: HJTJ, outputHJTJ = objSIR.hessian(full_output=True) + +In \[311\]: print(scipy.linalg.inv(HJTJ)) + +In \[312\]: print(cov_x) +::: + +also note the difference between the Hessian and the approximation using +the Jacobian, which is in fact what the least squares routine uses. + +::: {.ipython} +In \[313\]: print(scipy.linalg.inv(outputHJTJ\[\'JTJ\'\])) +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.ipynb new file mode 100644 index 00000000..a00cab66 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.ipynb @@ -0,0 +1,68 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Obtaining good initial value for parameters\n", + "\n", + "## Function Interpolation\n", + "\n", + "When we want to fit the model to data, one of the necessary steps is to\n", + "supply the optimization procedure a good set of initial guess for the\n", + "parameters $\\theta$. This may be a challenge when we do have a good\n", + "understanding of the process we are trying to model i.e. infectious\n", + "disease may all follow the same SIR process but with vastly different\n", + "incubation period.\n", + "\n", + "A method to obtain such initial guess based on the collocation is\n", + "available in this package. A restriction is that data must be present\n", + "for all states. We demonstrate this using the FitzHugh-Nagumo model.\n", + "\n", + "In \\[1\\]: from pygom import SquareLoss, common_models, get_init\n", + "\n", + "In \\[2\\]: import numpy\n", + "\n", + "In \\[3\\]: x0 = \\[-1.0, 1.0\\]\n", + "\n", + "In \\[4\\]: t0 = 0\n", + "\n", + "In \\[5\\]: \\# params\n", + "\n", + "In \\[6\\]: paramEval = \\[('a',0.2), ('b',0.2), ('c',3.0)\\]\n", + "\n", + "In \\[7\\]: ode = common_models.FitzHugh(paramEval)\n", + "\n", + "In \\[8\\]: ode.initial_values = (x0, t0)\n", + "\n", + "In \\[8\\]: t = numpy.linspace(1, 20, 30).astype('float64')\n", + "\n", + "In \\[9\\]: solution = ode.integrate(t)\n", + "\n", + "Below, we try to find the initial guess without supplying any further\n", + "information. The underlying method fits a cubic spline against the\n", + "observation and tries to minimize the difference between the first\n", + "derivative of the spline and the function of the ode. Varying degree of\n", + "smoothness penalty is applied to the spline and the best set of\n", + "parameters is the ones that yields the smallest total error, combining\n", + "both the fit of the spline against data and the spline against the ode.\n", + "\n", + "In \\[10\\]: theta, sInfo = get_init(solution\\[1::,:\\], t, ode,\n", + "theta=None, full_output=True)\n", + "\n", + "In \\[11\\]: print(theta)\n", + "\n", + "In \\[12\\]: print(sInfo)\n", + "\n", + "As seen above, we have obtained a very good guess of the parameters, in\n", + "fact almost the same as the generating process. The information\n", + "regarding the smoothing factor shows that the amount of penalty used is\n", + "small, which is expected given that we use the solution of the ode as\n", + "observations." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.md new file mode 100644 index 00000000..358fd49f --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/initialGuess.md @@ -0,0 +1,59 @@ +# Obtaining good initial value for parameters {#initialGuess} + +## Function Interpolation + +When we want to fit the model to data, one of the necessary steps is to +supply the optimization procedure a good set of initial guess for the +parameters $\theta$. This may be a challenge when we do have a good +understanding of the process we are trying to model i.e. infectious +disease may all follow the same SIR process but with vastly different +incubation period. + +A method to obtain such initial guess based on the collocation is +available in this package. A restriction is that data must be present +for all states. We demonstrate this using the FitzHugh-Nagumo model. + +::: {.ipython} +In \[1\]: from pygom import SquareLoss, common_models, get_init + +In \[2\]: import numpy + +In \[3\]: x0 = \[-1.0, 1.0\] + +In \[4\]: t0 = 0 + +In \[5\]: \# params + +In \[6\]: paramEval = \[(\'a\',0.2), (\'b\',0.2), (\'c\',3.0)\] + +In \[7\]: ode = common_models.FitzHugh(paramEval) + +In \[8\]: ode.initial_values = (x0, t0) + +In \[8\]: t = numpy.linspace(1, 20, 30).astype(\'float64\') + +In \[9\]: solution = ode.integrate(t) +::: + +Below, we try to find the initial guess without supplying any further +information. The underlying method fits a cubic spline against the +observation and tries to minimize the difference between the first +derivative of the spline and the function of the ode. Varying degree of +smoothness penalty is applied to the spline and the best set of +parameters is the ones that yields the smallest total error, combining +both the fit of the spline against data and the spline against the ode. + +::: {.ipython} +In \[10\]: theta, sInfo = get_init(solution\[1::,:\], t, ode, +theta=None, full_output=True) + +In \[11\]: print(theta) + +In \[12\]: print(sInfo) +::: + +As seen above, we have obtained a very good guess of the parameters, in +fact almost the same as the generating process. The information +regarding the smoothing factor shows that the amount of penalty used is +small, which is expected given that we use the solution of the ode as +observations. diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.ipynb new file mode 100644 index 00000000..debb0e4c --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.ipynb @@ -0,0 +1,485 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Confidence Interval of Estimated Parameters\n", + "\n", + "After obtaining the *best* fit, it is natural to report both the point\n", + "estimate and the confidence level at the $\\alpha$ level. The easiest way\n", + "to do this is by invoking the normality argument and use Fisher\n", + "information of the likelihood. As explained previously at the bottom of\n", + "`gradient`, we can find the Hessian, $\\mathbf{H}$, or the approximated\n", + "Hessian for the estimated parameters. The Cramer--Rao inequality, we\n", + "know that\n", + "\n", + "$$Var(\\hat{\\theta}) \\ge \\frac{1}{I(\\theta)},$$\n", + "\n", + "where $I(\\theta)$ is the Fisher information, which is the Hessian\n", + "subject to regularity condition. Given the Hessian, computing the\n", + "confidence intervals is trivial. Note that this is also known as the\n", + "asymptotic confidence interval where the normality comes from invoking\n", + "the CLT. There are other ways of obtaining a confidence intervals, we\n", + "will the ones implemented in the package. First, we will set up a SIR\n", + "model as seen in `sir` which will be used throughout this page.\n", + "\n", + "In \\[1\\]: from pygom import NormalLoss, common_models\n", + "\n", + "In \\[2\\]: from pygom.utilR import qchisq\n", + "\n", + "In \\[3\\]: import numpy\n", + "\n", + "In \\[4\\]: import scipy.integrate\n", + "\n", + "In \\[5\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[6\\]: import copy\n", + "\n", + "In \\[7\\]: ode = common_models.SIR(\\[('beta', 0.5), ('gamma', 1.0/3.0)\\])\n", + "\n", + "and we assume that we only have observed realization from the $R$\n", + "compartment\n", + "\n", + "In \\[1\\]: x0 = \\[1, 1.27e-6, 0\\]\n", + "\n", + "In \\[2\\]: t = numpy.linspace(0, 150, 100).astype('float64')\n", + "\n", + "In \\[3\\]: ode.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[4\\]: solution = ode.integrate(t\\[1::\\])\n", + "\n", + "In \\[5\\]: theta = \\[0.2, 0.2\\]\n", + "\n", + "In \\[6\\]: targetState = \\['R'\\]\n", + "\n", + "In \\[7\\]: targetStateIndex =\n", + "numpy.array(ode.get_state_index(targetState))\n", + "\n", + "In \\[8\\]: y = solution\\[1::,targetStateIndex\\] + numpy.random.normal(0,\n", + "0.01, (len(solution\\[1::,targetStateIndex\\]), 1))\n", + "\n", + "In \\[9\\]: yObv = y.copy()\n", + "\n", + "In \\[10\\]: objSIR = NormalLoss(theta, ode, x0, t\\[0\\], t\\[1::\\], y,\n", + "targetState)\n", + "\n", + "In \\[11\\]: boxBounds = \\[(1e-8, 2.0), (1e-8, 2.0)\\]\n", + "\n", + "In \\[12\\]: boxBoundsArray = numpy.array(boxBounds)\n", + "\n", + "In \\[13\\]: xhat = objSIR.fit(theta, lb=boxBoundsArray\\[:,0\\],\n", + "ub=boxBoundsArray\\[:,1\\])\n", + "\n", + "## Asymptotic\n", + "\n", + "When the estimate is obtained say, under a square loss or a normal\n", + "assumption, the corresponding likelihood can be written down easily. In\n", + "such a case, likelihood ratio test under a Chi--squared distribution is\n", + "\n", + "$$2 (\\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\mathcal{L}(\\boldsymbol{\\theta})) \\le \\chi_{1 - \\alpha}^{2}(k)$$\n", + "\n", + "where $1-\\alpha$ is the size of the confidence region and $k$ is the\n", + "degree of freedom. The corresponding asymptotic confidence interval for\n", + "parameter $j$ can be derived as\n", + "\n", + "$$\\hat{\\theta}_{j} \\pm \\sqrt{\\chi_{1 - \\alpha}^{2}(k) H_{i,i}}.$$\n", + "\n", + "A pointwise confidence interval is obtained when $k = 1$. We assume in\n", + "our package that a pointwise confidence interval is desired. This can be\n", + "obtained simply by\n", + "\n", + "In \\[1\\]: from pygom import confidence_interval as ci\n", + "\n", + "In \\[2\\]: alpha = 0.05\n", + "\n", + "In \\[3\\]: xL, xU = ci.asymptotic(objSIR, alpha, xhat,\n", + "lb=boxBoundsArray\\[:,0\\], ub=boxBoundsArray\\[:,1\\])\n", + "\n", + "In \\[4\\]: print(xL)\n", + "\n", + "In \\[5\\]: print(xU)\n", + "\n", + "Note that the set of bounds here is only used for check the validity of\n", + "$\\hat{\\mathbf{x}}$ and not used in the calculation of the confidence\n", + "intervals. Therefore the resulting output can be outside of the box\n", + "constraints.\n", + "\n", + "## Profile Likelihood\n", + "\n", + "Another approach to calculate the confidence interval is to tackle one\n", + "parameter at a time, treating the rest of them as nuisance parameters,\n", + "hence the term *profile*. Let $\\mathcal{L}(\\boldsymbol{\\theta})$ be our\n", + "log--likelihood with parameter $\\boldsymbol{\\theta}$. Element\n", + "$\\theta_{j}$ is our parameter of interest and $\\boldsymbol{\\theta}_{-j}$\n", + "represents the complement such that\n", + "$\\boldsymbol{\\theta} = \\theta_{j} \\cup \\boldsymbol{\\theta}_{-j}$. For\n", + "simply models such as linear regression with only regression\n", + "coefficients $\\boldsymbol{\\beta}$, then\n", + "$\\boldsymbol{\\theta} = \\boldsymbol{\\beta}$.\n", + "\n", + "To shorten the notation, let\n", + "\n", + "$$\\mathcal{L}(\\boldsymbol{\\theta}_{-j} \\mid \\theta_{j}) = \\max \\mathcal{L}(\\boldsymbol{\\theta}_{-j} \\mid \\theta_{j})$$\n", + "\n", + "which is the maxima of $\\boldsymbol{\\theta}_{-j}$ given $\\theta_{j}$.\n", + "$\\hat{\\boldsymbol{\\theta}}$ denotes the MLE of the parameters as usual.\n", + "The profile--likelihood based confidence interval for $\\theta_{j}$ is\n", + "defined as\n", + "\n", + "$$\\begin{aligned}\n", + "\\theta_{j}^{U} &= \\sup \\left\\{ \\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) \\le \\frac{1}{2} \\chi_{1 - \\alpha}^{2}(1) \\right\\} \\\\\n", + "\\theta_{j}^{L} &= \\inf \\left\\{ \\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) \\le \\frac{1}{2} \\chi_{1 - \\alpha}^{2}(1) \\right\\}\n", + "\\end{aligned}$$\n", + "\n", + "where again we have made use of the normal approximation, but without\n", + "imposing symmetry. The set of equations above automatically implies that\n", + "the interval width is $\\theta_{j}^{U} - \\theta_{j}^{L}$ and\n", + "\n", + "$$\\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\frac{1}{2} \\chi_{1-\\alpha}^{2}(1) - \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) = 0.$$\n", + "\n", + "As mentioned previously, $\\boldsymbol{\\theta}_{-j}$ is the maximizer of\n", + "the nuisance parameters, which has a gradient of zero. Combining this\n", + "with the equation above yields a non--linear system of equations of size\n", + "$p$,\n", + "\n", + "$$\\begin{aligned}\n", + "g(\\boldsymbol{\\theta}) = \\left[ \\begin{array}{c} \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) - c \\\\ \\frac{\\partial \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j})}{\\partial \\boldsymbol{\\theta}_{-j}} \\end{array} \\right] = 0\n", + "\\end{aligned}$$\n", + "\n", + "where\n", + "$c = \\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) + \\frac{1}{2} \\chi_{1-\\alpha}^{2}(1)$.\n", + "Solving this set of system of equations only need simple Newton like\n", + "steps, possibly with correction terms as per [\\[Venzon1988\\]](). We\n", + "provide a function to obtain such estimate\n", + "\n", + "In \\[1\\]: xLProfile, xUProfile, xLProfileList, xUProfileList =\n", + "ci.profile(objSIR, alpha, xhat, lb=boxBoundsArray\\[:,0\\],\n", + "ub=boxBoundsArray\\[:,1\\], full_output=True)\n", + "\n", + "but unfortunately this is not accurate most of the time due to the\n", + "complicated surface at locations not around $\\hat{\\theta}$. This is a\n", + "common scenario for non--linear least square problems because the\n", + "Hessian is not guaranteed to be a PSD everywhere. Therefore, a safeguard\n", + "is in place to obtain the $\\theta_{j}^{U},\\theta_{j}^{L}$ by iteratively\n", + "by updating $\\theta_{j}$ and find the solution to `nuisanceOptim`.\n", + "\n", + "Furthermore, we also provide the functions necessary to obtain the\n", + "estimates such as the four below.\n", + "\n", + "In \\[1\\]: i = 0\n", + "\n", + "In \\[1\\]: funcF = ci.\\_profileF(xhat, i, 0.05, objSIR)\n", + "\n", + "In \\[2\\]: funcG = ci.\\_profileG(xhat, i, 0.05, objSIR)\n", + "\n", + "In \\[3\\]: funcGC = ci.\\_profileGSecondOrderCorrection(xhat, i, alpha,\n", + "objSIR)\n", + "\n", + "In \\[4\\]: funcH = ci.\\_profileH(xhat, i, 0.05, objSIR)\n", + "\n", + "Where $i$ is the index of the parameter of interest. `_profileF` is the\n", + "squared norm of `obj`, which easy the optimization process for solvers\n", + "which requires a converted form from system of equations to non-linear\n", + "least squares. `_profileG` is the systems of equations `obj`,\n", + "`_profileH` is the derivative of `obj`\n", + "\n", + "$$\\begin{aligned}\n", + "\\nabla g(\\boldsymbol{\\theta}) = \\left[ \\begin{array}{c} \\frac{\\partial \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j})}{\\partial \\theta_{j}} \\\\ \\frac{\\partial^{2} \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j})}{\\partial \\boldsymbol{\\beta}_{-j} \\partial \\theta_{j}} \\end{array} \\right]\n", + "\\end{aligned}$$\n", + "\n", + "and `_profileGSecondOrderCorrection` has the second order correction\n", + "[\\[Venzon1988\\]]().\n", + "\n", + "## Geometric profile likelihood\n", + "\n", + "Due to the difficulty in obtain a profile likelihood via the standard\n", + "Newton like steps, we also provide a way to generate a similar result\n", + "using the geometric structure of the likelihood surface. We follow the\n", + "method in [\\[Moolgavkar1987\\]](), which involves solving a set of\n", + "differential equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{d\\beta_{j}}{dt} &= k g^{-1/2} \\\\\n", + "\\frac{d\\boldsymbol{\\beta}_{-j}}{dt} &= \\frac{d\\boldsymbol{\\beta}_{-j}}{d\\beta_{j}} \\frac{d\\beta_{j}}{dt},\n", + "\\end{aligned}$$\n", + "\n", + "where $k = \\Phi(1-\\alpha)$ is the quantile we want to obtain under a\n", + "normal distribution, and\n", + "\n", + "$$\\begin{aligned}\n", + "g = J_{\\beta_{j}}^{\\top} I^{\\boldsymbol{\\beta}} J_{\\beta_{j}}, \\quad J_{\\beta_{j}} = \\left( \\begin{array}{c} 1 \\\\ \\frac{d\\boldsymbol{\\beta}_{-j}}{d\\beta_{j}} \\end{array} \\right).\n", + "\\end{aligned}$$\n", + "\n", + "Here, $J_{\\beta_{j}}$ is the Jacobian between $\\beta_{j}$ and\n", + "$\\boldsymbol{\\beta}_{-j}$ with the term\n", + "\n", + "$$\\frac{d\\boldsymbol{\\beta}_{-j}}{d\\beta_{j}} = -\\left( \\frac{\\partial^{2} \\mathcal{L}}{\\partial \\boldsymbol{\\beta}_{-j}\\partial \\boldsymbol{\\beta}_{-j}^{\\top} } \\right)^{-1} \\frac{\\partial^{2} \\mathcal{L}}{\\partial \\beta_{j} \\partial \\beta_{-j}^{\\top}}$$\n", + "\n", + "and hence the first element is $1$ (identity transformation).\n", + "$I^{\\boldsymbol{\\beta}}$ is the Fisher information of\n", + "$\\boldsymbol{\\beta}$, which is\n", + "\n", + "$$I^{\\boldsymbol{\\beta}} = \\frac{\\partial \\boldsymbol{\\theta}}{\\partial \\boldsymbol{\\beta}^{\\top}} \\Sigma^{\\boldsymbol{\\theta}(\\boldsymbol{\\beta})} \\frac{\\partial \\boldsymbol{\\theta}}{\\partial \\boldsymbol{\\beta}}.$$\n", + "\n", + "It is simply $\\Sigma^{\\boldsymbol{\\beta}}$ if\n", + "$\\boldsymbol{\\theta} = \\boldsymbol{\\beta}$. Different Fisher information\n", + "can be used for $\\Sigma^{\\boldsymbol{\\beta}}$ such as the expected or\n", + "observed, at $\\hat{\\boldsymbol{\\beta}}$ or $\\boldsymbol{\\beta}$. After\n", + "some trivial algebraic manipulation, we can show that our ode boils\n", + "downs to\n", + "\n", + "$$\\begin{aligned}\n", + "\\left[ \\begin{array}{c} \\frac{d\\beta_{j}}{dt} \\\\ \\frac{d\\boldsymbol{\\beta_{-j}}}{dt} \\end{array} \\right] = k \\left[ \\begin{array}{c} 1 \\\\ -A^{-1}w \\end{array} \\right] \\left( v - w^{\\top}A^{-1}w \\right)^{-1/2}\n", + "\\end{aligned}$$\n", + "\n", + "where the symbols on the RHS above correspond to partitions in the\n", + "Fisher information\n", + "\n", + "$$\\begin{aligned}\n", + "I^{\\boldsymbol{\\beta}} = \\left[ \\begin{array}{cc} v & w^{\\top} \\\\ w & A \\end{array} \\right].\n", + "\\end{aligned}$$\n", + "\n", + "The integration is perform from $t = 0$ to $1$ and is all handled\n", + "internally via `geometric`\n", + "\n", + "In \\[1\\]: xLGeometric, xUGeometric, xLList, xUList =\n", + "ci.geometric(objSIR, alpha, xhat, full_output=True)\n", + "\n", + "In \\[2\\]: print(xLGeometric)\n", + "\n", + "In \\[3\\]: print(xUGeometric)\n", + "\n", + "## Bootstrap\n", + "\n", + "This is perhaps the favorite method to estimate confidence interval for\n", + "a lot of people. Although there are many ways to implement bootstrap,\n", + "semi-parametric is the only logical choice (even though the underlying\n", + "assumptions may be violated at times). As we have only implemented OLS\n", + "type loss functions in this package, the parametric approach seem to be\n", + "inappropriate when there is no self--efficiency guarantee.\n", + "Non-parametric approach requires at least a conditional independence\n", + "assumption, something easily violated by our **ode**. Block bootstrap is\n", + "an option but we are also aware that the errors of an **ode** can be\n", + "rather rigid, and consistently over/under estimate at certain periods of\n", + "time.\n", + "\n", + "When we say semi-parametric, we mean the exchange of errors between the\n", + "observations. Let our raw error be\n", + "\n", + "$$\\varepsilon_{i} = y_{i} - \\hat{y}_{i}$$\n", + "\n", + "where $\\hat{y}_{i}$ will be the prediction under\n", + "$\\hat{\\boldsymbol{\\theta}}$ under our model. Then we construct a new set\n", + "of observations via\n", + "\n", + "$$y_{i}^{\\ast} = \\hat{y}_{i} + \\varepsilon^{\\ast}, \\quad \\varepsilon^{\\ast} \\sim \\mathcal{F}$$\n", + "\n", + "with $\\mathcal{F}$ being the empirical distribution of the raw errors. A\n", + "new set of parameters $\\theta^{\\ast}$ are then found for the\n", + "bootstrapped samples, and we obtain the $\\alpha$ confidence interval by\n", + "taking the $\\alpha/2$ quantiles. Invoke the correspond python function\n", + "yields our bootstrap estimates. Unlike `asymptotic`, the bounds here are\n", + "used when estimating the parameters of each bootstrap samples. An error\n", + "may be returned if estimation failed for any of the bootstrap samples.\n", + "\n", + "In \\[1\\]: xLBootstrap, xUBootstrap, setX = ci.bootstrap(objSIR, alpha,\n", + "xhat, iteration=10, lb=boxBoundsArray\\[:,0\\], ub=boxBoundsArray\\[:,1\\],\n", + "full_output=True)\n", + "\n", + "In \\[2\\]: print(xLBootstrap)\n", + "\n", + "In \\[3\\]: print(xUBootstrap)\n", + "\n", + "The additional information here can be used to compute the bias, tail\n", + "effects and test against the normality assumption. If desired, a\n", + "simultaneous confidence interval can also be approximated empirically.\n", + "Note however that because we are using a semi--parameter method here, if\n", + "the model specification is wrong then the resulting estimates for the\n", + "bias is also wrong. The confidence interval still has the normal\n", + "approximation guarantee if number of sample is large.\n", + "\n", + "In this case, because the error in the observation is extremely small,\n", + "the confidence interval is narrow.\n", + "\n", + "In \\[1\\]: import pylab as P\n", + "\n", + "In \\[2\\]: f = plt.figure()\n", + "\n", + "In \\[3\\]: n, bins, patches = P.hist(setX\\[:,0\\], 50)\n", + "\n", + "In \\[4\\]: P.xlabel(r'Estimates of \\$beta\\$');\n", + "\n", + "In \\[5\\]: P.ylabel('Frequency');\n", + "\n", + "In \\[6\\]: P.title('Estimates under a semi-parametric bootstrap scheme');\n", + "\n", + "@savefig bootstrapCIHist.png In \\[7\\]: P.show()\n", + "\n", + "In \\[8\\]: P.close()\n", + "\n", + "## Comparison Between Methods\n", + "\n", + "Although we have shown the numerical values for the confidence interval\n", + "obtained using different method, it may be hard to comprehend how they\n", + "vary. As they say, a picture says a million word, and given that this\n", + "particular model only has two parameters, we can obtain inspect and\n", + "compare the methods visually via a contour plot. The code to perform\n", + "this is shown below but the code block will not be run to save time and\n", + "space.\n", + "\n", + "In the plot above, the bootstrap confidence interval were so close to\n", + "the MLE, it is impossible to distinguish the two on such a coarse scale.\n", + "\n", + "Furthermore, because the geometric confidence interval is the result of\n", + "an integration, we can trace the path that lead to the final output that\n", + "was shown previously. Again, we are space conscious (and time\n", + "constrained) so the code block below will not be run.\n", + "\n", + "In \\[1\\]: fig = plt.figure()\n", + "\n", + "In \\[2\\]: CS = plt.contour(xi, yi, zi, linewidth=0.5)\n", + "\n", + "In \\[3\\]: plt.clabel(CS, fontsize=10, inline=1)\n", + "\n", + "In \\[4\\]: l1 = plt.scatter(xLList\\[0\\]\\[:,0\\], xLList\\[0\\]\\[:,1\\],\n", + "marker='o', c='m', s=10);\n", + "\n", + "In \\[5\\]: l2 = plt.scatter(xUList\\[0\\]\\[:,0\\], xUList\\[0\\]\\[:,1\\],\n", + "marker='x', c='m', s=10);\n", + "\n", + "In \\[6\\]: plt.legend((l1, l2), ('Lower CI path', 'Upper CI path'),\n", + "loc='upper left');\n", + "\n", + "In \\[7\\]: plt.ylabel(r'Estimates of \\$gamma\\$');\n", + "\n", + "In \\[8\\]: plt.xlabel(r'Estimates of \\$beta\\$');\n", + "\n", + "In \\[9\\]: plt.title('Integration path of the geometric confidence\n", + "intervals on the likelihood surface');\n", + "\n", + "In \\[10\\]: plt.tight_layout();\n", + "\n", + "In \\[11\\]: plt.show()\n", + "\n", + "In \\[12\\]: plt.close()\n", + "\n", + "## Profile Likelihood Surface\n", + "\n", + "To investigate why it was hard to find the profile likelihood confidence\n", + "interval, we can simply look at the surface (which is simply a line as\n", + "we are profiling). We find solution of `nuisanceOptim` for each\n", + "$\\boldsymbol{\\theta}_{-j}$ at various points of $\\boldsymbol{\\theta}$.\n", + "Equivalently, we can minimize the original loss function as defined\n", + "previously, and this is the approach below. We focus out attention to\n", + "the parameter $\\beta$ of our SIR model. The results are not shown here\n", + "but the existence of a solution to `obj` is evident by simply\n", + "*eyeballing* the plots.\n", + "\n", + "In \\[1\\]: numIter = 100\n", + "\n", + "In \\[2\\]: x2 = numpy.linspace(0.0, 2.0, numIter)\n", + "\n", + "In \\[3\\]: funcOut = numpy.linspace(0.0, 2.0, numIter)\n", + "\n", + "In \\[4\\]: ode.parameters = \\[('beta',0.5), ('gamma',1.0/3.0)\\]\n", + "\n", + "In \\[5\\]: for i in range(numIter): \n", + "...: paramEval = \\[('beta',x2\\[i\\]), ('gamma',x2\\[i\\])\\] ...: ode2 =\n", + "copy.deepcopy(ode) ...: ode2.parameters = paramEval ...:\n", + "ode2.initial_values = (x0, t\\[0\\]) ...: objSIR2 = NormalLoss(x2\\[i\\],\n", + "ode2, x0, t\\[0\\], t\\[1::\\], yObv.copy(), targetState,\n", + "target_param='gamma') ...: res =\n", + "scipy.optimize.minimize(fun=objSIR2.cost, ...: jac=objSIR2.gradient,\n", + "...: x0=x2\\[i\\], ...: bounds=\\[(0,2)\\], ...: method='L-BFGS-B') ...:\n", + "funcOut\\[i\\] = res\\['fun'\\]\n", + "\n", + "In \\[10\\]: fig = plt.figure()\n", + "\n", + "In \\[10\\]: plt.plot(x2, objSIR.cost(xhat) - funcOut)\n", + "\n", + "In \\[11\\]: l1 = plt.axhline(-0.5\\*qchisq(1 - alpha, df=1), 0, 2,\n", + "color='r')\n", + "\n", + "In \\[12\\]: plt.ylabel(r'\\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid\n", + "beta)\\$');\n", + "\n", + "In \\[13\\]: plt.xlabel(r'Fixed value of \\$beta\\$');\n", + "\n", + "In \\[14\\]: plt.title('Difference in objective function between MLEn and\n", + "the maximization of the nuisance parameters given then parameter of\n", + "interest, beta in this case');\n", + "\n", + "In \\[15\\]: plt.tight_layout();\n", + "\n", + "In \\[16\\]: plt.legend((l1,), (r'\\$-0.5mathcal{X}\\_{1 -\n", + "alpha}^{2}(1)\\$',), loc='lower right');\n", + "\n", + "@savefig profileLLMaximizerGivenBeta.png In \\[17\\]: plt.show() \\#\n", + "@savefig profileLLMaximizerGivenBeta.png\n", + "\n", + "In \\[18\\]: plt.close()\n", + "\n", + "Both the upper and lower confidence interval can be found in the\n", + "profiling procedure, but the part between of\n", + "$\\beta \\in \\left[0,\\hat{\\beta}\\right]$ is not convex, with $\\hat{\\beta}$\n", + "being the MLE. This non--quadratic profile likelihood is due to the\n", + "non-identifiability of the model given data [\\[Raue2009\\]](). For this\n", + "particular case, we can fix it simply by introducing additional\n", + "observations in the form of the $I$ state. We encourage the users to try\n", + "it out for themselves to confirm.\n", + "\n", + "In \\[1\\]: targetState = \\['I', 'R'\\]\n", + "\n", + "In \\[2\\]: targetStateIndex =\n", + "numpy.array(ode.get_state_index(targetState))\n", + "\n", + "In \\[3\\]: y = solution\\[1::,targetStateIndex\\] + numpy.random.normal(0,\n", + "0.01, (len(solution\\[1::,targetStateIndex\\]), 1))\n", + "\n", + "In \\[4\\]: objSIR = NormalLoss(theta, ode, x0, t\\[0\\], t\\[1::\\],\n", + "y.copy(), targetState)\n", + "\n", + "In \\[5\\]: xhat = objSIR.fit(theta, lb=boxBoundsArray\\[:,0\\],\n", + "ub=boxBoundsArray\\[:,1\\])\n", + "\n", + "In \\[6\\]: for i in range(numIter): \n", + "...: paramEval = \\[('beta', x2\\[i\\]), ('gamma', x2\\[i\\])\\] ...: ode2 =\n", + "copy.deepcopy(ode) ...: ode2.parameters = paramEval ...:\n", + "ode2.initial_values = (x0, t\\[0\\]) ...: objSIR2 = NormalLoss(x2\\[i\\],\n", + "ode2, x0, t\\[0\\], t\\[1::\\], y.copy(), targetState, target_param='gamma')\n", + "...: res = scipy.optimize.minimize(fun=objSIR2.cost, ...:\n", + "jac=objSIR2.gradient, ...: x0=x2\\[i\\], ...: bounds=\\[(0,2)\\], ...:\n", + "method='L-BFGS-B') ...: funcOut\\[i\\] = res\\['fun'\\]\n", + "\n", + "In \\[10\\]: fig = plt.figure()\n", + "\n", + "In \\[10\\]: plt.plot(x2, objSIR.cost(xhat) - funcOut);\n", + "\n", + "In \\[11\\]: l1 = plt.axhline(-0.5\\*qchisq(1 - alpha, df=1), 0, 2,\n", + "color='r')\n", + "\n", + "In \\[12\\]: plt.ylabel(r'\\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid\n", + "beta)\\$');\n", + "\n", + "In \\[13\\]: plt.xlabel(r'Fixed value of \\$beta\\$');\n", + "\n", + "In \\[14\\]: plt.title('Profile likelihood curve for the parameter ofn\n", + "interest with more observation');\n", + "\n", + "In \\[15\\]: plt.tight_layout();\n", + "\n", + "In \\[16\\]: plt.legend((l1,), (r'\\$-0.5mathcal{X}\\_{1 -\n", + "alpha}^{2}(1)\\$',), loc='lower right');\n", + "\n", + "@savefig profileLLMaximizerGivenBetaMoreObs.png In \\[17\\]: plt.show() \\#\n", + "@savefig profileLLMaximizerGivenBetaMoreObs.png\n", + "\n", + "In \\[18\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.md new file mode 100644 index 00000000..aa50fb5a --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/profile.md @@ -0,0 +1,506 @@ +# Confidence Interval of Estimated Parameters {#profile} + +After obtaining the *best* fit, it is natural to report both the point +estimate and the confidence level at the $\alpha$ level. The easiest way +to do this is by invoking the normality argument and use Fisher +information of the likelihood. As explained previously at the bottom of +`gradient`{.interpreted-text role="ref"}, we can find the Hessian, +$\mathbf{H}$, or the approximated Hessian for the estimated parameters. +The Cramer\--Rao inequality, we know that + +$$Var(\hat{\theta}) \ge \frac{1}{I(\theta)},$$ + +where $I(\theta)$ is the Fisher information, which is the Hessian +subject to regularity condition. Given the Hessian, computing the +confidence intervals is trivial. Note that this is also known as the +asymptotic confidence interval where the normality comes from invoking +the CLT. There are other ways of obtaining a confidence intervals, we +will the ones implemented in the package. First, we will set up a SIR +model as seen in `sir`{.interpreted-text role="ref"} which will be used +throughout this page. + +::: {.ipython} +In \[1\]: from pygom import NormalLoss, common_models + +In \[2\]: from pygom.utilR import qchisq + +In \[3\]: import numpy + +In \[4\]: import scipy.integrate + +In \[5\]: import matplotlib.pyplot as plt + +In \[6\]: import copy + +In \[7\]: ode = common_models.SIR(\[(\'beta\', 0.5), (\'gamma\', +1.0/3.0)\]) +::: + +and we assume that we only have observed realization from the $R$ +compartment + +::: {.ipython} +In \[1\]: x0 = \[1, 1.27e-6, 0\] + +In \[2\]: t = numpy.linspace(0, 150, 100).astype(\'float64\') + +In \[3\]: ode.initial_values = (x0, t\[0\]) + +In \[4\]: solution = ode.integrate(t\[1::\]) + +In \[5\]: theta = \[0.2, 0.2\] + +In \[6\]: targetState = \[\'R\'\] + +In \[7\]: targetStateIndex = +numpy.array(ode.get_state_index(targetState)) + +In \[8\]: y = solution\[1::,targetStateIndex\] + numpy.random.normal(0, +0.01, (len(solution\[1::,targetStateIndex\]), 1)) + +In \[9\]: yObv = y.copy() + +In \[10\]: objSIR = NormalLoss(theta, ode, x0, t\[0\], t\[1::\], y, +targetState) + +In \[11\]: boxBounds = \[(1e-8, 2.0), (1e-8, 2.0)\] + +In \[12\]: boxBoundsArray = numpy.array(boxBounds) + +In \[13\]: xhat = objSIR.fit(theta, lb=boxBoundsArray\[:,0\], +ub=boxBoundsArray\[:,1\]) +::: + +## Asymptotic + +When the estimate is obtained say, under a square loss or a normal +assumption, the corresponding likelihood can be written down easily. In +such a case, likelihood ratio test under a Chi\--squared distribution is + +$$2 (\mathcal{L}(\hat{\boldsymbol{\theta}}) - \mathcal{L}(\boldsymbol{\theta})) \le \chi_{1 - \alpha}^{2}(k)$$ + +where $1-\alpha$ is the size of the confidence region and $k$ is the +degree of freedom. The corresponding asymptotic confidence interval for +parameter $j$ can be derived as + +$$\hat{\theta}_{j} \pm \sqrt{\chi_{1 - \alpha}^{2}(k) H_{i,i}}.$$ + +A pointwise confidence interval is obtained when $k = 1$. We assume in +our package that a pointwise confidence interval is desired. This can be +obtained simply by + +::: {.ipython} +In \[1\]: from pygom import confidence_interval as ci + +In \[2\]: alpha = 0.05 + +In \[3\]: xL, xU = ci.asymptotic(objSIR, alpha, xhat, +lb=boxBoundsArray\[:,0\], ub=boxBoundsArray\[:,1\]) + +In \[4\]: print(xL) + +In \[5\]: print(xU) +::: + +Note that the set of bounds here is only used for check the validity of +$\hat{\mathbf{x}}$ and not used in the calculation of the confidence +intervals. Therefore the resulting output can be outside of the box +constraints. + +## Profile Likelihood + +Another approach to calculate the confidence interval is to tackle one +parameter at a time, treating the rest of them as nuisance parameters, +hence the term *profile*. Let $\mathcal{L}(\boldsymbol{\theta})$ be our +log\--likelihood with parameter $\boldsymbol{\theta}$. Element +$\theta_{j}$ is our parameter of interest and $\boldsymbol{\theta}_{-j}$ +represents the complement such that +$\boldsymbol{\theta} = \theta_{j} \cup \boldsymbol{\theta}_{-j}$. For +simply models such as linear regression with only regression +coefficients $\boldsymbol{\beta}$, then +$\boldsymbol{\theta} = \boldsymbol{\beta}$. + +To shorten the notation, let + +$$\mathcal{L}(\boldsymbol{\theta}_{-j} \mid \theta_{j}) = \max \mathcal{L}(\boldsymbol{\theta}_{-j} \mid \theta_{j})$$ + +which is the maxima of $\boldsymbol{\theta}_{-j}$ given $\theta_{j}$. +$\hat{\boldsymbol{\theta}}$ denotes the MLE of the parameters as usual. +The profile\--likelihood based confidence interval for $\theta_{j}$ is +defined as + +$$\begin{aligned} +\theta_{j}^{U} &= \sup \left\{ \mathcal{L}(\hat{\boldsymbol{\theta}}) - \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) \le \frac{1}{2} \chi_{1 - \alpha}^{2}(1) \right\} \\ +\theta_{j}^{L} &= \inf \left\{ \mathcal{L}(\hat{\boldsymbol{\theta}}) - \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) \le \frac{1}{2} \chi_{1 - \alpha}^{2}(1) \right\} +\end{aligned}$$ + +where again we have made use of the normal approximation, but without +imposing symmetry. The set of equations above automatically implies that +the interval width is $\theta_{j}^{U} - \theta_{j}^{L}$ and + +$$\mathcal{L}(\hat{\boldsymbol{\theta}}) - \frac{1}{2} \chi_{1-\alpha}^{2}(1) - \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) = 0.$$ + +As mentioned previously, $\boldsymbol{\theta}_{-j}$ is the maximizer of +the nuisance parameters, which has a gradient of zero. Combining this +with the equation above yields a non\--linear system of equations of +size $p$, + +$$\begin{aligned} +g(\boldsymbol{\theta}) = \left[ \begin{array}{c} \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) - c \\ \frac{\partial \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j})}{\partial \boldsymbol{\theta}_{-j}} \end{array} \right] = 0 +\end{aligned}$$ + +where +$c = \mathcal{L}(\hat{\boldsymbol{\theta}}) + \frac{1}{2} \chi_{1-\alpha}^{2}(1)$. +Solving this set of system of equations only need simple Newton like +steps, possibly with correction terms as per [\[Venzon1988\]](). We +provide a function to obtain such estimate + +::: {.ipython verbatim=""} +In \[1\]: xLProfile, xUProfile, xLProfileList, xUProfileList = +ci.profile(objSIR, alpha, xhat, lb=boxBoundsArray\[:,0\], +ub=boxBoundsArray\[:,1\], full_output=True) +::: + +but unfortunately this is not accurate most of the time due to the +complicated surface at locations not around $\hat{\theta}$. This is a +common scenario for non\--linear least square problems because the +Hessian is not guaranteed to be a PSD everywhere. Therefore, a safeguard +is in place to obtain the $\theta_{j}^{U},\theta_{j}^{L}$ by iteratively +by updating $\theta_{j}$ and find the solution to +`nuisanceOptim`{.interpreted-text role="eq"}. + +Furthermore, we also provide the functions necessary to obtain the +estimates such as the four below. + +::: {.ipython} +In \[1\]: i = 0 + +In \[1\]: funcF = ci.\_profileF(xhat, i, 0.05, objSIR) + +In \[2\]: funcG = ci.\_profileG(xhat, i, 0.05, objSIR) + +In \[3\]: funcGC = ci.\_profileGSecondOrderCorrection(xhat, i, alpha, +objSIR) + +In \[4\]: funcH = ci.\_profileH(xhat, i, 0.05, objSIR) +::: + +Where $i$ is the index of the parameter of interest. +`_profileF`{.interpreted-text role="func"} is the squared norm of +`obj`{.interpreted-text role="eq"}, which easy the optimization process +for solvers which requires a converted form from system of equations to +non-linear least squares. `_profileG`{.interpreted-text role="func"} is +the systems of equations `obj`{.interpreted-text role="eq"}, +`_profileH`{.interpreted-text role="func"} is the derivative of +`obj`{.interpreted-text role="eq"} + +$$\begin{aligned} +\nabla g(\boldsymbol{\theta}) = \left[ \begin{array}{c} \frac{\partial \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j})}{\partial \theta_{j}} \\ \frac{\partial^{2} \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j})}{\partial \boldsymbol{\beta}_{-j} \partial \theta_{j}} \end{array} \right] +\end{aligned}$$ + +and `_profileGSecondOrderCorrection`{.interpreted-text role="func"} has +the second order correction [\[Venzon1988\]](). + +## Geometric profile likelihood + +Due to the difficulty in obtain a profile likelihood via the standard +Newton like steps, we also provide a way to generate a similar result +using the geometric structure of the likelihood surface. We follow the +method in [\[Moolgavkar1987\]](), which involves solving a set of +differential equations + +$$\begin{aligned} +\frac{d\beta_{j}}{dt} &= k g^{-1/2} \\ +\frac{d\boldsymbol{\beta}_{-j}}{dt} &= \frac{d\boldsymbol{\beta}_{-j}}{d\beta_{j}} \frac{d\beta_{j}}{dt}, +\end{aligned}$$ + +where $k = \Phi(1-\alpha)$ is the quantile we want to obtain under a +normal distribution, and + +$$\begin{aligned} +g = J_{\beta_{j}}^{\top} I^{\boldsymbol{\beta}} J_{\beta_{j}}, \quad J_{\beta_{j}} = \left( \begin{array}{c} 1 \\ \frac{d\boldsymbol{\beta}_{-j}}{d\beta_{j}} \end{array} \right). +\end{aligned}$$ + +Here, $J_{\beta_{j}}$ is the Jacobian between $\beta_{j}$ and +$\boldsymbol{\beta}_{-j}$ with the term + +$$\frac{d\boldsymbol{\beta}_{-j}}{d\beta_{j}} = -\left( \frac{\partial^{2} \mathcal{L}}{\partial \boldsymbol{\beta}_{-j}\partial \boldsymbol{\beta}_{-j}^{\top} } \right)^{-1} \frac{\partial^{2} \mathcal{L}}{\partial \beta_{j} \partial \beta_{-j}^{\top}}$$ + +and hence the first element is $1$ (identity transformation). +$I^{\boldsymbol{\beta}}$ is the Fisher information of +$\boldsymbol{\beta}$, which is + +$$I^{\boldsymbol{\beta}} = \frac{\partial \boldsymbol{\theta}}{\partial \boldsymbol{\beta}^{\top}} \Sigma^{\boldsymbol{\theta}(\boldsymbol{\beta})} \frac{\partial \boldsymbol{\theta}}{\partial \boldsymbol{\beta}}.$$ + +It is simply $\Sigma^{\boldsymbol{\beta}}$ if +$\boldsymbol{\theta} = \boldsymbol{\beta}$. Different Fisher information +can be used for $\Sigma^{\boldsymbol{\beta}}$ such as the expected or +observed, at $\hat{\boldsymbol{\beta}}$ or $\boldsymbol{\beta}$. After +some trivial algebraic manipulation, we can show that our ode boils +downs to + +$$\begin{aligned} +\left[ \begin{array}{c} \frac{d\beta_{j}}{dt} \\ \frac{d\boldsymbol{\beta_{-j}}}{dt} \end{array} \right] = k \left[ \begin{array}{c} 1 \\ -A^{-1}w \end{array} \right] \left( v - w^{\top}A^{-1}w \right)^{-1/2} +\end{aligned}$$ + +where the symbols on the RHS above correspond to partitions in the +Fisher information + +$$\begin{aligned} +I^{\boldsymbol{\beta}} = \left[ \begin{array}{cc} v & w^{\top} \\ w & A \end{array} \right]. +\end{aligned}$$ + +The integration is perform from $t = 0$ to $1$ and is all handled +internally via `geometric`{.interpreted-text role="func"} + +::: {.ipython} +In \[1\]: xLGeometric, xUGeometric, xLList, xUList = +ci.geometric(objSIR, alpha, xhat, full_output=True) + +In \[2\]: print(xLGeometric) + +In \[3\]: print(xUGeometric) +::: + +## Bootstrap + +This is perhaps the favorite method to estimate confidence interval for +a lot of people. Although there are many ways to implement bootstrap, +semi-parametric is the only logical choice (even though the underlying +assumptions may be violated at times). As we have only implemented OLS +type loss functions in this package, the parametric approach seem to be +inappropriate when there is no self\--efficiency guarantee. +Non-parametric approach requires at least a conditional independence +assumption, something easily violated by our **ode**. Block bootstrap is +an option but we are also aware that the errors of an **ode** can be +rather rigid, and consistently over/under estimate at certain periods of +time. + +When we say semi-parametric, we mean the exchange of errors between the +observations. Let our raw error be + +$$\varepsilon_{i} = y_{i} - \hat{y}_{i}$$ + +where $\hat{y}_{i}$ will be the prediction under +$\hat{\boldsymbol{\theta}}$ under our model. Then we construct a new set +of observations via + +$$y_{i}^{\ast} = \hat{y}_{i} + \varepsilon^{\ast}, \quad \varepsilon^{\ast} \sim \mathcal{F}$$ + +with $\mathcal{F}$ being the empirical distribution of the raw errors. A +new set of parameters $\theta^{\ast}$ are then found for the +bootstrapped samples, and we obtain the $\alpha$ confidence interval by +taking the $\alpha/2$ quantiles. Invoke the correspond python function +yields our bootstrap estimates. Unlike `asymptotic`{.interpreted-text +role="func"}, the bounds here are used when estimating the parameters of +each bootstrap samples. An error may be returned if estimation failed +for any of the bootstrap samples. + +::: {.ipython} +In \[1\]: xLBootstrap, xUBootstrap, setX = ci.bootstrap(objSIR, alpha, +xhat, iteration=10, lb=boxBoundsArray\[:,0\], ub=boxBoundsArray\[:,1\], +full_output=True) + +In \[2\]: print(xLBootstrap) + +In \[3\]: print(xUBootstrap) +::: + +The additional information here can be used to compute the bias, tail +effects and test against the normality assumption. If desired, a +simultaneous confidence interval can also be approximated empirically. +Note however that because we are using a semi\--parameter method here, +if the model specification is wrong then the resulting estimates for the +bias is also wrong. The confidence interval still has the normal +approximation guarantee if number of sample is large. + +In this case, because the error in the observation is extremely small, +the confidence interval is narrow. + +::: {.ipython} +In \[1\]: import pylab as P + +In \[2\]: f = plt.figure() + +In \[3\]: n, bins, patches = P.hist(setX\[:,0\], 50) + +In \[4\]: P.xlabel(r\'Estimates of \$beta\$\'); + +In \[5\]: P.ylabel(\'Frequency\'); + +In \[6\]: P.title(\'Estimates under a semi-parametric bootstrap +scheme\'); + +\@savefig bootstrapCIHist.png In \[7\]: P.show() + +In \[8\]: P.close() +::: + +## Comparison Between Methods + +Although we have shown the numerical values for the confidence interval +obtained using different method, it may be hard to comprehend how they +vary. As they say, a picture says a million word, and given that this +particular model only has two parameters, we can obtain inspect and +compare the methods visually via a contour plot. The code to perform +this is shown below but the code block will not be run to save time and +space. + +In the plot above, the bootstrap confidence interval were so close to +the MLE, it is impossible to distinguish the two on such a coarse scale. + +Furthermore, because the geometric confidence interval is the result of +an integration, we can trace the path that lead to the final output that +was shown previously. Again, we are space conscious (and time +constrained) so the code block below will not be run. + +::: {.ipython verbatim=""} +In \[1\]: fig = plt.figure() + +In \[2\]: CS = plt.contour(xi, yi, zi, linewidth=0.5) + +In \[3\]: plt.clabel(CS, fontsize=10, inline=1) + +In \[4\]: l1 = plt.scatter(xLList\[0\]\[:,0\], xLList\[0\]\[:,1\], +marker=\'o\', c=\'m\', s=10); + +In \[5\]: l2 = plt.scatter(xUList\[0\]\[:,0\], xUList\[0\]\[:,1\], +marker=\'x\', c=\'m\', s=10); + +In \[6\]: plt.legend((l1, l2), (\'Lower CI path\', \'Upper CI path\'), +loc=\'upper left\'); + +In \[7\]: plt.ylabel(r\'Estimates of \$gamma\$\'); + +In \[8\]: plt.xlabel(r\'Estimates of \$beta\$\'); + +In \[9\]: plt.title(\'Integration path of the geometric confidence +intervals on the likelihood surface\'); + +In \[10\]: plt.tight_layout(); + +In \[11\]: plt.show() + +In \[12\]: plt.close() +::: + +## Profile Likelihood Surface + +To investigate why it was hard to find the profile likelihood confidence +interval, we can simply look at the surface (which is simply a line as +we are profiling). We find solution of `nuisanceOptim`{.interpreted-text +role="eq"} for each $\boldsymbol{\theta}_{-j}$ at various points of +$\boldsymbol{\theta}$. Equivalently, we can minimize the original loss +function as defined previously, and this is the approach below. We focus +out attention to the parameter $\beta$ of our SIR model. The results are +not shown here but the existence of a solution to +`obj`{.interpreted-text role="eq"} is evident by simply *eyeballing* the +plots. + +::: {.ipython verbatim=""} +In \[1\]: numIter = 100 + +In \[2\]: x2 = numpy.linspace(0.0, 2.0, numIter) + +In \[3\]: funcOut = numpy.linspace(0.0, 2.0, numIter) + +In \[4\]: ode.parameters = \[(\'beta\',0.5), (\'gamma\',1.0/3.0)\] + +In \[5\]: for i in range(numIter): + +: \...: paramEval = \[(\'beta\',x2\[i\]), (\'gamma\',x2\[i\])\] \...: + ode2 = copy.deepcopy(ode) \...: ode2.parameters = paramEval \...: + ode2.initial_values = (x0, t\[0\]) \...: objSIR2 = + NormalLoss(x2\[i\], ode2, x0, t\[0\], t\[1::\], yObv.copy(), + targetState, target_param=\'gamma\') \...: res = + scipy.optimize.minimize(fun=objSIR2.cost, \...: + jac=objSIR2.gradient, \...: x0=x2\[i\], \...: bounds=\[(0,2)\], + \...: method=\'L-BFGS-B\') \...: funcOut\[i\] = res\[\'fun\'\] + +In \[10\]: fig = plt.figure() + +In \[10\]: plt.plot(x2, objSIR.cost(xhat) - funcOut) + +In \[11\]: l1 = plt.axhline(-0.5\*qchisq(1 - alpha, df=1), 0, 2, +color=\'r\') + +In \[12\]: plt.ylabel(r\'\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid +beta)\$\'); + +In \[13\]: plt.xlabel(r\'Fixed value of \$beta\$\'); + +In \[14\]: plt.title(\'Difference in objective function between MLEn and +the maximization of the nuisance parameters given then parameter of +interest, beta in this case\'); + +In \[15\]: plt.tight_layout(); + +In \[16\]: plt.legend((l1,), (r\'\$-0.5mathcal{X}\_{1 - +alpha}\^{2}(1)\$\',), loc=\'lower right\'); + +\@savefig profileLLMaximizerGivenBeta.png In \[17\]: plt.show() \# +\@savefig profileLLMaximizerGivenBeta.png + +In \[18\]: plt.close() +::: + +Both the upper and lower confidence interval can be found in the +profiling procedure, but the part between of +$\beta \in \left[0,\hat{\beta}\right]$ is not convex, with $\hat{\beta}$ +being the MLE. This non\--quadratic profile likelihood is due to the +non-identifiability of the model given data [\[Raue2009\]](). For this +particular case, we can fix it simply by introducing additional +observations in the form of the $I$ state. We encourage the users to try +it out for themselves to confirm. + +::: {.ipython verbatim=""} +In \[1\]: targetState = \[\'I\', \'R\'\] + +In \[2\]: targetStateIndex = +numpy.array(ode.get_state_index(targetState)) + +In \[3\]: y = solution\[1::,targetStateIndex\] + numpy.random.normal(0, +0.01, (len(solution\[1::,targetStateIndex\]), 1)) + +In \[4\]: objSIR = NormalLoss(theta, ode, x0, t\[0\], t\[1::\], +y.copy(), targetState) + +In \[5\]: xhat = objSIR.fit(theta, lb=boxBoundsArray\[:,0\], +ub=boxBoundsArray\[:,1\]) + +In \[6\]: for i in range(numIter): + +: \...: paramEval = \[(\'beta\', x2\[i\]), (\'gamma\', x2\[i\])\] + \...: ode2 = copy.deepcopy(ode) \...: ode2.parameters = paramEval + \...: ode2.initial_values = (x0, t\[0\]) \...: objSIR2 = + NormalLoss(x2\[i\], ode2, x0, t\[0\], t\[1::\], y.copy(), + targetState, target_param=\'gamma\') \...: res = + scipy.optimize.minimize(fun=objSIR2.cost, \...: + jac=objSIR2.gradient, \...: x0=x2\[i\], \...: bounds=\[(0,2)\], + \...: method=\'L-BFGS-B\') \...: funcOut\[i\] = res\[\'fun\'\] + +In \[10\]: fig = plt.figure() + +In \[10\]: plt.plot(x2, objSIR.cost(xhat) - funcOut); + +In \[11\]: l1 = plt.axhline(-0.5\*qchisq(1 - alpha, df=1), 0, 2, +color=\'r\') + +In \[12\]: plt.ylabel(r\'\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid +beta)\$\'); + +In \[13\]: plt.xlabel(r\'Fixed value of \$beta\$\'); + +In \[14\]: plt.title(\'Profile likelihood curve for the parameter ofn +interest with more observation\'); + +In \[15\]: plt.tight_layout(); + +In \[16\]: plt.legend((l1,), (r\'\$-0.5mathcal{X}\_{1 - +alpha}\^{2}(1)\$\',), loc=\'lower right\'); + +\@savefig profileLLMaximizerGivenBetaMoreObs.png In \[17\]: plt.show() +\# \@savefig profileLLMaximizerGivenBetaMoreObs.png + +In \[18\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.ipynb new file mode 100644 index 00000000..41409918 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.ipynb @@ -0,0 +1,103 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# References\n", + "\n", + "Aron1984 \n", + "Seasonality and period-doubling bifurcations in an epidemic model,\n", + "Joan L. Aron and Ira B. Schwartz, Journal of Theoretical Biology, Volume\n", + "110, Issue 4, page 665-679, 1984\n", + "\n", + "Brauer2008 \n", + "Mathematical Epidemiology, Lecture Notes in Mathematics, Fred Brauer,\n", + "Springer 2008\n", + "\n", + "Cao2006 \n", + "Efficient step size selection for the tau-leaping simulation method,\n", + "Yang Cao et el., The Journal of Chemical Physics, Volume 124, Issue 4,\n", + "page 044109, 2006\n", + "\n", + "Finnie2016 \n", + "EpiJSON: A unified data-format for epidemiology, Thomas Finnie et al.,\n", + "Epidemics, Volume 15, page 20-26, 2016\n", + "\n", + "FitzHugh1961 \n", + "Impulses and Physiological States in Theoretical Models of Nerve\n", + "Membrane, Richard FitzHugh, Biophysical Journal, Volume 1, Issue 6, page\n", + "445-466, 1961\n", + "\n", + "Gillespie1977 \n", + "Exact stochastic simulation of coupled chemical reactions, Danial T.\n", + "Gillespie, The Journal of Physical Chemistry, Volume 81, Issue 25, page\n", + "2340-2361, 1977\n", + "\n", + "Girolami2011 \n", + "Riemann manifold Langevin and Hamiltonian Monte Carlo methods, Mark\n", + "Girolami and Ben Calderhead, Journal of the Royal Statistical Society\n", + "Series B, Volume 73, Issue 2, page 123-214, 2011.\n", + "\n", + "Hethcote1973 \n", + "Asymptotic behavior in a deterministic epidemic model, Herbert W.\n", + "Hethcote, Bulletin of Mathematical Biology, Volume 35, page 607-614,\n", + "1973\n", + "\n", + "Legrand2007 \n", + "Understanding the dynamics of Ebola epidemics, J. Legrand et al.\n", + "Epidemiology and Infection, Volume 135, Issue 4, page 610-621, 2007\n", + "\n", + "Lloyd1996 \n", + "Spatial Heterogeneity in Epidemic Models, A.L. Lloyd and R.M. May,\n", + "Journal of Theoretical Biology, Volume 179, Issue 1, page 1-11, 1996\n", + "\n", + "Lorenz1963 \n", + "Deterministic Nonperiodic Flow, Edward N. Lorenz, Journal of the\n", + "Atmospheric Sciences, Volume 20, Issue 2, page 130-141, 1963\n", + "\n", + "Lotka1920 \n", + "Analytical Note on Certain Rhythmic Relations in Organic Systems,\n", + "Alfred J. Lotka, Proceedings of the National Academy of Sciences of the\n", + "United States of America, Volume 7, Issue 7, page 410-415, 1920\n", + "\n", + "Moolgavkar1987 \n", + "Confidence Regions for Parameters of the Proportional Hazards Model: A\n", + "Simulation Study, S.H. Moolgavkar and D.J. Venzon, Scandianvia Journal\n", + "of Statistics, Volume 14, page 43-56, 1987\n", + "\n", + "Press2007 \n", + "Numerical Recipes 3rd Edition: The Art of Scientific Computing, W.H.\n", + "Press et al., Cambridge University Press, 2007\n", + "\n", + "Ramsay2007 \n", + "Parameter estimation for differential equations: a generalized smoothing\n", + "approach, Journal of the Royal Statistical Society Series B, James O.\n", + "Ramsay et al., Volume 69, Issue 5, page 741-796, 2007\n", + "\n", + "Raue2009 \n", + "Structural and Practical Identifiability Analysis of Partially Observed\n", + "Dynamical Models by Exploiting the Profile Likelihood, A. Raue et al.,\n", + "Bioinformatics, Volume 25, Issue 15, page 1923-1929, 2009\n", + "\n", + "Robertson1966 \n", + "The solution of a set of reaction rate equations, H.H. Robertson,\n", + "Academic Press, page 178-182, 1966\n", + "\n", + "Venzon1988 \n", + "A Method for Computing Profile-Likelihood-Based Confidence Intervals,\n", + "D.J. Venzon and S.H. Moolgavkar, Journal of the Royal Statistical\n", + "Society Series C (Applied Statistics), Volume 37, Issue 1, page 87-94,\n", + "1988\n", + "\n", + "vanderpol1926 \n", + "On Relaxed Oscillations, Balthasar van der Pol, The London, Edinburgh,\n", + "and Dublin Philosophical Magazine and Journal of Science, Volume 2,\n", + "Issue 11, page 978-992, 1926" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.md new file mode 100644 index 00000000..ce3d7538 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.md @@ -0,0 +1,113 @@ +# References {#ref} + +::: {#citations} + +[Aron1984]{#Aron1984 .citation-label} + +: Seasonality and period-doubling bifurcations in an epidemic model, + Joan L. Aron and Ira B. Schwartz, Journal of Theoretical Biology, + Volume 110, Issue 4, page 665-679, 1984 + +[Brauer2008]{#Brauer2008 .citation-label} + +: Mathematical Epidemiology, Lecture Notes in Mathematics, Fred + Brauer, Springer 2008 + +[Cao2006]{#Cao2006 .citation-label} + +: Efficient step size selection for the tau-leaping simulation method, + Yang Cao et el., The Journal of Chemical Physics, Volume 124, Issue + 4, page 044109, 2006 + +[Finnie2016]{#Finnie2016 .citation-label} + +: EpiJSON: A unified data-format for epidemiology, Thomas Finnie et + al., Epidemics, Volume 15, page 20-26, 2016 + +[FitzHugh1961]{#FitzHugh1961 .citation-label} + +: Impulses and Physiological States in Theoretical Models of Nerve + Membrane, Richard FitzHugh, Biophysical Journal, Volume 1, Issue 6, + page 445-466, 1961 + +[Gillespie1977]{#Gillespie1977 .citation-label} + +: Exact stochastic simulation of coupled chemical reactions, Danial T. + Gillespie, The Journal of Physical Chemistry, Volume 81, Issue 25, + page 2340-2361, 1977 + +[Girolami2011]{#Girolami2011 .citation-label} + +: Riemann manifold Langevin and Hamiltonian Monte Carlo methods, Mark + Girolami and Ben Calderhead, Journal of the Royal Statistical + Society Series B, Volume 73, Issue 2, page 123-214, 2011. + +[Hethcote1973]{#Hethcote1973 .citation-label} + +: Asymptotic behavior in a deterministic epidemic model, Herbert W. + Hethcote, Bulletin of Mathematical Biology, Volume 35, page 607-614, + 1973 + +[Legrand2007]{#Legrand2007 .citation-label} + +: Understanding the dynamics of Ebola epidemics, J. Legrand et al. + Epidemiology and Infection, Volume 135, Issue 4, page 610-621, 2007 + +[Lloyd1996]{#Lloyd1996 .citation-label} + +: Spatial Heterogeneity in Epidemic Models, A.L. Lloyd and R.M. May, + Journal of Theoretical Biology, Volume 179, Issue 1, page 1-11, 1996 + +[Lorenz1963]{#Lorenz1963 .citation-label} + +: Deterministic Nonperiodic Flow, Edward N. Lorenz, Journal of the + Atmospheric Sciences, Volume 20, Issue 2, page 130-141, 1963 + +[Lotka1920]{#Lotka1920 .citation-label} + +: Analytical Note on Certain Rhythmic Relations in Organic Systems, + Alfred J. Lotka, Proceedings of the National Academy of Sciences of + the United States of America, Volume 7, Issue 7, page 410-415, 1920 + +[Moolgavkar1987]{#Moolgavkar1987 .citation-label} + +: Confidence Regions for Parameters of the Proportional Hazards Model: + A Simulation Study, S.H. Moolgavkar and D.J. Venzon, Scandianvia + Journal of Statistics, Volume 14, page 43-56, 1987 + +[Press2007]{#Press2007 .citation-label} + +: Numerical Recipes 3rd Edition: The Art of Scientific Computing, W.H. + Press et al., Cambridge University Press, 2007 + +[Ramsay2007]{#Ramsay2007 .citation-label} + +: Parameter estimation for differential equations: a generalized + smoothing approach, Journal of the Royal Statistical Society Series + B, James O. Ramsay et al., Volume 69, Issue 5, page 741-796, 2007 + +[Raue2009]{#Raue2009 .citation-label} + +: Structural and Practical Identifiability Analysis of Partially + Observed Dynamical Models by Exploiting the Profile Likelihood, A. + Raue et al., Bioinformatics, Volume 25, Issue 15, page 1923-1929, + 2009 + +[Robertson1966]{#Robertson1966 .citation-label} + +: The solution of a set of reaction rate equations, H.H. Robertson, + Academic Press, page 178-182, 1966 + +[Venzon1988]{#Venzon1988 .citation-label} + +: A Method for Computing Profile-Likelihood-Based Confidence + Intervals, D.J. Venzon and S.H. Moolgavkar, Journal of the Royal + Statistical Society Series C (Applied Statistics), Volume 37, Issue + 1, page 87-94, 1988 + +[vanderpol1926]{#vanderpol1926 .citation-label} + +: On Relaxed Oscillations, Balthasar van der Pol, The London, + Edinburgh, and Dublin Philosophical Magazine and Journal of Science, + Volume 2, Issue 11, page 978-992, 1926 +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb new file mode 100644 index 00000000..fd83edb7 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb @@ -0,0 +1,328 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stochastic representation of ode\n", + "\n", + "There are multiple interpretation of stochasticity of a deterministic\n", + "ode. We have implemented two of the most common interpretation; when the\n", + "parameters are realizations of some underlying distribution, and when we\n", + "have a so called chemical master equation where each transition\n", + "represent a jump. Again, we use the standard SIR example as previously\n", + "seen in ref:sir.\n", + "\n", + "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: import numpy as np\n", + "\n", + "In \\[1\\]: x0 = \\[1, 1.27e-6, 0\\]\n", + "\n", + "In \\[1\\]: t = np.linspace(0, 150, 100)\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[1\\]: paramList = \\['beta', 'gamma'\\]\n", + "\n", + "In \\[1\\]: transitionList = \\[ \n", + "...: Transition(origin='S', destination='I', equation='beta\\*S\\*I',\n", + "transition_type=TransitionType.T), ...: Transition(origin='I',\n", + "destination='R', equation='gamma\\*I', transition_type=TransitionType.T)\n", + "...: \\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0\\]\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solutionReference = odeS.integrate(t\\[1::\\],\n", + "full_output=False)\n", + "\n", + "## Stochastic Parameter\n", + "\n", + "In our first scenario, we assume that the parameters follow some\n", + "underlying distribution. Given that both $\\beta$ and $\\gamma$ in our SIR\n", + "model has to be non-negative, it seemed natural to use a Gamma\n", + "distribution. We make use of the familiar syntax from\n", + "[R](http://www.r-project.org/) to define our distribution.\n", + "Unfortunately, we have to define it via a tuple, where the first is the\n", + "function handle (name) while the second the parameters. Note that the\n", + "parameters can be defined as either a dictionary or as the same sequence\n", + "as [R](http://www.r-project.org/), which is the shape then the rate in\n", + "the Gamma case.\n", + "\n", + "In \\[1\\]: from pygom.utilR import rgamma\n", + "\n", + "In \\[1\\]: d = dict()\n", + "\n", + "In \\[1\\]: d\\['beta'\\] = (rgamma,{'shape':100.0, 'rate':200.0})\n", + "\n", + "In \\[1\\]: d\\['gamma'\\] = (rgamma,(100.0, 300.0))\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "In \\[1\\]: Ymean, Yall = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "Note that a message is printed above where it is trying to connect to an\n", + "mpi backend, as our module has the capability to compute in parallel\n", + "using the IPython. We have simulated a total of 10 different solutions\n", + "using different parameters, the plots can be seen below\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "\n", + "In \\[1\\]: for solution in Yall: \n", + "...: axarr\\[0\\].plot(t, solution\\[:,0\\]) ...: axarr\\[1\\].plot(t,\n", + "solution\\[:,1\\]) ...: axarr\\[2\\].plot(t, solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_param_all.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "We then see how the expected results, using the sample average of the\n", + "simulations\n", + "\n", + "$$\\tilde{x}(T) = \\mathbb{E}\\left[ \\int_{t_{0}}^{T} f(\\theta,x,t) dt \\right]$$\n", + "\n", + "differs from the reference solution\n", + "\n", + "$$\\hat{x}(T) = \\int_{t_{0}}^{T} f(\\mathbb{E}\\left[ \\theta \\right],x,t) dt$$\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "\n", + "In \\[1\\]: for i in range(3): axarr\\[i\\].plot(t, Ymean\\[:,i\\] -\n", + "solutionReference\\[:,i\\])\n", + "\n", + "@savefig stochastic_param_compare.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "The difference is relatively large especially for the $S$ state. We can\n", + "decrease this difference as we increase the number of simulation, and\n", + "more sophisticated sampling method for the generation of random\n", + "variables can also decrease the difference.\n", + "\n", + "In addition to using the built-in functions to represent stochasticity,\n", + "we can also use standard frozen distributions from scipy. Note that it\n", + "must be a frozen distribution as that is the only for the parameters of\n", + "the distributions to propagate through the model.\n", + "\n", + "In \\[1\\]: import scipy.stats as st\n", + "\n", + "In \\[1\\]: d = dict()\n", + "\n", + "In \\[1\\]: d\\['beta'\\] = st.gamma(a=100.0, scale=1.0/200.0)\n", + "\n", + "In \\[1\\]: d\\['gamma'\\] = st.gamma(a=100.0, scale=1.0/300.0)\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "Obviously, there may be scenarios where only some of the parameters are\n", + "stochastic. Let's say that the $\\gamma$ parameter is fixed at $1/3$,\n", + "then simply replace the distribution information with a scalar. A quick\n", + "visual inspection at the resulting plot suggests that the system of ODE\n", + "potentially has less variation when compared to the case where both\n", + "parameters are stochastic.\n", + "\n", + "In \\[1\\]: d\\['gamma'\\] = 1.0/3.0\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "In \\[1\\]: YmeanSingle, YallSingle = odeS.simulate_param(t\\[1::\\], 5,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "\n", + "In \\[1\\]: for solution in YallSingle: \n", + "...: axarr\\[0\\].plot(t,solution\\[:,0\\]) ...:\n", + "axarr\\[1\\].plot(t,solution\\[:,1\\]) ...:\n", + "axarr\\[2\\].plot(t,solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_param_single.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "## Continuous Markov Representation\n", + "\n", + "Another common method of introducing stochasticity into a set of ode is\n", + "by assuming each movement in the system is a result of a jump process.\n", + "More concretely, the probabilty of a move for transition $j$ is governed\n", + "by an exponential distribution such that\n", + "\n", + "$$\\Pr(\\text{process $j$ jump within time } \\tau) = \\lambda_{j} e^{-\\lambda_{j} \\tau},$$\n", + "\n", + "where $\\lambda_{j}$ is the rate of transition for process $j$ and $\\tau$\n", + "the time elapsed after current time $t$.\n", + "\n", + "A couple of the commmon implementation for the jump process have been\n", + "implemented where two of them are used during a normal simulation; the\n", + "first reaction method [\\[Gillespie1977\\]]() and the $\\tau$-Leap method\n", + "[\\[Cao2006\\]](). The two changes interactively depending on the size of\n", + "the states.\n", + "\n", + "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[1\\]: paramList = \\['beta', 'gamma', 'N'\\]\n", + "\n", + "In \\[1\\]: transitionList = \\[ \n", + "...: Transition(origin='S', destination='I', equation='beta\\*S\\*I/N',\n", + "transition_type=TransitionType.T), ...: Transition(origin='I',\n", + "destination='R', equation='gamma\\*I', transition_type=TransitionType.T)\n", + "...: \\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solutionReference = odeS.integrate(t\\[1::\\])\n", + "\n", + "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1, 3)\n", + "\n", + "In \\[1\\]: for solution in simX: \n", + "...: axarr\\[0\\].plot(t\\[:9\\], solution\\[:,0\\]) ...:\n", + "axarr\\[1\\].plot(t\\[:9\\], solution\\[:,1\\]) ...: axarr\\[2\\].plot(t\\[:9\\],\n", + "solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_process.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "Above, we see ten different simulation, again using the SIR model but\n", + "without standardization of the initial conditions. We restrict our time\n", + "frame to be only the first 10 time points so that the individual changes\n", + "can be seen more clearly above. If we use the same time frame as the one\n", + "used previously for the deterministic system (as shown below), the\n", + "trajectories are smoothed out and we no longer observe the *jumps*.\n", + "Looking at the raw trajectories of the ODE below, it is obvious that the\n", + "mean from a jump process is very different to the deterministic\n", + "solution. The reason behind this is that the jump process above was able\n", + "to fully remove all the initial infected individuals before any new\n", + "ones.\n", + "\n", + "In \\[1\\]: simX,simT = odeS.simulate_jump(t, 5, full_output=True)\n", + "\n", + "In \\[1\\]: simMean = np.mean(simX, axis=0)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "\n", + "In \\[1\\]: for solution in simX: \n", + "...: axarr\\[0\\].plot(t, solution\\[:,0\\]) ...: axarr\\[1\\].plot(t,\n", + "solution\\[:,1\\]) ...: axarr\\[2\\].plot(t, solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_process_compare_large_n\\_curves.png In \\[1\\]:\n", + "plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "## Repeatable Simulation\n", + "\n", + "One of the possible use of compartmental models is to generate\n", + "forecasts. Although most of the time the requirement would be to have\n", + "(at least point-wise) convergence in the limit, reproducibility is also\n", + "important. For both types of interpretation explained above, we have\n", + "given the package the capability to repeat the simulations by setting a\n", + "seed. When the assumption is that the parameters follows some sort of\n", + "distribution, we simply set the seed which governs the global state of\n", + "the random number generator.\n", + "\n", + "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':\n", + "st.gamma(a=100.0, scale=1.0/300.0), 'N': x0\\[0\\]}\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: Ymean, Yall = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: Ymean1, Yall1 = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: Ymean2, Yall2 = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: sim_diff = \\[np.linalg.norm(Yall\\[i\\] - yi) for i, yi in\n", + "enumerate(Yall1)\\]\n", + "\n", + "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(Yall2\\[i\\] - yi) for i, yi in\n", + "enumerate(Yall1)\\]\n", + "\n", + "In \\[1\\]: print(\"Different in the simulations and the mean: (%s, %s) \" %\n", + "(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))\n", + "\n", + "In \\[1\\]: print(\"Different in the simulations and the mean using same\n", + "seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 -\n", + "Ymean1))))\n", + "\n", + "In the alternative interpretation, setting the global seed is\n", + "insufficient. Unlike simulation based on the parameters, where we can\n", + "pre-generate all the parameter values and send them off to individual\n", + "processes in the parallel backend, this is prohibitive here. In a\n", + "nutshell, the seed does not propagate when using a parallel backend\n", + "because each *integration* requires an unknown number of random samples.\n", + "Therefore, we have an additional flag **parallel** in the function\n", + "signature. By ensuring that the computation runs in serial, we can make\n", + "use of the global seed and generate identical runs.\n", + "\n", + "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10, parallel=False,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: simX1, simT1 = odeS.simulate_jump(t\\[1:10\\], 10,\n", + "parallel=False, full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: simX2, simT2 = odeS.simulate_jump(t\\[1:10\\], 10,\n", + "parallel=False, full_output=True)\n", + "\n", + "In \\[1\\]: sim_diff = \\[np.linalg.norm(simX\\[i\\] - x1) for i, x1 in\n", + "enumerate(simX1)\\]\n", + "\n", + "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(simX2\\[i\\] - x1) for i, x1 in\n", + "enumerate(simX1)\\]\n", + "\n", + "In \\[1\\]: print(\"Difference in simulation: %s\" %\n", + "np.sum(np.abs(sim_diff)))\n", + "\n", + "In \\[1\\]: print(\"Difference in simulation using same seed: %s\" %\n", + "np.sum(np.abs(sim_diff12)))" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.md new file mode 100644 index 00000000..58bf60b2 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.md @@ -0,0 +1,341 @@ +# Stochastic representation of ode {#stochastic} + +There are multiple interpretation of stochasticity of a deterministic +ode. We have implemented two of the most common interpretation; when the +parameters are realizations of some underlying distribution, and when we +have a so called chemical master equation where each transition +represent a jump. Again, we use the standard SIR example as previously +seen in ref:[sir]{.title-ref}. + +::: {.ipython} +In \[1\]: from pygom import SimulateOde, Transition, TransitionType + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: import numpy as np + +In \[1\]: x0 = \[1, 1.27e-6, 0\] + +In \[1\]: t = np.linspace(0, 150, 100) + +In \[1\]: stateList = \[\'S\', \'I\', \'R\'\] + +In \[1\]: paramList = \[\'beta\', \'gamma\'\] + +In \[1\]: transitionList = \[ + +: \...: Transition(origin=\'S\', destination=\'I\', + equation=\'beta\*S\*I\', transition_type=TransitionType.T), \...: + Transition(origin=\'I\', destination=\'R\', equation=\'gamma\*I\', + transition_type=TransitionType.T) \...: \] + +In \[1\]: odeS = SimulateOde(stateList, paramList, +transition=transitionList) + +In \[1\]: odeS.parameters = \[0.5, 1.0/3.0\] + +In \[1\]: odeS.initial_values = (x0, t\[0\]) + +In \[1\]: solutionReference = odeS.integrate(t\[1::\], +full_output=False) +::: + +## Stochastic Parameter + +In our first scenario, we assume that the parameters follow some +underlying distribution. Given that both $\beta$ and $\gamma$ in our SIR +model has to be non-negative, it seemed natural to use a Gamma +distribution. We make use of the familiar syntax from +[R](http://www.r-project.org/) to define our distribution. +Unfortunately, we have to define it via a tuple, where the first is the +function handle (name) while the second the parameters. Note that the +parameters can be defined as either a dictionary or as the same sequence +as [R](http://www.r-project.org/), which is the shape then the rate in +the Gamma case. + +::: {.ipython} +In \[1\]: from pygom.utilR import rgamma + +In \[1\]: d = dict() + +In \[1\]: d\[\'beta\'\] = (rgamma,{\'shape\':100.0, \'rate\':200.0}) + +In \[1\]: d\[\'gamma\'\] = (rgamma,(100.0, 300.0)) + +In \[1\]: odeS.parameters = d + +In \[1\]: Ymean, Yall = odeS.simulate_param(t\[1::\], 10, +full_output=True) +::: + +Note that a message is printed above where it is trying to connect to an +mpi backend, as our module has the capability to compute in parallel +using the IPython. We have simulated a total of 10 different solutions +using different parameters, the plots can be seen below + +::: {.ipython} +In \[1\]: f, axarr = plt.subplots(1,3) + +In \[1\]: for solution in Yall: + +: \...: axarr\[0\].plot(t, solution\[:,0\]) \...: axarr\[1\].plot(t, + solution\[:,1\]) \...: axarr\[2\].plot(t, solution\[:,2\]) + +\@savefig stochastic_param_all.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +We then see how the expected results, using the sample average of the +simulations + +$$\tilde{x}(T) = \mathbb{E}\left[ \int_{t_{0}}^{T} f(\theta,x,t) dt \right]$$ + +differs from the reference solution + +$$\hat{x}(T) = \int_{t_{0}}^{T} f(\mathbb{E}\left[ \theta \right],x,t) dt$$ + +::: {.ipython} +In \[1\]: f, axarr = plt.subplots(1,3) + +In \[1\]: for i in range(3): axarr\[i\].plot(t, Ymean\[:,i\] - +solutionReference\[:,i\]) + +\@savefig stochastic_param_compare.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +The difference is relatively large especially for the $S$ state. We can +decrease this difference as we increase the number of simulation, and +more sophisticated sampling method for the generation of random +variables can also decrease the difference. + +In addition to using the built-in functions to represent stochasticity, +we can also use standard frozen distributions from scipy. Note that it +must be a frozen distribution as that is the only for the parameters of +the distributions to propagate through the model. + +::: {.ipython} +In \[1\]: import scipy.stats as st + +In \[1\]: d = dict() + +In \[1\]: d\[\'beta\'\] = st.gamma(a=100.0, scale=1.0/200.0) + +In \[1\]: d\[\'gamma\'\] = st.gamma(a=100.0, scale=1.0/300.0) + +In \[1\]: odeS.parameters = d +::: + +Obviously, there may be scenarios where only some of the parameters are +stochastic. Let\'s say that the $\gamma$ parameter is fixed at $1/3$, +then simply replace the distribution information with a scalar. A quick +visual inspection at the resulting plot suggests that the system of ODE +potentially has less variation when compared to the case where both +parameters are stochastic. + +::: {.ipython} +In \[1\]: d\[\'gamma\'\] = 1.0/3.0 + +In \[1\]: odeS.parameters = d + +In \[1\]: YmeanSingle, YallSingle = odeS.simulate_param(t\[1::\], 5, +full_output=True) + +In \[1\]: f, axarr = plt.subplots(1,3) + +In \[1\]: for solution in YallSingle: + +: \...: axarr\[0\].plot(t,solution\[:,0\]) \...: + axarr\[1\].plot(t,solution\[:,1\]) \...: + axarr\[2\].plot(t,solution\[:,2\]) + +\@savefig stochastic_param_single.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +## Continuous Markov Representation + +Another common method of introducing stochasticity into a set of ode is +by assuming each movement in the system is a result of a jump process. +More concretely, the probabilty of a move for transition $j$ is governed +by an exponential distribution such that + +$$\Pr(\text{process $j$ jump within time } \tau) = \lambda_{j} e^{-\lambda_{j} \tau},$$ + +where $\lambda_{j}$ is the rate of transition for process $j$ and $\tau$ +the time elapsed after current time $t$. + +A couple of the commmon implementation for the jump process have been +implemented where two of them are used during a normal simulation; the +first reaction method [\[Gillespie1977\]]() and the $\tau$-Leap method +[\[Cao2006\]](). The two changes interactively depending on the size of +the states. + +::: {.ipython} +In \[1\]: x0 = \[2362206.0, 3.0, 0.0\] + +In \[1\]: stateList = \[\'S\', \'I\', \'R\'\] + +In \[1\]: paramList = \[\'beta\', \'gamma\', \'N\'\] + +In \[1\]: transitionList = \[ + +: \...: Transition(origin=\'S\', destination=\'I\', + equation=\'beta\*S\*I/N\', transition_type=TransitionType.T), \...: + Transition(origin=\'I\', destination=\'R\', equation=\'gamma\*I\', + transition_type=TransitionType.T) \...: \] + +In \[1\]: odeS = SimulateOde(stateList, paramList, +transition=transitionList) + +In \[1\]: odeS.parameters = \[0.5, 1.0/3.0, x0\[0\]\] + +In \[1\]: odeS.initial_values = (x0, t\[0\]) + +In \[1\]: solutionReference = odeS.integrate(t\[1::\]) + +In \[1\]: simX, simT = odeS.simulate_jump(t\[1:10\], 10, +full_output=True) + +In \[1\]: f, axarr = plt.subplots(1, 3) + +In \[1\]: for solution in simX: + +: \...: axarr\[0\].plot(t\[:9\], solution\[:,0\]) \...: + axarr\[1\].plot(t\[:9\], solution\[:,1\]) \...: + axarr\[2\].plot(t\[:9\], solution\[:,2\]) + +\@savefig stochastic_process.png In \[1\]: plt.show() + +In \[1\]: plt.close() +::: + +Above, we see ten different simulation, again using the SIR model but +without standardization of the initial conditions. We restrict our time +frame to be only the first 10 time points so that the individual changes +can be seen more clearly above. If we use the same time frame as the one +used previously for the deterministic system (as shown below), the +trajectories are smoothed out and we no longer observe the *jumps*. +Looking at the raw trajectories of the ODE below, it is obvious that the +mean from a jump process is very different to the deterministic +solution. The reason behind this is that the jump process above was able +to fully remove all the initial infected individuals before any new +ones. + +::: {.ipython} +In \[1\]: simX,simT = odeS.simulate_jump(t, 5, full_output=True) + +In \[1\]: simMean = np.mean(simX, axis=0) + +In \[1\]: f, axarr = plt.subplots(1,3) + +In \[1\]: for solution in simX: + +: \...: axarr\[0\].plot(t, solution\[:,0\]) \...: axarr\[1\].plot(t, + solution\[:,1\]) \...: axarr\[2\].plot(t, solution\[:,2\]) + +\@savefig stochastic_process_compare_large_n\_curves.png In \[1\]: +plt.show() + +In \[1\]: plt.close() +::: + +## Repeatable Simulation + +One of the possible use of compartmental models is to generate +forecasts. Although most of the time the requirement would be to have +(at least point-wise) convergence in the limit, reproducibility is also +important. For both types of interpretation explained above, we have +given the package the capability to repeat the simulations by setting a +seed. When the assumption is that the parameters follows some sort of +distribution, we simply set the seed which governs the global state of +the random number generator. + +::: {.ipython} +In \[1\]: x0 = \[2362206.0, 3.0, 0.0\] + +In \[1\]: odeS = SimulateOde(stateList, paramList, +transition=transitionList) + +In \[1\]: d = {\'beta\': st.gamma(a=100.0, scale=1.0/200.0), \'gamma\': +st.gamma(a=100.0, scale=1.0/300.0), \'N\': x0\[0\]} + +In \[1\]: odeS.parameters = d + +In \[1\]: odeS.initial_values = (x0, t\[0\]) + +In \[1\]: Ymean, Yall = odeS.simulate_param(t\[1::\], 10, +full_output=True) + +In \[1\]: np.random.seed(1) + +In \[1\]: Ymean1, Yall1 = odeS.simulate_param(t\[1::\], 10, +full_output=True) + +In \[1\]: np.random.seed(1) + +In \[1\]: Ymean2, Yall2 = odeS.simulate_param(t\[1::\], 10, +full_output=True) + +In \[1\]: sim_diff = \[np.linalg.norm(Yall\[i\] - yi) for i, yi in +enumerate(Yall1)\] + +In \[1\]: sim_diff12 = \[np.linalg.norm(Yall2\[i\] - yi) for i, yi in +enumerate(Yall1)\] + +In \[1\]: print(\"Different in the simulations and the mean: (%s, %s) \" +% (np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean)))) + +In \[1\]: print(\"Different in the simulations and the mean using same +seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 - +Ymean1)))) +::: + +In the alternative interpretation, setting the global seed is +insufficient. Unlike simulation based on the parameters, where we can +pre-generate all the parameter values and send them off to individual +processes in the parallel backend, this is prohibitive here. In a +nutshell, the seed does not propagate when using a parallel backend +because each *integration* requires an unknown number of random samples. +Therefore, we have an additional flag **parallel** in the function +signature. By ensuring that the computation runs in serial, we can make +use of the global seed and generate identical runs. + +::: {.ipython} +In \[1\]: x0 = \[2362206.0, 3.0, 0.0\] + +In \[1\]: odeS = SimulateOde(stateList, paramList, +transition=transitionList) + +In \[1\]: odeS.parameters = \[0.5, 1.0/3.0, x0\[0\]\] + +In \[1\]: odeS.initial_values = (x0, t\[0\]) + +In \[1\]: simX, simT = odeS.simulate_jump(t\[1:10\], 10, parallel=False, +full_output=True) + +In \[1\]: np.random.seed(1) + +In \[1\]: simX1, simT1 = odeS.simulate_jump(t\[1:10\], 10, +parallel=False, full_output=True) + +In \[1\]: np.random.seed(1) + +In \[1\]: simX2, simT2 = odeS.simulate_jump(t\[1:10\], 10, +parallel=False, full_output=True) + +In \[1\]: sim_diff = \[np.linalg.norm(simX\[i\] - x1) for i, x1 in +enumerate(simX1)\] + +In \[1\]: sim_diff12 = \[np.linalg.norm(simX2\[i\] - x1) for i, x1 in +enumerate(simX1)\] + +In \[1\]: print(\"Difference in simulation: %s\" % +np.sum(np.abs(sim_diff))) + +In \[1\]: print(\"Difference in simulation using same seed: %s\" % +np.sum(np.abs(sim_diff12))) +::: diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.ipynb new file mode 100644 index 00000000..a80e94a4 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.ipynb @@ -0,0 +1,211 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transition Object\n", + "\n", + "The most important part of setting up the model is to correctly define\n", + "the set odes, which is based solely on the classes defined in\n", + "`transition`. All transitions that gets fed into the ode system needs to\n", + "be defined as a transition object, `Transition`. It takes a total of\n", + "four input arguments\n", + "\n", + "1. The origin state\n", + "2. Equation that describe the process\n", + "3. The type of transition\n", + "4. The destination state\n", + "\n", + "where the first three are mandatory. To demonstrate, we go back to the\n", + "SIR model defined previously in the section `sir`. Recall that the set\n", + "of odes are\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{\\partial S}{\\partial t} &= -\\beta SI \\\\\n", + "\\frac{\\partial I}{\\partial t} &= \\beta SI - \\gamma I \\\\\n", + "\\frac{\\partial R}{\\partial t} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "We can simply define the set of ode, as seen previously, via\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType, common_models\n", + "\n", + "In \\[2\\]: ode1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", + "transition_type=TransitionType.ODE)\n", + "\n", + "In \\[3\\]: ode2 = Transition(origin='I', equation='beta\\*S\\*I -\n", + "gamma\\*I', transition_type=TransitionType.ODE)\n", + "\n", + "In \\[4\\]: ode3 = Transition(origin='R', equation='gamma\\*I',\n", + "transition_type=TransitionType.ODE)\n", + "\n", + "Note that we need to state explicitly the type of equation we are\n", + "inputting, which is simply of type **ODE** in this case. We can confirm\n", + "this has been entered correctly by putting it into `DeterministicOde`\n", + "\n", + "In \\[1\\]: from pygom import DeterministicOde\n", + "\n", + "In \\[2\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[3\\]: paramList = \\['beta', 'gamma'\\]\n", + "\n", + "In \\[4\\]: model = DeterministicOde(stateList, \n", + "...: paramList, ...: ode=\\[ode1, ode2, ode3\\])\n", + "\n", + "and check it\n", + "\n", + "In \\[1\\]: model.get_ode_eqn()\n", + "\n", + "An alternative print function `print_ode` is also available which may be\n", + "more suitable in other situation. The default prints the formula in a\n", + "rendered format and another which prints out the latex format which can\n", + "be used directly in a latex document. The latter is useful as it saves\n", + "typing out the formula twice, once in the code and another in documents.\n", + "\n", + "In \\[1\\]: model.print_ode(False)\n", + "\n", + "In \\[2\\]: model.print_ode(True)\n", + "\n", + "Now we are going to show the different ways of defining the same set of\n", + "odes.\n", + "\n", + "## Defining the equations\n", + "\n", + "Recognizing that the set of odes defining the SIR model is the result of\n", + "two transitions,\n", + "\n", + "$$\\begin{aligned}\n", + "S \\rightarrow I &= \\beta SI \\\\\n", + "I \\rightarrow R &= \\gamma I\n", + "\\end{aligned}$$\n", + "\n", + "where $S \\rightarrow I$ denotes a transition from state $S$ to state\n", + "$I$. Therefore, we can simply define our model by these two transition,\n", + "but now these two transition needs to be inputted via the `transition`\n", + "argument instead of the `ode` argument. Note that we are initializing\n", + "the model using a different class, because the stochastic implementation\n", + "has more operation on transitions.\n", + "\n", + "In \\[600\\]: from pygom import SimulateOde\n", + "\n", + "In \\[601\\]: t1 = Transition(origin='S', destination='I',\n", + "equation='beta\\*S\\*I', transition_type=TransitionType.T)\n", + "\n", + "In \\[602\\]: t2 = Transition(origin='I', destination='R',\n", + "equation='gamma\\*I', transition_type=TransitionType.T)\n", + "\n", + "In \\[603\\]: modelTrans = SimulateOde(stateList, \n", + ".….: paramList, .….: transition=\\[t1, t2\\])\n", + "\n", + "In \\[604\\]: modelTrans.get_ode_eqn()\n", + "\n", + "We can see that the resulting ode is exactly the same, as expected. The\n", + "transition matrix that defines this process can easily be visualized\n", + "using graphviz. Because only certain renderer permit the use of sub and\n", + "superscript, operators such as $**$ are left as they are in the\n", + "equation.\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[2\\]: f = plt.figure()\n", + "\n", + "In \\[3\\]: modelTrans.get_transition_matrix()\n", + "\n", + "@savefig sir_transition_graph.png In \\[4\\]: dot =\n", + "modelTrans.get_transition_graph()\n", + "\n", + "If we put in via the wrong argument like below (not run), then an error\n", + "will appear.\n", + "\n", + "In \\[1\\]: \\# modelTrans = DeterministicOde(stateList, paramList,\n", + "ode=\\[t1, t2\\])\n", + "\n", + "because `TranstionType` was defined explicitly as a transition instead\n", + "of an ode. The same can be observed when the wrong `TransitionType` is\n", + "used for any of the input argument.\n", + "\n", + "This though, only encourages us to define the transitions carefully. We\n", + "can also pretend that the set of odes are in fact just a set of birth\n", + "process\n", + "\n", + "In \\[619\\]: birth1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", + "transition_type=TransitionType.B)\n", + "\n", + "In \\[620\\]: birth2 = Transition(origin='I', equation='beta\\*S\\*I -\n", + "gamma\\*I', transition_type=TransitionType.B)\n", + "\n", + "In \\[621\\]: birth3 = Transition(origin='R', equation='gamma\\*I',\n", + "transition_type=TransitionType.B)\n", + "\n", + "In \\[622\\]: modelBirth = DeterministicOde(stateList, \n", + ".….: paramList, .….: birth_death=\\[birth1, birth2, birth3\\])\n", + "\n", + "In \\[623\\]: modelBirth.get_ode_eqn()\n", + "\n", + "which will yield the same set result. Alternatively, we can use the\n", + "negative of the equation but set it to be a death process. For example,\n", + "we multiply the equations for state $S$ and $R$ with a negative sign and\n", + "set the transition type to be a death process instead.\n", + "\n", + "In \\[624\\]: death1 = Transition(origin='S', equation='beta\\*S\\*I',\n", + "transition_type=TransitionType.D)\n", + "\n", + "In \\[625\\]: birth2 = Transition(origin='I', equation='beta\\*S\\*I -\n", + "gamma\\*I', transition_type=TransitionType.B)\n", + "\n", + "In \\[626\\]: death3 = Transition(origin='R', equation='-gamma\\*I',\n", + "transition_type=TransitionType.D)\n", + "\n", + "In \\[627\\]: modelBD = DeterministicOde(stateList, \n", + ".….: paramList, .….: birth_death=\\[death1, birth2, death3\\])\n", + "\n", + "In \\[628\\]: modelBD.get_ode_eqn()\n", + "\n", + "We can see that all the above ways yield the same set of ode at the end.\n", + "\n", + "## Model Addition\n", + "\n", + "Because we allow the separation of transitions between states and\n", + "birth/death processes, the birth/death processes can be added later on.\n", + "\n", + "In \\[1\\]: modelBD2 = modelTrans\n", + "\n", + "In \\[1\\]: modelBD2.param_list = paramList + \\['mu', 'B'\\]\n", + "\n", + "In \\[1\\]: birthDeathList = \\[Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", + "...: Transition(origin='S', equation='mu\\*S',\n", + "transition_type=TransitionType.D), ...: Transition(origin='I',\n", + "equation='mu\\*I', transition_type=TransitionType.D)\\]\n", + "\n", + "In \\[1\\]: modelBD2.birth_death_list = birthDeathList\n", + "\n", + "In \\[1\\]: modelBD2.get_ode_eqn()\n", + "\n", + "So modeling can be done in stages. Start with a standard closed system\n", + "and extend it with additional flows that interact with the environment.\n", + "\n", + "## Transition type\n", + "\n", + "There are currently four different type of transitions allowed, which is\n", + "defined in an enum class also located in `transition`. The four types\n", + "are B, D, ODE and T, where they represent different type of process with\n", + "explanation in their corresponding value.\n", + "\n", + "In \\[1\\]: from pygom import transition\n", + "\n", + "In \\[2\\]: for i in transition.TransitionType: \n", + "...: print(str(i) + \" = \" + i.value)\n", + "\n", + "Each birth process are added to the origin state while each death\n", + "process are deducted from the state, i.e. added to the state after\n", + "multiplying with a negative sign. An ode type is also added to the state\n", + "and we forbid the number of input ode to be greater than the number of\n", + "state inputted." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.md new file mode 100644 index 00000000..b0be6933 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.md @@ -0,0 +1,230 @@ +# Transition Object {#transition} + +The most important part of setting up the model is to correctly define +the set odes, which is based solely on the classes defined in +`transition`{.interpreted-text role="mod"}. All transitions that gets +fed into the ode system needs to be defined as a transition object, +`Transition`{.interpreted-text role="class"}. It takes a total of four +input arguments + +1. The origin state +2. Equation that describe the process +3. The type of transition +4. The destination state + +where the first three are mandatory. To demonstrate, we go back to the +SIR model defined previously in the section `sir`{.interpreted-text +role="ref"}. Recall that the set of odes are + +$$\begin{aligned} +\frac{\partial S}{\partial t} &= -\beta SI \\ +\frac{\partial I}{\partial t} &= \beta SI - \gamma I \\ +\frac{\partial R}{\partial t} &= \gamma I. +\end{aligned}$$ + +We can simply define the set of ode, as seen previously, via + +::: {.ipython} +In \[1\]: from pygom import Transition, TransitionType, common_models + +In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', +transition_type=TransitionType.ODE) + +In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - +gamma\*I\', transition_type=TransitionType.ODE) + +In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', +transition_type=TransitionType.ODE) +::: + +Note that we need to state explicitly the type of equation we are +inputting, which is simply of type **ODE** in this case. We can confirm +this has been entered correctly by putting it into +`DeterministicOde`{.interpreted-text role="class"} + +::: {.ipython} +In \[1\]: from pygom import DeterministicOde + +In \[2\]: stateList = \[\'S\', \'I\', \'R\'\] + +In \[3\]: paramList = \[\'beta\', \'gamma\'\] + +In \[4\]: model = DeterministicOde(stateList, + +: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) +::: + +and check it + +::: {.ipython} +In \[1\]: model.get_ode_eqn() +::: + +An alternative print function `print_ode`{.interpreted-text role="func"} +is also available which may be more suitable in other situation. The +default prints the formula in a rendered format and another which prints +out the latex format which can be used directly in a latex document. The +latter is useful as it saves typing out the formula twice, once in the +code and another in documents. + +::: {.ipython} +In \[1\]: model.print_ode(False) + +In \[2\]: model.print_ode(True) +::: + +Now we are going to show the different ways of defining the same set of +odes. + +## Defining the equations {#defining-eqn} + +Recognizing that the set of odes defining the SIR model is the result of +two transitions, + +$$\begin{aligned} +S \rightarrow I &= \beta SI \\ +I \rightarrow R &= \gamma I +\end{aligned}$$ + +where $S \rightarrow I$ denotes a transition from state $S$ to state +$I$. Therefore, we can simply define our model by these two transition, +but now these two transition needs to be inputted via the `transition` +argument instead of the `ode` argument. Note that we are initializing +the model using a different class, because the stochastic implementation +has more operation on transitions. + +::: {.ipython} +In \[600\]: from pygom import SimulateOde + +In \[601\]: t1 = Transition(origin=\'S\', destination=\'I\', +equation=\'beta\*S\*I\', transition_type=TransitionType.T) + +In \[602\]: t2 = Transition(origin=\'I\', destination=\'R\', +equation=\'gamma\*I\', transition_type=TransitionType.T) + +In \[603\]: modelTrans = SimulateOde(stateList, + +: \.....: paramList, \.....: transition=\[t1, t2\]) + +In \[604\]: modelTrans.get_ode_eqn() +::: + +We can see that the resulting ode is exactly the same, as expected. The +transition matrix that defines this process can easily be visualized +using graphviz. Because only certain renderer permit the use of sub and +superscript, operators such as $**$ are left as they are in the +equation. + +::: {.ipython} +In \[1\]: import matplotlib.pyplot as plt + +In \[2\]: f = plt.figure() + +In \[3\]: modelTrans.get_transition_matrix() + +\@savefig sir_transition_graph.png In \[4\]: dot = +modelTrans.get_transition_graph() +::: + +If we put in via the wrong argument like below (not run), then an error +will appear. + +::: {.ipython} +In \[1\]: \# modelTrans = DeterministicOde(stateList, paramList, +ode=\[t1, t2\]) +::: + +because `TranstionType`{.interpreted-text role="class"} was defined +explicitly as a transition instead of an ode. The same can be observed +when the wrong `TransitionType`{.interpreted-text role="class"} is used +for any of the input argument. + +This though, only encourages us to define the transitions carefully. We +can also pretend that the set of odes are in fact just a set of birth +process + +::: {.ipython} +In \[619\]: birth1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', +transition_type=TransitionType.B) + +In \[620\]: birth2 = Transition(origin=\'I\', equation=\'beta\*S\*I - +gamma\*I\', transition_type=TransitionType.B) + +In \[621\]: birth3 = Transition(origin=\'R\', equation=\'gamma\*I\', +transition_type=TransitionType.B) + +In \[622\]: modelBirth = DeterministicOde(stateList, + +: \.....: paramList, \.....: birth_death=\[birth1, birth2, birth3\]) + +In \[623\]: modelBirth.get_ode_eqn() +::: + +which will yield the same set result. Alternatively, we can use the +negative of the equation but set it to be a death process. For example, +we multiply the equations for state $S$ and $R$ with a negative sign and +set the transition type to be a death process instead. + +::: {.ipython} +In \[624\]: death1 = Transition(origin=\'S\', equation=\'beta\*S\*I\', +transition_type=TransitionType.D) + +In \[625\]: birth2 = Transition(origin=\'I\', equation=\'beta\*S\*I - +gamma\*I\', transition_type=TransitionType.B) + +In \[626\]: death3 = Transition(origin=\'R\', equation=\'-gamma\*I\', +transition_type=TransitionType.D) + +In \[627\]: modelBD = DeterministicOde(stateList, + +: \.....: paramList, \.....: birth_death=\[death1, birth2, death3\]) + +In \[628\]: modelBD.get_ode_eqn() +::: + +We can see that all the above ways yield the same set of ode at the end. + +## Model Addition + +Because we allow the separation of transitions between states and +birth/death processes, the birth/death processes can be added later on. + +::: {.ipython} +In \[1\]: modelBD2 = modelTrans + +In \[1\]: modelBD2.param_list = paramList + \[\'mu\', \'B\'\] + +In \[1\]: birthDeathList = \[Transition(origin=\'S\', equation=\'B\', transition_type=TransitionType.B), + +: \...: Transition(origin=\'S\', equation=\'mu\*S\', + transition_type=TransitionType.D), \...: Transition(origin=\'I\', + equation=\'mu\*I\', transition_type=TransitionType.D)\] + +In \[1\]: modelBD2.birth_death_list = birthDeathList + +In \[1\]: modelBD2.get_ode_eqn() +::: + +So modeling can be done in stages. Start with a standard closed system +and extend it with additional flows that interact with the environment. + +## Transition type + +There are currently four different type of transitions allowed, which is +defined in an enum class also located in `transition`{.interpreted-text +role="mod"}. The four types are B, D, ODE and T, where they represent +different type of process with explanation in their corresponding value. + +::: {.ipython} +In \[1\]: from pygom import transition + +In \[2\]: for i in transition.TransitionType: + +: \...: print(str(i) + \" = \" + i.value) +::: + +Each birth process are added to the origin state while each death +process are deducted from the state, i.e. added to the state after +multiplying with a negative sign. An ode type is also added to the state +and we forbid the number of input ode to be greater than the number of +state inputted. diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb new file mode 100644 index 00000000..644be889 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb @@ -0,0 +1,23 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Convert ODE into transitions\n", + "\n", + "As seen previously in `transition`, we can define the model via the\n", + "transitions or explicitly as ODEs. There are times when we all just want\n", + "to test out some model in a paper and the only available information are\n", + "the ODEs themselves. Even though we know that the ODEs come from some\n", + "underlying transitions, breaking them down can be a time consuming\n", + "process. We provide the functionalities to do this automatically.\n", + "\n", + "unroll/unrollSimple.rst unroll/unrollBD.rst unroll/unrollHard.rst" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.md b/doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.md new file mode 100644 index 00000000..92e3cf5c --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/doc_to_sort/unrollOde.md @@ -0,0 +1,13 @@ +# Convert ODE into transitions {#unrollOde} + +As seen previously in `transition`{.interpreted-text role="ref"}, we can +define the model via the transitions or explicitly as ODEs. There are +times when we all just want to test out some model in a paper and the +only available information are the ODEs themselves. Even though we know +that the ODEs come from some underlying transitions, breaking them down +can be a time consuming process. We provide the functionalities to do +this automatically. + +::: {.toctree} +unroll/unrollSimple.rst unroll/unrollBD.rst unroll/unrollHard.rst +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/.md b/doc/doc/pygom-doc/mdconvert/mod/.md new file mode 100644 index 00000000..8c6b1b35 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/.md @@ -0,0 +1,5 @@ +# stochastic + +::: {.automodule members="" noindex=""} +pygom.model.simulate +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/common_models.ipynb b/doc/doc/pygom-doc/mdconvert/mod/common_models.ipynb new file mode 100644 index 00000000..c16f1f3e --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/common_models.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# common_models\n", + "\n", + "pygom.model.common_models" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/common_models.md b/doc/doc/pygom-doc/mdconvert/mod/common_models.md new file mode 100644 index 00000000..b65e53b2 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/common_models.md @@ -0,0 +1,5 @@ +# common_models + +::: {.automodule members="" noindex=""} +pygom.model.common_models +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/confidence_interval.ipynb b/doc/doc/pygom-doc/mdconvert/mod/confidence_interval.ipynb new file mode 100644 index 00000000..ca61c381 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/confidence_interval.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# loss_type\n", + "\n", + "pygom.loss.loss_type" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/confidence_interval.md b/doc/doc/pygom-doc/mdconvert/mod/confidence_interval.md new file mode 100644 index 00000000..577e3dd7 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/confidence_interval.md @@ -0,0 +1,5 @@ +# loss_type + +::: {.automodule members="" noindex=""} +pygom.loss.loss_type +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/deterministic.ipynb b/doc/doc/pygom-doc/mdconvert/mod/deterministic.ipynb new file mode 100644 index 00000000..6ea2c788 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/deterministic.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# deterministic\n", + "\n", + "pygom.model.deterministic" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/deterministic.md b/doc/doc/pygom-doc/mdconvert/mod/deterministic.md new file mode 100644 index 00000000..a8e585c4 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/deterministic.md @@ -0,0 +1,5 @@ +# deterministic + +::: {.automodule members="" noindex=""} +pygom.model.deterministic +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/epi_analysis.ipynb b/doc/doc/pygom-doc/mdconvert/mod/epi_analysis.ipynb new file mode 100644 index 00000000..265113af --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/epi_analysis.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# epi_analysis\n", + "\n", + "pygom.model.epi_analysis" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/epi_analysis.md b/doc/doc/pygom-doc/mdconvert/mod/epi_analysis.md new file mode 100644 index 00000000..ef6bd06b --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/epi_analysis.md @@ -0,0 +1,5 @@ +# epi_analysis + +::: {.automodule members="" noindex=""} +pygom.model.epi_analysis +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/get_init.ipynb b/doc/doc/pygom-doc/mdconvert/mod/get_init.ipynb new file mode 100644 index 00000000..80dd8a60 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/get_init.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# get_init\n", + "\n", + "pygom.loss.get_init" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/get_init.md b/doc/doc/pygom-doc/mdconvert/mod/get_init.md new file mode 100644 index 00000000..87c54755 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/get_init.md @@ -0,0 +1,5 @@ +# get_init + +::: {.automodule members="" noindex=""} +pygom.loss.get_init +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/index.ipynb b/doc/doc/pygom-doc/mdconvert/mod/index.ipynb new file mode 100644 index 00000000..156566f3 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/index.ipynb @@ -0,0 +1,22 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Code documentations\n", + "\n", + "## model\n", + "\n", + "common_models transition deterministic simulate epi_analysis odeutils\n", + "\n", + "## loss\n", + "\n", + "odeloss losstype confidence_interval get_init" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/index.md b/doc/doc/pygom-doc/mdconvert/mod/index.md new file mode 100644 index 00000000..58e690a2 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/index.md @@ -0,0 +1,13 @@ +# Code documentations {#mod} + +## model + +::: {.toctree} +common_models transition deterministic simulate epi_analysis odeutils +::: + +## loss + +::: {.toctree} +odeloss losstype confidence_interval get_init +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/losstype.ipynb b/doc/doc/pygom-doc/mdconvert/mod/losstype.ipynb new file mode 100644 index 00000000..90930726 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/losstype.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# confidence_interval\n", + "\n", + "pygom.loss.confidence_interval" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/losstype.md b/doc/doc/pygom-doc/mdconvert/mod/losstype.md new file mode 100644 index 00000000..11277a2c --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/losstype.md @@ -0,0 +1,5 @@ +# confidence_interval + +::: {.automodule members="" noindex=""} +pygom.loss.confidence_interval +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/odeloss.ipynb b/doc/doc/pygom-doc/mdconvert/mod/odeloss.ipynb new file mode 100644 index 00000000..ad8b8e73 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/odeloss.ipynb @@ -0,0 +1,24 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ode_loss\n", + "\n", + "These are basically the interfaces for `pygom.loss.BaseLoss`\n", + "\n", + "pygom.loss.ode_loss\n", + "\n", + "# calculations\n", + "\n", + "The base class which contains has all the calculation implemented\n", + "\n", + "pygom.loss.base_loss" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/odeloss.md b/doc/doc/pygom-doc/mdconvert/mod/odeloss.md new file mode 100644 index 00000000..82ac8080 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/odeloss.md @@ -0,0 +1,16 @@ +# ode_loss + +These are basically the interfaces for +`pygom.loss.BaseLoss`{.interpreted-text role="class"} + +::: {.automodule members="" noindex=""} +pygom.loss.ode_loss +::: + +# calculations + +The base class which contains has all the calculation implemented + +::: {.automodule members="" noindex=""} +pygom.loss.base_loss +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/odeutils.ipynb b/doc/doc/pygom-doc/mdconvert/mod/odeutils.ipynb new file mode 100644 index 00000000..4e591188 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/odeutils.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ode_utils\n", + "\n", + "pygom.model.ode_utils" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/odeutils.md b/doc/doc/pygom-doc/mdconvert/mod/odeutils.md new file mode 100644 index 00000000..192c4502 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/odeutils.md @@ -0,0 +1,5 @@ +# ode_utils + +::: {.automodule members="" noindex=""} +pygom.model.ode_utils +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/simulate.ipynb b/doc/doc/pygom-doc/mdconvert/mod/simulate.ipynb new file mode 100644 index 00000000..c56782d0 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/simulate.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# stochastic\n", + "\n", + "pygom.model.simulate" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/simulate.md b/doc/doc/pygom-doc/mdconvert/mod/simulate.md new file mode 100644 index 00000000..8c6b1b35 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/simulate.md @@ -0,0 +1,5 @@ +# stochastic + +::: {.automodule members="" noindex=""} +pygom.model.simulate +::: diff --git a/doc/doc/pygom-doc/mdconvert/mod/transition.ipynb b/doc/doc/pygom-doc/mdconvert/mod/transition.ipynb new file mode 100644 index 00000000..0708eba4 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/transition.ipynb @@ -0,0 +1,16 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# transition\n", + "\n", + "pygom.model.transition" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/mod/transition.md b/doc/doc/pygom-doc/mdconvert/mod/transition.md new file mode 100644 index 00000000..46920265 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/mod/transition.md @@ -0,0 +1,5 @@ +# transition + +::: {.automodule members="" noindex=""} +pygom.model.transition +::: diff --git a/doc/doc/pygom-doc/mdconvert/unroll/.md b/doc/doc/pygom-doc/mdconvert/unroll/.md new file mode 100644 index 00000000..07b17497 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/.md @@ -0,0 +1,57 @@ +# Simple Problem {#unrollSimple} + +For a simple problem, we consider the SIR model defined by + +$$\begin{aligned} +\frac{dS}{dt} &= -\beta SI \\ +\frac{dI}{dt} &= \beta SI - \gamma I \\ +\frac{dR}{dt} &= \gamma I. +\end{aligned}$$ + +which consists of two transitions + +::: {.graphviz} + +digraph SIR_Model { + +: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = + \"βSI\" \]; I -\> R \[ label = \"γI\" \]; + +} +::: + +Let\'s define this using the code block below + +::: {.ipython} +In \[1\]: from pygom import SimulateOde, Transition, TransitionType + +In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', +transition_type=TransitionType.ODE) + +In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - +gamma\*I\', transition_type=TransitionType.ODE) + +In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', +transition_type=TransitionType.ODE) + +In \[6\]: stateList = \[\'S\', \'I\', \'R\'\] + +In \[7\]: paramList = \[\'beta\', \'gamma\'\] + +In \[8\]: ode = SimulateOde(stateList, + +: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) + +In \[9\]: ode.get_transition_matrix() +::: + +and the last line shows that the transition matrix is empty. This is the +expected result because `SimulateOdeModel`{.interpreted-text +role="class"} was not initialized using transitions. We populate the +transition matrix below and demonstrate the difference. + +::: {.ipython} +In \[1\]: ode = ode.get_unrolled_obj() + +In \[2\]: ode.get_transition_matrix() +::: diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.ipynb b/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.ipynb new file mode 100644 index 00000000..fadb2e43 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.ipynb @@ -0,0 +1,64 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ODE With Birth and Death Process\n", + "\n", + "We follow on from the SIR model of `unrollSimple` but with additional\n", + "birth and death processes.\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI + B - \\mu S\\\\\n", + "\\frac{dI}{dt} &= \\beta SI - \\gamma I - \\mu I\\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "which consists of two transitions and three birth and death process\n", + "\n", + "digraph SIR_Model { \n", + "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", + "\\]; I -\\> R \\[ label = \"γI\" \\]; B \\[height=0 margin=0 shape=plaintext\n", + "width=0\\]; B -\\> S; \"S\\**2*μ\" \\[height=0 margin=0 shape=plaintext\n", + "width=0\\]; S -\\> \"S\\**2*μ\"; \"I\\*μ\" \\[height=0 margin=0 shape=plaintext\n", + "width=0\\]; I -\\> \"I\\*μ\";\n", + "\n", + "}\n", + "\n", + "Let's define this in terms of ODEs, and unroll it back to the individual\n", + "processes.\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType, SimulateOde,\n", + "common_models\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[1\\]: paramList = \\['beta', 'gamma', 'B', 'mu'\\]\n", + "\n", + "In \\[1\\]: odeList = \\[ \n", + "...: Transition(origin='S', ...: equation='-beta\\*S\\*I + B - mu\\*S',\n", + "...: transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", + "...: equation='beta\\*S\\*I - gamma\\*I - mu\\*I', ...:\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='R', ...:\n", + "equation='gamma\\*I', ...: transition_type=TransitionType.ODE) ...: \\]\n", + "\n", + "In \\[1\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", + "\n", + "In \\[1\\]: ode2 = ode.get_unrolled_obj()\n", + "\n", + "In \\[1\\]: f = plt.figure()\n", + "\n", + "@savefig sir_unrolled_transition_graph.png In \\[1\\]:\n", + "ode2.get_transition_graph()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.md b/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.md new file mode 100644 index 00000000..bc808719 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.md @@ -0,0 +1,60 @@ +# ODE With Birth and Death Process {#unrollBD} + +We follow on from the SIR model of `unrollSimple`{.interpreted-text +role="ref"} but with additional birth and death processes. + +$$\begin{aligned} +\frac{dS}{dt} &= -\beta SI + B - \mu S\\ +\frac{dI}{dt} &= \beta SI - \gamma I - \mu I\\ +\frac{dR}{dt} &= \gamma I. +\end{aligned}$$ + +which consists of two transitions and three birth and death process + +::: {.graphviz} + +digraph SIR_Model { + +: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = + \"βSI\" \]; I -\> R \[ label = \"γI\" \]; B \[height=0 + margin=0 shape=plaintext width=0\]; B -\> S; \"S\**2*μ\" + \[height=0 margin=0 shape=plaintext width=0\]; S -\> \"S\**2*μ\"; + \"I\*μ\" \[height=0 margin=0 shape=plaintext width=0\]; I -\> + \"I\*μ\"; + +} +::: + +Let\'s define this in terms of ODEs, and unroll it back to the +individual processes. + +::: {.ipython} +In \[1\]: from pygom import Transition, TransitionType, SimulateOde, +common_models + +In \[1\]: import matplotlib.pyplot as plt + +In \[1\]: stateList = \[\'S\', \'I\', \'R\'\] + +In \[1\]: paramList = \[\'beta\', \'gamma\', \'B\', \'mu\'\] + +In \[1\]: odeList = \[ + +: \...: Transition(origin=\'S\', \...: equation=\'-beta\*S\*I + B - + mu\*S\', \...: transition_type=TransitionType.ODE), \...: + Transition(origin=\'I\', \...: equation=\'beta\*S\*I - gamma\*I - + mu\*I\', \...: transition_type=TransitionType.ODE), \...: + Transition(origin=\'R\', \...: equation=\'gamma\*I\', \...: + transition_type=TransitionType.ODE) \...: \] + +In \[1\]: ode = SimulateOde(stateList, paramList, ode=odeList) + +In \[1\]: ode2 = ode.get_unrolled_obj() + +In \[1\]: f = plt.figure() + +\@savefig sir_unrolled_transition_graph.png In \[1\]: +ode2.get_transition_graph() + +In \[1\]: plt.close() +::: diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.ipynb b/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.ipynb new file mode 100644 index 00000000..64e14bd0 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.ipynb @@ -0,0 +1,90 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hard Problem\n", + "\n", + "Now we turn to a harder problem that does not have a one to one mapping\n", + "between all the transitions and the terms in the ODEs. We use the model\n", + "in `Influenza_SLIARN`, defined by\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -S \\beta (I + \\delta A) \\\\ \n", + "\\frac{dL}{dt} &= S \\beta (I + \\delta A) - \\kappa L \\\\ \n", + "\\frac{dI}{dt} &= p \\kappa L - \\alpha I \\\\\n", + "\\frac{dA}{dt} &= (1 - p) \\kappa L - \\eta A \\\\\n", + "\\frac{dR}{dt} &= f \\alpha I + \\eta A \\\\\n", + "\\frac{dN}{dt} &= -(1 - f) \\alpha I.\n", + "\\end{aligned}$$\n", + "\n", + "The outflow of state **L**, $\\kappa L$, is composed of two transitions,\n", + "one to **I** and the other to **A** but the ode of **L** only reflects\n", + "the total flow going out of the state. Same can be said for state **I**,\n", + "where the flow $\\alpha I$ goes to both **R** and **N**. Graphically, it\n", + "is a rather simple process as shown below.\n", + "\n", + "digraph SLIARD_Model { \n", + "labelloc = \"t\"; label = \"Original transitions\"; rankdir=LR; size=\"8\"\n", + "node \\[shape = circle\\]; S -\\> L \\[ label = \"-Sβ(I + δA)/N\" \\]; L -\\> I\n", + "\\[ label = \"κLp\" \\]; L -\\> A \\[ label = \"κL(1-p)\" \\]; I -\\> R \\[ label =\n", + "\"αIf\" \\]; I -\\> D \\[ label = \"αI(1-f)\" \\]; A -\\> R \\[ label = \"ηA\" \\];\n", + "\n", + "}\n", + "\n", + "We slightly change the model by introducing a new state **D** to convert\n", + "it into a closed system. The combination of state **D** and **N** is a\n", + "constant, the total population. So we can remove **N** and this new\n", + "system consist of six transitions. We define them explicitly as ODEs and\n", + "unroll them into transitions.\n", + "\n", + "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'L', 'I', 'A', 'R', 'D'\\]\n", + "\n", + "In \\[2\\]: paramList = \\['beta', 'p', 'kappa', 'alpha', 'f', 'delta',\n", + "'epsilon', 'N'\\]\n", + "\n", + "In \\[3\\]: odeList = \\[ \n", + "...: Transition(origin='S', equation='- beta\\*S/N\\*(I + delta\\*A)',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='L',\n", + "equation='beta\\*S/N\\*(I + delta\\*A) - kappa\\*L',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", + "equation='p\\*kappa\\*L - alpha\\*I', transition_type=TransitionType.ODE),\n", + "...: Transition(origin='A', equation='(1 - p)*kappa* L - epsilon\\*A',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='R',\n", + "equation='f\\*alpha\\*I + epsilon\\*A',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='D',\n", + "equation='(1 - f)*alpha*I', transition_type=TransitionType.ODE) \\]\n", + "\n", + "In \\[4\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", + "\n", + "In \\[5\\]: ode.get_transition_matrix()\n", + "\n", + "In \\[6\\]: ode2 = ode.get_unrolled_obj()\n", + "\n", + "In \\[7\\]: ode2.get_transition_matrix()\n", + "\n", + "In \\[8\\]: ode2.get_ode_eqn()\n", + "\n", + "After unrolling the odes, we have the following transition graph\n", + "\n", + "@savefig sir_unrolled_transition_graph_hard.png In \\[1\\]:\n", + "ode2.get_transition_graph()\n", + "\n", + "In \\[2\\]: plt.close()\n", + "\n", + "In \\[3\\]: print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify())\n", + "\\# difference\n", + "\n", + "which is exactly the same apart from slightly weird arrangement of\n", + "symbols in some of the equations. The last line with a value of zero\n", + "also reaffirms the result." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.md b/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.md new file mode 100644 index 00000000..e02cd29d --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.md @@ -0,0 +1,89 @@ +# Hard Problem {#unrollHard} + +Now we turn to a harder problem that does not have a one to one mapping +between all the transitions and the terms in the ODEs. We use the model +in `Influenza_SLIARN`{.interpreted-text role="func"}, defined by + +$$\begin{aligned} +\frac{dS}{dt} &= -S \beta (I + \delta A) \\ +\frac{dL}{dt} &= S \beta (I + \delta A) - \kappa L \\ +\frac{dI}{dt} &= p \kappa L - \alpha I \\ +\frac{dA}{dt} &= (1 - p) \kappa L - \eta A \\ +\frac{dR}{dt} &= f \alpha I + \eta A \\ +\frac{dN}{dt} &= -(1 - f) \alpha I. +\end{aligned}$$ + +The outflow of state **L**, $\kappa L$, is composed of two transitions, +one to **I** and the other to **A** but the ode of **L** only reflects +the total flow going out of the state. Same can be said for state **I**, +where the flow $\alpha I$ goes to both **R** and **N**. Graphically, it +is a rather simple process as shown below. + +::: {.graphviz} + +digraph SLIARD_Model { + +: labelloc = \"t\"; label = \"Original transitions\"; rankdir=LR; + size=\"8\" node \[shape = circle\]; S -\> L \[ label = + \"-Sβ(I + δA)/N\" \]; L -\> I \[ label = \"κLp\" + \]; L -\> A \[ label = \"κL(1-p)\" \]; I -\> R \[ label = + \"αIf\" \]; I -\> D \[ label = \"αI(1-f)\" \]; A -\> R + \[ label = \"ηA\" \]; + +} +::: + +We slightly change the model by introducing a new state **D** to convert +it into a closed system. The combination of state **D** and **N** is a +constant, the total population. So we can remove **N** and this new +system consist of six transitions. We define them explicitly as ODEs and +unroll them into transitions. + +::: {.ipython} +In \[1\]: from pygom import SimulateOde, Transition, TransitionType + +In \[1\]: stateList = \[\'S\', \'L\', \'I\', \'A\', \'R\', \'D\'\] + +In \[2\]: paramList = \[\'beta\', \'p\', \'kappa\', \'alpha\', \'f\', +\'delta\', \'epsilon\', \'N\'\] + +In \[3\]: odeList = \[ + +: \...: Transition(origin=\'S\', equation=\'- beta\*S/N\*(I + + delta\*A)\', transition_type=TransitionType.ODE), \...: + Transition(origin=\'L\', equation=\'beta\*S/N\*(I + delta\*A) - + kappa\*L\', transition_type=TransitionType.ODE), \...: + Transition(origin=\'I\', equation=\'p\*kappa\*L - alpha\*I\', + transition_type=TransitionType.ODE), \...: Transition(origin=\'A\', + equation=\'(1 - p)*kappa* L - epsilon\*A\', + transition_type=TransitionType.ODE), \...: Transition(origin=\'R\', + equation=\'f\*alpha\*I + epsilon\*A\', + transition_type=TransitionType.ODE), \...: Transition(origin=\'D\', + equation=\'(1 - f)*alpha*I\', transition_type=TransitionType.ODE) \] + +In \[4\]: ode = SimulateOde(stateList, paramList, ode=odeList) + +In \[5\]: ode.get_transition_matrix() + +In \[6\]: ode2 = ode.get_unrolled_obj() + +In \[7\]: ode2.get_transition_matrix() + +In \[8\]: ode2.get_ode_eqn() +::: + +After unrolling the odes, we have the following transition graph + +::: {.ipython} +\@savefig sir_unrolled_transition_graph_hard.png In \[1\]: +ode2.get_transition_graph() + +In \[2\]: plt.close() + +In \[3\]: print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify()) +\# difference +::: + +which is exactly the same apart from slightly weird arrangement of +symbols in some of the equations. The last line with a value of zero +also reaffirms the result. diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.ipynb b/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.ipynb new file mode 100644 index 00000000..88bbd592 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple Problem\n", + "\n", + "For a simple problem, we consider the SIR model defined by\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\frac{dI}{dt} &= \\beta SI - \\gamma I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "which consists of two transitions\n", + "\n", + "digraph SIR_Model { \n", + "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", + "\\]; I -\\> R \\[ label = \"γI\" \\];\n", + "\n", + "}\n", + "\n", + "Let's define this using the code block below\n", + "\n", + "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", + "\n", + "In \\[2\\]: ode1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", + "transition_type=TransitionType.ODE)\n", + "\n", + "In \\[3\\]: ode2 = Transition(origin='I', equation='beta\\*S\\*I -\n", + "gamma\\*I', transition_type=TransitionType.ODE)\n", + "\n", + "In \\[4\\]: ode3 = Transition(origin='R', equation='gamma\\*I',\n", + "transition_type=TransitionType.ODE)\n", + "\n", + "In \\[6\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[7\\]: paramList = \\['beta', 'gamma'\\]\n", + "\n", + "In \\[8\\]: ode = SimulateOde(stateList, \n", + "...: paramList, ...: ode=\\[ode1, ode2, ode3\\])\n", + "\n", + "In \\[9\\]: ode.get_transition_matrix()\n", + "\n", + "and the last line shows that the transition matrix is empty. This is the\n", + "expected result because `SimulateOdeModel` was not initialized using\n", + "transitions. We populate the transition matrix below and demonstrate the\n", + "difference.\n", + "\n", + "In \\[1\\]: ode = ode.get_unrolled_obj()\n", + "\n", + "In \\[2\\]: ode.get_transition_matrix()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.md b/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.md new file mode 100644 index 00000000..07b17497 --- /dev/null +++ b/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.md @@ -0,0 +1,57 @@ +# Simple Problem {#unrollSimple} + +For a simple problem, we consider the SIR model defined by + +$$\begin{aligned} +\frac{dS}{dt} &= -\beta SI \\ +\frac{dI}{dt} &= \beta SI - \gamma I \\ +\frac{dR}{dt} &= \gamma I. +\end{aligned}$$ + +which consists of two transitions + +::: {.graphviz} + +digraph SIR_Model { + +: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = + \"βSI\" \]; I -\> R \[ label = \"γI\" \]; + +} +::: + +Let\'s define this using the code block below + +::: {.ipython} +In \[1\]: from pygom import SimulateOde, Transition, TransitionType + +In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', +transition_type=TransitionType.ODE) + +In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - +gamma\*I\', transition_type=TransitionType.ODE) + +In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', +transition_type=TransitionType.ODE) + +In \[6\]: stateList = \[\'S\', \'I\', \'R\'\] + +In \[7\]: paramList = \[\'beta\', \'gamma\'\] + +In \[8\]: ode = SimulateOde(stateList, + +: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) + +In \[9\]: ode.get_transition_matrix() +::: + +and the last line shows that the transition matrix is empty. This is the +expected result because `SimulateOdeModel`{.interpreted-text +role="class"} was not initialized using transitions. We populate the +transition matrix below and demonstrate the difference. + +::: {.ipython} +In \[1\]: ode = ode.get_unrolled_obj() + +In \[2\]: ode.get_transition_matrix() +::: From 22eaacaef79a623a31854dd0df1aece15f09870a Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 12:51:39 +0100 Subject: [PATCH 063/188] edit introduction --- doc/doc/pygom-doc/intro.md | 25 ++++++++++++++----- .../transition.ipynb | 0 .../{mdconvert/doc_to_sort => }/ref.md | 0 3 files changed, 19 insertions(+), 6 deletions(-) rename doc/doc/pygom-doc/{mdconvert/doc_to_sort => notebooks}/transition.ipynb (100%) rename doc/doc/pygom-doc/{mdconvert/doc_to_sort => }/ref.md (100%) diff --git a/doc/doc/pygom-doc/intro.md b/doc/doc/pygom-doc/intro.md index f8cdc73c..02905b2c 100644 --- a/doc/doc/pygom-doc/intro.md +++ b/doc/doc/pygom-doc/intro.md @@ -1,11 +1,24 @@ -# Welcome to your Jupyter Book +# Welcome to the documentation for PyGOM + +PyGOM (Python Generic ODE Model) is a Python package that aims to facilitate the application of ordinary differential equations (ODEs) in the real world, +with a focus in epidemiology. +This package helps the user define their ODE system in an intuitive manner and provides convenience functions - +making use of various algebraic and numerical libraries in the backend - that can be used in a straight forward fashion. + +This is an open source project hosted on [Github](https://github.com/PublicHealthEngland/pygom). + +A manuscript containing a shortened motivation and use is hosted on [arxXiv](https://arxiv.org/abs/1803.06934). + +#TODO insert intro text -This is a small sample book to give you a feel for how book content is -structured. -It shows off a few of the major file types, as well as some sample content. -It does not go in-depth into any particular topic - check out [the Jupyter Book documentation](https://jupyterbook.org) for more information. -Check out the content pages bundled with this sample book to see more. ```{tableofcontents} ``` + +# Code Documentation and FAQ +#TODO from index.rst +# References +#TODO +# Indices and tables +#TODO \ No newline at end of file diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.ipynb b/doc/doc/pygom-doc/notebooks/transition.ipynb similarity index 100% rename from doc/doc/pygom-doc/mdconvert/doc_to_sort/transition.ipynb rename to doc/doc/pygom-doc/notebooks/transition.ipynb diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.md b/doc/doc/pygom-doc/ref.md similarity index 100% rename from doc/doc/pygom-doc/mdconvert/doc_to_sort/ref.md rename to doc/doc/pygom-doc/ref.md From 144e57be662ea347204253191caabd153e3205f7 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 12:52:42 +0100 Subject: [PATCH 064/188] updated table of contents and config files --- doc/doc/pygom-doc/_config.yml | 5 +++-- doc/doc/pygom-doc/_toc.yml | 29 +++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/doc/doc/pygom-doc/_config.yml b/doc/doc/pygom-doc/_config.yml index fd486944..ddf3ee23 100644 --- a/doc/doc/pygom-doc/_config.yml +++ b/doc/doc/pygom-doc/_config.yml @@ -3,7 +3,8 @@ title: PyGOM documentation author: Public Health England / UK Health Security Agency -logo: ukhsa.png +#TODO change logo +logo: logo.png # build files in table of contents # used as alternative to exclude patterns @@ -14,7 +15,7 @@ only_build_toc_files: true # this could avoid the issue of execution timing out # See https://jupyterbook.org/content/execute.html execute: - execute_notebooks: cache + execute_notebooks: auto # Define the name of the latex output file for PDF builds latex: diff --git a/doc/doc/pygom-doc/_toc.yml b/doc/doc/pygom-doc/_toc.yml index 74d5c710..29b83e52 100644 --- a/doc/doc/pygom-doc/_toc.yml +++ b/doc/doc/pygom-doc/_toc.yml @@ -3,7 +3,28 @@ format: jb-book root: intro -chapters: -- file: markdown -- file: notebooks -- file: markdown-notebooks +parts: + - caption: User documentation + chapters: + - file: markdown.md + - file: md/getting_started.md + - file: notebooks/sir.ipynb + - file: notebooks/transition.ipynb + #notebooks/sir.ipynb + #transition.rst + #stochastic.rst + #unrollOde.rst + #epi.rst + #epijson.rst + #bvpSimple.rst + #gradient.rst + #fh.rst + #estimate1.rst + #estimate2.rst + #initialGuess.rst + #profile.rst + #common_models.rst +# - caption: Frequently asked questions +# - caption: Code documentation +# - caption: References +# - caption: Indices and tables From fc06c3c76643c523d7f3d9791ce130b837faf56a Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 12:53:28 +0100 Subject: [PATCH 065/188] reformatted with edits --- doc/doc/pygom-doc/notebooks/sir.ipynb | 874 ++++++++++++++++++++++++++ 1 file changed, 874 insertions(+) create mode 100644 doc/doc/pygom-doc/notebooks/sir.ipynb diff --git a/doc/doc/pygom-doc/notebooks/sir.ipynb b/doc/doc/pygom-doc/notebooks/sir.ipynb new file mode 100644 index 00000000..5f64e3d6 --- /dev/null +++ b/doc/doc/pygom-doc/notebooks/sir.ipynb @@ -0,0 +1,874 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Motivating Example: SIR Model\n", + "{download}`this notebook <./sir.ipynb>`\n", + "\n", + "## Defining the model\n", + "\n", + "First, we are going to go through an SIR model to show the functionality\n", + "of the package. The SIR model is defined by the following equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\frac{dI}{dt} &= \\beta SI- \\gamma I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "We can set this up as follows:" + ] + }, + { + "cell_type": "markdown", + "id": "586834ab", + "metadata": {}, + "source": [ + "1. import the classes required to define the transitions" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "4c80a36a", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType" + ] + }, + { + "cell_type": "markdown", + "id": "0ec4c9d0", + "metadata": {}, + "source": [ + "2. define our states, in this case the population states of **S**usceptible, **I**nfected and **R**emoved" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "3ce016f2", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['S', 'I', 'R']" + ] + }, + { + "cell_type": "markdown", + "id": "021a1927", + "metadata": {}, + "source": [ + "3. define the set of parameters for our model, here there are only two" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "441e2287", + "metadata": {}, + "outputs": [], + "source": [ + "paramList = ['beta', 'gamma']" + ] + }, + { + "cell_type": "markdown", + "id": "dfd736b2", + "metadata": {}, + "source": [ + "4. specify the transitions of the modelled states; this will form our ODE system" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "b5f80ab0", + "metadata": {}, + "outputs": [], + "source": [ + "odeList = [\n", + " Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) \n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "21629e7b", + "metadata": {}, + "source": [ + "```{note}\n", + "Here, we have invoked a class from `Transition` to define the transition object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See [defining the equations](./transition.ipynb) for an example when the input is wrong.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "69bfb7c3", + "metadata": {}, + "source": [ + "\n", + "5. import the ode module" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "f78c33d4", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde" + ] + }, + { + "cell_type": "markdown", + "id": "477d6f84", + "metadata": {}, + "source": [ + "6. initialize the model, which constructs our ODE system from all the information we have provided" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "c9fbcce0", + "metadata": {}, + "outputs": [], + "source": [ + "model = DeterministicOde(stateList, paramList, ode=odeList)" + ] + }, + { + "cell_type": "markdown", + "id": "4bf43064", + "metadata": {}, + "source": [ + "That is all the information required to define a simple SIR model. We can verify the model using" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "6ad54e09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "143a6871", + "metadata": {}, + "source": [ + "where we can see the equations corresponding to their respective $S,I$ and $R$ state. " + ] + }, + { + "cell_type": "markdown", + "id": "08207474", + "metadata": {}, + "source": [ + "```{note}\n", + "The ordering of the equations is in the standard $S,I,R$ sequence because of how we defined the states initially. \n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7054e58a", + "metadata": {}, + "source": [ + "We can rearrange the state list," + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "07f81fd1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}I \\gamma\\\\- I S \\beta\\\\I S \\beta - I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ I*gamma],\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma]])" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now we are going to define in a different order. note that the output ode changed with the input state\n", + "stateList = ['R', 'S', 'I']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=odeList)\n", + "\n", + "model.get_ode_eqn()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d3f587d4", + "metadata": {}, + "source": [ + "and find that the set of ODEs comes out in the order that we specified. " + ] + }, + { + "cell_type": "markdown", + "id": "1175c832", + "metadata": {}, + "source": [ + "```{tip}\n", + "In addition to showing the equation form of the ODEs, we can also display them as either symbols or latex code, which can save some extra typing when porting the equations to another document.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "960fdc0c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "⎡dR/dt= I⋅γ ⎤\n", + "⎢ ⎥\n", + "⎢dS/dt= -I⋅S⋅β ⎥\n", + "⎢ ⎥\n", + "⎣dI/dt= I⋅S⋅β - I⋅γ⎦\n" + ] + } + ], + "source": [ + "model.print_ode()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "93e32c75", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{array}{cc}dR/dt= & I \\gamma\\\\dS/dt= & - I S \\beta\\\\dI/dt= & I S \\beta - I \\gamma\\end{array}\n" + ] + } + ], + "source": [ + "model.print_ode(True)" + ] + }, + { + "cell_type": "markdown", + "id": "79c154ba", + "metadata": {}, + "source": [ + "#TODO links to unroll\n", + "Here the SIR model was provided to PyGOM as a set ODEs by using the `Transition` to define them. \n", + "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section `unrollOde` for more information, and in particular `unrollSimple` for the continuing demonstration of the SIR model." + ] + }, + { + "cell_type": "markdown", + "id": "51ed6fa2", + "metadata": {}, + "source": [ + "## Extracting model information\n", + "\n", + "We may wish to determine if the set of ODEs are linear. " + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "61684654", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.linear_ode()" + ] + }, + { + "cell_type": "markdown", + "id": "4cf58543", + "metadata": {}, + "source": [ + "Since we know that the SIR model is not linear, we may want to have a look at the Jacobian.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "1c8ff090", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\gamma\\\\0 & - I \\beta & - S \\beta\\\\0 & I \\beta & S \\beta - \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, 0, gamma],\n", + "[0, -I*beta, -S*beta],\n", + "[0, I*beta, S*beta - gamma]])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_jacobian_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "bab79c98", + "metadata": {}, + "source": [ + "Or maybe we want to know the gradient." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "abb02502", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I\\\\- I S & 0\\\\I S & - I\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ 0, I],\n", + "[-I*S, 0],\n", + "[ I*S, -I]])" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_grad_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "9d0052ec", + "metadata": {}, + "source": [ + "```{Warning}\n", + "Invoking the functions that compute the derivatives, $f(x)$, `model.ode()` or `model.jacobian()`, will return an error\n", + "\n", + "These functions are used to solve the ODEs numerically, and require values of initial state values, time, and parameter values.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "35abe902", + "metadata": {}, + "source": [ + "For setting initial conditions, the numeric values of the states **must** be set in the same order that list of states appear. We can use the following to check the state ordering, as well as displaying all of the states that we have included." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "e703c888", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ODEVariable('R', 'R', None, True),\n", + " ODEVariable('S', 'S', None, True),\n", + " ODEVariable('I', 'I', None, True)]" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.state_list" + ] + }, + { + "cell_type": "markdown", + "id": "54e681d0", + "metadata": {}, + "source": [ + "#TODO unsure if this is needed\n", + "There is currently no mechanism to set the numeric initial conditions the states when the states are defined. This is because of an implementation issue with external package, such as solving an initial value problem." + ] + }, + { + "cell_type": "markdown", + "id": "13bed7f9", + "metadata": {}, + "source": [ + "## Initial value problem\n", + "\n", + "By setting the state initial conditions, time, and parameters, we can evaluate our model." + ] + }, + { + "cell_type": "markdown", + "id": "04fb8dd9", + "metadata": {}, + "source": [ + "1. Define the model parameters. (We can call the parameters to check what we must provide.)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "46042ebf", + "metadata": {}, + "outputs": [], + "source": [ + "model.parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "9ec016b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{beta: 0.5, gamma: 0.3333333333333333}" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "model.parameters" + ] + }, + { + "cell_type": "markdown", + "id": "efcdac90", + "metadata": {}, + "source": [ + "2. Provide initial conditions for the states." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "c43074c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "initialState = [0, 1, 1.27e-6]\n", + " \n", + "model.ode(state=initialState, t=1)" + ] + }, + { + "cell_type": "markdown", + "id": "a8dc4681", + "metadata": {}, + "source": [ + "\n", + "3. Implement an ODE solver.\n", + "\n", + "We are well equipped to solve an initial value problem, using the standard numerical integrator such as `odeint ` from `scipy.integrate`. We also used `matplotlib.pyplot` for plotting and `linspace ` to create the time vector." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "a14b9901", + "metadata": {}, + "outputs": [], + "source": [ + "import scipy.integrate\n", + "import numpy\n", + "\n", + "t = numpy.linspace(0, 150, 100)\n", + "\n", + "solution = scipy.integrate.odeint(model.ode, initialState, t)" + ] + }, + { + "cell_type": "markdown", + "id": "c4feebae", + "metadata": {}, + "source": [ + "We can plot our solution to observe a standard SIR shape." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "8303885c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyI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s76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure()\n", + "\n", + "plt.plot(t, solution[:,0], label='R')\n", + "\n", + "plt.plot(t, solution[:,1], label='S')\n", + "\n", + "plt.plot(t, solution[:,2], label='I')\n", + "\n", + "plt.xlabel('Time')\n", + "\n", + "plt.ylabel('Population proportion')\n", + "\n", + "plt.title('Standard SIR model')\n", + "\n", + "plt.legend(loc=0)\n", + "\n", + "#@savefig sir_plot.png In \n", + "\n", + "plt.show()\n", + "\n", + "#plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "ba849579", + "metadata": {}, + "source": [ + "Alternatively, we can integrate and plot via the **ode** object which we initialized earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "efddd3a5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.initial_values = (initialState, t[0])\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "solution = model.integrate(t[1::])\n", + "\n", + "model.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "4dd6e250", + "metadata": {}, + "source": [ + "We could solve the ODEs above using the Jacobian as well. Unfortunately, it does not help because the number of times the Jacobian was evaluated was zero, as expected given that our set of equations are not stiff." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "7a7a568f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "#TODO what does this show?\n", + "%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "91b7f9d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "\n", + "%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "3403884c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "\n", + "%timeit solution3, output3 = model.integrate(t, full_output=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b6b9ee47", + "metadata": {}, + "source": [ + "It is important to note that we return our Jacobian as a dense square matrix. Hence, the two argument (mu,ml) for the ODE solver was set to `None` to let it know the output explicitly." + ] + }, + { + "cell_type": "markdown", + "id": "5ca18fa3", + "metadata": {}, + "source": [ + "## Solving the forward sensitivity equation\n", + "\n", + "The sensitivity equations are also solved as an initial value problem. Let us redefine the model in the standard SIR order and we solve it with the sensitivity all set at zero, i.e. we do not wish to infer the initial value of the states." + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "87173626", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['S', 'I', 'R']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=odeList)\n", + "\n", + "initialState = [1, 1.27e-6, 0]\n", + "\n", + "paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "8b63ba62", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAApsAAAHYCAYAAAACtiM7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADR8ElEQVR4nOzdd3yTVdsH8N+d3b33pkBLGS2zFFEQKgVUNrKUIaKi4CgPan19GC5w4QLFhaCi4EDgEUWhbCmrrEIpFGjp3nslTXLeP9IEQtORNmma9Pp+zEd6j5NzJzm5r5zJMcYYCCGEEEIIMQKeqTNACCGEEEIsFwWbhBBCCCHEaCjYJIQQQgghRkPBJiGEEEIIMRoKNgkhhBBCiNFQsEkIIYQQQoyGgk1CCCGEEGI0FGwSQgghhBCjoWCTEEIIIYQYDQWbBpKamoolS5YgLCwMNjY2kEgk8PX1xeDBg7FkyRL89ttvjc4ZOXIkOI7DqlWrtLYfOnQIHMc1etja2qJ379547rnnkJ6e3jEX1oRVq1bpzHtrzJ8/HxzHYfPmzQbNk1QqxauvvooePXpALBaD4zgEBgYa9DkslfqzeOjQIVNnxSTa83luz7l3S09P73KfW2N9HxhSR+VR/d0/cuRIoz6PMZnD+0k6HgWbBrBjxw707dsXGzZsQEFBAe655x5MnToV/fr1Q3Z2NjZs2ICnnnqqTWnPmzcP8+bNw9y5cxEZGYn09HR8+umn6Nu3LxISEgx8Je1nyi/L//73v1izZg0qKysxceJEzJs3D9OmTevwfBDL0Zlu/oGBgeA4zuQ/NAkhRF8CU2fA3OXn52PevHmQSqVYtmwZ3nzzTUgkEq1jEhMT8euvv7Yp/bt/HWZmZmL06NFITU3FE088gcuXL7c16+2yZMkSzJw5E66uriZ5fl1+/vlnAMDRo0fRo0cPE+eGmJP2fJ4NWRZ8fHxw5coVCIXCdqdFzM+QIUNw5coVWFtbmzorhBgUBZvt9Mcff6Cqqgre3t54//33dR4zcOBADBw40CDP5+fnh1WrVmHOnDlITk7GzZs30a1bN4OkrQ9XV9dOFWgCQEZGBgBQoEn01p7PsyHLglAoRGhoqEHSIubH2tqa3n9ikagZvZ3y8/MBAG5ubh32nP369Wv0/M1JSkrCtGnTIBKJwHEc3Nzc8MADD+DTTz8FABQUFIDH44HjOLz00kuNzh81ahQ4jsOBAwc023T1Uxs5ciTuv/9+AMDhw4e1+ps21QctLS0Njz32GDw9PSEWixEcHIzXXnsNUqm0NS8FgNvNi4wxANB63rtrhrdt24bRo0fD2dkZYrEYAQEBePzxx3Ht2rVm005PT8euXbswatQoODs7a/o3xsbGguM4rFu3rtG5YWFh4DgOQ4YMabTv9ddfB8dxWLFihWZbfX09fvjhB8yZMwehoaGwt7eHlZUVQkJC8NxzzyEnJ0dnHu/sb3n06FE8/PDDcHNzA4/H07r+zMxMPP744/Dy8oJEIkGPHj3wf//3f6itrW3pJdZJKpXivffew8CBA2FnZweRSARPT08MHjwYL730EkpKShqdU1tbiw8++ABDhw6Fo6MjJBIJQkJC8NJLL6G4uLjR8Zs3bwbHcZg/fz6qq6sRFxeH7t27QywWw9PTE/PmzUN2drbO/O3fvx8PP/wwPDw8IBQK4eTkhB49euDRRx/FkSNHtI7V9/Ps6uoKjuNw5swZnefGxcWB4zg8/fTTTb5+ly5dAsdx8PDwQH19PQDdfTbVr8GtW7cAAEFBQVp5OXToEL799ltwHIeYmJgmny8nJwdCoRBWVlY6X2tdUlNT8fjjjyMoKAhisRi2trYICAjAgw8+iG+//VbnOX///TceeughuLu7QyQSwdvbGzNmzMCZM2da9ZwAMGvWLHAch7Vr1zZ5zB9//AGO49C/f/9G+65du4annnoKwcHBkEgkcHBwwH333YcffvihyfRKSkrwwgsvICAgAGKxGP7+/liyZInOz7Gx8t9ct439+/dj6dKliIiIgKurK8RiMXx9fTFjxgycPn1a7zyqteX9as9rFR8fj4EDBzYak+Dm5ob58+c3WZ6JmWOkXb7//nsGgPH5fLZ//369zh0xYgQDwFauXKm1/eDBgwwAa+rt+ffffzX7b9y40exz/Pvvv0wkErHu3buz4cOHMwBs9OjRbMyYMSw4OJgxxtjWrVs16fXv31/r/JqaGiYWi5mVlRWrq6vTbF+5cmWjvK9Zs4bFxMQwAMzDw4PNmzdP81i2bJnmuHnz5jEA7Pnnn2f29vYsICCAPfLIIyw6OppZWVkxAGzSpEmteQkZY4wtW7ZMkyYArec9evQoY4wxpVLJ5s6dywAwgUDARo0axWbOnMl69uzJADBra2v2119/NUo7ICCAAWBLlixhANigQYPYrFmz2IgRI9iRI0fYnj17GAA2btw4rfOys7M1+eHxeKy0tFRr/7333ssAsMOHD2u2ZWZmMgDMwcGBDR06lE2fPp2NHz+eeXt7MwDMzc2NpaamNsqj+nP0zDPPMB6Px8LCwtjMmTPZmDFj2I8//sgYY+zKlSvM3d2dAWBeXl6atK2srFhUVBSLiopiANjBgwdb9ZorFAo2evRoBoDZ29uzcePGsVmzZrHo6GjNa3bu3LlGr0nfvn0ZAObs7Myio6PZ5MmTNccHBgay9PR0rXO+/fZbzeehX79+zNHRkT388MNs4sSJmusJCAhgZWVlWudt3ryZcRzHOI5jkZGRbMaMGWzChAlswIABjM/ns+eff17reH0/z+rtp0+f1nnu1atXGQDm6OjIamtrdb6GsbGxDACLjY3VbEtLS9Nck9rRo0fZvHnzmI2NDQPApk6dqpWXK1eusLq6Oubm5sY4jmNXr17V+XwrVqxgANiCBQt07r9bUlISs7e3ZwBYSEgImzJlCps+fTqLiopitra2LDw8vNE5r732GgPAOI5j99xzD5s1axaLiIjQfEd+8803jc5Rl91vv/1Ws+3vv/9mAFhoaGiT+ZsyZQoDwD755BOt7T///DOTSCSa8ydPnsxGjRqlef10XX9eXh7r0aMHA8CcnJzYlClT2KRJk5ijoyMLDg5mEyZMaJTH5rQ1/+rv/hEjRjQ6Pjg4mIlEIta/f382YcIENmXKFBYWFqb5Tvv1119blbc7teX9as9rtWzZMs3zAWC9e/dmwcHBmrLKcRwLDg5usswQ80XBZjtVVlYyHx8fTQEaOXIke+ONN9iePXtYQUFBs+e2Ndh89dVXGQDWt29fplQqm32O8ePHMzc3N1ZaWqr5AnzggQcYY4zl5+czxhhbsGABA8D69evHOI5jhYWFmvPvPkdN1w32zrzr+rJUuzMw/L//+z8ml8s1+5KSkjQ3hePHjzd7bXdr7jX7/PPPGQDm6uqqFQQplUrNtTg6OjZ6z9SBEJ/PZ7t27WqUblVVFRMKhczGxoZJpVLN9i1btmheUwDst99+03mOTCbTbK+oqGC7du3SSocxxmQyGYuLi2MA2Pjx4xvlQf05AsA2bNig8/oHDx7MALBHHnlE64v81q1bLDg4WHN+a4PNw4cPa36cVFRUNNp/+vRpVlRUpPlbqVSye+65hwFgCxcu1Dqnvr5ecxO6//77tdJRB5sAWExMDCsvL9fsKykp0dwY3377ba3zgoKCGADNj4075efns7Nnz2pt0/fzrM5XU8EmY0xzvT/99FOjPNTX12uC5aSkJM12XcGmmvqzmJaW1mgfY4z93//9HwPAnnvuuUb7ZDIZ8/T0ZABYYmKizvPvpv5eePPNNxvtq6mp0fqhxBhjf/31FwPAJBIJ++eff7T2ff311wwAEwqF7NKlS1r7dAWbCoWC+fv7MwAsISGh0fMXFhYyoVDIRCKR1ufs4sWLTCwWM4lEolXmGGMsPT1d82Nny5YtWvumTZvGALB7771X64dLcXExi4yM1HwGWxtstjX/zX1//v7776ykpETndoFAwFxcXFhNTU2r8sdY29+vtr5WX375JQPAunfvzl5//XVN+WFM9X1iZ2fH+Hw+A8C2b9/e6usg5oGCTQNISUnRKmR3PiIiItjnn3+uFVCp6RNsKpVKlpGRwd577z0mEomYk5MTO3XqVIt5CwkJYSNHjmSMNV1L6e/vzwICAtiGDRsYALZt2zbNvuXLlzMA7J133tFK1xDB5sCBA3UGy08//TQDwF5//fUWr+9OzQWb6oDq7loQxlSvrToofOutt7T2qW/wjz/+eJPPq66lPHTokGbbY489xgBoaj6ffvppzb6makNb4u3tzXg8XqPgTv05GjVqlM7zjh07xgAwGxsbrRub2u+//653sPnzzz83Gdjoor6xRUREsPr6+kb7FQoF69OnT6PgSx3U2djYsJycnEbnbdu2Tee1W1tbMwcHh1bljTHjBJvffPMNA8DGjBnT6Pl27tzJAFVN+Z3aE2xmZ2czoVDIHBwcWFVVlda+n376iQFgUVFROs/VZfz48QxAo8C8Keqa7jtrau/00EMPMQBs0aJFWtt1BZuMMfbf//6XAWBPPvlko7Q++ugjBoBNmzZNa/uMGTMYAPb+++/rzMOpU6c03z1qGRkZjMfjMY7j2OXLlxudc+7cOb2DzbbmvzXfn7rMmjVL833TWm15v9r6WikUCk0LzZkzZ7TKj9q7776rOffuH4/E/FGfTQMICQnBiRMncPLkSaxYsQIxMTGaPpznz5/H4sWLMXbsWMhkMr3TVvdn4fF48Pf3x/Lly+Hn54eLFy9i8ODBLZ4fEBCAxMREXLp0CVZWVhg2bBhqa2tx7NgxAKq+TRkZGXjggQcQHR0NQNU3SE39b/U+Q3rooYfAcVyj7b169QIAg/XdycrKwo0bNwCoppK6G8dxWLBgAQDg4MGDOtNobgolXa9bfHw8unfvjvHjx8Pb21uv1/TChQtYt24dli5discffxzz58/H/PnzIZfLoVQqcf36db3yqJ47c+zYsXBxcWm0f+LEiXBwcGjy+nQZMGAA+Hw+Nm3ahA0bNiA3N7fZ4/fs2QMAmDp1KgSCxuMSeTwe7rvvPgDA8ePHG+0fNGgQvLy8Gm1v6rMyZMgQlJeXY+7cuUhMTIRSqWzdhRnQI488AhsbG+zfvx9ZWVla+9T9HR9//HGDPZ+3tzemTZuG8vJyfP/991r7NmzYAEA1cr611H2NFy9ejL///ht1dXVNHiuXy/Hvv/8CUM2zqMvChQsBNF3G7qaer3H79u2N+hXrev2USiX++usvAMCMGTN0pjlo0CDY2tri3Llzmus5cuQIlEolBgwYgLCwsEbnREREaPWTby19898aOTk5+Oqrr7Bs2TI88cQTmu8G9awkV69ebVU6bX2/2vpanTt3Djk5OQgODm5ysOyd/VSdnJxadR3EfFCwaUBDhgzB6tWrsXfvXuTn5yMxMREzZ84EoAowPv74Y73TVM+zOXv2bERGRgIAbty4gdmzZ7cqeP3Pf/6DmpoaREREYNiwYZDL5QBUncLV+QKABx54AD179oSfn59mW3FxMc6fPw8XFxednfDby9/fX+d2e3t7AGj25qYPdSDi4uKiSftuwcHBWsferblJtu8ONpOTk5GTk4MHHngAADB69Ghcv35dM8CjqWCzuroaU6ZMQUREBJYtW4b169fj22+/xZYtW7BlyxYUFBQAACoqKvTKozrQCQoK0rm/LZOIBwcH48MPP0R9fT2WLFkCb29vBAYGYtasWdi6dWujz+bNmzcBqOZC1bVgAcdx+OyzzwAAhYWFjZ5P38/KZ599hm7duuH777/HoEGD4OjoiNGjR+Ott97SzFpgbLa2tpg+fTqUSiW+++47zfaCggLs2bMHEokEs2bNMuhzPvfccwBuB5cAcPHiRRw7dgweHh56zTu7fPlyREdH4+TJkxg7dizs7e0xePBgLFu2rNGAlOLiYs170NTnrKUydrdu3bphxIgRKC8vx++//67Zfu7cOVy4cAHe3t4YM2aMVh7UZcPPz0/nZ4zH46GqqgpKpVIzSKql8tHSPkPlvyWrV69GYGAgnnzySaxbtw7ffPON5rvh4sWLAJr+brhbW9+vtr5W6vJ/48YNrR/3gwcP1rw36h83HMfhoYceatV1EPNBwaaRcByHAQMG4KeffsKECRMAADt37tQ7nc2bN2Pz5s3YunUrTpw4gWPHjsHOzg5Hjx7Fa6+91uL5DzzwABISEjBhwgRcuHABR48eBQB8+OGH2L17N/bv3w8ej4fRo0cDUAVA6enpuH79OuLj48EY04xGNzQez3w+flZWVk3uGzJkCOzt7XH69GmUl5drBfDA7aBy3759KCgowKVLl+Du7o6+fftqpRMXF4fff/8doaGh2LlzJ7KzsyGVSsFU3V0QFRUFAJpR9/rk0RiWLl2KW7du4csvv8TcuXPB5/Oxbds2PProowgLC9Oq7VTXLA4fPlzzA6qpR+/evRs9l76flV69euHq1avYs2cPli1bhj59+mjKTI8ePZodlWxI6pqrLVu2aLb98MMPkMvlmDRpEhwdHQ36fEOHDsWQIUNw6dIlHD58GMDtwPPJJ5+ESCRqdVrW1tbYt28fTp06hddffx2jR4/GtWvXsG7dOgwZMgTPPvusQfOui/r1u3NWBXWtoPozp3Zn7XVLn7F58+ZBLBZ3qvw3Z8eOHVi1ahXEYjG++OILpKamorq6GkqlEowxxMXFAWj6u8HU1O+NegaJe+65R+dxNjY2mDJlCnx9fTsye6QD0DybHWDMmDHYvXs3ioqK2p3WPffcgw8//BBPPPEEPv74Yzz99NMtzrM5ePBg7NixAzKZDOfOncPIkSNRV1eHqVOnwtraGhEREZrm1ejoaHz77bfYv38/zp49q9lmznx8fADcrvnQVbup/uWtPlYfAoEAI0aMwP/+9z8cPHgQ+/fvB5/P10ybc2fNp7W1NRhjGD16dKMAXj0p/fbt23U2RaWmpuqdN+D2NTW38oy61lVfHh4eWLRoERYtWgQASElJweOPP46EhAS88sormiDLz88PgKrJ/j//+U+bnktfAoEA48ePx/jx4wGoan3WrVuH1atX46mnnsLkyZNhY2Nj1Dzce++96N69O65du4Z///0X99xzjybwMGQT+p2ee+45PProo1i/fj3Cw8OxdetWCASCZqdhas7gwYM1XXbkcjl27tyJuXPn4rPPPsO0adNw//33w8XFBWKxGFKpFDdv3tT5+W1LGZs6dSqWLFmC+Ph4ZGZmwsPDAz/++CMAaGrH1FxdXWFlZYXa2lq8//77rZ77tDXlo62rNumT/+aovxveeustPPnkk4326/vd0Nb3q62vlbr8u7i4aCpQ/v33X2zYsAE9e/ZEeXk5Nm3ahCNHjmDp0qV6XQsxD+ZTtdRJteaXpLrZzlC/1h5//HFERERAJpNh9erVrT5PJBIhMjIS48aNA6C6cVRUVGhq4ABogqB9+/a1qb+muuZE3VzfGfj6+mqahHSt18sY02xXB4j6Ur9Gf/31Fw4fPqxpugVUfel69eqF+Ph47Nu3T+v4O6nnqAsICGi07++//27zj5URI0YAAPbu3atzHrzdu3ejrKysTWnfLTQ0FC+//DIAVX9lNfVn7pdffjFZ7Yu9vT1WrVoFR0dH1NTUNDm36p0M8XlWBxWbN29GYmIikpKS4Ofnp2lNaK3W5uWRRx6Bl5cXdu7cibfeegvV1dWYPHkyvL2923YBdxAIBJg2bZpmPk/1eywQCDB8+HAAussYAGzatAmAfmXM2toaM2bM0HRF+N///ofi4mLcc8896Nmzp9axfD5f812mDs5a47777gPHcTh79ixSUlIa7b9w4YKmmVpf+uS/Oc19NxQUFGi+V1qrre9XW1+rwYMHw9XVFcnJyVqr3g0ZMgTR0dGYOnUqdu/ejT59+mD27NmoqqrS63pI50fBZjt99tlnmDdvns5BDYwx7NixA+vXrwcATf/N9uI4Dm+//TYAYOvWra26ad7p7kDnzmDTw8MDffr0wZ9//om0tDQEBQXptUKROqBOTU3VTFTdGahr09544w1cuHBBs50xhjfffBPnz5+Ho6OjpoZOX+rX9LvvvmsUwKv3FxUVYdu2bVrH30k92EU92b7a1atX21wrBahq1wYMGICqqio8++yzWhPmZ2Zmtqmm8cCBA/jzzz8bvceMMfzxxx8AtG+MEydOxODBg3Hq1CksWLBAZ7/M0tJSbNy4sd0/VGpqarBu3Tqdz3H06FGUlZWBz+e36sefIT7P8+bNA4/Hw88//6xp0lZv04c6Ly0tUSsUCrF48WLI5XLNqmb6DAxS++yzz3QOOMnLy9NM+H3ne7xs2TIAwOeff474+HitczZv3ozdu3dDKBTi+eef1ysfdzZFqwOgpmoFV65cCZFIhOXLl2PLli06B4ZdunQJO3bs0Pzt7++PyZMnQ6lUYvHixVr9HktLS/HMM8+06weSPvlvivq74csvv9TqD11eXo558+ahvLxc73y15f1q62slFAqxcuVKMMYwefLkJu9Z06dPR05OjuaeSSxIxw+AtywffvihZroGNzc3NmbMGDZ79mw2fvx4FhgYqNn36KOPMoVCoXVuW+fZVLvvvvsYADZ79uwmjzlw4ECj6YXUE06jYR61O6dBYoyxF198UbP/7mlK1Jqa7oUxxgYNGsQA1UTQc+bMYQsXLmQvv/yyZn9TU52oqafFmDdvXpPXpUtzr5lSqdRMRyQQCNjo0aPZrFmzWEhICAPArKys2J9//tnovJamm7mTemoPAI3mINy1a5dmX48ePXSe/9tvv2kmO+7bty+bOXMmGzVqFBMKhWzUqFFs2LBhOqcnUn+Ompu26PLly8zNzY0BYN7e3uyRRx5hDz30ELO2tmZDhw7Ve1J39efe3t6ejRw5ks2ePVtrgnYHBwedk7qr58W0sbFhw4YNYzNnzmRTpkxhERERmjn27pwHtKXPgq6pgkpLSxmgmkw/PDycTZs2jc2aNYtFRUVpXt8VK1ZopaPv51k9LVBzUx/daezYsZr3n+O4JhdjaG7qo/Xr1zMAzNbWlk2ZMoUtXLiQLVy4kKWkpDQ6Nj8/n4nFYgao5npti/DwcAaABQUFsYcffpjNmTOHjRkzRrPwwqhRoxpNY3XnJOHDhw9ns2fPZgMGDGCAfpO6361Xr16a18/GxoZVVlY2eezPP//MrK2tGQDm6+vLxowZw+bMmcPGjRvHfH19GQA2Y8YMrXNyc3M106M5OzuzKVOmsMmTJ7d5Uve25r+pqY9u3rzJHB0dGQDm4+PDpk6dyiZMmMAcHByYl5cXe/zxx1v8DOrSlverPa+Veio99WPEiBFs5syZbOTIkZrrCwwMZB4eHjSxu4WhYLOdKioq2M6dO9nSpUvZkCFDmK+vLxMKhczKyooFBwezWbNm6VyZhrH2B5vHjx/X3FSTk5N1HtO7d28WFBTEYmNj2ZdffsnWr1/PZs+erUn/7km0Gbs9DyTQ9OS6zd1gb926xWbPns28vLyYQCBodPM0RbCp9uOPP2q+2IRCIfPz82Pz58/XecNmTL9gUx3M3j1ZO2OMlZeXa16LxYsXN5nGkSNH2OjRo5mrqyuztrZmffr0YW+99RaTSqVNBpWtCTYZU70v8+fPZx4eHkwkErFu3bqxl19+mVVXV7c6DbXr16+zVatWsdGjRzN/f38mkUiYk5MT69evH3vllVdYZmamzvPq6urYxo0b2f33389cXFyYQCBg7u7uLCIigj377LPs77//1jq+LcFmfX0927hxI5s1axYLDQ1lDg4OmvI4depUFh8f3ygdfT/PLi4uegWb6nlJdQUSLV2PmkKhYGvWrGG9e/fWrJDT3Humnvv3iy++aPL5mvPHH3+wxYsXs/79+zM3NzcmEomYr68vGzlyJNuyZUujz7jaX3/9xcaPH695fz09Pdn06dPZyZMndR7fmmDzzjkYW/O9kJaWxl588UXWp08fZmNjwyQSCQsICGAjR45ka9euZdevX290TlFREVu6dCnz9fXVXOvTTz/NCgsLW5XH5rQ2/83Ns5mWlsbmzJnD/P39mVgsZgEBAezpp59meXl5rfoMNkXf94ux9r1W//77Lxs6dCgDwEQiEbOzs2M9e/ZkkyZNYl9//bWmzH/++ed6XwvpvDjGOunwNWIQe/fuxS+//ILjx48jKysLMpkM/v7+GDduHF577TW4u7ubOouEmJ3NmzdjwYIFOH36NAYNGmTq7DRy7do1hIaGwsHBAdnZ2bC2tjZ1lgjRaK78KJVKTX/Wq1evtnrEPuncKNgkhBALM3PmTGzfvh1xcXGa/t2EEGIqFGwSQogF2L17N3bt2oXLly/j5MmT8PT0xJUrVww+lychhOiLRqMTQogFOHv2LDZt2oTk5GRER0fjn3/+oUCTENIpUM0mIYQQQggxGqrZJIQQQgghRkPBJiGEEEIIMRqLWBtdqVQiJycHdnZ2jdabJkRfjDFUVlbC29tb71VeLAGVJ2IoVJaoLBHDMPeyZBHBZk5ODvz8/EydDWJhMjMzDbaevTmh8kQMjcoSIYZhrmVJ72DzyJEjeO+995CYmIjc3Fz8/vvvmDRpUrPnHDp0CLGxsbh8+TL8/Pzw2muvYf78+VrHbNiwAe+99x7y8vIQHh6OTz/9FEOGDGlVnuzs7ACo3gR7e3t9L4kQLRUVFfDz89N8rroaKk/EUKgsUVkihmHuZUnvYLO6uhrh4eF4/PHHMWXKlBaPT0tLw4MPPoinn34aW7duRXx8PJ544gl4eXkhJiYGALB9+3bExsZi48aNiIyMxEcffYSYmBhcvXq1VSvcqJsn7O3tqUATg+mqzV5UnoihUVmiskQMw1zLkt7B5rhx4zBu3LhWH79x40YEBQXhgw8+AAD06tULx44dw4cffqgJNtetW4dFixZhwYIFmnP27NmDTZs24ZVXXtE3i1q+PnoTlXVynfuae884aO/kOGi2cJzqDec4gMdx4DX8X8DjwOfzIORxEPJ5EAl4EAt4sBLxYS0SwF4igIOVEI7WIogE5tfnghAClNfUY9eFbIzo6YYAFxtTZ4cQYmB19QpU1NajUipHjVSB2noF6uoVkMmVkCmUkMmVqFcooVAyyJUMSsagUKoejAFKxqBkAIPqb8ZU/wcABuDOCScZVH/cuW1sH0/08rKsHydG77OZkJCA6OhorW0xMTF44YUXAAAymQyJiYmIi4vT7OfxeIiOjkZCQoLONKVSKaRSqebvioqKJp9/07E05JTXteMKjMPZRgRvRwkCXGzQ090O/XwdMMDfCQ7WQlNnjRDShKzSGszbdAo3CqshEvAQNy4UC+4JMnW2CCF6KKyUIiWvAtcLqnCruAbZZbXIK69DUZUUJdUySOVKk+YvyNWGgk195eXlwcPDQ2ubh4cHKioqUFtbi9LSUigUCp3HpKSk6ExzzZo1WL16dauef/IAH5TX1rfqWF3T27O79ql/oSiZ6veIsuFvhZJBwRgUCga5UgmZgkEmV0AqV6JWpkC1TI7KOjkqauuhZEBJtQwl1TJcyq7AHuQCAHgc0N/fCQ/188LECB8424halW9CiPExxvD0D4m4UVgNsYAHqVyJ1/9Ixr09XNHd3Tz7URHSFRRVSXEgpQDHUotwJr2kVRVQPA6wEQtgIxLASsSHWMCDWMiHmM+DUKBqvRTwOFWrJl/1fz5P1SbK43HgoGr1VLeAqlpSVe2jd7aUqv9W7VX9I8jV8lpMzHI0elxcHGJjYzV/qzvO6rI8JrSjstUqSiVDWW098ivqkFVai7SiKqTkVuJcZhnSiqqReKsUibdK8c7eFMwc7I+lo7rDxVZs6mwT0uWdTi/FpewKWAn5iF82Ait3X8a+5Hx8HH8dn87qb+rsEULuIFco8U9yPn46lYF/rxdBeUdlEscBQS426O5uiyA3G/g6WcPLXgI3OzGcbURwtBbCViww2/6RnZHRg01PT0/k5+drbcvPz4e9vT2srKzA5/PB5/N1HuPp6akzTbFYDLHYPAMwHo+Ds40Izjaihmry2zW6OWW1+PtyHn5NzMLlnApsPp6O385mYeXDvTF1gA998AkxoS0J6QCASf294e1ohReje2Jfcj7+uJiD50f3QHd3W9NmkBACpZLh93PZ+Dg+FRklNZrtfXzsMSrEHUO7uSDczxE2YrOsazNbRh+lEhUVhfj4eK1t+/btQ1RUFABAJBJh4MCBWscolUrEx8drjukqvB2tsOCeIPyxdDi2PhGJ3t72qKyT4z+/XMCyXy5AZuJ+JIR0VQWVdfj7Uh4A4LGhgQCAMG97jA51B2PA7gs5JswdIQQAruVXYvJn/2LZLxeQUVIDJ2shnr0/GIeXj8QfS+9F7JgQDOvuSoGmCegdbFZVVeH8+fM4f/48ANXURufPn0dGRgYAVRP33LlzNcc//fTTuHnzJl566SWkpKTgs88+w88//4wXX3xRc0xsbCy++uorbNmyBVeuXMHixYtRXV2tGZ3e1XAch3u6u2L3kuFYHhMCPo/DjrPZWLjlNOrqFabOHiFdzuGrhZArGfr6OCDM+3bH/Qf7eQGAJhAlhHQ8xhi2nryFhz45hgtZ5bATC/Dy2FD8+8ooLI8JpVkjOgG9w/szZ87g/vvv1/yt7js5b948bN68Gbm5uZrAEwCCgoKwZ88evPjii/j444/h6+uLr7/+WjPtEQDMmDEDhYWFWLFiBfLy8hAREYG9e/c2GjTU1fB5HJ69vzt6e9vjma1ncTS1CM/9dA6fzRkAAZ+mTiKkoxy7XgQAuK+nq9b20aEeEPA4XM2vxM3CKnRzo6Z0QjqSUsmwcvdlfH/iFgBgVKg71kzpCw97iYlzRu7EMaZrDLZ5qaiogIODA8rLyy124tyTN4vx2KZTkMmVWHRvEP7vwTBTZ8lidYXPU3O6+vXfTalkGPL2fhRVybDtyaEY2s1Fa/9j35zE0dQivDQ2BM+M7G6iXHZOXf2z1NWv39gUSoZlP5/HzvM54DhgeUwIFo8ItsjxDeb+WaLqMTMR2c0FHz4SAQD46mgaDqYUmDZDhHQRKXmVKKqSwVrExwB/p0b7x4SpWmAOXy3s6KwR0mUxxrBy9yXsPJ8DAY/DxzP745mR3S0y0LQEFGyakQf7eWFeVAAAYPmvF1s9fyghpO2OXVcFkUO7uehc+WtYd1XT+rnMMupTbUIbNmxAYGAgJBIJIiMjcerUqSaP3bx5c8MqcLcfEol2sytjDCtWrICXlxesrKwQHR2N1NRUY18GaaVvjqXhhxMZ4Djg45n9MSHc29RZIs2gYNPMxI3vhWA3GxRVSfHBP1dNnR1CLN7ZW2UAgKHdnHXu7+ZqA3c7MWRyJc5llHVcxojG9u3bERsbi5UrV+Ls2bMIDw9HTEwMCgqabgGyt7dHbm6u5nHr1i2t/e+++y4++eQTbNy4ESdPnoSNjQ1iYmJQV9f5VqTrak7eLMaav1SLvqx4KEwzUI90XhRsmhmJkI83JvYBAHx/4hau5Da9VCchpP3OZ5YBACL8GjehA6rZI9T9OE/cLO6obJE7rFu3DosWLcKCBQsQFhaGjRs3wtraGps2bWryHI7j4OnpqXncOSCVMYaPPvoIr732GiZOnIh+/frhu+++Q05ODnbu3NkBV0SaUlFXjxe2n4dCyTC5vw/mDws0dZZIK1CwaYaGdXfFg329wBiwbt81U2eHEIuVV16HvIo68DjVpNBNUQebCRRsdjiZTIbExERER0drtvF4PERHRyMhIaHJ86qqqhAQEAA/Pz9MnDgRly9f1uxLS0tDXl6eVpoODg6IjIxsNk2pVIqKigqtBzGst/64gtzyOgS4WOOtyX2oj6aZoGDTTL34QE/wOGBfcj4uZpWZOjuEWKQLDWWrp4cdrEVNzxQXFawKNs9nUL/NjlZUVASFQtFoqjwPDw/k5eme/zQkJASbNm3Crl278MMPP0CpVGLYsGHIysoCAM15+qQJAGvWrIGDg4Pm0dQyyqRtTqWVYPuZTHAc8N608GbLJOlcKNg0U93dbTGpvw8AYP2B6ybODdFFnwELAPDLL78gNDQUEokEffv2xZ9//qm1f/78+Y0GNYwdO1brmJKSEsyZMwf29vZwdHTEwoULUVVVZfBr6youaJrQHZs9LtDFGi42IsgUSlzOodqszi4qKgpz585FREQERowYgR07dsDNzQ1ffPFFu9KNi4tDeXm55pGZmWmgHBOFkmHVblXt88zB/hgSpLsPNemcKNg0Y4tHBAMA9l3JR0ZxTQtHk46k74CF48ePY9asWVi4cCHOnTuHSZMmYdKkSbh06ZLWcWPHjtUa1PDTTz9p7Z8zZw4uX76Mffv24Y8//sCRI0fw5JNPGu06LZ26ZjO8hWCT4zj0b5gW6VxGqZFzRe7k6uoKPp+P/Px8re35+fnw9PRsVRpCoRD9+/fH9euqH+7q8/RNUywWw97eXutBDOO3xCwk51bATiLAf8b0NHV2iJ4o2DRjPTzscF9PNzAGbElIN3V2yB30HbDw8ccfY+zYsVi+fDl69eqFN954AwMGDMD69eu1jhOLxVqDGpycbg9auXLlCvbu3Yuvv/4akZGRGD58OD799FNs27YNOTm0dre+GGO4mFUOAOjn69Di8f39HQGARqR3MJFIhIEDByI+Pl6zTalUIj4+HlFRUa1KQ6FQICkpCV5eqlHNQUFB8PT01EqzoqICJ0+ebHWaxHBkciU+jldNO/XcqB5wsRWbOEdEXxRsmrnH7wkEAPx8OhO1Muor1hm0ZcBCQkKC1vEAEBMT0+j4Q4cOwd3dHSEhIVi8eDGKi4u10nB0dMSgQYM026Kjo8Hj8XDy5Mkm80uDGnTLKq1FZZ0cQj6HHu52LR4/gGo2TSY2NhZfffUVtmzZgitXrmDx4sWorq7GggULAABz585FXFyc5vjXX38d//zzD27evImzZ8/i0Ucfxa1bt/DEE08AUNVUv/DCC3jzzTexe/duJCUlYe7cufD29sakSZNMcYld2i+Jmcguq4WbnRiPNcw1TcwL9a41c/f1cIOfsxUyS2rx9+U8TT9OYjrNDVhISUnReU5eXl6LgxHGjh2LKVOmICgoCDdu3MCrr76KcePGISEhAXw+H3l5eXB3d9dKQyAQwNnZucVBDatXr9b3Mi2eelqx7u52Oidzv1s/XwfwOCCnvA555XXwdKC1mTvKjBkzUFhYiBUrViAvLw8RERHYu3evpkxlZGSAx7v9HpaWlmLRokXIy8uDk5MTBg4ciOPHjyMs7PYywC+99BKqq6vx5JNPoqysDMOHD8fevXsbTf5OjEuuUOLzQzcAAM+MDIZEyDdxjkhbULBp5ng8DtMG+OHD/dfw85lMCjYt2MyZMzX/7tu3L/r164fg4GAcOnQIo0ePbnO6cXFxiI2N1fxdUVFBo2gBJDcEm2Feret3ZyMWINTTHsm5FTibUYrxfWmi6Y60ZMkSLFmyROe+Q4cOaf394Ycf4sMPP2w2PY7j8Prrr+P11183VBZJG+y9nIes0lo424gwa4i/qbND2oia0S3A1IE+4Djg+I1iZJbQQCFTa8uABU9PT70HI3Tr1g2urq5agxruHoAkl8tRUlJCgxraQF2z2cur5SZ0tYiGfpsXaDoyQtqNMYavjqYBAB4dGkC1mmaMgk0L4OtkjWEN8/ztvkADQUytLQMWoqKitI4HgH379jU7GCErKwvFxcWaQQ1RUVEoKytDYmKi5pgDBw5AqVQiMjKyPZfUJWlqNr1bH3yHNwwkUk+ZRAhpu/OZZbiQWQaRgIfHhlJfTXNGwaaFmBDuDQD4HwWbnYK+Axaef/557N27Fx988AFSUlKwatUqnDlzRtMsWFVVheXLl+PEiRNIT09HfHw8Jk6ciO7duyMmJgYA0KtXL4wdOxaLFi3CqVOn8O+//2LJkiWYOXMmvL29O/5FMGMVdfXILKkF0PpmdOD2FEmXsiugUDJjZI2QLuOnUxkAgIf6esHNjkagmzMKNi1ETG9PCHgcUvIqcb2g0tTZ6fJmzJiB999/HytWrEBERATOnz/faMBCbm6u5vhhw4bhxx9/xJdffonw8HD8+uuv2LlzJ/r06QMA4PP5uHjxIiZMmICePXti4cKFGDhwII4ePQqx+PaX8NatWxEaGorRo0dj/PjxGD58OL788suOvXgLcDVPVYa8HCRwtBa1+rzubrawEvJRJZXjZiFNpk9IW1XU1eN/F1TfkbMjqa+muaMBQhbC0VqE+3q64UBKAf53IRcvPtD6fmbEOPQZsAAA06dPx/Tp03Ueb2Vlhb///rvF53R2dsaPP/6oVz5JYykNTeihnvqVIwGfhz4+9jidXooLWeXo4UHlkJC22HU+B7X1CvT0sMXAAKeWTyCdGtVsWpAHG0a//n256WluCCEtS2mo2Qzx1H+wVLivIwDqt0lIe/yWqFqn/pFBfuA4zsS5Ie1FwaYFGd3LHfyGpnRavpKQtlM3o+tbswkA/Rr6bV6kEemEtMmNwiqczywDn8dhYgRN52cJKNi0II7WIkQGOQMA/kmm2k1C2oIxhqv56ppN/YNN9Yj0K7mVkMmVBs0bIV3BznPZAIB7e7jSwCALQcGmhXkgTDUA5Z/k/BaOJIToklteh8o6OQQ8DsFutnqf7+9sDUdrIWQKJVLyaOlPQvTBGMPO86pgczItUmIxKNi0MOpg80x6CUqrZSbODSHmR92E3s3NplXLVN6N4zj09WmYbzOr3KB5I8TSJWWXI7OkFlZCvuZ+RswfBZsWxtfJGqGedlAy4EhqoamzQ4jZac/gIDX1IKGLNEiIEL3sSVJNdzSqlzusRTRhjqWgYNMC3R/qDgA4kFLQwpGEkLtdzWvbtEd3CtcMEqKaTUJaizGGPRdVwaZ6dhViGSjYtECjGoLNQ1cLIVfQAAVC9JHSjpHoaupBQqkFlaiWyg2SL0Is3aXsCmSVqprQ7w9xN3V2iAG1KdjcsGEDAgMDIZFIEBkZiVOnTjV57MiRI8FxXKPHgw8+qDlm/vz5jfaPHTu2LVkjAPr7OcLBSojy2nqco2Y8QlqtXqHEjYaVf9oyEl3N3V4CLwcJlEzVB40Q0jL1HNH3h7rBSsQ3cW6IIekdbG7fvh2xsbFYuXIlzp49i/DwcMTExKCgQHeT7Y4dO5Cbm6t5XLp0CXw+v9FKKWPHjtU67qeffmrbFREI+Dzc19MNAHDoKjWlE9JaNwurUa9gsBML4ONo1a60Ihqa0s/TDz5CWkUdbMb09jRxToih6R1srlu3DosWLcKCBQsQFhaGjRs3wtraGps2bdJ5vLOzMzw9PTWPffv2wdraulGwKRaLtY5zcqLlqdpjZEOwefgaDRIipLXUUxWFeNq1e9USTbCZUdbOXBFi+W4WViG1oAoCHoeR1IRucfQKNmUyGRITExEdHX07AR4P0dHRSEhIaFUa33zzDWbOnAkbGxut7YcOHYK7uztCQkKwePFiFBcXN5mGVCpFRUWF1oNoU9dsXsquQGGl1MS5IcQ83B6J3v41zalmk5DWU88NHRXsAgcroYlzQwxNr2CzqKgICoUCHh7ac195eHggL6/lFWtOnTqFS5cu4YknntDaPnbsWHz33XeIj4/HO++8g8OHD2PcuHFQKBQ601mzZg0cHBw0Dz8/P30uo0twsxOjj49q6pYjVLtJSKuk5LZ/JLpaHx8H8Dggr6IOeeV17U6PEEu2vyHYHENza1qkDh2N/s0336Bv374YMmSI1vaZM2diwoQJ6Nu3LyZNmoQ//vgDp0+fxqFDh3SmExcXh/Lycs0jMzOzA3Jvfkb2bBiVTsEmIa2iWRPdq+1zbKrZiAXo6aEKWs9nlrY7PUIsVUm1DGczVGVkdC8KNi2RXsGmq6sr+Hw+8vO1l0LMz8+Hp2fzHXqrq6uxbds2LFy4sMXn6datG1xdXXH9+nWd+8ViMezt7bUepLERIaqm9GOphVAomYlzQ0jnVlYjQ05DDaQ6SGyvAQGqvudnqd8mIU06mFIAJQPCvOzh3c6BeaRz0ivYFIlEGDhwIOLj4zXblEol4uPjERUV1ey5v/zyC6RSKR599NEWnycrKwvFxcXw8qJJXdujv58j7CQClNbU42JWmamzQ0inltzQhO7nbGWwPmMD/VXBZuItqtkkpCnxKaoKrOheNDDIUundjB4bG4uvvvoKW7ZswZUrV7B48WJUV1djwYIFAIC5c+ciLi6u0XnffPMNJk2aBBcXF63tVVVVWL58OU6cOIH09HTEx8dj4sSJ6N69O2JiYtp4WQRQTYF0bw9XADQqnZCWJOeogs0wAzShqw1sqNlMyiqHVK67DzohXZlMrsSRa0UAgFHUhG6x9F54dMaMGSgsLMSKFSuQl5eHiIgI7N27VzNoKCMjAzyedgx79epVHDt2DP/880+j9Ph8Pi5evIgtW7agrKwM3t7eGDNmDN544w2IxeI2XhZRG9HTDX8m5eHwtUK8EN3T1NkhpNNS12yGeTkYLM0AF2u42opQVCXDpewKTfBJCFE5nV6CKqkcrrZi9PMxXNkjnUubVrlfsmQJlixZonOfrkE9ISEhYEx3n0ErKyv8/fffbckGaQX1FEjnM8tQWi2Dk43IxDkipHPS1Gx6G65mk+M4DPB3wj/J+Ui8VULBJiF3ib+iWnjk/hA38Hjtm9uWdF60NrqF83KwQoiHHRgDjqRSUzohukjlClwvUC1T2cvLMIOD1NQB5pl06rdJyN0ONqxyNyqU+mtaMgo2u4CRoQ2rCV2lYJMQXa4XVEGuZLCXtH+ZyrsNCnQGAJy5VQolzQphNBs2bEBgYCAkEgkiIyNx6tSpJo/96quvcO+998LJyQlOTk6Ijo5udPz8+fPBcZzWY+zYsca+jC4lragaaUXVEPI5DG8YX0AsEwWbXYB6vs3D1wrpZkeIDpeyywGomtDbu0zl3fr5OsBKyEdJtQypDbWnxLC2b9+O2NhYrFy5EmfPnkV4eDhiYmJQUFCg8/hDhw5h1qxZOHjwIBISEuDn54cxY8YgOztb67ixY8ciNzdX8/jpp5864nK6jPgrqlHogwOdYSehVYMsGQWbXcCgQCfYigUorpbhYsNNlRBy24UsVbkI93U0eNpCPg+DAlVN6SduNr0ML2m7devWYdGiRViwYAHCwsKwceNGWFtbY9OmTTqP37p1K5555hlEREQgNDQUX3/9tWYavzuJxWJ4enpqHk5O1OfWkKgJveugYLMLEN4xBdKBFN2/9Inh6dOsB6jmog0NDYVEIkHfvn3x559/avbV19fj5ZdfRt++fWFjYwNvb2/MnTsXOTk5WmkEBgY2avpbu3atUa7PkiQ1BJv9jBBsAsDQbqop3yjYNDyZTIbExERER0drtvF4PERHRyMhIaFVadTU1KC+vh7Ozs5a2w8dOgR3d3eEhIRg8eLFKC5u/v2TSqWoqKjQehDdKuvqcfJmCQBaNagroGCzi1D/clQ3WxDj0rdZ7/jx45g1axYWLlyIc+fOYdKkSZg0aRIuXboEQHUzPHv2LP773//i7Nmz2LFjB65evYoJEyY0Suv111/XavpbunSpUa/V3EnlCqTkqYKCfr7GmXolMkgVxJxMK2lyZg7SNkVFRVAoFJrp99Q8PDyQl5fXqjRefvlleHt7awWsY8eOxXfffYf4+Hi88847OHz4MMaNGweFoun5UtesWQMHBwfNw8/Pr20X1QUcSy2CXMnQzdUGQa42ps4OMbI2TX1EzM/9oe7gOOByTgVyy2vh5UBLghnTnc16ALBx40bs2bMHmzZtwiuvvNLo+I8//hhjx47F8uXLAQBvvPEG9u3bh/Xr12Pjxo1wcHDAvn37tM5Zv349hgwZgoyMDPj7+2u229nZtbh87J2kUimkUqnm765WG3MltxL1CgYnayF8nYxTLvr5Omr6babkVaKXASeOJ+2zdu1abNu2DYcOHYJEItFsnzlzpubfffv2Rb9+/RAcHIxDhw5h9OjROtOKi4tDbGys5u+KigoKOJsQ39DKdj81oXcJVLPZRbjaihHh5wjg9rxmxDja0qyXkJCgdTwAxMTENNsMWF5eDo7j4OjoqLV97dq1cHFxQf/+/fHee+9BLpc3m9+uXhuT1LCUaz9fR4MPDlITCXiI7Kaq3TxKU5AZlKurK/h8PvLztVtt8vPzW/zR9f7772Pt2rX4559/0K9fv2aP7datG1xdXXH9+vUmjxGLxbC3t9d6kMYUSqbp0jWalqjsEijY7EKiG/rF7KemdKNqS7NeXl6eXsfX1dXh5ZdfxqxZs7RuaM899xy2bduGgwcP4qmnnsLbb7+Nl156qdn8xsXFoby8XPPIzMxszWVajPOZ6v6axl295L4eqinI1EvzEcMQiUQYOHCg1uAe9WCfqKioJs9799138cYbb2Dv3r0YNGhQi8+TlZWF4uJieHl5GSTfXdn5zFKUVMtgLxFgcKBzyycQs0fN6F3ImDAPvPf3VRy/XoyKunrY01QTZqm+vh6PPPIIGGP4/PPPtfbd2YTXr18/iEQiPPXUU1izZk2Ty7+KxeIuvTRs4i3VIIUBRl7dR72a16n0EtTKFLAS8Y36fF1JbGws5s2bh0GDBmHIkCH46KOPUF1drenGMnfuXPj4+GDNmjUAgHfeeQcrVqzAjz/+iMDAQM2POltbW9ja2qKqqgqrV6/G1KlT4enpiRs3buCll15C9+7dERMTY7LrtBT7klW1miND3CHkU51XV0DvchfS3d0W3dxsIFMocZBGpRtNW5r1PD09W3W8OtC8desW9u3b12IzXWRkJORyOdLT0/W/kC6gsFKK9OIacBwwwN+4wWawmw28HSSQyZU4mUaj0g1pxowZeP/997FixQpERETg/Pnz2Lt3r6a1ICMjA7m5uZrjP//8c8hkMkybNg1eXl6ax/vvvw8A4PP5uHjxIiZMmICePXti4cKFGDhwII4ePdqlf5gZirp1LTqMRqF3FRRsdiEcx2FcH1XwsvdS60ZpEv21pVkvKiqq0Rx/+/bt0zpeHWimpqZi//79cHFxaTEv58+fB4/Hg7s79YvSRV2rGeJhBwcr49b0cxyHESGq2k2agszwlixZglu3bkEqleLkyZOIjIzU7Dt06BA2b96s+Ts9PR2MsUaPVatWAQCsrKzw999/o6CgADKZDOnp6fjyyy8bdXUh+rtRWIXrBVUQ8DiMaKjtJ5aPgs0uZmxvVX+jQ1cLUStregoP0j6xsbH46quvsGXLFly5cgWLFy9u1KwXFxenOf7555/H3r178cEHHyAlJQWrVq3CmTNnsGTJEgCqQHPatGk4c+YMtm7dCoVCgby8POTl5UEmkwFQDTL66KOPcOHCBdy8eRNbt27Fiy++iEcffZQmo27C6Yb1ytWTrhvb6NCGftPJ+TQFEumS/r6squgY1t3V6D/wSOdBfTa7mD4+9vBztkJmSS32X8nHw+Heps6SRZoxYwYKCwuxYsUK5OXlISIiolGzHo93+7fesGHD8OOPP+K1117Dq6++ih49emDnzp3o06cPACA7Oxu7d+8GAERERGg918GDBzFy5EiIxWJs27YNq1atglQqRVBQEF588UWtfpxE25l0Vc1mRw1SGN7DFVZCPnLK63A5pwJ9fIw7KImQzubvhla1sb1bPz0bMX8UbHYxHMdhQrg3Nhy8gV3ncyjYNKIlS5ZoaibvdujQoUbbpk+fjunTp+s8PjAwsMWasAEDBuDEiRN657Orqqyrx6Uc1ZyiA408OEhNIuTjvp6u+PtyPv65nEfBJulSsstqcSGrHBwHPED9NbsUakbvgiZG+AAADl8rQFmNzMS5IcQ0TtwsgULJEOhiDV8n6w573jFhDf2mL1O/adK1/JWkGqQ1OMAZbnY00KoroWCzC+rpYYdQTzvUKxj2JOW2fAIhFkg9ufq9PTp2kEJ0mAdEfB6u5VfhSm7XWq2JdG3/u6i63zwUTnOVdjUUbHZRUwaoajd/PpNl4pwQYhrHUlWTq9/bw7VDn9fBSoj7Q1UB7s7z2R363ISYyq3ialzILAOPA8b1oWCzq6Fgs4uaMsAXAh6HC5llVLtCupzMkhrcLKoGn8dhaHDLU0gZ2qSGriz/O58DpZJGpRPL90dDreY93V2pCb0LomCzi3K1FWs6aG8/3bWWJyTk0FXVPJf9/RxNspLW/aHusBMLkFNeh+M3aIJ3YtkYY/jtrKoV7eF+NCi1K6JgswubOcQfAPBbYhaqpHIT54aQjvNXw/QrphoRKxHyMbmhK8vWk7dMkgdCOsrZjDLcLKyGlZCP8f2oCb0romCzC7u3uyu6udmgUirHz1S7SbqIkmoZTqap5tc0Zd+xOZEBAIB/kvORX1FnsnwQYmy/nFHdX8b39YKtmGZc7Ioo2OzCeDwOj98TBAD49ngaFNR3jHQB+5PzoVAyhHnZw9+l46Y8uluIpx0GBzpBoWTYeoJqN4llqpLKNf01pw/yNXFuiKlQsNnFTR3gC0drITJLavHHxRxTZ4cQo/tfw+d8bB/Tr2Ayf5jqx96WhFvUlYVYJHU3rW6uNogM6piVukjnQ8FmF2cl4mPRvd0AAB/vT4VcoTRxjggxnsySGhy7rprySD0i3JTG9vFEN1cblNfW40fqu0ksjFLJsPl4OgBg/j2B4DjOtBkiJtOmYHPDhg0IDAyERCJBZGQkTp061eSxmzdvBsdxWg+JRKJ1DGMMK1asgJeXF6ysrBAdHY3U1NS2ZI20wbxhgXCyFuJmUTV2nKN5/4jl+iUxC4wB93R3MWkTuhqfx+HpkcEAgC+P3KTaTWJRDl4tQFpRNezEAkwdQE3oXZneweb27dsRGxuLlStX4uzZswgPD0dMTAwKCgqaPMfe3h65ubmax61b2r/g3333XXzyySfYuHEjTp48CRsbG8TExKCujjrNdwRbsQBPj1Dd8N77+yrd8IhFkiuUmoEKMwb7mzg3t03u74MgVxsUVcnwxeEbps4OIQbBGMMnB64DAGZF+sOGBgZ1aXoHm+vWrcOiRYuwYMEChIWFYePGjbC2tsamTZuaPIfjOHh6emoeHh63pxthjOGjjz7Ca6+9hokTJ6Jfv3747rvvkJOTg507d7bpooj+5t8TiAAXaxRWSvHpAapVJpbnfxdzkFteB2cbEcaYaMojXYR8Hl4eGwoA+OroTWSV1pg4R4S036FrhbiQWQaJkKfpqkW6Lr2CTZlMhsTERERHR99OgMdDdHQ0EhISmjyvqqoKAQEB8PPzw8SJE3H58mXNvrS0NOTl5Wml6eDggMjIyCbTlEqlqKio0HqQ9hEL+Pjvg2EAgK+PpuFCZplpM0SIASmVDJ8dVNUaLhweBImQb+IcaYvp7YHIIGfU1SsRtyMJjNHMEMR8KZQM7+29CgB4bGgArRhE9As2i4qKoFAotGomAcDDwwN5eXk6zwkJCcGmTZuwa9cu/PDDD1AqlRg2bBiyslSrCajP0yfNNWvWwMHBQfPw8/PT5zJIE6LDPPBQPy8olAyxP59HrUxh6iwRYhB7knKRWlAFO4kAj0UFmDo7jXAchzVT+kIs4OFoahG20by3xIxtO52B5NwK2Elud9EiXZvRR6NHRUVh7ty5iIiIwIgRI7Bjxw64ubnhiy++aHOacXFxKC8v1zwyM+mL2VDemNgHbnZi3Cisxis7LlINCzF7NTI51vx5BYCqVtMUy1O2Rjc3Wywb0xMAsGr3ZVzKLjdxjgjRX2GlFO//rarVjH2gJ1xsqVaT6Blsurq6gs/nIz8/X2t7fn4+PD1bN2edUChE//79cf26quOw+jx90hSLxbC3t9d6EMNwshHh01n9IeBx2HU+BxsOXjd1lghpl08PXEdOeR18naw6fS3LE8O74f4QN0jlSjz1fSKtLETMCmMML/92EaU19Qj1tMOjQztfKwIxDb2CTZFIhIEDByI+Pl6zTalUIj4+HlFRUa1KQ6FQICkpCV5eqmXigoKC4OnpqZVmRUUFTp482eo0iWEN7eaCFQ+r+m++/881bP43zcQ5IqRtjl8vwsaGEd7/fSis0/XVvBuPx+HDGREIcrVBdlktHvvmJIqqpKbOFiGt8vXRNBxIKYCIz8NHMyMg5NNU3kRF709CbGwsvvrqK2zZsgVXrlzB4sWLUV1djQULFgAA5s6di7i4OM3xr7/+Ov755x/cvHkTZ8+exaOPPopbt27hiSeeAKDqq/TCCy/gzTffxO7du5GUlIS5c+fC29sbkyZNMsxVEr3NjQrE0lHdAQCr/peMD/ddoyZ1YlYyS2rw/PbzYAyYMcgPMb1Nv2JQazhai/Dd40PgYS/GtfwqTN+YgIxiGqFOOre/L+fh7b9U3VVeHR+KUE9qcSS36T3x1YwZM1BYWIgVK1YgLy8PERER2Lt3r2aAT0ZGBni82zFsaWkpFi1ahLy8PDg5OWHgwIE4fvw4wsLCNMe89NJLqK6uxpNPPomysjIMHz4ce/fubTT5O+lYsQ/0BAfgkwPX8XF8Ki7nVOC9af3gZCMyddYIaVZeeR0e/eYkCiulCPW0w6oJvU2dJb34OVvjp0VD8dg3p5BWVI2H1x/DB9PDEd2JpmwiRG3vpVws/ekcGANmR/pj3rBAU2eJdDIcs4DqqoqKCjg4OKC8vJz6bxrBtlMZWLHrMmQKJVxsRHh1fC9M6u8DPs8ylx7r6p8nc7/+pKxyLPruDPIqVP00f1s8DB725vnDNa+8Dk/9kKiZimxihDdeGRcKLwcr02aslcz9s9Reln79SiXD54dv4P1/roIx4MF+XvhoBjWfG4O5f5boE0FaNHOIP3Y8Mww93G1RXC3Dsl8uYNzHR/DLmUzU1dP0SKRzqJHJsW7fNUz+7F/kVdShu7stflo01GwDTQDwdJDg56eG4onhQeBxwK7zORj53iGs3HUJaUXVps4e6cIuZZdj+hcJeO9vVaA5a4g/PpnZnwJNohN9Kkir9PFxwJ7n7sXLY0NhLxHgWn4Vlv96EYPf2o/lv1zA35fzUF5bb+psdiobNmxAYGAgJBIJIiMjcerUqWaP/+WXXxAaGgqJRIK+ffvizz//1NrPGMOKFSvg5eUFKysrREdHIzVVe7WnkpISzJkzB/b29nB0dMTChQtRVVVl8GvrTLLLavHx/lTc9+4hfBKfCrmSYWxvT/y2eBj8nE2//nl7iQV8vPZQGHY+ew+GBDpDKldiS8It3P/+IUz9/Di+PnoTqfmVXb5PtSnKW1dTr1DiQEo+nthyGg99egyJt0phI+Lj3an9sGZKX4tt7SLtR83oRG/lNfX48VQGfjhxC9lltZrtPA7o6WGHPj4OCPGwQzc3G/g5W8PLQQJbsQAcZx5fRIb4PG3fvh1z587Fxo0bERkZiY8++gi//PILrl69Cnd390bHHz9+HPfddx/WrFmDhx56CD/++CPeeecdnD17Fn369AEAvPPOO1izZg22bNmCoKAg/Pe//0VSUhKSk5M1/ZvHjRuH3NxcfPHFF6ivr8eCBQswePBg/Pjjjx16/cZSr1Aio6QGV/MqcT6zDAk3ipF0x3yU/s7WeHlsKMb39TSbz5s+GGM4fqMYXx+9icPXCqG849vb2UaEcF8H9PKyR3d3WwS4WMPH0RqutiIITFTb1FGfJVOVt5Z05rLUEsYYiqtluF5QhUvZ5Ui8VYpj14tQWScHAHAcMCHcvLp1mDNz/iwBFGySdlAqGU6kFeOfy/k4cq0QN5tp1rMW8eFsI4KjtRAOVkLYiYWwFvNhLeLDSsiHWMCHkM+DSMCDkM9BwOPA5/PA51T/5jiAx3HgN/yb4zhwUH3hcWjY1vBcqhjjdqChjjnuDj2EfB7uD218IzLE5ykyMhKDBw/G+vXrG14rJfz8/LB06VK88sorjY6fMWMGqqur8ccff2i2DR06FBEREdi4cSMYY/D29sayZcvwn//8BwBQXl4ODw8PbN68GTNnzsSVK1cQFhaG06dPY9CgQQCAvXv3Yvz48cjKyoK3t3er8t7U9Z/PLEOBjnkf7/wC0f42YWBMtV/1fwYlU93ElIxBoVR9huRKBrlSiXoFg0yuRF29AnVyBWplClTWyVFeW4/iKikKKqXIr6jTCrAA1fs7JNAZsyP9Ma6PF0SCrtFgk1deh78u5SL+SgFOp5dAKlfqPI7HqQJRJ2tV+bOTCGEjFsBGxIdEyIdYyINYwIdYwIOAx0HAV/2fz1OVPR6nKl/8O/6tq/zd19MNtmLtMacd9d1sivLWGk1df1pRNVLzK/W6xrtv1LfL2u1ypt7OGrYpmer/CiWDgjEolQz1Sga5QgmZXPWokytQI1OgWipHRa0cpTUyFFZJkVdehxodq8i52oowMcIHsyP9Eexmq9c1kLYz9zhH79HohKjxeByGBbtiWLArAKCgog7nMstwJbcCqflVSCuqRlZpDSrq5KiRKVAjq0VWaW0LqXYcO4kASatiDJ6uTCZDYmKi1hRgPB4P0dHRSEhI0HlOQkICYmNjtbbFxMRg586dAIC0tDTk5eUhOjpas9/BwQGRkZFISEjAzJkzkZCQAEdHR02gCQDR0dHg8Xg4efIkJk+erPO5pVIppNLbczlWVFToPG7joRvYe1n3ErIdyVrER7CbLfr4OGBIkBPu6e4Kdzvz7ZfZVp4OEiy4JwgL7gmCVK5Ack4FkrLLkZJXibTCamSU1CCvog4KJUNRlQxFVTKj5ufgf0Y2CjY7gqnKmy6tLUt7L+Xhnb0prbo+U+I4wMfRCr287BHh54ih3VwQ4edIzeVEbxRsEoNxt5cgprdno/kMa2RyFFRIUVwtQ3mtDOW19aiqk6Napqq9qqtXQCpXQipXQq5Qol6hRL2SQaFQ/RpXKFU1YXfWiimVt3+9M0Dzs57d9SsfQKO+bOq/bETG+fgXFRVBoVBopgNT8/DwQEqK7htMXl6ezuPz8vI0+9Xbmjvm7iZDgUAAZ2dnzTG6rFmzBqtXr27xuoLcbNDf31Fr2923HHXT9Z21zBxU1c4c0KiWjN9Qg6aqzeZByOdBIuTBSqiq9bYRC+BoLYSzjRhudmJ4O0rgZiu2yCby9hAL+Ojv74T+/k5a2xVKhuIqKYqqZCitUZW9yrp6VEkVqJHKUSdXoK7+di1XvUIJuVJV5uoVyoYaaFXZU9eSMegofwAkQtPUKJuqvOnS2rLkYS9uVJbu1twn/O5yptrWUNbU/24oZxw48Hgc+A1/8xtqr8UNLUkSIR9WIj5sxQLYSwRwtBbBxVYELwcreDlIOv1CCMQ8ULBJjM5aJECgqwCBrjamzgrRIS4uTquWp6KiAn5+fo2Oe3lsaEdmixgAn8fB3V4CdzMekW9OWluWpgzwxZQBvh2ZNUJMqmt0biKkA7m6uoLP5yM/P19re35+Pjw9da9i4+np2ezx6v+3dExBQYHWfrlcjpKSkiafFwDEYjHs7e21HoSYC1OVN12oLBGim0XUbKqbSZvqH0OIPtSfo7aOnROJRBg4cCDi4+M1S64qlUrEx8djyZIlOs+JiopCfHw8XnjhBc22ffv2ISoqCgAQFBQET09PxMfHIyIiQpPPkydPYvHixZo0ysrKkJiYiIEDBwIADhw4AKVSicjIyFbnn8oTMZT2lqXWMFV5aw0qS8RQOqIsGRWzAJmZmQwNg17pQQ9DPTIzM9v8mdy2bRsTi8Vs8+bNLDk5mT355JPM0dGR5eXlMcYYe+yxx9grr7yiOf7ff/9lAoGAvf/+++zKlSts5cqVTCgUsqSkJM0xa9euZY6OjmzXrl3s4sWLbOLEiSwoKIjV1tZqjhk7dizr378/O3nyJDt27Bjr0aMHmzVrFpUnepj00Z6y1BqmKm8tobJED0M/jF2WjMUiaja9vb2RmZkJOzu7RgMH1H1mMjMzqUnDSCztNWaMobKystVTBekyY8YMFBYWYsWKFcjLy0NERAT27t2rGXCQkZEBHu92L5Zhw4bhxx9/xGuvvYZXX30VPXr0wM6dOzVz/gHASy+9hOrqajz55JMoKyvD8OHDsXfvXq05/7Zu3YolS5Zg9OjR4PF4mDp1Kj755BO98t5UebK097mzsqTX2RBlqTVMVd5aQvcm07Kk17ijypKxWMQ8m80x97mpzAG9xl0Dvc8dg17nroHeZ+Oj17jzoAFChBBCCCHEaCjYJIQQQgghRmPxwaZYLMbKlSshFotNnRWLRa9x10Dvc8eg17lroPfZ+Og17jwsvs8mIYQQQggxHYuv2SSEEEIIIaZDwSYhhBBCCDEaCjYJIYQQQojRULBJCCGEEEKMhoJNQgghhBBiNBYfbG7YsAGBgYGQSCSIjIzEqVOnTJ0ls3HkyBE8/PDD8Pb2Bsdx2Llzp9Z+xhhWrFgBLy8vWFlZITo6GqmpqVrHlJSUYM6cObC3t4ejoyMWLlyIqqqqDrwKYihUltqOyhK5E5WltqOyZJ4sOtjcvn07YmNjsXLlSpw9exbh4eGIiYlBQUGBqbNmFqqrqxEeHo4NGzbo3P/uu+/ik08+wcaNG3Hy5EnY2NggJiYGdXV1mmPmzJmDy5cvY9++ffjjjz9w5MgRPPnkkx11CcRAqCy1D5UlokZlqX2oLJkpZsGGDBnCnn32Wc3fCoWCeXt7szVr1pgwV+YJAPv99981fyuVSubp6cnee+89zbaysjImFovZTz/9xBhjLDk5mQFgp0+f1hzz119/MY7jWHZ2doflnbQflSXDobLUtVFZMhwqS+bDYms2ZTIZEhMTER0drdnG4/EQHR2NhIQEE+bMMqSlpSEvL0/r9XVwcEBkZKTm9U1ISICjoyMGDRqkOSY6Oho8Hg8nT57s8DyTtqGyZFxUlroOKkvGRWWp87LYYLOoqAgKhQIeHh5a2z08PJCXl2eiXFkO9WvY3Oubl5cHd3d3rf0CgQDOzs70HpgRKkvGRWWp66CyZFxUljoviw02CSGEEEKI6VlssOnq6go+n4/8/Hyt7fn5+fD09DRRriyH+jVs7vX19PRs1OldLpejpKSE3gMzQmXJuKgsdR1UloyLylLnZbHBpkgkwsCBAxEfH6/ZplQqER8fj6ioKBPmzDIEBQXB09NT6/WtqKjAyZMnNa9vVFQUysrKkJiYqDnmwIEDUCqViIyM7PA8k7ahsmRcVJa6DipLxkVlqRMz9QglY9q2bRsTi8Vs8+bNLDk5mT355JPM0dGR5eXlmTprZqGyspKdO3eOnTt3jgFg69atY+fOnWO3bt1ijDG2du1a5ujoyHbt2sUuXrzIJk6cyIKCglhtba0mjbFjx7L+/fuzkydPsmPHjrEePXqwWbNmmeqSSBtRWWofKktEjcpS+1BZMk8WHWwyxtinn37K/P39mUgkYkOGDGEnTpwwdZbMxsGDBxmARo958+YxxlTTTPz3v/9lHh4eTCwWs9GjR7OrV69qpVFcXMxmzZrFbG1tmb29PVuwYAGrrKw0wdWQ9qKy1HZUlsidqCy1HZUl88QxxlhH16YSQgghhJCuwWL7bBJCCCGEENOjYJMQQgghhBgNBZuEEEIIIcRoKNgkhBBCCCFGQ8EmIYQQQggxGgo2CSGEEEKI0VCwSQghhBBCjIaCTUIIIYQQYjQUbBJCCCGEEKOhYJMQQgghhBgNBZuEEEIIIcRoKNgkhBBCCCFGQ8EmIYQQQggxGgo2CSGEEEKI0VCwSQghhBBCjIaCTUIIIYQQYjQUbBJCCCGEEKOhYJMQQgghhBgNBZuEEEIIIcRoKNgkXUJtbS34fD7efvttU2eFELND5YcQ4+gqZatTBpvHjx/HqlWrUFZWZtI0mpKUlIRp06YhICAAEokEPj4+eOCBB/Dpp58a/LksjTHfl+YkJydDqVSiT58+BkuTMYbXX38dR48eNViaxtSZy9XmzZvBcRzOnDlj0HQtDZUf0zGH8qN+CAQC+Pj4YP78+cjOzjboc1kqKlvG1WmDzdWrV7e7ULc3jabSHTRoEC5cuIBFixZh/fr1eOKJJ8Dj8fDxxx8b9LkskbHel5YkJSUBAHr37m2wNK9du4aVK1ciNzfXYGkaU2cuV6R1qPyYjjmUn9dffx3ff/89Nm7ciHHjxuGHH37AiBEjUFdXZ5TnsyRUtoxLYOoMmJu33noLDg4OOH36NBwdHbX2FRQUmCZTd6muroaNjY2ps9GhWrrmpKQkWFtbo1u3bgZ7zsTERADAgAEDDJYm6Ry6Whmi8mMZxo0bh0GDBgEAnnjiCbi6uuKdd97B7t278cgjj5g4d12vXAFUtjSYCVRUVLDnn3+eBQQEMJFIxNzc3Fh0dDRLTExkK1euZAAaPdLS0hhjjKWnp7PFixeznj17MolEwpydndm0adM0+xljLaaRlZXFFixYwNzd3ZlIJGJhYWHsm2++aVXeQ0JC2MiRI9t87eq8XblyhU2fPp3Z2dkxZ2dn9txzz7Ha2lrNca25zjvTu3z5Mps1axZzdHRkEREReqVxZzpXr15lc+bMYfb29szV1ZW99tprTKlUsoyMDDZhwgRmZ2fHPDw82Pvvv98ojZZeV0O9L81dc1MeeOABNnDgQHb8+HE2YsQIZm1tzUJCQtiPP/7Y6NiDBw+ycePGMQcHB+bk5MQefPBBdv36da1jBg8e3Og6HBwcGGOMJScns6eeeor17NmTWVlZMQ8PDzZ79myWk5PTbB7by5zL1bfffssAsNOnTzd7XGvLT2uv6c4021OGOkP5aU0aLV1vU/QpP4y1XIao/HRM+fnjjz8YAPb222+3mEZnvDcZolwxRvcmU5ctxhgzSc3m008/jV9//RVLlixBWFgYiouLcezYMVy5cgVTpkzBtWvX8NNPP+HDDz+Eq6srAMDNzQ0AcPr0aRw/fhwzZ86Er68v0tPT8fnnn2PkyJFITk6GtbV1s2nk5+dj6NCh4DgOS5YsgZubG/766y8sXLgQFRUVeOGFF5rNe0BAABISEnDp0qV29bF45JFHEBgYiDVr1uDEiRP45JNPUFpaiu+++67V13mn6dOno0ePHnj77bfBGGtTGgAwY8YM9OrVC2vXrsWePXvw5ptvwtnZGV988QVGjRqFd955B1u3bsV//vMfDB48GPfddx8AtOp1NfT7ouuam5KUlAQHBwfMmDEDixYtwtSpU/HZZ59h9uzZ6NatGyIjIwGo+j4tXLgQDzzwAN58803U1NTg008/RXR0NJKTk2FlZQUAePnll7Fq1SpIpVKsWLECADQ13Zs2bUJaWhoee+wxeHp64uLFi/jiiy+Qn5+P/fv3t+bj0SbmXK701VL5ae013ckQZchU5ae1abR0vU1pbfkBWleGqPx0TPlJT08HADg5ObX6nM54b2pruQLo3gSYvmwBME3NpoODA3v22Web3P/ee+81+sWuVlNT02hbQkICA8C+++67FtNYuHAh8/LyYkVFRVrbZ86cyRwcHHSmf6d//vmH8fl8xufzWVRUFHvppZfY33//zWQyWbPnqal/+UyYMEFr+zPPPMMAsAsXLuh1ner0Zs2a1ej41qZxZzpPPvmkZptcLme+vr6M4zi2du1azfbS0lJmZWXF5s2bp9nW2tfVEO9Lc9esS2FhIQPAnJ2dtZ43IyODiUQizTUnJSUxkUjE3njjDa3zL1y4wACw3377TWu7v78/mz9/fqPnq66ubrTttddeYzwer1HtmyGZc7nSt2azpfKjzzUZogyZuvzok4axyg9j+pUhKj+3Gar87N+/nxUWFrLMzEz266+/Mjc3NyYWi1lmZmaz5zPWOe9N7S1XjNG96U6mKluMMWaSAUKOjo44efIkcnJy9D5XHb0DQH19PYqLi9G9e3c4Ojri7NmzzZ7LGMNvv/2Ghx9+GIwxFBUVaR4xMTEoLy9vMY0HHngACQkJmDBhAi5cuIB3330XMTEx8PHxwe7du1t9Hc8++6zW30uXLgUA/Pnnn226zqeffrrRtra8Vk888YTm33w+H4MGDQJjDAsXLtRsd3R0REhICG7evAmg/a9rW8/Xdc26XLp0CQDwf//3fwgMDNRs9/PzQ0hICNLS0gCoOtf7+/vjqaee0sqDt7c3hEKh5noBoLy8HBkZGejXr1+j57vzV3lZWRmKiorg5OQEpVIJuVzeqjy3hTmXK321VH4A05QhU5SftqZh6PIDtL4MUfm5zZDlJzo6Gm5ubvDz88O0adNgY2OD3bt3w9fXt9XX0hnvTW0pVwDdm+5mqrIFmGiA0Lvvvot58+bBz88PAwcOxPjx4zF37txWdZCtra3FmjVr8O233yI7O1urirq8vLzZcwsLC1FWVoYvv/wSX375pc5jWjPIZ/DgwdixYwdkMhkuXLiA33//HR9++CGmTZuG8+fPIywsrMU0evToofV3cHAweDyeptlD3+sMCgpqtK0tr5W/v7/W3w4ODpBIJJpmhTu3FxcXA2j/69rW83Vdsy7q0X6PPvpoo308Hg/W1taQSqXYs2cPampq4O7urjMdOzs7zb8vXrwIAI0KtEKhwJYtW7B+/XqkpKSgtrZWs8/V1RW2tratynNbmHu50kdL5QcwTRkyRflpaxqGLD8A9CpDVH5uM2T52bBhA3r27Iny8nJs2rQJR44cgVgsbtW5ap3x3tSWcgXQvelOpixbgImCzUceeQT33nsvfv/9d/zzzz9477338M4772DHjh0YN25cs+cuXboU3377LV544QVERUXBwcEBHMdh5syZUCqVzZ6r3v/oo49i3rx5Oo/R9WugKSKRCIMHD8bgwYPRs2dPLFiwAL/88gtWrlzZ6jTUOI7T+lvf67zzl2Jb0wBUvxpbsw2A5guiva9rW8/Xdc26JCUlwdvbu1FBrampQUpKCiZMmICbN2+ipqYGb7zxBoYOHaoznfDwcM2/1QX6zm0AMHfuXPz888+YN28eXnjhBbi6ukIkEuG5556Dl5dXq/LbVpZSrtri7vIDmKYMmaL8tDUNQ5YfAHqVISo/txmy/AwZMkQzGn3SpEkYPnw4Zs+ejatXr7Y5mOgM96a2lCuA7k13MmXZAkw49ZGXlxeeeeYZPPPMMygoKMCAAQPw1ltvYdy4cTpvHGq//vor5s2bhw8++ECzra6urtHcWLrScHNzg52dHRQKBaKjow12LQA0Bby181qlpqZq/fq5fv06lEqlpiq9tdfZHEOk0Rr6vK4d/b4AqgKt64vp22+/hVQqxZQpU1BZWQkA6NWrV6vycPHiRXh5eWn9sk5OTsaPP/6IDz/8UKvTeG5uLq5du4axY8e2/2JaYGnlqiktlR/AfMpQe8uPvmnoqzXlB4BeZYjKz23Geu/4fD7WrFmD+++/H+vXr8crr7zSqvPo3tS289uiK92bOrzPpkKhaFRN7u7uDm9vb0ilUgDQzEml64PH5/Mbje769NNPoVAotLbpSoPP52Pq1Kn47bffNH0l7lRYWNhi/g8ePKhzdJm6P0tISEiLaQCq5o47qVcfUv+Cbu11NscQabT2eVr7uhrrfWkKYwyXLl1CdnY2bty4oZXm2rVrMWHCBERERCAwMBAcx+G3335rlIZcLkdpaanWtoyMjEb9oLKysgAA3bt312yrr6/HE088AYVCYdTaPXMvV/pqqfyo82UOZai95UffNPTR2vIDQK8yROXndhrGLD8jR47EkCFD8NFHH7V6Yne6N5W16Xx9dZV7k1qH12xWVlbC19cX06ZNQ3h4OGxtbbF//36cPn1a8ytn4MCBAFSdZmfOnAmhUIiHH34YNjY2eOihh/D999/DwcEBYWFhSEhIwP79++Hi4qL1PE2lsXbtWhw8eBCRkZFYtGgRwsLCUFJSgrNnz2L//v0oKSlpNv9Lly5FTU0NJk+ejNDQUMhkMhw/fhzbt29HYGAgFixY0KrXIS0tDRMmTMDYsWORkJCAH374AbNnz9ZUfbf2OptjiDRaq7Wvq7Hel6akp6ejqqoKAwcOxIMPPojnnnsONTU1WL9+PXg8nqYfjru7O2bNmoUff/wRFRUVGDduHBQKBa5fv44dO3Zg27ZtGD58uCbdoKAgHDhwAO+++y68vb3Rq1cvREREwNraGs8//zzS0tJQW1uL77//XvPL9e5mDUMy93Klr5bKD2BeZai95cfGxsYo70Fryw+gXxmi8tNx5Wf58uWYPn06Nm/e3KqBK3RvonuTURhjiHtzpFIpW758OQsPD2d2dnbMxsaGhYeHs88++0zruDfeeIP5+PgwHo+nNR1BaWkpW7BgAXN1dWW2trYsJiaGpaSksICAgEZTHjSVRn5+Pnv22WeZn58fEwqFzNPTk40ePZp9+eWXLeb/r7/+Yo8//jgLDQ1ltra2TCQSse7du7OlS5ey/Pz8Fs9XT42QnJzMpk2bxuzs7JiTkxNbsmSJ1tQDrb1OdXqFhYWNnkuf16qpdObNm8dsbGwapT1ixAjWu3dvrW2tfV3b+740d81327VrFwPAzp07x5599lnm4ODAHB0d2dy5cxtNZFtXV8fefvttFhYWxqysrJiLiwsbPHgwW7lyZaMpI7Kzs1lMTAyztbVlANgnn3zCGFNNohwaGsokEgnr168f+/bbb9mqVauYQCBgdXV1Lea3rcy9XOk79VFL5UefazJEGeoM5ae1aRir/DDW+jJE5afjyo9CoWDBwcEsODiYyeXyJtPojPcmQ5QrxujexJjpypYax1gLM44Sg1q1ahVWr16NwsLCRiPpCCHNo/JDiHFQ2SLGZJJ5NgkhhBBCSNdAwSYhhBBCCDEaCjYJIYQQQojRUJ9NQgghhBBiNFSzSQghhBBCjMZkKwgZklKpRE5ODuzs7Jpd5YGQ1mCMobKyEt7e3uDxut7vMSpPxFCoLFFZIoZh7mXJIoLNnJwc+Pn5mTobxMJkZmY2WomhK6DyRAyNyhIhhmGuZalTBZsbNmzAe++9h7y8PISHh+PTTz/FkCFDWjzPzs4OgOpNsLe3N3Y2iYWrqKiAn5+f5nPV1VB5IoZCZYnKEjEMcy9LnSbY3L59O2JjY7Fx40ZERkbio48+QkxMDK5evQp3d/dmz1U3T9jb21OBJgbTVZu9qDwRQ6OyRGWJGIa5lqVOE2yuW7cOixYt0qwtvnHjRuzZswebNm3CK6+8onWsVCqFVCrV/F1RUdFkurO/OoHCSmmT+++m633kwGm2cxwHHgfwGv7P53EQ8Hjg8ziIBDyIBTxIhHzYiPmwlwjhYC2Eq60Y3g5WCHCxhrejFfg88/ywEEJUamUKvLbzEi5mlcHXyQpvTu4LH0crU2eLEItUJZVj64lbOHi1AL29HfDY0AAEutqYOltED50i2JTJZEhMTERcXJxmG4/HQ3R0NBISEhodv2bNGqxevbpVaacXVSOnvM5geW0vKyEffXzsEdXNBaN7eaCfr4PZ/lIhpCtijOG1nZfw29ksAEBqQRUWbj6NXxcPg624U3ylEmIx6hVKzP7qBC5mlQMATtwswbZTGfhm/mAM7eZi4tyR1uoU34xFRUVQKBTw8PDQ2u7h4YGUlJRGx8fFxSE2Nlbzt7ovgy6fzh4AmVzZ7PMz6JhqlGn/Uz0bqZIxKBkDY6p/y5UMCiVDvUKJegWDVK5ArUyBGpkCFbX1KK2pR2GVFDlltcgoqUFtvQKn00txOr0Unxy4jmA3Gzx5XzdM7u8LkcD8RpgR0tX8dSkPv53NAo8D3pjUBx/uS0VKXiXe2nMFa6b0NXX2CLEoXx65iYtZ5XCwEmLJ/d2x93IeEm+VYt6mU9j+VBQi/BxNnUXSCp0i2NSXWCyGWCxu1bEDA5yMnJvWUygZbhZW4WxGKY5cK0J8Sj5uFFbj5d+S8PXRNKyd2hcDA5xNnU1CSDM2H08HADw9IhhzIgPQzdUWs746gd8Ss/BCdA942EtMm0FCLER+RR0+3p8KAFj5cBimDPDFY1EBeOr7RBy+Vohnt57FnueGw9FaZOKckpZ0iqo0V1dX8Pl85Ofna23Pz8+Hp6eniXJleHwehx4edpgx2B8b5gzA6f+LxmsP9oKLjQipBVV45IsT+C4h3dTZJIQ04VZxNU6llYDHAY9FBQAAooJdMDjQCTKFEpv+TTNxDgmxHLvP50CmUKK/vyMm9/cBAEiEfHw6uz8CXKyRXVaLV39PMnEuSWt0imBTJBJh4MCBiI+P12xTKpWIj49HVFSUCXNmXHYSIZ64txvil43AhHBvKJQMK3Zd1vySI4R0Lr8mqvppDu/hBi+H2wOCnrovGADw44kM1NUrTJI3QizN7gs5AIAp/X20xjbYS4RYP2sABDwOfybl4c+kXFNlkbRSpwg2ASA2NhZfffUVtmzZgitXrmDx4sWorq7WjE63ZI7WInw8MwLLY0IAAB/uv4bvT9wyca4IIXf746LqpjZtoPakyqNC3eHjaIVKqRwHUwpMkTVCLEpaUTWSssvB53EY39er0f6+vg5YPFL1I2/Frksoq5F1dBaJHjpNsDljxgy8//77WLFiBSIiInD+/Hns3bu30aAhS8VxHJ69vztejO4JAHj9f5eR1DD6jhBietlltUgrqgafx+H+EDetfTweh4fCVTdEdW0MIaTt1LWV93R3hYut7jEaS0Z1Rw93WxRVybDmz8aDiUnn0WmCTQBYsmQJbt26BalUipMnTyIyMtLUWepwz43ujrG9PVGvYHhu2zlqkiOkkzh+vQgA0M/XAXYSYaP9D/fzBgAcSClAZV19h+aNEEtzKq0EABr9sLuTWMDH2w0zQGw/k4kTN4s7JG9Ef50q2CSqGs61U/vC016CtKJqfH30pqmzRAgBkHBDdSMbFqx7br/e3vbo5mYDqVyJA9SUTkibKZUMZzNKAQCDWpihZXCgM2ZH+gMAXt2RRBU0nRQFm52Qo7UIr4wLBQB8dugGCio6z6T0hHRFjDH8e0NVszks2FXnMRzHYWxv1ewZ8Vco2CSkra4XVqGyTg4rIR+hXi2vBf7y2FC424lxs6ganx6gAbadEQWbndSEcG+E+zmiRqbA54dvmDo7hHRpaUXVyK+QQiTgNTt376hQdwDAoasFkCuaX0yCEKJb4i1VrWaEnyOE/JbDFAcrIV6f2BsAsPHwTRrv0AlRsNlJ8XgcYh9QDRb6+XQmymupDxghpnI+swwA0NfHARIhv8nj+vs7wdFaiIo6ueaGSQjRj7rs6LMoy9g+XniwnxcUSoZlv5yn5vROhoLNTuy+Hq4I8bBDtUyBn05lmDo7hHRZ6nWZ+/k6NHucaqS6qnaT+m0S0jbq/poDAhz1Ou+NiX3gaivCtfwqrP2LRqd3JhRsdmIcx2HhvUEAgO8TbkGp1LGGOyHE6C5klQEAwn0dWzz2/oam9MPXCo2YI0IsU129AulF1QCAPt7N/7i7m7ONCO9NCwegWlb278t5Bs8faRsKNju5CeHesBULkF1WizPULEdIh6tXKJGcUwGg5ZpNABje3RUcB6TkVSKfBvcRopebhdVQMsBeIoCbne75NZtzf6g7Hr9HVUmz7OcLuFFYZegskjagYLOTkwj5GNdHNcL193NZJs4NIV3P1bxKSOVK2EkECHSxafF4ZxsR+vqogtKjqUXGzh4hFiW1oBIA0NPDTmuJSn3EjQ/FkEBnVEnleGLLGRRXSQ2ZRdIGAlNngLRs8gAf/JKYhT8u5mLlw72bHaBgKWRyJcpr61FZV48qqRzVUgXq5ApI6xWQypWQ1ishUyghVyghVzLIlQyKOx6MMSgZoGz4PwNDw39QKhkYAImQh+Uxoaa+VNLJ3dlfk8dr3c3vvh5uuJhVjiPXChstbUkIadq1fFWw2cOj5SmPmiLk87BhzgBM2vAv0oqq8fiWM/hh4RCdizGQjkHBphkYGuQCT3sJ8irqkHCjWNMnzJzV1SuQml+F1IJKpBVVI7OkBjlldSiorENRlQxVUrnR82AnEVCwSVp0KUcVbPb1cWz1Off2cMX6g9dx7HoRlErW6iCVkK4uNV/V7N3Tw7Zd6bjZibHl8SGYtvE4LmSWYd6mU9j8+BDYU8BpEhRsmgEej8PoXu7YejIDB1IKzDLYlMoVOHGzBEevFeJUegmScyogb8WAJzuJADYiAazFfFiL+JAI+BALeRDxeRAJeBDweRDwOPB5nOb/PO72/wGAx3HgOIDHqQZdcQDAARKB5dcQk/ZLyVX11+zVisml1QYEOMFGxEdJtQzJuRXo46PfQAdCuqrUAnWw2faaTbXu7rb4YWEk5nx9EmczyvDIxgRsmj8Y3o5W7U6b6IeCTTMxKvR2sPk6Y23uy9LRzmWUYtupTPyZlIvKu2ornayF6Olhh25utghwsYa3oxU87SVwsRXB2VoEeysh+FQjRExIqWRIyVM164V52bf6PCGfh6hgF+y/UoCjqUUUbBLSCnX1CtwqVo1E7+HevppNtT4+DvhxUSTmf3saKXmVePjTY/h4Zn8M76F7JTBiHBRsmolhwa4QC3jILqvFtfwqhHi2/1efMR2/XoQP9l3Tmtja3U6MUaHuiAp2waBAZ3g7SMwmaCZdU2ZpDWpkCogEPAS5tjw46E7Du7ti/5UCHLteiMUjg42UQ0Ish3okuoOVsE0j0ZvS29sBvz8zDIu+S8SV3Ao8+s1JPDY0AMvHhlCzegehYNNMWIn4GBbsgoNXC3EgpaDTBpu55bVYsesy9iXnAwBEfB4eCvfCjEF+GBzoTH3XiFm50tCE3tPDFoJWLJt3p+E93AAAp9NLUVev6BID+whpD3WtZjc3G4NXRPg6WeP3Z4bhjT+SsfVkBr4/cQt7knLx7P3dMXuIP6xEVD6NiaY+MiP39VTdvBJuFps4J7rtvZSHMR8ewb7kfAh4HOZFBeDYy/dj3SMRiOzmQoEmMTvJuaom9F6erW9CVwt2s4GXgwQyuRIn00oMnTVCLM6tkhoAgL+ztVHSlwj5eGtyX2x9IhLBbjYoqZbhjT+Scc87B7DmryuakfDE8CjYNCORQS4AgMT0EsgVShPn5jbGGD7cdw1P/5CIyjo5wv0csee5e7F6Yh+420tMnT1C2uz24CD9g02O43BvQ7+wo7SakNnasGEDAgMDIZFIEBkZiVOnTpk6SxbrVrEq2AwwUrCpdk93V+x94T68Pbkv/JytUFItwxeHb2LMh0cQve4w3tqTjAMp+SirkRk1H10JNaObkVBPOzhYCVFeW49LORWI8HM0dZbAGMN/d13CDydUa7cvujcIL40NhVDPJkdCOiP14KBQPUai3+neHm74+UwWjqRSsGmOtm/fjtjYWGzcuBGRkZH46KOPEBMTg6tXr8Ld3fxmBensMtU1m61YPKG9hHweZkf645FBvjiQUoCfz2Ti8LVCXC+owvWCKnx1NA0A4OtkhVBP1UBWP2dr+DhK4GEvgZutGE42IrrXtRIFm2aEx+MwONAZ+6/k4+TNYpMHm4wxvLnnCn44kQGOA96c1AdzIgNMmidCDKVaKkdGw80vtA3N6MDtpSuv5Vcht7wWXg405Yo5WbduHRYtWoQFCxYAADZu3Ig9e/Zg06ZNeOWVV9qc7oXMMpxOb3vXCvUUbhwHcFDdGziOA49DwxRwPAj5HIR8HsQCHqyEfFiLBbCTCOBkLYKjlbBTdmu6VaLqs2msZnRdBHwexvT2xJjeniivrcfha4X4N7UIp9JLkFZUjazSWmSV1gJXCnSebyPiw95KCBuxADZiAayEPEiEqmn6RAIehHweRAIOAh4P/Dum6ePxOPAb3jM0/J/X8L6O6e3ZacdltBUFm2ZmaLeGYDOtBE+NMO0I1+9P3MI3x1S//t6Z2g+PDPIzaX4IMST1fH9udmI424jalIaTjQj9fB1xIbMMR1OLqIyYEZlMhsTERMTFxWm28Xg8REdHIyEhQec5UqkUUuntpRErKip0Hnf8RjHe2Zti2Azrgc/j4GkvgZ+zFXq426GvrwOiurnArwODvLvVK5TIKasDAAS4mCYfDlZCTAj3xoRwbwBAWY0MV3Ircb2gEjeLqpFZUovc8lrkV0hRUi2FkgHVMgWqZQqD5sPfxZqCTWJaQ4KcAQBn0ktMujLJqbQSrP5fMgDg5bGhdBMlFudaQxN6SDsnl76vhysuZJbh8LVCKidmpKioCAqFAh4eHlrbPTw8kJKiO1Bcs2YNVq9e3WLaPT1sMbm/T6vywZj24hcMAGPq/zMwzbK8qqV51Uv2ypVK1MsZ6uQK1MoUqJEpUFFbj0qpHAolQ3ZZLbLLanHi5u0a1h7utpg8wAezBvvDqY0/sNoqp6wWCiWDWMCDm63hpj1qD0drEaKCXRAV7NJon0LJUFFbj/LaelQ0LKtcI1Wgpl6BuoZllWUND7lCiXolg0KpWl5ZqWRQKO983xqWVWYAwBDQAd0IOhoFm2aml5c9RAIeKurkSC+uRjc3w0x8q4+Kunq8uP08FEqGiRHeeHpEtw7PAyHGdrVhZGp7VzIZ0dMNnx64jqPXCiFXKPWeQomYj7i4OMTGxmr+rqiogJ9f4x8Yo3t5YHQvj0bbO0K9QoniKhmyy2qRXlSNlLwKnM0ow/nMMqQWVOHdvVex/sB1LLq3GxaPDO6wKbvUg4P8na07ZRP/3fg8Dk42og4Pys0VBZtmRsjnoY+3Pc5mlOFiVrlJgs03/peM7LJa+Dtb463JfWlidmKRrqoHB7WzOSvCz1EzsO9cZhkGBzobInvEyFxdXcHn85Gfn6+1PT8/H56enjrPEYvFEIs7R61cU4R8HjwdJPB0kGBggJNme3ltPfZeysWW47eQnFuBj+NTsScpF188NhDBHXCfUfePNlUTOjEu+olthsIbBgadzyzr8Oc+nV6CXxKzwHHAukfCYSum3yvEMmlqNtsZbAr4PIxomCP3YIruQQak8xGJRBg4cCDi4+M125RKJeLj4xEVFWXCnBmHg5UQMwb7Y89zw7F+dn+42YlxvaAKk9b/i5MdMLezOtg0Zb9RYjwUbJoh9Sj0C1llHfq8coUS/915CQAwc7AfBlENDbFQJdUyFFaqBnoYYo3mUaGqaXIOULBpVmJjY/HVV19hy5YtuHLlChYvXozq6mrN6HRLxHEcHurnjb+evxeDA51QKZXj8c2njV65kV1aCwDwc6Jg0xJRsGmGwn0dAQCXcyogk3fc5O47z+cgJa8SDlZCLI8J7bDnJaSjqZvQ/ZytYGOA2vsRPd3A41TzdmaX1bY7PdIxZsyYgffffx8rVqxAREQEzp8/j7179zYaNGSJXG3F+H5hJIYFu6BapsATW85ofoAZQ1ZDufB2pOnBLBEFm2YowMUajtZCyORKzU3R2GRyJT6OvwYAWDwyuM1TwRBiDtTL1oV4tG1+zbs52YgwKEDVErA/Ob+Fo0lnsmTJEty6dQtSqRQnT55EZGSkqbPUYSRCPr6aOwg9PWxRVCXFsl8uQKlkLZ/YBjkNwaavEwWbloiCTTPEcRz6eDsAAC7nlHfIc/52NguZJbVwsxNjXlRghzwnIaaiXjkoxNNwAyPG9FbVhv19Oc9gaRJibDZiAdbPHgCJkIcj1wrx+7lsgz9HXb1CU2tKNZuWiYJNMxXmrapxuZKre9JgQ1IqGb46chMA8PSIYFiJOmYqDKK/VatWqVYXueMRGkpdHvSlqdls48pBujwQpgo2T6aV0JrLxKz09LDD86N7AgDe2ZuCKqncoOnnlasmc7cS8uFkLTRo2qRzoGDTTIV5qW6CyR0QbB5IKcDNomrYSQSYMZgmpe7sevfujdzcXM3j2LFjps6SWWGMGWxC9zsFuNgg1NMOCiVDfBNL3xHSWT0+PBABLtYoqJRqKh8MJVvTX1NCU+lZKAo2zVQvL3XNZqXR+tCofX1M9cUyO9KfpjoyAwKBAJ6enpqHq6trs8dLpVJUVFRoPbqynPI6VErlEPI5BLkadiWPmN6q+Rn3JOUaNF1CjE0s4OOlhoGhWxLSUSMzXO1mNg0OsngUbJqpbm42EAl4qJLKkVlaY7TnuVlYhRM3S8DjQH01zURqaiq8vb3RrVs3zJkzBxkZGc0ev2bNGjg4OGgeulY86Uqu5qmC7W6uthAJDPsV+XC4FwDgyLVClFZTUzoxL2P7eCLQxRplNfXYfjrTYOmqpz2iwUGWi4JNMyXk8zRNfMk5xquJUn+hjAxxp1+dZiAyMhKbN2/G3r178fnnnyMtLQ333nsvKiubnrUgLi4O5eXlmkdmpuFuIubo9uAgwzWhq3V3t0MvL3vIlQx7aaAQMTN8HodF96mWJ/7mWJrBWtXUI9G9HegeY6ko2DRjxu63KZMr8dvZLACgvppmYty4cZg+fTr69euHmJgY/PnnnygrK8PPP//c5DlisRj29vZaj67sqhGDTQCYEO4NANh13vCjegkxtqkDfGEnESCrtBYn0gyzspC6Gd2HajYtVqcINgMDAxuNoF27dq2ps9XphXqpboYpRppr88i1QhRVyeBqK9asgELMi6OjI3r27Inr16+bOitmQz3DQy8vIwWbEd7gOODEzRJklhivCwwhxiAR8vFwww+mXxOzDJJmDvXZtHidItgEgNdff11rBO3SpUtNnaVOT13zop6mxdB2X8gBoOpnJuR3mo8K0UNVVRVu3LgBLy8vU2fFLNTVK3CjsBrA7UF4hubjaIXh3VWDtn4x0M2akI40baAvAOCvpLx2T4OkVDLkNEx95EPBpsXqNBGEnZ2d1ghaG5umR4HS6FmVng19NjNKagw6MhAAamRy7GtY6UTd7Ec6v//85z84fPgw0tPTcfz4cUyePBl8Ph+zZs0yddbMQmp+FRRKBkdrITztJUZ7numDVN1Sfj2TCYWRZ5MgxND6+zmim6sNausViL/SvhWxiqtlkMmV4DjA08F4ZY6YVqcJNteuXQsXFxf0798f7733HuTypoMnGj2r4morhouNCIwB1wuqDJr2/isFqK1XwN/ZGhF+jgZNmxhPVlYWZs2ahZCQEDzyyCNwcXHBiRMn4ObmZuqsmQVNE7qnvVHn+xsT5gEHKyFyyutw6CrNuUnMC8dxGNdXNY3XP+1cfjW3XNWE7mYrphY0C9Yp3tnnnnsO27Ztw8GDB/HUU0/h7bffxksvvdTk8TR69jZ17aah10jfe0k1D+BD/bxokl0zsm3bNuTk5EAqlSIrKwvbtm1DcHCwqbNlNpI1/TWNO0hKIuRrBt19+2+6UZ+LEGN4IEwVbB5KKYBUrmhzOjllqiZ06q9p2YwWbL7yyiuNBv3c/UhJSQEAxMbGYuTIkejXrx+efvppfPDBB/j0008hlUp1pk2jZ28zRr/NunoFDl0tBKCaV42QrsLYg4Pu9NjQAPA44Nj1IqP1uybEWPr5OMDDXoxqmQIJN9o+Kj3njtWDiOUyWrC5bNkyXLlypdlHt27ddJ4bGRkJuVyO9PR0Y2XPYqhrNq/lG64Z/fiNItTIFPC0l6Cvj4PB0iWkM2OM3RFsGv8HrJ+ztWa99C8NvPwfIcbG43Gaz+/+dvTbVDeje9EcmxbNaGsPurm5tbmf2Pnz58Hj8eDuTtPttCTE0xaAYZvR1QODxvT2oCZ00mVklNSgok4OEZ+n+RFnbE+PCMbfl/Px+7lsPDeqB/xdrDvkeQkxhJE93fHDiQz8e70dNZvl1IzeFZi8z2ZCQgI++ugjXLhwATdv3sTWrVvx4osv4tFHH4WTk5Ops9fp9Wi4KeZV1KGirr7d6SmVDPuvqAYsqH+1EtIVXMwqB6BqQjf0MpVN6e/vhPt6ukGhZFh/MLVDnpMQQ4ns5gw+j0NaUTWy2rhs8u3Vg6gZ3ZKZPNgUi8XYtm0bRowYgd69e+Ott97Ciy++iC+//NLUWTML9pLbU7SkGqApPTm3AoWVUliL+BgS5Nzu9AgxF0nZqmCzr2/Hdh15fnR3AKoJsg090I8QY7KTCBHeUF6Ot7F2M7dhgJAX1WxaNJMHmwMGDMCJEydQVlaG2tpaJCcnIy4uDmKx2NRZMxs9PFRN6akGGGRw+JpqYNCwYFeIBfx2p0eIubiYVQYA6Ofj2KHPOzDAGTG9PaBkwJt7ksEYzbtJzId6gYJj14v0PrdeoUR+pboZnWo2LZnJg03Sfj3cVU3pqQaYa/Nwwyj0kSE0LyPpOpRKhkvZqsFBHV2zCQBx43pByOdwNLUIey/ldfjzE9JW9zQEm8dvFOn9Qym/og6MAUI+B1cbqmCyZBRsWgB1zWZ7p08pr61HYkYpAGBETwo2SdeRVlyNKqkcYgEPPdxtO/z5A11t8NR9qvlQ/7vrMspqZB2eB0LaIsLfESIBD0VVMqQVVet1bm7D4CBPBwl4PBqMasko2LQAPRuCzfauIpRwoxgKJUM3Nxv4OdOoWNJ1nMsoAwD09raHwESrmCwZ1R3d3W1RVCXFq78nUXM6MQtiAV/Tb/NMeqle52aXqgcHUX9NS0fBpgXo3tCMnlvevhHp/zb0ubm3oVmEkK4i8VYJAGBQoOkGxUmEfHwwPRxCPoc/k/Kw+Xi6yfJCiD7U5eZMQzlqreyGkei+TlS5Yeko2LQADlZCeNir+ru0Z0S6Oti8h4JN0sWoa2QGBph2urVwP0e8Or4XAODNPVdwMIXWTTeVt956C8OGDYO1tTUcHR1NnZ1ObVBDudG3ZjOroWbTx4lqNi0dBZsWQj0J9fWCtvXbzC6rxc2iavA4YGiwiyGzRkinVlYj0wyuG2TiYBMA5g8LxNQBvlAoGZ7ZehYnbrZ9wmzSdjKZDNOnT8fixYtNnZVOT/0j7WZRNYqqdC8zrYumZpOmPbJ4FGxaCPWI9Kt5bavZVNdqhvs5wl4iNFi+COnsEm+pamO6udrAxdb0I2I5jsPaqX0xoqcbausVmP/tKarhNIHVq1fjxRdfRN++fVt9jlQqRUVFhdajK3C0FmkG1qnLU2tkN0wETzWblo+CTQuhXrayrSPSj6ub0IOpCZ10LWdudY4m9DsJ+Tx88dhA3B/ihrp6JRZuOY3PD92AUkmDhjqzNWvWwMHBQfPw8/MzdZY6zAB/Vfk5n1nWquMZY5qaTR+q2bR4FGxaCHUzeluCTcYYEhqa6oZREzrpYo7fUH32B3eyFbMkQj6+eGwQZg72g5IB7+xNwZyvT+JmYfvn0yXGERcXh/Lycs0jMzPT1FnqMBH+jgCA8w0zO7SkpFqGunolOA7wogndLR4FmxZCvUZ6QaVU7zn60oqqkV8hhYjPw4BOVLtDiLGV1cg0Kwfd26Pz1eqLBDysmdIXa6b0hZWQj4SbxYj56AhW7b6M/Io6U2fP7LzyyivgOK7ZR0pKSpvTF4vFsLe313p0Ff0bgs2LWWVQtKIGXj04yN1OTKvVdQECU2eAGIatWAAfRytkl9XiWn6VXuuaq2s1+/s7QiKkQk+6jn+vF4MxoIe7Lbw66Vx/HMdh1hB/DAt2wcrdl3HoaiE2H0/H1pO3MLaPF6YO8ME93V0hNNH8oOZk2bJlmD9/frPHdOvWrWMyY2F6uNvBRsRHtUyB6wVVCPG0a/Z4akLvWijYtCAhnnbILqvF1fxK/YLNhmbEKGpCJ13Mseuq5Vnv7dH5V8wKcLHBt/MH49/rxfgkPhWn0kvwvws5+N+FHNhLBLi3hxuGdnNGf38n9PSwg0hAwefd3Nzc4ObW+d9rc8Tncejr64ATN0twPrO05WBTM+0RzbHZFVCwaUF6eNjiQEoBruW1vt8mYwwnbqom4o3qRsEm6ToYYzhyrWEhg56drwldF47jMLyHK4b3cMWl7HL8ciYTf1zMRXG1DHuScrEnKRcAIOBxCHK1QTc3G/g6WcPLQQIPewlcbcVwshHC0UoEO4kA1iI+OI6WCdQlIyMDJSUlyMjIgEKhwPnz5wEA3bt3h61txy9pag4i/Jwags0yzBjs3+yxVLPZtVCwaUF6ear6B6XktX66jesFVSiqkkIs4Gk6eBPSFSTnViC7rBZiAQ+RnWxwUGv08XFAHx8HrHi4N85nluHf60U4nV6CC5llqKiTI7WgSjN/aFM4DrAS8mEt4kMs4EMs5EHE50Ek4EHA4yDg88DnOAj4HHgcBz6PA49TBb08DuBxHDgO4MBhxcNh8LC3nIEeK1aswJYtWzR/9+/fHwBw8OBBjBw50kS56twi/BwB3F7+tTm3ilXrqPs5U7DZFVCwaUHCvFXB5pXcSiiVDDxeyzUW6v6agwOdqZM26VL+SsoDAIwMcYO1yHy/Cvk8DgMDnDRTNzHGkFNeh+sFVUgvqkZWaQ1yy+tQUCFFUbUUZTX1KK+th0LJwBhQI1OgRqZodz7+ExPS7jQ6k82bN2Pz5s2mzoZZUQ8SupZfiRqZvNlylV6smmMzyNWmI7JGTMx8v2FJI91cbSAS8FAllSOztAYBLi0XYuqvSboixhj+bGhyHt/Xy8S5MSyO4+DjaAUfRyuM6Km7fyJjDLX1ClRJ5aiVKVBbr0CtTAGpXIl6hfrBIFcwyJVKKBmDQgkolUz1b6YKVBljYFBtd7YRdeyFkk7Hw14CT3sJ8irqcCm7osmxA3KFEpklFGx2JRRsWhABn4dQTztczCpHck5Fi8GmUnl7fs2h1F+TdCHX8qtws6gaIgEPo0LdTZ2dDsdxHKxFArOu0SWdU7ifA/Iu1+F8ZmmTwWZWaS3kSgaJkAcPO8vpekGaRsMVLUyYl6opPTm35X6bKXmVKKuph7WIj36+DsbOGiGdxi9nVJNtj+jpBjtanpUQg4nwU3XnuJBZ3uQxaUWq/pqBLjat6u5FzB8FmxZG3W8zOaflYFO9HvqQIGeao490GXX1Cvx6NgsAMGtI11lOkJCOEO6nqrhobtnKO4NN0jVQhGFh1DWbl1sRbB5tCDaHdzePaV8IMYS/LuWirKa+oU9j12tCJ8SY+vk6gseppjZqapWr9IaR6IHUX7PLoGDTwvTysgePA/Iq6ppdzq6uXoFTaar+muYwoTUhhsAYw6Zj6QCAGYP9wKcmPEIMylYsQEjDNHyJt0p1HqOu2QxypQnduwoKNi2MjViA0IaCfiZdd0EHgLO3SlFXr4S7nRg9PWiCYtI1xF8pQFJ2OaxFfMyJbH7SaUJI2wxqmIar5WCT7j1dBQWbFmhQYPMFHdBuQqcVREhXoFQyfBR/DQAwNyoQLrZiE+eIEMuknvP1jI57ULVUrlk9iKY96joo2LRAAzW/KkuaPObAlQIAwH1NzMNHiKXZevIWLmVXwFYswJP3dTN1dgixWOp70OXsctTetWDApexyMAZ42kvgZkc/+LoKCjYtkKag51Q0KugAkF5Ujav5lRDwONwfQgMkiOXLKavFO3uvAgCWx4TQBOSEGJGvkxU87MWQKxkuZJVp7UvKVk2JRNPtdS0UbFogH0creNpLIFcynMts3IyxLzkfABDZzRkO1jTHILFsdfUKLP4hEVVSOfr7O+LRoQGmzhIhFo3jOAwJUi0Uop5iT+1CFgWbXREFmxaI4zjN8pPq5vI7qYPNMWGeHZovQjpavUKJ2J/P40JWORythfh4Rn8agU5IBxjZ0EXr4FXte1BSQ01nP1/HDs4RMSUKNi1UTG9VIPnXpTwwxjTbM0tqcLqhL2d0mIdJ8kZIRyivrcdT3yfiz6Q8CPkcPps9AP4uNNUKIR1hRIgq2LyUXYGChmn4ymvqkV6sWhO9rw/VbHYlFGxaqBE93WAl5CO7rFbTRwYAfjh5C4wB9/ZwhY+jlQlzSIhxMMZw8GoBHvzkKA6kFEAs4OGruYMwjBYvIKTDuNqKEd7QVH7oWiEAaLp1+Ttbw4n6TXcpFGxaKCsRH6NCVYN//riYC0DVd+3n06o1oR+jfmsWbcOGDQgMDIREIkFkZCROnTpl6iwZXbVUjl3nszF9YwIWfHsaWaW18He2xs9PRWEkDYQjpMOpy92ehnvQjrPZAIB76IdflyMwdQaI8UyI8MaepFx8l5COOZH+2HE2G6UNy/SN7kVN6JZq+/btiI2NxcaNGxEZGYmPPvoIMTExuHr1KtzdzT/okiuUKKmWIbe8DunF1biaV4lzGWU4m1EKqVwJABDxeZh/TyCWjuoOOwkNgiPEFCb198GnB1Jx+FohDqTkY++lPADA7CG0oEJXQ8GmBRsT5oGobi5IuFmMuZtOIaNE1VdmeUwIDZKwYOvWrcOiRYuwYMECAMDGjRuxZ88ebNq0Ca+88kqj46VSKaRSqebviooKneluOpaGi3dNY9ISdvff7PY2xpjq3wxQMtbwUE2+Llcy1CuUqFcoIZMrUVuvQLVUgcq6elRK5WB3J9wgwMUaE8O9MWdoADzsJXrllRBiWEGuNpgywBe/Jmbh2a3nIFMo0dfHAX1pJHqXQ8GmBeM4Dm9P6YvxHx/FrYZO2XMi/TGpv4+Jc0aMRSaTITExEXFxcZptPB4P0dHRSEhI0HnOmjVrsHr16hbTPpVWgr2X8wyW1/bgcYCbnRgBzjYIdrdFHx97RAY5I9jNllbEIqQTeX50D+w6n43aetWcz3OjqAtXV0TBpoULcrXBPy/eh4QbxQAHTKZA06IVFRVBoVDAw0O7m4SHhwdSUlJ0nhMXF4fY2FjN3xUVFfDz82t03LSBvpqlUPV1ZwDIAVD/yTXs4zVs5HMc+DyAz+NBwOMgEvAgFvAgEfJhJeLDXiKAo7UIjlZCCPjU5ZyQzs7P2RrbnhyKq3lVCHCxxrCGaflI10LBZhfg52wNP2ea8oXoJhaL/7+9Ow9vqkz/Bv49SZqka9J931haQKAspQUFBalTGAcEBwREpyLKiIALLq/4UxZHBWREBmEGdUarzqi44YagUlGGoZSylK20bC2ULunepEuSJud5/0gTCd3SNmm2+3OZS3pyzsmTk949d54VEkn3y8bRVFmEkN4YGxuAsbEB9i4GsSOqGiDEhQQFBUEoFEKhUJhtVygUCAujSfwJIYT0P5eo2TROWt7ZwAZCesL4e8Q6G4XiwMRiMcaOHYusrCzMmjULAMDzPLKysrB8+XKLzkHxRKzFmWPJGiiWiLU4eyy5RLKpUqkAoMN+ZoT0lkqlgkzmfKMmV65ciYyMDCQnJyMlJQVbtmxBU1OTaXR6dyieiLU5ayz1FcUSsTZnjSWOOWuafB2e51FWVgZfX992I1GNgx1KSkrg5+dnpxK6Nle7xowxqFQqREREQCBwzp4m27Ztw6ZNm1BRUYFRo0Zh69atSE1NtejYzuLJ1T5nR+VK19kVYqkv6N5kX650jZ09llwi2eyKUqmETCZDQ0OD0/+yOSq6xu6BPuf+QdfZPdDnbHt0jR2H86XHhBBCCCHEaVCySQghhBBCbMblk02JRII1a9ZYNI8g6R26xu6BPuf+QdfZPdDnbHt0jR2Hy/fZJIQQQggh9uPyNZuEEEIIIcR+KNkkhBBCCCE2Q8kmIYQQQgixGUo2CSGEEEKIzbh8srl9+3bExcVBKpUiNTUVR44csXeRnMaBAwcwY8YMREREgOM4fPXVV2bPM8awevVqhIeHw9PTE2lpabhw4YLZPrW1tVi4cCH8/Pwgl8uxePFiNDY29uO7INZCsdR7FEvkehRLvUex5JxcOtncuXMnVq5ciTVr1uD48eNISkpCeno6Kisr7V00p9DU1ISkpCRs3769w+dfe+01bN26FTt27EBOTg68vb2Rnp4OtVpt2mfhwoU4e/YsfvrpJ3z33Xc4cOAAlixZ0l9vgVgJxVLfUCwRI4qlvqFYclLMhaWkpLBly5aZftbr9SwiIoKtX7/ejqVyTgDYrl27TD/zPM/CwsLYpk2bTNvq6+uZRCJhH3/8MWOMsfz8fAaA5ebmmvbZs2cP4ziOlZaW9lvZSd9RLFkPxZJ7o1iyHool5+GyNZtarRbHjh1DWlqaaZtAIEBaWhqys7PtWDLXUFRUhIqKCrPrK5PJkJqaarq+2dnZkMvlSE5ONu2TlpYGgUCAnJycfi8z6R2KJduiWHIfFEu2RbHkuFw22ayuroZer0doaKjZ9tDQUFRUVNipVK7DeA27ur4VFRUICQkxe14kEiEgIIA+AydCsWRbFEvug2LJtiiWHJfLJpuEEEIIIcT+XDbZDAoKglAohEKhMNuuUCgQFhZmp1K5DuM17Or6hoWFtev0rtPpUFtbS5+BE6FYsi2KJfdBsWRbFEuOy2WTTbFYjLFjxyIrK8u0jed5ZGVlYcKECXYsmWuIj49HWFiY2fVVKpXIyckxXd8JEyagvr4ex44dM+3z888/g+d5pKam9nuZSe9QLNkWxZL7oFiyLYolB2bvEUq29MknnzCJRMIyMzNZfn4+W7JkCZPL5ayiosLeRXMKKpWKnThxgp04cYIBYJs3b2YnTpxgV65cYYwxtmHDBiaXy9nXX3/NTp06xe666y4WHx/PWlpaTOeYNm0aGz16NMvJyWEHDx5kgwcPZgsWLLDXWyK9RLHUNxRLxIhiqW8olpyTSyebjDH25ptvspiYGCYWi1lKSgo7fPiwvYvkNPbv388AtHtkZGQwxgzTTLz44ossNDSUSSQSNnXqVFZYWGh2jpqaGrZgwQLm4+PD/Pz82KJFi5hKpbLDuyF9RbHUexRL5HoUS71HseScOMYY6+/aVEIIIYQQ4h5cts8mIYQQQgixP0o2CSGEEEKIzVCySQghhBBCbIaSTUIIIYQQYjOUbBJCCCGEEJuhZJMQQgghhNgMJZuEEEIIIcRmKNkkhBBCCCE2Q8kmIYQQQgixGUo2CSGEEEKIzVCySQghhBBCbIaSTUIIIYQQYjOUbBJCCCGEEJuhZJMQQgghhNgMJZuEEEIIIcRmKNkkhBBCCCE2Q8kmIYQQQgixGUo2CSGEEEKIzVCySQghhBBCbIaSTUIIIYQQYjM2TzYPHTqEtWvXor6+3q7n6Mzp06cxZ84cxMbGQiqVIjIyEnfccQfefPNNq7+Wq7Hl50K65shxlZmZCY7jcPToUaue19VQ/NiPM8SP8SESiRAZGYkHHngApaWlVn0tV0Wx5Xj6Jdlct25dn4O6r+fo7LzJyck4efIkHn74YWzbtg0PPfQQBAIB/va3v1n1tVyRrT4X0j1HjitiGbr+9uMM8fPSSy/hww8/xI4dOzB9+nT8+9//xm233Qa1Wm2T13MlFFuOR2TvAtjTK6+8AplMhtzcXMjlcrPnKisr7VOoGzQ1NcHb29vexehX7vieie242++Tu71fVzV9+nQkJycDAB566CEEBQVh48aN+Oabb3DPPffYuXTu+Xvmju/ZalgfKZVK9vjjj7PY2FgmFotZcHAwS0tLY8eOHWNr1qxhANo9ioqKGGOMFRcXs6VLl7KEhAQmlUpZQEAAmzNnjul5xli357h27RpbtGgRCwkJYWKxmA0bNoz961//sqjsiYmJbPLkyb1+78aynTt3js2dO5f5+vqygIAA9thjj7GWlhbTfpa8z+vPd/bsWbZgwQIml8vZqFGjenSO689TWFjIFi5cyPz8/FhQUBB74YUXGM/z7OrVq2zmzJnM19eXhYaGsr/+9a/tztHddbXW59LVe+5KZmYmGzFiBJNKpWzMmDHs0KFDbO7cuWzkyJGmffLz89mf//xnlpCQwDw9PVloaCi79957WVlZWbvzpaWlsfHjx7NDhw6x2267jXl5ebGBAwey3bt3M8YY2717N0tNTWVeXl4sKSmJHT161KrH31jW4OBglpiYyKKiopwurt577z0GgOXm5na5n6XxY+l7uv6cfYkhR4gfS87R3fvtiiXxw5jlMUTxY/v4+e677xgA9uqrr3Z7Dke8N1kjrhije5O9Y6ursnalzzWbjzzyCD7//HMsX74cw4YNQ01NDQ4ePIhz587h7rvvxvnz5/Hxxx/jjTfeQFBQEAAgODgYAJCbm4tDhw5h/vz5iIqKQnFxMf7xj39g8uTJyM/Ph5eXV5fnUCgUGD9+PDiOw/LlyxEcHIw9e/Zg8eLFUCqVeOKJJ7ose2xsLLKzs3HmzBkMHz6819fgnnvuQVxcHNavX4/Dhw9j69atqKurwwcffGDx+7ze3LlzMXjwYLz66qtgjPXqHAAwb948DB06FBs2bMDu3bvx8ssvIyAgAG+99RZuv/12bNy4Ef/5z3/w9NNPY9y4cbj11lsBwKLrau3PpaP33Jn169fj+eefx+zZs7FixQrk5eVh5syZkMlkGD9+vGm/d999F0VFRbj//vsRFhaGU6dO4a233oJCocC+ffvMznnq1CkEBgZi3rx5WLx4MWbPno1XX30V9957LzZu3IhNmzbh4Ycfxl133YVXX30VDz74IE6ePGm1428s66ZNm1BYWIiYmBj8/e9/d6q46qnu4sfS93Q9a8SQveLH0nN09347Y2n8AJbHEMWP7eOnuLgYAODv72/xMY54b+ptXAF0b3KE2OqqrF3qUWraAZlMxpYtW9bp85s2bWr3jd2oubm53bbs7GwGgH3wwQfdnmPx4sUsPDycVVdXm22fP38+k8lkHZ7/ej/++CMTCoVMKBSyCRMmsGeffZb98MMPTKvVdnmckfGbz8yZM822P/roowwAO3nyZI/ep/F8CxYsaLe/pee4/jxLliwxbdPpdCwqKopxHMc2bNhg2l5XV8c8PT1ZRkaGaZul19Uan0tX77kjx44dY0KhkK1atardawJg69evN21rampqd/wLL7zABAKB2bd7hULBALDQ0FCzb2tbt25lANiQIUNYQ0ODafvKlSsZx3FMrVZb5fiOyiqTyVhycnK7sho5clz1tGazu/jpyXuyRgzZO356cg5bxg9jlsUQxY/5OawVP/v27WNVVVWspKSEff755yw4OJhJJBJWUlLS5fGMOea9qa9xxRjdm4zsGVudlbU7fR4gJJfLkZOTg7Kysh4f6+npafp3a2srampqMGjQIMjlchw/frzLYxlj+OKLLzBjxgwwxlBdXW16pKeno6Ghodtz3HHHHcjOzsbMmTNx8uRJvPbaa0hPT0dkZCS++eYbi9/HsmXLzH5esWIFAOD777/v1ft85JFH2m3rzbV66KGHTP8WCoVITk4GYwyLFy82bZfL5UhMTMTly5cB9P269vb4jt5zR1599VWEh4dj3bp1ZtsnTZoEABgxYoRp2/XfqOvr61FdXQ1/f3/wPA+dTmd67tSpUwCAtWvXIjw83LTdx8cHALBp0yb4+fmZtstkMggEAggEAqsc31FZ/fz8oFAo2pXVEvaOq57qLn4A+8SQPeKnt+ewRfwAlsUQxc9vrBk/aWlpCA4ORnR0NObMmQNvb2988803iIqKsvi9OOK9qTdxBdC9yVFiq7OydqfPzeivvfYaMjIyEB0djbFjx+L3v/89/vSnP2HAgAHdHtvS0oL169fjvffeQ2lpqVkVdUNDQ5fHVlVVob6+Hm+//TbefvvtDvexZJDPuHHj8OWXX0Kr1eLkyZPYtWsX3njjDcyZMwd5eXkYNmxYt+cYPHiw2c8DBw6EQCAwNXv09H3Gx8e329abaxUTE2P2s0wmg1QqNTUrXL+9pqYGQN+va2+P7+g930ij0WDPnj1YunQpPDw8zJ5rbGwE8FtA6/V6vP/++9i2bRsKCgrQ0tJi2jcoKMgUbIBh+isAmDlzptk5CwsL4enpiTvuuMNs+/nz5zFw4EBTGfp6fFdlBYDbb7/d6eKqJ7qLH8A+MWSP+OntOawdP4DlMUTx8xtrxs/27duRkJCAhoYGvPvuuzhw4AAkEolFxxo54r2pN3EF0L3peo4QWzeWtTt9TjbvueceTJo0Cbt27cKPP/6ITZs2YePGjfjyyy8xffr0Lo9dsWIF3nvvPTzxxBOYMGECZDIZOI7D/PnzwfN8l8can7/vvvuQkZHR4T4jR460+H2IxWKMGzcO48aNQ0JCAhYtWoTPPvsMa9assfgcRhzHmf3c0/d5/TfF3p4DMHxrtGQbANMfiL5e194e39F7vtGlS5fQ3NyMpKSkds9dvnwZfn5+pj9kf/rTn/Dpp58iIyMDTzzxBIKCgiAWi/HYY4+ZfcMDDN/+wsPDERERYbb95MmTGD58eLs/8CdPnjR7D309vrOyLl26FAKBABEREU4bV71xY/wA9okhe8RPb89h7fgBLI8hip/fWDN+UlJSTKPRZ82ahYkTJ+Lee+9FYWFhj27y13OEe1Nv4gqge9P17B1bHZW1O1aZ+ig8PByPPvooHn30UVRWVmLMmDF45ZVXMH369A5vHEaff/45MjIy8Prrr5u2qdXqdnNjdXSO4OBg+Pr6Qq/XIy0tzRpvw8QY4OXl5Rbtf+HCBbNvPxcvXgTP84iLiwNg+fvsijXOYYmeXNf+/lyM36qur+IHDN8qP/74Y9Mgr/z8fHz00Ud44403zDp8l5eX4/z585g2bZrZ8adOnerwj8TJkydx5513mm1rbW1FYWGh2dQjfTm+q7IWFRXhsccew+bNm10irjrTXfwAzhNDfY2fnp6jJyyNH6BnMUTx8xtbfXZCoRDr16/HlClTsG3bNjz33HMWHUf3pt4d31Pudm/qqKzd6VOfTb1e366aPCQkBBEREdBoNABgmpOqo188oVDYbnTXm2++Cb1eb7ato3MIhUL88Y9/xBdffIEzZ860O3dVVVW35d+/f3+Ho8uM/VkSExO7PQdgaO64nnH1IeM3aEvfZ1escQ5LX8fS62qrz6UzsbGxAICDBw+abd+wYQPKy8tNAX3t2jUAwKBBg0z7tLa24qGHHoJerzf75qbX65Gfn98uIKurq1FeXt5u+7lz59Da2mo6R1+P76isarUaGRkZZmV1prjqqe7ix1guZ4ihvsZPT8/RE5bGD2B5DFH89F/8TJ48GSkpKdiyZYvFE7vTvam+V8f3lLvcmzorqyX6VLOpUqkQFRWFOXPmICkpCT4+Pti3bx9yc3NN33LGjh0LAPi///s/zJ8/Hx4eHpgxYwa8vb3xhz/8AR9++CFkMhmGDRuG7Oxs7Nu3D4GBgWav09k5NmzYgP379yM1NRUPP/wwhg0bhtraWhw/fhz79u1DbW1tl+VfsWIFmpubMXv2bAwZMgRarRaHDh3Czp07ERcXh0WLFll0HYqKijBz5kxMmzYN2dnZ+Pe//417773X9GFa+j67Yo1zWMrS62qrz6UzQUFBmDZtGt5++22IRCKMHDkS+/btw7FjxwD81idm1KhR8PLywuOPP46ioiK0tLTgww8/NDXVXB9kFy5cgFqtbhd4xqkfbtxu7HBtDLS+Ht9RWTMzM1FYWAjA0OfmnXfecaq46qnu4gdwrhjqa/x4e3vb5DOwNH4Ay2OI4qd/4+eZZ57B3LlzkZmZadHAFbo30b3JmrHVWVktYvG49Q5oNBr2zDPPsKSkJObr68u8vb1ZUlIS+/vf/26231/+8hcWGRnJBAKB2XQEdXV1bNGiRSwoKIj5+Piw9PR0VlBQwGJjY9tNedDZORQKBVu2bBmLjo5mHh4eLCwsjE2dOpW9/fbb3ZZ/z5497MEHH2RDhgxhPj4+TCwWs0GDBrEVK1YwhULR7fHGqRHy8/PZnDlzmK+vL/P392fLly83mxLA0vdpPF9VVVW71+rJtersPBkZGczb27vduW+77TZ20003mW2z9Lr29XPp6j13RKFQsFmzZjE/Pz8WHh7OHn/8cbZr1y4GgB0+fNi033fffceGDBnCpFIpGzlyJHvvvffY2rVrmUgkMpvW4dNPP2UA2JkzZ8xeZ/PmzQwAq6+vN9v+7LPPMj8/P8bzvFWO76is77zzDrv55psZAKeMq55OfdRd/PTkPVkjhhwhfiw9h63ihzHLYojip3/jR6/Xs4EDB7KBAwcynU7X6Tkc8d5kjbhijO5N9oytzspqCY6xbmYpJZ1au3Yt1q1bh6qqqnYj6Uj/Wb58OXbu3Iny8nKIRG69AqtTofhxDBQ/rodiyzFQbP2mz/NsEtJfNBpNu75BBw4cwFtvvYVHHnnE7YOZkK5Q/BBiGxRb3aMrQJzGDz/8gJdeeglz5swxTRj83nvvYfTo0Xj++eftXTxCHBrFDyG2QbHVPUo2idMICAiAWCzGhg0b0NzcjLi4OPy///f/sGrVKovmQiPEnVH8EGIbFFvdoz6bhBBCCCHEZqjPJiFO5MCBA5gxYwYiIiLAcRy++uors+cZY1i9ejXCw8Ph6emJtLQ0XLhwwT6FJYQQQkDJJiFOpampCUlJSe0mazZ67bXXsHXrVuzYsQM5OTnw9vZGenq6xZNAE0IIIdbmEs3oPM+jrKwMvr6+XS5DRoglGGNQqVSIiIhot/yYI+E4Drt27cKsWbMAGModERGBp556Ck8//TQAoKGhAaGhocjMzMT8+fM7PI9GozGtrAIY4qm2thaBgYEUT6RPnCWWbIXuTcRanD6WejQrp4MqKSlhAOhBD6s+SkpK7P2r3SUAbNeuXaafL126xACwEydOmO136623sscee6zT8xgnL6YHPWz1cPRY6sq2bdtYbGwsk0gkLCUlheXk5Fh8LN2b6GHth7PGkkuMRvf19QUAlJSUwM/Pz86lIc5OqVQiOjra9HvlLCoqKgAAoaGhZttDQ0NNz3Vk1apVWLlypennhoYGxMTEUDyRPnPWWDLauXMnVq5ciR07diA1NRVbtmxBeno6CgsLERIS0u3xdG8i1uLsseQSyaaxecLPz8/tA7q+WQuZpwc12ViBu1xDiUQCiUTSbjvFU8cYY6hSaRDsK3Gb35G+ctbrtHnzZjz88MNYtGgRAGDHjh3YvXs33n33XTz33HPdHt/Zvam2SYuaRk1nh1nM/LJy4DhAwHHgAAgFhp+FAg4igQBioQAeIg4SkRBCgXN+HsR5Y8klkk1i8P6hYqz99iwmDgrC1vmj4e8ttneRSD8KCwsDACgUCoSHh5u2KxQKjBo1yk6lci1nShuw9puzOHqlDmlDQ/DGvFHwlXrYu1jEBrRaLY4dO4ZVq1aZtgkEAqSlpSE7O7vDY27s/6xUKjvcb2duCTbuLbBugXtALBTARyqCr1QEfy8xQnwliPT3RHyQNxJDfTEySg5PsdBu5SOuh5JNF3HoUjVe+i4fjAH/vVCNe/+Zg90rJkJA32DdRnx8PMLCwpCVlWVKLpVKJXJycrB06VL7Fs4FNGt1WJSZiyqVIZnYd64S9/0zB18+egvVFLmg6upq6PX6DrulFBR0nCiuX78e69at6/bcUg8BAnpZGcBuGNPLADD223bGDNv0PAPPGPQ8g443P0ar51HbpEVtkxZXaprbvYZIwGFsrD+mDw/D7NFRkHnRFyrSN5RsugDGGFZ/fRZ6niFtaCiyL1XjXLkSJ6/VY3SMv72LR6yosbERFy9eNP1cVFSEvLw8BAQEICYmBk888QRefvllDB48GPHx8XjxxRcRERFhGrFOeu/9Q1dQpdIgOsATL80cjsc/OYGT1xrw1YlS/HFslL2LRxzAjf2fjf3sbrTolngsuiW+38rFmCHhbNXzULfyaGnVo0mjQ0NLK2oatahSqVFS14JLlY04U9YAhVKDnKJa5BTVYsPeAtw/PhbLpgyC3Itay0jvULLpAs6WKXGxshESkQBvzEvC87vO4NuTZdh7toKSTRdz9OhRTJkyxfSz8caWkZGBzMxMPPvss2hqasKSJUtQX1+PiRMnYu/evZBKpfYqskto1Oiw49dLAIAnpiZgypAQLJ08CBv3FuCNfefxh6RwSETU7OhKgoKCIBQKoVAozLYrFApTl5Ubddb/2d44joOHkIOHUIDu8kXGGEpqW/DTOQU+O1qCggoV3vlvEXadKMOmOSMxZUj3A6MIuZETTtZEbrTrRCkA4I5hofCVemDaTYY/hD+cqWjX5EKc2+TJk8EYa/fIzMwEYLipvPTSS6ioqIBarca+ffuQkJBg30K7gP0FlWhoaUVsoBdmjY4EADxwcxxCfCW4VteC3afK7VxCYm1isRhjx45FVlaWaRvP88jKysKECRPsWDLb4jgOMYFeWDwxHnsen4T3Fo3D4BAfVDdqsCgzF/86WGTvIhInRMmmk9PzDN+cLAMAzBpluAlOTgyGWCRAcU0zChUqexaPEJeQdc5QuzVteJipf6anWIiFqbEAgC+OX7Nb2YjtrFy5Eu+88w7ef/99nDt3DkuXLkVTU5NpdLqr4zgOUxJD8O2KibhvfAwA4C/f5Ztq+QmxFCWbTi6vpA5VKg1knh64NSEYAOAtEWHCgEAAwJGiWnsWjxCnp9Pz2F9YBQBIG2o+WOTuMYYveIcu1aCsvqXfy0Zsa968efjrX/+K1atXY9SoUcjLy8PevXvbDRpydVIPIf5y13A8k54IANiwpwB7TlNtPrEcJZtO7uCFGgDAxEFBEIt++ziHRxrmdDtX3vHUG4QQyxy9UoeGllb4e3lgzA19oKMDvDB+QAAY+607C3Ety5cvx5UrV6DRaJCTk4PU1FR7F8kuOI7DsimD8MDNcQCAZz4/hVL6gkUsRMmmk/vfxWoAwMTBQWbbh4Ybks38cmpGJ6Qvfmmr1ZySGNLhFEd3jzGMRKd+m8QdvPiHYUiO9UejRofnvjhF4wKIRSjZdGJNGh2OX60DYKjZvJ4x2SysUELP0x8DQnrr+BVDjI0fGNjh83cMDYWAA/LLlSipbT9nISGuRCjg8NqckZCIBPjvhWp8f7rzpXAJMaJk04nlFNVAxzPEBHghOsDL7Lm4QG9IPQRQt/Ioqm6yUwkJcW6teh6nSusBoF0TupG/txgp8QEAgB/zFR3uQ4grGRDsg0duGwgA2PxTIXR63s4lIo6Okk0nduiiob/mLYPa17gIBRyGhFG/TUL64ly5EupWHjJPDwwI8u50v3TjdGNnqZaHuIeHJsVD7uWBS1VN1F+ZdIuSTSeWW2wYaZ4a33HznrEpnZJNQnrnxNV6AMCoaHmXS7/eMcwwOvlocS3qmrT9UTRC7MpX6mGq3fzXwSLqu0m6RMmmk2rS6HCmzJBEjmtrwrvR0HBfAEBhBQ0SIqQ3jH2iO2tCN4ry98KQMF/wDDhwoao/ikaI3S0YFwOphwAFFSrkFtfZuzjEgVGy6aROXK2HnmeIlHsiUu7Z4T7xbc1+V2jQAiG9kldSDwAYHSPvdl/jMn77CyptWCJCHIfMywOz21bU+iC72L6FIQ6Nkk0ndaTI0F9zXFznNS6xAYZk82ptM3gakU5IjyjVrbhSY/iiNjJK1u3+UxINyeav56toBgjiNu4fHwfA0F+5obnVvoUhDouSTSd1pK2/ZmdN6AAQIZdCJOCg1fGoUKr7q2iEuISCtjlqI2RSyL3E3e4/JkYOmacH6ppbkVdCTYrEPQyL8ENiqC9a9YwGyJFOUbLphLQ63jRwISWu82RTJBQg0t/QxG6soSGEWMY4sM440K47IqHAtGTs/gLqt0ncx4ykcADAt6fK7FwS4qgcItk8cOAAZsyYgYiICHAch6+++sreRXJop0sboNHx8PfywKAQny73jWmbf/NqLc21SUhP5LcNwBsWYVmyCQBTEg3J5i/nqd8mcR9/GBkBADh0qQY1jRo7l4Y4IodINpuampCUlITt27fbuyhOwTjlUXJcADiu8+lYACA20JBsUs0mIT1zrqIt2bSwZhOAqWbzTKkSldR1hbiJuCBv3BThBz3PkEUD5EgHHCLZnD59Ol5++WXMnj3b3kVxCrlFhmSzqyZ0I+MgIRqRTojldHoeBW1ThlnajA4AQT4SJLUNJvrlPDWlE/cxtW02hgP0e0864BDJZk9pNBoolUqzh7vgeYajbWs1dzU4yCimrWbzKtVsEmKxy9VN0Op4eIuFpq4olpqcSFMgEfdzW1sXkv9eqKblK0k7Tplsrl+/HjKZzPSIjo62d5H6zflKFRpaWuHpIcRNFvQliwtsq9msoT6bhFjKuBBCQphvlysHdeT2thqe/16ohlZHN13iHpKi5PCTitDQ0oqT1xrsXRziYJwy2Vy1ahUaGhpMj5KSEnsXqd9kXzLMr5kc5w8PYfcfn7FWRqnW0RxohFjovMKQbA4J8+3xsSMiZQjykaBRozP1rybE1YmEAkwabKjd/LWQavWJOadMNiUSCfz8/Mwe7sKYbE4Y2PF66DfyFAsR4G2YI7CsocVm5SLElRhrNgeH9DzZFAg43D7EcNPdd05h1XIR4sgmDQ4CAGRfrrFzSYijccpk013peYactsFBEwZYlmwChsndAaC0jpJNQixxobIRAJDYi5pNALh9SCgAIOtcJRij1YSIe0hpG0dwsqQB6la9nUtDHIlDJJuNjY3Iy8tDXl4eAKCoqAh5eXm4evWqfQvmYM6VK9HQ0gofiQgjIrtfPs/IuHY61WwS0j11qx7FbX2cB4d2PY9tZyYNDoJYJMDV2macVzRas3iEOKz4IG8E+Uig1fM4WVJv7+IQByKydwEA4OjRo5gyZYrp55UrVwIAMjIykJmZaadSOR5jE3pKfABEFvTXNIpoSzZL6ynZJKQ7FysbwRjg7+WBYB9Jr87hLRFh4qAg/FxQiR/OVvS6hpQQZ8JxHFLi/fH96QrkFtcitQctcM6gUaODQqlGTaMWtU1aNLRooVLr0KjRoVmrR4tWj5ZWPTQ6HlqdHq16hlY9D52eQc8z6HgeemaYVYZnDDwDGDP8mzEY/g/g/34/FFOHhtr77VqVQySbkydPpqYmCxy4YJi/7GYL+2samWo262mSaUK6YxwclBDq2+2iCV2ZdlOYKdl8bOpgaxWPEIc2Li4A35+uwJHiOnsXpdcqVWrkXa1HfrkSFyobUVTVhJK6ZqjUun55/f56nf7kEMkm6V6TRoecy4b+mlPaplaxVIQp2aSaTUK6U3hdstkXU4eGQMABZ8uUKKltRnQP5+skxBmNa1ts5PiVOuh5BmEPpw6zB52ex+HLtfgpvwL/vVCNy9WdTxXoIxEhyEcMf28x/L3E8JWK4C0RwVsshKdYBKmHABKREGKRABKhACIhB6GAg0jQ9m+Og0AACDjDdg4cBBwAzrANAAYG9677jiOjZNNJHLpUA62eR3SAJwYEeffoWEo2CbHchbY+lgm97K9pFOgjQUp8AA5frsWeM+VYcutAaxSPEIc2NNwPXmIhGjU6XKpq7POXNltSKNX4ILsYnx69hirVb2u6cxyQEOKLEVEyJIb6YkCwN2ICvBAh94S3hNKm3qCr5iR+aZu3bEpiSI+b9oyj0RVKNVr1vEXzcxLirozN6IOtcJO8c2QEDl+uxTcnyyjZJG5BKOAwPEKGI8W1OFlS75DJZm2TFluzLuCjnKvQtq125O/lgfSbwnD7kBCMHxgIP6mHnUvpWijZdAKMMdPSd1MSe9aEDgBB3hKIhQJo9TwqGtTUnEdIJ5o0OlxrmyLMGjfJ3w8Pw9pvzuJMqRKXqxoxwAWbxwi5UVJ0W7J5rR5zkx1nhT/GGL44XoqXd+ejvm2Rk3Fx/njwlnhMHRoKsYgqYmyFrqwTOFFSj7IGNbzFQosnc7+eQMCZajepKZ2Qzl1sm18zyEdsWgyhLwJ9JKaJrr85Wdbn8xHiDEZGyQEApxxo2comjQ4rPj6Bpz87ifrmVgwJ88V/HkrFZ4/cjOkjwinRtDG6uk5g96lyAEDasFBIPYS9OgdNf0RI94yDg3qzclBnZiZFAAB2nSilWTeIW0hqSzbPlSuh0dl/cveKBjXm7sjGd6fKIRJweCY9Ed+tmIhbBgXZu2hug5JNB8fzDN+fNiSbd44I7/V5wmWGZLO8gaY/IqQzF0wj0a3X3D1teBh8JCJcqWk2rQBGiCuLDvCEv5cHWvUM58pVdi1LWX0L5r2djfxyJYJ8xNj55wlYNmVQj+aqJn1HV9vB5RbXorxBDR+JCLcmBPf6PNSMTkj3jKv9WGNwkJGXWIQZSYYvijtzS6x2XkIcFcdxGNFWu3n6Wr3dylHbpMXCf+bgSk0zYgK8sOvRWzA21t9u5XFnlGw6uI+PGJbs/P2IsF43oQNUs0mIJS5YaY7NG80bFwMA+P50ORraBiYQ4spuivADAOTbqWZTo9Pjzx8eRVF1EyLlnvh4yXgaHGtHlGw6sNomLb4/UwEAWJga26dzhVPNpltYu3YtOI4zewwZMsTexXIKSnUrytq+jFmzGR0AkqJkGBruB42Ox8e5V616bkIc0W/JptIur7/++wLkFtfBVypC5qJxppX0iH1QsunAPj9WAq2Ox/BIP4yMkvXpXBFUs+k2brrpJpSXl5seBw8etHeRnML5CkMNTJifFHKvvo9Evx7HcXjwljgAwPuHitHaNrcfIa5qWLgh2SwoV0LXz7/vP56tQOahYgDA3+aPsmq3GNI7lGw6KHWrHv/8bxEA4P7xsX1aoxn4rc9mQ0srmjSut+4q+Y1IJEJYWJjpERTU9YhLjUYDpVJp9nBHBW3JZmKYbW5MM5IiEOQjRnmDGnvaWiwIcVWxgd7wEguh0fEorul8+Udrq2/W4vldpwEAD0+Kx+1DQvvttUnnKNl0UJ8cuYpKlQaRck/MHh3V5/P5Sj3g27bMVnkDNaW7sgsXLiAiIgIDBgzAwoULcfVq182269evh0wmMz2iox1nEub+ZFw5aIiNkk2phxD3j48DAGz7+QJ4nqZBIq5LKOBMsXS2rP++wL76/TlUN2oxMNgbT6cn9tvrkq5RsumAVOpW/P2XSwCApZMHWm2y2d/6bVJTuqtKTU1FZmYm9u7di3/84x8oKirCpEmToFJ13kl/1apVaGhoMD1KStxzxLStazYB4IFb4uArFeG8opFqN4nLuynC0P2rv/pt5pXU49Oj1wAAG/84EhJR7wfVEuuiZNMBvf7jeVSqNIgL9MLc5L7Xahr9NiKdajZd1fTp0zF37lyMHDkS6enp+P7771FfX49PP/2002MkEgn8/PzMHu6GMYbCfkg2ZZ4eWDwxHgDw+k+F1HeTuLRhxkFC/VCzyRjDK7vzAQB/HBOF5LgAm78msRwlmw4mt7gWH2QXAwBenjXCqt/MIqhm0+3I5XIkJCTg4sWL9i6KQ1MoNWhoaYVQwGFQiG3XL39wYjwCvMW4XNWED7Ov2PS1SO/FxcW1m9lhw4YN9i6WUzE2oxu/yNnSvnOVyC2ug9RDgKfTE2z+eqRnKNl0IJVKNR79z3HwDLh7dCQmDrbuUlpUs+l+GhsbcenSJYSH9371KXdQUGGoeYkP8rZ505uf1ANP/87Ql2zLvvOoUmls+nqk91566SWzmR1WrFhh7yI5FeN8tZUqDWqbtDZ7HcYY/pZ1HgDwwM3xpnsdcRyUbDqI2iYtMt7LRZVKg4RQH/xl1nCrv0a4jGo2Xd3TTz+NX3/9FcXFxTh06BBmz54NoVCIBQsW2LtoDs04gGFoeP90IZg3Lho3RfhBqdbhxa/O0JrpDsrX19dsZgdvb297F8mpeEtEiGmbSN34hc4WfimswplSJbzEQiy5dYDNXof0HiWbDuByVSPmvZWNc+VKBPlI8Nb9yfBuGzluTcZJbWlid9d17do1LFiwAImJibjnnnsQGBiIw4cPIzi490udugNjnzLjRNS2JhRweG3OSIgEHPaercBXeaX98rqkZzZs2IDAwECMHj0amzZtgk7X9bRxNI1Ye4n90JT+918M3YTuGx+LAG/rzpFLrMP6GQ2xmE7P48PDV/D6j+fRqNEhxFeCjx4ej/gg23x7jvQ3JJul9S1gjPV57k7ieD755BN7F8EpnS1rANB/yabhtWR4bOpgbP7pPJ7/8gyGhctsOjiJ9Mxjjz2GMWPGICAgAIcOHcKqVatQXl6OzZs3d3rM+vXrsW7dun4speMbEuaLn/IVNks2T19rQG5xHUQCzjT4jjgeh6rZ3L59O+Li4iCVSpGamoojR47Yu0g2UdGgxjsHLmPyX3/Bum/z0ajRISUuAN+tmGjTwQnhMk9wHKDR8aixYf8ZQpyJSt2K4ppmAL9N1dJflk0ZhEmDg9DSqsdDH+SiUkVdXGzpueeeazfo58ZHQUEBAGDlypWYPHkyRo4ciUceeQSvv/463nzzTWg0nfexpWnE2hsS1raSkI2Szff+Z1j85A8jwxHqJ7XJa5C+c5iazZ07d2LlypXYsWMHUlNTsWXLFqSnp6OwsBAhISH2Ll6PMcbQrNWjUqVBWX0LLlc34Vy5Esev1JkFXYC3GE/9LgHzx8VAKLBtTaNYJECIrwQKpQaldS0I8pHY9PUIcQbnyg3xGC6T9nsTnFDA4W/zR2PW9v/ham0zMt7NxUcPpcKfmgJt4qmnnsIDDzzQ5T4DBnTc5y81NRU6nQ7FxcVITOx4snCJRAKJhP6uXu/6ZnSeZxBY8T5X06jBt6fKAACLbqFaTUfmMMnm5s2b8fDDD2PRokUAgB07dmD37t1499138dxzz5ntq9FozL5ddtUv5sWvzqCuuftaPNbJDwwMjAGMATxj4JkhkeQZg54ZmsJ1egaNnoemVY+WVj2aNDoo1TpodZ3PoZcc64+7x0Th7jGRkHr038SzkXJPQ7JZ34KkaHm/vW5fGBP3umYtGlpaoVLr0KTRoUmrh7pVD02rHhodD62eR6uOQcfzaNUz6HkeOp6B5w2f242fn9RDiJfusv5ALOJc7NGEfr0AbzE+XJyCP/7D0G/7nrey8cHiFBpRawPBwcG97r+cl5cHgUDglJUf9hQX6AWxSICWVj1K6poRG2i9bmJfHi9Fq54hKUrmNPczd+UQyaZWq8WxY8ewatUq0zaBQIC0tDRkZ2e3278n/WKyzilQ1mC/pilPDyHC5VLEBXpjcKgPkqLkSI0PQKCdahUj/b1w/Go9Susca5AQzzNcrm5CQYUSFysbcaWmGaV1LShXtqBKpYG61fqTX/tKRZRsEtNI9GH93IR+vdhAb3z8cCru/9cRXKhsxIw3D2LbvWMwfkCg3crkzrKzs5GTk4MpU6bA19cX2dnZePLJJ3HffffB39/f3sVzKiKhAINDfHC2TInCCpXVkk3GGD7JNSzFO29cjFXOSWzHIZLN6upq6PV6hIaGmm0PDQ019Z+53qpVq7By5UrTz0qlstP1nJ9IS0CTtv0Iws4q8q8fNGP8J9f2g4ADOBj+LxBwEAk4CAUcPIQCeAgFkHoIIPUQwlssgq9UhABvMbzEQocaiGOc2L3UziPSGWM4r2jEzwWVOHSpGieu1qNR0/VIT7FQAJmXB3ylIvhIRPASC+HpIYREJITEQwCxUAAPkQAeAg5CgQAeQs70OXEcByHHgeNg+Bw5DhIrLQNKnFteST0AICnKfskmAAwO9cVnj0zAwx8cRUGFCgveOYwHb4nHk3ckwMcGs1OQzkkkEnzyySdYu3YtNBoN4uPj8eSTT5rdd4jlEkN9Tcnm724Ks8o5j12pw6WqJnh6CDEjieYRdnRO+ResJ/1i7hnXcRLqrqLapj+6ZqeazepGDT47eg2fHyvBpaoms+c8PYRICPNFQogP4oK8ER3ghQiZFCG+UgT6OF7iTpxfQ0srLlY2AgBGOUAzXHSAF7589Gas+fosPjt2Df86WISv88qwbMpAzB8XA08xrfXcH8aMGYPDhw/buxguw9hvs0BhvUFCXxw3TBd258hw+Eo9rHZeYhsOkWwGBQVBKBRCoVCYbVcoFAgLs863IGJgnP6ov+farFSq8ebPF7HzaImpL6tYKMDNgwJxW0IwUuMDkRDqA5GQahtJ/zl1rR4AEBPgZbeuLTfyEouwaW4Sfj8iHOu+PYvimmas+zYfW/ZdwB/HROGuUREYGSWjL17EaSS0JZvnrTQiXaPTY3fbwKC7R0da5ZzEthwi2RSLxRg7diyysrIwa9YsAADP88jKysLy5cvtWzgXEyk3rObQX83oOj2Pfx4swtasC2jW6gEAI6NkWJgag+kjwuFH30iJHZ24Wg8AGB0jt2s5OjJlSAhuGRSET4+WYMevl3CtrgXv/q8I7/6vCKF+EtwyKAgpcQEYGSXHoBAfiKlbCHFQxjXSL1c3QaPT93lJ2F8Kq6BU6xDqJ0Eq9Wt2Cg6RbAKGOc0yMjKQnJyMlJQUbNmyBU1NTabR6cQ6jDWbhlHdrTZtfrha04zlHx/HqWuG0b6jY+R4Jj0REwYEUq0McQjG/pqO0ITeEbFIgPvGx2JBSgwOnK/CF8evIetcJRRKDb48Xoov25oSRQIOMYFeiAv0RqTcE2EyKYJ9JQj0FkPu5QE/qQd8pCJ4S0Tw9BDCg1oQSD8K85PCTyqCUq3DpcomDOvjzA9ft624ddeoSJtPGUisw2GSzXnz5qGqqgqrV69GRUUFRo0ahb1797YbNET6xkcigr+XB+qaW1FS24JhEbZJNg+cr8Kyj45DpdZB5umBF+4cijljoyjJJA6DMWZKNkfHOPYIY6GAw5QhIZgyJATqVj1yi2tx+HINjl2pw9lSJVQaHS5XNeHyDf2gOyMSGAbISTyE8BByELUNqBMJBRAJOAg4w+BHgYADB8OgOgFn2A7Df+DaBkxynOHff52bRNM1kQ5xHIfEMF/kFtehUKHsU7LZrNXh54JKAMDMpAhrFZHYmMMkmwCwfPlyajbvB7GB3qhrrseVmr5/w+zIrhPX8Mxnp6DjGcbG+uPNBaMRIaebEHEsFyobUdukhdRDgKHhzrNMpNRDiEmDgzFpsGG+SMYYyhvUKKpuMkwZVt+MigYNqhs1qG3Sor5FC5VaB5VaBz1vmERYxzPotHo0tXVtsQZbTE9GXMeQMD/kFtf1eSWhnwsqoW7lERvoZbe5cUnPOVSySfpHXKAX8krqTUv0WdOXx6/hqc9OgjFg1qgIbJwzss/9cwixhexLNQCA5NgAp/4d5TgOEXJPRMg9ccugzvdjjEGj46Fu1UPdavi/Vs9Dq+PRqjcsgNCq58HzgJ4ZFkPQ88y0GAJgXBThusUu2s4LAMG+jjHAijimIW1f6IwrdvXW96fLAQDTh4dTS5kToWTTDRkn1b1SY1mTm6X2F1Ti6bZEc2FqDP5y13CrLk1GiDUZk80JA91jgAHHcZB6CPt1xTJCjIaGt62RXt75in/dub4J/c4RNLemM6Fe4m4oLsgwIv2KFWs2CyqUWP7RcfAM+OOYKEo0iUPjeYbDRYZkk1bpIcT2EkN9wXFApUqDmkZN9wd04MD5KqhbeUQHeGJ4JDWhOxNKNt1QTIB1azZV6lY8+u/jaNLqcfPAQKy/ewQlmsShFVSoUN/cCi+xECPtvHIQIe7AWyJCbIChoqO3Tek/nDXMxZ0+LIya0J0MJZtuKC7QEPBlDWqoW/s+QODFr87gcnUTwmVSbLt3DM33Rxzer+erAACp8QE0DRAh/cTUlF7R86Z0rY5H1rm2ZHM4LfbibOivrBsK8BbDt22t5ZLavjWlf3+6HF/llUHAAdvuHYMAb7E1ikiITe1ru2lNHUpTqxHSX4zJZn4v+m0evlwDpVqHIB8xxjj4VGWkPUo23RDHcYht67fZlxHpdU1avPDVGQDA0skDMTaW/gAQx1fdqMHxq3UAgKlDQ+xcGkLchynZLOt5svljfgUA4I5hoTSRuxOiZNNNGUekF1U39vocG/cWoLZJi4RQHzw2dbC1ikaITf1cUAnGgBGRMpqEnJB+ZOwffaGyES09mOOV5xl+yje0RvzuJmpCd0aUbLqphBDDnGeFFb1LNo9frcMnuSUAgFdmj3DqeQqJe/nhjKGGJI2a0AnpV6F+UoT4SqDnWY+a0k+VNkCh1MBbLMTNbjJVmauhZNNNGSfY7U1HbcYYXvo2HwAwZ2wUxsUFWLVshNhKlUqDX9oGB905kmpICOlvxtrN09fqLT7mx7OGL4iTE0OoYsNJUbLppoaEGZLNC5WN0Ol7tszct6fKkVdSDy+xEM+mJ9qieITYxNd5pdDzDKOi5RgU4jxLVBLiKkZEygEYaist9aOpCZ1aI5wVJZtuKtrfC15iIbQ6HsU9mG9Tq+Px2t4CAMDS2wYixE9qqyISYlWMMXx+7BoAQ408IaT//VazaVmyebFShYuVjfAQcpgyhAb0OStKNt2UQMAhMczYlG75BLuf5F7FtboWBPtKsHhSvK2KR4jV5RTVoqBCBbFIgBkjI+xdHELc0vBIQ7J5saoRjRpdt/sbJ3K/ZVAQ/KQeNi0bsR1KNt2YsSm9wMLVHFq0emzNuggAeOz2QfASi2xWNkKs7R+/XAIA3JMcBZkX3bQIsYdgXwmi/D3BGHDsSl23++9tG9A3jUahOzVKNt3YkLCerebwQXYxqhs1iPL3xLxxMbYsGiFWdbasAb+er4KAA5ZMGmjv4hDi1sYPMIwoP3y5psv9Smqbcbq0AQIOSBtG/TWdGSWbbuymCEOymVdSD8ZYl/s2anTY8auhZujxqYNpSUriNBhj+Mt3htkT7hwZgZi25VoJIfaRGm+YwSSnm2Tzm5NlbfsHIshHYvNyEduhjMGNjYiSQeohQHWjFhcru55vM/N/RahrbsWAIG/MHh3ZTyUkpO92ny7H4cu1kIgENHsCIQ7AWLN56loDmrrot/lNniHZnDWa+lg7O0o23ZhEJERyrOEbZnYX3zAbmlvx1oHLAIDH0wZDJKRfG+IcyhtasPrrswAMS6pGB1CtJiH2Fh3ghUi5J3Q867TfZkGFEoUKFcRCAabdFN7PJSTWRlmDmxs/oC3ZvNR5svnOfy9DpdYhMdSXRvESp6Fu1WPFRydQ26TFTRF+eOQ26qtJiKOY0LYS0M8FlR0+/+XxUgDA5MRgGtDnAhwi2XzllVdw8803w8vLC3K53N7FcSvGgD98uQY8377fZkWDGv88aKjVfPKOBAgEXL+Wj5De0Oj0WPrvYzh6pQ6+EhG23zsGUg9aeYQQRzF9uGF0+e7T5dDfcO9p0eqxs2055LnJ0f1eNmJ9DpFsarVazJ07F0uXLrV3UdzOyCg5vMRC1DW34mgHzRmbfiiEupVHcqw/0mn1BuIEKhrUmP/2YewvrIJEJMBbfxqLuCBvexeLEHKdSYODIfP0QJVKg5wi85a1b06WoqGlFVH+nridJnJ3CQ6RbK5btw5PPvkkRowYYe+iuB0P4W8TXH94+IrZc0eKavHlCcOKKy/8YRg4jmo1ieNSt+rxr4NFuGPzrzhxtR5+UhHefWAcbh4YZO+iEUJuIBYJTLWbxoFAAKDT8/jXwSIAwJ8mxEJIrWkuwSGSzZ7SaDRQKpVmD9J790+IBQDsOV2OSqUagGGqo6c+ywNjhkmwR0XL7VhC0lPbt29HXFwcpFIpUlNTceTIEXsXySa0Oh6HL9dg3bdnccuGn/GX7/Kh0uiQFCXDN8sn4pZBlGgS4qjuGmWY2eTL46UoqjYsm/xB9hWcVzRC7uWBeck0n7OrcMolYNavX49169bZuxguY3ikDGNj/XHsSh1WfXkar949Ao9/cgIltS2IlHvixT8Ms3cRSQ/s3LkTK1euxI4dO5CamootW7YgPT0dhYWFCAlxrCYpxhgYA/SMQc8b/t3K82jV8dDqeahbeTRrdWjS6FHfrEVtkxYVSjWu1jbjUmUjzlWooNXxpvNF+Xti2ZRBuCc5mmpECHFw4wcE4LaEYPx6vgrPf3kaiyfGY/NP5wEAz6YPoYFBLoRj3c3m3UvPPfccNm7c2OU+586dw5AhQ0w/Z2Zm4oknnkB9fX2Xx2k0Gmg0GtPPSqUS0dHRaGhogJ+fX5/K7a5yi2tx3z9zoLnuxu0jEeH9B1MwNtbfjiXrf0qlEjKZzGl/n1JTUzFu3Dhs27YNAMDzPKKjo7FixQo899xz7fa3NJ6WfXQcP7WtU9wVBvM/Kdf/hWFoSzBv2N4XQT5iTBocjDtHhGNyYjBNzeVAnD2W+srd378liqub8LstB8y+NI6N9cenf55AXxiv4+y/Szar2XzqqafwwAMPdLnPgAEDenVuiUQCiYRWE7CmcXEBeOdPyVj+0XEo1TrEBXph271jMDxSZu+ikR7QarU4duwYVq1aZdomEAiQlpaG7OzsDo+xtKVAr2fQ6vlu97MWDyEHqUgIT7EQ3hIR/Dw9EOgtRqifBJFyTwwI9sGwcD/EBHjRLAmEOKm4IG+8ff9YvP7jeZwubcC85GisnjGMEk0XY7NkMzg4GMHBwbY6PbGBWxOCkftCGnR6Bm+JU/awcHvV1dXQ6/UIDTWfOSA0NBQFBQUdHrNq1SqsXLnS9LOxZvNG6+8egTUze9algoP5DYPjYNjStlnAcRBwHIRtT4gEHERCDh4CASWQhLiJyYkhmJwYgkaNDj5073FJDvGpXr16FbW1tbh69Sr0ej3y8vIAAIMGDYKPj499C+dmJCIhKNbdi6UtBf7e4n4oDSHEXVGi6boc4pNdvXo13n//fdPPo0ePBgDs378fkydP7vZ4Y7dTGpVOrMH4e2Sj7sw2FRQUBKFQCIXCvG+lQqFAWFiYReegeCLW4syxZA0US8RanD2WHCLZzMzMRGZmZq+PV6lUANBh0x8hvaVSqSCTOVefVbFYjLFjxyIrKwuzZs0CYBgglJWVheXLl1t0DoonYm3OGEvWQLFErM1ZY8lmo9H7E8/zKCsrg6+vb7uJx439z0pKSpxyBJczcLVrzBiDSqVCREQEBALnG9m8c+dOZGRk4K233kJKSgq2bNmCTz/9FAUFBe36cnaks3hytc/ZUbnSdXb2WOorujfZlytdY2ePJYeo2ewrgUCAqKioLvfx8/Nz+l82R+dK19gZvzkazZs3D1VVVVi9ejUqKiowatQo7N2716JEE+g+nlzpc3ZkrnKdnTmW+oruTY7BVa6xM8eSSySbhBBzy5cvt7jZnBBCCLEl56uLJYQQQgghTsPlk02JRII1a9bQJPA2RNfYPdDn3D/oOrsH+pxtj66x43CJAUKEEEIIIcQxuXzNJiGEEEIIsR9KNgkhhBBCiM1QskkIIYQQQmyGkk1CCCGEEGIzlGwSQgghhBCbcflkc/v27YiLi4NUKkVqaiqOHDli7yI5jQMHDmDGjBmIiIgAx3H46quvzJ5njGH16tUIDw+Hp6cn0tLScOHCBbN9amtrsXDhQvj5+UEul2Px4sVobGzsx3dBrIViqfcolsj1KJZ6j2LJObl0srlz506sXLkSa9aswfHjx5GUlIT09HRUVlbau2hOoampCUlJSdi+fXuHz7/22mvYunUrduzYgZycHHh7eyM9PR1qtdq0z8KFC3H27Fn89NNP+O6773DgwAEsWbKkv94CsRKKpb6hWCJGFEt9Q7HkpJgLS0lJYcuWLTP9rNfrWUREBFu/fr0dS+WcALBdu3aZfuZ5noWFhbFNmzaZttXX1zOJRMI+/vhjxhhj+fn5DADLzc017bNnzx7GcRwrLS3tt7KTvqNYsh6KJfdGsWQ9FEvOw2VrNrVaLY4dO4a0tDTTNoFAgLS0NGRnZ9uxZK6hqKgIFRUVZtdXJpMhNTXVdH2zs7Mhl8uRnJxs2ictLQ0CgQA5OTn9XmbSOxRLtkWx5D4olmyLYslxuWyyWV1dDb1ej9DQULPtoaGhqKiosFOpXIfxGnZ1fSsqKhASEmL2vEgkQkBAAH0GToRiybYoltwHxZJtUSw5LpdNNgkhhBBCiP25bLIZFBQEoVAIhUJhtl2hUCAsLMxOpXIdxmvY1fUNCwtr1+ldp9OhtraWPgMnQrFkWxRL7oNiybYolhyXyyabYrEYY8eORVZWlmkbz/PIysrChAkT7Fgy1xAfH4+wsDCz66tUKpGTk2O6vhMmTEB9fT2OHTtm2ufnn38Gz/NITU3t9zKT3qFYsi2KJfdBsWRbFEsOzN4jlGzpk08+YRKJhGVmZrL8/Hy2ZMkSJpfLWUVFhb2L5hRUKhU7ceIEO3HiBAPANm/ezE6cOMGuXLnCGGNsw4YNTC6Xs6+//pqdOnWK3XXXXSw+Pp61tLSYzjFt2jQ2evRolpOTww4ePMgGDx7MFixYYK+3RHqJYqlvKJaIEcVS31AsOSeXTjYZY+zNN99kMTExTCwWs5SUFHb48GF7F8lp7N+/nwFo98jIyGCMGaaZePHFF1loaCiTSCRs6tSprLCw0OwcNTU1bMGCBczHx4f5+fmxRYsWMZVKZYd3Q/qKYqn3KJbI9SiWeo9iyTlxjDHW37WphBBCCCHEPbhsn01CCCGEEGJ/lGwSQgghhBCboWSTEEIIIYTYDCWbhBBCCCHEZijZJIQQQgghNkPJJiGEEEIIsRlKNgkhhBBCiM1QskkIIYQQQmyGkk1CCCGEEGIzlGwSQgghhBCboWSTEEIIIYTYzP8H+x3qjm7lda4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "{\n", + " \"tags\": [\n", + " \"hide-input\",\n", + " ]\n", + "}\n", + "f,axarr = plt.subplots(3,3);\n", + "\n", + "f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')\n", + "\n", + "axarr[0,0].plot(t, solution[:,0])\n", + "\n", + "axarr[0,0].set_title('S')\n", + "\n", + "axarr[0,1].plot(t, solution[:,1])\n", + "\n", + "axarr[0,1].set_title('I')\n", + "\n", + "axarr[0,2].plot(t, solution[:,2]);\n", + "\n", + "axarr[0,2].set_title('R')\n", + "\n", + "axarr[1,0].plot(t, solution[:,3])\n", + "\n", + "axarr[1,0].set_title(r'state S parameter $beta$')\n", + "\n", + "axarr[2,0].plot(t, solution[:,4])\n", + "\n", + "axarr[2,0].set_title(r'state S parameter $gamma$')\n", + "\n", + "axarr[1,1].plot(t, solution[:,5])\n", + "\n", + "axarr[1,1].set_title(r'state I parameter $beta$')\n", + "\n", + "axarr[2,1].plot(t, solution[:,6])\n", + "\n", + "axarr[2,1].set_title(r'state I parameter $gamma$')\n", + "\n", + "axarr[1,2].plot(t, solution[:,7])\n", + "\n", + "axarr[1,2].set_title(r'state R parameter $beta$')\n", + "\n", + "axarr[2,2].plot(t, solution[:,8])\n", + "\n", + "axarr[2,2].set_title(r'state R parameter $gamma$')\n", + "\n", + "plt.tight_layout()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2f64d869", + "metadata": {}, + "source": [ + "#TODO links\n", + "This concludes the introductory example and we will be moving on to look at parameter estimation next in `estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in `transition`." + ] + }, + { + "cell_type": "markdown", + "id": "7fbd236c", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From bf8197610640ebed29e6c9cefe2a73a57f99e15a Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 12:53:56 +0100 Subject: [PATCH 066/188] reformatted with edits --- doc/doc/pygom-doc/md/getting_started.md | 73 +++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 doc/doc/pygom-doc/md/getting_started.md diff --git a/doc/doc/pygom-doc/md/getting_started.md b/doc/doc/pygom-doc/md/getting_started.md new file mode 100644 index 00000000..fd7094b7 --- /dev/null +++ b/doc/doc/pygom-doc/md/getting_started.md @@ -0,0 +1,73 @@ +# Getting started + +## What does this package do? + +The purpose of this package is to allow the end user to easily define a +set of ordinary differential equations (ODEs) and obtain information +about the ODEs by invoking the the appropriate methods. Here, we define +the set of ODEs as + +$$\frac{d \mathbf{x}}{d t} = f(\mathbf{x},\boldsymbol{\theta})$$ + +where $\mathbf{x} = \left(x_{1},x_{2},\ldots,x_{n}\right)$ is the state +vector with $d$ state and $\boldsymbol{\theta}$ the parameters of $p$ +dimension. Currently, this package allows the user to find the algebraic +expression of the ODE, Jacobian, gradient and forward sensitivity of the +ODE. A numerical output is given when all the state and parameter values +are provided. Note that the only important class is +`DeterministicOde`{.interpreted-text role="file"} where all the +functionality described previously are exposed. + +#TODO do we want this updating or referencing issue board? +The current plan is to extend the functionality to include + +- Solving the ode analytically when it is linear +- Analysis of the system via eigenvalues during the integration +- Detection of DAE + +## Obtaining the package + +The location of the package is current on GitHub and can be pulled via +https from: + + https://github.com/PublicHealthEngland/pygom.git + +#TODO required? +The package is currently as follows: + + pygom/ + bin/ + doc/ + pygom/ + loss/ + tests/ + model/ + tests/ + sbml_translate/ + utilR/ + LICENSE.txt + README.rst + requirements.txt + setup.py + +with files in each of the three main folders not shown. You can install +the package via command line: + + python setup.py install + +or locally on a user level: + + python setup.py install --user + +Please note that there are current redundant file are kept for +development purposes for the time being. + +## Testing the package + +Testing can be performed prior or after the installation. Some standard +test files can be found in their respective folder and they can be run +in the command line: + + python setup.py test + +which can be performed prior to installing the package if desired. From 3f24bfa2cebb22629f42a300d529af1974a9e87e Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 15:00:37 +0100 Subject: [PATCH 067/188] corrected reference to transition subsection --- doc/doc/pygom-doc/notebooks/sir.ipynb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/doc/doc/pygom-doc/notebooks/sir.ipynb b/doc/doc/pygom-doc/notebooks/sir.ipynb index 5f64e3d6..b429f9c5 100644 --- a/doc/doc/pygom-doc/notebooks/sir.ipynb +++ b/doc/doc/pygom-doc/notebooks/sir.ipynb @@ -103,7 +103,7 @@ "metadata": {}, "source": [ "```{note}\n", - "Here, we have invoked a class from `Transition` to define the transition object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See [defining the equations](./transition.ipynb) for an example when the input is wrong.\n", + "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`defining-the-equations` for an example when the input is wrong.\n", "```" ] }, @@ -835,14 +835,8 @@ "metadata": {}, "source": [ "#TODO links\n", - "This concludes the introductory example and we will be moving on to look at parameter estimation next in `estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in `transition`." + "This concludes the introductory example and we will be moving on to look at parameter estimation next in {doc}`estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in {doc}`transition`." ] - }, - { - "cell_type": "markdown", - "id": "7fbd236c", - "metadata": {}, - "source": [] } ], "metadata": { From b1f8145e4114027337c2237e4dae432d0503625d Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 16:33:14 +0100 Subject: [PATCH 068/188] finished transition updates --- doc/doc/pygom-doc/notebooks/sir.ipynb | 2 +- doc/doc/pygom-doc/notebooks/transition.ipynb | 516 ++++++++++++++----- 2 files changed, 379 insertions(+), 139 deletions(-) diff --git a/doc/doc/pygom-doc/notebooks/sir.ipynb b/doc/doc/pygom-doc/notebooks/sir.ipynb index b429f9c5..89e9fad2 100644 --- a/doc/doc/pygom-doc/notebooks/sir.ipynb +++ b/doc/doc/pygom-doc/notebooks/sir.ipynb @@ -103,7 +103,7 @@ "metadata": {}, "source": [ "```{note}\n", - "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`defining-the-equations` for an example when the input is wrong.\n", + "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", "```" ] }, diff --git a/doc/doc/pygom-doc/notebooks/transition.ipynb b/doc/doc/pygom-doc/notebooks/transition.ipynb index a80e94a4..d37c4e10 100644 --- a/doc/doc/pygom-doc/notebooks/transition.ipynb +++ b/doc/doc/pygom-doc/notebooks/transition.ipynb @@ -6,73 +6,107 @@ "source": [ "# Transition Object\n", "\n", - "The most important part of setting up the model is to correctly define\n", - "the set odes, which is based solely on the classes defined in\n", - "`transition`. All transitions that gets fed into the ode system needs to\n", - "be defined as a transition object, `Transition`. It takes a total of\n", - "four input arguments\n", + "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", + "\n", + "\n", + "All transitions that get fed into the ODE system need to be defined as a transition object, `Transition`. It takes a total of four input arguments:\n", "\n", "1. The origin state\n", "2. Equation that describe the process\n", "3. The type of transition\n", "4. The destination state\n", "\n", - "where the first three are mandatory. To demonstrate, we go back to the\n", - "SIR model defined previously in the section `sir`. Recall that the set\n", - "of odes are\n", + "where the first three are mandatory. To demonstrate, we go back to the SIR model defined previously in the section {doc}`sir`. Recall that the set of ODEs are\n", "\n", - "$$\\begin{aligned}\n", - "\\frac{\\partial S}{\\partial t} &= -\\beta SI \\\\\n", - "\\frac{\\partial I}{\\partial t} &= \\beta SI - \\gamma I \\\\\n", - "\\frac{\\partial R}{\\partial t} &= \\gamma I.\n", + "$$begin{aligned}\n", + " frac{d S}{d t} &= - beta SI \\\\\n", + "\\frac{d I}{d t} &= beta SI - \\gamma I \\\\\n", + "\\frac{d R}{d t} &= \\gamma I.\n", "\\end{aligned}$$\n", "\n", - "We can simply define the set of ode, as seen previously, via\n", - "\n", - "In \\[1\\]: from pygom import Transition, TransitionType, common_models\n", + "We can define the set of ODEs, as seen previously, via" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68d41d64", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType, common_models\n", "\n", - "In \\[2\\]: ode1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", - "transition_type=TransitionType.ODE)\n", + "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", "\n", - "In \\[3\\]: ode2 = Transition(origin='I', equation='beta\\*S\\*I -\n", - "gamma\\*I', transition_type=TransitionType.ODE)\n", + "ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)\n", "\n", - "In \\[4\\]: ode3 = Transition(origin='R', equation='gamma\\*I',\n", - "transition_type=TransitionType.ODE)\n", + "ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)" + ] + }, + { + "cell_type": "markdown", + "id": "d393a33a", + "metadata": {}, + "source": [ "\n", "Note that we need to state explicitly the type of equation we are\n", "inputting, which is simply of type **ODE** in this case. We can confirm\n", - "this has been entered correctly by putting it into `DeterministicOde`\n", - "\n", - "In \\[1\\]: from pygom import DeterministicOde\n", - "\n", - "In \\[2\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[3\\]: paramList = \\['beta', 'gamma'\\]\n", - "\n", - "In \\[4\\]: model = DeterministicOde(stateList, \n", - "...: paramList, ...: ode=\\[ode1, ode2, ode3\\])\n", - "\n", - "and check it\n", - "\n", - "In \\[1\\]: model.get_ode_eqn()\n", + "this has been entered correctly by putting it into `DeterministicOde`," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b0801dd", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde\n", "\n", - "An alternative print function `print_ode` is also available which may be\n", - "more suitable in other situation. The default prints the formula in a\n", - "rendered format and another which prints out the latex format which can\n", - "be used directly in a latex document. The latter is useful as it saves\n", - "typing out the formula twice, once in the code and another in documents.\n", + "stateList = ['S', 'I', 'R']\n", "\n", - "In \\[1\\]: model.print_ode(False)\n", + "paramList = ['beta', 'gamma']\n", "\n", - "In \\[2\\]: model.print_ode(True)\n", + "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])" + ] + }, + { + "cell_type": "markdown", + "id": "6e764826", + "metadata": {}, + "source": [ "\n", + "and then checking it.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5782a96f", + "metadata": {}, + "outputs": [], + "source": [ + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "c693cbc7", + "metadata": {}, + "source": [ "Now we are going to show the different ways of defining the same set of\n", - "odes.\n", - "\n", + "ODEs.\n" + ] + }, + { + "cell_type": "markdown", + "id": "fa631d9f", + "metadata": {}, + "source": [ + "(transition:defining-the-equations)=\n", "## Defining the equations\n", "\n", - "Recognizing that the set of odes defining the SIR model is the result of\n", + "We first recognize that the set of ODEs defining the SIR model are the result of\n", "two transitions,\n", "\n", "$$\\begin{aligned}\n", @@ -81,131 +115,337 @@ "\\end{aligned}$$\n", "\n", "where $S \\rightarrow I$ denotes a transition from state $S$ to state\n", - "$I$. Therefore, we can simply define our model by these two transition,\n", - "but now these two transition needs to be inputted via the `transition`\n", - "argument instead of the `ode` argument. Note that we are initializing\n", - "the model using a different class, because the stochastic implementation\n", - "has more operation on transitions.\n", + "$I$. Therefore, we can define our model by these two transitions,\n", + "but they need to be passed as the `transition`\n", + "argument instead of the `ode` argument of `DeterministicOde` or `SimulateOde`.\n", "\n", - "In \\[600\\]: from pygom import SimulateOde\n", + "```{note}\n", + "We are initializing the model using the `SimulateOde` class, rather than `DeterministicOde`, because the stochastic implementation has more available operations on transitions.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6966fc5e", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SimulateOde\n", "\n", - "In \\[601\\]: t1 = Transition(origin='S', destination='I',\n", - "equation='beta\\*S\\*I', transition_type=TransitionType.T)\n", + "t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)\n", "\n", - "In \\[602\\]: t2 = Transition(origin='I', destination='R',\n", - "equation='gamma\\*I', transition_type=TransitionType.T)\n", + "t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", "\n", - "In \\[603\\]: modelTrans = SimulateOde(stateList, \n", - ".….: paramList, .….: transition=\\[t1, t2\\])\n", + "modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])\n", "\n", - "In \\[604\\]: modelTrans.get_ode_eqn()\n", + "modelTrans.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "b896d5c9", + "metadata": {}, + "source": [ "\n", - "We can see that the resulting ode is exactly the same, as expected. The\n", - "transition matrix that defines this process can easily be visualized\n", - "using graphviz. Because only certain renderer permit the use of sub and\n", + "We can see that the resulting ODE is exactly the same, as expected. The\n", + "transition matrix that defines this process can be visualized\n", + "using graphviz. Because only certain renderers permit the use of sub and\n", "superscript, operators such as $**$ are left as they are in the\n", - "equation.\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[2\\]: f = plt.figure()\n", - "\n", - "In \\[3\\]: modelTrans.get_transition_matrix()\n", - "\n", - "@savefig sir_transition_graph.png In \\[4\\]: dot =\n", - "modelTrans.get_transition_graph()\n", - "\n", - "If we put in via the wrong argument like below (not run), then an error\n", - "will appear.\n", - "\n", - "In \\[1\\]: \\# modelTrans = DeterministicOde(stateList, paramList,\n", - "ode=\\[t1, t2\\])\n", - "\n", - "because `TranstionType` was defined explicitly as a transition instead\n", - "of an ode. The same can be observed when the wrong `TransitionType` is\n", - "used for any of the input argument.\n", + "equation." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1e17eb7c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, I*S*beta, 0],\n", + "[0, 0, I*gamma],\n", + "[0, 0, 0]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelTrans.get_transition_matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "570ceed5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nI\n\nI\n\n\n\nS->I\n\n\nβ*S*I\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nγ*I\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "# TODO why are two images produced? issue #75\n", + "modelTrans.get_transition_graph(show=False)" + ] + }, + { + "cell_type": "markdown", + "id": "5d982b87", + "metadata": {}, + "source": [ + "```{warning}\n", + "The execution will error if the incorrect `TransitionType` is used against the wrong argument.\n", "\n", - "This though, only encourages us to define the transitions carefully. We\n", - "can also pretend that the set of odes are in fact just a set of birth\n", - "process\n", + "`modelTrans = DeterministicOde(stateList, paramList, ode=[t1, t2])`\n", "\n", - "In \\[619\\]: birth1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", - "transition_type=TransitionType.B)\n", + "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde is expecting a `TransitionType.ODE` argument.\n", "\n", - "In \\[620\\]: birth2 = Transition(origin='I', equation='beta\\*S\\*I -\n", - "gamma\\*I', transition_type=TransitionType.B)\n", + "Similarly `DeterministicOde(stateList, paramList, transition=[ode1, ode2, ode3])` would fail.\n", "\n", - "In \\[621\\]: birth3 = Transition(origin='R', equation='gamma\\*I',\n", - "transition_type=TransitionType.B)\n", + "This therefore forces us to construct our model carefully.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "d590f4d5", + "metadata": {}, + "source": [ + "The third option is to reframe the system as a set of birth processes, using `transition_type=TransitionType.B`. For this simple example, this formulation takes a similar form to defining using ODE equations.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "9f24cb0a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)\n", "\n", - "In \\[622\\]: modelBirth = DeterministicOde(stateList, \n", - ".….: paramList, .….: birth_death=\\[birth1, birth2, birth3\\])\n", + "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", "\n", - "In \\[623\\]: modelBirth.get_ode_eqn()\n", + "birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)\n", "\n", - "which will yield the same set result. Alternatively, we can use the\n", - "negative of the equation but set it to be a death process. For example,\n", - "we multiply the equations for state $S$ and $R$ with a negative sign and\n", - "set the transition type to be a death process instead.\n", + "modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])\n", "\n", - "In \\[624\\]: death1 = Transition(origin='S', equation='beta\\*S\\*I',\n", - "transition_type=TransitionType.D)\n", + "modelBirth.get_ode_eqn()\n" + ] + }, + { + "cell_type": "markdown", + "id": "f1d61012", + "metadata": {}, + "source": [ + "Alternatively, we can use the negative of the equation to configure the ODEs to represent death processes. Since the death process is the removal of a flow, we take the negative of the birth process alongside using `transition_type=TransitionType.D`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9a3b3758", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)\n", "\n", - "In \\[625\\]: birth2 = Transition(origin='I', equation='beta\\*S\\*I -\n", - "gamma\\*I', transition_type=TransitionType.B)\n", + "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", "\n", - "In \\[626\\]: death3 = Transition(origin='R', equation='-gamma\\*I',\n", - "transition_type=TransitionType.D)\n", + "death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)\n", "\n", - "In \\[627\\]: modelBD = DeterministicOde(stateList, \n", - ".….: paramList, .….: birth_death=\\[death1, birth2, death3\\])\n", + "modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])\n", "\n", - "In \\[628\\]: modelBD.get_ode_eqn()\n", + "modelBD.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "1c8d48b8", + "metadata": {}, + "source": [ "\n", - "We can see that all the above ways yield the same set of ode at the end.\n", + "We can see that all four approaches have yielded the same set of ODEs at the end." + ] + }, + { + "cell_type": "markdown", + "id": "23a105af", + "metadata": {}, + "source": [ "\n", "## Model Addition\n", "\n", - "Because we allow the separation of transitions between states and\n", - "birth/death processes, the birth/death processes can be added later on.\n", - "\n", - "In \\[1\\]: modelBD2 = modelTrans\n", - "\n", - "In \\[1\\]: modelBD2.param_list = paramList + \\['mu', 'B'\\]\n", - "\n", - "In \\[1\\]: birthDeathList = \\[Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", - "...: Transition(origin='S', equation='mu\\*S',\n", - "transition_type=TransitionType.D), ...: Transition(origin='I',\n", - "equation='mu\\*I', transition_type=TransitionType.D)\\]\n", - "\n", - "In \\[1\\]: modelBD2.birth_death_list = birthDeathList\n", + "Because we allow the separation of transitions between states and birth/death processes, the birth/death processes can be added later on. The following example takes the model that was defined using transitions (`modelTrans`) and includes a birth process to the $S$ state, and death processes to the $S$ and $I$ states." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "3a6a15ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}B - I S \\beta - S \\mu\\\\I S \\beta - I \\gamma - I \\mu\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ B - I*S*beta - S*mu],\n", + "[I*S*beta - I*gamma - I*mu],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelBD2 = modelTrans\n", "\n", - "In \\[1\\]: modelBD2.get_ode_eqn()\n", + "modelBD2.param_list = paramList + ['mu', 'B']\n", "\n", - "So modeling can be done in stages. Start with a standard closed system\n", - "and extend it with additional flows that interact with the environment.\n", + "birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", + " Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), \n", + " Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)\n", + " ]\n", "\n", - "## Transition type\n", + "modelBD2.birth_death_list = birthDeathList\n", "\n", - "There are currently four different type of transitions allowed, which is\n", - "defined in an enum class also located in `transition`. The four types\n", - "are B, D, ODE and T, where they represent different type of process with\n", - "explanation in their corresponding value.\n", + "modelBD2.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "076bdc12", + "metadata": {}, + "source": [ "\n", - "In \\[1\\]: from pygom import transition\n", + "This demonstrates that we can approach our in stages. Start off with a standard closed system using `TransitionType.T`, and then extend it with additional flows that interact with the populations' surrounding environments using `TransitionType.B` or `TransitionType.D`." + ] + }, + { + "cell_type": "markdown", + "id": "ec63c1e1", + "metadata": {}, + "source": [ + "## Transition type summary\n", "\n", - "In \\[2\\]: for i in transition.TransitionType: \n", - "...: print(str(i) + \" = \" + i.value)\n", + "In summary, there are four different types of transitions allowed. These are B, D, ODE and T, which are defined in an enum class also located in `transition`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ce5787f8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TransitionType.B = Birth process\n", + "TransitionType.D = Death process\n", + "TransitionType.T = Between states\n", + "TransitionType.ODE = ODE _equation\n" + ] + } + ], + "source": [ + "from pygom import transition\n", "\n", - "Each birth process are added to the origin state while each death\n", - "process are deducted from the state, i.e. added to the state after\n", - "multiplying with a negative sign. An ode type is also added to the state\n", - "and we forbid the number of input ode to be greater than the number of\n", - "state inputted." + "for i in transition.TransitionType: \n", + " print(str(i) + \" = \" + i.value)\n" + ] + }, + { + "cell_type": "markdown", + "id": "89607b7d", + "metadata": {}, + "source": [ + "Each birth process is added to the origin state, while each death\n", + "process is deducted from the origin state (alternatively added to the state after\n", + "multiplying the flow with a negative sign). An ODE type is also added to the state, but we forbid the number of input ODEs to be greater than the number of states inputted. These strict definitions should help us to improve the bookeeping of states and flows when we have models of greater complexity." ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 6b53e39fe2241ba9afce9eb2287219b01e41d772 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 20 Jun 2023 16:48:02 +0100 Subject: [PATCH 069/188] add download button --- doc/doc/pygom-doc/notebooks/transition.ipynb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/doc/pygom-doc/notebooks/transition.ipynb b/doc/doc/pygom-doc/notebooks/transition.ipynb index d37c4e10..086ee8dc 100644 --- a/doc/doc/pygom-doc/notebooks/transition.ipynb +++ b/doc/doc/pygom-doc/notebooks/transition.ipynb @@ -5,6 +5,8 @@ "metadata": {}, "source": [ "# Transition Object\n", + "{download}`this notebook <./sir.ipynb>`\n", + "\n", "\n", "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", "\n", From e957687a6c06895b345876988e0144cb7fdfcd76 Mon Sep 17 00:00:00 2001 From: HWilliams-PHE <36919240+HWilliams-PHE@users.noreply.github.com> Date: Wed, 21 Jun 2023 11:49:42 +0100 Subject: [PATCH 070/188] Create pull_request_template.md proposed template for a pull request, including guidance for reviewer --- .github/pull_request_template.md | 68 ++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..449cbaa8 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,68 @@ +## Description of the PR + + +Replace this text with a description of the pull request including the issue number. + +## Checks + +This is an itemised checklist for the QA process within UKHSA and represents the bare minimum a QA should be. + +Full instructions on reviewing work can be found at Confluence on the [ONS QA of code guidance](https://best-practice-and-impact.github.io/qa-of-code-guidance/intro.html) page. + +**To the reviewer:** Check the boxes once you have completed the checks below. + +- [ ] It runs + - Can you get the code run to completion in a new instance and from top to bottom in the case of notebooks, or in a new R session? + - Can original analysis results be accurately & easily reproduced from the code? +This is a basic form of Smoke Testing +- [ ] Data and security + - Use nbstripout to prevent Jupyter notebook output being committed to git repositories + - Files containing individual user's secret files and config files are not in repo, however examples of these files and setup instructions are included in the repo. + - Secrets include s3 bucket names, login credentials, and organisation information. These can be handled using secrets.yml + - If you are unsure whether an item should be secret please raise with qa.datascience@ukhsa.gov.uk + - The changes do not include unreleased policy or official information. +- [ ] Sensible + - Does the code execute the task accurately? This is a subjective challenge. + - Does the code do what the comments and readme say it does\*? + - Is the code robust enough to handle missing or challenging data? +- [ ] Documentation + - The purpose of the code is clearly defined, whether in a markdown chunk at the top of a notebook or in a README + - Assumptions of the analysis & input data are clearly displayed to the reader, whether in a markdown chunk at the top of a notebook or in a README + - Comments are included in the code so the reader can follow why the code behaves in the way it does + - Teams with high quality documentation are better able to implement technical practices more readily and perform better as a whole (DORA, 2021). + - Is the code written in a standard way? (In a hurry this may be a nice to have, but if at all possible, this standard from the beginning can cut long term costs dramatically) + - Code is modular, storing functions & classes in the src and being imported into a notebook or script + - Projects should be based on the UKHSA repo template developed to work with cookiecutter + - Variable, function & module names should be intuitive to the reader + - For example, intuitive names include df_geo_lookup & non-intuitive names include foobar + - Common and useful checks for coding we use broadly across UKHSA include: + - Rstyler + - lintr + - black + - flake8 +- [ ] Pair coding review completed (optional, but highly recommended for QA in a hurry) + - Pair programming is a way of working and reviewing that can result in the same standard of work being completed 40%-50% faster (Williams et al., 2000, Nosek, 1998) and is better than solo programming for tasks involving efficient knowledge transferring and for working on highly connected systems (Dawande et al., 2008). + - Have the assignee and reviewer been on a video call or in person together during the code development in a line by line writing and review process? + +\* If the comments or readme do not have enough information, this check fails. + +## How to QA this PR + +Before accepting the PR and merging to `main` or `master`, please follow these steps on a terminal in your development instance: + +- `git status` check what branch you are on and if you have any uncommitted changes. +- Handle the work on your current branch: + - `git commit` if you would like to keep the changes you have made on your current branch. + - `git stash` if you do not want to keep these changes, although you can recover these later. +- `git checkout main` or `git checkout master` to go to the branch that will be merged to. +- `git pull origin main` or `git pull origin master` fetches the most up to date git info on this branch. +- `git branch -a` lists all the available branches. +- `git checkout BRANCHNAME-FOR-PR` moves you into the branch to QA. +- `git pull origin BRANCHNAME-FOR-PR` ensures you have the most recent changes for the PR. +- Run the notebooks or code. +- Run `pre-commit`. This runs some automated checks to check the code is well formatted and does not contain data. + - Are there any small changes that can be made to get it to run? + - Yes: make annotations on github and notify code creator to correct them + - No, it runs: done! + - No, and it looks like it would need a lot of work: note major points in Github PR chat and discuss with author. +- Carefully read through the code or documentation and make sure it makes sense. From 72b0e18fda11f1eea975b70c3e46401564a076df Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 21 Jun 2023 14:22:21 +0100 Subject: [PATCH 071/188] ammend workflow to test build the jupyter book, and make it happen only on a push to the relevant directory --- .github/workflows/main.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fb240d57..1a1a2577 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,11 +2,11 @@ name: test-docs on: push: - branches: - - install-fix-docs + paths: + - doc/** pull_request: - branches: - - install-fix-docs + paths: + - doc/** env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true @@ -17,7 +17,7 @@ jobs: strategy: matrix: os: [windows-latest] - python-version: ["3.7"]#, "3.8", "3.9", "3.10", "3.11"] + python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v2 @@ -71,9 +71,8 @@ jobs: pip install -r doc/requirements.txt pip install make - - name: make html documentation + - name: Build the book run: | - cd doc - make clean - make html + cd doc/doc/pygom-doc + jupyter-book build . From 8fdf81a835c9db2ee359fcbc1b28f7ae52524dc9 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 21 Jun 2023 14:24:01 +0100 Subject: [PATCH 072/188] stochastic addition --- doc/doc/pygom-doc/_toc.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/doc/pygom-doc/_toc.yml b/doc/doc/pygom-doc/_toc.yml index 29b83e52..3dc56a25 100644 --- a/doc/doc/pygom-doc/_toc.yml +++ b/doc/doc/pygom-doc/_toc.yml @@ -10,9 +10,7 @@ parts: - file: md/getting_started.md - file: notebooks/sir.ipynb - file: notebooks/transition.ipynb - #notebooks/sir.ipynb - #transition.rst - #stochastic.rst + - file: notebooks/stochastic.ipynb #unrollOde.rst #epi.rst #epijson.rst From b3b5f2630b70f23b16765dcb83230edfb2e9b0f9 Mon Sep 17 00:00:00 2001 From: HWilliams-PHE <36919240+HWilliams-PHE@users.noreply.github.com> Date: Wed, 21 Jun 2023 14:31:50 +0100 Subject: [PATCH 073/188] include jupyter book in requirements should fix CI error --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 36e653d5..3133a4b3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,5 @@ numpydoc>=0.6.0 sphinx>=1.4.1 sphinx_rtd_theme>=0.2.0 cython>=0.29 -nbsphinx \ No newline at end of file +nbsphinx +jupyter-book From 09f8a840b4c320db5148db8eb053e38860d72d7b Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 21 Jun 2023 14:41:48 +0100 Subject: [PATCH 074/188] correct download link --- doc/doc/pygom-doc/notebooks/transition.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc/pygom-doc/notebooks/transition.ipynb b/doc/doc/pygom-doc/notebooks/transition.ipynb index 086ee8dc..89c6a5e2 100644 --- a/doc/doc/pygom-doc/notebooks/transition.ipynb +++ b/doc/doc/pygom-doc/notebooks/transition.ipynb @@ -5,7 +5,7 @@ "metadata": {}, "source": [ "# Transition Object\n", - "{download}`this notebook <./sir.ipynb>`\n", + "{download}`this notebook <./transition.ipynb>`\n", "\n", "\n", "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", From d9f88c2bffe73d337c20084cf257cf3e2f28f6ab Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 22 Jun 2023 13:40:06 +0100 Subject: [PATCH 075/188] correct typos --- doc/doc/pygom-doc/notebooks/transition.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/doc/pygom-doc/notebooks/transition.ipynb b/doc/doc/pygom-doc/notebooks/transition.ipynb index 89c6a5e2..dd1568bf 100644 --- a/doc/doc/pygom-doc/notebooks/transition.ipynb +++ b/doc/doc/pygom-doc/notebooks/transition.ipynb @@ -20,8 +20,8 @@ "\n", "where the first three are mandatory. To demonstrate, we go back to the SIR model defined previously in the section {doc}`sir`. Recall that the set of ODEs are\n", "\n", - "$$begin{aligned}\n", - " frac{d S}{d t} &= - beta SI \\\\\n", + "$$\\begin{aligned}\n", + " \\frac{d S}{d t} &= - beta SI \\\\\n", "\\frac{d I}{d t} &= beta SI - \\gamma I \\\\\n", "\\frac{d R}{d t} &= \\gamma I.\n", "\\end{aligned}$$\n", @@ -218,7 +218,7 @@ "\n", "`modelTrans = DeterministicOde(stateList, paramList, ode=[t1, t2])`\n", "\n", - "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde is expecting a `TransitionType.ODE` argument.\n", + "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde` is expecting a `TransitionType.ODE` argument.\n", "\n", "Similarly `DeterministicOde(stateList, paramList, transition=[ode1, ode2, ode3])` would fail.\n", "\n", From cdee52c93fe8e3185cbb501ca3900a5ec2f56820 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 3 Jul 2023 17:02:44 +0100 Subject: [PATCH 076/188] github actions for building jupyterbook on github pages --- .github/workflows/book.yml | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/book.yml diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml new file mode 100644 index 00000000..f9d56606 --- /dev/null +++ b/.github/workflows/book.yml @@ -0,0 +1,42 @@ +name: deploy-book + +# only run when specific files change +# only run on install-fix-docs branch +# TODO change this to dev/main branch once integrated +# TODO edit filepath once filepath levels are corrected + +on: + push: + branches: + - install-fix-docs + paths: + - doc/** + +jobs: + deploy-book: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + # install python + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + # install dependencies + - name: Install dependencies + run: | + pip install -r doc/doc/pygom-doc/requirements.txt + + # build the book + - name: Build the book + run: | + jupyter-book build doc/doc/pygom-doc + + # deploy book to github-pages + - name: GitHub Pages + uses: peaceiris/actions-gh-pages@v3.6.1 + with: + publish_dir: doc/doc/pygom-doc/_build/html + From 7915016249b75eb22d5e575eac0b9e8be9fe12c8 Mon Sep 17 00:00:00 2001 From: HWilliams-PHE <36919240+HWilliams-PHE@users.noreply.github.com> Date: Mon, 3 Jul 2023 17:09:03 +0100 Subject: [PATCH 077/188] correct instruction on when action should occur --- .github/workflows/book.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index f9d56606..c2d3e573 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -9,8 +9,8 @@ on: push: branches: - install-fix-docs - paths: - - doc/** + paths: + - doc/** jobs: deploy-book: From cc39535ae59ac4046090e94b1c11d85bcc30ddfb Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 3 Jul 2023 17:58:17 +0100 Subject: [PATCH 078/188] add unroll pages --- doc/doc/pygom-doc/_toc.yml | 5 ++ doc/doc/pygom-doc/md/unrollOde.md | 15 ++++ .../pygom-doc/notebooks/unroll/unrollBD.ipynb | 64 +++++++++++++ .../notebooks/unroll/unrollHard.ipynb | 90 +++++++++++++++++++ .../notebooks/unroll/unrollSimple.ipynb | 61 +++++++++++++ 5 files changed, 235 insertions(+) create mode 100644 doc/doc/pygom-doc/md/unrollOde.md create mode 100644 doc/doc/pygom-doc/notebooks/unroll/unrollBD.ipynb create mode 100644 doc/doc/pygom-doc/notebooks/unroll/unrollHard.ipynb create mode 100644 doc/doc/pygom-doc/notebooks/unroll/unrollSimple.ipynb diff --git a/doc/doc/pygom-doc/_toc.yml b/doc/doc/pygom-doc/_toc.yml index 3dc56a25..af79456b 100644 --- a/doc/doc/pygom-doc/_toc.yml +++ b/doc/doc/pygom-doc/_toc.yml @@ -11,6 +11,11 @@ parts: - file: notebooks/sir.ipynb - file: notebooks/transition.ipynb - file: notebooks/stochastic.ipynb + - file: md/unrollOde.md + sections: + - file: notebooks/unroll/unrollSimple.ipynb + - file: notebooks/unroll/unrollBD.ipynb + - file: notebooks/unroll/unrollHard.ipynb #unrollOde.rst #epi.rst #epijson.rst diff --git a/doc/doc/pygom-doc/md/unrollOde.md b/doc/doc/pygom-doc/md/unrollOde.md new file mode 100644 index 00000000..9da3bd11 --- /dev/null +++ b/doc/doc/pygom-doc/md/unrollOde.md @@ -0,0 +1,15 @@ +# Convert ODE into transitions + +As seen previously in `transition`{.interpreted-text role="ref"}, we can +define the model via the transitions or explicitly as ODEs. There are +times when we all just want to test out some model in a paper and the +only available information are the ODEs themselves. Even though we know +that the ODEs come from some underlying transitions, breaking them down +can be a time consuming process. We provide the functionalities to do +this automatically. + +::: {.toctree} +unroll/unrollSimple.rst +unroll/unrollBD.rst +unroll/unrollHard.rst +::: diff --git a/doc/doc/pygom-doc/notebooks/unroll/unrollBD.ipynb b/doc/doc/pygom-doc/notebooks/unroll/unrollBD.ipynb new file mode 100644 index 00000000..fadb2e43 --- /dev/null +++ b/doc/doc/pygom-doc/notebooks/unroll/unrollBD.ipynb @@ -0,0 +1,64 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ODE With Birth and Death Process\n", + "\n", + "We follow on from the SIR model of `unrollSimple` but with additional\n", + "birth and death processes.\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI + B - \\mu S\\\\\n", + "\\frac{dI}{dt} &= \\beta SI - \\gamma I - \\mu I\\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "which consists of two transitions and three birth and death process\n", + "\n", + "digraph SIR_Model { \n", + "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", + "\\]; I -\\> R \\[ label = \"γI\" \\]; B \\[height=0 margin=0 shape=plaintext\n", + "width=0\\]; B -\\> S; \"S\\**2*μ\" \\[height=0 margin=0 shape=plaintext\n", + "width=0\\]; S -\\> \"S\\**2*μ\"; \"I\\*μ\" \\[height=0 margin=0 shape=plaintext\n", + "width=0\\]; I -\\> \"I\\*μ\";\n", + "\n", + "}\n", + "\n", + "Let's define this in terms of ODEs, and unroll it back to the individual\n", + "processes.\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType, SimulateOde,\n", + "common_models\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[1\\]: paramList = \\['beta', 'gamma', 'B', 'mu'\\]\n", + "\n", + "In \\[1\\]: odeList = \\[ \n", + "...: Transition(origin='S', ...: equation='-beta\\*S\\*I + B - mu\\*S',\n", + "...: transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", + "...: equation='beta\\*S\\*I - gamma\\*I - mu\\*I', ...:\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='R', ...:\n", + "equation='gamma\\*I', ...: transition_type=TransitionType.ODE) ...: \\]\n", + "\n", + "In \\[1\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", + "\n", + "In \\[1\\]: ode2 = ode.get_unrolled_obj()\n", + "\n", + "In \\[1\\]: f = plt.figure()\n", + "\n", + "@savefig sir_unrolled_transition_graph.png In \\[1\\]:\n", + "ode2.get_transition_graph()\n", + "\n", + "In \\[1\\]: plt.close()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/notebooks/unroll/unrollHard.ipynb b/doc/doc/pygom-doc/notebooks/unroll/unrollHard.ipynb new file mode 100644 index 00000000..64e14bd0 --- /dev/null +++ b/doc/doc/pygom-doc/notebooks/unroll/unrollHard.ipynb @@ -0,0 +1,90 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hard Problem\n", + "\n", + "Now we turn to a harder problem that does not have a one to one mapping\n", + "between all the transitions and the terms in the ODEs. We use the model\n", + "in `Influenza_SLIARN`, defined by\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -S \\beta (I + \\delta A) \\\\ \n", + "\\frac{dL}{dt} &= S \\beta (I + \\delta A) - \\kappa L \\\\ \n", + "\\frac{dI}{dt} &= p \\kappa L - \\alpha I \\\\\n", + "\\frac{dA}{dt} &= (1 - p) \\kappa L - \\eta A \\\\\n", + "\\frac{dR}{dt} &= f \\alpha I + \\eta A \\\\\n", + "\\frac{dN}{dt} &= -(1 - f) \\alpha I.\n", + "\\end{aligned}$$\n", + "\n", + "The outflow of state **L**, $\\kappa L$, is composed of two transitions,\n", + "one to **I** and the other to **A** but the ode of **L** only reflects\n", + "the total flow going out of the state. Same can be said for state **I**,\n", + "where the flow $\\alpha I$ goes to both **R** and **N**. Graphically, it\n", + "is a rather simple process as shown below.\n", + "\n", + "digraph SLIARD_Model { \n", + "labelloc = \"t\"; label = \"Original transitions\"; rankdir=LR; size=\"8\"\n", + "node \\[shape = circle\\]; S -\\> L \\[ label = \"-Sβ(I + δA)/N\" \\]; L -\\> I\n", + "\\[ label = \"κLp\" \\]; L -\\> A \\[ label = \"κL(1-p)\" \\]; I -\\> R \\[ label =\n", + "\"αIf\" \\]; I -\\> D \\[ label = \"αI(1-f)\" \\]; A -\\> R \\[ label = \"ηA\" \\];\n", + "\n", + "}\n", + "\n", + "We slightly change the model by introducing a new state **D** to convert\n", + "it into a closed system. The combination of state **D** and **N** is a\n", + "constant, the total population. So we can remove **N** and this new\n", + "system consist of six transitions. We define them explicitly as ODEs and\n", + "unroll them into transitions.\n", + "\n", + "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'L', 'I', 'A', 'R', 'D'\\]\n", + "\n", + "In \\[2\\]: paramList = \\['beta', 'p', 'kappa', 'alpha', 'f', 'delta',\n", + "'epsilon', 'N'\\]\n", + "\n", + "In \\[3\\]: odeList = \\[ \n", + "...: Transition(origin='S', equation='- beta\\*S/N\\*(I + delta\\*A)',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='L',\n", + "equation='beta\\*S/N\\*(I + delta\\*A) - kappa\\*L',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", + "equation='p\\*kappa\\*L - alpha\\*I', transition_type=TransitionType.ODE),\n", + "...: Transition(origin='A', equation='(1 - p)*kappa* L - epsilon\\*A',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='R',\n", + "equation='f\\*alpha\\*I + epsilon\\*A',\n", + "transition_type=TransitionType.ODE), ...: Transition(origin='D',\n", + "equation='(1 - f)*alpha*I', transition_type=TransitionType.ODE) \\]\n", + "\n", + "In \\[4\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", + "\n", + "In \\[5\\]: ode.get_transition_matrix()\n", + "\n", + "In \\[6\\]: ode2 = ode.get_unrolled_obj()\n", + "\n", + "In \\[7\\]: ode2.get_transition_matrix()\n", + "\n", + "In \\[8\\]: ode2.get_ode_eqn()\n", + "\n", + "After unrolling the odes, we have the following transition graph\n", + "\n", + "@savefig sir_unrolled_transition_graph_hard.png In \\[1\\]:\n", + "ode2.get_transition_graph()\n", + "\n", + "In \\[2\\]: plt.close()\n", + "\n", + "In \\[3\\]: print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify())\n", + "\\# difference\n", + "\n", + "which is exactly the same apart from slightly weird arrangement of\n", + "symbols in some of the equations. The last line with a value of zero\n", + "also reaffirms the result." + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} diff --git a/doc/doc/pygom-doc/notebooks/unroll/unrollSimple.ipynb b/doc/doc/pygom-doc/notebooks/unroll/unrollSimple.ipynb new file mode 100644 index 00000000..88bbd592 --- /dev/null +++ b/doc/doc/pygom-doc/notebooks/unroll/unrollSimple.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simple Problem\n", + "\n", + "For a simple problem, we consider the SIR model defined by\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\frac{dI}{dt} &= \\beta SI - \\gamma I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "which consists of two transitions\n", + "\n", + "digraph SIR_Model { \n", + "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", + "\\]; I -\\> R \\[ label = \"γI\" \\];\n", + "\n", + "}\n", + "\n", + "Let's define this using the code block below\n", + "\n", + "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", + "\n", + "In \\[2\\]: ode1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", + "transition_type=TransitionType.ODE)\n", + "\n", + "In \\[3\\]: ode2 = Transition(origin='I', equation='beta\\*S\\*I -\n", + "gamma\\*I', transition_type=TransitionType.ODE)\n", + "\n", + "In \\[4\\]: ode3 = Transition(origin='R', equation='gamma\\*I',\n", + "transition_type=TransitionType.ODE)\n", + "\n", + "In \\[6\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[7\\]: paramList = \\['beta', 'gamma'\\]\n", + "\n", + "In \\[8\\]: ode = SimulateOde(stateList, \n", + "...: paramList, ...: ode=\\[ode1, ode2, ode3\\])\n", + "\n", + "In \\[9\\]: ode.get_transition_matrix()\n", + "\n", + "and the last line shows that the transition matrix is empty. This is the\n", + "expected result because `SimulateOdeModel` was not initialized using\n", + "transitions. We populate the transition matrix below and demonstrate the\n", + "difference.\n", + "\n", + "In \\[1\\]: ode = ode.get_unrolled_obj()\n", + "\n", + "In \\[2\\]: ode.get_transition_matrix()" + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} From 53ffaa0ad9ba66a827f1cc6f2038dc78fb83a4a2 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 3 Jul 2023 18:14:23 +0100 Subject: [PATCH 079/188] connect pat --- .github/workflows/book.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index c2d3e573..04e75d87 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -38,5 +38,6 @@ jobs: - name: GitHub Pages uses: peaceiris/actions-gh-pages@v3.6.1 with: + github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: doc/doc/pygom-doc/_build/html From b7494a25f4c3e2729254b566456d18001cc6580d Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 3 Jul 2023 18:58:28 +0100 Subject: [PATCH 080/188] add to requirements --- doc/requirements.txt | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/requirements.txt b/doc/requirements.txt index fe1dfe4f..d6e1e29a 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,11 +1,13 @@ -dask[complete]>=0.13.0 -graphviz>=0.4.9 -matplotlib>=1.0.0 -numpy>=1.6.0 -pandas>=0.15.0 -python-dateutil>=2.0.0 -scipy>=0.10.0 -sympy>=1.0.0 -numpydoc>=0.6.0 -sphinx>=1.4.1 sphinx_rtd_theme>=0.2.0 -ipython>=7.1.1 +dask[complete]>=0.13.0 +graphviz>=0.4.9 +matplotlib>=1.0.0 +numpy>=1.6.0 +pandas>=0.15.0 +python-dateutil>=2.0.0 +scipy>=0.10.0 +sympy>=1.0.0 +numpydoc>=0.6.0 +#sphinx>=1.4.1 +#sphinx_rtd_theme>=0.2.0 +#ipython>=7.1.1 +jupyter-book From 7a29d0732b1fd7d081994076c5f7be232908a42c Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 4 Jul 2023 10:22:22 +0100 Subject: [PATCH 081/188] correct token call --- .github/workflows/book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 04e75d87..c66c3eb6 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -38,6 +38,6 @@ jobs: - name: GitHub Pages uses: peaceiris/actions-gh-pages@v3.6.1 with: - github_token: ${{ secrets.GITHUB_TOKEN }} + github_token: ${{ secrets.DEPLOY_BOOK }} publish_dir: doc/doc/pygom-doc/_build/html From 2ffe6fe04a58c517c2e68fe39b0f5d1ad2de4466 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 4 Jul 2023 10:25:36 +0100 Subject: [PATCH 082/188] remove download button --- doc/doc/pygom-doc/notebooks/sir.ipynb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/doc/pygom-doc/notebooks/sir.ipynb b/doc/doc/pygom-doc/notebooks/sir.ipynb index 89e9fad2..0767ca96 100644 --- a/doc/doc/pygom-doc/notebooks/sir.ipynb +++ b/doc/doc/pygom-doc/notebooks/sir.ipynb @@ -5,7 +5,6 @@ "metadata": {}, "source": [ "# Motivating Example: SIR Model\n", - "{download}`this notebook <./sir.ipynb>`\n", "\n", "## Defining the model\n", "\n", @@ -763,7 +762,7 @@ "id": "8b63ba62", "metadata": { "tags": [ - "hide-input" + "hide-output" ] }, "outputs": [ From a76cb50b1414de9846f6119d4737699008dc928e Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 4 Jul 2023 10:44:10 +0100 Subject: [PATCH 083/188] remove download button --- doc/doc/pygom-doc/notebooks/transition.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/doc/pygom-doc/notebooks/transition.ipynb b/doc/doc/pygom-doc/notebooks/transition.ipynb index dd1568bf..2ed607d2 100644 --- a/doc/doc/pygom-doc/notebooks/transition.ipynb +++ b/doc/doc/pygom-doc/notebooks/transition.ipynb @@ -5,7 +5,6 @@ "metadata": {}, "source": [ "# Transition Object\n", - "{download}`this notebook <./transition.ipynb>`\n", "\n", "\n", "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", From 7e28f8a75826cd08af2e3503d184beb648bcf7a0 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 4 Jul 2023 11:50:16 +0100 Subject: [PATCH 084/188] hide plotting cells --- doc/doc/pygom-doc/notebooks/stochastic.ipynb | 472 +++++++++++++++++++ 1 file changed, 472 insertions(+) create mode 100644 doc/doc/pygom-doc/notebooks/stochastic.ipynb diff --git a/doc/doc/pygom-doc/notebooks/stochastic.ipynb b/doc/doc/pygom-doc/notebooks/stochastic.ipynb new file mode 100644 index 00000000..a69349bb --- /dev/null +++ b/doc/doc/pygom-doc/notebooks/stochastic.ipynb @@ -0,0 +1,472 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stochastic representation of ODEs\n", + "\n", + "There are multiple interpretations of the stochasticity of a deterministic\n", + "ODE. We have implemented two of the most common interpretations; when the\n", + "parameters are realizations of some underlying distribution, and when we\n", + "have a so called chemical master equation where each transition\n", + "represent a jump. Again, we use the standard SIR example as previously\n", + "seen in {doc}`sir`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3f44792d", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SimulateOde, Transition, TransitionType\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import numpy as np\n", + "\n", + "# initial conditions\n", + "Ix0 = [1, 1.27e-6, 0]\n", + "\n", + "# time period\n", + "t = np.linspace(0, 150, 100)\n", + "\n", + "stateList = ['S', 'I', 'R']\n", + "\n", + "paramList = ['beta', 'gamma']\n", + "\n", + "transitionList = [Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T), \n", + " Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)]\n", + "\n", + "# create the ODEs\n", + "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", + "\n", + "# assign parameter values\n", + "odeS.parameters = [0.5, 1.0/3.0]\n", + "\n", + "# assign initial values\n", + "odeS.initial_values = (Ix0, t[0])\n", + "\n", + "# solve deterministic solution\n", + "solutionReference = odeS.integrate(t[1::], full_output=False)" + ] + }, + { + "cell_type": "markdown", + "id": "0e516f09", + "metadata": {}, + "source": [ + "\n", + "## Stochastic Parameters\n", + "\n", + "In our first implementation, we assume that the parameters follow some\n", + "underlying distribution. Given that both $\\beta$ and $\\gamma$ in our SIR\n", + "model has to be non-negative, it seems natural to use a Gamma\n", + "distribution. We make use of the familiar syntax from\n", + "[R](http://www.r-project.org/) to define our distribution.\n", + "Unfortunately, we have to define it via a tuple, where the first item is the\n", + "function handle (name) and the second the parameters. \n", + "\n", + "```{note}\n", + "The parameters can be defined as either a dictionary or as the same sequence\n", + "as [R](http://www.r-project.org/) (without specifying the arguments), which for the [Gamma distribution](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/GammaDist.html) is the shape followed by the rate.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a3e9bc81", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom.utilR import rgamma\n", + "\n", + "d = dict()\n", + "\n", + "# E(X) = 0.5 = shape * scale = shape / rate \n", + "d['beta'] = (rgamma,{'shape':100.0, 'rate':200.0})\n", + "\n", + "# E(X) = 1.0/3.0 = shape / rate\n", + "d['gamma'] = (rgamma,(100.0, 300.0))\n", + "\n", + "odeS.parameters = d\n", + "\n", + "Ymean, Yall = odeS.simulate_param(t[1::], 10, full_output=True)" + ] + }, + { + "cell_type": "markdown", + "id": "2221479d", + "metadata": {}, + "source": [ + "```{note}\n", + "Note that a message may be printed above where PyGOM is trying to connect to an\n", + "mpi backend, as our module has the capability to compute in parallel\n", + "using the IPython. We have simulated a total of 10 different solutions\n", + "using different parameters, the plots can be seen below.\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "8849566b", + "metadata": { + "tags": [ + "hide-cell" + ] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f, axarr = plt.subplots(1,3, layout='constrained')\n", + "\n", + "#TODO tidy up plots\n", + "for solution in Yall: \n", + " axarr[0].plot(t, solution[:,0]) \n", + " axarr[1].plot(t, solution[:,1]) \n", + " axarr[2].plot(t, solution[:,2])\n", + "\n", + "for idx, state in enumerate(stateList):\n", + " axarr[idx].set_title(state)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "1fd28659", + "metadata": {}, + "source": [ + "\n", + "We then see how the expected results, using the sample average of the\n", + "simulations\n", + "\n", + "$$\\tilde{x}(T) = \\mathbb{E}\\left[ \\int_{t_{0}}^{T} f(\\theta,x,t) dt \\right]$$\n", + "\n", + "differs from the reference solution\n", + "\n", + "$$\\hat{x}(T) = \\int_{t_{0}}^{T} f(\\mathbb{E}\\left[ \\theta \\right],x,t) dt$$ " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4e6f4164", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f, axarr = plt.subplots(1,3)\n", + "\n", + "for i in range(3): \n", + " axarr[i].plot(t, Ymean[:,i] - solutionReference[:,i])\n", + "\n", + "plt.show()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ee4d496d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f, axarr = plt.subplots(1,3, layout='constrained', sharey=True)\n", + "\n", + "for i in range(3): \n", + " axarr[i].plot(t, Ymean[:,i], label='sample average')\n", + " axarr[i].plot(t, solutionReference[:,i], label='reference')\n", + "\n", + "axarr[2].legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "aa230d7f", + "metadata": {}, + "source": [ + "\n", + "The difference is relatively large especially for the $S$ state. We can\n", + "decrease this difference as we increase the number of simulation, and\n", + "more sophisticated sampling method for the generation of random\n", + "variables can also decrease the difference.\n", + "\n", + "In addition to using the built-in functions to represent stochasticity,\n", + "we can also use standard frozen distributions from scipy. Note that it\n", + "must be a frozen distribution as that is the only for the parameters of\n", + "the distributions to propagate through the model.\n", + "\n", + "In \\[1\\]: import scipy.stats as st\n", + "\n", + "In \\[1\\]: d = dict()\n", + "\n", + "In \\[1\\]: d\\['beta'\\] = st.gamma(a=100.0, scale=1.0/200.0)\n", + "\n", + "In \\[1\\]: d\\['gamma'\\] = st.gamma(a=100.0, scale=1.0/300.0)\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "Obviously, there may be scenarios where only some of the parameters are\n", + "stochastic. Let's say that the $\\gamma$ parameter is fixed at $1/3$,\n", + "then simply replace the distribution information with a scalar. A quick\n", + "visual inspection at the resulting plot suggests that the system of ODE\n", + "potentially has less variation when compared to the case where both\n", + "parameters are stochastic.\n", + "\n", + "In \\[1\\]: d\\['gamma'\\] = 1.0/3.0\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "In \\[1\\]: YmeanSingle, YallSingle = odeS.simulate_param(t\\[1::\\], 5,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "\n", + "In \\[1\\]: for solution in YallSingle: \n", + "...: axarr\\[0\\].plot(t,solution\\[:,0\\]) ...:\n", + "axarr\\[1\\].plot(t,solution\\[:,1\\]) ...:\n", + "axarr\\[2\\].plot(t,solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_param_single.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "## Continuous Markov Representation\n", + "\n", + "Another common method of introducing stochasticity into a set of ode is\n", + "by assuming each movement in the system is a result of a jump process.\n", + "More concretely, the probabilty of a move for transition $j$ is governed\n", + "by an exponential distribution such that\n", + "\n", + "$$\\Pr(\\text{process $j$ jump within time } \\tau) = \\lambda_{j} e^{-\\lambda_{j} \\tau},$$\n", + "\n", + "where $\\lambda_{j}$ is the rate of transition for process $j$ and $\\tau$\n", + "the time elapsed after current time $t$.\n", + "\n", + "A couple of the commmon implementation for the jump process have been\n", + "implemented where two of them are used during a normal simulation; the\n", + "first reaction method [\\[Gillespie1977\\]]() and the $\\tau$-Leap method\n", + "[\\[Cao2006\\]](). The two changes interactively depending on the size of\n", + "the states.\n", + "\n", + "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "\n", + "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", + "\n", + "In \\[1\\]: paramList = \\['beta', 'gamma', 'N'\\]\n", + "\n", + "In \\[1\\]: transitionList = \\[ \n", + "...: Transition(origin='S', destination='I', equation='beta\\*S\\*I/N',\n", + "transition_type=TransitionType.T), ...: Transition(origin='I',\n", + "destination='R', equation='gamma\\*I', transition_type=TransitionType.T)\n", + "...: \\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: solutionReference = odeS.integrate(t\\[1::\\])\n", + "\n", + "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1, 3)\n", + "\n", + "In \\[1\\]: for solution in simX: \n", + "...: axarr\\[0\\].plot(t\\[:9\\], solution\\[:,0\\]) ...:\n", + "axarr\\[1\\].plot(t\\[:9\\], solution\\[:,1\\]) ...: axarr\\[2\\].plot(t\\[:9\\],\n", + "solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_process.png In \\[1\\]: plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "Above, we see ten different simulation, again using the SIR model but\n", + "without standardization of the initial conditions. We restrict our time\n", + "frame to be only the first 10 time points so that the individual changes\n", + "can be seen more clearly above. If we use the same time frame as the one\n", + "used previously for the deterministic system (as shown below), the\n", + "trajectories are smoothed out and we no longer observe the *jumps*.\n", + "Looking at the raw trajectories of the ODE below, it is obvious that the\n", + "mean from a jump process is very different to the deterministic\n", + "solution. The reason behind this is that the jump process above was able\n", + "to fully remove all the initial infected individuals before any new\n", + "ones.\n", + "\n", + "In \\[1\\]: simX,simT = odeS.simulate_jump(t, 5, full_output=True)\n", + "\n", + "In \\[1\\]: simMean = np.mean(simX, axis=0)\n", + "\n", + "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "\n", + "In \\[1\\]: for solution in simX: \n", + "...: axarr\\[0\\].plot(t, solution\\[:,0\\]) ...: axarr\\[1\\].plot(t,\n", + "solution\\[:,1\\]) ...: axarr\\[2\\].plot(t, solution\\[:,2\\])\n", + "\n", + "@savefig stochastic_process_compare_large_n\\_curves.png In \\[1\\]:\n", + "plt.show()\n", + "\n", + "In \\[1\\]: plt.close()\n", + "\n", + "## Repeatable Simulation\n", + "\n", + "One of the possible use of compartmental models is to generate\n", + "forecasts. Although most of the time the requirement would be to have\n", + "(at least point-wise) convergence in the limit, reproducibility is also\n", + "important. For both types of interpretation explained above, we have\n", + "given the package the capability to repeat the simulations by setting a\n", + "seed. When the assumption is that the parameters follows some sort of\n", + "distribution, we simply set the seed which governs the global state of\n", + "the random number generator.\n", + "\n", + "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':\n", + "st.gamma(a=100.0, scale=1.0/300.0), 'N': x0\\[0\\]}\n", + "\n", + "In \\[1\\]: odeS.parameters = d\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: Ymean, Yall = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: Ymean1, Yall1 = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: Ymean2, Yall2 = odeS.simulate_param(t\\[1::\\], 10,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: sim_diff = \\[np.linalg.norm(Yall\\[i\\] - yi) for i, yi in\n", + "enumerate(Yall1)\\]\n", + "\n", + "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(Yall2\\[i\\] - yi) for i, yi in\n", + "enumerate(Yall1)\\]\n", + "\n", + "In \\[1\\]: print(\"Different in the simulations and the mean: (%s, %s) \" %\n", + "(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))\n", + "\n", + "In \\[1\\]: print(\"Different in the simulations and the mean using same\n", + "seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 -\n", + "Ymean1))))\n", + "\n", + "In the alternative interpretation, setting the global seed is\n", + "insufficient. Unlike simulation based on the parameters, where we can\n", + "pre-generate all the parameter values and send them off to individual\n", + "processes in the parallel backend, this is prohibitive here. In a\n", + "nutshell, the seed does not propagate when using a parallel backend\n", + "because each *integration* requires an unknown number of random samples.\n", + "Therefore, we have an additional flag **parallel** in the function\n", + "signature. By ensuring that the computation runs in serial, we can make\n", + "use of the global seed and generate identical runs.\n", + "\n", + "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "\n", + "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", + "transition=transitionList)\n", + "\n", + "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", + "\n", + "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "\n", + "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10, parallel=False,\n", + "full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: simX1, simT1 = odeS.simulate_jump(t\\[1:10\\], 10,\n", + "parallel=False, full_output=True)\n", + "\n", + "In \\[1\\]: np.random.seed(1)\n", + "\n", + "In \\[1\\]: simX2, simT2 = odeS.simulate_jump(t\\[1:10\\], 10,\n", + "parallel=False, full_output=True)\n", + "\n", + "In \\[1\\]: sim_diff = \\[np.linalg.norm(simX\\[i\\] - x1) for i, x1 in\n", + "enumerate(simX1)\\]\n", + "\n", + "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(simX2\\[i\\] - x1) for i, x1 in\n", + "enumerate(simX1)\\]\n", + "\n", + "In \\[1\\]: print(\"Difference in simulation: %s\" %\n", + "np.sum(np.abs(sim_diff)))\n", + "\n", + "In \\[1\\]: print(\"Difference in simulation using same seed: %s\" %\n", + "np.sum(np.abs(sim_diff12)))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From bbf5ee725b9b774c8c7c9c5a6ae36d580e94b703 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 4 Jul 2023 11:51:25 +0100 Subject: [PATCH 085/188] include pygom logo --- doc/doc/pygom-doc/_config.yml | 2 +- doc/doc/pygom-doc/logo_pygom.jpg | Bin 0 -> 9931 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/doc/pygom-doc/logo_pygom.jpg diff --git a/doc/doc/pygom-doc/_config.yml b/doc/doc/pygom-doc/_config.yml index ddf3ee23..951c4fd6 100644 --- a/doc/doc/pygom-doc/_config.yml +++ b/doc/doc/pygom-doc/_config.yml @@ -4,7 +4,7 @@ title: PyGOM documentation author: Public Health England / UK Health Security Agency #TODO change logo -logo: logo.png +logo: logo_pygom.jpg # build files in table of contents # used as alternative to exclude patterns diff --git a/doc/doc/pygom-doc/logo_pygom.jpg b/doc/doc/pygom-doc/logo_pygom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e35317b423633a265e313cabfa38acfd255c4768 GIT binary patch literal 9931 zcmcI~2Urx_wq_A+at4(kIX6Kvf(S@xGEL4IBxev%Q6y)YoCTZE-fO3S{cH99s_OUb?{5IHk~~BnKtlrnG}Hn7UO}6M z$jX{&K-J|TDsq2T3;-y>e6KP=li;OODdX?f%r+Z*|K*b%|Tu*UQZdWutMcduT&t zQMxrsXSe%Ly5)b;t=v3r?W0jP63$NEw`1MP?TqnlTy(ThR}kt)19$>ZKmm}sT|ep` zC9e4ZAbJV_81a9XS*8O(V+a7;MgCpJ{0;z!f&rjm?C-L_F>$l-u=t}pOw<|O))oMc ziU5GX007870|2hkA9bkHKbadns)`0RFIUuI2RH#X06hQ!TmUP82c@ z3t*t%%Iz5gC79Tlw*tb(#=^z{;o{hQxR{c&O6Zto&>Ei_OLFsz*(s>{C*Sle5V$${gU0xJ+<1B5bFRH$Cj=_}! zwtrfQv>k??_YqdDIh$5xV;P)8xV|*w7RRmKB3-&{*B?E2VbON@woHs#uZ&Gv_a&pz zSH0o8b79-FHYe?*`naa$iX!$C^TmYN-+T^ts%hOD4qjLdLsJ|I=uZ+m$XkLEUUkm~ zV)RKmOShj+*of4It|xS#&N*DiiCG7?%zZu%v@qKTtq?6wImM(fjK_1M2PMI579iEhC!kYC1Pwwr0Q90W#^Z9()nQ2##TmPWu z4jG4lQQgC$C!AVC;xh}{PLRj#{DtN?)uz38KJFG%!eOj4?wgewD+=X$vDIydK?cGK z>?*9Tx^>Po^%noZpTGE4ow;<;9k5D#8pbYMsjn7PcKNiiy)uRNzk=O4O%wBPgK0(0 z_sa;sJ+(_2O?e7|y(b>vjn=V1xFqSrR3W^05bfvizhKl~UM#ZI;#7F%wooJb>I2v; zVUs&P)kvJqb(iZ`Cyn&AcxN=+13$C0St#6&h4kRFae_PKfWuHmeYxDMLHt_nY+YD$ zvbQ?Eo&lu5i5VkBVMW5h*P<%+jWX)aqPn5_EaafkV7DzKe7Q*hzk|%OEs}C~rMtwL zP_<%p%rvhj&ajeJ5WtJGY*ZzF?z#A0caue-Oa(sb@_8s5K&Z3tn7M0KGhbfxm;Obl ze}r%4H13a)m46kWe*bsTU9Mzt*>LYAZ*U5FYAKWe>29 zvDOA!io||g1iTy&fs0d9+&eKRbSoMkGRt@4-MllC8~)FJY&7;2^9Vnb)g}&!T62?ZJ(QFJRlE zYI)(M&=^reqmx}0@I$07z`~+B6i*N?d`PlDPC7=MB#O2aDCZOPKAB>&3sGrh7ξ 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 Date: Tue, 4 Jul 2023 13:05:49 +0100 Subject: [PATCH 086/188] ammend documentation path --- .github/workflows/book.yml | 8 +- .../mdconvert/doc_to_sort/stochastic.ipynb | 328 - .../_build/.doctrees/environment.pickle | Bin 0 -> 53145 bytes docs/pygom-doc/_build/.doctrees/intro.doctree | Bin 0 -> 7233 bytes .../_build/.doctrees/markdown.doctree | Bin 0 -> 12796 bytes .../.doctrees/md/getting_started.doctree | Bin 0 -> 11934 bytes .../_build/.doctrees/md/unrollOde.doctree | Bin 0 -> 4822 bytes .../mdconvert/common_models/.doctree | Bin 0 -> 4078 bytes .../.doctrees/mdconvert/doc_to_sort/.doctree | Bin 0 -> 16190 bytes .../_build/.doctrees/mdconvert/mod/.doctree | Bin 0 -> 2944 bytes .../.doctrees/mdconvert/unroll/.doctree | Bin 0 -> 4803 bytes .../_build/.doctrees/notebooks/sir.doctree | Bin 0 -> 52265 bytes .../.doctrees/notebooks/stochastic.doctree | Bin 0 -> 49456 bytes .../.doctrees/notebooks/transition.doctree | Bin 0 -> 40601 bytes .../notebooks/unroll/unrollBD.doctree | Bin 0 -> 9477 bytes .../notebooks/unroll/unrollHard.doctree | Bin 0 -> 15554 bytes .../notebooks/unroll/unrollSimple.doctree | Bin 0 -> 8362 bytes .../_build/.jupyter_cache/__version__.txt | 1 + .../base.ipynb | 19 + .../pygom-doc/_build/.jupyter_cache/global.db | Bin 0 -> 32768 bytes docs/pygom-doc/_build/html/.buildinfo | 4 + .../sir.ipynb | 868 ++ .../transition.ipynb | 453 + ...8745cf0187f817a37553a042c31af498e6c31f.png | Bin 0 -> 29179 bytes ...c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png | Bin 0 -> 100432 bytes ...ac82c80ee47acc51fa9f5f4524d6db35ca6b41.png | Bin 0 -> 76796 bytes ...098459312ca2a16064752fe16688eef9d59794.png | Bin 0 -> 53891 bytes ...b2e125ef46610b644f753350393f6b7570ed19.png | Bin 0 -> 27752 bytes ...a48ea90ce9767e60c91e5df234ee3786fe52cc.png | Bin 0 -> 31060 bytes ...a201f4793ce35568e2df3fd9897fe93e8c4d57.png | Bin 0 -> 28430 bytes ...73fef42f834bed956be9667b897a3b33cbe9ef.svg | 44 + ...302c51ded12a791b68c599cd254c0ea8db65dd.png | Bin 0 -> 96634 bytes ...2205942f9352d2ffcaee47e88de52764a57449.png | Bin 0 -> 34009 bytes ...3827f0322ce73e04fa56be79899e536d192ffe.png | Bin 0 -> 28637 bytes ...3ed17d7a9b3136c85a1aae69c00bc3f813fc49.png | Bin 0 -> 32819 bytes ...4bf026da21420ebaaa2c33c4960b32e1325dcf.png | Bin 0 -> 87123 bytes ...fda2cf782787c777b79466b814cebf406b6e4b.png | Bin 0 -> 27643 bytes ...e87d6a3feec93d706aef7dff0c1f6a7032cd78.png | Bin 0 -> 27300 bytes ...82f3a46e43faa6c31200c2a2bef1fd514361f4.png | Bin 0 -> 35085 bytes .../pygom-doc/_build/html/_sources}/intro.md | 0 .../_build/html/_sources}/markdown.md | 0 .../html/_sources}/md/getting_started.md | 0 .../_build/html/_sources}/md/unrollOde.md | 0 .../_sources}/mdconvert/common_models/.md | 0 .../html/_sources}/mdconvert/doc_to_sort/.md | 0 .../_build/html/_sources}/mdconvert/mod/.md | 0 .../html/_sources}/mdconvert/unroll/.md | 0 .../_build/html/_sources/notebooks/sir.ipynb | 868 ++ .../html/_sources}/notebooks/stochastic.ipynb | 0 .../html/_sources/notebooks/transition.ipynb | 453 + .../_sources/notebooks}/unroll/unrollBD.ipynb | 0 .../notebooks}/unroll/unrollHard.ipynb | 0 .../notebooks}/unroll/unrollSimple.ipynb | 0 ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 + .../html/_sphinx_design_static/design-tabs.js | 27 + .../_sphinx_javascript_frameworks_compat.js | 134 + docs/pygom-doc/_build/html/_static/basic.css | 928 ++ .../_build/html/_static/check-solid.svg | 4 + .../_build/html/_static/clipboard.min.js | 7 + .../_build/html/_static/copy-button.svg | 5 + .../_build/html/_static/copybutton.css | 94 + .../_build/html/_static/copybutton.js | 248 + .../_build/html/_static/copybutton_funcs.js | 73 + ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 + .../_build/html/_static/design-tabs.js | 27 + .../pygom-doc/_build/html/_static/doctools.js | 264 + .../html/_static/documentation_options.js | 14 + docs/pygom-doc/_build/html/_static/file.png | Bin 0 -> 286 bytes .../html/_static/images/logo_binder.svg | 19 + .../_build/html/_static/images/logo_colab.png | Bin 0 -> 7601 bytes .../html/_static/images/logo_deepnote.svg | 1 + .../html/_static/images/logo_jupyterhub.svg | 1 + .../_build/html/_static/jquery-3.6.0.js | 10881 ++++++++++++++++ docs/pygom-doc/_build/html/_static/jquery.js | 2 + .../_build/html/_static/language_data.js | 199 + .../locales/ar/LC_MESSAGES/booktheme.mo | Bin 0 -> 1541 bytes .../locales/ar/LC_MESSAGES/booktheme.po | 75 + .../locales/bg/LC_MESSAGES/booktheme.mo | Bin 0 -> 1708 bytes .../locales/bg/LC_MESSAGES/booktheme.po | 75 + .../locales/bn/LC_MESSAGES/booktheme.mo | Bin 0 -> 1646 bytes .../locales/bn/LC_MESSAGES/booktheme.po | 63 + .../locales/ca/LC_MESSAGES/booktheme.mo | Bin 0 -> 1246 bytes .../locales/ca/LC_MESSAGES/booktheme.po | 66 + .../locales/cs/LC_MESSAGES/booktheme.mo | Bin 0 -> 1405 bytes .../locales/cs/LC_MESSAGES/booktheme.po | 75 + .../locales/da/LC_MESSAGES/booktheme.mo | Bin 0 -> 1304 bytes .../locales/da/LC_MESSAGES/booktheme.po | 75 + .../locales/de/LC_MESSAGES/booktheme.mo | Bin 0 -> 1388 bytes .../locales/de/LC_MESSAGES/booktheme.po | 75 + .../locales/el/LC_MESSAGES/booktheme.mo | Bin 0 -> 1722 bytes .../locales/el/LC_MESSAGES/booktheme.po | 75 + .../locales/eo/LC_MESSAGES/booktheme.mo | Bin 0 -> 1337 bytes .../locales/eo/LC_MESSAGES/booktheme.po | 75 + .../locales/es/LC_MESSAGES/booktheme.mo | Bin 0 -> 1396 bytes .../locales/es/LC_MESSAGES/booktheme.po | 75 + .../locales/et/LC_MESSAGES/booktheme.mo | Bin 0 -> 1341 bytes .../locales/et/LC_MESSAGES/booktheme.po | 75 + .../locales/fi/LC_MESSAGES/booktheme.mo | Bin 0 -> 1368 bytes .../locales/fi/LC_MESSAGES/booktheme.po | 75 + .../locales/fr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1412 bytes .../locales/fr/LC_MESSAGES/booktheme.po | 75 + .../locales/hr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1402 bytes .../locales/hr/LC_MESSAGES/booktheme.po | 75 + .../locales/id/LC_MESSAGES/booktheme.mo | Bin 0 -> 1323 bytes .../locales/id/LC_MESSAGES/booktheme.po | 75 + .../locales/it/LC_MESSAGES/booktheme.mo | Bin 0 -> 1403 bytes .../locales/it/LC_MESSAGES/booktheme.po | 75 + .../locales/iw/LC_MESSAGES/booktheme.mo | Bin 0 -> 1445 bytes .../locales/iw/LC_MESSAGES/booktheme.po | 75 + .../locales/ja/LC_MESSAGES/booktheme.mo | Bin 0 -> 1471 bytes .../locales/ja/LC_MESSAGES/booktheme.po | 75 + .../locales/ko/LC_MESSAGES/booktheme.mo | Bin 0 -> 1375 bytes .../locales/ko/LC_MESSAGES/booktheme.po | 75 + .../locales/lt/LC_MESSAGES/booktheme.mo | Bin 0 -> 1413 bytes .../locales/lt/LC_MESSAGES/booktheme.po | 75 + .../locales/lv/LC_MESSAGES/booktheme.mo | Bin 0 -> 1404 bytes .../locales/lv/LC_MESSAGES/booktheme.po | 75 + .../locales/ml/LC_MESSAGES/booktheme.mo | Bin 0 -> 1883 bytes .../locales/ml/LC_MESSAGES/booktheme.po | 66 + .../locales/mr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1674 bytes .../locales/mr/LC_MESSAGES/booktheme.po | 66 + .../locales/ms/LC_MESSAGES/booktheme.mo | Bin 0 -> 1213 bytes .../locales/ms/LC_MESSAGES/booktheme.po | 66 + .../locales/nl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1356 bytes .../locales/nl/LC_MESSAGES/booktheme.po | 75 + .../locales/no/LC_MESSAGES/booktheme.mo | Bin 0 -> 1317 bytes .../locales/no/LC_MESSAGES/booktheme.po | 75 + .../locales/pl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1371 bytes .../locales/pl/LC_MESSAGES/booktheme.po | 75 + .../locales/pt/LC_MESSAGES/booktheme.mo | Bin 0 -> 1364 bytes .../locales/pt/LC_MESSAGES/booktheme.po | 75 + .../locales/ro/LC_MESSAGES/booktheme.mo | Bin 0 -> 1390 bytes .../locales/ro/LC_MESSAGES/booktheme.po | 75 + .../locales/ru/LC_MESSAGES/booktheme.mo | Bin 0 -> 1722 bytes .../locales/ru/LC_MESSAGES/booktheme.po | 75 + .../locales/sk/LC_MESSAGES/booktheme.mo | Bin 0 -> 1393 bytes .../locales/sk/LC_MESSAGES/booktheme.po | 75 + .../locales/sl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1374 bytes .../locales/sl/LC_MESSAGES/booktheme.po | 75 + .../locales/sr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1679 bytes .../locales/sr/LC_MESSAGES/booktheme.po | 75 + .../locales/sv/LC_MESSAGES/booktheme.mo | Bin 0 -> 1349 bytes .../locales/sv/LC_MESSAGES/booktheme.po | 75 + .../locales/ta/LC_MESSAGES/booktheme.mo | Bin 0 -> 1928 bytes .../locales/ta/LC_MESSAGES/booktheme.po | 66 + .../locales/te/LC_MESSAGES/booktheme.mo | Bin 0 -> 1806 bytes .../locales/te/LC_MESSAGES/booktheme.po | 66 + .../locales/tg/LC_MESSAGES/booktheme.mo | Bin 0 -> 1628 bytes .../locales/tg/LC_MESSAGES/booktheme.po | 75 + .../locales/th/LC_MESSAGES/booktheme.mo | Bin 0 -> 1766 bytes .../locales/th/LC_MESSAGES/booktheme.po | 75 + .../locales/tl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1273 bytes .../locales/tl/LC_MESSAGES/booktheme.po | 66 + .../locales/tr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1373 bytes .../locales/tr/LC_MESSAGES/booktheme.po | 75 + .../locales/uk/LC_MESSAGES/booktheme.mo | Bin 0 -> 1681 bytes .../locales/uk/LC_MESSAGES/booktheme.po | 75 + .../locales/ur/LC_MESSAGES/booktheme.mo | Bin 0 -> 1462 bytes .../locales/ur/LC_MESSAGES/booktheme.po | 66 + .../locales/vi/LC_MESSAGES/booktheme.mo | Bin 0 -> 1431 bytes .../locales/vi/LC_MESSAGES/booktheme.po | 75 + .../locales/zh_CN/LC_MESSAGES/booktheme.mo | Bin 0 -> 1310 bytes .../locales/zh_CN/LC_MESSAGES/booktheme.po | 75 + .../locales/zh_TW/LC_MESSAGES/booktheme.mo | Bin 0 -> 1341 bytes .../locales/zh_TW/LC_MESSAGES/booktheme.po | 75 + .../pygom-doc/_build/html/_static}/logo.png | Bin .../_build/html/_static}/logo_pygom.jpg | Bin docs/pygom-doc/_build/html/_static/minus.png | Bin 0 -> 90 bytes ...69c37c29e427902b24a333a5f9fcb2f0b3ac41.css | 2342 ++++ docs/pygom-doc/_build/html/_static/plus.png | Bin 0 -> 90 bytes .../_build/html/_static/pygments.css | 152 + .../html/_static/sbt-webpack-macros.html | 11 + .../_build/html/_static/scripts/bootstrap.js | 3 + .../_static/scripts/bootstrap.js.LICENSE.txt | 5 + .../html/_static/scripts/bootstrap.js.map | 1 + .../_static/scripts/pydata-sphinx-theme.js | 2 + .../scripts/pydata-sphinx-theme.js.map | 1 + .../html/_static/scripts/sphinx-book-theme.js | 2 + .../_static/scripts/sphinx-book-theme.js.map | 1 + .../_build/html/_static/searchtools.js | 531 + .../_build/html/_static/sphinx-thebe.css | 129 + .../_build/html/_static/sphinx-thebe.js | 126 + .../_build/html/_static/styles/bootstrap.css | 6 + .../_static/styles/pydata-sphinx-theme.css | 1 + .../html/_static/styles/sphinx-book-theme.css | 8 + .../_build/html/_static/styles/theme.css | 2 + .../_build/html/_static/togglebutton.css | 160 + .../_build/html/_static/togglebutton.js | 187 + .../_build/html/_static/underscore-1.13.1.js | 2042 +++ .../_build/html/_static/underscore.js | 6 + .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 + .../vendor/fontawesome/6.1.2/css/all.min.css | 5 + .../6.1.2/webfonts/fa-brands-400.ttf | Bin 0 -> 181264 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 0 -> 105112 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 0 -> 60236 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 0 -> 24028 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 0 -> 389948 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 0 -> 154840 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 0 -> 10084 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4776 bytes .../_build/html/_static/webpack-macros.html | 30 + docs/pygom-doc/_build/html/genindex.html | 393 + docs/pygom-doc/_build/html/index.html | 1 + docs/pygom-doc/_build/html/intro.html | 530 + docs/pygom-doc/_build/html/markdown.html | 552 + .../_build/html/md/getting_started.html | 579 + docs/pygom-doc/_build/html/md/unrollOde.html | 487 + .../_build/html/mdconvert/common_models/.html | 469 + .../_build/html/mdconvert/doc_to_sort/.html | 553 + .../pygom-doc/_build/html/mdconvert/mod/.html | 461 + .../_build/html/mdconvert/unroll/.html | 473 + docs/pygom-doc/_build/html/notebooks/sir.html | 962 ++ .../_build/html/notebooks/stochastic.html | 810 ++ .../_build/html/notebooks/transition.html | 733 ++ .../html/notebooks/unroll/unrollBD.html | 515 + .../html/notebooks/unroll/unrollHard.html | 527 + .../html/notebooks/unroll/unrollSimple.html | 511 + docs/pygom-doc/_build/html/objects.inv | Bin 0 -> 643 bytes .../_build/html/reports/notebooks/sir.err.log | 37 + .../html/reports/notebooks/transition.err.log | 43 + docs/pygom-doc/_build/html/search.html | 405 + docs/pygom-doc/_build/html/searchindex.js | 1 + ...8745cf0187f817a37553a042c31af498e6c31f.png | Bin 0 -> 29179 bytes ...c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png | Bin 0 -> 100432 bytes ...ac82c80ee47acc51fa9f5f4524d6db35ca6b41.png | Bin 0 -> 76796 bytes ...098459312ca2a16064752fe16688eef9d59794.png | Bin 0 -> 53891 bytes ...b2e125ef46610b644f753350393f6b7570ed19.png | Bin 0 -> 27752 bytes ...a48ea90ce9767e60c91e5df234ee3786fe52cc.png | Bin 0 -> 31060 bytes ...a201f4793ce35568e2df3fd9897fe93e8c4d57.png | Bin 0 -> 28430 bytes ...73fef42f834bed956be9667b897a3b33cbe9ef.svg | 44 + ...302c51ded12a791b68c599cd254c0ea8db65dd.png | Bin 0 -> 96634 bytes ...2205942f9352d2ffcaee47e88de52764a57449.png | Bin 0 -> 34009 bytes ...3827f0322ce73e04fa56be79899e536d192ffe.png | Bin 0 -> 28637 bytes ...3ed17d7a9b3136c85a1aae69c00bc3f813fc49.png | Bin 0 -> 32819 bytes ...4bf026da21420ebaaa2c33c4960b32e1325dcf.png | Bin 0 -> 87123 bytes ...fda2cf782787c777b79466b814cebf406b6e4b.png | Bin 0 -> 27643 bytes ...e87d6a3feec93d706aef7dff0c1f6a7032cd78.png | Bin 0 -> 27300 bytes ...82f3a46e43faa6c31200c2a2bef1fd514361f4.png | Bin 0 -> 35085 bytes .../jupyter_execute/notebooks/sir.ipynb | 870 ++ .../notebooks/stochastic.ipynb | 473 + .../notebooks/transition.ipynb | 533 + .../notebooks/unroll/unrollBD.ipynb | 7 +- .../notebooks/unroll/unrollHard.ipynb | 91 + .../notebooks/unroll/unrollSimple.ipynb | 62 + {doc/doc => docs}/pygom-doc/_config.yml | 0 {doc/doc => docs}/pygom-doc/_toc.yml | 0 docs/pygom-doc/download.png | Bin 0 -> 332663 bytes docs/pygom-doc/intro.md | 24 + docs/pygom-doc/logo.png | Bin 0 -> 9854 bytes docs/pygom-doc/logo_pygom.jpg | Bin 0 -> 9931 bytes .../pygom-doc/markdown-notebooks.md | 0 docs/pygom-doc/markdown.md | 55 + docs/pygom-doc/md/getting_started.md | 73 + .../pygom-doc/md}/unrollOde.md | 6 +- .../pygom-doc/mdconvert/common_models/.md | 0 .../mdconvert/common_models/FitzHugh.ipynb | 0 .../mdconvert/common_models/FitzHugh.md | 0 .../common_models/Legrand_Ebola_SEIHFR.ipynb | 0 .../common_models/Legrand_Ebola_SEIHFR.md | 0 .../mdconvert/common_models/Lorenz.ipynb | 0 .../mdconvert/common_models/Lorenz.md | 0 .../common_models/Lotka_Volterra.ipynb | 0 .../mdconvert/common_models/Lotka_Volterra.md | 0 .../common_models/Lotka_Volterra_4State.ipynb | 0 .../common_models/Lotka_Volterra_4State.md | 0 .../mdconvert/common_models/Robertson.ipynb | 0 .../mdconvert/common_models/Robertson.md | 0 .../mdconvert/common_models/SEIR.ipynb | 0 .../pygom-doc/mdconvert/common_models/SEIR.md | 0 .../common_models/SEIR_Birth_Death.ipynb | 0 .../common_models/SEIR_Birth_Death.md | 0 .../SEIR_Birth_Death_Periodic.ipynb | 0 .../SEIR_Birth_Death_Periodic.md | 0 .../common_models/SEIR_Multiple.ipynb | 0 .../mdconvert/common_models/SEIR_Multiple.md | 0 .../mdconvert/common_models/SIR.ipynb | 0 .../pygom-doc/mdconvert/common_models/SIR.md | 0 .../common_models/SIR_Birth_Death.ipynb | 0 .../common_models/SIR_Birth_Death.md | 35 + .../mdconvert/common_models/SIS.ipynb | 0 .../pygom-doc/mdconvert/common_models/SIS.md | 0 .../common_models/SIS_Periodic.ipynb | 0 .../mdconvert/common_models/SIS_Periodic.md | 0 .../mdconvert/common_models/vanDelPol.ipynb | 0 .../mdconvert/common_models/vanDelPol.md | 0 .../pygom-doc/mdconvert/doc_to_sort/.md | 0 .../mdconvert/doc_to_sort/bvpSimple.ipynb | 0 .../mdconvert/doc_to_sort/bvpSimple.md | 201 + .../mdconvert/doc_to_sort/common_models.ipynb | 0 .../mdconvert/doc_to_sort/common_models.md | 0 .../pygom-doc/mdconvert/doc_to_sort/epi.ipynb | 0 .../pygom-doc/mdconvert/doc_to_sort/epi.md | 0 .../mdconvert/doc_to_sort/epijson.ipynb | 0 .../mdconvert/doc_to_sort/epijson.md | 0 .../mdconvert/doc_to_sort/estimate1.ipynb | 0 .../mdconvert/doc_to_sort/estimate1.md | 0 .../mdconvert/doc_to_sort/estimate2.ipynb | 0 .../mdconvert/doc_to_sort/estimate2.md | 0 .../pygom-doc/mdconvert/doc_to_sort/faq.ipynb | 0 .../pygom-doc/mdconvert/doc_to_sort/faq.md | 0 .../pygom-doc/mdconvert/doc_to_sort/fh.ipynb | 0 .../pygom-doc/mdconvert/doc_to_sort/fh.md | 0 .../mdconvert/doc_to_sort/gradient.ipynb | 0 .../mdconvert/doc_to_sort/gradient.md | 0 .../mdconvert/doc_to_sort/initialGuess.ipynb | 0 .../mdconvert/doc_to_sort/initialGuess.md | 0 .../mdconvert/doc_to_sort/profile.ipynb | 0 .../mdconvert/doc_to_sort/profile.md | 0 .../pygom-doc/mdconvert/doc_to_sort/ref.ipynb | 0 .../mdconvert/doc_to_sort/stochastic.md | 0 .../mdconvert/doc_to_sort/transition.md | 0 .../mdconvert/doc_to_sort/unrollOde.ipynb | 0 .../pygom-doc/mdconvert/mod/.md | 0 .../mdconvert/mod/common_models.ipynb | 0 .../pygom-doc/mdconvert/mod/common_models.md | 0 .../mdconvert/mod/confidence_interval.ipynb | 0 .../mdconvert/mod/confidence_interval.md | 0 .../mdconvert/mod/deterministic.ipynb | 0 .../pygom-doc/mdconvert/mod/deterministic.md | 0 .../mdconvert/mod/epi_analysis.ipynb | 0 .../pygom-doc/mdconvert/mod/epi_analysis.md | 0 .../pygom-doc/mdconvert/mod/get_init.ipynb | 0 .../pygom-doc/mdconvert/mod/get_init.md | 0 .../pygom-doc/mdconvert/mod/index.ipynb | 0 .../pygom-doc/mdconvert/mod/index.md | 0 .../pygom-doc/mdconvert/mod/losstype.ipynb | 0 .../pygom-doc/mdconvert/mod/losstype.md | 0 .../pygom-doc/mdconvert/mod/odeloss.ipynb | 0 .../pygom-doc/mdconvert/mod/odeloss.md | 0 .../pygom-doc/mdconvert/mod/odeutils.ipynb | 0 .../pygom-doc/mdconvert/mod/odeutils.md | 0 .../pygom-doc/mdconvert/mod/simulate.ipynb | 0 docs/pygom-doc/mdconvert/mod/simulate.md | 5 + .../pygom-doc/mdconvert/mod/transition.ipynb | 0 .../pygom-doc/mdconvert/mod/transition.md | 0 .../pygom-doc/mdconvert/unroll/.md | 0 .../pygom-doc/mdconvert/unroll/unrollBD.md | 0 .../pygom-doc/mdconvert/unroll/unrollHard.md | 0 .../mdconvert/unroll/unrollSimple.md | 57 + {doc/doc => docs}/pygom-doc/notebooks.ipynb | 0 .../pygom-doc/notebooks/sir.ipynb | 0 docs/pygom-doc/notebooks/stochastic.ipynb | 495 + .../pygom-doc/notebooks/transition.ipynb | 0 .../pygom-doc/notebooks/unroll/unrollBD.ipynb | 79 + .../notebooks/unroll/unrollHard.ipynb | 0 .../notebooks/unroll/unrollSimple.ipynb | 0 {doc/doc => docs}/pygom-doc/ref.md | 0 {doc/doc => docs}/pygom-doc/references.bib | 0 {doc/doc => docs}/pygom-doc/requirements.txt | 0 {doc/doc => docs}/pygom-doc/rst_to_md.sh | 0 350 files changed, 37000 insertions(+), 337 deletions(-) delete mode 100644 doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb create mode 100644 docs/pygom-doc/_build/.doctrees/environment.pickle create mode 100644 docs/pygom-doc/_build/.doctrees/intro.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/markdown.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/md/getting_started.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/md/unrollOde.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/common_models/.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/doc_to_sort/.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/mod/.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/unroll/.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/sir.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/stochastic.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/transition.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollBD.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollHard.doctree create mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollSimple.doctree create mode 100644 docs/pygom-doc/_build/.jupyter_cache/__version__.txt create mode 100644 docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb create mode 100644 docs/pygom-doc/_build/.jupyter_cache/global.db create mode 100644 docs/pygom-doc/_build/html/.buildinfo create mode 100644 docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb create mode 100644 docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb create mode 100644 docs/pygom-doc/_build/html/_images/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png create mode 100644 docs/pygom-doc/_build/html/_images/124c0a87b71e3051b37c4e2b32c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png create mode 100644 docs/pygom-doc/_build/html/_images/2490b23413b63fce1d9d3fa66eac82c80ee47acc51fa9f5f4524d6db35ca6b41.png create mode 100644 docs/pygom-doc/_build/html/_images/3977d0899645312aa27d27be07098459312ca2a16064752fe16688eef9d59794.png create mode 100644 docs/pygom-doc/_build/html/_images/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png create mode 100644 docs/pygom-doc/_build/html/_images/5d8f7f60739053c865b0e6582da48ea90ce9767e60c91e5df234ee3786fe52cc.png create mode 100644 docs/pygom-doc/_build/html/_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png create mode 100644 docs/pygom-doc/_build/html/_images/7384a8151e54a62cf521fd1fdf73fef42f834bed956be9667b897a3b33cbe9ef.svg create mode 100644 docs/pygom-doc/_build/html/_images/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png create mode 100644 docs/pygom-doc/_build/html/_images/88643cf1ab842448ada04b3ab82205942f9352d2ffcaee47e88de52764a57449.png create mode 100644 docs/pygom-doc/_build/html/_images/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png create mode 100644 docs/pygom-doc/_build/html/_images/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png create mode 100644 docs/pygom-doc/_build/html/_images/a2b4c66c36cd941577d5e6e1b74bf026da21420ebaaa2c33c4960b32e1325dcf.png create mode 100644 docs/pygom-doc/_build/html/_images/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png create mode 100644 docs/pygom-doc/_build/html/_images/c99713862d51a7e54f23602d6de87d6a3feec93d706aef7dff0c1f6a7032cd78.png create mode 100644 docs/pygom-doc/_build/html/_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/intro.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/markdown.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/md/getting_started.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/md/unrollOde.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/mdconvert/common_models/.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/mdconvert/doc_to_sort/.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/mdconvert/mod/.md (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/mdconvert/unroll/.md (100%) create mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_sources}/notebooks/stochastic.ipynb (100%) create mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb rename {doc/doc/pygom-doc/mdconvert => docs/pygom-doc/_build/html/_sources/notebooks}/unroll/unrollBD.ipynb (100%) rename {doc/doc/pygom-doc/mdconvert => docs/pygom-doc/_build/html/_sources/notebooks}/unroll/unrollHard.ipynb (100%) rename {doc/doc/pygom-doc/mdconvert => docs/pygom-doc/_build/html/_sources/notebooks}/unroll/unrollSimple.ipynb (100%) create mode 100644 docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css create mode 100644 docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js create mode 100644 docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js create mode 100644 docs/pygom-doc/_build/html/_static/basic.css create mode 100644 docs/pygom-doc/_build/html/_static/check-solid.svg create mode 100644 docs/pygom-doc/_build/html/_static/clipboard.min.js create mode 100644 docs/pygom-doc/_build/html/_static/copy-button.svg create mode 100644 docs/pygom-doc/_build/html/_static/copybutton.css create mode 100644 docs/pygom-doc/_build/html/_static/copybutton.js create mode 100644 docs/pygom-doc/_build/html/_static/copybutton_funcs.js create mode 100644 docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css create mode 100644 docs/pygom-doc/_build/html/_static/design-tabs.js create mode 100644 docs/pygom-doc/_build/html/_static/doctools.js create mode 100644 docs/pygom-doc/_build/html/_static/documentation_options.js create mode 100644 docs/pygom-doc/_build/html/_static/file.png create mode 100644 docs/pygom-doc/_build/html/_static/images/logo_binder.svg create mode 100644 docs/pygom-doc/_build/html/_static/images/logo_colab.png create mode 100644 docs/pygom-doc/_build/html/_static/images/logo_deepnote.svg create mode 100644 docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg create mode 100644 docs/pygom-doc/_build/html/_static/jquery-3.6.0.js create mode 100644 docs/pygom-doc/_build/html/_static/jquery.js create mode 100644 docs/pygom-doc/_build/html/_static/language_data.js create mode 100644 docs/pygom-doc/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/bn/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/bn/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ca/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ca/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/da/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/da/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/de/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/de/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/el/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/el/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/es/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/es/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/et/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/et/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/hr/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/hr/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/id/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/id/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/it/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/it/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ja/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ja/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/no/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/no/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/te/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/te/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/th/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/th/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/uk/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/uk/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/vi/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/vi/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po create mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo create mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_static}/logo.png (100%) rename {doc/doc/pygom-doc => docs/pygom-doc/_build/html/_static}/logo_pygom.jpg (100%) create mode 100644 docs/pygom-doc/_build/html/_static/minus.png create mode 100644 docs/pygom-doc/_build/html/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css create mode 100644 docs/pygom-doc/_build/html/_static/plus.png create mode 100644 docs/pygom-doc/_build/html/_static/pygments.css create mode 100644 docs/pygom-doc/_build/html/_static/sbt-webpack-macros.html create mode 100644 docs/pygom-doc/_build/html/_static/scripts/bootstrap.js create mode 100644 docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt create mode 100644 docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map create mode 100644 docs/pygom-doc/_build/html/_static/scripts/pydata-sphinx-theme.js create mode 100644 docs/pygom-doc/_build/html/_static/scripts/pydata-sphinx-theme.js.map create mode 100644 docs/pygom-doc/_build/html/_static/scripts/sphinx-book-theme.js create mode 100644 docs/pygom-doc/_build/html/_static/scripts/sphinx-book-theme.js.map create mode 100644 docs/pygom-doc/_build/html/_static/searchtools.js create mode 100644 docs/pygom-doc/_build/html/_static/sphinx-thebe.css create mode 100644 docs/pygom-doc/_build/html/_static/sphinx-thebe.js create mode 100644 docs/pygom-doc/_build/html/_static/styles/bootstrap.css create mode 100644 docs/pygom-doc/_build/html/_static/styles/pydata-sphinx-theme.css create mode 100644 docs/pygom-doc/_build/html/_static/styles/sphinx-book-theme.css create mode 100644 docs/pygom-doc/_build/html/_static/styles/theme.css create mode 100644 docs/pygom-doc/_build/html/_static/togglebutton.css create mode 100644 docs/pygom-doc/_build/html/_static/togglebutton.js create mode 100644 docs/pygom-doc/_build/html/_static/underscore-1.13.1.js create mode 100644 docs/pygom-doc/_build/html/_static/underscore.js create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf create mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 create mode 100644 docs/pygom-doc/_build/html/_static/webpack-macros.html create mode 100644 docs/pygom-doc/_build/html/genindex.html create mode 100644 docs/pygom-doc/_build/html/index.html create mode 100644 docs/pygom-doc/_build/html/intro.html create mode 100644 docs/pygom-doc/_build/html/markdown.html create mode 100644 docs/pygom-doc/_build/html/md/getting_started.html create mode 100644 docs/pygom-doc/_build/html/md/unrollOde.html create mode 100644 docs/pygom-doc/_build/html/mdconvert/common_models/.html create mode 100644 docs/pygom-doc/_build/html/mdconvert/doc_to_sort/.html create mode 100644 docs/pygom-doc/_build/html/mdconvert/mod/.html create mode 100644 docs/pygom-doc/_build/html/mdconvert/unroll/.html create mode 100644 docs/pygom-doc/_build/html/notebooks/sir.html create mode 100644 docs/pygom-doc/_build/html/notebooks/stochastic.html create mode 100644 docs/pygom-doc/_build/html/notebooks/transition.html create mode 100644 docs/pygom-doc/_build/html/notebooks/unroll/unrollBD.html create mode 100644 docs/pygom-doc/_build/html/notebooks/unroll/unrollHard.html create mode 100644 docs/pygom-doc/_build/html/notebooks/unroll/unrollSimple.html create mode 100644 docs/pygom-doc/_build/html/objects.inv create mode 100644 docs/pygom-doc/_build/html/reports/notebooks/sir.err.log create mode 100644 docs/pygom-doc/_build/html/reports/notebooks/transition.err.log create mode 100644 docs/pygom-doc/_build/html/search.html create mode 100644 docs/pygom-doc/_build/html/searchindex.js create mode 100644 docs/pygom-doc/_build/jupyter_execute/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/124c0a87b71e3051b37c4e2b32c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/2490b23413b63fce1d9d3fa66eac82c80ee47acc51fa9f5f4524d6db35ca6b41.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/3977d0899645312aa27d27be07098459312ca2a16064752fe16688eef9d59794.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/5d8f7f60739053c865b0e6582da48ea90ce9767e60c91e5df234ee3786fe52cc.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/7384a8151e54a62cf521fd1fdf73fef42f834bed956be9667b897a3b33cbe9ef.svg create mode 100644 docs/pygom-doc/_build/jupyter_execute/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/88643cf1ab842448ada04b3ab82205942f9352d2ffcaee47e88de52764a57449.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/a2b4c66c36cd941577d5e6e1b74bf026da21420ebaaa2c33c4960b32e1325dcf.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/c99713862d51a7e54f23602d6de87d6a3feec93d706aef7dff0c1f6a7032cd78.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png create mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/sir.ipynb create mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/stochastic.ipynb create mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/transition.ipynb rename {doc/doc/pygom-doc => docs/pygom-doc/_build/jupyter_execute}/notebooks/unroll/unrollBD.ipynb (97%) create mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollHard.ipynb create mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollSimple.ipynb rename {doc/doc => docs}/pygom-doc/_config.yml (100%) rename {doc/doc => docs}/pygom-doc/_toc.yml (100%) create mode 100644 docs/pygom-doc/download.png create mode 100644 docs/pygom-doc/intro.md create mode 100644 docs/pygom-doc/logo.png create mode 100644 docs/pygom-doc/logo_pygom.jpg rename {doc/doc => docs}/pygom-doc/markdown-notebooks.md (100%) create mode 100644 docs/pygom-doc/markdown.md create mode 100644 docs/pygom-doc/md/getting_started.md rename {doc/doc/pygom-doc/mdconvert/doc_to_sort => docs/pygom-doc/md}/unrollOde.md (80%) rename doc/doc/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md => docs/pygom-doc/mdconvert/common_models/.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/FitzHugh.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/FitzHugh.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Lorenz.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Lorenz.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Lotka_Volterra.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Lotka_Volterra.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Robertson.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/Robertson.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR_Multiple.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SEIR_Multiple.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIR.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIR.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIR_Birth_Death.ipynb (100%) create mode 100644 docs/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIS.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIS.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIS_Periodic.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/SIS_Periodic.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/vanDelPol.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/common_models/vanDelPol.md (100%) rename doc/doc/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md => docs/pygom-doc/mdconvert/doc_to_sort/.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/bvpSimple.ipynb (100%) create mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/common_models.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/epi.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/epi.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/epijson.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/epijson.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/estimate1.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/estimate1.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/estimate2.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/estimate2.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/faq.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/faq.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/fh.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/fh.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/gradient.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/gradient.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/initialGuess.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/initialGuess.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/profile.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/profile.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/ref.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/stochastic.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/transition.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb (100%) rename doc/doc/pygom-doc/mdconvert/mod/simulate.md => docs/pygom-doc/mdconvert/mod/.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/common_models.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/common_models.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/confidence_interval.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/confidence_interval.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/deterministic.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/deterministic.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/epi_analysis.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/epi_analysis.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/get_init.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/get_init.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/index.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/index.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/losstype.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/losstype.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/odeloss.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/odeloss.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/odeutils.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/odeutils.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/simulate.ipynb (100%) create mode 100644 docs/pygom-doc/mdconvert/mod/simulate.md rename {doc/doc => docs}/pygom-doc/mdconvert/mod/transition.ipynb (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/mod/transition.md (100%) rename doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.md => docs/pygom-doc/mdconvert/unroll/.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/unroll/unrollBD.md (100%) rename {doc/doc => docs}/pygom-doc/mdconvert/unroll/unrollHard.md (100%) create mode 100644 docs/pygom-doc/mdconvert/unroll/unrollSimple.md rename {doc/doc => docs}/pygom-doc/notebooks.ipynb (100%) rename {doc/doc => docs}/pygom-doc/notebooks/sir.ipynb (100%) create mode 100644 docs/pygom-doc/notebooks/stochastic.ipynb rename {doc/doc => docs}/pygom-doc/notebooks/transition.ipynb (100%) create mode 100644 docs/pygom-doc/notebooks/unroll/unrollBD.ipynb rename {doc/doc => docs}/pygom-doc/notebooks/unroll/unrollHard.ipynb (100%) rename {doc/doc => docs}/pygom-doc/notebooks/unroll/unrollSimple.ipynb (100%) rename {doc/doc => docs}/pygom-doc/ref.md (100%) rename {doc/doc => docs}/pygom-doc/references.bib (100%) rename {doc/doc => docs}/pygom-doc/requirements.txt (100%) rename {doc/doc => docs}/pygom-doc/rst_to_md.sh (100%) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index c66c3eb6..13842248 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -10,7 +10,7 @@ on: branches: - install-fix-docs paths: - - doc/** + - docs/** jobs: deploy-book: @@ -27,17 +27,17 @@ jobs: # install dependencies - name: Install dependencies run: | - pip install -r doc/doc/pygom-doc/requirements.txt + pip install -r docs/pygom-doc/requirements.txt # build the book - name: Build the book run: | - jupyter-book build doc/doc/pygom-doc + jupyter-book build docs/pygom-doc # deploy book to github-pages - name: GitHub Pages uses: peaceiris/actions-gh-pages@v3.6.1 with: github_token: ${{ secrets.DEPLOY_BOOK }} - publish_dir: doc/doc/pygom-doc/_build/html + publish_dir: docs/pygom-doc/_build/html diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb b/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb deleted file mode 100644 index fd83edb7..00000000 --- a/doc/doc/pygom-doc/mdconvert/doc_to_sort/stochastic.ipynb +++ /dev/null @@ -1,328 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stochastic representation of ode\n", - "\n", - "There are multiple interpretation of stochasticity of a deterministic\n", - "ode. We have implemented two of the most common interpretation; when the\n", - "parameters are realizations of some underlying distribution, and when we\n", - "have a so called chemical master equation where each transition\n", - "represent a jump. Again, we use the standard SIR example as previously\n", - "seen in ref:sir.\n", - "\n", - "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[1\\]: import numpy as np\n", - "\n", - "In \\[1\\]: x0 = \\[1, 1.27e-6, 0\\]\n", - "\n", - "In \\[1\\]: t = np.linspace(0, 150, 100)\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[1\\]: paramList = \\['beta', 'gamma'\\]\n", - "\n", - "In \\[1\\]: transitionList = \\[ \n", - "...: Transition(origin='S', destination='I', equation='beta\\*S\\*I',\n", - "transition_type=TransitionType.T), ...: Transition(origin='I',\n", - "destination='R', equation='gamma\\*I', transition_type=TransitionType.T)\n", - "...: \\]\n", - "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", - "\n", - "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0\\]\n", - "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", - "\n", - "In \\[1\\]: solutionReference = odeS.integrate(t\\[1::\\],\n", - "full_output=False)\n", - "\n", - "## Stochastic Parameter\n", - "\n", - "In our first scenario, we assume that the parameters follow some\n", - "underlying distribution. Given that both $\\beta$ and $\\gamma$ in our SIR\n", - "model has to be non-negative, it seemed natural to use a Gamma\n", - "distribution. We make use of the familiar syntax from\n", - "[R](http://www.r-project.org/) to define our distribution.\n", - "Unfortunately, we have to define it via a tuple, where the first is the\n", - "function handle (name) while the second the parameters. Note that the\n", - "parameters can be defined as either a dictionary or as the same sequence\n", - "as [R](http://www.r-project.org/), which is the shape then the rate in\n", - "the Gamma case.\n", - "\n", - "In \\[1\\]: from pygom.utilR import rgamma\n", - "\n", - "In \\[1\\]: d = dict()\n", - "\n", - "In \\[1\\]: d\\['beta'\\] = (rgamma,{'shape':100.0, 'rate':200.0})\n", - "\n", - "In \\[1\\]: d\\['gamma'\\] = (rgamma,(100.0, 300.0))\n", - "\n", - "In \\[1\\]: odeS.parameters = d\n", - "\n", - "In \\[1\\]: Ymean, Yall = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", - "\n", - "Note that a message is printed above where it is trying to connect to an\n", - "mpi backend, as our module has the capability to compute in parallel\n", - "using the IPython. We have simulated a total of 10 different solutions\n", - "using different parameters, the plots can be seen below\n", - "\n", - "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", - "\n", - "In \\[1\\]: for solution in Yall: \n", - "...: axarr\\[0\\].plot(t, solution\\[:,0\\]) ...: axarr\\[1\\].plot(t,\n", - "solution\\[:,1\\]) ...: axarr\\[2\\].plot(t, solution\\[:,2\\])\n", - "\n", - "@savefig stochastic_param_all.png In \\[1\\]: plt.show()\n", - "\n", - "In \\[1\\]: plt.close()\n", - "\n", - "We then see how the expected results, using the sample average of the\n", - "simulations\n", - "\n", - "$$\\tilde{x}(T) = \\mathbb{E}\\left[ \\int_{t_{0}}^{T} f(\\theta,x,t) dt \\right]$$\n", - "\n", - "differs from the reference solution\n", - "\n", - "$$\\hat{x}(T) = \\int_{t_{0}}^{T} f(\\mathbb{E}\\left[ \\theta \\right],x,t) dt$$\n", - "\n", - "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", - "\n", - "In \\[1\\]: for i in range(3): axarr\\[i\\].plot(t, Ymean\\[:,i\\] -\n", - "solutionReference\\[:,i\\])\n", - "\n", - "@savefig stochastic_param_compare.png In \\[1\\]: plt.show()\n", - "\n", - "In \\[1\\]: plt.close()\n", - "\n", - "The difference is relatively large especially for the $S$ state. We can\n", - "decrease this difference as we increase the number of simulation, and\n", - "more sophisticated sampling method for the generation of random\n", - "variables can also decrease the difference.\n", - "\n", - "In addition to using the built-in functions to represent stochasticity,\n", - "we can also use standard frozen distributions from scipy. Note that it\n", - "must be a frozen distribution as that is the only for the parameters of\n", - "the distributions to propagate through the model.\n", - "\n", - "In \\[1\\]: import scipy.stats as st\n", - "\n", - "In \\[1\\]: d = dict()\n", - "\n", - "In \\[1\\]: d\\['beta'\\] = st.gamma(a=100.0, scale=1.0/200.0)\n", - "\n", - "In \\[1\\]: d\\['gamma'\\] = st.gamma(a=100.0, scale=1.0/300.0)\n", - "\n", - "In \\[1\\]: odeS.parameters = d\n", - "\n", - "Obviously, there may be scenarios where only some of the parameters are\n", - "stochastic. Let's say that the $\\gamma$ parameter is fixed at $1/3$,\n", - "then simply replace the distribution information with a scalar. A quick\n", - "visual inspection at the resulting plot suggests that the system of ODE\n", - "potentially has less variation when compared to the case where both\n", - "parameters are stochastic.\n", - "\n", - "In \\[1\\]: d\\['gamma'\\] = 1.0/3.0\n", - "\n", - "In \\[1\\]: odeS.parameters = d\n", - "\n", - "In \\[1\\]: YmeanSingle, YallSingle = odeS.simulate_param(t\\[1::\\], 5,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", - "\n", - "In \\[1\\]: for solution in YallSingle: \n", - "...: axarr\\[0\\].plot(t,solution\\[:,0\\]) ...:\n", - "axarr\\[1\\].plot(t,solution\\[:,1\\]) ...:\n", - "axarr\\[2\\].plot(t,solution\\[:,2\\])\n", - "\n", - "@savefig stochastic_param_single.png In \\[1\\]: plt.show()\n", - "\n", - "In \\[1\\]: plt.close()\n", - "\n", - "## Continuous Markov Representation\n", - "\n", - "Another common method of introducing stochasticity into a set of ode is\n", - "by assuming each movement in the system is a result of a jump process.\n", - "More concretely, the probabilty of a move for transition $j$ is governed\n", - "by an exponential distribution such that\n", - "\n", - "$$\\Pr(\\text{process $j$ jump within time } \\tau) = \\lambda_{j} e^{-\\lambda_{j} \\tau},$$\n", - "\n", - "where $\\lambda_{j}$ is the rate of transition for process $j$ and $\\tau$\n", - "the time elapsed after current time $t$.\n", - "\n", - "A couple of the commmon implementation for the jump process have been\n", - "implemented where two of them are used during a normal simulation; the\n", - "first reaction method [\\[Gillespie1977\\]]() and the $\\tau$-Leap method\n", - "[\\[Cao2006\\]](). The two changes interactively depending on the size of\n", - "the states.\n", - "\n", - "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[1\\]: paramList = \\['beta', 'gamma', 'N'\\]\n", - "\n", - "In \\[1\\]: transitionList = \\[ \n", - "...: Transition(origin='S', destination='I', equation='beta\\*S\\*I/N',\n", - "transition_type=TransitionType.T), ...: Transition(origin='I',\n", - "destination='R', equation='gamma\\*I', transition_type=TransitionType.T)\n", - "...: \\]\n", - "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", - "\n", - "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", - "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", - "\n", - "In \\[1\\]: solutionReference = odeS.integrate(t\\[1::\\])\n", - "\n", - "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: f, axarr = plt.subplots(1, 3)\n", - "\n", - "In \\[1\\]: for solution in simX: \n", - "...: axarr\\[0\\].plot(t\\[:9\\], solution\\[:,0\\]) ...:\n", - "axarr\\[1\\].plot(t\\[:9\\], solution\\[:,1\\]) ...: axarr\\[2\\].plot(t\\[:9\\],\n", - "solution\\[:,2\\])\n", - "\n", - "@savefig stochastic_process.png In \\[1\\]: plt.show()\n", - "\n", - "In \\[1\\]: plt.close()\n", - "\n", - "Above, we see ten different simulation, again using the SIR model but\n", - "without standardization of the initial conditions. We restrict our time\n", - "frame to be only the first 10 time points so that the individual changes\n", - "can be seen more clearly above. If we use the same time frame as the one\n", - "used previously for the deterministic system (as shown below), the\n", - "trajectories are smoothed out and we no longer observe the *jumps*.\n", - "Looking at the raw trajectories of the ODE below, it is obvious that the\n", - "mean from a jump process is very different to the deterministic\n", - "solution. The reason behind this is that the jump process above was able\n", - "to fully remove all the initial infected individuals before any new\n", - "ones.\n", - "\n", - "In \\[1\\]: simX,simT = odeS.simulate_jump(t, 5, full_output=True)\n", - "\n", - "In \\[1\\]: simMean = np.mean(simX, axis=0)\n", - "\n", - "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", - "\n", - "In \\[1\\]: for solution in simX: \n", - "...: axarr\\[0\\].plot(t, solution\\[:,0\\]) ...: axarr\\[1\\].plot(t,\n", - "solution\\[:,1\\]) ...: axarr\\[2\\].plot(t, solution\\[:,2\\])\n", - "\n", - "@savefig stochastic_process_compare_large_n\\_curves.png In \\[1\\]:\n", - "plt.show()\n", - "\n", - "In \\[1\\]: plt.close()\n", - "\n", - "## Repeatable Simulation\n", - "\n", - "One of the possible use of compartmental models is to generate\n", - "forecasts. Although most of the time the requirement would be to have\n", - "(at least point-wise) convergence in the limit, reproducibility is also\n", - "important. For both types of interpretation explained above, we have\n", - "given the package the capability to repeat the simulations by setting a\n", - "seed. When the assumption is that the parameters follows some sort of\n", - "distribution, we simply set the seed which governs the global state of\n", - "the random number generator.\n", - "\n", - "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", - "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", - "\n", - "In \\[1\\]: d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':\n", - "st.gamma(a=100.0, scale=1.0/300.0), 'N': x0\\[0\\]}\n", - "\n", - "In \\[1\\]: odeS.parameters = d\n", - "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", - "\n", - "In \\[1\\]: Ymean, Yall = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: np.random.seed(1)\n", - "\n", - "In \\[1\\]: Ymean1, Yall1 = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: np.random.seed(1)\n", - "\n", - "In \\[1\\]: Ymean2, Yall2 = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: sim_diff = \\[np.linalg.norm(Yall\\[i\\] - yi) for i, yi in\n", - "enumerate(Yall1)\\]\n", - "\n", - "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(Yall2\\[i\\] - yi) for i, yi in\n", - "enumerate(Yall1)\\]\n", - "\n", - "In \\[1\\]: print(\"Different in the simulations and the mean: (%s, %s) \" %\n", - "(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))\n", - "\n", - "In \\[1\\]: print(\"Different in the simulations and the mean using same\n", - "seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 -\n", - "Ymean1))))\n", - "\n", - "In the alternative interpretation, setting the global seed is\n", - "insufficient. Unlike simulation based on the parameters, where we can\n", - "pre-generate all the parameter values and send them off to individual\n", - "processes in the parallel backend, this is prohibitive here. In a\n", - "nutshell, the seed does not propagate when using a parallel backend\n", - "because each *integration* requires an unknown number of random samples.\n", - "Therefore, we have an additional flag **parallel** in the function\n", - "signature. By ensuring that the computation runs in serial, we can make\n", - "use of the global seed and generate identical runs.\n", - "\n", - "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", - "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", - "\n", - "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", - "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", - "\n", - "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10, parallel=False,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: np.random.seed(1)\n", - "\n", - "In \\[1\\]: simX1, simT1 = odeS.simulate_jump(t\\[1:10\\], 10,\n", - "parallel=False, full_output=True)\n", - "\n", - "In \\[1\\]: np.random.seed(1)\n", - "\n", - "In \\[1\\]: simX2, simT2 = odeS.simulate_jump(t\\[1:10\\], 10,\n", - "parallel=False, full_output=True)\n", - "\n", - "In \\[1\\]: sim_diff = \\[np.linalg.norm(simX\\[i\\] - x1) for i, x1 in\n", - "enumerate(simX1)\\]\n", - "\n", - "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(simX2\\[i\\] - x1) for i, x1 in\n", - "enumerate(simX1)\\]\n", - "\n", - "In \\[1\\]: print(\"Difference in simulation: %s\" %\n", - "np.sum(np.abs(sim_diff)))\n", - "\n", - "In \\[1\\]: print(\"Difference in simulation using same seed: %s\" %\n", - "np.sum(np.abs(sim_diff12)))" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/.doctrees/environment.pickle b/docs/pygom-doc/_build/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..675a2f8b92289b900dc8bd92563bec10a7fa9285 GIT binary patch literal 53145 zcmdUY4Rl;dR^IqmmTbwEWqa)T*?G2i#*#;BNv(g+dUrgQ$M(pUjpdoyosp;Kb@yw% z_tbyWuUodpcW5WXmXma3ifIxsHKo*ujSO_GW1P(d;gr5aAyJ54iY|bH^kVA6V z6ClZw@7}6b7i>IpcnMuc~g{s(b6+TeqrieeI6#{FdK(g#YvRdqvyH--=oJ z6{l3l=d66W>hF7@;$+k3v`^nr9r$SVPPO0PW)_RpdA}=NNR>;Lm3B&1|CO_+7GL(P zlDBxl%;!xz_NtT3I%dvWoGqj(1kzhva?142t|S+Wt4oF4A^`9|ejB2=g0>VF zvh8>Vfr!OoRlg@|R`QguQZB2q`}2je#g#buvQ^5MDOBE(%9@_%q|myglTTYEbatXr z%2xeH0L85oSCLhHv!C*J0O_Pvz2|qP3RzQRwV$f^dx~b+PLvA?5CTNlE*?E4t61=y za-p;;fDYQ_a?v|AJS@l>OBHg%m1WyAhX4-n3MG>oJIn+|*J$OFB@-<|C+18KI92^U zXn)B}WD00jsS4co*@c{yD4I)F!pQ@dRQ0aE2h3GKSD>fCq{!51=FRMC*#VY!(0faT z!cx{s1RoPl8o50GV8yc%dhOhi0C<2Bz`|uwk?3IbM=yPMJg;JTve&D3EB+y-qgSYu zQdZW9M0VyYIby53V1P=oSh74Xanmg2o&1tly@BTCR=qO#I%hf{zNvV| zDHA94U0pqY<+6cZ=Apu!hORLyWxIf`8NFIbW}TFA!7{UD+c=kB%9{DKF>Jg%r@k#% zsY=NyuNr5TtbA&J&Fz?LNYEHbH%~%qy7^glBQ=7yW+!MFq0T=a)6TP>9SXg1@Nrr zcpy?2sAv%%VT9fTb%ID--bh-mkVeC|gV})Y6OklIH;pCy zJy{cy3VpfcxzNGyamc~O6A5lrd88pri z8DPDqS&OhhTrmY_)WAtw5CAzeEAxFL>6WuObM>%NHl%PD#Pq_MBg2XrjccR zt5KnB!Nc63D0=B|v=GTgBsVICB$xx)hH0Jyi$=*MjSHv^HC?H(b0uGb9WyK*FU)eK zS`S5%FPNn?XV54g$)F9by`e5(v#{!GgDo<^LM4K2W^AYkWFd|CHHCyOkl6;C z!Y)MAfy_R(vFu7C$Wl#(S*R3bPE9IAv1Yv>Goi~Ht53=l5w)_w)J6-0l2w*mTMGpW zLgvyEW?Q<`B^L2J?ml`pRHHNlINh^$c)0y^fxoqaSLIs=^K&3vd`VM zU&LhMJpNs-23b|kRf5eX`6P^PWc_TEHOE> zt-H2sFZ;XsRk_P{%Q?&o@PA?Q=O#re&3I|LMh+>SeEU6C5&o?dTrFb82tP{?I~F3J zy7`lHRyRVcm$F|b5PO4mmH}D$f^V?%3%=Z0#@avRIl~lQc zbm6hv#=4UyenT|z+bQ|b{^N?@Eu2DdYLQ2Qy@(y2s0XeF_-v>~<7t}e!gmCi@HxEb zEXDZKjxxC`FvY%3PyW=E0s)7T*+L5a(shZ9oBR@`RJ18Fj4QZ7OgJ4LZ7`>dnMDV+ zEFjZmw7=r-f>(q*z~u5k?vCq) z)OEaunRlR;96Lk^*o&|qFX98z{oQJINxk+r%(WM|gu+FlX~D&6vIn>7?C(lAfq z;@XunZ>6mwTrMyDE&lU&36GSOhC^pp$->0hJ zxjF)9na5;i`>Uc)+%5P3_l01i;~^U~vSe#1{Zy0eFq~_%9&M79jp#75;GRWNLq@cWb0AyKlIJg%;JYb+6Xd;N}Zsl?w0 za{+E%?*dj@&e9r3)gOWUjiX3HCcPs;MBd+#Zd0>lnN`p853nvMVs2=XbJt6-|JmPi z96mXrWq^=auOdG#2|2I}VX4FAw=Vv#$s+bZqOZ8$dXgy0R>MWj`wUp!NJ`|Z^P3v$qgmGeEnL*}6_ zaIX^^ekG`T7r~b-r9Rr9v%jGJhToOfZs5L#CZ)9jzq3-#3{4NgiyEL|f5=`9O6*Bn z851rva5t23*h7cSbUKm2QWW6@&pKR_v@QV>-wn#{qdYL2D(Erl0X^->a>>c@Y8Ocq z-8WvOmArcakUebn2v0fI2-J7-=LXc@Z)2e+ON%{0w}Unk^PpXRZIl(S?Z{X3>w z#X_EzimU$H_g`^wHEov7gtUP~rQ)|yieCBORjaLlpnDZ95=ksTV;If{N!`nqRScIF zLxzBpKcM9ya2-z~AUoJKj|E9usD#C!Bt{nu+63mKSP0bEn!iHsM8EE5W`$$~bCeTU z@WGm9$mTsou(F9YVX?Xikx^U?nQl)WTLe5whU)x0Nw$6B8?AN7mAE@dLBgJ#nWq(B zkJp#O(Y6boxT2FY$q7m=oqv9p z+-OV21kl0|CgrTot*Z%TC6j9Sj|n{Bj-(W}-1vtw2Yt3s>E* z=#}o`;uY*q5Z{&37i~+?)|2W$(97cM60%#`SBZGZ3Z}n70f8NMYhbwYVk$r`P!_q-!SKvLu8u*BAZ4jSTYS6S#&f_(qXiK^Zp^VS+z|d1v!*}yucvW zhSCA<4$PQDQsSnQrXd-Y6>Vi*h_!Z_F*|u!aHvAjSmdBR04(`{luFshz_C=CDmh~A z7NvzqheCsx!%8l;Ttw4*x%^G+ub_D;L@UgqF6_*3-bN8K8=yeztATvo%a$f{x6-F7 zjn-g;zp)6b{>GLU+DL>(mdXh+3DgqBE+et`C{PEqZmWuuCnos&_w7Fj{{F1}AJpHf z3M_RxDTPQEn!}@>s{i_?!4Fs4L+H&npEa>knqyDP^C94mY$DoX zGfN12sVVGPH3Mm3#~d*ZV2e!#VpD+Xe9fw0_JY>MJ}cftp_u~*ISn(ba-vd%;bg(O zpA)uxG)cBbUL(S=WYN%B$KfmPRy{i zMYJZSv`~zIV50=Ji}vwgJ69=DNb*dI-B>)Ai1oZ zmBG-LLz#frrwO=>LpXa3y1_rp1Q95TEr?zvM>brDrjiuobQP4)(!_2pl9=Eop41)+ z2PRFxb45rnO2drx@%kjk6Sf&`ZaS(ZlM{@my9x%0c(96pM9WmNa!`*l2PNtiP`(5v zGUe5TD*KF9mcEgT0g}AJQ%Y=XGfS|RNbf)8KdEJfDS(MCb{Syd*2!T`!#NIUIarG& zyp<&?+NULWn0Tj1kNCZ5XC)R)y9}7&*wmxt6rN$8NLD}mPS+!ks41lZZDkg%Yu3`a zTg84jouPULjN4rX{wrahQYmkUk1>pcEG))4`-?6>aGH%+K(HgK)u{A6$fpy*K>KZn1>FGAs1zQ9+O`)XWXW5cMLdfF+t}HM!8^sbJ1~>HOME>zM}ve zXBQR>)nP^<1^Y#jK~;_FTrh`MHd5FVXc?zvb7K5T4eW>a-$G|nZ;Cu73W<6`rAX!5YM6OFDXo%pT@1P`%ND04E$DAY463t99g=$wK!zsC&!-@1FRqm&rXYiPV~-0@wqOh7`kw_VBE9}-gj$&)CN_9#)b7DO^Pnh zpk6(8;oP-zP%vb*KdT>6D@xcyVKK1VIB(; zmkMQ#0QHGshihq~MxxdELRs*lRwuDUf0#uLBBC*dLChnwrT@fY{=|UZ)68RlLQrG; z(l0t+^dxm25lLiw=N&^wT)awDb)Zx#+I#^sM((11sw#v|c_U4V6)T?IuN9BxC2WLD z6FuM=&pe}7R*MJ0*N7ybb8}vg--v>)V;d?<|J9YRZ-S7kBD)dkCE2%DKJC26jc^2&xE16%>>n^rpFVAzIMFI}F}ee(bCHY#2J1;h4;3Uh2ciwo~i#;O5!Im$Y(R(+()j|MF1y7+p9DG< z#%*7Nvp!)SD0v(x*dfpU^vIIRA!y?;hXO|DlW;_;_9zi*Ci7dIT6ljYm=lTlm7syP zlCy(Xa>8k;ICMpReVF%{40v#@hBF{BX%!A&?CDlBD1U3r2tml1oR}d6-otPPCTCe9 zU0YI7vp0c)JmdwBSc&Hl>>iaziD)$~Eqz|-Wqq26JvBj-pWyi#?f&4+A3U`IK`<4j zlW6XNt=fcER0@%2V~#~S%e>Ez4O`yCFqmj4m&*>N2uWlP`%kUv>P}qMH$AFC>Bl1<^VY?FtR5^5 zR5hQ4%9eJZ(y(+X^1V*^ZfN-ea8QYK4l5**LLyG{zDSb$GC2ZX(Y*nC)e5BK8*t3m zBAuMM`&1IGdD5z%mbOQwRmh`zFDSELeW!sg4@ZU0(#L|-(03wcCFF7s+@_DJZ0wy; z%b^7fz#}ideCd)gf9CQz;{)d|pSgJH`7^V#*Ul|0e6Sjza4;+_mUJ;MH*;{WTskv< z{^c|0QS{QK=d(_%P+AI$*(v+q6Q8;_sCV9=E}%Z>5^LmqhDE#aKh?Ep6Q z3XXxPHTBcP>x0o$2oUl*1|LI+Pvbaa`aU|d>M;Qi2?AhuAxb&H1D#->GUv8nPYsvorV`;`7o+(x`j|79;WHJYgZ8Vi zLr$$9_t7!btR=jl%BAf-r>oIk2m~je;UmzI4M7SgUU|e?Vdpk%Tzu*Z%sRBxf-DG@ znFL$Qy*}NS9S^65VMXAGrdL%B*srRom!SJpk|vh8(T7w*LkSol9(Ieri;h*(MiaqV z2Ni%knuonwP8MRXB4y!Wm6$5wyb9P-p4wD&C-^vrDteX#7VN@~lc$IN-mz!j43$x)mn(aWc950~3s_GqqAk2yz`_&t%j(Q<=JMVX+J{xLnqk()Xrt=sST! z%)FKd*4H%YezGPZ@|q;?qm#;Nd1upX_?uvNDx27%Zu zq54fjQ*8c|yD3!q-mo6AgzfK^vikza7B=_sFdtbo#3UHFw3`CMImAfo{~(*#fP`_a z>O2&};^t#MCk~149jALRiWOE5dvv2qz!|9Tc!H zA?)ydU@O6?k*!O-bGODhuOL?MY2<~>xGH-XLgSa1sq@O#kk$07x2 z0hYupcC(?Dz*FERVHJc^aW{q6VA|}a@fK#aB5#?<+Y;V1Fn09SiN3mcb(iT!PM6(0 zy%e-B{z1)GBUU1XrzG?m9N=gKWZfgG4^H!=bvR=XO4DvmU&`ca6Pm@#utPsWAD2~w zz+1&e7~Wo}^v$E34%?P|71(DD#mezOwCd|4XV@zrbYn6+1`V31j5SL;5L>H)ZFAK#-i-?d+s)aq=LN+1ge)k~hFefRS zOYC4~4%bZ_&chOxwml>ulq;~$=Kfs(Wk2W8BaiU53st|M0FuK6YS<`SZsXsb>c>J; zOCUp3!0IF#L3^s1CK@uLN7FQ`l!geR_h3;)%OW~N&*HJH(996VSI?1#>y^E33TJ_f z$dWE##~p3f0y6rBXVEUP2?bU>d!;ly1mTodNKTfk?rY?yP}NX?lN21l1=?XvN3S9s zw->2IG2R{wQxAK|2y-0X3II?b7BbeO`P@H(?GWVYMjqi{BYP1h;LuP7J2=Wi(CG@1 zgUEx)R32W8($Xz-tpgDpL8d`07W>Vh{1FvJM1+iiK?L1T2NGbR{AV4RHNw3Fz`7MM zjs{Z$VC}#!b~1o+B#d4oXSWbLG`4F|iUzY$6TZ3k1&|QcMa98UsnJG7Aq3%Y8Uav= zQ2=WN+XG|6#A2qXu3GP1vtxJ|5;VIBafD0e1>0{>7=2H`{3tLQ@xE-RK*cxqks z4=zB_Vks8;3}{psx5+ri4lu>$wWWmGJ$M1yca2hnjhf$yV;Lj~bZj0&jvPD%q?56Z zgFQWANVafuY<+Yjdoe(bcu4jc&nYomgWuclq!B+vkto7ei0&hgxgaadW04oqqS+_i@})sqPRJVx+^z)L?IkB!B~gAY(YadXanzwapu7ojVYX5Rw+=4i1dZM`VP%Lrf?jWIE9VLP*q5^vRDfs9UKE4z_SS1aUjSX=$+_YsXta=$1J3m3_|u8rtN z^>h(Ej2(CI3d(uEo<`acOZ<}DVpGf=f)0r*l~(MX5PeE zSPXgg#%hxDh&l#N9f=jQB{-`w6-O&ViRB17oiy)vKs<^gd_8iPYVe`ss!R%wR;v(}b|;-h z<3&wz8thxa9!~}uT^=@;4-s?)bC)n32cE0G7F9+_2NiV-ekUbB;M@pH@p_RkJ`sFQ znGey*UYNyB#W19YJTr@(is3g9D+sp~fgc{}#UgI~@omf*!3`w}IT!-NPPt(^?4up9 zuKJHRLGA+L(^TIBp@K7xG_3Z?ewVX@SgJa=RmDJ4VHRWXPUdmWz(Pd4E$TFUnCOsi z4n7~GsSv0EG(Q*$=Y`+G{6lvef`RhA?@ zxEh-h5dgp{XBYtZla&QQqH+;PJuFefy#nsLm@W7{C?h6_w`i6?{YGAG3Ti+{ixTQ< zuUbWbB+l^E30b>r#Nvd7fCWm(ME?+bW)RvF5(zwos>nH%Mi2DqXRg$7S%^SB@@sGN z*E%k@~$q_{JK7M&$YaOTXMyK8PGY;Qal%K`&GO@B@wHjY#~#Padk3dYtfuFI7(K zf=v@Voc`rMd+n=wx+eHI{j0z6!@seX1QeNm>r-D^TM~(EpV>3Jp6C`CfB((FGB<_y_ z4(W`BksJIU*rb4%eBNSM%@xI*#~Pj(9i17EPfu7l4n1zpOpRL8=GgRb@v)3)5@PX@kyPA_ zC#}qACOv^tlcSl3(xIqxJT(avCR6E|@zDvez=SnvjV7nYlbMnDWZFa<;v+b<1b#@3 zjittCCP$KEVA`?xL^>rp^Z_&Gx1=%=Zfv6MA7 zF)=x9#nYLwOnPQ|W-4RNj9JsE@$|%$B>Im%6rxX!O^=(?qZ6an#JD*bPi4RanKb^- zOpRqQ%;TBqv2j=cGZT|ZYi4qCDhXuGu_U?{?}*n$2V(rSg2lY&E^$j-M?75d$cjf! zJo4gE6py#Wqa+?>en9ETJ+e4N`&0Pj{xkfLsPwzB>5bM|#oVjMu2pU#@kapuhwGCs|AZ{Q73n`xpN<3UTssy2c!T6qVKQkFYFw9a zPI^Tv#f{yA*&6M#KhP1-}o?7eP#N+zj6uQdJ-_c-qQ26f|2L#zjlq z|A7|y9nw=%b^j8tbK5GgDpk;a>CD+Bvy5T3l26JxB&K*poVg{(P=HepTXeK+!66Eu zieax}k{uy<-!{>w+bf9hf(@Ru+H~XgF`oazmIlOQr;OXj5Ea$NAIHYisZnbzK9-su z$yg&Z6Js-}sc|zsk(w~4Qd8;a^h_o*Gh>ZFg(k<+$@JLd^hnywOixWu#%I!#*0DQx zfC0&VYVw~-B0d13xql&HKLAQ~?}$)pFJ2!4rM_QMYRAK*6bbDAk15q3rPRrXL#c1x zD#jE>@538YKhBhj4DLBg;6cLvC+d?g@6v?%Kdn!nON8Q3XaD|Y&(b2?V+KFX0OsbOjH;=d$#a z8!vKf3yRqn;_F^V9yf&_3a<7to|N_~o+$qj@pxT4Ziq*M9~IZc(@o+BXps6|2aUbw zg%1U1XE7JYWWNy}MF!VC9%Lpo#iL&k823~_(;yIqVhN_4zc02BjmBGz^kRK-BmDnC zoA}e^83HNXlOs;Z`{w3^JP7=V*srYJJFv)sILS$cRrD=_3+@PFGS?ix9SikxdWeh) zgMxaU{?gZeFD>okai<{(1rV!kRw7fbDG3Ef4=xn4D{!(IFTn0hV;7e?J$boMc2;O7|B`X;mPva;PZ=0|#${N9*@jH@EBA>N8G-9yb#wtI07O83 zoUnyCif#YGeAvY^9{QR4tR5rsu1O^8m)l7Pmh z=**2QuYN28y_D)jwxQMzxy z>LVW#>=Yaj###;CZG>yos>15-5}T;mK*gna%nQEO2vOx^%T-E94SG*N9ASv=Njw@+ z!W}~bOlNWXVzaK?xZNAt_dM6=fRf-NLpQ4Z^V+)6$FS_(XnmKy*DO-gr^YMLH7S}w zK`GG%;g8|Av^~Fy%Mx&L<*9OIb|M+oo_65OK7!_o&L#|>#ghbPqYi-fp_}; zi{i93vp>hfYitO8w&fOVwDbFpV>b*P_-3}3DAW<*_gb#MjtIZgE{Iwpv@Y1(uj9If zd3O?jHxy>gq+Gw-rkLA^e`{Mut8%|FVQCo)4n00D7O`~PP<%boa$R*q{6C^2oAqJ; zrmKqXS1BqP!k1lMUAX?ChT7p+%gx$g7y8}DZ=&`g#~Y$;#`U7(D3K1rd&l zBMf5Gd;akSc7Pby;9C=c$!7WVHA3PwmQm+gZpudK@WgSCaTy{%pAb~yBsk+zC#+s* z8Id}&e5hRz51cHWXXSp!#ze4NMtq}0=sKPXYOd>YtL19zx;)t~hzH)~U6&9UD37?1 z*nZi_GWw>LG2dvP?>>&3KT7!_uDY(%@3vfTU8jFTyC7;iy-lSo>}sJ^+5iz^@i*;S z7t%D~b)u6G%{181n$y2+nK+I4irTiGZSd)q>#F0WUt$nV{T-Wc8$8CgLAn6-RJLIv z$XGmB4{dBHe5vI&Zm>W7$AqCks0e>`cEbFa?FSd+EU045MyCA{=^EpASW=3zj zHt)eJNyH)HIC!))ElJW)Z0^8S60NyBHcE~|#|sJzkR!Onrk)gATSlRd6o32wEGhb~ zBc>27Wvxeu{+4@Tql7qcoI-~JhqcM@bjt|Tk>OaoAZkZM8(N4|h)`rg1hxSp#Nrp) zL`&aINx5an0+~CF} zriQOa;_qy^t~w$2?F`}}T3Bk~nC{BS8lw%>_|LW6t_}8~zxTN3&>jp-e^C9(fuR3nCmgpAcl(Y*Q-Q`SFIG|M`}&Z?p5`^_~COmg}zT{NHOAL~ZA{BBdo3 zq1G0|stph!7T?-#L!{*7ZCfo%&epZIP>Jj90NdZWIhHxKYCW;Ix8=I(xM)wiAVT_e zwhKbikN3PiH2Sr(eeQJ2Eo>|)sHN-C^i<1r)zNgST@WEn$J+%VY04W0Tc&B-)=V3l z5ABv)*qEl&()DO+wOm&nO_L1bA(}7yXDOhwngX*G(NK%N+j84B*pGhSagHgiX21dk z*)ie5+}F2Ue_h{xv|SM4c=>yRJezICJaLXgl=MI9-Atz{JINb#%ff_UJh=vU_k$W@2Iag#O;W1Baw;C5CJz{xFfrvy$uwAHCLPaO2)-owps=u>OgGe@3oxvo0yI>sO#qB(L z*%@>Sv9N+`p7f(N4b`CAa(gyPm7~~)st`h)JVIzFde*1j|FYCFHgyC_w+rHd6X+nw zfx8JQ`jUauD;0#1Yi2HfbIXm`C{+$&W2(Yp2);;#Mcr8W#+Fg2BgMPzf~X}$8;UB_ zbwVb#0V2fWsdgJ8bse9XIr-3Z-3HIF{YuNNYRqKRy7hG1ziGLyI&S(`4B{c`wnLGr zwz3KvE4MGV+`bL=rT=Jjx*eiXH)8*|WgP1I_&>D^A{;CKQIKh~wOh|+UavVLuOn-y z%Q|*%jd5i_c0tsVqYc#)YA+%6+5iz^@r&&aYN@^Woaf0_ zwO6|fIqe;LPPR;}#!N?TT~C)KTCS^(w-(z45mNOd?Shb0<%8Z2jjHRP8UN;%+tZkW z)UNd?_>C>sRY$>h+XWF)@ax+JAt}gbtsfc%)zZC;`_WJVf2!pcHKrl8Y&{zOY|C}k z(eS6+1rgHlC)))fX~-c4TBc#!3v#W8EBKR|20jiwfM7*WipNvpaa25x^P@3IsiBQY zI)hSTtKlEDT$d#2cmU!H45H~I!F?4uwGDnjtbrhc&IZ~S1fAkGMGvK~6EmHTlCKfz zoRZg!HQxB(`K~?a!7lpQgP%1{n$P?CsdB{6sy$MExAi0C?km*!e46~_%{fh;OD~Gh zIaktF-J$ZoZkI;}YIr0xsn#dCWV2WR;`8@|1;y*wix>%X!w8~ri;xBs2#kUp%x&i* zopU=lTnFB0t0hj<({{YMZ5*WoZ?t0p4_f3#PV$H%Crw-MAQJ{@qzCaJQHlq#Dq?^7 zJyfrDuO&ji@h99VAnrS%&~E-d8NmV9J*2V~+<+Iv6hY*Lb>bXwRg|rUD=Yp!4wXQm z`b)U25s}~+Dn(5|7POqgKDiBO`pHAribH z1Skbn08S~o9nzz4ti7Tm=$=RIYnO;nPXXQuZGVf1O1is*+e;JPYA%UOH{F}4&)>Nq z-hyBy6!Z-dBs?dH0ANdJlDH^_B1*{j7pyF9ikrt>1a!k7{@9(iaCH-iONcE3A+|8^+k9iwO!G!-xpzR)_~4sra4Y-2>E;4*9BQ z*`?0KF^NP$lnV~afk(R48^yCH_!WN}F5Kh-7f2Spjq2Qs_$%5G?qz(McjxIB_qkA` zuavG7(eNIGctM2Mvc(GtbeF{*_2oWIS&BnxG^4dvIq|vc6iXR!-IBx;X%U=4;prO(6GaUh8-R>?C_vr zhX)NiJct1iO|ar`6&KjJuK-JQUI*L>6^a{jCnU>uzKeknl9{>@AS)62dlaho7}I-< z=v~J1E~9yuvAoAf-enx`GKzN@!@G>&UB>S&qj#6FyH^SLVk?5khSj@Y$EXIW+vws4 zEm?8XHoEx%-~HWK=U&pT5t6OgDX(jzEW4I0Y+WH*xZefnP(a->a*w>P)9+2Nt3kNN zVQSu5MHHES_q&nX-;0Y^a6ugV0EkVHf&hLT`3F4;&>U#c-+}l8sG*F=i|+TLocn$B z^ZoSmkMQ#@E}%=|lGR-xfxrcruhPy5@dlINdyuWarmVl`GLy_`4*f?p=sP_ea!lD( z_Y?To4CL+w&SYH06+#X1{YedC1j$;I{XQ8EIf5iwc{KExoQiDQ3HgfIL(e$WB%|NV zA^I-HKF;am3P*7>A8`rMR}vW){{0BOeVn@jZ`3EUWAOH~^!CqH+RxJ)4Jr2*@Ylz% zL?orp4lFF<$}y5N+bwLYz+WP1i$`Wm#nL_?PAOjyf?Eo9O9taBR{ebxm6Ku#yqtI5 zniUbYVGj1YpF)kK6=-O`=g)4+l>%tnFGRs^N`!rY{rM=^O}ShEV1G%1CBcSH*p%?~ z0Q-wku$vOOA7KAw6zrx1vIp2tOR&U)=!8uPIS)1_=K2!x_8-#EZ`04`=;t%^^F{jk z1N^)Pjh)VlkW%iiEtBt&PYvC=_wP@^DO|x z^$+pkP=o|9D*k?Pg_@bgeOC})xI@Rm0Q5UaV<)7Qjn=mJ=OH!iPEcq!Y;p|kCmMGMsBMDzYZ+gY-4=ek|y8*kL* zu6Gfzy@IQUN|CSb&rv;l#f?4MMX&x|b$6?}3VYt~RiCu$T>Z}Q23Pmf1go#%y{-Pf z23NI0vsRKgr&xyIE6@d)ze)glYVKrpe}lo&?MZbvu=@M;`%=}VtA4NkRo=52&8n_e z_4^v$rt0_9UZCplCDR8N0VX1MrqTsy;`USGA!ZqI0c$=9cH#R2#n+zsWMg*esk>g$u<`Ax{{9BnrMiF0-5OrM2|L27+Hd*?!cXFkI&p*d z>zgx0#?&KWZHCKDm zMHMila9z1}pQpdS(IuXKpZ+ztxzpcAfyn4y`CJimB)$;47j;Fy^M#!50s7u22ayQM zOxIaq5Q0eDSYX0IfcW}A$c|=rZ~EN=0o(!x>`PU9(eITlAu%Lx&UBxo3eg&FBJ$zF z25}98Yf#DonG(H0(>+dU2W1*KvQolTt3^4&o}t7;GLbgC=r?A%1C-hwy&lsY10IpH5DM2(5VSf++(N1j zyRLC}PindP;R{$|yRKf1{#?OB0BVdthJ_o1_?(MEfFNDX^FTA35bjLTldW^f)(9N1R)Q7}Aw&IcOOC9uERH+3BKd z=$b&)?eVb@#!L2=K#8tmHqJr%t#;u)JgZ{G#7oyK%q5&10GKrSged4WZId?1H)P=M zYKvvcAVTOB@Vyj%G770wrBt%gr@FcxD#HcTF<~4n3Sm+xd4f<{KTJ$>H+X0j?kU8G z4HOS|iIhV5Wd9~or}~ z%T~XGVO+XDOj$lSg+;zDQ(QHx(HvLSaVOW;t)rKzpxdpO7^j=sbIs{LH8RGS30Wwq z#z+bA#}Y4+m>}!#Au;F3NW309Mu1TybcNUsq#EN}HofI~xlZ%L2di18M}&xLu33Z~ zg*!&2evpITYSan|g+-vH3MeHr$d|d_AJ1-7VNOp7Dl|k$FfhyUS_>d1TAP7+tI&r7 z9(ENokm5;*3MtLKSS^H8#u;&GJ#|;wfN5deg!kSupqOu(o{_XjH%P8cLmOn^12e`( zaEylR1TWTg9ZCZ;RSz?8Dsjr7Dr5;v`-}i^tm^`C+JU_`DBqiOGf~3A009~ zsVix#KPWqh*h$!&PhbWO7P6|wLq0oMWchpXe>Tu4Z)-txpCq~S1c9- zG7RM$e1Mdv|3ngVIFufVO$-d;BDf_pm!o%F$v!+58yScq7~{fxN&%$8ps(hCz?J2y0FVETd*!n}smlLNpL zjlR*aue++a)QLQB@Ndp`iyMMo#FK5cKoIU^pP(VzTu74_}YMQ8+q*i0vv@^3IG5A literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/intro.doctree b/docs/pygom-doc/_build/.doctrees/intro.doctree new file mode 100644 index 0000000000000000000000000000000000000000..add3b6565228c286d783507191e3f5fe6f99160e GIT binary patch literal 7233 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 QENjgqPn|loByg<%ALUb+&;S4c literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/md/getting_started.doctree b/docs/pygom-doc/_build/.doctrees/md/getting_started.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e0336588f010c28b17fbf21a88d0354ec94b6717 GIT binary patch literal 11934 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 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/mdconvert/common_models/.doctree b/docs/pygom-doc/_build/.doctrees/mdconvert/common_models/.doctree new file mode 100644 index 0000000000000000000000000000000000000000..aa21defec73d753f6633b4e5e75ec345329c9f60 GIT binary patch literal 4078 zcmd5(#B~F1B2HXO69%>l50(P6eoWbyRc}rGY za!YchQw;^_Lx30{(1&av`_}K(HvI(cC+Ls+=X7_GT{L~EfP={4aE3GUn?L(`=THCG zyHfr6J)3i(W<#1JN+-;gek;*&kul}UugZ7-P@b1}eb>-as|ype(q92b%!N!0Q|0s0 z_XE2V(hi&Zo0i2+Xf?miJA8w0J}>X`uJ1VEBwIN0AACA|_V_7zD2(IeBSszn^u#;Pl_*_@b=L4Da+C zIfY@aenR|k-`;Eo{BY#Z_#mZ4Jp}t3*Gh$LWI4(G9T_iR*Wiyu4S`e}BD4Nx) zt)$2=HWL~j8#WC*h2L~E4M!!v!QXna#&3K2=>GWEmKi(#1yzdj;ctYLf@XI7Q4=3K zPK66UUQEXMS*o)!9$fvZ-5~6;B-ZML88?n~mT5&YL|NMLFiT4Q1Af47@%3WD5B=>| zdHw6p{~Y{|f9K_br`pT>_K3d)XE6RYJizZfFZsLp{RqDSen+s5f57)@tN1-!+i7%m zeHYHAsi8Sv4B>EuNWB-GvPf!u98nih6#*kr_4Mcz21ky<(98%m!7HRVgJifqD6Ir80EChyyvh8nen(t*@DVHNg1M!Y&J@%mX^*?7nQ{*hKr zs6wbTni`!&jV7k(=iE6D4arF2k$axrN2Ja+9^PJ;qb|t-wkaY*+ynlZL$)SzD4iLN$4xMY9aFb zHHAr5QAjA&q-}-J*j#9O)! zQmE^nQlsE2a2Q52P`VDql?9{9FMVIAyl{l6SSR2reYbGa!A}QPV12lJNSHC&5RP<} zC@1Lluq}3_-_wO#meQ%Dl>X+*$%+X67vHaiUOb?^dboVBa?|ez11!A6;U8I5v|UM6 zTF{ii-3g$56~mW*!?0MJ1Srk{4yX}8#>j7=<4<8D+#wQzQaBZ}5~EF@7EY53lD{f| zsNJNCYfqNANu2nX~{(_WSRwSCB@`7uh&2nuSS-e?6BzELPSW)A1 zk0ipZs?IAP#_qcPpy?=BBvK{7Uj%zj4 zCOsBt$1WA4R}3fW+<4ORyvUL zN8Du+%DRqDkU|MYoF`lUCIFd{d2Y@PAa&1s>G$oKa;Sb>q#VNr2Y9cACRO?!n^9!h z?+PTfg`?i6_Vt!vV4;m`Z^j(+Sd5vvPBwVCav^RX7oppRS-%?KnPd#H4E$ul?Wtm0h>q|!0-zk?n=&zT)@t;MA!L+^TH$vfoKhNT3vix97F@5Ta&5`qSaH6>KCmah)(BBka- z$dMA+M9X>BRIJ}wAe&hXDd{NZn7O~DFH{= zfJVFdD4-4WuVDNa7)Tb`~X(;*3m6lq0UQvb43f)~0N7C^8BnC{Y6aS#oI8hOM=YcW>hvZly;skKkUi2l{4v;`;fZb80R-PM0H z!=W@21C*z$t6#l(|Mlv<&u9PYcmC*@{4YG?^-N*!*EGYh9fNyOIBz(5(B-xt{V=-n zXVF2l5>{Mo&vOD-=TUeJGjvl}hRf~flPFxI>AtYMTJrrVkL$j0?DTVU)|@j>eG;vh zm2lP}P5L~=ibP&n7qume9bm%>UT-LiQioJ)4P9iFs=&7^eQsXn3uL@%!^^;&W-wa zJ??t-2byhbX6-{^Swic2^}7ipyn0*s^k)XmdavJhx^*Bd|K!seJ#`J;v3I%a(|E&o z8lHpSwXPAF7tH6(7tIqv6O^l9+gjVzdS;FZAN}jhv14!A3_>7?bV{1WqW|*a@KYTF@j(^ zdyM`x2}TEYO&-HFShHXCU5@WDSNKfxFe^n*VNaXw#gbNI_rOWp7r?T=iphZP(AQOL z$aD<0X95Yi+m>)WpEZ@hg76953=Xn!PfijxXsKB&eM_6l(T~UmRl&EzAc1t4>og%4 zy9o^*?m1PyuaP2vx=jZ(Yq?IBy?yK9Teoh1{OQIgpb%t7(g0Mk86jMgIFc?oKQHD;<~CfrY1FqwpmS!NU-<|?%Am_+s7RAg*&Jl>d&lunMw z{VB=$23OOAtAq@F?6YdDMUwW5tIrRtYIe)Mo1?KB! z8#(}`g)Srt9L~F3T4N*Hnvu$Jez++)MEQA&Y8gjbaxJ%{az>})=pqXb&Z>cMG4}VY zi;%=(8;V%v;UYRe7*4ri=#cL{olxNWiEpf>tH1SO>}PzppEw$FhSI1jZ%E!JXTTlT z;4U*nOR}5Hew9B8q}@)<@0}??Ey>DX=XX5J`j#imr&tw9SC}`RlM5x%Rl+JF0khGx z9DOG*>dSRoYg*c;k2eokpS{kW^q;Vs?5g7DsMkg0{vH9?NZ|_S5O*M)iN3jIVyVea4p$FpC`5t5&PLxa0|2r`LYzg~}@xlw59Yn8+yMrFyW0(6YSFg|}F3Ttg zkJspNZS!)C-H9Wxs*HSu4H-cc!F>jE7KaS6oV;`QUMdwYA7RN7*MCvqI)Y)MeV*#` z3PnZdY@kTlU*{o>rZFk-KZ9`R62eIYq?wqNG&mH$U!`hQNlB&f%8e8e`_D-ctE9|0 z6uBV*OOd+E;Y&wgW)b-Ugz?IxsH*JHPg8<@TyJuOz>hUcv~6x2RO>BQ(;pkG-*|lW z;NY?0AFx+$($mHPtJm|dH?r4jPvrC`)jGG06qaJa|LYn>y8Q3c>aqDV^XDXcq_pQp zD(%OCM^+lqvKH(MoSblk+|^tG!^5Gik~lY6Y=~H2X)RF@YTJj_zR!Ib<_Eplr1w3a zcM(M6tdgqfi-#>z6tT`C4pVvgH8T}BTSiB*VemzPcAe!C%<;*HY4>losov| z8NL-MIz%UhXl|s4;mUL{gyJUr7)RAX-5uP?a`^l(t`;#b^J~1yCbTt`%4Qzq12}oz zYU4iHl1hTD}XODEmh0$aN-VZnM%pd zaQCMKzeL;zCFTu@B|1aqES9h=(zX1-c)I@HC?)^sM?f%<3!+di^cwWhe0YM1bj)1=Tnv=wj`Hp)q6HLr^~<) z+#Q(;aKU$h(1Qg?2gIz6vk<_&I*=QvvD-0za%*YIfH}6+XC5IyNd;h@g&(Wf3Ni@3 z=E@YuuFRSt(x6e~1`vAZ4e7M0}h)3W^KO^{+{W`fd@qQJFEP{td{?Zil` z^`((q8W5Us*bXs83Sw$hm&5DNDthCV&xkcE{fi=0@>C?!=hGq5Ol=%ihZ05RVQxrr z-(;>ibD}y#*{l;N>RKnbuh7~RDy=*|nd(Xs}4T(zrJ4rpHiSu2YbaATqEKX;u zqz01SNOQhdLN{sfGwwQUB|9fqan9$i(2-l`uIsp0;xsrQ z`Pu``&)kv9xJ(Qj7CPS=$IPNulxaI& zE9_!SnSBs0dh$|nO(q%Fa>-ToCQUzTD&0z_(P}Pt_|&P)O=azhsm#q1ITwx>kC2B) zGL+5ql1QeSdr;2iz|)!wBmIeGJ>={_t(?!pWjTa~5( zw|;RLX==E>BmI3F`6t1H`l}whSI&CAF`cDL^tn)?&oDI{GUxTfH}IR!f0WxnQSi#p zGC3NSU#4_-FvyWCwR5$U7_D2p<*)SE8ryut>bm2tZ0=vFyP|FSSNfD~RC4q59~Sqq z0m@C1huI(8RVHVDLS~&LLK9sQFr0gIr;D>fa%~DXflEs++T4zhE0-VL{9R;V9?F|l zIv(T1!Fg5rob2w@ll!Mz%&SkkMoDyTl|?5PjQ|@(=M(h1NV+#mUmmWMlra4)A(mP* zK3)v$x3rF$ojW>|uQNMC<~%=)YQ-ItzZx&ZY6m&9k_qv3l~hYI;;XC<^*7R7+e*DB zWU5@fNb=HY$oK33iu)213iZJuLjBQoxO|eiy;!X2EH4WeU@)6~l29tTpmYER@KP(M z`em$xjKYqEbAMciAd4t!>=ptZ80PqrD~TWt2lf|thjFchR3>CCC@>uNz1hM{*)+KQk8y5C5QQeA#?6dgAWs-k_*Uw ze*%7v!y&V6CyDdQxWx}e9s0`>DaTv4KTWho5m;KcSt(rO@EUTiQcxt&OIvZUx>yv_ zabUCU&Y-Z1O2x2{U;64N)7j|7L)E3UX12MJl`@@dPAVMPel8rMeQKwN&M7kc=hLCV z3(~d?)BECb+1BFikM}!DwsL+a3p4&@8@Wm{#|Riu;brub1Z$EQP72dx-Pl`V2S-?$ zYnR3m8TNQqb#&rvp8i)P`5WC)q)aJpCSJt!BSXF4m(bdIL%$* z;D!OCE;p!v7GZ&mrctXZF9^POm&!4_kWJKU>hBo5Mqs}8xP~}^yHe1NH6P`)%yle& z^Cc<*d+C5BwP1jYV5Hi|je)#RMSz3rE2nL%+>yj3^Su-YB6OhJr1g3nxdrD z5EK&`xOCBds^AnhE^-l$CXB$L3Sb6q)b31yVI?X5pCf48kU95DNup`PleOSDr_SMFnDl&t^e z^S>c6$Nx(5K5o-P!WXq-628O~ygj+zObeAarlWt;LgztZUnbY%qSRz;IBKM!L}qBD zvGCe!@2L{b*IrXz+MFvcdaER=D6^mQa0s*8d7Y@Fkdz+eMv4IcxCHRfSiJKfmi=EQ zvahfq*&mIm((~~iPr=O*2=#uxtJ$7x7Rc=}?(-V*|m4C|qKHCMTcRBA^f%rA5l z%mTq zD(?0icgL&2^{t!S>aAl4IIW``cOCsI*Yuj{cdb8+aYEY##s@2bH=iD&+T^o*S`@M` zk4%+t4%i2-h{9)Cl^FdOwAQ7qe@aC3&y%GOOGHwtozkf48{!95RRztQ$oA8MXySjG zrZ+v!{LFkzD|d@4r=s?R3Y{}ZD&?PC25e@P*6K}?rlB`U?KNRYmjOxYT{YR{fL@_Y z5e^Y+DzaOXY0tH!!aA|kQPj<(-G#UJW}&|XENmK)%tL*Z%yI1L$5 z@kUKk3UJ&s6@xw)#29Ty(EkhQ+>itvZC=u5D07u|I}d5Wtw{i<+{iRBZBZ9S-Wdcv5Sv37ZmcI zj+bcw_6{Da$z$MJcv|q$=tRv`^cKs_0x!28<;w4~ms>O80uD4jZkrnW6k(#!9h^l^ zSFZsTrgk?EATPut9F1o*(xAqqhHCM`ipd9v%&6xJn@4^EZB`8nk*yVN9S?CJw9?1f zaEb2=&$E>q_zvp&-B*F5OQV4T3d=8tz zSu1W`1JH$JTB9Y{g z<#})IJ6ErPo{MfvFM+3#4E!q!Jd{-n;@*MQoullQ}76<=#YiwqQ~Z_S4n zp>N%Wa_rd(jks3-tMIJXw|!VY6Bl17dNv`yCoPJj!som$3f&ry0<_h5Ak_2nIeu)Q z?LbRNdr>#hf~ey}66+hNEJ=v3cLM4Xpng@^gqqlauOK}R%K2K50c9A@k*UCeyEIRr zBN5DSaMC1{s6BKig3O@nz<>((fr81ok44Vwn6=a3T}@aGbXB4bkPOC`;Sxb6mV4Z4 z#b)iR@C2^IsLhnxaLAm<9)`2je@RE#MqGI(1!oCJL9~3?kqI$FQz><$oYSrf(*|T5}f({7?uoa`W+dsh6{P+BA|I(7jyw_CF#RvB+3h9 zPSq!|gyl!#c`#Ve%Wl)LQq`4Hf2%a8W_JV-{UnkYX<u!QKw_Moxx!l~&m h44+PirP7@iwr&LmDS4X=b=4s6Bxx3H$H7wV{{SxdEtUWP literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/mdconvert/mod/.doctree b/docs/pygom-doc/_build/.doctrees/mdconvert/mod/.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c0413c9fea030a59694bd8df23090080f6f70147 GIT binary patch literal 2944 zcmaJ@OK%%D5RT)>wq#j;q)7`TZV?n|5;T_6qK6_^_YlCS4@KKt6cE%dC9>v{TRvc~j0>3?rsAs@dP&_0Y5UXj>y~9sXf->| zTYQbLzlx7}JG7i|lFe;}j&(ZY)H;#Hqy?p0-?B;azOeTuRMFQ`(K_g@Mr1ug90t7#JLU@TnvaX%cC7h_!v z5ODRYRtITSQZ@E;jKX(+>QnDDe0fwb zv?qmpZcCalu~8a^ES$0E`KSDV@AIcf(CXDC*v!L1O=W~ zo6uIFePpz9Oyx1GeNUwacpAF!?UT?RGlh~lZ6X#qs$v~2N-Q>OHw3m%vFuEj-bk#r zzy*>pmv-T47N~PD0nPQX5AkJ7Y2)-wYj2sac}}5b zE{1LG-J+FNWhI9FrJW@cT!mh3^eTYn=>5fwrITSNUBDts9QlzI>bDwhAl*4odlL;Y z+%_!JCMP*70S>qkK*mW}1HnhQBhn#q0=kUEB%+h`5~awMDBKi4)K>0`lFU$ttX2X6 zz!^nlGPqqykXmI^?XN_oWj@yg?1a`1o0QrzGJmpyNao0yu%gE2HpzvhL&KR* z^E3i8#gOIT?*&5Oj5#>DlR@j0u!0In@Kiv%PlNMq*qsi0fK`s_o^}~lnL10OH*D0s z1mp!2g~|oU;fSMV%+QGx+BBiJ&q1L~d*u$&mraj?_m@?L5=+mF zu<}_m`tY?l=Kj2H%>CODZ6;ru4Zo*BhHLCzg;NMsy(9P^_0x#A!pgIm(`QRg|Gw7g zHRi5!>%-o{mFq{z_38QT+8F=xsRE?xI9hUq}Ap z#PSFDf5f{sY|R6_I=z(%&?J=%7HdiBV~t*2+IdN>hk}C;#Zb!`XDZeAmV`6y_JYNB zN*`A1<;z`=|FF zcYd#_(w+B7niAIjm3ZrsE2ZYMkM%cKK^{o}t{?kkBSnVwQ*I;D>~ z?IbSPZMMPgu;si9H`QS==_``4X&*oSl~e%cp4-C zfe2#SgInUDdtUngmi;~=ra}T`51g`W?}+U?ud^S))$A@}{3f2a@Z87q4&2Co%vx|C zSlPoF8yg8REbIyyolG0~*G`xAd3r$v??d-tqtjC)x`>|*FJdzc-hL9az+ni?3_6|B z>IdW1@nS3J^huJCV4Cmggs)m`H##(p$H$Ev_5W65*4e+f&c${ml>=aI<|gIP3OL@;0?@k9psv)eGmT#&<{MUf-V(uFw(b;U0*-{=QrLq zt9rqtl zh_-!D9pi()oj$#lGM&SK*g3~yZJ%WL=5?W*ALD-qK*YZ6szFaS*xO|@ZdJ{=RW|gJSP<6?AJ`_c?I*|NEJQ<-3iY_@I^Pt5 zx`t`@%UwYwYCJ)en>l;KhC$WdF9WUBulq)w;h2!~YV?-(E zD7&VqF{r2*BzN4zO(Ubw&0TI4$JL;hIxp;QPfCM=M5h)H7wx7SOVQ=Rvz}B*0ZJ1U zhG$_U6F2Q@h`e1=DCST{2?rR*!qN1H6RQo?ICx|?6wRbEp`fQ!6o*T;!H5`t*6a>F z{AjJDpHU6|Wx zx19kRUSjZ%@RP)*AZb4*eF}HSK=KkU5B4=hBdOvrrWwG2V>pm;WLGeh_FyC2!Q&8( zr^n9PPwniKCR6Y+14 z#3NHNVj$F1wK+9Ce+F{?fSE+#u(}~#q)=>Fakysp0LUa9=jPaeu$(nt*lm5D8WcOm z`wSyI19)!;>2SZH6M`)JbB?6eaMWx5yZj7s4Iq_k_acVd55^i*CL6r$U5MQ$xtns` zUDaPet0M3M=#ddmd%(b`D(t#Cq4Vw>A5R>3g(PJvx@+S}0nA`(j*-9TP=QfuaLCOF zTqhw-2p1u))tIo{-O+I2UT50e@h)b~ zmo)}^>9pzQa=eXguD8IPorzirPyLR+Bm7DOjKT(V-_`dV1VR4-#(!2kMIpgY5hzLc oxkMv%$^*wWc!s<_CVTX+^E489?6R%zfZvE+o2V*kIkL3>3rp}Je*gdg literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/sir.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/sir.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6b33ebf029943440b8bcc71d1e39222796ce3da6 GIT binary patch literal 52265 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 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/stochastic.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/stochastic.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2dc2c8f9c566bda58eb801df4b4c07db9084d338 GIT binary patch literal 49456 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 &7T=U@uQZxQXug8GxZ*(7@tUi`@%*p!0d7}rox zKb%uMi5u}fZ^KR~#|=lO9KVb_l!B2sj-4P^ZzGcdfd?j8d-V5slqTX7qDZKQCrOpW zvk#We!JwiIiOIo2+BA`kK&H!9qrHaAbTnfT)d@#m9uY<~dihn2Ss^?0$lqE@n@gj? z>$ZTAx#;qU7HDJu%?`iPDo^Q1&*rIr981w|o(i7^`K+$YuHIP^foz=2$ytly3qBY_ z2y_EYS7!S)R3ZI_Mne7NJy|OMc|S-WPasWV>;!C&3fQEdRA~P9(9ry1KWLUDXjY@h zy;Ta`Lu@k(xyzg9qc}Sj?suLd^jO@UaA=3r1;b}$<^6ZQK$%MKzw^ZbyHMx0V>egX z#BP?2>0j18OEq?P5C$tA@fIRC260 zEFZ{i7X@_+#_Luv4t7RIaeiH#6Blnrv{hA|4GN(PjFYp|^Cu^1Z-U>9()Bi}ERTy6 zdbSbCTO@Q|gnqzJKq@Np$D`;9!d%T3DyA53wVm?a+ýH`CIip?5g3=)Uj{YGjp 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 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollHard.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollHard.doctree new file mode 100644 index 0000000000000000000000000000000000000000..04b16a191f4f50da1f72dec2f7b5407226bb4db5 GIT binary patch literal 15554 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 ZvOU9zP4c`hwcZ;hT^U()O*5G0{{YLl&`JOR literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/.jupyter_cache/__version__.txt b/docs/pygom-doc/_build/.jupyter_cache/__version__.txt new file mode 100644 index 00000000..7ceb0404 --- /dev/null +++ b/docs/pygom-doc/_build/.jupyter_cache/__version__.txt @@ -0,0 +1 @@ +0.6.1 \ No newline at end of file diff --git a/docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb b/docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb new file mode 100644 index 00000000..5406f7e7 --- /dev/null +++ b/docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb @@ -0,0 +1,19 @@ +{ + "cells": [], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/.jupyter_cache/global.db b/docs/pygom-doc/_build/.jupyter_cache/global.db new file mode 100644 index 0000000000000000000000000000000000000000..5768aaa8ebe4368643af719619aac83f42c4e77e GIT binary patch literal 32768 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 NYE9fOB!>dY^*_+UNNxZC literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/html/.buildinfo b/docs/pygom-doc/_build/html/.buildinfo new file mode 100644 index 00000000..565dd395 --- /dev/null +++ b/docs/pygom-doc/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 019113c917082bb23be372a31e705afc +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb b/docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb new file mode 100644 index 00000000..84796466 --- /dev/null +++ b/docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb @@ -0,0 +1,868 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Motivating Example: SIR Model\n", + "{download}`this notebook <./sir.ipynb>`\n", + "\n", + "## Defining the model\n", + "\n", + "First, we are going to go through an SIR model to show the functionality\n", + "of the package. The SIR model is defined by the following equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\frac{dI}{dt} &= \\beta SI- \\gamma I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "We can set this up as follows:" + ] + }, + { + "cell_type": "markdown", + "id": "586834ab", + "metadata": {}, + "source": [ + "1. import the classes required to define the transitions" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "4c80a36a", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType" + ] + }, + { + "cell_type": "markdown", + "id": "0ec4c9d0", + "metadata": {}, + "source": [ + "2. define our states, in this case the population states of **S**usceptible, **I**nfected and **R**emoved" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "3ce016f2", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['S', 'I', 'R']" + ] + }, + { + "cell_type": "markdown", + "id": "021a1927", + "metadata": {}, + "source": [ + "3. define the set of parameters for our model, here there are only two" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "441e2287", + "metadata": {}, + "outputs": [], + "source": [ + "paramList = ['beta', 'gamma']" + ] + }, + { + "cell_type": "markdown", + "id": "dfd736b2", + "metadata": {}, + "source": [ + "4. specify the transitions of the modelled states; this will form our ODE system" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "b5f80ab0", + "metadata": {}, + "outputs": [], + "source": [ + "odeList = [\n", + " Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) \n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "21629e7b", + "metadata": {}, + "source": [ + "```{note}\n", + "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "69bfb7c3", + "metadata": {}, + "source": [ + "\n", + "5. import the ode module" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "f78c33d4", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde" + ] + }, + { + "cell_type": "markdown", + "id": "477d6f84", + "metadata": {}, + "source": [ + "6. initialize the model, which constructs our ODE system from all the information we have provided" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "c9fbcce0", + "metadata": {}, + "outputs": [], + "source": [ + "model = DeterministicOde(stateList, paramList, ode=odeList)" + ] + }, + { + "cell_type": "markdown", + "id": "4bf43064", + "metadata": {}, + "source": [ + "That is all the information required to define a simple SIR model. We can verify the model using" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "6ad54e09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "143a6871", + "metadata": {}, + "source": [ + "where we can see the equations corresponding to their respective $S,I$ and $R$ state. " + ] + }, + { + "cell_type": "markdown", + "id": "08207474", + "metadata": {}, + "source": [ + "```{note}\n", + "The ordering of the equations is in the standard $S,I,R$ sequence because of how we defined the states initially. \n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7054e58a", + "metadata": {}, + "source": [ + "We can rearrange the state list," + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "07f81fd1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}I \\gamma\\\\- I S \\beta\\\\I S \\beta - I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ I*gamma],\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma]])" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now we are going to define in a different order. note that the output ode changed with the input state\n", + "stateList = ['R', 'S', 'I']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=odeList)\n", + "\n", + "model.get_ode_eqn()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d3f587d4", + "metadata": {}, + "source": [ + "and find that the set of ODEs comes out in the order that we specified. " + ] + }, + { + "cell_type": "markdown", + "id": "1175c832", + "metadata": {}, + "source": [ + "```{tip}\n", + "In addition to showing the equation form of the ODEs, we can also display them as either symbols or latex code, which can save some extra typing when porting the equations to another document.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "960fdc0c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "⎡dR/dt= I⋅γ ⎤\n", + "⎢ ⎥\n", + "⎢dS/dt= -I⋅S⋅β ⎥\n", + "⎢ ⎥\n", + "⎣dI/dt= I⋅S⋅β - I⋅γ⎦\n" + ] + } + ], + "source": [ + "model.print_ode()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "93e32c75", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{array}{cc}dR/dt= & I \\gamma\\\\dS/dt= & - I S \\beta\\\\dI/dt= & I S \\beta - I \\gamma\\end{array}\n" + ] + } + ], + "source": [ + "model.print_ode(True)" + ] + }, + { + "cell_type": "markdown", + "id": "79c154ba", + "metadata": {}, + "source": [ + "#TODO links to unroll\n", + "Here the SIR model was provided to PyGOM as a set ODEs by using the `Transition` to define them. \n", + "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section `unrollOde` for more information, and in particular `unrollSimple` for the continuing demonstration of the SIR model." + ] + }, + { + "cell_type": "markdown", + "id": "51ed6fa2", + "metadata": {}, + "source": [ + "## Extracting model information\n", + "\n", + "We may wish to determine if the set of ODEs are linear. " + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "61684654", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.linear_ode()" + ] + }, + { + "cell_type": "markdown", + "id": "4cf58543", + "metadata": {}, + "source": [ + "Since we know that the SIR model is not linear, we may want to have a look at the Jacobian.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "1c8ff090", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\gamma\\\\0 & - I \\beta & - S \\beta\\\\0 & I \\beta & S \\beta - \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, 0, gamma],\n", + "[0, -I*beta, -S*beta],\n", + "[0, I*beta, S*beta - gamma]])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_jacobian_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "bab79c98", + "metadata": {}, + "source": [ + "Or maybe we want to know the gradient." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "abb02502", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I\\\\- I S & 0\\\\I S & - I\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ 0, I],\n", + "[-I*S, 0],\n", + "[ I*S, -I]])" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_grad_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "9d0052ec", + "metadata": {}, + "source": [ + "```{Warning}\n", + "Invoking the functions that compute the derivatives, $f(x)$, `model.ode()` or `model.jacobian()`, will return an error\n", + "\n", + "These functions are used to solve the ODEs numerically, and require values of initial state values, time, and parameter values.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "35abe902", + "metadata": {}, + "source": [ + "For setting initial conditions, the numeric values of the states **must** be set in the same order that list of states appear. We can use the following to check the state ordering, as well as displaying all of the states that we have included." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "e703c888", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ODEVariable('R', 'R', None, True),\n", + " ODEVariable('S', 'S', None, True),\n", + " ODEVariable('I', 'I', None, True)]" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.state_list" + ] + }, + { + "cell_type": "markdown", + "id": "54e681d0", + "metadata": {}, + "source": [ + "#TODO unsure if this is needed\n", + "There is currently no mechanism to set the numeric initial conditions the states when the states are defined. This is because of an implementation issue with external package, such as solving an initial value problem." + ] + }, + { + "cell_type": "markdown", + "id": "13bed7f9", + "metadata": {}, + "source": [ + "## Initial value problem\n", + "\n", + "By setting the state initial conditions, time, and parameters, we can evaluate our model." + ] + }, + { + "cell_type": "markdown", + "id": "04fb8dd9", + "metadata": {}, + "source": [ + "1. Define the model parameters. (We can call the parameters to check what we must provide.)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "46042ebf", + "metadata": {}, + "outputs": [], + "source": [ + "model.parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "9ec016b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{beta: 0.5, gamma: 0.3333333333333333}" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "model.parameters" + ] + }, + { + "cell_type": "markdown", + "id": "efcdac90", + "metadata": {}, + "source": [ + "2. Provide initial conditions for the states." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "c43074c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "initialState = [0, 1, 1.27e-6]\n", + " \n", + "model.ode(state=initialState, t=1)" + ] + }, + { + "cell_type": "markdown", + "id": "a8dc4681", + "metadata": {}, + "source": [ + "\n", + "3. Implement an ODE solver.\n", + "\n", + "We are well equipped to solve an initial value problem, using the standard numerical integrator such as `odeint ` from `scipy.integrate`. We also used `matplotlib.pyplot` for plotting and `linspace ` to create the time vector." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "a14b9901", + "metadata": {}, + "outputs": [], + "source": [ + "import scipy.integrate\n", + "import numpy\n", + "\n", + "t = numpy.linspace(0, 150, 100)\n", + "\n", + "solution = scipy.integrate.odeint(model.ode, initialState, t)" + ] + }, + { + "cell_type": "markdown", + "id": "c4feebae", + "metadata": {}, + "source": [ + "We can plot our solution to observe a standard SIR shape." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "8303885c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyI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s76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure()\n", + "\n", + "plt.plot(t, solution[:,0], label='R')\n", + "\n", + "plt.plot(t, solution[:,1], label='S')\n", + "\n", + "plt.plot(t, solution[:,2], label='I')\n", + "\n", + "plt.xlabel('Time')\n", + "\n", + "plt.ylabel('Population proportion')\n", + "\n", + "plt.title('Standard SIR model')\n", + "\n", + "plt.legend(loc=0)\n", + "\n", + "#@savefig sir_plot.png In \n", + "\n", + "plt.show()\n", + "\n", + "#plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "ba849579", + "metadata": {}, + "source": [ + "Alternatively, we can integrate and plot via the **ode** object which we initialized earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "efddd3a5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.initial_values = (initialState, t[0])\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "solution = model.integrate(t[1::])\n", + "\n", + "model.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "4dd6e250", + "metadata": {}, + "source": [ + "We could solve the ODEs above using the Jacobian as well. Unfortunately, it does not help because the number of times the Jacobian was evaluated was zero, as expected given that our set of equations are not stiff." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "7a7a568f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "#TODO what does this show?\n", + "%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "91b7f9d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "\n", + "%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "3403884c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "\n", + "%timeit solution3, output3 = model.integrate(t, full_output=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b6b9ee47", + "metadata": {}, + "source": [ + "It is important to note that we return our Jacobian as a dense square matrix. Hence, the two argument (mu,ml) for the ODE solver was set to `None` to let it know the output explicitly." + ] + }, + { + "cell_type": "markdown", + "id": "5ca18fa3", + "metadata": {}, + "source": [ + "## Solving the forward sensitivity equation\n", + "\n", + "The sensitivity equations are also solved as an initial value problem. Let us redefine the model in the standard SIR order and we solve it with the sensitivity all set at zero, i.e. we do not wish to infer the initial value of the states." + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "87173626", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['S', 'I', 'R']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=odeList)\n", + "\n", + "initialState = [1, 1.27e-6, 0]\n", + "\n", + "paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "8b63ba62", + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "{\n", + " \"tags\": [\n", + " \"hide-input\",\n", + " ]\n", + "}\n", + "f,axarr = plt.subplots(3,3);\n", + "\n", + "f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')\n", + "\n", + "axarr[0,0].plot(t, solution[:,0])\n", + "\n", + "axarr[0,0].set_title('S')\n", + "\n", + "axarr[0,1].plot(t, solution[:,1])\n", + "\n", + "axarr[0,1].set_title('I')\n", + "\n", + "axarr[0,2].plot(t, solution[:,2]);\n", + "\n", + "axarr[0,2].set_title('R')\n", + "\n", + "axarr[1,0].plot(t, solution[:,3])\n", + "\n", + "axarr[1,0].set_title(r'state S parameter $beta$')\n", + "\n", + "axarr[2,0].plot(t, solution[:,4])\n", + "\n", + "axarr[2,0].set_title(r'state S parameter $gamma$')\n", + "\n", + "axarr[1,1].plot(t, solution[:,5])\n", + "\n", + "axarr[1,1].set_title(r'state I parameter $beta$')\n", + "\n", + "axarr[2,1].plot(t, solution[:,6])\n", + "\n", + "axarr[2,1].set_title(r'state I parameter $gamma$')\n", + "\n", + "axarr[1,2].plot(t, solution[:,7])\n", + "\n", + "axarr[1,2].set_title(r'state R parameter $beta$')\n", + "\n", + "axarr[2,2].plot(t, solution[:,8])\n", + "\n", + "axarr[2,2].set_title(r'state R parameter $gamma$')\n", + "\n", + "plt.tight_layout()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2f64d869", + "metadata": {}, + "source": [ + "#TODO links\n", + "This concludes the introductory example and we will be moving on to look at parameter estimation next in {doc}`estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in {doc}`transition`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb b/docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb new file mode 100644 index 00000000..dd1568bf --- /dev/null +++ b/docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb @@ -0,0 +1,453 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transition Object\n", + "{download}`this notebook <./transition.ipynb>`\n", + "\n", + "\n", + "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", + "\n", + "\n", + "All transitions that get fed into the ODE system need to be defined as a transition object, `Transition`. It takes a total of four input arguments:\n", + "\n", + "1. The origin state\n", + "2. Equation that describe the process\n", + "3. The type of transition\n", + "4. The destination state\n", + "\n", + "where the first three are mandatory. To demonstrate, we go back to the SIR model defined previously in the section {doc}`sir`. Recall that the set of ODEs are\n", + "\n", + "$$\\begin{aligned}\n", + " \\frac{d S}{d t} &= - beta SI \\\\\n", + "\\frac{d I}{d t} &= beta SI - \\gamma I \\\\\n", + "\\frac{d R}{d t} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "We can define the set of ODEs, as seen previously, via" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68d41d64", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType, common_models\n", + "\n", + "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", + "\n", + "ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)\n", + "\n", + "ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)" + ] + }, + { + "cell_type": "markdown", + "id": "d393a33a", + "metadata": {}, + "source": [ + "\n", + "Note that we need to state explicitly the type of equation we are\n", + "inputting, which is simply of type **ODE** in this case. We can confirm\n", + "this has been entered correctly by putting it into `DeterministicOde`," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b0801dd", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde\n", + "\n", + "stateList = ['S', 'I', 'R']\n", + "\n", + "paramList = ['beta', 'gamma']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])" + ] + }, + { + "cell_type": "markdown", + "id": "6e764826", + "metadata": {}, + "source": [ + "\n", + "and then checking it.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5782a96f", + "metadata": {}, + "outputs": [], + "source": [ + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "c693cbc7", + "metadata": {}, + "source": [ + "Now we are going to show the different ways of defining the same set of\n", + "ODEs.\n" + ] + }, + { + "cell_type": "markdown", + "id": "fa631d9f", + "metadata": {}, + "source": [ + "(transition:defining-the-equations)=\n", + "## Defining the equations\n", + "\n", + "We first recognize that the set of ODEs defining the SIR model are the result of\n", + "two transitions,\n", + "\n", + "$$\\begin{aligned}\n", + "S \\rightarrow I &= \\beta SI \\\\\n", + "I \\rightarrow R &= \\gamma I\n", + "\\end{aligned}$$\n", + "\n", + "where $S \\rightarrow I$ denotes a transition from state $S$ to state\n", + "$I$. Therefore, we can define our model by these two transitions,\n", + "but they need to be passed as the `transition`\n", + "argument instead of the `ode` argument of `DeterministicOde` or `SimulateOde`.\n", + "\n", + "```{note}\n", + "We are initializing the model using the `SimulateOde` class, rather than `DeterministicOde`, because the stochastic implementation has more available operations on transitions.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6966fc5e", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SimulateOde\n", + "\n", + "t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)\n", + "\n", + "t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", + "\n", + "modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])\n", + "\n", + "modelTrans.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "b896d5c9", + "metadata": {}, + "source": [ + "\n", + "We can see that the resulting ODE is exactly the same, as expected. The\n", + "transition matrix that defines this process can be visualized\n", + "using graphviz. Because only certain renderers permit the use of sub and\n", + "superscript, operators such as $**$ are left as they are in the\n", + "equation." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1e17eb7c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, I*S*beta, 0],\n", + "[0, 0, I*gamma],\n", + "[0, 0, 0]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelTrans.get_transition_matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "570ceed5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nI\n\nI\n\n\n\nS->I\n\n\nβ*S*I\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nγ*I\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "# TODO why are two images produced? issue #75\n", + "modelTrans.get_transition_graph(show=False)" + ] + }, + { + "cell_type": "markdown", + "id": "5d982b87", + "metadata": {}, + "source": [ + "```{warning}\n", + "The execution will error if the incorrect `TransitionType` is used against the wrong argument.\n", + "\n", + "`modelTrans = DeterministicOde(stateList, paramList, ode=[t1, t2])`\n", + "\n", + "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde` is expecting a `TransitionType.ODE` argument.\n", + "\n", + "Similarly `DeterministicOde(stateList, paramList, transition=[ode1, ode2, ode3])` would fail.\n", + "\n", + "This therefore forces us to construct our model carefully.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "d590f4d5", + "metadata": {}, + "source": [ + "The third option is to reframe the system as a set of birth processes, using `transition_type=TransitionType.B`. For this simple example, this formulation takes a similar form to defining using ODE equations.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "9f24cb0a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)\n", + "\n", + "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", + "\n", + "birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)\n", + "\n", + "modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])\n", + "\n", + "modelBirth.get_ode_eqn()\n" + ] + }, + { + "cell_type": "markdown", + "id": "f1d61012", + "metadata": {}, + "source": [ + "Alternatively, we can use the negative of the equation to configure the ODEs to represent death processes. Since the death process is the removal of a flow, we take the negative of the birth process alongside using `transition_type=TransitionType.D`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9a3b3758", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)\n", + "\n", + "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", + "\n", + "death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)\n", + "\n", + "modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])\n", + "\n", + "modelBD.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "1c8d48b8", + "metadata": {}, + "source": [ + "\n", + "We can see that all four approaches have yielded the same set of ODEs at the end." + ] + }, + { + "cell_type": "markdown", + "id": "23a105af", + "metadata": {}, + "source": [ + "\n", + "## Model Addition\n", + "\n", + "Because we allow the separation of transitions between states and birth/death processes, the birth/death processes can be added later on. The following example takes the model that was defined using transitions (`modelTrans`) and includes a birth process to the $S$ state, and death processes to the $S$ and $I$ states." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "3a6a15ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}B - I S \\beta - S \\mu\\\\I S \\beta - I \\gamma - I \\mu\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ B - I*S*beta - S*mu],\n", + "[I*S*beta - I*gamma - I*mu],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelBD2 = modelTrans\n", + "\n", + "modelBD2.param_list = paramList + ['mu', 'B']\n", + "\n", + "birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", + " Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), \n", + " Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)\n", + " ]\n", + "\n", + "modelBD2.birth_death_list = birthDeathList\n", + "\n", + "modelBD2.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "076bdc12", + "metadata": {}, + "source": [ + "\n", + "This demonstrates that we can approach our in stages. Start off with a standard closed system using `TransitionType.T`, and then extend it with additional flows that interact with the populations' surrounding environments using `TransitionType.B` or `TransitionType.D`." + ] + }, + { + "cell_type": "markdown", + "id": "ec63c1e1", + "metadata": {}, + "source": [ + "## Transition type summary\n", + "\n", + "In summary, there are four different types of transitions allowed. These are B, D, ODE and T, which are defined in an enum class also located in `transition`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ce5787f8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TransitionType.B = Birth process\n", + "TransitionType.D = Death process\n", + "TransitionType.T = Between states\n", + "TransitionType.ODE = ODE _equation\n" + ] + } + ], + "source": [ + "from pygom import transition\n", + "\n", + "for i in transition.TransitionType: \n", + " print(str(i) + \" = \" + i.value)\n" + ] + }, + { + "cell_type": "markdown", + "id": "89607b7d", + "metadata": {}, + "source": [ + "Each birth process is added to the origin state, while each death\n", + "process is deducted from the origin state (alternatively added to the state after\n", + "multiplying the flow with a negative sign). An ODE type is also added to the state, but we forbid the number of input ODEs to be greater than the number of states inputted. These strict definitions should help us to improve the bookeeping of states and flows when we have models of greater complexity." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/pygom-doc/_build/html/_images/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png b/docs/pygom-doc/_build/html/_images/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png new file mode 100644 index 0000000000000000000000000000000000000000..b297fb03cfd1615974fa8520f5be5fdb611c2cf4 GIT binary patch literal 29179 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

{f6B#^O-8kTfq6)tE&r+S2{#y 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%0An8z*#+yb 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

AsjAGT*3@6%gMg$w7CCk>OiFx*ww{Ey5>K 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

btNWmEuSLy*x4`KoMRXL~P1SZb$mxcNyu%ai}*4 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 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/html/_images/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png b/docs/pygom-doc/_build/html/_images/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png new file mode 100644 index 0000000000000000000000000000000000000000..eda9c37bd95ed2a9f72d2d4264fedf09ff36be5b GIT binary patch literal 27752 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 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/html/_images/5d8f7f60739053c865b0e6582da48ea90ce9767e60c91e5df234ee3786fe52cc.png b/docs/pygom-doc/_build/html/_images/5d8f7f60739053c865b0e6582da48ea90ce9767e60c91e5df234ee3786fe52cc.png new file mode 100644 index 0000000000000000000000000000000000000000..e2248be66c6fac3e4408a703e9452770f572052c GIT binary patch literal 31060 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�(gResLADlN22&{H~a|2v*eFRB^t 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 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/html/_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png b/docs/pygom-doc/_build/html/_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e2907a6aebeb0d3b875d394563b1da39c8f552 GIT binary patch literal 28430 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

2g|G8IjEHdhjq)Vu9->m- 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 n;(sg2_P^{o|F?>6c + + + + + + + + +S + +S + + + +I + +I + + + +S->I + + +β*S*I + + + +R + +R + + + +I->R + + +γ*I + + + \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_images/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png b/docs/pygom-doc/_build/html/_images/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png new file mode 100644 index 0000000000000000000000000000000000000000..7c268a94807898a629ba8b0f41f6e496d1636b18 GIT binary patch literal 96634 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 z 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
Ypr5Jplu$6
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
J6)Rj1{y$rVflmMc

literal 0
HcmV?d00001

diff --git a/docs/pygom-doc/_build/html/_images/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png b/docs/pygom-doc/_build/html/_images/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png
new file mode 100644
index 0000000000000000000000000000000000000000..fda7a4567beb10f3eb9e3b7f74a4339fcdcf8536
GIT binary patch
literal 28637
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	oy42|8Z`w&%L!C-DEx$Ax1iDi@>zm
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�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
D9yXa1

literal 0
HcmV?d00001

diff --git a/docs/pygom-doc/_build/html/_images/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png b/docs/pygom-doc/_build/html/_images/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png
new file mode 100644
index 0000000000000000000000000000000000000000..862b8500f2df3dc43e2dd4a87beba1ff5061a1e0
GIT binary patch
literal 32819
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�c
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

literal 0
HcmV?d00001

diff --git a/docs/pygom-doc/_build/html/_images/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png b/docs/pygom-doc/_build/html/_images/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fb1bed9de8932f10e9059655fd39c75f09ddce8
GIT binary patch
literal 27643
zcma&O1yq$$*DeZzfTVPTV1RT9(h4Fd0s=}m0@B^7NXRBcKpGTLM7q1XC8WEhyW`HS
z-~Zin?l||3%NPzE?Dt(U*R1E6bM5!f<)!hksjyK{Q1G6}JW@hIxq?7JL0!edfWM?2
z4E=&%f(}w@4$9WX4$k^^MksRn4mK9n4i=^cH=K;@>`kq$csckvc-U^dc5tw<7vki!
z{Or-GbB7c78YHIrg!VjMo
zHUjwvrJH_Igz%FdUY~;e`+$tT;v@JmOU-3Qetu6$jRZapr@E@9{lKzx!s=jSLiW)k
zbpH6R6}v~3^<21i_V%VD`L~_iCoXBz4jAR6JPRp{$W2+~Q>*xba!Z{zbv}Oln8_j8
z$mFy>Dz!S8wdzqhir~A))Mq@PlbW6`>uyS-&&|kqg-d~pho^7W>`~=SCZ>SY)YSH=
z!*V6}@b4*Nqrvb7DN~;gm6Td01yx{h@C!q-8s`*AeKXF!fdrX&MR@Ex$GVh2DRL7s
zAtYo{u!+>i|Jmf%$F^OtJsHCpyE0~W_M&oJQ-dpLXtwuhbdD{M0tk20qrfmVHGO4d
zq^=#rr`X%ud+XM%fzyO9e@EE=%*fo_)I>-{_47$}lL>Ca=g*&gf`f5Uh=_?-_jgH=
zv&nzxSonz>#I8}8TTWy8RzgAorM0#71_wvBPC%-oFCs9o_1e$U$J~5;1G7(4?`9mG
zXKb1q|9y4ky?;{E)5()_<^Kr#E?W?+*4M6IPQZ4%iCk0LKk|S3C~&~{<42+l*)8n9
zi@#%bviE0ix!3o@hwB=Juj_t&k!}!a_4D&L4kQ@|GE>eY2Pg+B_*tD*S@Ic=sZgnJC9j9n7X`(zBoT6CM0|)
zA#r6$$K7&4C;C
zFePv9h()GaUW#4vJ@Y}EN!KMpIy!j|4-tWJ8#GLOn){2c?!GPh+tIpS`U5`{3oS;7
z;=7vRwNUrY1VQ`du@X-Cv2OFWYXWjuo(`tGT=orWJO2HQyROzqqJ!oWPXq@v---
zbb&z=cDci!`l2D7j^v9yrsgpEo{zU>xo~~qaMIejHH$4~=EB4mGjgg81~b*!bgL68
zHp(-aHJIe$8c#QCdgj|A)GM6W4O>DNPF8bFHpa{D(J5=iU7LE0pZgS!^C2o}+^?YxQ!6yPl^93kmk!
z47|Jr?PVS(f6_ca`cV%##l@3t=bH0gwGkQjB!x^^Eq#>bs9SeJ`w$V)@I&$Ia_?8n
zj!*1!ZA{7YZ!qb8D9OSRnk0Mjd!Fp+w|%_b8Fvq{x90#_(oWSgqA8LTDGVd(RJqyi
zb_v-3`4&y*dt$%o;iNkyuko{}9u^js+4IAxw3itwD3xbB9SPnS$0C`K*TtA-h*zJm1T^}u)`xdP;
zJ0GENhm$jGYs)6PVnZm&`@&U8S=qGzJ07S!{Mv548HU1TJt;!Qt^q2JA)iL
z3M=9AJaMq9Id`h1ar3%7KYSk&l66+y!BLUtKeh7r
zXAJl6$5>62=b7}-SyikTw;NvUCSU$aQ=m_BTS;e0j);tG{4N*2Jdmzjw6u;#7tplZ
zEgS~_at2Qol0;%7BT0}8L@9S#Z?AOSJsPUHcxkO~+q7mHNxJxA!X>!O-(vXZNKa^&
z|8ZznXqRz=afxA$hoH@U8gvYFA`%iGUak+n^q3gx>V~hpttCW9mB+&Juf2|ijVY~H
zm5>ZB%X9U22KiEgJ-(>hp5D>c3@$Z)a0h2i0$4HXhoq$Ln_(jLU~k|UYZvSkpFe+K
zW@Z-E^Jk>MWWf!r_4z%A=9U)a7cU;k%j1WKhocmN40)KZ;8O8nm5g;Yhfs%MBfwm~
zfcv%Y5iMyy05=G}PkHW`UAsK8h0Z-VidEHa`PY|rovML>7v+wtk2fc){)`r}DyPXW
zfVRB?<9YS!l}!_=DoU>1!qc6dolrMM1$}+}D29dk`FWOygnGM+UC&~;-uU5=+fCQL
zVVRn!a(Cvp8kgxw5@ij@LdC$Pc)q}^lC9O&BYyeJ#pOtGsn~IK(4Uq}v`DY+ia$QB
zhSAv8Ohegb^{JW2cTlL=+1d7FdpkR`aq`bil`T(r4w9ZH>de?k*xY)@=lhESE6lf5
z<$5A|*O;UhdEiqa<6KffI)yQWjPhc~0TI!%-UM+q{X?8=#6LU{UBo6%!LTpZB0MCIN$V+NJt3o|MTkC=ZDf0jf4~~rG}{nO3N$7
zFVXKPEG#Uba@j9-vY-tPygfAgI-cT?npDz}_4oC$Tz*qz5EDyENT9*S!C_4{a!Gv>acBEzE^O#R
zn9==%Hi>hmr-ih3gFa1>6)(#mo&|*-#juSpDu2V((mYBl3xAyWnP#g}to$fKAH;)p
ztd!vELDzDl1h7=O=Qjm(Eq+$#PQR9+La|iv3vFO1E~x+N(%65%*cW-6Uo~t|tbvEA
z*=Ah8{i^l4KQ3kcyKBU-{KefKag*^<+cR*Il_x71!8C$IKH3#dzsI^r)6>(}CMu#o
zv1?x00>K-WjQtre+f_VuS{=ko>wf}z93t86U8vuHflnvW+OHrkr=&!LBKwI=(5%Kh
zr|Oe5o$I@Ave7(X^>-AKw2pPAsy&~`%HF(j!>8DCZ17|p`5GvAERPX(TA~w`9=<7k
zy8Tl3*{1j9*V58bo-GcY%F=c*q~nIszgdnIqob>xx)0p&MzlacDYczr@$PPGOFwJK
z?rt*_Kaf(FzRPACuKv6}X^qi|o<&dDjf2(6D9@n9>q+0&pUFJeW4#(}mzP6%k
z&iq(&DtCS`yoN*+Yoq4Ut2vYwF}A)qpsa9PSU7&l>olabRmQ4vyZLJ<(vv=X_z>x)
z$8B3^Gt~?HA*k;BI3F#x?0__-Y~hopO_`RK%Zy*tCLXO&B=~G(#so_@5_U-gHdzWqnUuR^Mf&02un}o
zz{BuiYDqkNMdyK*$4qx(08FmnQ$-n~Qb
z>+jF7kX2A%;^E0}))h+YS2rB8lO!UV|NQbfR#uASa`bqnoxA>fL~O?4_Ce)3+eCCj
z-!T_+*42odn!q2wZe|;@vA)^6_u)j?A`x%Q`^`D^^r^JoMgi9r{{4M1ETM9QW~zjt
zDJLV|o6!z^aFHMx&dQ@%1jzP7LP95Ku&%3ay{2_l(|XC2JW|P?KAnXGYWCuEGbeg;
zE>w@$yDMy!27k^(<;W2dO?WFf@$iGbI`;w!A4M6j$wey7Nnt;AMrk
zg#{byu4zU5t%7h1j_BTUFO~DbcyF
z!r9twZ@CUkvJ?)5HOJ5b;6=^(0X2ch7D|IZ9#}&RWHgV1Dc($MjKvaIKDOM<%h}M2
z4*`FC785q_I{gOoXffVet;)@Dp%`g=ot@7h0=>-GY-?*{U||VbTU%>K7*eB^j7@*N
zU2$|ewA#vP+skn$IK3oMLgIzZJ|>A#L!5$sFG;JKi50>O?d!!=T7MPq;G>X}6H)8T
zb*V<>{p|`J-Suxjegr~7qZ(_j@bhrkFpS%JYCGu4|EPMPiRCq%VWPi49?QIDAM0y~Pv+b5(
zTH(R|94m)4C+Z>G*9~dTc;8<-V2$C=+wWE&+E_Uk`twgpy+d>X2#JfurYz9HbcLgmZBL@s#egv#whHs1b9eA&X{Hmq-@#WU*GI7qFs1
zCUW2oeFUxh!%KdrrKUohc;Z01($Lno{V+ss+L;@X8?Me?D
z7Fv?{ep>}ZaQIhv2SixkE9r_wPoBWerh5AwAQ>MOperr!^L=m=QF(?fb`XHKnyIbT
zv{j1aUsH^#o*AiGHf6JAyLqBE8ChM}K5@>bj?t<>i}ps*oxs^pTDHBawIej_>8zh|
z+qjcom_k;_;PL6Sw10e(+
z`P8R`P4JbnpGU-p>(0*RaSjb$)N(8}d{ge+zk2zmDA_&j0TSrmWM(^wX|S66)8RIo
zJ9cF2iGfo>n|WS0!Rg0v7`LiBjuznLmL`LI)D9a#wtStu`yN{76Fnx+ikV@7inHDk
z;?G?-nA?1ZIN+?G?J@KNe+QIASX`gzOk0%hx7oD%z#r$e$i_87(?d@@!20WVkdO94A0ExGk#4lqZyMv?{qTtoq{{s@O+Hr>z#kb3NZp^yo
zn{JKQ{X}_4<5gGZ0M^Jsw7Q0eXS6k4XE9!y*Y4`E|64V|W2X%r6O)*jxZ!rRmeR3~
ztu6QAl(%@6MiC<$Tksn+Odh~|o9EK|yx0i5+N`u9G`+z%J}0BWopcUTH(eZ5h7WmU
zPV74pj=-ug`J>)GuJ-=@Wp29aaPlTIb09LTfg_9q$PzE+d6J7nSY2^aZf-)VIpD(p+n@EExxZifg3%H+6{k*$VIiQG7nrhBZ}`!wRMG+iT|O70B$@p=-Sm9TiSFm>Akz{`>k4QR_2_i!QXV{u
z%Sw70%ar%&dI`iL1DMibW#B!;en@4nUAyKpVt)vse;W`m&+A_|P)3W)TL7IP84AI<
zU|tsS)%Q$E)1V#uN2T6pbM#T-;t;WsppAr-l#qs|Q~Y9^AiMg+jL!RPyZzjKf8{Em
z3YN{vU3`e{g%+k4uH)X9=YN%Z(lxE!_31td8Fk>8yzET09OR>I9L@Oak6ygiTPN5M
zZ^lKKi}}tdJbZ1xNy@^==#>V#6Sc~!nmxai?0rW>2Po
zWL|?CJBaB;FJL3A!0
z=rUaDos%;$GRoCYI8VtL8{Zkyvd2S^a~cD0=y5pV4B-nSy5r?KH#ke=sX}c01i(Hl
zOS2^3VuVM>>)2@0eY1+HCL_D$ytnZ^@$pszLF|27#?_%5ll_(7QKDZHg&b!A)EEL^
zhU7dfrm7RA5MzX*!MR
z%lU{+!_p+HQe{fDS5G{WPt6kZ8d}Y$0`tl9Jas}cc=-6)yGwxyfrjUFNv)gZZe-Lk
zfzuBj6FkM3E)vw-V(xIR7}m17yc%S;Qga^}r|dvwK66Vd*qyg`P&SIlhu54dOKvuR)JNN;b_3%Czf3}0B-m+dogzPJNV$c5A!pgAs4
zuG_*e`McL^EVrjOjQC#{oFSK6S7;Vnhc#Xd}oop&jd((v)t2y%vf0Go+P0PK7
zw^e#8N*$IM7A;0~D}3MHWJo`o`J?H5pkvF(Xcrm86cngdr&;6e_Er{+jGVG_`C;3$
zV@Kg0&ysLnp=N`Uu~2Wl(*g!ZREtw}1$#om?Khu4-+(;T{cz(pKmR9SdE2G?-n#&O
z4kwrEedz_C0UX&sIfm7ZCz?3vt<=95-00FD9OZj_@Z+K^;bkGacY@-|rXI!O&9q04
z8qML2yLa!d0ex8I&hA22h;^Nc>S;W`WvHO5n>Gl@rmNv?>3*Tpnfrlp(xunUhVmxj
z>HFQB4?8CH2;NmX?3Onz7A0TRg*bZ$!U(_R=yMenl{v%hN0m)8HrKCTpN^ul^lN%N
zJ=m}0;$4SdywS5%u;5;r@7*C+=N5Bqw{G_ztXgyXl8?GtPHSi^Zsdn-
z`*ub!$ZQU1T&(PAVTvWSQHeMT?TtGZEBb`J(14?-h+0=jVU3okuGY`g!5yEA#w(IC!rPzerT;#;fdx
zMoIRvdMHIBWkL>nVY$^>x1V+kZELY|{odw}cr94qJUWbRAb|VyPOHAjpKeJuStA=4flNP*owPz%d{+RWQW#Umii$4
zzU8}YCvT=7U`8L9;?=ewGF($+je2H
z+B)NaddUybRu3T|V(e3cA>MOb3*WP#m5Lpk-d%A2SxrfS+cg%y`cDKRpL3U`v)7W*
zYg=TU^v`Td)dk8xoHDeKkcTT)X%LaT(pa
zxZWw8g0R1l6IVuoJddAWa+gisURl%nRd5@HHB9gjj{LKk55fEs4-OxzT+uM_J&ewAQ_~;EBczd
zoK}AOaUTbN@JAj2@k~~4I)^4Mhe3H}*6d?Fr1k*rbaa%{#yEOor;}2Yow2#@2%{7Sq@5S@}=^J+&z3wS#8gL>F^oK^ibDn8wa!B
z;@w5+a$}@knLX6+?Qsl5e75&M|Hk1#omV6E^7A{+#_L!r|F)nSup;@
zmty@}Gg}86BP4}Fj~pg*=reu+x;`!>wxQ8Xte*wiNdoZoHGF(y;C0zF3YTL}Yk)d&
z*cgw6${Ca?DTJNaq@<)AS=3g(D|_5uH*8?GEmPMXt{?xAge;Q^;)gZNO4EBb0^1e?
zSq0<(U!nAcOD~oX92{(Rm@MSTLLhc@gP2MF)%nSO<^G_i2V?;vd%q-^v?>RZ0FRvQ
zOg7OU_{CEHEeQtF1VB~Fk6dTEc+ASMGltt?bua|-ePSxAc0exL>lZ-unzVjk&~jfd
zDzqH?q~G9g3-ukE5&@-^sn#76Det@vQ>)fVyl*Qrq;MK>t|Vl#PoJtmiAOR3U-S&s
zNf>?`)xEv?n~v9IOYakhwgx4BiRDpvt8_$352)#w09Uu~TF|#9-hYi3+xi1^2aD$`I#|X<1J2n=h+Q*_K?XccV6?s
z%=UO4s6}P$-4fery$PY8&UKy;)+z~X9uhauUmi)HC;GXh8hW6IF5dls+5Cl8k3z3N
zUHcQ#Q#|1RN*H`~X?`9`$5KvC{6ICTM9-1y#8-uipYu>uborc?JaEbUefys4{=R$m
z-@^Y{c1D$qvMpoHsvExpv7^^!@mfRWO(FZ9$A}E1d-8|O`n_2{V`SzH`|PIQ8LApu
zA;`I2U?b$zo?8f`I9Y32+ag^+-*X7&`tL0(u3Z06fS|?PVb6XH4uy&lyat;{wJ3_E
z1*J!^M_AKucwa^`HFr4jo;l8gkD|UkpVph#t+oW3kxnZNMlo8@=MMKxrEfQC>y{iG
zya}V@h1MG=lhI+K*4?+jcwg-6QEXB2n-n0a4BA&1X~g3C1cuLG@wrEl9p`bA5g9ph
zNqFz!B~?1I(?_o&bY~3~e|nOU-};}wlPBWV3SRR=d8V0QW^@m^fm(1xj$NI(!|b)BKJ!I`_(??ai$E7Sv%mj@;42NK+YhBD>o?rn7|CDcJEt7
zTYm@#j0V2<#k;0T2mf0ENbg@c%Of_#C-m=wcl-gLZBQ&mDkwdJDCwp&bBP;%5o?36
z;)MK~zIPjE@Q`?_*9^Y9DmeTxyk%VOG%HIEK4nYGWsVXk`%n}CDPT68-i3(kh6)Y>
z8NK`;=qs|M_00T|N3jyT=Z8`eGF4)fZ=m|g(Gg@6xIjYo?P(9=gO26v9BUIqK5g~`
z6%e2LBJZ-b6ArP_CFyR5@{Sr7)MXZ#W{$-hDk4(|gL{5bf+;53Hfn1m^mWIgM5sqY
zVey$io+3{b1wNx8!@-xZ)md0P^>?bbf>`mbz|8s6y&~j{-$=-=N~AE{Z`Tq}an6&}
zx=+4ub+uM`Ds!k3*~B9Ep*|(%XPFh@bWVd1A&K77p=B&^Y!h$mVerPM*a(A@2HIXy
z4FQ~mgZ@!e<4ps_^p2q@#xNC&q+h
z^;+#}jm6wj2&EW{JnSGdC71b*$^Cc5Ttnu|+UOL$qHlVAI~i7MJW3PTDP8Yvu!0Oi
zlIv4woD#k)V-qA#MP0OYwX(C!4IYw3#Olua&LZW2jg7DywzaZLpT@P}I`;P}v?8ky
z^}QPG<<2nT_f3o$K4N0L~JuQ$`N4M77d+Pm6oe2m^
zrU4p~0;HHw`I)-{&d}&+;|4?`DV+)QUk|xFZ66mAGQ=yXE_u|@hm=JE$bxM8UEm}8
z315&1VcnZbTS;-cs?XF9@r4TnUUBUmmsQs2VH$CW(!pv|xs}u+f3jq2iWGj84;WkL
zM{0e}g$D~H(rxSgTWk0*N^2me*a0hUYF*Kzu1PTAf}~i
z{k|vCTv-s4F?p1DRg+*)@(VmYi-V0&ddb`Ky+@D?906Y1E#AY6g3|Ru638#vMw8m^
zDSIuox8cN8nAW&aLGnp;-%l$2XObIP7zrs=Yr~SW;l^cR8@xw6pIh)+`i?+#Rp72}
zTnq3f%W;pvUNN5PEB^f1lGG&rG#GmZmcn~zZDQB)k037L3~*1&n(ka$+}f}nyUTnx
z<8Tw1D3mKB_v}Vi;OslL5S1eXZ}#Gpb6?gKPzo0k11KH#{PCfsTBBt;&3jf?++y~*
z*L&4!WVSEzHJACNR57~yjZ#?#lQ7kqpXzGY5AoMqtqBskBFLT7syS
zSqqz-?V2D#w4l^Cv8*R>vgxqPulE$VqhrU|kKKUdQrDh6+Uu^X^xj2ryDg>se0Fvr
z8Ty{Ym$r082_eKZnvjq!yzXjmm}M}pH@FIK{7E#3wH?yCqdOJml&Ak{F?ws6++6VT
zn`_)SNTU%G`8*k(Vv;)Ga81^vSsg^bf)bM>H^D~d
zpZ(->L-+DS%j07&dpqlRJTcwsfG?b#Mkjp}ZdAd@2btkPI2=U&=dBM>Q7>49_yU{B4vvWb$!j%Pu3L#`n4n4vfe(w3FZ!T}9aGRlkR731yQH{8KXeS?|ViZqU{H
zE;%v)um-t#6ad+X=~M9HZg>vNCt+7;oHp)%6`eX;c;QwQ%2@Iv7^yJT
zrX6j+`Gi6AOwT~QhH92|e7F^fstR2|<;EN!`n)7hE$(6O9~A;lYqNu#22G
z&ywffqXZ;^AD^8QPm}-%UU2y~{(IAkuaDejRU#?A@exy$@nHu|t7GCD_B
zo=^+p&uePOfs6PGj`Fv8@1&OTrhi|vAZ-Yw+k^e1+cWEF*QsY-0eB?8Frl;OH&*-i
z_!oE_#}c)hx%PEo6@paWYAhk=(u2iw>`{dBi{`FP4&!#tF$Y>WIT?0lwx|0R{I7ev
zwR*9O4-JCtn`72Q1O8YtM39%@(mGZyK*0m
z=2>|mCb6_*gMJCO=N~I87kk3kR@RH>n95;snrYE~nok-rHd0
zg0&-eICik4{&&f~-~{hwtf`M1Thi*-JWf*+t1#!vijUpp*4bI{AhYa&d>!c!r1cfe
z76U{P(km47b-@(@ztZIRz{zV}E=p8ul?|=rBiBgsZ;jMic83q&dv_~P5O2&kjLGXa
zKDicII)1j$uuv)HoUsuJAnz_D3-@p=@fo^0_n%!-2W4NUS)PtsJ>fBy(L}l9S@EW&
zS_{#URSRhVoI%T?iSwhOM%b$Dz!MQWFI5YE7wbCtjo9+w6eYPV$iU>{!9!~{IU+Di
z)HDOa#@#f8b*jG;fOnqCeqy*chG^wrE<$dFuw&pZTQw9bk=O^C{V?!pT2rJDp=I9C
zcLv2Gf%os?P$yFzmJf0{C&
z5F|7++k|N#6x)FopPALrB5ykMHf)pPk=8NqH%@m)vG{)bEDm5|8ka=y5uBAAKk=vJ}$R+4%|@5RvV9z@pnVQ=0tBP|YFc(DC@p$hI+s
zF1Ln1ll?y2!)Zuww8=kDpyF>p>`M&D{5wUO2sYyO?b~e7_4GwDfbIgNA`yP)>(#wA
z3p<9E07|~s*OBsp+L^=VWFoY*VMk{yQey@o5Kse8-yuR2z9!%oj+~dUiu?WhNNd&j
z%d;9oE@Z@GVO}T~@LpMp26P^YEbUi(nXnSDwY7y#5bC|vp|FhX
z@}K~EuNc6`LoS_1+jDJDUiVlZ{cUq$VD&L>*%2X)jfXuQ(tBQ(X>G1$;_0vaB=x&78Jg=R$}BBGz7ceuI3Yil3S;7czQXKPn{{PgMZ
zlPA}J>y@URa}cr>N=%BpGf6Ubjo))DwSn;g_-}jFy;~f8ZRYmHJ3X8HACr_D8x@&m
za>v**WdFMb#U6v_&#wa$U&9vBk*SvGwfnV$=RR(EgZ#
z7u1LHa&kVucT|W91ws$n&2lc=7Xn~Dx)IKRXOegS{~^fBZsAR2cL!8LqM`c44HbOo
z5WKrleY$ZXjI*5`)4jM;Yiz#y`av`9lXM=}Lp*EtTN$4l|N4cMMCpcKD5~0yq^F0Q
zCeR9y`t4gU^kg6#C|vtxp|s|7I)fVry@sG)EyH<+P<~_rJ(XPv}YgAfm6VF+K!`0ctJHF6AMCq+&kge)ry>sLB@0>}6
zHepBraJz}yt
zU0hUC+Wk!Me@CuaQKSuDXg`$E<~u*^rfcos(!GlLW$QYLk)&-lC3+Uup6&hpYO^V!
z@F~YIcd~EqgVqiFn}Qv&5#GOUGkomXq^gf`CNJ>P#aFGm5WcJ~7if_GdGVbSg6(ws
zQ@yFDGTJEa(UPMqytk<6bdoo)-uhg}!o>(6hF(fKtk9ik(OQp@HEA|lJ$s)n;|tuy
zK4XCrMK4LCrjzh7gNlKEZ=atKH=Sk`-mcqsQBhxsv|?u1S({Ryui#8`R$`iHDZ=JZHhPJ%Zt#h8atCA&J9|&%0PM%U7Mw
zCFx=7#Re5u_**#(GyE`V2OkOjW^LMWhwJbRke9?YJ
z;a-3!wb=3a&N*S}s1Ab+bsukyrsvLE*80$?)+R^S8Y$oS^Xh676>@7YbxMAGSsq=1
zMv!24e;fJe`+!F(1-vo8aU5ISsef<9?ovm94p`;Wc(68Cf4R?HwTFe`S#=yV0By{Ue+
zi5RHoB9jtH2?cx4DQsC;h{)-RCqgl{(Pd)GbQDKS=BuXj0Fimw-Qzo|STi#vAiHxj
zy1g}G`8NM<=hgv#G?L>E_g{`SVekw&F0JmE9N6FA2ev^(xwjyu
zm};Ek-wceFcxNYX%e?ApZisY`x}CkNPjUG!g^7jh+jnJR9wInifPQTzW}VH$62x>W
zA}hPqnwc%gWDQ>?v$W0VTTv0@!!L%9@Yaq8|~{!v_x3=BwM#)G=G8;@P#3^lfmE0dAw@9`Lq~n@tYbt*F84!pM(PQ5Wqt
zv6q;rvJeyq^^Vlwe>xy+8rlw{=UngNjVYMYwt4N2r;{!r~j
zfZAKJG|WoaTd~5jbv1WBm95!{J-Vf)iJ%8?Q~qSlsN3kJ&2@aMqH-!2)-1?g|98ux
z+ofh^R#Ok8mJ{gcv`G?7j&G1+k?Aj3^(wHBp9C
z!N~cQUT^r=le*?!bmC(*O=)7tJ(-#}eB>Lt_VK1bKtNWMq*x3e$CphWiOTP
zz1rw7HmBjn|(ET^IqHUGISbuHy@~rs@C&zxq6oq}+3303V>%XF=
zSL&c=iWg}d6^dhq6V!czb|a6xG)RBMT}2hr_K?Ieyb7}TRZ9#FO<7{l+5HYjoY7~v1QZtacwSB*S_w>HT8H+Wgd7Tbwrc^>>|fkK{5~i9isw
zT%pVAYld*fKu1AHRlR?B&Hfykd8b(ZO3I(pnSTD8Zx`zJ1nAxqaFJ8sPnYlGwg*i&
zWH6W{BN=HKNtNCVim|J2CE�BcI6~neG#~@tt^n?M=F>#0*1522AE}wux<@&hWYe
z*18E-3e3g*e^JP2UftBjx*DsZ3dV`2xUe5o#m+7X&Uz>=tu{ngLM@Y$Vu}g_lV4Li
z3S@fA-}Xp;xp7iOg%PAm3Rye-DwkQhunRw{Y6s#LWZsQoC8q
zJ1*9e;G1_JQ>?7b!)PqPec9ICz9yQ1WVj`Qi3
zmae5YkUR88Ru5|ZRLxU?koinICTMIu5mOgtFS_z}Ix}FpIQesz9y9AZSI%0*#LTX+
z{*s4HMOL;FP>1O$CW^bPbVFaxh^$=983;V9
z>-7++3I6u*V|uW(`}th`g9v)PL1wnfqeqobL=i>#w{M1NPHJ{``(Aw~jJ6y>vL3Yw
zOp1Slu`kDxi(%X-3vCvo;><&HKsqHk;1;sal;hxXPL
zi_5FUXINv4wHJ6cuLF)XE{%TAU3tqOGFeH+!`F-(R;PHK=Gw!VMXA0w`qwFNQ5hDm
zmo{7rys=@;
z{KDTo{$eEcp{U>E-iyS?wMF#m+I~R8I?i7&e2n-Bm)D}bN9%FKEv`(zO?oflEXDa2
zjaKJe$4|;sOCqJqoO~?#rK7uPxS&>Iym5EW%NSEJ+VA%316|8#vF6o;(PH_`m68rED*rNwubUZ_Wl}?|bm^T7i@ltKTQe!zDC4$|-7okn
zd7UZ_(TeI*jsj}+b~T!fEvpV`{ZaiZ&WunVgJ2N~WsU_q;hO9*V`{+7cVZ94(J
z6cwn?xuo=tV^c{CCu$KdMQ5w~w?|B-a%##RnROWR=IA$8Oq@fqr_t2KZmXS@_4Q3_
zC+Ex}Wb_8AWZfvjoVxu1`b@Wv3jKw;3Xa-YbAA<`Etmt%)tDSLFX{BNjBc!HRD;S#JNBxUn5!7v!5{>xcwh|UM1)y_w*LRUo@_{0
z0u%)DhJ?KEdZ7?GlIQnY^KqTS_`-dCbbM5U4T)D&cileon@w_I%D(L1Y^pkove?2m2XZQEWL!7L|c(
zU`1X@*-m{Hen;vbD5fesr|vYeFfm`v{dH*Gf3zFWahJosU%ZSGX(WnY2D^J!6?^`V
zW#-O!fiSo&iny!%ec;6Xj$GWM7cX8cu-<(VVHY&;=zoU4Gg)xoQjx{^%=#|$k^4J^
zEP0pU7a}EXZIhlgKCWd|I)m~3S**mfXY0vJ!d_=CfEihJE1cGM45AoA;{Wj-d^U20
zCcRv^7rXt&bY~X#tkAO8rsCR$4);%9jTJ5Qayk4zYs~jgHWH9sh;U+$L#SSsb*($a
z>(X4W1@_2vs`^~9MKDo5L4H%T_;F+MkH2JuESieOYq4;gxEDPs9hO^-s^+fNZ;to!
zDtgR%&Krab%^xV_Z2vIfhORHK^Am3OgSB=`xK)U3tbG0J^VfsTzHc}{85uVPkw)d<
za8`aO=oUhdva0+zg=Vow&oE132t=_${kQHzp7%aQiQN0xMsSmT_4ky#Vm&4M1m@6ZKyr!pa
zb{8P{>{#$TqeF<}Z-+|WC;i&GtVK5j{@~#3ZF0#~b3Hi6OOSre|h6r=C*BIgshMuh}aJVX4ZQDhG-A))!p@$o)3
z$}4X(v%b-hek!Fn+{UifHWXXfNGcHG+8CD~UJqHdvi{G|P5VJ!eCSo26(7bXb?f6q
z1<{2pL_AFuI97*7SMpaL{k^WA`O>v2#d~}_-@)XL_sJ#?{yb?v5Nx2Yh7X?FXLS7J
z{m*C%g@V%JS4#7aZ4_CEtJNgaJ3h-wpesKkGs6!W@(&lUx9Kb9Hm+s4;z0{
zTWNF}odHx?hHZ0E;_)`b3eXPm)@6JetQ<{sfaC}7HrU3N%%A2eY`*%#ZMHYWlV3#huwx0wqC%tww6@x++K=Z*eLGcz#
zLleN0hsw{%39^2ST*m7gL#$S9t#jW-;*ZUK>)@h68BH}gp>fz=n2>m*u&@|e_lJ|s
z)VEa|k4)+S=5!__%H5WFu{d0msMK4{1c+!&C1vQg_&Z+i>(HjCihLKxZnA34c%3p!
zD8)7>jfF>OJU%Y`1b06E4rV)l520gBfq_#@HxIS**pdYlJuz(?C^C$Ds$iCvD9L2L
z|9h54Nn=;l0RcUq0U5&a`R5seLbea=!u1tIs?s=`ya)g!RSyJ=Qkfu6D
zaI%SVF(qECx?Q@!U9O5EQ)C-0f9k@OY1~}<{kA9LPHw_b_s=@q+*AE~xU=p7PB9(J
z{Cds`bsBs;xX!!u1lJjZ%k4RjKyqA4Mf~c&^?PhSKi&`O8XX*ywtCvL
z@IGhorA`FJ2JZACgJs#mfD@FY2FDKh?)_(QQc=XdjlC>f@FVvcZXK&xuU+8BvKyup
zWsa@rS$R;9`+fhlnDu{_pHWJDf^Kc4o_{l<#w-70A|?(Bg_n{@Si)3D>SFnwylTjV
zLCH50r@0CtK(zO0x@@<|mEu9Ib}?Pn%|<1<^dv(OnkT@ikM$VfylWj=}E@
zi#R9-)}Z|PAbcPR-@tHWx0elBC;+mC@J-S6yajSI%0+*VZM
zV6jh0|7}c|RPtAEn_iBXep^uKKqgFJcD%xo(fNoyAY{UnlJ<@aSUmFrvrwUWK9iCr3_?jize+XQmcV
z6hxG}S{^In*9|BmCeHWgryBp~!+YYp@2
z%#d7t9X|F`EeF})S863I$;*s`|H8u5k)#?MWaSgbi^Ub)W;skne9!+ao!T1<(NDI{
znDIGsp6pA)kZ5my{`~NN78QzxFyauf?i$0dT~8}%_+m~<&Gv6Hu@anoCGa4Y$8c>A
z8ktSWs9KFYH8nNkX(Ij}hl_4EolW$cn^=rQuFlmX87}L!{Bf#zZ~lF`%4P<|+fb{9
zlRXcwsZa0W4&aIM$1v9zwSOY3+zebLy*#WC6g&)!AOaiA%f6FN`fuXuom@4l@J8s!
zxbj0aFZ`c&xQ;?K^
z@Cn@)tzO-#ppbul)J63>C7E;ST;MflJGT}!1P&2UZb(1k9CgUH!8co4Xw7j@Y99X!d6fomFa02s7Uf-&b73(>dI5B;!HqaSD2fun<*wQ{XzGQp6+=$tp=+{V
zUN{8GP`z-68@^@1t@9iyAaRc>JI=OZ2b3#@W13na15p5ezJ`ezAUiD+?uQ$7eCo|m
z<%F*{kbnI6anWf{EN=kvCU>&;MeJ1^vJX(l%GGZehPvD}a!xoJya;^?k0LW&Behg@
zP1)7(^4u@@~;MZ
zz5k-Bj2>oY=Ff$Nk#KQwsI&)i@W7y;pB_;4byfN<6OnSjsN`G;1II}>Os!?o}4k|~5TPlZ%e=FCGvl0syNjS!NV%rix0N+~2m
zB9(cbXUdo|&tvu`cIIv7y&le4=X~pYXT9%QR%==9ZQuKT?(w?*|KByuAtO`Og5TJ1
z>+I}&w8n_Ir@^+KaZ+sm;m*d=0}BhCD!BbkE5~x&esOr~*$6UbXhRo9ye$em#*{iv
z5^zBplbw5faXMOhceM-Aqk=@2iiHI|v*<`j&;hd@
zM_66o#r327mp;@CC$Z05Z~vIXKtrQY?X&xJ_`QZhehbiC9!dQjut=N+@6-cuh^{V-
zRsZcdU?pK(n7#5nPNN7uo`_|RE6&g15WmAlDIdWs8V+9nNI((^-LF9zdMzm~udD!m
zg&YMgt53jy0hcAIpGAUu5L{3In{yY)0{ZSYrrc=xaBAw@-+Ls6prkn;}m5d3=V61`6v5`xPT^M1o2*5XT
ztP8Io^LP-UAXd`jB_FYAwR$kee?Pf=TUxHvXi87)M=8
zip;_4btC>w*|1msAWHySPkL(U(p8AkFa_Wb*A)$mm14HDLe)<&#&YDgV|By24o)FK
zNxP6tfaR=vKxf)jE@D3Ns^3Q`?Ypa&{-{2zK0FXOYoIZc<%RIUPb>9UedOzZ`W!a*
z&u=WncJpN(PIkc<5L32=*{)A8qlL+F^auTvqFSY!OYBGHS=?Y-9Lt=q`5}XfMUE=o
z+Spmc=y0_(1-(t%=*uHD;OJrV;WVu*4V@(qN0ITo-hzlUbQoJ)q4{YpGh2zq;I7L8
z%Ztp6b8Tj5daL8FJr28sEiQMsf@~{!G&5(wI(Q7ia=cSzdg^c74o`D#U_LtPGv-6J
zQBNhz!WI-hhnf1?pnv%3oQZrxfyOmSE|(vUTv}aZ&Jq;M`GwZ$NFF=bn@3LBU3KZJFj70i)DZ_k{^5e)3;x6Q9WGJA8}=ugl22Uy2=?XeP@3tW-`cPkUgVz
z*mK%ddZp0;C+Tq}^$agNcV<{S``)QMRjfX|q!bE5>;?t5lDp2fihju~kb=uPk6(5$
zo4kEE0MT=JOpc?gi2n)Z=(S995(%5a(okzcV}Yv6suiGvgrOEbS6#hu?0&y8DTFxL
zDk0(S^ui$V~@={n6
zEkey}b|hCHoK_;4;9kFf@pJ&2wAkhhvp(u3nejf6lk^?wkiF}NJtl0SNi;~ho11zK?)J|slgbj5EV~aoN6%{A
zT*!A$4sK?mCv5ds!po!IwKj}aT~P5lJeYr7({|6E1o^ZjBdZ4dH+^ht$`P5*Hxc13
z^40UU)sGlu2`3VG&slO`SnRGP)H`^P
zxn35I&Q!zu7@LqDZ2e!5{`FjOMcJ?4!=)!aDGwNOc4LsROj-{)rE)lvQ`fNzXNpTg
ze=Jdx&%K4eFVrii%m!&Jw9XjK1)0OakNQm;z0_-mc`WXlIC7+XSL~FvU7Qu~5c$#a
z`qrN3S_l1g%x|53{tO%vT?CBZk8v(-5L@$6hTwiI+8Ud1A2f%(x+Ijl+L~ZIAzyM_
z%rHASoyKLyJgZo;tGw|!XuIJ6@nnCm>a{#!YJm-P3#$aVfuk@cd-dWIF
z<*A#9)7N-hnOuEvy0okdpVz9uW}GOT)4J3oCB^8vonN6FFMRBXHvJin&I_PD`J;9p
zd$eho=uT#m+36W?)+Y-32JtY>7Cm{0TRmy{X1l(+5Zmmrkw?2{n&cN5W~yZ%oi+J|
zVhpn3>{b>%xO7>6akcs{>$NYpg%{onyFKONHQYD5h;r>K(xJY;tAoj#BQ*Sai|Hiv
zPUN527`ZaHPjSo3UJI334`iHz%F7sNvlC6B)BCt+ko_Q>sqhH8}o_jzUS^
zGK%5VD+)zHfpHUotsl;gc{;yv8-LAJexrl?97L2_x7~lHm*Ab8NF+W975u?g9!-@)
zLPlSdE!n*u6VPC<#>w&TaCZcaBMtjksiYm|UFf-}LDp!-YZz~e=NWZ3
z_k4eZZMd*{#}|{=vBnf&3mI%hg-3!`QV%ko=IEB}u-YH<*kjC%AAe^#ZeIuauJYhN
z)vDB#VEz={&I@@K@z~L9KV|TAOzsgEKB71R4+9)DruLvQKg#&-&r14H@WvmFeD1uT
zAwn?msu{CY*Sxs>+k^W~gC^3BU3W5+Yy1G1KPf$EeSI6zE;5vLQx)p*h-rs|!}syS
z^Ims+Y$m^~_jF9Pl^GqEKP}W(%}mK`p0Hu@!fj@%vAjRpK;ha0ex3MvxondkGP>gJ
z=+is&3pD2`-opOe6p2nx`WN}^lCXNx#+EGMwiQ9t2^k#!|P7c
z^X=aqO?T7wr1YdUBGh^AjNXVecQNs2($IYv{LiE@I&Og(DwQgt{4gS
z@p&-5lJfz5)bb!pzK+9iX}nZ9!B*P&q_dPK
zJ>|a}k8-OcvR`Uyzg^~umE}zu;t_%o-sMqO!l$*)UF?6)HmL-#$Z_8zuvGSi9wn`@9~rOBa1(7I6XQU=~2YR84aNi)cu_%Ua|Q?axYNftm)S9C-x>=
z(Z*$<(#fc(bMHE^{iV$QmQeV5e!N$Tc~w-qYD==5lJ=FBx}I6z%d5oCf7L#I5t8JY
zeuF5bAjwtZG4AvmywZdN#`MToHHlzv?NI&rpD#c0-5z2B)Q|-HUahADd3A`6{FtAw
zjS`jJub;n19v8%wNl}2!y}EZ
z3OCj7X9j(*4Ko5xUHxB0%#~2AG{LT2@5{vZIk1bb%wY(Q5%$M|NNDhM$tLjzZVa;p
z%BKe^3p5wPkfWinM3C`fR}i@jx*)_zWFal3%>d`~>w`ZygE`Lr^dI5}4-Kbu+B3mo
zxwD%U)T>9O=jWQQTr1(TKgue(I`v9B^6`s^q}w6tlbivhlqYJ4Xx@~H$LO?WwOxY{
zWR8~(9iW4LUo|8h%TS$)>#=-7B#ty*XVtE~CJNL4h#6m}2Z{JPtZPjfBfk?%%H9di
zeNy&cYio(O-^D<>P-?G70tI6GNRi9etX#+crYoFcKJLs0nW}FU9&i(
z@m!d-^3=_rAg}pEXSr;Bz0xoj$0{x^uArzG86SW9!Gn~Z>1S?=-n$9gR-WA4PAi@B
z?G+-f7kP{2?33b|Rh2P$KAE#Dr|)phFb2t~Mlv$xlc_ZGadZB(J>NZhhHFYG*_R)PahaKE*
z#)sFp#o11(NlZxWDtqr_ZJT<+b?fi$Lqem>VHE{?l+eDH9?pZd&-+N?E@{j0_Al|*
zeMx`VFVJ6-LHv&JBq*NLnY4?1nij-=q|F$LCa8gXko#(YZG%#8^7pK3y}U7NXRJ2{
zcS_fq&D9JcWSw1{loARq?WN{dBbNpv@0Cge9!lI`N*ugoX|6B0hTTKQbzf0BB?OHb
z5xBZ9JnSQDxAcBRG~;odhAv$b<0v%IS_rC%n|>qTwnZuL+Xu&(p1vDHI3`Qpx^J;J
z?7)ED3lB(6gvB1Y3@TlOz4y=i%nA_;GEf1SfAE)bR;K(h7pc2V**r`{X86=>AvWS-
zK5@zG-gPRAU~9O$m^88(zN>sHeb2mxY4A#T8ZS-`t#H}n)C#`-o85gJ
zHV22T9~w$9AGNfuwa+qU$moC5SZvj~;bX%jc|yB#PNK&4BiLcVhz49Q)te#wuigbi
zfcaKP&YAh`zSs}0Yv;##WW4TQqkQQ4$=xM+z#t|@Fn^3#g5*TOsgpBj#D2=bZ7f*Hg_EaXOFcX1A&+zErb(k=
z!k&vX@$yZ8v23pQR5JdmeCK<&wB?L*)qse$x5O9^Kr)C>bXBIZxl(I{Xf
z&(}2GKX*glY_uZJX>Y=h1e3BTzjw4UOUo{~yJ;$+5xU9|*gnAB-62K+<`f{G$aqDN
zkr9LYU(>TVAaxD^wKB&c?zH#UkZiY=d
zN?%MY$dFjID9VZs_O^w2ij2-gs~t&bnIfcu?!
z8!f*QHMo<%R4uQHnH>Q=(s6(G{(x)t$AZR598Xe>pFPv`ob#vh
zeRZmEzpFllp0*=p(lE
zN!=8@^igH)hAk%1ag&09C!^!)H0T>sZC|va(GEZEznAL?MjNeODr;%EG3FhrB%nQ{
zx>wTvez4h|xg_j`Wdb>QvA=Q5&@eB(t!T-xSqa*7XS3qJ!&
zC#&OLz4^Kt8g)R-VwCmqnieS^`2m3SdpY;z3cn-Zbl_!c4T!+pF>i~xGqp}bPp^sg
za*N?QkDc+g40+bvh0nvc(lZv|xa^{*OJyukK
z+ntkeJr%hrNz$sqCFU#Yzqy?gO?%Q($mpf5`EKX3j=am3Hp$m&SrxS*mEKxmy(;|`
zGwrtyQPn&QSM@g2TYOZX&5}5bz?Jg`o3&xt{cOyZZX}c2e?*Z*tUvGV&j7`-=WpU$
z{P(e$dXV5W0JZI}vL(muw`sUW3`tUreQ&EP^IcXt5$mGmz3W5N3qx(G6y)<5g9;Ji
z{`vlSm-%oMOE@YZ;Qg^<$KHv?9}}ykzB@WZOD;!EMMG432Xn=py`7z-*6XXnT`Q;X
zYqGTCIj86uZ=o|6cCs+stU<>377Xxx31cxGiUaDeEbxPG>8@ISD7|!1AUovoo0z%3
z8urn#_3whnhO;=|+ODin=xlb{RPncXj)Zc0jD>PuPYJ6pTne_)>RvDybKcyZRu~Mq
zlX^ME;^AFGRb$?fe*T=eg*WR>Ok!=R?f%A;D1DTO(wU-~Ge-jhNKcS*iJc|aSC1JG
zc^`=}-MkhjubVL-llf%w
zAYjghqZ~(ENONge`G&E7gHgnt_-`-@A_}IvX1;!>eKtOPL-HgFDHH$TParg22%IM#
zAs||WRsY}l6JX;p=}b{Z4TE#&y~8&~1dEQ4_K?s&m&#iN*x9`h3o+GaH!2}7^53LA
zmk?=BL`jSb5EgI6OT0nY$H8nK&wvgrX!?!3Jr{|8c9P6E_`<0vVVq-_*2&2`)~KfGdb-)U9b^A`nzj`+6<6s;`fqfic@22R_<+L?)fPSheeX$du+xB9bYwz;t#RY`bs)y`
zKkB}K^i{h#7$_OFMn%a35dm3D%#9m2ND!h8a80%FV50mDEI&>`!B;ag4{b}Q>44|%
z9jq)Ha9nsw?g7Fb#Oh=8-LHxW0ngz-)(hI$wx{Qv?i<`E;M|uq_^fuH@g_?C{mLZEa~0e6O0e1SEMTm>vLI6ha{g(l^^)kmL+%
zHx~l`;#B^i)l>x5f+5HOF!N0G29NKAec#yH={D>(WIA3*KemEJ8rjI7VIve)X7O)X
z%@!M%f7(-zl3h$M2h3(7x?S!rXLb7M!;h%i>_ug!ivr5pwRtz2NZRlhGkniA<5-|zazisiZqs_H}
z#23d_rZ>M-ey$WIdc-%{b9eBTrX}BaoJiN_`u~)dzEjld8G&50J1{0eo=BHniDw!r
zw!;>5sd9>nMi&$a2LuGbM`tvslGqgb&K=iP!o;!QC0n%StfHwWpvIfMWpZOMQgT;0oAbb>q5(}3yGL|6iDhppO
zRb~knmTwkt_gZ4G^iT5a8fp$9Z6Ew#Es_e^|C&!BmCJEeSb!hGQ19sO{M+R|x^
zy#mQpQy_hgYyk2p6pYeL0s;ac2Y|621Xy`j2AjbG0iUhe^QKV43Qnp-p?ZwHz{5THD*NAlhzIU~_%L~8)(F%L2rBA#3Y%ThUP)Rqn;K74iyTC|GQO2y1EY$So`&S^Y&0MqfbF?
z7XkQW3uMg&v^R6joovXJgY4PKBM^95-OnN-0PLFP@IxHS0FN+ZnUR>1O*pF*!^9~i
zH4Iglgkfzqg<3ay_99A>y_>W&GzCdt^Gg
zz5dr%32o;muYb*}3IaB2O9`g6D@bmdV-jo<|L@LqkjMS+wWFd(iPy;B$g;G{jRmi$_Kj41=@DMWo

literal 0
HcmV?d00001

diff --git a/docs/pygom-doc/_build/html/_images/c99713862d51a7e54f23602d6de87d6a3feec93d706aef7dff0c1f6a7032cd78.png b/docs/pygom-doc/_build/html/_images/c99713862d51a7e54f23602d6de87d6a3feec93d706aef7dff0c1f6a7032cd78.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cbe7891113e8038d7c15a53404af2154301964a
GIT binary patch
literal 27300
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

IpJF5 zj=^Wo4#m8LgTrsC+TCc*OAW}5(x>*tV*ca>ExvFtIJ^44(&Zb=1j4uZ0}qdOt5O^g z)(Fz7p0V+<84ZZQ&PVHw|BxT+EQH|+YyKyalIdL5OPR;62377DkSE{M{gZoof=??* z4m1{|G5WCZXE9pBLi~}-TM5ju02*=1gB;W38er6BcqM7 z#^aq<=$%H_k(0B# z5j5I#)-Y#U(Zwy>D89%sM|nok`d6$A*_GBGW! zsSRIC$0DxX%f0Q+p~+Kvv7+|AtkbTAk4bL@x1F+pZ}ehx?G@@)`}5~dUxgD71XX%= z_MG<7>m64a4}^^Wtd=^GD!(@pzmfaP>;|eKtNyv1hJ`2+T_~BD3$GA~oCHu>P?il_ z^abAO%dcDb2=Ob4es3~=~SF$%Bp=@g~E_0R`{9Wn1SH0W~VTO>r8&(S#y+N=2 z(_x_>dLC%zhCSiiefb?vAeZEj_tVeqDFK9~jdiclx@+~cSK63x?tE4Bs&FpQsUHfH z58g8{$gTCPCfu4f^*VBl#f{zd!4RF5=sNj4VmV@9+DD{Ls_SeGE=B_T`{^6ArKSy>X+ zh^7V0q(BQ^>b?Dahh%YO&0MYx!WtU%<;Lo6Pn`@c)dQg9#FSLSU?%2;WdFa7>i78q?i zHK%WYhQd$y?h%ThEU>`9Vd>YMykaI~VYgvnW!HI1JZFrjmg1K&_7tpGfzp-`f?e8* zJCgDh$KUm~JvSE0b!c9~HH*;sv9Yi?GIW*7%<}Zm6l&nYVW{Hs*3&||yh2uFNFrp& z&l0}R&Rx5vk4r|laH(pjo6?UIbT9Okf-$bvVRTc5l!|a2wcm;3t6LXz!$?UX>M|hM zLizGwql%tMih85DW1aU)wdt8AIzlDo2$=T16OO-$h)vtX7Z!j7tO6ZnX=MoCH>Gox zbnsnte7%$gIRb>ZsWOJFA}jdndwLMi)e?=2I(**PmPrUtG^$P<)6#L593`w;HaanZ zSPvhvrla%p-(yPR3$WcKv105*-AZlI-e360km2`Wc)x_>?rTCNJ@y zHq0PH?o>4E?%48L22KEitMd~0&6YV;#^QLC0DGmD)XdHFT`(LWQdL8VDx!FoxLGM) zyL|Qc{Hk2bD%?JK3bL3YLtdQRVm^0d_#BJcmddDe zqt7Po*Si`-P$e%Fj3vLYBBNu9jz8U&yQl4=P3n|{33!)OFfgZ+V_u9L1ppYyLy~}PjNL&en0P@ zOjBS1(F^hQv8s*E_ix<(n6>c z{SUGVGyeb9OJVq0!Fjt|9$1@O?Cc>#*Tr(Q>ivjKPbd7@I@0CY-o1MVMYAc0sEHZR zFzW6x&MRWhkzAMRJ=^1`BRn0%l$lxb^@lo}i43 zj7iheYAibQQJ3BIU)O_k95(e%PIfDS38r4DJUzKZ#unI><(O4p>O_hGAsMr3iDbTb z*t;nG3M^hPty**4i%e}SCB{?>Xmf;0jpEdY0$B5)S*6R+GK}CP7D!nStcfHrF$mEM z=z`C{EXn?bO`FzK!g?+9og10Kgn|Iljm8s(bK&T;svW z2tN-l!P?}<>pZ1LPNLDlexcqkoru1n3&=ir8$DNOZf$Ltwj?4WlV3b8F6O;=?_N+@ z8^Z8FrK1%pL_w96=;2bENnj*|$Jw_4R)Bh@Io!N;i#zEVA4Lp);>VV4VwIvx=F69? zm<}qbIDg&wYm?IQVZdMF_*;eV{n*}BZ#Ad_$p~#<&92y?M2aF%K|#`MK_IAXRycu! zL#PL}`T6Ld^^*fPW14DhcA3v@J-MX+X4dv~3BGU_v1;^9Sn$CsCn5vhN^fIoVq%Zl z@oNZ&bO;<$U1KAiU4jp-qc4(lA(b)|f{UQGXZmwrkJf$+V`)cw^Lyuf-Mlq-(tU%p z=$zu&q!=|GhWFi0gqy1*^FxldcGR{p@{*z6Fa96tv}rwffP#pAlZ&fhMhJ>?hK6@; z-@e^AoSKw075QM!oEOE8H>_zCwUA@~&WJQ!^)LFZZS~1g+ui9hmd46ORX9ea)Qg0V zWS~-{n6I}U>~`eQ62oJ)m|65vMWq?Y5me-TgDX(z%I%0G#xwda6RGbr?uhLm1HxU4H<6O}wy_v4IW8;Ini&}09UVCX*3D#1wMo05wd-J~x-a#{Z z##k}+=rd7{9ee`9R<$5_V&e`Q$-fZx9zs}8E1ugnzQ6v?8=2n7%Q#Kxd-j3xWDwpv zNC6q@;ztT&RhbrXI3$&{l}YZ-IkY1-4v0=!j?<+z-f`7(|F1OIQ(u^B^Te`G`O9$F z#CukR_lbtHb*9tYAZ5DD$j0LaBCg_he04X z=hB7L;``?0lvQn-vplJG7-Nt|)+9eEg^;5}0}IIdQ2Vz#i!xl|aR}PU^68$Twl~(9 zcLt=KX;j00{{iIEPj1iHHLLs}u6@3W)Xj}RHa)UF^@-2Ym`%FmhuH5$0iCkAJDqQ= zAB5!(&YdV79KTKVi_4b{vu2Zd7VaiKic_(fB681W8<_w02Z=ls0NfXi3vUsMo*%Ln zlZSwNIvC#)e7GU_Dh7^6L0a>LD>sMTWUZFgYj!fiB~+Es=r=nEXGsOm6+V6KoV~vh zG-p^8KaB5wfr_&)Ua_z1EJ8rVKNzC;mM^aM&}|D;`N42diX4KmTHI?AkCvkAy=9t@ zC1178V^rxc66P?L75^SZqIAzog-;3F%-llEJF8c#`zr<}xyQD>N^OxTlV8D(Lz&MBLv$gx%EfsgI-oY2rTg+Gs+w=u)t$yl@Kw^5}9A%4v>en>uvrXQ7rEv9CnU2-` zmv~Wkf!1Yg0LW)C_Z#xYIQ;dKX?wuj6;ZFI79(7)e+MH8?Hef)ZG!dF5i9(wZ&oK< zw-G@5gBQnNYhz5sA8n`9`{re-*sJ+__S4E|&+fxBh_<>8&%;;Sv*WpYmQ;`4$nwvZ zME?`^%@+z+LpiU$``ThdxXT(JO=(f|8mqf;P0;7#>sx5vlw|)7H9Ix@ICY-G}f8$Ro=(hALHUN3Hzo zcYzc~#cXXxji7ZzZHQ_xgtknNS7?x{@jVVMW@n}8B66So`SPEDtl%WXMQ@$sPGk0- zFwUl#Y2^@F&mUAMU%rf9`m;V@foSGDtc(eK(#^<4HEKU;KLWjpZ|_lpyQ7)pY76xM zdp@LqIt+ZzRu(L8O!wJ8o}=YGUdkA7id-$!bJ$iuJcK=t|4ZehT{BAz-{4C+8^3f= zCmW+C#lvSu7<831xzKhbPIz|KR4AQFQyR@p$2n&#IBiI&;Tl#)rZgCpq#9p?wQM$$^_kpmm%R{Dv;e}o>@I# z)U@b>YjMD_9lL@$T8>%%Bxipb2_JdshOEvWE9cOo>tLQ?})1QJ0CZP$4XZI-w?!y6K(f8x(Y_xJ){oUmO4K zvLyI=s&mpG&~Yvtm;x!@BYCQD>iS4wi{hb+Zi+eGvyEgh`T+8U z_p9Qx9VfQ(^R?_)M@@g{C0&F8UMPGjRj>|~EFkzGGQ|ETV?64DvUy2&8FW%=q6a(-globEDMU5zL$3N7x;$%9rY)#)qYGf|R2zcNo-lC0C zS1%5YO|)z>grynyBQw1FT1|mL9=^+ZVyJ<2V1t*MR_+(^vPfA8geRf=71>(8h_$?x zkX>qWa^EudO66xl)GC`yr#1=};Vhx~Vu92~hl#&&Am-2^BfuK~Q186P1*v0V*9;lD5C) zi1OPWXYOlTV08R=uy z6M87z#nGb@$xSBzNV7~C$Z>!_tb&f0IzX0lgGFqR!`$HIjRacruz0ZYcxMo5eo&kf zgoH#Ck`Z9ANnw6t%k_!#-J0uvx!I#f%e^~W7oU`AxE1P>u8-tZoXKI~J`=Ot>(@Ds z+lJ6=WwnL7WDCEMemF=MpdC)^=~EnpJcX{5E$9M);wm%{%FbH+X==L7#FVyu#s9J0 z`52lzIA7Rn7Yu`lD5$H1W@C8Dj9c3X5>XRR zT&3Ui)~lF#KWax2``o<8&hasE3|5gYg#WX;t<6a~Bq#7!uCEGp9x1k9QvRKr!==<;IJ5zg&-5^!@7!%V(V>eV?XflX& z2q2jpoORi3>%;Q9DG{KPrY1CuM6`2l+Linl+ zqN7EKiHY~2I^U#fH(U<|qPf1@>vlsHSWv&sKAXd*gjo=!d*O1QvyVyZDp{L@%j6!A zX}iux*As^LulNk>*#J!MkR!iXeCKmwpR;Tjjf1Rv`p{9c?1h!5=JGTSCCw4z=W0!U z4zX6TSGJkcMg45utG{AZaZnuh>ht9D;DnbRwG35IYKnrgmIYe5*nFI0H908>=~cWx z^Spx^Q}p2*>Z`iZ75;I8r~Y%d!M@Sz9l>cOI!IfGab+)IMuVt&Mw?hi?2r|3^=vqSF++Uk{B97X-@Yd}bZ|oQu%GS-C z+M)lrIilqxKl!{dK~8^jLbb}k(u@-|1xvcx>AusllhYjGXKrxG3B|88b{ROC3sLg; zl2c9i6wCv*zG&Ct_+T@d_X)L&oRA4gNXp8glxJ$g*))0|rZMr`#<;WlKK1_9dU=GX zW`aIR2vhu#`Bh9YcTT)>4_hL>+SFzASddP*al@*e2;Q11U;*Ecwh)IZ5YRXP zq^8#W4=rY6ZOXTnZCmFkYD1E2{}nA;s^1o@Er;ezE`D7V-F0`3c$B?K?|Q9|i{S!{ zpuT*F;${-Y6!p3GqoSLnyXmHfz{YS7^NHCo#!75O(7qdQT+Rcx^d@l0>2NY#jhfv8 z?wV?JeXEw_uKE4`eHWbwWW+uwE-+prPYe>g&Y!M}Co1nW@zK>f0FQyC$a6lyxGF8m z6nN-?PZguJi>bBWi!ja~sAE^EUx;XXSNDqK>f+}drfqqvVXY<#zl&CRD-qc=0SUtm zWN6x{<7orAh#L$HKMRkf>~|kB^RHPSdE=Akcmd+|(Fu3@%Agty48%#R4-Vp z_dNSA6ql^eqZC+o+wM!0aKZE4@#WlZ1w(VDX)4RB~)@KX}> z5;chQ6q(7pu*)nLV{do`LL7G0*95bv$?n5{a3b1xJwIeWbiep#)2Ja=n||TPn#B9h zK$Z;`&5Mp=9=W1R1$Y9UHL#D#SoLm#@Bepzfnn>!N2?dCjuR^%zR4)q{&5Azzk|Jf zxEhUlM^b4?iWLpj7kizD>RA-=zJu-p`q{c!j^v_`l_0&ju={rW-A}UG+Yt(?FVX=} z;cMGHc(^Uax|o?+{|HV&My(^k$eVGTdu%1RXLIM{@ITGR&)t^n+eDl5YAz*YW~Imi z7WD=swqB(q*|c_}Y`Ec7#E$l#G#wP}sTQ$J>!@c_rhyHRi9+%u&f6g+!j^X)-%?bT zftCO!{9X&+lA+3h0e-<|Xi{1ebtwU?jA}j@H8piLBk_V#1wuP8{#YmeHEb}_WqF_~ zC*Qfi#Qe1OCIL?bR*#78x8!8|Xy}M3%rDz4O2;A^(`U4iBqggX{nUbm`>$FZ)VS<@ zDrAx>@7hA0;H24ZiCtpqneiQDNd0%XsJb|)E<&y$$^@_Yt7tp$6J@*B`C%jU-gm!(CMR*ukP=NHjbnv=j zh^PL2qO51aBCJz1SPYyy?x{7m8~Jct2nvg8XV$8zQjT*b+uz=-pB5>dvA%kow0$^F zoW}HSj`r{LGqB5Uu(x&o;Cm5eWXj4u7aqpBKBF4+uiuTWU7oc@N)sS_hrLs7%Y}r> zaZtB>Yw^Nc+oVM6;rMh>O(MO~JZgTudy1;=KQvU^;5@O)$f9~#3ac9^X%?nrCLOJs z6o-*4XXH?mt&D(#({5XMCTm0-QdLMDw4aUgzAP0bUU(f!Ok|Mv?tG5^`;w7U93vxx z^IL2Y_thrM*Kpq@KC=o+?-Q1j*NFlrVoKia_4|6LVyJCoN&4<)LIS}@)z{Urvh&S~ zVL_F(4aKh}9Hs~8 z7kJCm^^;@?H5;lW&IPwUyp#z)geyOEPslpD3~O4Tf3tn(z!MHzsy9E_v);>mfCY3t zV^3fycI3Kur&ApYcq8(nlzxcs(L=-L<}`iO=6{mmGq+&MPHUkil@-NvS$E9m!dC%|>wavK@ zHJ@ImR>18aq)+kb28<_Rl;`xJWJ&PK(K)a*ioQ72W~l5s=jqWYdQGG1Jo)!0`_yRB z;Wdf&VsD)0Tv?4zaa@lsi=j1apw!|VIZK>W{!QY zxi#$i&n~Ius_|vP>#gqZ#cL+0d1qa7`ZJImQ0ct@jiRn) zW5MUB$kV#`;d~)t87VF6RfTL}X*taof~mb1E?>rRaH4l9*&jkGPbvI4q<8$TrN!;D z`*Q1SkEq1&X>l%gY@#l0*qLvyJx&Q&dic^hN5&8+#y0Fr-onHh$Ca8bXyh_d9q0FK z`DeoCmrN!{h8}rM3-Y-UL+C;^hw$pYzQ+^S9%f7bvqJ9`%xg4vm6O?Y?^3H1^~1!> ze=9HjaXmP6S@6#QzjGBkp0HwmLZk4ggoq*uH`O!h@LxZ2h2G=i{z$szCAywbHy*-% znIOxD>(reyMNt(1zz-c$o}}#iy`f?X%Ki~FtXX3t!ERIOQcdVI(4wS^Bdv87Vb)m&? zymL^@;*f86-RgdDWRKwYke+(sGJbAhoos&XdnX8cLL+ zkJDRp4@YL+$liUfAon||l5N&UwZxPE*nX9#w#59wyKdb$z-sovoOlhwnptcoxKqi> z|K!Vz)f3%B@CahfBVa2cH(H^V0y3T$JbZ)^mIICEvo*(x47@BPe6}BaAGmJrf1i<`5xZet>59GJH}e;_Ap-) zH(CV2&SbA$yQ=%H1;gSvBP-=ed~9XZJ{7^lYR-DYb}e~qS6)`-YlW+$ zjE%}asuoGVdj;OiD3#B3F}rlBurU1A-YlV$gVVezD!$V2a_X*cZgHYFu-T(I{bPAN z^eK#2mwX7b-gVT<$pb6j(*4#3fEb|&+wg~$uL&lY%??-HxN zx)k&_fNq?w^4&+!0A#wf8OM5&@bGqp`I4K@jy3RMle!)PmV^Dn8LZ#hK~swoORJ{Z zt|e7ake>>Z<`pSJ^Na6&MsJHP={ZjkIk^rdD5IF}_ZkvJyuSDO6{d`8Pi4P!u__dW zCY&r%tME7J%fIgPRw;hfoJ>7isOSsQt90jLhL3o@dO1w^OMzc`@LB?ez|^-V1nH87 zSG+`X#SYcXHy>ING;EyPo4dFfRyjHW{R4HDQRt|qG*gz9neetAx-mffKp9Nbi9r64 zSDJJSq_gPRP?OX)mf_U$jfmS7hmFw7jFvM2>kbsMUZps^0`rx9*2XgaR)!nJ4t#EG ze||+hi331h1fX2E{`z~TOdhi_sX zSai$-C}_`Lzs61t>8F3v@uMpA<)e4a^yWUq)EHxHJnFV?IRecBYfA*1N`Dp-jMTWR zY(L(daopbTij5f-1p1O%z17xS{v9VZ!boO&c(Jt-Ljx*>S(%mrWjvE zvz^O4GNZhp({^oE@}OXD|LP*RG#1I{Ne;_eMOKED>WX><@??6En^s{n(K0@_+1&G- z)0p1+F{Ckb6lLDw^5IvR9{Y}x58GGITe)L3Z2opomleNO1?bG(?xCTMqip#h>(9Wl ztYD74_dg_}S@==RunJ|6o@(^p^6*^Myj|#D)+i1x$E!-yeqW+iA+yczt|}${c*^r0 zPgGOi&z>HOE1(*?&c+1j1h=PxlZT9;7`=1qtRD{Y`kRf&4f;9P{eABnb@LR}?c@T3 zWDhlhqaT&-;EHG~llFJtaf^OkS#4ldBnG{_F|TtFV*O?JqrWZ1^6Nli zJLmJ^qRRpq*_M5VM-En8Pm=$?+AtL34w2^Hx`u|0n9-vYwZ_|QY;cw0bC2ZXAQ`xg zcG9I5UGhk|S@%$_r{{%F2M$@VtDf|-RcDmyJQ10mh3L=r&pDBCae+P^ z!p&-Gy9DIY;cn$=9JCB{AM!$THPqb`XTl=;4$ACBDJB1BY`qc0JZYfaAX!`IawXmH z@PegtLpmWVGc)tl!D2RY6{oJQ>(t>VG#D_#ZRDA-`1qCjJEBV5XU!A_Gtm}p6C<%& zBMRlX?mnywkIWwoMmUhK)VUhG+p zJcf34Y5m36zL#~KU24#sx13Co&dinY>q1MO{`z}1?iVknXSP;20tBY}nmePp()2m5 zU2}&{=8w_QN}KV6%eT0=!jQ{%g{#A5JXGAq8qjsZm5tn1inVIx%TO+o9zKQR*ZR}1 zDZF)!{mMgaNPojc2MM}|x;Eyr4+{T?AH+#`96m=_&8gp^6x_z-wLXNi^MNWIF8i+60fDsvGrSD1c!9yLsNFNMWYVkq@Xb&IQFIneXp3_QgSgj{!b<@HfUXzdaDGm_WK013 z_<|uSay@|sJfGNZ&~yOpawcoz%YRq&wK5lClm~1sR-%lIFkJh>YT=TKMW4x#o5*I& zW_#~{vvv30<@TU|Q#3gCdp`!FSkGQ7Cic#3#D7n@dhaT^SvAd~X*Ft3oFU~L;!8>G zp1zO!-we?PRzWV9Ic#CFrS`UO`S|uS_3f_TdL8Ty#UnV5TqVw^ki&$goji2*r($zP zo*+Y7o`L&VXK&NU-=rSV&Qj*Zi&KC3`|fDem+j!$Z3d<)O+}WLz<*!FpfJ0p#;!6( zcTRIXJZv58WGX_g<1TAJlaFm)M$iltxu67;5n9%yB4%?ThKpF8?$_PvxYb>h`RbmU ziQ~DINvMRwLKeF`MHjP(oRNy`>k^9gn|@Y~^-6N$R!|0qW9#`Xbk9WkwY(%jCD+#w znVzNdV?Wm`auvJE`eV<&roaZmF-tV}EZgbuyFvH$;|Yq`uGWu~(E?}tY;DU{+{z7e zvfS6RB886Cvc~O={dHxWv!~waS2jADZRmVNYuW8*(8?$z{~sRkIoR4`d4IOg>umT# zvSVbJUw+1M&q8Y?fJXAvggAjlh11CD87Rjh`}|Ng2>Zk+TV;6PWU>}<8XdeHbMHGY zFwepQwn!TRvXz`U$NILOReeb@dd;`4LyqAEZC_2X&(4#Q)U)324iB4i1-?66wGexp zQ`r_Y{PJvzT+ET$7CV3LcUVap(9P)lkyyNS&g{v5FQO~;+OeMA`EGyP1`CDI7N1c* zGC_kKXRof7sD>2vs+i5jv# zi;q4&9Z}FBa2mByBRqF>_3eVB+e=vdgp<#1WYe!3IZkf8dx7-=x0%utepf4U8PP6Iqxz3JzG<`*JtGa~+cxw;1TYsMT zI>jJQD-2=s-w@wdJ$E)*SPnOz?rW6nAI+l!m%Un2)at#@zCvSkvz>kG?x<;M&GgKV ztQP?bw9DPv1#_q2V*VOVnNoJ`QI_GXLblO2^nWOGgVn&9P3`k}jxZzRvQTVzDlR-IdCxl+zaea z-%Ec>Ge=7`v%YEuC1}K1*{Otun6?jscyh~(0j+x|DSQ~1^LuYfP1O%Bijm2)sLN#-MV;oVu5ET zCeD2vT|eAk-+a1`LKP)^RTDM)Z+mG!iTQai#!6Kdu5Eh>m{YNr+A*hE`@Y%O{S9|~ z5LayWnovaC#$ZF920Rb+oMQmt7;`qQH&(X1v(-8)^suJd1ZqKlk<^LsxBq$QQ=?^S zaUowm1!F;W3px(KOReJ*dez%StfXXgNL2=n$Bqc4{MP;b{=bRruQ8KG$gcr^5GEcFHWDJm@B0E+0Pg&e|%)+pod!c2xq}>?6dcGNtUqeNO;d( zWB&3&{RKovV53oIO+rlHWxl7;mAW9%(cs0yh>cKMv`s8=&z zKV}6yxOs#VEF81d~DyvjOxd~GPx{;u_a{DY^jf5r;cvBsD(BIEeD{EGalCJ+SZwcgr zW05f5?X#1JkB(9P_=Wb>DD>5=vW?02ngprlTm+xCSd-*3On;?D!;ampE6`F zNr(_-&O9qZ36)65JVr7kN9L)cA2LgsrBM2rXEM(zQ-(NZWz5VmkMDKUyWZb=p7&YL zTGl#$9QVHWxre>4y|3^0a}7EYdC#iM&NU>ZT!8S+(D^5UZRu~ekGEswMk+mGB+zU% zH8tfRiuf|Lzqc_mRWx903PIiK!cZKTeMt}HzK;{W07BqjqIw?H^JkOG5*)fDxVr?% zXn$Odg*V24_x4P>tZ^=QfPSQFLChYVY-m&rpR|#ebv3gWIXF4r=jFZn^y!miag2Z| zq9YQ?uD^b#k@FtSQ8d0RP&{ivWuGX{qgguGVh}@7{fxCc9UBkQi~rR_q z?^E3A=|p<jFtQ!E71W{Jhp zD|07cDRJ?}iJf=+mi~YA)n6mng{-msU>a>h%>TgXQ2%)Qm{DhnlEWM}90Ve$r52&~ zCCKRGK?Ay2xyhGD)l#&{aZIcTe@+*kCrwYL0t?wL>X zKlKL2nTZ>7eO=M=FrF#insluBd3AD|*!TTZhM*fYAN?R@YT{dLC&O(MyOg#=X2uL!rnlehtlCbmr(#i7iW24U!O)|C}DqQRxOXF0>`nxk2^n za5f^OgThq-b`?GP;+WcazfxL|3PiF|-|*zSY*IaQ->7pjd1(t8uO?(RRRvm)QAO z-P{j{;X(LEZfnX|1|7#)9tLxmCkhMukR=TNx;LSd`0%~VT}ElcZR~|7&BkeNy8^C_@im+BKSk# zPDKW!E;F0sbp$mXEkg?*YbQQ>eIZi$eaiUR!(Yb^uS2Ks%`7e9(}XKE%4nkPeo7@x z&5MjjFUg(!CnBg57}wlcRe_pg6l`R3Mo-m#asD}MM-#<=kmC~ktHDR|)XZvr9?LTG zQ9sLH=`{@#R*!7dqwHGk;EJ;y9pb#xdSSZ!-9Wve@=ysQ+u6D39Auf8 zsdRNN9GyEpE523P}OZOMNo|^`wXQGv%q{<>N*l%4m{zE{4%kTR)ZkMSj#P zjyF=3ct(GhF{vv&19$E6*`tQUwJyzRlT`12qKxkm`SuG_uY1%^4cA6i^@zT52xVh* zep`)szPA1==c6UAFt&(k5-+E*BazrgQd=+B`3SWr>~Bn4;>3$zU9}^DzsadmV7@&7 z19>>1cDX0LN17-e|M*-p*n`VkfyfAxP)eFT;4ooYWx)nu`2E6(ET zvh-Z1E)$-3K~`QrV_$y)`5`mS{6=3%!?sJd&<`+u5wu-YBL$GW zkaY0bgrD&?I1`?5cddHPP<++TP!K>tcO{@fT++XsvLJ1piiO-kY zyD0)tj#6a%B7>`!uV0jFqj0vkGX7zw(twh0Q+GzRQA!gv+PlH>eK5cVc~hFcTJImP zbgkBtStJ&pkED9SG;rdhJMnyJbg#%h?jA?mvS$K|L4ms#h0KDYMfng};A&N8Kc?OS z`Q<7XE!bNix%;lJU0JzSwttj+ z1!sharHkHtag)30QZ~GfzR2s?{jkQNsh{Y={LcWV>YpP^i;qUAvSP?7*sb?Y@4Hn^ z&7N6K;);r^+I8X{ve}_E8=w$9K~~;BlUMJD^gYC)>!4=F2}Q3bN?J>G?m%COb+j{P za(g9asqS{@YmQ%}umEUW&tS1d@AtYV_c{{=7Z!0WBLQ=`p=3GD{$f+%%hVC#p*G8H zr}Z+j#w(Ar4xA*dV@6gN&n)Mazan{i;7Xs%FljPif@=*20Sm{n1afd9TBG($)$(An&o$emVPdaeihdv+9wuR<-ezn zJhV|WAx4gW94F(qXeijr=SkQ9Y<*XN!P9O+YO;X!gWu1JTg*;TQ=zP#_-}Z{x@7vi zjjPj_4M#t5`M!|-Zkhoi8v^9Yp(t$rx*OV(8ZAh@?YbOOeC&eVke>flf&jtMA>v8* z5SG^Z=8**>*iuTybkT)xeAt@Yw1CwFJ+d6R=Rh=Eb()Lhg5`Jzy;?b^I0;*;&orZI z&dK4=sJtTQgAx|@T>HDckX1SFmF9eDHxbL_)ha^7~tn;3oteJ^3t*G zxFM{Nc$kq?%M0~2)$O4CMhI(h2?m5)bvD%*A*7F@a8&pTwJxE$ z`mqm?9mM{ufYX~BKPJg9Kc}>tze!uukuq@x2QxLYY5HyGGeZ-f)#?Qd9)p7olU#4K zD!Nblb(X*dhY$)jp6?@MK@nBr_r8$e&NVK#SLe`+jI&E?z&<&s?#yBRtaZcM+@YN+$q!oY zwE8A;{-h@_3Stwl$($fmHJD(5mHk{Ti6Dt`pHs=}3W-Z|QhIVqe+44i`>uVAsj@!_ zF|zcphY=$Ob3t@TKaTU(V$Hpg?@-|ogW};LC2Z-c#LP{D&|GF&IzWz6w zC7WG?YX~KQ*Dho9Lv_ri#_Je$DgCv(OQboa*DVR*olMba=HeOa64}u%u)iF!VqyQm z6d;a4j4eu@82atCu?&Oxm!v0GE%o8LLC8|Wd7dQ%_nRYVMd`l#j_^LWg<$NnAjga` zqc6GEGwxS^*X(g*IjC#?PD-i0Vfi62Pnl*y#w|PJ+YP19fxiN{K;*!|m7Uc2aMYfD z{ESwZx?W8PRri!damR8~u%wb&&BdF3VGLAq_740n)oLKTDqp+FDxJrg9wud;&AL}D zyZ`GzT1)aQh7`@)z&(6yD)%6q)drd33nZyEY%2$18wP*uU~?bhiD9R3A!AbUAzXUm z*nyqm)ynaw=J?y9%%U$^>6EKCW$ONp_&Fd`_tE9z+(E#LJwsVNFIs02vPxPOs@XLU zATVqGW`ozD?h-Zd1DMN7Fd*D9qmB%ZF>I{a6{HxCvggkZ0!_+r{OR?{*9^LG{O^73?p!yeXTv#m$p$)^p&9YyV5;sl>>V=jZ{Y5~Yz(c$FWTNq{|+Mj}bA ziX32*TwYtvhE0$u0;hTT?n*NmlXQ98yv+7AD`H*%kB2;hA_8bm$tZ^OoPL3S6Os#o zxYsXR)O@MVHNotdEaX?{Ci63VLcQdJfH%caEvxG7v*}OeXBIWUoc}Ipbr61AWR6%W zU?VQgedRR2>qvZKLPJD;>Q+eCRXQd{#m;bgCm0`-Ov{*0v$Xu2f8k%Ppnt%5r+ zv;GP!h;yIKYMPjuhW736ELKgyYTOJ=BnWTM9jwVfyc7aAg0JV^_K(?U0s;b93x*{o z-UX9{{5NV#0bt4upY0DEu(4yVdVTo>3AR!!xMhg`)3-r6rVSNfkaT=`YmlG$oLslK z1Gs=7e4GtffBi}iyGd-lN!#g#s?*=WHC^K7aaJSs2hiPJHLZCN431v0!$U{E6z@ zpYBfGbpGX3QCLJ%JYeKyd!fwHn$2{|^;>68$KPgDb@RF*gx9P67oOX6GZ~E*&fKw{ zh(#cHIpQYuL@HO;?i;vFP@{n8`10k;U4RZu0X<5}d8QTv#V&GCY*HeCs+({0rLVIw zqP2y_ZHr0k=4Kd9sWf>@47wM3^E62If zF9lZoizj-v{jxRR5aZ>p#h~`Gyg%`>%Zx;Rnm#qRP2qSMvpNx$zgIsXRd?YcAts5L zqcdK&laBD%`$<-!J)demqTTq(W=bO!)deC{nGE*)Wb-=i!+Gn;X4Fcv9s|!O=Hz$r zK3fxJXCncq()hlXBrkxAgUd;6FYck;Dq-x*n&EzrhjY8e#R94QLUbijU{)HJ;6}oz zTF@68_C`Kw`(A6^^x*D-lX&#J`5vQCFxvN{r+WX$DK4JvcB2ty?I!|t<3)| zz%Gi$_%)3YU-K8Ww>Rx>h*D}u)Q1NqwtC!tMtzKOb1lKU;(+@51P^XeRj1-(K@{Ph z1)wVl0I*;V)Nhf+zWIN+onYS)FcLbM8wm2P+yystMa9KM0>BF*GBjrxq-0|JqtEpl zhyHUjp)9R+a|L$_8D2%rG8!qPiI{zpajsT2`3|Vc1 zL?EhkirO-Z#o(!GAD^p9pBeqMMcQ^In7qK zr1eR5N^>o-v-7`9i89y}Bj6cWB5 zTalqx*B{6$Q(5Lizd;kC97MPu*xJF!q?@^6U4?DbEbDDD-?y&xTAgS#$affED9Ihm z+xl4~Vb`~7*LU2m56^Ckz(oAGz;U@;3HfExkc<2*zB!IhuQy!!=|4wAnLxB$z4SQ! zRCk;E{ZT$9nn$#%ktZAcz!sCWh1Qn7e@52jJslhOt=5Mc1SQ{UG>o&#xNGzYvbZ37 z>$qqATeND#?!0zsC|NN5&C;Hr#Ams5GP9DxAw7+J!#gpfr~}hstANJcoqHqe_DP~E zxVK%gj%c&WTlphHyL|6-Z1Cdx*z6dzx7D7dc-)81O2n7!VxI00j5+$6k_OfD@x+cc z;j@@XQO02tyqEA#ccVG(bo213MoW9RW)3%DFvm|*%{qNaRMhSIzHZw zoW2n-&MwOhH2<`2fg?;1=)kCjk}--l$ypx6DaTvBB!`e#0lMdmYZbfdh9Cu4emy0p z2&7_H8UOxX9zpqn0EHh&_5f2(p#RiTNJO8zy!hbq^ zOI!b%2d(e1=#w>PEi==+s?xni=wa8opXBag#RTryPNZT2sA2GdlGyP}`FeSFPEHu~ zh;9BP)L(EE{%}}-p(}dbL@2gD_$QuiaUA#|Pn|srq(-Sp+~KXKQo4JW{mPX=3`s?H zVWO#(jEwk}#5rGCW8(|wB^|15pX^ezuv_u1ffvGRe(FT#0mCfX^X(&{$9$OwyYJQ# zlZyv#1x{-h49q*sbpK8n_{-0)_?san5&jw5-+ofXJ><@BwG2&oc=L30e0n@Rzi+oM zn@#n0izctz--pvZ+MAlrTu-9cg9-8fs!pV8Ql3pvVMk~-DydyF_sTyWb?%YD6gK|x zvhPttxe^J6=(GlUot-V&S(%$p5)A`Ojw(N7ba1)C@(mKTV9ZB8|6@IizcpSoXc>CE z86P)0j)zAFTuE-tjGWRG1((&1o4I|~g$4la&)O;n;2|Jy5&#)2ColgQ0-moeEd@Eh zB6Q201wb=|@SlNY1x7=ySu}_lKt`jasL0I0;V)p?2rTh+9mJh#5Aa+{Mn)Agvx`+* ztxq_(xK@5@ch8$mIn|MiG2onB_qV2c`x|?wQrA1(|E~B{;jC_DC6rlFaSdlFbXod8 zYsvCT3lt|9Zi2=L#@Kn^mG0}fya)ErnrXe}T$%5h#kWX>2S)DkDm z?V{Rb4t90CQV(EixAItM#;Lohx#hm<4_wnxkF%VgCx}&x6VNFEQaU|2D&1P!0qr*Z z{k;!d5i-*B$MH8AUFvDY?M9!DaFfHeQ+&6~ouLcsi9ymYA$iyi_BAoyPk z+dwIWfw-_cz6)kkgsTj-DMSXKJwhnUurkr?VSqN}(JKkVVjlo1ydkrASXo6yrPZSH z3UG@Gqav@(Hp1-DGzSSr%L}m`>)kfc z(70i1Ya4iF5zy5DRIh`7M~%Eq?7!74tpyj6<}Pw`FBj1)8N^w382`U&yfdWSxS*sY z7RQA_B{{j{@B%lCj8ye}wjC;c0}%SNZdnM^QChmPM}qpynH=}6l~}a0lF|hzR{}ZE zUTYjkE`K?e!I1Hy-O4r%-tq8=2zhAf@an0#Sz2}*l&6an#}r`=ssn94zIPfE7K3c0 zXuL}5G6>_&A&)JBaAFk{?1Yt6PH6$*4)7@-!L#ulkdnm+ZQiscT0r6U?I6eyKcw|F zMyh2f+`IQ`8P0t!T{BY9zHUh-U8eS8+W53t0z!0Fjyn>+(sbsUe4GYN0t$I;*%l}BGmD>{3b_MoUFXOZFZ6g zjgX~R_&AE)irLkB}~hR48Rr-y{8090hTEFNc?Fukj+tQ-VqItRQcF=Xfg z`6oR>j1@TeemF+N@*$7WlgBnkW5gqA8>lzn+Y!dA0%q8DahhoJ6ej literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/html/_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png b/docs/pygom-doc/_build/html/_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png new file mode 100644 index 0000000000000000000000000000000000000000..3054a777d51c8821b5a04a161d498190de31c9d5 GIT binary patch literal 35085 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 Mrmb40Y!&jq0MnqwqyPW_ literal 0 HcmV?d00001 diff --git a/doc/doc/pygom-doc/intro.md b/docs/pygom-doc/_build/html/_sources/intro.md similarity index 100% rename from doc/doc/pygom-doc/intro.md rename to docs/pygom-doc/_build/html/_sources/intro.md diff --git a/doc/doc/pygom-doc/markdown.md b/docs/pygom-doc/_build/html/_sources/markdown.md similarity index 100% rename from doc/doc/pygom-doc/markdown.md rename to docs/pygom-doc/_build/html/_sources/markdown.md diff --git a/doc/doc/pygom-doc/md/getting_started.md b/docs/pygom-doc/_build/html/_sources/md/getting_started.md similarity index 100% rename from doc/doc/pygom-doc/md/getting_started.md rename to docs/pygom-doc/_build/html/_sources/md/getting_started.md diff --git a/doc/doc/pygom-doc/md/unrollOde.md b/docs/pygom-doc/_build/html/_sources/md/unrollOde.md similarity index 100% rename from doc/doc/pygom-doc/md/unrollOde.md rename to docs/pygom-doc/_build/html/_sources/md/unrollOde.md diff --git a/doc/doc/pygom-doc/mdconvert/common_models/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/common_models/.md similarity index 100% rename from doc/doc/pygom-doc/mdconvert/common_models/.md rename to docs/pygom-doc/_build/html/_sources/mdconvert/common_models/.md diff --git a/doc/doc/pygom-doc/mdconvert/doc_to_sort/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/doc_to_sort/.md similarity index 100% rename from doc/doc/pygom-doc/mdconvert/doc_to_sort/.md rename to docs/pygom-doc/_build/html/_sources/mdconvert/doc_to_sort/.md diff --git a/doc/doc/pygom-doc/mdconvert/mod/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/mod/.md similarity index 100% rename from doc/doc/pygom-doc/mdconvert/mod/.md rename to docs/pygom-doc/_build/html/_sources/mdconvert/mod/.md diff --git a/doc/doc/pygom-doc/mdconvert/unroll/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/unroll/.md similarity index 100% rename from doc/doc/pygom-doc/mdconvert/unroll/.md rename to docs/pygom-doc/_build/html/_sources/mdconvert/unroll/.md diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb new file mode 100644 index 00000000..84796466 --- /dev/null +++ b/docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb @@ -0,0 +1,868 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Motivating Example: SIR Model\n", + "{download}`this notebook <./sir.ipynb>`\n", + "\n", + "## Defining the model\n", + "\n", + "First, we are going to go through an SIR model to show the functionality\n", + "of the package. The SIR model is defined by the following equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dS}{dt} &= -\\beta SI \\\\\n", + "\\frac{dI}{dt} &= \\beta SI- \\gamma I \\\\\n", + "\\frac{dR}{dt} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "We can set this up as follows:" + ] + }, + { + "cell_type": "markdown", + "id": "586834ab", + "metadata": {}, + "source": [ + "1. import the classes required to define the transitions" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "4c80a36a", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType" + ] + }, + { + "cell_type": "markdown", + "id": "0ec4c9d0", + "metadata": {}, + "source": [ + "2. define our states, in this case the population states of **S**usceptible, **I**nfected and **R**emoved" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "3ce016f2", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['S', 'I', 'R']" + ] + }, + { + "cell_type": "markdown", + "id": "021a1927", + "metadata": {}, + "source": [ + "3. define the set of parameters for our model, here there are only two" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "441e2287", + "metadata": {}, + "outputs": [], + "source": [ + "paramList = ['beta', 'gamma']" + ] + }, + { + "cell_type": "markdown", + "id": "dfd736b2", + "metadata": {}, + "source": [ + "4. specify the transitions of the modelled states; this will form our ODE system" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "b5f80ab0", + "metadata": {}, + "outputs": [], + "source": [ + "odeList = [\n", + " Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) \n", + " ]" + ] + }, + { + "cell_type": "markdown", + "id": "21629e7b", + "metadata": {}, + "source": [ + "```{note}\n", + "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "69bfb7c3", + "metadata": {}, + "source": [ + "\n", + "5. import the ode module" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "f78c33d4", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde" + ] + }, + { + "cell_type": "markdown", + "id": "477d6f84", + "metadata": {}, + "source": [ + "6. initialize the model, which constructs our ODE system from all the information we have provided" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "c9fbcce0", + "metadata": {}, + "outputs": [], + "source": [ + "model = DeterministicOde(stateList, paramList, ode=odeList)" + ] + }, + { + "cell_type": "markdown", + "id": "4bf43064", + "metadata": {}, + "source": [ + "That is all the information required to define a simple SIR model. We can verify the model using" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "6ad54e09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "143a6871", + "metadata": {}, + "source": [ + "where we can see the equations corresponding to their respective $S,I$ and $R$ state. " + ] + }, + { + "cell_type": "markdown", + "id": "08207474", + "metadata": {}, + "source": [ + "```{note}\n", + "The ordering of the equations is in the standard $S,I,R$ sequence because of how we defined the states initially. \n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "7054e58a", + "metadata": {}, + "source": [ + "We can rearrange the state list," + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "07f81fd1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}I \\gamma\\\\- I S \\beta\\\\I S \\beta - I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ I*gamma],\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma]])" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now we are going to define in a different order. note that the output ode changed with the input state\n", + "stateList = ['R', 'S', 'I']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=odeList)\n", + "\n", + "model.get_ode_eqn()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d3f587d4", + "metadata": {}, + "source": [ + "and find that the set of ODEs comes out in the order that we specified. " + ] + }, + { + "cell_type": "markdown", + "id": "1175c832", + "metadata": {}, + "source": [ + "```{tip}\n", + "In addition to showing the equation form of the ODEs, we can also display them as either symbols or latex code, which can save some extra typing when porting the equations to another document.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "960fdc0c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "⎡dR/dt= I⋅γ ⎤\n", + "⎢ ⎥\n", + "⎢dS/dt= -I⋅S⋅β ⎥\n", + "⎢ ⎥\n", + "⎣dI/dt= I⋅S⋅β - I⋅γ⎦\n" + ] + } + ], + "source": [ + "model.print_ode()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "93e32c75", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\\begin{array}{cc}dR/dt= & I \\gamma\\\\dS/dt= & - I S \\beta\\\\dI/dt= & I S \\beta - I \\gamma\\end{array}\n" + ] + } + ], + "source": [ + "model.print_ode(True)" + ] + }, + { + "cell_type": "markdown", + "id": "79c154ba", + "metadata": {}, + "source": [ + "#TODO links to unroll\n", + "Here the SIR model was provided to PyGOM as a set ODEs by using the `Transition` to define them. \n", + "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section `unrollOde` for more information, and in particular `unrollSimple` for the continuing demonstration of the SIR model." + ] + }, + { + "cell_type": "markdown", + "id": "51ed6fa2", + "metadata": {}, + "source": [ + "## Extracting model information\n", + "\n", + "We may wish to determine if the set of ODEs are linear. " + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "61684654", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.linear_ode()" + ] + }, + { + "cell_type": "markdown", + "id": "4cf58543", + "metadata": {}, + "source": [ + "Since we know that the SIR model is not linear, we may want to have a look at the Jacobian.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "1c8ff090", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\gamma\\\\0 & - I \\beta & - S \\beta\\\\0 & I \\beta & S \\beta - \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, 0, gamma],\n", + "[0, -I*beta, -S*beta],\n", + "[0, I*beta, S*beta - gamma]])" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_jacobian_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "bab79c98", + "metadata": {}, + "source": [ + "Or maybe we want to know the gradient." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "abb02502", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I\\\\- I S & 0\\\\I S & - I\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ 0, I],\n", + "[-I*S, 0],\n", + "[ I*S, -I]])" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.get_grad_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "9d0052ec", + "metadata": {}, + "source": [ + "```{Warning}\n", + "Invoking the functions that compute the derivatives, $f(x)$, `model.ode()` or `model.jacobian()`, will return an error\n", + "\n", + "These functions are used to solve the ODEs numerically, and require values of initial state values, time, and parameter values.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "35abe902", + "metadata": {}, + "source": [ + "For setting initial conditions, the numeric values of the states **must** be set in the same order that list of states appear. We can use the following to check the state ordering, as well as displaying all of the states that we have included." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "e703c888", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[ODEVariable('R', 'R', None, True),\n", + " ODEVariable('S', 'S', None, True),\n", + " ODEVariable('I', 'I', None, True)]" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.state_list" + ] + }, + { + "cell_type": "markdown", + "id": "54e681d0", + "metadata": {}, + "source": [ + "#TODO unsure if this is needed\n", + "There is currently no mechanism to set the numeric initial conditions the states when the states are defined. This is because of an implementation issue with external package, such as solving an initial value problem." + ] + }, + { + "cell_type": "markdown", + "id": "13bed7f9", + "metadata": {}, + "source": [ + "## Initial value problem\n", + "\n", + "By setting the state initial conditions, time, and parameters, we can evaluate our model." + ] + }, + { + "cell_type": "markdown", + "id": "04fb8dd9", + "metadata": {}, + "source": [ + "1. Define the model parameters. (We can call the parameters to check what we must provide.)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "46042ebf", + "metadata": {}, + "outputs": [], + "source": [ + "model.parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "9ec016b5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{beta: 0.5, gamma: 0.3333333333333333}" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "model.parameters" + ] + }, + { + "cell_type": "markdown", + "id": "efcdac90", + "metadata": {}, + "source": [ + "2. Provide initial conditions for the states." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "c43074c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "initialState = [0, 1, 1.27e-6]\n", + " \n", + "model.ode(state=initialState, t=1)" + ] + }, + { + "cell_type": "markdown", + "id": "a8dc4681", + "metadata": {}, + "source": [ + "\n", + "3. Implement an ODE solver.\n", + "\n", + "We are well equipped to solve an initial value problem, using the standard numerical integrator such as `odeint ` from `scipy.integrate`. We also used `matplotlib.pyplot` for plotting and `linspace ` to create the time vector." + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "a14b9901", + "metadata": {}, + "outputs": [], + "source": [ + "import scipy.integrate\n", + "import numpy\n", + "\n", + "t = numpy.linspace(0, 150, 100)\n", + "\n", + "solution = scipy.integrate.odeint(model.ode, initialState, t)" + ] + }, + { + "cell_type": "markdown", + "id": "c4feebae", + "metadata": {}, + "source": [ + "We can plot our solution to observe a standard SIR shape." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "8303885c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyI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s76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", + "text/plain": [ + "

" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.figure()\n", + "\n", + "plt.plot(t, solution[:,0], label='R')\n", + "\n", + "plt.plot(t, solution[:,1], label='S')\n", + "\n", + "plt.plot(t, solution[:,2], label='I')\n", + "\n", + "plt.xlabel('Time')\n", + "\n", + "plt.ylabel('Population proportion')\n", + "\n", + "plt.title('Standard SIR model')\n", + "\n", + "plt.legend(loc=0)\n", + "\n", + "#@savefig sir_plot.png In \n", + "\n", + "plt.show()\n", + "\n", + "#plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "ba849579", + "metadata": {}, + "source": [ + "Alternatively, we can integrate and plot via the **ode** object which we initialized earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "efddd3a5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XTarUoLi7GtWvXsGrVKqWHQxT0pFZC5eXlCo+EiKgrBnYh4O6778bkyZOxYsUKtLS0KD0coqDw0UcfQRTFLvfv2LEDADBixAh/D4mIqFdsUBwiFi5ciBkzZmD9+vV45plnlB4OUcB77rnn0NTUhEcffRQjR46E1WrF3r17sXnzZmRlZaGgoEDpIRIRdcGMXYj4+te/jiFDhmDp0qWw2WxKD4co4C1duhT33HMPduzYgaKiIhQVFWH//v343ve+h3379nXbuJiISGmC2N1cAxEREREFHWbsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNgRERERqURQNCi22+24du0aoqOjIQiC0sMhlRNFEQ0NDUhPT4dGo673PjyXyJ94LhF5hzvnUlAEdteuXUNmZqbSw6AQc/nyZfTv31/pYXgVzyVSAs8lIu9w5VwKisAuOjoagOMFxcTEKDwaUrv6+npkZmbKv3dqwnOJ/InnEpF3uHMuBUVgJ6W5Y2JieAKR36hxeoXnEimB5xKRd7hyLnm06GH16tXIysqC0WhETk4O9u/ff9Pja2tr8eyzzyItLQ0GgwHDhw/Hjh07PPnWRERERNQDtzN2mzdvRlFREdasWYOcnBysWLEC+fn5OH36NJKTk7scb7Vace+99yI5ORnvvfceMjIyUFZWxg20iYiIiLzM7cBu+fLlmDdvHgoKCgAAa9aswfvvv49169bhxz/+cZfj161bh5qaGuzduxdhYWEAgKysrL6NmoiIiIi6cGsq1mq14uDBg8jLy2t/Ao0GeXl5KC0t7fYx27dvR25uLp599lmkpKRgzJgxeOONN2Cz2Xr8PhaLBfX19Z1uRERERHRzbgV21dXVsNlsSElJ6XR/SkoKTCZTt485f/483nvvPdhsNuzYsQMvv/wyli1bhp/+9Kc9fp/i4mLExsbKN5aUExEREfXO5x0j7XY7kpOT8c4772DChAmYOXMmfvKTn2DNmjU9PmbRokWoq6uTb5cvX/b1MImIiIiCnltr7JKSkqDValFRUdHp/oqKCqSmpnb7mLS0NISFhUGr1cr3jRo1CiaTCVarFXq9vstjDAYDDAaDO0MjIiIiCnluZez0ej0mTJiAkpIS+T673Y6SkhLk5uZ2+5g77rgDZ8+ehd1ul+/74osvkJaW1m1QR0RERESecXsqtqioCGvXrsWGDRtw8uRJzJ8/H2azWa6SnT17NhYtWiQfP3/+fNTU1GDBggX44osv8P777+ONN97As88+671XQURERETutzuZOXMmqqqqsHjxYphMJmRnZ2Pnzp1yQcWlS5c6bVCbmZmJDz74AM8//zxuvfVWZGRkYMGCBXjhhRe89yqIiIiIyLPiicLCQpSVlcFisWDfvn3IycmRv7Z7926sX7++0/G5ubn45JNP0NLSgnPnzuHFF1/stOaOKBT9+9//xkMPPYT09HQIgoBt27b1+pjdu3fjtttug8FgwNChQ7uca0REFNp8XhVLRN0zm80YN24cVq9e7dLxFy5cwIMPPoh77rkHR44cwfe//308/fTT+OCDD3w8UiIiChZuT8USkXfcf//9uP/++10+fs2aNRg0aBCWLVsGwFFdvmfPHvzyl79Efn6+r4ZJRERBhIEdBZ1Wmx3WNjssbXa02hy3NpuINrsIuyjCZnfcRBGwi477RACi6LjP8TGQmRCOtNhwpV+Oy0pLSzvt+gIA+fn5+P73v++V599/oUb+WBA6f63jpx2/JgiC/DWNIEAjCBAEQKtxfKzVCNBpBOi0AvRaDfQ6DYxhWhh0Gghf/iZEpGqtNjvKa1swIDFC6aGoGgM7UlyN2YoL1WZcudGE8roWVNZbcN1sQY3ZivrmVjS0tKHR0oYmqw3NrTbY7KJXvu+P7x+JZ6YO8cpz+YPJZOp215f6+no0NzcjPLxrkGqxWGCxWOTPb7Y93xPvlMJLP9peCQIQEaZFlFGHuHA94iPD0C/aiPRYIzITIjCkXxRGp8UgNiLMPwMiIp9b9o8vsOZf5/A/s8bj4XHpSg9HtRjYkV+1tNpw4OIN7L9wHYcv1+LEtXpcN1s9fj6NAOi0GoRpBOi0mg6Zos4ZJEFwfC7A8S8AxIWrP2goLi7Gq6++6tKxg5IiIX4psPtynCc6D5CyniKcWVDRmREFnFlTx+dtzuyp1ZlZlZ5fFAGz1Qaz1YaKegt6MqRfJO4YmoT7Rqfi9sEJ0Gm5LJgoGImiiK2HrgAA1v77PAM7H2JgRz7XarPjnycq8Jcj1/CvL6rQ3Grrckx6rBH9EyKQEReOlBgjkqL0iI/QIzY8DNFGHSINjluE3jGNZ9Bpodc5ArlQkZqa2u2uLzExMd1m6wDH9nxFRUXy5/X19T3uvVzyg7u9NtaetNocU+jNVhvMFkcmtq65FdWNFlQ1WHC1thll15vwRUUDrtxoxrkqM85VmfG70jKkxRrx7dsH4qkpWYg08E8XUTD5/Fo9Khscb+KOXa3DsSt1GNs/VuFRqRP/OpLPmC1t+F1pGX77nwvyCQ0AKTEG3DEkCeMHxmNsRiyGp0QhQs9fxd7k5uZix44dne7btWtXj7u+AIG3PV+YVoMwrQZRBh36Rd98XDfMVuy/WIPdpyux87gJ5XUt+MUHp/Hb/1zATx4chenZGVynRxQkSk5Wdvp84/4yFPe/VaHRqBuvpuR1oihi25Gr+Nn7J1Hd6Jhm7RdtwDdu64+HxqVhdFoML8gAGhsbcfbsWfnzCxcu4MiRI0hISMCAAQOwaNEiXL16Fb/73e8AAM888wxWrVqFH/3oR/jOd76DDz/8EP/3f/+H999/X6mX4FPxkXrk35KK/FtS8crDt+Bvn5XjVx+ewcXrTXh+82fYdaICS2eM45sCoiDw4SnHbMPD49Kx/bNr+OhUlcIjUi/+RSSvqjFb8cMtn+HDU453ZwMTI/Df/zUMD41Lh17H9VEdHThwAPfcc4/8uTRlOmfOHKxfvx7l5eW4dOmS/PVBgwbh/fffx/PPP4+VK1eif//++M1vfhMSrU4MOi2+MaE/Hs5Ox6//dQ4rS85gxzETrtxoxm+fmoTEqMDJShJRZ/UtrfjsSh0AYP7dQ7D9s2sw1bfA0maDQcfNCryNgR15zSlTPb7z209xra4Fep0GC746DPPuGsyArgd33323XIzQne52lbj77rtx+PBhH44qsIVpNSj8r2HIHZKIpzccwNErdfjO+k+xcd7tXHdHFKCu3mgGACRE6jEyNRrhYVo0t9pw9UYzBveLUnh06sMrLnnFwbIazFhTimt1LRicFIm/PHsHnr1nKIM68okJAxOw5ZkpiI8Iw2dX6vDffzx80yCZiJRjqmsBAKTGGCEIAjITHMVeV5wBH3kXr7rUZ59fq8NTv/0UDS1tmJQVj63fm4JRaTFKD4tUbmhyFNY9NQkGnQYlpyqxYe9FpYdERN0odwZ2abFGAED/eEeD4ss3mhQbk5oxsKM+qaxv6RTU/e47OYiL0Cs9LAoR4wfE48UHRgEA3vj7KZyralR4RET0ZaZ6R2CX4gzsMuMdGbvLNczY+QIDO/JYq82OZzceQlWDBSNSovHuU5MQrudCWPKv2bkD8ZXh/WBts6N4x0mlh0NEX2KqcwRwaTHOwC7BkbG7woydTzCwI4+t+vAsPr14A9EGHdY8OQExRvXv5ECBRxAELHloNHQaAf88WYm956qVHhIRdSBNxabKU7HOjB3X2PkEAzvyyClTPVZ/5OjB9sbXx2JQUqTCI6JQNqRfFL6VMwAAsPSD0wqPhog6Mslr7BwBnbTG7iozdj7BwI7cJooiFm09hja7iPtGp+Brt6YpPSQiFP7XMOi1Ghy6VItDl24oPRzystWrVyMrKwtGoxE5OTnYv3//TY/fsmULRo4cCaPRiLFjx3bZtQUATp48iYcffhixsbGIjIzEpEmTOvWOJO8wfSljl+kM7KobrWiytik2LrViYEdu+/txEw5fqkWEXovXp4/hLhIUEPpFG/BItmNj8Xf3XFB4NORNmzdvRlFREZYsWYJDhw5h3LhxyM/PR2VlZbfH7927F7NmzcLcuXNx+PBhTJ8+HdOnT8fx48flY86dO4c777wTI0eOxO7du3H06FG8/PLLMBqN/npZIaGhpRUNFkfwJgV2sRGOPcCB9h535D0M7MgtrTY7fuGc6nr6rsFIieEfQQocc+8aBAD4+7FylNfxgqEWy5cvx7x581BQUIDRo0djzZo1iIiIwLp167o9fuXKlZg2bRoWLlyIUaNG4fXXX8dtt92GVatWycf85Cc/wQMPPICf//znGD9+PIYMGYKHH34YycnJ/npZIaHCWREbbdQhqkMTcWk6lr3svI+BHbnlL0eu4UK1GUlRenz3K4OVHg5RJyNTYzA5KwF2Edh+5JrSwyEvsFqtOHjwIPLy8uT7NBoN8vLyUFpa2u1jSktLOx0PAPn5+fLxdrsd77//PoYPH478/HwkJycjJycH27Zt89nrCFXlHZoTd9Qv2rENYHWjxe9jUjsGduQyURSx9t/nAQBz7xzc6d0XUaB4ZLxjOvYvDOxUobq6GjabDSkpKZ3uT0lJgclk6vYxJpPppsdXVlaisbERb775JqZNm4Z//OMfePTRR/H1r38d//rXv7p9TovFgvr6+k436t2XK2IlCRGOLgo1Zqvfx6R2DOzIZbu/qMLpigZE6rX4prMCkSjQPDAmDWFaASfK63GmokHp4VAAstvtAIBHHnkEzz//PLKzs/HjH/8YX/va17BmzZpuH1NcXIzY2Fj5lpmZ6c8hB62KHjJ2CZGOjF1NEwM7b2NgRy777X8uAgBmTR6A2HD2rKPAFB+px9Th/QAA2z9j1i7YJSUlQavVoqKiotP9FRUVSE1N7fYxqampNz0+KSkJOp0Oo0eP7nTMqFGjeqyKXbRoEerq6uTb5cuXPX1JIUUK3JKcU6+SxCjHDkU1jQzsvI2BHbnkWm0zPj5TBQB4MnegwqMhurkHxjpa8Hx4qvuqSQoeer0eEyZMQElJiXyf3W5HSUkJcnNzu31Mbm5up+MBYNeuXfLxer0ekyZNwunTnXsefvHFFxg4sPu/bwaDATExMZ1u1Lu6plYA6JIMSIh0BnacivU6LpIil/zp4BWIInD74AQMTGQzYgpsX3Fm7D6/Vo/KhhYkR7N6O5gVFRVhzpw5mDhxIiZPnowVK1bAbDajoKAAADB79mxkZGSguLgYALBgwQJMnToVy5Ytw4MPPohNmzbhwIEDeOedd+TnXLhwIWbOnImvfOUruOeee7Bz50789a9/xe7du5V4iapV2+wI7OJ6COyuM7DzOgZ21Cu7XcSWg1cAAI9P5LoSCnxJUQbc2j8WR6/U4d9fVOOxCf2VHhL1wcyZM1FVVYXFixfDZDIhOzsbO3fulAskLl26BI2mfQJqypQp2LhxI1566SW8+OKLGDZsGLZt24YxY8bIxzz66KNYs2YNiouL8d///d8YMWIE/vSnP+HOO+/0++tTszopsItgxs5fGNhRrw5frsWlmiZE6rW4fwx3maDgMHV4Pxy9Uod/fVHFwE4FCgsLUVhY2O3XusuyzZgxAzNmzLjpc37nO9/Bd77zHW8Mj3pQ61xjFxuu73S/FNjdYGDndVxjR73aebwcAPDVUSkI12sVHg2Ra+4e4ZiO/fhMFWx2UeHREIWmnjJ2ic7ArsHSBkubze/jUjMGdnRToiji78cdvZ/uH9N9BRpRIBrXPw6Rei1qm1pxppJtT4j8TRRF1DZ1H9jFGMOg1Ti2o7xhbvX72NSMgR3d1OfX6nHlRjOMYRpMdWZAiIKBTqvB+AHxAIADF28oPBqi0GO22tDmzJZ/uSpWoxEQHyEVUHD3CW9iYEc39cHnjmzd1OH9EKHnkkwKLrcNdAR2B8sY2BH5mzQNq9dqEB7WdRlPQqQj2GPGzrsY2NFN/fsLR++6r45K6eVIosAzkYEdkWLkwomIMAiC0OXr7S1PmLHzJgZ21KMbZiuOXq0DAHxlGKdhKfiMHxAHQQAu1TShsqFF6eEQhRSpOfGXe9hJEqVtxVgZ61UM7KhH/zlXDVEEhqdEddnAmSgYRBvDMCIlGgBwkOvsiPyqtoeKWAl72fkGAzvq0cdfVANgto6Cm7TOTso+E5F/SGvsvtzDTsLdJ3yDgR11SxRFeW/Yu4YzsKPgdUu6Y0/PE9fqFR4JUWip7WGfWEliFJsU+wIDO+rWlRvNuFbXAp1GwOSsBKWHQ+Sx0WnOwK6cgR2RP9U2OwK2nqZi4yI4FesLDOyoWwfKagAAYzJiudsEBbWRqTHQCEBVg4UFFER+1FvxhJTJq29p89uYQgEDO+qW1NBVahdBFKzC9VoMSooEAJws5w4URP7S064TkhijozdqfTP72HkTAzvqlhzYcRqWVGB0eiwArrMj8ie5eCKi++KJ9owdAztvYmBHXdQ1teIL596aE5ixIxXgOjsi/5PbnfQwFRvjvL+hpQ0259Zj1HcM7KiLQ5duQBSBQUmR6BdtUHo4RH02Ks3Ry+7ENbY8IfKXOmnniZ4CO2P7/Y1cZ+c1DOyoi8OXawE4uvYTqcGIVEdgV3a9Ca02u8KjIQoN7X3sug/s9Lr2PWTruM7OaxjYURfHnY1cb82IVXgkRN6RGmNEhF6LNruIsutNSg+HSPVsdhFmqw0AEO0skuhOTLizgILr7LyGgR11IQV2Y/szsCN1EAQBQ/pFAQDOVTUqPBoi9TNb26dWo24S2MkFFMzYeQ0DO+qksr4FlQ0WaARglHPBOZEaDOnnaHnCwI7I98wWR2AXphVg0PXcC1VaZ8epWO9hYEedHHNm64b0i0KEvud3WUTBZrAzY3e+yqzwSIjUTyqGiDLc/DoSw5YnXsfAjjqRAruxXF9HKsOpWCL/aXBm7G42DQt0nIplVay3MLCjTqT1dWMY2JHKDEl2TsVWNkIU2TOLyJfaM3bdV8RKpN0nOBXrPR4FdqtXr0ZWVhaMRiNycnKwf//+Ho9dv349BEHodDMajR4PmHxL6szPwI7UJisxEoLg2JeyupGbjhP5UqMzYxfNqVi/czuw27x5M4qKirBkyRIcOnQI48aNQ35+PiorK3t8TExMDMrLy+VbWVlZnwZNvlHf0oprdY5N0qW+X0RqYQzTIjM+AgCnY4l8Tc7YuTwVy8DOW9wO7JYvX4558+ahoKAAo0ePxpo1axAREYF169b1+BhBEJCamirfUlJS+jRo8o0zFY5txFJjjD02lCQKZllJjunYsussoCDyJXmNXW8ZO1bFep1bgZ3VasXBgweRl5fX/gQaDfLy8lBaWtrj4xobGzFw4EBkZmbikUceweeff37T72OxWFBfX9/pRr532uTIYgxnto5UKjM+HABwuaZZ4ZEQqZurGbv2BsUsnvAWtwK76upq2Gy2Lhm3lJQUmEymbh8zYsQIrFu3Dn/5y1/wv//7v7Db7ZgyZQquXLnS4/cpLi5GbGysfMvMzHRnmOShL5wZuxEpUQqPhMg3BiQ4pmIv3+DuE0S+1GhxZOBcbnfCjJ3X+LwqNjc3F7Nnz0Z2djamTp2KrVu3ol+/fvj1r3/d42MWLVqEuro6+Xb58mVfD5PQHtgNT2HGjtQp0xnYXaphYEfkS42cilWMWx1ok5KSoNVqUVFR0en+iooKpKamuvQcYWFhGD9+PM6ePdvjMQaDAQaDwZ2hkRfIGTtOxZJKScUTnIol8q1Gi2Of2N4Cu1hWxXqdWxk7vV6PCRMmoKSkRL7PbrejpKQEubm5Lj2HzWbDsWPHkJaW5t5IyaeuN1pQ3WiFIABDkzkVS+okTcVWN1rQ7NygnIi8r9EZqPW+xs4R2LW02mFp4znpDW5PxRYVFWHt2rXYsGEDTp48ifnz58NsNqOgoAAAMHv2bCxatEg+/rXXXsM//vEPnD9/HocOHcK3v/1tlJWV4emnn/beq6A++6LCUTiRGR/BrcRItWIjwhDtvNBc4To7Ip9xtY9dtEEHQXB8zN0nvMPtK/jMmTNRVVWFxYsXw2QyITs7Gzt37pQLKi5dugSNpj1evHHjBubNmweTyYT4+HhMmDABe/fuxejRo733KqjPLlQ72j8wW0dqlxkfgRPl9bhU04RhXE9K5BMNLlbFajQCog061Le0ob6lFf2iuQyrrzwqnigsLERZWRksFgv27duHnJwc+Wu7d+/G+vXr5c9/+ctfyseaTCa8//77GD9+fJ8HTt51odqRsRvk7PNF/uHOLi6tra147bXXMGTIEBiNRowbNw47d+7042jVQa6MZQEFkc+4WjwBANHOAooGtjzxCu4VSwDaM3YM7PzH3V1cXnrpJfz617/Gr371K5w4cQLPPPMMHn30URw+fNjPIw9umQnOXnY3WEBB5CvyVGwvGbuOxzQysPMKBnYEADjvDOwGM7DzG3d3cfn973+PF198EQ888AAGDx6M+fPn44EHHsCyZcv8PPLgxpYnRL4liqIcpEW6kLGTsnoNrIz1CgZ2hDabHZeuOy5yWQzs/MKTXVwsFguMRmOn+8LDw7Fnzx6fjlVt+jt3n7hWy4wdkS9Y2uxos4sAXJ2KdQZ2FmbsvIGBHeHKjWa02UUYwzRIjTH2/gDqM092ccnPz8fy5ctx5swZ2O127Nq1C1u3bkV5eXmP34fb83WVFusI7Ex1LQqPhEidOq6Vi3Shy0KUc40dp2K9g4EdyevrshIjodEICo+GerJy5UoMGzYMI0eOhF6vR2FhIQoKCjpVoX8Zt+frKi3W8eblutmKllb2zSLyto6FE65cU9qnYhnYeQMDO2pfX9eP07D+4skuLv369cO2bdtgNptRVlaGU6dOISoqCoMHD+7x+3B7vq5iw8MQHqYFAFTUM2tH5G1mNypiASBGKp6wcI2dNzCwI7Y6UUBfdnExGo3IyMhAW1sb/vSnP+GRRx7p8ViDwYCYmJhOt1AnCIKctbtWy8COyNtc7WEnYcbOuxjYES5WOwsnEhnY+ZO7u7js27cPW7duxfnz5/Hxxx9j2rRpsNvt+NGPfqTUSwhaaXGOwK68jgUURN7mTg87gMUT3sa9owiXnVsrSY1byT/c3cWlpaUFL730Es6fP4+oqCg88MAD+P3vf4+4uDiFXkHwSo1xFFCUs4CCyOukKVVXA7soNij2KgZ2Ic5mF+W2D5kM7PyusLAQhYWF3X5t9+7dnT6fOnUqTpw44YdRqV86M3ZEPtNocRQlRRq0Lh0vBYCN7GPnFZyKDXGm+ha02kSEaQWksNUJhYhU5xo7tjwh8r4m55SqK61OgI7FE8zYeQMDuxAnNSbOiAuHlq1OKESkx0pNihnYEXmb2erI2EW4mrEzsnjCmxjYhThpfR2nYSmUSMUTJrY7CRqrV69GVlYWjEYjcnJysH///psev2XLFowcORJGoxFjx47Fjh07On39qaeegiAInW7Tpk3z5UsIGXLGzuXiCTYo9iYGdiHuSg0DOwo9ac7iiRo2KQ4KmzdvRlFREZYsWYJDhw5h3LhxyM/PR2VlZbfH7927F7NmzcLcuXNx+PBhTJ8+HdOnT8fx48c7HTdt2jSUl5fLtz/+8Y/+eDmqJ2XsXJ2KldfYWdtgd25FRp5jYBfiLt9wFk7EM7Cj0BETrkOE3jFNxMrYwLd8+XLMmzcPBQUFGD16NNasWYOIiAisW7eu2+NXrlyJadOmYeHChRg1ahRef/113HbbbVi1alWn4wwGA1JTU+VbfHy8P16O6jVZHZk36RzrjdTuRBQBs5VZu75iYBfiLssZu3CFR0LkP4LQXixUyenYgGa1WnHw4EHk5eXJ92k0GuTl5aG0tLTbx5SWlnY6HnDstfzl43fv3o3k5GSMGDEC8+fPx/Xr13scB/dddp1Zrop1LWNn0GkQpnWs8eY6u75jYBfiLkmBHTN2FGL6RRsAAJUNFoVHQjdTXV0Nm80m93eUpKSkwGQydfsYk8nU6/HTpk3D7373O5SUlOCtt97Cv/71L9x///2w2bqfmue+y65zN2MnCEL7dCwrY/uMfexCWEurTb6osTkxhZpkBnYh7YknnpA/Hjt2LG699VYMGTIEu3fvxle/+tUuxy9atAhFRUXy5/X19QzuemB2s90J4CiguNHUyoydFzBjF8KuOhsTR+q1iIsIU3g0RP6VHO2cim3gVGwgS0pKglarRUVFRaf7KyoqkJqa2u1jUlNT3ToeAAYPHoykpCScPXu2269z32XXudvuBOi4XyybFPcVA7sQVu7s4ZUeFw5BYA87Ci3JMY6MXVU9M3aBTK/XY8KECSgpKZHvs9vtKCkpQW5ubrePyc3N7XQ8AOzatavH4wHgypUruH79OtLS0rwz8BDmboNioL2XHadi+46BXQiTthJLi2PhBIUeTsUGj6KiIqxduxYbNmzAyZMnMX/+fJjNZhQUFAAAZs+ejUWLFsnHL1iwADt37sSyZctw6tQpvPLKKzhw4IC8fV9jYyMWLlyITz75BBcvXkRJSQkeeeQRDB06FPn5+Yq8RjWR2524WDwBtO8+wanYvuMauxB2zblPZkYctxKj0MOp2OAxc+ZMVFVVYfHixTCZTMjOzsbOnTvlAolLly5Bo2nPU0yZMgUbN27ESy+9hBdffBHDhg3Dtm3bMGbMGACAVqvF0aNHsWHDBtTW1iI9PR333XcfXn/9dRgMBkVeo5pIxROu7hULdNwvloFdXzGwC2HSVGxaLDN2FHpYFRtcCgsL5Yzbl+3evbvLfTNmzMCMGTO6PT48PBwffPCBN4dHTtY2O1ptjibDEW4WTwBcY+cNnIoNYVLGLi2WGTsKPdJUbG1TKyxt3H2CyBuaOjQYdrXdCdC+xq6eGbs+Y2AXwqQ1dulcY0chKC4iDHqt409gFbN2RF4hra/T6zQI07oeYkhTsWYWT/QZA7sQJYqivJUSAzsKRYIgcDqWyMvae9i5nq0D2rcVY1Vs3zGwC1F1za1ocr6z4lQshSo5sGPLEyKvkAI7d9bXAe2tURjY9R0DuxB1zVk4kRCphzHMvXdWRGohrbOrYmUskVc0ya1O3LuusI+d9zCwC1HlLJwgkpsUcyqWyDvkqVg3etgBQDTX2HkNA7sQxcIJovZediyeIPIOOWPn7lQs+9h5DQO7EHVNKpxgxo5CWFKUI2NX3WhVeCRE6mC2SmvsPJuKbWDGrs8Y2IWoCmdgl8LAjkJYYpQeAHDdzIwdkTc0WdzfTgzo3O5EFEWvjyuUMLALURXOxeKpMQzsKHQlOQO76kYGdkTe4HHGzhnY2UWguZUNw/uCgV2IqnC2d0hhYEchLDHSMRV7nVOxRF7hafFEhF4LQXB8zMrYvmFgF6LkqVgGdhTCkpztTpqstk5bIRGRZ6SdJ9zN2AmCgCg9Cyi8gYFdCDJb2uQFqinOdg9EoShSr4VB5/gzyKwdUd81yTtPuJexA9jLzlsY2IUgqWdXhF4rr2sgCkWCIMiVsdfNDOyI+sps9ax4ouNjGNj1DQO7EFRR3z4NK0iLGohClFQZW81edkR9Ji1pcHfnCaC9gIJTsX3DwC4ESYGdtJ0SUShrz9gxsCPqK7Oz3Um4B1tVRnMq1isY2IUgacPzVPawI0JipNTyhFOxRH3VnrHzYCpWz23FvIGBXQgy1bMilkiSGMWWJ0Te0uRhVSzA3Se8hYFdCOJULFG7JO4+QeQ17YGdB1WxBmbsvIGBXQiqZHNiIln7frEM7Ij6qsnDnScAFk94CwO7ECRtJ8bAjqjDfrGciiXqE5tdREurHQCnYpXEwC7EiKLYod0Jp2KJpG3FWDxB1Dcd93jtSx87TsX2DQO7ENNgaZPfUSVHM2NHJK2xqzFbYLOLCo+GKHhJu04IAuQdXdwRzQbFXsHALsRITVijDDqEe5AqJ1KbeGe7E7sI1DW3KjwaouAlFU5E6nUeNb+X19hZbL0cSTfDwC7EVDkDu36siCUCAIRpNYhxru2p4bZiRB4zOwsnPE0ayFuKtfANVl8wsAsxVc7Kv35RDOyIJAnOrN2NJgZ2RJ5qljN2ngV23HnCOzwK7FavXo2srCwYjUbk5ORg//79Lj1u06ZNEAQB06dP9+TbkhcwY0fUlRTYsTKWyHNmZ2AX7kEPO6Bj8QSnYvvC7cBu8+bNKCoqwpIlS3Do0CGMGzcO+fn5qKysvOnjLl68iB/+8Ie46667PB4s9Z3Uq0taME5EzNgReUOztJ2Yhxm7qA7FE3YWMnnM7cBu+fLlmDdvHgoKCjB69GisWbMGERERWLduXY+Psdls+Na3voVXX30VgwcP7tOAqW+YsSPqKj5CqoxlYEfkKSnT5ukaO2kqFmhfr0fucyuws1qtOHjwIPLy8tqfQKNBXl4eSktLe3zca6+9huTkZMydO9el72OxWFBfX9/pRt7BwI6oq4QoBnZEfdXU2l4V6wmDTgOtxlFNy+lYz7kV2FVXV8NmsyElJaXT/SkpKTCZTN0+Zs+ePXj33Xexdu1al79PcXExYmNj5VtmZqY7w6SbkIsnGNgRyRKcGbsbDOyIPCb1sfNk1wkAEAShw3QsK2M95dOq2IaGBjz55JNYu3YtkpKSXH7cokWLUFdXJ98uX77sw1GGluoGx4WrXxSbExNJpF52NVxjR+QxqY9dhMHzHqnsZdd3buVLk5KSoNVqUVFR0en+iooKpKamdjn+3LlzuHjxIh566CH5PrvdseuBTqfD6dOnMWTIkC6PMxgMMBiYUfI2u11sL56IZvEEkSQxklOxRH3VZJUydp5NxQIdArsWrrHzlFsZO71ejwkTJqCkpES+z263o6SkBLm5uV2OHzlyJI4dO4YjR47It4cffhj33HMPjhw5wilWP6ttbkWbs9JI2h+TiDpk7BjYEXlMztj1YVejSGe2j73sPOd2WF1UVIQ5c+Zg4sSJmDx5MlasWAGz2YyCggIAwOzZs5GRkYHi4mIYjUaMGTOm0+Pj4uIAoMv95HtS4UR8RBj0HuzjR6RWXGNH1HfeCOyijGEAGNj1hduB3cyZM1FVVYXFixfDZDIhOzsbO3fulAsqLl26BI2GQUMgqmbhBFG3pKpYs9WGllYbjGHcR5nIXU3ylmJ9mYp1nHtmBnYe8ygCKywsRFlZGSwWC/bt24ecnBz5a7t378b69et7fOz69euxbds2T74t9ZGUsUvidmIBw91dXFasWIERI0YgPDwcmZmZeP7559HS0uKn0apXtEGHMK2jzQKbFBN5pqmPW4oBnZsUk2eYWgsh7btOMLALBO7u4rJx40b8+Mc/xpIlS3Dy5Em8++672Lx5M1588UU/j1x9BEFgk2KiPvLOGjsGdn3FwC6EVDv3wWRgFxjc3cVl7969uOOOO/DNb34TWVlZuO+++zBr1iyX92qmm0tgAQVRn7QHdp5PxUazKrbPGNiFkOvOjF0i94lVnCe7uEyZMgUHDx6UA7nz589jx44deOCBB/wyZrVjxo6ob9rbnfSleMIR2HGNnec8D6sp6Fw3Sxk7BnZKu9kuLqdOner2Md/85jdRXV2NO++8E6Iooq2tDc8888xNp2ItFgssFov8Obfn6xm3FSPqG29k7KSp2AYGdh5jxi6EyBk79rALSrt378Ybb7yB//f//h8OHTqErVu34v3338frr7/e42O4PZ/r4iMcbRZuNHErIyJP9HVLMYANir2BGbsQIq2xS2DGTnHu7uICAC+//DKefPJJPP300wCAsWPHwmw247vf/S5+8pOfdNtmaNGiRSgqKpI/r6+vZ3DXA2kqtpZVsURuE0URTa3e21LMbGVg5ylm7EKEKIq4bnZWxTJjpzh3d3EBgKampi7Bm1br+AMqimK3jzEYDIiJiel0o+7FSU2KmbEjcltLqx3SnyFuKaYsBnYhoslqQ0urY59eFk8EhqKiIqxduxYbNmzAyZMnMX/+/C67uCxatEg+/qGHHsLbb7+NTZs24cKFC9i1axdefvllPPTQQ3KAR55LiHROxXKNXUByt+fjli1bMHLkSBiNRowdOxY7duzo8dhnnnkGgiBgxYoVXh516GjqkGEL70ODb7Y76TtOxYaI685pWGOYpk/rH8h73N3F5aWXXoIgCHjppZdw9epV9OvXDw899BB+9rOfKfUSVKU9Y8fALtBIPR/XrFmDnJwcrFixAvn5+Th9+jSSk5O7HL93717MmjULxcXF+NrXvoaNGzdi+vTpOHToUJftLP/85z/jk08+QXp6ur9ejipJhRPGMA20GsHj54k2MrDrK2bsQkS1ub1wQhA8P+nIu9zZxUWn02HJkiU4e/YsmpubcenSJaxevVref5n6pn2NHadiA427PR9XrlyJadOmYeHChRg1ahRef/113HbbbVi1alWn465evYrnnnsOf/jDHxAWFuaPl6Ja7btO9C1fJGXsmqw22OzdLzGhm2NgFyKuN7LVCdHNtFfFMmMXSDzp+VhaWtrpeADIz8/vdLzdbseTTz6JhQsX4pZbbul1HBaLBfX19Z1u1M4s7xPbtxkhaY1dx+ck9zCwCxE1UsaOu04QdUuaim2y2mBpsyk8GpLcrOejyWTq9jEmk6nX49966y3odDr893//t0vjYOugm2v2UsbOoNNA55zKZZNizzCwCxFSq5PESGbsiLoTY9TJa4M4HatuBw8exMqVK7F+/XqXl6YsWrQIdXV18u3y5cs+HmVwkYKwvmbsBEGQd59gZaxnGNiFCGkqlhk7ou4JgoC4cMd0LHefCBye9HxMTU296fEff/wxKisrMWDAAOh0Ouh0OpSVleEHP/gBsrKyun1Otg66uWZnD7vIPvSwk0SxMrZPGNiFCLmHHdfYEfUojuvsAo4nPR9zc3M7HQ8Au3btko9/8skncfToURw5ckS+paenY+HChfjggw9892JUzGxxBHbhYX1vtsHArm/Y7iRESBm7BE7FEvUoIVKPc1VmTsUGmKKiIsyZMwcTJ07E5MmTsWLFii49HzMyMlBcXAwAWLBgAaZOnYply5bhwQcfxKZNm3DgwAG88847AIDExEQkJiZ2+h5hYWFITU3FiBEj/PviVELqY+fVjB2nYj3CwC5EVDeyeIKoN+xlF5jc7fk4ZcoUbNy4ES+99BJefPFFDBs2DNu2bevSw468R2p30pddJyRsUtw3DOxCxHUziyeIeiO1PGHGLvAUFhaisLCw26/t3r27y30zZszAjBkzXH7+ixcvejgyAtpbk3ijAX4UmxT3CdfYhQBRFOVtkjgVS9QzqUkxiyeI3NPe7qTvgV20M2PHdieeYWAXAupb2tDm7ODNwI6oZ5yKJfKMXDzhhalYaY1dAwM7jzCwCwFSti5Cr4WxD5szE6kdp2KJPNPc6sXiCfax6xMGdiHgOqdhiVzCjB2RZ6SMnTeKJ9jupG8Y2IUArq8jcg0zdkSeaZarYr2wxo4Zuz5hYBcCahjYEbkkPpIZOyJPeLUq1uB4g8U1dp5hYBcCapwXqYQIBnZENyPtPFHX3Aq7s+CIiHrX7MU+dlxj1zcM7EIAM3ZErokLd5wjogjUt3A6lshV3s3YcY1dXzCwCwFSYBfPwI7opvQ6jdyHi+vsiFzX5Is1dgzsPMLALgTUcNcJIpexMpbIPaIoyoGdtB1YX3Cv2L5hYBcCmLEjcp20zq62mRk7IldY2uywOdekenNLMavNDkubrc/PF2oY2IUAZuyIXCdtK1bLjB2RS6TCCcA7xRORHZ6DWTv3MbALAexjR+S6WPayI3KLVDhh0Gmg1Qh9fj6tRpDXunKdnfsY2Kmcpc0m9wJiYEfUO6lJ8Q0GdkQu8WZzYok0HdvAjJ3bGNipnJR10GoExBjDFB4NUeCTWp7UcSqWyCVmL/awk7DliecY2Knc9UZn4UREGDReSJETqV0cM3ZEbmlyTsVGGryZsXOch1xj5z4GdiontWyI564TRC6R2p2wKpbINU0WR8Yu3IsZu2hm7DzGwE7luOsEkXviwqXiCU7FErmiqdXZw86ba+ycgR33i3UfAzuVkzJ2DOyIXBMfyapYInc0Wby3nZiE+8V6joGdykkZuzhOxRK5JDacO08QucO3xRN8g+UuBnYqJ2UdEiJZEUvkCqndSUNLG9psdoVHQxT4mq3ez9hFM2PnMQZ2KidvJ8aMHZFLYsPb3wTVsYCCqFe+zNhxjZ37GNipHKtiidyj02rkbAErY4l6JzUo9m67E2bsPMXATuVYPEHkvrgIVsYSucrszKqFe3Uq1tnHjhk7tzGwU7kbZkfGIZ6BHZHLpAy3dP4QUc+kdicRYV4M7NjHzmMM7FRO7mPHqVgil0nr7DgVS9Q7qd1JpMGLa+w4FesxBnYq1tJqQ7PznVQcq2KJXCZl7DgVS9Q7s0VaY+f94ol6BnZuY2CnYtL6Op1GkNPaRNQ7aY0dq2KJemf2QbsTuSq2heeguxjYqZjc6iRSD0EQFB4NUfCQGnqzSTFR75qcVbFRXkwgxDiLJyxtdljb2E/SHQzsVExqTiw1XCUi17TvF8tsAVFvzPKWYt5fYwcwa+cuBnYqxubERJ7hVCyR68xy8YT3pmK1GgGRzqndBq6zc4tHgd3q1auRlZUFo9GInJwc7N+/v8djt27diokTJyIuLg6RkZHIzs7G73//e48HTK5jDzsiz8RzKpbIJXa72N7uxIsZO6C9lx0DO/e4Hdht3rwZRUVFWLJkCQ4dOoRx48YhPz8flZWV3R6fkJCAn/zkJygtLcXRo0dRUFCAgoICfPDBB30ePN0ce9gReSY2glOxRK5oabNBFB0fezNjB7TvF8upWPe4HdgtX74c8+bNQ0FBAUaPHo01a9YgIiIC69at6/b4u+++G48++ihGjRqFIUOGYMGCBbj11luxZ8+ePg+ebq59OzGusSNyB9fYEblGanUiCEC4FxsUA+2BHVueuMetwM5qteLgwYPIy8trfwKNBnl5eSgtLe318aIooqSkBKdPn8ZXvvKVHo+zWCyor6/vdCP3cY0dkWekc6bR0oZWGyvyiHoir6/T67zefYHbinnGrcCuuroaNpsNKSkpne5PSUmByWTq8XF1dXWIioqCXq/Hgw8+iF/96le49957ezy+uLgYsbGx8i0zM9OdYZJTe8aOgR2RO2LCwyBdo1hAQdQzX/Swk3Aq1jN+qYqNjo7GkSNH8Omnn+JnP/sZioqKsHv37h6PX7RoEerq6uTb5cuX/TFM1WHxBJFntBpB7qPF3SeIeib1sPPmrhMSFk94xq3/iaSkJGi1WlRUVHS6v6KiAqmpqT0+TqPRYOjQoQCA7OxsnDx5EsXFxbj77ru7Pd5gMMBgMLgzNOqGVDwRxzV2RG6LiwhDXXMr19kR3UR7Dztm7AKFWxk7vV6PCRMmoKSkRL7PbrejpKQEubm5Lj+P3W6HxWJx51uTB2o5FUvkMRZQEPXOF/vESqLlbcWYsXOH2/8TRUVFmDNnDiZOnIjJkydjxYoVMJvNKCgoAADMnj0bGRkZKC4uBuBYLzdx4kQMGTIEFosFO3bswO9//3u8/fbb3n0l1ImlzQazM0XOwI7IfdxWjKh30hq7SJ9m7BjYucPtwG7mzJmoqqrC4sWLYTKZkJ2djZ07d8oFFZcuXYJG054INJvN+N73vocrV64gPDwcI0eOxP/+7/9i5syZ3nsV1IWUZdBqBPnkICLXcfcJot41SVOxPlxjV8+pWLd4VDxRWFiIsrIyWCwW7Nu3Dzk5OfLXdu/ejfXr18uf//SnP8WZM2fQ3NyMmpoa7N27l0GdH0hZhrjwMGg03i1BJ+9xZxeXu+++G4IgdLk9+OCDfhxx6JCmYpmxI+qZNDPEjF3g4F6xKsXCicDn7i4uW7duRXl5uXw7fvw4tFotZsyY4eeRhwZpKpZr7Ih61iS3O/FlVSzPQXcwsFMp9rALfO7u4pKQkIDU1FT5tmvXLkRERDCw8xHpTVEtp2KJeiQVT0T5ZCqWGTtPMLBTKTmwYw+7gNTXXVwA4N1338UTTzyByMhIXw0zpMXLGTtOxQYCd5YtAMCWLVswcuRIGI1GjB07Fjt27Oj09VdeeQUjR45EZGQk4uPjkZeXh3379vnyJaiS3O7Ey/vEApB7SXLnCfcwsFMpafqI+8QGJk93cZHs378fx48fx9NPP33T47g9n+dineeOtKyBlOPusoW9e/di1qxZmDt3Lg4fPozp06dj+vTpOH78uHzM8OHDsWrVKhw7dgx79uxBVlYW7rvvPlRVVfnrZamC3KDYJ1OxOvl7tHFrP5cxsFMp7hOrbu+++y7Gjh2LyZMn3/Q4bs/nOencYVWs8txdtrBy5UpMmzYNCxcuxKhRo/D666/jtttuw6pVq+RjvvnNbyIvLw+DBw/GLbfcguXLl6O+vh5Hjx7118tSBV9uKRbVoaMDs3auY2CnUnJVLAO7gOTpLi6Ao4XQpk2bMHfu3F6/D7fn8xyrYgODJ8sWSktLOx0PAPn5+T0eb7Va8c477yA2Nhbjxo3z3uBDgDQV64sGxWFaDYxhjjCF6+xcx8BOpaSp2IRITsUGor7s4rJlyxZYLBZ8+9vf7vX7GAwGxMTEdLqRa6SMXZPVBkubTeHRhC5Pli2YTCaXjv/b3/6GqKgoGI1G/PKXv8SuXbuQlJTU7XNyWUP3fLnzBMBedp5gYKdSzNgFvqKiIqxduxYbNmzAyZMnMX/+/C67uCxatKjL4959911Mnz4diYmJ/h5ySIk26iC1gGTLE3W65557cOTIEezduxfTpk3D448/3uO6PS5r6F6TD3eeAFgZ6wkGdip1g2vsAt7MmTOxdOlSLF68GNnZ2Thy5EiXXVzKy8s7Peb06dPYs2ePS9Ow1DcajcBedgHAk2ULqampLh0fGRmJoUOH4vbbb8e7774LnU6Hd999t9vn5LKG7kkNin3Rxw7o2MuOgZ2rGNip1A1WxQYFd3ZxAYARI0ZAFEXce++9fh5paOI6O+V5smwhNze30/EAsGvXrl6XOdjtdlgslm6/xmUN3WtfY+ebjF2MM2NXzyIml3ETURVqs9nl9QjsY0fkOblJMQM7RRUVFWHOnDmYOHEiJk+ejBUrVnRZtpCRkYHi4mIAwIIFCzB16lQsW7YMDz74IDZt2oQDBw7gnXfeAeAoQPrZz36Ghx9+GGlpaaiursbq1atx9epVNvx2g90uyu1OfJWxiw3nGjt3MbBTobrmVoii42Mp40BE7pOWMtzgVKyiZs6ciaqqKixevBgmkwnZ2dldli1oNO0TUFOmTMHGjRvx0ksv4cUXX8SwYcOwbds2jBkzBgCg1Wpx6tQpbNiwAdXV1UhMTMSkSZPw8ccf45ZbblHkNQaj5tb2oiJf7DwBADFSYNfMqVhXMbBTIekiFG3UQaflbDuRp7jGLnAUFhaisLCw26/t3r27y30zZszoMftmNBqxdetWbw4vJEnTsIIAuS2Jt8WwKtZtvOqrUC33iSXyCk7FEvVMahocpddBEASffI+YcEf+iY3CXcfAToXkwgmuryPqE6n4iMUTRF35uocd0GGNHQM7lzGwU6H2VidcX0fUF3FcY0fUowaL47zouPWXt3Eq1n0M7FToBqdiibxC3i+WgR1RF/7I2LF4wn0M7FRIyi7EMWNH1CdxnIol6lGjM2MX7cvAzsg1du5iYKdC0kLvBGbsiPqkPbDjRYXoyxrljJ1vmhMD7GPnCQZ2KlTjXGMXx+IJoj6Jl9udWCFKzSGJCEDHXSd8PxXbaGmD3c5z0BUM7FSoltuJEXmFFNi12UV5T0wicmh07t/qy6nYaOdUrCgCDRaus3MFAzsVusGpWCKvMIZpoNc5/kxK1eZE5NDoh4ydQaeVmx+z5YlrGNipkBTYxTGwI+oTQRDYy46oB3KDYh+2OwHa19mxgMI1DOxURhTF9qnYSE7FEvUV94sl6p60xs5X+8RK2MvOPQzsVKbB0oY25wJT9rEj6ruEyPYCCiJqJ0/F6n0c2LGXnVsY2KlMrdnxjiY8TAtjmO9K0IlChbQ1Xw3X2BF14q+pWKmXHdfYuYaBncrUNHE7MSJvimcvO6Ju+Wsqlr3s3MPATmVYOEHkXVJ1OatiiTqT2p34fI2dPBXLwM4VDOxURloHxMIJIu+Qp2K5xo6oE3+0OwE6Fk9wjZ0rGNipzA2z1JyYGTsib+i4+wQROYhie9Nu32fsuF+sOxjYqcwNeY0dAzsib2gvnuBFhUjS0mqHzdmBwffFE5yKdQcDO5W5weIJIq/iGjuirho7bO8V4eMODFLxRC0DO5cwsFMZeSo2khk7Im+I67DzhChyE3IioEOrE4MOGo3g0+8VG8GdJ9zBwE5l5H1iGdgReYV0Llna7GhutSk8GqLAYJYLJ3zfLzUuXFrnysDOFQzsVEZqoso1dkTeEaHXQq9z/Klkk2Iih4YW/1TEAu1Z87pmZs1dwcBOZZixI/IuQRDkNavMGBA5SBm7aD8EdlKiotUmosnKrHlvGNipiCiK8hq7OBZPEHmNdGFhxo7IwWz1X8bOGKaRs+YsoOgdAzsVabLaYLXZATBjR+RN0vl0g73siAC0T8X6uocd4Miax0mVsTwHe8XATkWkbIJBp0G4j8vPiUJJPFueEHXir31iJfI6Oy6H6BUDOxXpuL5OEHxbfk4USqQt+mp4USEC4L/txCRyZSynYnvFwE5FpIxdHCtiibyKTYqJOpOmYqN9vOuEJJYFTC5jYKci7Rk7Fk4QeZO8rRjX9xABAOpbHAFWtNE/1xt5jV0zz8HeMLBTEXnXCWbsiLxKKp6oaeRFhQjwf8aOa+xcx8BORdjDjsg3EiMNANjuhEjS4MzYxYT7KWMXwd0nXMXATkW46wSRb0hvlq4zsCMCoMAaO07FuoyBnYpIGbt4Nicm8qrEqPY+dnY7tzQikgK7GD9PxTJj1zsGdioiZ+w4FUvkVVIW3GYX5UXjRKHM/8UTjnOwju1OesXATkWkdzJcY0fkXXqdRp5y4nQshTpRFDtk7Py1xs7xfbj7S+8Y2KkI19gR+U5iJPeLJQKA5lYbbM4lCf6uiuVUbO88CuxWr16NrKwsGI1G5OTkYP/+/T0eu3btWtx1112Ij49HfHw88vLybno8eUYUxfY1dszYEXmdXEDRaFF4JETKkrJ1Wo2ACL1/tq+UqmItbXa0tNr88j2DlduB3ebNm1FUVIQlS5bg0KFDGDduHPLz81FZWdnt8bt378asWbPw0UcfobS0FJmZmbjvvvtw9erVPg+e2jVY2tBqc7yDSmDGjsjrEpwtTzgVS6Gu3rnOLcqg89v2lZF6LXQax/di1u7m3A7sli9fjnnz5qGgoACjR4/GmjVrEBERgXXr1nV7/B/+8Ad873vfQ3Z2NkaOHInf/OY3sNvtKCkp6fPgqZ3UODU8TItwP72DIgoliWxSTAQAqJfW14X7ZxoWAARB4Do7F7kV2FmtVhw8eBB5eXntT6DRIC8vD6WlpS49R1NTE1pbW5GQkNDjMRaLBfX19Z1udHM1bE5M5FMJUexlRwS0NyeONvi3tZa0fpyB3c25FdhVV1fDZrMhJSWl0/0pKSkwmUwuPccLL7yA9PT0TsHhlxUXFyM2Nla+ZWZmujPMkCRlEaR+W0TkXSyeIHLwd3NiSTzPQZf4tSr2zTffxKZNm/DnP/8ZRqOxx+MWLVqEuro6+Xb58mU/jjI4Sb/ozNgR+UYCLypEADoGdv7N2Elvrm7wHLwpt8LtpKQkaLVaVFRUdLq/oqICqampN33s0qVL8eabb+Kf//wnbr311pseazAYYDAY3BlayLvOwI7Ip7itGJFDvbxPrDIZO56DN+dWxk6v12PChAmdCh+kQojc3NweH/fzn/8cr7/+Onbu3ImJEyd6PlrqUY3Z0YIhkYEdkU8kOqtipXONKFRJa+z81ZxYInV8YMbu5twOt4uKijBnzhxMnDgRkydPxooVK2A2m1FQUAAAmD17NjIyMlBcXAwAeOutt7B48WJs3LgRWVlZ8lq8qKgoREVFefGlhLb2jB0znUS+IBVP1JitEEXRb20eiAKNUmvs5OUQbHdyU26vsZs5cyaWLl2KxYsXIzs7G0eOHMHOnTvlgopLly6hvLxcPv7tt9+G1WrFY489hrS0NPm2dOlS770Kkt/BJET69x0UUaiQsuGtNlFu90D+405jfADYsmULRo4cCaPRiLFjx2LHjh3y11pbW/HCCy9g7NixiIyMRHp6OmbPno1r1675+mWoguKBHbPmN+VR8URhYSHKyspgsViwb98+5OTkyF/bvXs31q9fL39+8eJFiKLY5fbKK6/0dezUQQ0zdkHJ3YtVbW0tnn32WaSlpcFgMGD48OGdLljkO8YwLaIMzv1iufuEX7nbGH/v3r2YNWsW5s6di8OHD2P69OmYPn06jh8/DsDRduvQoUN4+eWXcejQIWzduhWnT5/Gww8/7M+XFbSUmoptr4plxu5muFesSrB4Ivi4e7GyWq249957cfHiRbz33ns4ffo01q5di4yMDD+PPHQlOadjq9mk2K/cbYy/cuVKTJs2DQsXLsSoUaPw+uuv47bbbsOqVasAALGxsdi1axcef/xxjBgxArfffjtWrVqFgwcP4tKlS/58aUGpvplVsYGMgZ1KSBk7Fk8ED3cvVuvWrUNNTQ22bduGO+64A1lZWZg6dSrGjRvn55GHrqQoR0a8mhk7v/GkMX5paWmXXqn5+fk3baRfV1fn2N0gLq7br7NxfjupKlbJPnaiKPr1ewcTBnYq0NJqQ5PVsSlyAhsUBwVPLlbbt29Hbm4unn32WaSkpGDMmDF44403YLNxQ2x/YWDnf540xjeZTG4d39LSghdeeAGzZs1CTExMt8ewcX47xdbYOatirTY7zFb+3esJAzsVkKZhw7QCog3+PdHIM55crM6fP4/33nsPNpsNO3bswMsvv4xly5bhpz/9aY/fh1kG70qKdk7FNjCwU4vW1lY8/vjjEEURb7/9do/HsXF+O3lLMT9PxYbrtQgPc+yFzunYnjEKUIEbHdbXsQWDetntdiQnJ+Odd96BVqvFhAkTcPXqVfziF7/AkiVLun1McXExXn31VT+PVL2kjF0V19j5jSeN8VNTU106XgrqysrK8OGHH/aYrQPYOF9is4tosDgydrHh/u/CkBCpx9XaZlw3W5GZEOH37x8MmLFTAfawCz6eXKzS0tIwfPhwaLVa+b5Ro0bBZDLBau0+0GCWwbs4Fet/njTGz83N7XQ8AOzatavT8VJQd+bMGfzzn/9EYmKib16AyjS0tEJa3qZEYBfvbOnFjF3PGNipgNTThz3sgocnF6s77rgDZ8+ehd1ul+/74osvkJaWBr2++7WVBoMBMTExnW7kOQZ2yigqKsLatWuxYcMGnDx5EvPnz+/SGH/RokXy8QsWLMDOnTuxbNkynDp1Cq+88goOHDiAwsJCAI6g7rHHHsOBAwfwhz/8ATabDSaT6aZvksihrtkxDRup10Kv838IER/BPZt7w8BOBa43MmMXjNy9WM2fPx81NTVYsGABvvjiC7z//vt444038Oyzzyr1EkJOP2mNHQM7v3K3Mf6UKVOwceNGvPPOOxg3bhzee+89bNu2DWPGjAEAXL16Fdu3b8eVK1eQnZ3dqXn+3r17FXmNwaLWueuDEtk6oL3zAwO7nnGNnQpIU7FJrIgNKjNnzkRVVRUWL14Mk8mE7OzsLhcrjab9vVdmZiY++OADPP/887j11luRkZGBBQsW4IUXXlDqJYQcOWPXwIuKvxUWFsoZty/bvXt3l/tmzJiBGTNmdHt8VlYW22V4qNaZsYuNUOZ6I7c8aeI52BMGdiogVehJFx0KHu5erHJzc/HJJ5/4eFTUE+kca261wWxpQySr0CnE1DoDqjiFM3bc/aVnnIpVAWbsiPwj0qCT2y1wOpZCUb0zYxcXoVBg53xzdZ2V6T1iYKcC0gUmkWvsiHwuievsKIQpvcaun9xyiOdfTxjYqYD0ziUpmoEdka/Jvey4zo5CUPsaO2UCO+k6xybhPWNgF+REUZTfuXCfWCLfY8sTCmVSu5O4cGWuN9KSo+pG7hfbEwZ2Qa7R0gZrm6OvGYsniHxPOs8qmTGgEKT0VKx0/lltdtQ796ylzhjYBblq5zRspF6LcL22l6OJqK9SYqSp2BaFR0Lkf3XNzqpYhaZijWFaRBsd1ejMmnePgV2Qk0q+ub6OyD9SYowAgMp6XlQo9EgZO6XanQAdCiiYNe8WA7sgV831dUR+lex8E1XBjB2FIGmNXYyCgR3Xud4cA7sgJ03Fcn0dkX8wY0ehShRFuSpWqalYoEPLIWbsusXALsjJGTsGdkR+kRzTni1os9kVHg2R/7S02uVivTiFthQD2qdiq9mkuFsM7IKc3MOOu04Q+UVipAEaAbCL7bu+EIUCaRpWqxEQqWCxXhLX2N0UA7sgJ2XsOBVL5B9ajYB+znV2nI6lUFLb3L5PrCAIio1DblLMNXbdYmAX5KSMXSIzdkR+I62zq6hnAQWFDrmHnYLr64COU7EM7LrDwC7IcZ9YIv+TKmPZpJhCSSC0OgE6Zuy4FKI7DOyCnLTGQFrQTUS+l8yMHYUgqTmxUrtOSKQ15VWNFm4r1g0GdkGs2WpDg8WxpUo/Nigm8pv2jB0DOwodUrFQvMJ9U+VtxdrsqG/mtmJfxsAuiEkXFWOYBtEGncKjIQod7GVHoagmQPqmGsO0iHeu8zMxa94FA7sgJq3vSY42KlqhRBRqpP1iufsEhZIaZ8YuIQB2OpLeXDGw64qBXRCTsgXJnIYl8qvkaGmNHTN2FDquB2Bgx3WuXTGwC2JVzmwBCyeI/Cs11nFRqW60yJ34idROytgFwt7kqVJgV8fA7ssY2AUxaSq2H5sTE/lVYqQeep0GosiMAYWOgJqKjeVUbE8Y2AUxeY2d850LEfmHIAhIc15YypkxoBBx3Rw4fVPlda4M7LpgYBfE5Iwd19gR+V17YNes8EiIfK/J2oaWVseyg4QA2OkolcUTPWJgF8Qqnb/QLJ4g8r/02HAAwLVaXlhI/aTtK/U6DSL1WoVH07F4ggVMX8bALohVdWh3QkT+lRbHjB2Fjo6FE4HQXksK7KobLWi1sYCpIwZ2QarVZpdLz1kVS+R/aczYUQgJpMIJwBFghmkFiGJ7koMcGNgFqepGxy+yViMgISIwTjSiUJLOjB2FkEDqYQcAGo0gz1ZxnV1nDOyClPQOJSlKD41G+bQ4UaiRMnasiqVQUCNXxAZGYAd0qIzlOdgJA7sg1b7rBNfXESlBKp6oMVvR0mpTeDREviUVTyQEQKsTCbcV6x4DuyBV7vxFljrgE5F/xYTrEOGsDmTWjtROmopNDIBWJxJmzbvHwC5ImZzretIY2BEpolOT4lqusyN1C7TiCQDIiHcEdldv8PzriIFdkCqvZcaOSGnpcc4LCwM7UrlAK54AgAzn+XflRpPCIwksDOyClJR6ltb5EJH/9Y+PAABcZsaAVK5aLtgLnDV2/eP5xqo7DOyClIlr7IgUl5nguLBcrmHGgNRLFEW5E0NKAPVNlQK76kYWMHXEwC4IiaIo987iGjsi5WRKGTsGdqRitU2tsDp3dwikvcljw8Pk7c2YtWvHwC4I1TW3ypsxS+XeROR/mQnSVCwDO1KvigbHDFF8RBgMOuX3iZUIgsACim4wsAtC0vq6hEg9jGGBc5IRhZpM50Wlot7CqSBSrUDum5rBAqYuGNgFIZMzsEtlto5IUQmRermXHS8spFaVzvV1gbgvuZSxY2VsOwZ2QUjK2HF9HZGyBEHgOjtSvQpnsV5gZuwc5x+nYtt5FNitXr0aWVlZMBqNyMnJwf79+3s89vPPP8c3vvENZGVlQRAErFixwtOxkpNcOBEXeCcZUaiRK2N5YSGVqgrgjB1bnnTldmC3efNmFBUVYcmSJTh06BDGjRuH/Px8VFZWdnt8U1MTBg8ejDfffBOpqal9HjB1zNixhx2R0vozY0cqJ2XsUgKoIlbSPhXLwE7idmC3fPlyzJs3DwUFBRg9ejTWrFmDiIgIrFu3rtvjJ02ahF/84hd44oknYDAE3i9FMJIydqyIJVKeXBnLwI5Uqn2NXeBdcwY6z7/yuhYWMDm5FdhZrVYcPHgQeXl57U+g0SAvLw+lpaVeG5TFYkF9fX2nG7WT3plIKWgiUs4A54Wl7DoDO1InOWMXgFOxCZF6RBt0APjmSuJWYFddXQ2bzYaUlJRO96ekpMBkMnltUMXFxYiNjZVvmZmZXnvuYGezi7jmXEsgZQqISDmDkiIBABevmyGKosKjUS931nYDwJYtWzBy5EgYjUaMHTsWO3bs6PT1rVu34r777kNiYiIEQcCRI0d8OPrgJYpie8YuAIsnBEFAlvMcvFBtVng0gSEgq2IXLVqEuro6+Xb58mWlhxQwKhta0GoTodMIbHdCFAAGJERAqxHQZLXJF0DyLnfXdu/duxezZs3C3LlzcfjwYUyfPh3Tp0/H8ePH5WPMZjPuvPNOvPXWW/56GUGpvrkN1rbA23Wio4GJzJp35FZgl5SUBK1Wi4qKik73V1RUeLUwwmAwICYmptONHC7XOLJ16XHh0GoEhUdDRHqdRm5UfK6qUeHRqJO7a7tXrlyJadOmYeHChRg1ahRef/113HbbbVi1apV8zJNPPonFixd3WlpEXUm7TsSGhwVsQ/ysRGfG7jozdoCbgZ1er8eECRNQUlIi32e321FSUoLc3FyvD466kpowcn0dUeAYxKkgn/FkbXdpaWmXgC0/P9+ra8FDhdQQPxDX10mkqdgyBnYAAJ27DygqKsKcOXMwceJETJ48GStWrIDZbEZBQQEAYPbs2cjIyEBxcTEAx0l54sQJ+eOrV6/iyJEjiIqKwtChQ734UkKDlLGTmqISkfIGJUXho9NVuFDFC4u33Wxt96lTp7p9jMlk8vpacIvFAoulfao9VIr6pP5w0tZdgSjLORV7sZpTsYAHgd3MmTNRVVWFxYsXw2QyITs7Gzt37pRPokuXLkGjaU8EXrt2DePHj5c/X7p0KZYuXYqpU6di9+7dfX8FIYYZO6LAM6gfM3ZqV1xcjFdffVXpYfidtKNDRgBfc6SM3bW6ZrS02gJ2ythfPCqeKCwsRFlZGSwWC/bt24ecnBz5a7t378b69evlz7OysiCKYpcbgzrPXHYGdqyIVQd3Kv3Wr18PQRA63YxGFtAEgsGcivUZT9Z2p6amen0teKgW9UnJBGnrrkCUGKlHlEEHUeSesUCAVsVSz9jDTj3crfQDgJiYGJSXl8u3srIyP46YejLYmbG7VNOEVptd4dGoiydru3NzczsdDwC7du3q01rwUC3qk6ZiA/ma42h54gg8z3M5BAO7YNJms8vbiTFjF/zcrfQDHH/AUlNT5duX1xGRMlKijQgP06LNLuISm6R6XVFREdauXYsNGzbg5MmTmD9/fpe13YsWLZKPX7BgAXbu3Illy5bh1KlTeOWVV3DgwAEUFhbKx9TU1ODIkSPyGvDTp0/jyJEjXu3JqgbBMBULAEP6RQEAzrIynYFdMCmva4HNLkKv1aBfVOBWKFHvPN3FpbGxEQMHDkRmZiYeeeQRfP755/4YLvVCoxEwJNmRtTtTwQuLt82cORNLly7F4sWLkZ2djSNHjnRZ211eXi4fP2XKFGzcuBHvvPMOxo0bh/feew/btm3DmDFj5GO2b9+O8ePH48EHHwQAPPHEExg/fjzWrFnj3xcXwFptdpicu070D+DiCQAYnhINgOcf4EHxBCnnorOUe0BiBDTsYRfUPKn0GzFiBNatW4dbb70VdXV1WLp0KaZMmYLPP/8c/fv37/YxoVrJp4ThKdE4frUep00NmDbGe309yaGwsLBTxq2j7tZsz5gxAzNmzOjx+Z566ik89dRTXhqdOpnqWmAXAb1Wg6QATyYMTXZk7L6oaFB4JMpjxi6ISAuzpZ5ZFFpyc3Mxe/ZsZGdnY+rUqdi6dSv69euHX//61z0+htvz+c/IVEfGgBcWUgtpTXd6nDHgkwlSxu5sZSNs9tDe2o+BXRCRFoUOZmAX9Lyxi0tYWBjGjx+Ps2fP9nhMqFbyKWFEqmMx/SkTs6KkDu2FE4G/pntAQgQMOg0sbXZcDvF1rgzsgggzdurhjV1cbDYbjh07hrS0tB6PCdVKPiWMcGYMLl5vQkurTeHREPWdXDgR4OvrAECrEeQCilDPmjOwCyIM7NTF3Uq/1157Df/4xz9w/vx5HDp0CN/+9rdRVlaGp59+WqmXQB2kxBgQGx4Gm13knrGkCldrnT3sArwiVjI8xRHYnakM7fOPxRNBwtJmkxsvDna+K6Hg5u4uLjdu3MC8efNgMpkQHx+PCRMmYO/evRg9erRSL4E6EAQBI1Kjsf9CDU6bGnBLeqzSQyLqk4vXpYb4wRHYDZMrY0M7Y8fALkhcut4EuwhEG3RIitIrPRzyEncq/X75y1/il7/8pR9GRZ4akdIe2BEFO2mWaHBScCQTpOUQJ8tD+/zjVGyQOC9Nw/aLhCAEdnUSUagaleZYw3iinAUUFNwaWlpR1eBolSTthRzoxmQ4suRnKhvQbA3dda4M7IIE19cRBb5b+zsuLEev1EEUQ7vlAgU3qQtDUpQBMcYwhUfjmpQYA5Ki9LCLwMkQrk5nYBckzjkXgzKwIwpcw1OioddqUNfcyq3FKKjJ07BBkq0DHOtcpazd8at1Co9GOQzsgsQp55odqQkqEQUevU6DUemO6dijV0L3wkLB77yzsntIEAV2ADDWGdgdC+Hzj4FdELDZRbkvz8hU9iEjCmS3SheWEM4YUPA7H6TLf6Rq9OPXOBVLAezidTMsbXaEh2kxICHwO4AThbKx8jq7WmUHQtQH7TsdBUdFrEQ6/85UNIRso3AGdkHglLN0e3hqdMDv10cU6sb1jwMAHL9aD3uI71lJwcluF4NyjR0ApMcakRCpR5tdxOchmrVjYBcETjure0ZxfR1RwBvSLxKRei0aLW04HeKNUik4lde3oLnVBp1GQGaQzRIJgoDbBsQDAA6W1Sg8GmUwsAsCJ52FEyMY2BEFPJ1Wg9sGOi4sn14MzQsLBbeTzkzX0OQohGmDL0yYlCWdfzcUHokygu9/LASdcmbsWDhBFBxyBiUAAPZdYGBHwUeawhydHpzXnEnO8+/AxZqQ7CfJwC7A1TW34nJNMwC2OiEKFpOyHBeW/RdC88JCwe1EuaOie3RacAZ2Y9JjYdBpcKOpFeecRSChhIFdgJMq6wYkRCA+knvEEgWDcZlx0Gs1qGqwyBupEwULaUu8YM3Y6XUaZGfGAXBk7UINA7sAd/hSLQBg/IA4RcdBRK4zhmnlC8u+89eVHQyRGzrOEgVrxg5oz5qH4nIIBnYB7sjlWgCQLxJEFBxuH+y4sHx8tlrhkRC57pQzW5cRF464iOCdJbpjaBIA4OMz1SHXdoiBXQATRZGBHVGQmjqiHwDg4y+q0GazKzwaItdIhROjgjhbBwATBsYjUq9FdaNFnloOFQzsAtilmibUmK3QazVBu9aBKFRlZ8YjLiIM9S1t8hs0okAn/a5Ke64GK71Og9whjqzdv76oUng0/sXALoBJJ9jo9BgYdFplB0NEbtFqBNw1zJG12306tC4sFLykYgOpF1wwmzrcEdj9m4EdBYpPnIuuJwwM/hOMKBTdPdwR2H10ulLhkRD17sqNJlyra4FOIyBbBQV7U4cnAwAOlt1AXXOrwqPxHwZ2AWyPc9H1nc5FoEQUXO4e0Q8awbFu6RLbnlCAk3ZKuSUjFhF6ncKj6bsBiREYnhKFNruIXScqlB6O3zCwC1CXrjfhck0zdBoBk51dtIkouCRGGZA7JBEA8Nej1xQeDdHNSVtwTVLRLNGDY9MBADuOlSs8Ev9hYBegpGzd+AFxiDQE/zsnolD10K2OC8vfjobOhYWC06fOnm+TVJRMePDWVADAx2eqQmY6loFdgPqPM7C7g9OwREFt2phU6DQCTpbX42xlo9LDIeqWqa4FZyobIQjtzX3VYGhyNEakRKPVJuKDz01KD8cvGNgFoFabnevriFQiLkKPu4Y5zuP3Dl5ReDRE3Ss55ViDlp0ZhwSVbV/5cLYja77lwGWFR+IfDOwC0N5z11HX3IqkKD3GD1DPWgeiUPXE5AEAHBcWS5tN4dEQdfXhSUfldt6oFIVH4n2PTegPrUbApxdv4IuKBqWH43MM7ALQzuOOtTj5t6RCqxEUHg0R9dVXRyYjJcaA62YrPvg8dKrzKDg0W23yLNFXRyUrPBrvS4kx4qsjHa/rj/svKTwa32NgF2DabHb5D/8DY9MUHg0ReYNOq8ETkxxZuw17L0IUQ2vvSgpse85Ww9JmR0ZcOEakRCs9HJ+YleM4/947eAUNLeouomBgF2BKz19HjdmKhEg9clRUmUQU6r6ZMwB6rQYHy25gn7P6kCgQ/PmwY+1n/i2pEAR1zhJNHdYPQ5Oj0NDSht9/Uqb0cHyKgV2A2bjPkSb+2q1p0Gn530OkFikxRjw+qT8AYNWHZxUeDZHDDbMV/zzhWF/32IT+Co/GdzQaAd+7ewgA4N2PL6DZqt61rowcAoiprgX/cHbH/vbtAxUeDRF52zNTh0CnEbDnbLW8ZSCRkv5y5CqsNjtuSY/B6PQYpYfjUw+NS0f/+HBcN1uxfu9FpYfjMwzsAsimTy/BZhcxOSsBw1W6zoEolPWPj8ATkzMBAK/+9QRsdq61I+XY7SL+uN/RAmSGirN1kjCtBkX3DgcArPrwDCobWhQekW8wsAsQjZY2bHC+g/jW7QOUHQwR+UzRvSMQY9ThZHk9NoZAhR4FrpJTlThd0YAogw6Pjld/YAcA07MzMC4zDmarDW/+/ZTSw/EJBnYB4rd7LuBGUysGJ0XiQVbDEqlWQqQeP7hvBACgeMdJlF03KzwiCkWiKGLVh2cAAE/mDkRsRJjCI/IPjUbAkodGQxCArYeuYtcJ9bUfYmAXAGrMVqz9+DwAYEHeMBZNEKnct28fiJxBCWiy2vD85iOwttmVHhKFmH+cqMBnV+pgDNNg7p2DlB6OX902IB7z7hoMAFi09Sgq6tU1JcsIIgC89tfPUd/ShpGp0fKG4USkXlqNgGWPj0O0QYdDl2qx+C/H2duO/MZsacOr2z8HAHznjkFIijIoPCL/K7p3OEamRqO60Yrv/u4AWlrVUyXLwE5h/zxRgW1HrkEjAG9+41ZouNMEUUjoHx+B/5k1HhoB2PTpZawsOaP0kChE/OKD07hW14L+8eF47r+GKT0cRRjDtPj1kxMQFxGGz67U4bk/HlZN5pyBnYLOVTXi+f87AgCYe+cgZGfGKToeIvKve0YmY/HXRgMAVvzzDJZ+cJqZO/Kp7Z9dk1t9vD59DML1WmUHpKCBiZFY8+0J0Os02HWiAt/7wyFV9LdjYKeQ8rpmzF3/KRpa2jBhYDx+mD9C6SERkQKeumMQFt0/EgCw6qOzKPzjYTRa2hQeFanRJ+ev44X3jgIA5t89BPeMUN++sO66fXAifjN7IvQ6Df55sgKP/7oUV240KT2sPmFgp4CzlY14/NeluHi9CRlx4Vjz7Qkw6EL3XRNRqPv/pg5B8dfHQqcR8P7Rcty/8t/Y69yUncgbPjxVgYLfformVhvuGdEPP7yPyQTJV4b3w//OzUF8RBiOXa3DtBUfY9P+S7AHaZ9JBnZ+ZLeL+L9PL+PhVXtwuaYZWYkR+L9nctEvOvQWrhJRZ7MmD8Afv3s7MuLCcbmmGd/8zT48veEAjl2pU3poFMRaWm14a+cpfGf9ATS32jB1eD+8/e0J0HI9dyeTByVge+GduG1AHBotbfjx1mN4ZPV/UHKyIuiWR3gU2K1evRpZWVkwGo3IycnB/v37b3r8li1bMHLkSBiNRowdOxY7duzwaLDBym4XUXKyAo++vRc/+tNRNFltyB2ciC3PTEFGXLjSwyOiADEpKwE7v38XZucOhFYj4J8nK/DQqj147O292LT/EmrMVqWHqBhvX3dEUcTixYuRlpaG8PBw5OXl4cwZ9RSwWNps+L9PL+PeX/4Lb+8+BwB48vaBeGf2BBjDOEPUncyECGx5Zgp+8sAoRBt0OHa1DnM3HMBXlzl+hpeuB8cUrSC6GYpu3rwZs2fPxpo1a5CTk4MVK1Zgy5YtOH36NJKTu87X7927F1/5yldQXFyMr33ta9i4cSPeeustHDp0CGPGjHHpe9bX1yM2NhZ1dXWIiQmOvexaWm04crkWu09X4a+fXcPV2mYAQKReiwV5wzD3zsF8xxSggvH3zVVqfm1qc7ayAas/Ooftn12Ttx7TCMC4zDjkDk7EbQPiMTo9BmmxRghCYP4t8dbvmy+uO2+99RaKi4uxYcMGDBo0CC+//DKOHTuGEydOwGg0+u21eVNDSys+vViDD09V4m9Hy1Hb1AoASIs1YslDozFtDJvfu6q60YLffHwB//tJWac1r0OTozBlSCImDIzHLekxyEqM9EvvWXd+39wO7HJycjBp0iSsWrUKAGC325GZmYnnnnsOP/7xj7scP3PmTJjNZvztb3+T77v99tuRnZ2NNWvWuPQ9A+kEEkURLa12mK1taGhpQ11zK26YrahsaMHV2haUXTfjTEUjvqhoQFuH+flogw6zcgbg6TsHITmm9z8apJxA+n3zNjW/NrWqqG/Bewev4G9Hy3GyvL7L16MMOmQlRSAzPgKpsUYkRxuRGKVHfIQeseFhiDLoEGXQIVyvRbheC6NO47cm6N76ffP2dUcURaSnp+MHP/gBfvjDHwIA6urqkJKSgvXr1+OJJ57w22tzhd0uwtLmuO7UN7eitrkVNY1WVDS04OqNZpRdb8Lpigacq2pExyt6aowRc+8chG/mDECkQefTMaqV2dKGv352Dds/u4ZPzl/Hl5fdhWkFDEyMRGZ8ONLiwpESbURSdPv5F23UIdKgQ6Reh/AwLQxhGhh0GrffjLnz++bW/7TVasXBgwexaNEi+T6NRoO8vDyUlpZ2+5jS0lIUFRV1ui8/Px/btm3r8ftYLBZYLBb58/r6rn/MAOD41Tq8+Odj3X6t4y+3CLHT/dLXRDgCNVF0HGMXAbsowm4XYRNF2O1Am92ONpsIq80Oa5sdFjf63CRFGXDn0ETkjU5B3qgUpr+JyG0pMUY8e89QPHvPUFytbcaeM1U4WHYDn12uw7mqRjRa2nD8aj2OX+3+72R3NAKg12kQpnXcdBoBWo0AjeD41/ExIAiOfzWCAEEQIF2KBMFxAwABAiYMjMcrD9/i/RcP31x3Lly4AJPJhLy8PPnrsbGxyMnJQWlpabeBnavXJQB4adsxHL1S1+FaI7Z/LPZw7XFed9psImx2EW329muOO9edAQkRuGtYEvJvScUdQ5M4M9RHkQYdnpg8AE9MHoC6plbsPVeN/RdrcORyLU6VN6C51YazlY04W9no1vPqtRrotAJ0GgFhWo183oXrtfjwB3f3acxuBXbV1dWw2WxISUnpdH9KSgpOnep+M12TydTt8SaTqcfvU1xcjFdffbXX8TRZbTiq4MLiKIMOMUYd4iP1SI42IDXWiMyECAztF4VRaTHoHx8esFMkRBR8MuLCMXPSAMycNAAAYG2z41KNGReqm3D1RhPK61tQ1WDB9UYrapusqG9pQ0NLK8wWG5o7dNa3i0BLqx0trd5pyJoYpffK83THF9cd6V93rk2uXpcA4HyV2WfXpmiDDjHhYUiMclx30mLDMTAxAkOTozA6PQbJ0ZwR8pXYiDDcPzYN9zv3c7fbRVyra8aFajMu1zTDVN+CyvoWVMvnXysaWtrQaGlDk9UmL6kA4EgWddMyL8ILfQUDMje7aNGiTu+26uvrkZmZ2eW44SlRWPfURPnz9veTHQhdP+zyzhOOd6VwvjPt+M5ViqZ1WgEGnQYGnRbGMA0i9Dq+EyIiRel1GgxNjsbQ5Ohej5Wm8yxtNjkT1Gqzo83uyBK12e2w2UXYRRE2u2P2QhQ7/ws4sk32jtMeABIifRfYBQpXr0sA8MP8Eahzrm/r7hrkyIA6/4XjmuTI2Djuk645YVoN9FqNYwo9TIuIMC13JwogGo2A/vER6B8f4dLxVuf5Z2lzZGPbbCJanbOCbXY77PbOM4yeciuwS0pKglarRUVFRaf7KyoqkJqa2u1jUlNT3ToeAAwGAwyG3luAxEXo8V8jU3o9jogo1Gmc0zzBttOAL6470r8VFRVIS0vrdEx2dna3z+nqdQlwbDJP9GV6nQZ6nQa9vw3rG7dW0Or1ekyYMAElJSXyfXa7HSUlJcjNze32Mbm5uZ2OB4Bdu3b1eDwREZHEF9edQYMGITU1tdMx9fX12LdvH69NFPTcnootKirCnDlzMHHiREyePBkrVqyA2WxGQUEBAGD27NnIyMhAcXExAGDBggWYOnUqli1bhgcffBCbNm3CgQMH8M4773j3lRARkSp5+7ojCAK+//3v46c//SmGDRsmtztJT0/H9OnTlXqZRF7hdmA3c+ZMVFVVYfHixTCZTMjOzsbOnTvlRaiXLl2CRtOeCJwyZQo2btyIl156CS+++CKGDRuGbdu2udzDjoiIQpsvrjs/+tGPYDab8d3vfhe1tbW48847sXPnTpd62BEFMrf72CmBvbfIn/z5+7Z69Wr84he/gMlkwrhx4/CrX/0KkydP7vVxmzZtwqxZs/DII4/ctHXQl/FcIn9S8++bml8bBR53ft+4VyyRQjZv3oyioiIsWbIEhw4dwrhx45Cfn4/KysqbPu7ixYv44Q9/iLvuustPIyUiomDBwI5IIcuXL8e8efNQUFCA0aNHY82aNYiIiMC6det6fIzNZsO3vvUtvPrqqxg8eLAfR0tERMGAgR2RAqRu+h073/fWTR8AXnvtNSQnJ2Pu3Ln+GCYREQWZgGxQTKR2nnTT37NnD959910cOXLE5e/jzjZIREQU/JixIwoCDQ0NePLJJ7F27VokJSW5/Lji4mLExsbKt5465RMRkTowY0ekAHe76Z87dw4XL17EQw89JN9ntzv2+dTpdDh9+jSGDBnS5XHubINERETBj4EdkQI6dtOXGqJK3fQLCwu7HD9y5EgcO3as030vvfQSGhoasHLlyh6DNXe2QSIiouDHwI5IIe500zcajV2aesfFxQEAm30TEZGMgR2RQtztpk9ERNQb7jxB9CVq/n1T82ujwKPm3zc1vzYKPO78vgVFxk6KPdmqgfxB+j0Lgvc8buO5RP7Ec4nIO9w5l4IisGtoaAAAVvORXzU0NCA2NlbpYXgVzyVSAs8lIu9w5VwKiqlYu92Oa9euITo6GoIgdPqa1L7h8uXLTIf7kZp/7qIooqGhAenp6apb48ZzKfCo+efOc0l9/6eBTq0/e3fOpaDI2Gk0GvTv3/+mx8TExKjqPzFYqPXnrrbsgoTnUuBS68+d55L6/k+DgRp/9q6eS+p6C0VEREQUwhjYEREREalE0Ad2BoMBS5YsYXd9P+PPXX34f6oM/tzVh/+nyuHPPkiKJ4iIiIiod0GfsSMiIiIiBwZ2RERERCrBwI6IiIhIJYI6sFu9ejWysrJgNBqRk5OD/fv3Kz2koPfvf/8bDz30ENLT0yEIArZt29bp66IoYvHixUhLS0N4eDjy8vJw5syZTsfU1NTgW9/6FmJiYhAXF4e5c+eisbHRj6+CPMHzybt4LoUunkvexXPJPUEb2G3evBlFRUVYsmQJDh06hHHjxiE/Px+VlZVKDy2omc1mjBs3DqtXr+726z//+c/xP//zP1izZg327duHyMhI5Ofno6WlRT7mW9/6Fj7//HPs2rULf/vb3/Dvf/8b3/3ud/31EsgDPJ+8j+dSaOK55H08l9wkBqnJkyeLzz77rPy5zWYT09PTxeLiYgVHpS4AxD//+c/y53a7XUxNTRV/8YtfyPfV1taKBoNB/OMf/yiKoiieOHFCBCB++umn8jF///vfRUEQxKtXr/pt7OQenk++xXMpdPBc8i2eS70Lyoyd1WrFwYMHkZeXJ9+n0WiQl5eH0tJSBUembhcuXIDJZOr0c4+NjUVOTo78cy8tLUVcXBwmTpwoH5OXlweNRoN9+/b5fczUO55P/sdzSZ14Lvkfz6WugjKwq66uhs1mQ0pKSqf7U1JSYDKZFBqV+kk/25v93E0mE5KTkzt9XafTISEhgf83AYrnk//xXFInnkv+x3Opq6AM7IiIiIioq6AM7JKSkqDValFRUdHp/oqKCqSmpio0KvWTfrY3+7mnpqZ2WSTc1taGmpoa/t8EKJ5P/sdzSZ14Lvkfz6WugjKw0+v1mDBhAkpKSuT77HY7SkpKkJubq+DI1G3QoEFITU3t9HOvr6/Hvn375J97bm4uamtrcfDgQfmYDz/8EHa7HTk5OX4fM/WO55P/8VxSJ55L/sdzqRtKV294atOmTaLBYBDXr18vnjhxQvzud78rxsXFiSaTSemhBbWGhgbx8OHD4uHDh0UA4vLly8XDhw+LZWVloiiK4ptvvinGxcWJf/nLX8SjR4+KjzzyiDho0CCxublZfo5p06aJ48ePF/ft2yfu2bNHHDZsmDhr1iylXhK5gOeT9/FcCk08l7yP55J7gjawE0VR/NWvfiUOGDBA1Ov14uTJk8VPPvlE6SEFvY8++kgE0OU2Z84cURQdpeUvv/yymJKSIhoMBvGrX/2qePr06U7Pcf36dXHWrFliVFSUGBMTIxYUFIgNDQ0KvBpyB88n7+K5FLp4LnkXzyX3CKIoiv7OEhIRERGR9wXlGjsiIiIi6oqBHREREZFKMLAjIiIiUgkGdkREREQqwcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsgtxTTz2F6dOnKz0MoqDHc4nIO3guKUun9ACoZ4Ig3PTrS5YswcqVK8HNQ4hujucSkXfwXAp83FIsgJlMJvnjzZs3Y/HixTh9+rR8X1RUFKKiopQYGlFQ4blE5B08lwIfp2IDWGpqqnyLjY2FIAid7ouKiuqS8r777rvx3HPP4fvf/z7i4+ORkpKCtWvXwmw2o6CgANHR0Rg6dCj+/ve/d/pex48fx/3334+oqCikpKTgySefRHV1tZ9fMZFv8Fwi8g6eS4GPgZ0KbdiwAUlJSdi/fz+ee+45zJ8/HzNmzMCUKVNw6NAh3HfffXjyySfR1NQEAKitrcV//dd/Yfz48Thw4AB27tyJiooKPP744wq/EiJl8Vwi8g6eS34kUlD47W9/K8bGxna5f86cOeIjjzwifz516lTxzjvvlD9va2sTIyMjxSeffFK+r7y8XAQglpaWiqIoiq+//rp43333dXrey5cviwDE06dPe/eFECmM5xKRd/BcCkwsnlChW2+9Vf5Yq9UiMTERY8eOle9LSUkBAFRWVgIAPvvsM3z00Ufdros4d+4chg8f7uMREwUmnktE3sFzyX8Y2KlQWFhYp88FQeh0n1TVZLfbAQCNjY146KGH8NZbb3V5rrS0NB+OlCiw8Vwi8g6eS/7DwI5w22234U9/+hOysrKg0/FXgshTPJeIvIPnkudYPEF49tlnUVNTg1mzZuHTTz/FuXPn8MEHH6CgoAA2m03p4REFDZ5LRN7Bc8lzDOwI6enp+M9//gObzYb77rsPY8eOxfe//33ExcVBo+GvCJGreC4ReQfPJc+xQTERERGRSjDsJSIiIlIJBnZEREREKsHAjoiIiEglGNgRERERqQQDOyIiIiKVYGBHREREpBIM7IiIiIhUgoEdERERkUowsCMiIiJSCQZ2RERERCrBwI6IiIhIJRjYEREREanE/w9Pt5FfNAnmUwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "model.initial_values = (initialState, t[0])\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "solution = model.integrate(t[1::])\n", + "\n", + "model.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "4dd6e250", + "metadata": {}, + "source": [ + "We could solve the ODEs above using the Jacobian as well. Unfortunately, it does not help because the number of times the Jacobian was evaluated was zero, as expected given that our set of equations are not stiff." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "7a7a568f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "#TODO what does this show?\n", + "%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "91b7f9d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "\n", + "%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "3403884c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + ] + } + ], + "source": [ + "\n", + "%timeit solution3, output3 = model.integrate(t, full_output=True)" + ] + }, + { + "cell_type": "markdown", + "id": "b6b9ee47", + "metadata": {}, + "source": [ + "It is important to note that we return our Jacobian as a dense square matrix. Hence, the two argument (mu,ml) for the ODE solver was set to `None` to let it know the output explicitly." + ] + }, + { + "cell_type": "markdown", + "id": "5ca18fa3", + "metadata": {}, + "source": [ + "## Solving the forward sensitivity equation\n", + "\n", + "The sensitivity equations are also solved as an initial value problem. Let us redefine the model in the standard SIR order and we solve it with the sensitivity all set at zero, i.e. we do not wish to infer the initial value of the states." + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "87173626", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['S', 'I', 'R']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=odeList)\n", + "\n", + "initialState = [1, 1.27e-6, 0]\n", + "\n", + "paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]\n", + "\n", + "model.parameters = paramEval\n", + "\n", + "solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "8b63ba62", + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "{\n", + " \"tags\": [\n", + " \"hide-input\",\n", + " ]\n", + "}\n", + "f,axarr = plt.subplots(3,3);\n", + "\n", + "f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')\n", + "\n", + "axarr[0,0].plot(t, solution[:,0])\n", + "\n", + "axarr[0,0].set_title('S')\n", + "\n", + "axarr[0,1].plot(t, solution[:,1])\n", + "\n", + "axarr[0,1].set_title('I')\n", + "\n", + "axarr[0,2].plot(t, solution[:,2]);\n", + "\n", + "axarr[0,2].set_title('R')\n", + "\n", + "axarr[1,0].plot(t, solution[:,3])\n", + "\n", + "axarr[1,0].set_title(r'state S parameter $beta$')\n", + "\n", + "axarr[2,0].plot(t, solution[:,4])\n", + "\n", + "axarr[2,0].set_title(r'state S parameter $gamma$')\n", + "\n", + "axarr[1,1].plot(t, solution[:,5])\n", + "\n", + "axarr[1,1].set_title(r'state I parameter $beta$')\n", + "\n", + "axarr[2,1].plot(t, solution[:,6])\n", + "\n", + "axarr[2,1].set_title(r'state I parameter $gamma$')\n", + "\n", + "axarr[1,2].plot(t, solution[:,7])\n", + "\n", + "axarr[1,2].set_title(r'state R parameter $beta$')\n", + "\n", + "axarr[2,2].plot(t, solution[:,8])\n", + "\n", + "axarr[2,2].set_title(r'state R parameter $gamma$')\n", + "\n", + "plt.tight_layout()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2f64d869", + "metadata": {}, + "source": [ + "#TODO links\n", + "This concludes the introductory example and we will be moving on to look at parameter estimation next in {doc}`estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in {doc}`transition`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/doc/pygom-doc/notebooks/stochastic.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/stochastic.ipynb similarity index 100% rename from doc/doc/pygom-doc/notebooks/stochastic.ipynb rename to docs/pygom-doc/_build/html/_sources/notebooks/stochastic.ipynb diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb new file mode 100644 index 00000000..dd1568bf --- /dev/null +++ b/docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb @@ -0,0 +1,453 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transition Object\n", + "{download}`this notebook <./transition.ipynb>`\n", + "\n", + "\n", + "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", + "\n", + "\n", + "All transitions that get fed into the ODE system need to be defined as a transition object, `Transition`. It takes a total of four input arguments:\n", + "\n", + "1. The origin state\n", + "2. Equation that describe the process\n", + "3. The type of transition\n", + "4. The destination state\n", + "\n", + "where the first three are mandatory. To demonstrate, we go back to the SIR model defined previously in the section {doc}`sir`. Recall that the set of ODEs are\n", + "\n", + "$$\\begin{aligned}\n", + " \\frac{d S}{d t} &= - beta SI \\\\\n", + "\\frac{d I}{d t} &= beta SI - \\gamma I \\\\\n", + "\\frac{d R}{d t} &= \\gamma I.\n", + "\\end{aligned}$$\n", + "\n", + "We can define the set of ODEs, as seen previously, via" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68d41d64", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType, common_models\n", + "\n", + "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", + "\n", + "ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)\n", + "\n", + "ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)" + ] + }, + { + "cell_type": "markdown", + "id": "d393a33a", + "metadata": {}, + "source": [ + "\n", + "Note that we need to state explicitly the type of equation we are\n", + "inputting, which is simply of type **ODE** in this case. We can confirm\n", + "this has been entered correctly by putting it into `DeterministicOde`," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b0801dd", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde\n", + "\n", + "stateList = ['S', 'I', 'R']\n", + "\n", + "paramList = ['beta', 'gamma']\n", + "\n", + "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])" + ] + }, + { + "cell_type": "markdown", + "id": "6e764826", + "metadata": {}, + "source": [ + "\n", + "and then checking it.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5782a96f", + "metadata": {}, + "outputs": [], + "source": [ + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "c693cbc7", + "metadata": {}, + "source": [ + "Now we are going to show the different ways of defining the same set of\n", + "ODEs.\n" + ] + }, + { + "cell_type": "markdown", + "id": "fa631d9f", + "metadata": {}, + "source": [ + "(transition:defining-the-equations)=\n", + "## Defining the equations\n", + "\n", + "We first recognize that the set of ODEs defining the SIR model are the result of\n", + "two transitions,\n", + "\n", + "$$\\begin{aligned}\n", + "S \\rightarrow I &= \\beta SI \\\\\n", + "I \\rightarrow R &= \\gamma I\n", + "\\end{aligned}$$\n", + "\n", + "where $S \\rightarrow I$ denotes a transition from state $S$ to state\n", + "$I$. Therefore, we can define our model by these two transitions,\n", + "but they need to be passed as the `transition`\n", + "argument instead of the `ode` argument of `DeterministicOde` or `SimulateOde`.\n", + "\n", + "```{note}\n", + "We are initializing the model using the `SimulateOde` class, rather than `DeterministicOde`, because the stochastic implementation has more available operations on transitions.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6966fc5e", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SimulateOde\n", + "\n", + "t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)\n", + "\n", + "t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", + "\n", + "modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])\n", + "\n", + "modelTrans.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "b896d5c9", + "metadata": {}, + "source": [ + "\n", + "We can see that the resulting ODE is exactly the same, as expected. The\n", + "transition matrix that defines this process can be visualized\n", + "using graphviz. Because only certain renderers permit the use of sub and\n", + "superscript, operators such as $**$ are left as they are in the\n", + "equation." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1e17eb7c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, I*S*beta, 0],\n", + "[0, 0, I*gamma],\n", + "[0, 0, 0]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelTrans.get_transition_matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "570ceed5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nI\n\nI\n\n\n\nS->I\n\n\nβ*S*I\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nγ*I\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "# TODO why are two images produced? issue #75\n", + "modelTrans.get_transition_graph(show=False)" + ] + }, + { + "cell_type": "markdown", + "id": "5d982b87", + "metadata": {}, + "source": [ + "```{warning}\n", + "The execution will error if the incorrect `TransitionType` is used against the wrong argument.\n", + "\n", + "`modelTrans = DeterministicOde(stateList, paramList, ode=[t1, t2])`\n", + "\n", + "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde` is expecting a `TransitionType.ODE` argument.\n", + "\n", + "Similarly `DeterministicOde(stateList, paramList, transition=[ode1, ode2, ode3])` would fail.\n", + "\n", + "This therefore forces us to construct our model carefully.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "d590f4d5", + "metadata": {}, + "source": [ + "The third option is to reframe the system as a set of birth processes, using `transition_type=TransitionType.B`. For this simple example, this formulation takes a similar form to defining using ODE equations.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "9f24cb0a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)\n", + "\n", + "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", + "\n", + "birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)\n", + "\n", + "modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])\n", + "\n", + "modelBirth.get_ode_eqn()\n" + ] + }, + { + "cell_type": "markdown", + "id": "f1d61012", + "metadata": {}, + "source": [ + "Alternatively, we can use the negative of the equation to configure the ODEs to represent death processes. Since the death process is the removal of a flow, we take the negative of the birth process alongside using `transition_type=TransitionType.D`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "9a3b3758", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -I*S*beta],\n", + "[I*S*beta - I*gamma],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)\n", + "\n", + "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", + "\n", + "death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)\n", + "\n", + "modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])\n", + "\n", + "modelBD.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "1c8d48b8", + "metadata": {}, + "source": [ + "\n", + "We can see that all four approaches have yielded the same set of ODEs at the end." + ] + }, + { + "cell_type": "markdown", + "id": "23a105af", + "metadata": {}, + "source": [ + "\n", + "## Model Addition\n", + "\n", + "Because we allow the separation of transitions between states and birth/death processes, the birth/death processes can be added later on. The following example takes the model that was defined using transitions (`modelTrans`) and includes a birth process to the $S$ state, and death processes to the $S$ and $I$ states." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "3a6a15ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}B - I S \\beta - S \\mu\\\\I S \\beta - I \\gamma - I \\mu\\\\I \\gamma\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ B - I*S*beta - S*mu],\n", + "[I*S*beta - I*gamma - I*mu],\n", + "[ I*gamma]])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "modelBD2 = modelTrans\n", + "\n", + "modelBD2.param_list = paramList + ['mu', 'B']\n", + "\n", + "birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", + " Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), \n", + " Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)\n", + " ]\n", + "\n", + "modelBD2.birth_death_list = birthDeathList\n", + "\n", + "modelBD2.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "076bdc12", + "metadata": {}, + "source": [ + "\n", + "This demonstrates that we can approach our in stages. Start off with a standard closed system using `TransitionType.T`, and then extend it with additional flows that interact with the populations' surrounding environments using `TransitionType.B` or `TransitionType.D`." + ] + }, + { + "cell_type": "markdown", + "id": "ec63c1e1", + "metadata": {}, + "source": [ + "## Transition type summary\n", + "\n", + "In summary, there are four different types of transitions allowed. These are B, D, ODE and T, which are defined in an enum class also located in `transition`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ce5787f8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TransitionType.B = Birth process\n", + "TransitionType.D = Death process\n", + "TransitionType.T = Between states\n", + "TransitionType.ODE = ODE _equation\n" + ] + } + ], + "source": [ + "from pygom import transition\n", + "\n", + "for i in transition.TransitionType: \n", + " print(str(i) + \" = \" + i.value)\n" + ] + }, + { + "cell_type": "markdown", + "id": "89607b7d", + "metadata": {}, + "source": [ + "Each birth process is added to the origin state, while each death\n", + "process is deducted from the origin state (alternatively added to the state after\n", + "multiplying the flow with a negative sign). An ODE type is also added to the state, but we forbid the number of input ODEs to be greater than the number of states inputted. These strict definitions should help us to improve the bookeeping of states and flows when we have models of greater complexity." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollBD.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollBD.ipynb similarity index 100% rename from doc/doc/pygom-doc/mdconvert/unroll/unrollBD.ipynb rename to docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollBD.ipynb diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollHard.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollHard.ipynb similarity index 100% rename from doc/doc/pygom-doc/mdconvert/unroll/unrollHard.ipynb rename to docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollHard.ipynb diff --git a/doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollSimple.ipynb similarity index 100% rename from doc/doc/pygom-doc/mdconvert/unroll/unrollSimple.ipynb rename to docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollSimple.ipynb diff --git a/docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css new file mode 100644 index 00000000..3225661c --- /dev/null +++ b/docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js b/docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..8549469d --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,134 @@ +/* + * _sphinx_javascript_frameworks_compat.js + * ~~~~~~~~~~ + * + * Compatability shim for jQuery and underscores.js. + * + * WILL BE REMOVED IN Sphinx 6.0 + * xref RemovedInSphinx60Warning + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/pygom-doc/_build/html/_static/basic.css b/docs/pygom-doc/_build/html/_static/basic.css new file mode 100644 index 00000000..5685b52e --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/basic.css @@ -0,0 +1,928 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +/* Docutils 0.17 and older (footnotes & citations) */ +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +/* Docutils 0.18+ (footnotes & citations) */ +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +/* Footnotes & citations ends */ + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/check-solid.svg b/docs/pygom-doc/_build/html/_static/check-solid.svg new file mode 100644 index 00000000..92fad4b5 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/pygom-doc/_build/html/_static/clipboard.min.js b/docs/pygom-doc/_build/html/_static/clipboard.min.js new file mode 100644 index 00000000..54b3c463 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/docs/pygom-doc/_build/html/_static/copybutton.css b/docs/pygom-doc/_build/html/_static/copybutton.css new file mode 100644 index 00000000..f1916ec7 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/docs/pygom-doc/_build/html/_static/copybutton.js b/docs/pygom-doc/_build/html/_static/copybutton.js new file mode 100644 index 00000000..2ea7ff3e --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/copybutton_funcs.js b/docs/pygom-doc/_build/html/_static/copybutton_funcs.js new file mode 100644 index 00000000..dbe1aaad --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css new file mode 100644 index 00000000..3225661c --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/docs/pygom-doc/_build/html/_static/design-tabs.js b/docs/pygom-doc/_build/html/_static/design-tabs.js new file mode 100644 index 00000000..36b38cf0 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/design-tabs.js @@ -0,0 +1,27 @@ +var sd_labels_by_text = {}; + +function ready() { + const li = document.getElementsByClassName("sd-tab-label"); + for (const label of li) { + syncId = label.getAttribute("data-sync-id"); + if (syncId) { + label.onclick = onLabelClick; + if (!sd_labels_by_text[syncId]) { + sd_labels_by_text[syncId] = []; + } + sd_labels_by_text[syncId].push(label); + } + } +} + +function onLabelClick() { + // Activate other inputs with the same sync id. + syncId = this.getAttribute("data-sync-id"); + for (label of sd_labels_by_text[syncId]) { + if (label === this) continue; + label.previousElementSibling.checked = true; + } + window.localStorage.setItem("sphinx-design-last-tab", syncId); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/pygom-doc/_build/html/_static/doctools.js b/docs/pygom-doc/_build/html/_static/doctools.js new file mode 100644 index 00000000..c3db08d1 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/doctools.js @@ -0,0 +1,264 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.highlightSearchWords(); + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords: () => { + const highlight = + new URLSearchParams(window.location.search).get("highlight") || ""; + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + const url = new URL(window.location); + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + const blacklistedElements = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", + ]); + document.addEventListener("keydown", (event) => { + if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements + if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + case "Escape": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.hideSearchWords(); + event.preventDefault(); + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/pygom-doc/_build/html/_static/documentation_options.js b/docs/pygom-doc/_build/html/_static/documentation_options.js new file mode 100644 index 00000000..30637825 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: true, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: false, +}; \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/file.png b/docs/pygom-doc/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/html/_static/images/logo_binder.svg b/docs/pygom-doc/_build/html/_static/images/logo_binder.svg new file mode 100644 index 00000000..45fecf75 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/docs/pygom-doc/_build/html/_static/images/logo_colab.png b/docs/pygom-doc/_build/html/_static/images/logo_colab.png new file mode 100644 index 0000000000000000000000000000000000000000..b7560ec216b2d1b6f77855525fe966c741833428 GIT binary patch literal 7601 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 diff --git a/docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg b/docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg new file mode 100644 index 00000000..60cfe9f2 --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/docs/pygom-doc/_build/html/_static/jquery-3.6.0.js b/docs/pygom-doc/_build/html/_static/jquery-3.6.0.js new file mode 100644 index 00000000..fc6c299b --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/jquery-3.6.0.js @@ -0,0 +1,10881 @@ +/*! + * jQuery JavaScript Library v3.6.0 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2021-03-02T17:08Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.6.0", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.6 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2021-02-16 + */ +( function( window ) { +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ( {} ).hasOwnProperty, + arr = [], + pop = arr.pop, + pushNative = arr.push, + push = arr.push, + slice = arr.slice, + + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[ i ] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rhtml = /HTML$/i, + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android<4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + + // Can't trust NodeList.length + while ( ( target[ j++ ] = els[ i++ ] ) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && + + // Support: IE 8 only + // Exclude object elements + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split( "|" ), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[ i ] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( ( cur = cur.nextSibling ) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return ( name === "input" || name === "button" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert( function( el ) { + el.className = "i"; + return !el.getAttribute( "className" ); + } ); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter[ "ID" ] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find[ "ID" ] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find[ "TAG" ] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll( "[name=d]" ).length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: Opera 10 - 11 only + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); + } + + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { + + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + } ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + } : + function( a, b ) { + if ( b ) { + while ( ( b = b.parentNode ) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( ( cur = cur.parentNode ) ) { + ap.unshift( cur ); + } + cur = b; + while ( ( cur = cur.parentNode ) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[ i ] === bp[ i ] ) { + i++; + } + + return i ? + + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[ i ], bp[ i ] ) : + + // Otherwise nodes in our document sort first + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + /* eslint-disable max-len */ + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + /* eslint-enable max-len */ + + }; + }, + + "CHILD": function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + ( outerCache[ node.uniqueID ] = {} ); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + "not": markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element (issue #299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + "has": markFunction( function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + } ), + + "contains": markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); + }, + + "selected": function( elem ) { + + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos[ "empty" ]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo( function() { + return [ 0 ]; + } ), + + "last": createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + "even": createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "odd": createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? + argument + length : + argument > length ? + length : + argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rcombinators.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrim, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = uniqueCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert( function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + } ); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert( function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + } ); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + ( val = elem.getAttributeNode( name ) ) && val.specified ? + val.value : + null; + } + } ); +} + +return Sizzle; + +} )( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + // Support: Chrome 86+ + // In Chrome, if an element having a focusout handler is blurred by + // clicking outside of it, it invokes the handler synchronously. If + // that handler calls `.remove()` on the element, the data is cleared, + // leaving `result` undefined. We need to guard against this. + return result && result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + // Suppress native focus or blur as it's already being fired + // in leverageNative. + _default: function() { + return true; + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is display: block + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " +{% endmacro %} diff --git a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js new file mode 100644 index 00000000..766173ab --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>w,afterRead:()=>b,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>m,beforeWrite:()=>A,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>Dt,createPopperBase:()=>Lt,createPopperLite:()=>$t,detectOverflow:()=>mt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>T,offset:()=>wt,placements:()=>g,popper:()=>d,popperGenerator:()=>kt,popperOffsets:()=>At,preventOverflow:()=>Et,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>u,write:()=>E});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",u="viewport",d="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),g=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),m="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",A="beforeWrite",E="write",C="afterWrite",T=[m,_,b,v,y,w,A,E,C];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];L(s)&&O(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function S(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function M(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!M()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,u=n.height/o;return{width:h,height:u,top:c,right:l+h,bottom:c+u,left:l,x:l,y:c}}function W(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function F(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function B(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function q(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function R(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function V(t){return L(t)&&"fixed"!==B(t).position?t.offsetParent:null}function K(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===B(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===B(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&L(t)&&"fixed"===B(t).position)return null;var i=R(t);for(D(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=B(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return I(t,N(e,i))}function Y(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,u=r.modifiersData.popperOffsets,d=S(r.placement),f=Q(d),p=[o,s].indexOf(d)>=0?"height":"width";if(h&&u){var g=function(t,e){return Y("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),m=W(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-u[f]-r.rects.popper[p],y=u[f]-r.rects.reference[f],w=K(h),A=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,E=v/2-y/2,C=g[_],T=A-m[p]-g[b],O=A/2-m[p]/2+E,x=X(C,O,T),k=f;r.modifiersData[l]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&F(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=t.variation,u=t.offsets,d=t.position,f=t.gpuAcceleration,p=t.adaptive,g=t.roundOffsets,m=t.isFixed,_=u.x,b=void 0===_?0:_,v=u.y,y=void 0===v?0:v,w="function"==typeof g?g({x:b,y}):{x:b,y};b=w.x,y=w.y;var A=u.hasOwnProperty("x"),E=u.hasOwnProperty("y"),C=o,T=i,O=window;if(p){var k=K(r),L="clientHeight",D="clientWidth";k===x(r)&&"static"!==B(k=q(r)).position&&"absolute"===d&&(L="scrollHeight",D="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(T=n,y-=(m&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(C=s,b-=(m&&k===O&&O.visualViewport?O.visualViewport.width:k[D])-a.width,b*=f?1:-1)}var $,S=Object.assign({position:d},p&&Z),I=!0===g?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},S,(($={})[T]=E?"0":"",$[C]=A?"0":"",$.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",$)):Object.assign({},S,((e={})[T]=E?y+"px":"",e[C]=A?b+"px":"",e.transform="",e))}const et={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:S(e.placement),variation:J(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,tt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,tt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var it={passive:!0};const nt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return H(q(t)).left+lt(t).scrollLeft}function ht(t){var e=B(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:ut(R(t))}function dt(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(dt(R(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===u?ft(function(t,e){var i=x(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=M();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ft(function(t){var e,i=q(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===B(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,r=t.reference,a=t.element,h=t.placement,u=h?S(h):null,d=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(u){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var g=u?Q(u):null;if(null!=g){var m="y"===g?"height":"width";switch(d){case l:e[g]=e[g]-(r[m]/2-a[m]/2);break;case c:e[g]=e[g]+(r[m]/2-a[m]/2)}}return e}function mt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,g=o.boundary,m=void 0===g?h:g,_=o.rootBoundary,b=void 0===_?u:_,v=o.elementContext,y=void 0===v?d:v,w=o.altBoundary,A=void 0!==w&&w,E=o.padding,C=void 0===E?0:E,T=Y("number"!=typeof C?C:U(C,a)),x=y===d?f:d,D=t.rects.popper,$=t.elements[A?x:y],S=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=dt(R(t)),i=["absolute","fixed"].indexOf(B(t).position)>=0&&L(t)?K(t):t;return k(i)?e.filter((function(t){return k(t)&&F(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(k($)?$:$.contextElement||q(t.elements.popper),m,b,p),P=H(t.elements.reference),j=gt({reference:P,element:D,strategy:"absolute",placement:l}),M=ft(Object.assign({},D,j)),W=y===d?M:P,z={top:S.top-W.top+T.top,bottom:W.bottom-S.bottom+T.bottom,left:S.left-W.left+T.left,right:W.right-S.right+T.right},V=t.modifiersData.offset;if(y===d&&V){var Q=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=Q[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var u=c.mainAxis,d=void 0===u||u,f=c.altAxis,m=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,A=c.flipVariations,E=void 0===A||A,C=c.allowedAutoPlacements,T=e.options.placement,O=S(T),x=_||(O!==T&&E?function(t){if(S(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(T):[ot(T)]),k=[T].concat(x).reduce((function(t,i){return t.concat(S(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,u=J(n),d=u?l?p:p.filter((function(t){return J(t)===u})):a,f=d.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=d);var m=f.reduce((function(e,i){return e[i]=mt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[S(i)],e}),{});return Object.keys(m).sort((function(t,e){return m[t]-m[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:E,allowedAutoPlacements:C}):i)}),[]),L=e.rects.reference,D=e.rects.popper,$=new Map,I=!0,N=k[0],P=0;P=0,F=W?"width":"height",B=mt(e,{placement:j,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=W?H?s:o:H?n:i;L[F]>D[F]&&(z=ot(z));var q=ot(z),R=[];if(d&&R.push(B[M]<=0),m&&R.push(B[z]<=0,B[q]<=0),R.every((function(t){return t}))){N=j,I=!1;break}$.set(j,R)}if(I)for(var V=function(t){var e=k.find((function(e){var i=$.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},K=E?3:1;K>0&&"break"!==V(K);K--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function vt(t){return[i,s,n,o].some((function(e){return t[e]>=0}))}const yt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=mt(e,{elementContext:"reference"}),a=mt(e,{altBoundary:!0}),l=bt(r,n),c=bt(a,s,o),h=vt(l),u=vt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:u},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":u})}},wt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,a=n.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,n){return t[n]=function(t,e,n){var r=S(t),a=[o,i].indexOf(r)>=0?-1:1,l="function"==typeof n?n(Object.assign({},e,{placement:t})):n,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[o,s].indexOf(r)>=0?{x:h,y:c}:{x:c,y:h}}(n,e.rects,l),t}),{}),h=c[e.placement],u=h.x,d=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=d),e.modifiersData[r]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Et={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,r=t.options,a=t.name,c=r.mainAxis,h=void 0===c||c,u=r.altAxis,d=void 0!==u&&u,f=r.boundary,p=r.rootBoundary,g=r.altBoundary,m=r.padding,_=r.tether,b=void 0===_||_,v=r.tetherOffset,y=void 0===v?0:v,w=mt(e,{boundary:f,rootBoundary:p,padding:m,altBoundary:g}),A=S(e.placement),E=J(e.placement),C=!E,T=Q(A),O="x"===T?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,D="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,$="number"==typeof D?{mainAxis:D,altAxis:D}:Object.assign({mainAxis:0,altAxis:0},D),P=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,j={x:0,y:0};if(x){if(h){var M,H="y"===T?i:o,F="y"===T?n:s,B="y"===T?"height":"width",z=x[T],q=z+w[H],R=z-w[F],V=b?-L[B]/2:0,Y=E===l?k[B]:L[B],U=E===l?-L[B]:-k[B],G=e.elements.arrow,Z=b&&G?W(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[H],it=tt[F],nt=X(0,k[B],Z[B]),st=C?k[B]/2-V-nt-et-$.mainAxis:Y-nt-et-$.mainAxis,ot=C?-k[B]/2+V+nt+it+$.mainAxis:U+nt+it+$.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===T?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(M=null==P?void 0:P[T])?M:0,ct=z+ot-lt,ht=X(b?N(q,z+st-lt-at):q,z,b?I(R,ct):R);x[T]=ht,j[T]=ht-z}if(d){var ut,dt="x"===T?i:o,ft="x"===T?n:s,pt=x[O],gt="y"===O?"height":"width",_t=pt+w[dt],bt=pt-w[ft],vt=-1!==[i,o].indexOf(A),yt=null!=(ut=null==P?void 0:P[O])?ut:0,wt=vt?_t:pt-k[gt]-L[gt]-yt+$.altAxis,At=vt?pt+k[gt]+L[gt]-yt-$.altAxis:bt,Et=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,At):X(b?wt:_t,pt,b?At:bt);x[O]=Et,j[O]=Et-pt}e.modifiersData[a]=j}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=L(e),r=L(e)&&function(t){var e=t.getBoundingClientRect(),i=P(e.width)/t.offsetWidth||1,n=P(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==O(e)||ht(a))&&(c=(n=e)!==x(n)&&L(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:lt(n)),L(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ct(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Tt(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Ot={placement:"bottom",modifiers:[],strategy:"absolute"};function xt(){for(var t=arguments.length,e=new Array(t),i=0;i{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},Nt=t=>{const e=It(t);return e&&document.querySelector(e)?e:null},Pt=t=>{const e=It(t);return e?document.querySelector(e):null},jt=t=>{t.dispatchEvent(new Event(St))},Mt=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Mt(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,Wt=t=>{if(!Mt(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Ft=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),Bt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?Bt(t.parentNode):null},zt=()=>{},qt=t=>{t.offsetHeight},Rt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Vt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Rt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Vt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Vt)t()})),Vt.push(e)):e()},Xt=t=>{"function"==typeof t&&t()},Yt=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(St,o),Xt(t))};e.addEventListener(St,o),setTimeout((()=>{s||jt(e)}),n)},Ut=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Gt=/[^.]*(?=\..*)\.|.*/,Jt=/\..*/,Zt=/::\d+$/,te={};let ee=1;const ie={mouseenter:"mouseover",mouseleave:"mouseout"},ne=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function se(t,e){return e&&`${e}::${ee++}`||t.uidEvent||ee++}function oe(t){const e=se(t);return t.uidEvent=e,te[e]=te[e]||{},te[e]}function re(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function ae(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return ne.has(o)||(o=t),[n,s,o]}function le(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=ae(e,i,n);if(e in ie){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=oe(t),c=l[a]||(l[a]={}),h=re(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const u=se(r,e.replace(Gt,"")),d=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return fe(s,{delegateTarget:r}),n.oneOff&&de.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return fe(n,{delegateTarget:t}),i.oneOff&&de.off(t,n.type,e),e.apply(t,[n])}}(t,r);d.delegationSelector=o?i:null,d.callable=r,d.oneOff=s,d.uidEvent=u,c[u]=d,t.addEventListener(a,d,o)}function ce(t,e,i,n,s){const o=re(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function he(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];ce(t,e,i,n.callable,n.delegationSelector)}}function ue(t){return t=t.replace(Jt,""),ie[t]||t}const de={on(t,e,i,n){le(t,e,i,n,!1)},one(t,e,i,n){le(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=ae(e,i,n),a=r!==e,l=oe(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))he(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(Zt,"");if(!a||e.includes(n)){const e=c[i];ce(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;ce(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Rt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=fe(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function fe(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const pe=new Map,ge={set(t,e,i){pe.has(t)||pe.set(t,new Map);const n=pe.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>pe.has(t)&&pe.get(t).get(e)||null,remove(t,e){if(!pe.has(t))return;const i=pe.get(t);i.delete(e),0===i.size&&pe.delete(t)}};function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function _e(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const be={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${_e(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${_e(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${_e(e)}`))};class ve{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Mt(e)?be.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Mt(e)?be.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],o=t[n],r=Mt(o)?"element":null==(i=o)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class ye extends ve{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),ge.set(this._element,this.constructor.DATA_KEY,this))}dispose(){ge.remove(this._element,this.constructor.DATA_KEY),de.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Yt(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return ge.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const we=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;de.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Ft(this))return;const s=Pt(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Ee=`close${Ae}`,Ce=`closed${Ae}`;class Te extends ye{static get NAME(){return"alert"}close(){if(de.trigger(this._element,Ee).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),de.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Te.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}we(Te,"close"),Qt(Te);const Oe='[data-bs-toggle="button"]';class xe extends ye{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=xe.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}de.on(document,"click.bs.button.data-api",Oe,(t=>{t.preventDefault();const e=t.target.closest(Oe);xe.getOrCreateInstance(e).toggle()})),Qt(xe);const ke={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Ft(t)&&Wt(t)))}},Le=".bs.swipe",De=`touchstart${Le}`,$e=`touchmove${Le}`,Se=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},je={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Me extends ve{constructor(t,e){super(),this._element=t,t&&Me.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return je}static get NAME(){return"swipe"}dispose(){de.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(de.on(this._element,Ie,(t=>this._start(t))),de.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(de.on(this._element,De,(t=>this._start(t))),de.on(this._element,$e,(t=>this._move(t))),de.on(this._element,Se,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const He=".bs.carousel",We=".data-api",Fe="next",Be="prev",ze="left",qe="right",Re=`slide${He}`,Ve=`slid${He}`,Ke=`keydown${He}`,Qe=`mouseenter${He}`,Xe=`mouseleave${He}`,Ye=`dragstart${He}`,Ue=`load${He}${We}`,Ge=`click${He}${We}`,Je="carousel",Ze="active",ti=".active",ei=".carousel-item",ii=ti+ei,ni={ArrowLeft:qe,ArrowRight:ze},si={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},oi={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class ri extends ye{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=ke.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Je&&this.cycle()}static get Default(){return si}static get DefaultType(){return oi}static get NAME(){return"carousel"}next(){this._slide(Fe)}nextWhenVisible(){!document.hidden&&Wt(this._element)&&this.next()}prev(){this._slide(Be)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?de.one(this._element,Ve,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void de.one(this._element,Ve,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?Fe:Be;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&de.on(this._element,Ke,(t=>this._keydown(t))),"hover"===this._config.pause&&(de.on(this._element,Qe,(()=>this.pause())),de.on(this._element,Xe,(()=>this._maybeEnableCycle()))),this._config.touch&&Me.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of ke.find(".carousel-item img",this._element))de.on(t,Ye,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ze)),rightCallback:()=>this._slide(this._directionToOrder(qe)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Me(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ni[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=ke.findOne(ti,this._indicatorsElement);e.classList.remove(Ze),e.removeAttribute("aria-current");const i=ke.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Ze),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===Fe,s=e||Ut(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>de.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Re).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Ze),i.classList.remove(Ze,c,l),this._isSliding=!1,r(Ve)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return ke.findOne(ii,this._element)}_getItems(){return ke.find(ei,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===ze?Be:Fe:t===ze?Fe:Be}_orderToDirection(t){return Kt()?t===Be?ze:qe:t===Be?qe:ze}static jQueryInterface(t){return this.each((function(){const e=ri.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}de.on(document,Ge,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=Pt(this);if(!e||!e.classList.contains(Je))return;t.preventDefault();const i=ri.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===be.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),de.on(window,Ue,(()=>{const t=ke.find('[data-bs-ride="carousel"]');for(const e of t)ri.getOrCreateInstance(e)})),Qt(ri);const ai=".bs.collapse",li=`show${ai}`,ci=`shown${ai}`,hi=`hide${ai}`,ui=`hidden${ai}`,di=`click${ai}.data-api`,fi="show",pi="collapse",gi="collapsing",mi=`:scope .${pi} .${pi}`,_i='[data-bs-toggle="collapse"]',bi={parent:null,toggle:!0},vi={parent:"(null|element)",toggle:"boolean"};class yi extends ye{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=ke.find(_i);for(const t of i){const e=Nt(t),i=ke.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return bi}static get DefaultType(){return vi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>yi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(de.trigger(this._element,li).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(pi),this._element.classList.add(gi),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gi),this._element.classList.add(pi,fi),this._element.style[e]="",de.trigger(this._element,ci)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(de.trigger(this._element,hi).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(gi),this._element.classList.remove(pi,fi);for(const t of this._triggerArray){const e=Pt(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gi),this._element.classList.add(pi),de.trigger(this._element,ui)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(fi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(_i);for(const e of t){const t=Pt(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=ke.find(mi,this._config.parent);return ke.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=yi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}de.on(document,di,_i,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=Nt(this),i=ke.find(e);for(const t of i)yi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(yi);const wi="dropdown",Ai=".bs.dropdown",Ei=".data-api",Ci="ArrowUp",Ti="ArrowDown",Oi=`hide${Ai}`,xi=`hidden${Ai}`,ki=`show${Ai}`,Li=`shown${Ai}`,Di=`click${Ai}${Ei}`,$i=`keydown${Ai}${Ei}`,Si=`keyup${Ai}${Ei}`,Ii="show",Ni='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Pi=`${Ni}.${Ii}`,ji=".dropdown-menu",Mi=Kt()?"top-end":"top-start",Hi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",Fi=Kt()?"bottom-start":"bottom-end",Bi=Kt()?"left-start":"right-start",zi=Kt()?"right-start":"left-start",qi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Vi extends ye{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=ke.next(this._element,ji)[0]||ke.prev(this._element,ji)[0]||ke.findOne(ji,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return qi}static get DefaultType(){return Ri}static get NAME(){return wi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Ft(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!de.trigger(this._element,ki,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))de.on(t,"mouseover",zt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Ii),this._element.classList.add(Ii),de.trigger(this._element,Li,t)}}hide(){if(Ft(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!de.trigger(this._element,Oi,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))de.off(t,"mouseover",zt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Ii),this._element.classList.remove(Ii),this._element.setAttribute("aria-expanded","false"),be.removeDataAttribute(this._menu,"popper"),de.trigger(this._element,xi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Mt(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${wi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Mt(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Ii)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Bi;if(t.classList.contains("dropstart"))return zi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Hi:Mi:e?Fi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(be.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=ke.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Wt(t)));i.length&&Ut(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Vi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=ke.find(Pi);for(const i of e){const e=Vi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ci,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ni)?this:ke.prev(this,Ni)[0]||ke.next(this,Ni)[0]||ke.findOne(Ni,t.delegateTarget.parentNode),o=Vi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}de.on(document,$i,Ni,Vi.dataApiKeydownHandler),de.on(document,$i,ji,Vi.dataApiKeydownHandler),de.on(document,Di,Vi.clearMenus),de.on(document,Si,Vi.clearMenus),de.on(document,Di,Ni,(function(t){t.preventDefault(),Vi.getOrCreateInstance(this).toggle()})),Qt(Vi);const Ki=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Qi=".sticky-top",Xi="padding-right",Yi="margin-right";class Ui{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Xi,(e=>e+t)),this._setElementAttributes(Ki,Xi,(e=>e+t)),this._setElementAttributes(Qi,Yi,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Xi),this._resetElementAttributes(Ki,Xi),this._resetElementAttributes(Qi,Yi)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&be.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=be.getDataAttribute(t,e);null!==i?(be.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Mt(t))e(t);else for(const i of ke.find(t,this._element))e(i)}}const Gi="backdrop",Ji="show",Zi=`mousedown.bs.${Gi}`,tn={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},en={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class nn extends ve{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return tn}static get DefaultType(){return en}static get NAME(){return Gi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Ji),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ji),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(de.off(this._element,Zi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),de.on(t,Zi,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Yt(t,this._getElement(),this._config.isAnimated)}}const sn=".bs.focustrap",on=`focusin${sn}`,rn=`keydown.tab${sn}`,an="backward",ln={autofocus:!0,trapElement:null},cn={autofocus:"boolean",trapElement:"element"};class hn extends ve{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return ln}static get DefaultType(){return cn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),de.off(document,sn),de.on(document,on,(t=>this._handleFocusin(t))),de.on(document,rn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,de.off(document,sn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=ke.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===an?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?an:"forward")}}const un=".bs.modal",dn=`hide${un}`,fn=`hidePrevented${un}`,pn=`hidden${un}`,gn=`show${un}`,mn=`shown${un}`,_n=`resize${un}`,bn=`click.dismiss${un}`,vn=`mousedown.dismiss${un}`,yn=`keydown.dismiss${un}`,wn=`click${un}.data-api`,An="modal-open",En="show",Cn="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},On={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class xn extends ye{constructor(t,e){super(t,e),this._dialog=ke.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ui,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return On}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||de.trigger(this._element,gn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(An),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(de.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(En),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])de.off(t,un);this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new nn({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new hn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=ke.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(En),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,de.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){de.on(this._element,yn,(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),de.on(window,_n,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),de.on(this._element,vn,(t=>{de.one(this._element,bn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(An),this._resetAdjustments(),this._scrollBar.reset(),de.trigger(this._element,pn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(de.trigger(this._element,fn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Cn)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Cn),this._queueCallback((()=>{this._element.classList.remove(Cn),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=xn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}de.on(document,wn,'[data-bs-toggle="modal"]',(function(t){const e=Pt(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),de.one(e,gn,(t=>{t.defaultPrevented||de.one(e,pn,(()=>{Wt(this)&&this.focus()}))}));const i=ke.findOne(".modal.show");i&&xn.getInstance(i).hide(),xn.getOrCreateInstance(e).toggle(this)})),we(xn),Qt(xn);const kn=".bs.offcanvas",Ln=".data-api",Dn=`load${kn}${Ln}`,$n="show",Sn="showing",In="hiding",Nn=".offcanvas.show",Pn=`show${kn}`,jn=`shown${kn}`,Mn=`hide${kn}`,Hn=`hidePrevented${kn}`,Wn=`hidden${kn}`,Fn=`resize${kn}`,Bn=`click${kn}${Ln}`,zn=`keydown.dismiss${kn}`,qn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Vn extends ye{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return qn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||de.trigger(this._element,Pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ui).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Sn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add($n),this._element.classList.remove(Sn),de.trigger(this._element,jn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(de.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(In),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove($n,In),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ui).reset(),de.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new nn({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():de.trigger(this._element,Hn)}:null})}_initializeFocusTrap(){return new hn({trapElement:this._element})}_addEventListeners(){de.on(this._element,zn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():de.trigger(this._element,Hn))}))}static jQueryInterface(t){return this.each((function(){const e=Vn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}de.on(document,Bn,'[data-bs-toggle="offcanvas"]',(function(t){const e=Pt(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Ft(this))return;de.one(e,Wn,(()=>{Wt(this)&&this.focus()}));const i=ke.findOne(Nn);i&&i!==e&&Vn.getInstance(i).hide(),Vn.getOrCreateInstance(e).toggle(this)})),de.on(window,Dn,(()=>{for(const t of ke.find(Nn))Vn.getOrCreateInstance(t).show()})),de.on(window,Fn,(()=>{for(const t of ke.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Vn.getOrCreateInstance(t).hide()})),we(Vn),Qt(Vn);const Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Xn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Yn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)||Xn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Un={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Gn={allowList:Un,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Jn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Zn={entry:"(string|element|function|null)",selector:"(string|element)"};class ts extends ve{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Gn}static get DefaultType(){return Jn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Zn)}_setContent(t,e,i){const n=ke.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Mt(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Yn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const es=new Set(["sanitize","allowList","sanitizeFn"]),is="fade",ns="show",ss=".modal",os="hide.bs.modal",rs="hover",as="focus",ls={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},cs={allowList:Un,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},hs={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class us extends ye{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return cs}static get DefaultType(){return hs}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),de.off(this._element.closest(ss),os,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=de.trigger(this._element,this.constructor.eventName("show")),e=(Bt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),de.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ns),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))de.on(t,"mouseover",zt);this._queueCallback((()=>{de.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!de.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ns),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))de.off(t,"mouseover",zt);this._activeTrigger.click=!1,this._activeTrigger[as]=!1,this._activeTrigger[rs]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),de.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(is,ns),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(is),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new ts({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(is)}_isShown(){return this.tip&&this.tip.classList.contains(ns)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=ls[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)de.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===rs?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===rs?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");de.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?as:rs]=!0,e._enter()})),de.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?as:rs]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},de.on(this._element.closest(ss),os,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=be.getDataAttributes(this._element);for(const t of Object.keys(e))es.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(us);const ds={...us.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},fs={...us.DefaultType,content:"(null|string|element|function)"};class ps extends us{static get Default(){return ds}static get DefaultType(){return fs}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=ps.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(ps);const gs=".bs.scrollspy",ms=`activate${gs}`,_s=`click${gs}`,bs=`load${gs}.data-api`,vs="active",ys="[href]",ws=".nav-link",As=`${ws}, .nav-item > ${ws}, .list-group-item`,Es={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Cs={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ts extends ye{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Es}static get DefaultType(){return Cs}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(de.off(this._config.target,_s),de.on(this._config.target,_s,ys,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=ke.find(ys,this._config.target);for(const e of t){if(!e.hash||Ft(e))continue;const t=ke.findOne(e.hash,this._element);Wt(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(vs),this._activateParents(t),de.trigger(this._element,ms,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))ke.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(vs);else for(const e of ke.parents(t,".nav, .list-group"))for(const t of ke.prev(e,As))t.classList.add(vs)}_clearActiveClass(t){t.classList.remove(vs);const e=ke.find(`${ys}.${vs}`,t);for(const t of e)t.classList.remove(vs)}static jQueryInterface(t){return this.each((function(){const e=Ts.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}de.on(window,bs,(()=>{for(const t of ke.find('[data-bs-spy="scroll"]'))Ts.getOrCreateInstance(t)})),Qt(Ts);const Os=".bs.tab",xs=`hide${Os}`,ks=`hidden${Os}`,Ls=`show${Os}`,Ds=`shown${Os}`,$s=`click${Os}`,Ss=`keydown${Os}`,Is=`load${Os}`,Ns="ArrowLeft",Ps="ArrowRight",js="ArrowUp",Ms="ArrowDown",Hs="active",Ws="fade",Fs="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,Rs=`.${Hs}[data-bs-toggle="tab"], .${Hs}[data-bs-toggle="pill"], .${Hs}[data-bs-toggle="list"]`;class Vs extends ye{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),de.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?de.trigger(e,xs,{relatedTarget:t}):null;de.trigger(t,Ls,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Hs),this._activate(Pt(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),de.trigger(t,Ds,{relatedTarget:e})):t.classList.add(Fs)}),t,t.classList.contains(Ws)))}_deactivate(t,e){t&&(t.classList.remove(Hs),t.blur(),this._deactivate(Pt(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),de.trigger(t,ks,{relatedTarget:e})):t.classList.remove(Fs)}),t,t.classList.contains(Ws)))}_keydown(t){if(![Ns,Ps,js,Ms].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[Ps,Ms].includes(t.key),i=Ut(this._getChildren().filter((t=>!Ft(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return ke.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=Pt(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=ke.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Hs),n(".dropdown-menu",Fs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Hs)}_getInnerElement(t){return t.matches(qs)?t:ke.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}de.on(document,$s,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Ft(this)||Vs.getOrCreateInstance(this).show()})),de.on(window,Is,(()=>{for(const t of ke.find(Rs))Vs.getOrCreateInstance(t)})),Qt(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends ye{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){de.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),qt(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),de.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(de.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),de.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){de.on(this._element,Qs,(t=>this._onInteraction(t,!0))),de.on(this._element,Xs,(t=>this._onInteraction(t,!1))),de.on(this._element,Ys,(t=>this._onInteraction(t,!0))),de.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}var ao;we(ro),Qt(ro),ao=function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new us(t,{delay:{show:500,hide:100}})}))},"loading"!=document.readyState?ao():document.addEventListener("DOMContentLoaded",ao)})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 00000000..91ad10aa --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.2.3 (https://getbootstrap.com/) + * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map new file mode 100644 index 00000000..d83e2f7c --- /dev/null +++ b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n/**\n * Public Util API\n */\n\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n\n return prefix;\n};\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n\n return selector;\n};\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element);\n\n if (selector) {\n return document.querySelector(selector) ? selector : null;\n }\n\n return null;\n};\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element);\n return selector ? document.querySelector(selector) : null;\n};\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n } // Get transition-duration of the element\n\n\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n } // If multiple durations are defined, take the first\n\n\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n\n return typeof object.nodeType !== 'undefined';\n};\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(object);\n }\n\n return null;\n};\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed\n\n const closedDetails = element.closest('details:not([open])');\n\n if (!closedDetails) {\n return elementIsVisible;\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n\n if (summary === null) {\n return false;\n }\n }\n\n return elementIsVisible;\n};\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n\n if (element.classList.contains('disabled')) {\n return true;\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n } // Can find the shadow root otherwise it'll return the document\n\n\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n\n if (element instanceof ShadowRoot) {\n return element;\n } // when we don't find a shadow root\n\n\n if (!element.parentNode) {\n return null;\n }\n\n return findShadowRoot(element.parentNode);\n};\n\nconst noop = () => {};\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\n\n\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n\n return null;\n};\n\nconst DOMContentLoadedCallbacks = [];\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\n\nconst isRTL = () => document.documentElement.dir === 'rtl';\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback();\n }\n};\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\n\n\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement); // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n\n index += shouldGetNext ? 1 : -1;\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\n\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n\n return fn.apply(element, [event]);\n };\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n\n hydrateObj(event, {\n delegateTarget: target\n });\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n\n return fn.apply(target, [event]);\n }\n }\n };\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check\n\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n\n return [isDelegated, callable, typeEvent];\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n\n callable = wrapFunction(callable);\n }\n\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n if (!fn) {\n return;\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n\n for (const handlerKey of Object.keys(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey];\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n\n for (const keyHandlers of Object.keys(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers];\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n\n let evt = new Event(event, {\n bubbles,\n cancelable: true\n });\n evt = hydrateObj(evt, args);\n\n if (defaultPrevented) {\n evt.preventDefault();\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n\n return evt;\n }\n\n};\n\nfunction hydrateObj(obj, meta) {\n for (const [key, value] of Object.entries(meta || {})) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n\n get() {\n return value;\n }\n\n });\n }\n }\n\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n\n const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n\n instanceMap.set(key, instance);\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n\n return null;\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n\n if (value === 'false') {\n return false;\n }\n\n if (value === Number(value).toString()) {\n return Number(value);\n }\n\n if (value === '' || value === 'null') {\n return null;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n\n return attributes;\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n\n static get DefaultType() {\n return {};\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n\n this._typeCheckConfig(config);\n\n return config;\n }\n\n _configAfterMerge(config) {\n return config;\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return { ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const property of Object.keys(configTypes)) {\n const expectedTypes = configTypes[property];\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst VERSION = '5.2.3';\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n\n if (!element) {\n return;\n }\n\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n } // Public\n\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n\n this._typeCheckConfig(config);\n\n return config;\n } // Static\n\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n\n static get VERSION() {\n return VERSION;\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n\n if (isDisabled(this)) {\n return;\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n } // Public\n\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n if (closeEvent.defaultPrevented) {\n return;\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n } // Private\n\n\n _destroyElement() {\n this._element.remove();\n\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config](this);\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nenableDismissTrigger(Alert, 'close');\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n } // Public\n\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n\n return parents;\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling;\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n\n previous = previous.previousElementSibling;\n }\n\n return [];\n },\n\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n\n next = next.nextElementSibling;\n }\n\n return [];\n },\n\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n\n if (!element || !Swipe.isSupported()) {\n return;\n }\n\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n\n this._initEvents();\n } // Getters\n\n\n static get Default() {\n return Default$c;\n }\n\n static get DefaultType() {\n return DefaultType$c;\n }\n\n static get NAME() {\n return NAME$d;\n } // Public\n\n\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n } // Private\n\n\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n\n this._handleSwipe();\n\n execute(this._config.endCallback);\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n\n if (!direction) {\n return;\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n } // Static\n\n\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n\n this._addEventListeners();\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n } // Getters\n\n\n static get Default() {\n return Default$b;\n }\n\n static get DefaultType() {\n return DefaultType$b;\n }\n\n static get NAME() {\n return NAME$c;\n } // Public\n\n\n next() {\n this._slide(ORDER_NEXT);\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n\n prev() {\n this._slide(ORDER_PREV);\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n\n this._clearInterval();\n }\n\n cycle() {\n this._clearInterval();\n\n this._updateInterval();\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n\n this.cycle();\n }\n\n to(index) {\n const items = this._getItems();\n\n if (index > items.length - 1 || index < 0) {\n return;\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n\n const activeIndex = this._getItemIndex(this._getActive());\n\n if (activeIndex === index) {\n return;\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n this._slide(order, items[index]);\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n\n super.dispose();\n } // Private\n\n\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n } // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n\n this.pause();\n\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n\n const direction = KEY_TO_DIRECTION[event.key];\n\n if (direction) {\n event.preventDefault();\n\n this._slide(this._directionToOrder(direction));\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n\n if (!element) {\n return;\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n\n const activeElement = this._getActive();\n\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n\n if (nextElement === activeElement) {\n return;\n }\n\n const nextElementIndex = this._getItemIndex(nextElement);\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n\n const slideEvent = triggerEvent(EVENT_SLIDE);\n\n if (slideEvent.defaultPrevented) {\n return;\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // todo: change tests that use empty divs to avoid this check\n return;\n }\n\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n\n this._setActiveIndicatorElement(nextElementIndex);\n\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n\n if (isCycling) {\n this.cycle();\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n }\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = getElementFromSelector(this);\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n\n if (slideIndex) {\n carousel.to(slideIndex);\n\n carousel._maybeEnableCycle();\n\n return;\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n\n carousel._maybeEnableCycle();\n\n return;\n }\n\n carousel.prev();\n\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n for (const elem of toggleList) {\n const selector = getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n\n this._initializeChildren();\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n\n if (this._config.toggle) {\n this.toggle();\n }\n } // Getters\n\n\n static get Default() {\n return Default$a;\n }\n\n static get DefaultType() {\n return DefaultType$a;\n }\n\n static get NAME() {\n return NAME$b;\n } // Public\n\n\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n\n let activeChildren = []; // find active children\n\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n\n if (startEvent.defaultPrevented) {\n return;\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n\n const dimension = this._getDimension();\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n this._element.style[dimension] = 0;\n\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n this._isTransitioning = true;\n\n const complete = () => {\n this._isTransitioning = false;\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n\n this._queueCallback(complete, this._element, true);\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n\n if (startEvent.defaultPrevented) {\n return;\n }\n\n const dimension = this._getDimension();\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n for (const trigger of this._triggerArray) {\n const element = getElementFromSelector(trigger);\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n\n this._isTransitioning = true;\n\n const complete = () => {\n this._isTransitioning = false;\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n\n this._element.style[dimension] = '';\n\n this._queueCallback(complete, this._element, true);\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n } // Private\n\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n\n config.parent = getElement(config.parent);\n return config;\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n\n for (const element of children) {\n const selected = getElementFromSelector(element);\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth\n\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n } // Static\n\n\n static jQueryInterface(config) {\n const _config = {};\n\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n }\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n\n const selector = getSelectorFromElement(this);\n const selectorElements = SelectorEngine.find(selector);\n\n for (const element of selectorElements) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/\n\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n } // Getters\n\n\n static get Default() {\n return Default$9;\n }\n\n static get DefaultType() {\n return DefaultType$9;\n }\n\n static get NAME() {\n return NAME$a;\n } // Public\n\n\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n\n if (showEvent.defaultPrevented) {\n return;\n }\n\n this._createPopper(); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n\n this._element.focus();\n\n this._element.setAttribute('aria-expanded', true);\n\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n this._element.classList.add(CLASS_NAME_SHOW$6);\n\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n };\n\n this._completeHide(relatedTarget);\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n\n super.dispose();\n }\n\n update() {\n this._inNavbar = this._detectNavbar();\n\n if (this._popper) {\n this._popper.update();\n }\n } // Private\n\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n\n if (hideEvent.defaultPrevented) {\n return;\n } // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n\n if (this._popper) {\n this._popper.destroy();\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n this._element.setAttribute('aria-expanded', 'false');\n\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n\n _getConfig(config) {\n config = super._getConfig(config);\n\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n\n return config;\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n\n let referenceElement = this._element;\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n\n const popperConfig = this._getPopperConfig();\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n\n _getPlacement() {\n const parentDropdown = this._parent;\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n } // We need to trim the value because custom properties can also include spaces\n\n\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n\n _getOffset() {\n const {\n offset\n } = this._config;\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n\n return offset;\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }; // Disable Popper if we have a static display or Dropdown is in Navbar\n\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove\n\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n\n return { ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n };\n }\n\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n\n if (!items.length) {\n return;\n } // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n });\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n\n if (!context || context._config.autoClose === false) {\n continue;\n }\n\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n };\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n\n context._completeHide(relatedTarget);\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n\n if (isInput && !isEscapeEvent) {\n return;\n }\n\n event.preventDefault(); // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n\n instance._selectMenuItem(event);\n\n return;\n }\n\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n } // Public\n\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n\n hide() {\n const width = this.getWidth();\n\n this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n\n isOverflowing() {\n return this.getWidth() > 0;\n } // Private\n\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n\n this._element.style.overflow = 'hidden';\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n\n this._saveInitialAttribute(element, styleProperty);\n\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero\n\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n } // Getters\n\n\n static get Default() {\n return Default$8;\n }\n\n static get DefaultType() {\n return DefaultType$8;\n }\n\n static get NAME() {\n return NAME$9;\n } // Public\n\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n\n this._append();\n\n const element = this._getElement();\n\n if (this._config.isAnimated) {\n reflow(element);\n }\n\n element.classList.add(CLASS_NAME_SHOW$5);\n\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n\n dispose() {\n if (!this._isAppended) {\n return;\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n this._element.remove();\n\n this._isAppended = false;\n } // Private\n\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n\n this._element = backdrop;\n }\n\n return this._element;\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n\n _append() {\n if (this._isAppended) {\n return;\n }\n\n const element = this._getElement();\n\n this._config.rootElement.append(element);\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n } // Getters\n\n\n static get Default() {\n return Default$7;\n }\n\n static get DefaultType() {\n return DefaultType$7;\n }\n\n static get NAME() {\n return NAME$8;\n } // Public\n\n\n activate() {\n if (this._isActive) {\n return;\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n\n deactivate() {\n if (!this._isActive) {\n return;\n }\n\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n } // Private\n\n\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement);\n\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n\n this._addEventListeners();\n } // Getters\n\n\n static get Default() {\n return Default$6;\n }\n\n static get DefaultType() {\n return DefaultType$6;\n }\n\n static get NAME() {\n return NAME$7;\n } // Public\n\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n\n if (showEvent.defaultPrevented) {\n return;\n }\n\n this._isShown = true;\n this._isTransitioning = true;\n\n this._scrollBar.hide();\n\n document.body.classList.add(CLASS_NAME_OPEN);\n\n this._adjustDialog();\n\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n this._isShown = false;\n this._isTransitioning = true;\n\n this._focustrap.deactivate();\n\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n\n dispose() {\n for (const htmlElement of [window, this._dialog]) {\n EventHandler.off(htmlElement, EVENT_KEY$4);\n }\n\n this._backdrop.dispose();\n\n this._focustrap.deactivate();\n\n super.dispose();\n }\n\n handleUpdate() {\n this._adjustDialog();\n } // Private\n\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n\n this._element.style.display = 'block';\n\n this._element.removeAttribute('aria-hidden');\n\n this._element.setAttribute('aria-modal', true);\n\n this._element.setAttribute('role', 'dialog');\n\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n\n reflow(this._element);\n\n this._element.classList.add(CLASS_NAME_SHOW$4);\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n\n if (this._config.keyboard) {\n event.preventDefault();\n this.hide();\n return;\n }\n\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n\n return;\n }\n\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n\n _hideModal() {\n this._element.style.display = 'none';\n\n this._element.setAttribute('aria-hidden', true);\n\n this._element.removeAttribute('aria-modal');\n\n this._element.removeAttribute('role');\n\n this._isTransitioning = false;\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n\n this._resetAdjustments();\n\n this._scrollBar.reset();\n\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed\n\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n\n this._element.classList.add(CLASS_NAME_STATIC);\n\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n\n this._element.focus();\n }\n /**\n * The following methods are used to handle overflowing modals\n */\n\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n const scrollbarWidth = this._scrollBar.getWidth();\n\n const isBodyOverflowing = scrollbarWidth > 0;\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n } // Static\n\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config](relatedTarget);\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = getElementFromSelector(this);\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n }); // avoid conflict when clicking modal toggler while another one is open\n\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n\n this._addEventListeners();\n } // Getters\n\n\n static get Default() {\n return Default$5;\n }\n\n static get DefaultType() {\n return DefaultType$5;\n }\n\n static get NAME() {\n return NAME$6;\n } // Public\n\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n\n if (showEvent.defaultPrevented) {\n return;\n }\n\n this._isShown = true;\n\n this._backdrop.show();\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n\n this._element.setAttribute('aria-modal', true);\n\n this._element.setAttribute('role', 'dialog');\n\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n\n this._element.classList.add(CLASS_NAME_SHOW$3);\n\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n\n this._queueCallback(completeCallBack, this._element, true);\n }\n\n hide() {\n if (!this._isShown) {\n return;\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n this._focustrap.deactivate();\n\n this._element.blur();\n\n this._isShown = false;\n\n this._element.classList.add(CLASS_NAME_HIDING);\n\n this._backdrop.hide();\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n\n this._element.removeAttribute('aria-modal');\n\n this._element.removeAttribute('role');\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n\n this._queueCallback(completeCallback, this._element, true);\n }\n\n dispose() {\n this._backdrop.dispose();\n\n this._focustrap.deactivate();\n\n super.dispose();\n } // Private\n\n\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n\n this.hide();\n }; // 'static' option will be translated to true, and booleans will keep their value\n\n\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n\n if (!this._config.keyboard) {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n\n this.hide();\n });\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config](this);\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = getElementFromSelector(this);\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n\n if (isDisabled(this)) {\n return;\n }\n\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\n\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\n\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));\n }\n\n return true;\n } // Check if a regular expression validates the attribute.\n\n\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\n\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n } // Getters\n\n\n static get Default() {\n return Default$4;\n }\n\n static get DefaultType() {\n return DefaultType$4;\n }\n\n static get NAME() {\n return NAME$5;\n } // Public\n\n\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n\n hasContent() {\n return this.getContent().length > 0;\n }\n\n changeContent(content) {\n this._checkContent(content);\n\n this._config.content = { ...this._config.content,\n ...content\n };\n return this;\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n\n const template = templateWrapper.children[0];\n\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n\n return template;\n } // Private\n\n\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n\n this._checkContent(config.content);\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n\n if (!templateElement) {\n return;\n }\n\n content = this._resolvePossibleFunction(content);\n\n if (!content) {\n templateElement.remove();\n return;\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n\n return;\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n\n templateElement.textContent = content;\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n\n _resolvePossibleFunction(arg) {\n return typeof arg === 'function' ? arg(this) : arg;\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n\n templateElement.textContent = element.textContent;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 0],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n\n super(element, config); // Private\n\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null; // Protected\n\n this.tip = null;\n\n this._setListeners();\n\n if (!this._config.selector) {\n this._fixTitle();\n }\n } // Getters\n\n\n static get Default() {\n return Default$3;\n }\n\n static get DefaultType() {\n return DefaultType$3;\n }\n\n static get NAME() {\n return NAME$4;\n } // Public\n\n\n enable() {\n this._isEnabled = true;\n }\n\n disable() {\n this._isEnabled = false;\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n\n this._activeTrigger.click = !this._activeTrigger.click;\n\n if (this._isShown()) {\n this._leave();\n\n return;\n }\n\n this._enter();\n }\n\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n\n this._disposePopper();\n\n super.dispose();\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n } // todo v6 remove this OR make it optional\n\n\n this._disposePopper();\n\n const tip = this._getTipElement();\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n\n const {\n container\n } = this._config;\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n\n if (this._isHovered === false) {\n this._leave();\n }\n\n this._isHovered = false;\n };\n\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n\n hide() {\n if (!this._isShown()) {\n return;\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n const tip = this._getTipElement();\n\n tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n\n if (!this._isHovered) {\n this._disposePopper();\n }\n\n this._element.removeAttribute('aria-describedby');\n\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n\n update() {\n if (this._popper) {\n this._popper.update();\n }\n } // Protected\n\n\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n\n return this.tip;\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6\n\n\n if (!tip) {\n return null;\n }\n\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only\n\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n\n return tip;\n }\n\n setContent(content) {\n this._newContent = content;\n\n if (this._isShown()) {\n this._disposePopper();\n\n this.show();\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({ ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n\n return this._templateFactory;\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n } // Private\n\n\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n\n _createPopper(tip) {\n const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n\n _getOffset() {\n const {\n offset\n } = this._config;\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n\n return offset;\n }\n\n _resolvePossibleFunction(arg) {\n return typeof arg === 'function' ? arg.call(this._element) : arg;\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return { ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n };\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n\n context._leave();\n });\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title');\n\n if (!title) {\n return;\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n\n\n this._element.removeAttribute('title');\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n\n this._isHovered = true;\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n\n this._isHovered = false;\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n\n config = { ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n\n this._typeCheckConfig(config);\n\n return config;\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n\n return config;\n }\n\n _getDelegateConfig() {\n const config = {};\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key];\n }\n }\n\n config.selector = false;\n config.trigger = 'manual'; // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n\n return config;\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n\n this._popper = null;\n }\n\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n });\n }\n\n}\n/**\n * jQuery\n */\n\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = { ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = { ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n\n static get DefaultType() {\n return DefaultType$2;\n }\n\n static get NAME() {\n return NAME$3;\n } // Overrides\n\n\n _isWithContent() {\n return this._getTitle() || this._getContent();\n } // Private\n\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n });\n }\n\n}\n/**\n * jQuery\n */\n\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper\n\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n } // Getters\n\n\n static get Default() {\n return Default$1;\n }\n\n static get DefaultType() {\n return DefaultType$1;\n }\n\n static get NAME() {\n return NAME$2;\n } // Public\n\n\n refresh() {\n this._initializeTargetsAndObservables();\n\n this._maybeEnableSmoothScroll();\n\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n\n dispose() {\n this._observer.disconnect();\n\n super.dispose();\n } // Private\n\n\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n\n return config;\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n } // unregister any previous listeners\n\n\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n } // Chrome 60 doesn't support `scrollTo`\n\n\n root.scrollTop = height;\n }\n });\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n } // The logic of selection\n\n\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n\n this._process(targetElement(entry));\n };\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n\n this._clearActiveClass(targetElement(entry));\n\n continue;\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop\n\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n\n if (!parentScrollTop) {\n return;\n }\n\n continue;\n } // if we are scrolling up, pick the smallest offsetTop\n\n\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n\n const observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible\n\n if (isVisible(observableSection)) {\n this._targetLinks.set(anchor.hash, anchor);\n\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n\n this._clearActiveClass(this._config.target);\n\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n\n this._activateParents(target);\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
diff --git a/docs/pygom-doc/_build/html/intro.html b/docs/pygom-doc/_build/html/intro.html index 21a47ace..6f2b3597 100644 --- a/docs/pygom-doc/_build/html/intro.html +++ b/docs/pygom-doc/_build/html/intro.html @@ -7,7 +7,7 @@ - + Welcome to the documentation for PyGOM — PyGOM documentation @@ -168,6 +168,11 @@
  • Hard Problem
  • +
  • Simple Epidemic Analysis
  • +
  • Reading and using EpiJSON data
  • +
  • Solving Boundary Value Problems
  • +
  • Gradient estimation under square loss
  • +
  • Example: Fitz Hugh
  • @@ -395,6 +400,11 @@

    Welcome to the documentation for PyGOMTransition Object
  • Stochastic representation of ODEs
  • Convert ODE into transitions
  • +
  • Simple Epidemic Analysis
  • +
  • Reading and using EpiJSON data
  • +
  • Solving Boundary Value Problems
  • +
  • Gradient estimation under square loss
  • +
  • Example: Fitz Hugh
  • diff --git a/docs/pygom-doc/_build/html/markdown.html b/docs/pygom-doc/_build/html/markdown.html index 05a09819..38e51878 100644 --- a/docs/pygom-doc/_build/html/markdown.html +++ b/docs/pygom-doc/_build/html/markdown.html @@ -7,7 +7,7 @@ - + Markdown Files — PyGOM documentation @@ -163,12 +163,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} diff --git a/docs/pygom-doc/_build/html/md/getting_started.html b/docs/pygom-doc/_build/html/md/getting_started.html index 765c0be6..731460dc 100644 --- a/docs/pygom-doc/_build/html/md/getting_started.html +++ b/docs/pygom-doc/_build/html/md/getting_started.html @@ -7,7 +7,7 @@ - + Getting started — PyGOM documentation @@ -165,12 +165,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} diff --git a/docs/pygom-doc/_build/html/md/unrollOde.html b/docs/pygom-doc/_build/html/md/unrollOde.html index 59b8a6eb..9c8bb3d7 100644 --- a/docs/pygom-doc/_build/html/md/unrollOde.html +++ b/docs/pygom-doc/_build/html/md/unrollOde.html @@ -7,7 +7,7 @@ - + Convert ODE into transitions — PyGOM documentation @@ -169,6 +169,11 @@
  • Hard Problem
  • +
  • Simple Epidemic Analysis
  • +
  • Reading and using EpiJSON data
  • +
  • Solving Boundary Value Problems
  • +
  • Gradient estimation under square loss
  • +
  • Example: Fitz Hugh
  • diff --git a/docs/pygom-doc/_build/html/mdconvert/common_models/.html b/docs/pygom-doc/_build/html/mdconvert/common_models/.html index 4217db16..80e32cd3 100644 --- a/docs/pygom-doc/_build/html/mdconvert/common_models/.html +++ b/docs/pygom-doc/_build/html/mdconvert/common_models/.html @@ -7,7 +7,7 @@ - + .SIR_Birth_Death{.interpreted-text role=”func”} — PyGOM documentation @@ -163,12 +163,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} diff --git a/docs/pygom-doc/_build/html/mdconvert/doc_to_sort/.html b/docs/pygom-doc/_build/html/mdconvert/doc_to_sort/.html index 325aa637..4fb4d738 100644 --- a/docs/pygom-doc/_build/html/mdconvert/doc_to_sort/.html +++ b/docs/pygom-doc/_build/html/mdconvert/doc_to_sort/.html @@ -7,7 +7,7 @@ - + Solving Boundary Value Problems {#bvpSimple} — PyGOM documentation @@ -163,12 +163,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} @@ -383,7 +388,7 @@

    Solving Boundary Value Problems {#bvpSimple}1, will be shown here.

    +examples, both from MATLAB[1], will be shown here.

    Simple model 1#

    We are trying to find the solution to the second order differential @@ -438,11 +443,10 @@

    Simple model 2 -
    -
    1
    -

    http://uk.mathworks.com/help/matlab/ref/bvp4c.html

    -
    -
    +

    diff --git a/docs/pygom-doc/_build/html/mdconvert/mod/.html b/docs/pygom-doc/_build/html/mdconvert/mod/.html index d321a8c1..c21b9e60 100644 --- a/docs/pygom-doc/_build/html/mdconvert/mod/.html +++ b/docs/pygom-doc/_build/html/mdconvert/mod/.html @@ -7,7 +7,7 @@ - + stochastic — PyGOM documentation @@ -161,12 +161,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} diff --git a/docs/pygom-doc/_build/html/mdconvert/unroll/.html b/docs/pygom-doc/_build/html/mdconvert/unroll/.html index d6121664..384f7963 100644 --- a/docs/pygom-doc/_build/html/mdconvert/unroll/.html +++ b/docs/pygom-doc/_build/html/mdconvert/unroll/.html @@ -7,7 +7,7 @@ - + Simple Problem {#unrollSimple} — PyGOM documentation @@ -163,12 +163,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} diff --git a/docs/pygom-doc/_build/html/notebooks/bvpSimple.html b/docs/pygom-doc/_build/html/notebooks/bvpSimple.html new file mode 100644 index 00000000..3442ba67 --- /dev/null +++ b/docs/pygom-doc/_build/html/notebooks/bvpSimple.html @@ -0,0 +1,633 @@ + + + + + + + + + + + + Solving Boundary Value Problems — PyGOM documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    +
    + + + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Solving Boundary Value Problems

    + +
    +
    + +
    +

    Contents

    +
    + +
    +
    +
    + + + + +
    + +
    +

    Solving Boundary Value Problems#

    +

    In addition to finding solutions for an IVP and estimate the unknown +parameters, this package also allows you to solve BVP with a little bit +of imagination. Here, we are going to show how a BVP can be solved by +treating it as a parameter estimation problem. Essentially, a shooting +method where the first boundary condition defines the initial condition +of an IVP and the second boundary condition is an observation. Two +examples, both from MATLAB[1], will be shown here.

    +
    +

    Simple model 1#

    +

    We are trying to find the solution to the second order differential +equation

    +
    +\[\nabla^{2} y + |y| = 0\]
    +

    subject to the boundary conditions \(y(0) = 0\) and \(y(4) = -2\). Convert +this into a set of first order ODE

    +
    +\[\begin{split}\begin{aligned} +\frac{d y_{0}}{dt} &= y_{1} \\ +\frac{d y_{1}}{dt} &= -|y_{0}| +\end{aligned}\end{split}\]
    +

    using an auxiliary variable \(y_{1} = \nabla y\) and \(y_{0} = y\). Setting +up the system below

    +

    In [1]: from pygom import Transition, TransitionType, +DeterministicOde, SquareLoss

    +

    In [1]: import matplotlib.pyplot as plt

    +

    In [2]: stateList = [‘y0’, ‘y1’]

    +

    In [3]: paramList = []

    +

    In [4]: ode1 = Transition(origin=’y0’,
    +…: equation=’y1’, …: transition_type=TransitionType.ODE)

    +

    In [5]: ode2 = Transition(origin=’y1’,
    +…: equation=’-abs(y0)’, …: transition_type=TransitionType.ODE)

    +

    In [6]: model = DeterministicOde(stateList,
    +…: paramList, …: ode=[ode1, ode2])

    +

    In [7]: model.get_ode_eqn()

    +

    We check that the equations are correct before proceeding to set up our +loss function.

    +

    In [1]: import numpy

    +

    In [2]: from scipy.optimize import minimize

    +

    In [3]: initialState = [0.0, 1.0]

    +

    In [4]: t = numpy.linspace(0, 4, 100)

    +

    In [5]: model.initial_values = (initialState, t[0])

    +

    In [6]: solution = model.integrate(t[1::])

    +

    In [7]: f = plt.figure()

    +

    @savefig bvp1_random_guess_plot.png In [8]: model.plot()

    +

    In [9]: plt.close()

    +

    Setting up the second boundary condition \(y(4) = -2\) is easy, because +that is just a single observation attached to the state \(y_{1}\). +Enforcing the first boundary condition requires us to set it as the +initial condition. Because the condition only states that \(y(0) = 0\), +the starting value of the other state \(y_1\) is free. We let our loss +object know that it is free through the targetState input argument.

    +

    In [10]: theta = [0.0]

    +

    In [11]: obj = SquareLoss(theta=theta,
    +.…: ode=model, .…: x0=initialState, .…: t0=t[0], .…: t=t[-1], .…: +y=[-2], .…: state_name=[‘y0’], .…: target_state=[‘y1’])

    +

    In [12]: thetaHat = minimize(fun=obj.costIV, x0=[0.0])

    +

    In [13]: print(thetaHat)

    +

    In [14]: model.initial_values = ([0.0] + thetaHat[‘x’].tolist(), +t[0])

    +

    In [15]: solution = model.integrate(t[1::])

    +

    In [16]: f = plt.figure()

    +

    @savefig bvp1_solution_plot.png In [17]: model.plot()

    +

    In [18]: plt.close()

    +

    We are going to visualize the solution, and also check the boundary +condition. The first became our initial condition, so it is always +satisfied and only the latter is of concern, which is zero (subject to +numerical error) from thetaHat.

    +
    +
    +

    Simple model 2#

    +

    Our second example is different as it involves an actual parameter and +also time. We have the Mathieu’s Equation

    +
    +\[\nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0\]
    +

    and the aim is to compute the fourth eigenvalue \(q=5\). There are three +boundary conditions

    +
    +\[\nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1\]
    +

    and we aim to solve it by converting it to a first order ODE and tackle +it as an IVP. As our model object does not allow the use of the time +component in the equations, we introduce a anxiliary state \(\tau\) that +replaces time \(t\). Rewrite the equations using +\(y_{0} = y, y_{1} = \nabla y\) and define our model as

    +

    In [1]: stateList = [‘y0’, ‘y1’, ‘tau’]

    +

    In [2]: paramList = [‘p’]

    +

    In [3]: ode1 = Transition(‘y0’, ‘y1’, TransitionType.ODE)

    +

    In [4]: ode2 = Transition(‘y1’, ‘-(p - 2*5*cos(2*tau))*y0’, +TransitionType.ODE)

    +

    In [5]: ode3 = Transition(‘tau’, ‘1’, TransitionType.ODE)

    +

    In [6]: model = DeterministicOde(stateList, paramList, ode=[ode1, +ode2, ode3])

    +

    In [7]: theta = [1.0, 1.0, 0.0]

    +

    In [8]: p = 15.0

    +

    In [9]: t = numpy.linspace(0, numpy.pi)

    +

    In [10]: model.parameters = [(‘p’,p)]

    +

    In [11]: model.initial_values = (theta, t[0])

    +

    In [12]: solution = model.integrate(t[1::])

    +

    In [13]: f = plt.figure()

    +

    @savefig bvp2_random_guess_plot.png In [14]: model.plot()

    +

    In [15]: plt.close()

    +

    Now we are ready to setup the estimation. Like before, we setup the +second boundary condition by pretending that it is an observation. We +have all the initial conditions defined by the first boundary condition

    +

    In [1]: obj = SquareLoss(15.0, model, x0=[1.0, 0.0, 0.0], t0=0.0, +t=numpy.pi, y=0.0, state_name=’y1’)

    +

    In [2]: xhatObj = minimize(obj.cost,[15])

    +

    In [3]: print(xhatObj)

    +

    In [4]: model.parameters = [(‘p’, xhatObj[‘x’][0])]

    +

    In [5]: model.initial_values = ([1.0, 0.0, 0.0], t[0])

    +

    In [5]: solution = model.integrate(t[1::])

    +

    In [6]: f = plt.figure()

    +

    @savefig bvp2_solution_plot.png In [7]: model.plot()

    +

    In [8]: plt.close()

    +

    The plot of the solution shows the path that satisfies all boundary +condition. The last subplot is time which obvious is redundant here but +the DeterministicOde.plot method is not yet able to recognize the time +component. Possible speed up can be achieved through the use of +derivative information or via root finding method that tackles the +gradient directly, instead of the cost function.

    +

    Reference

    +

    [1] http://uk.mathworks.com/help/matlab/ref/bvp4c.html

    +
    +
    + + + + +
    + + + + + + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/notebooks/epi.html b/docs/pygom-doc/_build/html/notebooks/epi.html new file mode 100644 index 00000000..3bc258be --- /dev/null +++ b/docs/pygom-doc/_build/html/notebooks/epi.html @@ -0,0 +1,553 @@ + + + + + + + + + + + + Simple Epidemic Analysis — PyGOM documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    +
    + + + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Simple Epidemic Analysis

    + +
    +
    + +
    +

    Contents

    +
    + +
    +
    +
    + + + + +
    + +
    +

    Simple Epidemic Analysis#

    +

    A common application of ordinary differential equations is in the field +of epidemiology modeling. More concretely, compartmental models that is +used to describe disease progression. We demonstrate some of the simple +algebraic analysis one may wish to take when given a compartment model. +Our use one of the simplest model, an SIR model with birth and death +processes, which is an extension of the one in sir. First, we +initialize the model below.

    +

    In [1]: from pygom import common_models

    +

    In [2]: ode = common_models.SIR_Birth_Death()

    +

    In [3]: print(ode.get_ode_eqn())

    +
    +

    Obtaining the R0#

    +

    The reproduction number, also known as the \(R_{0}\), is the single most +powerful piece and reduced piece of information available from a +compartmental model. In a nutshell, it provides a single number - if the +parameters are known - which can the intuitive interpretation where +\(R_{0} = 1\) defines the tipping point of an outbreak. A \(R_{0}\) value of +more than one signifies an potential outbreak where less than one +indicates that the disease will stop spreading naturally.

    +

    To obtain the \(R_{0}\), we simply have to tell the function which states +represent the disease state, which in this case is the state I.

    +

    In [1]: from pygom.model.epi_analysis import *

    +

    In [2]: print(R0(ode, ‘I’))

    +
    +
    +

    Algebraic R0#

    +

    We may also wish to get the \(R_{0}\) in pure algebraic term. This can be +achieved by the following few lines. Note that the result below is +slightly different from the one above. The difference is due to the +internal working of the functions, where getR0 computes the +disease-free equilibrium value for the states and substitute them back +into the equation.

    +

    In [1]: F, V = disease_progression_matrices(ode, ‘I’)

    +

    In [2]: e = R0_from_matrix(F, V)

    +

    In [3]: print(e)

    +

    To replicate the output before, we have to find the values where the +disease-free equilibrium will be achieved. Substitution can then be +performed to retrieve \(R_{0}\) in pure parameters.

    +

    In [1]: dfe = DFE(ode, [‘I’])

    +

    In [2]: print(dfe)

    +

    In [3]: print(e[0].subs(dfe))

    +
    +
    + + + + +
    + + + + + + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/notebooks/epijson.html b/docs/pygom-doc/_build/html/notebooks/epijson.html new file mode 100644 index 00000000..88de1cca --- /dev/null +++ b/docs/pygom-doc/_build/html/notebooks/epijson.html @@ -0,0 +1,520 @@ + + + + + + + + + + + + Reading and using EpiJSON data — PyGOM documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    +
    + + + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Reading and using EpiJSON data

    + +
    +
    + +
    +
    +
    + + + + +
    + +
    +

    Reading and using EpiJSON data#

    +

    Epidemiology data is complicated due to the many different stages a +patient can go through and whether a modeling technique is applicable +depends heavily on the recording of data. EpiJSON is a framework whih +tries to captures all the information [Finnie2016], in a JSON +format as the name suggests.

    +

    This package provides the functionality to process EpiJSON data. Due to +the nature of this package, modeling of ode, it processes the data file +with this in mind. The output is therefore in the cumulative form as +default, shown below, in a pandas.DataFrame format. The input can be +in a string format, a file or already a dict.

    +

    In [1]: from pygom.loss.read_epijson import epijson_to_data_frame

    +

    In [2]: import pkgutil

    +

    In [3]: data = pkgutil.get_data(‘pygom’, ‘data/eg1.json’)

    +

    In [3]: df = epijson_to_data_frame(data)

    +

    In [4]: print(df)

    +

    Given that the aim of loading the data is usually for model fitting, we +allow EpiJSON as input directly to the loss class +pygom.loss.EpijsonLoss which uses the Poisson loss under the hood.

    +

    In [1]: from pygom.model import common_models

    +

    In [2]: from pygom.loss.epijson_loss import EpijsonLoss

    +

    In [3]: ode = common_models.SIR([0.5, 0.3])

    +

    In [4]: obj = EpijsonLoss([0.005, 0.03], ode, data, ‘Death’, ‘R’, +[300, 2, 0])

    +

    In [5]: print(obj.cost())

    +

    In [6]: print(obj._df)

    +

    Given an initialized object, all the operations are inherited from +pygom.loss.BaseLoss. We demonstrated above how to calculate the cost +and the rest will not be shown for brevity. The data frame is stored +inside of the loss object and can be retrieved for inspection at any +time point.

    +

    Rather unfortunately, initial values for the states is still required, +but the time is not. When the time is not supplied, then the first time +point in the data will be treated as \(t0\). The input Death indicate which column of the data is used +and \(R\) the corresponding state the data belongs to.

    +
    + + + + +
    + + + + + + +
    + + + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/notebooks/fh.html b/docs/pygom-doc/_build/html/notebooks/fh.html new file mode 100644 index 00000000..60ab7ebe --- /dev/null +++ b/docs/pygom-doc/_build/html/notebooks/fh.html @@ -0,0 +1,588 @@ + + + + + + + + + + + + Example: Fitz Hugh — PyGOM documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    +
    + + + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Example: Fitz Hugh

    + +
    + +
    +
    + + + + +
    + +
    +

    Example: Fitz Hugh#

    +
    +

    Defining the model#

    +

    We are going to investigate another classic model here, the +FitzHugh-Nagumo, or simply FitzHugh here. The model has already been +defined in common_models so we can load it easily

    +

    In [1]: from pygom import SquareLoss, common_models

    +

    In [2]: import numpy

    +

    In [3]: import scipy.integrate, scipy.optimize

    +

    In [4]: import math,time,copy

    +

    In [5]: import matplotlib.pyplot as plt

    +

    In [1]: x0 = [-1.0, 1.0]

    +

    In [2]: t0 = 0

    +

    In [3]: # params

    +

    In [4]: paramEval = [(‘a’,0.2), (‘b’,0.2), (‘c’,3.0)]

    +

    In [5]: ode = common_models.FitzHugh(paramEval)

    +

    In [5]: ode.initial_values = (x0, t0)

    +

    Define a set of time points and lets see how the two states \(V\) and \(R\) +are suppose to behave.

    +

    In [6]: t = numpy.linspace(1, 20, 30).astype(‘float64’)

    +

    In [7]: solution = ode.integrate(t)

    +

    @savefig fh_plot.png In [8]: ode.plot()

    +
    +
    +

    Estimate the parameters#

    +

    Obtaining the correct parameters for the FitzHugh model is well known to +be difficult, this is because the surface is multimodal. Although this +has been shown many times in the literature, so we will omit the +details. Regardless, we give it a go with some initial guess. with some +luck, we will be able to recover the original parameters. First, we try +it out with only one target state

    +

    In [26]: theta = [0.5, 0.5, 0.5]

    +

    In [27]: objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,1], +‘R’)

    +

    In [28]: boxBounds = [
    +.…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0) .…: ]

    +

    In [29]: res = scipy.optimize.minimize(fun=objFH.cost,
    +.…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…: +method=’L-BFGS-B’)

    +

    In [30]: print(res)

    +

    Then we try the same again but with both state as our target. Now we +won’t look at the iterations because they are pretty pointless.

    +

    In [30]: objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,:], +[‘V’,’R’])

    +

    In [31]: res = scipy.optimize.minimize(fun=objFH.cost,
    +.…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…: +method=’L-BFGS-B’)

    +

    In [32]: print(res)

    +

    Note how the estimates are the same, unlike other models.

    +
    +
    +

    Estimate initial value#

    +

    We can further assume that we have no idea about the initial values for +\(V\) and \(R\) as well. We also provide guesstimate to set off the +optimization. The input vector \(\theta\) must have the parameters first, +then the initial values, along with the corresponding bounds.

    +

    First, only a single target state, i.e. we only have observations for +one of states which is \(R\) in this case

    +

    In [35]: objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,1], +‘R’)

    +

    In [35]: boxBounds = [
    +.…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0), .…: (None,None), .…: +(None,None) .…: ]

    +

    In [36]: res = scipy.optimize.minimize(fun=objFH.costIV,
    +.…: jac=objFH.sensitivityIV, .…: x0=theta + [-0.5,0.5], .…: +bounds=boxBounds, .…: method=’L-BFGS-B’)

    +

    In [37]: print(res)

    +

    then both state as target at the same time

    +

    In [38]: objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,:], +[‘V’,’R’])

    +

    In [38]: res = scipy.optimize.minimize(fun=objFH.costIV,
    +.…: jac=objFH.sensitivityIV, .…: x0=theta + [-0.5, 0.5], .…: +bounds=boxBounds, .…: method=’L-BFGS-B’)

    +

    In [39]: print(res)

    +

    See the difference between the two estimate with the latter, both state +were used, yielding superior estimates. Note that only the forward +sensitivity method is implemented when estimating the initial value, and +it is assumed that the starting condition for all the states are +unknown.

    +

    The choice of algorithm here is the L-BFGS-B which is a better +choice because the parameter space of the FitzHugh is rough (i.e. large +second derivative) as well as being multimodal. This means that the +Hessian is not guaranteed to be positive definite and approximation +using \(J^{\top}J\) is poor, with \(J\) being the Jacobian of the objective +function.

    +
    +
    + + + + +
    + + + + + + +
    + + + + + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/notebooks/gradient.html b/docs/pygom-doc/_build/html/notebooks/gradient.html new file mode 100644 index 00000000..a9b6063c --- /dev/null +++ b/docs/pygom-doc/_build/html/notebooks/gradient.html @@ -0,0 +1,795 @@ + + + + + + + + + + + + Gradient estimation under square loss — PyGOM documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    + + + +
    +
    + + + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Gradient estimation under square loss

    + +
    + +
    +
    + + + + +
    + +
    +

    Gradient estimation under square loss#

    +

    Assuming that we have a set of \(N\) observations \(y_{i}\) at specific time +points \(t_{i}\), \(i = 1,\ldots,N\), we may wish to test out a set of ode +to see whether it fits to the data. The most natural way to test such +fit is to minimize the sum of squares between our observations \(y\) and +see whether the resulting solution of the ode and the estimationed +parameters makes sense.

    +

    We assume that this estimation process will be tackled through a +non-linear optimization point of view. However, it should be noted that +such estimates can also be performed via MCMC or from a global +optimization perspective. A key element in non-linear optimization is +the gradient, which is the focus of this page.

    +

    Multiple ways of obtaining the gradient have been implemented. All of +them serve a certain purpose and may not be a viable/appropriate options +depending on the type of ode. More generally, let \(d,p\) be the number of +states and paramters respectively. Then finite difference methods have a +run order of \(O(p+1)\) of the original ode, forward sensitivity require +an integration of an ode of size \((d+1)p\) rather than \(d\). The adjoint +method require two run of size \(d\) in principle, but actual run time is +dependent on the number of observations.

    +

    For the details of the classes and methods, please refer to mod.

    +
    +

    Notation#

    +

    We introduce the notations that will be used in the rest of the page, +some of which may be slightly unconventional but necessary due to the +complexity of the problem. Let \(x \in \mathbb{R}^{d}\) and +\(\theta \in \mathbb{R}^{p}\) be the states and parameters respectively. +The term state or simulation are used interchangeably, even though +strictly speaking a state is \(x\) whereas \(x(t)\) is the simulation. An +ode is defined as

    +
    +\[f(x,\theta) = \dot{x} = \frac{\partial x}{\partial t}\]
    +

    and usually comes with a set of initial conditions \((x_0,t_0)\) where +\(t_0 \le t_{i} \forall i\). Let \(g(x,\theta)\) be a function that maps the +set of states to the observations, +\(g : \mathbb{R}^{d} \rightarrow \mathbb{R}^{m}\). For compartmental +problems, which is our focus, \(\nabla_{\theta}g(x,\theta)\) is usually +zero and \(\nabla_{x}g(x,\theta)\) is an identity function for some or all +of the states \(x\). Denote \(l(x_{0},\theta,x)\) as our cost function +\(l : \mathbb{R}^{m} \rightarrow \mathbb{R}\) and \(L(x_{0},\theta,x)\) be +the sum of \(l(\cdot)\). Both \(x\) and \(x_{0}\) are usually dropped for +simplicity. We will be dealing exclusively with square loss here, which +means that

    +
    +\[L(\theta) = \sum_{i=1}^{N} \left\| y_{i} - g(x(t_{i})) \right\|^{2} = \mathbf{e}^{\top} \mathbf{e}\]
    +

    where \(\mathbf{e}\) is the residual vector, with elements

    +
    +\[e_{i} = y_{i} - x(t_{i}).\]
    +
    +
    +

    Model setup#

    +

    Again, we demonstrate the functionalities of our classes using an SIR +model.

    +

    In [1]: from pygom import SquareLoss, common_models

    +

    In [2]: import copy,time,numpy

    +

    In [2]: ode = common_models.SIR()

    +

    In [3]: paramEval = [(‘beta’,0.5), (‘gamma’,1.0/3.0) ]

    +

    In [7]: # the initial state, normalized to zero one

    +

    In [8]: x0 = [1., 1.27e-6, 0.]

    +

    In [5]: # initial time

    +

    In [6]: t0 = 0

    +

    In [5]: ode.parameters = paramEval

    +

    In [6]: ode.initial_values = (x0, t0)

    +

    In [9]: # set the time sequence that we would like to observe

    +

    In [10]: t = numpy.linspace(1, 150, 100)

    +

    In [11]: numStep = len(t)

    +

    In [11]: solution = ode.integrate(t)

    +

    In [12]: y = solution[1::,2].copy()

    +

    In [13]: y += numpy.random.normal(0, 0.1, y.shape)

    +

    Now we have set up the model along with some observations, obtaining the +gradient only requires the end user to put the appropriate information +it into the class SquareLoss. Given the initial guess \(\theta\)

    +

    In [210]: theta = [0.2, 0.2]

    +

    We initialize the SquareLoss simply as

    +

    In [20]: objSIR = SquareLoss(theta, ode, x0, t0, t, y, ‘R’)

    +

    where the we also have to specify the state our observations are from. +Now, we demonstrate the different methods in obtaining the gradient and +mathematics behind it.

    +
    +
    +

    Forward sensitivity#

    +

    The forward sensitivity equations are derived by differentiating the +states implicitly, which yields

    +
    +\[\frac{d\dot{x}}{d\theta} = \frac{\partial f}{\partial x}\frac{dx}{d\theta} + \frac{\partial f}{\partial \theta}.\]
    +

    So finding the sensitivies \(\frac{dx}{d\theta}\) simply require another +integration of a \(p\) coupled ode of \(d\) dimension, each with the same +Jacobian as the original ode. This integration is performed along with +the original ode because of possible non-linearity.

    +

    A direct call to the method sensitivity <pygom.SquareLoss.sensitivity> +computed the gradient

    +

    In [33]: gradSens = objSIR.sensitivity()

    +

    whereas .jac will allow the end user to obtain the Jacobian (of the +objective function) and the residuals, the information required to get +the gradient as we see next.

    +

    In [33]: objJac, output = objSIR.jac(full_output=True)

    +
    +
    +

    Gradient#

    +

    Just the sensitivities alone are not enough to obtain the gradient, but +we are \(90\%\) there. Differentiating the loss function

    +
    +\[\begin{split}\begin{aligned} +\frac{dL}{d\theta} &= \nabla_{\theta} \sum_{i=1}^{N}\frac{dl}{dg} \\ + &= \sum_{i=1}^{N} \frac{\partial l}{\partial x}\frac{dx}{d\theta} + \frac{\partial l}{\partial \theta} \\ + &= \sum_{i=1}^{N} \frac{\partial l}{\partial g}\frac{\partial g}{\partial x}\frac{dx}{d\theta} + \frac{\partial l}{\partial g}\frac{\partial g}{\partial \theta} +\end{aligned}\end{split}\]
    +

    via chain rule. When \(\frac{\partial g}{\partial \theta} = 0\), the total +gradient simplifies to

    +
    +\[\frac{dL}{d\theta} = \sum_{i=1}^{N} \frac{\partial l}{\partial g}\frac{\partial g}{\partial x}\frac{dx}{d\theta}\]
    +

    Obviously, the time indicies are dropped above but all the terms above +are evaluated only at the observed time points. More concretely, this +means that

    +
    +\[\begin{split}\begin{aligned} +\frac{\partial l(x(j),\theta)}{\partial g} = \left\{ \begin{array}{ll} -2(y_{i} - x(j)) & , \; j = t_{i} \\ 0 & \; \text{otherwise} \end{array} \right. +\end{aligned}\end{split}\]
    +

    When \(g(\cdot)\) is an identity function (which is assumed to be the case +in SquareLoss)

    +
    +\[\frac{\partial g(x(t_{i}),\theta)}{\partial x} = I_{d}\]
    +

    then the gradient simplifies even further as it is simply

    +
    +\[\frac{dL}{d\theta} = -2\mathbf{e}^{\top}\mathbf{S}\]
    +

    where \(\mathbf{e}\) is the vector of residuals and +\(\mathbf{S} = \left[\mathbf{s}_{1},\mathbf{s}_{2},\ldots,\mathbf{s}_{n}\right]\) +with elements

    +
    +\[\mathbf{s}_{i} = \frac{dx}{d\theta}(t_{i}),\]
    +

    the solution of the forward sensitivies at time \(t_{i}\), obtained from +solving the coupled ode as mentioned previously.

    +
    +
    +

    Jacobian#

    +

    Now note how the gradient simplifies to \(-2\mathbf{e}^{\top}\mathbf{S}\). +Recall that a standard result in non-linear programming states that the +gradient of a sum of sqaures objective function \(L(\theta,y,x)\) is

    +
    +\[\nabla_{\theta} L(\theta,y,x) = -2(\mathbf{J}^{T} \left[\mathbf{y} - \mathbf{f}(x,\boldsymbol{\theta}) \right] )^{\top}\]
    +

    with \(f(x,\theta)\) our non-linear function and \(J\) our Jacobian with +elements

    +
    +\[J_{i} = \frac{\partial f(x_{i},\boldsymbol{\theta})}{\partial \boldsymbol{\theta}}.\]
    +

    This is exactly what we have seen previously, substituting in reveals +that \(J = \mathbf{S}\). Hence, the Jacobian is (a necessary)by product +when we wish to obtain the gradient. In fact, this is exactly how we +proceed in sensitivity <pygom.SquareLoss.sensitivity> where it makes +an internal call to jac <pygom.SqaureLoss.jac> to obtain the Jacobian +first. This allows the end user to have more options when choosing which +type of algorithms to use, i.e. Gauss-Newton or Levenberg-Marquardt.

    +

    To check that the output is in fact the same

    +

    In [1]: objJac.transpose().dot(-2*output[‘resid’]) - gradSens

    +
    +
    +

    Adjoint#

    +

    When the number of parameters increases, the number of sensitivies also +increases. The time required scales directly with the number of +parameters. We describe another method which does not depend on the +number of parameters, but rather, the number of states and observations.

    +

    The full derivations will not be shown here, but we aim to provide +enough information to work out the steps performed in the our code. Let +write our optimization problem as

    +
    +\[\begin{split}\begin{aligned} +min_{\theta} \quad & \int_{t_{0}}^{T} l(x_{0},\theta,x(t)) dt \\ +s.t. \quad & \dot{x} = f(x,\theta) +\end{aligned}\end{split}\]
    +

    which is identical to the original problem but in a continuous setting. +Now write the constrained problem in the Lagrangian form

    +
    +\[min_{\theta} \; L(\theta) + \int_{t_{0}}^{T} \lambda^{\top}(\dot{x} - f(x,\theta))\]
    +

    with Lagrangian multiplier \(\lambda \ge 0\). After some algebraic +manipulation, it can be shown that the total derivative of the +Lagrangian function is

    +
    +\[\frac{dL}{d\theta} = \int_{t_{0}}^{T} \left(\frac{\partial l}{\partial \theta} - \lambda^{\top}\frac{\partial f}{\partial \theta} \right) dt.\]
    +

    Using previously defined loss functions (the identity), the first term +is zero and evaluating \(\frac{\partial f}{\partial \theta}\) is trivial. +What remains is the calculation of \(\lambda(t)\) for +\(t \in \left[t_{0},T\right]\).

    +

    Although this still seem to be ill-posed problem when Looking at the +Lagrangian function, one can actually obtain the adjoint equation, +after certain assumptions and

    +
    +\[\frac{d\lambda^{\top}}{dt} = \frac{\partial l}{\partial x} - \lambda^{\top}\frac{\partial f}{\partial \theta}.\]
    +

    which is again an integration. An unfortunate situation arise here for +non-linear systems because we use the minus Jacobian in the adjoint +equation. So if the eigenvalues of the Jacobian indicate that our +original ode is stable, such as -1, the minus eigenvalues (now 1) +implies that the adjoint equation is not stable. Therefore, one must +integrate backward in time to solve the adjoint equation and it cannot +be solved simultaneously as the ode, unlike the forward sensitivity +equations.

    +

    Given a non-linearity ode, we must store information about the states +between \(t_{0}\) and \(T\) in order to perform the integration. There are +two options, both require storing many evaluated \(x(j)\) within the +interval \(\left[t_{0},T\right]\). Unfortunately, only one is available; +interpolation over all states and integrate using the interpolating +functions. The alternative of using observed \(x(j)'s\) at fixed points is +not competitive because we are unable to use fortran routines for the +integration

    +

    The method of choice here to perform the adjoint calcuation is to run a +forward integration, then perform an interpolation using splines with +explicit knots at the observed time points.

    +

    In [326]: odeSIRAdjoint, outputAdjoint = +objSIR.adjoint(full_output=True)

    +

    This is because evaluating the Jacobian may be expensive and Runge-kutta +method suffers as the complexity increases. In non-linear model such as +those found in epidemiology, each element of the Jacobian may be the +result of a complicated equation where linear step method will shine as +it makes as little function evaluation as possible. Note that +derivations in the literature, the initial condition when evaluating the +adjoint equation is \(\lambda(T)=0\). But in our code we used +\(\lambda(T) = -2(y(T)-x(T))\). Recall that we have observation \(y(T)\) and +simulation \(x(T)\), so that the adjoint equation evaluated at time \(T\)

    +
    +\[\frac{\partial \lambda^{\top}}{\partial t} \Big|_{T} = -2(y-f(x,\theta))\Big|_{T} - \lambda(T)\frac{\partial f}{\partial \theta}\Big|_{T}\]
    +

    with the second term equal to zero. Integration under step size \(h\) +implies that +\(\lambda(T) \approx \lim_{h \to 0} \lambda(T-h) = -2(y(T)-x(T))\).

    +
    +
    +

    Time Comparison#

    +

    A simple time comparison between the different methods reveals that the +forward sensitivity method dominates the others by a wide margin. It +will be tempting to conclude that it is the best and should be the +default at all times but that is not true, due to the complexity of each +method mentioned previously. We leave it to the end user to find out the +best method for their specific problem.

    +

    In [319]: %timeit gradSens = objSIR.sensitivity()

    +

    In [326]: %timeit odeSIRAdjoint,outputAdjoint = +objSIR.adjoint(full_output=True)

    +
    +
    +

    Hessian#

    +

    The Hessian is defined by

    +
    +\[\frac{\partial^{2} l}{\partial \theta^{2}} = \left( \frac{\partial l}{\partial x} \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + \frac{\partial x}{\partial \theta}^{\top}\frac{\partial^{2} l}{\partial x^{2}}\frac{\partial x}{\partial \theta}\]
    +

    where \(\otimes\) is the Kronecker product. Note that \(\nabla_{\theta} x\) +is the sensitivity and the second order sensitivities can be found again +via the forward method, which involve another set of ode’s, namely the +forward-forward sensitivities

    +
    +\[\frac{\partial}{\partial t}\left(\frac{\partial^{2} x}{\partial \theta^{2}}\right) = \left( \frac{\partial f}{\partial x} \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + \left( I_{d} \otimes \frac{\partial x}{\partial \theta}^{\top} \right) \frac{\partial^{2} f}{\partial x^{2}} \frac{\partial x}{\partial \theta}.\]
    +

    From before, we know that

    +
    +\[\frac{\partial l}{\partial x} = (-2y+2x) \quad and \quad \frac{\partial^{2} l}{\partial x^{2}} = 2I_{d}\]
    +

    so our Hessian reduces to

    +
    +\[\frac{\partial^{2} l}{\partial \theta^{2}} = \left( \left(-2y+2x\right) \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + 2S^{\top}S,\]
    +

    where the second term is a good approximation to the Hessian as +mentioned previously. This is the only implementation in place so far +even though obtaining the estimate this way is relatively slow.

    +

    Just to demonstate how it works, lets look at the Hessian at the optimal +point. First, we obtain the optimal value

    +

    In [211]: import scipy.linalg,scipy.optimize

    +

    In [212]: boxBounds = [(0.0, 2.0), (0.0, 2.0)]

    +

    In [213]: res = scipy.optimize.minimize(fun=objSIR.cost,
    +.….: jac=objSIR.sensitivity, .….: x0=theta, .….: bounds=boxBounds, .….: +method=’L-BFGS-B’)

    +

    Then compare again the least square estimate of the covariance matrix +against our version

    +

    In [211]: resLS, cov_x, infodict, mesg, ier = +scipy.optimize.leastsq(func=objSIR.residual, x0=res[‘x’], +full_output=True)

    +

    In [212]: HJTJ, outputHJTJ = objSIR.hessian(full_output=True)

    +

    In [311]: print(scipy.linalg.inv(HJTJ))

    +

    In [312]: print(cov_x)

    +

    also note the difference between the Hessian and the approximation using +the Jacobian, which is in fact what the least squares routine uses.

    +

    In [313]: print(scipy.linalg.inv(outputHJTJ[‘JTJ’]))

    +
    +
    + + + + +
    + + + + + + +
    + + + + + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/notebooks/sir.html b/docs/pygom-doc/_build/html/notebooks/sir.html index df37f3e5..e44e6e21 100644 --- a/docs/pygom-doc/_build/html/notebooks/sir.html +++ b/docs/pygom-doc/_build/html/notebooks/sir.html @@ -7,7 +7,7 @@ - + Motivating Example: SIR Model — PyGOM documentation @@ -165,12 +165,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} @@ -381,7 +386,6 @@

    Contents

    Motivating Example: SIR Model#

    -

    this notebook

    Defining the model#

    First, we are going to go through an SIR model to show the functionality @@ -398,7 +402,17 @@

    Defining the model
    -
    from pygom import Transition, TransitionType
    +
    from pygom import Transition, TransitionType
    +
    +
    +
    +
    +
    ---------------------------------------------------------------------------
    +ModuleNotFoundError                       Traceback (most recent call last)
    +Cell In[1], line 1
    +----> 1 from pygom import Transition, TransitionType
    +
    +ModuleNotFoundError: No module named 'pygom'
     
    @@ -408,7 +422,7 @@

    Defining the model
    -
    stateList = ['S', 'I', 'R']
    +
    stateList = ['S', 'I', 'R']
     
    @@ -418,7 +432,7 @@

    Defining the model
    -
    paramList = ['beta', 'gamma']
    +
    paramList = ['beta', 'gamma']
     
    @@ -428,11 +442,11 @@

    Defining the model
    -
    odeList = [
    -    Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),
    -    Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),
    -    Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) 
    -    ]
    +
    odeList = [
    +    Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),
    +    Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),
    +    Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) 
    +    ]
     
    @@ -446,7 +460,7 @@

    Defining the model
    -
    from pygom import DeterministicOde
    +
    from pygom import DeterministicOde
     
    @@ -456,7 +470,7 @@

    Defining the model
    -
    model = DeterministicOde(stateList, paramList, ode=odeList)
    +
    model = DeterministicOde(stateList, paramList, ode=odeList)
     
    @@ -464,7 +478,7 @@

    Defining the model
    -
    model.get_ode_eqn()
    +
    model.get_ode_eqn()
     
    @@ -481,12 +495,12 @@

    Defining the model
    -
    # now we are going to define in a different order. note that the output ode changed with the input state
    -stateList = ['R', 'S', 'I']
    +
    # now we are going to define in a different order. note that the output ode changed with the input state
    +stateList = ['R', 'S', 'I']
     
    -model = DeterministicOde(stateList, paramList, ode=odeList)
    +model = DeterministicOde(stateList, paramList, ode=odeList)
     
    -model.get_ode_eqn()
    +model.get_ode_eqn()
     
    @@ -502,7 +516,7 @@

    Defining the model
    -
    model.print_ode()
    +
    model.print_ode()
     
    @@ -518,7 +532,7 @@

    Defining the model
    -
    model.print_ode(True)
    +
    model.print_ode(True)
     
    @@ -537,7 +551,7 @@

    Extracting model information
    -
    model.linear_ode()
    +
    model.linear_ode()
     
    @@ -550,7 +564,7 @@

    Extracting model information
    -
    model.get_jacobian_eqn()
    +
    model.get_jacobian_eqn()
     
    @@ -562,7 +576,7 @@

    Extracting model information
    -
    model.get_grad_eqn()
    +
    model.get_grad_eqn()
     
    @@ -579,7 +593,7 @@

    Extracting model information
    -
    model.state_list
    +
    model.state_list
     
    @@ -602,18 +616,18 @@

    Initial value problem
    -
    model.parameters
    +
    model.parameters
     
    -
    paramEval = [('beta',0.5), ('gamma',1.0/3.0)]
    +
    paramEval = [('beta',0.5), ('gamma',1.0/3.0)]
     
    -model.parameters = paramEval
    +model.parameters = paramEval
     
    -model.parameters
    +model.parameters
     
    @@ -628,9 +642,9 @@

    Initial value problem
    -
    initialState = [0, 1, 1.27e-6]
    +
    initialState = [0, 1, 1.27e-6]
         
    -model.ode(state=initialState, t=1)
    +model.ode(state=initialState, t=1)
     
    @@ -646,12 +660,12 @@

    Initial value problemWe are well equipped to solve an initial value problem, using the standard numerical integrator such as odeint <scipy.integrate.odeint> from scipy.integrate. We also used matplotlib.pyplot for plotting and linspace <numpy.linspace> to create the time vector.

    -
    import scipy.integrate
    -import numpy
    +
    import scipy.integrate
    +import numpy
     
    -t = numpy.linspace(0, 150, 100)
    +t = numpy.linspace(0, 150, 100)
     
    -solution = scipy.integrate.odeint(model.ode, initialState, t)
    +solution = scipy.integrate.odeint(model.ode, initialState, t)
     
    @@ -659,29 +673,29 @@

    Initial value problemWe can plot our solution to observe a standard SIR shape.

    -
    import matplotlib.pyplot as plt
    +
    import matplotlib.pyplot as plt
     
    -plt.figure()
    +plt.figure()
     
    -plt.plot(t, solution[:,0], label='R')
    +plt.plot(t, solution[:,0], label='R')
     
    -plt.plot(t, solution[:,1], label='S')
    +plt.plot(t, solution[:,1], label='S')
     
    -plt.plot(t, solution[:,2], label='I')
    +plt.plot(t, solution[:,2], label='I')
     
    -plt.xlabel('Time')
    +plt.xlabel('Time')
     
    -plt.ylabel('Population proportion')
    +plt.ylabel('Population proportion')
     
    -plt.title('Standard SIR model')
    +plt.title('Standard SIR model')
     
    -plt.legend(loc=0)
    +plt.legend(loc=0)
     
    -#@savefig sir_plot.png In 
    +#@savefig sir_plot.png In 
     
    -plt.show()
    +plt.show()
     
    -#plt.close()
    +#plt.close()
     
    @@ -692,13 +706,13 @@

    Initial value problemAlternatively, we can integrate and plot via the ode object which we initialized earlier.

    -
    model.initial_values = (initialState, t[0])
    +
    model.initial_values = (initialState, t[0])
     
    -model.parameters = paramEval
    +model.parameters = paramEval
     
    -solution = model.integrate(t[1::])
    +solution = model.integrate(t[1::])
     
    -model.plot()
    +model.plot()
     
    @@ -709,38 +723,39 @@

    Initial value problemWe could solve the ODEs above using the Jacobian as well. Unfortunately, it does not help because the number of times the Jacobian was evaluated was zero, as expected given that our set of equations are not stiff.

    -
    #TODO what does this show?
    -%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)
    +
    #TODO what does this show?
    +%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)
     
    -
    1.11 ms ± 45.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
    +
    2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
     
    -
    %timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)
    +
    
    +%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)
     
    -
    1.2 ms ± 89 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
    +
    2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
     
    -
    %timeit solution3, output3 = model.integrate(t, full_output=True)
    +
    
    +%timeit solution3, output3 = model.integrate(t, full_output=True)
     
    -
    The slowest run took 4.46 times longer than the fastest. This could mean that an intermediate result is being cached.
    -2.2 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
    +
    2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
     
    @@ -752,71 +767,71 @@

    Solving the forward sensitivity equation
    -
    stateList = ['S', 'I', 'R']
    +
    stateList = ['S', 'I', 'R']
     
    -model = DeterministicOde(stateList, paramList, ode=odeList)
    +model = DeterministicOde(stateList, paramList, ode=odeList)
     
    -initialState = [1, 1.27e-6, 0]
    +initialState = [1, 1.27e-6, 0]
     
    -paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]
    +paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]
     
    -model.parameters = paramEval
    +model.parameters = paramEval
     
    -solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)
    +solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)
     
    -
    {
    -    "tags": [
    -        "hide-input",
    -    ]
    -}
    -f,axarr = plt.subplots(3,3);
    +
    {
    +    "tags": [
    +        "hide-input",
    +    ]
    +}
    +f,axarr = plt.subplots(3,3);
     
    -f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')
    +f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')
     
    -axarr[0,0].plot(t, solution[:,0])
    +axarr[0,0].plot(t, solution[:,0])
     
    -axarr[0,0].set_title('S')
    +axarr[0,0].set_title('S')
     
    -axarr[0,1].plot(t, solution[:,1])
    +axarr[0,1].plot(t, solution[:,1])
     
    -axarr[0,1].set_title('I')
    +axarr[0,1].set_title('I')
     
    -axarr[0,2].plot(t, solution[:,2]);
    +axarr[0,2].plot(t, solution[:,2]);
     
    -axarr[0,2].set_title('R')
    +axarr[0,2].set_title('R')
     
    -axarr[1,0].plot(t, solution[:,3])
    +axarr[1,0].plot(t, solution[:,3])
     
    -axarr[1,0].set_title(r'state S parameter $beta$')
    +axarr[1,0].set_title(r'state S parameter $beta$')
     
    -axarr[2,0].plot(t, solution[:,4])
    +axarr[2,0].plot(t, solution[:,4])
     
    -axarr[2,0].set_title(r'state S parameter $gamma$')
    +axarr[2,0].set_title(r'state S parameter $gamma$')
     
    -axarr[1,1].plot(t, solution[:,5])
    +axarr[1,1].plot(t, solution[:,5])
     
    -axarr[1,1].set_title(r'state I parameter $beta$')
    +axarr[1,1].set_title(r'state I parameter $beta$')
     
    -axarr[2,1].plot(t, solution[:,6])
    +axarr[2,1].plot(t, solution[:,6])
     
    -axarr[2,1].set_title(r'state I parameter $gamma$')
    +axarr[2,1].set_title(r'state I parameter $gamma$')
     
    -axarr[1,2].plot(t, solution[:,7])
    +axarr[1,2].plot(t, solution[:,7])
     
    -axarr[1,2].set_title(r'state R parameter $beta$')
    +axarr[1,2].set_title(r'state R parameter $beta$')
     
    -axarr[2,2].plot(t, solution[:,8])
    +axarr[2,2].plot(t, solution[:,8])
     
    -axarr[2,2].set_title(r'state R parameter $gamma$')
    +axarr[2,2].set_title(r'state R parameter $gamma$')
     
    -plt.tight_layout()
    +plt.tight_layout()
     
    -plt.show()
    +plt.show()
     
    diff --git a/docs/pygom-doc/_build/html/notebooks/stochastic.html b/docs/pygom-doc/_build/html/notebooks/stochastic.html index e165133a..3898cdbd 100644 --- a/docs/pygom-doc/_build/html/notebooks/stochastic.html +++ b/docs/pygom-doc/_build/html/notebooks/stochastic.html @@ -7,7 +7,7 @@ - + Stochastic representation of ODEs — PyGOM documentation @@ -66,7 +66,7 @@ - + @@ -165,12 +165,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde}
  • @@ -386,38 +391,51 @@

    Stochastic representation of ODEsMotivating Example: SIR Model.

    +

    #TODO add comment about using a density or frequency formulation (use of population size) - currently unexplained

    -
    from pygom import SimulateOde, Transition, TransitionType
    +
    from pygom import SimulateOde, Transition, TransitionType
     
    -import matplotlib.pyplot as plt
    +import matplotlib.pyplot as plt
     
    -import numpy as np
    +import numpy as np
     
    -# initial conditions
    -Ix0 = [1, 1.27e-6, 0]
    +# initial conditions
    +Ix0 = [1, 1.27e-6, 0]
     
    -# time period
    -t = np.linspace(0, 150, 100)
    +# time period
    +t = np.linspace(0, 150, 100)
     
    -stateList = ['S', 'I', 'R']
    +stateList = ['S', 'I', 'R']
     
    -paramList = ['beta', 'gamma']
    +paramList = ['beta', 'gamma']
     
    -transitionList = [Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T), 
    -                  Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)]
    +transitionList = [Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T), 
    +                  Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)]
     
    -# create the ODEs
    -odeS = SimulateOde(stateList, paramList, transition=transitionList)
    +# create the ODEs
    +odeS = SimulateOde(stateList, paramList, transition=transitionList)
     
    -# assign parameter values
    -odeS.parameters = [0.5, 1.0/3.0]
    +# assign parameter values
    +odeS.parameters = [0.5, 1.0/3.0]
     
    -# assign initial values
    -odeS.initial_values = (Ix0, t[0])
    +# assign initial values
    +odeS.initial_values = (Ix0, t[0])
     
    -# solve deterministic solution
    -solutionReference = odeS.integrate(t[1::], full_output=False)
    +# solve deterministic solution
    +solutionReference = odeS.integrate(t[1::], full_output=False)
    +
    +
    +
    +
    +
    ---------------------------------------------------------------------------
    +ModuleNotFoundError                       Traceback (most recent call last)
    +Cell In[1], line 1
    +----> 1 from pygom import SimulateOde, Transition, TransitionType
    +      3 import matplotlib.pyplot as plt
    +      5 import numpy as np
    +
    +ModuleNotFoundError: No module named 'pygom'
     
    @@ -438,19 +456,19 @@

    Stochastic Parameters
    - -
    +
    - -Hide code cell content + +Hide code cell source
    -
    f, axarr = plt.subplots(1,3, layout='constrained')
    +
    f, axarr = plt.subplots(1,3, layout='constrained')
     
    -#TODO tidy up plots
    -for solution in Yall:  
    -    axarr[0].plot(t, solution[:,0]) 
    -    axarr[1].plot(t, solution[:,1]) 
    -    axarr[2].plot(t, solution[:,2])
    +#TODO tidy up plots
    +for solution in Yall:  
    +    axarr[0].plot(t, solution[:,0]) 
    +    axarr[1].plot(t, solution[:,1]) 
    +    axarr[2].plot(t, solution[:,2])
     
    -for idx, state in enumerate(stateList):
    -    axarr[idx].set_title(state)
    +for idx, state in enumerate(stateList):
    +    axarr[idx].set_title(state)
     
    -plt.show()
    +plt.show()
     
    +
    -../_images/a2b4c66c36cd941577d5e6e1b74bf026da21420ebaaa2c33c4960b32e1325dcf.png +../_images/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png
    -

    We then see how the expected results, using the sample average of the simulations

    @@ -496,72 +514,122 @@

    Stochastic Parametersdiffers from the reference solution

    \[\hat{x}(T) = \int_{t_{0}}^{T} f(\mathbb{E}\left[ \theta \right],x,t) dt\]
    -
    +
    +
    + + +Hide code cell source +
    -
    f, axarr = plt.subplots(1,3)
    +
    f, axarr = plt.subplots(1,3, layout='constrained')
    +
    +for i in range(3): 
    +    axarr[i].plot(t, Ymean[:,i] - solutionReference[:,i])
    +    axarr[i].set_title(stateList[i])
     
    -for i in range(3): 
    -    axarr[i].plot(t, Ymean[:,i] - solutionReference[:,i])
    +plt.show()
     
    -plt.show()
     
    +
    -../_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png +../_images/edaf46c89c79b126b3212a4b236b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png
    -
    +
    +
    + + +Hide code cell source +
    -
    f, axarr = plt.subplots(1,3, layout='constrained', sharey=True)
    +
    f, axarr = plt.subplots(1,3, layout='constrained', sharey=False)
     
    -for i in range(3): 
    -    axarr[i].plot(t, Ymean[:,i], label='sample average')
    -    axarr[i].plot(t, solutionReference[:,i], label='reference')
    +for i in range(3): 
    +    axarr[i].plot(t, Ymean[:,i], label='sample average')
    +    axarr[i].plot(t, solutionReference[:,i], label='reference')
    +    axarr[i].set_title(stateList[i])
     
    -axarr[2].legend()
    -plt.show()
    +axarr[2].legend()
    +plt.show()
     
    +
    -../_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png +../_images/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png
    -

    The difference is relatively large especially for the \(S\) state. We can -decrease this difference as we increase the number of simulation, and -more sophisticated sampling method for the generation of random -variables can also decrease the difference.

    +

    The difference between the deterministic reference and averaged solutions is relatively large, especially for the \(S\) state. +We can decrease this difference as we increase the number of simulations, and also by using more sophisticated sampling methods for the generation of random +variables.

    +
    +

    Tip

    In addition to using the built-in functions to represent stochasticity, we can also use standard frozen distributions from scipy. Note that it must be a frozen distribution as that is the only for the parameters of the distributions to propagate through the model.

    -

    In [1]: import scipy.stats as st

    -

    In [1]: d = dict()

    -

    In [1]: d[‘beta’] = st.gamma(a=100.0, scale=1.0/200.0)

    -

    In [1]: d[‘gamma’] = st.gamma(a=100.0, scale=1.0/300.0)

    -

    In [1]: odeS.parameters = d

    -

    Obviously, there may be scenarios where only some of the parameters are +

    +
    +
    +
    import scipy.stats as st
    +
    +d = dict()
    +
    +d['beta'] = st.gamma(a=100.0, scale=1.0/200.0)
    +
    +d['gamma'] = st.gamma(a=100.0, scale=1.0/300.0)
    +
    +odeS.parameters = d
    +
    +
    +
    +
    +

    There may be scenarios where only some of the parameters are stochastic. Let’s say that the \(\gamma\) parameter is fixed at \(1/3\), -then simply replace the distribution information with a scalar. A quick -visual inspection at the resulting plot suggests that the system of ODE +then we can replace the distribution information with a scalar. A quick +visual inspection at the resulting plot suggests that the system of ODEs potentially has less variation when compared to the case where both parameters are stochastic.

    -

    In [1]: d[‘gamma’] = 1.0/3.0

    -

    In [1]: odeS.parameters = d

    -

    In [1]: YmeanSingle, YallSingle = odeS.simulate_param(t[1::], 5, -full_output=True)

    -

    In [1]: f, axarr = plt.subplots(1,3)

    -

    In [1]: for solution in YallSingle:
    -…: axarr[0].plot(t,solution[:,0]) …: -axarr[1].plot(t,solution[:,1]) …: -axarr[2].plot(t,solution[:,2])

    -

    @savefig stochastic_param_single.png In [1]: plt.show()

    -

    In [1]: plt.close()

    +
    +
    +
    d['gamma'] = 1.0/3.0
    +
    +odeS.parameters = d
    +
    +YmeanSingle, YallSingle = odeS.simulate_param(t[1::], 5, full_output=True)
    +
    +
    +
    +
    +
    +
    + + +Hide code cell source + +
    +
    f, axarr = plt.subplots(1,3)
    +
    +for solution in YallSingle:  
    +    axarr[0].plot(t,solution[:,0]) 
    +    axarr[1].plot(t,solution[:,1]) 
    +    axarr[2].plot(t,solution[:,2])
    +
    +plt.show()
    +
    +
    +
    +
    +
    +../_images/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png +
    +

    Continuous Markov Representation#

    -

    Another common method of introducing stochasticity into a set of ode is +

    Another common method of introducing stochasticity into a set of ODEs is by assuming each movement in the system is a result of a jump process. More concretely, the probabilty of a move for transition \(j\) is governed by an exponential distribution such that

    @@ -569,88 +637,135 @@

    Continuous Markov Representation\(\lambda_{j}\) is the rate of transition for process \(j\) and \(\tau\) the time elapsed after current time \(t\).

    -

    A couple of the commmon implementation for the jump process have been -implemented where two of them are used during a normal simulation; the -first reaction method [Gillespie1977] and the \(\tau\)-Leap method -[Cao2006]. The two changes interactively depending on the size of -the states.

    -

    In [1]: x0 = [2362206.0, 3.0, 0.0]

    -

    In [1]: stateList = [‘S’, ‘I’, ‘R’]

    -

    In [1]: paramList = [‘beta’, ‘gamma’, ‘N’]

    -

    In [1]: transitionList = [
    -…: Transition(origin=’S’, destination=’I’, equation=’beta*S*I/N’, -transition_type=TransitionType.T), …: Transition(origin=’I’, -destination=’R’, equation=’gamma*I’, transition_type=TransitionType.T) -…: ]

    -

    In [1]: odeS = SimulateOde(stateList, paramList, -transition=transitionList)

    -

    In [1]: odeS.parameters = [0.5, 1.0/3.0, x0[0]]

    -

    In [1]: odeS.initial_values = (x0, t[0])

    -

    In [1]: solutionReference = odeS.integrate(t[1::])

    -

    In [1]: simX, simT = odeS.simulate_jump(t[1:10], 10, -full_output=True)

    -

    In [1]: f, axarr = plt.subplots(1, 3)

    -

    In [1]: for solution in simX:
    -…: axarr[0].plot(t[:9], solution[:,0]) …: -axarr[1].plot(t[:9], solution[:,1]) …: axarr[2].plot(t[:9], -solution[:,2])

    -

    @savefig stochastic_process.png In [1]: plt.show()

    -

    In [1]: plt.close()

    -

    Above, we see ten different simulation, again using the SIR model but -without standardization of the initial conditions. We restrict our time -frame to be only the first 10 time points so that the individual changes -can be seen more clearly above. If we use the same time frame as the one +

    Two of the commmon algorithms for the jump process have been +implemented for use during simulation; the reaction method [Gillespie1977] and the \(\tau\)-Leap method +[Cao2006]. The two change interactively depending on the size of the states.

    +
    +
    +
    x0 = [2362206.0, 3.0, 0.0]
    +
    +stateList = ['S', 'I', 'R']
    +
    +paramList = ['beta', 'gamma', 'N']
    +
    +transitionList = [Transition(origin='S', destination='I', equation='beta*S*I/N', transition_type=TransitionType.T),
    +                  Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)
    +                  ]
    +
    +odeS = SimulateOde(stateList, paramList, transition=transitionList)
    +
    +odeS.parameters = [0.5, 1.0/3.0, x0[0]]
    +
    +odeS.initial_values = (x0, t[0])
    +
    +solutionReference = odeS.integrate(t[1::])
    +
    +simX, simT = odeS.simulate_jump(t[1:10], 10, full_output=True)
    +
    +f, axarr = plt.subplots(1, 3)
    +
    +for solution in simX:  
    +    axarr[0].plot(t[:9], solution[:,0])
    +    axarr[1].plot(t[:9], solution[:,1]) 
    +    axarr[2].plot(t[:9], solution[:,2])
    +
    +plt.show()
    +
    +
    +
    +
    +../_images/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png +
    +
    +

    Above, we see 10 different simulations, again using the SIR model but +without standardization of the initial conditions (we include \(N\) as a parameter in our model). +For demonstration purposes, we restrict our time +frame to be only the first 10 time points so that the individual changes or stochasticity +can be seen more clearly. If we use the same time frame as the one used previously for the deterministic system (as shown below), the trajectories are smoothed out and we no longer observe the jumps. -Looking at the raw trajectories of the ODE below, it is obvious that the +Looking at the raw trajectories of the ODEs below, we see that the mean from a jump process is very different to the deterministic -solution. The reason behind this is that the jump process above was able +solution. This occurs because the jump process above was able to fully remove all the initial infected individuals before any new -ones.

    -

    In [1]: simX,simT = odeS.simulate_jump(t, 5, full_output=True)

    -

    In [1]: simMean = np.mean(simX, axis=0)

    -

    In [1]: f, axarr = plt.subplots(1,3)

    -

    In [1]: for solution in simX:
    -…: axarr[0].plot(t, solution[:,0]) …: axarr[1].plot(t, -solution[:,1]) …: axarr[2].plot(t, solution[:,2])

    -

    @savefig stochastic_process_compare_large_n_curves.png In [1]: -plt.show()

    -

    In [1]: plt.close()

    +ones occured.

    +
    +
    +
    simX,simT = odeS.simulate_jump(t, 5, full_output=True)
    +
    +simMean = np.mean(simX, axis=0)
    +
    +f, axarr = plt.subplots(1,3)
    +
    +for solution in simX:  
    +    axarr[0].plot(t, solution[:,0]) 
    +    axarr[1].plot(t, solution[:,1]) 
    +    axarr[2].plot(t, solution[:,2])
    +
    +plt.show()
    +
    +
    +
    +
    +../_images/77d7df2c54dad550496302d8c6230ce9bfb40c9f05977928aaf8c36881d21523.png +
    +

    Repeatable Simulation#

    -

    One of the possible use of compartmental models is to generate +

    One of the possible uses of compartmental models is to generate forecasts. Although most of the time the requirement would be to have (at least point-wise) convergence in the limit, reproducibility is also important. For both types of interpretation explained above, we have given the package the capability to repeat the simulations by setting a seed. When the assumption is that the parameters follows some sort of -distribution, we simply set the seed which governs the global state of +distribution, we can set the seed which governs the global state of the random number generator.

    -

    In [1]: x0 = [2362206.0, 3.0, 0.0]

    -

    In [1]: odeS = SimulateOde(stateList, paramList, -transition=transitionList)

    -

    In [1]: d = {‘beta’: st.gamma(a=100.0, scale=1.0/200.0), ‘gamma’: -st.gamma(a=100.0, scale=1.0/300.0), ‘N’: x0[0]}

    -

    In [1]: odeS.parameters = d

    -

    In [1]: odeS.initial_values = (x0, t[0])

    -

    In [1]: Ymean, Yall = odeS.simulate_param(t[1::], 10, -full_output=True)

    -

    In [1]: np.random.seed(1)

    -

    In [1]: Ymean1, Yall1 = odeS.simulate_param(t[1::], 10, -full_output=True)

    -

    In [1]: np.random.seed(1)

    -

    In [1]: Ymean2, Yall2 = odeS.simulate_param(t[1::], 10, -full_output=True)

    -

    In [1]: sim_diff = [np.linalg.norm(Yall[i] - yi) for i, yi in -enumerate(Yall1)]

    -

    In [1]: sim_diff12 = [np.linalg.norm(Yall2[i] - yi) for i, yi in -enumerate(Yall1)]

    -

    In [1]: print(“Different in the simulations and the mean: (%s, %s) ” % -(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))

    -

    In [1]: print(“Different in the simulations and the mean using same -seed: (%s, %s) ” % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 - -Ymean1))))

    +
    +
    +
    x0 = [2362206.0, 3.0, 0.0]
    +
    +odeS = SimulateOde(stateList, paramList, transition=transitionList)
    +
    +d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':st.gamma(a=100.0, scale=1.0/300.0), 'N': x0[0]}
    +
    +odeS.parameters = d
    +
    +odeS.initial_values = (x0, t[0])
    +
    +Ymean, Yall = odeS.simulate_param(t[1::], 10, full_output=True)
    +
    +
    +
    +
    +
    +
    +
    
    +np.random.seed(1)
    +
    +Ymean1, Yall1 = odeS.simulate_param(t[1::], 10, full_output=True)
    +
    +np.random.seed(1)
    +
    +Ymean2, Yall2 = odeS.simulate_param(t[1::], 10, full_output=True)
    +
    +sim_diff = [np.linalg.norm(Yall[i] - yi) for i, yi in enumerate(Yall1)]
    +
    +sim_diff12 = [np.linalg.norm(Yall2[i] - yi) for i, yi in enumerate(Yall1)]
    +
    +print("Different in the simulations and the mean: (%s, %s) " %(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))
    +
    +print("Different in the simulations and the mean using same seed: (%s, %s) " % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 - Ymean1))))
    +
    +
    +
    +
    +
    Different in the simulations and the mean: (81103473.8935847, 52437230.37979218) 
    +Different in the simulations and the mean using same seed: (0.0, 0.0) 
    +
    +
    +
    +

    In the alternative interpretation, setting the global seed is insufficient. Unlike simulation based on the parameters, where we can pre-generate all the parameter values and send them off to individual @@ -660,27 +775,43 @@

    Repeatable Simulationparallel in the function signature. By ensuring that the computation runs in serial, we can make use of the global seed and generate identical runs.

    -

    In [1]: x0 = [2362206.0, 3.0, 0.0]

    -

    In [1]: odeS = SimulateOde(stateList, paramList, -transition=transitionList)

    -

    In [1]: odeS.parameters = [0.5, 1.0/3.0, x0[0]]

    -

    In [1]: odeS.initial_values = (x0, t[0])

    -

    In [1]: simX, simT = odeS.simulate_jump(t[1:10], 10, parallel=False, -full_output=True)

    -

    In [1]: np.random.seed(1)

    -

    In [1]: simX1, simT1 = odeS.simulate_jump(t[1:10], 10, -parallel=False, full_output=True)

    -

    In [1]: np.random.seed(1)

    -

    In [1]: simX2, simT2 = odeS.simulate_jump(t[1:10], 10, -parallel=False, full_output=True)

    -

    In [1]: sim_diff = [np.linalg.norm(simX[i] - x1) for i, x1 in -enumerate(simX1)]

    -

    In [1]: sim_diff12 = [np.linalg.norm(simX2[i] - x1) for i, x1 in -enumerate(simX1)]

    -

    In [1]: print(“Difference in simulation: %s” % -np.sum(np.abs(sim_diff)))

    -

    In [1]: print(“Difference in simulation using same seed: %s” % -np.sum(np.abs(sim_diff12)))

    +
    +
    +
    x0 = [2362206.0, 3.0, 0.0]
    +
    +odeS = SimulateOde(stateList, paramList, transition=transitionList)
    +
    +odeS.parameters = [0.5, 1.0/3.0, x0[0]]
    +
    +odeS.initial_values = (x0, t[0])
    +
    +simX, simT = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)
    +
    +np.random.seed(1)
    +
    +simX1, simT1 = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)
    +
    +np.random.seed(1)
    +
    +simX2, simT2 = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)
    +
    +sim_diff = [np.linalg.norm(simX[i] - x1) for i, x1 in enumerate(simX1)]
    +
    +sim_diff12 = [np.linalg.norm(simX2[i] - x1) for i, x1 in enumerate(simX1)]
    +
    +print("Difference in simulation: %s" %np.sum(np.abs(sim_diff)))
    +
    +print("Difference in simulation using same seed: %s" %np.sum(np.abs(sim_diff12)))
    +
    +
    +
    +
    +
    Difference in simulation: 2534.4614923250074
    +Difference in simulation using same seed: 0.0
    +
    +
    +
    +

    @@ -729,7 +860,7 @@

    Repeatable Simulation

    next

    -

    Convert ODE into transitions {#unrollOde}

    +

    Convert ODE into transitions

    diff --git a/docs/pygom-doc/_build/html/notebooks/transition.html b/docs/pygom-doc/_build/html/notebooks/transition.html index 2ee948a8..86112bc1 100644 --- a/docs/pygom-doc/_build/html/notebooks/transition.html +++ b/docs/pygom-doc/_build/html/notebooks/transition.html @@ -7,7 +7,7 @@ - + Transition Object — PyGOM documentation @@ -165,12 +165,17 @@
  • Motivating Example: SIR Model
  • Transition Object
  • Stochastic representation of ODEs
  • -
  • Convert ODE into transitions {#unrollOde} @@ -380,7 +385,6 @@

    Contents

    Transition Object#

    -

    this notebook

    The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in transition. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.)

    All transitions that get fed into the ODE system need to be defined as a transition object, Transition. It takes a total of four input arguments:

      @@ -399,13 +403,25 @@

      Transition Object
      -
      from pygom import Transition, TransitionType, common_models
      +
      from pygom import Transition, TransitionType, common_models
       
      -ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)
      +ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)
       
      -ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)
      +ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)
       
      -ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)
      +ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)
      +
      +
      +
      +
      +
      ---------------------------------------------------------------------------
      +ModuleNotFoundError                       Traceback (most recent call last)
      +Cell In[1], line 1
      +----> 1 from pygom import Transition, TransitionType, common_models
      +      3 ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)
      +      5 ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)
      +
      +ModuleNotFoundError: No module named 'pygom'
       
      @@ -415,13 +431,13 @@

      Transition ObjectDeterministicOde,

      -
      from pygom import DeterministicOde
      +
      from pygom import DeterministicOde
       
      -stateList = ['S', 'I', 'R']
      +stateList = ['S', 'I', 'R']
       
      -paramList = ['beta', 'gamma']
      +paramList = ['beta', 'gamma']
       
      -model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])
      +model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])
       
      @@ -429,14 +445,10 @@

      Transition Object
      -
      model.get_ode_eqn()
      +
      model.get_ode_eqn()
       
      -
      -
      -\[\begin{split}\displaystyle \left[\begin{matrix}- I S \beta\\I S \beta - I \gamma\\I \gamma\end{matrix}\right]\end{split}\]
      -

      Now we are going to show the different ways of defining the same set of ODEs.

      @@ -459,22 +471,18 @@

      Transition Object
      -
      from pygom import SimulateOde
      +
      from pygom import SimulateOde
       
      -t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)
      +t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)
       
      -t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)
      +t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)
       
      -modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])
      +modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])
       
      -modelTrans.get_ode_eqn()
      +modelTrans.get_ode_eqn()
       
      -
      -
      -\[\begin{split}\displaystyle \left[\begin{matrix}- I S \beta\\I S \beta - I \gamma\\I \gamma\end{matrix}\right]\end{split}\]
      -

      We can see that the resulting ODE is exactly the same, as expected. The transition matrix that defines this process can be visualized @@ -483,7 +491,7 @@

      Transition Object
      -
      modelTrans.get_transition_matrix()
      +
      modelTrans.get_transition_matrix()
       
      @@ -494,9 +502,9 @@

      Transition Object
      -
      import matplotlib.pyplot as plt
      -# TODO why are two images produced? issue #75
      -modelTrans.get_transition_graph(show=False)
      +
      import matplotlib.pyplot as plt
      +# TODO why are two images produced? issue #75
      +modelTrans.get_transition_graph(show=False)
       
      @@ -514,15 +522,15 @@

      Transition Objecttransition_type=TransitionType.B. For this simple example, this formulation takes a similar form to defining using ODE equations.

      -
      birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)
      +
      birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)
       
      -birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)
      +birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)
       
      -birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)
      +birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)
       
      -modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])
      +modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])
       
      -modelBirth.get_ode_eqn()
      +modelBirth.get_ode_eqn()
       
      @@ -534,15 +542,15 @@

      Transition Objecttransition_type=TransitionType.D.

      -
      death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)
      +
      death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)
       
      -birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)
      +birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)
       
      -death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)
      +death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)
       
      -modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])
      +modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])
       
      -modelBD.get_ode_eqn()
      +modelBD.get_ode_eqn()
       
      @@ -558,18 +566,18 @@

      Model AdditionmodelTrans) and includes a birth process to the \(S\) state, and death processes to the \(S\) and \(I\) states.

      -
      modelBD2 = modelTrans
      +
      modelBD2 = modelTrans
       
      -modelBD2.param_list = paramList + ['mu', 'B']
      +modelBD2.param_list = paramList + ['mu', 'B']
       
      -birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B),  
      -                  Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), 
      -                  Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)
      -                  ]
      +birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B),  
      +                  Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), 
      +                  Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)
      +                  ]
       
      -modelBD2.birth_death_list = birthDeathList
      +modelBD2.birth_death_list = birthDeathList
       
      -modelBD2.get_ode_eqn()
      +modelBD2.get_ode_eqn()
       
      @@ -585,10 +593,10 @@

      Transition type summaryIn summary, there are four different types of transitions allowed. These are B, D, ODE and T, which are defined in an enum class also located in transition.

      - diff --git a/docs/pygom-doc/_build/html/notebooks/unroll/unrollHard.html b/docs/pygom-doc/_build/html/notebooks/unroll/unrollHard.html index b100d5aa..d35b5ca6 100644 --- a/docs/pygom-doc/_build/html/notebooks/unroll/unrollHard.html +++ b/docs/pygom-doc/_build/html/notebooks/unroll/unrollHard.html @@ -7,7 +7,7 @@ - + Hard Problem — PyGOM documentation @@ -66,6 +66,7 @@ + @@ -164,12 +165,17 @@
    1. Motivating Example: SIR Model
    2. Transition Object
    3. Stochastic representation of ODEs
    4. -
    5. Convert ODE into transitions {#unrollOde}
    6. @@ -466,6 +472,15 @@

      Hard ProblemODE With Birth and Death Process

      + +
      +

      next

      +

      Simple Epidemic Analysis

      +
      + +

      diff --git a/docs/pygom-doc/_build/html/notebooks/unroll/unrollSimple.html b/docs/pygom-doc/_build/html/notebooks/unroll/unrollSimple.html index 53c87b20..5e93c0e6 100644 --- a/docs/pygom-doc/_build/html/notebooks/unroll/unrollSimple.html +++ b/docs/pygom-doc/_build/html/notebooks/unroll/unrollSimple.html @@ -7,7 +7,7 @@ - + Simple Problem — PyGOM documentation @@ -67,7 +67,7 @@ - + @@ -165,12 +165,17 @@
    7. Motivating Example: SIR Model
    8. Transition Object
    9. Stochastic representation of ODEs
    10. -
    11. Convert ODE into transitions {#unrollOde}
    12. @@ -438,7 +443,7 @@

      Simple Problem

      previous

      -

      Convert ODE into transitions {#unrollOde}

      +

      Convert ODE into transitions

      K?Mjls7kOTNuw1zbYgY9THa1d=^hn+vwtb2l||5PYwM%|4tq~-=jT%Be7guhVr-?C#~0^jF3zg z)ibWOM7t?bf$_6Ga@Z!~&(}A1n+xrz*epO&@qErf!0jDynp1)&5}Xda{r&UTuCf_F zek4&j#D;L=k$>NZW2P1{;u_5%9K{7zR!MghU!9)lwLfaZ4djkF82n~P@MHh zh@gpRPnZ?blg<*yc%CD^jk3wC4%%kIi9~Ie3#x&++#jc{qL~*|6;tAbS|r#aKKfZ# zRGP?u`c;RNaAB{9iLB_Ab-C9HN}Y*!R+^*NFCY&d?SCjJC?o6+qzZ{it3>6)8*@Ld zm!E`^BopMW7^dxt2)cZdA+0&D6@3@iRbC{{x#K9jt;2{`+pJb=3*7iJ?l&JAIN`rm z(t$AO(^|cD!&p|d9VC5_^}cpl@|uLsf=Nl;xQzfiebb1Oy#wAb-`z*J3;UgBdD`+} z_DLVvpMOvG%k2YXl(3p1kB^JRFz|&@q=rl9UQ;3J8=`J{eM^Kv%%FFyJ^yRz)GNXS zvlys$Xr_A%`mgmFFdW+HNwTf~S>x4_3O>x(z kpYo4r3Otnc<=w}OcJ}P_Jsklp8gc!j>%@~kVFM+vQC}`V3;+NC delta 537 zcmV+!0_Oem1%m~Ub$?XLZrd;ryz46nJu1Z+s&OH&rM^vw$hK`n<+wi z>1M4_XEh2?b~&b;#svDs{^3iumWHZq1DvYYg%bgDG~n7y3C_e^J8=8w*Y8843-|ar zP<0X+VP?_2Pk(C;5kYZ}>g11Njg1!ET-Z0R8eltvxq{lV*PHxw+{^l?U?}Cfo{{jG zKy3+&id&M!pfH^0Ol?fY&RWrHC$5o@?Rr5m;mhMCy(XexP&AGuI8-A+j`(bsR+?c8 zqr|n4OxngcRo)FZKshe_!u*=7>db|O*Sby9726*tcvIFkkT+`frK5&2S z@!R}66g1$9XB!^t%{1W~P+;|5f09(O)|iZI!CG_r)f8auoXBTx#DB 1 from pygom import Transition, TransitionType + +ModuleNotFoundError: No module named 'pygom' +ModuleNotFoundError: No module named 'pygom' diff --git a/docs/pygom-doc/_build/html/reports/notebooks/stochastic.err.log b/docs/pygom-doc/_build/html/reports/notebooks/stochastic.err.log new file mode 100644 index 00000000..71aae027 --- /dev/null +++ b/docs/pygom-doc/_build/html/reports/notebooks/stochastic.err.log @@ -0,0 +1,66 @@ +Traceback (most recent call last): + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\jupyter_cache\executors\utils.py", line 58, in single_nb_execution + executenb( + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 1265, in execute + return NotebookClient(nb=nb, resources=resources, km=km, **kwargs).execute() + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\jupyter_core\utils\__init__.py", line 160, in wrapped + return loop.run_until_complete(inner) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\asyncio\base_events.py", line 650, in run_until_complete + return future.result() + ^^^^^^^^^^^^^^^ + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\contextlib.py", line 222, in __aexit__ + await self.gen.athrow(typ, value, traceback) + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 648, in async_setup_kernel + yield + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 703, in async_execute + await self.async_execute_cell( + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 1021, in async_execute_cell + await self._check_raise_for_error(cell, cell_index, exec_reply) + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 915, in _check_raise_for_error + raise CellExecutionError.from_cell_and_msg(cell, exec_reply_content) +nbclient.exceptions.CellExecutionError: An error occurred while executing the following cell: +------------------ +from pygom import SimulateOde, Transition, TransitionType + +import matplotlib.pyplot as plt + +import numpy as np + +# initial conditions +Ix0 = [1, 1.27e-6, 0] + +# time period +t = np.linspace(0, 150, 100) + +stateList = ['S', 'I', 'R'] + +paramList = ['beta', 'gamma'] + +transitionList = [Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T), + Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)] + +# create the ODEs +odeS = SimulateOde(stateList, paramList, transition=transitionList) + +# assign parameter values +odeS.parameters = [0.5, 1.0/3.0] + +# assign initial values +odeS.initial_values = (Ix0, t[0]) + +# solve deterministic solution +solutionReference = odeS.integrate(t[1::], full_output=False) +------------------ + +--------------------------------------------------------------------------- +ModuleNotFoundError Traceback (most recent call last) +Cell In[1], line 1 +----> 1 from pygom import SimulateOde, Transition, TransitionType + 3 import matplotlib.pyplot as plt + 5 import numpy as np + +ModuleNotFoundError: No module named 'pygom' +ModuleNotFoundError: No module named 'pygom' + diff --git a/docs/pygom-doc/_build/html/reports/notebooks/transition.err.log b/docs/pygom-doc/_build/html/reports/notebooks/transition.err.log index de7de1b6..95faaa4b 100644 --- a/docs/pygom-doc/_build/html/reports/notebooks/transition.err.log +++ b/docs/pygom-doc/_build/html/reports/notebooks/transition.err.log @@ -1,43 +1,43 @@ Traceback (most recent call last): - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\nbclient\client.py", line 776, in _async_poll_for_reply - msg = await ensure_async(self.kc.shell_channel.get_msg(timeout=new_timeout)) - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\jupyter_core\utils\__init__.py", line 184, in ensure_async - result = await obj - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\jupyter_client\channels.py", line 230, in get_msg - raise Empty -_queue.Empty - -During handling of the above exception, another exception occurred: - -Traceback (most recent call last): - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\jupyter_cache\executors\utils.py", line 58, in single_nb_execution + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\jupyter_cache\executors\utils.py", line 58, in single_nb_execution executenb( - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\nbclient\client.py", line 1265, in execute + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 1265, in execute return NotebookClient(nb=nb, resources=resources, km=km, **kwargs).execute() - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\jupyter_core\utils\__init__.py", line 168, in wrapped + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\jupyter_core\utils\__init__.py", line 160, in wrapped return loop.run_until_complete(inner) - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\asyncio\base_events.py", line 647, in run_until_complete + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\asyncio\base_events.py", line 650, in run_until_complete return future.result() - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\nbclient\client.py", line 703, in async_execute + ^^^^^^^^^^^^^^^ + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\contextlib.py", line 222, in __aexit__ + await self.gen.athrow(typ, value, traceback) + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 648, in async_setup_kernel + yield + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 703, in async_execute await self.async_execute_cell( - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\nbclient\client.py", line 1002, in async_execute_cell - exec_reply = await self.task_poll_for_reply - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\nbclient\client.py", line 800, in _async_poll_for_reply - error_on_timeout_execute_reply = await self._async_handle_timeout(timeout, cell) - File "C:\Users\Hannah.Williams\.conda\envs\sphinx-doc\lib\site-packages\nbclient\client.py", line 852, in _async_handle_timeout - raise CellTimeoutError.error_from_timeout_and_cell( -nbclient.exceptions.CellTimeoutError: A cell timed out while it was being executed, after 30 seconds. -The message was: Cell execution timed out. -Here is a preview of the cell contents: -------------------- -death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D) + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 1021, in async_execute_cell + await self._check_raise_for_error(cell, cell_index, exec_reply) + File "C:\Users\Hannah.Williams\.conda\envs\pygom-dev\Lib\site-packages\nbclient\client.py", line 915, in _check_raise_for_error + raise CellExecutionError.from_cell_and_msg(cell, exec_reply_content) +nbclient.exceptions.CellExecutionError: An error occurred while executing the following cell: +------------------ +from pygom import Transition, TransitionType, common_models + +ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE) -birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B) +ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE) -death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D) +ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) +------------------ -modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3]) +--------------------------------------------------------------------------- +ModuleNotFoundError Traceback (most recent call last) +Cell In[1], line 1 +----> 1 from pygom import Transition, TransitionType, common_models + 3 ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE) + 5 ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE) -modelBD.get_ode_eqn() -------------------- +ModuleNotFoundError: No module named 'pygom' +ModuleNotFoundError: No module named 'pygom' diff --git a/docs/pygom-doc/_build/html/search.html b/docs/pygom-doc/_build/html/search.html index 3dc6e509..6c826f04 100644 --- a/docs/pygom-doc/_build/html/search.html +++ b/docs/pygom-doc/_build/html/search.html @@ -168,6 +168,11 @@
    13. Hard Problem
    14. +
    15. Simple Epidemic Analysis
    16. +
    17. Reading and using EpiJSON data
    18. +
    19. Solving Boundary Value Problems
    20. +
    21. Gradient estimation under square loss
    22. +
    23. Example: Fitz Hugh
    24. diff --git a/docs/pygom-doc/_build/html/searchindex.js b/docs/pygom-doc/_build/html/searchindex.js index 5ee53082..c275433c 100644 --- a/docs/pygom-doc/_build/html/searchindex.js +++ b/docs/pygom-doc/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["intro", "markdown", "md/getting_started", "md/unrollOde", "mdconvert/common_models/", "mdconvert/doc_to_sort/", "mdconvert/mod/", "mdconvert/unroll/", "notebooks/sir", "notebooks/stochastic", "notebooks/transition", "notebooks/unroll/unrollBD", "notebooks/unroll/unrollHard", "notebooks/unroll/unrollSimple"], "filenames": ["intro.md", "markdown.md", "md\\getting_started.md", "md\\unrollOde.md", "mdconvert\\common_models\\.md", "mdconvert\\doc_to_sort\\.md", "mdconvert\\mod\\.md", "mdconvert\\unroll\\.md", "notebooks\\sir.ipynb", "notebooks\\stochastic.ipynb", "notebooks\\transition.ipynb", "notebooks\\unroll\\unrollBD.ipynb", "notebooks\\unroll\\unrollHard.ipynb", "notebooks\\unroll\\unrollSimple.ipynb"], "titles": ["Welcome to the documentation for PyGOM", "Markdown Files", "Getting started", "Convert ODE into transitions", ".SIR_Birth_Death{.interpreted-text role=\u201dfunc\u201d}", "Solving Boundary Value Problems {#bvpSimple}", "stochastic", "Simple Problem {#unrollSimple}", "Motivating Example: SIR Model", "Stochastic representation of ODEs", "Transition Object", "ODE With Birth and Death Process", "Hard Problem", "Simple Problem"], "terms": {"python": [0, 2], "gener": [0, 9], "od": [0, 2, 5, 8, 10, 12, 13], "model": [0, 2, 3, 4, 6, 7, 9, 11, 12, 13], "packag": [0, 5, 8, 9], "aim": [0, 5], "facilit": 0, "applic": 0, "ordinari": [0, 2], "differenti": [0, 2, 5], "equat": [0, 2, 5, 9, 11, 12, 13], "real": 0, "world": 0, "focu": 0, "epidemiolog": 0, "thi": [0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13], "help": [0, 1, 5, 8, 10], "defin": [0, 2, 3, 5, 7, 9, 11, 12, 13], "system": [0, 2, 5, 8, 9, 10, 12], "an": [0, 1, 4, 5, 8, 9, 10], "intuit": 0, "manner": 0, "provid": [0, 2, 3, 8], "conveni": 0, "function": [0, 1, 2, 3, 5, 8, 9], "make": [0, 9], "us": [0, 1, 5, 7, 8, 9, 10, 12, 13], "variou": [0, 8], "algebra": [0, 2], "numer": [0, 2, 5, 8], "librari": 0, "backend": [0, 9], "can": [0, 1, 2, 3, 5, 8, 9, 10, 12], "straight": 0, "forward": [0, 2], "fashion": 0, "open": 0, "sourc": 0, "project": 0, "host": 0, "github": [0, 2], "A": [0, 2, 9, 12], "manuscript": 0, "contain": 0, "shorten": 0, "motiv": [0, 9, 10], "arxxiv": 0, "todo": [0, 2, 8, 9, 10], "insert": [0, 1], "intro": 0, "text": [0, 1, 2, 3, 5, 7, 8, 9], "markdown": 0, "file": [0, 2], "get": [0, 1, 10], "start": [0, 1, 5, 10], "getting_start": [], "exampl": [0, 1, 4, 5, 9, 10], "sir": [0, 4, 7, 9, 10, 11, 13], "from": [0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13], "index": 0, "rst": [0, 2], "whether": 1, "you": [1, 2, 5], "write": 1, "your": 1, "book": 1, "s": [1, 4, 5, 7, 8, 9, 10, 11, 12, 13], "content": 1, "jupyt": 1, "notebook": [1, 8, 10], "ipynb": 1, "regular": 1, "md": 1, "ll": 1, "same": [1, 4, 8, 9, 10, 12], "flavor": 1, "call": [1, 8, 9], "simpl": [1, 8, 10, 12], "show": [1, 5, 7, 8, 9, 10, 13], "off": [1, 9, 10], "some": [1, 2, 3, 8, 9, 12], "syntax": [1, 9], "stand": 1, "markedli": 1, "structur": 1, "It": [1, 8, 10], "slight": 1, "variat": [1, 9], "commonmark": 1, "small": 1, "extens": 1, "allow": [1, 2, 5, 10], "sphinx": 1, "ecosystem": 1, "For": [1, 7, 8, 9, 10, 13], "about": [1, 2], "see": [1, 8, 9, 10], "overview": 1, "ar": [1, 2, 3, 4, 5, 8, 9, 10], "two": [1, 5, 7, 8, 9, 10, 11, 12, 13], "most": [1, 8, 9, 10], "power": 1, "tool": 1, "thei": [1, 2, 10], "kind": 1, "like": [1, 5], "written": 1, "markup": 1, "languag": 1, "both": [1, 5, 8, 9, 12], "serv": 1, "similar": [1, 10], "purpos": [1, 2], "one": [1, 9, 10, 12], "line": [1, 2, 7, 12, 13], "wherea": 1, "span": 1, "mani": 1, "accept": 1, "differ": [1, 5, 7, 8, 9, 10, 12, 13], "input": [1, 5, 8, 10], "do": [1, 3, 8, 10], "those": 1, "depend": [1, 9], "specif": 1, "being": [1, 2, 8], "here": [1, 2, 5, 8, 9, 10], "note": [1, 2, 4, 8, 9, 10], "render": [1, 10], "special": 1, "box": 1, "when": [1, 2, 3, 8, 9, 10], "build": 1, "inlin": 1, "refer": [1, 5, 9], "document": [1, 8], "also": [1, 5, 8, 9, 10, 12], "cite": 1, "store": 1, "bibtex": 1, "follow": [1, 2, 8, 9, 10, 11, 12], "holdgraf_evidence_2014": 1, "moreov": 1, "bibliographi": 1, "page": 1, "The": [1, 2, 5, 8, 9, 10, 12], "must": [1, 8, 9], "all": [1, 2, 3, 5, 8, 9, 10, 12], "properli": 1, "bib": 1, "just": [1, 3, 5], "starter": 1, "lot": 1, "jupyterbook": 1, "org": 1, "end": [2, 4, 5, 7, 8, 10, 11, 12, 13], "user": [2, 8], "easili": 2, "set": [2, 5, 8, 9, 10], "inform": [2, 3, 5, 9], "invok": [2, 8], "appropri": 2, "method": [2, 5, 9], "we": [2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13], "frac": [2, 4, 5, 7, 8, 10, 11, 12, 13], "partial": [], "mathbf": 2, "x": [2, 8, 9], "t": [2, 5, 8, 9, 10, 12], "f": [2, 8, 9, 11, 12], "boldsymbol": 2, "theta": [2, 9], "where": [2, 5, 8, 9, 10, 12], "left": [2, 5, 8, 9, 10], "x_": 2, "1": [2, 8, 9, 11, 12, 13], "2": [2, 8, 9, 11, 12, 13], "ldot": 2, "n": [2, 9, 12], "right": [2, 5, 8, 9, 10], "state": [2, 5, 8, 9, 10, 12], "vector": [2, 8], "d": [2, 5, 9, 10, 12], "paramet": [2, 5, 8], "p": [2, 5, 12], "dimens": 2, "current": [2, 8, 9], "find": [2, 5, 8], "express": 2, "jacobian": [2, 8], "gradient": [2, 5, 8], "sensit": 2, "output": [2, 8], "given": [2, 8, 9], "valu": [2, 9, 10, 12], "onli": [2, 3, 5, 8, 9, 10, 12], "import": [2, 8, 9, 10, 11, 12, 13], "class": [2, 7, 8, 10], "deterministicod": [2, 5, 8, 10], "interpret": [2, 3, 5, 7, 9], "role": [2, 3, 5, 7], "describ": [2, 10], "previous": [2, 3, 9, 10], "expos": 2, "plan": 2, "extend": [2, 10], "includ": [2, 8, 10], "solv": [2, 9], "analyt": 2, "linear": [2, 8], "analysi": 2, "via": [2, 3, 5, 8, 9, 10], "eigenvalu": [2, 5], "dure": [2, 9], "integr": [2, 8, 9], "detect": 2, "dae": 2, "locat": [2, 10], "pull": 2, "http": [2, 5], "com": [2, 5], "publichealthengland": 2, "pygom": [2, 6, 8, 9, 10, 11, 12, 13], "git": 2, "bin": 2, "doc": 2, "loss": [2, 5], "sbml_translat": 2, "utilr": [2, 9], "licens": 2, "txt": 2, "readm": 2, "requir": [2, 5, 8, 9], "setup": [2, 5], "py": 2, "each": [2, 8, 9, 10], "three": [2, 5, 10, 11], "main": 2, "folder": 2, "shown": [2, 5, 9, 12], "command": 2, "local": 2, "level": 2, "pleas": 2, "redund": [2, 5], "kept": 2, "develop": 2, "time": [2, 3, 4, 5, 8, 9], "perform": 2, "prior": 2, "after": [2, 9, 10, 12], "standard": [2, 8, 9, 10], "found": 2, "respect": [2, 8], "run": [2, 8, 9], "which": [2, 5, 7, 8, 9, 10, 11, 12, 13], "desir": 2, "next": [4, 8], "look": [4, 8, 9], "birth": [4, 10], "death": [4, 10], "begin": [4, 5, 7, 8, 10, 11, 12, 13], "align": [4, 5, 7, 8, 10, 11, 12, 13], "ds": [4, 7, 8, 11, 12, 13], "dt": [4, 5, 7, 8, 9, 11, 12, 13], "b": [4, 10, 11], "beta": [4, 7, 8, 9, 10, 11, 12, 13], "si": [4, 7, 8, 10, 11, 13], "mu": [4, 8, 10, 11], "di": [4, 7, 8, 11, 12, 13], "gamma": [4, 7, 8, 9, 10, 11, 13], "i": [4, 7, 8, 9, 10, 11, 12, 13], "dr": [4, 7, 8, 11, 12, 13], "continu": [4, 8], "abov": [4, 8, 9], "now": [4, 5, 8, 10, 12], "much": 4, "longer": [4, 8, 9], "frame": [4, 9], "rate": [4, 9], "In": [5, 8, 9, 10, 11, 12, 13], "addit": [5, 8, 9, 11], "solut": [5, 8, 9], "ivp": 5, "estim": [5, 8], "unknown": [5, 9], "bvp": 5, "littl": 5, "bit": 5, "imagin": 5, "go": [5, 8, 10, 12], "how": [5, 8, 9, 10], "treat": 5, "essenti": 5, "shoot": 5, "first": [5, 8, 9, 10], "condit": [5, 8, 9], "initi": [5, 7, 9, 10, 13], "second": [5, 9], "observ": [5, 8, 9], "matlab": 5, "try": [5, 8, 9], "order": [5, 8], "nabla": 5, "y": 5, "0": [5, 8, 9, 10, 11], "subject": 5, "4": [5, 8, 12, 13], "convert": [0, 5, 12], "y_": 5, "auxiliari": 5, "variabl": [5, 9], "up": [5, 8, 9, 10], "below": [5, 7, 9, 12, 13], "check": [5, 8, 10], "correct": [5, 8], "befor": [5, 9], "proceed": 5, "our": [5, 8, 9, 10], "easi": 5, "becaus": [5, 7, 8, 9, 10, 13], "singl": 5, "attach": 5, "enforc": [5, 8], "other": [5, 12], "y_1": 5, "free": 5, "let": [5, 7, 8, 9, 11, 13], "object": [0, 5, 8], "know": [3, 5, 8], "through": [5, 8, 9], "targetst": 5, "argument": [5, 8, 9, 10], "visual": [5, 9, 10], "becam": 5, "so": [5, 9, 12], "alwai": 5, "satisfi": 5, "latter": 5, "concern": 5, "zero": [5, 8, 12], "error": [5, 8, 10], "thetahat": 5, "involv": 5, "actual": 5, "have": [5, 8, 9, 10, 12], "mathieu": 5, "2q": 5, "co": 5, "2x": 5, "comput": [5, 8, 9, 10], "fourth": 5, "q": 5, "5": [5, 8, 9, 12], "There": [3, 5, 8, 9], "quad": 5, "pi": 5, "tackl": 5, "As": [3, 5], "doe": [5, 8, 9, 10, 12], "compon": 5, "introduc": [5, 9, 12], "anxiliari": 5, "tau": [5, 9], "replac": [5, 9], "rewrit": 5, "readi": 5, "pretend": 5, "plot": [5, 8, 9], "path": 5, "last": [5, 7, 12, 13], "subplot": [5, 8, 9], "obviou": [5, 9], "meth": 5, "yet": 5, "abl": [5, 9], "recogn": [5, 10], "possibl": [5, 9], "speed": 5, "achiev": 5, "deriv": [5, 8], "root": 5, "directli": 5, "instead": [5, 10], "cost": 5, "uk": 5, "mathwork": 5, "ref": [3, 5], "bvp4c": 5, "html": 5, "simul": 6, "consid": [7, 13], "consist": [7, 11, 12, 13], "transit": [0, 7, 8, 9, 11, 12, 13], "code": [7, 8, 13], "block": [7, 13], "matrix": [7, 8, 10, 13], "empti": [7, 13], "expect": [7, 8, 9, 10, 13], "result": [7, 8, 9, 10, 12, 13], "simulateodemodel": [7, 13], "wa": [7, 8, 9, 10, 13], "popul": [7, 8, 10, 12, 13], "demonstr": [7, 8, 10, 13], "transitiontyp": [8, 9, 10, 11, 12, 13], "case": [8, 9, 10], "uscept": 8, "nfect": 8, "r": [8, 9, 10, 11, 12, 13], "emov": 8, "statelist": [8, 9, 10, 11, 12, 13], "paramlist": [8, 9, 10, 11, 12, 13], "specifi": [8, 9], "form": [8, 10], "odelist": [8, 11, 12], "origin": [8, 9, 10, 11, 12, 13], "transition_typ": [8, 9, 10, 11, 12, 13], "nameerror": [], "traceback": [], "recent": [], "cell": [], "3": [8, 9, 12, 13], "name": 9, "proce": 8, "ignor": 8, "detail": 8, "cover": 8, "later": [8, 10], "should": [8, 10], "construct": [8, 10], "even": [3, 8], "though": [3, 8], "explicitli": [3, 8, 10, 12], "clarifi": 8, "what": 8, "similarli": [8, 10], "hold": 8, "rest": 8, "forc": [8, 10], "type": [8, 9], "process": [3, 8, 9, 10, 12], "wrong": [8, 10], "39": [], "modul": [8, 9], "40": [], "41": [], "42": [], "That": 8, "verifi": 8, "get_ode_eqn": [8, 10, 12], "correspond": 8, "sequenc": [8, 9], "chang": [8, 9, 12], "them": [3, 8, 9, 12], "around": [], "59": [], "60": [], "61": [], "62": [], "still": [], "come": [3, 8], "out": [3, 8, 9, 10, 12], "english": [], "displai": 8, "either": [8, 9], "symbol": [8, 12], "latex": 8, "save": 8, "extra": 8, "port": 8, "proper": [], "print_od": 8, "true": [8, 9], "explicit": [], "altern": [8, 9, 10], "wai": [8, 10], "seri": [], "between": [10, 12], "capabl": [8, 9], "obtain": 8, "best": 8, "guess": 8, "avail": [3, 8, 10], "section": [8, 10], "unrollod": 8, "more": [8, 9, 10], "particular": 8, "unrollsimpl": [8, 11], "thing": [], "wish": 8, "65": [], "linear_od": 8, "mai": [8, 9], "want": [2, 3, 8], "sai": 9, "64": [], "get_jacobian_eqn": 8, "mayb": 8, "get_grad_eqn": 8, "66": [], "67": [], "But": [], "without": 9, "throw": [], "77": [], "initialst": 8, "27e": [8, 9], "6": [8, 9, 12, 13], "78": [], "point": 9, "need": [8, 10], "against": 10, "list": 8, "79": [], "state_list": 8, "mechan": 8, "along": [], "implement": [8, 9, 10], "issu": [2, 8, 10], "extern": 8, "evalu": 8, "80": [], "81": [], "paramev": 8, "82": [], "83": [], "well": 8, "equip": 8, "odeint": 8, "scipi": [8, 9], "matplotlib": [8, 9, 10, 11], "pyplot": [8, 9, 10, 11], "linspac": [8, 9], "numpi": [8, 9], "creat": [8, 9], "96": [], "97": [], "98": [], "150": [8, 9], "100": [8, 9], "99": [], "plt": [8, 9, 10, 11, 12], "101": [], "figur": [8, 11], "102": [], "label": [8, 9, 11, 12, 13], "103": [], "104": [], "105": [], "xlabel": 8, "106": [], "ylabel": 8, "proport": 8, "107": [], "titl": 8, "108": [], "legend": [8, 9], "loc": 8, "savefig": [8, 9, 11, 12], "sir_plot": 8, "png": [8, 9, 11, 12], "109": [], "110": [], "close": [8, 9, 10, 11, 12], "nice": [], "progress": [], "initial_valu": [8, 9], "ident": 9, "axi": 9, "obvious": 9, "unfortun": [8, 9], "number": [8, 9, 10], "stiff": 8, "583": [], "timeit": 8, "solution1": 8, "output1": 8, "full_output": [8, 9], "584": [], "solution2": 8, "output2": 8, "dfun": 8, "none": 8, "ml": 8, "solution3": 8, "output3": 8, "return": 8, "dens": 8, "squar": 8, "henc": 8, "solver": 8, "likewis": [], "redefin": 8, "e": [8, 9], "infer": 8, "452": [], "453": [], "454": [], "455": [], "456": [], "457": [], "ode_and_sensit": 8, "append": 8, "458": [], "axarr": [8, 9], "459": [], "975": 8, "fontsiz": 8, "16": 8, "horizontalalign": 8, "center": 8, "verticalalign": 8, "top": 8, "460": [], "461": [], "set_titl": [8, 9], "462": [], "463": [], "464": [], "465": [], "466": [], "467": [], "468": [], "469": [], "470": [], "471": [], "472": [], "473": [], "474": [], "7": [8, 12, 13], "475": [], "476": [], "8": [8, 11, 12, 13], "477": [], "478": [], "tight_layout": 8, "sir_sensitivity_plot": [], "480": [], "481": [], "conclud": 8, "introductori": 8, "move": [8, 9, 10], "estimate1": 8, "part": [8, 10], "term": [8, 11, 12], "correctli": 10, "base": [9, 10], "sole": 10, "fed": 10, "take": 10, "total": [9, 10, 12], "four": 10, "destin": [9, 10], "mandatori": 10, "To": 10, "back": [10, 11], "recal": 10, "simpli": [9, 10], "seen": [3, 9, 10], "common_model": [10, 11], "ode1": [10, 13], "ode2": [10, 11, 12, 13], "ode3": [10, 13], "confirm": 10, "ha": [9, 10], "been": [9, 10], "enter": 10, "put": 10, "print": [9, 10, 12], "suitabl": [], "situat": [], "default": [], "formula": [], "format": [], "anoth": [8, 9, 10], "twice": [], "onc": [], "fals": [8, 9, 10], "rightarrow": 10, "denot": 10, "therefor": [9, 10], "stochast": [0, 10], "oper": 10, "600": [], "simulateod": [9, 10, 11, 12, 13], "601": [], "t1": 10, "602": [], "t2": 10, "603": [], "modeltran": 10, "604": [], "exactli": [10, 12], "graphviz": 10, "certain": 10, "permit": 10, "sub": 10, "superscript": 10, "get_transition_matrix": [10, 12, 13], "sir_transition_graph": [], "dot": [], "get_transition_graph": [10, 11, 12], "If": 9, "appear": 8, "transtiontyp": [], "ani": 9, "encourag": [], "carefulli": 10, "fact": [], "619": [], "birth1": 10, "620": [], "birth2": 10, "621": [], "birth3": 10, "622": [], "modelbirth": 10, "birth_death": 10, "623": [], "yield": 10, "neg": [9, 10], "multipli": 10, "sign": 10, "624": [], "death1": 10, "625": [], "626": [], "death3": 10, "627": [], "modelbd": 10, "628": [], "separ": 10, "ad": 10, "modelbd2": 10, "param_list": 10, "birthdeathlist": 10, "birth_death_list": 10, "done": [], "stage": 10, "flow": [10, 12], "interact": [9, 10], "environ": 10, "enum": 10, "repres": [9, 10], "explan": [], "str": 10, "while": 10, "deduct": 10, "forbid": 10, "greater": 10, "than": [8, 10], "tranist": [], "modulenotfounderror": [], "No": [], "conda": [], "env": [], "lib": [], "site": [], "ipython": 9, "core": [], "interactiveshel": [], "3442": [], "run_cod": [], "exec": [], "code_obj": [], "self": [], "user_global_n": [], "user_n": [], "py3": [], "9": [9, 13], "win": [], "amd64": [], "egg": [], "determinist": 9, "234": [], "_findod": [], "274": [], "super": [], "_computeodevector": [], "base_ode_model": [], "939": [], "fromlist": [], "_t": [], "eqn": [], "_unrolltransitionlist": [], "ode_list": [], "1087": [], "eqn_list": [], "checkequ": [], "_getlistofvariablesdict": [], "_model_verif": [], "_eqn": [], "eval": [], "_inputstr": [], "string": [], "syntaxerror": [], "unexpect": [], "charact": [], "c": [], "hannah": [], "william": [], "26": [], "problem": [], "displaystyl": [8, 10], "rearrang": 8, "\u03b3": 8, "\u03b2": 8, "arrai": 8, "cc": 8, "link": 8, "unrol": [8, 11, 12], "determin": 8, "sinc": [8, 10], "Or": 8, "These": [8, 10], "odevari": 8, "unsur": 8, "By": [8, 9], "3333333333333333": 8, "17": [], "23333333e": 8, "07": 8, "35000000e": 8, "11666667e": 8, "shape": [8, 9, 11, 12, 13], "earlier": 8, "could": 8, "58": [], "ms": 8, "330": [], "\u00b5s": 8, "per": 8, "loop": 8, "mean": [8, 9], "std": 8, "dev": 8, "71": [], "317": [], "tag": 8, "hide": 8, "22": [], "126": [], "000": 8, "19": [], "32": [], "21": [], "50": [], "updat": 2, "referenc": 2, "board": 2, "instal": 2, "13": [], "15": [], "54": [], "14": [], "37": [], "214": [], "34": [], "35": [], "member": 10, "choos": 10, "enabl": 10, "bookeep": 10, "reduc": 10, "forget": 10, "recipi": 10, "appli": 10, "09": [], "33": [], "05": [], "06": [], "11": 8, "12": [], "73": [], "18": [], "92": [], "08": [], "28": 8, "208": [], "23": [], "pass": 10, "rather": [10, 12], "why": 10, "imag": 10, "produc": 10, "75": 10, "execut": 10, "incorrect": 10, "occur": 10, "would": [9, 10], "fail": 10, "third": 10, "option": 10, "refram": 10, "formul": 10, "configur": 10, "remov": [9, 10, 12], "alongsid": 10, "approach": 10, "surround": 10, "_equat": 10, "strict": 10, "definit": 10, "improv": 10, "complex": 10, "396": [], "84": [], "227": [], "68": [], "161": [], "represent": 0, "219": [], "510": [], "94": [], "multipl": 9, "common": 9, "realiz": 9, "underli": [3, 9], "distribut": 9, "chemic": 9, "master": 9, "jump": 9, "again": 9, "np": 9, "ix0": 9, "period": 9, "transitionlist": 9, "assign": 9, "solutionrefer": 9, "assum": 9, "non": 9, "seem": 9, "natur": 9, "familiar": 9, "tupl": 9, "item": 9, "handl": 9, "dictionari": 9, "rgamma": 9, "dict": 9, "scale": 9, "200": 9, "300": 9, "ymean": 9, "yall": 9, "simulate_param": 9, "10": 9, "messag": 9, "connect": 9, "mpi": 9, "parallel": 9, "layout": 9, "constrain": 9, "tidi": 9, "idx": 9, "enumer": 9, "sampl": 9, "averag": 9, "tild": 9, "mathbb": 9, "int_": 9, "t_": 9, "hat": 9, "rang": 9, "sharei": 9, "rel": 9, "larg": 9, "especi": 9, "decreas": 9, "increas": 9, "sophist": 9, "random": 9, "built": 9, "frozen": 9, "propag": 9, "stat": 9, "st": 9, "scenario": 9, "fix": 9, "scalar": 9, "quick": 9, "inspect": 9, "suggest": 9, "potenti": 9, "less": 9, "compar": 9, "ymeansingl": 9, "yallsingl": 9, "stochastic_param_singl": 9, "movement": 9, "concret": 9, "probabilti": 9, "j": 9, "govern": 9, "exponenti": 9, "pr": 9, "within": 9, "lambda_": 9, "elaps": 9, "coupl": 9, "commmon": 9, "normal": 9, "reaction": 9, "gillespie1977": 9, "leap": 9, "cao2006": 9, "size": [9, 11, 12, 13], "x0": 9, "2362206": 9, "simx": 9, "simt": 9, "simulate_jump": 9, "stochastic_process": 9, "ten": 9, "restrict": 9, "individu": [9, 11], "clearli": 9, "trajectori": 9, "smooth": 9, "raw": 9, "veri": 9, "reason": 9, "behind": 9, "fulli": 9, "infect": 9, "new": [9, 12], "ones": 9, "simmean": 9, "stochastic_process_compare_large_n_curv": 9, "One": 9, "compartment": 9, "forecast": 9, "although": 9, "least": 9, "wise": 9, "converg": 9, "limit": 9, "reproduc": 9, "explain": 9, "seed": 9, "assumpt": 9, "sort": 9, "global": 9, "ymean1": 9, "yall1": 9, "ymean2": 9, "yall2": 9, "sim_diff": 9, "linalg": 9, "norm": 9, "yi": 9, "sim_diff12": 9, "sum": [9, 12], "ab": 9, "insuffici": 9, "unlik": 9, "pre": 9, "send": 9, "prohibit": 9, "nutshel": 9, "flag": 9, "signatur": 9, "ensur": 9, "serial": 9, "simx1": 9, "simt1": 9, "simx2": 9, "simt2": 9, "x1": 9, "46": 8, "test": 3, "paper": 3, "themselv": 3, "break": 3, "down": 3, "consum": 3, "automat": 3, "45": 8, "89": 8, "slowest": 8, "took": 8, "fastest": 8, "intermedi": 8, "cach": 8, "digraph": [11, 12, 13], "sir_model": [11, 13], "rankdir": [11, 12, 13], "lr": [11, 12, 13], "node": [11, 12, 13], "circl": [11, 12, 13], "\u03b2si": [11, 13], "\u03b3i": [11, 13], "height": 11, "margin": 11, "plaintext": 11, "width": 11, "\u03bc": 11, "get_unrolled_obj": [11, 12, 13], "sir_unrolled_transition_graph": 11, "turn": 12, "harder": 12, "map": 12, "influenza_sliarn": 12, "delta": 12, "dl": 12, "kappa": 12, "l": 12, "alpha": 12, "da": 12, "eta": 12, "dn": 12, "outflow": 12, "compos": 12, "reflect": 12, "said": 12, "goe": 12, "graphic": 12, "sliard_model": 12, "labelloc": 12, "s\u03b2": 12, "\u03b4a": 12, "\u03balp": 12, "\u03bal": 12, "\u03b1if": 12, "\u03b1i": 12, "\u03b7a": 12, "slightli": 12, "combin": 12, "constant": 12, "six": 12, "epsilon": 12, "graph": 12, "sir_unrolled_transition_graph_hard": 12, "simplifi": 12, "apart": 12, "weird": 12, "arrang": 12, "reaffirm": 12}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"welcom": 0, "document": 0, "pygom": 0, "user": 0, "code": 0, "faq": 0, "refer": 0, "indic": 0, "tabl": 0, "markdown": 1, "file": 1, "what": [1, 2], "myst": 1, "sampl": 1, "role": [1, 4], "direct": 1, "citat": 1, "learn": 1, "more": 1, "get": 2, "start": 2, "getting_start": [], "thi": 2, "packag": 2, "doe": 2, "purpos": [], "obtain": 2, "instal": [], "docdir": [], "test": 2, "sir_birth_death": 4, "interpret": 4, "text": 4, "func": 4, "solv": [5, 8], "boundari": 5, "valu": [5, 8], "problem": [5, 7, 8, 12, 13], "bvpsimpl": 5, "simpl": [5, 7, 13], "model": [5, 8, 10], "1": 5, "2": 5, "stochast": [6, 9], "unrollsimpl": 7, "motiv": 8, "exampl": 8, "sir": 8, "defin": [8, 10], "inform": 8, "initi": 8, "forward": 8, "sensit": 8, "equat": [8, 10], "transit": [3, 10], "object": 10, "addit": 10, "type": 10, "extract": 8, "do": 2, "summari": 10, "represent": 9, "od": [3, 9, 11], "paramet": 9, "continu": 9, "markov": 9, "repeat": 9, "simul": 9, "convert": 3, "unrollod": [], "With": 11, "birth": 11, "death": 11, "process": 11, "hard": 12}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["intro", "markdown", "md/getting_started", "md/unrollOde", "mdconvert/common_models/", "mdconvert/doc_to_sort/", "mdconvert/mod/", "mdconvert/unroll/", "notebooks/bvpSimple", "notebooks/epi", "notebooks/epijson", "notebooks/fh", "notebooks/gradient", "notebooks/sir", "notebooks/stochastic", "notebooks/transition", "notebooks/unroll/unrollBD", "notebooks/unroll/unrollHard", "notebooks/unroll/unrollSimple"], "filenames": ["intro.md", "markdown.md", "md\\getting_started.md", "md\\unrollOde.md", "mdconvert\\common_models\\.md", "mdconvert\\doc_to_sort\\.md", "mdconvert\\mod\\.md", "mdconvert\\unroll\\.md", "notebooks\\bvpSimple.ipynb", "notebooks\\epi.ipynb", "notebooks\\epijson.ipynb", "notebooks\\fh.ipynb", "notebooks\\gradient.ipynb", "notebooks\\sir.ipynb", "notebooks\\stochastic.ipynb", "notebooks\\transition.ipynb", "notebooks\\unroll\\unrollBD.ipynb", "notebooks\\unroll\\unrollHard.ipynb", "notebooks\\unroll\\unrollSimple.ipynb"], "titles": ["Welcome to the documentation for PyGOM", "Markdown Files", "Getting started", "Convert ODE into transitions", ".SIR_Birth_Death{.interpreted-text role=\u201dfunc\u201d}", "Solving Boundary Value Problems {#bvpSimple}", "stochastic", "Simple Problem {#unrollSimple}", "Solving Boundary Value Problems", "Simple Epidemic Analysis", "Reading and using EpiJSON data", "Example: Fitz Hugh", "Gradient estimation under square loss", "Motivating Example: SIR Model", "Stochastic representation of ODEs", "Transition Object", "ODE With Birth and Death Process", "Hard Problem", "Simple Problem"], "terms": {"python": [0, 2], "gener": [0, 12, 14], "od": [0, 2, 5, 8, 9, 10, 11, 12, 13, 15, 17, 18], "model": [0, 2, 3, 4, 6, 7, 9, 10, 14, 16, 17, 18], "packag": [0, 5, 8, 10, 13, 14], "aim": [0, 5, 8, 10, 12], "facilit": 0, "applic": [0, 9, 10], "ordinari": [0, 2, 9], "differenti": [0, 2, 5, 8, 9, 12], "equat": [0, 2, 5, 8, 9, 12, 14, 16, 17, 18], "real": 0, "world": 0, "focu": [0, 12], "epidemiolog": [0, 9, 10, 12], "thi": [0, 1, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "help": [0, 1, 5, 8, 13, 15], "defin": [0, 2, 3, 5, 7, 8, 9, 12, 14, 16, 17, 18], "system": [0, 2, 5, 8, 12, 13, 14, 15, 17], "an": [0, 1, 4, 5, 8, 9, 10, 12, 13, 14, 15], "intuit": [0, 9], "manner": 0, "provid": [0, 2, 3, 9, 10, 11, 12, 13], "conveni": 0, "function": [0, 1, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14], "make": [0, 12, 14], "us": [0, 1, 5, 7, 8, 9, 11, 12, 13, 14, 15, 17, 18], "variou": [0, 13], "algebra": [0, 2, 12], "numer": [0, 2, 5, 8, 13], "librari": 0, "backend": [0, 14], "can": [0, 1, 2, 3, 5, 8, 9, 10, 11, 12, 13, 14, 15, 17], "straight": 0, "forward": [0, 2, 11], "fashion": 0, "open": 0, "sourc": 0, "project": 0, "host": 0, "github": [0, 2], "A": [0, 2, 9, 12, 14, 17], "manuscript": 0, "contain": 0, "shorten": 0, "motiv": [0, 14, 15], "arxxiv": 0, "todo": [0, 2, 13, 14, 15], "insert": [0, 1], "intro": 0, "text": [0, 1, 2, 3, 5, 7, 12, 13, 14], "markdown": 0, "file": [0, 2, 10], "get": [0, 1, 9, 12, 15], "start": [0, 1, 5, 8, 11, 15], "getting_start": [], "exampl": [0, 1, 4, 5, 8, 14, 15], "sir": [0, 4, 7, 9, 10, 12, 14, 15, 16, 18], "from": [0, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "index": 0, "rst": [0, 2], "whether": [1, 10, 12], "you": [1, 2, 5, 8], "write": [1, 12], "your": 1, "book": 1, "s": [1, 4, 5, 7, 8, 12, 13, 14, 15, 16, 17, 18], "content": 1, "jupyt": 1, "notebook": 1, "ipynb": 1, "regular": 1, "md": 1, "ll": [1, 12], "same": [1, 4, 11, 12, 13, 14, 15, 17], "flavor": 1, "call": [1, 12, 13, 14, 15], "simpl": [0, 1, 12, 13, 15, 17], "show": [1, 5, 7, 8, 13, 14, 15, 18], "off": [1, 11, 14, 15], "some": [1, 2, 3, 9, 11, 12, 13, 14, 17], "syntax": [1, 14], "stand": 1, "markedli": 1, "structur": 1, "It": [1, 12, 13, 15], "slight": 1, "variat": [1, 14], "commonmark": 1, "small": 1, "extens": [1, 9], "allow": [1, 2, 5, 8, 10, 12, 15], "sphinx": 1, "ecosystem": 1, "For": [1, 7, 12, 13, 14, 15, 18], "about": [1, 2, 11, 12, 14], "see": [1, 11, 12, 13, 14, 15], "overview": 1, "ar": [1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15], "two": [1, 5, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18], "most": [1, 9, 12, 13, 14, 15], "power": [1, 9], "tool": 1, "thei": [1, 2, 11, 15], "kind": 1, "like": [1, 5, 8, 12], "written": 1, "markup": 1, "languag": 1, "both": [1, 5, 8, 11, 12, 13, 14, 17], "serv": [1, 12], "similar": [1, 15], "purpos": [1, 2, 12, 14], "one": [1, 9, 11, 12, 14, 15, 17], "line": [1, 2, 7, 9, 13, 14, 15, 17, 18], "wherea": [1, 12], "span": 1, "mani": [1, 10, 11, 12], "accept": 1, "differ": [1, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18], "input": [1, 5, 8, 10, 11, 13, 15], "do": [1, 3, 13, 15], "those": [1, 12], "depend": [1, 10, 12, 14], "specif": [1, 12], "being": [1, 2, 11], "here": [1, 2, 5, 8, 11, 12, 13, 14, 15], "note": [1, 2, 4, 9, 11, 12, 13, 14, 15], "render": [1, 15], "special": 1, "box": 1, "when": [1, 2, 3, 9, 10, 11, 12, 13, 14, 15], "build": 1, "inlin": 1, "refer": [1, 5, 8, 12, 14], "document": [1, 13], "also": [1, 5, 8, 9, 11, 12, 13, 14, 15, 17], "cite": 1, "store": [1, 10, 12], "bibtex": 1, "follow": [1, 2, 9, 13, 14, 15, 16, 17], "holdgraf_evidence_2014": 1, "moreov": 1, "bibliographi": 1, "page": [1, 12], "The": [1, 2, 5, 8, 9, 10, 11, 12, 13, 14, 15, 17], "must": [1, 11, 12, 13, 14], "all": [1, 2, 3, 5, 8, 10, 11, 12, 13, 14, 15, 17], "properli": 1, "bib": 1, "just": [1, 3, 5, 8, 12], "starter": 1, "lot": 1, "jupyterbook": 1, "org": 1, "end": [2, 4, 5, 7, 8, 12, 13, 15, 16, 17, 18], "user": [2, 12, 13], "easili": [2, 11], "set": [2, 5, 8, 11, 12, 13, 14, 15], "inform": [2, 3, 5, 8, 9, 10, 12, 14], "invok": [2, 13], "appropri": [2, 12], "method": [2, 5, 8, 11, 12, 14], "we": [2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "frac": [2, 4, 5, 7, 8, 12, 13, 15, 16, 17, 18], "partial": 12, "mathbf": [2, 12], "x": [2, 8, 12, 13, 14], "t": [2, 5, 8, 11, 12, 13, 14, 15, 17], "f": [2, 8, 9, 12, 13, 14, 16, 17], "boldsymbol": [2, 12], "theta": [2, 8, 11, 12, 14], "where": [2, 5, 8, 9, 12, 13, 14, 15, 17], "left": [2, 5, 8, 12, 13, 14, 15], "x_": [2, 12], "1": [2, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "2": [2, 9, 10, 11, 12, 13, 14, 16, 17, 18], "ldot": [2, 12], "n": [2, 12, 14, 17], "right": [2, 5, 8, 12, 13, 14, 15], "state": [2, 5, 8, 9, 10, 11, 12, 13, 14, 15, 17], "vector": [2, 11, 12, 13], "d": [2, 5, 8, 12, 14, 15, 17], "paramet": [2, 5, 8, 9, 12, 13], "p": [2, 5, 8, 12, 17], "dimens": [2, 12], "current": [2, 13, 14], "find": [2, 5, 8, 9, 12, 13], "express": 2, "jacobian": [2, 11, 13], "gradient": [0, 2, 5, 8, 13], "sensit": [2, 11], "output": [2, 9, 10, 12, 13], "given": [2, 9, 10, 12, 13, 14], "valu": [0, 2, 9, 10, 12, 14, 15, 17], "onli": [2, 3, 5, 8, 11, 12, 13, 14, 15, 17], "import": [2, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "class": [2, 7, 10, 12, 13, 15], "deterministicod": [2, 5, 8, 13, 15], "interpret": [2, 3, 5, 7, 9, 14], "role": [2, 3, 5, 7], "describ": [2, 9, 12, 15], "previous": [2, 3, 12, 14, 15], "expos": 2, "plan": 2, "extend": [2, 15], "includ": [2, 13, 14, 15], "solv": [0, 2, 12, 14], "analyt": 2, "linear": [2, 12, 13], "analysi": [0, 2], "via": [2, 3, 5, 8, 12, 13, 14, 15], "eigenvalu": [2, 5, 8, 12], "dure": [2, 14], "integr": [2, 8, 11, 12, 13, 14], "detect": 2, "dae": 2, "locat": [2, 15], "pull": 2, "http": [2, 5, 8], "com": [2, 5, 8], "publichealthengland": 2, "pygom": [2, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "git": 2, "bin": 2, "doc": 2, "loss": [0, 2, 5, 8, 10], "sbml_translat": 2, "utilr": [2, 14], "licens": 2, "txt": 2, "readm": 2, "requir": [2, 5, 8, 10, 12, 13, 14], "setup": [2, 5, 8], "py": 2, "each": [2, 12, 13, 14, 15], "three": [2, 5, 8, 15, 16], "main": 2, "folder": 2, "shown": [2, 5, 8, 10, 11, 12, 14, 17], "command": 2, "local": 2, "level": 2, "pleas": [2, 12], "redund": [2, 5, 8], "kept": 2, "develop": 2, "time": [2, 3, 4, 5, 8, 10, 11, 13, 14], "perform": [2, 9, 12], "prior": 2, "after": [2, 12, 14, 15, 17], "standard": [2, 12, 13, 14, 15], "found": [2, 12], "respect": [2, 12, 13], "run": [2, 12, 13, 14], "which": [2, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "desir": 2, "next": [4, 12, 13], "look": [4, 11, 12, 13, 14], "birth": [4, 9, 15], "death": [4, 9, 10, 15], "begin": [4, 5, 7, 8, 12, 13, 15, 16, 17, 18], "align": [4, 5, 7, 8, 12, 13, 15, 16, 17, 18], "ds": [4, 7, 13, 16, 17, 18], "dt": [4, 5, 7, 8, 12, 13, 14, 16, 17, 18], "b": [4, 11, 12, 15, 16], "beta": [4, 7, 12, 13, 14, 15, 16, 17, 18], "si": [4, 7, 13, 15, 16, 18], "mu": [4, 13, 15, 16], "di": [4, 7, 13, 16, 17, 18], "gamma": [4, 7, 12, 13, 14, 15, 16, 18], "i": [4, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18], "dr": [4, 7, 13, 16, 17, 18], "continu": [4, 12, 13], "abov": [4, 9, 10, 12, 13, 14], "now": [4, 5, 8, 11, 12, 13, 15, 17], "much": 4, "longer": [4, 14], "frame": [4, 10, 14], "rate": [4, 14], "In": [5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "addit": [5, 8, 13, 14, 16], "solut": [5, 8, 11, 12, 13, 14], "ivp": [5, 8], "estim": [0, 5, 8, 13], "unknown": [5, 8, 11, 14], "bvp": [5, 8], "littl": [5, 8, 12], "bit": [5, 8], "imagin": [5, 8], "go": [5, 8, 10, 11, 13, 15, 17], "how": [5, 8, 10, 11, 12, 13, 14, 15], "treat": [5, 8, 10], "essenti": [5, 8], "shoot": [5, 8], "first": [5, 8, 9, 10, 11, 12, 13, 14, 15], "condit": [5, 8, 11, 12, 13, 14], "initi": [5, 7, 8, 9, 10, 12, 14, 15, 18], "second": [5, 8, 11, 12, 14], "observ": [5, 8, 11, 12, 13, 14], "matlab": [5, 8], "try": [5, 8, 11, 13, 14], "order": [5, 8, 12, 13], "nabla": [5, 8], "y": [5, 8, 12], "0": [5, 8, 9, 10, 11, 12, 13, 14, 15, 16], "subject": [5, 8], "4": [5, 8, 10, 11, 13, 17, 18], "convert": [0, 5, 8, 17], "y_": [5, 8, 12], "auxiliari": [5, 8], "variabl": [5, 8, 14], "up": [5, 8, 12, 13, 14, 15], "below": [5, 7, 8, 9, 10, 14, 17, 18], "check": [5, 8, 12, 13, 15], "correct": [5, 8, 11, 13], "befor": [5, 8, 9, 12, 14], "proceed": [5, 8], "our": [5, 8, 9, 11, 12, 13, 14, 15], "easi": [5, 8], "becaus": [5, 7, 8, 11, 12, 13, 14, 15, 18], "singl": [5, 8, 9, 11], "attach": [5, 8], "enforc": [5, 8, 13], "other": [5, 8, 11, 12, 17], "y_1": [5, 8], "free": [5, 8, 9], "let": [5, 7, 8, 11, 12, 13, 14, 16, 18], "object": [0, 5, 8, 10, 11, 12, 13], "know": [3, 5, 8, 12, 13], "through": [5, 8, 10, 12, 13, 14], "targetst": [5, 8], "argument": [5, 8, 13, 14, 15], "visual": [5, 8, 14, 15], "becam": [5, 8], "so": [5, 8, 11, 12, 14, 17], "alwai": [5, 8], "satisfi": [5, 8], "latter": [5, 8, 11], "concern": [5, 8], "zero": [5, 8, 12, 13, 17], "error": [5, 8, 13, 15], "thetahat": [5, 8], "involv": [5, 8, 12], "actual": [5, 8, 12], "have": [5, 8, 9, 11, 12, 13, 14, 15, 17], "mathieu": [5, 8], "2q": [5, 8], "co": [5, 8], "2x": [5, 8, 12], "comput": [5, 8, 9, 12, 13, 14, 15], "fourth": [5, 8], "q": [5, 8], "5": [5, 8, 10, 11, 12, 13, 14, 15, 17], "There": [3, 5, 8, 12, 13, 14], "quad": [5, 8, 12], "pi": [5, 8], "tackl": [5, 8, 12], "As": [3, 5, 8], "doe": [5, 8, 12, 13, 14, 15, 17], "compon": [5, 8], "introduc": [5, 8, 12, 14, 17], "anxiliari": [5, 8], "tau": [5, 8, 14], "replac": [5, 8, 14], "rewrit": [5, 8], "readi": [5, 8], "pretend": [5, 8], "plot": [5, 8, 11, 13, 14], "path": [5, 8], "last": [5, 7, 8, 13, 14, 15, 17, 18], "subplot": [5, 8, 13, 14], "obviou": [5, 8], "meth": 5, "yet": [5, 8], "abl": [5, 8, 11, 14], "recogn": [5, 8, 15], "possibl": [5, 8, 12, 14], "speed": [5, 8], "achiev": [5, 8, 9], "deriv": [5, 8, 11, 12, 13], "root": [5, 8], "directli": [5, 8, 10, 12], "instead": [5, 8, 15], "cost": [5, 8, 10, 11, 12], "uk": [5, 8], "mathwork": [5, 8], "ref": [3, 5, 8], "bvp4c": [5, 8], "html": [5, 8], "simul": [6, 12], "consid": [7, 18], "consist": [7, 16, 17, 18], "transit": [0, 7, 8, 13, 14, 16, 17, 18], "code": [7, 12, 13, 18], "block": [7, 18], "matrix": [7, 12, 13, 15, 18], "empti": [7, 18], "expect": [7, 13, 14, 15, 18], "result": [7, 9, 12, 14, 15, 17, 18], "simulateodemodel": [7, 18], "wa": [7, 13, 14, 15, 18], "popul": [7, 13, 14, 15, 17, 18], "demonstr": [7, 9, 10, 12, 13, 14, 15, 18], "transitiontyp": [8, 13, 14, 15, 16, 17, 18], "case": [9, 11, 12, 13, 14, 15], "uscept": 13, "nfect": 13, "r": [10, 11, 12, 13, 14, 15, 16, 17, 18], "emov": 13, "statelist": [8, 13, 14, 15, 16, 17, 18], "paramlist": [8, 13, 14, 15, 16, 17, 18], "specifi": [12, 13, 14], "form": [10, 12, 13, 15], "odelist": [13, 16, 17], "origin": [8, 11, 12, 13, 14, 15, 16, 17, 18], "transition_typ": [8, 13, 14, 15, 16, 17, 18], "nameerror": [], "traceback": [13, 14, 15], "recent": [13, 14, 15], "cell": [13, 14, 15], "3": [8, 9, 10, 11, 12, 13, 14, 15, 17, 18], "name": [10, 12, 13, 14, 15], "proce": [12, 13], "ignor": 13, "detail": [11, 12, 13], "cover": 13, "later": [13, 15], "should": [12, 13, 15], "construct": [13, 15], "even": [3, 12, 13], "though": [3, 12, 13], "explicitli": [3, 13, 15, 17], "clarifi": 13, "what": [12, 13], "similarli": [13, 15], "hold": 13, "rest": [10, 12, 13], "forc": [13, 15], "type": [12, 13, 14], "process": [3, 9, 10, 12, 13, 14, 15, 17], "wrong": [13, 15], "39": 11, "modul": [13, 14, 15], "40": [], "41": [], "42": [], "That": 13, "verifi": 13, "get_ode_eqn": [8, 9, 13, 15, 17], "correspond": [10, 11, 13], "sequenc": [12, 13, 14], "chang": [13, 14, 17], "them": [3, 9, 12, 13, 14, 17], "around": [], "59": [], "60": [], "61": [], "62": [], "still": [10, 12], "come": [3, 12, 13], "out": [3, 11, 12, 13, 14, 15, 17], "english": [], "displai": 13, "either": [13, 14], "symbol": [13, 17], "latex": 13, "save": 13, "extra": 13, "port": 13, "proper": [], "print_od": 13, "true": [12, 13, 14], "explicit": 12, "altern": [12, 13, 14, 15], "wai": [12, 13, 15], "seri": [], "between": [11, 12, 14, 15, 17], "capabl": [13, 14], "obtain": [11, 12, 13], "best": [12, 13], "guess": [11, 12, 13], "avail": [3, 9, 12, 13, 15], "section": [13, 15], "unrollod": 13, "more": [9, 12, 13, 14, 15], "particular": 13, "unrollsimpl": [13, 16], "thing": [], "wish": [9, 12, 13], "65": [], "linear_od": 13, "mai": [9, 12, 13, 14], "want": [2, 3, 13], "sai": 14, "64": [], "get_jacobian_eqn": 13, "mayb": 13, "get_grad_eqn": 13, "66": [], "67": [], "But": 12, "without": 14, "throw": [], "77": [], "initialst": [8, 13], "27e": [12, 13, 14], "6": [8, 10, 11, 12, 13, 14, 17, 18], "78": [], "point": [9, 10, 11, 12, 14], "need": [13, 15], "against": [12, 15], "list": 13, "79": [], "state_list": 13, "mechan": 13, "along": [11, 12], "implement": [11, 12, 13, 14, 15], "issu": [2, 13, 15], "extern": 13, "evalu": [12, 13], "80": [], "81": [], "paramev": [11, 12, 13], "82": [], "83": [], "well": [11, 13], "equip": 13, "odeint": 13, "scipi": [8, 11, 12, 13, 14], "matplotlib": [8, 11, 13, 14, 15, 16], "pyplot": [8, 11, 13, 14, 15, 16], "linspac": [8, 11, 12, 13, 14], "numpi": [8, 11, 12, 13, 14], "creat": [13, 14], "96": [], "97": [], "98": [], "150": [12, 13, 14], "100": [8, 12, 13, 14], "99": [], "plt": [8, 11, 13, 14, 15, 16, 17], "101": [], "figur": [8, 13, 16], "102": [], "label": [13, 14, 16, 17, 18], "103": [], "104": [], "105": [], "xlabel": 13, "106": [], "ylabel": 13, "proport": 13, "107": [], "titl": 13, "108": [], "legend": [13, 14], "loc": 13, "savefig": [8, 11, 13, 16, 17], "sir_plot": 13, "png": [8, 11, 13, 16, 17], "109": [], "110": [], "close": [8, 13, 15, 16, 17], "nice": [], "progress": 9, "initial_valu": [8, 11, 12, 13, 14], "ident": [12, 14], "axi": 14, "obvious": 12, "unfortun": [10, 12, 13, 14], "number": [9, 12, 13, 14, 15], "stiff": 13, "583": [], "timeit": [12, 13], "solution1": 13, "output1": 13, "full_output": [12, 13, 14], "584": [], "solution2": 13, "output2": 13, "dfun": 13, "none": [11, 13], "ml": 13, "solution3": 13, "output3": 13, "return": 13, "dens": 13, "squar": [0, 13], "henc": [12, 13], "solver": 13, "likewis": [], "redefin": 13, "e": [9, 11, 12, 13, 14], "infer": 13, "452": [], "453": [], "454": [], "455": [], "456": [], "457": [], "ode_and_sensit": 13, "append": 13, "458": [], "axarr": [13, 14], "459": [], "975": 13, "fontsiz": 13, "16": [8, 13], "horizontalalign": 13, "center": 13, "verticalalign": 13, "top": [11, 12, 13], "460": [], "461": [], "set_titl": [13, 14], "462": [], "463": [], "464": [], "465": [], "466": [], "467": [], "468": [], "469": [], "470": [], "471": [], "472": [], "473": [], "474": [], "7": [8, 11, 12, 13, 17, 18], "475": [], "476": [], "8": [8, 11, 12, 13, 16, 17, 18], "477": [], "478": [], "tight_layout": 13, "sir_sensitivity_plot": [], "480": [], "481": [], "conclud": [12, 13], "introductori": 13, "move": [13, 14, 15], "estimate1": 13, "part": [13, 15], "term": [9, 12, 13, 16, 17], "correctli": 15, "base": [14, 15], "sole": 15, "fed": 15, "take": [9, 15], "total": [12, 14, 15, 17], "four": 15, "destin": [14, 15], "mandatori": 15, "To": [9, 12, 15], "back": [9, 15, 16], "recal": [12, 15], "simpli": [9, 11, 12, 15], "seen": [3, 12, 14, 15], "common_model": [9, 10, 11, 12, 15, 16], "ode1": [8, 15, 18], "ode2": [8, 15, 16, 17, 18], "ode3": [8, 15, 18], "confirm": 15, "ha": [11, 14, 15], "been": [11, 12, 14, 15], "enter": 15, "put": [12, 15], "print": [8, 9, 10, 11, 12, 14, 15, 17], "suitabl": [], "situat": 12, "default": [10, 12], "formula": [], "format": 10, "anoth": [11, 12, 13, 14, 15], "twice": [], "onc": [], "fals": [13, 14, 15], "rightarrow": [12, 15], "denot": [12, 15], "therefor": [10, 12, 14, 15], "stochast": [0, 15], "oper": [10, 15], "600": [], "simulateod": [14, 15, 16, 17, 18], "601": [], "t1": 15, "602": [], "t2": 15, "603": [], "modeltran": 15, "604": [], "exactli": [12, 15, 17], "graphviz": 15, "certain": [12, 15], "permit": 15, "sub": [9, 15], "superscript": 15, "get_transition_matrix": [15, 17, 18], "sir_transition_graph": [], "dot": 12, "get_transition_graph": [15, 16, 17], "If": 14, "appear": 13, "transtiontyp": [], "ani": [10, 14], "encourag": [], "carefulli": 15, "fact": 12, "619": [], "birth1": 15, "620": [], "birth2": 15, "621": [], "birth3": 15, "622": [], "modelbirth": 15, "birth_death": 15, "623": [], "yield": [11, 12, 15], "neg": [14, 15], "multipli": [12, 15], "sign": 15, "624": [], "death1": 15, "625": [], "626": [], "death3": 15, "627": [], "modelbd": 15, "628": [], "separ": 15, "ad": 15, "modelbd2": 15, "param_list": 15, "birthdeathlist": 15, "birth_death_list": 15, "done": [], "stage": [10, 15], "flow": [15, 17], "interact": [14, 15], "environ": 15, "enum": 15, "repres": [9, 14, 15], "explan": [], "str": 15, "while": 15, "deduct": 15, "forbid": 15, "greater": 15, "than": [9, 12, 15], "tranist": [], "modulenotfounderror": [13, 14, 15], "No": [13, 14, 15], "conda": [], "env": [], "lib": [], "site": [], "ipython": 14, "core": [], "interactiveshel": [], "3442": [], "run_cod": [], "exec": [], "code_obj": [], "self": [], "user_global_n": [], "user_n": [], "py3": [], "9": [8, 12, 14, 18], "win": [], "amd64": [], "egg": [], "determinist": 14, "234": [], "_findod": [], "274": [], "super": [], "_computeodevector": [], "base_ode_model": [], "939": [], "fromlist": [], "_t": [], "eqn": [], "_unrolltransitionlist": [], "ode_list": [], "1087": [], "eqn_list": [], "checkequ": [], "_getlistofvariablesdict": [], "_model_verif": [], "_eqn": [], "eval": [], "_inputstr": [], "string": 10, "syntaxerror": [], "unexpect": [], "charact": [], "c": 11, "hannah": [], "william": [], "26": 11, "problem": [0, 12], "displaystyl": [13, 15], "rearrang": 13, "\u03b3": 13, "\u03b2": 13, "arrai": [12, 13], "cc": 13, "link": 13, "unrol": [13, 16, 17], "determin": 13, "sinc": [13, 15], "Or": 13, "These": [13, 15], "odevari": 13, "unsur": 13, "By": [13, 14], "3333333333333333": 13, "17": 8, "23333333e": 13, "07": 13, "35000000e": 13, "11666667e": 13, "shape": [12, 13, 14, 16, 17, 18], "earlier": 13, "could": 13, "58": 13, "ms": 13, "330": [], "\u00b5s": 13, "per": 13, "loop": 13, "mean": [11, 12, 13, 14], "std": 13, "dev": 13, "71": [], "317": [], "tag": 13, "hide": 13, "22": [], "126": [], "000": [], "19": [], "32": 11, "21": [], "50": [], "updat": 2, "referenc": 2, "board": 2, "instal": 2, "13": [8, 12], "15": 8, "54": [], "14": 8, "37": 11, "214": [], "34": [], "35": 11, "member": 15, "choos": [12, 15], "enabl": 15, "bookeep": 15, "reduc": [9, 12, 15], "forget": 15, "recipi": 15, "appli": 15, "09": [], "33": 12, "05": [], "06": [], "11": [8, 12], "12": [8, 12], "73": [], "18": 8, "92": [], "08": [], "28": 11, "208": [], "23": [], "pass": 15, "rather": [10, 12, 15, 17], "why": 15, "imag": 15, "produc": 15, "75": 15, "execut": 15, "incorrect": 15, "occur": [14, 15], "would": [12, 14, 15], "fail": 15, "third": 15, "option": [12, 15], "refram": 15, "formul": [14, 15], "configur": 15, "remov": [14, 15, 17], "alongsid": 15, "approach": 15, "surround": 15, "_equat": 15, "strict": 15, "definit": [11, 15], "improv": 15, "complex": [12, 15], "396": 13, "84": 13, "227": 13, "68": 13, "161": 13, "represent": 0, "219": [], "510": [], "94": [], "multipl": [12, 14], "common": [9, 14], "realiz": 14, "underli": [3, 14], "distribut": 14, "chemic": 14, "master": 14, "jump": 14, "again": [11, 12, 14], "np": 14, "ix0": 14, "period": 14, "transitionlist": 14, "assign": 14, "solutionrefer": 14, "assum": [11, 12, 14], "non": [12, 14], "seem": [12, 14], "natur": [9, 10, 12, 14], "familiar": 14, "tupl": 14, "item": 14, "handl": 14, "dictionari": 14, "rgamma": 14, "dict": [10, 14], "scale": [12, 14], "200": 14, "300": [10, 14], "ymean": 14, "yall": 14, "simulate_param": 14, "10": [8, 12, 14], "messag": 14, "connect": 14, "mpi": 14, "parallel": 14, "layout": 14, "constrain": [12, 14], "tidi": 14, "idx": 14, "enumer": 14, "sampl": 14, "averag": 14, "tild": 14, "mathbb": [12, 14], "int_": [12, 14], "t_": [12, 14], "hat": 14, "rang": 14, "sharei": 14, "rel": [12, 14], "larg": [11, 14], "especi": 14, "decreas": 14, "increas": [12, 14], "sophist": 14, "random": [12, 14], "built": 14, "frozen": 14, "propag": 14, "stat": 14, "st": 14, "scenario": 14, "fix": [12, 14], "scalar": 14, "quick": 14, "inspect": [10, 14], "suggest": [10, 14], "potenti": [9, 14], "less": [9, 14], "compar": [12, 14], "ymeansingl": 14, "yallsingl": 14, "stochastic_param_singl": [], "movement": 14, "concret": [9, 12, 14], "probabilti": 14, "j": [11, 12, 14], "govern": 14, "exponenti": 14, "pr": 14, "within": [12, 14], "lambda_": 14, "elaps": 14, "coupl": 12, "commmon": 14, "normal": 12, "reaction": 14, "gillespie1977": 14, "leap": 14, "cao2006": 14, "size": [12, 14, 16, 17, 18], "x0": [8, 11, 12, 14], "2362206": 14, "simx": 14, "simt": 14, "simulate_jump": 14, "stochastic_process": [], "ten": [], "restrict": 14, "individu": [14, 16], "clearli": 14, "trajectori": 14, "smooth": 14, "raw": 14, "veri": 14, "reason": [], "behind": 12, "fulli": 14, "infect": 14, "new": [14, 17], "ones": 14, "simmean": 14, "stochastic_process_compare_large_n_curv": [], "One": 14, "compartment": [9, 12, 14], "forecast": 14, "although": [11, 12, 14], "least": [12, 14], "wise": 14, "converg": 14, "limit": 14, "reproduc": 14, "explain": 14, "seed": 14, "assumpt": [12, 14], "sort": 14, "global": [12, 14], "ymean1": 14, "yall1": 14, "ymean2": 14, "yall2": 14, "sim_diff": 14, "linalg": [12, 14], "norm": 14, "yi": 14, "sim_diff12": 14, "sum": [12, 14, 17], "ab": [8, 14], "insuffici": 14, "unlik": [11, 12, 14], "pre": 14, "send": 14, "prohibit": 14, "nutshel": [9, 14], "flag": 14, "signatur": 14, "ensur": 14, "serial": 14, "simx1": 14, "simt1": 14, "simx2": 14, "simt2": 14, "x1": 14, "46": [], "test": [3, 12], "paper": 3, "themselv": 3, "break": 3, "down": 3, "consum": 3, "automat": 3, "45": [], "89": [], "slowest": [], "took": [], "fastest": [], "intermedi": [], "cach": [], "digraph": [16, 17, 18], "sir_model": [16, 18], "rankdir": [16, 17, 18], "lr": [16, 17, 18], "node": [16, 17, 18], "circl": [16, 17, 18], "\u03b2si": [16, 18], "\u03b3i": [16, 18], "height": 16, "margin": [12, 16], "plaintext": 16, "width": 16, "\u03bc": 16, "get_unrolled_obj": [16, 17, 18], "sir_unrolled_transition_graph": 16, "turn": 17, "harder": 17, "map": [12, 17], "influenza_sliarn": 17, "delta": 17, "dl": [12, 17], "kappa": 17, "l": [11, 12, 17], "alpha": 17, "da": 17, "eta": 17, "dn": 17, "outflow": 17, "compos": 17, "reflect": 17, "said": 17, "goe": 17, "graphic": 17, "sliard_model": 17, "labelloc": 17, "s\u03b2": 17, "\u03b4a": 17, "\u03balp": 17, "\u03bal": 17, "\u03b1if": 17, "\u03b1i": 17, "\u03b7a": 17, "slightli": [9, 12, 17], "combin": 17, "constant": 17, "six": 17, "epsilon": 17, "graph": 17, "sir_unrolled_transition_graph_hard": 17, "simplifi": [12, 17], "apart": 17, "weird": 17, "arrang": 17, "reaffirm": 17, "epidem": 0, "read": 0, "epijson": 0, "data": [0, 12], "boundari": 0, "under": [0, 10], "fitz": 0, "hugh": 0, "squareloss": [8, 11, 12], "y0": 8, "y1": 8, "optim": [8, 11, 12], "minim": [8, 11, 12], "bvp1_random_guess_plot": 8, "obj": [8, 10], "t0": [8, 10, 11, 12], "state_nam": 8, "target_st": 8, "fun": [8, 11, 12], "costiv": [8, 11], "tolist": 8, "bvp1_solution_plot": 8, "bvp2_random_guess_plot": 8, "xhatobj": 8, "bvp2_solution_plot": 8, "field": 9, "diseas": 9, "compart": 9, "simplest": 9, "sir_birth_death": 9, "reproduct": 9, "known": [9, 11], "r_": 9, "piec": 9, "tip": 9, "outbreak": 9, "signifi": 9, "indic": [9, 10, 12], "stop": 9, "spread": 9, "tell": 9, "epi_analysi": 9, "pure": 9, "few": 9, "due": [9, 10, 12], "intern": [9, 12], "work": [9, 12], "getr0": 9, "equilibrium": 9, "substitut": [9, 12], "v": [9, 11], "disease_progression_matric": 9, "r0_from_matrix": 9, "replic": 9, "retriev": [9, 10], "dfe": 9, "complic": [10, 12], "patient": 10, "techniqu": 10, "heavili": 10, "record": 10, "framework": 10, "whih": 10, "tri": 10, "captur": 10, "finnie2016": 10, "json": 10, "mind": 10, "cumul": 10, "panda": 10, "datafram": 10, "alreadi": [10, 11], "read_epijson": 10, "epijson_to_data_fram": 10, "pkgutil": 10, "get_data": 10, "eg1": 10, "df": 10, "load": [10, 11], "usual": [10, 12], "fit": [10, 12], "epijsonloss": 10, "poisson": 10, "hood": 10, "epijson_loss": 10, "005": 10, "03": 10, "_df": 10, "inherit": 10, "baseloss": 10, "calcul": [10, 12], "breviti": 10, "insid": 10, "suppli": 10, "column": 10, "belong": 10, "investig": 11, "classic": 11, "fitzhugh": 11, "nagumo": 11, "math": 11, "copi": [11, 12], "param": 11, "suppos": 11, "behav": 11, "20": [11, 12], "30": 11, "astyp": 11, "float64": 11, "fh_plot": 11, "difficult": 11, "surfac": 11, "multimod": 11, "literatur": [11, 12], "omit": 11, "regardless": 11, "give": 11, "luck": 11, "recov": 11, "target": 11, "27": 11, "objfh": 11, "boxbound": [11, 12], "29": 11, "re": [11, 12], "jac": [11, 12], "bound": [11, 12], "bfg": [11, 12], "Then": [11, 12], "won": 11, "iter": 11, "pretti": 11, "pointless": 11, "31": 11, "further": [11, 12], "idea": 11, "guesstim": 11, "36": 11, "sensitivityiv": 11, "38": 11, "were": 11, "superior": 11, "choic": [11, 12], "algorithm": [11, 12, 14], "better": 11, "space": 11, "rough": 11, "hessian": 11, "guarante": 11, "posit": 11, "approxim": [11, 12], "poor": 11, "sens": 12, "view": 12, "howev": 12, "mcmc": 12, "perspect": 12, "kei": 12, "element": 12, "viabl": 12, "paramt": 12, "finit": 12, "o": 12, "principl": 12, "mod": 12, "unconvent": 12, "necessari": 12, "interchang": 12, "strictli": 12, "speak": 12, "x_0": 12, "t_0": 12, "le": 12, "foral": 12, "g": 12, "m": 12, "nabla_": 12, "cdot": 12, "drop": 12, "simplic": 12, "deal": 12, "exclus": 12, "sum_": 12, "residu": 12, "e_": 12, "numstep": 12, "len": 12, "210": 12, "objsir": 12, "mathemat": 12, "implicitli": 12, "dx": 12, "sensitivi": 12, "direct": 12, "gradsen": 12, "objjac": 12, "alon": 12, "enough": 12, "90": 12, "dg": 12, "chain": 12, "rule": 12, "indici": 12, "otherwis": 12, "i_": 12, "_": 12, "mention": 12, "program": 12, "sqaur": 12, "j_": 12, "reveal": 12, "product": 12, "sqaureloss": 12, "gauss": 12, "newton": 12, "levenberg": 12, "marquardt": 12, "transpos": 12, "resid": 12, "full": 12, "step": 12, "min_": 12, "lagrangian": 12, "lambda": 12, "ge": 12, "manipul": 12, "trivial": 12, "remain": 12, "ill": 12, "pose": 12, "aris": 12, "minu": 12, "stabl": 12, "impli": 12, "backward": 12, "cannot": 12, "simultan": 12, "interv": 12, "interpol": 12, "over": 12, "competit": 12, "unabl": 12, "fortran": 12, "routin": 12, "calcuat": 12, "spline": 12, "knot": 12, "326": 12, "odesiradjoint": 12, "outputadjoint": 12, "expens": 12, "rung": 12, "kutta": 12, "suffer": 12, "shine": 12, "big": 12, "equal": 12, "h": 12, "approx": 12, "lim_": 12, "domin": 12, "wide": 12, "tempt": 12, "leav": 12, "319": 12, "otim": 12, "kroneck": 12, "2y": 12, "2i_": 12, "2s": 12, "good": 12, "place": 12, "far": 12, "slow": 12, "demonst": 12, "211": 12, "212": 12, "213": 12, "covari": 12, "version": 12, "resl": 12, "cov_x": 12, "infodict": 12, "mesg": 12, "ier": 12, "leastsq": 12, "func": 12, "hjtj": 12, "outputhjtj": 12, "311": 12, "inv": 12, "312": 12, "313": 12, "jtj": 12, "add": 14, "comment": 14, "densiti": 14, "frequenc": 14, "unexplain": 14, "81103473": 14, "8935847": 14, "52437230": 14, "37979218": 14, "2534": 14, "4614923250074": 14}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"welcom": 0, "document": 0, "pygom": 0, "user": 0, "code": 0, "faq": 0, "refer": 0, "indic": 0, "tabl": 0, "markdown": 1, "file": 1, "what": [1, 2], "myst": 1, "sampl": 1, "role": [1, 4], "direct": 1, "citat": 1, "learn": 1, "more": 1, "get": 2, "start": 2, "getting_start": [], "thi": 2, "packag": 2, "doe": 2, "purpos": [], "obtain": [2, 9], "instal": [], "docdir": [], "test": 2, "sir_birth_death": 4, "interpret": 4, "text": 4, "func": 4, "solv": [5, 8, 13], "boundari": [5, 8], "valu": [5, 8, 11, 13], "problem": [5, 7, 8, 13, 17, 18], "bvpsimpl": 5, "simpl": [5, 7, 8, 9, 18], "model": [5, 8, 11, 12, 13, 15], "1": [5, 8], "2": [5, 8], "stochast": [6, 14], "unrollsimpl": 7, "motiv": 13, "exampl": [11, 13], "sir": 13, "defin": [11, 13, 15], "inform": 13, "initi": [11, 13], "forward": [12, 13], "sensit": [12, 13], "equat": [13, 15], "transit": [3, 15], "object": 15, "addit": 15, "type": 15, "extract": 13, "do": 2, "summari": 15, "represent": 14, "od": [3, 14, 16], "paramet": [11, 14], "continu": 14, "markov": 14, "repeat": 14, "simul": 14, "convert": 3, "unrollod": [], "With": 16, "birth": 16, "death": 16, "process": 16, "hard": 17, "epidem": 9, "analysi": 9, "r0": 9, "algebra": 9, "read": 10, "us": 10, "epijson": 10, "data": 10, "fitz": 11, "hugh": 11, "estim": [11, 12], "gradient": 12, "under": 12, "squar": 12, "loss": 12, "notat": 12, "setup": 12, "jacobian": 12, "adjoint": 12, "time": 12, "comparison": 12, "hessian": 12}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx": 56}}) \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png b/docs/pygom-doc/_build/jupyter_execute/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png new file mode 100644 index 0000000000000000000000000000000000000000..e066d434fefa8d0cf6157f54e135b763c307a289 GIT binary patch literal 44906 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

      e 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­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 NlTwnbkoXkv{{ZC4I9>n% literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/jupyter_execute/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png b/docs/pygom-doc/_build/jupyter_execute/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png new file mode 100644 index 0000000000000000000000000000000000000000..70c84ba424c6c35565c6a2abe5a70b66cfb87e51 GIT binary patch literal 65130 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̎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 Y-UDNU9=cUR$xvXE5Rnxw6V&(nFQq?U6aWAK literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/jupyter_execute/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png b/docs/pygom-doc/_build/jupyter_execute/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c4ddb61f4b303f91c68083854e30fe9e1425f3 GIT binary patch literal 101436 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 QMFnN~izs~oaDoZ*`s14 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 G@c#iZD$a2L literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/jupyter_execute/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png b/docs/pygom-doc/_build/jupyter_execute/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png new file mode 100644 index 0000000000000000000000000000000000000000..9462eff2db6e2d7cf0d54617c330ea8c93d6ac72 GIT binary patch literal 55659 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 a=P>y5*xCRQH4h5@Q^u&t=iM;${eJ*h`Qp_8 literal 0 HcmV?d00001 diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/bvpSimple.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/bvpSimple.ipynb new file mode 100644 index 00000000..08906320 --- /dev/null +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/bvpSimple.ipynb @@ -0,0 +1,212 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8d35685a", + "metadata": {}, + "source": [ + "# Solving Boundary Value Problems\n", + "\n", + "In addition to finding solutions for an IVP and estimate the unknown\n", + "parameters, this package also allows you to solve BVP with a little bit\n", + "of imagination. Here, we are going to show how a BVP can be solved by\n", + "treating it as a parameter estimation problem. Essentially, a shooting\n", + "method where the first boundary condition defines the initial condition\n", + "of an IVP and the second boundary condition is an observation. Two\n", + "examples, both from MATLAB[1], will be shown here.\n", + "\n", + "## Simple model 1\n", + "\n", + "We are trying to find the solution to the second order differential\n", + "equation\n", + "\n", + "$$\\nabla^{2} y + |y| = 0$$\n", + "\n", + "subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert\n", + "this into a set of first order ODE\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{d y_{0}}{dt} &= y_{1} \\\\\n", + "\\frac{d y_{1}}{dt} &= -|y_{0}|\n", + "\\end{aligned}$$\n", + "\n", + "using an auxiliary variable $y_{1} = \\nabla y$ and $y_{0} = y$. Setting\n", + "up the system below\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType,\n", + "DeterministicOde, SquareLoss\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[2\\]: stateList = \\['y0', 'y1'\\]\n", + "\n", + "In \\[3\\]: paramList = \\[\\]\n", + "\n", + "In \\[4\\]: ode1 = Transition(origin='y0', \n", + "...: equation='y1', ...: transition_type=TransitionType.ODE)\n", + "\n", + "In \\[5\\]: ode2 = Transition(origin='y1', \n", + "...: equation='-abs(y0)', ...: transition_type=TransitionType.ODE)\n", + "\n", + "In \\[6\\]: model = DeterministicOde(stateList, \n", + "...: paramList, ...: ode=\\[ode1, ode2\\])\n", + "\n", + "In \\[7\\]: model.get_ode_eqn()\n", + "\n", + "We check that the equations are correct before proceeding to set up our\n", + "loss function.\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[2\\]: from scipy.optimize import minimize\n", + "\n", + "In \\[3\\]: initialState = \\[0.0, 1.0\\]\n", + "\n", + "In \\[4\\]: t = numpy.linspace(0, 4, 100)\n", + "\n", + "In \\[5\\]: model.initial_values = (initialState, t\\[0\\])\n", + "\n", + "In \\[6\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[7\\]: f = plt.figure()\n", + "\n", + "@savefig bvp1_random_guess_plot.png In \\[8\\]: model.plot()\n", + "\n", + "In \\[9\\]: plt.close()\n", + "\n", + "Setting up the second boundary condition $y(4) = -2$ is easy, because\n", + "that is just a single observation attached to the state $y_{1}$.\n", + "Enforcing the first boundary condition requires us to set it as the\n", + "initial condition. Because the condition only states that $y(0) = 0$,\n", + "the starting value of the other state $y_1$ is free. We let our loss\n", + "object know that it is free through the targetState input argument.\n", + "\n", + "In \\[10\\]: theta = \\[0.0\\]\n", + "\n", + "In \\[11\\]: obj = SquareLoss(theta=theta, \n", + ".…: ode=model, .…: x0=initialState, .…: t0=t\\[0\\], .…: t=t\\[-1\\], .…:\n", + "y=\\[-2\\], .…: state_name=\\['y0'\\], .…: target_state=\\['y1'\\])\n", + "\n", + "In \\[12\\]: thetaHat = minimize(fun=obj.costIV, x0=\\[0.0\\])\n", + "\n", + "In \\[13\\]: print(thetaHat)\n", + "\n", + "In \\[14\\]: model.initial_values = (\\[0.0\\] + thetaHat\\['x'\\].tolist(),\n", + "t\\[0\\])\n", + "\n", + "In \\[15\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[16\\]: f = plt.figure()\n", + "\n", + "@savefig bvp1_solution_plot.png In \\[17\\]: model.plot()\n", + "\n", + "In \\[18\\]: plt.close()\n", + "\n", + "We are going to visualize the solution, and also check the boundary\n", + "condition. The first became our initial condition, so it is always\n", + "satisfied and only the latter is of concern, which is zero (subject to\n", + "numerical error) from thetaHat.\n", + "\n", + "## Simple model 2\n", + "\n", + "Our second example is different as it involves an actual parameter and\n", + "also time. We have the Mathieu's Equation\n", + "\n", + "$$\\nabla^{2} y + \\left(p - 2q \\cos(2x)\\right)y = 0$$\n", + "\n", + "and the aim is to compute the fourth eigenvalue $q=5$. There are three\n", + "boundary conditions\n", + "\n", + "$$\\nabla y(0) = 0, \\quad \\nabla y(\\pi) = 0, \\quad y(0) = 1$$\n", + "\n", + "and we aim to solve it by converting it to a first order ODE and tackle\n", + "it as an IVP. As our model object does not allow the use of the time\n", + "component in the equations, we introduce a anxiliary state $\\tau$ that\n", + "replaces time $t$. Rewrite the equations using\n", + "$y_{0} = y, y_{1} = \\nabla y$ and define our model as\n", + "\n", + "In \\[1\\]: stateList = \\['y0', 'y1', 'tau'\\]\n", + "\n", + "In \\[2\\]: paramList = \\['p'\\]\n", + "\n", + "In \\[3\\]: ode1 = Transition('y0', 'y1', TransitionType.ODE)\n", + "\n", + "In \\[4\\]: ode2 = Transition('y1', '-(p - 2\\*5\\*cos(2\\*tau))\\*y0',\n", + "TransitionType.ODE)\n", + "\n", + "In \\[5\\]: ode3 = Transition('tau', '1', TransitionType.ODE)\n", + "\n", + "In \\[6\\]: model = DeterministicOde(stateList, paramList, ode=\\[ode1,\n", + "ode2, ode3\\])\n", + "\n", + "In \\[7\\]: theta = \\[1.0, 1.0, 0.0\\]\n", + "\n", + "In \\[8\\]: p = 15.0\n", + "\n", + "In \\[9\\]: t = numpy.linspace(0, numpy.pi)\n", + "\n", + "In \\[10\\]: model.parameters = \\[('p',p)\\]\n", + "\n", + "In \\[11\\]: model.initial_values = (theta, t\\[0\\])\n", + "\n", + "In \\[12\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[13\\]: f = plt.figure()\n", + "\n", + "@savefig bvp2_random_guess_plot.png In \\[14\\]: model.plot()\n", + "\n", + "In \\[15\\]: plt.close()\n", + "\n", + "Now we are ready to setup the estimation. Like before, we setup the\n", + "second boundary condition by pretending that it is an observation. We\n", + "have all the initial conditions defined by the first boundary condition\n", + "\n", + "In \\[1\\]: obj = SquareLoss(15.0, model, x0=\\[1.0, 0.0, 0.0\\], t0=0.0,\n", + "t=numpy.pi, y=0.0, state_name='y1')\n", + "\n", + "In \\[2\\]: xhatObj = minimize(obj.cost,\\[15\\])\n", + "\n", + "In \\[3\\]: print(xhatObj)\n", + "\n", + "In \\[4\\]: model.parameters = \\[('p', xhatObj\\['x'\\]\\[0\\])\\]\n", + "\n", + "In \\[5\\]: model.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "\n", + "In \\[5\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[6\\]: f = plt.figure()\n", + "\n", + "@savefig bvp2_solution_plot.png In \\[7\\]: model.plot()\n", + "\n", + "In \\[8\\]: plt.close()\n", + "\n", + "The plot of the solution shows the path that satisfies all boundary\n", + "condition. The last subplot is time which obvious is redundant here but\n", + "the `DeterministicOde.plot` method is not yet able to recognize the time\n", + "component. Possible speed up can be achieved through the use of\n", + "derivative information or via root finding method that tackles the\n", + "gradient directly, instead of the cost function.\n", + "\n", + "**Reference**\n", + "\n", + "[1] " + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/epi.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/epi.ipynb new file mode 100644 index 00000000..608e551c --- /dev/null +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/epi.ipynb @@ -0,0 +1,84 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "aafa6e90", + "metadata": {}, + "source": [ + "# Simple Epidemic Analysis\n", + "\n", + "A common application of ordinary differential equations is in the field\n", + "of epidemiology modeling. More concretely, compartmental models that is\n", + "used to describe disease progression. We demonstrate some of the simple\n", + "algebraic analysis one may wish to take when given a compartment model.\n", + "Our use one of the simplest model, an SIR model with birth and death\n", + "processes, which is an extension of the one in `sir`. First, we\n", + "initialize the model below.\n", + "\n", + "In \\[1\\]: from pygom import common_models\n", + "\n", + "In \\[2\\]: ode = common_models.SIR_Birth_Death()\n", + "\n", + "In \\[3\\]: print(ode.get_ode_eqn())\n", + "\n", + "## Obtaining the R0\n", + "\n", + "The reproduction number, also known as the $R_{0}$, is the single most\n", + "powerful piece and reduced piece of information available from a\n", + "compartmental model. In a nutshell, it provides a single number - if the\n", + "parameters are known - which can the intuitive interpretation where\n", + "$R_{0} = 1$ defines the tipping point of an outbreak. A $R_{0}$ value of\n", + "more than one signifies an potential outbreak where less than one\n", + "indicates that the disease will stop spreading naturally.\n", + "\n", + "To obtain the $R_{0}$, we simply have to tell the function which states\n", + "represent the *disease state*, which in this case is the state **I**.\n", + "\n", + "In \\[1\\]: from pygom.model.epi_analysis import \\*\n", + "\n", + "In \\[2\\]: print(R0(ode, 'I'))\n", + "\n", + "## Algebraic R0\n", + "\n", + "We may also wish to get the $R_{0}$ in pure algebraic term. This can be\n", + "achieved by the following few lines. Note that the result below is\n", + "slightly different from the one above. The difference is due to the\n", + "internal working of the functions, where `getR0` computes the\n", + "disease-free equilibrium value for the states and substitute them back\n", + "into the equation.\n", + "\n", + "In \\[1\\]: F, V = disease_progression_matrices(ode, 'I')\n", + "\n", + "In \\[2\\]: e = R0_from_matrix(F, V)\n", + "\n", + "In \\[3\\]: print(e)\n", + "\n", + "To replicate the output before, we have to find the values where the\n", + "disease-free equilibrium will be achieved. Substitution can then be\n", + "performed to retrieve $R_{0}$ in pure parameters.\n", + "\n", + "In \\[1\\]: dfe = DFE(ode, \\['I'\\])\n", + "\n", + "In \\[2\\]: print(dfe)\n", + "\n", + "In \\[3\\]: print(e\\[0\\].subs(dfe))" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/epijson.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/epijson.ipynb new file mode 100644 index 00000000..5a7dc99d --- /dev/null +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/epijson.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "53730f4a", + "metadata": {}, + "source": [ + "# Reading and using EpiJSON data\n", + "\n", + "Epidemiology data is complicated due to the many different stages a\n", + "patient can go through and whether a modeling technique is applicable\n", + "depends heavily on the recording of data. EpiJSON is a framework whih\n", + "tries to captures all the information [\\[Finnie2016\\]](), in a JSON\n", + "format as the name suggests.\n", + "\n", + "This package provides the functionality to process EpiJSON data. Due to\n", + "the nature of this package, modeling of ode, it processes the data file\n", + "with this in mind. The output is therefore in the cumulative form as\n", + "default, shown below, in a `pandas.DataFrame` format. The input can be\n", + "in a string format, a file or already a `dict`.\n", + "\n", + "In \\[1\\]: from pygom.loss.read_epijson import epijson_to_data_frame\n", + "\n", + "In \\[2\\]: import pkgutil\n", + "\n", + "In \\[3\\]: data = pkgutil.get_data('pygom', 'data/eg1.json')\n", + "\n", + "In \\[3\\]: df = epijson_to_data_frame(data)\n", + "\n", + "In \\[4\\]: print(df)\n", + "\n", + "Given that the aim of loading the data is usually for model fitting, we\n", + "allow EpiJSON as input directly to the loss class\n", + "`pygom.loss.EpijsonLoss` which uses the Poisson loss under the hood.\n", + "\n", + "In \\[1\\]: from pygom.model import common_models\n", + "\n", + "In \\[2\\]: from pygom.loss.epijson_loss import EpijsonLoss\n", + "\n", + "In \\[3\\]: ode = common_models.SIR(\\[0.5, 0.3\\])\n", + "\n", + "In \\[4\\]: obj = EpijsonLoss(\\[0.005, 0.03\\], ode, data, 'Death', 'R',\n", + "\\[300, 2, 0\\])\n", + "\n", + "In \\[5\\]: print(obj.cost())\n", + "\n", + "In \\[6\\]: print(obj.\\_df)\n", + "\n", + "Given an initialized object, all the operations are inherited from\n", + "`pygom.loss.BaseLoss`. We demonstrated above how to calculate the cost\n", + "and the rest will not be shown for brevity. The data frame is stored\n", + "inside of the loss object and can be retrieved for inspection at any\n", + "time point.\n", + "\n", + "Rather unfortunately, initial values for the states is still required,\n", + "but the time is not. When the time is not supplied, then the first time\n", + "point in the data will be treated as $t0$. The input Death indicate which column of the data is used\n", + "and $R$ the corresponding state the data belongs to." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/fh.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/fh.ipynb new file mode 100644 index 00000000..3626b0f1 --- /dev/null +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/fh.ipynb @@ -0,0 +1,149 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "73506cd2", + "metadata": {}, + "source": [ + "# Example: Fitz Hugh\n", + "\n", + "## Defining the model\n", + "\n", + "We are going to investigate another classic model here, the\n", + "FitzHugh-Nagumo, or simply FitzHugh here. The model has already been\n", + "defined in `common_models` so we can load it easily\n", + "\n", + "In \\[1\\]: from pygom import SquareLoss, common_models\n", + "\n", + "In \\[2\\]: import numpy\n", + "\n", + "In \\[3\\]: import scipy.integrate, scipy.optimize\n", + "\n", + "In \\[4\\]: import math,time,copy\n", + "\n", + "In \\[5\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[1\\]: x0 = \\[-1.0, 1.0\\]\n", + "\n", + "In \\[2\\]: t0 = 0\n", + "\n", + "In \\[3\\]: \\# params\n", + "\n", + "In \\[4\\]: paramEval = \\[('a',0.2), ('b',0.2), ('c',3.0)\\]\n", + "\n", + "In \\[5\\]: ode = common_models.FitzHugh(paramEval)\n", + "\n", + "In \\[5\\]: ode.initial_values = (x0, t0)\n", + "\n", + "Define a set of time points and lets see how the two states $V$ and $R$\n", + "are suppose to behave.\n", + "\n", + "In \\[6\\]: t = numpy.linspace(1, 20, 30).astype('float64')\n", + "\n", + "In \\[7\\]: solution = ode.integrate(t)\n", + "\n", + "@savefig fh_plot.png In \\[8\\]: ode.plot()\n", + "\n", + "## Estimate the parameters\n", + "\n", + "Obtaining the correct parameters for the FitzHugh model is well known to\n", + "be difficult, this is because the surface is multimodal. Although this\n", + "has been shown many times in the literature, so we will omit the\n", + "details. Regardless, we give it a go with some initial guess. with some\n", + "luck, we will be able to recover the original parameters. First, we try\n", + "it out with only one target state\n", + "\n", + "In \\[26\\]: theta = \\[0.5, 0.5, 0.5\\]\n", + "\n", + "In \\[27\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", + "'R')\n", + "\n", + "In \\[28\\]: boxBounds = \\[ \n", + ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0) .…: \\]\n", + "\n", + "In \\[29\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", + ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", + "method='L-BFGS-B')\n", + "\n", + "In \\[30\\]: print(res)\n", + "\n", + "Then we try the same again but with both state as our target. Now we\n", + "won't look at the iterations because they are pretty pointless.\n", + "\n", + "In \\[30\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", + "\\['V','R'\\])\n", + "\n", + "In \\[31\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", + ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", + "method='L-BFGS-B')\n", + "\n", + "In \\[32\\]: print(res)\n", + "\n", + "Note how the estimates are the same, unlike other models.\n", + "\n", + "## Estimate initial value\n", + "\n", + "We can further assume that we have no idea about the initial values for\n", + "$V$ and $R$ as well. We also provide guesstimate to set off the\n", + "optimization. The input vector $\\theta$ must have the parameters first,\n", + "then the initial values, along with the corresponding bounds.\n", + "\n", + "First, only a single target state, i.e. we only have observations for\n", + "one of states which is $R$ in this case\n", + "\n", + "In \\[35\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", + "'R')\n", + "\n", + "In \\[35\\]: boxBounds = \\[ \n", + ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0), .…: (None,None), .…:\n", + "(None,None) .…: \\]\n", + "\n", + "In \\[36\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", + ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5,0.5\\], .…:\n", + "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "\n", + "In \\[37\\]: print(res)\n", + "\n", + "then both state as target at the same time\n", + "\n", + "In \\[38\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", + "\\['V','R'\\])\n", + "\n", + "In \\[38\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", + ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5, 0.5\\], .…:\n", + "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "\n", + "In \\[39\\]: print(res)\n", + "\n", + "See the difference between the two estimate with the latter, both state\n", + "were used, yielding superior estimates. Note that only the forward\n", + "sensitivity method is implemented when estimating the initial value, and\n", + "it is assumed that the starting condition for all the states are\n", + "unknown.\n", + "\n", + "The choice of algorithm here is the **L-BFGS-B** which is a better\n", + "choice because the parameter space of the FitzHugh is rough (i.e. large\n", + "second derivative) as well as being multimodal. This means that the\n", + "Hessian is not guaranteed to be positive definite and approximation\n", + "using $J^{\\top}J$ is poor, with $J$ being the Jacobian of the objective\n", + "function." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/gradient.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/gradient.ipynb new file mode 100644 index 00000000..89bbd762 --- /dev/null +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/gradient.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ea266a4c", + "metadata": {}, + "source": [ + "# Gradient estimation under square loss\n", + "\n", + "Assuming that we have a set of $N$ observations $y_{i}$ at specific time\n", + "points $t_{i}$, $i = 1,\\ldots,N$, we may wish to test out a set of ode\n", + "to see whether it fits to the data. The most natural way to test such\n", + "*fit* is to minimize the sum of squares between our observations $y$ and\n", + "see whether the resulting solution of the ode and the estimationed\n", + "parameters makes sense.\n", + "\n", + "We assume that this estimation process will be tackled through a\n", + "non-linear optimization point of view. However, it should be noted that\n", + "such estimates can also be performed via MCMC or from a global\n", + "optimization perspective. A key element in non-linear optimization is\n", + "the gradient, which is the focus of this page.\n", + "\n", + "Multiple ways of obtaining the gradient have been implemented. All of\n", + "them serve a certain purpose and may not be a viable/appropriate options\n", + "depending on the type of ode. More generally, let $d,p$ be the number of\n", + "states and paramters respectively. Then finite difference methods have a\n", + "run order of $O(p+1)$ of the original ode, forward sensitivity require\n", + "an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint\n", + "method require two run of size $d$ in principle, but actual run time is\n", + "dependent on the number of observations.\n", + "\n", + "For the details of the classes and methods, please refer to `mod`.\n", + "\n", + "## Notation\n", + "\n", + "We introduce the notations that will be used in the rest of the page,\n", + "some of which may be slightly unconventional but necessary due to the\n", + "complexity of the problem. Let $x \\in \\mathbb{R}^{d}$ and\n", + "$\\theta \\in \\mathbb{R}^{p}$ be the states and parameters respectively.\n", + "The term *state* or *simulation* are used interchangeably, even though\n", + "strictly speaking a state is $x$ whereas $x(t)$ is the simulation. An\n", + "ode is defined as\n", + "\n", + "$$f(x,\\theta) = \\dot{x} = \\frac{\\partial x}{\\partial t}$$\n", + "\n", + "and usually comes with a set of initial conditions $(x_0,t_0)$ where\n", + "$t_0 \\le t_{i} \\forall i$. Let $g(x,\\theta)$ be a function that maps the\n", + "set of states to the observations,\n", + "$g : \\mathbb{R}^{d} \\rightarrow \\mathbb{R}^{m}$. For compartmental\n", + "problems, which is our focus, $\\nabla_{\\theta}g(x,\\theta)$ is usually\n", + "zero and $\\nabla_{x}g(x,\\theta)$ is an identity function for some or all\n", + "of the states $x$. Denote $l(x_{0},\\theta,x)$ as our cost function\n", + "$l : \\mathbb{R}^{m} \\rightarrow \\mathbb{R}$ and $L(x_{0},\\theta,x)$ be\n", + "the sum of $l(\\cdot)$. Both $x$ and $x_{0}$ are usually dropped for\n", + "simplicity. We will be dealing exclusively with square loss here, which\n", + "means that\n", + "\n", + "$$L(\\theta) = \\sum_{i=1}^{N} \\left\\| y_{i} - g(x(t_{i})) \\right\\|^{2} = \\mathbf{e}^{\\top} \\mathbf{e}$$\n", + "\n", + "where $\\mathbf{e}$ is the residual vector, with elements\n", + "\n", + "$$e_{i} = y_{i} - x(t_{i}).$$\n", + "\n", + "## Model setup\n", + "\n", + "Again, we demonstrate the functionalities of our classes using an SIR\n", + "model.\n", + "\n", + "In \\[1\\]: from pygom import SquareLoss, common_models\n", + "\n", + "In \\[2\\]: import copy,time,numpy\n", + "\n", + "In \\[2\\]: ode = common_models.SIR()\n", + "\n", + "In \\[3\\]: paramEval = \\[('beta',0.5), ('gamma',1.0/3.0) \\]\n", + "\n", + "In \\[7\\]: \\# the initial state, normalized to zero one\n", + "\n", + "In \\[8\\]: x0 = \\[1., 1.27e-6, 0.\\]\n", + "\n", + "In \\[5\\]: \\# initial time\n", + "\n", + "In \\[6\\]: t0 = 0\n", + "\n", + "In \\[5\\]: ode.parameters = paramEval\n", + "\n", + "In \\[6\\]: ode.initial_values = (x0, t0)\n", + "\n", + "In \\[9\\]: \\# set the time sequence that we would like to observe\n", + "\n", + "In \\[10\\]: t = numpy.linspace(1, 150, 100)\n", + "\n", + "In \\[11\\]: numStep = len(t)\n", + "\n", + "In \\[11\\]: solution = ode.integrate(t)\n", + "\n", + "In \\[12\\]: y = solution\\[1::,2\\].copy()\n", + "\n", + "In \\[13\\]: y += numpy.random.normal(0, 0.1, y.shape)\n", + "\n", + "Now we have set up the model along with some observations, obtaining the\n", + "gradient only requires the end user to put the appropriate information\n", + "it into the class `SquareLoss`. Given the initial guess $\\theta$\n", + "\n", + "In \\[210\\]: theta = \\[0.2, 0.2\\]\n", + "\n", + "We initialize the `SquareLoss` simply as\n", + "\n", + "In \\[20\\]: objSIR = SquareLoss(theta, ode, x0, t0, t, y, 'R')\n", + "\n", + "where the we also have to specify the state our observations are from.\n", + "Now, we demonstrate the different methods in obtaining the gradient and\n", + "mathematics behind it.\n", + "\n", + "## Forward sensitivity\n", + "\n", + "The forward sensitivity equations are derived by differentiating the\n", + "states implicitly, which yields\n", + "\n", + "$$\\frac{d\\dot{x}}{d\\theta} = \\frac{\\partial f}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial f}{\\partial \\theta}.$$\n", + "\n", + "So finding the sensitivies $\\frac{dx}{d\\theta}$ simply require another\n", + "integration of a $p$ coupled ode of $d$ dimension, each with the same\n", + "Jacobian as the original ode. This integration is performed along with\n", + "the original ode because of possible non-linearity.\n", + "\n", + "A direct call to the method `sensitivity `\n", + "computed the gradient\n", + "\n", + "In \\[33\\]: gradSens = objSIR.sensitivity()\n", + "\n", + "whereas `.jac` will allow the end user to obtain the Jacobian (of the\n", + "objective function) and the residuals, the information required to get\n", + "the gradient as we see next.\n", + "\n", + "In \\[33\\]: objJac, output = objSIR.jac(full_output=True)\n", + "\n", + "## Gradient\n", + "\n", + "Just the sensitivities alone are not enough to obtain the gradient, but\n", + "we are $90\\%$ there. Differentiating the loss function\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dL}{d\\theta} &= \\nabla_{\\theta} \\sum_{i=1}^{N}\\frac{dl}{dg} \\\\\n", + " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial \\theta} \\\\\n", + " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial \\theta}\n", + "\\end{aligned}$$\n", + "\n", + "via chain rule. When $\\frac{\\partial g}{\\partial \\theta} = 0$, the total\n", + "gradient simplifies to\n", + "\n", + "$$\\frac{dL}{d\\theta} = \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta}$$\n", + "\n", + "Obviously, the time indicies are dropped above but all the terms above\n", + "are evaluated only at the observed time points. More concretely, this\n", + "means that\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{\\partial l(x(j),\\theta)}{\\partial g} = \\left\\{ \\begin{array}{ll} -2(y_{i} - x(j)) & , \\; j = t_{i} \\\\ 0 & \\; \\text{otherwise} \\end{array} \\right.\n", + "\\end{aligned}$$\n", + "\n", + "When $g(\\cdot)$ is an identity function (which is assumed to be the case\n", + "in `SquareLoss`)\n", + "\n", + "$$\\frac{\\partial g(x(t_{i}),\\theta)}{\\partial x} = I_{d}$$\n", + "\n", + "then the gradient simplifies even further as it is simply\n", + "\n", + "$$\\frac{dL}{d\\theta} = -2\\mathbf{e}^{\\top}\\mathbf{S}$$\n", + "\n", + "where $\\mathbf{e}$ is the vector of residuals and\n", + "$\\mathbf{S} = \\left[\\mathbf{s}_{1},\\mathbf{s}_{2},\\ldots,\\mathbf{s}_{n}\\right]$\n", + "with elements\n", + "\n", + "$$\\mathbf{s}_{i} = \\frac{dx}{d\\theta}(t_{i}),$$\n", + "\n", + "the solution of the forward sensitivies at time $t_{i}$, obtained from\n", + "solving the coupled ode as mentioned previously.\n", + "\n", + "## Jacobian\n", + "\n", + "Now note how the gradient simplifies to $-2\\mathbf{e}^{\\top}\\mathbf{S}$.\n", + "Recall that a standard result in non-linear programming states that the\n", + "gradient of a sum of sqaures objective function $L(\\theta,y,x)$ is\n", + "\n", + "$$\\nabla_{\\theta} L(\\theta,y,x) = -2(\\mathbf{J}^{T} \\left[\\mathbf{y} - \\mathbf{f}(x,\\boldsymbol{\\theta}) \\right] )^{\\top}$$\n", + "\n", + "with $f(x,\\theta)$ our non-linear function and $J$ our Jacobian with\n", + "elements\n", + "\n", + "$$J_{i} = \\frac{\\partial f(x_{i},\\boldsymbol{\\theta})}{\\partial \\boldsymbol{\\theta}}.$$\n", + "\n", + "This is exactly what we have seen previously, substituting in reveals\n", + "that $J = \\mathbf{S}$. Hence, the Jacobian is (a necessary)by product\n", + "when we wish to obtain the gradient. In fact, this is exactly how we\n", + "proceed in `sensitivity ` where it makes\n", + "an internal call to `jac ` to obtain the Jacobian\n", + "first. This allows the end user to have more options when choosing which\n", + "type of algorithms to use, i.e. Gauss-Newton or Levenberg-Marquardt.\n", + "\n", + "To check that the output is in fact the same\n", + "\n", + "In \\[1\\]: objJac.transpose().dot(-2\\*output\\['resid'\\]) - gradSens\n", + "\n", + "## Adjoint\n", + "\n", + "When the number of parameters increases, the number of sensitivies also\n", + "increases. The time required scales directly with the number of\n", + "parameters. We describe another method which does not depend on the\n", + "number of parameters, but rather, the number of states and observations.\n", + "\n", + "The full derivations will not be shown here, but we aim to provide\n", + "enough information to work out the steps performed in the our code. Let\n", + "write our optimization problem as\n", + "\n", + "$$\\begin{aligned}\n", + "min_{\\theta} \\quad & \\int_{t_{0}}^{T} l(x_{0},\\theta,x(t)) dt \\\\\n", + "s.t. \\quad & \\dot{x} = f(x,\\theta)\n", + "\\end{aligned}$$\n", + "\n", + "which is identical to the original problem but in a continuous setting.\n", + "Now write the constrained problem in the Lagrangian form\n", + "\n", + "$$min_{\\theta} \\; L(\\theta) + \\int_{t_{0}}^{T} \\lambda^{\\top}(\\dot{x} - f(x,\\theta))$$\n", + "\n", + "with Lagrangian multiplier $\\lambda \\ge 0$. After some algebraic\n", + "manipulation, it can be shown that the total derivative of the\n", + "Lagrangian function is\n", + "\n", + "$$\\frac{dL}{d\\theta} = \\int_{t_{0}}^{T} \\left(\\frac{\\partial l}{\\partial \\theta} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta} \\right) dt.$$\n", + "\n", + "Using previously defined loss functions (the identity), the first term\n", + "is zero and evaluating $\\frac{\\partial f}{\\partial \\theta}$ is trivial.\n", + "What remains is the calculation of $\\lambda(t)$ for\n", + "$t \\in \\left[t_{0},T\\right]$.\n", + "\n", + "Although this still seem to be ill-posed problem when Looking at the\n", + "Lagrangian function, one can actually obtain the *adjoint equation*,\n", + "after certain assumptions and\n", + "\n", + "$$\\frac{d\\lambda^{\\top}}{dt} = \\frac{\\partial l}{\\partial x} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta}.$$\n", + "\n", + "which is again an integration. An unfortunate situation arise here for\n", + "non-linear systems because we use the minus Jacobian in the adjoint\n", + "equation. So if the eigenvalues of the Jacobian indicate that our\n", + "original ode is stable, such as -1, the minus eigenvalues (now 1)\n", + "implies that the adjoint equation is not stable. Therefore, one must\n", + "integrate backward in time to solve the adjoint equation and it cannot\n", + "be solved simultaneously as the ode, unlike the forward sensitivity\n", + "equations.\n", + "\n", + "Given a non-linearity ode, we must store information about the states\n", + "between $t_{0}$ and $T$ in order to perform the integration. There are\n", + "two options, both require storing many evaluated $x(j)$ within the\n", + "interval $\\left[t_{0},T\\right]$. Unfortunately, only one is available;\n", + "interpolation over all states and integrate using the interpolating\n", + "functions. The alternative of using observed $x(j)'s$ at fixed points is\n", + "not competitive because we are unable to use fortran routines for the\n", + "integration\n", + "\n", + "The method of choice here to perform the adjoint calcuation is to run a\n", + "forward integration, then perform an interpolation using splines with\n", + "explicit knots at the observed time points.\n", + "\n", + "In \\[326\\]: odeSIRAdjoint, outputAdjoint =\n", + "objSIR.adjoint(full_output=True)\n", + "\n", + "This is because evaluating the Jacobian may be expensive and Runge-kutta\n", + "method suffers as the complexity increases. In non-linear model such as\n", + "those found in epidemiology, each element of the Jacobian may be the\n", + "result of a complicated equation where linear step method will shine as\n", + "it makes as little function evaluation as possible. Note that\n", + "derivations in the literature, the initial condition when evaluating the\n", + "adjoint equation is $\\lambda(T)=0$. But in our code we used\n", + "$\\lambda(T) = -2(y(T)-x(T))$. Recall that we have observation $y(T)$ and\n", + "simulation $x(T)$, so that the adjoint equation evaluated at time $T$\n", + "\n", + "$$\\frac{\\partial \\lambda^{\\top}}{\\partial t} \\Big|_{T} = -2(y-f(x,\\theta))\\Big|_{T} - \\lambda(T)\\frac{\\partial f}{\\partial \\theta}\\Big|_{T}$$\n", + "\n", + "with the second term equal to zero. Integration under step size $h$\n", + "implies that\n", + "$\\lambda(T) \\approx \\lim_{h \\to 0} \\lambda(T-h) = -2(y(T)-x(T))$.\n", + "\n", + "## Time Comparison\n", + "\n", + "A simple time comparison between the different methods reveals that the\n", + "forward sensitivity method dominates the others by a wide margin. It\n", + "will be tempting to conclude that it is the best and should be the\n", + "default at all times but that is not true, due to the complexity of each\n", + "method mentioned previously. We leave it to the end user to find out the\n", + "best method for their specific problem.\n", + "\n", + "In \\[319\\]: %timeit gradSens = objSIR.sensitivity()\n", + "\n", + "In \\[326\\]: %timeit odeSIRAdjoint,outputAdjoint =\n", + "objSIR.adjoint(full_output=True)\n", + "\n", + "## Hessian\n", + "\n", + "The Hessian is defined by\n", + "\n", + "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\frac{\\partial l}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\frac{\\partial x}{\\partial \\theta}^{\\top}\\frac{\\partial^{2} l}{\\partial x^{2}}\\frac{\\partial x}{\\partial \\theta}$$\n", + "\n", + "where $\\otimes$ is the Kronecker product. Note that $\\nabla_{\\theta} x$\n", + "is the sensitivity and the second order sensitivities can be found again\n", + "via the forward method, which involve another set of ode's, namely the\n", + "forward-forward sensitivities\n", + "\n", + "$$\\frac{\\partial}{\\partial t}\\left(\\frac{\\partial^{2} x}{\\partial \\theta^{2}}\\right) = \\left( \\frac{\\partial f}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\left( I_{d} \\otimes \\frac{\\partial x}{\\partial \\theta}^{\\top} \\right) \\frac{\\partial^{2} f}{\\partial x^{2}} \\frac{\\partial x}{\\partial \\theta}.$$\n", + "\n", + "From before, we know that\n", + "\n", + "$$\\frac{\\partial l}{\\partial x} = (-2y+2x) \\quad and \\quad \\frac{\\partial^{2} l}{\\partial x^{2}} = 2I_{d}$$\n", + "\n", + "so our Hessian reduces to\n", + "\n", + "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\left(-2y+2x\\right) \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + 2S^{\\top}S,$$\n", + "\n", + "where the second term is a good approximation to the Hessian as\n", + "mentioned previously. This is the only implementation in place so far\n", + "even though obtaining the estimate this way is relatively slow.\n", + "\n", + "Just to demonstate how it works, lets look at the Hessian at the optimal\n", + "point. First, we obtain the optimal value\n", + "\n", + "In \\[211\\]: import scipy.linalg,scipy.optimize\n", + "\n", + "In \\[212\\]: boxBounds = \\[(0.0, 2.0), (0.0, 2.0)\\]\n", + "\n", + "In \\[213\\]: res = scipy.optimize.minimize(fun=objSIR.cost, \n", + ".….: jac=objSIR.sensitivity, .….: x0=theta, .….: bounds=boxBounds, .….:\n", + "method='L-BFGS-B')\n", + "\n", + "Then compare again the least square estimate of the covariance matrix\n", + "against our version\n", + "\n", + "In \\[211\\]: resLS, cov_x, infodict, mesg, ier =\n", + "scipy.optimize.leastsq(func=objSIR.residual, x0=res\\['x'\\],\n", + "full_output=True)\n", + "\n", + "In \\[212\\]: HJTJ, outputHJTJ = objSIR.hessian(full_output=True)\n", + "\n", + "In \\[311\\]: print(scipy.linalg.inv(HJTJ))\n", + "\n", + "In \\[312\\]: print(cov_x)\n", + "\n", + "also note the difference between the Hessian and the approximation using\n", + "the Jacobian, which is in fact what the least squares routine uses.\n", + "\n", + "In \\[313\\]: print(scipy.linalg.inv(outputHJTJ\\['JTJ'\\]))" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/sir.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/sir.ipynb index d90edec6..5a476736 100644 --- a/docs/pygom-doc/_build/jupyter_execute/notebooks/sir.ipynb +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/sir.ipynb @@ -2,11 +2,10 @@ "cells": [ { "cell_type": "markdown", - "id": "6d53d797", + "id": "d2d9e2d3", "metadata": {}, "source": [ "# Motivating Example: SIR Model\n", - "{download}`this notebook <./sir.ipynb>`\n", "\n", "## Defining the model\n", "\n", @@ -35,7 +34,19 @@ "execution_count": 1, "id": "4c80a36a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pygom'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpygom\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Transition, TransitionType\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pygom'" + ] + } + ], "source": [ "from pygom import Transition, TransitionType" ] @@ -50,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 63, "id": "3ce016f2", "metadata": {}, "outputs": [], @@ -68,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 64, "id": "441e2287", "metadata": {}, "outputs": [], @@ -86,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 65, "id": "b5f80ab0", "metadata": {}, "outputs": [], @@ -119,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 66, "id": "f78c33d4", "metadata": {}, "outputs": [], @@ -137,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 67, "id": "c9fbcce0", "metadata": {}, "outputs": [], @@ -155,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 68, "id": "6ad54e09", "metadata": {}, "outputs": [ @@ -171,7 +182,7 @@ "[ I*gamma]])" ] }, - "execution_count": 7, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -208,7 +219,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 69, "id": "07f81fd1", "metadata": {}, "outputs": [ @@ -224,7 +235,7 @@ "[I*S*beta - I*gamma]])" ] }, - "execution_count": 8, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -258,7 +269,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 70, "id": "960fdc0c", "metadata": {}, "outputs": [ @@ -280,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 71, "id": "93e32c75", "metadata": {}, "outputs": [ @@ -318,7 +329,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 72, "id": "61684654", "metadata": {}, "outputs": [ @@ -328,7 +339,7 @@ "False" ] }, - "execution_count": 11, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -347,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 73, "id": "1c8ff090", "metadata": {}, "outputs": [ @@ -363,7 +374,7 @@ "[0, I*beta, S*beta - gamma]])" ] }, - "execution_count": 12, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -382,7 +393,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 74, "id": "abb02502", "metadata": {}, "outputs": [ @@ -398,7 +409,7 @@ "[ I*S, -I]])" ] }, - "execution_count": 13, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -429,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 75, "id": "e703c888", "metadata": {}, "outputs": [ @@ -441,7 +452,7 @@ " ODEVariable('I', 'I', None, True)]" ] }, - "execution_count": 14, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -479,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 76, "id": "46042ebf", "metadata": {}, "outputs": [], @@ -489,7 +500,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 77, "id": "9ec016b5", "metadata": {}, "outputs": [ @@ -499,7 +510,7 @@ "{beta: 0.5, gamma: 0.3333333333333333}" ] }, - "execution_count": 16, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" } @@ -522,7 +533,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 78, "id": "c43074c6", "metadata": {}, "outputs": [ @@ -532,7 +543,7 @@ "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" ] }, - "execution_count": 17, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } @@ -556,7 +567,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 79, "id": "a14b9901", "metadata": {}, "outputs": [], @@ -579,13 +590,13 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 80, "id": "8303885c", "metadata": {}, "outputs": [ { "data": { - "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyIiIiIV1FyIyIiIl5FyY2IiIh4FSU3IiIi4lWU3IiIiIhXUXIjIiIiXqXWTeJnt9s5fPgwderUOef09SIiIlK9GIZBZmYm0dHRzsksz6XWJTeHDx8mJibG02GIiIhIBRw8eJDGjRuft06tS27q1KkDOD6ckJAQD0cjIiIi5ZGRkUFMTIzz5/j51LrkpvhSVEhIiJIbERGRGqY8Q0o0oFhERES8ipIbERER8SpKbkRERMSr1LoxNyIiIjWR3W6noKDA02G4lZ+f3wVv8y4PJTciIiLVXEFBAXv37sVut3s6FLcym83ExcXh5+d3UcdRciMiIlKNGYbBkSNHsFgsxMTEVErPRnVUPMnukSNHaNKkyUVNtKvkRkREpBorKioiJyeH6OhoAgMDPR2OW9WvX5/Dhw9TVFSEr69vhY/jnemfiIiIl7DZbAAXfammJihuY3GbK0rJjYiISA1QG56HWFltVHIjIiIiXsWjyc0vv/zCDTfcQHR0NCaTiblz515wn59//pnOnTtjtVpp3rw5M2bMcHucIiIiUnN4NLnJzs6mY8eOTJ06tVz19+7dy8CBA7n66qvZsGED48aNY+TIkfzwww9ujlRERERcNXz4cEwmEyaTCV9fX+Li4njiiSfIy8tz63k9erdU//796d+/f7nrT5s2jbi4OP75z38C0KZNG3799VfefPNN+vXr564wy6coH7JSzrHRjddJy3V9shx1Sh3HVMY2Uxl1zy4zldxuMp1Rdo5Xk/nUuvn0+1pwbVlEpDa4/vrr+eCDDygsLGTdunUMGzYMk8nEq6++6rZz1qhbwVesWEFCQkKJsn79+jFu3Lhz7pOfn09+fr7zfUZGhnuCO/I7vJdw4XpSfibzORaLI/kxWxzrZh/Hurl43eeMMl+wnFrMvmDxc6z7WMFiBR8/x6uvP/gEOMp9A8A3EPwCwS/41HoQ+IeCtQ5YQxz1RUTkgqxWK1FRUQDExMSQkJDAwoULldwUS05OJjIyskRZZGQkGRkZ5ObmEhAQUGqfSZMm8fzzz7s/OJMJfNz4A88wKrpjOY7jQp0S2yoaUzkZdsdSHVn8wD8MAutCQDgE1IXAcAiOPLU0cLzWaQghjRxJlIhIJTAMg9zCi7tVuqICfC0XdUfT5s2bWb58OU2bNq3EqEqrUclNRUyYMIHx48c732dkZBATE1P5J2rcFZ4512WpWsAwzkh8ylov69Vesqw4kSkuL05uDDsYttPr9lPv7bbTr3Yb2ItOvS86tdjAVgj2QserrRBsBaeXovxTr3mO9cJcx3phLhTmQEEOFGZDQTbkZ0F+JhRkOmK0FUD2UcdyQSaoEwWhMRDWBOrFQ0RLqNfcsViDK/EPQkS8XW6hjbbPeWas6ZYX+hHo51rq8N133xEcHExRURH5+fmYzWbefvttN0XoUKOSm6ioKFJSSiYQKSkphISElNlrA47uMKvVWhXh1W4mU+0YJ2O3OxKcvAzIOwk5aZCb5njNSXMkO1kpkHUUMpMh84gjYco84lgOrS59zNAm0PASaNgJGnZ0LHUiS9cTEamBrr76at555x2ys7N588038fHx4dZbb3XrOWtUctOzZ0/mz59fomzhwoX07NnTQxFJrWM2O8be+IcC5egBNAzIToX0A3DyIJzcD8d3QeouSN0BOae2pR+Abd+d3i88FppeDrG9IfZyR4+PiAiOS0NbXvDMTTQBvhaX9wkKCqJ58+YAvP/++3Ts2JH33nuPBx54oLLDc/JocpOVlcWuXbuc7/fu3cuGDRuoW7cuTZo0YcKECSQlJfHhhx8C8NBDD/H222/zxBNPcP/997N48WI+//xz5s2b56kmiJyfyQTB9R1Loy6lt+eegJQtcGTj6SV1O5zY51g2fOyoFx4LrQZCm0EQ08MxWFpEaiWTyeTypaHqwmw28/TTTzN+/Hjuvvvuc151uVge/XTWrl3L1Vdf7XxfPDZm2LBhzJgxgyNHjnDgwAHn9ri4OObNm8ejjz7KlClTaNy4Mf/97389fxu4SEUFhJ/qnel9uiw/Ew6sgn3LYP9vkJToSHRWTnUsgRHQqj9ccjvEXlE7LgeKiNcYMmQIjz/+OFOnTuWxxx5zyzlMhlHh23BqpIyMDEJDQ0lPTyckJMTT4YhcWH4m7F4C2+bBjgWQl356W9146DwUOt3j6B0SEa+Tl5fH3r17iYuLw9+/Zk1DMXz4cE6ePFnqCQSvvPIKb7zxBnv37iUoKMhZfr62uvLzW8mNSE1iK3T05vwxFzbNOX33ltnXccnq8kcdA5JFxGvU5OTGVZWV3OjBmSI1icUXml0FN0yGv26DwW9Do66O293/+Br+cyV8drdj7I6ISC2l5EakprIGQ+f74MFF8NCv0GEIYILt804lOXdB8mZPRykiUuWU3Ih4g6gOcOt/YfRq6HC74zEV2+c7kpwf/uaYhFBEpJZQciPiTeq3hFunO5Kctjc6Zmxe8TZM7eEYkCwiUgsouRHxRhEt4PYP4e4vHBMAZhyCWXc7xuNkleeRESIiNZeSGxFv1vI6+PMqx11UZh/HeJxpV8D+5Z6OTETEbZTciHg7v0BI+Dv86ReIaAVZyTBjECx/6yKeNi8iUn0puRGpLSLbwYOLof1tjrE4Pz4Ds+8tOSmgiIgXUHIjUptYgx13VQ34h2Piv23fwfS+kH7I05GJiFQaJTcitY3JBN0fhPt/gJBGcHwnvH89HN/t6chERCqFkhuR2qpxF0eCU685pB90JDia9E9EKtGxY8d4+OGHadKkCVarlaioKPr168dvv/3m1vMquRGpzcJiYMQCiOwA2UdhxgA4uMbTUYmIl7j11ltZv349M2fOZMeOHXzzzTdcddVVHD9+3K3n9XHr0UWk+gtuAMO/g09vh4Or4MMb4d450LSXpyMTkRrs5MmTLFu2jJ9//pk+ffoA0LRpU7p37+72c6vnRkQgIAzu+xrir4HCbPjsTji6zdNRiUhZDAMKsj2zuDB9RHBwMMHBwcydO5f8/Hw3fiClqedGRBz8guDOTx09NwdXwSe3wQMLIaShpyMTkTMV5sDL0Z4599OHHd8V5eDj48OMGTN48MEHmTZtGp07d6ZPnz7ceeedXHLJJW4NUz03InKabwDc+dnpQcafDoH8TE9HJSI11K233srhw4f55ptvuP766/n555/p3LkzM2bMcOt5TYZRu6YozcjIIDQ0lPT0dEJCQjwdjkj1lLYX3rsWso85LlXd/TlYfD0dlUitlJeXx969e4mLi8Pf399xaagwxzPB+AY6ppO4CCNHjmThwoXs37+/1LZSbT2DKz+/1XMjIqXVjXMkNL6BsHsxfDdOj2oQqS5MJselIU8sF5nYALRt25bs7OxK+CDOTcmNiJStUWcYMhNMFlj/MSR+6OmIRKQGOX78ONdccw0ff/wxv//+O3v37uWLL77gtdde48Ybb3TruTWgWETOreV10Pc5+GkiLHgCGneDyLaejkpEaoDg4GB69OjBm2++ye7duyksLCQmJoYHH3yQp59+2q3n1pgbETk/u90xsHjXT1C/tePhm+W8W0JELt75xqF4G425EZGqYTbDzf+B4Cg4ts3RgyMiUo0puRGRCwuKcDxN3GR2jL/5/XNPRyQick5KbkSkfOKugCtP9dp89yik7vJsPCIi56DkRkTKr88TEHsFFGTB//7sGI8jIlLNKLkRkfIzW+DmaeAX7HhEw7oPPB2RiEgpSm5ExDWhjR23hwP89HfIOOzRcEREzqbkRkRc120kNOoK+Rm6e0pEqh0lNyLiOrMFbpgCZh/Y+i1s/c7TEYmIOCm5EZGKiWoPvcY61uc/DnkZno1HROQUJTciUnF9noC6zSDzMCx+0dPRiIgASm5E5GL4BsCgyY711dPh8AZPRiMi1czw4cO56aabqvy8Sm5E5OI06wMdhgAG/PgM1K7H1YlINaTkRkQuXt/nwGKFfctg54+ejkZEajkfTwcgIl4grAn0+BMs/xcsfA7i+4JFXy8i7mAYBrlFuR45d4BPACaTySPndoW+fUSkclzxV1j/kePJ4es/gq4jPB2RiFfKLcqlx6c9PHLuVXevItA30CPndoUuS4lI5QgIgz5POtaXvAz5WR4NR0RqL/XciEjl6foArPoPnNjruER19dOejkjE6wT4BLDq7lUeO3dNoORGRCqPjx8k/B2+GAbL34IuIyCkoaejEvEqJpOpRlwa8iRdlhKRytX2RmjcHQpz4OeXPR2NiNRCSm5EpHKZTHDdqdmKN3wKJ/Z7Nh4RqXWU3IhI5WtyGTS7CuxF8Oubno5GRDxkxowZzJ07t8rPq+RGRNyj+M6p9R9D+iHPxiIitYqSGxFxj6a9IPYKsBfCr5M9HY2I1CJKbkTEfYp7bxJnQsZhz8YiIrWGkhsRcZ/Yy6FJL7AVwG9TPB2NiNQSSm5ExH1MJujzhGN93QzITPZoOCI1mWEYng7B7SqrjUpuRMS9ml3lmPemKM8xsZ+IuMRisQBQUFDg4Ujcr7iNxW2uKM1QLCLuZTLBVU/Cx7fCmveg9zgIru/pqERqDB8fHwIDAzl27Bi+vr6Yzd7ZL2G32zl27BiBgYH4+FxceqLkRkTcL74vNOoCSetg9btwzd88HZFIjWEymWjYsCF79+5l/37vnhTTbDbTpEkTTCbTRR1HyY2IuJ/JBL3GOp45tea/cPmj4Kdn44iUl5+fHy1atPD6S1N+fn6V0jOl5EZEqkabGyCsKZzcDxs/hW4jPR2RSI1iNpvx9/f3dBg1gndeuBOR6sdsgZ5/cayvmAp2m2fjERGvpeRGRKrOpfeAfxik7YHtCzwdjYh4KSU3IlJ1/IKg2wOOdd0WLiJu4vHkZurUqcTGxuLv70+PHj1YvXr1eetPnjyZVq1aERAQQExMDI8++ih5eXlVFK2IXLTuo8DiBwdXwsE1no5GRLyQR5Ob2bNnM378eCZOnEhiYiIdO3akX79+HD16tMz6n376KU899RQTJ05k69atvPfee8yePZunn366iiMXkQqrEwUdbnesr1DvjYhUPo8mN2+88QYPPvggI0aMoG3btkybNo3AwEDef//9MusvX76c3r17c/fddxMbG8t1113HXXfddcHeHhGpZnqdGli89VvH+BsRkUrkseSmoKCAdevWkZCQcDoYs5mEhARWrFhR5j69evVi3bp1zmRmz549zJ8/nwEDBpzzPPn5+WRkZJRYRMTDGrSB5teCYYeV73g6GhHxMh5LblJTU7HZbERGRpYoj4yMJDm57Ifr3X333bzwwgtcfvnl+Pr6Eh8fz1VXXXXey1KTJk0iNDTUucTExFRqO0Skgop7b9Z/Annpno1FRLyKxwcUu+Lnn3/m5Zdf5t///jeJiYl89dVXzJs3jxdffPGc+0yYMIH09HTncvDgwSqMWETOKa4P1G8Dhdmw4VNPRyMiXsRjMxRHRERgsVhISUkpUZ6SkkJUVFSZ+zz77LPcd999jBzpmNm0Q4cOZGdnM2rUKP72t7+VOWWz1WrFarVWfgNE5OKYTND9QZg33vG8qe5/Ai99IKCIVC2PfZP4+fnRpUsXFi1a5Cyz2+0sWrSInj17lrlPTk5OqQSm+LHohmG4L1gRcY9L7gBrqGNQ8e7Fno5GRLyER39NGj9+PNOnT2fmzJls3bqVhx9+mOzsbEaMGAHA0KFDmTBhgrP+DTfcwDvvvMOsWbPYu3cvCxcu5Nlnn+WGG25wJjkiUoNYgx2zFgOs/o9nYxERr+HRB2fecccdHDt2jOeee47k5GQ6derE999/7xxkfODAgRI9Nc888wwmk4lnnnmGpKQk6tevzw033MBLL73kqSaIyMXqNtJxx9TOhXB8N9SL93REIlLDmYxadj0nIyOD0NBQ0tPTCQkJ8XQ4IgLwyRDY+SNc9me4fpKnoxGRasiVn98avScintd9lON1/SeQn+XZWESkxlNyIyKeF98X6sZDfjr8PtvT0YhIDafkRkQ8z2x23BYOsHo61K6r5SJSyZTciEj10Olu8A2CY1th7y+ejkZEajAlNyJSPfiHQsc7Hetr3/NsLCJSoym5EZHqo9sDjtdt8yCz7GfMiYhciJIbEak+IttBzGVgL4LEDz0djYjUUEpuRKR6Ke69WfsB2Io8G4uI1EhKbkSkeml7IwTWg8zDsON7T0cjIjWQkhsRqV58rHDpvY51DSwWkQpQciMi1U+XEYDJ8aTw47s9HY2I1DBKbkSk+qkbB837OtbXfeDZWESkxlFyIyLVU9dTA4vXfwKFeZ6NRURqFCU3IlI9tewHoTGQmwZb5no6GhGpQZTciEj1ZLZAl2GO9TUaWCwi5afkRkSqr0uHgtkHDq2G5E2ejkZEagglNyJSfdWJhNaDHOtr3/dsLCJSYyi5EZHqrXjG4t8/h/xMz8YiIjWCkhsRqd5ir4B6LaAgy5HgiIhcgJIbEaneTCboer9jfe37YBiejUdEqj0lNyJS/XW6C3z8IWUzHFrj6WhEpJpzOblJSUnhvvvuIzo6Gh8fHywWS4lFRKTSBYRD+1sd67otXEQuwMfVHYYPH86BAwd49tlnadiwISaTyR1xiYiU1PUB2PAJ/PE1XD8JAut6OiIRqaZcTm5+/fVXli1bRqdOndwQjojIOTTqDFGXQPLvjiSn1xhPRyQi1ZTLl6ViYmIwNKBPRKqayXT6tvC1H4Dd7tl4RKTacjm5mTx5Mk899RT79u1zQzgiIufR/jbwqwNpu2HvUk9HIyLVlMuXpe644w5ycnKIj48nMDAQX1/fEtvT0tIqLTgRkRKswdDxTlgzHda+B/FXezoiEamGXE5uJk+e7IYwRETKqdsDjuRm23xIT4LQRp6OSESqGZeTm2HDhrkjDhGR8mnQxjFr8b5lsO4DuOYZT0ckItWMy8kNgM1mY+7cuWzduhWAdu3aMXjwYM1zIyJVo9sDp5KbmXDlE+Dj5+mIRKQacTm52bVrFwMGDCApKYlWrVoBMGnSJGJiYpg3bx7x8fGVHqSISAmtB0FwFGQlw9ZvoMNtno5IRKoRl++WGjt2LPHx8Rw8eJDExEQSExM5cOAAcXFxjB071h0xioiUZPGFLsMd65qxWETOYjJcnLQmKCiIlStX0qFDhxLlGzdupHfv3mRlZVVqgJUtIyOD0NBQ0tPTCQkJ8XQ4IlJRGUdgcnuwF8HDyyGynacjEhE3cuXnt8s9N1arlczMzFLlWVlZ+PnpureIVJGQho7LUwCrp3s2FhGpVlxObgYNGsSoUaNYtWoVhmFgGAYrV67koYceYvDgwe6IUUSkbN1GOl5//xzy0j0bi4hUGy4nN//617+Ij4+nZ8+e+Pv74+/vT+/evWnevDlTpkxxR4wiImWLvRzqt4HCbNg4y9PRiEg14fKYm2I7d+5k27ZtALRp04bmzZtXamDuojE3Il5m9XSY/xhEtITRqx3PoBIRr+PKz+8KzXMD0KJFC1q0aFHR3UVEKkfHO+Gn5yF1B+xZAvHXeDoiEfGwciU348eP58UXXyQoKIjx48eft+4bb7xRKYGJiJSLtQ5ceg+smgYr31FyIyLlS27Wr19PYWGhc11EpFrpPgpW/Qd2/gipOyFCvcoitVmFx9zUVBpzI+KlPrsLts+Hbg/CwH94OhoRqWRunefm/vvvL3Oem+zsbO6//35XDyciUjl6POR43fAJ5J7wbCwi4lEuJzczZ84kNze3VHlubi4ffvhhpQQlIuKyuCuhQTsozIHEjzwdjYh4ULmTm4yMDNLT0zEMg8zMTDIyMpzLiRMnmD9/Pg0aNHBnrCIi52YywWUPO9ZXTwdbkWfjERGPKfet4GFhYZhMJkwmEy1btiy13WQy8fzzz1dqcCIiLukwBH6aCOkHYPs8aHujpyMSEQ8od3KzZMkSDMPgmmuu4csvv6Ru3brObX5+fjRt2pTo6Gi3BCkiUi6+/tD1fvjldcdt4UpuRGqlcic3ffr0oaioiGHDhtG1a1diYmLcGZeISMV0fQB+fRMOrIDD6yH6Uk9HJCJVzKUBxT4+PsyZMwebzeaueERELk5IQ2h3i2N9xVTPxiIiHuHy3VLXXHMNS5cudUcsIiKVo9dfHK+bv4IT+z0bi4hUOZefLdW/f3+eeuopNm3aRJcuXQgKCiqxffDgwZUWnIhIhTTs6HgMw+7FsOJtGPC6pyMSkSrk8gzFZvO5O3tMJlO1v2SlGYpFaok9S+HDweDjD+M2Q3B9T0ckIhfBrTMU2+32cy7VPbERkVok7kqI7gxFebD6P56ORkSqkMvJjYhIjWAyweXjHOurp0N+6cfGiIh3qlBys3TpUm644QaaN29O8+bNGTx4MMuWLavs2ERELk7rQVCvOeSdhHUzPR2NiFQRl5Objz/+mISEBAIDAxk7dixjx44lICCAvn378umnn7ojRhGRijFboNdYx/qKqVBU4Nl4RKRKuDyguE2bNowaNYpHH320RPkbb7zB9OnT2bp1a6UGWNk0oFiklinKh8mXQFYy3DgVLr3X0xGJSAW4dUDxnj17uOGGG0qVDx48mL1797p6OKZOnUpsbCz+/v706NGD1atXn7f+yZMnGT16NA0bNsRqtdKyZUvmz5/v8nlFpJbwsULPPzvWf50MdrtHwxER93M5uYmJiWHRokWlyn/66SeXH8kwe/Zsxo8fz8SJE0lMTKRjx47069ePo0ePllm/oKCAa6+9ln379jFnzhy2b9/O9OnTadSokavNEJHapMsIsIbC8Z2w5WtPRyMibubyJH5//etfGTt2LBs2bKBXr14A/Pbbb8yYMYMpU6a4dKw33niDBx98kBEjRgAwbdo05s2bx/vvv89TTz1Vqv77779PWloay5cvx9fXF4DY2FhXmyAitY1/iKP35udJ8PMr0PYmx3gcEfFKLvfcPPzww8yaNYtNmzYxbtw4xo0bx+bNm5k9ezZ/+tOfyn2cgoIC1q1bR0JCwulgzGYSEhJYsWJFmft888039OzZk9GjRxMZGUn79u15+eWXzzu/Tn5+PhkZGSUWEamFLnsY/MMgdQdsmuPpaETEjVzuuQG4+eabufnmmy/qxKmpqdhsNiIjI0uUR0ZGsm3btjL32bNnD4sXL+aee+5h/vz57Nq1iz//+c8UFhYyceLEMveZNGkSzz///EXFKiJewD8Ueo+FRS/A0leg/a1gqdBXoIhUcxWexG/t2rV89NFHfPTRR6xbt64yYzonu91OgwYNePfdd+nSpQt33HEHf/vb35g2bdo595kwYQLp6enO5eDBg1USq4hUQ93/BIH1IG0PbPzM09GIiJu4/GvLoUOHuOuuu/jtt98ICwsDHHcw9erVi1mzZtG4ceNyHSciIgKLxUJKSkqJ8pSUFKKiosrcp2HDhvj6+mKxnL5W3qZNG5KTkykoKMDPz6/UPlarFavVWs7WiYhXswZD73Gw8FlY+hpccgf4lP7eEJGazeWem5EjR1JYWMjWrVtJS0sjLS2NrVu3YrfbGTlyZLmP4+fnR5cuXUrceWW321m0aBE9e/Ysc5/evXuza9cu7Gfcyrljxw4aNmxYZmIjIlJKt5EQHAnpB2D9R56ORkTcwOXkZunSpbzzzju0atXKWdaqVSveeustfvnlF5eONX78eKZPn87MmTPZunUrDz/8MNnZ2c67p4YOHcqECROc9R9++GHS0tJ45JFH2LFjB/PmzePll19m9OjRrjZDRGorv0C4fLxjfdk/oTDPs/GISKVz+bJUTEwMhYWFpcptNhvR0dEuHeuOO+7g2LFjPPfccyQnJ9OpUye+//575yDjAwcOYDafzr9iYmL44YcfePTRR7nkkkto1KgRjzzyCE8++aSrzRCR2qzLcPhtCmQkwboZcNlDno5ILoLdbpBXZCOv0E5uoY28Qhv5hXbyi2wUFNkpsNnJL7RTaHOsF9oMCm2n3hfZKbIbFNnsFNgMbHbHe5vNcLzai1/t2Ow4Xg3HOW12A5thYLcb2A0DmwGG4Si3Gwb2U+/LerUbBsapV8C5buCoYwAYlHhvGGDg2K94H86sf0YdOKvOWe85T50znf0Qg7LrlC67pHEoHz3Qo4zaVcPlxy/873//4+WXX2bq1Kl07doVcAwuHjNmDE8++SQ33XSTO+KsNHr8gogAsOY9mDfeMcB4TCIEhHk6olrHMAxyCmykZRdwMqeQEzkFpOcWkplXREZeIRmn1rPyTy15RWQXFJGdX0RugY2cQhu5BTbyizTrdHXTuUkYX/25d6Ue05Wf3y4nN+Hh4eTk5FBUVISPj6Pjp3g9KCioRN20tDQXQ3c/JTciAoCtEN7p5Zj3ptcYuO7/PB2R17DbDY5nF5CcnseR9FySM/JITs/jWGY+qVn5pGYVkJqVz/GsAgpslZuY+FnMWH3N+PtasPqY8fMxY/WxOF4tZnx9TPhazKcWx7qP2bHuYzE51y1mMz5mE2azCR+zCUvxYjq9bjabMJvAYnKsO17BfKqOCcd2k8mE6VQ9k8mxHcf/mE2mUwunyhx1TJzez7EOnLXNUcKpslPvTSU/j7K2OV8xlahXfLyznX3MsmqdXcfqY6ZxeOC5/pgqxJWf3y5flpo8eXJF4xIRqT4svnDdS/DpEFg5zfGIhnrxno6qxrDZDZJO5LL7WBa7j2VxIC2HA2k5HEzL4eCJXApc6E3x8zFTN9CPsEBfQgN8CQnwJcTfl5AAH+r4+1LH6kOQ1Ycgq4Vgqw+Bfj4E+lkI9LMQ4Gch0M8Hf19HEmMxl/XjWWobl3tuajr13IiIk2HAx7fC7kXQehDc+YmnI6qWjmfls+VIBlsOZ/DH4Qx2pGSyNzX7vJeDTCaoH2ylYag/UaH+RIX40yDEn4hgPyKCrUQEW6kX7EfdID8CfC3OngiRc3Frzw04Bg/PnTuXrVu3AtCuXTsGDx5cYv4ZEZFqz2SCfi/BOz/Dtu9g7zKIu8LTUXlUfpGNzUkZJO4/wbr9J1h/8AQpGfll1vXzMdMsIoj4+sE0rRdITN1AYsIDaVI3kIZh/vhaKjxPrMhFcbnnZteuXQwYMICkpCTn7eDbt28nJiaGefPmER9fvbt11XMjIqXM+yus+S9EdYBRS2vVQzWLbHZ+T0rn152p/LozlQ0HT5YaB2MyQVy9INpEh9C2YQhtGtahef06NAoP0GUgqTJuHVA8YMAADMPgk08+oW7dugAcP36ce++9F7PZzLx58yoeeRVQciMipWQfh39dCvnpMPht6HyfpyNyq5M5BSzcksKirUf5bXcqmXlFJbbXC/Kjc9NwujQNp3OTcNpFhxBk1XO4xLPcmtwEBQWxcuVKOnToUKJ848aN9O7dm6ysLNcjrkJKbkSkTMvfhh//5pi9eMw6sNbxdESV6lhmPj9uSeb7zcms2H2cIvvpr/4Qfx96N4/g8hYR9IqPILZeoMbASLXj1jE3VquVzMzMUuVZWVl6BIKI1FzdR8Ha9yFtt+PJ4QNe93REF63QZmfJtqN8vvYQS7YfxXZGQtM6qg792kVxdesGdGgUqstL4lVcTm4GDRrEqFGjeO+99+jevTsAq1at4qGHHmLw4MGVHqCISJXw8YOB/4SPboLV06H9bdDEczOsXowDx3P4ZPV+vkpM4ljm6cHAlzQOpX/7hlzfPoq4iKDzHEGkZnP5stTJkycZNmwY3377Lb6+voBjEr/BgwczY8YMQkND3RJoZdFlKRE5r7mjYcPHENEKHloGPlZPR1Ruvx86yX9+2cOCTUco7qSJCPbjls6Nub1rY5o38K5LbVK7uO2ylGEYZGRkMGvWLJKSkpy3grdp04bmzZtXPGIRkeriuhdh5w+Quh2WvQFXT7jwPh5kGAZLdxzjP0v3sGLPcWf5FS0iuPeyplzTuoFuyZZax6WeG7vdjr+/P3/88QctWrRwZ1xuo54bEbmgzV/BnBFg9nX03jRo4+mIyrT+wAkmzd/G6n2OR934mE0M7hjNg1c2o01Dfb+Jd3Fbz43ZbKZFixYcP368xiY3IiIX1O5m2PQFbJ8P34yB+3+oVnPf7E3N5vUftjF/UzLgeI7PvZc15YHL44gOC/BwdCKe53Jf5SuvvMLjjz/O5s2b3RGPiIjnmUww4B/gVwcOrXEMMK4GsvOLePG7LVz7xlLmb0rGZIIhXRrz8+NX8eygtkpsRE65qKeC+/n5ERBQ8h9TdXwS+Jl0WUpEym3Nfx2zF/v4w6ifPXp5aumOYzz91SaSTuYCcHWr+jzZvzWto/Q9JrWDngouIlIZutwP2xfArp/gixHw4GLwC6zSEE5kF/Did1v4an0SAI3CAnjp5vZc1apBlcYhUpPoqeAiIueTdQym9YasFOgyHG6YUmWnXrL9KI99vpHj2QWYTDC8VyyPXddKj0KQWqlKngr+9ddfO28Fb9u2LTfeeCM+PvoHJyJeJrg+3PIufHgTrJsBcX2g/S1uPWWRzc4bC3fw7593A9AyMphXbr2Ezk3C3XpeEW/hcs/NH3/8weDBg0lOTnY+FXzHjh3Ur1+fb7/9lvbt27sl0MqinhsRqZBFL8Kyf4A1xHF7eHisW06TkpHHmM/Ws3qvY/zifZc15W8D2+DvW33u1hLxBFd+frt8t9TIkSNp164dhw4dIjExkcTERA4ePMgll1zCqFGjKhy0iEi1dtUEiLkM8jNgzv1QVFDpp1i+K5WB/1rG6r1pBPlZeOuuS3nxpvZKbERc5HLPTUBAAGvXrqVdu3Ylyjdv3ky3bt3Izc2t1AArm3puRKTCTh50jL/JS4fOwxzjbyrp6dmfrz3IhK82YbMbtI6qw7/v6Uyz+sGVcmwRb+DWnpuWLVuSkpJSqvzo0aN6BIOIeLewGLhlOpjMkDgTVrx90Yc0DIMpP+3kiTm/Y7Mb3NQpmrmjeyuxEbkILic3kyZNYuzYscyZM4dDhw5x6NAh5syZw7hx43j11VfJyMhwLiIiXqdlP7juJcf6j8/CtnkVPlSRzc7TX2/izZ92APDnq+J5845OugwlcpFcvixlNp/Oh0ynumOLD3Hme5PJhM1mq6w4K40uS4nIRTMMmDce1r4PvoEwYgFEd3LpEDkFRfzl0/Us3nYUswmev7E9913W1D3xingBt94KvmTJkgoHJiLiFUwm6P8anNgHuxfDZ3c6JvgLiS7X7rkFNu6fsYaVe9Lw9zXzrzsv5bp2Ue6NWaQW0SR+IiIVlZcO710Hx7ZBZHsY9i0E1j3/LoU2HvxwLct2phJs9WHm/d3p0lTz14hciFsHFIuIyCn+oXD3bAhqACmb4cMbIefcz9crKLLz508SWbYzlUA/CzNGdFNiI+IGSm5ERC5GeOypHpsISP4dProZck+UqlZoszPms0QWbzuK1cfMe8O60TX2/L08IlIxSm5ERC5Wg9anEpx6cGQDfHQL5J50brbbDcZ/vpEf/kjBz2Jm+tCu9Iyv57FwRbydkhsRkcoQ2daR4ATUhcOJ8PHpBOcfP27n242H8bWYmHZfZ65sWd+zsYp4OSU3IiKVJbIdDPsGAsIhaR28fz3zl612PgDz1Vsv4ZrWkR4OUsT7uZzcpKSkcN999xEdHY2Pjw8Wi6XEIiJSq0V1cPTgBEfBsa10++k2LjHtZvTV8dzSubGnoxOpFVye52b48OEcOHCAZ599loYNGzon7hMRkVOiOpB023dkz7iFlqYDzPH/P3xi4oDWno5MpFZweZ6bOnXqsGzZMjp16uSmkNxL89yIiLtl5BVyy7+Xk3z0KDPrvEOXwnWACa59AXqNqbSHbYrUJm6d5yYmJoZaNu+fiEi5GYbBXz/fyK6jWQSH1KXx6G+gywjAgIXPwqy7zzsXjohcPJeTm8mTJ/PUU0+xb98+N4QjIlKzzVy+j4VbHLd8vzu0C5FhwTDoTcfjGix+sH0+vNMb9i7zdKgiXsvly1Lh4eHk5ORQVFREYGAgvr6+JbanpVXv30h0WUpE3GVzUjq3/Hs5BTY7E29oy4jecSUrHNkIc+6H47sAE1z5OPR5EiwuD38UqXXc+uDMyZMnVzQuERGvlZVfxJjP1lNgs5PQJpLhvWJLV2rYEUYthQVPwIZP4JfXYMcCGDQZGnet6pBFvJYenCkiUgnGz97AV+uTaBjqz/yxVxAe5Hf+HX7/Aub/1fHwTUzQ9X7o+xwEhFVFuCI1jlt7bgBsNhtz585l69atALRr147BgwdrnhsRqZW+XHeIr9YnYTbBv+669MKJDcAlQ6DZVfDjM/D7LFj7Hmz9Bq77P+hwO5g1x6pIRbncc7Nr1y4GDBhAUlISrVq1AmD79u3ExMQwb9484uPj3RJoZVHPjYhUpgPHc7h+yi/kFNj467UtGdO3hesH2fsLzPsrpO5wvG/QFq7+G7QeqNvGRU5x663gY8eOJT4+noMHD5KYmEhiYiIHDhwgLi6OsWPHVjhoEZGaxjAMnvrqd3IKbPSIq8ufr25esQPFXQkP/QZ9J4I1FI5ugdn3wPSrYddPULtGD4hcNJd7boKCgli5ciUdOnQoUb5x40Z69+5NVlZWpQZY2dRzIyKVZdbqAzz11Sb8fc38MO5KmtYLuviD5qTBirdh5TQozHaUNewElz0M7W4Bn3Jc8hLxQm7tubFarWRmZpYqz8rKws9P/+hEpHZITs/jpXmOcYePXdeqchIbgMC6joHFj2yEy0aDxQpHNsDXf4LJ7eHnVyDraOWcS8RLuZzcDBo0iFGjRrFq1SoMw8AwDFauXMlDDz3E4MGD3RGjiEi1YhgGz8zdRGZ+ER1jwkrPZ1MZguvD9S/D+C1wzTNQpyFkpcDPk+CNNvDZXfDHXCjMq/xzi9RwLl+WOnnyJMOGDePbb791TuBXVFTE4MGDmTFjBqGhoW4JtLLospSIXKxvNh5m7Gfr8bWYmDf2ClpG1nH/SYsKHHdTrXwHktaeLvcPhbY3QftboEkvXbYSr+XKz+8Kz3Ozc+dOtm3bBkCbNm1o3ryCA+mqmJIbEbkYadkFJLyxlLTsAh5NaMkjCRW4O+piHd0KG2fBpi8gI+l0uTUEmveFlv2hxbWOS1wiXqJKkpuaSsmNiFyM8Z9v4KvEJFpH1eGbv1yOn48H56Ox22H/r/D757Dje8g+dnqbyQxRl0Ds5Y67sZr0BH9950nNVemT+I0fP54XX3yRoKAgxo8ff966b7zxRvkjFRGpQdbtP8FXiUmYTPDKrZd4NrEBx0R/cVc6FrsdktY5HuewfYHjdvIjGxzLircdyU5ke2jUBRp1drzWbw1mTb4q3qdcyc369espLCx0rouI1DZ2u8EL3/4BwJAujekUE+bZgM5mNkNMN8fS9znIOAz7foV9yxyvaXsg+XfHsu4Dxz6+gY4EJ7ItNGgHDdo43teJ0uSBUqPpspSISDl8vvYgT8z5nTpWHxY/dhX161g9HZJr0pMcA5GT1kFSIhxeDwXnmJfMNwjqNoN6zaBuPIQ3hdDGENrE8eoXWLWxi+DmZ0vdf//9TJkyhTp1St4dkJ2dzZgxY3j//fddPaSISLWWmVfIa99vB2Bs3xY1L7EBCG3kWNre6Hhvt8Hx3Y7LV0e3QMofjtcT+xyTB6ZscixlCawHwVGOHp46DaFOJATVh8AICKp3ar0eBISDb0CVNVGkmMs9NxaLhSNHjtCgQYMS5ampqURFRVFUVFSpAVY29dyIiKtenr+Vd3/ZQ7P6QXz/yJWeH2vjTkUFcHK/I/E5vstxOSv9IJw86Hg9V2/PuVisjiQnIMxx27o1xDGw2VrHse4XDH5Bp5ZgR6+Qb4DjkplvAPgEgK8/+JyxWHx12awWckvPTUZGhnPSvszMTPz9/Z3bbDYb8+fPL5XwiIjUdHuOZfHBb3sBeHZQW+9ObMAxT05EC8dyNsOAvJOO8TyZRyAzxfGaleK4Uys7FXKOO9Zz0sCwgS0fspIdS6UxgcUPfKxnvPqC2dfx3uJ7+r3Zcmrd5/R7s8+pxQImy6myM9ZNFkfy5Fw3n17Mp7adWUbxe1MZ66aS6+V5hQusn/lRFL8/e3sZyd8565712Z5zv/M5q05AGDTtVY793KPcyU1YWBgmkwmTyUTLli1LbTeZTDz//POVGpyIiKe9+N0WCm0G17RuwNWtavkvcCbTqV6YcIhsd/66hgH5mZB74vSSnwn5GY7XvAzHekH2GUsWFOaeWrJPveZAUT4UnTkTs+FImmz5bm2uXITG3WHkQo+dvtzJzZIlSzAMg2uuuYYvv/ySunVPTw7l5+dH06ZNiY6OdkuQIiKe8MuOYyzZfgxfi4lnB7X1dDg1i8nkuPzkH+IYkHyxDONUkpPruHRmO7UUnUpybEWny+zF64Wn1gvBXugYZ2QvAsPueLUXOcoM26ltp9YN+6n1M16dy5nvOb2OcWrdOFXHOFV2qry4DcVljoKzyoyS9c637nxPGe/LqnOuuiUKy/7cL1SnLA1al6+em5Q7uenTpw8Ae/fuJSYmBrO58rpmp06dyuuvv05ycjIdO3bkrbfeonv37hfcb9asWdx1113ceOONzJ07t9LiERExDIPXf3AMIr7vsljiIirpwZhSMSaTY+yNr/+F60qt5/LdUk2bOjLwnJwcDhw4QEFBQYntl1xyiUvHmz17NuPHj2fatGn06NGDyZMn069fP7Zv337eMTz79u3jscce44orrnC1CSIiF7RgczKbktIJ8rMw+up4T4cjIi5wufvl2LFjDBo0iDp16tCuXTsuvfTSEour3njjDR588EFGjBhB27ZtmTZtGoGBgee9pdxms3HPPffw/PPP06xZM5fPKSJyPkU2O//40dFrM/KKZtQLroG3fovUYi4nN+PGjePkyZOsWrWKgIAAvv/+e2bOnEmLFi345ptvXDpWQUEB69atIyEh4XRAZjMJCQmsWLHinPu98MILNGjQgAceeMDV8EVELujLxEPsOZZNeKAvI6+I83Q4IuIily9LLV68mP/973907doVs9lM06ZNufbaawkJCWHSpEkMHDiw3MdKTU3FZrMRGRlZojwyMtL5xPGz/frrr7z33nts2LChXOfIz88nP//0iPqMjIxyxycitU9eoY3JP+0EYPTVzanj7+vhiETEVS733GRnZzvHwoSHh3PsmOMptB06dCAxMbFyoztLZmYm9913H9OnTyciIqJc+0yaNInQ0FDnEhMT49YYRaRm+3jlfo6k59Ew1J97L6uEu3xEpMq53HPTqlUrtm/fTmxsLB07duQ///kPsbGxTJs2jYYNG7p0rIiICCwWCykpKSXKU1JSiIqKKlV/9+7d7Nu3jxtuuMFZZrc7brHz8fFh+/btxMeXHPg3YcKEEk8yz8jIUIIjImXKyi/i3z/vBuCRvi3w99UTs0VqIpeTm0ceeYQjR44AMHHiRK6//no++eQT/Pz8mDFjhkvH8vPzo0uXLixatIibbroJcCQrixYt4i9/+Uup+q1bt2bTppLPOnnmmWfIzMxkypQpZSYtVqsVq1WDAUXkwv67bA9p2QU0iwjiti6NPR2OiFSQy8nNvffe61zv0qUL+/fvZ9u2bTRp0qTcl4rONH78eIYNG0bXrl3p3r07kydPJjs7mxEjRgAwdOhQGjVqxKRJk/D396d9+/Yl9g8LCwMoVS4i4or03ELeW+Z4zML461riY/HyxyyIeDGXk5uzBQYG0rlz5wrvf8cdd3Ds2DGee+45kpOT6dSpE99//71zkPGBAwcqdcJAEZGyfLh8H5n5RbSMDGZAe9cusYtI9VKup4KfOWblQt54442LCsjd9FRwETlbdn4RvV9dzMmcQqbc2YkbOzXydEgicpZKfyr4+vXry3Vikx5BLyI10Mcr93Myp5C4iCAGXaJn5InUdOVKbpYsWeLuOEREPCKv0Mb0ZXsA+PNV8VjM+iVNpKbTYBYRqdU+W32A1KwCGocHcNOluhwl4g1cHlB89dVXn/fy0+LFiy8qIBGRqpJfZOM/Sx29Ng9fFY+v7pAS8QouJzedOnUq8b6wsJANGzawefNmhg0bVllxiYi43Zx1h0jOyCMqxF/z2oh4EZeTmzfffLPM8r///e9kZWVddEAiIlWh0GbnnVOzEf+pTzOsPpqNWMRbVFof7L333sv7779fWYcTEXGrbzYc5tCJXCKC/bizWxNPhyMilajSkpsVK1bg7+9fWYcTEXEbwzCcd0jdf3kcAX7qtRHxJi5flrrllltKvDcMgyNHjrB27VqeffbZSgtMRMRdlu44xrbkTIL8LNzTQ0/+FvE2Lic3oaGhJd6bzWZatWrFCy+8wHXXXVdpgYmIuEtxr82d3ZsQGuDr4WhEpLK5nNx88MEH7ohDRKRKbE5K57ddx7GYTYzoHevpcETEDSr84My1a9eydetWANq2bUuXLl0qLSgREXd59xdHr82gSxrSODzQw9GIiDu4nNwcOnSIu+66i99++42wsDAATp48Sa9evZg1axaNG2uuCBGpng6dyGHepiMAjLqymYejERF3cfluqZEjR1JYWMjWrVtJS0sjLS2NrVu3YrfbGTlypDtiFBGpFO//ug+b3eDy5hG0iw698A4iUiO53HOzdOlSli9fTqtWrZxlrVq14q233uKKK66o1OBERCpLek4hs9YcAOBB9dqIeDWXe25iYmIoLCwsVW6z2YiOjq6UoEREKtvHq/aTU2CjdVQdrmwR4elwRMSNXE5uXn/9dcaMGcPatWudZWvXruWRRx7hH//4R6UGJyJSGQqK7Mxcvg9wjLU538N/RaTmMxmGYbiyQ3h4ODk5ORQVFeHj47iqVbweFBRUom5aWlrlRVpJMjIyCA0NJT09nZCQEE+HIyJV4Ov1h3h09kYiQ6wse+Ia/Hz09G+RmsaVn98uj7mZPHlyReMSEalyhmHw3q97ARjaM1aJjUgt4HJyM2zYMHfEISLiFmv3n2BzUgZWHzN3ddcDMkVqgwpN4mez2Zg7d65zEr927doxePBgLBY9fE5Eqpf3T/Xa3HxpI+oG+Xk4GhGpCi4nN7t27WLAgAEkJSU5bwefNGkSMTExzJs3j/j4+EoPUkSkIg6dyOGHP5IBGNE7zsPRiEhVcfni89ixY4mPj+fgwYMkJiaSmJjIgQMHiIuLY+zYse6IUUSkQj5csR+7AZc3j6BVVB1PhyMiVaRCk/itXLmSunXrOsvq1avHK6+8Qu/evSs1OBGRisrOL+Kz1Y5J++6/PNazwYhIlXK558ZqtZKZmVmqPCsrCz8/Xc8Wkerhy8RDZOYVERcRxFUtG3g6HBGpQi4nN4MGDWLUqFGsWrUKwzAwDIOVK1fy0EMPMXjwYHfEKCLiErvd4IPf9gEwvFcsZrMm7ROpTVxObv71r38RHx9Pz5498ff3x9/fn969e9O8eXOmTJnijhhFRFzy846j7E3Npo6/D7d1aezpcESkirk85iYsLIz//e9/7Nq1y3kreJs2bWjevHmlByciUhHFvTZ3dI0hyFqhGS9EpAYr9796u93O66+/zjfffENBQQF9+/Zl4sSJBAQEuDM+ERGX7DqaxbKdqZhMjhmJRaT2KfdlqZdeeomnn36a4OBgGjVqxJQpUxg9erQ7YxMRcdmHK/YB0Ld1JE3qBXo2GBHxiHInNx9++CH//ve/+eGHH5g7dy7ffvstn3zyCXa73Z3xiYiUW2ZeIV+uOwQ4BhKLSO1U7uTmwIEDDBgwwPk+ISEBk8nE4cOH3RKYiIir5qw7RHaBjeYNgundvJ6nwxERDyl3clNUVIS/v3+JMl9fXwoLCys9KBERV9ntBjOX7wNgWK9YTCbd/i1SW5V7QLFhGAwfPhyr1eosy8vL46GHHiIoKMhZ9tVXX1VuhCIi5bB05zH2Hc+hjr8Pt1zayNPhiIgHlTu5GTZsWKmye++9t1KDERGpqOJem9t1+7dIrVfub4APPvjAnXGIiFTYnmNZ/Lz92Knbv5t6OhwR8TCXZygWEaluPlyxH4BrWjWgab2gC9QWEW+n5EZEarSs/CLmnLr9e5hu/xYRlNyISA335bpDZOUX0ax+EJc3j/B0OCJSDSi5EZEay243mHlqRmI9/VtEiim5EZEaa9muVPYcyybY6sMtnfX0bxFxUHIjIjXWjN/2AjCka2OCdfu3iJyi5EZEaqS9qdks2X4M0NO/RaQkJTciUiMVP/376lb1iYvQ7d8icpqSGxGpcbLyi/hirW7/FpGyKbkRkRrnq8RTt39HBHFli/qeDkdEqhklNyJSo9jtBjNOPUdqaM+muv1bREpRciMiNcqvZ9z+fWsX3f4tIqUpuRGRGuWDU7d/39alMXX8fT0cjYhUR0puRKTG2HU0iyWnnv6tgcQici5KbkSkxpix3NFr07d1A93+LSLnpORGRGqEkzkFfLkuCYD7L4/zcDQiUp0puRGRGuGz1QfJLbTROqoOPZvV83Q4IlKNKbkRkWqv0GZ3zkj8wOVxmEy6/VtEzk3JjYhUews2J3MkPY+IYD9u6Bjt6XBEpJpTciMi1d77vzoGEt97WVP8fS0ejkZEqrtqkdxMnTqV2NhY/P396dGjB6tXrz5n3enTp3PFFVcQHh5OeHg4CQkJ560vIjXbuv0n2HDwJH4WM/de1tTT4YhIDeDx5Gb27NmMHz+eiRMnkpiYSMeOHenXrx9Hjx4ts/7PP//MXXfdxZIlS1ixYgUxMTFcd911JCUlVXHkIlIV3j81ad+NnaKJCLZ6OBoRqQlMhmEYngygR48edOvWjbfffhsAu91OTEwMY8aM4amnnrrg/jabjfDwcN5++22GDh16wfoZGRmEhoaSnp5OSEjIRccvIu5z6EQOfV7/GZvdYMEjV9Cmof7NitRWrvz89mjPTUFBAevWrSMhIcFZZjabSUhIYMWKFeU6Rk5ODoWFhdStW9ddYYqIh7z3615sdoPezespsRGRcvPx5MlTU1Ox2WxERkaWKI+MjGTbtm3lOsaTTz5JdHR0iQTpTPn5+eTn5zvfZ2RkVDxgEakyJ7ILmLX6IAAP9Yn3cDQiUpN4fMzNxXjllVeYNWsWX3/9Nf7+/mXWmTRpEqGhoc4lJiamiqMUkYr4aOV+cgtttIsO4fLmEZ4OR0RqEI8mNxEREVgsFlJSUkqUp6SkEBUVdd59//GPf/DKK6/w448/cskll5yz3oQJE0hPT3cuBw8erJTYRcR98gptzFi+D4A/9YnXpH0i4hKPJjd+fn506dKFRYsWOcvsdjuLFi2iZ8+e59zvtdde48UXX+T777+na9eu5z2H1WolJCSkxCIi1dsXaw+Sll1A4/AABrQ//y86IiJn8+iYG4Dx48czbNgwunbtSvfu3Zk8eTLZ2dmMGDECgKFDh9KoUSMmTZoEwKuvvspzzz3Hp59+SmxsLMnJyQAEBwcTHBzssXaISOUostmZvsxx+/eDVzTDx1Kjr56LiAd4PLm54447OHbsGM899xzJycl06tSJ77//3jnI+MCBA5jNp7/c3nnnHQoKCrjttttKHGfixIn8/e9/r8rQRcQNFmxO5kBaDuGBvtzeVWPkRMR1Hp/npqppnhuR6sswDG54+1c2J2UwLqEF4xJaejokEakmasw8NyIiZ1q++zibkzLw9zUztGesp8MRkRpKyY2IVBv//nkXAHd2a0LdID8PRyMiNZWSGxGpFlbvTeO3XcfxMZsYeUWcp8MRkRpMyY2IVAtTFu0AYEjXGBqHB3o4GhGpyZTciIjHrdl3utdm9NV61IKIXBwlNyLicVN+2gmo10ZEKoeSGxHxqDX70vh1V6p6bUSk0ii5ERGPUq+NiFQ2JTci4jHqtRERd1ByIyIeo14bEXEHJTci4hGr9hxXr42IuIWSGxGpcna7wcvztwJwRzf12ohI5VJyIyJV7rtNR9h4KJ0gP4sejikilU7JjYhUqfwiG699vw2AP/WJp34dq4cjEhFvo+RGRKrURyv2c+hELpEhVj1DSkTcQsmNiFSZkzkF/GuR4w6pv17bikA/Hw9HJCLeSMmNiFSZtxfvIiOviNZRdbi1S2NPhyMiXkrJjYhUiQPHc5i5Yh8AT/VvjcVs8mxAIuK1lNyISJV49fttFNoMrmgRQZ+W9T0djoh4MSU3IuJ2S3ccY96mI5hNMKF/G0wm9dqIiPsouRERt8otsPHM3E0ADO8VR9voEA9HJCLeTsmNiLjVW4t3cjAtl4ah/oy/ThP2iYj7KbkREbfZnpzJu7/sAeD5we0IturWbxFxPyU3IuIWdrvB377eRJHd4Lq2kVzXLsrTIYlILaHkRkTcYvbag6zdf4IgPwt/H9zO0+GISC2i5EZEKt2xzHwmnXrq9/jrWhEdFuDhiESkNlFyIyKVyjAMHp+zkYy8Ito3CmFYz6aeDklEahklNyJSqT74bR8/bz+G1cfMP4d0wseirxkRqVr61hGRSvPH4XReWbANgGcGtqFVVB0PRyQitZGSGxGpFLkFNsZ+tp4Cm52ENpHce5kuR4mIZyi5EZFK8cJ3W9h9LJvIECuv3XaJHrEgIh6j5EZELtr3m4/w2eoDmEzwxu2dqBvk5+mQRKQWU3IjIhdl19FMHp/zOwB/ujKe3s0jPByRiNR2Sm5EpMKOZ+UzYsYaMvOK6BYbzvhr9ewoEfE8JTciUiH5RTb+9NE6Dqbl0qRuIP+5ryt+PvpKERHP0zeRiLjMMAye+nITa/efoI6/D+8P76ZxNiJSbSi5ERGXvbV4F1+vT8JiNvHOPV1o3iDY0yGJiDgpuRERl3yx9iBvLNwBwAs3tuPyFhpALCLVi4+nAxCRmuPzNQd58ivHnVEjL4/jnh6emaivyF5EVkEWGQUZZBZkklGQgWEYBPoGEuATQKBvIMG+wYRZwzTfjkgtpORGRMrls9UHmPDVJgCG9mzK3wa2qZLzHsw8yJbjW9h5Yie7Tu5i54mdHMw8iIFxwX0DfQJpGtKU2JBYYkNjiQ+L59IGl9IgsEEVRC4inqLkRkQu6OOV+3lm7mYAhveKZeINbd3WI5JRkMHqI6tZfng5yw8vJykr6Zx1A30CqeNXhxBrCGbM5BTlkFOYQ05RDrlFueQU5bA1bStb07aW2K9RcCM6N+jMpZGXclnDy4ipE+OWtoiIZyi5EZHzmvHbXv7+7RYAHrg8jmcGtqn0xCazIJOf9v/E/L3zWZO8Bpthc27zMfvQOrw1LcJbOJf40HjC/cPxMZ/7K6zQVsjBrIPsT9/P/oz97MvYx5bjW9h+YjtJWUkkZSXx7Z5vAYgPjefKmCvp07gPHet3PO9xRaT6MxmGceG+XS+SkZFBaGgo6enphISEeDockWqr0GbnpXlbmbF8HwCjrmzGhP6tKy2xKbQVsvTQUubtmccvh36hwF7g3BYbEkuv6F70iu5F16iuBPkGVco5AbIKsvj92O8kHk1kbcpaNhzdUCKZCrOG0bdJX/rF9qNbVDclOiLVhCs/v5XciEgpJ7ILGP1pIst3Hwdg/LUtGXNN80pJbA5mHOTLnV/y9a6vSctLc5bHh8YzoNkA+sf2Jyak6i4Tpeens/zwcpYeWsqyQ8vIKMhwbqvrX5drm17L9bHX0zmyM2aTbjAV8RQlN+eh5Ebk/LYlZ/Dgh2s5mJZLkJ+FN+7oRL92URd1zCJ7EUsPLmX29tmsOLLCWR4REMEN8TcwMG4gLcNbevzOpiJ7EWtT1vLDvh/4af9PnMw/6dzWMKghA5sNZGDcQJqHN/dckCK1lJKb81ByI1I2wzD4en0Sz8zdTE6BjZi6Afx3aDdaRdWp8DFP5J3gy51f8vn2zzmSfQQAEyZ6RfdiSMshXBlzJb5m38pqQqUqtBey5sgaFuxbwE/7fyKrMMu5rXXd1gxqNoj+cf1155VIFVFycx5KbkRKS8nI4+mvNrFo21EAejevx9t3dSa8go9U2HJ8C59t+4z5e+Y7x9KEW8O5pcUt3NbyNhrXaVxpsVeFvKI85/igZUnLKLIXAY5ErUfDHgxsNpCEJgkE+2mmZhF3UXJzHkpuRE4zDIM56w7x4ndbyMgrws9i5pGEFvzpymb4WFwbX1JoK+TH/T/y2bbP2Hhso7O8bb223N36bq6Pux6rxVrZTahyJ/NO8uP+H/luz3esP7reWW61WLmy8ZUMiBvAFY2v8Iq2ilQnSm7OQ8mNiMP25Exemr+VX3YcA6Bj41BeH9KRlpGuXYZKykriyx1f8tXOrzie5xiA7GP24bqm13FX67voWL+jx8fSuMuhzEPM3zufb3d/y76Mfc7yYN9grmlyDf1i+3FZw8vws+ihoiIXS8nNeSi5kdou6WQuby7cwZeJhzAM8LOYefTaljx4RVy5e2sK7YX8cvAXvtjxBcsPL3fOFtwgoAFDWg3htpa3ERFQe545ZRgG29K2sWDvAhbsW0BydrJzW7BvMFfFXEVC0wR6R/fG38ffg5GK1FxKbs5DyY3UVqlZ+Uz7eTcfrtxPQZEdgOvbRfH49a2Ir1++sSLb07bz7e5vmbd3Hqm5qc7yyxpexm0tb+OaJtdU2wHCVcVu2NlwdAPf7/ueRfsXcTT3qHNbgE8APRr2oE/jPvRp3If6gfU9GKlIzaLk5jyU3EhtszkpnQ9+28e3Gw9TYHMkNZc1q8uT17fm0ibhF9w/OTuZBXsX8O2eb9l5YqezvK5/XW5ufjO3tri1SuelqUnshp3fj/3Oj/t/5Kf9PznvGCvWrl47ekX3omd0TzrV74SvpXYnhiLno+TmPJTcSG2QW2Bj4dYUPly+j7X7TzjLO8aE8WhCC/q0rH/ecTAHMg6w6MAifjrwE78f+91Z7mv2pU/jPgyKH8SVja7UD2MXGIbB9hPbWXpwKUsPLWVT6qYS2wN8AugW1Y3LGl5Gl8gutApvhcVs8VC0ItWPkpvzUHIj3iq/yMYvO1L5duNhftqaQk6B45ECvhYTAzo0ZHiv2HP21BTaCtlwbAO/Jf3GsqRl7Dixo8T2zg06M7DZQPrF9iPUGur2ttQGqbmpLDu0jBVHVrDqyKoSszUDBPkG0al+J7pEdqFj/Y60rddWt5pLrabk5jyU3Ig3OXwyl193prJsVyo/bz9KZl6Rc1ujsABu7dKYe3s0oUFIyUGsRfYitqdtJ/FoIiuPrGRN8hpyi3Kd2y0mC92iupHQJIFrmlyjsSFuZjfs7DixgxWHV7AmeQ0bjm4gszCzRB0TJuJC42gf0Z529drRqm4rWoa3pI5fxSdZFKlJlNych5IbqakMw+BAWg4bDp4kcf8Jft2Vyu5j2SXqRIZYGdghmhs6NqRTTBgmkwnDMEjJSWFb2jY2p25mw9EN/J76e4lkBhxjaIofVnll4yvVQ+NBNruNnSd3si5lHeuPrmdz6maSspLKrBsdFE3Lui1pHtacuNA44kLiiA2NVdIjXkfJzXkouZGaIK/Qxp5j2ew8msmOlEz+OJzBxoMnOZFTWKKe2QSXNA7jihYRXNmyPs0jzezP3Mfe9L3sSd/D9rTtbEvbxon8E6XOUce3Dh0bdKRrZFd6N+pNy/CWejBkNXY89zh/HP+Dzamb2XJ8C9tPbC9xy/nZIgIiiKkTQ+PgxjSu41iig6KJCooiMjBS46Wkxqlxyc3UqVN5/fXXSU5OpmPHjrz11lt07979nPW/+OILnn32Wfbt20eLFi149dVXGTBgQLnOpeRGqgOb3eB4dj5HM/I5dCKXg2k5HDyRw4G0HA4cz2Hf8Wzspf5lGvj55hMfbaNpgyKi6uYQGJhBan4ySVlJHMo8VGrcRjGLyUJcaBxt67WlY/2OXNrgUuLD4pXM1HDp+ensOLGDHSd2sDd9r3M5lnvsvPuZMFEvoB5RgVFEBEZQP6A+EQERRAREUC+gHnX96xJmDaOuf13q+NXR3xOpFmpUcjN79myGDh3KtGnT6NGjB5MnT+aLL75g+/btNGhQ+oF0y5cv58orr2TSpEkMGjSITz/9lFdffZXExETat29/wfMpuZHKZBgG+UV2svKLyM4vIiO3iIy8QjJyC8nIK+RETiFp2QXO5XhWPimZeRzLysROPpjzMVnyMJlzHa+WXDDnYrLkYLXmEBSQj69fDoY5kxz7CQpPPafpfKKCopyXJlqEt6BN3TY0D2uuyeNqkcyCTA5kHOBg1kEOZR7iUOYhDmYe5Ej2EVKyU5zP+yoPi8lCiF8IIdaQ06++IQT7BTsWX8cS5BtEoG8ggT6Bzld/H38CfAIcr5YAfMw+XjtbtbhfjUpuevToQbdu3Xj77bcBsNvtxMTEMGbMGJ566qlS9e+44w6ys7P57rvvnGWXXXYZnTp1Ytq0aRc8n7uSm8z8XHakHq6045VH+f7kLlzp7OPYy9inrL8mxlnb7KdeS1Y1MAwwTs1h66yL3XkAe/F2w1HXbthPlxv2U9tPvRoGNsOO3XDUtxsGNsPAbtgd2+wGRXY79lN1bHY7NsPueLXbKbLbsdltFJ56tRl2Cm02Cu02iuw2Cm02iuxFFNqKKLTZKLAXUWQrotBuo8BW6Ci3Fzrq2B3rBkVgsmEyFYGpCMxFp9YLMZmLwFSAyVwI5kJMpgIwF2AyVfyfXZg1jIiACKKDo4kOinZcbgiOplFwI2JDYgn0DazwscX7GYZBWl4ayTnJpGSnkJqbSmpuKsdyj5Gak0paXhon8k9wIu9EiSehVwazyYzVYsVqseJn8XO8mv3ws/jha/E9vW72dS4+Zp+yF5MPFrMFi8mCj9kHs8mMxeR4X7xuNptLvDeZTJgxYzabHa8m8+myU+smTI51TI73p7YXJ2UltuEoK14/cx/ntrPqFCs+Xln1znx/6k2Zdc90dtJYZp2zy8qZZ5Z1rAud38/sV+k3Irjy89unUs/sooKCAtatW8eECROcZWazmYSEBFasWFHmPitWrGD8+PElyvr168fcuXPLrJ+fn09+fr7zfUZGxsUHXoYFO9bxYuLDbjm2eJj51FLGv5aLGbVgwuT8bTfEL8S51PGrQ5h/GOHWcML9wwm3hlM3oC4NAhsQERChBzLKRTGZHJek6gXUo129duetW2Ar4ETeCTIKMsgoyCA9P530/HQyCzLJLswmqzCLrMIsMgsyySnKIbcwl5yiHLILs8kpzCHPlkduUe4Zv7DYyS3KLTWYXbxPx/od+XjAxx47v0eTm9TUVGw2G5GRkSXKIyMj2bZtW5n7JCcnl1k/ObnsgXWTJk3i+eefr5yAz8OMCcN+MR9ndeuqLSvrL1+98tcxlbluMs78jcUEhqnUby6n9zn9uwynf3dyrjv+NzuW4t+8sJzx25cZs8nkKDObsZgcdU//hmjBYrbga/bBz+yDn48vfhZf/Mw+BPhaCfD1I9DXSqCvFT8f31K/kfr7+DsWy+nu+SDfIAJ9AgnwCVAXvVRrfhY/IoMiiQyKvHDlczAMgyJ7ETlFORTYCsiz5VFgKyDflk++LZ8CW4FjsTtei071iBbaCh2vp3pKi8uLjKJTva6OXlabYXO+txv2kutnvTp7eM98T3EvsKMeOHqSi7cXt8GOY19nL/MZr8V1nP8V92IXd08bp9fL3H7GZ3V2+ZnHL2uf4uOXfFtWT3vZ57rQfhXl6V/CPJrcVIUJEyaU6OnJyMggJqbyp4q/rUNvbuuwvtKPKyJSk5lMJnwtvoRaNLWAVB2PJjcRERFYLBZSUlJKlKekpBAVFVXmPlFRUS7Vt1qtWK3qxhcREaktPHp/n5+fH126dGHRokXOMrvdzqJFi+jZs2eZ+/Ts2bNEfYCFCxees76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=\n", + "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyIiIiIV1FyIyIiIl5FyY2IiIh4FSU3IiIi4lWU3IiIiIhXUXIjIiIiXqXWTeJnt9s5fPgwderUOef09SIiIlK9GIZBZmYm0dHRzsksz6XWJTeHDx8mJibG02GIiIhIBRw8eJDGjRuft06tS27q1KkDOD6ckJAQD0cjIiIi5ZGRkUFMTIzz5/j51LrkpvhSVEhIiJIbERGRGqY8Q0o0oFhERES8ipIbERER8SpKbkRERMSr1LoxNyIiIjWR3W6noKDA02G4lZ+f3wVv8y4PJTciIiLVXEFBAXv37sVut3s6FLcym83ExcXh5+d3UcdRciMiIlKNGYbBkSNHsFgsxMTEVErPRnVUPMnukSNHaNKkyUVNtKvkRkREpBorKioiJyeH6OhoAgMDPR2OW9WvX5/Dhw9TVFSEr69vhY/jnemfiIiIl7DZbAAXfammJihuY3GbK0rJjYiISA1QG56HWFltVHIjIiIiXsWjyc0vv/zCDTfcQHR0NCaTiblz515wn59//pnOnTtjtVpp3rw5M2bMcHucIiIiUnN4NLnJzs6mY8eOTJ06tVz19+7dy8CBA7n66qvZsGED48aNY+TIkfzwww9ujlRERERcNXz4cEwmEyaTCV9fX+Li4njiiSfIy8tz63k9erdU//796d+/f7nrT5s2jbi4OP75z38C0KZNG3799VfefPNN+vXr564wy6coH7JSzrHRjddJy3V9shx1Sh3HVMY2Uxl1zy4zldxuMp1Rdo5Xk/nUuvn0+1pwbVlEpDa4/vrr+eCDDygsLGTdunUMGzYMk8nEq6++6rZz1qhbwVesWEFCQkKJsn79+jFu3Lhz7pOfn09+fr7zfUZGhnuCO/I7vJdw4XpSfibzORaLI/kxWxzrZh/Hurl43eeMMl+wnFrMvmDxc6z7WMFiBR8/x6uvP/gEOMp9A8A3EPwCwS/41HoQ+IeCtQ5YQxz1RUTkgqxWK1FRUQDExMSQkJDAwoULldwUS05OJjIyskRZZGQkGRkZ5ObmEhAQUGqfSZMm8fzzz7s/OJMJfNz4A88wKrpjOY7jQp0S2yoaUzkZdsdSHVn8wD8MAutCQDgE1IXAcAiOPLU0cLzWaQghjRxJlIhIJTAMg9zCi7tVuqICfC0XdUfT5s2bWb58OU2bNq3EqEqrUclNRUyYMIHx48c732dkZBATE1P5J2rcFZ4512WpWsAwzkh8ylov69Vesqw4kSkuL05uDDsYttPr9lPv7bbTr3Yb2ItOvS86tdjAVgj2QserrRBsBaeXovxTr3mO9cJcx3phLhTmQEEOFGZDQTbkZ0F+JhRkOmK0FUD2UcdyQSaoEwWhMRDWBOrFQ0RLqNfcsViDK/EPQkS8XW6hjbbPeWas6ZYX+hHo51rq8N133xEcHExRURH5+fmYzWbefvttN0XoUKOSm6ioKFJSSiYQKSkphISElNlrA47uMKvVWhXh1W4mU+0YJ2O3OxKcvAzIOwk5aZCb5njNSXMkO1kpkHUUMpMh84gjYco84lgOrS59zNAm0PASaNgJGnZ0LHUiS9cTEamBrr76at555x2ys7N588038fHx4dZbb3XrOWtUctOzZ0/mz59fomzhwoX07NnTQxFJrWM2O8be+IcC5egBNAzIToX0A3DyIJzcD8d3QeouSN0BOae2pR+Abd+d3i88FppeDrG9IfZyR4+PiAiOS0NbXvDMTTQBvhaX9wkKCqJ58+YAvP/++3Ts2JH33nuPBx54oLLDc/JocpOVlcWuXbuc7/fu3cuGDRuoW7cuTZo0YcKECSQlJfHhhx8C8NBDD/H222/zxBNPcP/997N48WI+//xz5s2b56kmiJyfyQTB9R1Loy6lt+eegJQtcGTj6SV1O5zY51g2fOyoFx4LrQZCm0EQ08MxWFpEaiWTyeTypaHqwmw28/TTTzN+/Hjuvvvuc151uVge/XTWrl3L1Vdf7XxfPDZm2LBhzJgxgyNHjnDgwAHn9ri4OObNm8ejjz7KlClTaNy4Mf/97389fxu4SEUFhJ/qnel9uiw/Ew6sgn3LYP9vkJToSHRWTnUsgRHQqj9ccjvEXlE7LgeKiNcYMmQIjz/+OFOnTuWxxx5zyzlMhlHh23BqpIyMDEJDQ0lPTyckJMTT4YhcWH4m7F4C2+bBjgWQl356W9146DwUOt3j6B0SEa+Tl5fH3r17iYuLw9+/Zk1DMXz4cE6ePFnqCQSvvPIKb7zxBnv37iUoKMhZfr62uvLzW8mNSE1iK3T05vwxFzbNOX33ltnXccnq8kcdA5JFxGvU5OTGVZWV3OjBmSI1icUXml0FN0yGv26DwW9Do66O293/+Br+cyV8drdj7I6ISC2l5EakprIGQ+f74MFF8NCv0GEIYILt804lOXdB8mZPRykiUuWU3Ih4g6gOcOt/YfRq6HC74zEV2+c7kpwf/uaYhFBEpJZQciPiTeq3hFunO5Kctjc6Zmxe8TZM7eEYkCwiUgsouRHxRhEt4PYP4e4vHBMAZhyCWXc7xuNkleeRESIiNZeSGxFv1vI6+PMqx11UZh/HeJxpV8D+5Z6OTETEbZTciHg7v0BI+Dv86ReIaAVZyTBjECx/6yKeNi8iUn0puRGpLSLbwYOLof1tjrE4Pz4Ds+8tOSmgiIgXUHIjUptYgx13VQ34h2Piv23fwfS+kH7I05GJiFQaJTcitY3JBN0fhPt/gJBGcHwnvH89HN/t6chERCqFkhuR2qpxF0eCU685pB90JDia9E9EKtGxY8d4+OGHadKkCVarlaioKPr168dvv/3m1vMquRGpzcJiYMQCiOwA2UdhxgA4uMbTUYmIl7j11ltZv349M2fOZMeOHXzzzTdcddVVHD9+3K3n9XHr0UWk+gtuAMO/g09vh4Or4MMb4d450LSXpyMTkRrs5MmTLFu2jJ9//pk+ffoA0LRpU7p37+72c6vnRkQgIAzu+xrir4HCbPjsTji6zdNRiUhZDAMKsj2zuDB9RHBwMMHBwcydO5f8/Hw3fiClqedGRBz8guDOTx09NwdXwSe3wQMLIaShpyMTkTMV5sDL0Z4599OHHd8V5eDj48OMGTN48MEHmTZtGp07d6ZPnz7ceeedXHLJJW4NUz03InKabwDc+dnpQcafDoH8TE9HJSI11K233srhw4f55ptvuP766/n555/p3LkzM2bMcOt5TYZRu6YozcjIIDQ0lPT0dEJCQjwdjkj1lLYX3rsWso85LlXd/TlYfD0dlUitlJeXx969e4mLi8Pf399xaagwxzPB+AY6ppO4CCNHjmThwoXs37+/1LZSbT2DKz+/1XMjIqXVjXMkNL6BsHsxfDdOj2oQqS5MJselIU8sF5nYALRt25bs7OxK+CDOTcmNiJStUWcYMhNMFlj/MSR+6OmIRKQGOX78ONdccw0ff/wxv//+O3v37uWLL77gtdde48Ybb3TruTWgWETOreV10Pc5+GkiLHgCGneDyLaejkpEaoDg4GB69OjBm2++ye7duyksLCQmJoYHH3yQp59+2q3n1pgbETk/u90xsHjXT1C/tePhm+W8W0JELt75xqF4G425EZGqYTbDzf+B4Cg4ts3RgyMiUo0puRGRCwuKcDxN3GR2jL/5/XNPRyQick5KbkSkfOKugCtP9dp89yik7vJsPCIi56DkRkTKr88TEHsFFGTB//7sGI8jIlLNKLkRkfIzW+DmaeAX7HhEw7oPPB2RiEgpSm5ExDWhjR23hwP89HfIOOzRcEREzqbkRkRc120kNOoK+Rm6e0pEqh0lNyLiOrMFbpgCZh/Y+i1s/c7TEYmIOCm5EZGKiWoPvcY61uc/DnkZno1HROQUJTciUnF9noC6zSDzMCx+0dPRiIgASm5E5GL4BsCgyY711dPh8AZPRiMi1czw4cO56aabqvy8Sm5E5OI06wMdhgAG/PgM1K7H1YlINaTkRkQuXt/nwGKFfctg54+ejkZEajkfTwcgIl4grAn0+BMs/xcsfA7i+4JFXy8i7mAYBrlFuR45d4BPACaTySPndoW+fUSkclzxV1j/kePJ4es/gq4jPB2RiFfKLcqlx6c9PHLuVXevItA30CPndoUuS4lI5QgIgz5POtaXvAz5WR4NR0RqL/XciEjl6foArPoPnNjruER19dOejkjE6wT4BLDq7lUeO3dNoORGRCqPjx8k/B2+GAbL34IuIyCkoaejEvEqJpOpRlwa8iRdlhKRytX2RmjcHQpz4OeXPR2NiNRCSm5EpHKZTHDdqdmKN3wKJ/Z7Nh4RqXWU3IhI5WtyGTS7CuxF8Oubno5GRDxkxowZzJ07t8rPq+RGRNyj+M6p9R9D+iHPxiIitYqSGxFxj6a9IPYKsBfCr5M9HY2I1CJKbkTEfYp7bxJnQsZhz8YiIrWGkhsRcZ/Yy6FJL7AVwG9TPB2NiNQSSm5ExH1MJujzhGN93QzITPZoOCI1mWEYng7B7SqrjUpuRMS9ml3lmPemKM8xsZ+IuMRisQBQUFDg4Ujcr7iNxW2uKM1QLCLuZTLBVU/Cx7fCmveg9zgIru/pqERqDB8fHwIDAzl27Bi+vr6Yzd7ZL2G32zl27BiBgYH4+FxceqLkRkTcL74vNOoCSetg9btwzd88HZFIjWEymWjYsCF79+5l/37vnhTTbDbTpEkTTCbTRR1HyY2IuJ/JBL3GOp45tea/cPmj4Kdn44iUl5+fHy1atPD6S1N+fn6V0jOl5EZEqkabGyCsKZzcDxs/hW4jPR2RSI1iNpvx9/f3dBg1gndeuBOR6sdsgZ5/cayvmAp2m2fjERGvpeRGRKrOpfeAfxik7YHtCzwdjYh4KSU3IlJ1/IKg2wOOdd0WLiJu4vHkZurUqcTGxuLv70+PHj1YvXr1eetPnjyZVq1aERAQQExMDI8++ih5eXlVFK2IXLTuo8DiBwdXwsE1no5GRLyQR5Ob2bNnM378eCZOnEhiYiIdO3akX79+HD16tMz6n376KU899RQTJ05k69atvPfee8yePZunn366iiMXkQqrEwUdbnesr1DvjYhUPo8mN2+88QYPPvggI0aMoG3btkybNo3AwEDef//9MusvX76c3r17c/fddxMbG8t1113HXXfddcHeHhGpZnqdGli89VvH+BsRkUrkseSmoKCAdevWkZCQcDoYs5mEhARWrFhR5j69evVi3bp1zmRmz549zJ8/nwEDBpzzPPn5+WRkZJRYRMTDGrSB5teCYYeV73g6GhHxMh5LblJTU7HZbERGRpYoj4yMJDm57Ifr3X333bzwwgtcfvnl+Pr6Eh8fz1VXXXXey1KTJk0iNDTUucTExFRqO0Skgop7b9Z/Annpno1FRLyKxwcUu+Lnn3/m5Zdf5t///jeJiYl89dVXzJs3jxdffPGc+0yYMIH09HTncvDgwSqMWETOKa4P1G8Dhdmw4VNPRyMiXsRjMxRHRERgsVhISUkpUZ6SkkJUVFSZ+zz77LPcd999jBzpmNm0Q4cOZGdnM2rUKP72t7+VOWWz1WrFarVWfgNE5OKYTND9QZg33vG8qe5/Ai99IKCIVC2PfZP4+fnRpUsXFi1a5Cyz2+0sWrSInj17lrlPTk5OqQSm+LHohmG4L1gRcY9L7gBrqGNQ8e7Fno5GRLyER39NGj9+PNOnT2fmzJls3bqVhx9+mOzsbEaMGAHA0KFDmTBhgrP+DTfcwDvvvMOsWbPYu3cvCxcu5Nlnn+WGG25wJjkiUoNYgx2zFgOs/o9nYxERr+HRB2fecccdHDt2jOeee47k5GQ6derE999/7xxkfODAgRI9Nc888wwmk4lnnnmGpKQk6tevzw033MBLL73kqSaIyMXqNtJxx9TOhXB8N9SL93REIlLDmYxadj0nIyOD0NBQ0tPTCQkJ8XQ4IgLwyRDY+SNc9me4fpKnoxGRasiVn98avScintd9lON1/SeQn+XZWESkxlNyIyKeF98X6sZDfjr8PtvT0YhIDafkRkQ8z2x23BYOsHo61K6r5SJSyZTciEj10Olu8A2CY1th7y+ejkZEajAlNyJSPfiHQsc7Hetr3/NsLCJSoym5EZHqo9sDjtdt8yCz7GfMiYhciJIbEak+IttBzGVgL4LEDz0djYjUUEpuRKR6Ke69WfsB2Io8G4uI1EhKbkSkeml7IwTWg8zDsON7T0cjIjWQkhsRqV58rHDpvY51DSwWkQpQciMi1U+XEYDJ8aTw47s9HY2I1DBKbkSk+qkbB837OtbXfeDZWESkxlFyIyLVU9dTA4vXfwKFeZ6NRURqFCU3IlI9tewHoTGQmwZb5no6GhGpQZTciEj1ZLZAl2GO9TUaWCwi5afkRkSqr0uHgtkHDq2G5E2ejkZEagglNyJSfdWJhNaDHOtr3/dsLCJSYyi5EZHqrXjG4t8/h/xMz8YiIjWCkhsRqd5ir4B6LaAgy5HgiIhcgJIbEaneTCboer9jfe37YBiejUdEqj0lNyJS/XW6C3z8IWUzHFrj6WhEpJpzOblJSUnhvvvuIzo6Gh8fHywWS4lFRKTSBYRD+1sd67otXEQuwMfVHYYPH86BAwd49tlnadiwISaTyR1xiYiU1PUB2PAJ/PE1XD8JAut6OiIRqaZcTm5+/fVXli1bRqdOndwQjojIOTTqDFGXQPLvjiSn1xhPRyQi1ZTLl6ViYmIwNKBPRKqayXT6tvC1H4Dd7tl4RKTacjm5mTx5Mk899RT79u1zQzgiIufR/jbwqwNpu2HvUk9HIyLVlMuXpe644w5ycnKIj48nMDAQX1/fEtvT0tIqLTgRkRKswdDxTlgzHda+B/FXezoiEamGXE5uJk+e7IYwRETKqdsDjuRm23xIT4LQRp6OSESqGZeTm2HDhrkjDhGR8mnQxjFr8b5lsO4DuOYZT0ckItWMy8kNgM1mY+7cuWzduhWAdu3aMXjwYM1zIyJVo9sDp5KbmXDlE+Dj5+mIRKQacTm52bVrFwMGDCApKYlWrVoBMGnSJGJiYpg3bx7x8fGVHqSISAmtB0FwFGQlw9ZvoMNtno5IRKoRl++WGjt2LPHx8Rw8eJDExEQSExM5cOAAcXFxjB071h0xioiUZPGFLsMd65qxWETOYjJcnLQmKCiIlStX0qFDhxLlGzdupHfv3mRlZVVqgJUtIyOD0NBQ0tPTCQkJ8XQ4IlJRGUdgcnuwF8HDyyGynacjEhE3cuXnt8s9N1arlczMzFLlWVlZ+PnpureIVJGQho7LUwCrp3s2FhGpVlxObgYNGsSoUaNYtWoVhmFgGAYrV67koYceYvDgwe6IUUSkbN1GOl5//xzy0j0bi4hUGy4nN//617+Ij4+nZ8+e+Pv74+/vT+/evWnevDlTpkxxR4wiImWLvRzqt4HCbNg4y9PRiEg14fKYm2I7d+5k27ZtALRp04bmzZtXamDuojE3Il5m9XSY/xhEtITRqx3PoBIRr+PKz+8KzXMD0KJFC1q0aFHR3UVEKkfHO+Gn5yF1B+xZAvHXeDoiEfGwciU348eP58UXXyQoKIjx48eft+4bb7xRKYGJiJSLtQ5ceg+smgYr31FyIyLlS27Wr19PYWGhc11EpFrpPgpW/Qd2/gipOyFCvcoitVmFx9zUVBpzI+KlPrsLts+Hbg/CwH94OhoRqWRunefm/vvvL3Oem+zsbO6//35XDyciUjl6POR43fAJ5J7wbCwi4lEuJzczZ84kNze3VHlubi4ffvhhpQQlIuKyuCuhQTsozIHEjzwdjYh4ULmTm4yMDNLT0zEMg8zMTDIyMpzLiRMnmD9/Pg0aNHBnrCIi52YywWUPO9ZXTwdbkWfjERGPKfet4GFhYZhMJkwmEy1btiy13WQy8fzzz1dqcCIiLukwBH6aCOkHYPs8aHujpyMSEQ8od3KzZMkSDMPgmmuu4csvv6Ru3brObX5+fjRt2pTo6Gi3BCkiUi6+/tD1fvjldcdt4UpuRGqlcic3ffr0oaioiGHDhtG1a1diYmLcGZeISMV0fQB+fRMOrIDD6yH6Uk9HJCJVzKUBxT4+PsyZMwebzeaueERELk5IQ2h3i2N9xVTPxiIiHuHy3VLXXHMNS5cudUcsIiKVo9dfHK+bv4IT+z0bi4hUOZefLdW/f3+eeuopNm3aRJcuXQgKCiqxffDgwZUWnIhIhTTs6HgMw+7FsOJtGPC6pyMSkSrk8gzFZvO5O3tMJlO1v2SlGYpFaok9S+HDweDjD+M2Q3B9T0ckIhfBrTMU2+32cy7VPbERkVok7kqI7gxFebD6P56ORkSqkMvJjYhIjWAyweXjHOurp0N+6cfGiIh3qlBys3TpUm644QaaN29O8+bNGTx4MMuWLavs2ERELk7rQVCvOeSdhHUzPR2NiFQRl5Objz/+mISEBAIDAxk7dixjx44lICCAvn378umnn7ojRhGRijFboNdYx/qKqVBU4Nl4RKRKuDyguE2bNowaNYpHH320RPkbb7zB9OnT2bp1a6UGWNk0oFiklinKh8mXQFYy3DgVLr3X0xGJSAW4dUDxnj17uOGGG0qVDx48mL1797p6OKZOnUpsbCz+/v706NGD1atXn7f+yZMnGT16NA0bNsRqtdKyZUvmz5/v8nlFpJbwsULPPzvWf50MdrtHwxER93M5uYmJiWHRokWlyn/66SeXH8kwe/Zsxo8fz8SJE0lMTKRjx47069ePo0ePllm/oKCAa6+9ln379jFnzhy2b9/O9OnTadSokavNEJHapMsIsIbC8Z2w5WtPRyMibubyJH5//etfGTt2LBs2bKBXr14A/Pbbb8yYMYMpU6a4dKw33niDBx98kBEjRgAwbdo05s2bx/vvv89TTz1Vqv77779PWloay5cvx9fXF4DY2FhXmyAitY1/iKP35udJ8PMr0PYmx3gcEfFKLvfcPPzww8yaNYtNmzYxbtw4xo0bx+bNm5k9ezZ/+tOfyn2cgoIC1q1bR0JCwulgzGYSEhJYsWJFmft888039OzZk9GjRxMZGUn79u15+eWXzzu/Tn5+PhkZGSUWEamFLnsY/MMgdQdsmuPpaETEjVzuuQG4+eabufnmmy/qxKmpqdhsNiIjI0uUR0ZGsm3btjL32bNnD4sXL+aee+5h/vz57Nq1iz//+c8UFhYyceLEMveZNGkSzz///EXFKiJewD8Ueo+FRS/A0leg/a1gqdBXoIhUcxWexG/t2rV89NFHfPTRR6xbt64yYzonu91OgwYNePfdd+nSpQt33HEHf/vb35g2bdo595kwYQLp6enO5eDBg1USq4hUQ93/BIH1IG0PbPzM09GIiJu4/GvLoUOHuOuuu/jtt98ICwsDHHcw9erVi1mzZtG4ceNyHSciIgKLxUJKSkqJ8pSUFKKiosrcp2HDhvj6+mKxnL5W3qZNG5KTkykoKMDPz6/UPlarFavVWs7WiYhXswZD73Gw8FlY+hpccgf4lP7eEJGazeWem5EjR1JYWMjWrVtJS0sjLS2NrVu3YrfbGTlyZLmP4+fnR5cuXUrceWW321m0aBE9e/Ysc5/evXuza9cu7Gfcyrljxw4aNmxYZmIjIlJKt5EQHAnpB2D9R56ORkTcwOXkZunSpbzzzju0atXKWdaqVSveeustfvnlF5eONX78eKZPn87MmTPZunUrDz/8MNnZ2c67p4YOHcqECROc9R9++GHS0tJ45JFH2LFjB/PmzePll19m9OjRrjZDRGorv0C4fLxjfdk/oTDPs/GISKVz+bJUTEwMhYWFpcptNhvR0dEuHeuOO+7g2LFjPPfccyQnJ9OpUye+//575yDjAwcOYDafzr9iYmL44YcfePTRR7nkkkto1KgRjzzyCE8++aSrzRCR2qzLcPhtCmQkwboZcNlDno5ILoLdbpBXZCOv0E5uoY28Qhv5hXbyi2wUFNkpsNnJL7RTaHOsF9oMCm2n3hfZKbIbFNnsFNgMbHbHe5vNcLzai1/t2Ow4Xg3HOW12A5thYLcb2A0DmwGG4Si3Gwb2U+/LerUbBsapV8C5buCoYwAYlHhvGGDg2K94H86sf0YdOKvOWe85T50znf0Qg7LrlC67pHEoHz3Qo4zaVcPlxy/873//4+WXX2bq1Kl07doVcAwuHjNmDE8++SQ33XSTO+KsNHr8gogAsOY9mDfeMcB4TCIEhHk6olrHMAxyCmykZRdwMqeQEzkFpOcWkplXREZeIRmn1rPyTy15RWQXFJGdX0RugY2cQhu5BTbyizTrdHXTuUkYX/25d6Ue05Wf3y4nN+Hh4eTk5FBUVISPj6Pjp3g9KCioRN20tDQXQ3c/JTciAoCtEN7p5Zj3ptcYuO7/PB2R17DbDY5nF5CcnseR9FySM/JITs/jWGY+qVn5pGYVkJqVz/GsAgpslZuY+FnMWH3N+PtasPqY8fMxY/WxOF4tZnx9TPhazKcWx7qP2bHuYzE51y1mMz5mE2azCR+zCUvxYjq9bjabMJvAYnKsO17BfKqOCcd2k8mE6VQ9k8mxHcf/mE2mUwunyhx1TJzez7EOnLXNUcKpslPvTSU/j7K2OV8xlahXfLyznX3MsmqdXcfqY6ZxeOC5/pgqxJWf3y5flpo8eXJF4xIRqT4svnDdS/DpEFg5zfGIhnrxno6qxrDZDZJO5LL7WBa7j2VxIC2HA2k5HEzL4eCJXApc6E3x8zFTN9CPsEBfQgN8CQnwJcTfl5AAH+r4+1LH6kOQ1Ycgq4Vgqw+Bfj4E+lkI9LMQ4Gch0M8Hf19HEmMxl/XjWWobl3tuajr13IiIk2HAx7fC7kXQehDc+YmnI6qWjmfls+VIBlsOZ/DH4Qx2pGSyNzX7vJeDTCaoH2ylYag/UaH+RIX40yDEn4hgPyKCrUQEW6kX7EfdID8CfC3OngiRc3Frzw04Bg/PnTuXrVu3AtCuXTsGDx5cYv4ZEZFqz2SCfi/BOz/Dtu9g7zKIu8LTUXlUfpGNzUkZJO4/wbr9J1h/8AQpGfll1vXzMdMsIoj4+sE0rRdITN1AYsIDaVI3kIZh/vhaKjxPrMhFcbnnZteuXQwYMICkpCTn7eDbt28nJiaGefPmER9fvbt11XMjIqXM+yus+S9EdYBRS2vVQzWLbHZ+T0rn152p/LozlQ0HT5YaB2MyQVy9INpEh9C2YQhtGtahef06NAoP0GUgqTJuHVA8YMAADMPgk08+oW7dugAcP36ce++9F7PZzLx58yoeeRVQciMipWQfh39dCvnpMPht6HyfpyNyq5M5BSzcksKirUf5bXcqmXlFJbbXC/Kjc9NwujQNp3OTcNpFhxBk1XO4xLPcmtwEBQWxcuVKOnToUKJ848aN9O7dm6ysLNcjrkJKbkSkTMvfhh//5pi9eMw6sNbxdESV6lhmPj9uSeb7zcms2H2cIvvpr/4Qfx96N4/g8hYR9IqPILZeoMbASLXj1jE3VquVzMzMUuVZWVl6BIKI1FzdR8Ha9yFtt+PJ4QNe93REF63QZmfJtqN8vvYQS7YfxXZGQtM6qg792kVxdesGdGgUqstL4lVcTm4GDRrEqFGjeO+99+jevTsAq1at4qGHHmLw4MGVHqCISJXw8YOB/4SPboLV06H9bdDEczOsXowDx3P4ZPV+vkpM4ljm6cHAlzQOpX/7hlzfPoq4iKDzHEGkZnP5stTJkycZNmwY3377Lb6+voBjEr/BgwczY8YMQkND3RJoZdFlKRE5r7mjYcPHENEKHloGPlZPR1Ruvx86yX9+2cOCTUco7qSJCPbjls6Nub1rY5o38K5LbVK7uO2ylGEYZGRkMGvWLJKSkpy3grdp04bmzZtXPGIRkeriuhdh5w+Quh2WvQFXT7jwPh5kGAZLdxzjP0v3sGLPcWf5FS0iuPeyplzTuoFuyZZax6WeG7vdjr+/P3/88QctWrRwZ1xuo54bEbmgzV/BnBFg9nX03jRo4+mIyrT+wAkmzd/G6n2OR934mE0M7hjNg1c2o01Dfb+Jd3Fbz43ZbKZFixYcP368xiY3IiIX1O5m2PQFbJ8P34yB+3+oVnPf7E3N5vUftjF/UzLgeI7PvZc15YHL44gOC/BwdCKe53Jf5SuvvMLjjz/O5s2b3RGPiIjnmUww4B/gVwcOrXEMMK4GsvOLePG7LVz7xlLmb0rGZIIhXRrz8+NX8eygtkpsRE65qKeC+/n5ERBQ8h9TdXwS+Jl0WUpEym3Nfx2zF/v4w6ifPXp5aumOYzz91SaSTuYCcHWr+jzZvzWto/Q9JrWDngouIlIZutwP2xfArp/gixHw4GLwC6zSEE5kF/Did1v4an0SAI3CAnjp5vZc1apBlcYhUpPoqeAiIueTdQym9YasFOgyHG6YUmWnXrL9KI99vpHj2QWYTDC8VyyPXddKj0KQWqlKngr+9ddfO28Fb9u2LTfeeCM+PvoHJyJeJrg+3PIufHgTrJsBcX2g/S1uPWWRzc4bC3fw7593A9AyMphXbr2Ezk3C3XpeEW/hcs/NH3/8weDBg0lOTnY+FXzHjh3Ur1+fb7/9lvbt27sl0MqinhsRqZBFL8Kyf4A1xHF7eHisW06TkpHHmM/Ws3qvY/zifZc15W8D2+DvW33u1hLxBFd+frt8t9TIkSNp164dhw4dIjExkcTERA4ePMgll1zCqFGjKhy0iEi1dtUEiLkM8jNgzv1QVFDpp1i+K5WB/1rG6r1pBPlZeOuuS3nxpvZKbERc5HLPTUBAAGvXrqVdu3Ylyjdv3ky3bt3Izc2t1AArm3puRKTCTh50jL/JS4fOwxzjbyrp6dmfrz3IhK82YbMbtI6qw7/v6Uyz+sGVcmwRb+DWnpuWLVuSkpJSqvzo0aN6BIOIeLewGLhlOpjMkDgTVrx90Yc0DIMpP+3kiTm/Y7Mb3NQpmrmjeyuxEbkILic3kyZNYuzYscyZM4dDhw5x6NAh5syZw7hx43j11VfJyMhwLiIiXqdlP7juJcf6j8/CtnkVPlSRzc7TX2/izZ92APDnq+J5845OugwlcpFcvixlNp/Oh0ynumOLD3Hme5PJhM1mq6w4K40uS4nIRTMMmDce1r4PvoEwYgFEd3LpEDkFRfzl0/Us3nYUswmev7E9913W1D3xingBt94KvmTJkgoHJiLiFUwm6P8anNgHuxfDZ3c6JvgLiS7X7rkFNu6fsYaVe9Lw9zXzrzsv5bp2Ue6NWaQW0SR+IiIVlZcO710Hx7ZBZHsY9i0E1j3/LoU2HvxwLct2phJs9WHm/d3p0lTz14hciFsHFIuIyCn+oXD3bAhqACmb4cMbIefcz9crKLLz508SWbYzlUA/CzNGdFNiI+IGSm5ERC5GeOypHpsISP4dProZck+UqlZoszPms0QWbzuK1cfMe8O60TX2/L08IlIxSm5ERC5Wg9anEpx6cGQDfHQL5J50brbbDcZ/vpEf/kjBz2Jm+tCu9Iyv57FwRbydkhsRkcoQ2daR4ATUhcOJ8PHpBOcfP27n242H8bWYmHZfZ65sWd+zsYp4OSU3IiKVJbIdDPsGAsIhaR28fz3zl612PgDz1Vsv4ZrWkR4OUsT7uZzcpKSkcN999xEdHY2Pjw8Wi6XEIiJSq0V1cPTgBEfBsa10++k2LjHtZvTV8dzSubGnoxOpFVye52b48OEcOHCAZ599loYNGzon7hMRkVOiOpB023dkz7iFlqYDzPH/P3xi4oDWno5MpFZweZ6bOnXqsGzZMjp16uSmkNxL89yIiLtl5BVyy7+Xk3z0KDPrvEOXwnWACa59AXqNqbSHbYrUJm6d5yYmJoZaNu+fiEi5GYbBXz/fyK6jWQSH1KXx6G+gywjAgIXPwqy7zzsXjohcPJeTm8mTJ/PUU0+xb98+N4QjIlKzzVy+j4VbHLd8vzu0C5FhwTDoTcfjGix+sH0+vNMb9i7zdKgiXsvly1Lh4eHk5ORQVFREYGAgvr6+JbanpVXv30h0WUpE3GVzUjq3/Hs5BTY7E29oy4jecSUrHNkIc+6H47sAE1z5OPR5EiwuD38UqXXc+uDMyZMnVzQuERGvlZVfxJjP1lNgs5PQJpLhvWJLV2rYEUYthQVPwIZP4JfXYMcCGDQZGnet6pBFvJYenCkiUgnGz97AV+uTaBjqz/yxVxAe5Hf+HX7/Aub/1fHwTUzQ9X7o+xwEhFVFuCI1jlt7bgBsNhtz585l69atALRr147BgwdrnhsRqZW+XHeIr9YnYTbBv+669MKJDcAlQ6DZVfDjM/D7LFj7Hmz9Bq77P+hwO5g1x6pIRbncc7Nr1y4GDBhAUlISrVq1AmD79u3ExMQwb9484uPj3RJoZVHPjYhUpgPHc7h+yi/kFNj467UtGdO3hesH2fsLzPsrpO5wvG/QFq7+G7QeqNvGRU5x663gY8eOJT4+noMHD5KYmEhiYiIHDhwgLi6OsWPHVjhoEZGaxjAMnvrqd3IKbPSIq8ufr25esQPFXQkP/QZ9J4I1FI5ugdn3wPSrYddPULtGD4hcNJd7boKCgli5ciUdOnQoUb5x40Z69+5NVlZWpQZY2dRzIyKVZdbqAzz11Sb8fc38MO5KmtYLuviD5qTBirdh5TQozHaUNewElz0M7W4Bn3Jc8hLxQm7tubFarWRmZpYqz8rKws9P/+hEpHZITs/jpXmOcYePXdeqchIbgMC6joHFj2yEy0aDxQpHNsDXf4LJ7eHnVyDraOWcS8RLuZzcDBo0iFGjRrFq1SoMw8AwDFauXMlDDz3E4MGD3RGjiEi1YhgGz8zdRGZ+ER1jwkrPZ1MZguvD9S/D+C1wzTNQpyFkpcDPk+CNNvDZXfDHXCjMq/xzi9RwLl+WOnnyJMOGDePbb791TuBXVFTE4MGDmTFjBqGhoW4JtLLospSIXKxvNh5m7Gfr8bWYmDf2ClpG1nH/SYsKHHdTrXwHktaeLvcPhbY3QftboEkvXbYSr+XKz+8Kz3Ozc+dOtm3bBkCbNm1o3ryCA+mqmJIbEbkYadkFJLyxlLTsAh5NaMkjCRW4O+piHd0KG2fBpi8gI+l0uTUEmveFlv2hxbWOS1wiXqJKkpuaSsmNiFyM8Z9v4KvEJFpH1eGbv1yOn48H56Ox22H/r/D757Dje8g+dnqbyQxRl0Ds5Y67sZr0BH9950nNVemT+I0fP54XX3yRoKAgxo8ff966b7zxRvkjFRGpQdbtP8FXiUmYTPDKrZd4NrEBx0R/cVc6FrsdktY5HuewfYHjdvIjGxzLircdyU5ke2jUBRp1drzWbw1mTb4q3qdcyc369espLCx0rouI1DZ2u8EL3/4BwJAujekUE+bZgM5mNkNMN8fS9znIOAz7foV9yxyvaXsg+XfHsu4Dxz6+gY4EJ7ItNGgHDdo43teJ0uSBUqPpspSISDl8vvYgT8z5nTpWHxY/dhX161g9HZJr0pMcA5GT1kFSIhxeDwXnmJfMNwjqNoN6zaBuPIQ3hdDGENrE8eoXWLWxi+DmZ0vdf//9TJkyhTp1St4dkJ2dzZgxY3j//fddPaSISLWWmVfIa99vB2Bs3xY1L7EBCG3kWNre6Hhvt8Hx3Y7LV0e3QMofjtcT+xyTB6ZscixlCawHwVGOHp46DaFOJATVh8AICKp3ar0eBISDb0CVNVGkmMs9NxaLhSNHjtCgQYMS5ampqURFRVFUVFSpAVY29dyIiKtenr+Vd3/ZQ7P6QXz/yJWeH2vjTkUFcHK/I/E5vstxOSv9IJw86Hg9V2/PuVisjiQnIMxx27o1xDGw2VrHse4XDH5Bp5ZgR6+Qb4DjkplvAPgEgK8/+JyxWHx12awWckvPTUZGhnPSvszMTPz9/Z3bbDYb8+fPL5XwiIjUdHuOZfHBb3sBeHZQW+9ObMAxT05EC8dyNsOAvJOO8TyZRyAzxfGaleK4Uys7FXKOO9Zz0sCwgS0fspIdS6UxgcUPfKxnvPqC2dfx3uJ7+r3Zcmrd5/R7s8+pxQImy6myM9ZNFkfy5Fw3n17Mp7adWUbxe1MZ66aS6+V5hQusn/lRFL8/e3sZyd8565712Z5zv/M5q05AGDTtVY793KPcyU1YWBgmkwmTyUTLli1LbTeZTDz//POVGpyIiKe9+N0WCm0G17RuwNWtavkvcCbTqV6YcIhsd/66hgH5mZB74vSSnwn5GY7XvAzHekH2GUsWFOaeWrJPveZAUT4UnTkTs+FImmz5bm2uXITG3WHkQo+dvtzJzZIlSzAMg2uuuYYvv/ySunVPTw7l5+dH06ZNiY6OdkuQIiKe8MuOYyzZfgxfi4lnB7X1dDg1i8nkuPzkH+IYkHyxDONUkpPruHRmO7UUnUpybEWny+zF64Wn1gvBXugYZ2QvAsPueLUXOcoM26ltp9YN+6n1M16dy5nvOb2OcWrdOFXHOFV2qry4DcVljoKzyoyS9c637nxPGe/LqnOuuiUKy/7cL1SnLA1al6+em5Q7uenTpw8Ae/fuJSYmBrO58rpmp06dyuuvv05ycjIdO3bkrbfeonv37hfcb9asWdx1113ceOONzJ07t9LiERExDIPXf3AMIr7vsljiIirpwZhSMSaTY+yNr/+F60qt5/LdUk2bOjLwnJwcDhw4QEFBQYntl1xyiUvHmz17NuPHj2fatGn06NGDyZMn069fP7Zv337eMTz79u3jscce44orrnC1CSIiF7RgczKbktIJ8rMw+up4T4cjIi5wufvl2LFjDBo0iDp16tCuXTsuvfTSEour3njjDR588EFGjBhB27ZtmTZtGoGBgee9pdxms3HPPffw/PPP06xZM5fPKSJyPkU2O//40dFrM/KKZtQLroG3fovUYi4nN+PGjePkyZOsWrWKgIAAvv/+e2bOnEmLFi345ptvXDpWQUEB69atIyEh4XRAZjMJCQmsWLHinPu98MILNGjQgAceeMDV8EVELujLxEPsOZZNeKAvI6+I83Q4IuIily9LLV68mP/973907doVs9lM06ZNufbaawkJCWHSpEkMHDiw3MdKTU3FZrMRGRlZojwyMtL5xPGz/frrr7z33nts2LChXOfIz88nP//0iPqMjIxyxycitU9eoY3JP+0EYPTVzanj7+vhiETEVS733GRnZzvHwoSHh3PsmOMptB06dCAxMbFyoztLZmYm9913H9OnTyciIqJc+0yaNInQ0FDnEhMT49YYRaRm+3jlfo6k59Ew1J97L6uEu3xEpMq53HPTqlUrtm/fTmxsLB07duQ///kPsbGxTJs2jYYNG7p0rIiICCwWCykpKSXKU1JSiIqKKlV/9+7d7Nu3jxtuuMFZZrc7brHz8fFh+/btxMeXHPg3YcKEEk8yz8jIUIIjImXKyi/i3z/vBuCRvi3w99UTs0VqIpeTm0ceeYQjR44AMHHiRK6//no++eQT/Pz8mDFjhkvH8vPzo0uXLixatIibbroJcCQrixYt4i9/+Uup+q1bt2bTppLPOnnmmWfIzMxkypQpZSYtVqsVq1WDAUXkwv67bA9p2QU0iwjiti6NPR2OiFSQy8nNvffe61zv0qUL+/fvZ9u2bTRp0qTcl4rONH78eIYNG0bXrl3p3r07kydPJjs7mxEjRgAwdOhQGjVqxKRJk/D396d9+/Yl9g8LCwMoVS4i4or03ELeW+Z4zML461riY/HyxyyIeDGXk5uzBQYG0rlz5wrvf8cdd3Ds2DGee+45kpOT6dSpE99//71zkPGBAwcqdcJAEZGyfLh8H5n5RbSMDGZAe9cusYtI9VKup4KfOWblQt54442LCsjd9FRwETlbdn4RvV9dzMmcQqbc2YkbOzXydEgicpZKfyr4+vXry3Vikx5BLyI10Mcr93Myp5C4iCAGXaJn5InUdOVKbpYsWeLuOEREPCKv0Mb0ZXsA+PNV8VjM+iVNpKbTYBYRqdU+W32A1KwCGocHcNOluhwl4g1cHlB89dVXn/fy0+LFiy8qIBGRqpJfZOM/Sx29Ng9fFY+v7pAS8QouJzedOnUq8b6wsJANGzawefNmhg0bVllxiYi43Zx1h0jOyCMqxF/z2oh4EZeTmzfffLPM8r///e9kZWVddEAiIlWh0GbnnVOzEf+pTzOsPpqNWMRbVFof7L333sv7779fWYcTEXGrbzYc5tCJXCKC/bizWxNPhyMilajSkpsVK1bg7+9fWYcTEXEbwzCcd0jdf3kcAX7qtRHxJi5flrrllltKvDcMgyNHjrB27VqeffbZSgtMRMRdlu44xrbkTIL8LNzTQ0/+FvE2Lic3oaGhJd6bzWZatWrFCy+8wHXXXVdpgYmIuEtxr82d3ZsQGuDr4WhEpLK5nNx88MEH7ohDRKRKbE5K57ddx7GYTYzoHevpcETEDSr84My1a9eydetWANq2bUuXLl0qLSgREXd59xdHr82gSxrSODzQw9GIiDu4nNwcOnSIu+66i99++42wsDAATp48Sa9evZg1axaNG2uuCBGpng6dyGHepiMAjLqymYejERF3cfluqZEjR1JYWMjWrVtJS0sjLS2NrVu3YrfbGTlypDtiFBGpFO//ug+b3eDy5hG0iw698A4iUiO53HOzdOlSli9fTqtWrZxlrVq14q233uKKK66o1OBERCpLek4hs9YcAOBB9dqIeDWXe25iYmIoLCwsVW6z2YiOjq6UoEREKtvHq/aTU2CjdVQdrmwR4elwRMSNXE5uXn/9dcaMGcPatWudZWvXruWRRx7hH//4R6UGJyJSGQqK7Mxcvg9wjLU538N/RaTmMxmGYbiyQ3h4ODk5ORQVFeHj47iqVbweFBRUom5aWlrlRVpJMjIyCA0NJT09nZCQEE+HIyJV4Ov1h3h09kYiQ6wse+Ia/Hz09G+RmsaVn98uj7mZPHlyReMSEalyhmHw3q97ARjaM1aJjUgt4HJyM2zYMHfEISLiFmv3n2BzUgZWHzN3ddcDMkVqgwpN4mez2Zg7d65zEr927doxePBgLBY9fE5Eqpf3T/Xa3HxpI+oG+Xk4GhGpCi4nN7t27WLAgAEkJSU5bwefNGkSMTExzJs3j/j4+EoPUkSkIg6dyOGHP5IBGNE7zsPRiEhVcfni89ixY4mPj+fgwYMkJiaSmJjIgQMHiIuLY+zYse6IUUSkQj5csR+7AZc3j6BVVB1PhyMiVaRCk/itXLmSunXrOsvq1avHK6+8Qu/evSs1OBGRisrOL+Kz1Y5J++6/PNazwYhIlXK558ZqtZKZmVmqPCsrCz8/Xc8Wkerhy8RDZOYVERcRxFUtG3g6HBGpQi4nN4MGDWLUqFGsWrUKwzAwDIOVK1fy0EMPMXjwYHfEKCLiErvd4IPf9gEwvFcsZrMm7ROpTVxObv71r38RHx9Pz5498ff3x9/fn969e9O8eXOmTJnijhhFRFzy846j7E3Npo6/D7d1aezpcESkirk85iYsLIz//e9/7Nq1y3kreJs2bWjevHmlByciUhHFvTZ3dI0hyFqhGS9EpAYr9796u93O66+/zjfffENBQQF9+/Zl4sSJBAQEuDM+ERGX7DqaxbKdqZhMjhmJRaT2KfdlqZdeeomnn36a4OBgGjVqxJQpUxg9erQ7YxMRcdmHK/YB0Ld1JE3qBXo2GBHxiHInNx9++CH//ve/+eGHH5g7dy7ffvstn3zyCXa73Z3xiYiUW2ZeIV+uOwQ4BhKLSO1U7uTmwIEDDBgwwPk+ISEBk8nE4cOH3RKYiIir5qw7RHaBjeYNgundvJ6nwxERDyl3clNUVIS/v3+JMl9fXwoLCys9KBERV9ntBjOX7wNgWK9YTCbd/i1SW5V7QLFhGAwfPhyr1eosy8vL46GHHiIoKMhZ9tVXX1VuhCIi5bB05zH2Hc+hjr8Pt1zayNPhiIgHlTu5GTZsWKmye++9t1KDERGpqOJem9t1+7dIrVfub4APPvjAnXGIiFTYnmNZ/Lz92Knbv5t6OhwR8TCXZygWEaluPlyxH4BrWjWgab2gC9QWEW+n5EZEarSs/CLmnLr9e5hu/xYRlNyISA335bpDZOUX0ax+EJc3j/B0OCJSDSi5EZEay243mHlqRmI9/VtEiim5EZEaa9muVPYcyybY6sMtnfX0bxFxUHIjIjXWjN/2AjCka2OCdfu3iJyi5EZEaqS9qdks2X4M0NO/RaQkJTciUiMVP/376lb1iYvQ7d8icpqSGxGpcbLyi/hirW7/FpGyKbkRkRrnq8RTt39HBHFli/qeDkdEqhklNyJSo9jtBjNOPUdqaM+muv1bREpRciMiNcqvZ9z+fWsX3f4tIqUpuRGRGuWDU7d/39alMXX8fT0cjYhUR0puRKTG2HU0iyWnnv6tgcQici5KbkSkxpix3NFr07d1A93+LSLnpORGRGqEkzkFfLkuCYD7L4/zcDQiUp0puRGRGuGz1QfJLbTROqoOPZvV83Q4IlKNKbkRkWqv0GZ3zkj8wOVxmEy6/VtEzk3JjYhUews2J3MkPY+IYD9u6Bjt6XBEpJpTciMi1d77vzoGEt97WVP8fS0ejkZEqrtqkdxMnTqV2NhY/P396dGjB6tXrz5n3enTp3PFFVcQHh5OeHg4CQkJ560vIjXbuv0n2HDwJH4WM/de1tTT4YhIDeDx5Gb27NmMHz+eiRMnkpiYSMeOHenXrx9Hjx4ts/7PP//MXXfdxZIlS1ixYgUxMTFcd911JCUlVXHkIlIV3j81ad+NnaKJCLZ6OBoRqQlMhmEYngygR48edOvWjbfffhsAu91OTEwMY8aM4amnnrrg/jabjfDwcN5++22GDh16wfoZGRmEhoaSnp5OSEjIRccvIu5z6EQOfV7/GZvdYMEjV9Cmof7NitRWrvz89mjPTUFBAevWrSMhIcFZZjabSUhIYMWKFeU6Rk5ODoWFhdStW9ddYYqIh7z3615sdoPezespsRGRcvPx5MlTU1Ox2WxERkaWKI+MjGTbtm3lOsaTTz5JdHR0iQTpTPn5+eTn5zvfZ2RkVDxgEakyJ7ILmLX6IAAP9Yn3cDQiUpN4fMzNxXjllVeYNWsWX3/9Nf7+/mXWmTRpEqGhoc4lJiamiqMUkYr4aOV+cgtttIsO4fLmEZ4OR0RqEI8mNxEREVgsFlJSUkqUp6SkEBUVdd59//GPf/DKK6/w448/cskll5yz3oQJE0hPT3cuBw8erJTYRcR98gptzFi+D4A/9YnXpH0i4hKPJjd+fn506dKFRYsWOcvsdjuLFi2iZ8+e59zvtdde48UXX+T777+na9eu5z2H1WolJCSkxCIi1dsXaw+Sll1A4/AABrQ//y86IiJn8+iYG4Dx48czbNgwunbtSvfu3Zk8eTLZ2dmMGDECgKFDh9KoUSMmTZoEwKuvvspzzz3Hp59+SmxsLMnJyQAEBwcTHBzssXaISOUostmZvsxx+/eDVzTDx1Kjr56LiAd4PLm54447OHbsGM899xzJycl06tSJ77//3jnI+MCBA5jNp7/c3nnnHQoKCrjttttKHGfixIn8/e9/r8rQRcQNFmxO5kBaDuGBvtzeVWPkRMR1Hp/npqppnhuR6sswDG54+1c2J2UwLqEF4xJaejokEakmasw8NyIiZ1q++zibkzLw9zUztGesp8MRkRpKyY2IVBv//nkXAHd2a0LdID8PRyMiNZWSGxGpFlbvTeO3XcfxMZsYeUWcp8MRkRpMyY2IVAtTFu0AYEjXGBqHB3o4GhGpyZTciIjHrdl3utdm9NV61IKIXBwlNyLicVN+2gmo10ZEKoeSGxHxqDX70vh1V6p6bUSk0ii5ERGPUq+NiFQ2JTci4jHqtRERd1ByIyIeo14bEXEHJTci4hGr9hxXr42IuIWSGxGpcna7wcvztwJwRzf12ohI5VJyIyJV7rtNR9h4KJ0gP4sejikilU7JjYhUqfwiG699vw2AP/WJp34dq4cjEhFvo+RGRKrURyv2c+hELpEhVj1DSkTcQsmNiFSZkzkF/GuR4w6pv17bikA/Hw9HJCLeSMmNiFSZtxfvIiOviNZRdbi1S2NPhyMiXkrJjYhUiQPHc5i5Yh8AT/VvjcVs8mxAIuK1lNyISJV49fttFNoMrmgRQZ+W9T0djoh4MSU3IuJ2S3ccY96mI5hNMKF/G0wm9dqIiPsouRERt8otsPHM3E0ADO8VR9voEA9HJCLeTsmNiLjVW4t3cjAtl4ah/oy/ThP2iYj7KbkREbfZnpzJu7/sAeD5we0IturWbxFxPyU3IuIWdrvB377eRJHd4Lq2kVzXLsrTIYlILaHkRkTcYvbag6zdf4IgPwt/H9zO0+GISC2i5EZEKt2xzHwmnXrq9/jrWhEdFuDhiESkNlFyIyKVyjAMHp+zkYy8Ito3CmFYz6aeDklEahklNyJSqT74bR8/bz+G1cfMP4d0wseirxkRqVr61hGRSvPH4XReWbANgGcGtqFVVB0PRyQitZGSGxGpFLkFNsZ+tp4Cm52ENpHce5kuR4mIZyi5EZFK8cJ3W9h9LJvIECuv3XaJHrEgIh6j5EZELtr3m4/w2eoDmEzwxu2dqBvk5+mQRKQWU3IjIhdl19FMHp/zOwB/ujKe3s0jPByRiNR2Sm5EpMKOZ+UzYsYaMvOK6BYbzvhr9ewoEfE8JTciUiH5RTb+9NE6Dqbl0qRuIP+5ryt+PvpKERHP0zeRiLjMMAye+nITa/efoI6/D+8P76ZxNiJSbSi5ERGXvbV4F1+vT8JiNvHOPV1o3iDY0yGJiDgpuRERl3yx9iBvLNwBwAs3tuPyFhpALCLVi4+nAxCRmuPzNQd58ivHnVEjL4/jnh6emaivyF5EVkEWGQUZZBZkklGQgWEYBPoGEuATQKBvIMG+wYRZwzTfjkgtpORGRMrls9UHmPDVJgCG9mzK3wa2qZLzHsw8yJbjW9h5Yie7Tu5i54mdHMw8iIFxwX0DfQJpGtKU2JBYYkNjiQ+L59IGl9IgsEEVRC4inqLkRkQu6OOV+3lm7mYAhveKZeINbd3WI5JRkMHqI6tZfng5yw8vJykr6Zx1A30CqeNXhxBrCGbM5BTlkFOYQ05RDrlFueQU5bA1bStb07aW2K9RcCM6N+jMpZGXclnDy4ipE+OWtoiIZyi5EZHzmvHbXv7+7RYAHrg8jmcGtqn0xCazIJOf9v/E/L3zWZO8Bpthc27zMfvQOrw1LcJbOJf40HjC/cPxMZ/7K6zQVsjBrIPsT9/P/oz97MvYx5bjW9h+YjtJWUkkZSXx7Z5vAYgPjefKmCvp07gPHet3PO9xRaT6MxmGceG+XS+SkZFBaGgo6enphISEeDockWqr0GbnpXlbmbF8HwCjrmzGhP6tKy2xKbQVsvTQUubtmccvh36hwF7g3BYbEkuv6F70iu5F16iuBPkGVco5AbIKsvj92O8kHk1kbcpaNhzdUCKZCrOG0bdJX/rF9qNbVDclOiLVhCs/v5XciEgpJ7ILGP1pIst3Hwdg/LUtGXNN80pJbA5mHOTLnV/y9a6vSctLc5bHh8YzoNkA+sf2Jyak6i4Tpeens/zwcpYeWsqyQ8vIKMhwbqvrX5drm17L9bHX0zmyM2aTbjAV8RQlN+eh5Ebk/LYlZ/Dgh2s5mJZLkJ+FN+7oRL92URd1zCJ7EUsPLmX29tmsOLLCWR4REMEN8TcwMG4gLcNbevzOpiJ7EWtT1vLDvh/4af9PnMw/6dzWMKghA5sNZGDcQJqHN/dckCK1lJKb81ByI1I2wzD4en0Sz8zdTE6BjZi6Afx3aDdaRdWp8DFP5J3gy51f8vn2zzmSfQQAEyZ6RfdiSMshXBlzJb5m38pqQqUqtBey5sgaFuxbwE/7fyKrMMu5rXXd1gxqNoj+cf1155VIFVFycx5KbkRKS8nI4+mvNrFo21EAejevx9t3dSa8go9U2HJ8C59t+4z5e+Y7x9KEW8O5pcUt3NbyNhrXaVxpsVeFvKI85/igZUnLKLIXAY5ErUfDHgxsNpCEJgkE+2mmZhF3UXJzHkpuRE4zDIM56w7x4ndbyMgrws9i5pGEFvzpymb4WFwbX1JoK+TH/T/y2bbP2Hhso7O8bb223N36bq6Pux6rxVrZTahyJ/NO8uP+H/luz3esP7reWW61WLmy8ZUMiBvAFY2v8Iq2ilQnSm7OQ8mNiMP25Exemr+VX3YcA6Bj41BeH9KRlpGuXYZKykriyx1f8tXOrzie5xiA7GP24bqm13FX67voWL+jx8fSuMuhzEPM3zufb3d/y76Mfc7yYN9grmlyDf1i+3FZw8vws+ihoiIXS8nNeSi5kdou6WQuby7cwZeJhzAM8LOYefTaljx4RVy5e2sK7YX8cvAXvtjxBcsPL3fOFtwgoAFDWg3htpa3ERFQe545ZRgG29K2sWDvAhbsW0BydrJzW7BvMFfFXEVC0wR6R/fG38ffg5GK1FxKbs5DyY3UVqlZ+Uz7eTcfrtxPQZEdgOvbRfH49a2Ir1++sSLb07bz7e5vmbd3Hqm5qc7yyxpexm0tb+OaJtdU2wHCVcVu2NlwdAPf7/ueRfsXcTT3qHNbgE8APRr2oE/jPvRp3If6gfU9GKlIzaLk5jyU3EhtszkpnQ9+28e3Gw9TYHMkNZc1q8uT17fm0ibhF9w/OTuZBXsX8O2eb9l5YqezvK5/XW5ufjO3tri1SuelqUnshp3fj/3Oj/t/5Kf9PznvGCvWrl47ekX3omd0TzrV74SvpXYnhiLno+TmPJTcSG2QW2Bj4dYUPly+j7X7TzjLO8aE8WhCC/q0rH/ecTAHMg6w6MAifjrwE78f+91Z7mv2pU/jPgyKH8SVja7UD2MXGIbB9hPbWXpwKUsPLWVT6qYS2wN8AugW1Y3LGl5Gl8gutApvhcVs8VC0ItWPkpvzUHIj3iq/yMYvO1L5duNhftqaQk6B45ECvhYTAzo0ZHiv2HP21BTaCtlwbAO/Jf3GsqRl7Dixo8T2zg06M7DZQPrF9iPUGur2ttQGqbmpLDu0jBVHVrDqyKoSszUDBPkG0al+J7pEdqFj/Y60rddWt5pLrabk5jyU3Ig3OXwyl193prJsVyo/bz9KZl6Rc1ujsABu7dKYe3s0oUFIyUGsRfYitqdtJ/FoIiuPrGRN8hpyi3Kd2y0mC92iupHQJIFrmlyjsSFuZjfs7DixgxWHV7AmeQ0bjm4gszCzRB0TJuJC42gf0Z529drRqm4rWoa3pI5fxSdZFKlJlNych5IbqakMw+BAWg4bDp4kcf8Jft2Vyu5j2SXqRIZYGdghmhs6NqRTTBgmkwnDMEjJSWFb2jY2p25mw9EN/J76e4lkBhxjaIofVnll4yvVQ+NBNruNnSd3si5lHeuPrmdz6maSspLKrBsdFE3Lui1pHtacuNA44kLiiA2NVdIjXkfJzXkouZGaIK/Qxp5j2ew8msmOlEz+OJzBxoMnOZFTWKKe2QSXNA7jihYRXNmyPs0jzezP3Mfe9L3sSd/D9rTtbEvbxon8E6XOUce3Dh0bdKRrZFd6N+pNy/CWejBkNXY89zh/HP+Dzamb2XJ8C9tPbC9xy/nZIgIiiKkTQ+PgxjSu41iig6KJCooiMjBS46Wkxqlxyc3UqVN5/fXXSU5OpmPHjrz11lt07979nPW/+OILnn32Wfbt20eLFi149dVXGTBgQLnOpeRGqgOb3eB4dj5HM/I5dCKXg2k5HDyRw4G0HA4cz2Hf8Wzspf5lGvj55hMfbaNpgyKi6uYQGJhBan4ySVlJHMo8VGrcRjGLyUJcaBxt67WlY/2OXNrgUuLD4pXM1HDp+ensOLGDHSd2sDd9r3M5lnvsvPuZMFEvoB5RgVFEBEZQP6A+EQERRAREUC+gHnX96xJmDaOuf13q+NXR3xOpFmpUcjN79myGDh3KtGnT6NGjB5MnT+aLL75g+/btNGhQ+oF0y5cv58orr2TSpEkMGjSITz/9lFdffZXExETat29/wfMpuZHKZBgG+UV2svKLyM4vIiO3iIy8QjJyC8nIK+RETiFp2QXO5XhWPimZeRzLysROPpjzMVnyMJlzHa+WXDDnYrLkYLXmEBSQj69fDoY5kxz7CQpPPafpfKKCopyXJlqEt6BN3TY0D2uuyeNqkcyCTA5kHOBg1kEOZR7iUOYhDmYe5Ej2EVKyU5zP+yoPi8lCiF8IIdaQ06++IQT7BTsWX8cS5BtEoG8ggT6Bzld/H38CfAIcr5YAfMw+XjtbtbhfjUpuevToQbdu3Xj77bcBsNvtxMTEMGbMGJ566qlS9e+44w6ys7P57rvvnGWXXXYZnTp1Ytq0aRc8n7uSm8z8XHakHq6045VH+f7kLlzp7OPYy9inrL8mxlnb7KdeS1Y1MAwwTs1h66yL3XkAe/F2w1HXbthPlxv2U9tPvRoGNsOO3XDUtxsGNsPAbtgd2+wGRXY79lN1bHY7NsPueLXbKbLbsdltFJ56tRl2Cm02Cu02iuw2Cm02iuxFFNqKKLTZKLAXUWQrotBuo8BW6Ci3Fzrq2B3rBkVgsmEyFYGpCMxFp9YLMZmLwFSAyVwI5kJMpgIwF2AyVfyfXZg1jIiACKKDo4kOinZcbgiOplFwI2JDYgn0DazwscX7GYZBWl4ayTnJpGSnkJqbSmpuKsdyj5Gak0paXhon8k9wIu9EiSehVwazyYzVYsVqseJn8XO8mv3ws/jha/E9vW72dS4+Zp+yF5MPFrMFi8mCj9kHs8mMxeR4X7xuNptLvDeZTJgxYzabHa8m8+myU+smTI51TI73p7YXJ2UltuEoK14/cx/ntrPqFCs+Xln1znx/6k2Zdc90dtJYZp2zy8qZZ5Z1rAud38/sV+k3Irjy89unUs/sooKCAtatW8eECROcZWazmYSEBFasWFHmPitWrGD8+PElyvr168fcuXPLrJ+fn09+fr7zfUZGxsUHXoYFO9bxYuLDbjm2eJj51FLGv5aLGbVgwuT8bTfEL8S51PGrQ5h/GOHWcML9wwm3hlM3oC4NAhsQERChBzLKRTGZHJek6gXUo129duetW2Ar4ETeCTIKMsgoyCA9P530/HQyCzLJLswmqzCLrMIsMgsyySnKIbcwl5yiHLILs8kpzCHPlkduUe4Zv7DYyS3KLTWYXbxPx/od+XjAxx47v0eTm9TUVGw2G5GRkSXKIyMj2bZtW5n7JCcnl1k/ObnsgXWTJk3i+eefr5yAz8OMCcN+MR9ndeuqLSvrL1+98tcxlbluMs78jcUEhqnUby6n9zn9uwynf3dyrjv+NzuW4t+8sJzx25cZs8nkKDObsZgcdU//hmjBYrbga/bBz+yDn48vfhZf/Mw+BPhaCfD1I9DXSqCvFT8f31K/kfr7+DsWy+nu+SDfIAJ9AgnwCVAXvVRrfhY/IoMiiQyKvHDlczAMgyJ7ETlFORTYCsiz5VFgKyDflk++LZ8CW4FjsTtei071iBbaCh2vp3pKi8uLjKJTva6OXlabYXO+txv2kutnvTp7eM98T3EvsKMeOHqSi7cXt8GOY19nL/MZr8V1nP8V92IXd08bp9fL3H7GZ3V2+ZnHL2uf4uOXfFtWT3vZ57rQfhXl6V/CPJrcVIUJEyaU6OnJyMggJqbyp4q/rUNvbuuwvtKPKyJSk5lMJnwtvoRaNLWAVB2PJjcRERFYLBZSUlJKlKekpBAVFVXmPlFRUS7Vt1qtWK3qxhcREaktPHp/n5+fH126dGHRokXOMrvdzqJFi+jZs2eZ+/Ts2bNEfYCFCxees76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", "text/plain": [ "
        " ] @@ -630,13 +641,13 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 81, "id": "efddd3a5", "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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", "text/plain": [ "
        " ] @@ -665,7 +676,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 82, "id": "7a7a568f", "metadata": {}, "outputs": [ @@ -673,7 +684,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1.11 ms ± 45.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" + "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], @@ -684,7 +695,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 83, "id": "91b7f9d4", "metadata": {}, "outputs": [ @@ -692,7 +703,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1.2 ms ± 89 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" + "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], @@ -703,7 +714,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 84, "id": "3403884c", "metadata": {}, "outputs": [ @@ -711,8 +722,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "The slowest run took 4.46 times longer than the fastest. This could mean that an intermediate result is being cached.\n", - "2.2 ms ± 1.28 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" + "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], @@ -741,7 +751,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 85, "id": "87173626", "metadata": {}, "outputs": [], @@ -857,7 +867,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15" + "version": "3.11.0" }, "vscode": { "interpreter": { diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/stochastic.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/stochastic.ipynb index b6423673..336fc548 100644 --- a/docs/pygom-doc/_build/jupyter_execute/notebooks/stochastic.ipynb +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/stochastic.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "908538f3", + "id": "7ba7b302", "metadata": {}, "source": [ "# Stochastic representation of ODEs\n", @@ -15,12 +15,32 @@ "seen in {doc}`sir`." ] }, + { + "cell_type": "markdown", + "id": "d945f972", + "metadata": {}, + "source": [ + "#TODO add comment about using a density or frequency formulation (use of population size) - currently unexplained" + ] + }, { "cell_type": "code", "execution_count": 1, "id": "3f44792d", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pygom'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpygom\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m SimulateOde, Transition, TransitionType\n\u001b[0;32m 3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pygom'" + ] + } + ], "source": [ "from pygom import SimulateOde, Transition, TransitionType\n", "\n", @@ -78,7 +98,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 27, "id": "a3e9bc81", "metadata": {}, "outputs": [], @@ -113,17 +133,17 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 28, "id": "8849566b", "metadata": { "tags": [ - "hide-cell" + "hide-input" ] }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoYAAAHrCAYAAABSCFxgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9eZwcdZ3//6yqrj7nzsxkcl9ADo4EcgmIgAYiuLj4VZYVFclX8AsLrprvuisux+qquMshLuJGWRB31Z98QVR2YaOYJXITSIgCCSEh5M7cd191/v6oqu6e6Xsy93yePtqZ6Tr602Fq6tWv9yXZtm0jEAgEAoFAIJjyyGO9AIFAIBAIBALB+EAIQ4FAIBAIBAIBIIShQCAQCAQCgcBFCEOBQCAQCAQCASCEoUAgEAgEAoHARQhDgUAgEAgEAgEghKFAIBAIBAKBwEUIQ4FAIBAIBAIBIIShQCAQCAQCgcBFCEOBQCAQCAQCASCE4ZTgjTfe4BOf+ATz5s0jGAwya9YsLrroIu67776xXppAMGl5+OGHkSSJ1157bayXIhBMKLxrx3v4fD5mzZrFNddcw9GjR8d6eZMe31gvQDCyvPjii1x44YXMnTuX6667jqamJg4fPszLL7/M9773Pb7whS+M9RIFAoFAIMjiG9/4BgsWLCCRSPDyyy/z8MMP8/zzz/Pmm28SDAbHenmTFiEMJznf+ta3qK6u5tVXX6WmpmbAttbW1rFZlEAgEAgERbjkkktYtWoVANdeey319fX80z/9E0888QR/8Rd/Mcarm7yIUPIk59133+XUU0/NEoUAjY2No78ggUAgEAiGwHnnnQc49zXByCGE4SRn3rx5bN++nTfffHOslyIQCAQCwZA5cOAAALW1tWO7kEmOEIaTnL/5m78hFouxYsUKzjnnHP7u7/6O3/3ud+i6PtZLEwgEAoEgLz09PbS3t3PkyBF++ctf8vWvf51AIMCf/dmfjfXSJjVCGE5yLrroIl566SU++tGP8sc//pF//ud/Zv369cyaNYsnnnhirJcnEAgEAkFO1q1bR0NDA3PmzOETn/gEkUiEJ554gtmzZ4/10iY1QhhOAVavXs3jjz9OV1cX27Zt4+abb6avr49PfOIT7Nq1a6yXJxAIBAJBFvfffz9PP/00jz32GJdeeint7e0EAoGxXtakRwjDKYTf72f16tV8+9vf5l//9V/RdZ1HH310rJclEAgEAkEWa9asYd26dXz84x/niSee4LTTTuOqq66iv79/rJc2qRHCcIritQA4fvz4GK9EIBAIBILCKIrCHXfcwbFjx/j+978/1suZ1AhhOMl55plnsG076/mnnnoKgMWLF4/2kgQCgUAgKJsLLriANWvWcO+995JIJMZ6OZMW0eB6kvOFL3yBWCzGxz72MZYsWYKmabz44os88sgjzJ8/nw0bNoz1EgUCgUAgKImvfOUrXHHFFTz88MNcf/31Y72cSYlwDCc5d911FxdeeCFPPfUUGzduZOPGjWzbto2/+qu/4pVXXsnZ+FogEAgEgvHI//pf/4tFixZx1113YZrmWC9nUiLZueKMAoFAIBAIBIIph3AMBQKBQCAQCASAEIYCgUAgEAgEAhchDAUCgUAgEAgEgBCGAoFAIBAIBAIXIQwFAoFAIBAIBIAQhgKBQCAQCAQClwnR4NqyLI4dO0ZlZSWSJI31cgQCbNumr6+PmTNnIsuT5/OVuNYE442JeK2J60gw3ijnOpoQwvDYsWPMmTNnrJchEGRx+PBhZs+ePdbLGDbEtSYYr0yka01cR4LxSinX0YQQhpWVlYDzhqqqqsZ4NQIB9Pb2MmfOnNTv5mRBXGuC8cZEvNbEdSQYb5RzHU0IYehZ8VVVVeIiE4wrJluYSFxrgvHKRLrWxHUkGK+Uch1NjIQNgUAgEAiGyP3338/8+fMJBoOsXbuWbdu2Fdz/3nvvZfHixYRCIebMmcOXv/xlEonEKK1WIBhbhDAUCAQCwaTlkUceYePGjdx+++3s2LGD5cuXs379elpbW3Pu//Of/5yvfvWr3H777ezevZsHH3yQRx55hK997WujvHKBYGwQwlAgEAgEk5Z77rmH6667jg0bNrBs2TI2bdpEOBzmoYceyrn/iy++yLnnnstVV13F/Pnzufjii/nkJz9Z1GUUCCYLQhgKBAKBYFKiaRrbt29n3bp1qedkWWbdunW89NJLOY8555xz2L59e0oI7t+/n6eeeopLL7007+skk0l6e3sHPASCicqEKD4RCAQCgaBc2tvbMU2T6dOnD3h++vTpvP322zmPueqqq2hvb+f9738/tm1jGAbXX399wVDyHXfcwde//vVhXbtAMFYIx1AgEAgEApetW7fy7W9/mx/84Afs2LGDxx9/nCeffJJ//Md/zHvMzTffTE9PT+px+PDhUVyxQDC8CMdQIBAIBJOS+vp6FEWhpaVlwPMtLS00NTXlPObWW2/lM5/5DNdeey0Ap59+OtFolM9//vP8/d//fc6pEYFAgEAgMPxvQCAYA4RjKBAIBIJJid/vZ+XKlWzZsiX1nGVZbNmyhbPPPjvnMbFYLEv8KYoCOGPFBILJjnAMBQKBQDBp2bhxI5/97GdZtWoVa9as4d577yUajbJhwwYArr76ambNmsUdd9wBwGWXXcY999zDmWeeydq1a9m3bx+33norl112WUogCgSTGSEMBQKBQDBpufLKK2lra+O2226jubmZFStWsHnz5lRByqFDhwY4hLfccguSJHHLLbdw9OhRGhoauOyyy/jWt741Vm9BIBhVJHsCeOO9vb1UV1fT09MjxgsJxgWT9Xdysr4vwcRlIv5OTsQ1CyY35fxOihxDgUAgEAgEAgEwBGH47LPPctlllzFz5kwkSeLXv/510WO2bt3KWWedRSAQ4KSTTuLhhx8ewlIFAoFAIBAIBCNJ2cIwGo2yfPly7r///pL2f++99/jIRz7ChRdeyM6dO/nSl77Etddey29/+9uyFysQCAQCgUAgGDnKLj655JJLuOSSS0ref9OmTSxYsIC7774bgKVLl/L888/z3e9+l/Xr15f78lkcPrgf09CynpeQAJB9CrIsI0ng8/nw+XxIkoSqBJBkGUWSkBQFKbPaTJLSX93vJUnCPWVZSGUeVOr+klT6eUs5ZznnEwwP999/P3feeSfNzc0sX76c++67jzVr1uTc96233uK2225j+/btHDx4kO9+97t86Utfynvu73znO9x888188Ytf5N577x2ZNzABsG1b/G4LBIIUtm1j22Bn/pz6ftC+jPsSjCwkJPy+E8sSHPGq5JdeemnAnEqA9evXF7ypJZNJkslk6udCcycv37uLo8rsE16nZFvIWEjYyJgoOD/7bAOfbeKzTVTLwG+YBDWLUMIk3GdS1WFS19PH9M5W5jQforH9EKFEC7IVx5LBksCSwXS/N2UwFTBkMBTnoSsSug80FTQfJH2Q8EPCLxH3QzQIsSD0hST6QtAThmgI7HF4wysmQgvdpIsem2973qeHdr7MNf7s0p+xuG5xwfMMhUceeYSNGzeyadMm1q5dy7333sv69evZs2cPjY2NWfvHYjEWLlzIFVdc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\n", + "image/png": "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", "text/plain": [ "
        " ] @@ -165,13 +185,17 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 29, "id": "4e6f4164", - "metadata": {}, + "metadata": { + "tags": [ + "hide-input" + ] + }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAosAAAHrCAYAAACn9tfQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACG5klEQVR4nO3de3xU9Zk/8M+ZSWYm9wu5DIFAQNCgIGAQiFKtmm6otUpFKqxblKX4W2usNV2ruIpWu6W1SvFCl9XWWrdSLa2lVi0tjaJVwh1UroKgXMLkSjK5zSUz5/fHzDmTSCaZy7nM5fN+vea16+TMzBmak3nmeb7P8xVEURRBRERERDQIg94nQERERESxi8EiEREREQXFYJGIiIiIgmKwSERERERBMVgkIiIioqAYLBIRERFRUAwWiYiIiCgoBotEREREFBSDRSIiIiIKisEiEREREQXFYJGC+vjjj3HTTTdh7NixsFgsGDVqFL7yla/gmWee0fvUiOLeiy++CEEQsHPnTr1PhShuSdeRdEtJScGoUaNw22234fTp03qfXsJI0fsEKDZt2bIFV111FcaMGYNly5bBarXi5MmT2Lp1K5566incddddep8iERERAODRRx/FuHHj4HA4sHXrVrz44ot4//33sW/fPlgsFr1PL+4xWKRB/fd//zdycnKwY8cO5ObmDvhZU1OTPidFREQ0iK9+9auYMWMGAODb3/42CgoK8NOf/hSvv/46vvnNb+p8dvGPZWga1KeffoqLLrronEARAIqKirQ/ISIiohB96UtfAuD7LKPoMVikQY0dOxa7du3Cvn379D4VIiKisHz22WcAgLy8PH1PJEEwWKRB/ed//id6enowbdo0XHbZZbjvvvvw97//HW63W+9TIyIiGqCjowMtLS04deoU/vjHP+KHP/whzGYzrrvuOr1PLSEwWKRBfeUrX0F9fT2uv/56fPjhh3j88cdRXV2NUaNG4fXXX9f79IiIiGRVVVUoLCxEaWkpbrrpJmRkZOD111/H6NGj9T61hMBgkYK69NJL8dprr+Hs2bPYvn07li9fjs7OTtx00004cOCA3qdHREQEAFizZg02bdqEP/zhD7j22mvR0tICs9ms92klDAaLNCyTyYRLL70UP/7xj/E///M/cLvdWL9+vd6nRUREBACYOXMmqqqqMH/+fLz++uuYPHky/vVf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", "text/plain": [ "
        " ] @@ -181,10 +205,11 @@ } ], "source": [ - "f, axarr = plt.subplots(1,3)\n", + "f, axarr = plt.subplots(1,3, layout='constrained')\n", "\n", "for i in range(3): \n", " axarr[i].plot(t, Ymean[:,i] - solutionReference[:,i])\n", + " axarr[i].set_title(stateList[i])\n", "\n", "plt.show()\n", "\n" @@ -192,13 +217,17 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 30, "id": "ee4d496d", - "metadata": {}, + "metadata": { + "tags": [ + "hide-input" + ] + }, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAosAAAHrCAYAAACn9tfQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABue0lEQVR4nO3deXhU1cHH8e/MZN/3DRLCvhM2wYC7KKBiXapWrVDaal3oIvWtWhWsvhVt1dpaW6rW9dVq1UpVFBcUFQwgq+xrICzZQ/Z95r5/3CQYSSCTmSQzmd/neea5NzP3njlXcuTHOfecazEMw0BEREREpA3Wnq6AiIiIiHguhUURERERaZfCooiIiIi0S2FRRERERNqlsCgiIiIi7VJYFBEREZF2KSyKiIiISLv8eroCHeFwODh69Cjh4eFYLJaero5IlzAMg4qKClJSUrBaO//vOLUX8RXuaDNqL+IrXGkvXhEWjx49Smpqak9XQ6RbHDp0iL59+3b6fLUX8TWutBm1F/E1nWkvXhEWw8PDAfMCIyIierg2Il2jvLyc1NTUlt/3zlJ7EV/hjjaj9iK+wpX24hVhsXloICIiQo1Zej1Xh8LUXsTXuNJm1F7E13SmvWiCi4iIiIi0S2FRRERERNqlsCgiIiIi7fKKexZFRES8hd1up6GhoaerIT7G398fm83WJWUrLIqIiLiBYRjk5eVRWlra01URHxUVFUVSUpLb1wxVWBQREXGD5qCYkJBASEiIFvmWbmMYBtXV1RQUFACQnJzs1vIVFkVERFxkt9tbgmJsbGxPV0d8UHBwMAAFBQUkJCS4dUhaE1xERERc1HyPYkhISA/XRHxZ8++fu++ZVVgUERFxEw09S0/qqt8/hUURERERaZfCooiIiHiUH/3oR1x22WU9XQ1porAoIiIiIu1SWBQRERFxg/r6+p6uQpdQWBQREfFRb775JqNHjyY4OJjY2FimTZtGVVUVAF9//TUXXHABcXFxREZGcvbZZ7Nhw4ZW51ssFv7xj39wySWXEBISwvDhw8nKymLv3r2cc845hIaGMmXKFPbt29dyzv3338/YsWP5xz/+QWpqKiEhIVx99dWUlZW1W0+Hw8GiRYvo378/wcHBZGRk8Oabb5702l5++WUmTpxIeHg4SUlJXHfddS3rEDocDvr27cvf//73Vuds3LgRq9XKwYMHASgtLeWnP/0p8fHxREREcN5557F58+YTruXZZ5+lf//+BAUFAbBs2TLOOOMMoqKiiI2N5ZJLLmn13wDgq6++YuzYsQQFBTFx4kSWLFmCxWJh06ZNLcds3bqVmTNnEhYWRmJiIjfccANFRUUnve6u4HRY/OKLL5g1axYpKSlYLBaWLFlyynNWrFjB+PHjCQwMZNCgQbzwwgudqKqIiIj3MAyD6vrGbn8ZhtGh+uXm5nLttdfy4x//mB07drBixQquuOKKlvMrKiqYM2cOK1euZPXq1QwePJiLLrqIioqKVuU8+OCDzJ49m02bNjFs2DCuu+46fvazn3H33Xezbt06DMNg3rx5rc7Zu3cv//73v3n33XdZtmwZGzdu5NZbb223rosWLeKll15i8eLFbNu2jdtvv50f/vCHfP755+2e09DQwIMPPsjmzZtZsmQJBw4c4Ec/+hEAVquVa6+9lldffbXVOa+88gpTp06lX79+AFx11VUUFBTwwQcfsH79esaPH8/5559PSUlJq2t56623+M9//tMS9Kqqqpg/fz7r1q1j+fLlWK1WLr/8chwOBwDl5eXMmjWL0aNHs2HDBh588EHuvPPOVnUpLS3lvPPOY9y4caxbt45ly5aRn5/P1Vdf3e41dxWnF+WuqqoiIyODH//4x1xxxRWnPD47O5uLL76Ym2++mVdeeYXly5fz05/+lOTkZKZPn96pSouIiHi6mgY7IxZ82O3fu/2B6YQEnPqv99zcXBobG7niiitawtHo0aNbPj/vvPNaHf/0008TFRXF559/ziWXXNLy/ty5c1sCzJ133klmZib33Xdfy9/xv/zlL5k7d26rsmpra3nppZfo06cPAE8++SQXX3wxjz32GElJSa2Oraur46GHHuKTTz4hMzMTgAEDBrBy5Ur+8Y9/cPbZZ7d5fT/+8Y9b9gcMGMBf/vIXTjvtNCorKwkLC+P666/nscceIycnh7S0NBwOB6+99hr33nsvACtXrmTt2rUUFBQQGBgIwKOPPsqSJUt48803uemmmwBz6Pmll14iPj6+5fuuvPLKVnV57rnniI+PZ/v27YwaNYpXX30Vi8XCM888Q1BQECNGjODIkSPceOONLef89a9/Zdy4cTz00EOtyklNTWX37t0MGTKkzevuCk6HxZkzZzJz5swOH7948WL69+/PY489BsDw4cNZuXIlf/rT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yvTp06mtrW055vrrr2fbtm18/PHHvPfee3zxxRfcdNNN3XUJJ3Wq6wOYMWNGqz/Tf/3rX60+787rU3tRe+lJai89rze1md7eXsCD2ozh5SZNmmTcdtttLT/b7XYjJSXFWLRoUQ/WqnMWLlxoZGRktPlZaWmp4e/vb7zxxhst7+3YscMAjKysrG6qoWsA4+2332752eFwGElJScYf//jHlvdKS0uNwMBA41//+pdhGIaxfft2AzC+/vrrlmM++OADw2KxGEeOHOm2unfEd6/PMAxjzpw5xve+9712z+nu61N7UXvxFGov3a83t5ne3l4Mo2fbjFf3LNbX17N+/XqmTZvW8p7VamXatGlkZWX1YM06b8+ePaSkpDBgwACuv/56cnJyAFi/fj0NDQ2trnXYsGGkpaV57bVmZ2eTl5fX6poiIyOZPHlyyzVlZWURFRXFxIkTW46ZNm0aVquVNWvWdHudO2PFihUkJCQwdOhQbrnlFoqLi1s+687rU3tRe/EGai9dy1fajK+0F+ieNuPVYbGoqAi73U5iYmKr9xMTE8nLy+uhWnXe5MmTeeGFF1i2bBl///vfyc7O5swzz6SiooK8vDwCAgKIiopqdY63XivQUu+T/fnl5eWRkJDQ6nM/Pz9iYmK84rpnzJjBSy+9xPLly3nkkUf4/PPPmTlzJna7Heje61N78d5rBbUXUHtxlS+1GV9oL9B9bcbPrbUWl8ycObNlf8yYMUyePJl+/frx73//m+Dg4B6smXTWD37wg5b90aNHM2bMGAYOHMiKFSs4//zze7Bm3k/tpfdRe+laajO9T3e1Ga/uWYyLi8Nms50wWys/P5+kpKQeqpX7REVFMWTIEPbu3UtSUhL19fWUlpa2Osabr7W53if780tKSjrhZvLGxkZKSkq88roHDBhAXFwce/fuBbr3+tRevPta1V7UXtytN7cZX2wv0HVtxqvDYkBAABMmTGD58uUt7zkcDpYvX05mZmYP1sw9Kisr2bdvH8nJyUyYMAF/f/9W17pr1y5ycnK89lr79+9PUlJSq2sqLy9nzZo1LdeUmZlJaWkp69evbznm008/xeFwMHny5G6vs6sOHz5McXExycnJQPden9qL2ou3UXvpWr25zfhie4EubDPOzsbxNK+99poRGBhovPDCC8b27duNm266yYiKijLy8vJ6umpO+/Wvf22sWLHCyM7ONlatWmVMmzbNiIuLMwoKCgzDMIybb77ZSEtLMz799FNj3bp1RmZmppGZmdnDtT65iooKY+PGjcbGjRsNwHj88ceNjRs3GgcPHjQMwzAefvhhIyoqyvjvf/9rfPPNN8b3vvc9o3///kZNTU1LGTNmzDDGjRtnrFmzxli5cqUxePBg49prr+2pS2rlZNdXUVFh3HHHHUZWVpaRnZ1tfPLJJ8b48eONwYMHG7W1tS1ldOf1qb2ovfQktZee1dvaTG9vL4bhOW3G68OiYRjGk08+aaSlpRkBAQHGpEmTjNWrV/d0lTrlmmuuMZKTk42AgACjT58+xjXXXGPs3bu35fOamhrj1ltvNaKjo42QkBDj8ssvN3Jzc3uwxqf22WefGcAJrzlz5hiGYS5vcN999xmJiYlGYGCgcf755xu7du1qVUZxcbFx7bXXGmFhYUZERIQxd+5co6Kiogeu5kQnu77q6mrjwgsvNOLj4w1/f3+jX79+xo033njCXzTdfX1qL55L7UXtpSv1tjbT29uLYXhOm7EYhmE408UpIiIiIr7Dq+9ZFBEREZGupbAoIiIiIu1SWBQRERGRdiksioiIiEi7FBZFREREpF0KiyIiIiLSLoVFEREREWmXwqKIiIiItEthUURERETapbAoIiIiIu1SWBQRERGRdv0//Gi9gVjBIY8AAAAASUVORK5CYII=\n", + "image/png": "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Jqnzk4QQnbNXJVsjo9l+vILBaXHEGSO7OckFhjglMGyUAhRveO+995g/fz5Lly5l0qRJPP/888yYMYP9+/eTmpra7vjevXvz8MMPM3ToUPR6PR9//DFz584lNTXVMT0aKjQaDeeffz7nn38+CxcupF+/fnz00UfMnz+fb775hj//+c/MmjULgKKiIo8VPhQWFnLq1CkyMzMB+Pbbb9FqtQwZMqTNcc1NTQwfnIvBoOf0iRNces70dmf27dvHmTNneOqpp8jOzgZgy5Yt7Y67+eabeeSRR9i6dSsffPABS5cudfxs7NixFBcXExERQU5OjtOv7cyZM+zfv59ly5Zx4YUXAsq0dGtDhgzh73//OyaTyRHcfvfdd22OGTt2LB9++CE5OTlERPguXJOq5BA1MC0WCzpMOvtieSlAEcJ99qnkfx+o4dpXNjJ20Vp+8/4Omi2uZ0A6JAUoXvXss89y9913M3fuXIYPH87SpUuJjo5m+fLlHR4/bdo0rrnmGoYNG8aAAQO47777GD16dLsP92C3adMmnnzySbZs2UJhYSErVqygrKyMYcOGATBo0CDeeust9u7dy6ZNm7jllluIivLMzj9Go5Hbb7+dHTt28NVXX/HLX/6SG264oe00MtDc3ERcbAy//NmdzJ8/nzfffJPDhw+zbds2XnzxRd58880OH79v377o9XpefPFFjhw5wqpVq1i0aFG743JycpgyZQp33nknFouFq666yvGz6dOnM3nyZGbPns1nn33GsWPH2LBhAw8//HCHQaaqV69eJCUl8dprr3Ho0CH++9//Mn/+/DbH3HzzzVitVn7605+yd+9ePv30U5555hmgJcN67733UlFRwU033cR3333H4cOH+fTTT5k7dy4Wewsfb5DAMEQNsq8zrNHYP3CkAEUIt1lMSmB4oMKKVgNNFhsfbD3B618f9cwTSC9DrzGbzWzdupXp06c77tNqtUyfPp2NGzd2e77NZmPdunXs37+fiy66qNPnsFqtWCwWxyUYxMfH8+WXXzJr1iwGDx7MI488wpIlS7j88ssBeP311zl79ixjx47l1ltv5Ze//GWHGVZ3DBw4kB/96EfMmjWLyy67jNGjR/PnP/+53XGWZqW59aO/+w2PPvooixcvZtiwYcycOZNPPvmE/v37d/j4KSkpvPHGG7z//vsMHz6cp556yhF4neuW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", "text/plain": [ "
        " ] @@ -208,11 +237,12 @@ } ], "source": [ - "f, axarr = plt.subplots(1,3, layout='constrained', sharey=True)\n", + "f, axarr = plt.subplots(1,3, layout='constrained', sharey=False)\n", "\n", "for i in range(3): \n", " axarr[i].plot(t, Ymean[:,i], label='sample average')\n", " axarr[i].plot(t, solutionReference[:,i], label='reference')\n", + " axarr[i].set_title(stateList[i])\n", "\n", "axarr[2].legend()\n", "plt.show()" @@ -223,55 +253,109 @@ "id": "aa230d7f", "metadata": {}, "source": [ - "\n", - "The difference is relatively large especially for the $S$ state. We can\n", - "decrease this difference as we increase the number of simulation, and\n", - "more sophisticated sampling method for the generation of random\n", - "variables can also decrease the difference.\n", - "\n", + "The difference between the deterministic reference and averaged solutions is relatively large, especially for the $S$ state. \n", + "We can decrease this difference as we increase the number of simulations, and also by using more sophisticated sampling methods for the generation of random\n", + "variables." + ] + }, + { + "cell_type": "markdown", + "id": "39d66f12", + "metadata": {}, + "source": [ + "```{tip}\n", "In addition to using the built-in functions to represent stochasticity,\n", "we can also use standard frozen distributions from scipy. Note that it\n", "must be a frozen distribution as that is the only for the parameters of\n", "the distributions to propagate through the model.\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b8a806bc", + "metadata": {}, + "outputs": [], + "source": [ + "import scipy.stats as st\n", "\n", - "In \\[1\\]: import scipy.stats as st\n", - "\n", - "In \\[1\\]: d = dict()\n", - "\n", - "In \\[1\\]: d\\['beta'\\] = st.gamma(a=100.0, scale=1.0/200.0)\n", + "d = dict()\n", "\n", - "In \\[1\\]: d\\['gamma'\\] = st.gamma(a=100.0, scale=1.0/300.0)\n", + "d['beta'] = st.gamma(a=100.0, scale=1.0/200.0)\n", "\n", - "In \\[1\\]: odeS.parameters = d\n", + "d['gamma'] = st.gamma(a=100.0, scale=1.0/300.0)\n", "\n", - "Obviously, there may be scenarios where only some of the parameters are\n", + "odeS.parameters = d" + ] + }, + { + "cell_type": "markdown", + "id": "030d6487", + "metadata": {}, + "source": [ + "There may be scenarios where only some of the parameters are\n", "stochastic. Let's say that the $\\gamma$ parameter is fixed at $1/3$,\n", - "then simply replace the distribution information with a scalar. A quick\n", - "visual inspection at the resulting plot suggests that the system of ODE\n", + "then we can replace the distribution information with a scalar. A quick\n", + "visual inspection at the resulting plot suggests that the system of ODEs\n", "potentially has less variation when compared to the case where both\n", - "parameters are stochastic.\n", - "\n", - "In \\[1\\]: d\\['gamma'\\] = 1.0/3.0\n", - "\n", - "In \\[1\\]: odeS.parameters = d\n", - "\n", - "In \\[1\\]: YmeanSingle, YallSingle = odeS.simulate_param(t\\[1::\\], 5,\n", - "full_output=True)\n", - "\n", - "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "parameters are stochastic." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "fa0d6ee2", + "metadata": {}, + "outputs": [], + "source": [ + "d['gamma'] = 1.0/3.0\n", "\n", - "In \\[1\\]: for solution in YallSingle: \n", - "...: axarr\\[0\\].plot(t,solution\\[:,0\\]) ...:\n", - "axarr\\[1\\].plot(t,solution\\[:,1\\]) ...:\n", - "axarr\\[2\\].plot(t,solution\\[:,2\\])\n", + "odeS.parameters = d\n", "\n", - "@savefig stochastic_param_single.png In \\[1\\]: plt.show()\n", + "YmeanSingle, YallSingle = odeS.simulate_param(t[1::], 5, full_output=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "eb4e969a", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
        " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f, axarr = plt.subplots(1,3)\n", "\n", - "In \\[1\\]: plt.close()\n", + "for solution in YallSingle: \n", + " axarr[0].plot(t,solution[:,0]) \n", + " axarr[1].plot(t,solution[:,1]) \n", + " axarr[2].plot(t,solution[:,2])\n", "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2f01a3d9", + "metadata": {}, + "source": [ "## Continuous Markov Representation\n", "\n", - "Another common method of introducing stochasticity into a set of ode is\n", + "Another common method of introducing stochasticity into a set of ODEs is\n", "by assuming each movement in the system is a result of a jump process.\n", "More concretely, the probabilty of a move for transition $j$ is governed\n", "by an exponential distribution such that\n", @@ -281,123 +365,187 @@ "where $\\lambda_{j}$ is the rate of transition for process $j$ and $\\tau$\n", "the time elapsed after current time $t$.\n", "\n", - "A couple of the commmon implementation for the jump process have been\n", - "implemented where two of them are used during a normal simulation; the\n", - "first reaction method [\\[Gillespie1977\\]]() and the $\\tau$-Leap method\n", - "[\\[Cao2006\\]](). The two changes interactively depending on the size of\n", - "the states.\n", - "\n", - "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[1\\]: paramList = \\['beta', 'gamma', 'N'\\]\n", + "Two of the commmon algorithms for the jump process have been\n", + "implemented for use during simulation; the reaction method [\\[Gillespie1977\\]]() and the $\\tau$-Leap method\n", + "[\\[Cao2006\\]](). The two change interactively depending on the size of the states." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "a0a0bcbc", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
        " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x0 = [2362206.0, 3.0, 0.0]\n", "\n", - "In \\[1\\]: transitionList = \\[ \n", - "...: Transition(origin='S', destination='I', equation='beta\\*S\\*I/N',\n", - "transition_type=TransitionType.T), ...: Transition(origin='I',\n", - "destination='R', equation='gamma\\*I', transition_type=TransitionType.T)\n", - "...: \\]\n", + "stateList = ['S', 'I', 'R']\n", "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", + "paramList = ['beta', 'gamma', 'N']\n", "\n", - "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", + "transitionList = [Transition(origin='S', destination='I', equation='beta*S*I/N', transition_type=TransitionType.T),\n", + " Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", + " ]\n", "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", "\n", - "In \\[1\\]: solutionReference = odeS.integrate(t\\[1::\\])\n", + "odeS.parameters = [0.5, 1.0/3.0, x0[0]]\n", "\n", - "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10,\n", - "full_output=True)\n", + "odeS.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: f, axarr = plt.subplots(1, 3)\n", + "solutionReference = odeS.integrate(t[1::])\n", "\n", - "In \\[1\\]: for solution in simX: \n", - "...: axarr\\[0\\].plot(t\\[:9\\], solution\\[:,0\\]) ...:\n", - "axarr\\[1\\].plot(t\\[:9\\], solution\\[:,1\\]) ...: axarr\\[2\\].plot(t\\[:9\\],\n", - "solution\\[:,2\\])\n", + "simX, simT = odeS.simulate_jump(t[1:10], 10, full_output=True)\n", "\n", - "@savefig stochastic_process.png In \\[1\\]: plt.show()\n", + "f, axarr = plt.subplots(1, 3)\n", "\n", - "In \\[1\\]: plt.close()\n", + "for solution in simX: \n", + " axarr[0].plot(t[:9], solution[:,0])\n", + " axarr[1].plot(t[:9], solution[:,1]) \n", + " axarr[2].plot(t[:9], solution[:,2])\n", "\n", - "Above, we see ten different simulation, again using the SIR model but\n", - "without standardization of the initial conditions. We restrict our time\n", - "frame to be only the first 10 time points so that the individual changes\n", - "can be seen more clearly above. If we use the same time frame as the one\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e18e4fa7", + "metadata": {}, + "source": [ + "Above, we see 10 different simulations, again using the SIR model but\n", + "without standardization of the initial conditions (we include $N$ as a parameter in our model). \n", + "For demonstration purposes, we restrict our time\n", + "frame to be only the first 10 time points so that the individual changes or stochasticity\n", + "can be seen more clearly. If we use the same time frame as the one\n", "used previously for the deterministic system (as shown below), the\n", "trajectories are smoothed out and we no longer observe the *jumps*.\n", - "Looking at the raw trajectories of the ODE below, it is obvious that the\n", + "Looking at the raw trajectories of the ODEs below, we see that the\n", "mean from a jump process is very different to the deterministic\n", - "solution. The reason behind this is that the jump process above was able\n", + "solution. This occurs because the jump process above was able\n", "to fully remove all the initial infected individuals before any new\n", - "ones.\n", - "\n", - "In \\[1\\]: simX,simT = odeS.simulate_jump(t, 5, full_output=True)\n", - "\n", - "In \\[1\\]: simMean = np.mean(simX, axis=0)\n", + "ones occured." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "525a069b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
        " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "simX,simT = odeS.simulate_jump(t, 5, full_output=True)\n", "\n", - "In \\[1\\]: f, axarr = plt.subplots(1,3)\n", + "simMean = np.mean(simX, axis=0)\n", "\n", - "In \\[1\\]: for solution in simX: \n", - "...: axarr\\[0\\].plot(t, solution\\[:,0\\]) ...: axarr\\[1\\].plot(t,\n", - "solution\\[:,1\\]) ...: axarr\\[2\\].plot(t, solution\\[:,2\\])\n", + "f, axarr = plt.subplots(1,3)\n", "\n", - "@savefig stochastic_process_compare_large_n\\_curves.png In \\[1\\]:\n", - "plt.show()\n", + "for solution in simX: \n", + " axarr[0].plot(t, solution[:,0]) \n", + " axarr[1].plot(t, solution[:,1]) \n", + " axarr[2].plot(t, solution[:,2])\n", "\n", - "In \\[1\\]: plt.close()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "fbef64f3", + "metadata": {}, + "source": [ "\n", "## Repeatable Simulation\n", "\n", - "One of the possible use of compartmental models is to generate\n", + "One of the possible uses of compartmental models is to generate\n", "forecasts. Although most of the time the requirement would be to have\n", "(at least point-wise) convergence in the limit, reproducibility is also\n", "important. For both types of interpretation explained above, we have\n", "given the package the capability to repeat the simulations by setting a\n", "seed. When the assumption is that the parameters follows some sort of\n", - "distribution, we simply set the seed which governs the global state of\n", - "the random number generator.\n", - "\n", - "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", - "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", + "distribution, we can set the seed which governs the global state of\n", + "the random number generator." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "415cab81", + "metadata": {}, + "outputs": [], + "source": [ + "x0 = [2362206.0, 3.0, 0.0]\n", "\n", - "In \\[1\\]: d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':\n", - "st.gamma(a=100.0, scale=1.0/300.0), 'N': x0\\[0\\]}\n", + "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", "\n", - "In \\[1\\]: odeS.parameters = d\n", + "d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':st.gamma(a=100.0, scale=1.0/300.0), 'N': x0[0]}\n", "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "odeS.parameters = d\n", "\n", - "In \\[1\\]: Ymean, Yall = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", + "odeS.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: np.random.seed(1)\n", + "Ymean, Yall = odeS.simulate_param(t[1::], 10, full_output=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "7a51e644", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Different in the simulations and the mean: (81103473.8935847, 52437230.37979218) \n", + "Different in the simulations and the mean using same seed: (0.0, 0.0) \n" + ] + } + ], + "source": [ "\n", - "In \\[1\\]: Ymean1, Yall1 = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", + "np.random.seed(1)\n", "\n", - "In \\[1\\]: np.random.seed(1)\n", + "Ymean1, Yall1 = odeS.simulate_param(t[1::], 10, full_output=True)\n", "\n", - "In \\[1\\]: Ymean2, Yall2 = odeS.simulate_param(t\\[1::\\], 10,\n", - "full_output=True)\n", + "np.random.seed(1)\n", "\n", - "In \\[1\\]: sim_diff = \\[np.linalg.norm(Yall\\[i\\] - yi) for i, yi in\n", - "enumerate(Yall1)\\]\n", + "Ymean2, Yall2 = odeS.simulate_param(t[1::], 10, full_output=True)\n", "\n", - "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(Yall2\\[i\\] - yi) for i, yi in\n", - "enumerate(Yall1)\\]\n", + "sim_diff = [np.linalg.norm(Yall[i] - yi) for i, yi in enumerate(Yall1)]\n", "\n", - "In \\[1\\]: print(\"Different in the simulations and the mean: (%s, %s) \" %\n", - "(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))\n", + "sim_diff12 = [np.linalg.norm(Yall2[i] - yi) for i, yi in enumerate(Yall1)]\n", "\n", - "In \\[1\\]: print(\"Different in the simulations and the mean using same\n", - "seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 -\n", - "Ymean1))))\n", + "print(\"Different in the simulations and the mean: (%s, %s) \" %(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))\n", "\n", + "print(\"Different in the simulations and the mean using same seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 - Ymean1))))" + ] + }, + { + "cell_type": "markdown", + "id": "e1fe54a8", + "metadata": {}, + "source": [ "In the alternative interpretation, setting the global seed is\n", "insufficient. Unlike simulation based on the parameters, where we can\n", "pre-generate all the parameter values and send them off to individual\n", @@ -406,41 +554,50 @@ "because each *integration* requires an unknown number of random samples.\n", "Therefore, we have an additional flag **parallel** in the function\n", "signature. By ensuring that the computation runs in serial, we can make\n", - "use of the global seed and generate identical runs.\n", - "\n", - "In \\[1\\]: x0 = \\[2362206.0, 3.0, 0.0\\]\n", + "use of the global seed and generate identical runs." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "d5a9e235", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Difference in simulation: 2534.4614923250074\n", + "Difference in simulation using same seed: 0.0\n" + ] + } + ], + "source": [ + "x0 = [2362206.0, 3.0, 0.0]\n", "\n", - "In \\[1\\]: odeS = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", + "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", "\n", - "In \\[1\\]: odeS.parameters = \\[0.5, 1.0/3.0, x0\\[0\\]\\]\n", + "odeS.parameters = [0.5, 1.0/3.0, x0[0]]\n", "\n", - "In \\[1\\]: odeS.initial_values = (x0, t\\[0\\])\n", + "odeS.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: simX, simT = odeS.simulate_jump(t\\[1:10\\], 10, parallel=False,\n", - "full_output=True)\n", + "simX, simT = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)\n", "\n", - "In \\[1\\]: np.random.seed(1)\n", + "np.random.seed(1)\n", "\n", - "In \\[1\\]: simX1, simT1 = odeS.simulate_jump(t\\[1:10\\], 10,\n", - "parallel=False, full_output=True)\n", + "simX1, simT1 = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)\n", "\n", - "In \\[1\\]: np.random.seed(1)\n", + "np.random.seed(1)\n", "\n", - "In \\[1\\]: simX2, simT2 = odeS.simulate_jump(t\\[1:10\\], 10,\n", - "parallel=False, full_output=True)\n", + "simX2, simT2 = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)\n", "\n", - "In \\[1\\]: sim_diff = \\[np.linalg.norm(simX\\[i\\] - x1) for i, x1 in\n", - "enumerate(simX1)\\]\n", + "sim_diff = [np.linalg.norm(simX[i] - x1) for i, x1 in enumerate(simX1)]\n", "\n", - "In \\[1\\]: sim_diff12 = \\[np.linalg.norm(simX2\\[i\\] - x1) for i, x1 in\n", - "enumerate(simX1)\\]\n", + "sim_diff12 = [np.linalg.norm(simX2[i] - x1) for i, x1 in enumerate(simX1)]\n", "\n", - "In \\[1\\]: print(\"Difference in simulation: %s\" %\n", - "np.sum(np.abs(sim_diff)))\n", + "print(\"Difference in simulation: %s\" %np.sum(np.abs(sim_diff)))\n", "\n", - "In \\[1\\]: print(\"Difference in simulation using same seed: %s\" %\n", - "np.sum(np.abs(sim_diff12)))" + "print(\"Difference in simulation using same seed: %s\" %np.sum(np.abs(sim_diff12)))" ] } ], @@ -460,7 +617,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15" + "version": "3.11.0" }, "vscode": { "interpreter": { diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/transition.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/transition.ipynb index 4ed4374c..7f032919 100644 --- a/docs/pygom-doc/_build/jupyter_execute/notebooks/transition.ipynb +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/transition.ipynb @@ -2,11 +2,10 @@ "cells": [ { "cell_type": "markdown", - "id": "7e0ef4dc", + "id": "d79c1a27", "metadata": {}, "source": [ "# Transition Object\n", - "{download}`this notebook <./transition.ipynb>`\n", "\n", "\n", "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", @@ -35,7 +34,19 @@ "execution_count": 1, "id": "68d41d64", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'pygom'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpygom\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Transition, TransitionType, common_models\n\u001b[0;32m 3\u001b[0m ode1 \u001b[38;5;241m=\u001b[39m Transition(origin\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mS\u001b[39m\u001b[38;5;124m'\u001b[39m, equation\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m-beta*S*I\u001b[39m\u001b[38;5;124m'\u001b[39m, transition_type\u001b[38;5;241m=\u001b[39mTransitionType\u001b[38;5;241m.\u001b[39mODE)\n\u001b[0;32m 5\u001b[0m ode2 \u001b[38;5;241m=\u001b[39m Transition(origin\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mI\u001b[39m\u001b[38;5;124m'\u001b[39m, equation\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbeta*S*I - gamma*I\u001b[39m\u001b[38;5;124m'\u001b[39m, transition_type\u001b[38;5;241m=\u001b[39mTransitionType\u001b[38;5;241m.\u001b[39mODE)\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'pygom'" + ] + } + ], "source": [ "from pygom import Transition, TransitionType, common_models\n", "\n", @@ -59,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "3b0801dd", "metadata": {}, "outputs": [], @@ -84,27 +95,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "5782a96f", "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.get_ode_eqn()" ] @@ -146,27 +140,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "6966fc5e", "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from pygom import SimulateOde\n", "\n", @@ -194,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 23, "id": "1e17eb7c", "metadata": {}, "outputs": [ @@ -210,7 +187,7 @@ "[0, 0, 0]])" ] }, - "execution_count": 5, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -221,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 22, "id": "570ceed5", "metadata": {}, "outputs": [ @@ -274,10 +251,10 @@ "\n" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -316,7 +293,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 24, "id": "9f24cb0a", "metadata": {}, "outputs": [ @@ -332,7 +309,7 @@ "[ I*gamma]])" ] }, - "execution_count": 7, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -359,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 25, "id": "9a3b3758", "metadata": {}, "outputs": [ @@ -375,7 +352,7 @@ "[ I*gamma]])" ] }, - "execution_count": 8, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -414,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 26, "id": "3a6a15ea", "metadata": {}, "outputs": [ @@ -430,7 +407,7 @@ "[ I*gamma]])" ] }, - "execution_count": 9, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -471,7 +448,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 27, "id": "ce5787f8", "metadata": {}, "outputs": [ @@ -520,7 +497,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.15" + "version": "3.11.0" }, "vscode": { "interpreter": { diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollBD.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollBD.ipynb index 18527593..78cbb930 100644 --- a/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollBD.ipynb +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollBD.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "cd7bbc96", + "id": "7f04f607", "metadata": {}, "source": [ "# ODE With Birth and Death Process\n", @@ -59,7 +59,30 @@ ] } ], - "metadata": {}, + "metadata": { + "kernelspec": { + "display_name": "Python 3.11.0 ('pygom-dev')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + }, + "vscode": { + "interpreter": { + "hash": "fc17efc1b95c7b1781d7b7ce7a7c317a91a744529621a3902877be6d49554249" + } + } + }, "nbformat": 4, "nbformat_minor": 5 } \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollHard.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollHard.ipynb index ec7cbb42..585d8b82 100644 --- a/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollHard.ipynb +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollHard.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "7e58447d", + "id": "12e8474a", "metadata": {}, "source": [ "# Hard Problem\n", @@ -85,7 +85,20 @@ ] } ], - "metadata": {}, + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, "nbformat": 4, "nbformat_minor": 5 } \ No newline at end of file diff --git a/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollSimple.ipynb b/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollSimple.ipynb index ed2b2689..552fdcdc 100644 --- a/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollSimple.ipynb +++ b/docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollSimple.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "9abb7b3b", + "id": "fe55e8d2", "metadata": {}, "source": [ "# Simple Problem\n", @@ -56,7 +56,20 @@ ] } ], - "metadata": {}, + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.0" + } + }, "nbformat": 4, "nbformat_minor": 5 } \ No newline at end of file diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/common_models.md b/docs/pygom-doc/md/common_models.md similarity index 100% rename from docs/pygom-doc/mdconvert/doc_to_sort/common_models.md rename to docs/pygom-doc/md/common_models.md diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/faq.md b/docs/pygom-doc/md/faq.md similarity index 100% rename from docs/pygom-doc/mdconvert/doc_to_sort/faq.md rename to docs/pygom-doc/md/faq.md From 48bbdf47de574628f4d2bc84e94d3a2cd76f3dad Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 5 Jul 2023 10:51:33 +0100 Subject: [PATCH 095/188] remove some parts of toc to check why the build is failing --- docs/pygom-doc/_toc.yml | 62 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 74961f14..185dc0f7 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -28,34 +28,34 @@ parts: - caption: Common biological compartmental models chapters: - file: md/common_models.md - - file: notebooks/common_models/SIS.ipynb - - file: notebooks/common_models/SIS_Periodic.ipynb - - file: notebooks/common_models/SIR.rst - - file: notebooks/common_models/SIR_Birth_Death.rst - - file: notebooks/common_models/SEIR.rst - - file: notebooks/common_models/SEIR_Multiple.rst - - file: notebooks/common_models/SEIR_Birth_Death.rst - - file: notebooks/common_models/SEIR_Birth_Death_Periodic.rst - - file: notebooks/common_models/Legrand_Ebola_SEIHFR.rst - - file: notebooks/common_models/Lotka_Volterra.rst - - file: notebooks/common_models/Lotka_Volterra_4State.rst - - file: notebooks/common_models/FitzHugh.rst - - file: notebooks/common_models/Lorenz.rst - - file: notebooks/common_models/vanDelPol.rst - - file: notebooks/common_models/Robertson.rst - - caption: Frequently asked questions - chapters: - - file: md/faq.md -# - caption: Code documentation -# chapters: -# - file: - - caption: References - chapters: - - file: md/ref.md -# - caption: Indices and tables -# chapters: -# - file: -# - caption: Glossary -# chapters: -# - file: - + sections: + - file: notebooks/common_models/SIS.ipynb + - file: notebooks/common_models/SIS_Periodic.ipynb + - file: notebooks/common_models/SIR.rst + - file: notebooks/common_models/SIR_Birth_Death.rst + - file: notebooks/common_models/SEIR.rst + - file: notebooks/common_models/SEIR_Multiple.rst + - file: notebooks/common_models/SEIR_Birth_Death.rst + - file: notebooks/common_models/SEIR_Birth_Death_Periodic.rst + - file: notebooks/common_models/Legrand_Ebola_SEIHFR.rst + - file: notebooks/common_models/Lotka_Volterra.rst + - file: notebooks/common_models/Lotka_Volterra_4State.rst + - file: notebooks/common_models/FitzHugh.rst + - file: notebooks/common_models/Lorenz.rst + - file: notebooks/common_models/vanDelPol.rst + - file: notebooks/common_models/Robertson.rst +# - caption: Frequently asked questions +# chapters: +# - file: md/faq.md +## - caption: Code documentation +## chapters: +## - file: +# - caption: References +# chapters: +# - file: md/ref.md +## - caption: Indices and tables +## chapters: +## - file: +## - caption: Glossary +## chapters: +## - file: From c4016ebee9d2264542a61de57a22f72675a133b6 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 6 Jul 2023 14:24:56 +0100 Subject: [PATCH 096/188] add flags to book build --- .github/workflows/book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 13842248..859b59ec 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -32,7 +32,7 @@ jobs: # build the book - name: Build the book run: | - jupyter-book build docs/pygom-doc + jupyter-book build -W --all -v docs/pygom-doc # deploy book to github-pages - name: GitHub Pages From 62796b0133d3de103421894e3a7c6c549c5dffbd Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 6 Jul 2023 14:35:20 +0100 Subject: [PATCH 097/188] test to check build --- docs/pygom-doc/notebooks/sir.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pygom-doc/notebooks/sir.ipynb b/docs/pygom-doc/notebooks/sir.ipynb index 0767ca96..86c30c65 100644 --- a/docs/pygom-doc/notebooks/sir.ipynb +++ b/docs/pygom-doc/notebooks/sir.ipynb @@ -35,7 +35,7 @@ "metadata": {}, "outputs": [], "source": [ - "from pygom import Transition, TransitionType" + "#from pygom import Transition, TransitionType" ] }, { From c0954e91254987123b6133eddd1499a914cedfb0 Mon Sep 17 00:00:00 2001 From: HWilliams-PHE <36919240+HWilliams-PHE@users.noreply.github.com> Date: Thu, 6 Jul 2023 14:37:55 +0100 Subject: [PATCH 098/188] Update book.yml remove W flag --- .github/workflows/book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 859b59ec..6af436e6 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -32,7 +32,7 @@ jobs: # build the book - name: Build the book run: | - jupyter-book build -W --all -v docs/pygom-doc + jupyter-book build --all -v docs/pygom-doc # deploy book to github-pages - name: GitHub Pages From 32379e74b4bf346a294385a3732b752cac392a53 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 6 Jul 2023 14:41:59 +0100 Subject: [PATCH 099/188] test build --- docs/pygom-doc/notebooks/transition.ipynb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/pygom-doc/notebooks/transition.ipynb b/docs/pygom-doc/notebooks/transition.ipynb index 2ed607d2..4bb5f8ad 100644 --- a/docs/pygom-doc/notebooks/transition.ipynb +++ b/docs/pygom-doc/notebooks/transition.ipynb @@ -30,12 +30,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "68d41d64", "metadata": {}, "outputs": [], "source": [ - "from pygom import Transition, TransitionType, common_models\n", + "#from pygom import Transition, TransitionType, common_models\n", "\n", "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", "\n", @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "3b0801dd", "metadata": {}, "outputs": [], From 3ce3f92cd2d06bb5884d50d19fcc77ef4cbe7268 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 08:57:11 +0100 Subject: [PATCH 100/188] undo removal of imports (from testing CI) --- docs/pygom-doc/notebooks/sir.ipynb | 289 ++++------------------ docs/pygom-doc/notebooks/transition.ipynb | 2 +- 2 files changed, 56 insertions(+), 235 deletions(-) diff --git a/docs/pygom-doc/notebooks/sir.ipynb b/docs/pygom-doc/notebooks/sir.ipynb index 86c30c65..7e6246c1 100644 --- a/docs/pygom-doc/notebooks/sir.ipynb +++ b/docs/pygom-doc/notebooks/sir.ipynb @@ -30,12 +30,12 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 1, "id": "4c80a36a", "metadata": {}, "outputs": [], "source": [ - "#from pygom import Transition, TransitionType" + "from pygom import Transition, TransitionType" ] }, { @@ -48,7 +48,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 2, "id": "3ce016f2", "metadata": {}, "outputs": [], @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 3, "id": "441e2287", "metadata": {}, "outputs": [], @@ -84,10 +84,22 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 4, "id": "b5f80ab0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'Transition' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[4], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m odeList \u001b[39m=\u001b[39m [\n\u001b[1;32m----> 2\u001b[0m Transition(origin\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mS\u001b[39m\u001b[39m'\u001b[39m, equation\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39m-beta*S*I\u001b[39m\u001b[39m'\u001b[39m, transition_type\u001b[39m=\u001b[39mTransitionType\u001b[39m.\u001b[39mODE),\n\u001b[0;32m 3\u001b[0m Transition(origin\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mI\u001b[39m\u001b[39m'\u001b[39m,equation\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mbeta*S*I - gamma*I\u001b[39m\u001b[39m'\u001b[39m, transition_type\u001b[39m=\u001b[39mTransitionType\u001b[39m.\u001b[39mODE),\n\u001b[0;32m 4\u001b[0m Transition(origin\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mR\u001b[39m\u001b[39m'\u001b[39m, equation\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mgamma*I\u001b[39m\u001b[39m'\u001b[39m, transition_type\u001b[39m=\u001b[39mTransitionType\u001b[39m.\u001b[39mODE) \n\u001b[0;32m 5\u001b[0m ]\n", + "\u001b[1;31mNameError\u001b[0m: name 'Transition' is not defined" + ] + } + ], "source": [ "odeList = [\n", " Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),\n", @@ -117,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "id": "f78c33d4", "metadata": {}, "outputs": [], @@ -135,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "id": "c9fbcce0", "metadata": {}, "outputs": [], @@ -153,27 +165,10 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "id": "6ad54e09", "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.get_ode_eqn()" ] @@ -206,27 +201,10 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "id": "07f81fd1", "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}I \\gamma\\\\- I S \\beta\\\\I S \\beta - I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ I*gamma],\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma]])" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# now we are going to define in a different order. note that the output ode changed with the input state\n", "stateList = ['R', 'S', 'I']\n", @@ -256,40 +234,20 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "id": "960fdc0c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "⎡dR/dt= I⋅γ ⎤\n", - "⎢ ⎥\n", - "⎢dS/dt= -I⋅S⋅β ⎥\n", - "⎢ ⎥\n", - "⎣dI/dt= I⋅S⋅β - I⋅γ⎦\n" - ] - } - ], + "outputs": [], "source": [ "model.print_ode()" ] }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "id": "93e32c75", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\\begin{array}{cc}dR/dt= & I \\gamma\\\\dS/dt= & - I S \\beta\\\\dI/dt= & I S \\beta - I \\gamma\\end{array}\n" - ] - } - ], + "outputs": [], "source": [ "model.print_ode(True)" ] @@ -316,21 +274,10 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "id": "61684654", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.linear_ode()" ] @@ -345,27 +292,10 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "id": "1c8ff090", "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\gamma\\\\0 & - I \\beta & - S \\beta\\\\0 & I \\beta & S \\beta - \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[0, 0, gamma],\n", - "[0, -I*beta, -S*beta],\n", - "[0, I*beta, S*beta - gamma]])" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.get_jacobian_eqn()" ] @@ -380,27 +310,10 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "id": "abb02502", "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & I\\\\- I S & 0\\\\I S & - I\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ 0, I],\n", - "[-I*S, 0],\n", - "[ I*S, -I]])" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.get_grad_eqn()" ] @@ -427,23 +340,10 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "id": "e703c888", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[ODEVariable('R', 'R', None, True),\n", - " ODEVariable('S', 'S', None, True),\n", - " ODEVariable('I', 'I', None, True)]" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "model.state_list" ] @@ -477,7 +377,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "id": "46042ebf", "metadata": {}, "outputs": [], @@ -487,21 +387,10 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": null, "id": "9ec016b5", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{beta: 0.5, gamma: 0.3333333333333333}" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]\n", "\n", @@ -520,21 +409,10 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": null, "id": "c43074c6", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "initialState = [0, 1, 1.27e-6]\n", " \n", @@ -554,7 +432,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "id": "a14b9901", "metadata": {}, "outputs": [], @@ -577,21 +455,10 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": null, "id": "8303885c", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyI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s76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", - "text/plain": [ - "
        " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -628,21 +495,10 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": null, "id": "efddd3a5", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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", - "text/plain": [ - "
        " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "model.initial_values = (initialState, t[0])\n", "\n", @@ -663,18 +519,10 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "id": "7a7a568f", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "#TODO what does this show?\n", "%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)\n" @@ -682,18 +530,10 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": null, "id": "91b7f9d4", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "\n", "%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)\n" @@ -701,18 +541,10 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": null, "id": "3403884c", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], + "outputs": [], "source": [ "\n", "%timeit solution3, output3 = model.integrate(t, full_output=True)" @@ -738,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": null, "id": "87173626", "metadata": {}, "outputs": [], @@ -758,25 +590,14 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": null, "id": "8b63ba62", "metadata": { "tags": [ "hide-output" ] }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
        " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "{\n", " \"tags\": [\n", diff --git a/docs/pygom-doc/notebooks/transition.ipynb b/docs/pygom-doc/notebooks/transition.ipynb index 4bb5f8ad..bea1277f 100644 --- a/docs/pygom-doc/notebooks/transition.ipynb +++ b/docs/pygom-doc/notebooks/transition.ipynb @@ -35,7 +35,7 @@ "metadata": {}, "outputs": [], "source": [ - "#from pygom import Transition, TransitionType, common_models\n", + "from pygom import Transition, TransitionType, common_models\n", "\n", "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", "\n", From b5b285f82daf79eb6e3e123d8835e6fc5dd1cd75 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 09:00:11 +0100 Subject: [PATCH 101/188] undo removals from config (used for testing CI) --- .github/workflows/book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 6af436e6..32a45bac 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -32,7 +32,7 @@ jobs: # build the book - name: Build the book run: | - jupyter-book build --all -v docs/pygom-doc + jupyter-book build --all -v -W docs/pygom-doc # deploy book to github-pages - name: GitHub Pages From aead8cb7117a5ea9a1f551e8d330a9e925238f54 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 14:15:37 +0100 Subject: [PATCH 102/188] edited unroll pages --- .../notebooks/unroll/unrollSimple.ipynb | 121 ++++++++++++++---- 1 file changed, 98 insertions(+), 23 deletions(-) diff --git a/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb b/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb index 88bbd592..55772cb3 100644 --- a/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb +++ b/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Simple Problem\n", + "# A simple problem\n", "\n", - "For a simple problem, we consider the SIR model defined by\n", + "For a simple problem, where we can clearly distinguish the flows from one compartment to another, we consider the SIR model defined by\n", "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= -\\beta SI \\\\\n", @@ -22,40 +22,115 @@ "\n", "}\n", "\n", - "Let's define this using the code block below\n", - "\n", - "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", + "We can define this as an ODE, as seen in {}[sir.ipynb]" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "52daed16", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0\\\\0 & 0 & 0\\\\0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, 0, 0],\n", + "[0, 0, 0],\n", + "[0, 0, 0]])" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pygom import SimulateOde, Transition, TransitionType\n", "\n", - "In \\[2\\]: ode1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", - "transition_type=TransitionType.ODE)\n", + "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", "\n", - "In \\[3\\]: ode2 = Transition(origin='I', equation='beta\\*S\\*I -\n", - "gamma\\*I', transition_type=TransitionType.ODE)\n", + "ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)\n", "\n", - "In \\[4\\]: ode3 = Transition(origin='R', equation='gamma\\*I',\n", - "transition_type=TransitionType.ODE)\n", + "ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)\n", "\n", - "In \\[6\\]: stateList = \\['S', 'I', 'R'\\]\n", + "stateList = ['S', 'I', 'R']\n", "\n", - "In \\[7\\]: paramList = \\['beta', 'gamma'\\]\n", + "paramList = ['beta', 'gamma']\n", "\n", - "In \\[8\\]: ode = SimulateOde(stateList, \n", - "...: paramList, ...: ode=\\[ode1, ode2, ode3\\])\n", + "ode = SimulateOde(stateList, paramList, ode=[ode1, ode2, ode3])\n", "\n", - "In \\[9\\]: ode.get_transition_matrix()\n", + "ode.get_transition_matrix()" + ] + }, + { + "cell_type": "markdown", + "id": "d712e654", + "metadata": {}, + "source": [ "\n", "and the last line shows that the transition matrix is empty. This is the\n", "expected result because `SimulateOdeModel` was not initialized using\n", - "transitions. We populate the transition matrix below and demonstrate the\n", - "difference.\n", - "\n", - "In \\[1\\]: ode = ode.get_unrolled_obj()\n", + "transitions. We can populate the transition matrix by calling an algorithm to extract the flow information, and can see that the output matches that from {ref}`transition:defining-the-equations`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "768a4cd0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, I*S*beta, 0],\n", + "[0, 0, I*gamma],\n", + "[0, 0, 0]])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode = ode.get_unrolled_obj()\n", "\n", - "In \\[2\\]: ode.get_transition_matrix()" + "ode.get_transition_matrix()" ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From a42addfb4c67e7ce02a9cd64ed90eba66645962f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 14:17:19 +0100 Subject: [PATCH 103/188] inclusion of new documentation path --- .gitignore | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 98aa5e82..eebbbe54 100644 --- a/.gitignore +++ b/.gitignore @@ -17,5 +17,6 @@ __pycache__ .settings # For built documentation -/doc/_build* -/doc/source/savefig/* +/docs/pygom-doc/_build* +/doc/_build +/docs/source/savefig/* From 7da2f429b61091421c04419538c3ddd9e6e5510e Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 14:41:53 +0100 Subject: [PATCH 104/188] typo --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index eebbbe54..669de051 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,4 @@ __pycache__ # For built documentation /docs/pygom-doc/_build* /doc/_build -/docs/source/savefig/* +/doc/source/savefig/* From a3f412ce4143e3a8c7b3f6443be4f0da561ceee2 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 14:58:20 +0100 Subject: [PATCH 105/188] change path for requirements to install pygom --- .github/workflows/book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 32a45bac..4174495d 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -27,7 +27,7 @@ jobs: # install dependencies - name: Install dependencies run: | - pip install -r docs/pygom-doc/requirements.txt + pip install -r requirements.txt # build the book - name: Build the book From d8c9304ef86f67dfe258e6c342ec45ca3db6ee03 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:01:14 +0100 Subject: [PATCH 106/188] resaved --- .../pygom-doc/notebooks/unroll/unrollBD.ipynb | 111 ++++++--- .../notebooks/unroll/unrollHard.ipynb | 235 +++++++++++++++--- 2 files changed, 277 insertions(+), 69 deletions(-) diff --git a/docs/pygom-doc/notebooks/unroll/unrollBD.ipynb b/docs/pygom-doc/notebooks/unroll/unrollBD.ipynb index ea56ca47..54b6f36d 100644 --- a/docs/pygom-doc/notebooks/unroll/unrollBD.ipynb +++ b/docs/pygom-doc/notebooks/unroll/unrollBD.ipynb @@ -6,16 +6,16 @@ "source": [ "# ODE With Birth and Death Process\n", "\n", - "We follow on from the SIR model of `unrollSimple` but with additional\n", + "We follow on from the SIR model of {doc}`unrollSimple` but now include additional\n", "birth and death processes.\n", "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= -\\beta SI + B - \\mu S\\\\\n", "\\frac{dI}{dt} &= \\beta SI - \\gamma I - \\mu I\\\\\n", - "\\frac{dR}{dt} &= \\gamma I.\n", + "\\frac{dR}{dt} &= \\gamma I\n", "\\end{aligned}$$\n", "\n", - "which consists of two transitions and three birth and death process\n", + "which consists of two transitions and three birth and death process.\n", "\n", "digraph SIR_Model { \n", "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", @@ -27,50 +27,105 @@ "}\n", "\n", "Let's define this in terms of ODEs, and unroll it back to the individual\n", - "processes.\n", - "\n", - "In \\[1\\]: from pygom import Transition, TransitionType, SimulateOde,\n", - "common_models\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[1\\]: paramList = \\['beta', 'gamma', 'B', 'mu'\\]\n", + "processes." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "eed075f5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, I*S*beta, 0],\n", + "[0, 0, I*gamma],\n", + "[0, 0, 0]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pygom import Transition, TransitionType, SimulateOde, common_models\n", "\n", - "In \\[1\\]: odeList = \\[ \n", - "...: Transition(origin='S', ...: equation='-beta\\*S\\*I + B - mu\\*S',\n", - "...: transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", - "...: equation='beta\\*S\\*I - gamma\\*I - mu\\*I', ...:\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='R', ...:\n", - "equation='gamma\\*I', ...: transition_type=TransitionType.ODE) ...: \\]\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", + "stateList = ['S', 'I', 'R']\n", "\n", - "In \\[1\\]: ode2 = ode.get_unrolled_obj()\n", + "paramList = ['beta', 'gamma', 'B', 'mu']\n", "\n", - "In \\[1\\]: f = plt.figure()\n", + "odeList = [Transition(origin='S', equation='-beta*S*I + B - mu*S', transition_type=TransitionType.ODE),\n", + " Transition(origin='I', equation='beta*S*I - gamma*I - mu*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)]\n", "\n", - "@savefig sir_unrolled_transition_graph.png In \\[1\\]:\n", - "ode2.get_transition_graph()\n", + "ode = SimulateOde(stateList, paramList, ode=odeList)\n", "\n", - "In \\[1\\]: plt.close()" + "ode2 = ode.get_unrolled_obj()\n", + "ode2.get_transition_matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1759120d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAADBCAYAAADl2UvmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABhYElEQVR4nO3dd3xUVfr48c/MZCaTOsmkTXpCOhASSOhVqiCIiGJhLYhiAdHF8tXdtaD7Feuua8FeYEHEgl1QBKUTCDW0ENJ7z0z6tPv7g9/cLxFQSmASOO/Xa14hM5c7586dzH3mnOc8RyFJkoQgCIIgCEIXonR2AwRBEARBEH5PBCiCIAiCIHQ5IkARBEEQBKHLEQGKIAiCIAhdjghQBEEQBEHockSAIgiCIAhClyMCFEEQBEEQuhwRoAiCIAiC0OWIAEUQBEEQhC5HBCiCIAiCIHQ5Tg1Q3nzzTaKiotBqtQwcOJAdO3Y4szmCIAiCIHQRTgtQVq5cyYIFC3jqqafYvXs3KSkpTJgwgaqqKmc1SRAEQRCELkLhrMUCBw4cSP/+/XnjjTcAsNvthIeHc//99/PYY4/94f+12+2UlZXh5eWFQqG4GM0VBEEQBOE8SZJEY2MjISEhKJV/3EficpHa1IHZbGbXrl08/vjj8n1KpZKxY8eybdu2k7Zvb2+nvb1d/r20tJSePXtelLYKgiAIgtC5iouLCQsL+8NtnBKg1NTUYLPZCAoK6nB/UFAQR44cOWn7RYsWsXDhwpPuLy4uxtvb+4K1UxAEQRCEzmMymQgPD8fLy+tPt3VKgHK2Hn/8cRYsWCD/7jhAb29vEaAIgiAIQjdzJukZTglQ/P39UalUVFZWdri/srISg8Fw0vaurq64urperOYJgiAIguBkTglQNBoNaWlprFu3jmuuuQY4nvi6bt065s2b54wmCYIgCEKXI0kSVqsVo9GI0WikubkZu91Oa2srNpsNtVot37RaLR4eHuh0Ojw8PJzd9PPmtCGeBQsWcNttt5Gens6AAQN49dVXaW5uZtasWc5qkiAIgiA4hcViobS0lIqKCiorK6murqampoaGhgaamppobm6mtbUVs9mM3W7HYrFgt9tRqVTyTa1W4+rqiru7uxyoBAYGEhwcjMFgICQkhKCgINRqdbeYAeu0AOWGG26gurqaJ598koqKClJTU1mzZs1JibOCIAiCcCmRJAm73U5lZSX5+fmUlJRQWlpKUVERdXV1tLe3Y7Vasdls2O12FAoFbm5uuLu74+vri0KhQKPRoFQqsdlsWK1WOWhpa2ujqqoKi8WCUqmUAxeNRkNgYCDh4eEEBwcTHBxMWFgYBoMBd3d3Z78kp+S0Oijnw2QyodPpMBqNIklWEARB6Bba2tqora2lrKyM8vJyDhw4wNGjR6msrMRoNOLp6Ymfn5/c2xEcHExAQAA6nQ4fHx90Oh2enp4oFAq0Wi0qlQqLxYLVasVisdDe3k5jYyNGo5GGhgZqa2spKSmhuLiYkpISOfjx8vLC39+fyMhIEhISiIyMJDg4mNDQUNzc3C7oa3A2128RoAiCIAjCBWK322lsbKSuro6CggJ27drFjh07OHr0KDabjdjYWPr160dqaip9+vQhODgYjUbT6e2wWq3k5+dz8OBBDhw4wIEDB8jLy6OtrY2QkBD69OnD6NGjiY2NJSAgAG9v7wsyDCQCFEEQBEFwIkcia01NDZs3b2b16tXs3LkTi8VCSkoKY8eOZcyYMSQmJjqlfTabjdLSUjIyMvjtt9/YsGEDtbW1DBw4kOuvv55Ro0ah0+lwc3NDqVR2WrAiAhRBEARBuMgcl1Or1UpDQwNffvklS5YsIS8vj+joaCZOnMjVV19N3759ndzSjux2O83NzaxZs4alS5eyfv16YmJiuOeee7j66qsJCgpCpVL9aWn6MyECFEEQBEG4iByXUpvNxnvvvcdzzz1HU1MT06ZN44477iAtLe2C53d0BkmS2LNnD4sWLWL16tVERUUxf/58Jk+eTHBwMHBmRdZORwQogiAIgnARWa1W9uzZw9y5c9m3bx9z5sxh/vz5REVF4eJyfMJsd5jaC/8XbB08eJAXX3yRn376idjYWO6++26uvfZaPD09z3nfZ3P9Pv/+GkEQBEG4TEmSRF1dHS+88AKjR49Gq9WyefNmXnrpJWJiYnBxcUGhUHSb4ASQ29uzZ0/ef/99li1bRmhoKE8++SR33HEH+/fvvzjtED0ogiAIgnD2zGYz+/bt45lnnmHnzp3cc8893H///Xh7e8uBSXcnSRIWi4Wamhp++OEHPvzwQ5qbm1mwYAG33377We/vbK7f3WKxQEEQBEHoSpqamvjll1944403aGxs5I033mDkyJHo9Xqg+wzn/BlHUTiDwcD1119PbGwsy5cv57nnnqOyspKHH364U2f5nEgEKIIgCIJwFhoaGvj6669ZsWIFrq6uPPjggwwfPhydTufspl0wSqUSnU7HgAED8PLywtfXl48//hibzcajjz6KSqXq9CBFBCiCIAiCcIaam5v55ptvWLVqFd7e3tx2222MHj26y5aL70wKhQIPDw+Sk5PRarXY7XY5P+Xmm2/u9GEtkSQrCIIgCGfAarXy008/sWrVKrRaLX/5y18YN27cZRGcnMjV1ZXExETuvvtuUlJSeOutt9i8eTNms7lTn0cEKIIgCIJwBg4cOMDSpUux2+1cd911jB8/HldXV2c3yylcXFyIjY3lkUceQZIkFi9eTFFRERaLpdOeQwQogiAIgvAnGhoaePfdd6murub6669n4sSJ3aLw2oWkVCrp27cvjz32GFu3buW7776jrq4Ou93eOfvvlL0IgiAIwiVKkiR++uknfvrpJ66++mquuOIKvLy8nN2sLkGhUDBt2jSuvfZaFi9ezL59+2hra+uUfYsARRAEQRD+QEtLCy+88AL9+/dnypQphIeHO7tJXc6zzz6Lt7c3n3zyCceOHaMzSqyJAEUQBEEQTkGSJCRJ4v3336eoqIh7772XHj16XPQ22Gy2U97sdjt2u11upzP5+Phw//33s3nzZnbu3InJZDrvfYoARRAEQRBOQ5IkXnvtNW688UaSkpIuelLsunXrcHFxOeVt/PjxPP300/z222/U1dVd1HadysyZM4mPj2f9+vWdUg5fBCiCIAiCcBrr1q2jqKiIm266CZ1Od9ErxI4ePZqmpib27dsn39fc3ExbWxvLli0jKCiIv/71r/zzn/+kpKTkorbt99RqNVOmTCEvL4+DBw9is9nOa38iQBEEQRCEU5AkiVWrVtG3b18SExPRaDQXvQ1KpRJ3d3cMBoN8n0ajwdXVlcDAQG644Qaio6PZuXMnW7duvejtO5FCoWDixIl4enpy8OBB8vLyzmt/IkARBEEQLqq2tjbWrFnDW2+9RUtLi7Obc1qSJLF161aGDh2KVqt12vo6CoUCpfLky7VSqcTX1xetVsvu3budHqAAhIaGEhERQW1tLYWFhee1L1HqXhAEQegU27dv5+mnnz7lY8uWLcPf3x+A9vZ2srKyyMzM5LrrruuSlVglScJoNHLs2DEeeeQRXFy65uXSZDLR3t5Or1696Nevn7Obg1qtJiYmhszMTIqKis5rX13zFRcEQRC6HYPBwNSpU6muruapp54C4F//+hfu7u64ubnx2WefoVarSUhIoL29HZPJREtLC1u2bOHAgQPcfffdTj6C/2O326moqKClpYX4+HhUKpWzm3SS8vJyVq9ejdVq5corr2TIkCHObhJwvBdlx44d1NbWntd+RIAiCIIgdIqoqCjuvvtuCgsL5QDl7rvvxs3NDYVCgUKhwGg0UlNTQ0tLCzabjdbWVtrb2085hOFMkiRRXV0NHA+8ulL7XnzxRZRKJVVVVXh6enLllVcyYMAAwsLCnN004PiUY7vdTmNj43ntRwQogiAIQqdRKpUdpuKemLsxZswYcnNzaWxsxGg0YrVaaW9vJzg4mJ49eyJJkjxjxcvLi/j4eNzc3DCbzRw5coSSkhLi4+OJjY294MchSZJcy8PLy8tp+Sensm/fPhQKBTt37uTOO+/kqquuIjIy0tnNkrm7u2O328+7oqwIUARBEISLoqSkBJPJhFqtRqPRoFQqkSSJoqIiampqCAoKYv/+/XzxxRdERkbi6elJeHg4RqORFStW8OOPP/LYY49dlAAFkNeU6Uq9JwDLly/HxcWFZ599lurqao4ePYqvry/e3t7ObhqAPBx2vsXjutarLgiCIFyyvvnmG3Jzc/Hz8yMgIAC1Wo23t7ccgAB8+umn3HfffcyYMYO8vDzq6uowGo20tLQQERHBoEGDLkpbFQoFPj4+ABiNRqdXaj2VefPmodPp+P7779m8eXOXmRHV1NSEUqk878UURYAiCIIgXBRPPPEEc+bMISQkBIvFgkKhwN3dnRkzZrB48WIkSWLp0qWEh4cTGhoql3QvLy/H3d2dkSNHEh0dfVHaqlAo0Ov1AFRXV3faCr3n4vel7B2/+/r6Mn/+fEJCQvj666/5/vvvsVgsTg+mjEYjCoUCDw+P89qPCFAEQRCEi0qr1ZKUlMSgQYPw9PSU71cqlRiNxpO+eZeUlBAQEMCECRPO+rkcF/Pf3/6MUqkkJiYGrVZLVlbWeVdFPVeSJGE2m6mqqpLvq6ysxGazyUHKjTfeiCRJvPHGG3z33XfU1NQ4LaCSJIn8/HxUKlWH4nLnQgQogiAIwkWl1Wq5/vrreeKJJ/7wW7Zer6empoYffviB/Pz8c1qoz1HPZNWqVezZs4eGhoYz/r+urq707duXjIwMLBbLWT93Z1i3bh1arZbevXvL94WHh6NWq8nPzwcgIiKCZ555hlGjRjF9+nSSk5N5++23ndJegOzsbLRaLVFRUee1H4Xk7L6gc2AymdDpdBiNxi6TFCQIwqWnoaGBgoICcnJyyMvLo6SkhMrKSiorK6murpZnojQ3N2OxWHB1dZVv7u7u+Pj4EBgYiMFgIDg4mISEBJKSkkhISMDd3b3LJV92lrKyMkJDQwGw2WznfJxlZWVkZWVRW1tLQkIC/fr1O+vZNJIkUVJSQlpaGvX19SgUCry8vAgPD6dHjx5ERkYSERFBeHg44eHhhIWFERQUhIuLC3a7nSeeeILly5eTmZmJn5/fRZ/NY7fbsVqtp3xMrVbL7XGseuzoOVGpVE6p3bJ7927mz5/PkCFDePDBBwkJCenw+Nlcv8UsHkEQLnuObv8jR46wbds2duzYQWZmJuXl5bS2tqLRaNDr9YSGhuLn50dycjJ6vR5vb285GVCtVtPe3o7FYsFisdDa2irX/CgvL2fv3r28/fbbWK1W1Go10dHR9O3bl7S0NPr160dcXJz4wvU7CoWCN954g8GDBzN+/PhzCg4UCgUajYZevXrx22+/AVBfX4/RaOTIkSPybCLHtiqVCo1GQ0BAAFFRUXh6elJWVsa///1vZsyYIU99vliUSuUZrQGkUCi6RLXbH3/8EbVaTXJyMkFBQee1L+cfjSAIghNIkkRjYyN79+5lw4YN/PrrrxQWFqJSqYiLi2PkyJH06NGDqKgogoOD8fb2Rq1Wy0vdO76hOgqQKRSKDjkOdrsdm82G1WrFZrPJQUtRURG5ubkcO3aMnJwcNm3aRHt7O0FBQaSmpjJ8+HCGDx8u90B0NzabjebmZvn3pqamc64j4u/vz4QJE0hKSsLX1/ec26TRaOjbty9btmyRk0gdCbjt7e2n/D/V1dUcO3YMFxcXrFYrX3/9Nddff32XCAK6qurqan755Rfi4+NJSko67x4c8UoLgnBZaW5u5vDhw/z2229s3bqV4uJiPDw8iI2NZfr06SQmJuLr64tOp8PLywsPDw9cXV3P+8LkGE2Pjo4mPT0dk8mEyWSitraWgoICjhw5Qk5ODq+88grvvPMO/fv3Z+LEiQwdOrRDV35Xtm3bNp588skO012nTp2Ki4sLK1askNfiOVNWq5WwsDACAgLO62Kn0WhITk4+7VDJ6Z7bZrORkJDApEmT+PDDD8nJySE6OhqdTnfObbmUffLJJ9TX1zNs2DDi4uLOe38iQBEE4bJQU1PD1q1b2bJlC9nZ2bS0tGAwGLjuuuuIi4sjMjKSyMhI9Hq93CPSmRz78/DwwMPDg8DAQOB4j4PRaKSiooKSkhIKCgo4cOAABw4cYPfu3fTq1YuxY8cybNgwdDpdl85bCQkJ4YYbbgBg1qxZHR47l2GRvLw8jhw5cs69J1arFaPRSF5eHlVVVWc8/ValUuHl5cX06dOZMmUKiYmJZGRk8PXXX5OYmEivXr269Hlwhvz8fD777DPS09NJTU3Fy8vrvPcpAhRBEC5pRqORrVu3snXrVg4cOIDFYiEsLIzevXuTkpJCz5498fPzc1r7VCoVer0evV5PUlISZrOZ3Nxcdu/eTWZmJocOHSIvL49du3YxePBg+vbti7+/f5e8QEZGRnLnnXd22v4OHz7Mxo0bCQ8P/9NtzWYzNTU1VFZWUlVVRVVVlZzQXFFRQV1dHa6urqcd0oHjQaSnpydpaWlcccUVTJkyhdTUVOB4wPXGG2/w888/4+Pjc0ZtuhxIkoTFYuHjjz/GZDLJZfc74/0pAhRBEC45jhyQ7OxsNm3axOrVq6mrq5NzS4YOHUpkZGSXyydQKBS4urrSs2dPkpKSmDRpEj///DOrV69m3bp1HDx4kJEjRzJkyBBiYmIu+aGGrVu3UlhY2GGKr+PcNjY2Ul9fT11dHfX19ZSXl1NYWEhZWRl1dXWYTCZaW1tRKpXo9XqioqKIiori6NGjp+xJcXNzIywsjIEDBzJ16lQmTZqEu7u7/Pi0adPYtGkTP//8M8HBwUyaNEmuNHu5cryOGzdu5NNPP2Xq1KkMGjSo05K9xTRjQRAuKXa7nZaWFg4dOsSSJUtYv349SUlJ3HDDDYwePRp/f/9ukc9xIqPRyPfff8+XX35JSUkJffr0YdKkSQwYMICQkJAu2ZvSGa688kpcXFy48847SU9Pp6WlhebmZoxGo5xsXFJSQmlpKaWlpXJvVEREBHFxccTFxREbG0uPHj1wdXXlnnvuYfny5R2KrqlUKvz8/OSAcMaMGaet37F161aefvppAgICuOWWWxgxYkSHIOZyY7fbyc3N5e6778Zut/Pee+8RHR39h4H/2Vy/RYAiCMIlw2azUV9fz/bt2/nHP/5BS0sLc+fO5fbbb8fLy6vbX8irqqpYuXIln332GU1NTVx11VXMnj2b0NDQM5qK2pU5Zta0t7djNptpb2/ngw8+wGw24+HhIeeSFBQUUFJSIq+V48gJSUpKIjExkR49euDh4XFSEGo2m1m8eDGPPPKInCzr7e1NUFAQkydP5uabb6Zfv35/+h5ZtmwZ7777LmFhYdx7770MGDCgw+rNlwPHTLWqqioefvhhNm3axPLlyxkwYMCfvg9FgCIIwmXF0e1fWlrKkiVL+M9//kO/fv145513iIqK6nY9Jn/m8OHDLF26lJUrVxITE8OiRYtISUlBrVY7u2ln5MRp2I7iYlarVa4Xc+DAAQ4dOsT+/fupqalBoVDg5+dHTEwMvXv3Ji0tjbS0NOLi4s44odlqtbJlyxZGjRqFWq1Gq9UyY8YM5s6dS69evc44wLPb7SxdupT3338fHx8fHn/8cQYMGNBtXvvz5Th3VVVVPPvssyxbtozly5czceLEMxoyFQGKIAiXDce3uT179vDSSy+xdu1a5s+fz9///ne5TsmlqKmpic2bN/PUU09RWlrKBx98wLhx4y7IDKRzdaoF7gBaWlooLi5m79697N69m6ysLPbu3UtNTQ0uLi7ExcWRkpJCnz596N27N3369CE4OPi8coYcJe8DAgJIS0vj5ZdfJj09Ha1We9b7slqtfPPNN7z66quYTCaeffZZJk+e3KVe+wvBEZwcO3aMxx9/nHXr1vH2229z4403nvFxiwBFEITLhtVq5fvvv+eVV16htraWF198kauuugrgkr9YSJJEcXExjz76KN9++y3vv/8+N998c5c5bkmSaGpqYv/+/ezbt4/9+/ezf/9+srOz5Vk1YWFh9OnTh9TUVIYMGcLgwYNPm9dxvsclSRI//PADEydO7FA99lz2I0kSu3bt4uWXX+4QFLu4uHSZ17+zmUwm1q1bx7PPPktdXR0ffvghV1xxxVkdrwhQBEG4LDi629999128vb155plnSE9P7/a5JmfK8fFtMplYuHAhb775Jp988glXX331RR9ysNlsmEwmjh07xs6dO8nIyGDv3r1kZ2djs9kICAggKSmJ3r1707NnT/r06UN8fDze3t4dqvE6LnYX4iLvCCw64zkc+yovL2fJkiW89NJL9OnThw8//JAePXpcckHK/v37ef/991m1ahUpKSm8+OKLJCUl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jBkzmDt3LgaDAVdX10viveDIASkvL2fNmjV88sknWK1WHnzwQW666SZnN++c2O12GhsbOXr0KIcOHZJvubm5tLS04OrqKvecRkVFER8fT69evdDr9XLvquMmvpx0fSJAEc6LJEm0t7djMpnYvHkzq1atYsuWLVgsFoYOHcq1114rF+ly5oeB1WqlqqqKdevW8cUXX7Bp0yYCAgKYPn06N9xwA1FRUbi7u1+2gYqjPL3VapVvbW1tHDp0iN27d7N//3727dtHaWkpVqsVvV5PYmKiXF10yJAhJ61+3NVJkkRjYyPvv/8+ixYtIjExkWeffZa+ffvKiwt2p+M5kdVqpbW1lU2bNrF06VJ27dpFeno6f//73+ndu7ezm9fpTCYTeXl57N+/nz179pCVlUVubi4NDQ2oVCoiIyPp2bMnPXv2JDk5meTkZLln5cSFJrvzOb8UiQBFOGeObzOff/45H330EdnZ2SQkJHDDDTdw9dVXd9kVUSVJIjs7m48++oj//ve/2Gw2pk6dyq233kq/fv3knJdLmSMgcdwsFgs1NTXs3buXjIwMMjIy2L59O21tbQQEBNCrVy969+5Namoq6enp5zxU0xXZbDb27dvH/fffz549e7jllluYN2+ePITUnb5p2+127HY7WVlZvPrqq/zyyy9ER0dz5513ct111+Hp6ensJl40ra2tlJSUkJWVxf79++VKuHV1dahUKnnYNzU1lX79+pGcnExoaKgcpDiSsR068z1w4npV3en9dbGJAEU4a463wZo1a/jb3/5GQUEBw4cP54477mD06NHd6nWuq6tj+fLlfPDBB5SVlTF69GjuvfdeRowYAVwa+Qin+rMtKytj//79ZGZmkpmZyd69eykqKkKpVBIdHc2QIUMYOnQogwYNIjExEY1Gc0m8FqfjuGB8+OGH/O///i91dXVMmTKF2bNnM2DAALnwXFd7DX5/bnft2sXzzz/PmjVriIqKYt68eUydOrXDopCXu7KyMnbs2EFGRgb79u3jwIEDlJeXA6DX6+nVqxcpKSn07duXfv36kZSUdMovLOfzXrBarezfv5/c3FymT58uFl88DRGgCGdFkiRKS0uZM2cO69atY+rUqTzyyCP07t1bzgvoTn9kjgtTQ0MDn332GR9++CGlpaVcc801/OMf/+j2H+yO3pGsrCy2bt3K9u3b2bJlCxUV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", + "text/plain": [ + "
        " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nI\n\nI\n\n\n\nS->I\n\n\nI*S*β\n\n\n\nS*μ\nS*μ\n\n\n\nS->S*μ\n\n\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nI*γ\n\n\n\nI*μ\nI*μ\n\n\n\nI->I*μ\n\n\n\n\n\nB\nB\n\n\n\nB->S\n\n\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode2.get_transition_graph()\n" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3.11.0 ('pygom-dev')", + "display_name": "Python 3.9.15 ('sphinx-doc')", "language": "python", "name": "python3" }, "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", "name": "python", - "version": "3.11.0" + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" }, "vscode": { "interpreter": { - "hash": "fc17efc1b95c7b1781d7b7ce7a7c317a91a744529621a3902877be6d49554249" + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" } } }, diff --git a/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb b/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb index 64e14bd0..d57d339e 100644 --- a/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb +++ b/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb @@ -21,7 +21,7 @@ "\n", "The outflow of state **L**, $\\kappa L$, is composed of two transitions,\n", "one to **I** and the other to **A** but the ode of **L** only reflects\n", - "the total flow going out of the state. Same can be said for state **I**,\n", + "the total flow going out of the state. The same can be said for state **I**,\n", "where the flow $\\alpha I$ goes to both **R** and **N**. Graphically, it\n", "is a rather simple process as shown below.\n", "\n", @@ -37,54 +37,207 @@ "it into a closed system. The combination of state **D** and **N** is a\n", "constant, the total population. So we can remove **N** and this new\n", "system consist of six transitions. We define them explicitly as ODEs and\n", - "unroll them into transitions.\n", - "\n", - "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'L', 'I', 'A', 'R', 'D'\\]\n", - "\n", - "In \\[2\\]: paramList = \\['beta', 'p', 'kappa', 'alpha', 'f', 'delta',\n", - "'epsilon', 'N'\\]\n", - "\n", - "In \\[3\\]: odeList = \\[ \n", - "...: Transition(origin='S', equation='- beta\\*S/N\\*(I + delta\\*A)',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='L',\n", - "equation='beta\\*S/N\\*(I + delta\\*A) - kappa\\*L',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", - "equation='p\\*kappa\\*L - alpha\\*I', transition_type=TransitionType.ODE),\n", - "...: Transition(origin='A', equation='(1 - p)*kappa* L - epsilon\\*A',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='R',\n", - "equation='f\\*alpha\\*I + epsilon\\*A',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='D',\n", - "equation='(1 - f)*alpha*I', transition_type=TransitionType.ODE) \\]\n", - "\n", - "In \\[4\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", - "\n", - "In \\[5\\]: ode.get_transition_matrix()\n", - "\n", - "In \\[6\\]: ode2 = ode.get_unrolled_obj()\n", - "\n", - "In \\[7\\]: ode2.get_transition_matrix()\n", + "unroll them into transitions.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "df866435", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, 0, 0, 0, 0, 0],\n", + "[0, 0, 0, 0, 0, 0],\n", + "[0, 0, 0, 0, 0, 0],\n", + "[0, 0, 0, 0, 0, 0],\n", + "[0, 0, 0, 0, 0, 0],\n", + "[0, 0, 0, 0, 0, 0]])" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pygom import SimulateOde, Transition, TransitionType\n", "\n", - "In \\[8\\]: ode2.get_ode_eqn()\n", + "stateList = ['S', 'L', 'I', 'A', 'R', 'D']\n", "\n", - "After unrolling the odes, we have the following transition graph\n", + "paramList = ['beta', 'p', 'kappa', 'alpha', 'f', 'delta', 'epsilon', 'N']\n", "\n", - "@savefig sir_unrolled_transition_graph_hard.png In \\[1\\]:\n", - "ode2.get_transition_graph()\n", + "odeList = [Transition(origin='S', equation='- beta*S/N*(I + delta*A)', transition_type=TransitionType.ODE), \n", + " Transition(origin='L', equation='beta*S/N*(I + delta*A) - kappa*L', transition_type=TransitionType.ODE),\n", + " Transition(origin='I', equation='p*kappa*L - alpha*I', transition_type=TransitionType.ODE),\n", + " Transition(origin='A', equation='(1 - p)*kappa* L - epsilon*A', transition_type=TransitionType.ODE),\n", + " Transition(origin='R', equation='f*alpha*I + epsilon*A', transition_type=TransitionType.ODE), \n", + " Transition(origin='D', equation='(1 - f)*alpha*I', transition_type=TransitionType.ODE)]\n", "\n", - "In \\[2\\]: plt.close()\n", + "ode = SimulateOde(stateList, paramList, ode=odeList)\n", "\n", - "In \\[3\\]: print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify())\n", - "\\# difference\n", + "ode.get_transition_matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "39beaaaa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & \\frac{A S \\beta \\delta}{N} + \\frac{I S \\beta}{N} & 0 & 0 & 0 & 0\\\\0 & 0 & L \\kappa p & - L \\kappa p + L \\kappa & 0 & 0\\\\0 & 0 & 0 & 0 & I \\alpha f & - I \\alpha f + I \\alpha\\\\0 & 0 & 0 & 0 & A \\epsilon & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[0, A*S*beta*delta/N + I*S*beta/N, 0, 0, 0, 0],\n", + "[0, 0, L*kappa*p, -L*kappa*p + L*kappa, 0, 0],\n", + "[0, 0, 0, 0, I*alpha*f, -I*alpha*f + I*alpha],\n", + "[0, 0, 0, 0, A*epsilon, 0],\n", + "[0, 0, 0, 0, 0, 0],\n", + "[0, 0, 0, 0, 0, 0]])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode2 = ode.get_unrolled_obj()\n", "\n", - "which is exactly the same apart from slightly weird arrangement of\n", - "symbols in some of the equations. The last line with a value of zero\n", - "also reaffirms the result." + "ode2.get_transition_matrix()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2bfa23c0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- \\frac{A S \\beta \\delta}{N} - \\frac{I S \\beta}{N}\\\\\\frac{A S \\beta \\delta}{N} + \\frac{I S \\beta}{N} - L \\kappa\\\\- I \\alpha + L \\kappa p\\\\- A \\epsilon - L \\kappa p + L \\kappa\\\\A \\epsilon + I \\alpha f\\\\- I \\alpha f + I \\alpha\\end{matrix}\\right]$" + ], + "text/plain": [ + "Matrix([\n", + "[ -A*S*beta*delta/N - I*S*beta/N],\n", + "[A*S*beta*delta/N + I*S*beta/N - L*kappa],\n", + "[ -I*alpha + L*kappa*p],\n", + "[ -A*epsilon - L*kappa*p + L*kappa],\n", + "[ A*epsilon + I*alpha*f],\n", + "[ -I*alpha*f + I*alpha]])" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode2.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "ee801c33", + "metadata": {}, + "source": [ + "After unrolling the ODEs, we can extract the following transition graph." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2361a071", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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vLw8vv76a3bu3MmTTz5Jv3795NSP5JoQQnD27Fk++ugjTp48ydixY+nRo8d1eZvV6/WsWbOG77//nl69eikVlq/l4SWEUKZ6jEYjaWlpHD16lJMnT5KcnExJSQkODg54eHjQqlUrwsLCCAkJISgoqMESTDVHKioq+OWXX/jvf/9LXFwco0aNUqwf9XUOrdeytLSUNWvWsGrVKiIiInjyyScJDw+vl2NcDzIzMzl06NBFOcP0ej1z585l6tSpDZpNuq4cPHiQ999/ny+++KLO40tlZSXBwcGsXLmS2267jeXLl7N06VLWrFlTZ+uKEILExERef/11lixZgk6nu3kLGdaGdd78vffeY9WqVcycOZNu3boxaNAgxfxZn5hMJnJzc9mwYQNr164lLi6O9957jxYtWjS6v4HkxkWlUuHl5cX06dP5+++/WbJkCb/++ivDhw8nOjq63h3qhBAUFRWxf/9+JXX41KlTad++fZ0EktX/wZq5t3Xr1rRu3Vp5iy0uLqaoqEhJXb5582YyMjKorq7GxcWFFi1aEBYWRqtWrfD29lbeMhsjjXlTxGKxcOrUKRYsWICNjQ2vv/46rVq1ahArlfVauru788ADD5CQkMAvv/zCzJkzGTFiBHfccUeTT81gMpn4+eef+eabb+jSpYuSMXnLli2KE2tSUhLZ2dkMHDiwkVtbO6dPnyYsLKzeX4SNRiOFhYVKeHRdUalU+Pr6YjabKSoqqhF4c7U0S7EC506Sh4cHjz32GAMHDmTlypVMnz6dwMBA7rjjDnr06IGzs/NVO9tZDVFms5nq6mr279/Phg0bOHr0KNHR0cyYMUNJwy0fpJL6QKfT0adPH7p27cq6detYuHAhQggSEhLo168f/v7+l3TwvBznWzySk5PZtGkTf//9N87Oztx777307du3QX1lVCoVOp0OPz8/fH19iY6O5tZbbwXO/X3l5OSQlpZGWloaZ86c4e+//6asrAyDwYCzszPBwcGEhYURGhpKeHi4Ms9+vqNtc/4btDrG/u9//+ODDz7g/vvv57777rtu/k1qtRofHx+eeuopunfvzrx580hKSuLpp59u0hax8vJygoKClESkd9xxByrVuUrihw4dory8HLPZTPv27RFCKC+iiYmJDB48mA4dOjS6r05xcXG91Pg6n//85z+sXLmSmJgYXnzxxXq7fk5OTjg6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", + "text/plain": [ + "
        " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nL\n\nL\n\n\n\nS->L\n\n\nA*S*β*δ/N + I*S*β/N\n\n\n\nI\n\nI\n\n\n\nL->I\n\n\nL*κ*p\n\n\n\nA\n\nA\n\n\n\nL->A\n\n\n-L*κ*p + L*κ\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nI*α*f\n\n\n\nD\n\nD\n\n\n\nI->D\n\n\n-I*α*f + I*α\n\n\n\nA->R\n\n\nA*ε\n\n\n\n", + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ode2.get_transition_graph()" + ] + }, + { + "cell_type": "markdown", + "id": "599030a9", + "metadata": {}, + "source": [ + "There is a slight difference in the arrangement of terms, but this matches what we were expecting our transition graph to look like. We can reaffirm this by algebraically comparing the two ODE systms." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eeab1ca9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n" + ] + } + ], + "source": [ + "print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify())" ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 6eda8218e461211773684182f27af2e11885e1b0 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:06:52 +0100 Subject: [PATCH 107/188] add pygom build and install --- .github/workflows/book.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 4174495d..228283bc 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -1,4 +1,4 @@ -name: deploy-book +name: build-book # only run when specific files change # only run on install-fix-docs branch @@ -29,6 +29,12 @@ jobs: run: | pip install -r requirements.txt + # set up pygom + - name: Build and install pygom + run: | + python setup.py build + python setup.py install + # build the book - name: Build the book run: | From 05cb7c1d7a5647c2cb444cafc901681cfef76f9a Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:16:02 +0100 Subject: [PATCH 108/188] correct filepath --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 669de051..416f2bf4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,6 @@ __pycache__ .settings # For built documentation -/docs/pygom-doc/_build* +/docs/pygom-doc/_build /doc/_build /doc/source/savefig/* From 3dc4a1ea5340fa3b4a1f5edb72eaf0e1a926df64 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:38:03 +0100 Subject: [PATCH 109/188] additional requirements for CI --- .github/workflows/book.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 228283bc..b1b627da 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -13,11 +13,28 @@ on: - docs/** jobs: - deploy-book: + build-book: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: actions/cache@v1 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + + + - name: Set up Python + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Check python version + run: python -c "import sys; print(sys.version)" + # install python - name: Set up Python 3.8 uses: actions/setup-python@v2 @@ -27,6 +44,7 @@ jobs: # install dependencies - name: Install dependencies run: | + python -m pip install --upgrade pip pip install -r requirements.txt # set up pygom From d3a17679cf59a68bd9fa21b0ab8e40628d140161 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:38:43 +0100 Subject: [PATCH 110/188] starting to edit file --- docs/pygom-doc/notebooks/epi.ipynb | 46 +++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/docs/pygom-doc/notebooks/epi.ipynb b/docs/pygom-doc/notebooks/epi.ipynb index 48711b33..695f7678 100644 --- a/docs/pygom-doc/notebooks/epi.ipynb +++ b/docs/pygom-doc/notebooks/epi.ipynb @@ -4,21 +4,37 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Simple Epidemic Analysis\n", + "# Epidemic Analysis\n", "\n", - "A common application of ordinary differential equations is in the field\n", - "of epidemiology modeling. More concretely, compartmental models that is\n", - "used to describe disease progression. We demonstrate some of the simple\n", - "algebraic analysis one may wish to take when given a compartment model.\n", - "Our use one of the simplest model, an SIR model with birth and death\n", - "processes, which is an extension of the one in `sir`. First, we\n", - "initialize the model below.\n", + "A common application of ODEs is in the field\n", + "of epidemiology modeling, where compartmental models are\n", + "used to describe disease progression through a population. \n", + "We demonstrate some of the simpler algebraic analysis that you may wish to undertake on a compartmental model.\n", "\n", - "In \\[1\\]: from pygom import common_models\n", + "We revist the SIR model with birth and death\n", + "processes, which is an extension of the one in `sir`. \n", "\n", - "In \\[2\\]: ode = common_models.SIR_Birth_Death()\n", + "First, we initialize the model, this time by importing it from `common_models`, rather than constructing it ourselves." + ] + }, + { + "cell_type": "markdown", + "id": "8c84ea26", + "metadata": {}, + "source": [ + "\n", + "from pygom import common_models\n", "\n", - "In \\[3\\]: print(ode.get_ode_eqn())\n", + "ode = common_models.SIR_Birth_Death()\n", + "\n", + "print(ode.get_ode_eqn())" + ] + }, + { + "cell_type": "markdown", + "id": "ea8c4b15", + "metadata": {}, + "source": [ "\n", "## Obtaining the R0\n", "\n", @@ -64,7 +80,11 @@ ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 83c910d2f5cf2f0c8557b556968e70f70ed2c20b Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:42:55 +0100 Subject: [PATCH 111/188] remove error code --- .github/workflows/book.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index b1b627da..089502da 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -54,9 +54,10 @@ jobs: python setup.py install # build the book + # TODO check which flags are needed, -W - name: Build the book run: | - jupyter-book build --all -v -W docs/pygom-doc + jupyter-book build --all -v docs/pygom-doc # deploy book to github-pages - name: GitHub Pages From a300153941aa3db50030af8e4cf760c0d0461eec Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 15:48:07 +0100 Subject: [PATCH 112/188] typos --- docs/pygom-doc/_toc.yml | 1 - docs/pygom-doc/md/unrollOde.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 185dc0f7..3c466fcb 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -6,7 +6,6 @@ root: intro parts: - caption: User documentation chapters: - - file: markdown.md - file: md/getting_started.md - file: notebooks/sir.ipynb - file: notebooks/transition.ipynb diff --git a/docs/pygom-doc/md/unrollOde.md b/docs/pygom-doc/md/unrollOde.md index 9da3bd11..332f6e22 100644 --- a/docs/pygom-doc/md/unrollOde.md +++ b/docs/pygom-doc/md/unrollOde.md @@ -1,4 +1,4 @@ -# Convert ODE into transitions +# Converting equations into transitions As seen previously in `transition`{.interpreted-text role="ref"}, we can define the model via the transitions or explicitly as ODEs. There are From 890dc0f65b298a660821b073fdb35e2bd39a43ac Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 17:19:06 +0100 Subject: [PATCH 113/188] add graphviz --- .github/workflows/book.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 089502da..7ae76736 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -24,17 +24,13 @@ jobs: key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - - - - - name: Set up Python - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - - name: Check python version - run: python -c "import sys; print(sys.version)" - + steps: + + - uses: actions/checkout@v3 + + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@v1 + # install python - name: Set up Python 3.8 uses: actions/setup-python@v2 From cbfe09d2b5aba3733f6109c474bf6f3f95a240ec Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 11 Jul 2023 17:33:40 +0100 Subject: [PATCH 114/188] attempt to add autodocstrings to documentation --- docs/pygom-doc/_config.yml | 2 ++ docs/pygom-doc/autodoc.rst | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 docs/pygom-doc/autodoc.rst diff --git a/docs/pygom-doc/_config.yml b/docs/pygom-doc/_config.yml index 192865ab..8a49af3e 100644 --- a/docs/pygom-doc/_config.yml +++ b/docs/pygom-doc/_config.yml @@ -29,6 +29,8 @@ sphinx: bibtex_reference_style: author_year # TODO change md to bibtex bibtex_bibfiles: "ref.md" + extra_extensions: + - 'sphinx.ext.autodoc' # Information about where the book exists on the web repository: diff --git a/docs/pygom-doc/autodoc.rst b/docs/pygom-doc/autodoc.rst new file mode 100644 index 00000000..c3111c90 --- /dev/null +++ b/docs/pygom-doc/autodoc.rst @@ -0,0 +1,5 @@ +Code documentation +============= + +.. automodule:: pygom.pygom + :members: \ No newline at end of file From ab117fcbbe0062f3fde67b208fb016369493d485 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 21 Jul 2023 15:18:01 +0100 Subject: [PATCH 115/188] edit docstring links --- docs/pygom-doc/notebooks/sir.ipynb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/pygom-doc/notebooks/sir.ipynb b/docs/pygom-doc/notebooks/sir.ipynb index 7e6246c1..f90e3e31 100644 --- a/docs/pygom-doc/notebooks/sir.ipynb +++ b/docs/pygom-doc/notebooks/sir.ipynb @@ -114,7 +114,7 @@ "metadata": {}, "source": [ "```{note}\n", - "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", + "Here, we have invoked a class from {class}`.Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", "```" ] }, @@ -257,9 +257,8 @@ "id": "79c154ba", "metadata": {}, "source": [ - "#TODO links to unroll\n", - "Here the SIR model was provided to PyGOM as a set ODEs by using the `Transition` to define them. \n", - "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section `unrollOde` for more information, and in particular `unrollSimple` for the continuing demonstration of the SIR model." + "Here the SIR model was provided to PyGOM as a set ODEs by using the {class}`.Transition` to define them. \n", + "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section {doc}`unrollOde` for more information, and in particular {doc}`unrollSimple` for the continuing demonstration of the SIR model." ] }, { @@ -354,6 +353,7 @@ "metadata": {}, "source": [ "#TODO unsure if this is needed\n", + "\n", "There is currently no mechanism to set the numeric initial conditions the states when the states are defined. This is because of an implementation issue with external package, such as solving an initial value problem." ] }, @@ -654,7 +654,6 @@ "id": "2f64d869", "metadata": {}, "source": [ - "#TODO links\n", "This concludes the introductory example and we will be moving on to look at parameter estimation next in {doc}`estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in {doc}`transition`." ] } From f102ba30e1cbab349857780adb7ec929712024bf Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Fri, 21 Jul 2023 15:22:55 +0100 Subject: [PATCH 116/188] update docstring creation --- docs/pygom-doc/autodoc-loss.rst | 9 +++++++++ docs/pygom-doc/autodoc-model.rst | 11 +++++++++++ docs/pygom-doc/autodoc.rst | 5 ----- 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 docs/pygom-doc/autodoc-loss.rst create mode 100644 docs/pygom-doc/autodoc-model.rst delete mode 100644 docs/pygom-doc/autodoc.rst diff --git a/docs/pygom-doc/autodoc-loss.rst b/docs/pygom-doc/autodoc-loss.rst new file mode 100644 index 00000000..e5a8afc3 --- /dev/null +++ b/docs/pygom-doc/autodoc-loss.rst @@ -0,0 +1,9 @@ +Module: loss +============= + +.. automodule:: pygom.loss + :members: + +.. autosummary:: + :toctree: _autosummary + :recursive: \ No newline at end of file diff --git a/docs/pygom-doc/autodoc-model.rst b/docs/pygom-doc/autodoc-model.rst new file mode 100644 index 00000000..1426e052 --- /dev/null +++ b/docs/pygom-doc/autodoc-model.rst @@ -0,0 +1,11 @@ +Module: model +============= + +.. automodule:: pygom.model + :members: + +.. autosummary:: + :toctree: _autosummary + :recursive: + + \ No newline at end of file diff --git a/docs/pygom-doc/autodoc.rst b/docs/pygom-doc/autodoc.rst deleted file mode 100644 index c3111c90..00000000 --- a/docs/pygom-doc/autodoc.rst +++ /dev/null @@ -1,5 +0,0 @@ -Code documentation -============= - -.. automodule:: pygom.pygom - :members: \ No newline at end of file From 20594df3a753bb5e4917194f47ac3135e3ca826f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Sun, 27 Aug 2023 16:18:56 +0100 Subject: [PATCH 117/188] reformatted ipynb --- docs/pygom-doc/notebooks/epi.ipynb | 157 +++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 30 deletions(-) diff --git a/docs/pygom-doc/notebooks/epi.ipynb b/docs/pygom-doc/notebooks/epi.ipynb index 695f7678..8b47d848 100644 --- a/docs/pygom-doc/notebooks/epi.ipynb +++ b/docs/pygom-doc/notebooks/epi.ipynb @@ -11,23 +11,32 @@ "used to describe disease progression through a population. \n", "We demonstrate some of the simpler algebraic analysis that you may wish to undertake on a compartmental model.\n", "\n", - "We revist the SIR model with birth and death\n", - "processes, which is an extension of the one in `sir`. \n", + "We revisit the SIR model with birth and death\n", + "processes, which is an extension of the one in {doc}`sir`. \n", "\n", - "First, we initialize the model, this time by importing it from `common_models`, rather than constructing it ourselves." + "First, we initialize the model, this time by importing it from {mod}`.common_models`, rather than constructing it ourselves." ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 1, "id": "8c84ea26", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Matrix([[B - I*S*beta - S*mu], [I*S*beta - I*gamma - I*mu], [I*gamma]])\n" + ] + } + ], "source": [ - "\n", "from pygom import common_models\n", "\n", "ode = common_models.SIR_Birth_Death()\n", "\n", - "print(ode.get_ode_eqn())" + "ode.get_ode_eqn()" ] }, { @@ -36,53 +45,141 @@ "metadata": {}, "source": [ "\n", - "## Obtaining the R0\n", + "## Obtaining the reproduction number (R0)\n", "\n", "The reproduction number, also known as the $R_{0}$, is the single most\n", - "powerful piece and reduced piece of information available from a\n", - "compartmental model. In a nutshell, it provides a single number - if the\n", - "parameters are known - which can the intuitive interpretation where\n", - "$R_{0} = 1$ defines the tipping point of an outbreak. A $R_{0}$ value of\n", - "more than one signifies an potential outbreak where less than one\n", + "powerful piece and reduced piece of information available from an epidemiological\n", + "compartmental model. This value represents the number of the disease-naive population who can be infected by a single member of the infectious population. When the parameter values are known, $R_{0}$ provides a single number which can then lead to an interpretation of the system, where $R_{0} = 1$ defines the tipping point of an outbreak. An $R_{0}$ value of\n", + "more than one signifies growth of cases (a potential outbreak), and an $R_{0}$ of less than one\n", "indicates that the disease will stop spreading naturally.\n", "\n", - "To obtain the $R_{0}$, we simply have to tell the function which states\n", + "#TODO reference\n", + "\n", + "To obtain the $R_{0}$, we need have to tell the {func}`.R0` function which states\n", "represent the *disease state*, which in this case is the state **I**.\n", "\n", - "In \\[1\\]: from pygom.model.epi_analysis import \\*\n", + "#TODO is this the disease state, or the infectious state?" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d66498eb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$\\displaystyle \\frac{B \\beta}{\\mu \\left(\\gamma + \\mu\\right)}$" + ], + "text/plain": [ + "B*beta/(mu*(gamma + mu))" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pygom.model.epi_analysis import *\n", "\n", - "In \\[2\\]: print(R0(ode, 'I'))\n", + "R0(ode, 'I')" + ] + }, + { + "cell_type": "markdown", + "id": "0130ca70", + "metadata": {}, + "source": [ "\n", "## Algebraic R0\n", "\n", "We may also wish to get the $R_{0}$ in pure algebraic term. This can be\n", - "achieved by the following few lines. Note that the result below is\n", + "achieved by the following few lines of code. Note that the result below is\n", "slightly different from the one above. The difference is due to the\n", - "internal working of the functions, where `getR0` computes the\n", - "disease-free equilibrium value for the states and substitute them back\n", - "into the equation.\n", - "\n", - "In \\[1\\]: F, V = disease_progression_matrices(ode, 'I')\n", - "\n", - "In \\[2\\]: e = R0_from_matrix(F, V)\n", + "internal working of the functions, where {func}`.getR0` computes the\n", + "disease-free equilibrium value for the states and substitutes them back\n", + "into the equation." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "717c6868", + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'disease_progression_matrices' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m F, V \u001b[39m=\u001b[39m disease_progression_matrices(ode, \u001b[39m'\u001b[39m\u001b[39mI\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m 3\u001b[0m e \u001b[39m=\u001b[39m R0_from_matrix(F, V)\n\u001b[0;32m 5\u001b[0m \u001b[39mprint\u001b[39m(e)\n", + "\u001b[1;31mNameError\u001b[0m: name 'disease_progression_matrices' is not defined" + ] + } + ], + "source": [ + "F, V = disease_progression_matrices(ode, 'I')\n", "\n", - "In \\[3\\]: print(e)\n", + "e = R0_from_matrix(F, V)\n", "\n", + "print(e)\n" + ] + }, + { + "cell_type": "markdown", + "id": "a8c270b9", + "metadata": {}, + "source": [ "To replicate the output before, we have to find the values where the\n", "disease-free equilibrium will be achieved. Substitution can then be\n", - "performed to retrieve $R_{0}$ in pure parameters.\n", - "\n", - "In \\[1\\]: dfe = DFE(ode, \\['I'\\])\n", + "performed to retrieve $R_{0}$ in pure parameters." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa0cc36c", + "metadata": { + "vscode": { + "languageId": "javascript" + } + }, + "outputs": [], + "source": [ + "dfe = DFE(ode, ['I'])\n", "\n", - "In \\[2\\]: print(dfe)\n", + "print(dfe)\n", "\n", - "In \\[3\\]: print(e\\[0\\].subs(dfe))" + "print(e[0].subs(dfe))" ] } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, From c3c328e593bb9ee31dd0b824570c559886749740 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Sun, 27 Aug 2023 17:08:24 +0100 Subject: [PATCH 118/188] update unroll documents --- docs/pygom-doc/md/unrollOde.md | 13 +++++---- .../notebooks/unroll/unrollHard.ipynb | 28 ++++++++++++++++--- .../notebooks/unroll/unrollSimple.ipynb | 24 ++++++++++++---- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/docs/pygom-doc/md/unrollOde.md b/docs/pygom-doc/md/unrollOde.md index 332f6e22..5b53d60c 100644 --- a/docs/pygom-doc/md/unrollOde.md +++ b/docs/pygom-doc/md/unrollOde.md @@ -1,6 +1,6 @@ # Converting equations into transitions -As seen previously in `transition`{.interpreted-text role="ref"}, we can +As seen previously in {doc}`transition`, we can define the model via the transitions or explicitly as ODEs. There are times when we all just want to test out some model in a paper and the only available information are the ODEs themselves. Even though we know @@ -8,8 +8,9 @@ that the ODEs come from some underlying transitions, breaking them down can be a time consuming process. We provide the functionalities to do this automatically. -::: {.toctree} -unroll/unrollSimple.rst -unroll/unrollBD.rst -unroll/unrollHard.rst -::: + +{doc}`../notebooks/unroll/unrollSimple` + +{doc}`../notebooks/unroll/unrollBD` + +{doc}`../notebooks/unroll/unrollHard` diff --git a/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb b/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb index d57d339e..f178daa7 100644 --- a/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb +++ b/docs/pygom-doc/notebooks/unroll/unrollHard.ipynb @@ -8,7 +8,14 @@ "\n", "Now we turn to a harder problem that does not have a one to one mapping\n", "between all the transitions and the terms in the ODEs. We use the model\n", - "in `Influenza_SLIARN`, defined by\n", + "in {doc}`Influenza_SLIARN`, defined by" + ] + }, + { + "cell_type": "markdown", + "id": "2f468e1e", + "metadata": {}, + "source": [ "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= -S \\beta (I + \\delta A) \\\\ \n", @@ -23,15 +30,28 @@ "one to **I** and the other to **A** but the ode of **L** only reflects\n", "the total flow going out of the state. The same can be said for state **I**,\n", "where the flow $\\alpha I$ goes to both **R** and **N**. Graphically, it\n", - "is a rather simple process as shown below.\n", - "\n", + "is a rather simple process as shown below." + ] + }, + { + "cell_type": "markdown", + "id": "709d6c69", + "metadata": {}, + "source": [ "digraph SLIARD_Model { \n", "labelloc = \"t\"; label = \"Original transitions\"; rankdir=LR; size=\"8\"\n", "node \\[shape = circle\\]; S -\\> L \\[ label = \"-Sβ(I + δA)/N\" \\]; L -\\> I\n", "\\[ label = \"κLp\" \\]; L -\\> A \\[ label = \"κL(1-p)\" \\]; I -\\> R \\[ label =\n", "\"αIf\" \\]; I -\\> D \\[ label = \"αI(1-f)\" \\]; A -\\> R \\[ label = \"ηA\" \\];\n", "\n", - "}\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "db8a91f0", + "metadata": {}, + "source": [ "\n", "We slightly change the model by introducing a new state **D** to convert\n", "it into a closed system. The combination of state **D** and **N** is a\n", diff --git a/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb b/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb index 55772cb3..1aa9646b 100644 --- a/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb +++ b/docs/pygom-doc/notebooks/unroll/unrollSimple.ipynb @@ -14,15 +14,27 @@ "\\frac{dR}{dt} &= \\gamma I.\n", "\\end{aligned}$$\n", "\n", - "which consists of two transitions\n", + "which consists of two transitions" + ] + }, + { + "cell_type": "markdown", + "id": "336381fa", + "metadata": {}, + "source": [ "\n", "digraph SIR_Model { \n", "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", "\\]; I -\\> R \\[ label = \"γI\" \\];\n", - "\n", - "}\n", - "\n", - "We can define this as an ODE, as seen in {}[sir.ipynb]" + "}" + ] + }, + { + "cell_type": "markdown", + "id": "160f9040", + "metadata": {}, + "source": [ + "We can define this as an ODE, as seen in {doc}`sir`." ] }, { @@ -73,7 +85,7 @@ "source": [ "\n", "and the last line shows that the transition matrix is empty. This is the\n", - "expected result because `SimulateOdeModel` was not initialized using\n", + "expected result because {class}`.SimulateOdeModel` was not initialized using\n", "transitions. We can populate the transition matrix by calling an algorithm to extract the flow information, and can see that the output matches that from {ref}`transition:defining-the-equations`." ] }, From e1d410d2653b951a1857fb8e5f42e77e9451e1fe Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Sun, 27 Aug 2023 17:48:23 +0100 Subject: [PATCH 119/188] reformatted ipynb --- docs/pygom-doc/notebooks/epijson.ipynb | 122 +++++++++++++++++++------ 1 file changed, 92 insertions(+), 30 deletions(-) diff --git a/docs/pygom-doc/notebooks/epijson.ipynb b/docs/pygom-doc/notebooks/epijson.ipynb index 1df66d51..8d7e282a 100644 --- a/docs/pygom-doc/notebooks/epijson.ipynb +++ b/docs/pygom-doc/notebooks/epijson.ipynb @@ -8,58 +8,120 @@ "\n", "Epidemiology data is complicated due to the many different stages a\n", "patient can go through and whether a modeling technique is applicable\n", - "depends heavily on the recording of data. EpiJSON is a framework whih\n", - "tries to captures all the information [\\[Finnie2016\\]](), in a JSON\n", - "format as the name suggests.\n", + "depends heavily on the recording of data. [EpiJSON](https://github.com/Hackout2/EpiJSON) is a framework which\n", + "tries to captures all the information in a JSON format {cite:ts}`Finnie2016` [\\[Finnie2016\\]](),.\n", "\n", - "This package provides the functionality to process EpiJSON data. Due to\n", - "the nature of this package, modeling of ode, it processes the data file\n", - "with this in mind. The output is therefore in the cumulative form as\n", - "default, shown below, in a `pandas.DataFrame` format. The input can be\n", - "in a string format, a file or already a `dict`.\n", + "PyGOM provides the functionality to process EpiJSON data. Due to\n", + "the nature of this package, modeling of ODEs, data files are processed with this in mind. The output is therefore in the cumulative form as\n", + "default, shown below, in a `pandas.DataFrame` format. \n", "\n", - "In \\[1\\]: from pygom.loss.read_epijson import epijson_to_data_frame\n", + "#TODO unsure what this means\n", "\n", - "In \\[2\\]: import pkgutil\n", "\n", - "In \\[3\\]: data = pkgutil.get_data('pygom', 'data/eg1.json')\n", - "\n", - "In \\[3\\]: df = epijson_to_data_frame(data)\n", + "The input can be\n", + "in a string format, a file or already a `dict`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cea94b62", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom.loss.read_epijson import epijson_to_data_frame\n", "\n", - "In \\[4\\]: print(df)\n", + "import pkgutil\n", "\n", - "Given that the aim of loading the data is usually for model fitting, we\n", - "allow EpiJSON as input directly to the loss class\n", - "`pygom.loss.EpijsonLoss` which uses the Poisson loss under the hood.\n", + "data = pkgutil.get_data('pygom', 'data/eg1.json')\n", "\n", - "In \\[1\\]: from pygom.model import common_models\n", + "df = epijson_to_data_frame(data)\n", "\n", - "In \\[2\\]: from pygom.loss.epijson_loss import EpijsonLoss\n", + "print(df)" + ] + }, + { + "cell_type": "markdown", + "id": "04004708", + "metadata": {}, + "source": [ "\n", - "In \\[3\\]: ode = common_models.SIR(\\[0.5, 0.3\\])\n", + "Given that the aim of loading the data is usually for model fitting, we\n", + "allow EpiJSON as an input directly to the loss class\n", + "{class}`.EpijsonLoss` which uses the Poisson loss under the hood." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a3cfb9b", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom.model import common_models\n", "\n", - "In \\[4\\]: obj = EpijsonLoss(\\[0.005, 0.03\\], ode, data, 'Death', 'R',\n", - "\\[300, 2, 0\\])\n", + "from pygom.loss.epijson_loss import EpijsonLoss\n", "\n", - "In \\[5\\]: print(obj.cost())\n", + "ode = common_models.SIR([0.5, 0.3])\n", "\n", - "In \\[6\\]: print(obj.\\_df)\n", + "obj = EpijsonLoss([0.005, 0.03], ode, data, 'Death', 'R', [300, 2, 0])\n", "\n", + "print(obj.cost())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "09c0cfcd", + "metadata": {}, + "outputs": [], + "source": [ + "print(obj._df)" + ] + }, + { + "cell_type": "markdown", + "id": "a5ac54c8", + "metadata": {}, + "source": [ "Given an initialized object, all the operations are inherited from\n", - "`pygom.loss.BaseLoss`. We demonstrated above how to calculate the cost\n", + "{class}`.BaseLoss`. We demonstrated above how to calculate the cost\n", "and the rest will not be shown for brevity. The data frame is stored\n", "inside of the loss object and can be retrieved for inspection at any\n", "time point.\n", "\n", - "Rather unfortunately, initial values for the states is still required,\n", + "```{note}\n", + "Initial values for the states are required,\n", "but the time is not. When the time is not supplied, then the first time\n", "point in the data will be treated as $t0$. The input Death indicate which column of the data is used\n", - "and $R$ the corresponding state the data belongs to." + "class=\"title-ref\">Death indicates which column of the data is used\n", + "and $R$ the corresponding state the data belongs to.\n", + "```" ] + }, + { + "cell_type": "markdown", + "id": "43b2e082", + "metadata": {}, + "source": [] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 295d637d846ba1e1d6f0707fb030ff2366ba9711 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Sun, 27 Aug 2023 22:11:48 +0100 Subject: [PATCH 120/188] change title to be more descriptive --- docs/pygom-doc/notebooks/transition.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pygom-doc/notebooks/transition.ipynb b/docs/pygom-doc/notebooks/transition.ipynb index bea1277f..fc65bc5a 100644 --- a/docs/pygom-doc/notebooks/transition.ipynb +++ b/docs/pygom-doc/notebooks/transition.ipynb @@ -4,10 +4,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Transition Object\n", + "# Model set-up using the transition object\n", "\n", "\n", - "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", + "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our book-keeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", "\n", "\n", "All transitions that get fed into the ODE system need to be defined as a transition object, `Transition`. It takes a total of four input arguments:\n", From 0498c466f22a7290bd3261499224e47d27bcce11 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Sun, 27 Aug 2023 22:17:01 +0100 Subject: [PATCH 121/188] add a parameter intro section file --- docs/pygom-doc/md/parameter_fitting.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docs/pygom-doc/md/parameter_fitting.md diff --git a/docs/pygom-doc/md/parameter_fitting.md b/docs/pygom-doc/md/parameter_fitting.md new file mode 100644 index 00000000..4b252c67 --- /dev/null +++ b/docs/pygom-doc/md/parameter_fitting.md @@ -0,0 +1,17 @@ +# Parameter fitting + +The following notebooks will demonstrate how to use the parameter fitting options within PyGOM. + +{doc}`../notebooks/paramfit/bvpSimple` + +{doc}`../notebooks/paramfit/gradient` + +{doc}`../notebooks/paramfit/fh` + +{doc}`../notebooks/paramfit/estimate1` + +{doc}`../notebooks/paramfit/estimate2` + +{doc}`../notebooks/paramfit/initialGuess` + +{doc}`../notebooks/paramfit/profile` \ No newline at end of file From d1d2753d616e45fea555bd0a91709abc5ff69104 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Sun, 27 Aug 2023 22:18:10 +0100 Subject: [PATCH 122/188] change parameter fitting pile faths --- docs/pygom-doc/_toc.yml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 3c466fcb..96bb1ff9 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -17,13 +17,15 @@ parts: - file: notebooks/unroll/unrollHard.ipynb - file: notebooks/epi.ipynb - file: notebooks/epijson.ipynb - - file: notebooks/bvpSimple.ipynb - - file: notebooks/gradient.ipynb - - file: notebooks/fh.ipynb - - file: notebooks/estimate1.ipynb - - file: notebooks/estimate2.ipynb - - file: notebooks/initialGuess.ipynb - - file: notebooks/profile.ipynb + - file: md/parameter_fitting.md + sections: + - file: notebooks/paramfit/bvpSimple.ipynb + - file: notebooks/paramfit/gradient.ipynb + - file: notebooks/paramfit/fh.ipynb + - file: notebooks/paramfit/estimate1.ipynb + - file: notebooks/paramfit/estimate2.ipynb + - file: notebooks/paramfit/initialGuess.ipynb + - file: notebooks/paramfit/profile.ipynb - caption: Common biological compartmental models chapters: - file: md/common_models.md @@ -46,10 +48,12 @@ parts: # - caption: Frequently asked questions # chapters: # - file: md/faq.md -## - caption: Code documentation -## chapters: -## - file: + - caption: Code documentation + chapters: + - file: autodoc-model.rst + - file: autodoc-loss.rst # - caption: References +# https://jupyterbook.org/en/stable/content/citations.html#id6 # chapters: # - file: md/ref.md ## - caption: Indices and tables From 37170c6bbde0df4d19f8d00f82ddcabd85cab6db Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 11:03:47 +0100 Subject: [PATCH 123/188] update docs requirements --- docs/pygom-doc/requirements.txt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/pygom-doc/requirements.txt b/docs/pygom-doc/requirements.txt index 7e821e45..4e490b8a 100644 --- a/docs/pygom-doc/requirements.txt +++ b/docs/pygom-doc/requirements.txt @@ -1,3 +1,15 @@ +dask[complete]>=0.13.0 +graphviz>=0.4.9 +matplotlib>=1.0.0 +numpy>=1.6.0 +pandas>=0.15.0 +python-dateutil>=2.0.0 +scipy>=1.4.1 +sympy>=1.0.0 +numpydoc>=0.6.0 +sphinx>=1.4.1 +sphinx_rtd_theme>=0.2.0 +cython>=0.29 +nbsphinx jupyter-book -matplotlib -numpy +docutils==0.17.1 \ No newline at end of file From 705732d90acf4de5e89b2153258a703d13418425 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 11:05:11 +0100 Subject: [PATCH 124/188] start reformatting bibliography files --- docs/pygom-doc/md/bib.md | 1 + docs/pygom-doc/ref.bib | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 docs/pygom-doc/md/bib.md create mode 100644 docs/pygom-doc/ref.bib diff --git a/docs/pygom-doc/md/bib.md b/docs/pygom-doc/md/bib.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/docs/pygom-doc/md/bib.md @@ -0,0 +1 @@ + diff --git a/docs/pygom-doc/ref.bib b/docs/pygom-doc/ref.bib new file mode 100644 index 00000000..6e6ecea9 --- /dev/null +++ b/docs/pygom-doc/ref.bib @@ -0,0 +1,6 @@ + +@article{Finnie2016 +, title = {piJSON: A unified data-format for epidemiology} +, author = {Thomas Finnie et al.} +, journal = {Epidemics} +} \ No newline at end of file From 1f5d6c370af0ade18af7c98eee3426f34ecdabb6 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 11:13:43 +0100 Subject: [PATCH 125/188] reformatting ipynb, also addresses #89 --- .../notebooks/paramfit/bvpSimple.ipynb | 198 ++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb diff --git a/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb b/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb new file mode 100644 index 00000000..6ca0ce57 --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb @@ -0,0 +1,198 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Solving Boundary Value Problems\n", + "\n", + "In addition to finding solutions for an IVP and estimate the unknown\n", + "parameters, this package also allows you to solve BVP with a little bit\n", + "of imagination. Here, we are going to show how a BVP can be solved by\n", + "treating it as a parameter estimation problem. Essentially, a shooting\n", + "method where the first boundary condition defines the initial condition\n", + "of an IVP and the second boundary condition is an observation. Two\n", + "examples, both from MATLAB[1], will be shown here.\n", + "\n", + "## Simple model 1\n", + "\n", + "We are trying to find the solution to the second order differential\n", + "equation\n", + "\n", + "$$\\nabla^{2} y + |y| = 0$$\n", + "\n", + "subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert\n", + "this into a set of first order ODE\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{d y_{0}}{dt} &= y_{1} \\\\\n", + "\\frac{d y_{1}}{dt} &= -|y_{0}|\n", + "\\end{aligned}$$\n", + "\n", + "using an auxiliary variable $y_{1} = \\nabla y$ and $y_{0} = y$. Setting\n", + "up the system below\n", + "\n", + "In \\[1\\]: from pygom import Transition, TransitionType,\n", + "DeterministicOde, SquareLoss\n", + "\n", + "In \\[1\\]: import matplotlib.pyplot as plt\n", + "\n", + "In \\[2\\]: stateList = \\['y0', 'y1'\\]\n", + "\n", + "In \\[3\\]: paramList = \\[\\]\n", + "\n", + "In \\[4\\]: ode1 = Transition(origin='y0', \n", + "...: equation='y1', ...: transition_type=TransitionType.ODE)\n", + "\n", + "In \\[5\\]: ode2 = Transition(origin='y1', \n", + "...: equation='-abs(y0)', ...: transition_type=TransitionType.ODE)\n", + "\n", + "In \\[6\\]: model = DeterministicOde(stateList, \n", + "...: paramList, ...: ode=\\[ode1, ode2\\])\n", + "\n", + "In \\[7\\]: model.get_ode_eqn()\n", + "\n", + "We check that the equations are correct before proceeding to set up our\n", + "loss function.\n", + "\n", + "In \\[1\\]: import numpy\n", + "\n", + "In \\[2\\]: from scipy.optimize import minimize\n", + "\n", + "In \\[3\\]: initialState = \\[0.0, 1.0\\]\n", + "\n", + "In \\[4\\]: t = numpy.linspace(0, 4, 100)\n", + "\n", + "In \\[5\\]: model.initial_values = (initialState, t\\[0\\])\n", + "\n", + "In \\[6\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[7\\]: f = plt.figure()\n", + "\n", + "@savefig bvp1_random_guess_plot.png In \\[8\\]: model.plot()\n", + "\n", + "In \\[9\\]: plt.close()\n", + "\n", + "Setting up the second boundary condition $y(4) = -2$ is easy, because\n", + "that is just a single observation attached to the state $y_{1}$.\n", + "Enforcing the first boundary condition requires us to set it as the\n", + "initial condition. Because the condition only states that $y(0) = 0$,\n", + "the starting value of the other state $y_1$ is free. We let our loss\n", + "object know that it is free through the targetState input argument.\n", + "\n", + "In \\[10\\]: theta = \\[0.0\\]\n", + "\n", + "In \\[11\\]: obj = SquareLoss(theta=theta, \n", + ".…: ode=model, .…: x0=initialState, .…: t0=t\\[0\\], .…: t=t\\[-1\\], .…:\n", + "y=\\[-2\\], .…: state_name=\\['y0'\\], .…: target_state=\\['y1'\\])\n", + "\n", + "In \\[12\\]: thetaHat = minimize(fun=obj.costIV, x0=\\[0.0\\])\n", + "\n", + "In \\[13\\]: print(thetaHat)\n", + "\n", + "In \\[14\\]: model.initial_values = (\\[0.0\\] + thetaHat\\['x'\\].tolist(),\n", + "t\\[0\\])\n", + "\n", + "In \\[15\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[16\\]: f = plt.figure()\n", + "\n", + "@savefig bvp1_solution_plot.png In \\[17\\]: model.plot()\n", + "\n", + "In \\[18\\]: plt.close()\n", + "\n", + "We are going to visualize the solution, and also check the boundary\n", + "condition. The first became our initial condition, so it is always\n", + "satisfied and only the latter is of concern, which is zero (subject to\n", + "numerical error) from thetaHat.\n", + "\n", + "## Simple model 2\n", + "\n", + "Our second example is different as it involves an actual parameter and\n", + "also time. We have the Mathieu's Equation\n", + "\n", + "$$\\nabla^{2} y + \\left(p - 2q \\cos(2x)\\right)y = 0$$\n", + "\n", + "and the aim is to compute the fourth eigenvalue $q=5$. There are three\n", + "boundary conditions\n", + "\n", + "$$\\nabla y(0) = 0, \\quad \\nabla y(\\pi) = 0, \\quad y(0) = 1$$\n", + "\n", + "and we aim to solve it by converting it to a first order ODE and tackle\n", + "it as an IVP. As our model object does not allow the use of the time\n", + "component in the equations, we introduce a anxiliary state $\\tau$ that\n", + "replaces time $t$. Rewrite the equations using\n", + "$y_{0} = y, y_{1} = \\nabla y$ and define our model as\n", + "\n", + "In \\[1\\]: stateList = \\['y0', 'y1', 'tau'\\]\n", + "\n", + "In \\[2\\]: paramList = \\['p'\\]\n", + "\n", + "In \\[3\\]: ode1 = Transition('y0', 'y1', TransitionType.ODE)\n", + "\n", + "In \\[4\\]: ode2 = Transition('y1', '-(p - 2\\*5\\*cos(2\\*tau))\\*y0',\n", + "TransitionType.ODE)\n", + "\n", + "In \\[5\\]: ode3 = Transition('tau', '1', TransitionType.ODE)\n", + "\n", + "In \\[6\\]: model = DeterministicOde(stateList, paramList, ode=\\[ode1,\n", + "ode2, ode3\\])\n", + "\n", + "In \\[7\\]: theta = \\[1.0, 1.0, 0.0\\]\n", + "\n", + "In \\[8\\]: p = 15.0\n", + "\n", + "In \\[9\\]: t = numpy.linspace(0, numpy.pi)\n", + "\n", + "In \\[10\\]: model.parameters = \\[('p',p)\\]\n", + "\n", + "In \\[11\\]: model.initial_values = (theta, t\\[0\\])\n", + "\n", + "In \\[12\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[13\\]: f = plt.figure()\n", + "\n", + "@savefig bvp2_random_guess_plot.png In \\[14\\]: model.plot()\n", + "\n", + "In \\[15\\]: plt.close()\n", + "\n", + "Now we are ready to setup the estimation. Like before, we setup the\n", + "second boundary condition by pretending that it is an observation. We\n", + "have all the initial conditions defined by the first boundary condition\n", + "\n", + "In \\[1\\]: obj = SquareLoss(15.0, model, x0=\\[1.0, 0.0, 0.0\\], t0=0.0,\n", + "t=numpy.pi, y=0.0, state_name='y1')\n", + "\n", + "In \\[2\\]: xhatObj = minimize(obj.cost,\\[15\\])\n", + "\n", + "In \\[3\\]: print(xhatObj)\n", + "\n", + "In \\[4\\]: model.parameters = \\[('p', xhatObj\\['x'\\]\\[0\\])\\]\n", + "\n", + "In \\[5\\]: model.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "\n", + "In \\[5\\]: solution = model.integrate(t\\[1::\\])\n", + "\n", + "In \\[6\\]: f = plt.figure()\n", + "\n", + "@savefig bvp2_solution_plot.png In \\[7\\]: model.plot()\n", + "\n", + "In \\[8\\]: plt.close()\n", + "\n", + "The plot of the solution shows the path that satisfies all boundary\n", + "condition. The last subplot is time which obvious is redundant here but\n", + "the `DeterministicOde.plot` method is not yet able to recognize the time\n", + "component. Possible speed up can be achieved through the use of\n", + "derivative information or via root finding method that tackles the\n", + "gradient directly, instead of the cost function.\n", + "\n", + "**Reference**\n", + "\n", + "[1] " + ] + } + ], + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {} +} From 49fe85363abdaa53b8199d209898e7a1ffd5b64e Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 12:12:06 +0100 Subject: [PATCH 126/188] reformatting --- .../notebooks/paramfit/bvpSimple.ipynb | 335 +++++++++++++----- 1 file changed, 244 insertions(+), 91 deletions(-) diff --git a/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb b/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb index 6ca0ce57..062c54f7 100644 --- a/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb +++ b/docs/pygom-doc/notebooks/paramfit/bvpSimple.ipynb @@ -6,13 +6,25 @@ "source": [ "# Solving Boundary Value Problems\n", "\n", - "In addition to finding solutions for an IVP and estimate the unknown\n", - "parameters, this package also allows you to solve BVP with a little bit\n", + "In addition to finding solutions for an initial value problem (IVP) and estimating the unknown\n", + "parameters, this package also allows you to solve boundary value problems (BVP) with a little bit\n", "of imagination. Here, we are going to show how a BVP can be solved by\n", "treating it as a parameter estimation problem. Essentially, a shooting\n", "method where the first boundary condition defines the initial condition\n", "of an IVP and the second boundary condition is an observation. Two\n", - "examples, both from MATLAB[1], will be shown here.\n", + "examples, both from the [bvp4c implementation in MATLAB](https://uk.mathworks.com/help/matlab/ref/bvp4c.html), are demonstrated here.\n", + "\n", + "\n", + "```{note}\n", + "These examples are general and not specific to disease scenarios.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "1cfce26c", + "metadata": {}, + "source": [ "\n", "## Simple model 1\n", "\n", @@ -22,95 +34,164 @@ "$$\\nabla^{2} y + |y| = 0$$\n", "\n", "subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert\n", - "this into a set of first order ODE\n", + "this into a set of first order ODEs\n", "\n", "$$\\begin{aligned}\n", "\\frac{d y_{0}}{dt} &= y_{1} \\\\\n", "\\frac{d y_{1}}{dt} &= -|y_{0}|\n", "\\end{aligned}$$\n", "\n", - "using an auxiliary variable $y_{1} = \\nabla y$ and $y_{0} = y$. Setting\n", - "up the system below\n", - "\n", - "In \\[1\\]: from pygom import Transition, TransitionType,\n", - "DeterministicOde, SquareLoss\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "using an auxiliary variable $y_{1} = \\nabla y$ and $y_{0} = y$. \n", + "Here we set up the system." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "594a9de8", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import Transition, TransitionType, DeterministicOde, SquareLoss\n", "\n", - "In \\[2\\]: stateList = \\['y0', 'y1'\\]\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[3\\]: paramList = \\[\\]\n", + "stateList = ['y0', 'y1']\n", "\n", - "In \\[4\\]: ode1 = Transition(origin='y0', \n", - "...: equation='y1', ...: transition_type=TransitionType.ODE)\n", + "paramList = []\n", "\n", - "In \\[5\\]: ode2 = Transition(origin='y1', \n", - "...: equation='-abs(y0)', ...: transition_type=TransitionType.ODE)\n", + "ode1 = Transition(origin='y0', equation='y1', transition_type=TransitionType.ODE)\n", "\n", - "In \\[6\\]: model = DeterministicOde(stateList, \n", - "...: paramList, ...: ode=\\[ode1, ode2\\])\n", + "ode2 = Transition(origin='y1', equation='-abs(y0)', transition_type=TransitionType.ODE)\n", "\n", - "In \\[7\\]: model.get_ode_eqn()\n", + "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2])\n", "\n", + "model.get_ode_eqn()" + ] + }, + { + "cell_type": "markdown", + "id": "9456e756", + "metadata": {}, + "source": [ "We check that the equations are correct before proceeding to set up our\n", - "loss function.\n", - "\n", - "In \\[1\\]: import numpy\n", + "loss function. The loss function enables us to optimize the parameter choice.\n", "\n", - "In \\[2\\]: from scipy.optimize import minimize\n", - "\n", - "In \\[3\\]: initialState = \\[0.0, 1.0\\]\n", - "\n", - "In \\[4\\]: t = numpy.linspace(0, 4, 100)\n", + "#TODO add some ref/notes for loss functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ae19c03", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy\n", "\n", - "In \\[5\\]: model.initial_values = (initialState, t\\[0\\])\n", + "from scipy.optimize import minimize\n", "\n", - "In \\[6\\]: solution = model.integrate(t\\[1::\\])\n", + "initialState = [0.0, 1.0]\n", "\n", - "In \\[7\\]: f = plt.figure()\n", + "t = numpy.linspace(0, 4, 100)\n", "\n", - "@savefig bvp1_random_guess_plot.png In \\[8\\]: model.plot()\n", + "model.initial_values = (initialState, t[0])\n", "\n", - "In \\[9\\]: plt.close()\n", + "solution = model.integrate(t[1::])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3952c813", + "metadata": { + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "f = plt.figure()\n", + "model.plot()\n", + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "id": "1a6de472", + "metadata": {}, + "source": [ "\n", "Setting up the second boundary condition $y(4) = -2$ is easy, because\n", - "that is just a single observation attached to the state $y_{1}$.\n", + "that is only a single observation attached to the state $y_{1}$.\n", "Enforcing the first boundary condition requires us to set it as the\n", "initial condition. Because the condition only states that $y(0) = 0$,\n", "the starting value of the other state $y_1$ is free. We let our loss\n", - "object know that it is free through the targetState input argument.\n", - "\n", - "In \\[10\\]: theta = \\[0.0\\]\n", + "object know that it is free through the `targetState` input argument.\n", "\n", - "In \\[11\\]: obj = SquareLoss(theta=theta, \n", - ".…: ode=model, .…: x0=initialState, .…: t0=t\\[0\\], .…: t=t\\[-1\\], .…:\n", - "y=\\[-2\\], .…: state_name=\\['y0'\\], .…: target_state=\\['y1'\\])\n", - "\n", - "In \\[12\\]: thetaHat = minimize(fun=obj.costIV, x0=\\[0.0\\])\n", - "\n", - "In \\[13\\]: print(thetaHat)\n", + "#TODO unsure what this means" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaf5a503", + "metadata": {}, + "outputs": [], + "source": [ + "theta = [0.0]\n", "\n", - "In \\[14\\]: model.initial_values = (\\[0.0\\] + thetaHat\\['x'\\].tolist(),\n", - "t\\[0\\])\n", + "obj = SquareLoss(theta=theta, ode=model, x0=initialState, t0=t[0], \n", + " t=t[-1], y=[-2], state_name=['y0'], target_state=['y1'])\n", "\n", - "In \\[15\\]: solution = model.integrate(t\\[1::\\])\n", + "thetaHat = minimize(fun=obj.costIV, x0=[0.0])\n", "\n", - "In \\[16\\]: f = plt.figure()\n", + "print(thetaHat)\n", "\n", - "@savefig bvp1_solution_plot.png In \\[17\\]: model.plot()\n", + "model.initial_values = ([0.0] + thetaHat['x'].tolist(), t[0])\n", "\n", - "In \\[18\\]: plt.close()\n", + "solution = model.integrate(t[1::])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bffe9f2f", + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure()\n", + "model.plot()\n", + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "id": "472ff583", + "metadata": {}, + "source": [ "\n", "We are going to visualize the solution, and also check the boundary\n", "condition. The first became our initial condition, so it is always\n", "satisfied and only the latter is of concern, which is zero (subject to\n", - "numerical error) from thetaHat.\n", + "numerical error) from thetahat.\n", + "\n", + "#TODO what is thetahat?" + ] + }, + { + "cell_type": "markdown", + "id": "85032ca8", + "metadata": {}, + "source": [ "\n", "## Simple model 2\n", "\n", "Our second example is different as it involves an actual parameter and\n", "also time. We have the Mathieu's Equation\n", "\n", + "#TODO add ref\n", + "\n", "$$\\nabla^{2} y + \\left(p - 2q \\cos(2x)\\right)y = 0$$\n", "\n", "and the aim is to compute the fourth eigenvalue $q=5$. There are three\n", @@ -122,77 +203,149 @@ "it as an IVP. As our model object does not allow the use of the time\n", "component in the equations, we introduce a anxiliary state $\\tau$ that\n", "replaces time $t$. Rewrite the equations using\n", - "$y_{0} = y, y_{1} = \\nabla y$ and define our model as\n", - "\n", - "In \\[1\\]: stateList = \\['y0', 'y1', 'tau'\\]\n", - "\n", - "In \\[2\\]: paramList = \\['p'\\]\n", - "\n", - "In \\[3\\]: ode1 = Transition('y0', 'y1', TransitionType.ODE)\n", - "\n", - "In \\[4\\]: ode2 = Transition('y1', '-(p - 2\\*5\\*cos(2\\*tau))\\*y0',\n", - "TransitionType.ODE)\n", + "$y_{0} = y, y_{1} = \\nabla y$ and define our model as" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "afcf4558", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['y0', 'y1', 'tau']\n", "\n", - "In \\[5\\]: ode3 = Transition('tau', '1', TransitionType.ODE)\n", + "IparamList = ['p']\n", "\n", - "In \\[6\\]: model = DeterministicOde(stateList, paramList, ode=\\[ode1,\n", - "ode2, ode3\\])\n", + "ode1 = Transition('y0', 'y1', TransitionType.ODE)\n", "\n", - "In \\[7\\]: theta = \\[1.0, 1.0, 0.0\\]\n", + "ode2 = Transition('y1', '-(p - 2*5*cos(2*tau))*y0', TransitionType.ODE)\n", "\n", - "In \\[8\\]: p = 15.0\n", + "ode3 = Transition('tau', '1', TransitionType.ODE)\n", "\n", - "In \\[9\\]: t = numpy.linspace(0, numpy.pi)\n", + "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])\n", "\n", - "In \\[10\\]: model.parameters = \\[('p',p)\\]\n", + "theta = [1.0, 1.0, 0.0]\n", "\n", - "In \\[11\\]: model.initial_values = (theta, t\\[0\\])\n", + "p = 15.0\n", "\n", - "In \\[12\\]: solution = model.integrate(t\\[1::\\])\n", + "t = numpy.linspace(0, numpy.pi)\n", "\n", - "In \\[13\\]: f = plt.figure()\n", + "model.parameters = [('p',p)]\n", "\n", - "@savefig bvp2_random_guess_plot.png In \\[14\\]: model.plot()\n", + "model.initial_values = (theta, t[0])\n", "\n", - "In \\[15\\]: plt.close()\n", + "solution = model.integrate(t[1::])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c75eea5c", + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure()\n", + "model.plot()\n", + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "id": "1e1407cf", + "metadata": {}, + "source": [ "\n", - "Now we are ready to setup the estimation. Like before, we setup the\n", + "Now we are ready to setup the estimation. Like before, we set up the\n", "second boundary condition by pretending that it is an observation. We\n", - "have all the initial conditions defined by the first boundary condition\n", - "\n", - "In \\[1\\]: obj = SquareLoss(15.0, model, x0=\\[1.0, 0.0, 0.0\\], t0=0.0,\n", - "t=numpy.pi, y=0.0, state_name='y1')\n", - "\n", - "In \\[2\\]: xhatObj = minimize(obj.cost,\\[15\\])\n", + "have all the initial conditions defined by the first boundary condition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "110edf3a", + "metadata": {}, + "outputs": [], + "source": [ + "obj = SquareLoss(15.0, model, x0=[1.0, 0.0, 0.0], t0=0.0, \n", + " t=numpy.pi, y=0.0, state_name='y1')\n", "\n", - "In \\[3\\]: print(xhatObj)\n", + "xhatObj = minimize(obj.cost,[15])\n", "\n", - "In \\[4\\]: model.parameters = \\[('p', xhatObj\\['x'\\]\\[0\\])\\]\n", + "print(xhatObj)\n", "\n", - "In \\[5\\]: model.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "model.parameters = [('p', xhatObj['x'][0])]\n", "\n", - "In \\[5\\]: solution = model.integrate(t\\[1::\\])\n", + "model.initial_values = ([1.0, 0.0, 0.0], t[0])\n", "\n", - "In \\[6\\]: f = plt.figure()\n", + "solution = model.integrate(t[1::])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "653c998f", + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure()\n", "\n", - "@savefig bvp2_solution_plot.png In \\[7\\]: model.plot()\n", + "model.plot()\n", "\n", - "In \\[8\\]: plt.close()\n", + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "id": "f3719cf8", + "metadata": {}, + "source": [ "\n", "The plot of the solution shows the path that satisfies all boundary\n", - "condition. The last subplot is time which obvious is redundant here but\n", + "condition. The last subplot is time, which is redundant here but\n", "the `DeterministicOde.plot` method is not yet able to recognize the time\n", "component. Possible speed up can be achieved through the use of\n", - "derivative information or via root finding method that tackles the\n", + "derivative information or via the root finding method that tackles the\n", "gradient directly, instead of the cost function.\n", + "\n", + "#TODO add meth/fun/class refs for root finding method, derivative" + ] + }, + { + "cell_type": "markdown", + "id": "cb79c4f6", + "metadata": {}, + "source": [ "\n", "**Reference**\n", "\n", "[1] " ] + }, + { + "cell_type": "markdown", + "id": "ef9004bd", + "metadata": {}, + "source": [] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 4cb80415cc99123b54c15c75f040d8d15f71e952 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 12:37:57 +0100 Subject: [PATCH 127/188] reformatted --- .../notebooks/paramfit/estimate1.ipynb | 296 ++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 docs/pygom-doc/notebooks/paramfit/estimate1.ipynb diff --git a/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb b/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb new file mode 100644 index 00000000..415e8a30 --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb @@ -0,0 +1,296 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parameter Estimation: Example 1\n", + "\n", + "## Estimation under square loss\n", + "\n", + "To ease the estimation process when given data, a separate module\n", + "{mod}`ode_loss` has been constructed for observations coming from a single\n", + "state. We demonstrate how to do parametre fitting using two models; first, a the\n", + "SIR model, followed by the Legrand SEIHFR model from {citets}`Legrand2007` [\\[Legrand2007\\]]() used \n", + "for Ebola in the next page {doc}`.estimate2`.\n", + "\n", + "### SIR Model\n", + "\n", + "We set up an SIR model as seen previously in {doc}`.sir`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efea520f", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SquareLoss, common_models\n", + "\n", + "import numpy\n", + "\n", + "import scipy.integrate\n", + "\n", + "import matplotlib.pyplot\n", + "\n", + "# define the parameters\n", + "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]" + ] + }, + { + "cell_type": "markdown", + "id": "fbfac95a", + "metadata": {}, + "source": [ + "Initialize the model using the preloaded common model {obj}`.SIR`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f09342a5", + "metadata": {}, + "outputs": [], + "source": [ + "ode = common_models.SIR(paramEval)" + ] + }, + { + "cell_type": "markdown", + "id": "3fb03842", + "metadata": {}, + "source": [ + "We assume that we have perfect information about the $R$\n", + "compartment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cb19871", + "metadata": {}, + "outputs": [], + "source": [ + "x0 = [1, 1.27e-6, 0]\n", + "\n", + "# time, including the initial time t0 at t=0\n", + "\n", + "t = numpy.linspace(0, 150, 1000)\n", + "\n", + "# determine the solution.\n", + "\n", + "solution = scipy.integrate.odeint(ode.ode, x0, t)\n", + "\n", + "#TODO why use scipy?\n", + "\n", + "y = solution[:,1:3].copy()" + ] + }, + { + "cell_type": "markdown", + "id": "2a5c30e7", + "metadata": {}, + "source": [ + "\n", + "Initialize the class with some initial guess\n" + ] + }, + { + "cell_type": "markdown", + "id": "857371e4", + "metadata": {}, + "source": [ + "# our initial guess\n", + "\n", + "theta = [0.2, 0.2]\n", + "\n", + "objSIR = SquareLoss(theta, ode, x0, t[0], t[1::], y[1::,:], ['I','R'])\n" + ] + }, + { + "cell_type": "markdown", + "id": "cabcb9ba", + "metadata": {}, + "source": [ + "\n", + "Note that we need to provide the initial values, $x_{0}$ and $t_{0}$\n", + "differently to the observations $y$ and the corresponding time $t$.\n", + "Additionally, the state which the observation lines needs to be\n", + "specified. Either a single state, or multiple states are allowed, as\n", + "seen above.\n" + ] + }, + { + "cell_type": "markdown", + "id": "140a5020", + "metadata": {}, + "source": [ + "\n", + "### Difference in gradient\n", + "\n", + "We have provided two different ways of obtaining the gradient, these are\n", + "explained in {doc}`.gradient` in a bit more detail. First, lets see how\n", + "similar the outputs of the two methods are." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "de043dc5", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "objSIR.sensitivity()\n", + "\n", + "objSIR.adjoint()\n" + ] + }, + { + "cell_type": "markdown", + "id": "c47c6356", + "metadata": {}, + "source": [ + "\n", + "and the time required to obtain the gradient for the SIR model under\n", + "$\\theta = (0.2,0.2)$, previously entered.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "c74c5449", + "metadata": {}, + "source": [ + "%timeit objSIR.sensitivity()\n" + ] + }, + { + "cell_type": "markdown", + "id": "20856aa8", + "metadata": {}, + "source": [ + "%timeit objSIR.adjoint()" + ] + }, + { + "cell_type": "markdown", + "id": "3a86770d", + "metadata": {}, + "source": [ + "The amount of time taken for both method is dependent on the\n", + "number of observations as well as the number of states. The effect on\n", + "the adjoint method as the number of observations differs can be quite\n", + "evident. This is because the adjoint method is under a discretization\n", + "which loops in Python where as the forward sensitivity equations are\n", + "solved via an integration. As the number of observation gets\n", + "larger, the affect of the Python loop becomes more obvious.\n", + "\n", + "The difference in gradient is larger when there are less observations. This\n", + "is because the adjoint method use interpolations on the output of the\n", + "ode between each consecutive time points. Given solutions over the same\n", + "length of time, fewer discretizations leads to a less accurate\n", + "interpolation. Note that the interpolation is currently performed using a\n", + "univariate spline, due to the limitation of Python packages. Ideally,\n", + "one would prefer to use an (adaptive) Hermite or Chebyshev\n", + "interpolation. \n", + "\n", + "#TODO add refs\n", + "\n", + "Note how we ran the two gradient functions once before\n", + "timing it, that is because we only find the properties (Jacobian,\n", + "gradient) of the ODEs during runtime.\n" + ] + }, + { + "cell_type": "markdown", + "id": "543ec840", + "metadata": {}, + "source": [ + "\n", + "### Optimized result\n", + "\n", + "Then standard optimization procedures with some suitable initial guess\n", + "should yield the correct result. It is important to set the boundaries\n", + "for compartmental models as we know that all the parameters are strictly\n", + "positive. We put a less restrictive inequality here for demonstration\n", + "purpose.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff093f77", + "metadata": {}, + "outputs": [], + "source": [ + "# what we think the bounds are\n", + "\n", + "boxBounds = [(0.0,2.0),(0.0,2.0)]" + ] + }, + { + "cell_type": "markdown", + "id": "7590328f", + "metadata": {}, + "source": [ + "Then using the optimization routines in `scipy.optimize`, for example,\n", + "the *SLSQP* method with the gradient obtained by forward sensitivity.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "83eca0ba", + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.optimize import minimize\n", + "\n", + "res = minimize(fun=objSIR.cost, jac=objSIR.sensitivity, x0=theta, \n", + " bounds=boxBounds, method='SLSQP')\n", + "\n", + "print(res)\n" + ] + }, + { + "cell_type": "markdown", + "id": "404ddd1c", + "metadata": {}, + "source": [ + "Other methods available in `scipy.optimize.minimize` can also be used,\n", + "such as the *L-BFGS-B* and *TNC*. We can also use methods that accepts\n", + "the exact Hessian such as *trust-ncg* but that should not be necessary\n", + "most of the time.\n", + "\n", + "#TODO add doc refs for scipy" + ] + }, + { + "cell_type": "markdown", + "id": "9ce3d21c", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From d0b7666f9cec11ac75988bef85b5a514150ef83d Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 12:43:53 +0100 Subject: [PATCH 128/188] remove blank cell --- docs/pygom-doc/notebooks/paramfit/estimate1.ipynb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb b/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb index 415e8a30..68946810 100644 --- a/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb +++ b/docs/pygom-doc/notebooks/paramfit/estimate1.ipynb @@ -267,12 +267,6 @@ "\n", "#TODO add doc refs for scipy" ] - }, - { - "cell_type": "markdown", - "id": "9ce3d21c", - "metadata": {}, - "source": [] } ], "metadata": { From ac21b5311bb666cd6025703b302aae38d4d9f1b7 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 15:31:46 +0100 Subject: [PATCH 129/188] reformatted --- .../notebooks/paramfit/estimate2.ipynb | 544 ++++++++++++++++++ 1 file changed, 544 insertions(+) create mode 100644 docs/pygom-doc/notebooks/paramfit/estimate2.ipynb diff --git a/docs/pygom-doc/notebooks/paramfit/estimate2.ipynb b/docs/pygom-doc/notebooks/paramfit/estimate2.ipynb new file mode 100644 index 00000000..ce6d24f5 --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/estimate2.ipynb @@ -0,0 +1,544 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parameter Estimation: Example 2\n", + "\n", + "Continuing from the example in {doc}`.estimate1`, we show why estimating the parameters\n", + "for ODE's can be difficult. This is especially true if there is a lack of data\n", + "or when there are too much flexibility in the model. \n", + "\n", + "```{note}\n", + "For reproducibility purposes, only deterministic models are used here. If a stochastic algorithm is required we use a fixed seed.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "8897e924", + "metadata": {}, + "source": [ + "\n", + "## SEIR model\n", + "\n", + "We demonstrate the estimation on data collected from an Ebola outbreak in West\n", + "Africa. We use the number of deaths in Guinea and its corresponding time\n", + "the data was recorded. These data are publicly available and they can be\n", + "obtained [here](https://github.com/cmrivers/ebola). \n", + "\n", + "We provide the data here for reproducibility and ease." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6826d12d", + "metadata": {}, + "outputs": [], + "source": [ + "# the number of deaths and cases in Guinea\n", + "\n", + "yDeath = [29.0, 59.0, 60.0, 62.0, 66.0, 70.0, 70.0, 80.0, 83.0, 86.0, 95.0, 101.0, 106.0, 108.0, 122.0, 129.0, 136.0, 141.0, 143.0, 149.0, 155.0, 157.0, 158.0,\n", + "157.0, 171.0, 174.0, 186.0, 193.0, 208.0, 215.0, 226.0, 264.0,\n", + "267.0, 270.0, 303.0, 305.0, 307.0, 309.0, 304.0, 310.0, 310.0,\n", + "314.0, 319.0, 339.0, 346.0, 358.0, 363.0, 367.0, 373.0, 377.0,\n", + "380.0, 394.0, 396.0, 406.0, 430.0, 494.0, 517.0, 557.0, 568.0, 595.0,\n", + "601.0, 632.0, 635.0, 648.0, 710.0, 739.0, 768.0, 778.0, 843.0,\n", + "862.0, 904.0, 926.0, 997.0]\n", + "\n", + "yCase = [49.0, 86.0, 86.0, 86.0, 103.0, 112.0, 112.0, 122.0, 127.0, 143.0, 151.0, 158.0, 159.0, 168.0, 197.0, 203.0, 208.0, 218.0, 224.0, 226.0, 231.0,\n", + "235.0, 236.0, 233.0, 248.0, 258.0, 281.0, 291.0, 328.0, 344.0,\n", + "351.0, 398.0, 390.0, 390.0, 413.0, 412.0, 408.0, 409.0, 406.0,\n", + "411.0, 410.0, 415.0, 427.0, 460.0, 472.0, 485.0, 495.0, 495.0,\n", + "506.0, 510.0, 519.0, 543.0, 579.0, 607.0, 648.0, 771.0, 812.0,\n", + "861.0, 899.0, 936.0, 942.0, 1008.0, 1022.0, 1074.0, 1157.0, 1199.0,\n", + "1298.0, 1350.0, 1472.0, 1519.0, 1540.0, 1553.0, 1906.0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d9b4bfb", + "metadata": {}, + "outputs": [], + "source": [ + "# the corresponding time\n", + "\n", + "t = [0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0, 13.0, 16.0, 18.0, 20.0, 23.0, 25.0, 26.0, 29.0, 32.0, 35.0, 40.0, 42.0, 44.0, 46.0, 49.0, 51.0, 62.0, 66.0, 67.0,\n", + "71.0, 73.0, 80.0, 86.0, 88.0, 90.0, 100.0, 102.0, 106.0, 108.0,\n", + "112.0, 114.0, 117.0, 120.0, 123.0, 126.0, 129.0, 132.0, 135.0, 137.0, 140.0, 142.0, 144.0, 147.0, 149.0, 151.0, 157.0, 162.0, 167.0,\n", + "169.0, 172.0, 175.0, 176.0, 181.0, 183.0, 185.0, 190.0, 193.0,\n", + "197.0, 199.0, 204.0, 206.0, 211.0, 213.0, 218.0]\n" + ] + }, + { + "cell_type": "markdown", + "id": "fe8c48cf", + "metadata": {}, + "source": [ + "### Simple estimation\n", + "\n", + "First, we are going to fit a standard **SEIR** model to the data.\n", + "Details of the models can be found in {doc}`common_models` Defining the model\n", + "as usual with an approximation of what the parameters might be, here,\n", + "we choose the values to be the mid point of our feasible region (defined\n", + "by our box constraints later).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5dfa5094", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SquareLoss, common_models\n", + "\n", + "import numpy, scipy.optimize\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "theta = numpy.array([5.0, 5.0, 5.0])\n", + "\n", + "ode = common_models.SEIR(theta)\n", + "\n", + "population = 1175e4\n", + "\n", + "y = numpy.reshape(numpy.append(numpy.array(yCase), numpy.array(yDeath)), \n", + " (len(yCase),2), 'F')/population\n", + "\n", + "x0 = [1., 0., 49.0/population, 29.0/population]\n", + "\n", + "t0 = t[0]\n", + "\n", + "objLegrand = SquareLoss(theta, ode, x0, t0, t[1::], y[1::,:], ['I','R'], numpy.sqrt([population\\]*2))\n" + ] + }, + { + "cell_type": "markdown", + "id": "288f8273", + "metadata": {}, + "source": [ + "\n", + "Then we optimize, first, assuming that the initial conditions are\n", + "accurate. Some relatively large bounds are used for this particular\n", + "problem.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fc31ee5f", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "boxBounds = [ (0.0,10.0), (0.0,10.0), (0.0,10.0)]\n", + "\n", + "res = scipy.optimize.minimize(fun=objLegrand.cost, jac=objLegrand.sensitivity, x0=theta, bounds=boxBounds, method='l-bfgs-b')\n", + "\n", + "print(res)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3e42fe2", + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure()\n", + "\n", + "objLegrand.plot()\n", + "\n", + "plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "ef3374aa", + "metadata": {}, + "source": [ + "\n", + "We can see from our visual confirmation that the estimated parameters\n", + "are not exactly ideal. This is confirmed by the information returned\n", + "from the `scipy.optimize.minimize` routine, and probably caused by the\n", + "poor starting point. An attempt to find a more suitable value can be\n", + "done by some form of parameter space exploration. Given that the\n", + "evaluation of the objective function is not expensive here, we have\n", + "plenty of options to choose from. To reduce the number of packages\n", + "required to build this documentation, routines from `scipy.optimize`\n", + "remain our preferred option." + ] + }, + { + "cell_type": "markdown", + "id": "be511db4", + "metadata": {}, + "source": [ + "\n", + "### Improved initial guess" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38badab5", + "metadata": {}, + "outputs": [], + "source": [ + "resDE = scipy.optimize.differential_evolution(objLegrand.cost,\n", + "bounds=boxBounds, polish=False, seed=20921391)\n", + "\n", + "print(objLegrand.sensitivity(resDE['x']))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9f68ff44", + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure()\n", + "\n", + "objLegrand.plot()\n", + "\n", + "plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d06e8bdf", + "metadata": {}, + "source": [ + "\n", + "Looking at the output of the estimates (below this paragraph), we can\n", + "see our inference on Ebola is wrong when compared to the *known* values\n", + "(from field observations) even though the graphs looks *\\`\\`reasonable\"*.\n", + "Namely, $\\gamma^{-1}$, the third parameter in the vector below, our time\n", + "from infectiousness to death, is within the expected range but $\\alpha^{-1}$\n", + "(second parameter), the incubation period, is a lot higher than expected.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f01c604", + "metadata": {}, + "outputs": [], + "source": [ + "1/resDE['x']" + ] + }, + { + "cell_type": "markdown", + "id": "4bc57a74", + "metadata": {}, + "source": [ + "\n", + "### Multimodal surface\n", + "\n", + "A reason for this type of behavior is that we simply lack the\n", + "information/data to make proper inference. Without data on the state\n", + "$E$, the parameters $\\beta,\\alpha$ for the two states $I$ and $E$ are\n", + "dependent only on observations on $I$. Hence, some other random\n", + "combination of $\\beta,\\alpha$ that is capable of generating realizations\n", + "close to observations in $I$ is feasible. In such cases, the only\n", + "requirement is that there exist some $\\gamma$ in the feasible region\n", + "that can compensate for the ill suited $\\beta,\\alpha$. For example, we\n", + "know (obtained elsewhere and not shown here) that there is another set\n", + "of parameters capable of generating a similar looking curves as before.\n", + "Note the reversal of magnitude in $\\beta$ and $\\alpha$.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4797fe3", + "metadata": {}, + "outputs": [], + "source": [ + "objLegrand.cost([3.26106524e+00, 2.24798702e-04, 1.23660721e-02])\n", + "\n", + "# objLegrand.cost([ 0.02701867, 9.00004776, 0.01031861])\n", + "# similar graph\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0573ccf8", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "objLegrand.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "ce36ae9e", + "metadata": {}, + "source": [ + "### With initial values as parameters\n", + "\n", + "The assumption that the whole population being susceptible is\n", + "an overestimate, therefore we want to estimate the initial conditions of the\n", + "ODEs as well. Given previous estimates of the parameters\n", + "$\\hat{\\beta}, \\hat{\\alpha}, \\hat{\\gamma}$ it is appropriate to start our\n", + "initial guess there.\n", + "\n", + "Furthermore, given that we now estimate the initial values for all the\n", + "states, we can use the first time point as our observation. So our time\n", + "begins at $t = -1$ where our observations include the previous initial\n", + "condition, i.e. 49 and 29 for the number of cases and death at $t = 0$\n", + "respectively. The following code block demonstrates how we would do\n", + "that; feel free to try it out yourself to see the much improved result.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fe0f36b4", + "metadata": {}, + "outputs": [], + "source": [ + "thetaIV = theta.tolist() + x0\n", + "\n", + "thetaIV[3] -= 1e-8 # to make sure that the initial guess satisfies the constraints\n", + "\n", + "boxBoundsIV = boxBounds + [(0.,1.), (0.,1.), (0.,1.), (0.,1.)]\n", + "\n", + "objLegrand = SquareLoss(theta, ode, x0, -1, t, y, ['I','R'], numpy.sqrt([population]*2))\n", + "\n", + "resDEIV = scipy.optimize.differential_evolution(objLegrand.costIV, bounds=boxBoundsIV, polish=False, seed=20921391)\n", + "\n", + "print(resDEIV)\n" + ] + }, + { + "cell_type": "markdown", + "id": "3331a258", + "metadata": {}, + "source": [ + "objLegrand.plot()\n" + ] + }, + { + "cell_type": "markdown", + "id": "2408c495", + "metadata": {}, + "source": [ + "## Legrand Ebola SEIHFR Model\n", + "\n", + "Next, we demonstrate the estimation on a model that has been widely used in\n", + "the 2014 Ebola outbreak in west Africa {citets}`Legrand`. This model has been\n", + "defined in {mod}`.common_models`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4f726a4a", + "metadata": {}, + "outputs": [], + "source": [ + "ode = common_models.Legrand_Ebola_SEIHFR()\n", + "\n", + "# initial guess from the paper that studied the outbreak in Congo\n", + "\n", + "theta = numpy.array([0.588,0.794,7.653, # the beta \n", + " 10.0,9.6,5.0,2.0, # the omega\n", + " 7.0,0.81,0.80, # alpha,\n", + " delta, \n", + " theta,\n", + " 100.,1.0]) # kappa,intervention time\n", + "\n", + "# initial conditions, note that we have a 0.0 at the end because the model is a non-automonous ODE which we have converted the time component out of\n", + "\n", + "x0 = numpy.array([population, 0.0, 49.0, 0.0, 0.0, 29.0, 0.0])/population\n", + "\n", + "ode.parameters = theta\n", + "\n", + "ode.initial_values = (x0, t[0])\n", + "\n", + "objLegrand = SquareLoss(theta, ode, x0, t[0], t[1::], y[1::,:], \n", + " ['I','R'], numpy.sqrt([population]*2))" + ] + }, + { + "cell_type": "markdown", + "id": "71d2d4b6", + "metadata": {}, + "source": [ + "Now, it is important to set additional constraints accurately because a\n", + "simple box constraint is much larger than the feasible set. Namely,\n", + "$\\omega_{I}, \\omega_{D}$ are the time taken from onset until end of\n", + "infectious/death, which has to be bigger than $\\omega_{H}$, onset to\n", + "hospitalization given the nature of the disease. Therefore, we create\n", + "extra inequality constraints in addition to the box constraints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d928c542", + "metadata": {}, + "outputs": [], + "source": [ + "boxBounds = [(0.001, 100.), #beta_I \n", + " (0.001, 100.), # beta_H\n", + " (0.001, 100.), # beta_F \n", + " (0.001, 100.), # omega_I \n", + " (0.001, 100.), # omega_D \n", + " (0.001, 100.), # omega_H \n", + " (0.001, 100.), # omega_F\n", + " (0.001, 100.), # alpha^{-1} \n", + " (0.0001, 1.), # delta \n", + " (0.0001, 1.), # theta .….: (0.001, 1000.), # kappa\n", + " (0.,218.) # intervention time \n", + " ]\n", + "\n", + "cons = ({'type': 'ineq', 'fun' : lambda x: numpy.array([x[3]-x[5], x[4]-x[5]])})" + ] + }, + { + "cell_type": "markdown", + "id": "df3e4a0a", + "metadata": {}, + "source": [ + "We can now try to find the optimal values, but because this is a\n", + "difficult problem that can take a very long time without guarantee on\n", + "the quality of solution." + ] + }, + { + "cell_type": "markdown", + "id": "e20c8987", + "metadata": {}, + "source": [ + "res = scipy.optimize.minimize(fun=objLegrand.cost, jac=objLegrand.sensitivity, \n", + " x0=theta, constraints=cons, bounds=boxBounds, method='SLSQP')\n", + "\n", + "print(res)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "b9e7a7d7", + "metadata": {}, + "source": [ + "objLegrand.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "1d0c6889", + "metadata": {}, + "source": [ + "The estimated parameters are very much unrealistic given that\n", + "a lot of them are near the boundaries. It is also known from other\n", + "sources that some of the epidemiology properties of Ebola, with\n", + "incubation period of around 2 weeks and a mortality rate of around 80\n", + "percent.\n", + "\n", + "As the estimate does not appear to provide anything sensible, we also\n", + "provide a set of values previously obtained (that looks semi-reasonable)\n", + "here plot the epidemic curve with the observations layered on top.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "b383ece7", + "metadata": {}, + "source": [ + "theta = numpy.array([3.96915071e-02, 1.72302620e+01, 1.99749990e+01, 2.67759445e+01, \n", + " 4.99999990e+01, 5.56122691e+00, 4.99999990e+01, 8.51599523e+00, \n", + " 9.99999000e-01, 1.00000000e-06, 3.85807562e+00, 1.88385318e+00])\n", + "\n", + "print(objLegrand.cost(theta))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f9232353", + "metadata": { + "tags": [ + "hide-input" + ], + "vscode": { + "languageId": "javascript" + } + }, + "outputs": [], + "source": [ + "solution = ode.integrate(t[1::])\n", + "\n", + "f, axarr = plt.subplots(2,3)\n", + "\n", + "axarr[0,0].plot(t, solution[:,0]);\n", + "\n", + "axarr[0,0].set_title('Susceptible');\n", + "\n", + "axarr[0,1].plot(t, solution[:,1]);\n", + "\n", + "axarr[0,1].set_title('Exposed');\n", + "\n", + "axarr[0,2].plot(t, solution[:,2]);\n", + "\n", + " axarr[0,2].plot(t, y[:,0], 'r');\n", + "\n", + "axarr[0,2].set_title('Infectious');\n", + "\n", + "axarr[1,0].plot(t, solution[:,3]);\n", + "\n", + "axarr[1,0].set_title('Hospitalised');\n", + "\n", + "axarr[1,1].plot(t, solution[:,4]);\n", + "\n", + "axarr[1,1].set_title('Awaiting Burial');\n", + "\n", + "axarr[1,2].plot(t, solution[:,5]);\n", + "\n", + "axarr[1,2].plot(t, y[:,1], 'r');\n", + "\n", + "axarr[1,2].set_title('Removed');\n", + "\n", + "f.text(0.5, 0.04, 'Days from outbreak', ha='center');\n", + "\n", + "f.text(0.01, 0.5, 'Population', va='center', rotation='vertical');\n", + "\n", + "f.tight_layout();\n", + "\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 9aa4ee5b1667b8d981e456161649ebf55994b938 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 15:51:56 +0100 Subject: [PATCH 130/188] reformatted --- docs/pygom-doc/notebooks/paramfit/fh.ipynb | 205 +++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 docs/pygom-doc/notebooks/paramfit/fh.ipynb diff --git a/docs/pygom-doc/notebooks/paramfit/fh.ipynb b/docs/pygom-doc/notebooks/paramfit/fh.ipynb new file mode 100644 index 00000000..8d00a632 --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/fh.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parameter Estimation: FitzHugh Example\n", + "\n", + "## Defining the model\n", + "\n", + "We are going to investigate another classic model here, the\n", + "FitzHugh-Nagumo, or simply FitzHugh here. The model has already been\n", + "defined in {mod}`common_models` so we can load it rather than define by scratch.\n", + "\n", + "#TODO ref for FH-N" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a74b67ba", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SquareLoss, common_models\n", + "\n", + "import numpy\n", + "\n", + "import scipy.integrate, scipy.optimize\n", + "\n", + "import math,time,copy\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "x0 = \\[-1.0, 1.0\\]\n", + "\n", + "t0 = 0\n", + "\n", + "# params\n", + "paramEval = [('a',0.2), ('b',0.2), ('c',3.0)]\n", + "\n", + "ode = common_models.FitzHugh(paramEval)\n", + "\n", + "ode.initial_values = (x0, t0)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "100b72c6", + "metadata": {}, + "source": [ + "Define a set of time points and we can see how the two states $V$ and $R$\n", + "are suppose to behave.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8291f05", + "metadata": {}, + "outputs": [], + "source": [ + "t = numpy.linspace(1, 20, 30).astype('float64')\n", + "\n", + "solution = ode.integrate(t)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2fccb37", + "metadata": {}, + "outputs": [], + "source": [ + "ode.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "c177da58", + "metadata": {}, + "source": [ + "\n", + "## Estimate the parameters\n", + "\n", + "Obtaining the correct parameters for the FitzHugh model is well known to\n", + "be difficult, because of its multimodal surface. Although this\n", + "has been shown many times in the literature, so we will omit the\n", + "details. For further details see {citets}'FitzHugh`.\n", + "\n", + "#TODO ref?\n", + "\n", + "We will give the fitting a go with an initial guess which will enable us to recover the original parameters. First, we try the fitting process with only one target state.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "97050c8b", + "metadata": {}, + "source": [ + "theta = \\[0.5, 0.5, 0.5\\]\n", + "\n", + "In \\[27\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", + "'R')\n", + "\n", + "boxBounds = \\[ \n", + ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0) .…: \\]\n", + "\n", + "res = scipy.optimize.minimize(fun=objFH.cost, \n", + ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", + "method='L-BFGS-B')\n", + "\n", + "print(res)" + ] + }, + { + "cell_type": "markdown", + "id": "f2cbc5b1", + "metadata": {}, + "source": [ + "Then we try the same again but with both state as our target. Now we\n", + "won't look at the iterations because they are pretty pointless.\n", + "\n", + "In \\[30\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", + "\\['V','R'\\])\n", + "\n", + "In \\[31\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", + ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", + "method='L-BFGS-B')\n", + "\n", + "In \\[32\\]: print(res)\n", + "\n", + "Note how the estimates are the same, unlike other models.\n", + "\n", + "## Estimate initial value\n", + "\n", + "We can further assume that we have no idea about the initial values for\n", + "$V$ and $R$ as well. We also provide guesstimate to set off the\n", + "optimization. The input vector $\\theta$ must have the parameters first,\n", + "then the initial values, along with the corresponding bounds.\n", + "\n", + "First, only a single target state, i.e. we only have observations for\n", + "one of states which is $R$ in this case\n", + "\n", + "In \\[35\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", + "'R')\n", + "\n", + "In \\[35\\]: boxBounds = \\[ \n", + ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0), .…: (None,None), .…:\n", + "(None,None) .…: \\]\n", + "\n", + "In \\[36\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", + ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5,0.5\\], .…:\n", + "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "\n", + "In \\[37\\]: print(res)\n", + "\n", + "then both state as target at the same time\n", + "\n", + "In \\[38\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", + "\\['V','R'\\])\n", + "\n", + "In \\[38\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", + ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5, 0.5\\], .…:\n", + "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "\n", + "In \\[39\\]: print(res)\n", + "\n", + "See the difference between the two estimate with the latter, both state\n", + "were used, yielding superior estimates. Note that only the forward\n", + "sensitivity method is implemented when estimating the initial value, and\n", + "it is assumed that the starting condition for all the states are\n", + "unknown.\n", + "\n", + "The choice of algorithm here is the **L-BFGS-B** which is a better\n", + "choice because the parameter space of the FitzHugh is rough (i.e. large\n", + "second derivative) as well as being multimodal. This means that the\n", + "Hessian is not guaranteed to be positive definite and approximation\n", + "using $J^{\\top}J$ is poor, with $J$ being the Jacobian of the objective\n", + "function." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c65cd66bfb42a81d12ede40111d2dc694c51bdca Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 15:53:42 +0100 Subject: [PATCH 131/188] reformatted --- docs/pygom-doc/notebooks/paramfit/fh.ipynb | 134 ++++++++++++++------- 1 file changed, 93 insertions(+), 41 deletions(-) diff --git a/docs/pygom-doc/notebooks/paramfit/fh.ipynb b/docs/pygom-doc/notebooks/paramfit/fh.ipynb index 8d00a632..3b30551b 100644 --- a/docs/pygom-doc/notebooks/paramfit/fh.ipynb +++ b/docs/pygom-doc/notebooks/paramfit/fh.ipynb @@ -97,21 +97,21 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "97050c8b", "metadata": {}, + "outputs": [], "source": [ - "theta = \\[0.5, 0.5, 0.5\\]\n", + "theta = [0.5, 0.5, 0.5]\n", "\n", - "In \\[27\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", - "'R')\n", + "objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,1], 'R')\n", "\n", - "boxBounds = \\[ \n", - ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0) .…: \\]\n", + "boxBounds = [(0.0,5.0), (0.0,5.0), (0.0,5.0)]\n", "\n", - "res = scipy.optimize.minimize(fun=objFH.cost, \n", - ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", - "method='L-BFGS-B')\n", + "res = scipy.optimize.minimize(fun=objFH.cost, jac=objFH.sensitivity, \n", + " x0=theta, bounds=boxBounds,\n", + " method='L-BFGS-B')\n", "\n", "print(res)" ] @@ -121,55 +121,107 @@ "id": "f2cbc5b1", "metadata": {}, "source": [ - "Then we try the same again but with both state as our target. Now we\n", - "won't look at the iterations because they are pretty pointless.\n", - "\n", - "In \\[30\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", - "\\['V','R'\\])\n", - "\n", - "In \\[31\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", - ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", - "method='L-BFGS-B')\n", + "Then we try the same again but with both states as our target. " + ] + }, + { + "cell_type": "markdown", + "id": "fa53fd4a", + "metadata": {}, + "source": [ + "objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,:], ['V','R'])\n", "\n", - "In \\[32\\]: print(res)\n", + "res = scipy.optimize.minimize(fun=objFH.cost, jac=objFH.sensitivity, x0=theta,\n", + " bounds=boxBounds, method='L-BFGS-B')\n", + "print(res)\n" + ] + }, + { + "cell_type": "markdown", + "id": "d94fcdab", + "metadata": {}, + "source": [ "\n", "Note how the estimates are the same, unlike other models.\n", "\n", - "## Estimate initial value\n", + "#TODO why is this?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "883a35e5", + "metadata": {}, + "source": [ + "## Estimating initial value\n", "\n", "We can further assume that we have no idea about the initial values for\n", - "$V$ and $R$ as well. We also provide guesstimate to set off the\n", + "$V$ and $R$ as well. We also provide a guesstimate to set off the\n", "optimization. The input vector $\\theta$ must have the parameters first,\n", "then the initial values, along with the corresponding bounds.\n", "\n", "First, only a single target state, i.e. we only have observations for\n", - "one of states which is $R$ in this case\n", - "\n", - "In \\[35\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", - "'R')\n", - "\n", - "In \\[35\\]: boxBounds = \\[ \n", - ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0), .…: (None,None), .…:\n", - "(None,None) .…: \\]\n", + "one of states which is $R$ in this case" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "138e3689", + "metadata": {}, + "outputs": [], + "source": [ + "objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,1], 'R')\n", "\n", - "In \\[36\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", - ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5,0.5\\], .…:\n", - "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "boxBounds = [(0.0,5.0), \n", + " (0.0,5.0),\n", + " (0.0,5.0),\n", + " (None,None),\n", + " (None,None)]\n", "\n", - "In \\[37\\]: print(res)\n", + "res = scipy.optimize.minimize(fun=objFH.costIV,\n", + " jac=objFH.sensitivityIV,\n", + " x0=theta + [-0.5,0.5],\n", + " bounds=boxBounds, \n", + " method='L-BFGS-B')\n", "\n", - "then both state as target at the same time\n", + "print(res)" + ] + }, + { + "cell_type": "markdown", + "id": "af2b3afa", + "metadata": {}, + "source": [ "\n", - "In \\[38\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", - "\\['V','R'\\])\n", + "Then we can find both states as target at the same time.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "869a5561", + "metadata": {}, + "outputs": [], + "source": [ + "objFH = SquareLoss(theta, ode, x0, t0, t, solution[1::,:], ['V','R'])\n", "\n", - "In \\[38\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", - ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5, 0.5\\], .…:\n", - "bounds=boxBounds, .…: method='L-BFGS-B')\n", + "res = scipy.optimize.minimize(fun=objFH.costIV, \n", + " jac=objFH.sensitivityIV, \n", + " x0=theta + [-0.5, 0.5],\n", + " bounds=boxBounds, \n", + " method='L-BFGS-B')\n", "\n", - "In \\[39\\]: print(res)\n", + "print(res)\n" + ] + }, + { + "cell_type": "markdown", + "id": "3c045544", + "metadata": {}, + "source": [ "\n", - "See the difference between the two estimate with the latter, both state\n", + "See the difference between the two estimates with the latter method; both states\n", "were used, yielding superior estimates. Note that only the forward\n", "sensitivity method is implemented when estimating the initial value, and\n", "it is assumed that the starting condition for all the states are\n", From d76fe822356060e58d7874e50113fad8f380465c Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 15:58:01 +0100 Subject: [PATCH 132/188] added contents to chapter page --- docs/pygom-doc/md/common_models.md | 35 ++++++++++++++++++------------ 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/docs/pygom-doc/md/common_models.md b/docs/pygom-doc/md/common_models.md index 994a2546..9440c2ea 100644 --- a/docs/pygom-doc/md/common_models.md +++ b/docs/pygom-doc/md/common_models.md @@ -1,20 +1,27 @@ # Pre-defined Example common_models {#common_models} -We have defined a set of models `common_models`{.interpreted-text -role="mod"}, most of them commonly used in epidemiology. They are there -as examples and also save time for end users. Most of them are of the +We have defined a set of models {mod}`common_models`, most of them commonly used in epidemiology. They are there +as examples and also to save time for users. Most of them are of the compartmental type, and we use standard naming conventions i.e. **S** = Susceptible, **E** = Exposed, **I** = Infectious, **R** = Recovered. + +#TODO is R recovered, removed or dead? + Extra state symbol will be introduced when required. -::: {.toctree} -common_models/SIS.rst common_models/SIS_Periodic.rst -common_models/SIR.rst common_models/SIR_Birth_Death.rst -common_models/SEIR.rst common_models/SEIR_Multiple.rst -common_models/SEIR_Birth_Death.rst -common_models/SEIR_Birth_Death_Periodic.rst -common_models/Legrand_Ebola_SEIHFR.rst common_models/Lotka_Volterra.rst -common_models/Lotka_Volterra_4State.rst common_models/FitzHugh.rst -common_models/Lorenz.rst common_models/vanDelPol.rst -common_models/Robertson.rst -::: +{doc}`../notebooks/common_models/SIS` +{doc}`../notebooks/common_models/SIS_Periodic` +{doc}`../notebooks/common_models/SIR` +{doc}`../notebooks/common_models/SIR_Birth_Death` +{doc}`../notebooks/common_models/SEIR` +{doc}`../notebooks/common_models/SEIR_Multiple` +{doc}`../notebooks/common_models/SEIR_Birth_Death` +{doc}`../notebooks/common_models/SEIR_Birth_Death_Periodic` +{doc}`../notebooks/common_models/Legrand_Ebola_SEIHFR` +{doc}`../notebooks/common_models/Lotka_Volterra` +{doc}`../notebooks/common_models/Lotka_Volterra_4State` +{doc}`../notebooks/common_models/FitzHugh` +{doc}`../notebooks/common_models/Lorenz` +{doc}`../notebooks/common_models/vanDelPol` +{doc}`../notebooks/common_models/Robertson` + From 54e4c849ff13e02905d59bed19c27ec6133fdaba Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 16:01:23 +0100 Subject: [PATCH 133/188] correct referencing to common models --- docs/pygom-doc/_toc.yml | 30 +++++++++++++++--------------- docs/pygom-doc/md/common_models.md | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 96bb1ff9..261aa983 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -32,19 +32,19 @@ parts: sections: - file: notebooks/common_models/SIS.ipynb - file: notebooks/common_models/SIS_Periodic.ipynb - - file: notebooks/common_models/SIR.rst - - file: notebooks/common_models/SIR_Birth_Death.rst - - file: notebooks/common_models/SEIR.rst - - file: notebooks/common_models/SEIR_Multiple.rst - - file: notebooks/common_models/SEIR_Birth_Death.rst - - file: notebooks/common_models/SEIR_Birth_Death_Periodic.rst - - file: notebooks/common_models/Legrand_Ebola_SEIHFR.rst - - file: notebooks/common_models/Lotka_Volterra.rst - - file: notebooks/common_models/Lotka_Volterra_4State.rst - - file: notebooks/common_models/FitzHugh.rst - - file: notebooks/common_models/Lorenz.rst - - file: notebooks/common_models/vanDelPol.rst - - file: notebooks/common_models/Robertson.rst + - file: notebooks/common_models/SIR.ipynb + - file: notebooks/common_models/SIR_Birth_Death.ipynb + - file: notebooks/common_models/SEIR.ipynb + - file: notebooks/common_models/SEIR_Multiple.ipynb + - file: notebooks/common_models/SEIR_Birth_Death.ipynb + - file: notebooks/common_models/SEIR_Birth_Death_Periodic.ipynb + - file: notebooks/common_models/Legrand_Ebola_SEIHFR.ipynb + - file: notebooks/common_models/Lotka_Volterra.ipynb + - file: notebooks/common_models/Lotka_Volterra_4State.ipynb + - file: notebooks/common_models/FitzHugh.ipynb + - file: notebooks/common_models/Lorenz.ipynb + - file: notebooks/common_models/vanDelPol.ipynb + - file: notebooks/common_models/Robertson.ipynb # - caption: Frequently asked questions # chapters: # - file: md/faq.md @@ -53,9 +53,9 @@ parts: - file: autodoc-model.rst - file: autodoc-loss.rst # - caption: References -# https://jupyterbook.org/en/stable/content/citations.html#id6 # chapters: -# - file: md/ref.md +# - file: md/bib.md +# https://jupyterbook.org/en/stable/content/citations.html#id6 ## - caption: Indices and tables ## chapters: ## - file: diff --git a/docs/pygom-doc/md/common_models.md b/docs/pygom-doc/md/common_models.md index 9440c2ea..77048ef2 100644 --- a/docs/pygom-doc/md/common_models.md +++ b/docs/pygom-doc/md/common_models.md @@ -10,18 +10,32 @@ Susceptible, **E** = Exposed, **I** = Infectious, **R** = Recovered. Extra state symbol will be introduced when required. {doc}`../notebooks/common_models/SIS` + {doc}`../notebooks/common_models/SIS_Periodic` + {doc}`../notebooks/common_models/SIR` + {doc}`../notebooks/common_models/SIR_Birth_Death` + {doc}`../notebooks/common_models/SEIR` + {doc}`../notebooks/common_models/SEIR_Multiple` + {doc}`../notebooks/common_models/SEIR_Birth_Death` + {doc}`../notebooks/common_models/SEIR_Birth_Death_Periodic` + {doc}`../notebooks/common_models/Legrand_Ebola_SEIHFR` + {doc}`../notebooks/common_models/Lotka_Volterra` + {doc}`../notebooks/common_models/Lotka_Volterra_4State` + {doc}`../notebooks/common_models/FitzHugh` + {doc}`../notebooks/common_models/Lorenz` + {doc}`../notebooks/common_models/vanDelPol` + {doc}`../notebooks/common_models/Robertson` From aa7b175631d4610f1e6ee740c68f1f5c36104350 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 21:29:59 +0100 Subject: [PATCH 134/188] correct bib citations --- docs/pygom-doc/_config.yml | 36 ++- docs/pygom-doc/_toc.yml | 6 +- docs/pygom-doc/md/bib.md | 5 + docs/pygom-doc/notebooks/epijson.ipynb | 10 +- docs/pygom-doc/ref.bib | 298 ++++++++++++++++++++++++- 5 files changed, 334 insertions(+), 21 deletions(-) diff --git a/docs/pygom-doc/_config.yml b/docs/pygom-doc/_config.yml index 8a49af3e..ecf87ec2 100644 --- a/docs/pygom-doc/_config.yml +++ b/docs/pygom-doc/_config.yml @@ -15,22 +15,50 @@ only_build_toc_files: true # this could avoid the issue of execution timing out # See https://jupyterbook.org/content/execute.html execute: - execute_notebooks: force + execute_notebooks: cache # Define the name of the latex output file for PDF builds latex: latex_documents: - targetname: book.tex + targetname: pygom-book.tex # Add a bibtex file so that we can create citations # use sphinx to specify style + +sphinx: + extra_extensions: + - 'sphinxcontrib.bibtex' + sphinx: config: bibtex_reference_style: author_year # TODO change md to bibtex - bibtex_bibfiles: "ref.md" + bibtex_bibfiles: ref.bib + +#bibtex_bibfiles: +# - ref.bib + +sphinx: extra_extensions: - - 'sphinx.ext.autodoc' + #- 'sphinx.ext.doctest' + - 'sphinx.ext.autodoc' + - 'sphinx.ext.napoleon' + - 'sphinx.ext.viewcode' + - 'sphinx.ext.autosummary' + config: + add_module_names: True + autosummary_generate: True + +#sphinx: +# extra_extensions: +# - 'sphinx.ext.autosummary' +# config: +# autosummary_generate: True + +#sphinx: +# extra_extensions: +# - 'sphinx.ext.graphvizconfig' + # Information about where the book exists on the web repository: diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 261aa983..3d5df218 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -52,9 +52,9 @@ parts: chapters: - file: autodoc-model.rst - file: autodoc-loss.rst -# - caption: References -# chapters: -# - file: md/bib.md + - caption: References + chapters: + - file: md/bib.md # https://jupyterbook.org/en/stable/content/citations.html#id6 ## - caption: Indices and tables ## chapters: diff --git a/docs/pygom-doc/md/bib.md b/docs/pygom-doc/md/bib.md index 8b137891..df56a0c2 100644 --- a/docs/pygom-doc/md/bib.md +++ b/docs/pygom-doc/md/bib.md @@ -1 +1,6 @@ +# References +```{bibliography} +:style: unsrt +#:all: +``` \ No newline at end of file diff --git a/docs/pygom-doc/notebooks/epijson.ipynb b/docs/pygom-doc/notebooks/epijson.ipynb index 8d7e282a..f2e63cae 100644 --- a/docs/pygom-doc/notebooks/epijson.ipynb +++ b/docs/pygom-doc/notebooks/epijson.ipynb @@ -9,11 +9,11 @@ "Epidemiology data is complicated due to the many different stages a\n", "patient can go through and whether a modeling technique is applicable\n", "depends heavily on the recording of data. [EpiJSON](https://github.com/Hackout2/EpiJSON) is a framework which\n", - "tries to captures all the information in a JSON format {cite:ts}`Finnie2016` [\\[Finnie2016\\]](),.\n", + "tries to captures all the information in a JSON format {cite:t}`Finnie2016`.\n", "\n", "PyGOM provides the functionality to process EpiJSON data. Due to\n", "the nature of this package, modeling of ODEs, data files are processed with this in mind. The output is therefore in the cumulative form as\n", - "default, shown below, in a `pandas.DataFrame` format. \n", + "default, shown below, in a [`pandas.DataFrame`](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) format. \n", "\n", "#TODO unsure what this means\n", "\n", @@ -98,12 +98,6 @@ "and $R$ the corresponding state the data belongs to.\n", "```" ] - }, - { - "cell_type": "markdown", - "id": "43b2e082", - "metadata": {}, - "source": [] } ], "metadata": { diff --git a/docs/pygom-doc/ref.bib b/docs/pygom-doc/ref.bib index 6e6ecea9..72c66881 100644 --- a/docs/pygom-doc/ref.bib +++ b/docs/pygom-doc/ref.bib @@ -1,6 +1,292 @@ - -@article{Finnie2016 -, title = {piJSON: A unified data-format for epidemiology} -, author = {Thomas Finnie et al.} -, journal = {Epidemics} -} \ No newline at end of file +@article{Cao2006, + abstract = {The tau-leaping method of simulating the stochastic time evolution of a well-stirred chemically reacting system uses a Poisson approximation to take time steps that leap over many reaction events. Theory implies that tau leaping should be accurate so long as no propensity function changes its value "significantly" during any time step τ. Presented here is an improved procedure for estimating the largest value for τ that is consistent with this condition. This new τ -selection procedure is more accurate, easier to code, and faster to execute than the currently used procedure. The speedup in execution will be especially pronounced in systems that have many reaction channels. © 2006 American Institute of Physics.}, + author = {Yang Cao and Daniel T. Gillespie and Linda R. Petzold}, + doi = {10.1063/1.2159468}, + issn = {00219606}, + issue = {4}, + journal = {Journal of Chemical Physics}, + title = {Efficient step size selection for the tau-leaping simulation method}, + volume = {124}, + year = {2006}, +} +@article{Finnie2016, + abstract = {Epidemiology relies on data but the divergent ways data are recorded and transferred, both within and between outbreaks, and the expanding range of data-types are creating an increasingly complex problem for the discipline. There is a need for a consistent, interpretable and precise way to transfer data while maintaining its fidelity. We introduce 'EpiJSON', a new, flexible, and standards-compliant format for the interchange of epidemiological data using JavaScript Object Notation. This format is designed to enable the widest range of epidemiological data to be unambiguously held and transferred between people, software and institutions. In this paper, we provide a full description of the format and a discussion of the design decisions made. We introduce a schema enabling automatic checks of the validity of data stored as EpiJSON, which can serve as a basis for the development of additional tools. In addition, we also present the R package 'repijson' which provides conversion tools between this format, line-list data and pre-existing analysis tools. An example is given to illustrate how EpiJSON can be used to store line list data. EpiJSON, designed around modern standards for interchange of information on the internet, is simple to implement, read and check. As such, it provides an ideal new standard for epidemiological, and other, data transfer to the fast-growing open-source platform for the analysis of disease outbreaks.}, + author = {Thomas J.R. Finnie and Andy South and Ana Bento and Ellie Sherrard-Smith and Thibaut Jombart}, + doi = {10.1016/j.epidem.2015.12.002}, + issn = {18780067}, + journal = {Epidemics}, + title = {EpiJSON: A unified data-format for epidemiology}, + volume = {15}, + year = {2016}, +} +@article{FitzHugh1961, + abstract = {Van der Pol's equation for a relaxation oscillator is generalized by the addition of terms to produce a pair of non-linear differential equations with either a stable singular point or a limit cycle. The resulting “BVP model” has two variables of state, representing excitability and refractoriness, and qualitatively resembles Bonhoeffer's theoretical model for the iron wire model of nerve. This BVP model serves as a simple representative of a class of excitable-oscillatory systems including the Hodgkin-Huxley (HH) model of the squid giant axon. The BVP phase plane can be divided into regions corresponding to the physiological states of nerve fiber (resting, active, refractory, enhanced, depressed, etc.) to form a “physiological state diagram,” with the help of which many physiological phenomena can be summarized. A properly chosen projection from the 4-dimensional HH phase space onto a plane produces a similar diagram which shows the underlying relationship between the two models. Impulse trains occur in the BVP and HH models for a range of constant applied currents which make the singular point representing the resting state unstable. © 1961, The Biophysical Society. All rights reserved.}, + author = {Richard FitzHugh}, + doi = {10.1016/S0006-3495(61)86902-6}, + issn = {00063495}, + issue = {6}, + journal = {Biophysical Journal}, + title = {Impulses and Physiological States in Theoretical Models of Nerve Membrane}, + volume = {1}, + year = {1961}, +} +@inproceedings{Gillespie1977, + abstract = {There are two formalisms for mathematically describing the time behavior of a spatially homogeneous chemical system: The deterministic approach regards the time evolution as a continuous, wholly predictable process which is governed by a set of coupled, ordinary differential equations (the "reaction-rate equations"); the stochastic approach regards the time evolution as a kind of random-walk process which is governed by a single differential-difference equation (the "master equation"). Fairly simple kinetic theory arguments show that the stochastic formulation of chemical kinetics has a firmer physical basis than the deterministic formulation, but unfortunately the stochastic master equation is often mathematically intractable. There is, however, a way to make exact numerical calculations within the framework of the stochastic formulation without having to deal with the master equation directly. It is a relatively simple digital computer algorithm which uses a rigorously derived Monte Carlo procedure to numerically simulate the time evolution of the given chemical system. Like the master equation, this "stochastic simulation algorithm" correctly accounts for the inherent fluctuations and correlations that are necessarily ignored in the deterministic formulation. In addition, unlike most procedures for numerically solving the deterministic reaction-rate equations, this algorithm never approximates infinitesimal time increments dt by finite time steps Δt. The feasibility and utility of the simulation algorithm are demonstrated by applying it to several well-known model chemical systems, including the Lotka model, the Brusselator, and the Oregonator.}, + author = {Daniel T. Gillespie}, + doi = {10.1021/j100540a008}, + issn = {00223654}, + issue = {25}, + journal = {Journal of Physical Chemistry}, + title = {Exact stochastic simulation of coupled chemical reactions}, + volume = {81}, + year = {1977}, +} +@article{Girolami2011, + abstract = {The paper proposes Metropolis adjusted Langevin and Hamiltonian Monte Carlo sampling methods defined on the Riemann manifold to resolve the shortcomings of existing Monte Carlo algorithms when sampling from target densities that may be high dimensional and exhibit strong correlations. The methods provide fully automated adaptation mechanisms that circumvent the costly pilot runs that are required to tune proposal densities for Metropolis-Hastings or indeed Hamiltonian Monte Carlo and Metropolis adjusted Langevin algorithms. This allows for highly efficient sampling even in very high dimensions where different scalings may be required for the transient and stationary phases of the Markov chain. The methodology proposed exploits the Riemann geometry of the parameter space of statistical models and thus automatically adapts to the local structure when simulating paths across this manifold, providing highly efficient convergence and exploration of the target density. The performance of these Riemann manifold Monte Carlo methods is rigorously assessed by performing inference on logistic regression models, log-Gaussian Cox point processes, stochastic volatility models and Bayesian estimation of dynamic systems described by non-linear differential equations. Substantial improvements in the time-normalized effective sample size are reported when compared with alternative sampling approaches. MATLAB code that is available from allows replication of all the results reported. © 2011 Royal Statistical Society.}, + author = {Mark Girolami and Ben Calderhead}, + doi = {10.1111/j.1467-9868.2010.00765.x}, + issn = {13697412}, + issue = {2}, + journal = {Journal of the Royal Statistical Society. Series B: Statistical Methodology}, + title = {Riemann manifold Langevin and Hamiltonian Monte Carlo methods}, + volume = {73}, + year = {2011}, +} +@article{Hethcote1973, + abstract = {The effects of a periodic contact rate and of carriers are considered for a generalization of Bailey's simple epidemic model. In this model it is assumed that individuals become susceptible again as soon as they recover from the infection so that a fixed population can be divided into a class of infectives and a class of susceptibles which vary with time. If the contact rate is periodic, then the number of infectives as time approaches infinity either tends to zero or is asymptotically periodic depending on whether the total population size is less than or greater than a threshold value. The behavior for large time of the number of infectives is determined for three modifications of the model which involve carriers. © 1973 Society for Mathematical Biology.}, + author = {Herbert W. Hethcote}, + doi = {10.1007/BF02458365}, + issn = {00074985}, + issue = {5-6}, + journal = {Bulletin of Mathematical Biology}, + title = {Asymptotic behavior in a deterministic epidemic model}, + volume = {35}, + year = {1973}, +} +@article{Lloyd1996, + abstract = {Spatial heterogeneity is believed to play an important role in the persistence and dynamics of epidemics of childhood diseases because asynchrony between populations within different regions allows global persistence, even if the disease dies out locally. A simple multi-patch (metapopulation) model for spatial heterogeneity in epidemics is analysed and we examine conditions under which patches become synchronized. We show that the patches in non-seasonal deterministic models often oscillate in phase for all but the weakest between patch coupling. Synchronization is also seen for stochastic models, although slightly stronger coupling is needed to overcome the random effects. We demonstrate that the inclusion of seasonal forcing in deterministic models can lead to the maintenance of phase differences between patches. Complex dynamic behaviour is observed in the seasonally forced spatial model, along with the coexistence of many different behaviours. Compared to the non-spatial model, chaotic solutions are observed for weaker seasonal forcing; these solutions have a more realistic minimum number of infectives.}, + author = {Alun L. Lloyd and Robert M. May}, + doi = {10.1006/jtbi.1996.0042}, + issn = {00225193}, + issue = {1}, + journal = {Journal of Theoretical Biology}, + title = {Spatial heterogeneity in epidemic models}, + volume = {179}, + year = {1996}, +} +@article{Lorenz1963, + abstract = {Finite systems of deterministic ordinary nonlinear differential equations may be designed to represent forced dissipative hydrodynamic flow. Solutions of these equations can be identified with trajectories in phase space. For those systems with bounded solutions, it is found that nonperiodic solutions are ordinarily unstable with respect to small modifications, so that slightly differing initial states can evolve into considerably different states. Systems with bounded solutions are shown to possess bounded numerical solutions. A simple system representing cellular convection is solved numerically. All of the solutions are found to be unstable, and almost all of them are nonperiodic. The feasibility of very-long-range weather prediction is examined in the light of these results.}, + author = {Edward N. Lorenz}, + doi = {10.1175/1520-0469(1963)020<0130:dnf>2.0.co;2}, + issn = {0022-4928}, + issue = {2}, + journal = {Journal of the Atmospheric Sciences}, + title = {Deterministic Nonperiodic Flow}, + volume = {20}, + year = {1963}, +} +@article{Lotka1920, + abstract = {Periodic phenomena play an important r6le in nature, both organic and inorganic. In chemical reactions rhythmic effects have been observed experimentally, and have also been shown, by the writer' and others,2 to follow, under certain conditions, from the laws of chemical dynamics. However, in the cases hitherto considered on the basis of chemical dynamics, the oscillations were found to be of the damped kind, and therefore, only transitory (unlike certain experimentally observed periodic reactions). Furthermore, in a much more general investigation by the writer, covering the kinetics not only of chemical but also of biological systems, it appeared, from the nature of the solution obtained, improbable3 that undamped, permanent oscillations would arise in the absence of geometrical, structural causes, in the very comprehensive class of systems considered. For it seemed that the occurrence of such permanent oscillations, the occurrence of purely imaginary exponents in the exponential series solution presented, would demand peculiar and very specific relations between the characteristic constants of the systems undergoing transformation; whereas in nature these constants would, presumably, stand in random relation.}, + author = {Alfred J. Lotka}, + doi = {10.1073/pnas.6.7.410}, + issn = {0027-8424}, + issue = {7}, + journal = {Proceedings of the National Academy of Sciences}, + title = {Analytical Note on Certain Rhythmic Relations in Organic Systems}, + volume = {6}, + year = {1920}, +} +@book{Press2007, + abstract = {Do you want easy access to the latest methods in scientific computing? This greatly expanded third edition of Numerical Recipes has it, with wider coverage than ever before, many new, expanded and updated sections, and two completely new chapters. The executable C++ code, now printed in color for easy reading, adopts an object-oriented style particularly suited to scientific applications. Co-authored by four leading scientists from academia and industry, Numerical Recipes starts with basic mathematics and computer science and proceeds to complete, working routines. The whole book is presented in the informal, easy-to-read style that made earlier editions so popular. Highlights of the new material include: a new chapter on classification and inference, Gaussian mixture models, HMMs, hierarchical clustering, and SVMs; a new chapter on computational geometry, covering KD trees, quad- and octrees, Delaunay triangulation, and algorithms for lines, polygons, triangles, and spheres; interior point methods for linear programming; MCMC; an expanded treatment of ODEs with completely new routines; and many new statistical distributions.}, + author = {William H Press and Saul a Teukolsky and William T Vetterling and Brian P Flannery}, + issn = {00361445}, + journal = {Sample page from NUMBERICAL RECIPES IN C}, + title = {Numerical Recipes 3rd Edition: The Art of Scientific Computing}, + volume = {1}, + year = {2007}, +} +@article{Ramsay2007, + abstract = {We propose a new method for estimating parameters in models that are defined by a system of non-linear differential equations. Such equations represent changes in system outputs by linking the behaviour of derivatives of a process to the behaviour of the process itself. Current methods for estimating parameters in differential equations from noisy data are computationally intensive and often poorly suited to the realization of statistical objectives such as inference and interval estimation. The paper describes a new method that uses noisy measurements on a subset of variables to estimate the parameters defining a system of non-linear differential equations. The approach is based on a modification of data smoothing methods along with a generalization of profiled estimation. We derive estimates and confidence intervals, and show that these have low bias and good coverage properties respectively for data that are simulated from models in chemical engineering and neurobiology. The performance of the method is demonstrated by using real world data from chemistry and from the progress of the autoimmune disease lupus. © 2007 Royal Statistical Society.}, + author = {J. O. Ramsay and G. Hooker and D. Campbell and J. Cao}, + doi = {10.1111/j.1467-9868.2007.00610.x}, + issn = {13697412}, + issue = {5}, + journal = {Journal of the Royal Statistical Society. Series B: Statistical Methodology}, + title = {Parameter estimation for differential equations: A generalized smoothing approach}, + volume = {69}, + year = {2007}, +} +@article{Raue2009, + abstract = {Motivation: Mathematical description of biological reaction networks by differential equations leads to large models whose parameters are calibrated in order to optimally explain experimental data. Often only parts of the model can be observed directly. Given a model that sufficiently describes the measured data, it is important to infer how well model parameters are determined by the amount and quality of experimental data. This knowledge is essential for further investigation of model predictions. For this reason a major topic in modeling is identifiability analysis. Results: We suggest an approach that exploits the profile likelihood. It enables to detect structural non-identifiabilities, which manifest in functionally related model parameters. Furthermore, practical non-identifiabilities are detected, that might arise due to limited amount and quality of experimental data. Last but not least confidence intervals can be derived. The results are easy to interpret and can be used for experimental planning and for model reduction. © The Author 2009. Published by Oxford University Press. All rights reserved.}, + author = {Andreas Raue and C. Kreutz and T. Maiwald and J. Bachmann and M. Schilling and U. Klingmüller and J. Timmer}, + doi = {10.1093/bioinformatics/btp358}, + issn = {13674803}, + issue = {15}, + journal = {Bioinformatics}, + title = {Structural and practical identifiability analysis of partially observed dynamical models by exploiting the profile likelihood}, + volume = {25}, + year = {2009}, +} +@article{Venzon1988, + abstract = {The method of constructing confidence regions based on the generalised likelihood ratio statistic is well known for parameter vectors. A similar construction of a confidence interval for a simple entry of a vector can be implemented by repeatedly maximising over the other parameters. We present an algorithm for finding these confidence interval endpoints that requires less computation. It employs a modified Newton-Raphson iteration to solve a system of equations that defines the endpoints.}, + author = {D. J. Venzon and S. H. Moolgavkar}, + doi = {10.2307/2347496}, + issn = {00359254}, + issue = {1}, + journal = {Applied Statistics}, + title = {A Method for Computing Profile-Likelihood-Based Confidence Intervals}, + volume = {37}, + year = {1988}, +} +@article{, + abstract = {(1926). LXXXVIII. On “relaxation-oscillations”. The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science: Vol. 2, No. 11, pp. 978-992.}, + author = {Balth. van der Pol}, + doi = {10.1080/14786442608564127}, + issn = {1941-5982}, + issue = {11}, + journal = {The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science}, + month = {11}, + pages = {978-992}, + publisher = {Informa UK Limited}, + title = {On relaxation-oscillations}, + volume = {2}, + year = {1926}, +} +@article{Robertson1966, + author = {H.H Robertson}, + journal = {Academic Press}, + pages = {178-182}, + title = {The Solution of a Set of Reaction Rate Equations}, + url = {https://www.scirp.org/%28S%28vtj3fa45qm1ean45vvffcz55%29%29/reference/referencespapers.aspx?referenceid=2485718}, + year = {1966}, +} +@article{Moolgavkar1987, + author = {Suresh H. Moolgavkar and David J. Venz}, + issue = {1}, + journal = {Journal of Statistics}, + pages = {43-56}, + title = {Confidence Regions for Parameters of the Proportional Hazards Model: A Simulation Study on JSTOR}, + volume = {14}, + url = {https://www.jstor.org/stable/4616047}, + year = {1987}, +} +@article{legrand2007utd, + abstract = {Ebola is a highly lethal virus, which has caused at least 14 confirmed outbreaks in Africa between 1976 and 2006. Using data from two epidemics [in Democratic Republic of Congo (DRC) in 1995 and in Uganda in 2000], we built a mathematical model for the spread of Ebola haemorrhagic fever epidemics taking into account transmission in different epidemiological settings. We estimated the basic reproduction number (R0) to be 2.7 (95% CI 1.9-2.8) for the 1995 epidemic in DRC, and 2.7 (95% CI 2.5-4.1) for the 2000 epidemic in Uganda. For each epidemic, we quantified transmission in different settings (illness in the community, hospitalization, and traditional burial) and simulated various epidemic scenarios to explore the impact of control interventions on a potential epidemic. A key parameter was the rapid institution of control measures. For both epidemic profiles identified, increasing hospitalization rate reduced the predicted epidemic size.}, + author = {J. Legrand and R. F. Grais and P. Y. Boelle and A. J. Valleron and A. Flahault}, + doi = {10.1017/S0950268806007217}, + isbn = {0950-2688}, + issn = {09502688}, + issue = {4}, + journal = {Epidemiology and Infection}, + pages = {610-621}, + pmid = {16999875}, + title = {Understanding the dynamics of Ebola epidemics}, + volume = {135}, + year = {2007}, +} +@article{Cao2006, + abstract = {The tau-leaping method of simulating the stochastic time evolution of a well-stirred chemically reacting system uses a Poisson approximation to take time steps that leap over many reaction events. Theory implies that tau leaping should be accurate so long as no propensity function changes its value "significantly" during any time step τ. Presented here is an improved procedure for estimating the largest value for τ that is consistent with this condition. This new τ -selection procedure is more accurate, easier to code, and faster to execute than the currently used procedure. The speedup in execution will be especially pronounced in systems that have many reaction channels. © 2006 American Institute of Physics.}, + author = {Yang Cao and Daniel T. Gillespie and Linda R. Petzold}, + doi = {10.1063/1.2159468}, + issn = {00219606}, + issue = {4}, + journal = {Journal of Chemical Physics}, + title = {Efficient step size selection for the tau-leaping simulation method}, + volume = {124}, + year = {2006}, +} +@article{Finnie2016, + abstract = {Epidemiology relies on data but the divergent ways data are recorded and transferred, both within and between outbreaks, and the expanding range of data-types are creating an increasingly complex problem for the discipline. There is a need for a consistent, interpretable and precise way to transfer data while maintaining its fidelity. We introduce 'EpiJSON', a new, flexible, and standards-compliant format for the interchange of epidemiological data using JavaScript Object Notation. This format is designed to enable the widest range of epidemiological data to be unambiguously held and transferred between people, software and institutions. In this paper, we provide a full description of the format and a discussion of the design decisions made. We introduce a schema enabling automatic checks of the validity of data stored as EpiJSON, which can serve as a basis for the development of additional tools. In addition, we also present the R package 'repijson' which provides conversion tools between this format, line-list data and pre-existing analysis tools. An example is given to illustrate how EpiJSON can be used to store line list data. EpiJSON, designed around modern standards for interchange of information on the internet, is simple to implement, read and check. As such, it provides an ideal new standard for epidemiological, and other, data transfer to the fast-growing open-source platform for the analysis of disease outbreaks.}, + author = {Thomas J.R. Finnie and Andy South and Ana Bento and Ellie Sherrard-Smith and Thibaut Jombart}, + doi = {10.1016/j.epidem.2015.12.002}, + issn = {18780067}, + journal = {Epidemics}, + title = {EpiJSON: A unified data-format for epidemiology}, + volume = {15}, + year = {2016}, +} +@article{FitzHugh1961, + abstract = {Van der Pol's equation for a relaxation oscillator is generalized by the addition of terms to produce a pair of non-linear differential equations with either a stable singular point or a limit cycle. The resulting “BVP model” has two variables of state, representing excitability and refractoriness, and qualitatively resembles Bonhoeffer's theoretical model for the iron wire model of nerve. This BVP model serves as a simple representative of a class of excitable-oscillatory systems including the Hodgkin-Huxley (HH) model of the squid giant axon. The BVP phase plane can be divided into regions corresponding to the physiological states of nerve fiber (resting, active, refractory, enhanced, depressed, etc.) to form a “physiological state diagram,” with the help of which many physiological phenomena can be summarized. A properly chosen projection from the 4-dimensional HH phase space onto a plane produces a similar diagram which shows the underlying relationship between the two models. Impulse trains occur in the BVP and HH models for a range of constant applied currents which make the singular point representing the resting state unstable. © 1961, The Biophysical Society. All rights reserved.}, + author = {Richard FitzHugh}, + doi = {10.1016/S0006-3495(61)86902-6}, + issn = {00063495}, + issue = {6}, + journal = {Biophysical Journal}, + title = {Impulses and Physiological States in Theoretical Models of Nerve Membrane}, + volume = {1}, + year = {1961}, +} +@inproceedings{Gillespie1977, + abstract = {There are two formalisms for mathematically describing the time behavior of a spatially homogeneous chemical system: The deterministic approach regards the time evolution as a continuous, wholly predictable process which is governed by a set of coupled, ordinary differential equations (the "reaction-rate equations"); the stochastic approach regards the time evolution as a kind of random-walk process which is governed by a single differential-difference equation (the "master equation"). Fairly simple kinetic theory arguments show that the stochastic formulation of chemical kinetics has a firmer physical basis than the deterministic formulation, but unfortunately the stochastic master equation is often mathematically intractable. There is, however, a way to make exact numerical calculations within the framework of the stochastic formulation without having to deal with the master equation directly. It is a relatively simple digital computer algorithm which uses a rigorously derived Monte Carlo procedure to numerically simulate the time evolution of the given chemical system. Like the master equation, this "stochastic simulation algorithm" correctly accounts for the inherent fluctuations and correlations that are necessarily ignored in the deterministic formulation. In addition, unlike most procedures for numerically solving the deterministic reaction-rate equations, this algorithm never approximates infinitesimal time increments dt by finite time steps Δt. The feasibility and utility of the simulation algorithm are demonstrated by applying it to several well-known model chemical systems, including the Lotka model, the Brusselator, and the Oregonator.}, + author = {Daniel T. Gillespie}, + doi = {10.1021/j100540a008}, + issn = {00223654}, + issue = {25}, + journal = {Journal of Physical Chemistry}, + title = {Exact stochastic simulation of coupled chemical reactions}, + volume = {81}, + year = {1977}, +} +@article{Girolami2011, + abstract = {The paper proposes Metropolis adjusted Langevin and Hamiltonian Monte Carlo sampling methods defined on the Riemann manifold to resolve the shortcomings of existing Monte Carlo algorithms when sampling from target densities that may be high dimensional and exhibit strong correlations. The methods provide fully automated adaptation mechanisms that circumvent the costly pilot runs that are required to tune proposal densities for Metropolis-Hastings or indeed Hamiltonian Monte Carlo and Metropolis adjusted Langevin algorithms. This allows for highly efficient sampling even in very high dimensions where different scalings may be required for the transient and stationary phases of the Markov chain. The methodology proposed exploits the Riemann geometry of the parameter space of statistical models and thus automatically adapts to the local structure when simulating paths across this manifold, providing highly efficient convergence and exploration of the target density. The performance of these Riemann manifold Monte Carlo methods is rigorously assessed by performing inference on logistic regression models, log-Gaussian Cox point processes, stochastic volatility models and Bayesian estimation of dynamic systems described by non-linear differential equations. Substantial improvements in the time-normalized effective sample size are reported when compared with alternative sampling approaches. MATLAB code that is available from allows replication of all the results reported. © 2011 Royal Statistical Society.}, + author = {Mark Girolami and Ben Calderhead}, + doi = {10.1111/j.1467-9868.2010.00765.x}, + issn = {13697412}, + issue = {2}, + journal = {Journal of the Royal Statistical Society. Series B: Statistical Methodology}, + title = {Riemann manifold Langevin and Hamiltonian Monte Carlo methods}, + volume = {73}, + year = {2011}, +} +@article{Hethcote1973, + abstract = {The effects of a periodic contact rate and of carriers are considered for a generalization of Bailey's simple epidemic model. In this model it is assumed that individuals become susceptible again as soon as they recover from the infection so that a fixed population can be divided into a class of infectives and a class of susceptibles which vary with time. If the contact rate is periodic, then the number of infectives as time approaches infinity either tends to zero or is asymptotically periodic depending on whether the total population size is less than or greater than a threshold value. The behavior for large time of the number of infectives is determined for three modifications of the model which involve carriers. © 1973 Society for Mathematical Biology.}, + author = {Herbert W. Hethcote}, + doi = {10.1007/BF02458365}, + issn = {00074985}, + issue = {5-6}, + journal = {Bulletin of Mathematical Biology}, + title = {Asymptotic behavior in a deterministic epidemic model}, + volume = {35}, + year = {1973}, +} +@inproceedings{Gillespie1977, + abstract = {There are two formalisms for mathematically describing the time behavior of a spatially homogeneous chemical system: The deterministic approach regards the time evolution as a continuous, wholly predictable process which is governed by a set of coupled, ordinary differential equations (the "reaction-rate equations"); the stochastic approach regards the time evolution as a kind of random-walk process which is governed by a single differential-difference equation (the "master equation"). Fairly simple kinetic theory arguments show that the stochastic formulation of chemical kinetics has a firmer physical basis than the deterministic formulation, but unfortunately the stochastic master equation is often mathematically intractable. There is, however, a way to make exact numerical calculations within the framework of the stochastic formulation without having to deal with the master equation directly. It is a relatively simple digital computer algorithm which uses a rigorously derived Monte Carlo procedure to numerically simulate the time evolution of the given chemical system. Like the master equation, this "stochastic simulation algorithm" correctly accounts for the inherent fluctuations and correlations that are necessarily ignored in the deterministic formulation. In addition, unlike most procedures for numerically solving the deterministic reaction-rate equations, this algorithm never approximates infinitesimal time increments dt by finite time steps Δt. The feasibility and utility of the simulation algorithm are demonstrated by applying it to several well-known model chemical systems, including the Lotka model, the Brusselator, and the Oregonator.}, + author = {Daniel T. Gillespie}, + doi = {10.1021/j100540a008}, + issn = {00223654}, + issue = {25}, + journal = {Journal of Physical Chemistry}, + title = {Exact stochastic simulation of coupled chemical reactions}, + volume = {81}, + year = {1977}, +} +@book{Brauer2008, + author = {Fred Brauer}, + city = {Berlin, Heidelberg}, + doi = {10.1007/978-3-540-78911-6}, + editor = {Fred Brauer and Pauline van den Driessche and Jianhong Wu}, + isbn = {978-3-540-78910-9}, + journal = {Sp}, + publisher = {Springer Berlin Heidelberg}, + title = {Mathematical Epidemiology}, + volume = {1945}, + url = {http://link.springer.com/10.1007/978-3-540-78911-6}, + year = {2008}, +} +@article{Aron1984, + abstract = {The annual incidence rates of some endemic infectious diseases are steady while others fluctuate dramatically, often in a regular cycle. In order to investigate the role of seasonality in driving cycles of recurrent epidemics, we analyze numerically the susceptible/exposed/infective/recovered (SEIR) epidemic model with seasonal transmission. We show that small-amplitude periodic solutions exhibit a sequence of period-doubling bifurcations as the amplitude of seasonal variation increases, predicting a transition to chaos of the kind studied in other biological contexts. The epidemiological implication is that the seasonal mechanism generating biennial epidemics may not be able to account for small-amplitude recurrent epidemics of arbitrary periodicity. © 1997 Elsevier Science Ltd. All rights reserved.}, + author = {Joan L. Aron and Ira B. Schwartz}, + doi = {10.1016/S0022-5193(84)80150-2}, + issn = {0022-5193}, + issue = {4}, + journal = {Journal of theoretical biology}, + keywords = {Biological*,Communicable Diseases / epidemiology*,Disease Outbreaks / epidemiology*,England,Humans,I B Schwartz,J L Aron,MEDLINE,Mathematics,Measles / epidemiology,Models,NCBI,NIH,NLM,National Center for Biotechnology Information,National Institutes of Health,National Library of Medicine,New York City,Periodicity*,PubMed Abstract,Seasons*,Time Factors,Wales,doi:10.1016/s0022-5193(84)80150-2,pmid:6521486}, + month = {10}, + pages = {665-679}, + pmid = {6521486}, + publisher = {J Theor Biol}, + title = {Seasonality and period-doubling bifurcations in an epidemic model}, + volume = {110}, + url = {https://pubmed.ncbi.nlm.nih.gov/6521486/}, + year = {1984}, +} From 9c0096ec80c7481c7edd3798faff2919992033f5 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 22:42:41 +0100 Subject: [PATCH 135/188] reformatted --- .../notebooks/common_models/FitzHugh.ipynb | 100 +++++++++++++----- 1 file changed, 72 insertions(+), 28 deletions(-) diff --git a/docs/pygom-doc/notebooks/common_models/FitzHugh.ipynb b/docs/pygom-doc/notebooks/common_models/FitzHugh.ipynb index a94f5f0e..9d694ea3 100644 --- a/docs/pygom-doc/notebooks/common_models/FitzHugh.ipynb +++ b/docs/pygom-doc/notebooks/common_models/FitzHugh.ipynb @@ -4,51 +4,95 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.FitzHugh`\n", + "# FitzHugh\n", "\n", - "The FitzHugh model [\\[FitzHugh1961\\]]() without external external\n", - "stimulus. This is a commonly used model when developing new methodology\n", - "with regard to ode's, see [\\[Ramsay2007\\]]() and [\\[Girolami2011\\]]()\n", - "and reference therein.\n", + "{func}`.FitzHugh` - the {cite:t}`FitzHugh1961` model without external stimulus\n", + "\n", + "This is a commonly used model when developing new methodology\n", + "with regards to ODEs, see {cite:p}`Ramsay2007` and {cite}`Girolami2011`.\n", + "\n", + "#TODO why common model?\n", "\n", "$$\\begin{aligned}\n", "\\frac{dV}{dt} &= c ( V - \\frac{V^{3}}{3} + R) \\\\\n", "\\frac{dR}{dt} &= -\\frac{1}{c}(V - a + bR).\n", "\\end{aligned}$$\n", "\n", - "An example would be\n", - "\n", - "In \\[1\\]: import numpy\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[1\\]: ode = common_models.FitzHugh({'a':0.2, 'b':0.2, 'c':3.0})\n", - "\n", - "In \\[1\\]: t = numpy.linspace(0, 20, 101)\n", - "\n", - "In \\[1\\]: x0 = \\[1.0, -1.0\\]\n", + "An example of using this model follows.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c751b93a", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "from pygom import common_models\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "import matplotlib.pyplot as plt\n", "\n", - "@savefig common_models_fh_1.png In \\[1\\]: ode.plot()\n", + "ode = common_models.FitzHugh({'a':0.2, 'b':0.2, 'c':3.0})\n", "\n", - "In \\[1\\]: plt.close()\n", + "t = numpy.linspace(0, 20, 101)\n", "\n", - "In \\[1\\]: fig = plt.figure()\n", + "x0 = [1.0, -1.0]\n", "\n", - "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,1\\], 'b')\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "@savefig common_models_fh_2.png In \\[1\\]: plt.show()\n", + "solution = ode.integrate(t[1::])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ccee969d", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "ode.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98a5e32e", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", "\n", - "In \\[1\\]: plt.close()" + "plt.plot(solution[:,0], solution[:,1], 'b')\n", + "plt.show()\n" ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From e6f6944664872871d21663090c219f0ab7302165 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Mon, 28 Aug 2023 23:22:28 +0100 Subject: [PATCH 136/188] reformatted --- .../common_models/Legrand_Ebola_SEIHFR.ipynb | 78 ++++++--- .../notebooks/common_models/Lorenz.ipynb | 92 ++++++++-- .../common_models/Lotka_Volterra.ipynb | 165 ++++++++++++------ .../common_models/Lotka_Volterra_4State.ipynb | 79 +++++---- .../notebooks/common_models/Robertson.ipynb | 123 +++++++------ 5 files changed, 352 insertions(+), 185 deletions(-) diff --git a/docs/pygom-doc/notebooks/common_models/Legrand_Ebola_SEIHFR.ipynb b/docs/pygom-doc/notebooks/common_models/Legrand_Ebola_SEIHFR.ipynb index cab8043e..7affc240 100644 --- a/docs/pygom-doc/notebooks/common_models/Legrand_Ebola_SEIHFR.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Legrand_Ebola_SEIHFR.ipynb @@ -4,13 +4,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.Legrand_Ebola_SEIHFR`\n", + "# `Legrand_Ebola_SEIHFR`\n", "\n", - "A commonly used model in the literature to model Ebola outbreaks is the\n", - "SEIHFR model proposed by [\\[Legrand2007\\]](). There are two extra\n", - "compartments on top of the standard SEIR, $H$ for hospitialization and\n", - "$F$ for funeral. A total of ten parameters (with some describing the\n", - "inverse) are required for the model, they are:\n", + "{func}`Legrand_Ebola_SEIHFR`\n", + "\n", + "A commonly used model in the literature to capture the dynamics of Ebola outbreaks is the\n", + "SEIHFR model proposed by {cite}`Legrand2007`. There are two extra\n", + "compartments on top of the SEIR: $H$ for hospitializations and\n", + "$F$ for funerals. A total of ten parameters (with some describing the\n", + "inverse) are required for the model.\n", "\n", "| Symbol | Process |\n", "|:-------------|:--------------------------------------------|\n", @@ -27,7 +29,7 @@ "\n", "The **(inverse)** denotes the parameter should be inverted to make\n", "epidemiological sense. We use the parameters in their more natural from\n", - "in `.Legrand_Ebola_SEIHFR` and replace all the $\\gamma$'s with\n", + "in {func}`Legrand_Ebola_SEIHFR` and replace all the $\\gamma$'s with\n", "$\\omega$'s, i.e. $\\omega_{i} = \\gamma_{i}^{-1}$ for $i \\in \\{I,D,H,F\\}$.\n", "We also used $\\alpha^{-1}$ in our model instead of $\\alpha$ so that\n", "reading the parameters directly gives a more intuitive meaning. There\n", @@ -50,7 +52,7 @@ "\\gamma_{DH} &= (\\gamma_{D}^{-1} - \\gamma_{H}^{-1})^{-1}.\n", "\\end{aligned}$$\n", "\n", - "Now we are ready to state the full set of ode's,\n", + "Now we are ready to state the full set of ODEs,\n", "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= -N^{-1} (\\beta_{I}SI + \\beta_{H}SH + \\beta_{F}(t) SF) \\\\\n", @@ -67,37 +69,55 @@ "\n", "$$\\beta_{F}(t) = \\beta_{F} \\left(1 - \\frac{1}{1 + \\exp(-\\kappa (t - c))} \\right)$$\n", "\n", - "A brief example (from \\[3\\]) is given here with a slightly more in depth\n", - "example in `estimate2`.\n", - "\n", - "In \\[1\\]: import numpy\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", + "A brief example is given here with a slightly more in depth\n", + "example in {doc}`estimate2`.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "94abc37f", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy\n", "\n", - "In \\[1\\]: x0 = \\[1.0, 3.0/200000.0, 0.0, 0.0, 0.0, 0.0, 0.0\\]\n", + "from pygom import common_models\n", "\n", - "In \\[1\\]: t = numpy.linspace(1, 25, 100)\n", + "x0 = [1.0, 3.0/200000.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n", "\n", - "In \\[1\\]: ode = common_models.Legrand_Ebola_SEIHFR(\\[ \n", - "...: ('beta_I',0.588), ...: ('beta_H',0.794), ...: ('beta_F',7.653),\n", - "...: ('omega_I',10.0/7.0), ...: ('omega_D',9.6/7.0), ...:\n", - "('omega_H',5.0/7.0), ...: ('omega_F',2.0/7.0), ...:\n", - "('alphaInv',7.0/7.0), ...: ('delta',0.81), ...: ('theta',0.80), ...:\n", - "('kappa',300.0), ...: ('interventionTime',7.0) ...: \\])\n", + "t = numpy.linspace(1, 25, 100)\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "ode = common_models.Legrand_Ebola_SEIHFR([('beta_I',0.588), ('beta_H',0.794), ('beta_F',7.653), ('omega_I',10.0/7.0), ('omega_D',9.6/7.0),\n", + "('omega_H',5.0/7.0), ('omega_F',2.0/7.0), ('alphaInv',7.0/7.0), ('delta',0.81), ('theta',0.80), ('kappa',300.0), ('interventionTime',7.0)])\n", "\n", - "In \\[1\\]: solution = ode.integrate(t)\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "@savefig common_models_seihfr.png In \\[1\\]: ode.plot()\n", + "solution = ode.integrate(t)\n", "\n", - "Note also that we have again standardized so that the number of\n", + "ode.plot()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "4836c8f5", + "metadata": {}, + "source": [ + "```{note}\n", + "We have standardized the states so that the number of\n", "susceptible is 1 and equal to the whole population, i.e. $N$ does not\n", - "exist in our set of ode's as defined in `.common_models`." + "exist in our set of ODEs as defined in {mod}`common_models`.\n", + "```" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/Lorenz.ipynb b/docs/pygom-doc/notebooks/common_models/Lorenz.ipynb index 74b29ea3..2a95125e 100644 --- a/docs/pygom-doc/notebooks/common_models/Lorenz.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Lorenz.ipynb @@ -4,9 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.Lorenz`\n", + "# Lorenz\n", "\n", - "The Lorenz attractor [\\[Lorenz1963\\]]() defined by the equations\n", + "{func}`.Lorenz`\n", + "\n", + "The Lorenz attractor {cite}`Lorenz1963` is defined by these equations.\n", "\n", "$$\\begin{aligned}\n", "\\frac{dx}{dt} &= \\sigma (y-x) \\\\\n", @@ -14,32 +16,86 @@ "\\frac{dz}{dt} &= xy - \\beta z\n", "\\end{aligned}$$\n", "\n", - "A classic example is\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import numpy\n", + "A classic example is given in the following code." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e9d4dc8b", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "import numpy\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 100, 20000)\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode = common_models.Lorenz({'beta':8.0/3.0, 'sigma':10.0,\n", - "'rho':28.0})\n", + "t = numpy.linspace(0, 100, 20000)\n", "\n", - "In \\[1\\]: ode.initial_values = (\\[1., 1., 1.\\], t\\[0\\])\n", + "ode = common_models.Lorenz({'beta':8.0/3.0, 'sigma':10.0, 'rho':28.0})\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "ode.initial_values = ([1., 1., 1.], t[0])\n", "\n", - "In \\[1\\]: f = plt.figure()\n", + "solution = ode.integrate(t[1::])\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0244f462", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGhCAYAAADBddZJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydZXQbh7aFP4FlZmbG2A4zM7dNUriFW+Y2hZSZ29v2tSkzMycNMzObmZlZloXvh6yJbMuJHU4731pZrWV5JNvyaM85++wjMRgMBkREREREREREzhHS8/0ERERERERERP5diOJDRERERERE5Jwiig8RERERERGRc4ooPkRERERERETOKaL4EBERERERETmniOJDRERERERE5Jwiig8RERERERGRc4ooPkRERERERETOKaL4EBERERERETmniOJDRERERERE5JzSL/Hx/PPPI5FIuvyLiYkRPq9Sqbjnnntwd3fHwcGBRYsWUVVVdcaftIiIiIiIiMjFS78rHwMGDKCiokL4t2vXLuFzDz74ICtXruT3339n+/btlJeXs3DhwjP6hEVEREREREQubuT9/gK5HB8fnx63NzU18eWXX/LTTz8xZcoUAL7++mtiY2PZt28fo0aN6tPx9Xo95eXlODo6IpFI+vv0RERERERERM4DBoOBlpYW/Pz8kEpPXNvot/jIycnBz88PGxsbRo8ezWuvvUZQUBCHDx9Go9Ewbdo04b4xMTEEBQWxd+/eXsVHR0cHHR0dwsdlZWXExcX192mJiIiIiIiIXACUlJQQEBBwwvv0S3yMHDmSb775hujoaCoqKnjhhRcYP348qampVFZWolAocHFx6fI13t7eVFZW9nrM1157jRdeeMHik3dycurP0xMRERERERE5TzQ3NxMYGIijo+NJ79sv8TF79mzh/xMTExk5ciTBwcH89ttv2Nra9v+ZAk888QRLliwRPjY9eScnJ1F8iIiIiIiIXGT0xTJxWqO2Li4uREVFkZubi4+PD2q1msbGxi73qaqqsugRMWFtbS0IDVFwiIiIiIiI/PM5LfHR2tpKXl4evr6+DB06FCsrKzZv3ix8Pisri+LiYkaPHn3aT1RERERERETkn0G/2i4PP/ww8+fPJzg4mPLycp577jlkMhlXX301zs7O3HLLLSxZsgQ3NzecnJxYvHgxo0eP7vOki4iIiIiIiMg/n36Jj9LSUq6++mrq6urw9PRk3Lhx7Nu3D09PTwCWLl2KVCpl0aJFdHR0MHPmTD766KOz8sRFRERERERELk4kBoPBcL6fhDnNzc04OzvT1NQk+j9EREREREQuEvrz/i3udhERERERERE5p4jiQ0REREREROScIooPERERERERkXOKKD5EREREREREzimi+BARERERERE5p4jiQ0REREREROScIooPERERERERkXNKv0LGRERERERERM4srR1aMiqaqWtV067R0taho12tQ6nWodRokUkkRHk7EuPrSJiHAwr5xV83EMWHiIiIiIjIOUKl0ZFR0UxyaVPnv0Zya1rpa9ynlUxCuKcDsb5OTIjyYH6iH3LZxSdGxIRTERERERGRs0hOVQtrUyvZlFFFenkzWn3Pt11fZxv8XGyxU8iwtZIZ/6uQY6+QodLqyKpsIbOihZYObZevC3G3494pkVw26PyLkP68f4viQ0RERERE5AxiMBjIqGhhbWoFa1Mrya1u7fJ5d3sFiQHOJAa4CP/1dLTu03HLGtvJrGghqbSRH/cXU9+mBiDY3Y57J0ewYLD/eRMhovgQERERERE5x6SWNbEquYK1qRUU1SmF2xUyKeMiPZgV78OYcHf8XWyRSCSn/XhtHVp+2FfEpzvyBREyKsyNL28Yjr31uXdViOJDRERERETkHKDS6FiVXMH3+4pIKmkUbreWS5kU7cnseF+mxHrhZGN11p6DUm0UIe9tzqW1Q8uwYFe+vmk4jmfxMS0hig8REREREZGzSEm9kh/2FfHboRIalBrAWOGYHufN7AQfJkd7nfPqQ1JJI//9cj/NKi2DAl349uYRONueOwEiig8REREREZEzjE5vYEd2Dd/tLWRbdo0woeLvYss1I4O4anggHg4n926cTVLLmrjuy/00KjUkBjjz3c0jcLFTnJPHFsWHiIiIiIjIGUKl0fH74VI+35FPcf1xL8f4SA+uHx3ClBgvZNLT93CcKdLLm7nuy/3Ut6mZFuvNFzcMOyeP25/3bzHnQ0RERERExAJKtZaf9hfz2Y58qls6AHCykXPFsECuGxVMqIf9eX6Glonzc+L7W0Zw6Qe72ZRRxe7cWsZGeJzvp9UFUXyIiIiIiIiY0aLS8N3eIr7cVSBMkfg623DnxHCuHBaIrUJ2np/hyRng58x1o4L5Zk8hL6/OYNXi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", + "text/plain": [ + "
        " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "f = plt.figure()\n", "\n", - "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,2\\]);\n", + "plt.plot(solution[:,0], solution[:,2]);\n", "\n", - "@savefig common_models_Lorenz.png In \\[1\\]: plt.show()" + "plt.show()" ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "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.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb index 8063348d..3b21bdb3 100644 --- a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb @@ -4,104 +4,155 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.Lotka_Volterra`\n", + "# Lotka Volterra\n", "\n", - "A standard Lotka-Volterra (preditor and prey) model with two states and\n", - "four parameters [\\[Lotka1920\\]]().\n", + "{func}`.Lotka_Volterra` - the standard predator and prey model with two states and four parameters {cite}`Lotka1920`\n", "\n", "$$\\begin{aligned}\n", "\\frac{dx}{dt} &= \\alpha x - cxy \\\\\n", "\\frac{dy}{dt} &= -\\delta y + \\gamma xy\n", "\\end{aligned}$$\n", "\n", - "with both birth and death processes.\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import numpy\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "with both birth and death processes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "758e12e8", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: x0 = \\[2.0, 6.0\\]\n", + "import numpy\n", "\n", - "In \\[1\\]: ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3,\n", - "'c':2, 'gamma':6})\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, 0)\n", + "x0 = [2.0, 6.0]\n", "\n", - "In \\[1\\]: t = numpy.linspace(0.1, 100, 10000)\n", + "ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3, 'c':2, 'gamma':6})\n", "\n", - "In \\[1\\]: solution = ode.integrate(t)\n", + "ode.initial_values = (x0, 0)\n", "\n", - "@savefig common_models_Lotka_Volterra.png In \\[1\\]: ode.plot()\n", + "t = numpy.linspace(0.1, 100, 10000)\n", "\n", - "In \\[1\\]: plt.close()\n", + "solution = ode.integrate(t)\n", "\n", - "Then we generate the graph at [Wolfram\n", + "ode.plot()\n" + ] + }, + { + "cell_type": "markdown", + "id": "1943441d", + "metadata": {}, + "source": [ + "Then we can generate the graph at [Wolfram\n", "Alpha](http://www.wolframalpha.com/input/?i=lotka-volterra+equations)\n", - "with varying initial conditions.\n", - "\n", - "In \\[1\\]: x1List = numpy.linspace(0.2, 2.0, 5)\n", - "\n", - "In \\[1\\]: x2List = numpy.linspace(0.6, 6.0, 5)\n", - "\n", - "In \\[1\\]: fig = plt.figure()\n", + "with varying initial conditions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "b5c82937", + "metadata": {}, + "source": [ + "x1List = numpy.linspace(0.2, 2.0, 5)\n", "\n", - "In \\[1\\]: solutionList = list()\n", + "x2List = numpy.linspace(0.6, 6.0, 5)\n", "\n", - "In \\[1\\]: ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3,\n", - "'c':2, 'gamma':6})\n", + "fig = plt.figure()\n" + ] + }, + { + "cell_type": "markdown", + "id": "5a492117", + "metadata": {}, + "source": [ "\n", - "In \\[1\\]: for i in range(len(x1List)): \n", - "...: ode.initial_values = (\\[x1List\\[i\\], x2List\\[i\\]\\], 0) ...:\n", - "solutionList += \\[ode.integrate(t)\\]\n", + "solutionList = list()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2a1d859", + "metadata": {}, + "outputs": [], + "source": [ + "ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3, 'c':2, 'gamma':6})\n", "\n", - "In \\[1\\]: for i in range(len(x1List)):\n", - "plt.plot(solutionList\\[i\\]\\[100::,0\\], solutionList\\[i\\]\\[100::,1\\],\n", - "'b')\n", + "for i in range(len(x1List)): \n", + " ode.initial_values = ([x1List[i], x2List[i]], 0)\n", "\n", - "In \\[1\\]: plt.xlabel('x')\n", + "solutionList += [ode.integrate(t)]\n", "\n", - "In \\[1\\]: plt.ylabel('y')\n", + "for i in range(len(x1List)):\n", + " plt.plot(solutionList[i][100::,0], solutionList[i][100::,1], 'b')\n", "\n", - "@savefig common_models_Lotka_Volterra_initial_condition.png In \\[1\\]:\n", - "plt.show()\n", + "plt.xlabel('x')\n", "\n", - "In \\[1\\]: plt.close()\n", + "plt.ylabel('y')\n", "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c628f283", + "metadata": {}, + "source": [ "We also know that the system has the critical points at\n", "$x = \\delta / \\gamma$ and $y=\\alpha / c$. If we changes the parameters\n", "in such a way that the ration between $x$ and $y$ remains the same, then\n", - "we get a figure as below\n", + "we get a figure as below.\n" + ] + }, + { + "cell_type": "markdown", + "id": "837940dd", + "metadata": {}, + "source": [ + "cList = numpy.linspace(0.1, 2.0, 5)\n", "\n", - "In \\[1\\]: cList = numpy.linspace(0.1, 2.0, 5)\n", + "gammaList = numpy.linspace(0.6, 6.0, 5)\n", "\n", - "In \\[1\\]: gammaList = numpy.linspace(0.6, 6.0, 5)\n", + "fig = plt.figure()\n", "\n", - "In \\[1\\]: fig = plt.figure()\n", + "for i in range(len(x1List)): \n", + " ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3, \n", + " 'c':cList[i], 'gamma':gammaList[i]})\n", "\n", - "In \\[1\\]: for i in range(len(x1List)): \n", - "...: ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3,\n", - "'c':cList\\[i\\], 'gamma':gammaList\\[i\\]}) ...: ode.initial_values =\n", - "(x0, 0) ...: solutionList += \\[ode.integrate(t)\\]\n", + "ode.initial_values = (x0, 0) \n", + "solutionList += [ode.integrate(t)]\n", "\n", - "In \\[1\\]: for i in range(len(cList)):\n", - "plt.plot(solutionList\\[i\\]\\[100::,0\\], solutionList\\[i\\]\\[100::,1\\])\n", + "for i in range(len(cList)):\n", + " plt.plot(solutionList[i][100::,0], solutionList[i][100::,1])\n", "\n", - "In \\[1\\]: plt.xlabel('x')\n", + "plt.xlabel('x')\n", "\n", - "In \\[1\\]: plt.ylabel('y')\n", + "plt.ylabel('y')\n", "\n", - "@savefig common_models_Lotka_Volterra_critical_point.png In \\[1\\]:\n", - "plt.show()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "f05ce4a3", + "metadata": {}, + "source": [ "\n", - "In \\[1\\]: plt.close()\n", "\n", "where all the cycles goes through the same points." ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb index 34ec9f82..807863e0 100644 --- a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb @@ -4,10 +4,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.Lotka_Volterra_4State`\n", + "# Lotka_Volterra (4 state)\n", + "\n", + "{func}`.Lotka_Volterra_4State`\n", "\n", "The Lotka-Volterra model with four states and three parameters\n", - "[\\[Lotka1920\\]](), explained by the following three transitions\n", + "{cite}`Lotka1920`, is explained by the following three equations.\n", "\n", "$$\\begin{aligned}\n", "\\frac{da}{dt} &= k_{0} a x \\\\\n", @@ -17,51 +19,66 @@ "\\end{aligned}$$\n", "\n", "First, we show the deterministic approach. Then we also show the\n", - "different process path using the parameters from [\\[Press2007\\]](). Note\n", - "that although the model is defined in `common_models`, it is based on\n", - "outputting an `OperateOdeModel` rather than `SimulateOdeModel`.\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "different process path using the parameters from {cite}`Press2007`. Note\n", + "that although the model is defined in {class}`common_models`, it is based on\n", + "outputting an {func}`.OperateOdeModel` rather than {func}`.SimulateOdeModel`.\n", "\n", - "In \\[1\\]: from pygom import Transition, TransitionType, ode_utils,\n", - "SimulateOde\n", + "#TODO why is the predefined version not used?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c33dd44b", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: import numpy\n", + "from pygom import Transition, TransitionType, ode_utils, SimulateOde\n", "\n", - "In \\[1\\]: stateList = \\['a', 'x', 'y', 'b'\\]\n", + "import numpy\n", "\n", - "In \\[1\\]: paramList = \\['k0', 'k1', 'k2'\\]\n", + "stateList = ['a', 'x', 'y', 'b']\n", "\n", - "In \\[1\\]: transitionList = \\[ \n", - "...: Transition(origin='a', destination='x', equation='k0\\*a\\*x',\n", - "transition_type=TransitionType.T), ...: Transition(origin='x',\n", - "destination='y', equation='k1\\*x\\*y', transition_type=TransitionType.T),\n", - "...: Transition(origin='y', destination='b', equation='k2\\*y',\n", - "transition_type=TransitionType.T) ...: \\]\n", + "paramList = ['k0', 'k1', 'k2']\n", "\n", - "In \\[1\\]: ode = SimulateOde(stateList, paramList,\n", - "transition=transitionList)\n", + "transitionList = [Transition(origin='a', destination='x', equation='k0*a*x', transition_type=TransitionType.T), \n", + " Transition(origin='x', destination='y', equation='k1*x*y', transition_type=TransitionType.T),Transition(origin='y', destination='b', equation='k2*y', transition_type=TransitionType.T)]\n", "\n", - "In \\[1\\]: x0 = \\[150.0, 10.0, 10.0, 0.0\\]\n", + "ode = SimulateOde(stateList, paramList, transition=transitionList)\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 15, 100)\n", + "x0 = [150.0, 10.0, 10.0, 0.0]\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "t = numpy.linspace(0, 15, 100)\n", "\n", - "In \\[1\\]: ode.parameters = \\[0.01, 0.1, 1.0\\]\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "ode.parameters = [0.01, 0.1, 1.0]\n", "\n", - "@savefig common_models_Lotka_Volterra_4State.png In \\[1\\]: ode.plot()\n", + "solution = ode.integrate(t[1::])\n", "\n", - "In \\[1\\]: simX, simT = ode.simulate_jump(t\\[1::\\], 5, full_output=True)\n", + "ode.plot()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "478daeb9", + "metadata": {}, + "outputs": [], + "source": [ + "simX, simT = ode.simulate_jump(t[1::], 5, full_output=True)\n", "\n", - "@savefig common_models_Lotka_Volterra_Sim.png In \\[1\\]: ode.plot(simX,\n", - "simT)" + "ode.plot(simX, simT)" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/Robertson.ipynb b/docs/pygom-doc/notebooks/common_models/Robertson.ipynb index fc1eb714..19865a94 100644 --- a/docs/pygom-doc/notebooks/common_models/Robertson.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Robertson.ipynb @@ -4,9 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.Robertson`\n", + "# Robertson\n", "\n", - "The Robertson problem [\\[Robertson1966\\]]()\n", + "{func}`.Robertson` - the Robertson problem {cite}`Robertson1966`\n", "\n", "$$\\begin{aligned}\n", "\\frac{dy_{1}}{dt} &= -0.04 y_{1} + 1 \\cdot 10^{4} y_{2} y_{3} \\\\\n", @@ -15,80 +15,103 @@ "\\end{aligned}$$\n", "\n", "This is a problem that describes an autocatalytic reaction. One of those\n", - "commonly used to test stiff ode solvers. As the parameters in the\n", - "literature is fixed, we show here how to define the states in a slightly\n", - "more compact format\n", - "\n", - "In \\[1\\]: from pygom import DeterministicOde, Transition, TransitionType\n", - "\n", - "In \\[1\\]: import numpy\n", + "commonly used to test stiff ODE solvers. As the parameters in the\n", + "literature are fixed, we show here how to define the states in a slightly more compact format." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33e99698", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import DeterministicOde, Transition, TransitionType\n", "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "import numpy\n", "\n", - "In \\[1\\]: t = numpy.append(0, 4\\*numpy.logspace(-6, 6, 1000))\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: \\# note how we define the states\n", + "t = numpy.append(0, 4*numpy.logspace(-6, 6, 1000))\n", "\n", - "In \\[1\\]: stateList = \\['y1:4'\\]\n", + "# note how we define the states\n", "\n", - "In \\[1\\]: paramList = \\[\\]\n", + "stateList = ['y1:4']\n", "\n", - "In \\[1\\]: transitionList = \\[ \n", - "...: Transition(origin='y1', destination='y2', equation='0.04\\*y1',\n", - "transition_type=TransitionType.T), ...: Transition(origin='y2',\n", - "destination='y1', equation='1e4\\*y2\\*y3',\n", - "transition_type=TransitionType.T), ...: Transition(origin='y2',\n", - "destination='y3', equation='3e7\\*y2\\*y2',\n", - "transition_type=TransitionType.T) ...: \\]\n", + "paramList = []\n", "\n", - "In \\[1\\]: ode = DeterministicOde(stateList, paramList,\n", - "transition=transitionList)\n", + "transitionList = [Transition(origin='y1', destination='y2', equation='0.04*y1', transition_type=TransitionType.T), \n", + " Transition(origin='y2', destination='y1', equation='1e4*y2*y3', transition_type=TransitionType.T), \n", + " Transition(origin='y2', destination='y3', equation='3e7*y2*y2', transition_type=TransitionType.T)\n", + " ]\n", "\n", - "In \\[1\\]: ode.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "ode = DeterministicOde(stateList, paramList, transition=transitionList)\n", "\n", - "In \\[1\\]: solution, output = ode.integrate(t\\[1::\\], full_output=True)\n", + "ode.initial_values = ([1.0, 0.0, 0.0], t[0])\n", "\n", - "In \\[1\\]: f, axarr = plt.subplots(1, 3)\n", + "solution, output = ode.integrate(t[1::], full_output=True)\n", "\n", - "In \\[1\\]: for i in range(3): \n", - "...: axarr\\[i\\].plot(t, solution\\[:,i\\]) ...:\n", - "axarr\\[i\\].set_xscale('log')\n", + "f, axarr = plt.subplots(1, 3)\n", "\n", - "In \\[1\\]: f.tight_layout();\n", + "for i in range(3):\n", + " axarr[i].plot(t, solution[:,i])\n", + " axarr[i].set_xscale('log')\n", "\n", - "@savefig common_models_Robertson_1.png In \\[1\\]: plt.show()\n", + "f.tight_layout();\n", "\n", - "In \\[1\\]: plt.close()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "ea988ab7", + "metadata": {}, + "source": [ "\n", "To simplify even further, we can use y\n", "with the corresponding subscript directly instead of y1,y2,y3. Again, we do not have any parameters\n", - "as they are hard coded into our models.\n", - "\n", - "In \\[1\\]: stateList = \\['y1:4'\\]\n", - "\n", - "In \\[1\\]: transitionList = \\[ \n", - "...: Transition(origin='y\\[0\\]', destination='y\\[1\\]',\n", - "equation='0.04\\*y\\[0\\]', transition_type=TransitionType.T), ...:\n", - "Transition(origin='y\\[1\\]', destination='y\\[0\\]',\n", - "equation='1e4\\*y\\[1\\]*y\\[2\\]', transition_type=TransitionType.T), ...:\n", - "Transition(origin='y\\[1\\]', destination='y\\[2\\]',\n", - "equation='3e7*y\\[1\\]\\*y\\[1\\]', transition_type=TransitionType.T) ...: \\]\n", + "as they are hard coded into our models.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df7214d3", + "metadata": {}, + "outputs": [], + "source": [ + "stateList = ['y1:4']\n", "\n", - "In \\[1\\]: ode = DeterministicOde(stateList, paramList,\n", - "transition=transitionList)\n", + "transitionList = [Transition(origin='y[0]', destination='y[1]', equation='0.04*y[0]', transition_type=TransitionType.T),\n", + " Transition(origin='y[1]', destination='y[0]', equation='1e4*y[1]*y[2]', transition_type=TransitionType.T), \n", + " Transition(origin='y[1]', destination='y[2]', equation='3e7*y[1]*y[1]', transition_type=TransitionType.T)\n", + " ]\n", "\n", - "In \\[1\\]: ode.initial_values =(\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", + "ode = DeterministicOde(stateList, paramList, transition=transitionList)\n", "\n", - "In \\[1\\]: solution2 = ode.integrate(t\\[1::\\])\n", + "ode.initial_values =([1.0, 0.0, 0.0], t[0])\n", "\n", - "In \\[1\\]: numpy.max(solution - solution2)\n", + "solution2 = ode.integrate(t[1::])\n", "\n", + "numpy.max(solution - solution2)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d7604b73", + "metadata": {}, + "source": [ "and we have the identical solution as shown in the last line above." ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 246b263fb9dcd7ebf7bdd429df56e162965c3e03 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 29 Aug 2023 13:37:10 +0100 Subject: [PATCH 137/188] fixed citations/referencing for bibliography - error was in config file --- docs/pygom-doc/_config.yml | 19 +-- docs/pygom-doc/_toc.yml | 10 +- docs/pygom-doc/md/bib.md | 9 +- docs/pygom-doc/notebooks/epijson.ipynb | 11 +- docs/pygom-doc/ref.bib | 218 ++++++++----------------- 5 files changed, 102 insertions(+), 165 deletions(-) diff --git a/docs/pygom-doc/_config.yml b/docs/pygom-doc/_config.yml index ecf87ec2..9b3fdeb8 100644 --- a/docs/pygom-doc/_config.yml +++ b/docs/pygom-doc/_config.yml @@ -25,18 +25,16 @@ latex: # Add a bibtex file so that we can create citations # use sphinx to specify style -sphinx: - extra_extensions: - - 'sphinxcontrib.bibtex' +bibtex_bibfiles: + - 'ref.bib' + +#sphinx: +# extra_extensions: +# - 'sphinxcontrib.bibtex' +# config: +# bibtex_reference_style: super -sphinx: - config: - bibtex_reference_style: author_year - # TODO change md to bibtex - bibtex_bibfiles: ref.bib -#bibtex_bibfiles: -# - ref.bib sphinx: extra_extensions: @@ -48,6 +46,7 @@ sphinx: config: add_module_names: True autosummary_generate: True + bibtex_reference_style: super #sphinx: # extra_extensions: diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 3d5df218..f8260f5b 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -48,10 +48,12 @@ parts: # - caption: Frequently asked questions # chapters: # - file: md/faq.md - - caption: Code documentation - chapters: - - file: autodoc-model.rst - - file: autodoc-loss.rst +# - caption: Code documentation +# chapters: +# - file: autodoc-model.rst +# - file: autodoc-loss.rst + # add utils + # add abc - caption: References chapters: - file: md/bib.md diff --git a/docs/pygom-doc/md/bib.md b/docs/pygom-doc/md/bib.md index df56a0c2..1b1b350d 100644 --- a/docs/pygom-doc/md/bib.md +++ b/docs/pygom-doc/md/bib.md @@ -1,6 +1,9 @@ # References -```{bibliography} -:style: unsrt +```{bibliography} +:style: plain +``` + +#../zzzfinnie.bib #:all: -``` \ No newline at end of file +#:file: ../ref.bib \ No newline at end of file diff --git a/docs/pygom-doc/notebooks/epijson.ipynb b/docs/pygom-doc/notebooks/epijson.ipynb index f2e63cae..882abe8b 100644 --- a/docs/pygom-doc/notebooks/epijson.ipynb +++ b/docs/pygom-doc/notebooks/epijson.ipynb @@ -9,7 +9,7 @@ "Epidemiology data is complicated due to the many different stages a\n", "patient can go through and whether a modeling technique is applicable\n", "depends heavily on the recording of data. [EpiJSON](https://github.com/Hackout2/EpiJSON) is a framework which\n", - "tries to captures all the information in a JSON format {cite:t}`Finnie2016`.\n", + "tries to captures all the information in a JSON format {cite}`Finnie2016`.\n", "\n", "PyGOM provides the functionality to process EpiJSON data. Due to\n", "the nature of this package, modeling of ODEs, data files are processed with this in mind. The output is therefore in the cumulative form as\n", @@ -98,6 +98,15 @@ "and $R$ the corresponding state the data belongs to.\n", "```" ] + }, + { + "cell_type": "markdown", + "id": "caa1d2f1", + "metadata": {}, + "source": [ + "```{footbibliography}\n", + "```" + ] } ], "metadata": { diff --git a/docs/pygom-doc/ref.bib b/docs/pygom-doc/ref.bib index 72c66881..89833a8e 100644 --- a/docs/pygom-doc/ref.bib +++ b/docs/pygom-doc/ref.bib @@ -1,3 +1,33 @@ +@article{Aron1984, + abstract = {The annual incidence rates of some endemic infectious diseases are steady while others fluctuate dramatically, often in a regular cycle. In order to investigate the role of seasonality in driving cycles of recurrent epidemics, we analyze numerically the susceptible/exposed/infective/recovered (SEIR) epidemic model with seasonal transmission. We show that small-amplitude periodic solutions exhibit a sequence of period-doubling bifurcations as the amplitude of seasonal variation increases, predicting a transition to chaos of the kind studied in other biological contexts. The epidemiological implication is that the seasonal mechanism generating biennial epidemics may not be able to account for small-amplitude recurrent epidemics of arbitrary periodicity. © 1997 Elsevier Science Ltd. All rights reserved.}, + author = {Joan L. Aron and Ira B. Schwartz}, + doi = {10.1016/S0022-5193(84)80150-2}, + issn = {0022-5193}, + issue = {4}, + journal = {Journal of theoretical biology}, + keywords = {Biological*,Communicable Diseases / epidemiology*,Disease Outbreaks / epidemiology*,England,Humans,I B Schwartz,J L Aron,MEDLINE,Mathematics,Measles / epidemiology,Models,NCBI,NIH,NLM,National Center for Biotechnology Information,National Institutes of Health,National Library of Medicine,New York City,Periodicity*,PubMed Abstract,Seasons*,Time Factors,Wales,doi:10.1016/s0022-5193(84)80150-2,pmid:6521486}, + month = {10}, + pages = {665-679}, + pmid = {6521486}, + publisher = {J Theor Biol}, + title = {Seasonality and period-doubling bifurcations in an epidemic model}, + volume = {110}, + url = {https://pubmed.ncbi.nlm.nih.gov/6521486/}, + year = {1984}, +} +@book{Brauer2008, + author = {Fred Brauer}, + city = {Berlin, Heidelberg}, + doi = {10.1007/978-3-540-78911-6}, + editor = {Fred Brauer and Pauline van den Driessche and Jianhong Wu}, + isbn = {978-3-540-78910-9}, + journal = {Sp}, + publisher = {Springer Berlin Heidelberg}, + title = {Mathematical Epidemiology}, + volume = {1945}, + url = {http://link.springer.com/10.1007/978-3-540-78911-6}, + year = {2008}, +} @article{Cao2006, abstract = {The tau-leaping method of simulating the stochastic time evolution of a well-stirred chemically reacting system uses a Poisson approximation to take time steps that leap over many reaction events. Theory implies that tau leaping should be accurate so long as no propensity function changes its value "significantly" during any time step τ. Presented here is an improved procedure for estimating the largest value for τ that is consistent with this condition. This new τ -selection procedure is more accurate, easier to code, and faster to execute than the currently used procedure. The speedup in execution will be especially pronounced in systems that have many reaction channels. © 2006 American Institute of Physics.}, author = {Yang Cao and Daniel T. Gillespie and Linda R. Petzold}, @@ -63,6 +93,20 @@ @article{Hethcote1973 volume = {35}, year = {1973}, } +@article{legrand2007utd, + abstract = {Ebola is a highly lethal virus, which has caused at least 14 confirmed outbreaks in Africa between 1976 and 2006. Using data from two epidemics [in Democratic Republic of Congo (DRC) in 1995 and in Uganda in 2000], we built a mathematical model for the spread of Ebola haemorrhagic fever epidemics taking into account transmission in different epidemiological settings. We estimated the basic reproduction number (R0) to be 2.7 (95% CI 1.9-2.8) for the 1995 epidemic in DRC, and 2.7 (95% CI 2.5-4.1) for the 2000 epidemic in Uganda. For each epidemic, we quantified transmission in different settings (illness in the community, hospitalization, and traditional burial) and simulated various epidemic scenarios to explore the impact of control interventions on a potential epidemic. A key parameter was the rapid institution of control measures. For both epidemic profiles identified, increasing hospitalization rate reduced the predicted epidemic size.}, + author = {J. Legrand and R. F. Grais and P. Y. Boelle and A. J. Valleron and A. Flahault}, + doi = {10.1017/S0950268806007217}, + isbn = {0950-2688}, + issn = {09502688}, + issue = {4}, + journal = {Epidemiology and Infection}, + pages = {610-621}, + pmid = {16999875}, + title = {Understanding the dynamics of Ebola epidemics}, + volume = {135}, + year = {2007}, +} @article{Lloyd1996, abstract = {Spatial heterogeneity is believed to play an important role in the persistence and dynamics of epidemics of childhood diseases because asynchrony between populations within different regions allows global persistence, even if the disease dies out locally. A simple multi-patch (metapopulation) model for spatial heterogeneity in epidemics is analysed and we examine conditions under which patches become synchronized. We show that the patches in non-seasonal deterministic models often oscillate in phase for all but the weakest between patch coupling. Synchronization is also seen for stochastic models, although slightly stronger coupling is needed to overcome the random effects. We demonstrate that the inclusion of seasonal forcing in deterministic models can lead to the maintenance of phase differences between patches. Complex dynamic behaviour is observed in the seasonally forced spatial model, along with the coexistence of many different behaviours. Compared to the non-spatial model, chaotic solutions are observed for weaker seasonal forcing; these solutions have a more realistic minimum number of infectives.}, author = {Alun L. Lloyd and Robert M. May}, @@ -96,6 +140,16 @@ @article{Lotka1920 volume = {6}, year = {1920}, } +@article{Moolgavkar1987, + author = {Suresh H. Moolgavkar and David J. Venz}, + issue = {1}, + journal = {Journal of Statistics}, + pages = {43-56}, + title = {Confidence Regions for Parameters of the Proportional Hazards Model: A Simulation Study on JSTOR}, + volume = {14}, + url = {https://www.jstor.org/stable/4616047}, + year = {1987}, +} @book{Press2007, abstract = {Do you want easy access to the latest methods in scientific computing? This greatly expanded third edition of Numerical Recipes has it, with wider coverage than ever before, many new, expanded and updated sections, and two completely new chapters. The executable C++ code, now printed in color for easy reading, adopts an object-oriented style particularly suited to scientific applications. Co-authored by four leading scientists from academia and industry, Numerical Recipes starts with basic mathematics and computer science and proceeds to complete, working routines. The whole book is presented in the informal, easy-to-read style that made earlier editions so popular. Highlights of the new material include: a new chapter on classification and inference, Gaussian mixture models, HMMs, hierarchical clustering, and SVMs; a new chapter on computational geometry, covering KD trees, quad- and octrees, Delaunay triangulation, and algorithms for lines, polygons, triangles, and spheres; interior point methods for linear programming; MCMC; an expanded treatment of ODEs with completely new routines; and many new statistical distributions.}, author = {William H Press and Saul a Teukolsky and William T Vetterling and Brian P Flannery}, @@ -127,18 +181,15 @@ @article{Raue2009 volume = {25}, year = {2009}, } -@article{Venzon1988, - abstract = {The method of constructing confidence regions based on the generalised likelihood ratio statistic is well known for parameter vectors. A similar construction of a confidence interval for a simple entry of a vector can be implemented by repeatedly maximising over the other parameters. We present an algorithm for finding these confidence interval endpoints that requires less computation. It employs a modified Newton-Raphson iteration to solve a system of equations that defines the endpoints.}, - author = {D. J. Venzon and S. H. Moolgavkar}, - doi = {10.2307/2347496}, - issn = {00359254}, - issue = {1}, - journal = {Applied Statistics}, - title = {A Method for Computing Profile-Likelihood-Based Confidence Intervals}, - volume = {37}, - year = {1988}, +@article{Robertson1966, + author = {H.H Robertson}, + journal = {Academic Press}, + pages = {178-182}, + title = {The Solution of a Set of Reaction Rate Equations}, + url = {https://www.scirp.org/%28S%28vtj3fa45qm1ean45vvffcz55%29%29/reference/referencespapers.aspx?referenceid=2485718}, + year = {1966}, } -@article{, +@article{vanderPol1926, abstract = {(1926). LXXXVIII. On “relaxation-oscillations”. The London, Edinburgh, and Dublin Philosophical Magazine and Journal of Science: Vol. 2, No. 11, pp. 978-992.}, author = {Balth. van der Pol}, doi = {10.1080/14786442608564127}, @@ -152,141 +203,14 @@ @article{ volume = {2}, year = {1926}, } -@article{Robertson1966, - author = {H.H Robertson}, - journal = {Academic Press}, - pages = {178-182}, - title = {The Solution of a Set of Reaction Rate Equations}, - url = {https://www.scirp.org/%28S%28vtj3fa45qm1ean45vvffcz55%29%29/reference/referencespapers.aspx?referenceid=2485718}, - year = {1966}, -} -@article{Moolgavkar1987, - author = {Suresh H. Moolgavkar and David J. Venz}, +@article{Venzon1988, + abstract = {The method of constructing confidence regions based on the generalised likelihood ratio statistic is well known for parameter vectors. A similar construction of a confidence interval for a simple entry of a vector can be implemented by repeatedly maximising over the other parameters. We present an algorithm for finding these confidence interval endpoints that requires less computation. It employs a modified Newton-Raphson iteration to solve a system of equations that defines the endpoints.}, + author = {D. J. Venzon and S. H. Moolgavkar}, + doi = {10.2307/2347496}, + issn = {00359254}, issue = {1}, - journal = {Journal of Statistics}, - pages = {43-56}, - title = {Confidence Regions for Parameters of the Proportional Hazards Model: A Simulation Study on JSTOR}, - volume = {14}, - url = {https://www.jstor.org/stable/4616047}, - year = {1987}, -} -@article{legrand2007utd, - abstract = {Ebola is a highly lethal virus, which has caused at least 14 confirmed outbreaks in Africa between 1976 and 2006. Using data from two epidemics [in Democratic Republic of Congo (DRC) in 1995 and in Uganda in 2000], we built a mathematical model for the spread of Ebola haemorrhagic fever epidemics taking into account transmission in different epidemiological settings. We estimated the basic reproduction number (R0) to be 2.7 (95% CI 1.9-2.8) for the 1995 epidemic in DRC, and 2.7 (95% CI 2.5-4.1) for the 2000 epidemic in Uganda. For each epidemic, we quantified transmission in different settings (illness in the community, hospitalization, and traditional burial) and simulated various epidemic scenarios to explore the impact of control interventions on a potential epidemic. A key parameter was the rapid institution of control measures. For both epidemic profiles identified, increasing hospitalization rate reduced the predicted epidemic size.}, - author = {J. Legrand and R. F. Grais and P. Y. Boelle and A. J. Valleron and A. Flahault}, - doi = {10.1017/S0950268806007217}, - isbn = {0950-2688}, - issn = {09502688}, - issue = {4}, - journal = {Epidemiology and Infection}, - pages = {610-621}, - pmid = {16999875}, - title = {Understanding the dynamics of Ebola epidemics}, - volume = {135}, - year = {2007}, -} -@article{Cao2006, - abstract = {The tau-leaping method of simulating the stochastic time evolution of a well-stirred chemically reacting system uses a Poisson approximation to take time steps that leap over many reaction events. Theory implies that tau leaping should be accurate so long as no propensity function changes its value "significantly" during any time step τ. Presented here is an improved procedure for estimating the largest value for τ that is consistent with this condition. This new τ -selection procedure is more accurate, easier to code, and faster to execute than the currently used procedure. The speedup in execution will be especially pronounced in systems that have many reaction channels. © 2006 American Institute of Physics.}, - author = {Yang Cao and Daniel T. Gillespie and Linda R. Petzold}, - doi = {10.1063/1.2159468}, - issn = {00219606}, - issue = {4}, - journal = {Journal of Chemical Physics}, - title = {Efficient step size selection for the tau-leaping simulation method}, - volume = {124}, - year = {2006}, -} -@article{Finnie2016, - abstract = {Epidemiology relies on data but the divergent ways data are recorded and transferred, both within and between outbreaks, and the expanding range of data-types are creating an increasingly complex problem for the discipline. There is a need for a consistent, interpretable and precise way to transfer data while maintaining its fidelity. We introduce 'EpiJSON', a new, flexible, and standards-compliant format for the interchange of epidemiological data using JavaScript Object Notation. This format is designed to enable the widest range of epidemiological data to be unambiguously held and transferred between people, software and institutions. In this paper, we provide a full description of the format and a discussion of the design decisions made. We introduce a schema enabling automatic checks of the validity of data stored as EpiJSON, which can serve as a basis for the development of additional tools. In addition, we also present the R package 'repijson' which provides conversion tools between this format, line-list data and pre-existing analysis tools. An example is given to illustrate how EpiJSON can be used to store line list data. EpiJSON, designed around modern standards for interchange of information on the internet, is simple to implement, read and check. As such, it provides an ideal new standard for epidemiological, and other, data transfer to the fast-growing open-source platform for the analysis of disease outbreaks.}, - author = {Thomas J.R. Finnie and Andy South and Ana Bento and Ellie Sherrard-Smith and Thibaut Jombart}, - doi = {10.1016/j.epidem.2015.12.002}, - issn = {18780067}, - journal = {Epidemics}, - title = {EpiJSON: A unified data-format for epidemiology}, - volume = {15}, - year = {2016}, -} -@article{FitzHugh1961, - abstract = {Van der Pol's equation for a relaxation oscillator is generalized by the addition of terms to produce a pair of non-linear differential equations with either a stable singular point or a limit cycle. The resulting “BVP model” has two variables of state, representing excitability and refractoriness, and qualitatively resembles Bonhoeffer's theoretical model for the iron wire model of nerve. This BVP model serves as a simple representative of a class of excitable-oscillatory systems including the Hodgkin-Huxley (HH) model of the squid giant axon. The BVP phase plane can be divided into regions corresponding to the physiological states of nerve fiber (resting, active, refractory, enhanced, depressed, etc.) to form a “physiological state diagram,” with the help of which many physiological phenomena can be summarized. A properly chosen projection from the 4-dimensional HH phase space onto a plane produces a similar diagram which shows the underlying relationship between the two models. Impulse trains occur in the BVP and HH models for a range of constant applied currents which make the singular point representing the resting state unstable. © 1961, The Biophysical Society. All rights reserved.}, - author = {Richard FitzHugh}, - doi = {10.1016/S0006-3495(61)86902-6}, - issn = {00063495}, - issue = {6}, - journal = {Biophysical Journal}, - title = {Impulses and Physiological States in Theoretical Models of Nerve Membrane}, - volume = {1}, - year = {1961}, -} -@inproceedings{Gillespie1977, - abstract = {There are two formalisms for mathematically describing the time behavior of a spatially homogeneous chemical system: The deterministic approach regards the time evolution as a continuous, wholly predictable process which is governed by a set of coupled, ordinary differential equations (the "reaction-rate equations"); the stochastic approach regards the time evolution as a kind of random-walk process which is governed by a single differential-difference equation (the "master equation"). Fairly simple kinetic theory arguments show that the stochastic formulation of chemical kinetics has a firmer physical basis than the deterministic formulation, but unfortunately the stochastic master equation is often mathematically intractable. There is, however, a way to make exact numerical calculations within the framework of the stochastic formulation without having to deal with the master equation directly. It is a relatively simple digital computer algorithm which uses a rigorously derived Monte Carlo procedure to numerically simulate the time evolution of the given chemical system. Like the master equation, this "stochastic simulation algorithm" correctly accounts for the inherent fluctuations and correlations that are necessarily ignored in the deterministic formulation. In addition, unlike most procedures for numerically solving the deterministic reaction-rate equations, this algorithm never approximates infinitesimal time increments dt by finite time steps Δt. The feasibility and utility of the simulation algorithm are demonstrated by applying it to several well-known model chemical systems, including the Lotka model, the Brusselator, and the Oregonator.}, - author = {Daniel T. Gillespie}, - doi = {10.1021/j100540a008}, - issn = {00223654}, - issue = {25}, - journal = {Journal of Physical Chemistry}, - title = {Exact stochastic simulation of coupled chemical reactions}, - volume = {81}, - year = {1977}, -} -@article{Girolami2011, - abstract = {The paper proposes Metropolis adjusted Langevin and Hamiltonian Monte Carlo sampling methods defined on the Riemann manifold to resolve the shortcomings of existing Monte Carlo algorithms when sampling from target densities that may be high dimensional and exhibit strong correlations. The methods provide fully automated adaptation mechanisms that circumvent the costly pilot runs that are required to tune proposal densities for Metropolis-Hastings or indeed Hamiltonian Monte Carlo and Metropolis adjusted Langevin algorithms. This allows for highly efficient sampling even in very high dimensions where different scalings may be required for the transient and stationary phases of the Markov chain. The methodology proposed exploits the Riemann geometry of the parameter space of statistical models and thus automatically adapts to the local structure when simulating paths across this manifold, providing highly efficient convergence and exploration of the target density. The performance of these Riemann manifold Monte Carlo methods is rigorously assessed by performing inference on logistic regression models, log-Gaussian Cox point processes, stochastic volatility models and Bayesian estimation of dynamic systems described by non-linear differential equations. Substantial improvements in the time-normalized effective sample size are reported when compared with alternative sampling approaches. MATLAB code that is available from allows replication of all the results reported. © 2011 Royal Statistical Society.}, - author = {Mark Girolami and Ben Calderhead}, - doi = {10.1111/j.1467-9868.2010.00765.x}, - issn = {13697412}, - issue = {2}, - journal = {Journal of the Royal Statistical Society. Series B: Statistical Methodology}, - title = {Riemann manifold Langevin and Hamiltonian Monte Carlo methods}, - volume = {73}, - year = {2011}, -} -@article{Hethcote1973, - abstract = {The effects of a periodic contact rate and of carriers are considered for a generalization of Bailey's simple epidemic model. In this model it is assumed that individuals become susceptible again as soon as they recover from the infection so that a fixed population can be divided into a class of infectives and a class of susceptibles which vary with time. If the contact rate is periodic, then the number of infectives as time approaches infinity either tends to zero or is asymptotically periodic depending on whether the total population size is less than or greater than a threshold value. The behavior for large time of the number of infectives is determined for three modifications of the model which involve carriers. © 1973 Society for Mathematical Biology.}, - author = {Herbert W. Hethcote}, - doi = {10.1007/BF02458365}, - issn = {00074985}, - issue = {5-6}, - journal = {Bulletin of Mathematical Biology}, - title = {Asymptotic behavior in a deterministic epidemic model}, - volume = {35}, - year = {1973}, -} -@inproceedings{Gillespie1977, - abstract = {There are two formalisms for mathematically describing the time behavior of a spatially homogeneous chemical system: The deterministic approach regards the time evolution as a continuous, wholly predictable process which is governed by a set of coupled, ordinary differential equations (the "reaction-rate equations"); the stochastic approach regards the time evolution as a kind of random-walk process which is governed by a single differential-difference equation (the "master equation"). Fairly simple kinetic theory arguments show that the stochastic formulation of chemical kinetics has a firmer physical basis than the deterministic formulation, but unfortunately the stochastic master equation is often mathematically intractable. There is, however, a way to make exact numerical calculations within the framework of the stochastic formulation without having to deal with the master equation directly. It is a relatively simple digital computer algorithm which uses a rigorously derived Monte Carlo procedure to numerically simulate the time evolution of the given chemical system. Like the master equation, this "stochastic simulation algorithm" correctly accounts for the inherent fluctuations and correlations that are necessarily ignored in the deterministic formulation. In addition, unlike most procedures for numerically solving the deterministic reaction-rate equations, this algorithm never approximates infinitesimal time increments dt by finite time steps Δt. The feasibility and utility of the simulation algorithm are demonstrated by applying it to several well-known model chemical systems, including the Lotka model, the Brusselator, and the Oregonator.}, - author = {Daniel T. Gillespie}, - doi = {10.1021/j100540a008}, - issn = {00223654}, - issue = {25}, - journal = {Journal of Physical Chemistry}, - title = {Exact stochastic simulation of coupled chemical reactions}, - volume = {81}, - year = {1977}, -} -@book{Brauer2008, - author = {Fred Brauer}, - city = {Berlin, Heidelberg}, - doi = {10.1007/978-3-540-78911-6}, - editor = {Fred Brauer and Pauline van den Driessche and Jianhong Wu}, - isbn = {978-3-540-78910-9}, - journal = {Sp}, - publisher = {Springer Berlin Heidelberg}, - title = {Mathematical Epidemiology}, - volume = {1945}, - url = {http://link.springer.com/10.1007/978-3-540-78911-6}, - year = {2008}, -} -@article{Aron1984, - abstract = {The annual incidence rates of some endemic infectious diseases are steady while others fluctuate dramatically, often in a regular cycle. In order to investigate the role of seasonality in driving cycles of recurrent epidemics, we analyze numerically the susceptible/exposed/infective/recovered (SEIR) epidemic model with seasonal transmission. We show that small-amplitude periodic solutions exhibit a sequence of period-doubling bifurcations as the amplitude of seasonal variation increases, predicting a transition to chaos of the kind studied in other biological contexts. The epidemiological implication is that the seasonal mechanism generating biennial epidemics may not be able to account for small-amplitude recurrent epidemics of arbitrary periodicity. © 1997 Elsevier Science Ltd. All rights reserved.}, - author = {Joan L. Aron and Ira B. Schwartz}, - doi = {10.1016/S0022-5193(84)80150-2}, - issn = {0022-5193}, - issue = {4}, - journal = {Journal of theoretical biology}, - keywords = {Biological*,Communicable Diseases / epidemiology*,Disease Outbreaks / epidemiology*,England,Humans,I B Schwartz,J L Aron,MEDLINE,Mathematics,Measles / epidemiology,Models,NCBI,NIH,NLM,National Center for Biotechnology Information,National Institutes of Health,National Library of Medicine,New York City,Periodicity*,PubMed Abstract,Seasons*,Time Factors,Wales,doi:10.1016/s0022-5193(84)80150-2,pmid:6521486}, - month = {10}, - pages = {665-679}, - pmid = {6521486}, - publisher = {J Theor Biol}, - title = {Seasonality and period-doubling bifurcations in an epidemic model}, - volume = {110}, - url = {https://pubmed.ncbi.nlm.nih.gov/6521486/}, - year = {1984}, + journal = {Applied Statistics}, + title = {A Method for Computing Profile-Likelihood-Based Confidence Intervals}, + volume = {37}, + year = {1988}, } From 41f7da63239deefbeb0b69ddcd4c968d4be78fdf Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 29 Aug 2023 16:13:44 +0100 Subject: [PATCH 138/188] add code documentation for abc and utilR --- docs/pygom-doc/autodoc-abc.rst | 9 +++++++++ docs/pygom-doc/autodoc-utilR.rst | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 docs/pygom-doc/autodoc-abc.rst create mode 100644 docs/pygom-doc/autodoc-utilR.rst diff --git a/docs/pygom-doc/autodoc-abc.rst b/docs/pygom-doc/autodoc-abc.rst new file mode 100644 index 00000000..05b5d8ae --- /dev/null +++ b/docs/pygom-doc/autodoc-abc.rst @@ -0,0 +1,9 @@ +Module: approximate_bayesian_computation +============= + +.. automodule:: pygom.approximate_bayesian_computation + :members: + +.. autosummary:: + :toctree: _autosummary + :recursive: \ No newline at end of file diff --git a/docs/pygom-doc/autodoc-utilR.rst b/docs/pygom-doc/autodoc-utilR.rst new file mode 100644 index 00000000..8f242ad7 --- /dev/null +++ b/docs/pygom-doc/autodoc-utilR.rst @@ -0,0 +1,9 @@ +Module: utilR +============= + +.. automodule:: pygom.utilR + :members: + +.. autosummary:: + :toctree: _autosummary + :recursive: \ No newline at end of file From 5829d4863d64cb7905f13637a3dae9b8147d25ba Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 29 Aug 2023 18:58:29 +0100 Subject: [PATCH 139/188] autodocumentation reformatting and moving --- docs/pygom-doc/_config.yml | 17 ++--------------- docs/pygom-doc/_toc.yml | 12 ++++++++---- docs/pygom-doc/{ => rst}/autodoc-abc.rst | 2 +- docs/pygom-doc/{ => rst}/autodoc-loss.rst | 2 +- docs/pygom-doc/{ => rst}/autodoc-model.rst | 2 +- docs/pygom-doc/{ => rst}/autodoc-utilR.rst | 2 +- 6 files changed, 14 insertions(+), 23 deletions(-) rename docs/pygom-doc/{ => rst}/autodoc-abc.rst (77%) rename docs/pygom-doc/{ => rst}/autodoc-loss.rst (89%) rename docs/pygom-doc/{ => rst}/autodoc-model.rst (89%) rename docs/pygom-doc/{ => rst}/autodoc-utilR.rst (89%) diff --git a/docs/pygom-doc/_config.yml b/docs/pygom-doc/_config.yml index 9b3fdeb8..7bd9b2d6 100644 --- a/docs/pygom-doc/_config.yml +++ b/docs/pygom-doc/_config.yml @@ -1,9 +1,8 @@ # Book settings -# Learn more at https://jupyterbook.org/customize/config.html +# see https://jupyterbook.org/customize/config.html title: PyGOM documentation author: Public Health England / UK Health Security Agency -#TODO change logo logo: logo_pygom.jpg # build files in table of contents @@ -24,23 +23,16 @@ latex: # Add a bibtex file so that we can create citations # use sphinx to specify style - bibtex_bibfiles: - 'ref.bib' -#sphinx: -# extra_extensions: -# - 'sphinxcontrib.bibtex' -# config: -# bibtex_reference_style: super - - sphinx: extra_extensions: #- 'sphinx.ext.doctest' - 'sphinx.ext.autodoc' - 'sphinx.ext.napoleon' +# - 'sphinx.ext.graphvizconfig' - 'sphinx.ext.viewcode' - 'sphinx.ext.autosummary' config: @@ -48,11 +40,6 @@ sphinx: autosummary_generate: True bibtex_reference_style: super -#sphinx: -# extra_extensions: -# - 'sphinx.ext.autosummary' -# config: -# autosummary_generate: True #sphinx: # extra_extensions: diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index f8260f5b..f7a533cf 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -48,10 +48,14 @@ parts: # - caption: Frequently asked questions # chapters: # - file: md/faq.md -# - caption: Code documentation -# chapters: -# - file: autodoc-model.rst -# - file: autodoc-loss.rst + - caption: Code documentation + chapters: + - file: module-documentation.md + sections: + - file: autodoc-model.rst + - file: autodoc-loss.rst + - file: autodoc-abc.rst + - file: autodoc-utilR.rst # add utils # add abc - caption: References diff --git a/docs/pygom-doc/autodoc-abc.rst b/docs/pygom-doc/rst/autodoc-abc.rst similarity index 77% rename from docs/pygom-doc/autodoc-abc.rst rename to docs/pygom-doc/rst/autodoc-abc.rst index 05b5d8ae..1a3a8f3d 100644 --- a/docs/pygom-doc/autodoc-abc.rst +++ b/docs/pygom-doc/rst/autodoc-abc.rst @@ -1,4 +1,4 @@ -Module: approximate_bayesian_computation +approximate_bayesian_computation ============= .. automodule:: pygom.approximate_bayesian_computation diff --git a/docs/pygom-doc/autodoc-loss.rst b/docs/pygom-doc/rst/autodoc-loss.rst similarity index 89% rename from docs/pygom-doc/autodoc-loss.rst rename to docs/pygom-doc/rst/autodoc-loss.rst index e5a8afc3..ec2b56da 100644 --- a/docs/pygom-doc/autodoc-loss.rst +++ b/docs/pygom-doc/rst/autodoc-loss.rst @@ -1,4 +1,4 @@ -Module: loss +loss ============= .. automodule:: pygom.loss diff --git a/docs/pygom-doc/autodoc-model.rst b/docs/pygom-doc/rst/autodoc-model.rst similarity index 89% rename from docs/pygom-doc/autodoc-model.rst rename to docs/pygom-doc/rst/autodoc-model.rst index 1426e052..debfb420 100644 --- a/docs/pygom-doc/autodoc-model.rst +++ b/docs/pygom-doc/rst/autodoc-model.rst @@ -1,4 +1,4 @@ -Module: model +model ============= .. automodule:: pygom.model diff --git a/docs/pygom-doc/autodoc-utilR.rst b/docs/pygom-doc/rst/autodoc-utilR.rst similarity index 89% rename from docs/pygom-doc/autodoc-utilR.rst rename to docs/pygom-doc/rst/autodoc-utilR.rst index 8f242ad7..40a5c130 100644 --- a/docs/pygom-doc/autodoc-utilR.rst +++ b/docs/pygom-doc/rst/autodoc-utilR.rst @@ -1,4 +1,4 @@ -Module: utilR +utilR ============= .. automodule:: pygom.utilR From 77459126da5d5bf1c7954fcee2b644c4e0d3c649 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 29 Aug 2023 19:07:07 +0100 Subject: [PATCH 140/188] remove unused files --- docs/pygom-doc/markdown-notebooks.md | 53 ------------ docs/pygom-doc/notebooks.ipynb | 122 --------------------------- docs/pygom-doc/ref.md | 113 ------------------------- docs/pygom-doc/references.bib | 56 ------------ 4 files changed, 344 deletions(-) delete mode 100644 docs/pygom-doc/markdown-notebooks.md delete mode 100644 docs/pygom-doc/notebooks.ipynb delete mode 100644 docs/pygom-doc/ref.md delete mode 100644 docs/pygom-doc/references.bib diff --git a/docs/pygom-doc/markdown-notebooks.md b/docs/pygom-doc/markdown-notebooks.md deleted file mode 100644 index a057a320..00000000 --- a/docs/pygom-doc/markdown-notebooks.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -jupytext: - formats: md:myst - text_representation: - extension: .md - format_name: myst - format_version: 0.13 - jupytext_version: 1.11.5 -kernelspec: - display_name: Python 3 - language: python - name: python3 ---- - -# Notebooks with MyST Markdown - -Jupyter Book also lets you write text-based notebooks using MyST Markdown. -See [the Notebooks with MyST Markdown documentation](https://jupyterbook.org/file-types/myst-notebooks.html) for more detailed instructions. -This page shows off a notebook written in MyST Markdown. - -## An example cell - -With MyST Markdown, you can define code cells with a directive like so: - -```{code-cell} -print(2 + 2) -``` - -When your book is built, the contents of any `{code-cell}` blocks will be -executed with your default Jupyter kernel, and their outputs will be displayed -in-line with the rest of your content. - -```{seealso} -Jupyter Book uses [Jupytext](https://jupytext.readthedocs.io/en/latest/) to convert text-based files to notebooks, and can support [many other text-based notebook files](https://jupyterbook.org/file-types/jupytext.html). -``` - -## Create a notebook with MyST Markdown - -MyST Markdown notebooks are defined by two things: - -1. YAML metadata that is needed to understand if / how it should convert text files to notebooks (including information about the kernel needed). - See the YAML at the top of this page for example. -2. The presence of `{code-cell}` directives, which will be executed with your book. - -That's all that is needed to get started! - -## Quickly add YAML metadata for MyST Notebooks - -If you have a markdown file and you'd like to quickly add YAML metadata to it, so that Jupyter Book will treat it as a MyST Markdown Notebook, run the following command: - -``` -jupyter-book myst init path/to/markdownfile.md -``` diff --git a/docs/pygom-doc/notebooks.ipynb b/docs/pygom-doc/notebooks.ipynb deleted file mode 100644 index fdb7176c..00000000 --- a/docs/pygom-doc/notebooks.ipynb +++ /dev/null @@ -1,122 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Content with notebooks\n", - "\n", - "You can also create content with Jupyter Notebooks. This means that you can include\n", - "code blocks and their outputs in your book.\n", - "\n", - "## Markdown + notebooks\n", - "\n", - "As it is markdown, you can embed images, HTML, etc into your posts!\n", - "\n", - "![](https://myst-parser.readthedocs.io/en/latest/_static/logo-wide.svg)\n", - "\n", - "You can also $add_{math}$ and\n", - "\n", - "$$\n", - "math^{blocks}\n", - "$$\n", - "\n", - "or\n", - "\n", - "$$\n", - "\\begin{aligned}\n", - "\\mbox{mean} la_{tex} \\\\ \\\\\n", - "math blocks\n", - "\\end{aligned}\n", - "$$\n", - "\n", - "But make sure you \\$Escape \\$your \\$dollar signs \\$you want to keep!\n", - "\n", - "## MyST markdown\n", - "\n", - "MyST markdown works in Jupyter Notebooks as well. For more information about MyST markdown, check\n", - "out [the MyST guide in Jupyter Book](https://jupyterbook.org/content/myst.html),\n", - "or see [the MyST markdown documentation](https://myst-parser.readthedocs.io/en/latest/).\n", - "\n", - "## Code blocks and outputs\n", - "\n", - "Jupyter Book will also embed your code blocks and output in your book.\n", - "For example, here's some sample Matplotlib code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib import rcParams, cycler\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "plt.ion()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Fixing random state for reproducibility\n", - "np.random.seed(19680801)\n", - "\n", - "N = 10\n", - "data = [np.logspace(0, 1, 100) + np.random.randn(100) + ii for ii in range(N)]\n", - "data = np.array(data).T\n", - "cmap = plt.cm.coolwarm\n", - "rcParams['axes.prop_cycle'] = cycler(color=cmap(np.linspace(0, 1, N)))\n", - "\n", - "\n", - "from matplotlib.lines import Line2D\n", - "custom_lines = [Line2D([0], [0], color=cmap(0.), lw=4),\n", - " Line2D([0], [0], color=cmap(.5), lw=4),\n", - " Line2D([0], [0], color=cmap(1.), lw=4)]\n", - "\n", - "fig, ax = plt.subplots(figsize=(10, 5))\n", - "lines = ax.plot(data)\n", - "ax.legend(custom_lines, ['Cold', 'Medium', 'Hot']);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There is a lot more that you can do with outputs (such as including interactive outputs)\n", - "with your book. For more information about this, see [the Jupyter Book documentation](https://jupyterbook.org)" - ] - } - ], - "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" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/docs/pygom-doc/ref.md b/docs/pygom-doc/ref.md deleted file mode 100644 index ce3d7538..00000000 --- a/docs/pygom-doc/ref.md +++ /dev/null @@ -1,113 +0,0 @@ -# References {#ref} - -::: {#citations} - -[Aron1984]{#Aron1984 .citation-label} - -: Seasonality and period-doubling bifurcations in an epidemic model, - Joan L. Aron and Ira B. Schwartz, Journal of Theoretical Biology, - Volume 110, Issue 4, page 665-679, 1984 - -[Brauer2008]{#Brauer2008 .citation-label} - -: Mathematical Epidemiology, Lecture Notes in Mathematics, Fred - Brauer, Springer 2008 - -[Cao2006]{#Cao2006 .citation-label} - -: Efficient step size selection for the tau-leaping simulation method, - Yang Cao et el., The Journal of Chemical Physics, Volume 124, Issue - 4, page 044109, 2006 - -[Finnie2016]{#Finnie2016 .citation-label} - -: EpiJSON: A unified data-format for epidemiology, Thomas Finnie et - al., Epidemics, Volume 15, page 20-26, 2016 - -[FitzHugh1961]{#FitzHugh1961 .citation-label} - -: Impulses and Physiological States in Theoretical Models of Nerve - Membrane, Richard FitzHugh, Biophysical Journal, Volume 1, Issue 6, - page 445-466, 1961 - -[Gillespie1977]{#Gillespie1977 .citation-label} - -: Exact stochastic simulation of coupled chemical reactions, Danial T. - Gillespie, The Journal of Physical Chemistry, Volume 81, Issue 25, - page 2340-2361, 1977 - -[Girolami2011]{#Girolami2011 .citation-label} - -: Riemann manifold Langevin and Hamiltonian Monte Carlo methods, Mark - Girolami and Ben Calderhead, Journal of the Royal Statistical - Society Series B, Volume 73, Issue 2, page 123-214, 2011. - -[Hethcote1973]{#Hethcote1973 .citation-label} - -: Asymptotic behavior in a deterministic epidemic model, Herbert W. - Hethcote, Bulletin of Mathematical Biology, Volume 35, page 607-614, - 1973 - -[Legrand2007]{#Legrand2007 .citation-label} - -: Understanding the dynamics of Ebola epidemics, J. Legrand et al. - Epidemiology and Infection, Volume 135, Issue 4, page 610-621, 2007 - -[Lloyd1996]{#Lloyd1996 .citation-label} - -: Spatial Heterogeneity in Epidemic Models, A.L. Lloyd and R.M. May, - Journal of Theoretical Biology, Volume 179, Issue 1, page 1-11, 1996 - -[Lorenz1963]{#Lorenz1963 .citation-label} - -: Deterministic Nonperiodic Flow, Edward N. Lorenz, Journal of the - Atmospheric Sciences, Volume 20, Issue 2, page 130-141, 1963 - -[Lotka1920]{#Lotka1920 .citation-label} - -: Analytical Note on Certain Rhythmic Relations in Organic Systems, - Alfred J. Lotka, Proceedings of the National Academy of Sciences of - the United States of America, Volume 7, Issue 7, page 410-415, 1920 - -[Moolgavkar1987]{#Moolgavkar1987 .citation-label} - -: Confidence Regions for Parameters of the Proportional Hazards Model: - A Simulation Study, S.H. Moolgavkar and D.J. Venzon, Scandianvia - Journal of Statistics, Volume 14, page 43-56, 1987 - -[Press2007]{#Press2007 .citation-label} - -: Numerical Recipes 3rd Edition: The Art of Scientific Computing, W.H. - Press et al., Cambridge University Press, 2007 - -[Ramsay2007]{#Ramsay2007 .citation-label} - -: Parameter estimation for differential equations: a generalized - smoothing approach, Journal of the Royal Statistical Society Series - B, James O. Ramsay et al., Volume 69, Issue 5, page 741-796, 2007 - -[Raue2009]{#Raue2009 .citation-label} - -: Structural and Practical Identifiability Analysis of Partially - Observed Dynamical Models by Exploiting the Profile Likelihood, A. - Raue et al., Bioinformatics, Volume 25, Issue 15, page 1923-1929, - 2009 - -[Robertson1966]{#Robertson1966 .citation-label} - -: The solution of a set of reaction rate equations, H.H. Robertson, - Academic Press, page 178-182, 1966 - -[Venzon1988]{#Venzon1988 .citation-label} - -: A Method for Computing Profile-Likelihood-Based Confidence - Intervals, D.J. Venzon and S.H. Moolgavkar, Journal of the Royal - Statistical Society Series C (Applied Statistics), Volume 37, Issue - 1, page 87-94, 1988 - -[vanderpol1926]{#vanderpol1926 .citation-label} - -: On Relaxed Oscillations, Balthasar van der Pol, The London, - Edinburgh, and Dublin Philosophical Magazine and Journal of Science, - Volume 2, Issue 11, page 978-992, 1926 -::: diff --git a/docs/pygom-doc/references.bib b/docs/pygom-doc/references.bib deleted file mode 100644 index 783ec6aa..00000000 --- a/docs/pygom-doc/references.bib +++ /dev/null @@ -1,56 +0,0 @@ ---- ---- - -@inproceedings{holdgraf_evidence_2014, - address = {Brisbane, Australia, Australia}, - title = {Evidence for {Predictive} {Coding} in {Human} {Auditory} {Cortex}}, - booktitle = {International {Conference} on {Cognitive} {Neuroscience}}, - publisher = {Frontiers in Neuroscience}, - author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Knight, Robert T.}, - year = {2014} -} - -@article{holdgraf_rapid_2016, - title = {Rapid tuning shifts in human auditory cortex enhance speech intelligibility}, - volume = {7}, - issn = {2041-1723}, - url = {http://www.nature.com/doifinder/10.1038/ncomms13654}, - doi = {10.1038/ncomms13654}, - number = {May}, - journal = {Nature Communications}, - author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Rieger, Jochem W. and Crone, Nathan and Lin, Jack J. and Knight, Robert T. and Theunissen, Frédéric E.}, - year = {2016}, - pages = {13654}, - file = {Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:C\:\\Users\\chold\\Zotero\\storage\\MDQP3JWE\\Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:application/pdf} -} - -@inproceedings{holdgraf_portable_2017, - title = {Portable learning environments for hands-on computational instruction using container-and cloud-based technology to teach data science}, - volume = {Part F1287}, - isbn = {978-1-4503-5272-7}, - doi = {10.1145/3093338.3093370}, - abstract = {© 2017 ACM. There is an increasing interest in learning outside of the traditional classroom setting. This is especially true for topics covering computational tools and data science, as both are challenging to incorporate in the standard curriculum. These atypical learning environments offer new opportunities for teaching, particularly when it comes to combining conceptual knowledge with hands-on experience/expertise with methods and skills. Advances in cloud computing and containerized environments provide an attractive opportunity to improve the effciency and ease with which students can learn. This manuscript details recent advances towards using commonly-Available cloud computing services and advanced cyberinfrastructure support for improving the learning experience in bootcamp-style events. We cover the benets (and challenges) of using a server hosted remotely instead of relying on student laptops, discuss the technology that was used in order to make this possible, and give suggestions for how others could implement and improve upon this model for pedagogy and reproducibility.}, - booktitle = {{ACM} {International} {Conference} {Proceeding} {Series}}, - author = {Holdgraf, Christopher Ramsay and Culich, A. and Rokem, A. and Deniz, F. and Alegro, M. and Ushizima, D.}, - year = {2017}, - keywords = {Teaching, Bootcamps, Cloud computing, Data science, Docker, Pedagogy} -} - -@article{holdgraf_encoding_2017, - title = {Encoding and decoding models in cognitive electrophysiology}, - volume = {11}, - issn = {16625137}, - doi = {10.3389/fnsys.2017.00061}, - abstract = {© 2017 Holdgraf, Rieger, Micheli, Martin, Knight and Theunissen. Cognitive neuroscience has seen rapid growth in the size and complexity of data recorded from the human brain as well as in the computational tools available to analyze this data. This data explosion has resulted in an increased use of multivariate, model-based methods for asking neuroscience questions, allowing scientists to investigate multiple hypotheses with a single dataset, to use complex, time-varying stimuli, and to study the human brain under more naturalistic conditions. These tools come in the form of “Encoding” models, in which stimulus features are used to model brain activity, and “Decoding” models, in which neural features are used to generated a stimulus output. Here we review the current state of encoding and decoding models in cognitive electrophysiology and provide a practical guide toward conducting experiments and analyses in this emerging field. Our examples focus on using linear models in the study of human language and audition. We show how to calculate auditory receptive fields from natural sounds as well as how to decode neural recordings to predict speech. The paper aims to be a useful tutorial to these approaches, and a practical introduction to using machine learning and applied statistics to build models of neural activity. The data analytic approaches we discuss may also be applied to other sensory modalities, motor systems, and cognitive systems, and we cover some examples in these areas. In addition, a collection of Jupyter notebooks is publicly available as a complement to the material covered in this paper, providing code examples and tutorials for predictive modeling in python. The aimis to provide a practical understanding of predictivemodeling of human brain data and to propose best-practices in conducting these analyses.}, - journal = {Frontiers in Systems Neuroscience}, - author = {Holdgraf, Christopher Ramsay and Rieger, J.W. and Micheli, C. and Martin, S. and Knight, R.T. and Theunissen, F.E.}, - year = {2017}, - keywords = {Decoding models, Encoding models, Electrocorticography (ECoG), Electrophysiology/evoked potentials, Machine learning applied to neuroscience, Natural stimuli, Predictive modeling, Tutorials} -} - -@book{ruby, - title = {The Ruby Programming Language}, - author = {Flanagan, David and Matsumoto, Yukihiro}, - year = {2008}, - publisher = {O'Reilly Media} -} From f45c4a05ca6676c7db671cdb94d28ca24d46aaee Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 29 Aug 2023 22:22:26 +0100 Subject: [PATCH 141/188] tweaking autodoc generation --- docs/pygom-doc/_toc.yml | 10 ++++------ docs/pygom-doc/{ => images}/logo_pygom.jpg | Bin docs/pygom-doc/md/module-documentation.md | 11 +++++++++++ docs/pygom-doc/rst/autodoc-model.rst | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) rename docs/pygom-doc/{ => images}/logo_pygom.jpg (100%) create mode 100644 docs/pygom-doc/md/module-documentation.md diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index f7a533cf..7ad7ceca 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -50,12 +50,10 @@ parts: # - file: md/faq.md - caption: Code documentation chapters: - - file: module-documentation.md - sections: - - file: autodoc-model.rst - - file: autodoc-loss.rst - - file: autodoc-abc.rst - - file: autodoc-utilR.rst + - file: rst/autodoc-model.rst + - file: rst/autodoc-loss.rst + - file: rst/autodoc-abc.rst + - file: rst/autodoc-utilR.rst # add utils # add abc - caption: References diff --git a/docs/pygom-doc/logo_pygom.jpg b/docs/pygom-doc/images/logo_pygom.jpg similarity index 100% rename from docs/pygom-doc/logo_pygom.jpg rename to docs/pygom-doc/images/logo_pygom.jpg diff --git a/docs/pygom-doc/md/module-documentation.md b/docs/pygom-doc/md/module-documentation.md new file mode 100644 index 00000000..53f24ceb --- /dev/null +++ b/docs/pygom-doc/md/module-documentation.md @@ -0,0 +1,11 @@ +# Modules + +Code documentation + +{doc}`../rst/autodoc-model.rst` + +{doc}`../rst/autodoc-loss.rst` + +{doc}`../rst/autodoc-abc.rst` + +{doc}`../rst/autodoc-utilR.rst` \ No newline at end of file diff --git a/docs/pygom-doc/rst/autodoc-model.rst b/docs/pygom-doc/rst/autodoc-model.rst index debfb420..ae396cdf 100644 --- a/docs/pygom-doc/rst/autodoc-model.rst +++ b/docs/pygom-doc/rst/autodoc-model.rst @@ -1,4 +1,4 @@ -model +# model ============= .. automodule:: pygom.model From 0a594dd754dcd5b3a00d1ddea6c926080a90e6e1 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Tue, 29 Aug 2023 23:45:35 +0100 Subject: [PATCH 142/188] reformatted common model notebooks --- .../common_models/Lotka_Volterra.ipynb | 20 ++- .../common_models/Lotka_Volterra_4State.ipynb | 13 +- .../notebooks/common_models/Robertson.ipynb | 13 +- .../notebooks/common_models/SEIR.ipynb | 39 ++++-- .../common_models/SEIR_Birth_Death.ipynb | 46 ++++--- .../SEIR_Birth_Death_Periodic.ipynb | 119 ++++++++++++----- .../common_models/SEIR_Multiple.ipynb | 62 +++++---- .../notebooks/common_models/SIR.ipynb | 71 +++++++--- .../common_models/SIR_Birth_Death.ipynb | 46 ++++--- .../notebooks/common_models/SIS.ipynb | 45 ++++--- .../common_models/SIS_Periodic.ipynb | 59 ++++++--- .../notebooks/common_models/vanDelPol.ipynb | 122 +++++++++++------- 12 files changed, 444 insertions(+), 211 deletions(-) diff --git a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb index 3b21bdb3..ddf146b7 100644 --- a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra.ipynb @@ -110,9 +110,11 @@ ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "id": "837940dd", "metadata": {}, + "outputs": [], "source": [ "cList = numpy.linspace(0.1, 2.0, 5)\n", "\n", @@ -121,8 +123,7 @@ "fig = plt.figure()\n", "\n", "for i in range(len(x1List)): \n", - " ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3, \n", - " 'c':cList[i], 'gamma':gammaList[i]})\n", + " ode = common_models.Lotka_Volterra({'alpha':1, 'delta':3, 'c':cList[i], 'gamma':gammaList[i]})\n", "\n", "ode.initial_values = (x0, 0) \n", "solutionList += [ode.integrate(t)]\n", @@ -149,8 +150,19 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, diff --git a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb index 807863e0..69d16ee7 100644 --- a/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Lotka_Volterra_4State.ipynb @@ -75,8 +75,19 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, diff --git a/docs/pygom-doc/notebooks/common_models/Robertson.ipynb b/docs/pygom-doc/notebooks/common_models/Robertson.ipynb index 19865a94..a057631c 100644 --- a/docs/pygom-doc/notebooks/common_models/Robertson.ipynb +++ b/docs/pygom-doc/notebooks/common_models/Robertson.ipynb @@ -108,8 +108,19 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, diff --git a/docs/pygom-doc/notebooks/common_models/SEIR.ipynb b/docs/pygom-doc/notebooks/common_models/SEIR.ipynb index dea8d27b..3875aa0b 100644 --- a/docs/pygom-doc/notebooks/common_models/SEIR.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SEIR.ipynb @@ -4,7 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SEIR`\n", + "# SEIR\n", + "{func}`.SEIR`\n", "\n", "A natural extension to the SIR is the SEIR model. An extra parameter\n", "$\\alpha$, which is the inverse of the incubation period is introduced.\n", @@ -17,30 +18,40 @@ "\\frac{dI}{dt} &= \\alpha E - \\gamma I \\\\\n", "\\end{aligned}$$$$\\frac{dR}{dt} &= \\gamma I$$\n", "\n", - "We use the parameters from \\[Aron1984\\] here to generate our plots,\n", + "We use the parameters from {cite:t}`Aron1984` here to generate our plots,\n", "which does not yield a *nice* and *sensible* epidemic curve as the birth\n", "and death processes are missing.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "bd15619d", + "metadata": {}, + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import numpy\n", + "import numpy\n", "\n", - "In \\[1\\]: ode = common_models.SEIR({'beta':1800, 'gamma':100,\n", - "'alpha':35.84})\n", + "ode = common_models.SEIR({'beta':1800, 'gamma':100, 'alpha':35.84})\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 50, 1001)\n", + "t = numpy.linspace(0, 50, 1001)\n", "\n", - "In \\[1\\]: x0 = \\[0.0658, 0.0007, 0.0002, 0.0\\]\n", + "Ix0 = [0.0658, 0.0007, 0.0002, 0.0]\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "solution = ode.integrate(t[1::])\n", "\n", - "@savefig common_models_seir.png In \\[1\\]: ode.plot()" + "ode.plot()" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death.ipynb b/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death.ipynb index a886b59d..8009c300 100644 --- a/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death.ipynb @@ -4,7 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SEIR_Birth_Death`\n", + "# SEIR - birth, death\n", + "{func}`.SEIR_Birth_Death`\n", "\n", "Extending it to also include birth death process with equal rate $\\mu$\n", "\n", @@ -15,35 +16,44 @@ "\\frac{dR}{dt} &= \\gamma I\n", "\\end{aligned}$$\n", "\n", - "Same parameters value taken from [\\[Aron1984\\]]() as the SEIR example\n", + "Same parameters value taken from {cite}`Aron1984``as the SEIR example\n", "above is used here. Observe how the introduction of a birth and a death\n", "process changes the graph even though the rest of the parameters remains\n", - "the same.\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "the same.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79c1b572", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: import numpy\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode = common_models.SEIR_Birth_Death({'beta':1800,\n", - "'gamma':100, 'alpha':35.84, 'mu':0.02})\n", + "import numpy\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 50, 1001)\n", + "ode = common_models.SEIR_Birth_Death({'beta':1800, 'gamma':100, 'alpha':35.84, 'mu':0.02})\n", "\n", - "In \\[1\\]: x0 = \\[0.0658, 0.0007, 0.0002, 0.0\\]\n", + "t = numpy.linspace(0, 50, 1001)\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "x0 = [0.0658, 0.0007, 0.0002, 0.0]\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\], full_output=True)\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "@savefig common_models_seir_bd.png In \\[1\\]: ode.plot()\n", + "solution = ode.integrate(t[1::], full_output=True)\n", "\n", - "In \\[1\\]: plt.close()" + "ode.plot()" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death_Periodic.ipynb b/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death_Periodic.ipynb index cd2a67d7..fdd70b67 100644 --- a/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death_Periodic.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SEIR_Birth_Death_Periodic.ipynb @@ -4,73 +4,124 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SEIR_Birth_Death_Periodic`\n", + "# SEIR - birth, death and periodic\n", + "\n", + "{func}`SEIR_Birth_Death_Periodic`\n", "\n", "Now extending the SEIR to also have periodic contact, as in\n", - "[\\[Aron1984\\]]().\n", + "{cite}`Aron1984`.\n", "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= \\mu - \\beta(t)SI - \\mu S \\\\\n", "\\frac{dE}{dt} &= \\beta(t)SI - (\\mu + \\alpha) E \\\\\n", "\\frac{dI}{dt} &= \\alpha E - (\\mu + \\gamma) I \\\\\n", "\\frac{dR}{dt} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", + "\\end{aligned}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc27b5b3", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: import numpy\n", + "import numpy\n", "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode = common_models.SEIR_Birth_Death_Periodic({'beta_0':1800,\n", - "'beta_1':0.2, 'gamma':100, 'alpha':35.84, 'mu':0.02})\n", + "ode = common_models.SEIR_Birth_Death_Periodic({'beta_0':1800, 'beta_1':0.2, 'gamma':100, 'alpha':35.84, 'mu':0.02})\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 50, 1001)\n", + "t = numpy.linspace(0, 50, 1001)\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: x0 = \\[0.0658, 0.0007, 0.0002, 0.0\\]\n", + "x0 = [0.0658, 0.0007, 0.0002, 0.0]\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "solution = ode.integrate(t[1::])\n", "\n", - "@savefig common_models_seir_bd_periodic1.png In \\[1\\]: ode.plot()\n", + "ode.plot()\n", "\n", - "In \\[1\\]: plt.close()\n", + "plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "5614972a", + "metadata": {}, + "source": [ "\n", "The periodicity is obvious when looking at the the plot between states\n", "$S$ and $E$, in logarithmic scale.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "29c5f471", + "metadata": {}, + "source": [ + "fig = plt.figure();\n", "\n", - "In \\[1\\]: fig = plt.figure();\n", - "\n", - "In \\[1\\]: plt.plot(numpy.log(solution\\[:,0\\]),\n", - "numpy.log(solution\\[:,1\\]));\n", - "\n", - "In \\[1\\]: plt.xlabel('log of S');\n", + "plt.plot(numpy.log(solution[:,0]), numpy.log(solution[:,1]));\n", "\n", - "In \\[1\\]: plt.ylabel('log of E');\n", + "plt.xlabel('log of S');\n", "\n", - "@savefig common_models_seir_bd_periodic2.png In \\[1\\]: plt.show()\n", + "plt.ylabel('log of E');\n", "\n", - "In \\[1\\]: plt.close()\n", + "plt.show()\n", "\n", - "Similarly, we can see the same thing between the states $E$ and $I$.\n", + "plt.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d639850d", + "metadata": {}, + "source": [ "\n", - "In \\[1\\]: fig = plt.figure();\n", + "Similarly, we can see the same thing between the states $E$ and $I$.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f259172", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure();\n", "\n", - "In \\[1\\]: plt.plot(numpy.log(solution\\[:,1\\]),\n", - "numpy.log(solution\\[:,2\\]));\n", + "plt.plot(numpy.log(solution[:,1]), numpy.log(solution[:,2]));\n", "\n", - "In \\[1\\]: plt.xlabel('log of E');\n", + "plt.xlabel('log of E');\n", "\n", - "In \\[1\\]: plt.ylabel('log of I');\n", + "plt.ylabel('log of I');\n", "\n", - "@savefig common_models_seir_bd_periodic3.png In \\[1\\]: plt.show()\n", + "plt.show()\n", "\n", - "In \\[1\\]: plt.close()" + "plt.close()" ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SEIR_Multiple.ipynb b/docs/pygom-doc/notebooks/common_models/SEIR_Multiple.ipynb index e47426be..b9ff28df 100644 --- a/docs/pygom-doc/notebooks/common_models/SEIR_Multiple.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SEIR_Multiple.ipynb @@ -4,7 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SEIR_Multiple`\n", + "# SEIR, multiple\n", + "{func}`.SEIR_Multiple`\n", "\n", "Multiple SEIR coupled together, without any birth death process.\n", "\n", @@ -19,41 +20,58 @@ "\n", "$$\\lambda_{i} = \\sum_{j=1}^{n} \\beta_{i,j} I_{j} (1\\{i\\neq j\\} p)$$\n", "\n", - "with $n$ being the number of patch and $p$ the coupled factor.\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", + "with $n$ being the number of patch and $p$ the coupled factor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "650477fb", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[2\\]: import numpy\n", + "import numpy\n", "\n", - "In \\[3\\]: paramEval = {'beta_00':0.0010107,'beta_01':0.0010107,'beta_10':0.0010107, \n", - "...: 'beta_11':0.0010107,'d':0.02,'epsilon':45.6,'gamma':73.0, ...:\n", - "'N_0':10\\**6,'N_1':10*\\*6,'p':0.01}\n", + "paramEval = {'beta_00':0.0010107, 'beta_01':0.0010107, 'beta_10':0.0010107, 'beta_11':0.0010107,\n", + " 'd':0.02, 'epsilon':45.6, 'gamma':73.0, 'N_0':10**6,'N_1':10**6,'p':0.01}\n", "\n", - "In \\[4\\]: x0 = \\[36139.3224081278, 422.560577637822, 263.883351688369,\n", - "963174.233662546\\]\n", + "x0 = [36139.3224081278, 422.560577637822, 263.883351688369, 963174.233662546]\n", "\n", - "In \\[5\\]: ode = common_models.SEIR_Multiple(param=paramEval)\n", + "ode = common_models.SEIR_Multiple(param=paramEval)\n", "\n", - "In \\[6\\]: t = numpy.linspace(0, 40, 100)\n", + "t = numpy.linspace(0, 40, 100)\n", "\n", - "In \\[7\\]: x01 = \\[\\]\n", + "x01 = []\n", "\n", - "In \\[8\\]: for s in x0: \n", - "...: x01 += 2\\*\\[s\\]\n", + "for s in x0: \n", + " x01 += 2*[s]\n", "\n", - "In \\[9\\]: ode.initial_values = (numpy.array(x01, float),t\\[0\\])\n", + "ode.initial_values = (numpy.array(x01, float),t[0])\n", "\n", - "In \\[10\\]: solution, output = ode.integrate(t\\[1::\\], full_output=True)\n", + "solution, output = ode.integrate(t[1::], full_output=True)\n", "\n", - "@savefig common_models_seir_multiple.png In \\[11\\]: ode.plot()\n", + "ode.plot()\n" + ] + }, + { + "cell_type": "markdown", + "id": "e12bde20", + "metadata": {}, + "source": [ "\n", "The initial conditions are those derived by using the stability\n", - "condition as stated in [\\[Lloyd1996\\]]() while the notations is taken\n", - "from [\\[Brauer2008\\]]()." + "condition as stated in {cite:t}`Lloyd1996` while the notations is taken\n", + "from {cite:t}`Brauer2008`." ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SIR.ipynb b/docs/pygom-doc/notebooks/common_models/SIR.ipynb index fd293399..ca73f476 100644 --- a/docs/pygom-doc/notebooks/common_models/SIR.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SIR.ipynb @@ -6,7 +6,7 @@ "source": [ "# `.SIR`\n", "\n", - "A standard SIR model defined by the equations\n", + "A standard SIR model defined by the following equations.\n", "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= -\\beta SI \\\\\n", @@ -14,42 +14,71 @@ "\\frac{dR}{dt} &= \\gamma I\n", "\\end{aligned}$$\n", "\n", - "Note that the examples and parameters are taken from [\\[Brauer2008\\]](),\n", - "namely Figure 1.4. Hence, the first one below may not appear to make\n", + "Note that the examples and parameters are taken from {cite:t}`Brauer2008`,\n", + "namely Figure 1.4. Hence, the first example below may not appear to make\n", "much sense.\n", "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import numpy\n", + "#TODO don't understand\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23fa5cee", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: ode = common_models.SIR({'beta':3.6, 'gamma':0.2})\n", + "import numpy\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 730, 1001)\n", + "ode = common_models.SIR({'beta':3.6, 'gamma':0.2})\n", "\n", - "In \\[1\\]: N = 7781984.0\n", + "t = numpy.linspace(0, 730, 1001)\n", "\n", - "In \\[1\\]: x0 = \\[1.0, 10.0/N, 0.0\\]\n", + "N = 7781984.0\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "x0 = [1.0, 10.0/N, 0.0]\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "@savefig common_models_sir.png In \\[1\\]: ode.plot()\n", + "solution = ode.integrate(t[1::])\n", "\n", - "Now we have the more sensible plot, where the initial susceptibles is\n", - "only a fraction of 1.\n", + "ode.plot()\n" + ] + }, + { + "cell_type": "markdown", + "id": "2b5252ff", + "metadata": {}, + "source": [ "\n", - "In \\[1\\]: x0 = \\[0.065, 123\\*(5.0/30.0)/N, 0.0\\]\n", + "Now we have the more sensible plot, where the initial susceptible population is\n", + "only a fraction of 1.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd78eb6c", + "metadata": {}, + "outputs": [], + "source": [ + "x0 = [0.065, 123*(5.0/30.0)/N, 0.0]\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "solution = ode.integrate(t[1::])\n", "\n", - "@savefig common_models_sir_realistic.png In \\[1\\]: ode.plot()" + "ode.plot()" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SIR_Birth_Death.ipynb b/docs/pygom-doc/notebooks/common_models/SIR_Birth_Death.ipynb index f58c7552..e93b3599 100644 --- a/docs/pygom-doc/notebooks/common_models/SIR_Birth_Death.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SIR_Birth_Death.ipynb @@ -4,9 +4,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SIR_Birth_Death`\n", + "# SIR, birth and death \n", + "{func}`.SIR_Birth_Death`\n", "\n", - "Next, we look at an SIR model with birth death\n", + "Next, we look at an SIR model with birth and death processes, where populations are added (birth) or removed (death).\n", "\n", "$$\\begin{aligned}\n", "\\frac{dS}{dt} &= B -\\beta SI - \\mu S \\\\\n", @@ -15,32 +16,43 @@ "\\end{aligned}$$\n", "\n", "Continuing from the example above, but now with a much longer time\n", - "frame. Note that the birth and death rate are the same.\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", + "frame. Note that the birth and death rate are the same to maintain a constant population.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1e5a8099", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: import numpy\n", + "import numpy\n", "\n", - "In \\[1\\]: B = 126372.0/365.0\n", + "B = 126372.0/365.0\n", "\n", - "In \\[1\\]: N = 7781984.0\n", + "N = 7781984.0\n", "\n", - "In \\[1\\]: ode = common_models.SIR_Birth_Death({'beta':3.6, 'gamma':0.2,\n", - "'B':B/N, 'mu':B/N})\n", + "ode = common_models.SIR_Birth_Death({'beta':3.6, 'gamma':0.2, 'B':B/N, 'mu':B/N})\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 35\\*365, 10001)\n", + "t = numpy.linspace(0, 35*365, 10001)\n", "\n", - "In \\[1\\]: x0 = \\[0.065, 123.0\\*(5.0/30.0)/N, 0.0\\]\n", + "x0 = [0.065, 123.0*(5.0/30.0)/N, 0.0]\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "solution = ode.integrate(t[1::])\n", "\n", - "@savefig common_models_sir_bd.png In \\[1\\]: ode.plot()" + "ode.plot()" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SIS.ipynb b/docs/pygom-doc/notebooks/common_models/SIS.ipynb index ba80a5c7..cb09e523 100644 --- a/docs/pygom-doc/notebooks/common_models/SIS.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SIS.ipynb @@ -4,10 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SIS`\n", + "# SIS\n", + "{func}`.SIS`\n", "\n", "A standard SIS model without the total population $N$. We assume here\n", - "that $S + I = N$ so we can always normalize to 1. Evidently, the state\n", + "that $S + I = N$ so we can always normalize to 1. The state\n", "$S$ is not required for understanding the model because it is a\n", "deterministic function of state $I$.\n", "\n", @@ -16,31 +17,41 @@ "\\frac{dI}{dt} &= \\beta S I - \\gamma I.\n", "\\end{aligned}$$\n", "\n", - "An example would be\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "An example of an implementation is given below.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "438844b8", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: import numpy\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode = common_models.SIS({'beta':0.5,'gamma':0.2})\n", + "import numpy\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 20, 101)\n", + "ode = common_models.SIS({'beta':0.5,'gamma':0.2})\n", "\n", - "In \\[1\\]: x0 = \\[1.0, 0.1\\]\n", + "t = numpy.linspace(0, 20, 101)\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "x0 = [1.0, 0.1]\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "@savefig common_models_sis.png In \\[1\\]: ode.plot()\n", + "solution = ode.integrate(t[1::])\n", "\n", - "In \\[1\\]: plt.close()" + "ode.plot()\n" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/SIS_Periodic.ipynb b/docs/pygom-doc/notebooks/common_models/SIS_Periodic.ipynb index 4c2d7066..c19fe77d 100644 --- a/docs/pygom-doc/notebooks/common_models/SIS_Periodic.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SIS_Periodic.ipynb @@ -4,10 +4,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SIS_Periodic`\n", + "# SIS, periodic\n", + "{func}`.SIS_Periodic`\n", "\n", - "Now we look at an extension of the SIS model by incorporating periodic\n", - "contact rate. Note how our equation is defined by a single ode for state\n", + "Now we look at an extension of the SIS model by incorporating a periodic\n", + "contact rate. Note how our equation is defined by a single ODE for state\n", "**I**.\n", "\n", "$$\\frac{dI}{dt} = (\\beta(t)N - \\alpha) I - \\beta(t)I^{2}$$\n", @@ -15,31 +16,53 @@ "where $\\beta(t) = 2 - 1.8 \\cos(5t)$. As the name suggests, it achieves a\n", "(stable) periodic solution. Note how the plots have two sub-graphs,\n", "where $\\tau$ is in fact our time component which we have taken out of\n", - "the original equation when converting it to a automonous system.\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", + "the original equation when converting it to a autonomous system.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e7321259", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: import numpy\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: ode = common_models.SIS_Periodic({'alpha':1.0})\n", + "import numpy\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 10, 101)\n", + "ode = common_models.SIS_Periodic({'alpha':1.0})\n", "\n", - "In \\[1\\]: x0 = \\[0.1,0.\\]\n", + "t = numpy.linspace(0, 10, 101)\n", "\n", - "In \\[1\\]: ode.initial_values = (x0, t\\[0\\])\n", + "x0 = [0.1,0.]\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "ode.initial_values = (x0, t[0])\n", "\n", - "@savefig common_models_sis_periodic.png In \\[1\\]: ode.plot()\n", + "solution = ode.integrate(t[1::])\n", "\n", - "In \\[1\\]: plt.close()" + "ode.plot()" ] } ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } diff --git a/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb b/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb index eceaacda..7e26788d 100644 --- a/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb +++ b/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb @@ -4,9 +4,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.vanDelPol`\n", - "\n", - "The van Del Pol oscillator [\\[vanderpol1926\\]]()\n", + "# vanDelPol\n", + "{func}`.vanDelPol` - the van Del Pol oscillator {cite}`vanderpol1926`\n", "\n", "$$\\begin{aligned}\n", "\\frac{dx}{dt} &= \\sigma (y-x) \\\\\n", @@ -14,70 +13,105 @@ "\\frac{dz}{dt} &= xy - \\beta z\n", "\\end{aligned}$$\n", "\n", - "A classic example is\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[1\\]: import numpy\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[1\\]: t = numpy.linspace(0, 20, 1000)\n", - "\n", - "In \\[1\\]: ode = common_models.vanDelPol({'mu':1.0})\n", - "\n", - "In \\[1\\]: ode.initial_values = (\\[2.0, 0.0\\], t\\[0\\])\n", - "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", - "\n", - "@savefig common_models_vanDelPol.png In \\[1\\]: ode.plot()\n", + "A classic example is given.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca59c8d3", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import common_models\n", "\n", - "In \\[1\\]: plt.close()\n", + "import numpy\n", "\n", - "In \\[1\\]: f = plt.figure()\n", + "import matplotlib.pyplot as plt\n", "\n", - "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,1\\]);\n", + "t = numpy.linspace(0, 20, 1000)\n", "\n", - "@savefig common_models_vanDelPol_yprime_y\\_1.png In \\[1\\]: plt.show()\n", + "ode = common_models.vanDelPol({'mu':1.0})\n", "\n", - "In \\[1\\]: plt.close()\n", + "ode.initial_values = ([2.0, 0.0], t[0])\n", "\n", - "When we change the value, as per\n", - "[Wolfram](http://mathworld.wolfram.com/vanderPolEquation.html)\n", + "solution = ode.integrate(t[1::])\n", "\n", - "In \\[1\\]: t = numpy.linspace(0, 100, 1000)\n", + "ode.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e3e0bb15", + "metadata": {}, + "outputs": [], + "source": [ + "f = plt.figure()\n", "\n", - "In \\[1\\]: ode.parameters = {'mu':1.0}\n", + "plt.plot(solution[:,0], solution[:,1]);\n", "\n", - "In \\[1\\]: ode.initial_values = (\\[0.0, 0.2\\], t\\[0\\])\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "060b0043", + "metadata": {}, + "source": [ "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "And another example using alternative parameters from\n", + "[Wolfram](http://mathworld.wolfram.com/vanderPolEquation.html).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44bc2007", + "metadata": {}, + "outputs": [], + "source": [ + "t = numpy.linspace(0, 100, 1000)\n", "\n", - "In \\[1\\]: f = plt.figure()\n", + "ode.parameters = {'mu':1.0}\n", "\n", - "In \\[1\\]: plt.plot(solution\\[:,0\\],solution\\[:,1\\]);\n", + "ode.initial_values = ([0.0, 0.2], t[0])\n", "\n", - "@savefig common_models_vanDelPol_yprime_y\\_2.png In \\[1\\]: plt.show()\n", + "solution = ode.integrate(t[1::])\n", "\n", - "In \\[1\\]: plt.close()\n", + "f = plt.figure()\n", "\n", - "In \\[1\\]: ode.parameters = {'mu':0.2}\n", + "plt.plot(solution[:,0],solution[:,1]);\n", "\n", - "In \\[1\\]: ode.initial_values = (\\[0.0, 0.2\\], t\\[0\\])\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99020274", + "metadata": {}, + "outputs": [], + "source": [ + "ode.parameters = {'mu':0.2}\n", "\n", - "In \\[1\\]: solution = ode.integrate(t\\[1::\\])\n", + "ode.initial_values = ([0.0, 0.2], t[0])\n", "\n", - "In \\[1\\]: f = plt.figure()\n", + "solution = ode.integrate(t[1::])\n", "\n", - "In \\[1\\]: plt.plot(solution\\[:,0\\], solution\\[:,1\\]);\n", + "f = plt.figure()\n", "\n", - "@savefig common_models_vanDelPol_yprime_y\\_3.png In \\[1\\]: plt.show()\n", + "plt.plot(solution[:,0], solution[:,1]);\n", "\n", - "In \\[1\\]: plt.close()" + "plt.show()" ] } ], + "metadata": { + "language_info": { + "name": "python" + } + }, "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} + "nbformat_minor": 5 } From 424aa7e27097442ba75007d83c74f7fdf10b25cc Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 09:39:53 +0100 Subject: [PATCH 143/188] update common models header page --- docs/pygom-doc/md/common_models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pygom-doc/md/common_models.md b/docs/pygom-doc/md/common_models.md index 77048ef2..08965ee7 100644 --- a/docs/pygom-doc/md/common_models.md +++ b/docs/pygom-doc/md/common_models.md @@ -1,4 +1,4 @@ -# Pre-defined Example common_models {#common_models} +# Pre-defined examples - common epi models We have defined a set of models {mod}`common_models`, most of them commonly used in epidemiology. They are there as examples and also to save time for users. Most of them are of the From 1237af527507286f16cdb1247ddfb0c288d9f51f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 11:12:01 +0100 Subject: [PATCH 144/188] remove whitelines --- docs/pygom-doc/ref.bib | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/pygom-doc/ref.bib b/docs/pygom-doc/ref.bib index 89833a8e..b7509dd4 100644 --- a/docs/pygom-doc/ref.bib +++ b/docs/pygom-doc/ref.bib @@ -214,3 +214,52 @@ @article{Venzon1988 volume = {37}, year = {1988}, } +@inproceedings{holdgraf_evidence_2014, + address = {Brisbane, Australia, Australia}, + title = {Evidence for {Predictive} {Coding} in {Human} {Auditory} {Cortex}}, + booktitle = {International {Conference} on {Cognitive} {Neuroscience}}, + publisher = {Frontiers in Neuroscience}, + author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Knight, Robert T.}, + year = {2014} +} +@article{holdgraf_rapid_2016, + title = {Rapid tuning shifts in human auditory cortex enhance speech intelligibility}, + volume = {7}, + issn = {2041-1723}, + url = {http://www.nature.com/doifinder/10.1038/ncomms13654}, + doi = {10.1038/ncomms13654}, + number = {May}, + journal = {Nature Communications}, + author = {Holdgraf, Christopher Ramsay and de Heer, Wendy and Pasley, Brian N. and Rieger, Jochem W. and Crone, Nathan and Lin, Jack J. and Knight, Robert T. and Theunissen, Frédéric E.}, + year = {2016}, + pages = {13654}, + file = {Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:C\:\\Users\\chold\\Zotero\\storage\\MDQP3JWE\\Holdgraf et al. - 2016 - Rapid tuning shifts in human auditory cortex enhance speech intelligibility.pdf:application/pdf} +} +@inproceedings{holdgraf_portable_2017, + title = {Portable learning environments for hands-on computational instruction using container-and cloud-based technology to teach data science}, + volume = {Part F1287}, + isbn = {978-1-4503-5272-7}, + doi = {10.1145/3093338.3093370}, + abstract = {© 2017 ACM. There is an increasing interest in learning outside of the traditional classroom setting. This is especially true for topics covering computational tools and data science, as both are challenging to incorporate in the standard curriculum. These atypical learning environments offer new opportunities for teaching, particularly when it comes to combining conceptual knowledge with hands-on experience/expertise with methods and skills. Advances in cloud computing and containerized environments provide an attractive opportunity to improve the effciency and ease with which students can learn. This manuscript details recent advances towards using commonly-Available cloud computing services and advanced cyberinfrastructure support for improving the learning experience in bootcamp-style events. We cover the benets (and challenges) of using a server hosted remotely instead of relying on student laptops, discuss the technology that was used in order to make this possible, and give suggestions for how others could implement and improve upon this model for pedagogy and reproducibility.}, + booktitle = {{ACM} {International} {Conference} {Proceeding} {Series}}, + author = {Holdgraf, Christopher Ramsay and Culich, A. and Rokem, A. and Deniz, F. and Alegro, M. and Ushizima, D.}, + year = {2017}, + keywords = {Teaching, Bootcamps, Cloud computing, Data science, Docker, Pedagogy} +} +@article{holdgraf_encoding_2017, + title = {Encoding and decoding models in cognitive electrophysiology}, + volume = {11}, + issn = {16625137}, + doi = {10.3389/fnsys.2017.00061}, + abstract = {© 2017 Holdgraf, Rieger, Micheli, Martin, Knight and Theunissen. Cognitive neuroscience has seen rapid growth in the size and complexity of data recorded from the human brain as well as in the computational tools available to analyze this data. This data explosion has resulted in an increased use of multivariate, model-based methods for asking neuroscience questions, allowing scientists to investigate multiple hypotheses with a single dataset, to use complex, time-varying stimuli, and to study the human brain under more naturalistic conditions. These tools come in the form of “Encoding” models, in which stimulus features are used to model brain activity, and “Decoding” models, in which neural features are used to generated a stimulus output. Here we review the current state of encoding and decoding models in cognitive electrophysiology and provide a practical guide toward conducting experiments and analyses in this emerging field. Our examples focus on using linear models in the study of human language and audition. We show how to calculate auditory receptive fields from natural sounds as well as how to decode neural recordings to predict speech. The paper aims to be a useful tutorial to these approaches, and a practical introduction to using machine learning and applied statistics to build models of neural activity. The data analytic approaches we discuss may also be applied to other sensory modalities, motor systems, and cognitive systems, and we cover some examples in these areas. In addition, a collection of Jupyter notebooks is publicly available as a complement to the material covered in this paper, providing code examples and tutorials for predictive modeling in python. The aimis to provide a practical understanding of predictivemodeling of human brain data and to propose best-practices in conducting these analyses.}, + journal = {Frontiers in Systems Neuroscience}, + author = {Holdgraf, Christopher Ramsay and Rieger, J.W. and Micheli, C. and Martin, S. and Knight, R.T. and Theunissen, F.E.}, + year = {2017}, + keywords = {Decoding models, Encoding models, Electrocorticography (ECoG), Electrophysiology/evoked potentials, Machine learning applied to neuroscience, Natural stimuli, Predictive modeling, Tutorials} +} +@book{ruby, + title = {The Ruby Programming Language}, + author = {Flanagan, David and Matsumoto, Yukihiro}, + year = {2008}, + publisher = {O'Reilly Media} +} \ No newline at end of file From 830579c1a555d00f1a0cf37c4013cdcc0aa6dee0 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 13:05:05 +0100 Subject: [PATCH 145/188] reformatted parameter fitting notebooks --- .../notebooks/paramfit/gradient.ipynb | 549 +++++++++++++++ .../notebooks/paramfit/initialGuess.ipynb | 110 +++ .../notebooks/paramfit/profile.ipynb | 644 ++++++++++++++++++ 3 files changed, 1303 insertions(+) create mode 100644 docs/pygom-doc/notebooks/paramfit/gradient.ipynb create mode 100644 docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb create mode 100644 docs/pygom-doc/notebooks/paramfit/profile.ipynb diff --git a/docs/pygom-doc/notebooks/paramfit/gradient.ipynb b/docs/pygom-doc/notebooks/paramfit/gradient.ipynb new file mode 100644 index 00000000..42345ef4 --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/gradient.ipynb @@ -0,0 +1,549 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Gradient estimation under square loss\n", + "\n", + "Assuming that we have a set of $N$ observations $y_{i}$ at specific time\n", + "points $t_{i}$, $i = 1,\\ldots,N$, we may wish to test out a set of ode\n", + "to see whether it fits to the data. The most natural way to test such\n", + "*fit* is to minimize the sum of squares between our observations $y$ and\n", + "see whether the resulting solution of the ode and the estimationed\n", + "parameters makes sense.\n", + "\n", + "We assume that this estimation process will be tackled through a\n", + "non-linear optimization point of view. However, it should be noted that\n", + "such estimates can also be performed via MCMC or from a global\n", + "optimization perspective. A key element in non-linear optimization is\n", + "the gradient, which is the focus of this page.\n", + "\n", + "Multiple ways of obtaining the gradient have been implemented. All of\n", + "them serve a certain purpose and may not be a viable/appropriate options\n", + "depending on the type of ode. More generally, let $d,p$ be the number of\n", + "states and paramters respectively. Then finite difference methods have a\n", + "run order of $O(p+1)$ of the original ode, forward sensitivity require\n", + "an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint\n", + "method require two run of size $d$ in principle, but actual run time is\n", + "dependent on the number of observations.\n", + "\n", + "For the details of the classes and methods, please refer to {func}`mod`.\n", + "\n", + "## Notation\n", + "\n", + "We introduce the notations that will be used in the rest of the page,\n", + "some of which may be slightly unconventional but necessary due to the\n", + "complexity of the problem. Let $x \\in \\mathbb{R}^{d}$ and\n", + "$\\theta \\in \\mathbb{R}^{p}$ be the states and parameters respectively.\n", + "The term *state* or *simulation* are used interchangeably, even though\n", + "strictly speaking a state is $x$ whereas $x(t)$ is the simulation. An\n", + "ode is defined as\n", + "\n", + "$$f(x,\\theta) = \\dot{x} = \\frac{\\partial x}{\\partial t}$$\n", + "\n", + "and usually comes with a set of initial conditions $(x_0,t_0)$ where\n", + "$t_0 \\le t_{i} \\forall i$. Let $g(x,\\theta)$ be a function that maps the\n", + "set of states to the observations,\n", + "$g : \\mathbb{R}^{d} \\rightarrow \\mathbb{R}^{m}$. For compartmental\n", + "problems, which is our focus, $\\nabla_{\\theta}g(x,\\theta)$ is usually\n", + "zero and $\\nabla_{x}g(x,\\theta)$ is an identity function for some or all\n", + "of the states $x$. Denote $l(x_{0},\\theta,x)$ as our cost function\n", + "$l : \\mathbb{R}^{m} \\rightarrow \\mathbb{R}$ and $L(x_{0},\\theta,x)$ be\n", + "the sum of $l(\\cdot)$. Both $x$ and $x_{0}$ are usually dropped for\n", + "simplicity. We will be dealing exclusively with square loss here, which\n", + "means that\n", + "\n", + "$$L(\\theta) = \\sum_{i=1}^{N} \\left\\| y_{i} - g(x(t_{i})) \\right\\|^{2} = \\mathbf{e}^{\\top} \\mathbf{e}$$\n", + "\n", + "where $\\mathbf{e}$ is the residual vector, with elements\n", + "\n", + "$$e_{i} = y_{i} - x(t_{i}).$$\n", + "\n", + "## Model setup\n", + "\n", + "Again, we demonstrate the functionalities of our classes using an SIR\n", + "model.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48daf3cf", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SquareLoss, common_models\n", + "\n", + "import copy, time, numpy\n", + "\n", + "Iode = common_models.SIR()\n", + "\n", + "paramEval = [('beta',0.5), ('gamma',1.0/3.0) ]\n", + "\n", + "# the initial state, normalized to zero one\n", + "\n", + "x0 = [1., 1.27e-6, 0.]\n", + "\n", + "# initial time\n", + "\n", + "t0 = 0\n", + "\n", + "ode.parameters = paramEval\n", + "\n", + "ode.initial_values = (x0, t0)\n", + "\n", + "# set the time sequence that we would like to observe\n", + "\n", + "t = numpy.linspace(1, 150, 100)\n", + "\n", + "numStep = len(t)\n", + "\n", + "solution = ode.integrate(t)\n", + "\n", + "y = solution[1::,2].copy()\n", + "\n", + "y += numpy.random.normal(0, 0.1, y.shape)\n" + ] + }, + { + "cell_type": "markdown", + "id": "2b98ce5a", + "metadata": {}, + "source": [ + "\n", + "Now we have set up the model along with some observations, obtaining the\n", + "gradient only requires the end user to put the appropriate information\n", + "it into the {class}`SquareLoss`. Given the initial guess $\\theta$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "159bb572", + "metadata": {}, + "outputs": [], + "source": [ + "theta = [0.2, 0.2]\n" + ] + }, + { + "cell_type": "markdown", + "id": "a14885bb", + "metadata": {}, + "source": [ + "\n", + "We initialize the {class}`SquareLoss` as\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b9d85b1", + "metadata": {}, + "outputs": [], + "source": [ + "objSIR = SquareLoss(theta, ode, x0, t0, t, y, 'R')\n" + ] + }, + { + "cell_type": "markdown", + "id": "96b21f6a", + "metadata": {}, + "source": [ + "\n", + "where the we also have to specify the state our observations are from.\n", + "Now, we demonstrate the different methods in obtaining the gradient and\n", + "mathematics behind it.\n", + "\n", + "## Forward sensitivity\n", + "\n", + "The forward sensitivity equations are derived by differentiating the\n", + "states implicitly, which yields\n", + "\n", + "$$\\frac{d\\dot{x}}{d\\theta} = \\frac{\\partial f}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial f}{\\partial \\theta}.$$\n", + "\n", + "So finding the sensitivies $\\frac{dx}{d\\theta}$ require another\n", + "integration of a $p$ coupled ODE of $d$ dimension, each with the same\n", + "Jacobian as the original ode. This integration is performed along with\n", + "the original ODE because of possible non-linearity.\n", + "\n", + "A direct call to the method {meth}`sensitivity`\n", + "computes the gradient\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86c1113e", + "metadata": {}, + "outputs": [], + "source": [ + "gradSens = objSIR.sensitivity()\n" + ] + }, + { + "cell_type": "markdown", + "id": "e25fc403", + "metadata": {}, + "source": [ + "\n", + "whereas {meth}`jac` will allow the user to obtain the Jacobian (of the\n", + "objective function) and the residuals, the information required to get\n", + "the gradient as we see next.\n", + "\n", + "#TODO additional reading for Jacobian\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "85611719", + "metadata": {}, + "outputs": [], + "source": [ + "objJac, output = objSIR.jac(full_output=True)\n" + ] + }, + { + "cell_type": "markdown", + "id": "1ff3d25b", + "metadata": {}, + "source": [ + "\n", + "## Gradient\n", + "\n", + "Just the sensitivities alone are not enough to obtain the gradient, but\n", + "we are $90\\%$ there. Differentiating the loss function\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{dL}{d\\theta} &= \\nabla_{\\theta} \\sum_{i=1}^{N}\\frac{dl}{dg} \\\\\n", + " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial \\theta} \\\\\n", + " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial \\theta}\n", + "\\end{aligned}$$\n", + "\n", + "via chain rule. When $\\frac{\\partial g}{\\partial \\theta} = 0$, the total\n", + "gradient simplifies to\n", + "\n", + "$$\\frac{dL}{d\\theta} = \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta}$$\n", + "\n", + "The time indicies are dropped but all the terms above\n", + "are evaluated only at the observed time points. More concretely, this\n", + "means that\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{\\partial l(x(j),\\theta)}{\\partial g} = \\left\\{ \\begin{array}{ll} -2(y_{i} - x(j)) & , \\; j = t_{i} \\\\ 0 & \\; \\text{otherwise} \\end{array} \\right.\n", + "\\end{aligned}$$\n", + "\n", + "When $g(\\cdot)$ is an identity function (which is assumed to be the case\n", + "in {class}`SquareLoss`)\n", + "\n", + "$$\\frac{\\partial g(x(t_{i}),\\theta)}{\\partial x} = I_{d}$$\n", + "\n", + "then the gradient simplifies even further as it is simply\n", + "\n", + "$$\\frac{dL}{d\\theta} = -2\\mathbf{e}^{\\top}\\mathbf{S}$$\n", + "\n", + "where $\\mathbf{e}$ is the vector of residuals and\n", + "$\\mathbf{S} = \\left[\\mathbf{s}_{1},\\mathbf{s}_{2},\\ldots,\\mathbf{s}_{n}\\right]$\n", + "with elements\n", + "\n", + "$$\\mathbf{s}_{i} = \\frac{dx}{d\\theta}(t_{i}),$$\n", + "\n", + "the solution of the forward sensitivies at time $t_{i}$, obtained from\n", + "solving the coupled ode as mentioned previously.\n", + "\n", + "## Jacobian\n", + "\n", + "Now note how the gradient simplifies to $-2\\mathbf{e}^{\\top}\\mathbf{S}$.\n", + "Recall that a standard result in non-linear programming states that the\n", + "gradient of a sum of sqaures objective function $L(\\theta,y,x)$ is\n", + "\n", + "$$\\nabla_{\\theta} L(\\theta,y,x) = -2(\\mathbf{J}^{T} \\left[\\mathbf{y} - \\mathbf{f}(x,\\boldsymbol{\\theta}) \\right] )^{\\top}$$\n", + "\n", + "with $f(x,\\theta)$ our non-linear function and $J$ our Jacobian with\n", + "elements\n", + "\n", + "$$J_{i} = \\frac{\\partial f(x_{i},\\boldsymbol{\\theta})}{\\partial \\boldsymbol{\\theta}}.$$\n", + "\n", + "This is exactly what we have seen previously, substituting in reveals\n", + "that $J = \\mathbf{S}$. Hence, the Jacobian is (a necessary) by-product\n", + "when we wish to obtain the gradient. This is how we\n", + "proceed in {meth}`sensitivity` where it makes\n", + "an internal call to {func}`jac` to obtain the Jacobian\n", + "first. This allows the user to have more options when choosing which\n", + "type of algorithms to use, i.e. Gauss-Newton or Levenberg-Marquardt.\n", + "\n", + "#TODO ref for algorithms\n", + "\n", + "To check that the output is in fact the same we can calculate the difference.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a683b673", + "metadata": {}, + "outputs": [], + "source": [ + "objJac.transpose().dot(-2\\*output\\['resid'\\]) - gradSens\n" + ] + }, + { + "cell_type": "markdown", + "id": "37355764", + "metadata": {}, + "source": [ + "\n", + "## Adjoint\n", + "\n", + "When the number of parameters increases, the number of sensitivies also\n", + "increases. The time required scales directly with the number of\n", + "parameters. We describe another method which does not depend on the\n", + "number of parameters, but rather, the number of states and observations.\n", + "\n", + "The full derivations will not be shown here, \n", + "\n", + "#TODO reference\n", + "\n", + "but we aim to provide\n", + "enough information to work out the steps performed in the our code. We can\n", + "write our optimization problem as\n", + "\n", + "$$\\begin{aligned}\n", + "min_{\\theta} \\quad & \\int_{t_{0}}^{T} l(x_{0},\\theta,x(t)) dt \\\\\n", + "s.t. \\quad & \\dot{x} = f(x,\\theta)\n", + "\\end{aligned}$$\n", + "\n", + "which is identical to the original problem but in a continuous setting.\n", + "Now write the constrained problem in the Lagrangian form\n", + "\n", + "$$min_{\\theta} \\; L(\\theta) + \\int_{t_{0}}^{T} \\lambda^{\\top}(\\dot{x} - f(x,\\theta))$$\n", + "\n", + "with Lagrangian multiplier $\\lambda \\ge 0$. After some algebraic\n", + "manipulation, it can be shown that the total derivative of the\n", + "Lagrangian function is\n", + "\n", + "$$\\frac{dL}{d\\theta} = \\int_{t_{0}}^{T} \\left(\\frac{\\partial l}{\\partial \\theta} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta} \\right) dt.$$\n", + "\n", + "Using previously defined loss functions (the identity), the first term\n", + "is zero and evaluating $\\frac{\\partial f}{\\partial \\theta}$ is trivial.\n", + "What remains is the calculation of $\\lambda(t)$ for\n", + "$t \\in \\left[t_{0},T\\right]$.\n", + "\n", + "Although this still seem to be ill-posed problem when Looking at the\n", + "Lagrangian function, one can actually obtain the *adjoint equation*,\n", + "after certain assumptions and\n", + "\n", + "$$\\frac{d\\lambda^{\\top}}{dt} = \\frac{\\partial l}{\\partial x} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta}.$$\n", + "\n", + "which is again an integration. An unfortunate situation arises here for\n", + "non-linear systems because we use the minus Jacobian in the adjoint\n", + "equation. So if the eigenvalues of the Jacobian indicate that our\n", + "original ODE is stable, such as -1, the minus eigenvalues (now 1)\n", + "implies that the adjoint equation is not stable. Therefore, one must\n", + "integrate backward in time to solve the adjoint equation and it cannot\n", + "be solved simultaneously as the ODE, unlike the forward sensitivity\n", + "equations.\n", + "\n", + "Given a non-linear ODE, we must store information about the states\n", + "between $t_{0}$ and $T$ in order to perform the integration. There are\n", + "two options, both require storing many evaluated $x(j)$ within the\n", + "interval $\\left[t_{0},T\\right]$. Unfortunately, only one is available;\n", + "interpolation over all states and integrate using the interpolating\n", + "functions. The alternative of using observed $x(j)'s$ at fixed points is\n", + "not competitive because we are unable to use fortran routines for the\n", + "integration\n", + "\n", + "The method of choice here to perform the adjoint calculation is to run a\n", + "forward integration, then perform an interpolation using splines with\n", + "explicit knots at the observed time points.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4dcdc898", + "metadata": {}, + "outputs": [], + "source": [ + "odeSIRAdjoint, outputAdjoint = objSIR.adjoint(full_output=True)\n" + ] + }, + { + "cell_type": "markdown", + "id": "df28857c", + "metadata": {}, + "source": [ + "\n", + "This is because evaluating the Jacobian may be expensive and Runge-kutta\n", + "method suffers as the complexity increases. In non-linear model such as\n", + "those found in epidemiology, each element of the Jacobian may be the\n", + "result of a complicated equation where linear step method will shine as\n", + "it makes as little function evaluation as possible. Note that\n", + "derivations in the literature, the initial condition when evaluating the\n", + "adjoint equation is $\\lambda(T)=0$. But in our code we used\n", + "$\\lambda(T) = -2(y(T)-x(T))$. Recall that we have observation $y(T)$ and\n", + "simulation $x(T)$, so that the adjoint equation evaluated at time $T$\n", + "\n", + "$$\\frac{\\partial \\lambda^{\\top}}{\\partial t} \\Big|_{T} = -2(y-f(x,\\theta))\\Big|_{T} - \\lambda(T)\\frac{\\partial f}{\\partial \\theta}\\Big|_{T}$$\n", + "\n", + "with the second term equal to zero. Integration under step size $h$\n", + "implies that\n", + "$\\lambda(T) \\approx \\lim_{h \\to 0} \\lambda(T-h) = -2(y(T)-x(T))$.\n", + "\n", + "## Time Comparison\n", + "\n", + "A simple time comparison between the different methods reveals that the\n", + "forward sensitivity method dominates the others by a wide margin. It\n", + "will be tempting to conclude that it is the best and should be the\n", + "default at all times but that is not true, due to the complexity of each\n", + "method mentioned previously. \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04636d5a", + "metadata": {}, + "outputs": [], + "source": [ + "%timeit gradSens = objSIR.sensitivity()\n", + "\n", + "%timeit odeSIRAdjoint,outputAdjoint = objSIR.adjoint(full_output=True)\n" + ] + }, + { + "cell_type": "markdown", + "id": "15c000f6", + "metadata": {}, + "source": [ + "```{note} \n", + "We leave it to the user to find out the best method for their specific problem.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "47256d1b", + "metadata": {}, + "source": [ + "\n", + "\n", + "## Hessian\n", + "\n", + "The Hessian is defined by\n", + "\n", + "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\frac{\\partial l}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\frac{\\partial x}{\\partial \\theta}^{\\top}\\frac{\\partial^{2} l}{\\partial x^{2}}\\frac{\\partial x}{\\partial \\theta}$$\n", + "\n", + "where $\\otimes$ is the Kronecker product. Note that $\\nabla_{\\theta} x$\n", + "is the sensitivity and the second order sensitivities can be found again\n", + "via the forward method, which involve another set of ode's, namely the\n", + "forward-forward sensitivities\n", + "\n", + "$$\\frac{\\partial}{\\partial t}\\left(\\frac{\\partial^{2} x}{\\partial \\theta^{2}}\\right) = \\left( \\frac{\\partial f}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\left( I_{d} \\otimes \\frac{\\partial x}{\\partial \\theta}^{\\top} \\right) \\frac{\\partial^{2} f}{\\partial x^{2}} \\frac{\\partial x}{\\partial \\theta}.$$\n", + "\n", + "From before, we know that\n", + "\n", + "$$\\frac{\\partial l}{\\partial x} = (-2y+2x) \\quad and \\quad \\frac{\\partial^{2} l}{\\partial x^{2}} = 2I_{d}$$\n", + "\n", + "so our Hessian reduces to\n", + "\n", + "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\left(-2y+2x\\right) \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + 2S^{\\top}S,$$\n", + "\n", + "where the second term is a good approximation to the Hessian as\n", + "mentioned previously. This is the only implementation in place so far\n", + "even though obtaining the estimate this way is relatively slow.\n", + "\n", + "Just to demonstrate how it works, lets look at the Hessian at the optimal\n", + "point. First, we obtain the optimal value\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "678be374", + "metadata": {}, + "outputs": [], + "source": [ + "import scipy.linalg,scipy.optimize\n", + "\n", + "boxBounds = [(0.0, 2.0), (0.0, 2.0)]\n", + "\n", + "res = scipy.optimize.minimize(fun=objSIR.cost, jac=objSIR.sensitivity, x0=theta, bounds=boxBounds, method='L-BFGS-B')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "91c87afe", + "metadata": {}, + "source": [ + "Then compare again the least square estimate of the covariance matrix\n", + "against our version\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87442b49", + "metadata": {}, + "outputs": [], + "source": [ + "resLS, cov_x, infodict, mesg, ier = scipy.optimize.leastsq(func=objSIR.residual, x0=res['x'], full_output=True)\n", + "\n", + "HJTJ, outputHJTJ = objSIR.hessian(full_output=True)\n", + "\n", + "print(scipy.linalg.inv(HJTJ))\n", + "\n", + "print(cov_x)\n" + ] + }, + { + "cell_type": "markdown", + "id": "78ef4147", + "metadata": {}, + "source": [ + "\n", + "also noting the difference between the Hessian and the approximation using\n", + "the Jacobian, which is what the least squares routine uses.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ed8a8f2", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "print(scipy.linalg.inv(outputHJTJ['JTJ']))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb b/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb new file mode 100644 index 00000000..f2223397 --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Obtaining good initial values for parameters\n", + "\n", + "## Function Interpolation\n", + "\n", + "When we want to fit the model to data, one of the necessary steps is to\n", + "supply the optimization procedure a good set of initial guess for the\n", + "parameters $\\theta$. This may be a challenge when we do have a good\n", + "understanding of the process we are trying to model i.e. infectious\n", + "diseases may all follow the same SIR process but with vastly different\n", + "incubation period.\n", + "\n", + "A method to obtain such initial guess based on the collocation is\n", + "available in this package. A restriction is that data must be present\n", + "for all states. We demonstrate this using the FitzHugh-Nagumo model ({func}`.FitzHugh`).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c0c4de8", + "metadata": {}, + "outputs": [], + "source": [ + "from pygom import SquareLoss, common_models, get_init\n", + "\n", + "import numpy\n", + "\n", + "x0 = [-1.0, 1.0]\n", + "\n", + "t0 = 0\n", + "\n", + "# params\n", + "\n", + "paramEval = [('a',0.2), ('b',0.2), ('c',3.0)]\n", + "\n", + "ode = common_models.FitzHugh(paramEval)\n", + "\n", + "ode.initial_values = (x0, t0)\n", + "\n", + "t = numpy.linspace(1, 20, 30).astype('float64')\n", + "\n", + "solution = ode.integrate(t)\n" + ] + }, + { + "cell_type": "markdown", + "id": "08e8fe54", + "metadata": {}, + "source": [ + "Below, we try to find the initial guess without supplying any further\n", + "information. The underlying method fits a cubic spline against the\n", + "observation and tries to minimize the difference between the first\n", + "derivative of the spline and the function of the ode. Varying degree of\n", + "smoothness penalty is applied to the spline and the best set of\n", + "parameters is the ones that yields the smallest total error, combining\n", + "both the fit of the spline against data and the spline against the ode.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5766f56e", + "metadata": {}, + "outputs": [], + "source": [ + "theta, sInfo = get_init(solution[1::,:], t, ode, theta=None, full_output=True)\n", + "\n", + "print(theta)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cf832fff", + "metadata": {}, + "outputs": [], + "source": [ + "print(sInfo)" + ] + }, + { + "cell_type": "markdown", + "id": "597d8480", + "metadata": {}, + "source": [ + "\n", + "As seen above, we have obtained a very good guess of the parameters, in\n", + "fact almost the same as the generating process. The information\n", + "regarding the smoothing factor shows that the amount of penalty used is\n", + "small, which is expected given that we use the solution of the ode as\n", + "observations." + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/pygom-doc/notebooks/paramfit/profile.ipynb b/docs/pygom-doc/notebooks/paramfit/profile.ipynb new file mode 100644 index 00000000..8e8d3def --- /dev/null +++ b/docs/pygom-doc/notebooks/paramfit/profile.ipynb @@ -0,0 +1,644 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Confidence Interval of Estimated Parameters\n", + "\n", + "After obtaining the *best* fit, it is natural to report both the point\n", + "estimate and the confidence level at the $\\alpha$ level. The easiest way\n", + "to do this is by invoking the normality argument and use Fisher\n", + "information of the likelihood. As explained previously at the bottom of\n", + "{ref}`gradient:hessian`, we can find the Hessian, $\\mathbf{H}$, or the approximated\n", + "Hessian for the estimated parameters. From the Cramer--Rao \n", + "\n", + "#TODO add ref\n", + "\n", + "inequality, we\n", + "know that\n", + "\n", + "$$Var(\\hat{\\theta}) \\ge \\frac{1}{I(\\theta)},$$\n", + "\n", + "where $I(\\theta)$ is the Fisher information, which is the Hessian\n", + "subject to regularity condition. Given the Hessian, computing the\n", + "confidence intervals is trivial. Note that this is also known as the\n", + "asymptotic confidence interval where the normality comes from invoking\n", + "the CLT. There are other ways of obtaining a confidence intervals, we\n", + "will the ones implemented in the package. First, we will set up a SIR\n", + "model as seen in {doc}`sir` which will be used throughout this page." + ] + }, + { + "cell_type": "markdown", + "id": "efed1abf", + "metadata": {}, + "source": [ + "from pygom import NormalLoss, common_models\n", + "\n", + "from pygom.utilR import qchisq\n", + "\n", + "import numpy\n", + "\n", + "import scipy.integrate\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import copy\n", + "\n", + "ode = common_models.SIR([('beta', 0.5), ('gamma', 1.0/3.0)])" + ] + }, + { + "cell_type": "markdown", + "id": "ad8659d7", + "metadata": {}, + "source": [ + "\n", + "and we assume that we only have observed realization from the $R$\n", + "compartment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8425085", + "metadata": {}, + "outputs": [], + "source": [ + "x0 = [1, 1.27e-6, 0]\n", + "\n", + "t = numpy.linspace(0, 150, 100).astype('float64')\n", + "\n", + "ode.initial_values = (x0, t[0])\n", + "\n", + "solution = ode.integrate(t[1::])\n", + "\n", + "theta = [0.2, 0.2]\n", + "\n", + "targetState = ['R']\n", + "\n", + "targetStateIndex = numpy.array(ode.get_state_index(targetState))\n", + "\n", + "y = solution[1::,targetStateIndex] + numpy.random.normal(0,0.01, (len(solution[1::,targetStateIndex]), 1))\n", + "\n", + "yObv = y.copy()\n", + "\n", + "objSIR = NormalLoss(theta, ode, x0, t[0], t[1::], y, targetState)\n", + "\n", + "boxBounds = [(1e-8, 2.0), (1e-8, 2.0)]\n", + "\n", + "boxBoundsArray = numpy.array(boxBounds)\n", + "\n", + "xhat = objSIR.fit(theta, lb=boxBoundsArray[:,0], ub=boxBoundsArray[:,1])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "f4d8f8c5", + "metadata": {}, + "source": [ + "## Asymptotic\n", + "\n", + "When the estimate is obtained say, under a square loss or a normal\n", + "assumption, the corresponding likelihood can be written down. In\n", + "such a case, the likelihood ratio test under a Chi--squared distribution is\n", + "\n", + "$$2 (\\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\mathcal{L}(\\boldsymbol{\\theta})) \\le \\chi_{1 - \\alpha}^{2}(k)$$\n", + "\n", + "where $1-\\alpha$ is the size of the confidence region and $k$ is the\n", + "degree of freedom. The corresponding asymptotic confidence interval for\n", + "parameter $j$ can be derived as\n", + "\n", + "$$\\hat{\\theta}_{j} \\pm \\sqrt{\\chi_{1 - \\alpha}^{2}(k) H_{i,i}}.$$\n", + "\n", + "A point-wise confidence interval is obtained when $k = 1$. We assume in\n", + "our package that a point-wise confidence interval is desired. This can be\n", + "obtained with the following steps.\n" + ] + }, + { + "cell_type": "markdown", + "id": "9f93e2ba", + "metadata": {}, + "source": [ + "from pygom import confidence_interval as ci\n", + "\n", + "alpha = 0.05\n", + "\n", + "xL, xU = ci.asymptotic(objSIR, alpha, xhat, lb=boxBoundsArray[:,0], ub=boxBoundsArray[:,1])\n", + "\n", + "print(xL)" + ] + }, + { + "cell_type": "markdown", + "id": "7eae33a2", + "metadata": {}, + "source": [ + "print(xU)" + ] + }, + { + "cell_type": "markdown", + "id": "5482b63c", + "metadata": {}, + "source": [ + "'''{warning}\n", + "Note that the set of bounds here is only used for check the validity of\n", + "$\\hat{\\mathbf{x}}$ and not used in the calculation of the confidence\n", + "intervals. Therefore the resulting output can be outside of the box\n", + "constraints.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "19e92acb", + "metadata": {}, + "source": [ + "\n", + "## Profile Likelihood\n", + "\n", + "Another approach to calculate the confidence interval is to tackle one\n", + "parameter at a time, treating the rest of them as nuisance parameters,\n", + "hence the term *profile*. Let $\\mathcal{L}(\\boldsymbol{\\theta})$ be our\n", + "log--likelihood with parameter $\\boldsymbol{\\theta}$. Element\n", + "$\\theta_{j}$ is our parameter of interest and $\\boldsymbol{\\theta}_{-j}$\n", + "represents the complement such that\n", + "$\\boldsymbol{\\theta} = \\theta_{j} \\cup \\boldsymbol{\\theta}_{-j}$. For\n", + "simply models such as linear regression with only regression\n", + "coefficients $\\boldsymbol{\\beta}$, then\n", + "$\\boldsymbol{\\theta} = \\boldsymbol{\\beta}$.\n", + "\n", + "To shorten the notation, let\n", + "\n", + "$$\\mathcal{L}(\\boldsymbol{\\theta}_{-j} \\mid \\theta_{j}) = \\max \\mathcal{L}(\\boldsymbol{\\theta}_{-j} \\mid \\theta_{j})$$\n", + "\n", + "which is the maxima of $\\boldsymbol{\\theta}_{-j}$ given $\\theta_{j}$.\n", + "$\\hat{\\boldsymbol{\\theta}}$ denotes the MLE of the parameters as usual.\n", + "The profile--likelihood based confidence interval for $\\theta_{j}$ is\n", + "defined as\n", + "\n", + "$$\\begin{aligned}\n", + "\\theta_{j}^{U} &= \\sup \\left\\{ \\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) \\le \\frac{1}{2} \\chi_{1 - \\alpha}^{2}(1) \\right\\} \\\\\n", + "\\theta_{j}^{L} &= \\inf \\left\\{ \\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) \\le \\frac{1}{2} \\chi_{1 - \\alpha}^{2}(1) \\right\\}\n", + "\\end{aligned}$$\n", + "\n", + "where again we have made use of the normal approximation, but without\n", + "imposing symmetry. The set of equations above automatically implies that\n", + "the interval width is $\\theta_{j}^{U} - \\theta_{j}^{L}$ and\n", + "\n", + "$$\\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) - \\frac{1}{2} \\chi_{1-\\alpha}^{2}(1) - \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) = 0.$$\n", + "\n", + "As mentioned previously, $\\boldsymbol{\\theta}_{-j}$ is the maximizer of\n", + "the nuisance parameters, which has a gradient of zero. Combining this\n", + "with the equation above yields a non-linear system of equations of size\n", + "$p$,\n", + "\n", + "$$\\begin{aligned}\n", + "g(\\boldsymbol{\\theta}) = \\left[ \\begin{array}{c} \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j}) - c \\\\ \\frac{\\partial \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j})}{\\partial \\boldsymbol{\\theta}_{-j}} \\end{array} \\right] = 0\n", + "\\end{aligned}$$\n", + "\n", + "where\n", + "$c = \\mathcal{L}(\\hat{\\boldsymbol{\\theta}}) + \\frac{1}{2} \\chi_{1-\\alpha}^{2}(1)$.\n", + "Solving this set of system of equations only need simple Newton like\n", + "steps, possibly with correction terms as per {cite:t}`Venzon1988`. We\n", + "provide a function to obtain such estimate, {func}`ci.profile`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7dab2b66", + "metadata": {}, + "outputs": [], + "source": [ + "xLProfile, xUProfile, xLProfileList, xUProfileList = ci.profile(objSIR, alpha, xhat, lb=boxBoundsArray[:,0], ub=boxBoundsArray[:,1], full_output=True)" + ] + }, + { + "cell_type": "markdown", + "id": "ecd49905", + "metadata": {}, + "source": [ + "but unfortunately this is not accurate most of the time due to the\n", + "complicated surface at locations not around $\\hat{\\theta}$. This is a\n", + "common scenario for non--linear least square problems because the\n", + "Hessian is not guaranteed to be a PSD everywhere. Therefore, a safeguard\n", + "is in place to obtain the $\\theta_{j}^{U},\\theta_{j}^{L}$ by iteratively updating $\\theta_{j}$ and find the solution to `nuisanceOptim`.\n", + "\n", + "#TODO what is nuisance optim?\n", + "\n", + "Furthermore, we also provide the functions necessary to obtain the\n", + "estimates such as the four below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e58e47ee", + "metadata": {}, + "outputs": [], + "source": [ + "i = 0\n", + "\n", + "funcF = ci._profileF(xhat, i, 0.05, objSIR)\n", + "\n", + "funcG = ci._profileG(xhat, i, 0.05, objSIR)\n", + "\n", + "funcGC = ci._profileGSecondOrderCorrection(xhat, i, alpha, objSIR)\n", + "\n", + "funcH = ci._profileH(xhat, i, 0.05, objSIR)" + ] + }, + { + "cell_type": "markdown", + "id": "f2428994", + "metadata": {}, + "source": [ + "Where $i$ is the index of the parameter of interest. {func}`_profileF` is the\n", + "squared norm of {obj}`obj`, which easy the optimization process for solvers\n", + "which requires a converted form from system of equations to non-linear\n", + "least squares. {func}`_profileG` is the system of equations of {obj}`obj`,\n", + "and {func}`_profileH` is the derivative of {obj}`obj`.\n", + "\n", + "$$\\begin{aligned}\n", + "\\nabla g(\\boldsymbol{\\theta}) = \\left[ \\begin{array}{c} \\frac{\\partial \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j})}{\\partial \\theta_{j}} \\\\ \\frac{\\partial^{2} \\mathcal{L}(\\boldsymbol{\\theta} \\mid \\theta_{j})}{\\partial \\boldsymbol{\\beta}_{-j} \\partial \\theta_{j}} \\end{array} \\right]\n", + "\\end{aligned}$$\n", + "\n", + "{func}`_profileGSecondOrderCorrection` is the second order correction {cite}Venzon1988.\n", + "\n", + "## Geometric profile likelihood\n", + "\n", + "Due to the difficulty in obtain a profile likelihood via the standard\n", + "Newton like steps, we also provide a way to generate a similar result\n", + "using the geometric structure of the likelihood surface. We follow the\n", + "method in {cite:t}`Moolgavkar1987`, which involves solving a set of\n", + "differential equations\n", + "\n", + "$$\\begin{aligned}\n", + "\\frac{d\\beta_{j}}{dt} &= k g^{-1/2} \\\\\n", + "\\frac{d\\boldsymbol{\\beta}_{-j}}{dt} &= \\frac{d\\boldsymbol{\\beta}_{-j}}{d\\beta_{j}} \\frac{d\\beta_{j}}{dt},\n", + "\\end{aligned}$$\n", + "\n", + "where $k = \\Phi(1-\\alpha)$ is the quantile we want to obtain under a\n", + "normal distribution, and\n", + "\n", + "$$\\begin{aligned}\n", + "g = J_{\\beta_{j}}^{\\top} I^{\\boldsymbol{\\beta}} J_{\\beta_{j}}, \\quad J_{\\beta_{j}} = \\left( \\begin{array}{c} 1 \\\\ \\frac{d\\boldsymbol{\\beta}_{-j}}{d\\beta_{j}} \\end{array} \\right).\n", + "\\end{aligned}$$\n", + "\n", + "Here, $J_{\\beta_{j}}$ is the Jacobian between $\\beta_{j}$ and\n", + "$\\boldsymbol{\\beta}_{-j}$ with the term\n", + "\n", + "$$\\frac{d\\boldsymbol{\\beta}_{-j}}{d\\beta_{j}} = -\\left( \\frac{\\partial^{2} \\mathcal{L}}{\\partial \\boldsymbol{\\beta}_{-j}\\partial \\boldsymbol{\\beta}_{-j}^{\\top} } \\right)^{-1} \\frac{\\partial^{2} \\mathcal{L}}{\\partial \\beta_{j} \\partial \\beta_{-j}^{\\top}}$$\n", + "\n", + "and hence the first element is $1$ (identity transformation).\n", + "$I^{\\boldsymbol{\\beta}}$ is the Fisher information of\n", + "$\\boldsymbol{\\beta}$, which is\n", + "\n", + "$$I^{\\boldsymbol{\\beta}} = \\frac{\\partial \\boldsymbol{\\theta}}{\\partial \\boldsymbol{\\beta}^{\\top}} \\Sigma^{\\boldsymbol{\\theta}(\\boldsymbol{\\beta})} \\frac{\\partial \\boldsymbol{\\theta}}{\\partial \\boldsymbol{\\beta}}.$$\n", + "\n", + "It is simply $\\Sigma^{\\boldsymbol{\\beta}}$ if\n", + "$\\boldsymbol{\\theta} = \\boldsymbol{\\beta}$. Different Fisher information\n", + "can be used for $\\Sigma^{\\boldsymbol{\\beta}}$ such as the expected or\n", + "observed, at $\\hat{\\boldsymbol{\\beta}}$ or $\\boldsymbol{\\beta}$. After\n", + "some trivial algebraic manipulation, we can show that our ODE boils\n", + "downs to\n", + "\n", + "$$\\begin{aligned}\n", + "\\left[ \\begin{array}{c} \\frac{d\\beta_{j}}{dt} \\\\ \\frac{d\\boldsymbol{\\beta_{-j}}}{dt} \\end{array} \\right] = k \\left[ \\begin{array}{c} 1 \\\\ -A^{-1}w \\end{array} \\right] \\left( v - w^{\\top}A^{-1}w \\right)^{-1/2}\n", + "\\end{aligned}$$\n", + "\n", + "where the symbols on the RHS above correspond to partitions in the\n", + "Fisher information\n", + "\n", + "$$\\begin{aligned}\n", + "I^{\\boldsymbol{\\beta}} = \\left[ \\begin{array}{cc} v & w^{\\top} \\\\ w & A \\end{array} \\right].\n", + "\\end{aligned}$$\n", + "\n", + "The integration is perform from $t = 0$ to $1$ and is all handled\n", + "internally via {class}`geometric`." + ] + }, + { + "cell_type": "markdown", + "id": "eb9240d7", + "metadata": {}, + "source": [ + "xLGeometric, xUGeometric, xLList, xUList = ci.geometric(objSIR, alpha, xhat, full_output=True)\n", + "\n", + "print(xLGeometric)" + ] + }, + { + "cell_type": "markdown", + "id": "f09236cc", + "metadata": {}, + "source": [ + "print(xUGeometric)" + ] + }, + { + "cell_type": "markdown", + "id": "75d6f904", + "metadata": {}, + "source": [ + "\n", + "## Bootstrap\n", + "\n", + "This is perhaps the favorite method to estimate confidence intervals for\n", + "a lot of people. Although there are many ways to implement bootstrap,\n", + "semi-parametric is the only logical choice (even though the underlying\n", + "assumptions may be violated at times). As we have only implemented OLS\n", + "type loss functions in this package, the parametric approach seem to be\n", + "inappropriate when there is no self-efficiency guarantee.\n", + "Non-parametric approaches requires at least a conditional independence\n", + "assumption, something easily violated by our **ODE**. Block bootstrap is\n", + "an option but we are also aware that the errors of an **ODE** can be\n", + "rather rigid, and consistently over/under estimate at certain periods of\n", + "time.\n", + "\n", + "#TODO refs for bootstrap?\n", + "\n", + "When we say semi-parametric, we mean the exchange of errors between the\n", + "observations. Let our raw error be\n", + "\n", + "$$\\varepsilon_{i} = y_{i} - \\hat{y}_{i}$$\n", + "\n", + "where $\\hat{y}_{i}$ will be the prediction under\n", + "$\\hat{\\boldsymbol{\\theta}}$ under our model. Then we construct a new set\n", + "of observations via\n", + "\n", + "$$y_{i}^{\\ast} = \\hat{y}_{i} + \\varepsilon^{\\ast}, \\quad \\varepsilon^{\\ast} \\sim \\mathcal{F}$$\n", + "\n", + "with $\\mathcal{F}$ being the empirical distribution of the raw errors. A\n", + "new set of parameters $\\theta^{\\ast}$ are then found for the\n", + "bootstrapped samples, and we obtain the $\\alpha$ confidence interval by\n", + "taking the $\\alpha/2$ quantiles. Invoking the corresponding python function\n", + "yields our bootstrap estimates. Unlike {func}`asymptotic`, the bounds here are\n", + "used when estimating the parameters of each bootstrap samples. An error\n", + "may be returned if estimation failed for any of the bootstrap samples." + ] + }, + { + "cell_type": "markdown", + "id": "d33c189c", + "metadata": {}, + "source": [ + "xLBootstrap, xUBootstrap, setX = ci.bootstrap(objSIR, alpha, xhat, iteration=10, lb=boxBoundsArray[:,0], ub=boxBoundsArray[:,1], full_output=True)\n", + "\n", + "print(xLBootstrap)" + ] + }, + { + "cell_type": "markdown", + "id": "90e0585e", + "metadata": {}, + "source": [ + "print(xUBootstrap)" + ] + }, + { + "cell_type": "markdown", + "id": "0a8e31f0", + "metadata": {}, + "source": [ + "The additional information here can be used to compute the bias, tail\n", + "effects and test against the normality assumption. If desired, a\n", + "simultaneous confidence interval can also be approximated empirically.\n", + "Note however that because we are using a semi-parameter method here, if\n", + "the model specification is wrong then the resulting estimates for the\n", + "bias is also wrong. The confidence interval still has the normal\n", + "approximation guarantee if the number of samples is large.\n", + "\n", + "In this case, because the error in the observation is extremely small,\n", + "the confidence interval is narrow." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c585db79", + "metadata": { + "vscode": { + "languageId": "javascript" + } + }, + "outputs": [], + "source": [ + "import pylab as P\n", + "\n", + "f = plt.figure()\n", + "\n", + "n, bins, patches = P.hist(setX[:,0], 50)\n", + "\n", + "P.xlabel(r'Estimates of $beta$');\n", + "\n", + "P.ylabel('Frequency');\n", + "\n", + "P.title('Estimates under a semi-parametric bootstrap scheme');\n", + "\n", + "P.show()" + ] + }, + { + "cell_type": "markdown", + "id": "9edc8b6b", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "## Comparison Between Methods\n", + "\n", + "Although we have shown the numerical values for the confidence interval\n", + "obtained using different methods, it can be hard to comprehend how they\n", + "vary. As they say, a picture says a million word, and given that this\n", + "particular model only has two parameters, we can obtain inspect and\n", + "compare the methods visually via a contour plot. The code to perform\n", + "this is shown below but the code block will not be run to save time and\n", + "space.\n", + "\n", + "In the plot above, the bootstrap confidence interval were so close to\n", + "the MLE, it is impossible to distinguish the two on such a coarse scale.\n", + "\n", + "Furthermore, because the geometric confidence interval is the result of\n", + "an integration, we can trace the path that lead to the final output that\n", + "was shown previously. Again, we are space conscious (and time\n", + "constrained) so the code block below will not be run." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cef48a9", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "\n", + "CS = plt.contour(xi, yi, zi, linewidth=0.5)\n", + "\n", + "plt.clabel(CS, fontsize=10, inline=1)\n", + "\n", + "l1 = plt.scatter(xLList[0][:,0], xLList[0][:,1], marker='o', c='m', s=10);\n", + "\n", + "l2 = plt.scatter(xUList[0][:,0], xUList[0][:,1], marker='x', c='m', s=10);\n", + "\n", + "plt.legend((l1, l2), ('Lower CI path', 'Upper CI path'), loc='upper left');\n", + "\n", + "plt.ylabel(r'Estimates of $gamma$');\n", + "\n", + "plt.xlabel(r'Estimates of $beta$');\n", + "\n", + "plt.title('Integration path of the geometric confidence intervals on the likelihood surface');\n", + "\n", + "plt.tight_layout();\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "2b357c75", + "metadata": {}, + "source": [ + "\n", + "## Profile Likelihood Surface\n", + "\n", + "To investigate why it was hard to find the profile likelihood confidence\n", + "interval, we can look at the surface (which is a line as\n", + "we are profiling). We find the solution of {func}`nuisanceOptim` for each\n", + "$\\boldsymbol{\\theta}_{-j}$ at various points of $\\boldsymbol{\\theta}$.\n", + "Equivalently, we can minimize the original loss function as defined\n", + "previously, and this is the approach below. We focus out attention to\n", + "the parameter $\\beta$ of our SIR model. The results are not shown here\n", + "but the existence of a solution to {obj}`obj` is evident by *eyeballing* the plots." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc31f543", + "metadata": {}, + "outputs": [], + "source": [ + "numIter = 100\n", + "\n", + "x2 = numpy.linspace(0.0, 2.0, numIter)\n", + "\n", + "funcOut = numpy.linspace(0.0, 2.0, numIter)\n", + "\n", + "ode.parameters = [('beta',0.5), ('gamma',1.0/3.0)]\n", + "\n", + "for i in range(numIter):\n", + " paramEval = [('beta',x2[i]), ('gamma',x2[i])]\n", + " ode2 = copy.deepcopy(ode) \n", + " ode2.parameters = paramEval\n", + " ode2.initial_values = (x0, t[0])\n", + " objSIR2 = NormalLoss(x2[i], ode2, x0, t[0], t[1::], yObv.copy(), targetState, target_param='gamma')\n", + " res = scipy.optimize.minimize(fun=objSIR2.cost, jac=objSIR2.gradient, x0=x2[i], bounds=[(0,2)], method='L-BFGS-B')\n", + " funcOut[i] = res['fun']\n", + "\n", + "fig = plt.figure()\n", + "\n", + "plt.plot(x2, objSIR.cost(xhat) - funcOut)\n", + "\n", + "l1 = plt.axhline(-0.5*qchisq(1 - alpha, df=1), 0, 2, color='r')\n", + "\n", + "plt.ylabel(r'\\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid beta)$');\n", + "\n", + "plt.xlabel(r'Fixed value of $beta$');\n", + "\n", + "plt.title('Difference in objective function between MLEn and the maximization of the nuisance parameters given then parameter of interest, beta in this case');\n", + "\n", + "plt.tight_layout();\n", + "\n", + "plt.legend((l1,), (r'$-0.5mathcal{X}_{1 - alpha}^{2}(1)$',), loc='lower right');\n", + "\n", + "plt.show() " + ] + }, + { + "cell_type": "markdown", + "id": "99c84d17", + "metadata": {}, + "source": [ + "\n", + "\n", + "Both the upper and lower confidence interval can be found in the\n", + "profiling procedure, but the part between of\n", + "$\\beta \\in \\left[0,\\hat{\\beta}\\right]$ is not convex, with $\\hat{\\beta}$\n", + "being the MLE. This non--quadratic profile likelihood is due to the\n", + "non-identifiability of the model given data {cite}`Raue2009`. For this\n", + "particular case, we can fix it simply by introducing additional\n", + "observations in the form of the $I$ state. We encourage the users to try\n", + "it out for themselves to confirm." + ] + }, + { + "cell_type": "markdown", + "id": "67ae8521", + "metadata": {}, + "source": [ + "targetState = \\['I', 'R'\\]\n", + "\n", + "targetStateIndex = numpy.array(ode.get_state_index(targetState))\n", + "\n", + "y = solution[1::,targetStateIndex] + numpy.random.normal(0, 0.01, (len(solution[1::,targetStateIndex]), 1))\n", + "\n", + "objSIR = NormalLoss(theta, ode, x0, t[0], t[1::], y.copy(), targetState)\n", + "\n", + "xhat = objSIR.fit(theta, lb=boxBoundsArray[:,0], ub=boxBoundsArray[:,1])\n", + "\n", + "for i in range(numIter): \n", + " paramEval = [('beta', x2[i]), ('gamma', x2[i])] \n", + " ode2 = copy.deepcopy(ode)\n", + " ode2.parameters = paramEval\n", + " ode2.initial_values = (x0, t[0]) \n", + " objSIR2 = NormalLoss(x2[i], ode2, x0, t[0], t[1::], y.copy(), targetState, target_param='gamma')\n", + " res = scipy.optimize.minimize(fun=objSIR2.cost, jac=objSIR2.gradient, x0=x2[i], bounds=[(0,2)], method='L-BFGS-B')\n", + " funcOut[i] = res['fun']\n", + "\n", + "fig = plt.figure()\n", + "\n", + "plt.plot(x2, objSIR.cost(xhat) - funcOut);\n", + "\n", + "l1 = plt.axhline(-0.5*qchisq(1 - alpha, df=1), 0, 2, color='r')\n", + "\n", + "plt.ylabel(r'$mathcal{L}(hat{theta}) - mathcal{L}(theta mid beta)$');\n", + "\n", + "plt.xlabel(r'Fixed value of $beta$');\n", + "\n", + "plt.title('Profile likelihood curve for the parameter of interest with more observations');\n", + "\n", + "plt.tight_layout();\n", + "\n", + "plt.legend((l1,), (r'$-0.5mathcal{X}_{1 - alpha}^{2}(1)$',), loc='lower right');\n", + "\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 6d9d86876dcf277ba4a62a49311409511a5134c6 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 14:20:41 +0100 Subject: [PATCH 146/188] add header --- docs/pygom-doc/rst/autodoc-abc.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pygom-doc/rst/autodoc-abc.rst b/docs/pygom-doc/rst/autodoc-abc.rst index 1a3a8f3d..ad0084e7 100644 --- a/docs/pygom-doc/rst/autodoc-abc.rst +++ b/docs/pygom-doc/rst/autodoc-abc.rst @@ -1,4 +1,4 @@ -approximate_bayesian_computation +# approximate_bayesian_computation ============= .. automodule:: pygom.approximate_bayesian_computation From 44b554732b41d57f5e14e8347f1cbb3852a6be2e Mon Sep 17 00:00:00 2001 From: hareball90 <36919240+hareball90@users.noreply.github.com> Date: Wed, 30 Aug 2023 14:46:36 +0100 Subject: [PATCH 147/188] Update book.yml changing action token --- .github/workflows/book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 7ae76736..edcf8d5c 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -59,6 +59,6 @@ jobs: - name: GitHub Pages uses: peaceiris/actions-gh-pages@v3.6.1 with: - github_token: ${{ secrets.DEPLOY_BOOK }} + github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: docs/pygom-doc/_build/html From 1c96e03cb937089a11048cdb4f4c9e28473a4f7f Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 14:47:42 +0100 Subject: [PATCH 148/188] add header --- docs/pygom-doc/rst/autodoc-loss.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pygom-doc/rst/autodoc-loss.rst b/docs/pygom-doc/rst/autodoc-loss.rst index ec2b56da..c0919985 100644 --- a/docs/pygom-doc/rst/autodoc-loss.rst +++ b/docs/pygom-doc/rst/autodoc-loss.rst @@ -1,4 +1,4 @@ -loss +# loss ============= .. automodule:: pygom.loss From 569f4fc46069ca17a24dcab6f7d1fc2421cef895 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 15:05:03 +0100 Subject: [PATCH 149/188] add header --- docs/pygom-doc/rst/autodoc-utilR.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pygom-doc/rst/autodoc-utilR.rst b/docs/pygom-doc/rst/autodoc-utilR.rst index 40a5c130..e0480cb7 100644 --- a/docs/pygom-doc/rst/autodoc-utilR.rst +++ b/docs/pygom-doc/rst/autodoc-utilR.rst @@ -1,4 +1,4 @@ -utilR +# utilR ============= .. automodule:: pygom.utilR From 746b39bbdb3afcf570771682cd86477cb8b1b442 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 15:14:39 +0100 Subject: [PATCH 150/188] edits --- docs/pygom-doc/notebooks/paramfit/gradient.ipynb | 4 ++-- .../pygom-doc/notebooks/paramfit/initialGuess.ipynb | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/pygom-doc/notebooks/paramfit/gradient.ipynb b/docs/pygom-doc/notebooks/paramfit/gradient.ipynb index 42345ef4..90369963 100644 --- a/docs/pygom-doc/notebooks/paramfit/gradient.ipynb +++ b/docs/pygom-doc/notebooks/paramfit/gradient.ipynb @@ -10,7 +10,7 @@ "points $t_{i}$, $i = 1,\\ldots,N$, we may wish to test out a set of ode\n", "to see whether it fits to the data. The most natural way to test such\n", "*fit* is to minimize the sum of squares between our observations $y$ and\n", - "see whether the resulting solution of the ode and the estimationed\n", + "see whether the resulting solution of the ODE and the estimated\n", "parameters makes sense.\n", "\n", "We assume that this estimation process will be tackled through a\n", @@ -22,7 +22,7 @@ "Multiple ways of obtaining the gradient have been implemented. All of\n", "them serve a certain purpose and may not be a viable/appropriate options\n", "depending on the type of ode. More generally, let $d,p$ be the number of\n", - "states and paramters respectively. Then finite difference methods have a\n", + "states and parameters respectively. Then finite difference methods have a\n", "run order of $O(p+1)$ of the original ode, forward sensitivity require\n", "an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint\n", "method require two run of size $d$ in principle, but actual run time is\n", diff --git a/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb b/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb index f2223397..3f5c6e9c 100644 --- a/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb +++ b/docs/pygom-doc/notebooks/paramfit/initialGuess.ipynb @@ -101,8 +101,19 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, From 25883ad8fa1fe7f1e060bc87cd2c5cfbd54c10d1 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 17:12:08 +0100 Subject: [PATCH 151/188] correct heading format --- docs/pygom-doc/rst/autodoc-abc.rst | 5 +++-- docs/pygom-doc/rst/autodoc-loss.rst | 3 ++- docs/pygom-doc/rst/autodoc-model.rst | 3 ++- docs/pygom-doc/rst/autodoc-utilR.rst | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/pygom-doc/rst/autodoc-abc.rst b/docs/pygom-doc/rst/autodoc-abc.rst index ad0084e7..abfa38c8 100644 --- a/docs/pygom-doc/rst/autodoc-abc.rst +++ b/docs/pygom-doc/rst/autodoc-abc.rst @@ -1,5 +1,6 @@ -# approximate_bayesian_computation -============= +================================= +approximate_bayesian_computation +================================= .. automodule:: pygom.approximate_bayesian_computation :members: diff --git a/docs/pygom-doc/rst/autodoc-loss.rst b/docs/pygom-doc/rst/autodoc-loss.rst index c0919985..31bc8eff 100644 --- a/docs/pygom-doc/rst/autodoc-loss.rst +++ b/docs/pygom-doc/rst/autodoc-loss.rst @@ -1,4 +1,5 @@ -# loss +============= +loss ============= .. automodule:: pygom.loss diff --git a/docs/pygom-doc/rst/autodoc-model.rst b/docs/pygom-doc/rst/autodoc-model.rst index ae396cdf..d6406ff2 100644 --- a/docs/pygom-doc/rst/autodoc-model.rst +++ b/docs/pygom-doc/rst/autodoc-model.rst @@ -1,4 +1,5 @@ -# model +============= +model ============= .. automodule:: pygom.model diff --git a/docs/pygom-doc/rst/autodoc-utilR.rst b/docs/pygom-doc/rst/autodoc-utilR.rst index e0480cb7..670fb708 100644 --- a/docs/pygom-doc/rst/autodoc-utilR.rst +++ b/docs/pygom-doc/rst/autodoc-utilR.rst @@ -1,4 +1,5 @@ -# utilR +============= +utilR ============= .. automodule:: pygom.utilR From b6724f52212aed31d73561abda6a5efe69adb41a Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 17:12:56 +0100 Subject: [PATCH 152/188] clean up and ammend filepath for logo --- docs/pygom-doc/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pygom-doc/_config.yml b/docs/pygom-doc/_config.yml index 7bd9b2d6..b7679bd7 100644 --- a/docs/pygom-doc/_config.yml +++ b/docs/pygom-doc/_config.yml @@ -3,7 +3,7 @@ title: PyGOM documentation author: Public Health England / UK Health Security Agency -logo: logo_pygom.jpg +logo: images/logo_pygom.jpg # build files in table of contents # used as alternative to exclude patterns From a3d5113b59cc4746f53044543121a0041cbe2c37 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 22:24:23 +0100 Subject: [PATCH 153/188] correct typos to common models --- .../notebooks/common_models/SIR.ipynb | 17 +++++++++++++++-- .../notebooks/common_models/vanDelPol.ipynb | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/docs/pygom-doc/notebooks/common_models/SIR.ipynb b/docs/pygom-doc/notebooks/common_models/SIR.ipynb index ca73f476..73dceb7e 100644 --- a/docs/pygom-doc/notebooks/common_models/SIR.ipynb +++ b/docs/pygom-doc/notebooks/common_models/SIR.ipynb @@ -4,7 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# `.SIR`\n", + "# SIR\n", + "\n", + "{func}`.SIR`\n", "\n", "A standard SIR model defined by the following equations.\n", "\n", @@ -75,8 +77,19 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, diff --git a/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb b/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb index 7e26788d..7ab1e3b7 100644 --- a/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb +++ b/docs/pygom-doc/notebooks/common_models/vanDelPol.ipynb @@ -4,8 +4,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# vanDelPol\n", - "{func}`.vanDelPol` - the van Del Pol oscillator {cite}`vanderpol1926`\n", + "# vanDerPol\n", + "\n", + "{func}`.vanDerPol` - the van Del Pol oscillator {cite}`vanderpol1926`\n", "\n", "$$\\begin{aligned}\n", "\\frac{dx}{dt} &= \\sigma (y-x) \\\\\n", @@ -108,8 +109,19 @@ } ], "metadata": { + "kernelspec": { + "display_name": "Python 3.9.15 ('sphinx-doc')", + "language": "python", + "name": "python3" + }, "language_info": { - "name": "python" + "name": "python", + "version": "3.9.15" + }, + "vscode": { + "interpreter": { + "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" + } } }, "nbformat": 4, From 3e634d0d28a641911a1d815c28f81437d4f3f04d Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 22:56:40 +0100 Subject: [PATCH 154/188] draft contributing guidance --- CONTRIBUTING.md | 32 +++++++++++++++++++++++ docs/pygom-doc/{ => images}/download.png | Bin 2 files changed, 32 insertions(+) create mode 100644 CONTRIBUTING.md rename docs/pygom-doc/{ => images}/download.png (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..36a38abf --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# Contributor guidance + +## suggested information for raising issues +- is it possible to produce a template for a new issue? + +## requirements for amendments +- merge and pull requests should only be considered if the MR/PR explicitly states how the following has been addressed + - unit tests + - modified documentation + - justification + - successful execution of documentation (controlled by halting at errors in /docs/_config.yml, demonstrated by successful action) +- #TODO is there a reasonable limit on the code quantity that is submitted per review? (e.g. 200 lines) to ensure a suitable review can be completed + +## workflow for incorporating merge and pull requests +- dev and master are protected and require a code review by the project owner (or designated reviewer) +- dev should contain all working amendments and collated before the next versioned merge request to master +- only a merge request should be made to master from dev from the UKHSA repo +- forked repo pull requests should be made into UKHSA dev branch (or others where appropriate) +- master branch is for versioned releases, which should be tagged and a summary of alterations made to README.md +- merge and pull requests to be made to dev, where builds and actions must run successfully before being incorporated +- if closing a ticket, if possible, include the commit reference which addresses the issue +- code reviewer should use the template to work through requirements (e.g. confirming tests have been added, documentation is appropriate, added to contributor file) + +## adding to the documentation how to add to the jupyterbook; + +## acknowledgements from contributors +- what counts as a contribution? + - ticket? pr/mr? +- how are contributors acknowledged? + - contributor md file? + - who adds the name to the contributor? suggest code reviewer on approval of MR/PR +- provide citable repo link \ No newline at end of file diff --git a/docs/pygom-doc/download.png b/docs/pygom-doc/images/download.png similarity index 100% rename from docs/pygom-doc/download.png rename to docs/pygom-doc/images/download.png From 7bd80943bc2a3e065695501bac7665cadb7d2674 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 22:58:07 +0100 Subject: [PATCH 155/188] add links to download image and contributor guidance --- docs/pygom-doc/md/getting_started.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/pygom-doc/md/getting_started.md b/docs/pygom-doc/md/getting_started.md index fd7094b7..bf211df7 100644 --- a/docs/pygom-doc/md/getting_started.md +++ b/docs/pygom-doc/md/getting_started.md @@ -71,3 +71,15 @@ in the command line: python setup.py test which can be performed prior to installing the package if desired. + +## Using this documentation +To use a notebook as a starting point, you can download any of the source code within this jupyterbook by using the download icon that is located at the top of each page of the documentation. +![download file](../images/download.png) + +## Contributing to PyGOM + +Please see the (contribution guidance)[../../CONTRIBUTING.md] which outlines: +- required information for raising issues; +- the process by which code contributions should be incorporated; +- what is required by additions to PyGOM, including how to add to the jupyterbook; +- expectations for acknowledgements from contributions. From 1f0643726af561e675dcf1e6e487ee053d834488 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 22:58:42 +0100 Subject: [PATCH 156/188] tidy up --- docs/pygom-doc/intro.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/pygom-doc/intro.md b/docs/pygom-doc/intro.md index 02905b2c..3f273853 100644 --- a/docs/pygom-doc/intro.md +++ b/docs/pygom-doc/intro.md @@ -15,10 +15,3 @@ A manuscript containing a shortened motivation and use is hosted on [arxXiv](htt ```{tableofcontents} ``` - -# Code Documentation and FAQ -#TODO from index.rst -# References -#TODO -# Indices and tables -#TODO \ No newline at end of file From 88394eec41e843d9bc2d5e15f6b5e17b8e26cf37 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Wed, 30 Aug 2023 23:00:26 +0100 Subject: [PATCH 157/188] move documentation root file --- docs/pygom-doc/_toc.yml | 2 +- docs/pygom-doc/{ => md}/intro.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/pygom-doc/{ => md}/intro.md (100%) diff --git a/docs/pygom-doc/_toc.yml b/docs/pygom-doc/_toc.yml index 7ad7ceca..c8c281ab 100644 --- a/docs/pygom-doc/_toc.yml +++ b/docs/pygom-doc/_toc.yml @@ -2,7 +2,7 @@ # Learn more at https://jupyterbook.org/customize/toc.html format: jb-book -root: intro +root: md/intro parts: - caption: User documentation chapters: diff --git a/docs/pygom-doc/intro.md b/docs/pygom-doc/md/intro.md similarity index 100% rename from docs/pygom-doc/intro.md rename to docs/pygom-doc/md/intro.md From ec14d130733ac16b601f42e5fd8cf5efb7820e27 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 31 Aug 2023 10:24:50 +0100 Subject: [PATCH 158/188] move bib file location --- docs/pygom-doc/_config.yml | 16 ++++++---------- docs/pygom-doc/{ => bib}/ref.bib | 0 2 files changed, 6 insertions(+), 10 deletions(-) rename docs/pygom-doc/{ => bib}/ref.bib (100%) diff --git a/docs/pygom-doc/_config.yml b/docs/pygom-doc/_config.yml index b7679bd7..a0ca13ee 100644 --- a/docs/pygom-doc/_config.yml +++ b/docs/pygom-doc/_config.yml @@ -2,7 +2,7 @@ # see https://jupyterbook.org/customize/config.html title: PyGOM documentation -author: Public Health England / UK Health Security Agency +author: UK Health Security Agency (previously Public Health England) logo: images/logo_pygom.jpg # build files in table of contents @@ -14,7 +14,7 @@ only_build_toc_files: true # this could avoid the issue of execution timing out # See https://jupyterbook.org/content/execute.html execute: - execute_notebooks: cache + execute_notebooks: force # Define the name of the latex output file for PDF builds latex: @@ -24,9 +24,9 @@ latex: # Add a bibtex file so that we can create citations # use sphinx to specify style bibtex_bibfiles: - - 'ref.bib' - + - 'bib/ref.bib' +# additional sphinx libraries sphinx: extra_extensions: #- 'sphinx.ext.doctest' @@ -40,12 +40,6 @@ sphinx: autosummary_generate: True bibtex_reference_style: super - -#sphinx: -# extra_extensions: -# - 'sphinx.ext.graphvizconfig' - - # Information about where the book exists on the web repository: url: https://github.com/ukhsa-collaboration/pygom # Online location of your book @@ -57,3 +51,5 @@ repository: html: use_issues_button: true use_repository_button: true + +# add a fail-on-warning: true \ No newline at end of file diff --git a/docs/pygom-doc/ref.bib b/docs/pygom-doc/bib/ref.bib similarity index 100% rename from docs/pygom-doc/ref.bib rename to docs/pygom-doc/bib/ref.bib From a55ddd1e8c3323a242f397d916402f070942699d Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 31 Aug 2023 10:27:48 +0100 Subject: [PATCH 159/188] remove redundant files --- docs/pygom-doc/mdconvert/common_models/.md | 35 -- .../mdconvert/common_models/FitzHugh.md | 44 -- .../common_models/Legrand_Ebola_SEIHFR.md | 96 ---- .../mdconvert/common_models/Lorenz.md | 34 -- .../mdconvert/common_models/Lotka_Volterra.md | 103 ---- .../common_models/Lotka_Volterra_4State.md | 60 --- .../mdconvert/common_models/Robertson.md | 89 --- .../pygom-doc/mdconvert/common_models/SEIR.md | 35 -- .../common_models/SEIR_Birth_Death.md | 38 -- .../SEIR_Birth_Death_Periodic.md | 70 --- .../mdconvert/common_models/SEIR_Multiple.md | 51 -- docs/pygom-doc/mdconvert/common_models/SIR.md | 46 -- .../common_models/SIR_Birth_Death.md | 35 -- docs/pygom-doc/mdconvert/common_models/SIS.md | 35 -- .../mdconvert/common_models/SIS_Periodic.md | 34 -- .../mdconvert/common_models/vanDelPol.md | 74 --- docs/pygom-doc/mdconvert/doc_to_sort/.md | 201 ------- .../mdconvert/doc_to_sort/bvpSimple.md | 201 ------- .../mdconvert/doc_to_sort/common_models.ipynb | 31 -- docs/pygom-doc/mdconvert/doc_to_sort/epi.md | 65 --- .../mdconvert/doc_to_sort/epijson.md | 58 -- .../mdconvert/doc_to_sort/estimate1.md | 144 ----- .../mdconvert/doc_to_sort/estimate2.md | 353 ------------ .../pygom-doc/mdconvert/doc_to_sort/faq.ipynb | 83 --- docs/pygom-doc/mdconvert/doc_to_sort/fh.md | 141 ----- .../mdconvert/doc_to_sort/gradient.md | 372 ------------- .../mdconvert/doc_to_sort/initialGuess.md | 59 -- .../mdconvert/doc_to_sort/profile.md | 506 ------------------ .../pygom-doc/mdconvert/doc_to_sort/ref.ipynb | 103 ---- .../mdconvert/doc_to_sort/stochastic.md | 341 ------------ .../mdconvert/doc_to_sort/transition.md | 230 -------- .../mdconvert/doc_to_sort/unrollOde.ipynb | 23 - docs/pygom-doc/mdconvert/mod/.md | 5 - .../mdconvert/mod/common_models.ipynb | 16 - docs/pygom-doc/mdconvert/mod/common_models.md | 5 - .../mdconvert/mod/confidence_interval.ipynb | 16 - .../mdconvert/mod/confidence_interval.md | 5 - .../mdconvert/mod/deterministic.ipynb | 16 - docs/pygom-doc/mdconvert/mod/deterministic.md | 5 - .../mdconvert/mod/epi_analysis.ipynb | 16 - docs/pygom-doc/mdconvert/mod/epi_analysis.md | 5 - docs/pygom-doc/mdconvert/mod/get_init.ipynb | 16 - docs/pygom-doc/mdconvert/mod/get_init.md | 5 - docs/pygom-doc/mdconvert/mod/index.ipynb | 22 - docs/pygom-doc/mdconvert/mod/index.md | 13 - docs/pygom-doc/mdconvert/mod/losstype.ipynb | 16 - docs/pygom-doc/mdconvert/mod/losstype.md | 5 - docs/pygom-doc/mdconvert/mod/odeloss.ipynb | 24 - docs/pygom-doc/mdconvert/mod/odeloss.md | 16 - docs/pygom-doc/mdconvert/mod/odeutils.ipynb | 16 - docs/pygom-doc/mdconvert/mod/odeutils.md | 5 - docs/pygom-doc/mdconvert/mod/simulate.ipynb | 16 - docs/pygom-doc/mdconvert/mod/simulate.md | 5 - docs/pygom-doc/mdconvert/mod/transition.ipynb | 16 - docs/pygom-doc/mdconvert/mod/transition.md | 5 - docs/pygom-doc/mdconvert/unroll/.md | 57 -- docs/pygom-doc/mdconvert/unroll/unrollBD.md | 60 --- docs/pygom-doc/mdconvert/unroll/unrollHard.md | 89 --- .../mdconvert/unroll/unrollSimple.md | 57 -- 59 files changed, 4322 deletions(-) delete mode 100644 docs/pygom-doc/mdconvert/common_models/.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/FitzHugh.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/Lorenz.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/Lotka_Volterra.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/Robertson.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SEIR.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SEIR_Multiple.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SIR.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SIS.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/SIS_Periodic.md delete mode 100644 docs/pygom-doc/mdconvert/common_models/vanDelPol.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/epi.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/epijson.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/estimate1.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/estimate2.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/faq.ipynb delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/fh.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/gradient.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/initialGuess.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/profile.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/ref.ipynb delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/stochastic.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/transition.md delete mode 100644 docs/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/.md delete mode 100644 docs/pygom-doc/mdconvert/mod/common_models.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/common_models.md delete mode 100644 docs/pygom-doc/mdconvert/mod/confidence_interval.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/confidence_interval.md delete mode 100644 docs/pygom-doc/mdconvert/mod/deterministic.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/deterministic.md delete mode 100644 docs/pygom-doc/mdconvert/mod/epi_analysis.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/epi_analysis.md delete mode 100644 docs/pygom-doc/mdconvert/mod/get_init.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/get_init.md delete mode 100644 docs/pygom-doc/mdconvert/mod/index.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/index.md delete mode 100644 docs/pygom-doc/mdconvert/mod/losstype.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/losstype.md delete mode 100644 docs/pygom-doc/mdconvert/mod/odeloss.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/odeloss.md delete mode 100644 docs/pygom-doc/mdconvert/mod/odeutils.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/odeutils.md delete mode 100644 docs/pygom-doc/mdconvert/mod/simulate.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/simulate.md delete mode 100644 docs/pygom-doc/mdconvert/mod/transition.ipynb delete mode 100644 docs/pygom-doc/mdconvert/mod/transition.md delete mode 100644 docs/pygom-doc/mdconvert/unroll/.md delete mode 100644 docs/pygom-doc/mdconvert/unroll/unrollBD.md delete mode 100644 docs/pygom-doc/mdconvert/unroll/unrollHard.md delete mode 100644 docs/pygom-doc/mdconvert/unroll/unrollSimple.md diff --git a/docs/pygom-doc/mdconvert/common_models/.md b/docs/pygom-doc/mdconvert/common_models/.md deleted file mode 100644 index 7aa8ca23..00000000 --- a/docs/pygom-doc/mdconvert/common_models/.md +++ /dev/null @@ -1,35 +0,0 @@ -# `.SIR_Birth_Death`{.interpreted-text role="func"} - -Next, we look at an SIR model with birth death - -$$\begin{aligned} -\frac{dS}{dt} &= B -\beta SI - \mu S \\ -\frac{dI}{dt} &= \beta SI - \gamma I - \mu I \\ -\frac{dR}{dt} &= \gamma I -\end{aligned}$$ - -Continuing from the example above, but now with a much longer time -frame. Note that the birth and death rate are the same. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: B = 126372.0/365.0 - -In \[1\]: N = 7781984.0 - -In \[1\]: ode = common_models.SIR_Birth_Death({\'beta\':3.6, -\'gamma\':0.2, \'B\':B/N, \'mu\':B/N}) - -In \[1\]: t = numpy.linspace(0, 35\*365, 10001) - -In \[1\]: x0 = \[0.065, 123.0\*(5.0/30.0)/N, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sir_bd.png In \[1\]: ode.plot() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/FitzHugh.md b/docs/pygom-doc/mdconvert/common_models/FitzHugh.md deleted file mode 100644 index 6b563e6b..00000000 --- a/docs/pygom-doc/mdconvert/common_models/FitzHugh.md +++ /dev/null @@ -1,44 +0,0 @@ -# `.FitzHugh`{.interpreted-text role="func"} - -The FitzHugh model [\[FitzHugh1961\]]() without external external -stimulus. This is a commonly used model when developing new methodology -with regard to ode\'s, see [\[Ramsay2007\]]() and [\[Girolami2011\]]() -and reference therein. - -$$\begin{aligned} -\frac{dV}{dt} &= c ( V - \frac{V^{3}}{3} + R) \\ -\frac{dR}{dt} &= -\frac{1}{c}(V - a + bR). -\end{aligned}$$ - -An example would be - -::: {.ipython} -In \[1\]: import numpy - -In \[1\]: from pygom import common_models - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: ode = common_models.FitzHugh({\'a\':0.2, \'b\':0.2, -\'c\':3.0}) - -In \[1\]: t = numpy.linspace(0, 20, 101) - -In \[1\]: x0 = \[1.0, -1.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_fh_1.png In \[1\]: ode.plot() - -In \[1\]: plt.close() - -In \[1\]: fig = plt.figure() - -In \[1\]: plt.plot(solution\[:,0\], solution\[:,1\], \'b\') - -\@savefig common_models_fh_2.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md b/docs/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md deleted file mode 100644 index 52141c92..00000000 --- a/docs/pygom-doc/mdconvert/common_models/Legrand_Ebola_SEIHFR.md +++ /dev/null @@ -1,96 +0,0 @@ -# `.Legrand_Ebola_SEIHFR`{.interpreted-text role="func"} - -A commonly used model in the literature to model Ebola outbreaks is the -SEIHFR model proposed by [\[Legrand2007\]](). There are two extra -compartments on top of the standard SEIR, $H$ for hospitialization and -$F$ for funeral. A total of ten parameters (with some describing the -inverse) are required for the model, they are: - - Symbol Process - -------------- --------------------------------------------- - $\beta_{I}$ Transmission rate in community - $\beta_{H}$ Transmission rate in hospital - $\beta_{F}$ Transmission rate in funeral - $\gamma_{I}$ (inverse) Onset to end of infectious - $\gamma_{D}$ (inverse) Onset to death - $\gamma_{H}$ (inverse) Onset of hospitilization - $\gamma_{F}$ (inverse) Death to burial - $\alpha$ (inverse) Duration of the incubation period - $\theta$ Proportional of cases hospitalized - $\delta$ Case\--ftality ratio - -The **(inverse)** denotes the parameter should be inverted to make -epidemiological sense. We use the parameters in their more natural from -in `.Legrand_Ebola_SEIHFR`{.interpreted-text role="func"} and replace -all the $\gamma$\'s with $\omega$\'s, i.e. -$\omega_{i} = \gamma_{i}^{-1}$ for $i \in \{I,D,H,F\}$. We also used -$\alpha^{-1}$ in our model instead of $\alpha$ so that reading the -parameters directly gives a more intuitive meaning. There arw five -additional parameters that is derived. The two derived case fatality -ratio as - -$$\begin{aligned} -\delta_{1} &= \frac{\delta \gamma_{I}}{\delta \gamma_{I} + (1-\delta)\gamma_{D}} \\ -\delta_{2} &= \frac{\delta \gamma_{IH}}{\delta \gamma_{IH} + (1-\delta)\gamma_{DH}}, -\end{aligned}$$ - -with an adjusted hospitalization parameter - -$$\theta_{1} = \frac{\theta(\gamma_{I}(1-\delta_{1}) + \gamma_{D}\delta_{1})}{\theta(\gamma_{I}(1-\delta_{1}) + \gamma_{D}\delta_{1}) + (1-\theta)\gamma_{H}},$$ - -and the derived infectious period - -$$\begin{aligned} -\gamma_{IH} &= (\gamma_{I}^{-1} - \gamma_{H}^{-1})^{-1} \\ -\gamma_{DH} &= (\gamma_{D}^{-1} - \gamma_{H}^{-1})^{-1}. -\end{aligned}$$ - -Now we are ready to state the full set of ode\'s, - -$$\begin{aligned} -\frac{dS}{dt} &= -N^{-1} (\beta_{I}SI + \beta_{H}SH + \beta_{F}(t) SF) \\ -\frac{dE}{dt} &= N^{-1} (\beta_{I}SI + \beta_{H}SH + \beta_{F}(t) SF) - \alpha E \\ -\frac{dI}{dt} &= \alpha E - (\gamma_{H} \theta_{1} + \gamma_{I}(1-\theta_{1})(1-\delta_{1}) + \gamma_{D}(1-\theta_{1})\delta_{1})I \\ -\frac{dH}{dt} &= \gamma_{H}\theta_{1}I - (\gamma_{DH}\delta_{2} + \gamma_{IH}(1-\delta_{2}))H \\ -\frac{dF}{dt} &= \gamma_{D}(1-\theta_{1})\delta_{1}I + \gamma_{DH}\delta_{2}H - \gamma_{F}F \\ -\frac{dR}{dt} &= \gamma_{I}(1-\theta_{1})(1-\delta_{1})I + \gamma_{IH}(1-\delta_{2})H + \gamma_{F}F. -\end{aligned}$$ - -with $\beta_{F}(t) = \beta_{F}$ if $t > c$ and $0$ otherwise. We use a -slightly modified version by replacing the delta function with a sigmoid -function namely, the logistic function - -$$\beta_{F}(t) = \beta_{F} \left(1 - \frac{1}{1 + \exp(-\kappa (t - c))} \right)$$ - -A brief example (from \[3\]) is given here with a slightly more in depth -example in `estimate2`{.interpreted-text role="ref"}. - -::: {.ipython} -In \[1\]: import numpy - -In \[1\]: from pygom import common_models - -In \[1\]: x0 = \[1.0, 3.0/200000.0, 0.0, 0.0, 0.0, 0.0, 0.0\] - -In \[1\]: t = numpy.linspace(1, 25, 100) - -In \[1\]: ode = common_models.Legrand_Ebola_SEIHFR(\[ - -: \...: (\'beta_I\',0.588), \...: (\'beta_H\',0.794), \...: - (\'beta_F\',7.653), \...: (\'omega_I\',10.0/7.0), \...: - (\'omega_D\',9.6/7.0), \...: (\'omega_H\',5.0/7.0), \...: - (\'omega_F\',2.0/7.0), \...: (\'alphaInv\',7.0/7.0), \...: - (\'delta\',0.81), \...: (\'theta\',0.80), \...: (\'kappa\',300.0), - \...: (\'interventionTime\',7.0) \...: \]) - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t) - -\@savefig common_models_seihfr.png In \[1\]: ode.plot() -::: - -Note also that we have again standardized so that the number of -susceptible is 1 and equal to the whole population, i.e. $N$ does not -exist in our set of ode\'s as defined in -`.common_models`{.interpreted-text role="mod"}. diff --git a/docs/pygom-doc/mdconvert/common_models/Lorenz.md b/docs/pygom-doc/mdconvert/common_models/Lorenz.md deleted file mode 100644 index 907311ce..00000000 --- a/docs/pygom-doc/mdconvert/common_models/Lorenz.md +++ /dev/null @@ -1,34 +0,0 @@ -# `.Lorenz`{.interpreted-text role="func"} - -The Lorenz attractor [\[Lorenz1963\]]() defined by the equations - -$$\begin{aligned} -\frac{dx}{dt} &= \sigma (y-x) \\ -\frac{dy}{dt} &= x (\rho - z) - y \\ -\frac{dz}{dt} &= xy - \beta z -\end{aligned}$$ - -A classic example is - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: t = numpy.linspace(0, 100, 20000) - -In \[1\]: ode = common_models.Lorenz({\'beta\':8.0/3.0, \'sigma\':10.0, -\'rho\':28.0}) - -In \[1\]: ode.initial_values = (\[1., 1., 1.\], t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -In \[1\]: f = plt.figure() - -In \[1\]: plt.plot(solution\[:,0\], solution\[:,2\]); - -\@savefig common_models_Lorenz.png In \[1\]: plt.show() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/Lotka_Volterra.md b/docs/pygom-doc/mdconvert/common_models/Lotka_Volterra.md deleted file mode 100644 index c98870b1..00000000 --- a/docs/pygom-doc/mdconvert/common_models/Lotka_Volterra.md +++ /dev/null @@ -1,103 +0,0 @@ -# `.Lotka_Volterra`{.interpreted-text role="func"} - -A standard Lotka-Volterra (preditor and prey) model with two states and -four parameters [\[Lotka1920\]](). - -$$\begin{aligned} -\frac{dx}{dt} &= \alpha x - cxy \\ -\frac{dy}{dt} &= -\delta y + \gamma xy -\end{aligned}$$ - -with both birth and death processes. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: x0 = \[2.0, 6.0\] - -In \[1\]: ode = common_models.Lotka_Volterra({\'alpha\':1, \'delta\':3, -\'c\':2, \'gamma\':6}) - -In \[1\]: ode.initial_values = (x0, 0) - -In \[1\]: t = numpy.linspace(0.1, 100, 10000) - -In \[1\]: solution = ode.integrate(t) - -\@savefig common_models_Lotka_Volterra.png In \[1\]: ode.plot() - -In \[1\]: plt.close() -::: - -Then we generate the graph at [Wolfram -Alpha](http://www.wolframalpha.com/input/?i=lotka-volterra+equations) -with varying initial conditions. - -::: {.ipython} -In \[1\]: x1List = numpy.linspace(0.2, 2.0, 5) - -In \[1\]: x2List = numpy.linspace(0.6, 6.0, 5) - -In \[1\]: fig = plt.figure() - -In \[1\]: solutionList = list() - -In \[1\]: ode = common_models.Lotka_Volterra({\'alpha\':1, \'delta\':3, -\'c\':2, \'gamma\':6}) - -In \[1\]: for i in range(len(x1List)): - -: \...: ode.initial_values = (\[x1List\[i\], x2List\[i\]\], 0) \...: - solutionList += \[ode.integrate(t)\] - -In \[1\]: for i in range(len(x1List)): -plt.plot(solutionList\[i\]\[100::,0\], solutionList\[i\]\[100::,1\], -\'b\') - -In \[1\]: plt.xlabel(\'x\') - -In \[1\]: plt.ylabel(\'y\') - -\@savefig common_models_Lotka_Volterra_initial_condition.png In \[1\]: -plt.show() - -In \[1\]: plt.close() -::: - -We also know that the system has the critical points at -$x = \delta / \gamma$ and $y=\alpha / c$. If we changes the parameters -in such a way that the ration between $x$ and $y$ remains the same, then -we get a figure as below - -::: {.ipython} -In \[1\]: cList = numpy.linspace(0.1, 2.0, 5) - -In \[1\]: gammaList = numpy.linspace(0.6, 6.0, 5) - -In \[1\]: fig = plt.figure() - -In \[1\]: for i in range(len(x1List)): - -: \...: ode = common_models.Lotka_Volterra({\'alpha\':1, \'delta\':3, - \'c\':cList\[i\], \'gamma\':gammaList\[i\]}) \...: - ode.initial_values = (x0, 0) \...: solutionList += - \[ode.integrate(t)\] - -In \[1\]: for i in range(len(cList)): -plt.plot(solutionList\[i\]\[100::,0\], solutionList\[i\]\[100::,1\]) - -In \[1\]: plt.xlabel(\'x\') - -In \[1\]: plt.ylabel(\'y\') - -\@savefig common_models_Lotka_Volterra_critical_point.png In \[1\]: -plt.show() - -In \[1\]: plt.close() -::: - -where all the cycles goes through the same points. diff --git a/docs/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md b/docs/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md deleted file mode 100644 index af9ce277..00000000 --- a/docs/pygom-doc/mdconvert/common_models/Lotka_Volterra_4State.md +++ /dev/null @@ -1,60 +0,0 @@ -# `.Lotka_Volterra_4State`{.interpreted-text role="func"} - -The Lotka-Volterra model with four states and three parameters -[\[Lotka1920\]](), explained by the following three transitions - -$$\begin{aligned} -\frac{da}{dt} &= k_{0} a x \\ -\frac{dx}{dt} &= k_{0} a x - k_{1} x y \\ -\frac{dy}{dt} &= k_{1} x y - k_{2} y \\ -\frac{db}{dt} &= k_{2} y. -\end{aligned}$$ - -First, we show the deterministic approach. Then we also show the -different process path using the parameters from [\[Press2007\]](). Note -that although the model is defined in `common_models`{.interpreted-text -role="mod"}, it is based on outputting an -`OperateOdeModel`{.interpreted-text role="class"} rather than -`SimulateOdeModel`{.interpreted-text role="class"}. - -::: {.ipython} -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: from pygom import Transition, TransitionType, ode_utils, -SimulateOde - -In \[1\]: import numpy - -In \[1\]: stateList = \[\'a\', \'x\', \'y\', \'b\'\] - -In \[1\]: paramList = \[\'k0\', \'k1\', \'k2\'\] - -In \[1\]: transitionList = \[ - -: \...: Transition(origin=\'a\', destination=\'x\', - equation=\'k0\*a\*x\', transition_type=TransitionType.T), \...: - Transition(origin=\'x\', destination=\'y\', equation=\'k1\*x\*y\', - transition_type=TransitionType.T), \...: Transition(origin=\'y\', - destination=\'b\', equation=\'k2\*y\', - transition_type=TransitionType.T) \...: \] - -In \[1\]: ode = SimulateOde(stateList, paramList, -transition=transitionList) - -In \[1\]: x0 = \[150.0, 10.0, 10.0, 0.0\] - -In \[1\]: t = numpy.linspace(0, 15, 100) - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: ode.parameters = \[0.01, 0.1, 1.0\] - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_Lotka_Volterra_4State.png In \[1\]: ode.plot() - -In \[1\]: simX, simT = ode.simulate_jump(t\[1::\], 5, full_output=True) - -\@savefig common_models_Lotka_Volterra_Sim.png In \[1\]: ode.plot(simX, -simT) -::: diff --git a/docs/pygom-doc/mdconvert/common_models/Robertson.md b/docs/pygom-doc/mdconvert/common_models/Robertson.md deleted file mode 100644 index 1b55174a..00000000 --- a/docs/pygom-doc/mdconvert/common_models/Robertson.md +++ /dev/null @@ -1,89 +0,0 @@ -# `.Robertson`{.interpreted-text role="func"} - -The Robertson problem [\[Robertson1966\]]() - -$$\begin{aligned} -\frac{dy_{1}}{dt} &= -0.04 y_{1} + 1 \cdot 10^{4} y_{2} y_{3} \\ -\frac{dy_{2}}{dt} &= 0.04 y_{1} - 1 \cdot 10^{4} y_{2} y_{3} + 3 \cdot 10^{7} y_{2}^{2} \\ -\frac{dy_{3}}{dt} &= 3 \cdot 10^{7} y_{2}^{2}. -\end{aligned}$$ - -This is a problem that describes an autocatalytic reaction. One of those -commonly used to test stiff ode solvers. As the parameters in the -literature is fixed, we show here how to define the states in a slightly -more compact format - -::: {.ipython} -In \[1\]: from pygom import DeterministicOde, Transition, TransitionType - -In \[1\]: import numpy - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: t = numpy.append(0, 4\*numpy.logspace(-6, 6, 1000)) - -In \[1\]: \# note how we define the states - -In \[1\]: stateList = \[\'y1:4\'\] - -In \[1\]: paramList = \[\] - -In \[1\]: transitionList = \[ - -: \...: Transition(origin=\'y1\', destination=\'y2\', - equation=\'0.04\*y1\', transition_type=TransitionType.T), \...: - Transition(origin=\'y2\', destination=\'y1\', - equation=\'1e4\*y2\*y3\', transition_type=TransitionType.T), \...: - Transition(origin=\'y2\', destination=\'y3\', - equation=\'3e7\*y2\*y2\', transition_type=TransitionType.T) \...: \] - -In \[1\]: ode = DeterministicOde(stateList, paramList, -transition=transitionList) - -In \[1\]: ode.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) - -In \[1\]: solution, output = ode.integrate(t\[1::\], full_output=True) - -In \[1\]: f, axarr = plt.subplots(1, 3) - -In \[1\]: for i in range(3): - -: \...: axarr\[i\].plot(t, solution\[:,i\]) \...: - axarr\[i\].set_xscale(\'log\') - -In \[1\]: f.tight_layout(); - -\@savefig common_models_Robertson_1.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -To simplify even further, we can use [y]{.title-ref} with the -corresponding subscript directly instead of [y1,y2,y3]{.title-ref}. -Again, we do not have any parameters as they are hard coded into our -models. - -::: {.ipython} -In \[1\]: stateList = \[\'y1:4\'\] - -In \[1\]: transitionList = \[ - -: \...: Transition(origin=\'y\[0\]\', destination=\'y\[1\]\', - equation=\'0.04\*y\[0\]\', transition_type=TransitionType.T), \...: - Transition(origin=\'y\[1\]\', destination=\'y\[0\]\', - equation=\'1e4\*y\[1\]*y\[2\]\', transition_type=TransitionType.T), - \...: Transition(origin=\'y\[1\]\', destination=\'y\[2\]\', - equation=\'3e7*y\[1\]\*y\[1\]\', transition_type=TransitionType.T) - \...: \] - -In \[1\]: ode = DeterministicOde(stateList, paramList, -transition=transitionList) - -In \[1\]: ode.initial_values =(\[1.0, 0.0, 0.0\], t\[0\]) - -In \[1\]: solution2 = ode.integrate(t\[1::\]) - -In \[1\]: numpy.max(solution - solution2) -::: - -and we have the identical solution as shown in the last line above. diff --git a/docs/pygom-doc/mdconvert/common_models/SEIR.md b/docs/pygom-doc/mdconvert/common_models/SEIR.md deleted file mode 100644 index 57d3c813..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SEIR.md +++ /dev/null @@ -1,35 +0,0 @@ -# `.SEIR`{.interpreted-text role="func"} - -A natural extension to the SIR is the SEIR model. An extra parameter -$\alpha$, which is the inverse of the incubation period is introduced. - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta SI \\ -\end{aligned}$$$$\begin{aligned} -\frac{dE}{dt} &= \beta SI - \alpha E \\ -\end{aligned}$$$$\begin{aligned} -\frac{dI}{dt} &= \alpha E - \gamma I \\ -\end{aligned}$$$$\frac{dR}{dt} &= \gamma I$$ - -We use the parameters from \[Aron1984\] here to generate our plots, -which does not yield a *nice* and *sensible* epidemic curve as the birth -and death processes are missing. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: ode = common_models.SEIR({\'beta\':1800, \'gamma\':100, -\'alpha\':35.84}) - -In \[1\]: t = numpy.linspace(0, 50, 1001) - -In \[1\]: x0 = \[0.0658, 0.0007, 0.0002, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_seir.png In \[1\]: ode.plot() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md b/docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md deleted file mode 100644 index 83623160..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death.md +++ /dev/null @@ -1,38 +0,0 @@ -# `.SEIR_Birth_Death`{.interpreted-text role="func"} - -Extending it to also include birth death process with equal rate $\mu$ - -$$\begin{aligned} -\frac{dS}{dt} &= \mu - \beta SI - \mu S \\ -\frac{dE}{dt} &= \beta SI - (\mu + \alpha) E \\ -\frac{dI}{dt} &= \alpha E - (\mu + \gamma) I \\ -\frac{dR}{dt} &= \gamma I -\end{aligned}$$ - -Same parameters value taken from [\[Aron1984\]]() as the SEIR example -above is used here. Observe how the introduction of a birth and a death -process changes the graph even though the rest of the parameters remains -the same. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: import numpy - -In \[1\]: ode = common_models.SEIR_Birth_Death({\'beta\':1800, -\'gamma\':100, \'alpha\':35.84, \'mu\':0.02}) - -In \[1\]: t = numpy.linspace(0, 50, 1001) - -In \[1\]: x0 = \[0.0658, 0.0007, 0.0002, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\], full_output=True) - -\@savefig common_models_seir_bd.png In \[1\]: ode.plot() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md b/docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md deleted file mode 100644 index 736c1947..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SEIR_Birth_Death_Periodic.md +++ /dev/null @@ -1,70 +0,0 @@ -# `.SEIR_Birth_Death_Periodic`{.interpreted-text role="func"} - -Now extending the SEIR to also have periodic contact, as in -[\[Aron1984\]](). - -$$\begin{aligned} -\frac{dS}{dt} &= \mu - \beta(t)SI - \mu S \\ -\frac{dE}{dt} &= \beta(t)SI - (\mu + \alpha) E \\ -\frac{dI}{dt} &= \alpha E - (\mu + \gamma) I \\ -\frac{dR}{dt} &= \gamma I. -\end{aligned}$$ - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: ode = -common_models.SEIR_Birth_Death_Periodic({\'beta_0\':1800, -\'beta_1\':0.2, \'gamma\':100, \'alpha\':35.84, \'mu\':0.02}) - -In \[1\]: t = numpy.linspace(0, 50, 1001) - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: x0 = \[0.0658, 0.0007, 0.0002, 0.0\] - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_seir_bd_periodic1.png In \[1\]: ode.plot() - -In \[1\]: plt.close() -::: - -The periodicity is obvious when looking at the the plot between states -$S$ and $E$, in logarithmic scale. - -::: {.ipython} -In \[1\]: fig = plt.figure(); - -In \[1\]: plt.plot(numpy.log(solution\[:,0\]), -numpy.log(solution\[:,1\])); - -In \[1\]: plt.xlabel(\'log of S\'); - -In \[1\]: plt.ylabel(\'log of E\'); - -\@savefig common_models_seir_bd_periodic2.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -Similarly, we can see the same thing between the states $E$ and $I$. - -::: {.ipython} -In \[1\]: fig = plt.figure(); - -In \[1\]: plt.plot(numpy.log(solution\[:,1\]), -numpy.log(solution\[:,2\])); - -In \[1\]: plt.xlabel(\'log of E\'); - -In \[1\]: plt.ylabel(\'log of I\'); - -\@savefig common_models_seir_bd_periodic3.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/SEIR_Multiple.md b/docs/pygom-doc/mdconvert/common_models/SEIR_Multiple.md deleted file mode 100644 index c7048c67..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SEIR_Multiple.md +++ /dev/null @@ -1,51 +0,0 @@ -# `.SEIR_Multiple`{.interpreted-text role="func"} - -Multiple SEIR coupled together, without any birth death process. - -$$\begin{aligned} -\frac{dS_{i}}{dt} &= dN_{i} - dS_{i} - \lambda_{i}S_{i} \\ -\frac{dE_{i}}{dt} &= \lambda_{i}S_{i} - (d+\epsilon)E_{i} \\ -\frac{dI_{i}}{dt} &= \epsilon E_{i} - (d+\gamma) I_{i} \\ -\frac{dR_{i}}{dt} &= \gamma I_{i} - dR_{i} -\end{aligned}$$ - -where - -$$\lambda_{i} = \sum_{j=1}^{n} \beta_{i,j} I_{j} (1\{i\neq j\} p)$$ - -with $n$ being the number of patch and $p$ the coupled factor. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[2\]: import numpy - -In \[3\]: paramEval = {\'beta_00\':0.0010107,\'beta_01\':0.0010107,\'beta_10\':0.0010107, - -: \...: - \'beta_11\':0.0010107,\'d\':0.02,\'epsilon\':45.6,\'gamma\':73.0, - \...: \'N_0\':10\**6,\'N_1\':10*\*6,\'p\':0.01} - -In \[4\]: x0 = \[36139.3224081278, 422.560577637822, 263.883351688369, -963174.233662546\] - -In \[5\]: ode = common_models.SEIR_Multiple(param=paramEval) - -In \[6\]: t = numpy.linspace(0, 40, 100) - -In \[7\]: x01 = \[\] - -In \[8\]: for s in x0: - -: \...: x01 += 2\*\[s\] - -In \[9\]: ode.initial_values = (numpy.array(x01, float),t\[0\]) - -In \[10\]: solution, output = ode.integrate(t\[1::\], full_output=True) - -\@savefig common_models_seir_multiple.png In \[11\]: ode.plot() -::: - -The initial conditions are those derived by using the stability -condition as stated in [\[Lloyd1996\]]() while the notations is taken -from [\[Brauer2008\]](). diff --git a/docs/pygom-doc/mdconvert/common_models/SIR.md b/docs/pygom-doc/mdconvert/common_models/SIR.md deleted file mode 100644 index 6b0ce30f..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SIR.md +++ /dev/null @@ -1,46 +0,0 @@ -# `.SIR`{.interpreted-text role="func"} - -A standard SIR model defined by the equations - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta SI \\ -\frac{dI}{dt} &= \beta SI - \gamma I \\ -\frac{dR}{dt} &= \gamma I -\end{aligned}$$ - -Note that the examples and parameters are taken from [\[Brauer2008\]](), -namely Figure 1.4. Hence, the first one below may not appear to make -much sense. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: ode = common_models.SIR({\'beta\':3.6, \'gamma\':0.2}) - -In \[1\]: t = numpy.linspace(0, 730, 1001) - -In \[1\]: N = 7781984.0 - -In \[1\]: x0 = \[1.0, 10.0/N, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sir.png In \[1\]: ode.plot() -::: - -Now we have the more sensible plot, where the initial susceptibles is -only a fraction of 1. - -::: {.ipython} -In \[1\]: x0 = \[0.065, 123\*(5.0/30.0)/N, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sir_realistic.png In \[1\]: ode.plot() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md b/docs/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md deleted file mode 100644 index 7aa8ca23..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SIR_Birth_Death.md +++ /dev/null @@ -1,35 +0,0 @@ -# `.SIR_Birth_Death`{.interpreted-text role="func"} - -Next, we look at an SIR model with birth death - -$$\begin{aligned} -\frac{dS}{dt} &= B -\beta SI - \mu S \\ -\frac{dI}{dt} &= \beta SI - \gamma I - \mu I \\ -\frac{dR}{dt} &= \gamma I -\end{aligned}$$ - -Continuing from the example above, but now with a much longer time -frame. Note that the birth and death rate are the same. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: B = 126372.0/365.0 - -In \[1\]: N = 7781984.0 - -In \[1\]: ode = common_models.SIR_Birth_Death({\'beta\':3.6, -\'gamma\':0.2, \'B\':B/N, \'mu\':B/N}) - -In \[1\]: t = numpy.linspace(0, 35\*365, 10001) - -In \[1\]: x0 = \[0.065, 123.0\*(5.0/30.0)/N, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sir_bd.png In \[1\]: ode.plot() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/SIS.md b/docs/pygom-doc/mdconvert/common_models/SIS.md deleted file mode 100644 index e7d79d8e..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SIS.md +++ /dev/null @@ -1,35 +0,0 @@ -# `.SIS`{.interpreted-text role="func"} - -A standard SIS model without the total population $N$. We assume here -that $S + I = N$ so we can always normalize to 1. Evidently, the state -$S$ is not required for understanding the model because it is a -deterministic function of state $I$. - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta S I + \gamma I \\ -\frac{dI}{dt} &= \beta S I - \gamma I. -\end{aligned}$$ - -An example would be - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: import numpy - -In \[1\]: ode = common_models.SIS({\'beta\':0.5,\'gamma\':0.2}) - -In \[1\]: t = numpy.linspace(0, 20, 101) - -In \[1\]: x0 = \[1.0, 0.1\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sis.png In \[1\]: ode.plot() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/SIS_Periodic.md b/docs/pygom-doc/mdconvert/common_models/SIS_Periodic.md deleted file mode 100644 index 1f46029d..00000000 --- a/docs/pygom-doc/mdconvert/common_models/SIS_Periodic.md +++ /dev/null @@ -1,34 +0,0 @@ -# `.SIS_Periodic`{.interpreted-text role="func"} - -Now we look at an extension of the SIS model by incorporating periodic -contact rate. Note how our equation is defined by a single ode for state -**I**. - -$$\frac{dI}{dt} = (\beta(t)N - \alpha) I - \beta(t)I^{2}$$ - -where $\beta(t) = 2 - 1.8 \cos(5t)$. As the name suggests, it achieves a -(stable) periodic solution. Note how the plots have two sub-graphs, -where $\tau$ is in fact our time component which we have taken out of -the original equation when converting it to a automonous system. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: import numpy - -In \[1\]: ode = common_models.SIS_Periodic({\'alpha\':1.0}) - -In \[1\]: t = numpy.linspace(0, 10, 101) - -In \[1\]: x0 = \[0.1,0.\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sis_periodic.png In \[1\]: ode.plot() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/common_models/vanDelPol.md b/docs/pygom-doc/mdconvert/common_models/vanDelPol.md deleted file mode 100644 index a8c0879d..00000000 --- a/docs/pygom-doc/mdconvert/common_models/vanDelPol.md +++ /dev/null @@ -1,74 +0,0 @@ -# `.vanDelPol`{.interpreted-text role="func"} - -The van Del Pol oscillator [\[vanderpol1926\]]() - -$$\begin{aligned} -\frac{dx}{dt} &= \sigma (y-x) \\ -\frac{dy}{dt} &= x (\rho - z) - y \\ -\frac{dz}{dt} &= xy - \beta z -\end{aligned}$$ - -A classic example is - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: t = numpy.linspace(0, 20, 1000) - -In \[1\]: ode = common_models.vanDelPol({\'mu\':1.0}) - -In \[1\]: ode.initial_values = (\[2.0, 0.0\], t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_vanDelPol.png In \[1\]: ode.plot() - -In \[1\]: plt.close() - -In \[1\]: f = plt.figure() - -In \[1\]: plt.plot(solution\[:,0\], solution\[:,1\]); - -\@savefig common_models_vanDelPol_yprime_y\_1.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -When we change the value, as per -[Wolfram](http://mathworld.wolfram.com/vanderPolEquation.html) - -::: {.ipython} -In \[1\]: t = numpy.linspace(0, 100, 1000) - -In \[1\]: ode.parameters = {\'mu\':1.0} - -In \[1\]: ode.initial_values = (\[0.0, 0.2\], t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -In \[1\]: f = plt.figure() - -In \[1\]: plt.plot(solution\[:,0\],solution\[:,1\]); - -\@savefig common_models_vanDelPol_yprime_y\_2.png In \[1\]: plt.show() - -In \[1\]: plt.close() - -In \[1\]: ode.parameters = {\'mu\':0.2} - -In \[1\]: ode.initial_values = (\[0.0, 0.2\], t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -In \[1\]: f = plt.figure() - -In \[1\]: plt.plot(solution\[:,0\], solution\[:,1\]); - -\@savefig common_models_vanDelPol_yprime_y\_3.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/.md b/docs/pygom-doc/mdconvert/doc_to_sort/.md deleted file mode 100644 index 07745c25..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/.md +++ /dev/null @@ -1,201 +0,0 @@ -# Solving Boundary Value Problems {#bvpSimple} - -In addition to finding solutions for an IVP and estimate the unknown -parameters, this package also allows you to solve BVP with a little bit -of imagination. Here, we are going to show how a BVP can be solved by -treating it as a parameter estimation problem. Essentially, a shooting -method where the first boundary condition defines the initial condition -of an IVP and the second boundary condition is an observation. Two -examples, both from MATLAB[^1], will be shown here. - -## Simple model 1 - -We are trying to find the solution to the second order differential -equation - -$$\nabla^{2} y + |y| = 0$$ - -subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert -this into a set of first order ODE - -$$\begin{aligned} -\frac{d y_{0}}{dt} &= y_{1} \\ -\frac{d y_{1}}{dt} &= -|y_{0}| -\end{aligned}$$ - -using an auxiliary variable $y_{1} = \nabla y$ and $y_{0} = y$. Setting -up the system below - -::: {.ipython} -In \[1\]: from pygom import Transition, TransitionType, -DeterministicOde, SquareLoss - -In \[1\]: import matplotlib.pyplot as plt - -In \[2\]: stateList = \[\'y0\', \'y1\'\] - -In \[3\]: paramList = \[\] - -In \[4\]: ode1 = Transition(origin=\'y0\', - -: \...: equation=\'y1\', \...: transition_type=TransitionType.ODE) - -In \[5\]: ode2 = Transition(origin=\'y1\', - -: \...: equation=\'-abs(y0)\', \...: - transition_type=TransitionType.ODE) - -In \[6\]: model = DeterministicOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2\]) - -In \[7\]: model.get_ode_eqn() -::: - -We check that the equations are correct before proceeding to set up our -loss function. - -::: {.ipython} -In \[1\]: import numpy - -In \[2\]: from scipy.optimize import minimize - -In \[3\]: initialState = \[0.0, 1.0\] - -In \[4\]: t = numpy.linspace(0, 4, 100) - -In \[5\]: model.initial_values = (initialState, t\[0\]) - -In \[6\]: solution = model.integrate(t\[1::\]) - -In \[7\]: f = plt.figure() - -\@savefig bvp1_random_guess_plot.png In \[8\]: model.plot() - -In \[9\]: plt.close() -::: - -Setting up the second boundary condition $y(4) = -2$ is easy, because -that is just a single observation attached to the state $y_{1}$. -Enforcing the first boundary condition requires us to set it as the -initial condition. Because the condition only states that $y(0) = 0$, -the starting value of the other state $y_1$ is free. We let our loss -object know that it is free through the targetState input argument. - -::: {.ipython} -In \[10\]: theta = \[0.0\] - -In \[11\]: obj = SquareLoss(theta=theta, - -: \....: ode=model, \....: x0=initialState, \....: t0=t\[0\], \....: - t=t\[-1\], \....: y=\[-2\], \....: state_name=\[\'y0\'\], \....: - target_state=\[\'y1\'\]) - -In \[12\]: thetaHat = minimize(fun=obj.costIV, x0=\[0.0\]) - -In \[13\]: print(thetaHat) - -In \[14\]: model.initial_values = (\[0.0\] + thetaHat\[\'x\'\].tolist(), -t\[0\]) - -In \[15\]: solution = model.integrate(t\[1::\]) - -In \[16\]: f = plt.figure() - -\@savefig bvp1_solution_plot.png In \[17\]: model.plot() - -In \[18\]: plt.close() -::: - -We are going to visualize the solution, and also check the boundary -condition. The first became our initial condition, so it is always -satisfied and only the latter is of concern, which is zero (subject to -numerical error) from thetaHat. - -## Simple model 2 - -Our second example is different as it involves an actual parameter and -also time. We have the Mathieu\'s Equation - -$$\nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0$$ - -and the aim is to compute the fourth eigenvalue $q=5$. There are three -boundary conditions - -$$\nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1$$ - -and we aim to solve it by converting it to a first order ODE and tackle -it as an IVP. As our model object does not allow the use of the time -component in the equations, we introduce a anxiliary state $\tau$ that -replaces time $t$. Rewrite the equations using -$y_{0} = y, y_{1} = \nabla y$ and define our model as - -::: {.ipython} -In \[1\]: stateList = \[\'y0\', \'y1\', \'tau\'\] - -In \[2\]: paramList = \[\'p\'\] - -In \[3\]: ode1 = Transition(\'y0\', \'y1\', TransitionType.ODE) - -In \[4\]: ode2 = Transition(\'y1\', \'-(p - 2\*5\*cos(2\*tau))\*y0\', -TransitionType.ODE) - -In \[5\]: ode3 = Transition(\'tau\', \'1\', TransitionType.ODE) - -In \[6\]: model = DeterministicOde(stateList, paramList, ode=\[ode1, -ode2, ode3\]) - -In \[7\]: theta = \[1.0, 1.0, 0.0\] - -In \[8\]: p = 15.0 - -In \[9\]: t = numpy.linspace(0, numpy.pi) - -In \[10\]: model.parameters = \[(\'p\',p)\] - -In \[11\]: model.initial_values = (theta, t\[0\]) - -In \[12\]: solution = model.integrate(t\[1::\]) - -In \[13\]: f = plt.figure() - -\@savefig bvp2_random_guess_plot.png In \[14\]: model.plot() - -In \[15\]: plt.close() -::: - -Now we are ready to setup the estimation. Like before, we setup the -second boundary condition by pretending that it is an observation. We -have all the initial conditions defined by the first boundary condition - -::: {.ipython} -In \[1\]: obj = SquareLoss(15.0, model, x0=\[1.0, 0.0, 0.0\], t0=0.0, -t=numpy.pi, y=0.0, state_name=\'y1\') - -In \[2\]: xhatObj = minimize(obj.cost,\[15\]) - -In \[3\]: print(xhatObj) - -In \[4\]: model.parameters = \[(\'p\', xhatObj\[\'x\'\]\[0\])\] - -In \[5\]: model.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) - -In \[5\]: solution = model.integrate(t\[1::\]) - -In \[6\]: f = plt.figure() - -\@savefig bvp2_solution_plot.png In \[7\]: model.plot() - -In \[8\]: plt.close() -::: - -The plot of the solution shows the path that satisfies all boundary -condition. The last subplot is time which obvious is redundant here but -the `DeterministicOde.plot`{.interpreted-text role="meth"} method is not -yet able to recognize the time component. Possible speed up can be -achieved through the use of derivative information or via root finding -method that tackles the gradient directly, instead of the cost function. - -**Reference** - -[^1]: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md b/docs/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md deleted file mode 100644 index 07745c25..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/bvpSimple.md +++ /dev/null @@ -1,201 +0,0 @@ -# Solving Boundary Value Problems {#bvpSimple} - -In addition to finding solutions for an IVP and estimate the unknown -parameters, this package also allows you to solve BVP with a little bit -of imagination. Here, we are going to show how a BVP can be solved by -treating it as a parameter estimation problem. Essentially, a shooting -method where the first boundary condition defines the initial condition -of an IVP and the second boundary condition is an observation. Two -examples, both from MATLAB[^1], will be shown here. - -## Simple model 1 - -We are trying to find the solution to the second order differential -equation - -$$\nabla^{2} y + |y| = 0$$ - -subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert -this into a set of first order ODE - -$$\begin{aligned} -\frac{d y_{0}}{dt} &= y_{1} \\ -\frac{d y_{1}}{dt} &= -|y_{0}| -\end{aligned}$$ - -using an auxiliary variable $y_{1} = \nabla y$ and $y_{0} = y$. Setting -up the system below - -::: {.ipython} -In \[1\]: from pygom import Transition, TransitionType, -DeterministicOde, SquareLoss - -In \[1\]: import matplotlib.pyplot as plt - -In \[2\]: stateList = \[\'y0\', \'y1\'\] - -In \[3\]: paramList = \[\] - -In \[4\]: ode1 = Transition(origin=\'y0\', - -: \...: equation=\'y1\', \...: transition_type=TransitionType.ODE) - -In \[5\]: ode2 = Transition(origin=\'y1\', - -: \...: equation=\'-abs(y0)\', \...: - transition_type=TransitionType.ODE) - -In \[6\]: model = DeterministicOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2\]) - -In \[7\]: model.get_ode_eqn() -::: - -We check that the equations are correct before proceeding to set up our -loss function. - -::: {.ipython} -In \[1\]: import numpy - -In \[2\]: from scipy.optimize import minimize - -In \[3\]: initialState = \[0.0, 1.0\] - -In \[4\]: t = numpy.linspace(0, 4, 100) - -In \[5\]: model.initial_values = (initialState, t\[0\]) - -In \[6\]: solution = model.integrate(t\[1::\]) - -In \[7\]: f = plt.figure() - -\@savefig bvp1_random_guess_plot.png In \[8\]: model.plot() - -In \[9\]: plt.close() -::: - -Setting up the second boundary condition $y(4) = -2$ is easy, because -that is just a single observation attached to the state $y_{1}$. -Enforcing the first boundary condition requires us to set it as the -initial condition. Because the condition only states that $y(0) = 0$, -the starting value of the other state $y_1$ is free. We let our loss -object know that it is free through the targetState input argument. - -::: {.ipython} -In \[10\]: theta = \[0.0\] - -In \[11\]: obj = SquareLoss(theta=theta, - -: \....: ode=model, \....: x0=initialState, \....: t0=t\[0\], \....: - t=t\[-1\], \....: y=\[-2\], \....: state_name=\[\'y0\'\], \....: - target_state=\[\'y1\'\]) - -In \[12\]: thetaHat = minimize(fun=obj.costIV, x0=\[0.0\]) - -In \[13\]: print(thetaHat) - -In \[14\]: model.initial_values = (\[0.0\] + thetaHat\[\'x\'\].tolist(), -t\[0\]) - -In \[15\]: solution = model.integrate(t\[1::\]) - -In \[16\]: f = plt.figure() - -\@savefig bvp1_solution_plot.png In \[17\]: model.plot() - -In \[18\]: plt.close() -::: - -We are going to visualize the solution, and also check the boundary -condition. The first became our initial condition, so it is always -satisfied and only the latter is of concern, which is zero (subject to -numerical error) from thetaHat. - -## Simple model 2 - -Our second example is different as it involves an actual parameter and -also time. We have the Mathieu\'s Equation - -$$\nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0$$ - -and the aim is to compute the fourth eigenvalue $q=5$. There are three -boundary conditions - -$$\nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1$$ - -and we aim to solve it by converting it to a first order ODE and tackle -it as an IVP. As our model object does not allow the use of the time -component in the equations, we introduce a anxiliary state $\tau$ that -replaces time $t$. Rewrite the equations using -$y_{0} = y, y_{1} = \nabla y$ and define our model as - -::: {.ipython} -In \[1\]: stateList = \[\'y0\', \'y1\', \'tau\'\] - -In \[2\]: paramList = \[\'p\'\] - -In \[3\]: ode1 = Transition(\'y0\', \'y1\', TransitionType.ODE) - -In \[4\]: ode2 = Transition(\'y1\', \'-(p - 2\*5\*cos(2\*tau))\*y0\', -TransitionType.ODE) - -In \[5\]: ode3 = Transition(\'tau\', \'1\', TransitionType.ODE) - -In \[6\]: model = DeterministicOde(stateList, paramList, ode=\[ode1, -ode2, ode3\]) - -In \[7\]: theta = \[1.0, 1.0, 0.0\] - -In \[8\]: p = 15.0 - -In \[9\]: t = numpy.linspace(0, numpy.pi) - -In \[10\]: model.parameters = \[(\'p\',p)\] - -In \[11\]: model.initial_values = (theta, t\[0\]) - -In \[12\]: solution = model.integrate(t\[1::\]) - -In \[13\]: f = plt.figure() - -\@savefig bvp2_random_guess_plot.png In \[14\]: model.plot() - -In \[15\]: plt.close() -::: - -Now we are ready to setup the estimation. Like before, we setup the -second boundary condition by pretending that it is an observation. We -have all the initial conditions defined by the first boundary condition - -::: {.ipython} -In \[1\]: obj = SquareLoss(15.0, model, x0=\[1.0, 0.0, 0.0\], t0=0.0, -t=numpy.pi, y=0.0, state_name=\'y1\') - -In \[2\]: xhatObj = minimize(obj.cost,\[15\]) - -In \[3\]: print(xhatObj) - -In \[4\]: model.parameters = \[(\'p\', xhatObj\[\'x\'\]\[0\])\] - -In \[5\]: model.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) - -In \[5\]: solution = model.integrate(t\[1::\]) - -In \[6\]: f = plt.figure() - -\@savefig bvp2_solution_plot.png In \[7\]: model.plot() - -In \[8\]: plt.close() -::: - -The plot of the solution shows the path that satisfies all boundary -condition. The last subplot is time which obvious is redundant here but -the `DeterministicOde.plot`{.interpreted-text role="meth"} method is not -yet able to recognize the time component. Possible speed up can be -achieved through the use of derivative information or via root finding -method that tackles the gradient directly, instead of the cost function. - -**Reference** - -[^1]: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb b/docs/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb deleted file mode 100644 index 938fed10..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/common_models.ipynb +++ /dev/null @@ -1,31 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Pre-defined Example common_models\n", - "\n", - "We have defined a set of models `common_models`, most of them commonly\n", - "used in epidemiology. They are there as examples and also save time for\n", - "end users. Most of them are of the compartmental type, and we use\n", - "standard naming conventions i.e. **S** = Susceptible, **E** = Exposed,\n", - "**I** = Infectious, **R** = Recovered. Extra state symbol will be\n", - "introduced when required.\n", - "\n", - "common_models/SIS.rst common_models/SIS_Periodic.rst\n", - "common_models/SIR.rst common_models/SIR_Birth_Death.rst\n", - "common_models/SEIR.rst common_models/SEIR_Multiple.rst\n", - "common_models/SEIR_Birth_Death.rst\n", - "common_models/SEIR_Birth_Death_Periodic.rst\n", - "common_models/Legrand_Ebola_SEIHFR.rst common_models/Lotka_Volterra.rst\n", - "common_models/Lotka_Volterra_4State.rst common_models/FitzHugh.rst\n", - "common_models/Lorenz.rst common_models/vanDelPol.rst\n", - "common_models/Robertson.rst" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/epi.md b/docs/pygom-doc/mdconvert/doc_to_sort/epi.md deleted file mode 100644 index d10988f1..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/epi.md +++ /dev/null @@ -1,65 +0,0 @@ -# Simple Epidemic Analysis {#epi} - -A common application of ordinary differential equations is in the field -of epidemiology modeling. More concretely, compartmental models that is -used to describe disease progression. We demonstrate some of the simple -algebraic analysis one may wish to take when given a compartment model. -Our use one of the simplest model, an SIR model with birth and death -processes, which is an extension of the one in `sir`{.interpreted-text -role="ref"}. First, we initialize the model below. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[2\]: ode = common_models.SIR_Birth_Death() - -In \[3\]: print(ode.get_ode_eqn()) -::: - -## Obtaining the R0 - -The reproduction number, also known as the $R_{0}$, is the single most -powerful piece and reduced piece of information available from a -compartmental model. In a nutshell, it provides a single number - if the -parameters are known - which can the intuitive interpretation where -$R_{0} = 1$ defines the tipping point of an outbreak. A $R_{0}$ value of -more than one signifies an potential outbreak where less than one -indicates that the disease will stop spreading naturally. - -To obtain the $R_{0}$, we simply have to tell the function which states -represent the *disease state*, which in this case is the state **I**. - -::: {.ipython} -In \[1\]: from pygom.model.epi_analysis import \* - -In \[2\]: print(R0(ode, \'I\')) -::: - -## Algebraic R0 - -We may also wish to get the $R_{0}$ in pure algebraic term. This can be -achieved by the following few lines. Note that the result below is -slightly different from the one above. The difference is due to the -internal working of the functions, where `getR0`{.interpreted-text -role="func"} computes the disease-free equilibrium value for the states -and substitute them back into the equation. - -::: {.ipython} -In \[1\]: F, V = disease_progression_matrices(ode, \'I\') - -In \[2\]: e = R0_from_matrix(F, V) - -In \[3\]: print(e) -::: - -To replicate the output before, we have to find the values where the -disease-free equilibrium will be achieved. Substitution can then be -performed to retrieve $R_{0}$ in pure parameters. - -::: {.ipython} -In \[1\]: dfe = DFE(ode, \[\'I\'\]) - -In \[2\]: print(dfe) - -In \[3\]: print(e\[0\].subs(dfe)) -::: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/epijson.md b/docs/pygom-doc/mdconvert/doc_to_sort/epijson.md deleted file mode 100644 index 166bf3f7..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/epijson.md +++ /dev/null @@ -1,58 +0,0 @@ -# Reading and using EpiJSON data {#epijson} - -Epidemiology data is complicated due to the many different stages a -patient can go through and whether a modeling technique is applicable -depends heavily on the recording of data. EpiJSON is a framework whih -tries to captures all the information [\[Finnie2016\]](), in a JSON -format as the name suggests. - -This package provides the functionality to process EpiJSON data. Due to -the nature of this package, modeling of ode, it processes the data file -with this in mind. The output is therefore in the cumulative form as -default, shown below, in a `pandas.DataFrame`{.interpreted-text -role="class"} format. The input can be in a string format, a file or -already a `dict`{.interpreted-text role="class"}. - -::: {.ipython} -In \[1\]: from pygom.loss.read_epijson import epijson_to_data_frame - -In \[2\]: import pkgutil - -In \[3\]: data = pkgutil.get_data(\'pygom\', \'data/eg1.json\') - -In \[3\]: df = epijson_to_data_frame(data) - -In \[4\]: print(df) -::: - -Given that the aim of loading the data is usually for model fitting, we -allow EpiJSON as input directly to the loss class -`pygom.loss.EpijsonLoss`{.interpreted-text role="class"} which uses the -Poisson loss under the hood. - -::: {.ipython} -In \[1\]: from pygom.model import common_models - -In \[2\]: from pygom.loss.epijson_loss import EpijsonLoss - -In \[3\]: ode = common_models.SIR(\[0.5, 0.3\]) - -In \[4\]: obj = EpijsonLoss(\[0.005, 0.03\], ode, data, \'Death\', -\'R\', \[300, 2, 0\]) - -In \[5\]: print(obj.cost()) - -In \[6\]: print(obj.\_df) -::: - -Given an initialized object, all the operations are inherited from -`pygom.loss.BaseLoss`{.interpreted-text role="class"}. We demonstrated -above how to calculate the cost and the rest will not be shown for -brevity. The data frame is stored inside of the loss object and can be -retrieved for inspection at any time point. - -Rather unfortunately, initial values for the states is still required, -but the time is not. When the time is not supplied, then the first time -point in the data will be treated as $t0$. The input [Death]{.title-ref} -indicate which column of the data is used and $R$ the corresponding -state the data belongs to. diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/estimate1.md b/docs/pygom-doc/mdconvert/doc_to_sort/estimate1.md deleted file mode 100644 index 05f1fee7..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/estimate1.md +++ /dev/null @@ -1,144 +0,0 @@ -# Example: Parameter Estimation 1 {#estimate1} - -## Estimation under square loss - -To ease the estimation process when given data, a separate module -`ode_loss`{.interpreted-text role="mod"} has been constructed for -observations coming from a single state. We demonstrate how to do it via -two examples, first, a standard SIR model, then the Legrand SEIHFR model -from [\[Legrand2007\]]() used for Ebola in `estimate2`{.interpreted-text -role="ref"}. - -### SIR Model - -We set up an SIR model as seen previously in `sir`{.interpreted-text -role="ref"}. - -::: {.ipython} -In \[176\]: from pygom import SquareLoss, common_models - -In \[179\]: import numpy - -In \[180\]: import scipy.integrate - -In \[184\]: import matplotlib.pyplot - -In \[185\]: \# Again, standard SIR model with 2 parameter. See the first -script! - -In \[191\]: \# define the parameters - -In \[192\]: paramEval = \[(\'beta\',0.5), (\'gamma\',1.0/3.0)\] - -In \[189\]: \# initialize the model - -In \[190\]: ode = common_models.SIR(paramEval) -::: - -and we assume that we have perfect information about the $R$ -compartment. - -::: {.ipython} -In \[196\]: x0 = \[1, 1.27e-6, 0\] - -In \[197\]: \# Time, including the initial time t0 at t=0 - -In \[198\]: t = numpy.linspace(0, 150, 1000) - -In \[200\]: \# Standard. Find the solution. - -In \[201\]: solution = scipy.integrate.odeint(ode.ode, x0, t) - -In \[202\]: y = solution\[:,1:3\].copy() -::: - -Initialize the class with some initial guess - -::: {.ipython} -In \[209\]: \# our initial guess - -In \[210\]: theta = \[0.2, 0.2\] - -In \[176\]: objSIR = SquareLoss(theta, ode, x0, t\[0\], t\[1::\], -y\[1::,:\], \[\'I\',\'R\'\]) -::: - -Note that we need to provide the initial values, $x_{0}$ and $t_{0}$ -differently to the observations $y$ and the corresponding time $t$. -Additionally, the state which the observation lies needs to be -specified. Either a single state, or multiple states are allowed, as -seen above. - -### Difference in gradient - -We have provided two different ways of obtaining the gradient, these are -explained in `gradient`{.interpreted-text role="ref"} in a bit more -detail. First, lets see how similar the output of the two methods are - -::: {.ipython} -In \[22\]: objSIR.sensitivity() - -In \[25\]: objSIR.adjoint() -::: - -and the time required to obtain the gradient for the SIR model under -$\theta = (0.2,0.2)$, previously entered. - -::: {.ipython} -In \[22\]: %timeit objSIR.sensitivity() - -In \[25\]: %timeit objSIR.adjoint() -::: - -Obviously, the amount of time taken for both method is dependent on the -number of observations as well as the number of states. The effect on -the adjoint method as the number of observations differs can be quite -evident. This is because the adjoint method is under a discretization -which loops in Python where as the forward sensitivity equations are -solved simply via an integration. As the number of observation gets -larger, the affect of the Python loop becomes more obvious. - -Difference in gradient is larger when there are less observations. This -is because the adjoint method use interpolations on the output of the -ode between each consecutive time points. Given solution over the same -length of time, fewer discretization naturally leads to a less accurate -interpolation. Note that the interpolation is currently performed using -univaraite spline, due to the limitation of python packages. Ideally, -one would prefer to use an (adaptive) Hermite or Chebyshev -interpolation. Note how we ran the two gradient functions once before -timing it, that is because we only find the properties (Jacobian, -gradient) of the ode during runtime. - -### Optimized result - -Then standard optimization procedures with some suitable initial guess -should yield the correct result. It is important to set the boundaries -for compartmental models as we know that all the parameters are strictly -positive. We put a less restrictive inequality here for demonstration -purpose. - -::: {.ipython} -In \[211\]: \# what we think the bounds are - -In \[212\]: boxBounds = \[(0.0,2.0),(0.0,2.0)\] -::: - -Then using the optimization routines in -`scipy.optimize`{.interpreted-text role="mod"}, for example, the *SLSQP* -method with the gradient obtained by forward sensitivity. - -::: {.ipython} -In \[208\]: from scipy.optimize import minimize - -In \[213\]: res = minimize(fun=objSIR.cost, - -: \.....: jac=objSIR.sensitivity, \.....: x0=theta, \.....: - bounds=boxBounds, \.....: method=\'SLSQP\') - -In \[214\]: print(res) -::: - -Other methods available in `scipy.optimize.minimize`{.interpreted-text -role="func"} can also be used, such as the *L-BFGS-B* and *TNC*. We can -also use methods that accepts the exact Hessian such as *trust-ncg* but -that should not be necessary most of the time. diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/estimate2.md b/docs/pygom-doc/mdconvert/doc_to_sort/estimate2.md deleted file mode 100644 index aae49819..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/estimate2.md +++ /dev/null @@ -1,353 +0,0 @@ -# Example: Parameter Estimation 2 {#estimate2} - -Continuing from the `estimate1`{.interpreted-text role="ref"}, we show -why estimating the parameters for ode\'s are hard. This is especially -true if there is a lack of data or when there are too much flexibility -in the model. Note that for reproducibility purposes, only deterministic -models are used here and a fixed seed whenever a stochastic algorithm is -needed. - -## Standard SEIR model - -We demonstrate the estimation on the recent Ebola outbreak in West -Africa. We use the number of deaths in Guinea and its corresponding time -the data was recorded. These data are publicly available and they can be -obtained easily on the internet such as -. It is stated out here for -simplicity. - -::: {.ipython} -In \[34\]: \# the number of deaths and cases in Guinea - -In \[35\]: yDeath = \[29.0, 59.0, 60.0, 62.0, 66.0, 70.0, 70.0, 80.0, 83.0, 86.0, 95.0, 101.0, 106.0, 108.0, - -: \....: 122.0, 129.0, 136.0, 141.0, 143.0, 149.0, 155.0, 157.0, - 158.0, 157.0, 171.0, 174.0, \....: 186.0, 193.0, 208.0, 215.0, - 226.0, 264.0, 267.0, 270.0, 303.0, 305.0, 307.0, 309.0, \....: - 304.0, 310.0, 310.0, 314.0, 319.0, 339.0, 346.0, 358.0, 363.0, - 367.0, 373.0, 377.0, \....: 380.0, 394.0, 396.0, 406.0, 430.0, - 494.0, 517.0, 557.0, 568.0, 595.0, 601.0, 632.0, \....: 635.0, - 648.0, 710.0, 739.0, 768.0, 778.0, 843.0, 862.0, 904.0, 926.0, - 997.0\] - -In \[35\]: yCase = \[49.0, 86.0, 86.0, 86.0, 103.0, 112.0, 112.0, 122.0, 127.0, 143.0, 151.0, 158.0, - -: \....: 159.0, 168.0, 197.0, 203.0, 208.0, 218.0, 224.0, 226.0, - 231.0, 235.0, 236.0, \....: 233.0, 248.0, 258.0, 281.0, 291.0, - 328.0, 344.0, 351.0, 398.0, 390.0, 390.0, \....: 413.0, 412.0, - 408.0, 409.0, 406.0, 411.0, 410.0, 415.0, 427.0, 460.0, 472.0, - \....: 485.0, 495.0, 495.0, 506.0, 510.0, 519.0, 543.0, 579.0, - 607.0, 648.0, 771.0, \....: 812.0, 861.0, 899.0, 936.0, 942.0, - 1008.0, 1022.0, 1074.0, 1157.0, 1199.0, 1298.0, \....: 1350.0, - 1472.0, 1519.0, 1540.0, 1553.0, 1906.0\] - -In \[36\]: \# the corresponding time - -In \[37\]: t = \[0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 9.0, 10.0, 13.0, 16.0, 18.0, 20.0, 23.0, 25.0, 26.0, 29.0, - -: \....: 32.0, 35.0, 40.0, 42.0, 44.0, 46.0, 49.0, 51.0, 62.0, 66.0, - 67.0, 71.0, 73.0, 80.0, 86.0, 88.0, \....: 90.0, 100.0, 102.0, - 106.0, 108.0, 112.0, 114.0, 117.0, 120.0, 123.0, 126.0, 129.0, - 132.0, 135.0, \....: 137.0, 140.0, 142.0, 144.0, 147.0, 149.0, - 151.0, 157.0, 162.0, 167.0, 169.0, 172.0, 175.0, 176.0, \....: - 181.0, 183.0, 185.0, 190.0, 193.0, 197.0, 199.0, 204.0, 206.0, - 211.0, 213.0, 218.0\] -::: - -### Simple estimation - -First ,we are going to fit a standard **SEIR** model to the data. -Details of the models can be found in `common_models`{.interpreted-text -role="mod"} Defining the model as usual with some random guess on what -the parameters might be, here, we choose the values to be the mid point -of our feasible region (defined by our box constraints later) - -::: {.ipython} -In \[1\]: from pygom import SquareLoss, common_models - -In \[1\]: import numpy, scipy.optimize - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: theta = numpy.array(\[5.0, 5.0, 5.0\]) - -In \[2\]: ode = common_models.SEIR(theta) - -In \[3\]: population = 1175e4 - -In \[4\]: y = numpy.reshape(numpy.append(numpy.array(yCase), -numpy.array(yDeath)), (len(yCase),2), \'F\')/population - -In \[5\]: x0 = \[1., 0., 49.0/population, 29.0/population\] - -In \[6\]: t0 = t\[0\] - -In \[7\]: objLegrand = SquareLoss(theta, ode, x0, t0, t\[1::\], -y\[1::,:\], \[\'I\',\'R\'\], numpy.sqrt(\[population\]\*2)) -::: - -Then we optimize, first, assuming that the initial conditions are -accurate. Some relatively large bounds are used for this particular -problem. - -::: {.ipython} -In \[8\]: boxBounds = \[ (0.0,10.0), (0.0,10.0), (0.0,10.0) \] - -In \[9\]: res = scipy.optimize.minimize(fun=objLegrand.cost, - -: \...: jac=objLegrand.sensitivity, \...: x0=theta, \...: - bounds=boxBounds, \...: method=\'l-bfgs-b\') - -In \[10\]: print(res) - -In \[11\]: f = plt.figure() - -\@savefig ebola_seir_straight.png In \[12\]: objLegrand.plot() - -In \[13\]: plt.close() -::: - -We can see from our visual confirmation that the estimated parameters -are not exactly ideal. This is confirmed by the information returned -from the `scipy.optimize.minimize`{.interpreted-text role="func"} -routine, and probably caused by the poor starting point. An attempt to -find a more suitable value can be done by some form of parameter space -exploration. Given that the evaluation of the objective function is not -expensive here, we have plenty of options to choose from. To reduce the -number of packages required to build this documentation, routines from -`scipy.optimize`{.interpreted-text role="mod"} remains our preferred -option. - -### Improved initial guess - -::: {.ipython} -In \[8\]: resDE = scipy.optimize.differential_evolution(objLegrand.cost, -bounds=boxBounds, polish=False, seed=20921391) - -In \[9\]: print(objLegrand.sensitivity(resDE\[\'x\'\])) - -In \[10\]: f = plt.figure() - -\@savefig ebola_seir_de.png In \[11\]: objLegrand.plot() - -In \[12\]: plt.close() -::: - -Looking at the output of the estimates (below this paragraph), we can -see our inference on Ebola is wrong when compared to the *known* values -(from field observation) even though the graphs looks -*\`\`reasonable\"*. Namely, $\gamma^{-1}$ the third element in the -vector below, our time from infectious to death, is within the expected -range but $\alpha^{-1}$ (second element), the incubation period, is a -lot higher than expected. - -::: {.ipython} -In \[1\]: 1/resDE\[\'x\'\] -::: - -### Multimodal surface - -A reason for this type of behavior is that we simply lack the -information/data to make proper inference. Without data on the state -$E$, the parameters $\beta,\alpha$ for the two states $I$ and $E$ are -dependent only on observations on $I$. Hence, some other random -combination of $\beta,\alpha$ that is capable of generating realization -close to observations in $I$ is feasible. In such cases, the only -requirement is that there exist some $\gamma$ in the feasible region -that can compensate for the ill suited $\beta,\alpha$. For example, we -know (obtained elsewhere and not shown here) that there is another set -of parameters capable of generating a similar looking curves as before. -Note the reversal of magnitude in $\beta$ and $\alpha$. - -::: {.ipython} -In \[11\]: objLegrand.cost(\[3.26106524e+00, 2.24798702e-04, -1.23660721e-02\]) - -In \[12\]: \#\# objLegrand.cost(\[ 0.02701867, 9.00004776, 0.01031861\]) -\# similar graph - -\@savefig ebola_seir_prior.png In \[13\]: objLegrand.plot() - -In \[14\]: plt.close() -::: - -### With initial values as parameters - -Obviously, the assumption that the whole population being susceptible is -an overestimate. We now try to estimate the initial conditions of the -ode as well. Given previous estimates of the parameters -$\hat{\beta}, \hat{\alpha}, \hat{\gamma}$ it is appropriate to start our -initial guess there. - -Furthermore, given that we now estimate the initial values for all the -states, we can use the first time point as our observation. So our time -begins at $t = -1$ where our observations include the previous initial -condition, i.e. 49 and 29 for the number of cases and death at $t = 0$ -respectively. The following code block demonstrates how we would do -that; feel free to try it out yourself to see the much improved result. - -::: {.ipython verbatim=""} -In \[1\]: thetaIV = theta.tolist() + x0 - -In \[2\]: thetaIV\[3\] -= 1e-8 \# to make sure that the initial guess -satisfy the constraints - -In \[3\]: boxBoundsIV = boxBounds + \[(0.,1.), (0.,1.), (0.,1.), -(0.,1.)\] - -In \[4\]: objLegrand = SquareLoss(theta, ode, x0, -1, t, y, -\[\'I\',\'R\'\], numpy.sqrt(\[population\]\*2)) - -In \[5\]: resDEIV = -scipy.optimize.differential_evolution(objLegrand.costIV, -bounds=boxBoundsIV, polish=False, seed=20921391) - -In \[6\]: print(resDEIV) - -In \[7\]: f = plt.figure() - -In \[8\]: objLegrand.plot() - -In \[9\]: plt.close() -::: - -## Legrand Ebola SEIHFR Model - -Next, we demonstrate the estimation on a model that is widely used in -the recent Ebola outbreak in west Africa. Again, the model has been -defined in `.common_models`{.interpreted-text role="mod"} already. - -::: {.ipython} -In \[1\]: ode = common_models.Legrand_Ebola_SEIHFR() - -In \[27\]: \# initial guess from the paper that studied the outbreak in -Congo - -In \[28\]: theta = numpy.array(\[0.588,0.794,7.653, \#\#\# the beta - -: \....: 10.0,9.6,5.0,2.0, \#\#\# the omega \....: 7.0,0.81,0.80, - \#\#\# alpha, delta, theta \....: 100.,1.0\]) \#\#\# - kappa,intervention time - -In \[29\]: \# initial conditions, note that we have a 0.0 at the end -because the model is a non-automonous ode which we have converted the -time component out - -In \[30\]: x0 = numpy.array(\[population, 0.0, 49.0, 0.0, 0.0, 29.0, -0.0\])/population - -In \[30\]: ode.parameters = theta - -In \[31\]: ode.initial_values = (x0, t\[0\]) - -In \[32\]: objLegrand = SquareLoss(theta, ode, x0, t\[0\], t\[1::\], -y\[1::,:\], \[\'I\',\'R\'\], numpy.sqrt(\[population\]\*2)) -::: - -Now, it is important to set additional constraints accurately because a -simply box constraint is much larger than the feasible set. Namely, -$\omega_{I}, \omega_{D}$ are the time taken from onset until end of -infectious/death, which has to be bigger than $\omega_{H}$, onset to -hospitalization given the nature of the disease. Therefore, we create -extra inequality constraints in addition to the box constraints - -::: {.ipython} - -In \[549\]: boxBounds = \[ - -: \.....: (0.001, 100.), \# beta_I \.....: (0.001, 100.), \# beta_H - \.....: (0.001, 100.), \# beta_F \.....: (0.001, 100.), \# omega_I - \.....: (0.001, 100.), \# omega_D \.....: (0.001, 100.), \# omega_H - \.....: (0.001, 100.), \# omega_F \.....: (0.001, 100.), \# - alpha\^{-1} \.....: (0.0001, 1.), \# delta \.....: (0.0001, 1.), \# - theta \.....: (0.001, 1000.), \# kappa \.....: (0.,218.) \# - intervention tine \.....: \] - -In \[550\]: cons = ({\'type\': \'ineq\', \'fun\' : lambda x: -numpy.array(\[x\[3\]-x\[5\], x\[4\]-x\[5\]\])}) -::: - -We can now try to find the optimal values, but because this is a -difficult problem that can take a very long time without guarantee on -the quality of solution - -::: {.ipython okexcept="" okwarning=""} - -In \[213\]: res = scipy.optimize.minimize(fun=objLegrand.cost, - -: \.....: jac=objLegrand.sensitivity, \.....: x0=theta, \.....: - constraints=cons, \.....: bounds=boxBounds, \.....: - method=\'SLSQP\') - -In \[214\]: print(res) - -In \[215\]: f = plt.figure() - -\@savefig ebola_legrand_runtime.png In \[216\]: objLegrand.plot() - -In \[217\]: plt.close() -::: - -Evidently, the estimated parameters are very much unrealistic given that -a lot of them are near the boundaries. It is also known from other -sources that some of the epidemiology properties of Ebola, with -incubation period of around 2 weeks and a mortality rate of around 80 -percent. - -As the estimate does not appear to provide anything sensible, we also -provide a set of values previously obtained (that looks semi-reasonable) -here plot the epidemic curve with the observations layered on top - -::: {.ipython okexcept="" okwarning=""} - -In \[1\]: theta = numpy.array(\[3.96915071e-02, 1.72302620e+01, 1.99749990e+01, - -: \...: 2.67759445e+01, 4.99999990e+01, 5.56122691e+00, \...: - 4.99999990e+01, 8.51599523e+00, 9.99999000e-01, \...: - 1.00000000e-06, 3.85807562e+00, 1.88385318e+00\]) - -In \[2\]: print(objLegrand.cost(theta)) - -In \[2\]: solution = ode.integrate(t\[1::\]) - -In \[3\]: f, axarr = plt.subplots(2,3) - -In \[4\]: axarr\[0,0\].plot(t, solution\[:,0\]); - -In \[5\]: axarr\[0,0\].set_title(\'Susceptible\'); - -In \[6\]: axarr\[0,1\].plot(t, solution\[:,1\]); - -In \[7\]: axarr\[0,1\].set_title(\'Exposed\'); - -In \[8\]: axarr\[0,2\].plot(t, solution\[:,2\]); - -In \[9\]: axarr\[0,2\].plot(t, y\[:,0\], \'r\'); - -In \[10\]: axarr\[0,2\].set_title(\'Infectious\'); - -In \[11\]: axarr\[1,0\].plot(t, solution\[:,3\]); - -In \[12\]: axarr\[1,0\].set_title(\'Hospitalised\'); - -In \[13\]: axarr\[1,1\].plot(t, solution\[:,4\]); - -In \[14\]: axarr\[1,1\].set_title(\'Awaiting Burial\'); - -In \[15\]: axarr\[1,2\].plot(t, solution\[:,5\]); - -In \[16\]: axarr\[1,2\].plot(t, y\[:,1\], \'r\'); - -In \[17\]: axarr\[1,2\].set_title(\'Removed\'); - -In \[18\]: f.text(0.5, 0.04, \'Days from outbreak\', ha=\'center\'); - -In \[19\]: f.text(0.01, 0.5, \'Population\', va=\'center\', -rotation=\'vertical\'); - -In \[20\]: f.tight_layout(); - -\@savefig ebola_seihfr_straight_prior.png In \[21\]: plt.show() - -In \[22\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/faq.ipynb b/docs/pygom-doc/mdconvert/doc_to_sort/faq.ipynb deleted file mode 100644 index 016ed7b5..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/faq.ipynb +++ /dev/null @@ -1,83 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Frequent asked questions\n", - "\n", - "## Code runs slowly\n", - "\n", - "This is because the package is not optimized for speed. Although the\n", - "some of the main functions are lambdified using `sympy` or compiled\n", - "against `cython` when available, there are many more optimization that\n", - "can be done. One example is the lines:\n", - "\n", - "in `.DeterministicOde.evalSensitivity`. The first two operations can be\n", - "inlined into the third and the third line itself can be rewritten as:\n", - "\n", - "and save the explicit copy operation by `numpy` when making A. If\n", - "desired, we could have also made used of the `numexpr` package that\n", - "provides further speed up on elementwise operations in place of numpy.\n", - "\n", - "## Why not compile the numeric computation form sympy against Theano\n", - "\n", - "Setup of the package has been simplified as much as possible. If you\n", - "look closely enough, you will realize that the current code generation\n", - "only uses `cython` and not `f2py`. This is because we are not prepared\n", - "to do all the system checks, i.e. does a fortran compiler exist, is gcc\n", - "installed, was python built as a shared library etc. We are very much\n", - "aware of the benefit, especially considering the possibility of GPU\n", - "computation in `theano`.\n", - "\n", - "## Why not use mpmath library throughout?\n", - "\n", - "This is because we have a fair number of operations that depends on\n", - "`scipy`. Obviously, we can solve ode using `mpmath` and do standard\n", - "linear algebra. Unfortunately, optimization and statistics packages and\n", - "routine are mostly based on `numpy`.\n", - "\n", - "## Computing the gradient using `.SquareLoss` is slow\n", - "\n", - "It will always be slow on the first operation. This is due to the design\n", - "where the initialization of the class is fast and only find derivative\n", - "information/compile function during runtime. After the first\n", - "calculation, things should be significantly faster.\n", - "\n", - "**Why some of my code is not a fortran object?**\n", - "\n", - "When we detec either a $\\exp$ or a $\\log$ in the equations, we\n", - "automatically force the compile to use mpmath to ensure that we obtain\n", - "the highest precision. To turn this on/off will be considered as a\n", - "feature in the future.\n", - "\n", - "## Can you not convert a non-autonumous system to an autonomous system for me automatically\n", - "\n", - "Although we can do that, it is not, and will not be implemented. This is\n", - "to ensure that the end user such as yourself are fully aware of the\n", - "equations being defined.\n", - "\n", - "## Getting the sensitivities from `.SquareLoss` did not get a speed up when I used a restricted set of parameters\n", - "\n", - "This is because we currently evaluate the full set of sensitivities\n", - "before extracting them out. Speeding this up for a restrictive set is\n", - "being considered. A main reason that stopped us from implementing is\n", - "that we find the symbolic gradient of the ode before compiling it. Which\n", - "means that one function call to the compiled file will return the full\n", - "set of sensitivities and we would only be extracting the appropriate\n", - "elements from the matrix. This only amounts to a small speed up. The\n", - "best method would be to compile only the necessary elements of the\n", - "gradient matrix, but this would require much more work both within the\n", - "code, and later on when variables are being added/deleted as all these\n", - "compilation are perfromed in runtime.\n", - "\n", - "## Why do not have the option to obtain gradient via complex differencing\n", - "\n", - "It is currently not implemented. Feature under consideration." - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/fh.md b/docs/pygom-doc/mdconvert/doc_to_sort/fh.md deleted file mode 100644 index a7b26a14..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/fh.md +++ /dev/null @@ -1,141 +0,0 @@ -# Example: Fitz Hugh {#fh} - -## Defining the model - -We are going to investigate another classic model here, the -FitzHugh-Nagumo, or simply FitzHugh here. The model has already been -defined in `common_models`{.interpreted-text role="mod"} so we can load -it easily - -::: {.ipython} -In \[1\]: from pygom import SquareLoss, common_models - -In \[2\]: import numpy - -In \[3\]: import scipy.integrate, scipy.optimize - -In \[4\]: import math,time,copy - -In \[5\]: import matplotlib.pyplot as plt - -In \[1\]: x0 = \[-1.0, 1.0\] - -In \[2\]: t0 = 0 - -In \[3\]: \# params - -In \[4\]: paramEval = \[(\'a\',0.2), (\'b\',0.2), (\'c\',3.0)\] - -In \[5\]: ode = common_models.FitzHugh(paramEval) - -In \[5\]: ode.initial_values = (x0, t0) -::: - -Define a set of time points and lets see how the two states $V$ and $R$ -are suppose to behave. - -::: {.ipython} -In \[6\]: t = numpy.linspace(1, 20, 30).astype(\'float64\') - -In \[7\]: solution = ode.integrate(t) - -\@savefig fh_plot.png In \[8\]: ode.plot() -::: - -## Estimate the parameters - -Obtaining the correct parameters for the FitzHugh model is well known to -be difficult, this is because the surface is multimodal. Although this -has been shown many times in the literature, so we will omit the -details. Regardless, we give it a go with some initial guess. with some -luck, we will be able to recover the original parameters. First, we try -it out with only one target state - -::: {.ipython} -In \[26\]: theta = \[0.5, 0.5, 0.5\] - -In \[27\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,1\], -\'R\') - -In \[28\]: boxBounds = \[ - -: \....: (0.0,5.0), \....: (0.0,5.0), \....: (0.0,5.0) \....: \] - -In \[29\]: res = scipy.optimize.minimize(fun=objFH.cost, - -: \....: jac=objFH.sensitivity, \....: x0=theta, \....: - bounds=boxBounds, \....: method=\'L-BFGS-B\') - -In \[30\]: print(res) -::: - -Then we try the same again but with both state as our target. Now we -won\'t look at the iterations because they are pretty pointless. - -::: {.ipython} -In \[30\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,:\], -\[\'V\',\'R\'\]) - -In \[31\]: res = scipy.optimize.minimize(fun=objFH.cost, - -: \....: jac=objFH.sensitivity, \....: x0=theta, \....: - bounds=boxBounds, \....: method=\'L-BFGS-B\') - -In \[32\]: print(res) -::: - -Note how the estimates are the same, unlike other models. - -## Estimate initial value - -We can further assume that we have no idea about the initial values for -$V$ and $R$ as well. We also provide guesstimate to set off the -optimization. The input vector $\theta$ must have the parameters first, -then the initial values, along with the corresponding bounds. - -First, only a single target state, i.e. we only have observations for -one of states which is $R$ in this case - -::: {.ipython} -In \[35\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,1\], -\'R\') - -In \[35\]: boxBounds = \[ - -: \....: (0.0,5.0), \....: (0.0,5.0), \....: (0.0,5.0), \....: - (None,None), \....: (None,None) \....: \] - -In \[36\]: res = scipy.optimize.minimize(fun=objFH.costIV, - -: \....: jac=objFH.sensitivityIV, \....: x0=theta + \[-0.5,0.5\], - \....: bounds=boxBounds, \....: method=\'L-BFGS-B\') - -In \[37\]: print(res) -::: - -then both state as target at the same time - -::: {.ipython} -In \[38\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\[1::,:\], -\[\'V\',\'R\'\]) - -In \[38\]: res = scipy.optimize.minimize(fun=objFH.costIV, - -: \....: jac=objFH.sensitivityIV, \....: x0=theta + \[-0.5, 0.5\], - \....: bounds=boxBounds, \....: method=\'L-BFGS-B\') - -In \[39\]: print(res) -::: - -See the difference between the two estimate with the latter, both state -were used, yielding superior estimates. Note that only the forward -sensitivity method is implemented when estimating the initial value, and -it is assumed that the starting condition for all the states are -unknown. - -The choice of algorithm here is the **L-BFGS-B** which is a better -choice because the parameter space of the FitzHugh is rough (i.e. large -second derivative) as well as being multimodal. This means that the -Hessian is not guaranteed to be positive definite and approximation -using $J^{\top}J$ is poor, with $J$ being the Jacobian of the objective -function. diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/gradient.md b/docs/pygom-doc/mdconvert/doc_to_sort/gradient.md deleted file mode 100644 index d0755502..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/gradient.md +++ /dev/null @@ -1,372 +0,0 @@ -# Gradient estimation under square loss {#gradient} - -Assuming that we have a set of $N$ observations $y_{i}$ at specific time -points $t_{i}$, $i = 1,\ldots,N$, we may wish to test out a set of ode -to see whether it fits to the data. The most natural way to test such -*fit* is to minimize the sum of squares between our observations $y$ and -see whether the resulting solution of the ode and the estimationed -parameters makes sense. - -We assume that this estimation process will be tackled through a -non-linear optimization point of view. However, it should be noted that -such estimates can also be performed via MCMC or from a global -optimization perspective. A key element in non-linear optimization is -the gradient, which is the focus of this page. - -Multiple ways of obtaining the gradient have been implemented. All of -them serve a certain purpose and may not be a viable/appropriate options -depending on the type of ode. More generally, let $d,p$ be the number of -states and paramters respectively. Then finite difference methods have a -run order of $O(p+1)$ of the original ode, forward sensitivity require -an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint -method require two run of size $d$ in principle, but actual run time is -dependent on the number of observations. - -For the details of the classes and methods, please refer to -`mod`{.interpreted-text role="ref"}. - -## Notation - -We introduce the notations that will be used in the rest of the page, -some of which may be slightly unconventional but necessary due to the -complexity of the problem. Let $x \in \mathbb{R}^{d}$ and -$\theta \in \mathbb{R}^{p}$ be the states and parameters respectively. -The term *state* or *simulation* are used interchangeably, even though -strictly speaking a state is $x$ whereas $x(t)$ is the simulation. An -ode is defined as - -$$f(x,\theta) = \dot{x} = \frac{\partial x}{\partial t}$$ - -and usually comes with a set of initial conditions $(x_0,t_0)$ where -$t_0 \le t_{i} \forall i$. Let $g(x,\theta)$ be a function that maps the -set of states to the observations, -$g : \mathbb{R}^{d} \rightarrow \mathbb{R}^{m}$. For compartmental -problems, which is our focus, $\nabla_{\theta}g(x,\theta)$ is usually -zero and $\nabla_{x}g(x,\theta)$ is an identity function for some or all -of the states $x$. Denote $l(x_{0},\theta,x)$ as our cost function -$l : \mathbb{R}^{m} \rightarrow \mathbb{R}$ and $L(x_{0},\theta,x)$ be -the sum of $l(\cdot)$. Both $x$ and $x_{0}$ are usually dropped for -simplicity. We will be dealing exclusively with square loss here, which -means that - -$$L(\theta) = \sum_{i=1}^{N} \left\| y_{i} - g(x(t_{i})) \right\|^{2} = \mathbf{e}^{\top} \mathbf{e}$$ - -where $\mathbf{e}$ is the residual vector, with elements - -$$e_{i} = y_{i} - x(t_{i}).$$ - -## Model setup - -Again, we demonstrate the functionalities of our classes using an SIR -model. - -::: {.ipython} -In \[1\]: from pygom import SquareLoss, common_models - -In \[2\]: import copy,time,numpy - -In \[2\]: ode = common_models.SIR() - -In \[3\]: paramEval = \[(\'beta\',0.5), (\'gamma\',1.0/3.0) \] - -In \[7\]: \# the initial state, normalized to zero one - -In \[8\]: x0 = \[1., 1.27e-6, 0.\] - -In \[5\]: \# initial time - -In \[6\]: t0 = 0 - -In \[5\]: ode.parameters = paramEval - -In \[6\]: ode.initial_values = (x0, t0) - -In \[9\]: \# set the time sequence that we would like to observe - -In \[10\]: t = numpy.linspace(1, 150, 100) - -In \[11\]: numStep = len(t) - -In \[11\]: solution = ode.integrate(t) - -In \[12\]: y = solution\[1::,2\].copy() - -In \[13\]: y += numpy.random.normal(0, 0.1, y.shape) -::: - -Now we have set up the model along with some observations, obtaining the -gradient only requires the end user to put the appropriate information -it into the class `SquareLoss`{.interpreted-text role="class"}. Given -the initial guess $\theta$ - -::: {.ipython} -In \[210\]: theta = \[0.2, 0.2\] -::: - -We initialize the `SquareLoss`{.interpreted-text role="class"} simply as - -::: {.ipython} -In \[20\]: objSIR = SquareLoss(theta, ode, x0, t0, t, y, \'R\') -::: - -where the we also have to specify the state our observations are from. -Now, we demonstrate the different methods in obtaining the gradient and -mathematics behind it. - -## Forward sensitivity - -The forward sensitivity equations are derived by differentiating the -states implicitly, which yields - -$$\frac{d\dot{x}}{d\theta} = \frac{\partial f}{\partial x}\frac{dx}{d\theta} + \frac{\partial f}{\partial \theta}.$$ - -So finding the sensitivies $\frac{dx}{d\theta}$ simply require another -integration of a $p$ coupled ode of $d$ dimension, each with the same -Jacobian as the original ode. This integration is performed along with -the original ode because of possible non-linearity. - -A direct call to the method -`sensitivity `{.interpreted-text -role="meth"} computed the gradient - -::: {.ipython} -In \[33\]: gradSens = objSIR.sensitivity() -::: - -whereas `.jac`{.interpreted-text role="meth"} will allow the end user to -obtain the Jacobian (of the objective function) and the residuals, the -information required to get the gradient as we see next. - -::: {.ipython} -In \[33\]: objJac, output = objSIR.jac(full_output=True) -::: - -## Gradient - -Just the sensitivities alone are not enough to obtain the gradient, but -we are $90\%$ there. Differentiating the loss function - -$$\begin{aligned} -\frac{dL}{d\theta} &= \nabla_{\theta} \sum_{i=1}^{N}\frac{dl}{dg} \\ - &= \sum_{i=1}^{N} \frac{\partial l}{\partial x}\frac{dx}{d\theta} + \frac{\partial l}{\partial \theta} \\ - &= \sum_{i=1}^{N} \frac{\partial l}{\partial g}\frac{\partial g}{\partial x}\frac{dx}{d\theta} + \frac{\partial l}{\partial g}\frac{\partial g}{\partial \theta} -\end{aligned}$$ - -via chain rule. When $\frac{\partial g}{\partial \theta} = 0$, the total -gradient simplifies to - -$$\frac{dL}{d\theta} = \sum_{i=1}^{N} \frac{\partial l}{\partial g}\frac{\partial g}{\partial x}\frac{dx}{d\theta}$$ - -Obviously, the time indicies are dropped above but all the terms above -are evaluated only at the observed time points. More concretely, this -means that - -$$\begin{aligned} -\frac{\partial l(x(j),\theta)}{\partial g} = \left\{ \begin{array}{ll} -2(y_{i} - x(j)) & , \; j = t_{i} \\ 0 & \; \text{otherwise} \end{array} \right. -\end{aligned}$$ - -When $g(\cdot)$ is an identity function (which is assumed to be the case -in `SquareLoss`{.interpreted-text role="class"}) - -$$\frac{\partial g(x(t_{i}),\theta)}{\partial x} = I_{d}$$ - -then the gradient simplifies even further as it is simply - -$$\frac{dL}{d\theta} = -2\mathbf{e}^{\top}\mathbf{S}$$ - -where $\mathbf{e}$ is the vector of residuals and -$\mathbf{S} = \left[\mathbf{s}_{1},\mathbf{s}_{2},\ldots,\mathbf{s}_{n}\right]$ -with elements - -$$\mathbf{s}_{i} = \frac{dx}{d\theta}(t_{i}),$$ - -the solution of the forward sensitivies at time $t_{i}$, obtained from -solving the coupled ode as mentioned previously. - -## Jacobian - -Now note how the gradient simplifies to $-2\mathbf{e}^{\top}\mathbf{S}$. -Recall that a standard result in non-linear programming states that the -gradient of a sum of sqaures objective function $L(\theta,y,x)$ is - -$$\nabla_{\theta} L(\theta,y,x) = -2(\mathbf{J}^{T} \left[\mathbf{y} - \mathbf{f}(x,\boldsymbol{\theta}) \right] )^{\top}$$ - -with $f(x,\theta)$ our non-linear function and $J$ our Jacobian with -elements - -$$J_{i} = \frac{\partial f(x_{i},\boldsymbol{\theta})}{\partial \boldsymbol{\theta}}.$$ - -This is exactly what we have seen previously, substituting in reveals -that $J = \mathbf{S}$. Hence, the Jacobian is (a necessary)by product -when we wish to obtain the gradient. In fact, this is exactly how we -proceed in -`sensitivity `{.interpreted-text -role="func"} where it makes an internal call to -`jac `{.interpreted-text role="func"} to obtain -the Jacobian first. This allows the end user to have more options when -choosing which type of algorithms to use, i.e. Gauss-Newton or -Levenberg-Marquardt. - -To check that the output is in fact the same - -::: {.ipython} -In \[1\]: objJac.transpose().dot(-2\*output\[\'resid\'\]) - gradSens -::: - -## Adjoint - -When the number of parameters increases, the number of sensitivies also -increases. The time required scales directly with the number of -parameters. We describe another method which does not depend on the -number of parameters, but rather, the number of states and observations. - -The full derivations will not be shown here, but we aim to provide -enough information to work out the steps performed in the our code. Let -write our optimization problem as - -$$\begin{aligned} -min_{\theta} \quad & \int_{t_{0}}^{T} l(x_{0},\theta,x(t)) dt \\ -s.t. \quad & \dot{x} = f(x,\theta) -\end{aligned}$$ - -which is identical to the original problem but in a continuous setting. -Now write the constrained problem in the Lagrangian form - -$$min_{\theta} \; L(\theta) + \int_{t_{0}}^{T} \lambda^{\top}(\dot{x} - f(x,\theta))$$ - -with Lagrangian multiplier $\lambda \ge 0$. After some algebraic -manipulation, it can be shown that the total derivative of the -Lagrangian function is - -$$\frac{dL}{d\theta} = \int_{t_{0}}^{T} \left(\frac{\partial l}{\partial \theta} - \lambda^{\top}\frac{\partial f}{\partial \theta} \right) dt.$$ - -Using previously defined loss functions (the identity), the first term -is zero and evaluating $\frac{\partial f}{\partial \theta}$ is trivial. -What remains is the calculation of $\lambda(t)$ for -$t \in \left[t_{0},T\right]$. - -Although this still seem to be ill-posed problem when Looking at the -Lagrangian function, one can actually obtain the *adjoint equation*, -after certain assumptions and - -$$\frac{d\lambda^{\top}}{dt} = \frac{\partial l}{\partial x} - \lambda^{\top}\frac{\partial f}{\partial \theta}.$$ - -which is again an integration. An unfortunate situation arise here for -non-linear systems because we use the minus Jacobian in the adjoint -equation. So if the eigenvalues of the Jacobian indicate that our -original ode is stable, such as -1, the minus eigenvalues (now 1) -implies that the adjoint equation is not stable. Therefore, one must -integrate backward in time to solve the adjoint equation and it cannot -be solved simultaneously as the ode, unlike the forward sensitivity -equations. - -Given a non-linearity ode, we must store information about the states -between $t_{0}$ and $T$ in order to perform the integration. There are -two options, both require storing many evaluated $x(j)$ within the -interval $\left[t_{0},T\right]$. Unfortunately, only one is available; -interpolation over all states and integrate using the interpolating -functions. The alternative of using observed $x(j)'s$ at fixed points is -not competitive because we are unable to use fortran routines for the -integration - -The method of choice here to perform the adjoint calcuation is to run a -forward integration, then perform an interpolation using splines with -explicit knots at the observed time points. - -::: {.ipython} -In \[326\]: odeSIRAdjoint, outputAdjoint = -objSIR.adjoint(full_output=True) -::: - -This is because evaluating the Jacobian may be expensive and Runge-kutta -method suffers as the complexity increases. In non-linear model such as -those found in epidemiology, each element of the Jacobian may be the -result of a complicated equation where linear step method will shine as -it makes as little function evaluation as possible. Note that -derivations in the literature, the initial condition when evaluating the -adjoint equation is $\lambda(T)=0$. But in our code we used -$\lambda(T) = -2(y(T)-x(T))$. Recall that we have observation $y(T)$ and -simulation $x(T)$, so that the adjoint equation evaluated at time $T$ - -$$\frac{\partial \lambda^{\top}}{\partial t} \Big|_{T} = -2(y-f(x,\theta))\Big|_{T} - \lambda(T)\frac{\partial f}{\partial \theta}\Big|_{T}$$ - -with the second term equal to zero. Integration under step size $h$ -implies that -$\lambda(T) \approx \lim_{h \to 0} \lambda(T-h) = -2(y(T)-x(T))$. - -## Time Comparison - -A simple time comparison between the different methods reveals that the -forward sensitivity method dominates the others by a wide margin. It -will be tempting to conclude that it is the best and should be the -default at all times but that is not true, due to the complexity of each -method mentioned previously. We leave it to the end user to find out the -best method for their specific problem. - -::: {.ipython} -In \[319\]: %timeit gradSens = objSIR.sensitivity() - -In \[326\]: %timeit odeSIRAdjoint,outputAdjoint = -objSIR.adjoint(full_output=True) -::: - -## Hessian - -The Hessian is defined by - -$$\frac{\partial^{2} l}{\partial \theta^{2}} = \left( \frac{\partial l}{\partial x} \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + \frac{\partial x}{\partial \theta}^{\top}\frac{\partial^{2} l}{\partial x^{2}}\frac{\partial x}{\partial \theta}$$ - -where $\otimes$ is the Kronecker product. Note that $\nabla_{\theta} x$ -is the sensitivity and the second order sensitivities can be found again -via the forward method, which involve another set of ode\'s, namely the -forward-forward sensitivities - -$$\frac{\partial}{\partial t}\left(\frac{\partial^{2} x}{\partial \theta^{2}}\right) = \left( \frac{\partial f}{\partial x} \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + \left( I_{d} \otimes \frac{\partial x}{\partial \theta}^{\top} \right) \frac{\partial^{2} f}{\partial x^{2}} \frac{\partial x}{\partial \theta}.$$ - -From before, we know that - -$$\frac{\partial l}{\partial x} = (-2y+2x) \quad and \quad \frac{\partial^{2} l}{\partial x^{2}} = 2I_{d}$$ - -so our Hessian reduces to - -$$\frac{\partial^{2} l}{\partial \theta^{2}} = \left( \left(-2y+2x\right) \otimes I_{p} \right) \frac{\partial^{2} x}{\partial \theta^{2}} + 2S^{\top}S,$$ - -where the second term is a good approximation to the Hessian as -mentioned previously. This is the only implementation in place so far -even though obtaining the estimate this way is relatively slow. - -Just to demonstate how it works, lets look at the Hessian at the optimal -point. First, we obtain the optimal value - -::: {.ipython} -In \[211\]: import scipy.linalg,scipy.optimize - -In \[212\]: boxBounds = \[(0.0, 2.0), (0.0, 2.0)\] - -In \[213\]: res = scipy.optimize.minimize(fun=objSIR.cost, - -: \.....: jac=objSIR.sensitivity, \.....: x0=theta, \.....: - bounds=boxBounds, \.....: method=\'L-BFGS-B\') -::: - -Then compare again the least square estimate of the covariance matrix -against our version - -::: {.ipython} -In \[211\]: resLS, cov_x, infodict, mesg, ier = -scipy.optimize.leastsq(func=objSIR.residual, x0=res\[\'x\'\], -full_output=True) - -In \[212\]: HJTJ, outputHJTJ = objSIR.hessian(full_output=True) - -In \[311\]: print(scipy.linalg.inv(HJTJ)) - -In \[312\]: print(cov_x) -::: - -also note the difference between the Hessian and the approximation using -the Jacobian, which is in fact what the least squares routine uses. - -::: {.ipython} -In \[313\]: print(scipy.linalg.inv(outputHJTJ\[\'JTJ\'\])) -::: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/initialGuess.md b/docs/pygom-doc/mdconvert/doc_to_sort/initialGuess.md deleted file mode 100644 index 358fd49f..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/initialGuess.md +++ /dev/null @@ -1,59 +0,0 @@ -# Obtaining good initial value for parameters {#initialGuess} - -## Function Interpolation - -When we want to fit the model to data, one of the necessary steps is to -supply the optimization procedure a good set of initial guess for the -parameters $\theta$. This may be a challenge when we do have a good -understanding of the process we are trying to model i.e. infectious -disease may all follow the same SIR process but with vastly different -incubation period. - -A method to obtain such initial guess based on the collocation is -available in this package. A restriction is that data must be present -for all states. We demonstrate this using the FitzHugh-Nagumo model. - -::: {.ipython} -In \[1\]: from pygom import SquareLoss, common_models, get_init - -In \[2\]: import numpy - -In \[3\]: x0 = \[-1.0, 1.0\] - -In \[4\]: t0 = 0 - -In \[5\]: \# params - -In \[6\]: paramEval = \[(\'a\',0.2), (\'b\',0.2), (\'c\',3.0)\] - -In \[7\]: ode = common_models.FitzHugh(paramEval) - -In \[8\]: ode.initial_values = (x0, t0) - -In \[8\]: t = numpy.linspace(1, 20, 30).astype(\'float64\') - -In \[9\]: solution = ode.integrate(t) -::: - -Below, we try to find the initial guess without supplying any further -information. The underlying method fits a cubic spline against the -observation and tries to minimize the difference between the first -derivative of the spline and the function of the ode. Varying degree of -smoothness penalty is applied to the spline and the best set of -parameters is the ones that yields the smallest total error, combining -both the fit of the spline against data and the spline against the ode. - -::: {.ipython} -In \[10\]: theta, sInfo = get_init(solution\[1::,:\], t, ode, -theta=None, full_output=True) - -In \[11\]: print(theta) - -In \[12\]: print(sInfo) -::: - -As seen above, we have obtained a very good guess of the parameters, in -fact almost the same as the generating process. The information -regarding the smoothing factor shows that the amount of penalty used is -small, which is expected given that we use the solution of the ode as -observations. diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/profile.md b/docs/pygom-doc/mdconvert/doc_to_sort/profile.md deleted file mode 100644 index aa50fb5a..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/profile.md +++ /dev/null @@ -1,506 +0,0 @@ -# Confidence Interval of Estimated Parameters {#profile} - -After obtaining the *best* fit, it is natural to report both the point -estimate and the confidence level at the $\alpha$ level. The easiest way -to do this is by invoking the normality argument and use Fisher -information of the likelihood. As explained previously at the bottom of -`gradient`{.interpreted-text role="ref"}, we can find the Hessian, -$\mathbf{H}$, or the approximated Hessian for the estimated parameters. -The Cramer\--Rao inequality, we know that - -$$Var(\hat{\theta}) \ge \frac{1}{I(\theta)},$$ - -where $I(\theta)$ is the Fisher information, which is the Hessian -subject to regularity condition. Given the Hessian, computing the -confidence intervals is trivial. Note that this is also known as the -asymptotic confidence interval where the normality comes from invoking -the CLT. There are other ways of obtaining a confidence intervals, we -will the ones implemented in the package. First, we will set up a SIR -model as seen in `sir`{.interpreted-text role="ref"} which will be used -throughout this page. - -::: {.ipython} -In \[1\]: from pygom import NormalLoss, common_models - -In \[2\]: from pygom.utilR import qchisq - -In \[3\]: import numpy - -In \[4\]: import scipy.integrate - -In \[5\]: import matplotlib.pyplot as plt - -In \[6\]: import copy - -In \[7\]: ode = common_models.SIR(\[(\'beta\', 0.5), (\'gamma\', -1.0/3.0)\]) -::: - -and we assume that we only have observed realization from the $R$ -compartment - -::: {.ipython} -In \[1\]: x0 = \[1, 1.27e-6, 0\] - -In \[2\]: t = numpy.linspace(0, 150, 100).astype(\'float64\') - -In \[3\]: ode.initial_values = (x0, t\[0\]) - -In \[4\]: solution = ode.integrate(t\[1::\]) - -In \[5\]: theta = \[0.2, 0.2\] - -In \[6\]: targetState = \[\'R\'\] - -In \[7\]: targetStateIndex = -numpy.array(ode.get_state_index(targetState)) - -In \[8\]: y = solution\[1::,targetStateIndex\] + numpy.random.normal(0, -0.01, (len(solution\[1::,targetStateIndex\]), 1)) - -In \[9\]: yObv = y.copy() - -In \[10\]: objSIR = NormalLoss(theta, ode, x0, t\[0\], t\[1::\], y, -targetState) - -In \[11\]: boxBounds = \[(1e-8, 2.0), (1e-8, 2.0)\] - -In \[12\]: boxBoundsArray = numpy.array(boxBounds) - -In \[13\]: xhat = objSIR.fit(theta, lb=boxBoundsArray\[:,0\], -ub=boxBoundsArray\[:,1\]) -::: - -## Asymptotic - -When the estimate is obtained say, under a square loss or a normal -assumption, the corresponding likelihood can be written down easily. In -such a case, likelihood ratio test under a Chi\--squared distribution is - -$$2 (\mathcal{L}(\hat{\boldsymbol{\theta}}) - \mathcal{L}(\boldsymbol{\theta})) \le \chi_{1 - \alpha}^{2}(k)$$ - -where $1-\alpha$ is the size of the confidence region and $k$ is the -degree of freedom. The corresponding asymptotic confidence interval for -parameter $j$ can be derived as - -$$\hat{\theta}_{j} \pm \sqrt{\chi_{1 - \alpha}^{2}(k) H_{i,i}}.$$ - -A pointwise confidence interval is obtained when $k = 1$. We assume in -our package that a pointwise confidence interval is desired. This can be -obtained simply by - -::: {.ipython} -In \[1\]: from pygom import confidence_interval as ci - -In \[2\]: alpha = 0.05 - -In \[3\]: xL, xU = ci.asymptotic(objSIR, alpha, xhat, -lb=boxBoundsArray\[:,0\], ub=boxBoundsArray\[:,1\]) - -In \[4\]: print(xL) - -In \[5\]: print(xU) -::: - -Note that the set of bounds here is only used for check the validity of -$\hat{\mathbf{x}}$ and not used in the calculation of the confidence -intervals. Therefore the resulting output can be outside of the box -constraints. - -## Profile Likelihood - -Another approach to calculate the confidence interval is to tackle one -parameter at a time, treating the rest of them as nuisance parameters, -hence the term *profile*. Let $\mathcal{L}(\boldsymbol{\theta})$ be our -log\--likelihood with parameter $\boldsymbol{\theta}$. Element -$\theta_{j}$ is our parameter of interest and $\boldsymbol{\theta}_{-j}$ -represents the complement such that -$\boldsymbol{\theta} = \theta_{j} \cup \boldsymbol{\theta}_{-j}$. For -simply models such as linear regression with only regression -coefficients $\boldsymbol{\beta}$, then -$\boldsymbol{\theta} = \boldsymbol{\beta}$. - -To shorten the notation, let - -$$\mathcal{L}(\boldsymbol{\theta}_{-j} \mid \theta_{j}) = \max \mathcal{L}(\boldsymbol{\theta}_{-j} \mid \theta_{j})$$ - -which is the maxima of $\boldsymbol{\theta}_{-j}$ given $\theta_{j}$. -$\hat{\boldsymbol{\theta}}$ denotes the MLE of the parameters as usual. -The profile\--likelihood based confidence interval for $\theta_{j}$ is -defined as - -$$\begin{aligned} -\theta_{j}^{U} &= \sup \left\{ \mathcal{L}(\hat{\boldsymbol{\theta}}) - \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) \le \frac{1}{2} \chi_{1 - \alpha}^{2}(1) \right\} \\ -\theta_{j}^{L} &= \inf \left\{ \mathcal{L}(\hat{\boldsymbol{\theta}}) - \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) \le \frac{1}{2} \chi_{1 - \alpha}^{2}(1) \right\} -\end{aligned}$$ - -where again we have made use of the normal approximation, but without -imposing symmetry. The set of equations above automatically implies that -the interval width is $\theta_{j}^{U} - \theta_{j}^{L}$ and - -$$\mathcal{L}(\hat{\boldsymbol{\theta}}) - \frac{1}{2} \chi_{1-\alpha}^{2}(1) - \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) = 0.$$ - -As mentioned previously, $\boldsymbol{\theta}_{-j}$ is the maximizer of -the nuisance parameters, which has a gradient of zero. Combining this -with the equation above yields a non\--linear system of equations of -size $p$, - -$$\begin{aligned} -g(\boldsymbol{\theta}) = \left[ \begin{array}{c} \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j}) - c \\ \frac{\partial \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j})}{\partial \boldsymbol{\theta}_{-j}} \end{array} \right] = 0 -\end{aligned}$$ - -where -$c = \mathcal{L}(\hat{\boldsymbol{\theta}}) + \frac{1}{2} \chi_{1-\alpha}^{2}(1)$. -Solving this set of system of equations only need simple Newton like -steps, possibly with correction terms as per [\[Venzon1988\]](). We -provide a function to obtain such estimate - -::: {.ipython verbatim=""} -In \[1\]: xLProfile, xUProfile, xLProfileList, xUProfileList = -ci.profile(objSIR, alpha, xhat, lb=boxBoundsArray\[:,0\], -ub=boxBoundsArray\[:,1\], full_output=True) -::: - -but unfortunately this is not accurate most of the time due to the -complicated surface at locations not around $\hat{\theta}$. This is a -common scenario for non\--linear least square problems because the -Hessian is not guaranteed to be a PSD everywhere. Therefore, a safeguard -is in place to obtain the $\theta_{j}^{U},\theta_{j}^{L}$ by iteratively -by updating $\theta_{j}$ and find the solution to -`nuisanceOptim`{.interpreted-text role="eq"}. - -Furthermore, we also provide the functions necessary to obtain the -estimates such as the four below. - -::: {.ipython} -In \[1\]: i = 0 - -In \[1\]: funcF = ci.\_profileF(xhat, i, 0.05, objSIR) - -In \[2\]: funcG = ci.\_profileG(xhat, i, 0.05, objSIR) - -In \[3\]: funcGC = ci.\_profileGSecondOrderCorrection(xhat, i, alpha, -objSIR) - -In \[4\]: funcH = ci.\_profileH(xhat, i, 0.05, objSIR) -::: - -Where $i$ is the index of the parameter of interest. -`_profileF`{.interpreted-text role="func"} is the squared norm of -`obj`{.interpreted-text role="eq"}, which easy the optimization process -for solvers which requires a converted form from system of equations to -non-linear least squares. `_profileG`{.interpreted-text role="func"} is -the systems of equations `obj`{.interpreted-text role="eq"}, -`_profileH`{.interpreted-text role="func"} is the derivative of -`obj`{.interpreted-text role="eq"} - -$$\begin{aligned} -\nabla g(\boldsymbol{\theta}) = \left[ \begin{array}{c} \frac{\partial \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j})}{\partial \theta_{j}} \\ \frac{\partial^{2} \mathcal{L}(\boldsymbol{\theta} \mid \theta_{j})}{\partial \boldsymbol{\beta}_{-j} \partial \theta_{j}} \end{array} \right] -\end{aligned}$$ - -and `_profileGSecondOrderCorrection`{.interpreted-text role="func"} has -the second order correction [\[Venzon1988\]](). - -## Geometric profile likelihood - -Due to the difficulty in obtain a profile likelihood via the standard -Newton like steps, we also provide a way to generate a similar result -using the geometric structure of the likelihood surface. We follow the -method in [\[Moolgavkar1987\]](), which involves solving a set of -differential equations - -$$\begin{aligned} -\frac{d\beta_{j}}{dt} &= k g^{-1/2} \\ -\frac{d\boldsymbol{\beta}_{-j}}{dt} &= \frac{d\boldsymbol{\beta}_{-j}}{d\beta_{j}} \frac{d\beta_{j}}{dt}, -\end{aligned}$$ - -where $k = \Phi(1-\alpha)$ is the quantile we want to obtain under a -normal distribution, and - -$$\begin{aligned} -g = J_{\beta_{j}}^{\top} I^{\boldsymbol{\beta}} J_{\beta_{j}}, \quad J_{\beta_{j}} = \left( \begin{array}{c} 1 \\ \frac{d\boldsymbol{\beta}_{-j}}{d\beta_{j}} \end{array} \right). -\end{aligned}$$ - -Here, $J_{\beta_{j}}$ is the Jacobian between $\beta_{j}$ and -$\boldsymbol{\beta}_{-j}$ with the term - -$$\frac{d\boldsymbol{\beta}_{-j}}{d\beta_{j}} = -\left( \frac{\partial^{2} \mathcal{L}}{\partial \boldsymbol{\beta}_{-j}\partial \boldsymbol{\beta}_{-j}^{\top} } \right)^{-1} \frac{\partial^{2} \mathcal{L}}{\partial \beta_{j} \partial \beta_{-j}^{\top}}$$ - -and hence the first element is $1$ (identity transformation). -$I^{\boldsymbol{\beta}}$ is the Fisher information of -$\boldsymbol{\beta}$, which is - -$$I^{\boldsymbol{\beta}} = \frac{\partial \boldsymbol{\theta}}{\partial \boldsymbol{\beta}^{\top}} \Sigma^{\boldsymbol{\theta}(\boldsymbol{\beta})} \frac{\partial \boldsymbol{\theta}}{\partial \boldsymbol{\beta}}.$$ - -It is simply $\Sigma^{\boldsymbol{\beta}}$ if -$\boldsymbol{\theta} = \boldsymbol{\beta}$. Different Fisher information -can be used for $\Sigma^{\boldsymbol{\beta}}$ such as the expected or -observed, at $\hat{\boldsymbol{\beta}}$ or $\boldsymbol{\beta}$. After -some trivial algebraic manipulation, we can show that our ode boils -downs to - -$$\begin{aligned} -\left[ \begin{array}{c} \frac{d\beta_{j}}{dt} \\ \frac{d\boldsymbol{\beta_{-j}}}{dt} \end{array} \right] = k \left[ \begin{array}{c} 1 \\ -A^{-1}w \end{array} \right] \left( v - w^{\top}A^{-1}w \right)^{-1/2} -\end{aligned}$$ - -where the symbols on the RHS above correspond to partitions in the -Fisher information - -$$\begin{aligned} -I^{\boldsymbol{\beta}} = \left[ \begin{array}{cc} v & w^{\top} \\ w & A \end{array} \right]. -\end{aligned}$$ - -The integration is perform from $t = 0$ to $1$ and is all handled -internally via `geometric`{.interpreted-text role="func"} - -::: {.ipython} -In \[1\]: xLGeometric, xUGeometric, xLList, xUList = -ci.geometric(objSIR, alpha, xhat, full_output=True) - -In \[2\]: print(xLGeometric) - -In \[3\]: print(xUGeometric) -::: - -## Bootstrap - -This is perhaps the favorite method to estimate confidence interval for -a lot of people. Although there are many ways to implement bootstrap, -semi-parametric is the only logical choice (even though the underlying -assumptions may be violated at times). As we have only implemented OLS -type loss functions in this package, the parametric approach seem to be -inappropriate when there is no self\--efficiency guarantee. -Non-parametric approach requires at least a conditional independence -assumption, something easily violated by our **ode**. Block bootstrap is -an option but we are also aware that the errors of an **ode** can be -rather rigid, and consistently over/under estimate at certain periods of -time. - -When we say semi-parametric, we mean the exchange of errors between the -observations. Let our raw error be - -$$\varepsilon_{i} = y_{i} - \hat{y}_{i}$$ - -where $\hat{y}_{i}$ will be the prediction under -$\hat{\boldsymbol{\theta}}$ under our model. Then we construct a new set -of observations via - -$$y_{i}^{\ast} = \hat{y}_{i} + \varepsilon^{\ast}, \quad \varepsilon^{\ast} \sim \mathcal{F}$$ - -with $\mathcal{F}$ being the empirical distribution of the raw errors. A -new set of parameters $\theta^{\ast}$ are then found for the -bootstrapped samples, and we obtain the $\alpha$ confidence interval by -taking the $\alpha/2$ quantiles. Invoke the correspond python function -yields our bootstrap estimates. Unlike `asymptotic`{.interpreted-text -role="func"}, the bounds here are used when estimating the parameters of -each bootstrap samples. An error may be returned if estimation failed -for any of the bootstrap samples. - -::: {.ipython} -In \[1\]: xLBootstrap, xUBootstrap, setX = ci.bootstrap(objSIR, alpha, -xhat, iteration=10, lb=boxBoundsArray\[:,0\], ub=boxBoundsArray\[:,1\], -full_output=True) - -In \[2\]: print(xLBootstrap) - -In \[3\]: print(xUBootstrap) -::: - -The additional information here can be used to compute the bias, tail -effects and test against the normality assumption. If desired, a -simultaneous confidence interval can also be approximated empirically. -Note however that because we are using a semi\--parameter method here, -if the model specification is wrong then the resulting estimates for the -bias is also wrong. The confidence interval still has the normal -approximation guarantee if number of sample is large. - -In this case, because the error in the observation is extremely small, -the confidence interval is narrow. - -::: {.ipython} -In \[1\]: import pylab as P - -In \[2\]: f = plt.figure() - -In \[3\]: n, bins, patches = P.hist(setX\[:,0\], 50) - -In \[4\]: P.xlabel(r\'Estimates of \$beta\$\'); - -In \[5\]: P.ylabel(\'Frequency\'); - -In \[6\]: P.title(\'Estimates under a semi-parametric bootstrap -scheme\'); - -\@savefig bootstrapCIHist.png In \[7\]: P.show() - -In \[8\]: P.close() -::: - -## Comparison Between Methods - -Although we have shown the numerical values for the confidence interval -obtained using different method, it may be hard to comprehend how they -vary. As they say, a picture says a million word, and given that this -particular model only has two parameters, we can obtain inspect and -compare the methods visually via a contour plot. The code to perform -this is shown below but the code block will not be run to save time and -space. - -In the plot above, the bootstrap confidence interval were so close to -the MLE, it is impossible to distinguish the two on such a coarse scale. - -Furthermore, because the geometric confidence interval is the result of -an integration, we can trace the path that lead to the final output that -was shown previously. Again, we are space conscious (and time -constrained) so the code block below will not be run. - -::: {.ipython verbatim=""} -In \[1\]: fig = plt.figure() - -In \[2\]: CS = plt.contour(xi, yi, zi, linewidth=0.5) - -In \[3\]: plt.clabel(CS, fontsize=10, inline=1) - -In \[4\]: l1 = plt.scatter(xLList\[0\]\[:,0\], xLList\[0\]\[:,1\], -marker=\'o\', c=\'m\', s=10); - -In \[5\]: l2 = plt.scatter(xUList\[0\]\[:,0\], xUList\[0\]\[:,1\], -marker=\'x\', c=\'m\', s=10); - -In \[6\]: plt.legend((l1, l2), (\'Lower CI path\', \'Upper CI path\'), -loc=\'upper left\'); - -In \[7\]: plt.ylabel(r\'Estimates of \$gamma\$\'); - -In \[8\]: plt.xlabel(r\'Estimates of \$beta\$\'); - -In \[9\]: plt.title(\'Integration path of the geometric confidence -intervals on the likelihood surface\'); - -In \[10\]: plt.tight_layout(); - -In \[11\]: plt.show() - -In \[12\]: plt.close() -::: - -## Profile Likelihood Surface - -To investigate why it was hard to find the profile likelihood confidence -interval, we can simply look at the surface (which is simply a line as -we are profiling). We find solution of `nuisanceOptim`{.interpreted-text -role="eq"} for each $\boldsymbol{\theta}_{-j}$ at various points of -$\boldsymbol{\theta}$. Equivalently, we can minimize the original loss -function as defined previously, and this is the approach below. We focus -out attention to the parameter $\beta$ of our SIR model. The results are -not shown here but the existence of a solution to -`obj`{.interpreted-text role="eq"} is evident by simply *eyeballing* the -plots. - -::: {.ipython verbatim=""} -In \[1\]: numIter = 100 - -In \[2\]: x2 = numpy.linspace(0.0, 2.0, numIter) - -In \[3\]: funcOut = numpy.linspace(0.0, 2.0, numIter) - -In \[4\]: ode.parameters = \[(\'beta\',0.5), (\'gamma\',1.0/3.0)\] - -In \[5\]: for i in range(numIter): - -: \...: paramEval = \[(\'beta\',x2\[i\]), (\'gamma\',x2\[i\])\] \...: - ode2 = copy.deepcopy(ode) \...: ode2.parameters = paramEval \...: - ode2.initial_values = (x0, t\[0\]) \...: objSIR2 = - NormalLoss(x2\[i\], ode2, x0, t\[0\], t\[1::\], yObv.copy(), - targetState, target_param=\'gamma\') \...: res = - scipy.optimize.minimize(fun=objSIR2.cost, \...: - jac=objSIR2.gradient, \...: x0=x2\[i\], \...: bounds=\[(0,2)\], - \...: method=\'L-BFGS-B\') \...: funcOut\[i\] = res\[\'fun\'\] - -In \[10\]: fig = plt.figure() - -In \[10\]: plt.plot(x2, objSIR.cost(xhat) - funcOut) - -In \[11\]: l1 = plt.axhline(-0.5\*qchisq(1 - alpha, df=1), 0, 2, -color=\'r\') - -In \[12\]: plt.ylabel(r\'\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid -beta)\$\'); - -In \[13\]: plt.xlabel(r\'Fixed value of \$beta\$\'); - -In \[14\]: plt.title(\'Difference in objective function between MLEn and -the maximization of the nuisance parameters given then parameter of -interest, beta in this case\'); - -In \[15\]: plt.tight_layout(); - -In \[16\]: plt.legend((l1,), (r\'\$-0.5mathcal{X}\_{1 - -alpha}\^{2}(1)\$\',), loc=\'lower right\'); - -\@savefig profileLLMaximizerGivenBeta.png In \[17\]: plt.show() \# -\@savefig profileLLMaximizerGivenBeta.png - -In \[18\]: plt.close() -::: - -Both the upper and lower confidence interval can be found in the -profiling procedure, but the part between of -$\beta \in \left[0,\hat{\beta}\right]$ is not convex, with $\hat{\beta}$ -being the MLE. This non\--quadratic profile likelihood is due to the -non-identifiability of the model given data [\[Raue2009\]](). For this -particular case, we can fix it simply by introducing additional -observations in the form of the $I$ state. We encourage the users to try -it out for themselves to confirm. - -::: {.ipython verbatim=""} -In \[1\]: targetState = \[\'I\', \'R\'\] - -In \[2\]: targetStateIndex = -numpy.array(ode.get_state_index(targetState)) - -In \[3\]: y = solution\[1::,targetStateIndex\] + numpy.random.normal(0, -0.01, (len(solution\[1::,targetStateIndex\]), 1)) - -In \[4\]: objSIR = NormalLoss(theta, ode, x0, t\[0\], t\[1::\], -y.copy(), targetState) - -In \[5\]: xhat = objSIR.fit(theta, lb=boxBoundsArray\[:,0\], -ub=boxBoundsArray\[:,1\]) - -In \[6\]: for i in range(numIter): - -: \...: paramEval = \[(\'beta\', x2\[i\]), (\'gamma\', x2\[i\])\] - \...: ode2 = copy.deepcopy(ode) \...: ode2.parameters = paramEval - \...: ode2.initial_values = (x0, t\[0\]) \...: objSIR2 = - NormalLoss(x2\[i\], ode2, x0, t\[0\], t\[1::\], y.copy(), - targetState, target_param=\'gamma\') \...: res = - scipy.optimize.minimize(fun=objSIR2.cost, \...: - jac=objSIR2.gradient, \...: x0=x2\[i\], \...: bounds=\[(0,2)\], - \...: method=\'L-BFGS-B\') \...: funcOut\[i\] = res\[\'fun\'\] - -In \[10\]: fig = plt.figure() - -In \[10\]: plt.plot(x2, objSIR.cost(xhat) - funcOut); - -In \[11\]: l1 = plt.axhline(-0.5\*qchisq(1 - alpha, df=1), 0, 2, -color=\'r\') - -In \[12\]: plt.ylabel(r\'\$mathcal{L}(hat{theta}) - mathcal{L}(theta mid -beta)\$\'); - -In \[13\]: plt.xlabel(r\'Fixed value of \$beta\$\'); - -In \[14\]: plt.title(\'Profile likelihood curve for the parameter ofn -interest with more observation\'); - -In \[15\]: plt.tight_layout(); - -In \[16\]: plt.legend((l1,), (r\'\$-0.5mathcal{X}\_{1 - -alpha}\^{2}(1)\$\',), loc=\'lower right\'); - -\@savefig profileLLMaximizerGivenBetaMoreObs.png In \[17\]: plt.show() -\# \@savefig profileLLMaximizerGivenBetaMoreObs.png - -In \[18\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/ref.ipynb b/docs/pygom-doc/mdconvert/doc_to_sort/ref.ipynb deleted file mode 100644 index 41409918..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/ref.ipynb +++ /dev/null @@ -1,103 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# References\n", - "\n", - "Aron1984 \n", - "Seasonality and period-doubling bifurcations in an epidemic model,\n", - "Joan L. Aron and Ira B. Schwartz, Journal of Theoretical Biology, Volume\n", - "110, Issue 4, page 665-679, 1984\n", - "\n", - "Brauer2008 \n", - "Mathematical Epidemiology, Lecture Notes in Mathematics, Fred Brauer,\n", - "Springer 2008\n", - "\n", - "Cao2006 \n", - "Efficient step size selection for the tau-leaping simulation method,\n", - "Yang Cao et el., The Journal of Chemical Physics, Volume 124, Issue 4,\n", - "page 044109, 2006\n", - "\n", - "Finnie2016 \n", - "EpiJSON: A unified data-format for epidemiology, Thomas Finnie et al.,\n", - "Epidemics, Volume 15, page 20-26, 2016\n", - "\n", - "FitzHugh1961 \n", - "Impulses and Physiological States in Theoretical Models of Nerve\n", - "Membrane, Richard FitzHugh, Biophysical Journal, Volume 1, Issue 6, page\n", - "445-466, 1961\n", - "\n", - "Gillespie1977 \n", - "Exact stochastic simulation of coupled chemical reactions, Danial T.\n", - "Gillespie, The Journal of Physical Chemistry, Volume 81, Issue 25, page\n", - "2340-2361, 1977\n", - "\n", - "Girolami2011 \n", - "Riemann manifold Langevin and Hamiltonian Monte Carlo methods, Mark\n", - "Girolami and Ben Calderhead, Journal of the Royal Statistical Society\n", - "Series B, Volume 73, Issue 2, page 123-214, 2011.\n", - "\n", - "Hethcote1973 \n", - "Asymptotic behavior in a deterministic epidemic model, Herbert W.\n", - "Hethcote, Bulletin of Mathematical Biology, Volume 35, page 607-614,\n", - "1973\n", - "\n", - "Legrand2007 \n", - "Understanding the dynamics of Ebola epidemics, J. Legrand et al.\n", - "Epidemiology and Infection, Volume 135, Issue 4, page 610-621, 2007\n", - "\n", - "Lloyd1996 \n", - "Spatial Heterogeneity in Epidemic Models, A.L. Lloyd and R.M. May,\n", - "Journal of Theoretical Biology, Volume 179, Issue 1, page 1-11, 1996\n", - "\n", - "Lorenz1963 \n", - "Deterministic Nonperiodic Flow, Edward N. Lorenz, Journal of the\n", - "Atmospheric Sciences, Volume 20, Issue 2, page 130-141, 1963\n", - "\n", - "Lotka1920 \n", - "Analytical Note on Certain Rhythmic Relations in Organic Systems,\n", - "Alfred J. Lotka, Proceedings of the National Academy of Sciences of the\n", - "United States of America, Volume 7, Issue 7, page 410-415, 1920\n", - "\n", - "Moolgavkar1987 \n", - "Confidence Regions for Parameters of the Proportional Hazards Model: A\n", - "Simulation Study, S.H. Moolgavkar and D.J. Venzon, Scandianvia Journal\n", - "of Statistics, Volume 14, page 43-56, 1987\n", - "\n", - "Press2007 \n", - "Numerical Recipes 3rd Edition: The Art of Scientific Computing, W.H.\n", - "Press et al., Cambridge University Press, 2007\n", - "\n", - "Ramsay2007 \n", - "Parameter estimation for differential equations: a generalized smoothing\n", - "approach, Journal of the Royal Statistical Society Series B, James O.\n", - "Ramsay et al., Volume 69, Issue 5, page 741-796, 2007\n", - "\n", - "Raue2009 \n", - "Structural and Practical Identifiability Analysis of Partially Observed\n", - "Dynamical Models by Exploiting the Profile Likelihood, A. Raue et al.,\n", - "Bioinformatics, Volume 25, Issue 15, page 1923-1929, 2009\n", - "\n", - "Robertson1966 \n", - "The solution of a set of reaction rate equations, H.H. Robertson,\n", - "Academic Press, page 178-182, 1966\n", - "\n", - "Venzon1988 \n", - "A Method for Computing Profile-Likelihood-Based Confidence Intervals,\n", - "D.J. Venzon and S.H. Moolgavkar, Journal of the Royal Statistical\n", - "Society Series C (Applied Statistics), Volume 37, Issue 1, page 87-94,\n", - "1988\n", - "\n", - "vanderpol1926 \n", - "On Relaxed Oscillations, Balthasar van der Pol, The London, Edinburgh,\n", - "and Dublin Philosophical Magazine and Journal of Science, Volume 2,\n", - "Issue 11, page 978-992, 1926" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/stochastic.md b/docs/pygom-doc/mdconvert/doc_to_sort/stochastic.md deleted file mode 100644 index 58bf60b2..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/stochastic.md +++ /dev/null @@ -1,341 +0,0 @@ -# Stochastic representation of ode {#stochastic} - -There are multiple interpretation of stochasticity of a deterministic -ode. We have implemented two of the most common interpretation; when the -parameters are realizations of some underlying distribution, and when we -have a so called chemical master equation where each transition -represent a jump. Again, we use the standard SIR example as previously -seen in ref:[sir]{.title-ref}. - -::: {.ipython} -In \[1\]: from pygom import SimulateOde, Transition, TransitionType - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: import numpy as np - -In \[1\]: x0 = \[1, 1.27e-6, 0\] - -In \[1\]: t = np.linspace(0, 150, 100) - -In \[1\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[1\]: paramList = \[\'beta\', \'gamma\'\] - -In \[1\]: transitionList = \[ - -: \...: Transition(origin=\'S\', destination=\'I\', - equation=\'beta\*S\*I\', transition_type=TransitionType.T), \...: - Transition(origin=\'I\', destination=\'R\', equation=\'gamma\*I\', - transition_type=TransitionType.T) \...: \] - -In \[1\]: odeS = SimulateOde(stateList, paramList, -transition=transitionList) - -In \[1\]: odeS.parameters = \[0.5, 1.0/3.0\] - -In \[1\]: odeS.initial_values = (x0, t\[0\]) - -In \[1\]: solutionReference = odeS.integrate(t\[1::\], -full_output=False) -::: - -## Stochastic Parameter - -In our first scenario, we assume that the parameters follow some -underlying distribution. Given that both $\beta$ and $\gamma$ in our SIR -model has to be non-negative, it seemed natural to use a Gamma -distribution. We make use of the familiar syntax from -[R](http://www.r-project.org/) to define our distribution. -Unfortunately, we have to define it via a tuple, where the first is the -function handle (name) while the second the parameters. Note that the -parameters can be defined as either a dictionary or as the same sequence -as [R](http://www.r-project.org/), which is the shape then the rate in -the Gamma case. - -::: {.ipython} -In \[1\]: from pygom.utilR import rgamma - -In \[1\]: d = dict() - -In \[1\]: d\[\'beta\'\] = (rgamma,{\'shape\':100.0, \'rate\':200.0}) - -In \[1\]: d\[\'gamma\'\] = (rgamma,(100.0, 300.0)) - -In \[1\]: odeS.parameters = d - -In \[1\]: Ymean, Yall = odeS.simulate_param(t\[1::\], 10, -full_output=True) -::: - -Note that a message is printed above where it is trying to connect to an -mpi backend, as our module has the capability to compute in parallel -using the IPython. We have simulated a total of 10 different solutions -using different parameters, the plots can be seen below - -::: {.ipython} -In \[1\]: f, axarr = plt.subplots(1,3) - -In \[1\]: for solution in Yall: - -: \...: axarr\[0\].plot(t, solution\[:,0\]) \...: axarr\[1\].plot(t, - solution\[:,1\]) \...: axarr\[2\].plot(t, solution\[:,2\]) - -\@savefig stochastic_param_all.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -We then see how the expected results, using the sample average of the -simulations - -$$\tilde{x}(T) = \mathbb{E}\left[ \int_{t_{0}}^{T} f(\theta,x,t) dt \right]$$ - -differs from the reference solution - -$$\hat{x}(T) = \int_{t_{0}}^{T} f(\mathbb{E}\left[ \theta \right],x,t) dt$$ - -::: {.ipython} -In \[1\]: f, axarr = plt.subplots(1,3) - -In \[1\]: for i in range(3): axarr\[i\].plot(t, Ymean\[:,i\] - -solutionReference\[:,i\]) - -\@savefig stochastic_param_compare.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -The difference is relatively large especially for the $S$ state. We can -decrease this difference as we increase the number of simulation, and -more sophisticated sampling method for the generation of random -variables can also decrease the difference. - -In addition to using the built-in functions to represent stochasticity, -we can also use standard frozen distributions from scipy. Note that it -must be a frozen distribution as that is the only for the parameters of -the distributions to propagate through the model. - -::: {.ipython} -In \[1\]: import scipy.stats as st - -In \[1\]: d = dict() - -In \[1\]: d\[\'beta\'\] = st.gamma(a=100.0, scale=1.0/200.0) - -In \[1\]: d\[\'gamma\'\] = st.gamma(a=100.0, scale=1.0/300.0) - -In \[1\]: odeS.parameters = d -::: - -Obviously, there may be scenarios where only some of the parameters are -stochastic. Let\'s say that the $\gamma$ parameter is fixed at $1/3$, -then simply replace the distribution information with a scalar. A quick -visual inspection at the resulting plot suggests that the system of ODE -potentially has less variation when compared to the case where both -parameters are stochastic. - -::: {.ipython} -In \[1\]: d\[\'gamma\'\] = 1.0/3.0 - -In \[1\]: odeS.parameters = d - -In \[1\]: YmeanSingle, YallSingle = odeS.simulate_param(t\[1::\], 5, -full_output=True) - -In \[1\]: f, axarr = plt.subplots(1,3) - -In \[1\]: for solution in YallSingle: - -: \...: axarr\[0\].plot(t,solution\[:,0\]) \...: - axarr\[1\].plot(t,solution\[:,1\]) \...: - axarr\[2\].plot(t,solution\[:,2\]) - -\@savefig stochastic_param_single.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -## Continuous Markov Representation - -Another common method of introducing stochasticity into a set of ode is -by assuming each movement in the system is a result of a jump process. -More concretely, the probabilty of a move for transition $j$ is governed -by an exponential distribution such that - -$$\Pr(\text{process $j$ jump within time } \tau) = \lambda_{j} e^{-\lambda_{j} \tau},$$ - -where $\lambda_{j}$ is the rate of transition for process $j$ and $\tau$ -the time elapsed after current time $t$. - -A couple of the commmon implementation for the jump process have been -implemented where two of them are used during a normal simulation; the -first reaction method [\[Gillespie1977\]]() and the $\tau$-Leap method -[\[Cao2006\]](). The two changes interactively depending on the size of -the states. - -::: {.ipython} -In \[1\]: x0 = \[2362206.0, 3.0, 0.0\] - -In \[1\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[1\]: paramList = \[\'beta\', \'gamma\', \'N\'\] - -In \[1\]: transitionList = \[ - -: \...: Transition(origin=\'S\', destination=\'I\', - equation=\'beta\*S\*I/N\', transition_type=TransitionType.T), \...: - Transition(origin=\'I\', destination=\'R\', equation=\'gamma\*I\', - transition_type=TransitionType.T) \...: \] - -In \[1\]: odeS = SimulateOde(stateList, paramList, -transition=transitionList) - -In \[1\]: odeS.parameters = \[0.5, 1.0/3.0, x0\[0\]\] - -In \[1\]: odeS.initial_values = (x0, t\[0\]) - -In \[1\]: solutionReference = odeS.integrate(t\[1::\]) - -In \[1\]: simX, simT = odeS.simulate_jump(t\[1:10\], 10, -full_output=True) - -In \[1\]: f, axarr = plt.subplots(1, 3) - -In \[1\]: for solution in simX: - -: \...: axarr\[0\].plot(t\[:9\], solution\[:,0\]) \...: - axarr\[1\].plot(t\[:9\], solution\[:,1\]) \...: - axarr\[2\].plot(t\[:9\], solution\[:,2\]) - -\@savefig stochastic_process.png In \[1\]: plt.show() - -In \[1\]: plt.close() -::: - -Above, we see ten different simulation, again using the SIR model but -without standardization of the initial conditions. We restrict our time -frame to be only the first 10 time points so that the individual changes -can be seen more clearly above. If we use the same time frame as the one -used previously for the deterministic system (as shown below), the -trajectories are smoothed out and we no longer observe the *jumps*. -Looking at the raw trajectories of the ODE below, it is obvious that the -mean from a jump process is very different to the deterministic -solution. The reason behind this is that the jump process above was able -to fully remove all the initial infected individuals before any new -ones. - -::: {.ipython} -In \[1\]: simX,simT = odeS.simulate_jump(t, 5, full_output=True) - -In \[1\]: simMean = np.mean(simX, axis=0) - -In \[1\]: f, axarr = plt.subplots(1,3) - -In \[1\]: for solution in simX: - -: \...: axarr\[0\].plot(t, solution\[:,0\]) \...: axarr\[1\].plot(t, - solution\[:,1\]) \...: axarr\[2\].plot(t, solution\[:,2\]) - -\@savefig stochastic_process_compare_large_n\_curves.png In \[1\]: -plt.show() - -In \[1\]: plt.close() -::: - -## Repeatable Simulation - -One of the possible use of compartmental models is to generate -forecasts. Although most of the time the requirement would be to have -(at least point-wise) convergence in the limit, reproducibility is also -important. For both types of interpretation explained above, we have -given the package the capability to repeat the simulations by setting a -seed. When the assumption is that the parameters follows some sort of -distribution, we simply set the seed which governs the global state of -the random number generator. - -::: {.ipython} -In \[1\]: x0 = \[2362206.0, 3.0, 0.0\] - -In \[1\]: odeS = SimulateOde(stateList, paramList, -transition=transitionList) - -In \[1\]: d = {\'beta\': st.gamma(a=100.0, scale=1.0/200.0), \'gamma\': -st.gamma(a=100.0, scale=1.0/300.0), \'N\': x0\[0\]} - -In \[1\]: odeS.parameters = d - -In \[1\]: odeS.initial_values = (x0, t\[0\]) - -In \[1\]: Ymean, Yall = odeS.simulate_param(t\[1::\], 10, -full_output=True) - -In \[1\]: np.random.seed(1) - -In \[1\]: Ymean1, Yall1 = odeS.simulate_param(t\[1::\], 10, -full_output=True) - -In \[1\]: np.random.seed(1) - -In \[1\]: Ymean2, Yall2 = odeS.simulate_param(t\[1::\], 10, -full_output=True) - -In \[1\]: sim_diff = \[np.linalg.norm(Yall\[i\] - yi) for i, yi in -enumerate(Yall1)\] - -In \[1\]: sim_diff12 = \[np.linalg.norm(Yall2\[i\] - yi) for i, yi in -enumerate(Yall1)\] - -In \[1\]: print(\"Different in the simulations and the mean: (%s, %s) \" -% (np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean)))) - -In \[1\]: print(\"Different in the simulations and the mean using same -seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 - -Ymean1)))) -::: - -In the alternative interpretation, setting the global seed is -insufficient. Unlike simulation based on the parameters, where we can -pre-generate all the parameter values and send them off to individual -processes in the parallel backend, this is prohibitive here. In a -nutshell, the seed does not propagate when using a parallel backend -because each *integration* requires an unknown number of random samples. -Therefore, we have an additional flag **parallel** in the function -signature. By ensuring that the computation runs in serial, we can make -use of the global seed and generate identical runs. - -::: {.ipython} -In \[1\]: x0 = \[2362206.0, 3.0, 0.0\] - -In \[1\]: odeS = SimulateOde(stateList, paramList, -transition=transitionList) - -In \[1\]: odeS.parameters = \[0.5, 1.0/3.0, x0\[0\]\] - -In \[1\]: odeS.initial_values = (x0, t\[0\]) - -In \[1\]: simX, simT = odeS.simulate_jump(t\[1:10\], 10, parallel=False, -full_output=True) - -In \[1\]: np.random.seed(1) - -In \[1\]: simX1, simT1 = odeS.simulate_jump(t\[1:10\], 10, -parallel=False, full_output=True) - -In \[1\]: np.random.seed(1) - -In \[1\]: simX2, simT2 = odeS.simulate_jump(t\[1:10\], 10, -parallel=False, full_output=True) - -In \[1\]: sim_diff = \[np.linalg.norm(simX\[i\] - x1) for i, x1 in -enumerate(simX1)\] - -In \[1\]: sim_diff12 = \[np.linalg.norm(simX2\[i\] - x1) for i, x1 in -enumerate(simX1)\] - -In \[1\]: print(\"Difference in simulation: %s\" % -np.sum(np.abs(sim_diff))) - -In \[1\]: print(\"Difference in simulation using same seed: %s\" % -np.sum(np.abs(sim_diff12))) -::: diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/transition.md b/docs/pygom-doc/mdconvert/doc_to_sort/transition.md deleted file mode 100644 index b0be6933..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/transition.md +++ /dev/null @@ -1,230 +0,0 @@ -# Transition Object {#transition} - -The most important part of setting up the model is to correctly define -the set odes, which is based solely on the classes defined in -`transition`{.interpreted-text role="mod"}. All transitions that gets -fed into the ode system needs to be defined as a transition object, -`Transition`{.interpreted-text role="class"}. It takes a total of four -input arguments - -1. The origin state -2. Equation that describe the process -3. The type of transition -4. The destination state - -where the first three are mandatory. To demonstrate, we go back to the -SIR model defined previously in the section `sir`{.interpreted-text -role="ref"}. Recall that the set of odes are - -$$\begin{aligned} -\frac{\partial S}{\partial t} &= -\beta SI \\ -\frac{\partial I}{\partial t} &= \beta SI - \gamma I \\ -\frac{\partial R}{\partial t} &= \gamma I. -\end{aligned}$$ - -We can simply define the set of ode, as seen previously, via - -::: {.ipython} -In \[1\]: from pygom import Transition, TransitionType, common_models - -In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', -transition_type=TransitionType.ODE) - -In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - -gamma\*I\', transition_type=TransitionType.ODE) - -In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', -transition_type=TransitionType.ODE) -::: - -Note that we need to state explicitly the type of equation we are -inputting, which is simply of type **ODE** in this case. We can confirm -this has been entered correctly by putting it into -`DeterministicOde`{.interpreted-text role="class"} - -::: {.ipython} -In \[1\]: from pygom import DeterministicOde - -In \[2\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[3\]: paramList = \[\'beta\', \'gamma\'\] - -In \[4\]: model = DeterministicOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) -::: - -and check it - -::: {.ipython} -In \[1\]: model.get_ode_eqn() -::: - -An alternative print function `print_ode`{.interpreted-text role="func"} -is also available which may be more suitable in other situation. The -default prints the formula in a rendered format and another which prints -out the latex format which can be used directly in a latex document. The -latter is useful as it saves typing out the formula twice, once in the -code and another in documents. - -::: {.ipython} -In \[1\]: model.print_ode(False) - -In \[2\]: model.print_ode(True) -::: - -Now we are going to show the different ways of defining the same set of -odes. - -## Defining the equations {#defining-eqn} - -Recognizing that the set of odes defining the SIR model is the result of -two transitions, - -$$\begin{aligned} -S \rightarrow I &= \beta SI \\ -I \rightarrow R &= \gamma I -\end{aligned}$$ - -where $S \rightarrow I$ denotes a transition from state $S$ to state -$I$. Therefore, we can simply define our model by these two transition, -but now these two transition needs to be inputted via the `transition` -argument instead of the `ode` argument. Note that we are initializing -the model using a different class, because the stochastic implementation -has more operation on transitions. - -::: {.ipython} -In \[600\]: from pygom import SimulateOde - -In \[601\]: t1 = Transition(origin=\'S\', destination=\'I\', -equation=\'beta\*S\*I\', transition_type=TransitionType.T) - -In \[602\]: t2 = Transition(origin=\'I\', destination=\'R\', -equation=\'gamma\*I\', transition_type=TransitionType.T) - -In \[603\]: modelTrans = SimulateOde(stateList, - -: \.....: paramList, \.....: transition=\[t1, t2\]) - -In \[604\]: modelTrans.get_ode_eqn() -::: - -We can see that the resulting ode is exactly the same, as expected. The -transition matrix that defines this process can easily be visualized -using graphviz. Because only certain renderer permit the use of sub and -superscript, operators such as $**$ are left as they are in the -equation. - -::: {.ipython} -In \[1\]: import matplotlib.pyplot as plt - -In \[2\]: f = plt.figure() - -In \[3\]: modelTrans.get_transition_matrix() - -\@savefig sir_transition_graph.png In \[4\]: dot = -modelTrans.get_transition_graph() -::: - -If we put in via the wrong argument like below (not run), then an error -will appear. - -::: {.ipython} -In \[1\]: \# modelTrans = DeterministicOde(stateList, paramList, -ode=\[t1, t2\]) -::: - -because `TranstionType`{.interpreted-text role="class"} was defined -explicitly as a transition instead of an ode. The same can be observed -when the wrong `TransitionType`{.interpreted-text role="class"} is used -for any of the input argument. - -This though, only encourages us to define the transitions carefully. We -can also pretend that the set of odes are in fact just a set of birth -process - -::: {.ipython} -In \[619\]: birth1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', -transition_type=TransitionType.B) - -In \[620\]: birth2 = Transition(origin=\'I\', equation=\'beta\*S\*I - -gamma\*I\', transition_type=TransitionType.B) - -In \[621\]: birth3 = Transition(origin=\'R\', equation=\'gamma\*I\', -transition_type=TransitionType.B) - -In \[622\]: modelBirth = DeterministicOde(stateList, - -: \.....: paramList, \.....: birth_death=\[birth1, birth2, birth3\]) - -In \[623\]: modelBirth.get_ode_eqn() -::: - -which will yield the same set result. Alternatively, we can use the -negative of the equation but set it to be a death process. For example, -we multiply the equations for state $S$ and $R$ with a negative sign and -set the transition type to be a death process instead. - -::: {.ipython} -In \[624\]: death1 = Transition(origin=\'S\', equation=\'beta\*S\*I\', -transition_type=TransitionType.D) - -In \[625\]: birth2 = Transition(origin=\'I\', equation=\'beta\*S\*I - -gamma\*I\', transition_type=TransitionType.B) - -In \[626\]: death3 = Transition(origin=\'R\', equation=\'-gamma\*I\', -transition_type=TransitionType.D) - -In \[627\]: modelBD = DeterministicOde(stateList, - -: \.....: paramList, \.....: birth_death=\[death1, birth2, death3\]) - -In \[628\]: modelBD.get_ode_eqn() -::: - -We can see that all the above ways yield the same set of ode at the end. - -## Model Addition - -Because we allow the separation of transitions between states and -birth/death processes, the birth/death processes can be added later on. - -::: {.ipython} -In \[1\]: modelBD2 = modelTrans - -In \[1\]: modelBD2.param_list = paramList + \[\'mu\', \'B\'\] - -In \[1\]: birthDeathList = \[Transition(origin=\'S\', equation=\'B\', transition_type=TransitionType.B), - -: \...: Transition(origin=\'S\', equation=\'mu\*S\', - transition_type=TransitionType.D), \...: Transition(origin=\'I\', - equation=\'mu\*I\', transition_type=TransitionType.D)\] - -In \[1\]: modelBD2.birth_death_list = birthDeathList - -In \[1\]: modelBD2.get_ode_eqn() -::: - -So modeling can be done in stages. Start with a standard closed system -and extend it with additional flows that interact with the environment. - -## Transition type - -There are currently four different type of transitions allowed, which is -defined in an enum class also located in `transition`{.interpreted-text -role="mod"}. The four types are B, D, ODE and T, where they represent -different type of process with explanation in their corresponding value. - -::: {.ipython} -In \[1\]: from pygom import transition - -In \[2\]: for i in transition.TransitionType: - -: \...: print(str(i) + \" = \" + i.value) -::: - -Each birth process are added to the origin state while each death -process are deducted from the state, i.e. added to the state after -multiplying with a negative sign. An ode type is also added to the state -and we forbid the number of input ode to be greater than the number of -state inputted. diff --git a/docs/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb b/docs/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb deleted file mode 100644 index 644be889..00000000 --- a/docs/pygom-doc/mdconvert/doc_to_sort/unrollOde.ipynb +++ /dev/null @@ -1,23 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Convert ODE into transitions\n", - "\n", - "As seen previously in `transition`, we can define the model via the\n", - "transitions or explicitly as ODEs. There are times when we all just want\n", - "to test out some model in a paper and the only available information are\n", - "the ODEs themselves. Even though we know that the ODEs come from some\n", - "underlying transitions, breaking them down can be a time consuming\n", - "process. We provide the functionalities to do this automatically.\n", - "\n", - "unroll/unrollSimple.rst unroll/unrollBD.rst unroll/unrollHard.rst" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/.md b/docs/pygom-doc/mdconvert/mod/.md deleted file mode 100644 index 8c6b1b35..00000000 --- a/docs/pygom-doc/mdconvert/mod/.md +++ /dev/null @@ -1,5 +0,0 @@ -# stochastic - -::: {.automodule members="" noindex=""} -pygom.model.simulate -::: diff --git a/docs/pygom-doc/mdconvert/mod/common_models.ipynb b/docs/pygom-doc/mdconvert/mod/common_models.ipynb deleted file mode 100644 index c16f1f3e..00000000 --- a/docs/pygom-doc/mdconvert/mod/common_models.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# common_models\n", - "\n", - "pygom.model.common_models" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/common_models.md b/docs/pygom-doc/mdconvert/mod/common_models.md deleted file mode 100644 index b65e53b2..00000000 --- a/docs/pygom-doc/mdconvert/mod/common_models.md +++ /dev/null @@ -1,5 +0,0 @@ -# common_models - -::: {.automodule members="" noindex=""} -pygom.model.common_models -::: diff --git a/docs/pygom-doc/mdconvert/mod/confidence_interval.ipynb b/docs/pygom-doc/mdconvert/mod/confidence_interval.ipynb deleted file mode 100644 index ca61c381..00000000 --- a/docs/pygom-doc/mdconvert/mod/confidence_interval.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# loss_type\n", - "\n", - "pygom.loss.loss_type" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/confidence_interval.md b/docs/pygom-doc/mdconvert/mod/confidence_interval.md deleted file mode 100644 index 577e3dd7..00000000 --- a/docs/pygom-doc/mdconvert/mod/confidence_interval.md +++ /dev/null @@ -1,5 +0,0 @@ -# loss_type - -::: {.automodule members="" noindex=""} -pygom.loss.loss_type -::: diff --git a/docs/pygom-doc/mdconvert/mod/deterministic.ipynb b/docs/pygom-doc/mdconvert/mod/deterministic.ipynb deleted file mode 100644 index 6ea2c788..00000000 --- a/docs/pygom-doc/mdconvert/mod/deterministic.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# deterministic\n", - "\n", - "pygom.model.deterministic" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/deterministic.md b/docs/pygom-doc/mdconvert/mod/deterministic.md deleted file mode 100644 index a8e585c4..00000000 --- a/docs/pygom-doc/mdconvert/mod/deterministic.md +++ /dev/null @@ -1,5 +0,0 @@ -# deterministic - -::: {.automodule members="" noindex=""} -pygom.model.deterministic -::: diff --git a/docs/pygom-doc/mdconvert/mod/epi_analysis.ipynb b/docs/pygom-doc/mdconvert/mod/epi_analysis.ipynb deleted file mode 100644 index 265113af..00000000 --- a/docs/pygom-doc/mdconvert/mod/epi_analysis.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# epi_analysis\n", - "\n", - "pygom.model.epi_analysis" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/epi_analysis.md b/docs/pygom-doc/mdconvert/mod/epi_analysis.md deleted file mode 100644 index ef6bd06b..00000000 --- a/docs/pygom-doc/mdconvert/mod/epi_analysis.md +++ /dev/null @@ -1,5 +0,0 @@ -# epi_analysis - -::: {.automodule members="" noindex=""} -pygom.model.epi_analysis -::: diff --git a/docs/pygom-doc/mdconvert/mod/get_init.ipynb b/docs/pygom-doc/mdconvert/mod/get_init.ipynb deleted file mode 100644 index 80dd8a60..00000000 --- a/docs/pygom-doc/mdconvert/mod/get_init.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# get_init\n", - "\n", - "pygom.loss.get_init" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/get_init.md b/docs/pygom-doc/mdconvert/mod/get_init.md deleted file mode 100644 index 87c54755..00000000 --- a/docs/pygom-doc/mdconvert/mod/get_init.md +++ /dev/null @@ -1,5 +0,0 @@ -# get_init - -::: {.automodule members="" noindex=""} -pygom.loss.get_init -::: diff --git a/docs/pygom-doc/mdconvert/mod/index.ipynb b/docs/pygom-doc/mdconvert/mod/index.ipynb deleted file mode 100644 index 156566f3..00000000 --- a/docs/pygom-doc/mdconvert/mod/index.ipynb +++ /dev/null @@ -1,22 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Code documentations\n", - "\n", - "## model\n", - "\n", - "common_models transition deterministic simulate epi_analysis odeutils\n", - "\n", - "## loss\n", - "\n", - "odeloss losstype confidence_interval get_init" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/index.md b/docs/pygom-doc/mdconvert/mod/index.md deleted file mode 100644 index 58e690a2..00000000 --- a/docs/pygom-doc/mdconvert/mod/index.md +++ /dev/null @@ -1,13 +0,0 @@ -# Code documentations {#mod} - -## model - -::: {.toctree} -common_models transition deterministic simulate epi_analysis odeutils -::: - -## loss - -::: {.toctree} -odeloss losstype confidence_interval get_init -::: diff --git a/docs/pygom-doc/mdconvert/mod/losstype.ipynb b/docs/pygom-doc/mdconvert/mod/losstype.ipynb deleted file mode 100644 index 90930726..00000000 --- a/docs/pygom-doc/mdconvert/mod/losstype.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# confidence_interval\n", - "\n", - "pygom.loss.confidence_interval" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/losstype.md b/docs/pygom-doc/mdconvert/mod/losstype.md deleted file mode 100644 index 11277a2c..00000000 --- a/docs/pygom-doc/mdconvert/mod/losstype.md +++ /dev/null @@ -1,5 +0,0 @@ -# confidence_interval - -::: {.automodule members="" noindex=""} -pygom.loss.confidence_interval -::: diff --git a/docs/pygom-doc/mdconvert/mod/odeloss.ipynb b/docs/pygom-doc/mdconvert/mod/odeloss.ipynb deleted file mode 100644 index ad8b8e73..00000000 --- a/docs/pygom-doc/mdconvert/mod/odeloss.ipynb +++ /dev/null @@ -1,24 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ode_loss\n", - "\n", - "These are basically the interfaces for `pygom.loss.BaseLoss`\n", - "\n", - "pygom.loss.ode_loss\n", - "\n", - "# calculations\n", - "\n", - "The base class which contains has all the calculation implemented\n", - "\n", - "pygom.loss.base_loss" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/odeloss.md b/docs/pygom-doc/mdconvert/mod/odeloss.md deleted file mode 100644 index 82ac8080..00000000 --- a/docs/pygom-doc/mdconvert/mod/odeloss.md +++ /dev/null @@ -1,16 +0,0 @@ -# ode_loss - -These are basically the interfaces for -`pygom.loss.BaseLoss`{.interpreted-text role="class"} - -::: {.automodule members="" noindex=""} -pygom.loss.ode_loss -::: - -# calculations - -The base class which contains has all the calculation implemented - -::: {.automodule members="" noindex=""} -pygom.loss.base_loss -::: diff --git a/docs/pygom-doc/mdconvert/mod/odeutils.ipynb b/docs/pygom-doc/mdconvert/mod/odeutils.ipynb deleted file mode 100644 index 4e591188..00000000 --- a/docs/pygom-doc/mdconvert/mod/odeutils.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ode_utils\n", - "\n", - "pygom.model.ode_utils" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/odeutils.md b/docs/pygom-doc/mdconvert/mod/odeutils.md deleted file mode 100644 index 192c4502..00000000 --- a/docs/pygom-doc/mdconvert/mod/odeutils.md +++ /dev/null @@ -1,5 +0,0 @@ -# ode_utils - -::: {.automodule members="" noindex=""} -pygom.model.ode_utils -::: diff --git a/docs/pygom-doc/mdconvert/mod/simulate.ipynb b/docs/pygom-doc/mdconvert/mod/simulate.ipynb deleted file mode 100644 index c56782d0..00000000 --- a/docs/pygom-doc/mdconvert/mod/simulate.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# stochastic\n", - "\n", - "pygom.model.simulate" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/simulate.md b/docs/pygom-doc/mdconvert/mod/simulate.md deleted file mode 100644 index 8c6b1b35..00000000 --- a/docs/pygom-doc/mdconvert/mod/simulate.md +++ /dev/null @@ -1,5 +0,0 @@ -# stochastic - -::: {.automodule members="" noindex=""} -pygom.model.simulate -::: diff --git a/docs/pygom-doc/mdconvert/mod/transition.ipynb b/docs/pygom-doc/mdconvert/mod/transition.ipynb deleted file mode 100644 index 0708eba4..00000000 --- a/docs/pygom-doc/mdconvert/mod/transition.ipynb +++ /dev/null @@ -1,16 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# transition\n", - "\n", - "pygom.model.transition" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/mdconvert/mod/transition.md b/docs/pygom-doc/mdconvert/mod/transition.md deleted file mode 100644 index 46920265..00000000 --- a/docs/pygom-doc/mdconvert/mod/transition.md +++ /dev/null @@ -1,5 +0,0 @@ -# transition - -::: {.automodule members="" noindex=""} -pygom.model.transition -::: diff --git a/docs/pygom-doc/mdconvert/unroll/.md b/docs/pygom-doc/mdconvert/unroll/.md deleted file mode 100644 index 07b17497..00000000 --- a/docs/pygom-doc/mdconvert/unroll/.md +++ /dev/null @@ -1,57 +0,0 @@ -# Simple Problem {#unrollSimple} - -For a simple problem, we consider the SIR model defined by - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta SI \\ -\frac{dI}{dt} &= \beta SI - \gamma I \\ -\frac{dR}{dt} &= \gamma I. -\end{aligned}$$ - -which consists of two transitions - -::: {.graphviz} - -digraph SIR_Model { - -: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = - \"βSI\" \]; I -\> R \[ label = \"γI\" \]; - -} -::: - -Let\'s define this using the code block below - -::: {.ipython} -In \[1\]: from pygom import SimulateOde, Transition, TransitionType - -In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', -transition_type=TransitionType.ODE) - -In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - -gamma\*I\', transition_type=TransitionType.ODE) - -In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', -transition_type=TransitionType.ODE) - -In \[6\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[7\]: paramList = \[\'beta\', \'gamma\'\] - -In \[8\]: ode = SimulateOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) - -In \[9\]: ode.get_transition_matrix() -::: - -and the last line shows that the transition matrix is empty. This is the -expected result because `SimulateOdeModel`{.interpreted-text -role="class"} was not initialized using transitions. We populate the -transition matrix below and demonstrate the difference. - -::: {.ipython} -In \[1\]: ode = ode.get_unrolled_obj() - -In \[2\]: ode.get_transition_matrix() -::: diff --git a/docs/pygom-doc/mdconvert/unroll/unrollBD.md b/docs/pygom-doc/mdconvert/unroll/unrollBD.md deleted file mode 100644 index bc808719..00000000 --- a/docs/pygom-doc/mdconvert/unroll/unrollBD.md +++ /dev/null @@ -1,60 +0,0 @@ -# ODE With Birth and Death Process {#unrollBD} - -We follow on from the SIR model of `unrollSimple`{.interpreted-text -role="ref"} but with additional birth and death processes. - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta SI + B - \mu S\\ -\frac{dI}{dt} &= \beta SI - \gamma I - \mu I\\ -\frac{dR}{dt} &= \gamma I. -\end{aligned}$$ - -which consists of two transitions and three birth and death process - -::: {.graphviz} - -digraph SIR_Model { - -: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = - \"βSI\" \]; I -\> R \[ label = \"γI\" \]; B \[height=0 - margin=0 shape=plaintext width=0\]; B -\> S; \"S\**2*μ\" - \[height=0 margin=0 shape=plaintext width=0\]; S -\> \"S\**2*μ\"; - \"I\*μ\" \[height=0 margin=0 shape=plaintext width=0\]; I -\> - \"I\*μ\"; - -} -::: - -Let\'s define this in terms of ODEs, and unroll it back to the -individual processes. - -::: {.ipython} -In \[1\]: from pygom import Transition, TransitionType, SimulateOde, -common_models - -In \[1\]: import matplotlib.pyplot as plt - -In \[1\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[1\]: paramList = \[\'beta\', \'gamma\', \'B\', \'mu\'\] - -In \[1\]: odeList = \[ - -: \...: Transition(origin=\'S\', \...: equation=\'-beta\*S\*I + B - - mu\*S\', \...: transition_type=TransitionType.ODE), \...: - Transition(origin=\'I\', \...: equation=\'beta\*S\*I - gamma\*I - - mu\*I\', \...: transition_type=TransitionType.ODE), \...: - Transition(origin=\'R\', \...: equation=\'gamma\*I\', \...: - transition_type=TransitionType.ODE) \...: \] - -In \[1\]: ode = SimulateOde(stateList, paramList, ode=odeList) - -In \[1\]: ode2 = ode.get_unrolled_obj() - -In \[1\]: f = plt.figure() - -\@savefig sir_unrolled_transition_graph.png In \[1\]: -ode2.get_transition_graph() - -In \[1\]: plt.close() -::: diff --git a/docs/pygom-doc/mdconvert/unroll/unrollHard.md b/docs/pygom-doc/mdconvert/unroll/unrollHard.md deleted file mode 100644 index e02cd29d..00000000 --- a/docs/pygom-doc/mdconvert/unroll/unrollHard.md +++ /dev/null @@ -1,89 +0,0 @@ -# Hard Problem {#unrollHard} - -Now we turn to a harder problem that does not have a one to one mapping -between all the transitions and the terms in the ODEs. We use the model -in `Influenza_SLIARN`{.interpreted-text role="func"}, defined by - -$$\begin{aligned} -\frac{dS}{dt} &= -S \beta (I + \delta A) \\ -\frac{dL}{dt} &= S \beta (I + \delta A) - \kappa L \\ -\frac{dI}{dt} &= p \kappa L - \alpha I \\ -\frac{dA}{dt} &= (1 - p) \kappa L - \eta A \\ -\frac{dR}{dt} &= f \alpha I + \eta A \\ -\frac{dN}{dt} &= -(1 - f) \alpha I. -\end{aligned}$$ - -The outflow of state **L**, $\kappa L$, is composed of two transitions, -one to **I** and the other to **A** but the ode of **L** only reflects -the total flow going out of the state. Same can be said for state **I**, -where the flow $\alpha I$ goes to both **R** and **N**. Graphically, it -is a rather simple process as shown below. - -::: {.graphviz} - -digraph SLIARD_Model { - -: labelloc = \"t\"; label = \"Original transitions\"; rankdir=LR; - size=\"8\" node \[shape = circle\]; S -\> L \[ label = - \"-Sβ(I + δA)/N\" \]; L -\> I \[ label = \"κLp\" - \]; L -\> A \[ label = \"κL(1-p)\" \]; I -\> R \[ label = - \"αIf\" \]; I -\> D \[ label = \"αI(1-f)\" \]; A -\> R - \[ label = \"ηA\" \]; - -} -::: - -We slightly change the model by introducing a new state **D** to convert -it into a closed system. The combination of state **D** and **N** is a -constant, the total population. So we can remove **N** and this new -system consist of six transitions. We define them explicitly as ODEs and -unroll them into transitions. - -::: {.ipython} -In \[1\]: from pygom import SimulateOde, Transition, TransitionType - -In \[1\]: stateList = \[\'S\', \'L\', \'I\', \'A\', \'R\', \'D\'\] - -In \[2\]: paramList = \[\'beta\', \'p\', \'kappa\', \'alpha\', \'f\', -\'delta\', \'epsilon\', \'N\'\] - -In \[3\]: odeList = \[ - -: \...: Transition(origin=\'S\', equation=\'- beta\*S/N\*(I + - delta\*A)\', transition_type=TransitionType.ODE), \...: - Transition(origin=\'L\', equation=\'beta\*S/N\*(I + delta\*A) - - kappa\*L\', transition_type=TransitionType.ODE), \...: - Transition(origin=\'I\', equation=\'p\*kappa\*L - alpha\*I\', - transition_type=TransitionType.ODE), \...: Transition(origin=\'A\', - equation=\'(1 - p)*kappa* L - epsilon\*A\', - transition_type=TransitionType.ODE), \...: Transition(origin=\'R\', - equation=\'f\*alpha\*I + epsilon\*A\', - transition_type=TransitionType.ODE), \...: Transition(origin=\'D\', - equation=\'(1 - f)*alpha*I\', transition_type=TransitionType.ODE) \] - -In \[4\]: ode = SimulateOde(stateList, paramList, ode=odeList) - -In \[5\]: ode.get_transition_matrix() - -In \[6\]: ode2 = ode.get_unrolled_obj() - -In \[7\]: ode2.get_transition_matrix() - -In \[8\]: ode2.get_ode_eqn() -::: - -After unrolling the odes, we have the following transition graph - -::: {.ipython} -\@savefig sir_unrolled_transition_graph_hard.png In \[1\]: -ode2.get_transition_graph() - -In \[2\]: plt.close() - -In \[3\]: print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify()) -\# difference -::: - -which is exactly the same apart from slightly weird arrangement of -symbols in some of the equations. The last line with a value of zero -also reaffirms the result. diff --git a/docs/pygom-doc/mdconvert/unroll/unrollSimple.md b/docs/pygom-doc/mdconvert/unroll/unrollSimple.md deleted file mode 100644 index 07b17497..00000000 --- a/docs/pygom-doc/mdconvert/unroll/unrollSimple.md +++ /dev/null @@ -1,57 +0,0 @@ -# Simple Problem {#unrollSimple} - -For a simple problem, we consider the SIR model defined by - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta SI \\ -\frac{dI}{dt} &= \beta SI - \gamma I \\ -\frac{dR}{dt} &= \gamma I. -\end{aligned}$$ - -which consists of two transitions - -::: {.graphviz} - -digraph SIR_Model { - -: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = - \"βSI\" \]; I -\> R \[ label = \"γI\" \]; - -} -::: - -Let\'s define this using the code block below - -::: {.ipython} -In \[1\]: from pygom import SimulateOde, Transition, TransitionType - -In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', -transition_type=TransitionType.ODE) - -In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - -gamma\*I\', transition_type=TransitionType.ODE) - -In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', -transition_type=TransitionType.ODE) - -In \[6\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[7\]: paramList = \[\'beta\', \'gamma\'\] - -In \[8\]: ode = SimulateOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) - -In \[9\]: ode.get_transition_matrix() -::: - -and the last line shows that the transition matrix is empty. This is the -expected result because `SimulateOdeModel`{.interpreted-text -role="class"} was not initialized using transitions. We populate the -transition matrix below and demonstrate the difference. - -::: {.ipython} -In \[1\]: ode = ode.get_unrolled_obj() - -In \[2\]: ode.get_transition_matrix() -::: From 913938b5022a6641efa3152b67413953f96eeb9c Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 31 Aug 2023 10:29:11 +0100 Subject: [PATCH 160/188] correct for documentation --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 416f2bf4..0c363370 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,6 @@ __pycache__ .settings # For built documentation -/docs/pygom-doc/_build -/doc/_build +/docs/pygom-doc/_build/* +/doc/_build/ /doc/source/savefig/* From efa193b1feffe68f7a5524ac72ad3c339a20ae47 Mon Sep 17 00:00:00 2001 From: "Hannah.Williams" Date: Thu, 31 Aug 2023 10:31:23 +0100 Subject: [PATCH 161/188] remove build files --- .../_build/.doctrees/environment.pickle | Bin 71132 -> 0 bytes docs/pygom-doc/_build/.doctrees/intro.doctree | Bin 7263 -> 0 bytes .../_build/.doctrees/markdown.doctree | Bin 12442 -> 0 bytes .../.doctrees/md/getting_started.doctree | Bin 11655 -> 0 bytes .../_build/.doctrees/md/unrollOde.doctree | Bin 4745 -> 0 bytes .../mdconvert/common_models/.doctree | Bin 4036 -> 0 bytes .../.doctrees/mdconvert/doc_to_sort/.doctree | Bin 15721 -> 0 bytes .../_build/.doctrees/mdconvert/mod/.doctree | Bin 2922 -> 0 bytes .../.doctrees/mdconvert/unroll/.doctree | Bin 4733 -> 0 bytes .../.doctrees/notebooks/bvpSimple.doctree | Bin 26612 -> 0 bytes .../_build/.doctrees/notebooks/epi.doctree | Bin 11470 -> 0 bytes .../.doctrees/notebooks/epijson.doctree | Bin 10897 -> 0 bytes .../_build/.doctrees/notebooks/fh.doctree | Bin 20183 -> 0 bytes .../.doctrees/notebooks/gradient.doctree | Bin 61043 -> 0 bytes .../_build/.doctrees/notebooks/sir.doctree | Bin 51431 -> 0 bytes .../.doctrees/notebooks/stochastic.doctree | Bin 46007 -> 0 bytes .../.doctrees/notebooks/transition.doctree | Bin 38578 -> 0 bytes .../notebooks/unroll/unrollBD.doctree | Bin 9251 -> 0 bytes .../notebooks/unroll/unrollHard.doctree | Bin 15088 -> 0 bytes .../notebooks/unroll/unrollSimple.doctree | Bin 8188 -> 0 bytes .../_build/.jupyter_cache/__version__.txt | 1 - .../base.ipynb | 19 - .../pygom-doc/_build/.jupyter_cache/global.db | Bin 32768 -> 0 bytes docs/pygom-doc/_build/html/.buildinfo | 4 - .../sir.ipynb | 868 -- .../transition.ipynb | 453 - ...8745cf0187f817a37553a042c31af498e6c31f.png | Bin 29179 -> 0 bytes ...c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png | Bin 100432 -> 0 bytes ...ac82c80ee47acc51fa9f5f4524d6db35ca6b41.png | Bin 76796 -> 0 bytes ...098459312ca2a16064752fe16688eef9d59794.png | Bin 53891 -> 0 bytes ...b2e125ef46610b644f753350393f6b7570ed19.png | Bin 27752 -> 0 bytes ...6834065460905c685c115099ea1ec6c422183c.png | Bin 44906 -> 0 bytes ...a48ea90ce9767e60c91e5df234ee3786fe52cc.png | Bin 31060 -> 0 bytes ...a201f4793ce35568e2df3fd9897fe93e8c4d57.png | Bin 28430 -> 0 bytes ...73fef42f834bed956be9667b897a3b33cbe9ef.svg | 44 - ...230ce9bfb40c9f05977928aaf8c36881d21523.png | Bin 50942 -> 0 bytes ...302c51ded12a791b68c599cd254c0ea8db65dd.png | Bin 96634 -> 0 bytes ...2205942f9352d2ffcaee47e88de52764a57449.png | Bin 34009 -> 0 bytes ...3827f0322ce73e04fa56be79899e536d192ffe.png | Bin 28637 -> 0 bytes ...3ed17d7a9b3136c85a1aae69c00bc3f813fc49.png | Bin 32819 -> 0 bytes ...4bf026da21420ebaaa2c33c4960b32e1325dcf.png | Bin 87123 -> 0 bytes ...8a3fd307285265d95928863ec35ca238282231.png | Bin 65130 -> 0 bytes ...fda2cf782787c777b79466b814cebf406b6e4b.png | Bin 27643 -> 0 bytes ...2a63506772e03a04c4b1616eab4e0c779b74f2.png | Bin 101436 -> 0 bytes ...be6a7a4160105ee4702528ae9560e29d955782.png | Bin 55659 -> 0 bytes ...e87d6a3feec93d706aef7dff0c1f6a7032cd78.png | Bin 27300 -> 0 bytes ...82f3a46e43faa6c31200c2a2bef1fd514361f4.png | Bin 35085 -> 0 bytes ...6b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png | Bin 34681 -> 0 bytes docs/pygom-doc/_build/html/_sources/intro.md | 24 - .../_build/html/_sources/markdown.md | 55 - .../html/_sources/md/getting_started.md | 73 - .../_build/html/_sources/md/unrollOde.md | 15 - .../html/_sources/mdconvert/common_models/.md | 35 - .../html/_sources/mdconvert/doc_to_sort/.md | 201 - .../_build/html/_sources/mdconvert/mod/.md | 5 - .../_build/html/_sources/mdconvert/unroll/.md | 57 - .../html/_sources/notebooks/bvpSimple.ipynb | 198 - .../_build/html/_sources/notebooks/epi.ipynb | 70 - .../html/_sources/notebooks/epijson.ipynb | 65 - .../_build/html/_sources/notebooks/fh.ipynb | 135 - .../html/_sources/notebooks/gradient.ipynb | 356 - .../_build/html/_sources/notebooks/sir.ipynb | 867 -- .../html/_sources/notebooks/stochastic.ipynb | 617 - .../html/_sources/notebooks/transition.ipynb | 452 - .../_sources/notebooks/unroll/unrollBD.ipynb | 79 - .../notebooks/unroll/unrollHard.ipynb | 90 - .../notebooks/unroll/unrollSimple.ipynb | 61 - ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 - .../html/_sphinx_design_static/design-tabs.js | 27 - .../_sphinx_javascript_frameworks_compat.js | 134 - docs/pygom-doc/_build/html/_static/basic.css | 930 -- .../_build/html/_static/check-solid.svg | 4 - .../_build/html/_static/clipboard.min.js | 7 - .../_build/html/_static/copy-button.svg | 5 - .../_build/html/_static/copybutton.css | 94 - .../_build/html/_static/copybutton.js | 248 - .../_build/html/_static/copybutton_funcs.js | 73 - ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 - .../_build/html/_static/design-tabs.js | 27 - .../pygom-doc/_build/html/_static/doctools.js | 264 - .../html/_static/documentation_options.js | 14 - docs/pygom-doc/_build/html/_static/file.png | Bin 286 -> 0 bytes .../html/_static/images/logo_binder.svg | 19 - .../_build/html/_static/images/logo_colab.png | Bin 7601 -> 0 bytes .../html/_static/images/logo_deepnote.svg | 1 - .../html/_static/images/logo_jupyterhub.svg | 1 - .../_build/html/_static/jquery-3.6.0.js | 10881 ---------------- docs/pygom-doc/_build/html/_static/jquery.js | 2 - .../_build/html/_static/language_data.js | 199 - .../locales/ar/LC_MESSAGES/booktheme.mo | Bin 1541 -> 0 bytes .../locales/ar/LC_MESSAGES/booktheme.po | 75 - .../locales/bg/LC_MESSAGES/booktheme.mo | Bin 1708 -> 0 bytes .../locales/bg/LC_MESSAGES/booktheme.po | 75 - .../locales/bn/LC_MESSAGES/booktheme.mo | Bin 1646 -> 0 bytes .../locales/bn/LC_MESSAGES/booktheme.po | 63 - .../locales/ca/LC_MESSAGES/booktheme.mo | Bin 1246 -> 0 bytes .../locales/ca/LC_MESSAGES/booktheme.po | 66 - .../locales/cs/LC_MESSAGES/booktheme.mo | Bin 1405 -> 0 bytes .../locales/cs/LC_MESSAGES/booktheme.po | 75 - .../locales/da/LC_MESSAGES/booktheme.mo | Bin 1304 -> 0 bytes .../locales/da/LC_MESSAGES/booktheme.po | 75 - .../locales/de/LC_MESSAGES/booktheme.mo | Bin 1388 -> 0 bytes .../locales/de/LC_MESSAGES/booktheme.po | 75 - .../locales/el/LC_MESSAGES/booktheme.mo | Bin 1722 -> 0 bytes .../locales/el/LC_MESSAGES/booktheme.po | 75 - .../locales/eo/LC_MESSAGES/booktheme.mo | Bin 1337 -> 0 bytes .../locales/eo/LC_MESSAGES/booktheme.po | 75 - .../locales/es/LC_MESSAGES/booktheme.mo | Bin 1396 -> 0 bytes .../locales/es/LC_MESSAGES/booktheme.po | 75 - .../locales/et/LC_MESSAGES/booktheme.mo | Bin 1341 -> 0 bytes .../locales/et/LC_MESSAGES/booktheme.po | 75 - .../locales/fi/LC_MESSAGES/booktheme.mo | Bin 1368 -> 0 bytes .../locales/fi/LC_MESSAGES/booktheme.po | 75 - .../locales/fr/LC_MESSAGES/booktheme.mo | Bin 1412 -> 0 bytes .../locales/fr/LC_MESSAGES/booktheme.po | 75 - .../locales/hr/LC_MESSAGES/booktheme.mo | Bin 1402 -> 0 bytes .../locales/hr/LC_MESSAGES/booktheme.po | 75 - .../locales/id/LC_MESSAGES/booktheme.mo | Bin 1323 -> 0 bytes .../locales/id/LC_MESSAGES/booktheme.po | 75 - .../locales/it/LC_MESSAGES/booktheme.mo | Bin 1403 -> 0 bytes .../locales/it/LC_MESSAGES/booktheme.po | 75 - .../locales/iw/LC_MESSAGES/booktheme.mo | Bin 1445 -> 0 bytes .../locales/iw/LC_MESSAGES/booktheme.po | 75 - .../locales/ja/LC_MESSAGES/booktheme.mo | Bin 1471 -> 0 bytes .../locales/ja/LC_MESSAGES/booktheme.po | 75 - .../locales/ko/LC_MESSAGES/booktheme.mo | Bin 1375 -> 0 bytes .../locales/ko/LC_MESSAGES/booktheme.po | 75 - .../locales/lt/LC_MESSAGES/booktheme.mo | Bin 1413 -> 0 bytes .../locales/lt/LC_MESSAGES/booktheme.po | 75 - .../locales/lv/LC_MESSAGES/booktheme.mo | Bin 1404 -> 0 bytes .../locales/lv/LC_MESSAGES/booktheme.po | 75 - .../locales/ml/LC_MESSAGES/booktheme.mo | Bin 1883 -> 0 bytes .../locales/ml/LC_MESSAGES/booktheme.po | 66 - .../locales/mr/LC_MESSAGES/booktheme.mo | Bin 1674 -> 0 bytes .../locales/mr/LC_MESSAGES/booktheme.po | 66 - .../locales/ms/LC_MESSAGES/booktheme.mo | Bin 1213 -> 0 bytes .../locales/ms/LC_MESSAGES/booktheme.po | 66 - .../locales/nl/LC_MESSAGES/booktheme.mo | Bin 1356 -> 0 bytes .../locales/nl/LC_MESSAGES/booktheme.po | 75 - .../locales/no/LC_MESSAGES/booktheme.mo | Bin 1317 -> 0 bytes .../locales/no/LC_MESSAGES/booktheme.po | 75 - .../locales/pl/LC_MESSAGES/booktheme.mo | Bin 1371 -> 0 bytes .../locales/pl/LC_MESSAGES/booktheme.po | 75 - .../locales/pt/LC_MESSAGES/booktheme.mo | Bin 1364 -> 0 bytes .../locales/pt/LC_MESSAGES/booktheme.po | 75 - .../locales/ro/LC_MESSAGES/booktheme.mo | Bin 1390 -> 0 bytes .../locales/ro/LC_MESSAGES/booktheme.po | 75 - .../locales/ru/LC_MESSAGES/booktheme.mo | Bin 1722 -> 0 bytes .../locales/ru/LC_MESSAGES/booktheme.po | 75 - .../locales/sk/LC_MESSAGES/booktheme.mo | Bin 1393 -> 0 bytes .../locales/sk/LC_MESSAGES/booktheme.po | 75 - .../locales/sl/LC_MESSAGES/booktheme.mo | Bin 1374 -> 0 bytes .../locales/sl/LC_MESSAGES/booktheme.po | 75 - .../locales/sr/LC_MESSAGES/booktheme.mo | Bin 1679 -> 0 bytes .../locales/sr/LC_MESSAGES/booktheme.po | 75 - .../locales/sv/LC_MESSAGES/booktheme.mo | Bin 1349 -> 0 bytes .../locales/sv/LC_MESSAGES/booktheme.po | 75 - .../locales/ta/LC_MESSAGES/booktheme.mo | Bin 1928 -> 0 bytes .../locales/ta/LC_MESSAGES/booktheme.po | 66 - .../locales/te/LC_MESSAGES/booktheme.mo | Bin 1806 -> 0 bytes .../locales/te/LC_MESSAGES/booktheme.po | 66 - .../locales/tg/LC_MESSAGES/booktheme.mo | Bin 1628 -> 0 bytes .../locales/tg/LC_MESSAGES/booktheme.po | 75 - .../locales/th/LC_MESSAGES/booktheme.mo | Bin 1766 -> 0 bytes .../locales/th/LC_MESSAGES/booktheme.po | 75 - .../locales/tl/LC_MESSAGES/booktheme.mo | Bin 1273 -> 0 bytes .../locales/tl/LC_MESSAGES/booktheme.po | 66 - .../locales/tr/LC_MESSAGES/booktheme.mo | Bin 1373 -> 0 bytes .../locales/tr/LC_MESSAGES/booktheme.po | 75 - .../locales/uk/LC_MESSAGES/booktheme.mo | Bin 1681 -> 0 bytes .../locales/uk/LC_MESSAGES/booktheme.po | 75 - .../locales/ur/LC_MESSAGES/booktheme.mo | Bin 1462 -> 0 bytes .../locales/ur/LC_MESSAGES/booktheme.po | 66 - .../locales/vi/LC_MESSAGES/booktheme.mo | Bin 1431 -> 0 bytes .../locales/vi/LC_MESSAGES/booktheme.po | 75 - .../locales/zh_CN/LC_MESSAGES/booktheme.mo | Bin 1310 -> 0 bytes .../locales/zh_CN/LC_MESSAGES/booktheme.po | 75 - .../locales/zh_TW/LC_MESSAGES/booktheme.mo | Bin 1341 -> 0 bytes .../locales/zh_TW/LC_MESSAGES/booktheme.po | 75 - docs/pygom-doc/_build/html/_static/logo.png | Bin 9854 -> 0 bytes .../_build/html/_static/logo_pygom.jpg | Bin 9931 -> 0 bytes docs/pygom-doc/_build/html/_static/minus.png | Bin 90 -> 0 bytes ...69c37c29e427902b24a333a5f9fcb2f0b3ac41.css | 2342 ---- docs/pygom-doc/_build/html/_static/plus.png | Bin 90 -> 0 bytes .../_build/html/_static/pygments.css | 152 - .../html/_static/sbt-webpack-macros.html | 11 - .../_build/html/_static/scripts/bootstrap.js | 3 - .../_static/scripts/bootstrap.js.LICENSE.txt | 5 - .../html/_static/scripts/bootstrap.js.map | 1 - .../_static/scripts/pydata-sphinx-theme.js | 2 - .../scripts/pydata-sphinx-theme.js.map | 1 - .../html/_static/scripts/sphinx-book-theme.js | 2 - .../_static/scripts/sphinx-book-theme.js.map | 1 - .../_build/html/_static/searchtools.js | 531 - .../_build/html/_static/sphinx-thebe.css | 129 - .../_build/html/_static/sphinx-thebe.js | 126 - .../_build/html/_static/styles/bootstrap.css | 6 - .../_static/styles/pydata-sphinx-theme.css | 1 - .../html/_static/styles/sphinx-book-theme.css | 8 - .../_build/html/_static/styles/theme.css | 2 - .../_build/html/_static/togglebutton.css | 160 - .../_build/html/_static/togglebutton.js | 187 - .../_build/html/_static/underscore-1.13.1.js | 2042 --- .../_build/html/_static/underscore.js | 6 - .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 - .../vendor/fontawesome/6.1.2/css/all.min.css | 5 - .../6.1.2/webfonts/fa-brands-400.ttf | Bin 181264 -> 0 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 105112 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 60236 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 24028 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 389948 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 154840 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 10084 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 4776 -> 0 bytes .../_build/html/_static/webpack-macros.html | 30 - docs/pygom-doc/_build/html/genindex.html | 398 - docs/pygom-doc/_build/html/index.html | 1 - docs/pygom-doc/_build/html/intro.html | 540 - docs/pygom-doc/_build/html/markdown.html | 557 - .../_build/html/md/getting_started.html | 584 - docs/pygom-doc/_build/html/md/unrollOde.html | 492 - .../_build/html/mdconvert/common_models/.html | 474 - .../_build/html/mdconvert/doc_to_sort/.html | 557 - .../pygom-doc/_build/html/mdconvert/mod/.html | 466 - .../_build/html/mdconvert/unroll/.html | 478 - .../_build/html/notebooks/bvpSimple.html | 633 - docs/pygom-doc/_build/html/notebooks/epi.html | 553 - .../_build/html/notebooks/epijson.html | 520 - docs/pygom-doc/_build/html/notebooks/fh.html | 588 - .../_build/html/notebooks/gradient.html | 795 -- docs/pygom-doc/_build/html/notebooks/sir.html | 977 -- .../_build/html/notebooks/stochastic.html | 941 -- .../_build/html/notebooks/transition.html | 741 -- .../html/notebooks/unroll/unrollBD.html | 520 - .../html/notebooks/unroll/unrollHard.html | 542 - .../html/notebooks/unroll/unrollSimple.html | 516 - docs/pygom-doc/_build/html/objects.inv | Bin 755 -> 0 bytes .../_build/html/reports/notebooks/sir.err.log | 35 - .../html/reports/notebooks/stochastic.err.log | 66 - .../html/reports/notebooks/transition.err.log | 43 - docs/pygom-doc/_build/html/search.html | 410 - docs/pygom-doc/_build/html/searchindex.js | 1 - ...8745cf0187f817a37553a042c31af498e6c31f.png | Bin 29179 -> 0 bytes ...c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png | Bin 100432 -> 0 bytes ...ac82c80ee47acc51fa9f5f4524d6db35ca6b41.png | Bin 76796 -> 0 bytes ...098459312ca2a16064752fe16688eef9d59794.png | Bin 53891 -> 0 bytes ...b2e125ef46610b644f753350393f6b7570ed19.png | Bin 27752 -> 0 bytes ...6834065460905c685c115099ea1ec6c422183c.png | Bin 44906 -> 0 bytes ...a48ea90ce9767e60c91e5df234ee3786fe52cc.png | Bin 31060 -> 0 bytes ...a201f4793ce35568e2df3fd9897fe93e8c4d57.png | Bin 28430 -> 0 bytes ...73fef42f834bed956be9667b897a3b33cbe9ef.svg | 44 - ...230ce9bfb40c9f05977928aaf8c36881d21523.png | Bin 50942 -> 0 bytes ...302c51ded12a791b68c599cd254c0ea8db65dd.png | Bin 96634 -> 0 bytes ...2205942f9352d2ffcaee47e88de52764a57449.png | Bin 34009 -> 0 bytes ...3827f0322ce73e04fa56be79899e536d192ffe.png | Bin 28637 -> 0 bytes ...3ed17d7a9b3136c85a1aae69c00bc3f813fc49.png | Bin 32819 -> 0 bytes ...4bf026da21420ebaaa2c33c4960b32e1325dcf.png | Bin 87123 -> 0 bytes ...8a3fd307285265d95928863ec35ca238282231.png | Bin 65130 -> 0 bytes ...fda2cf782787c777b79466b814cebf406b6e4b.png | Bin 27643 -> 0 bytes ...2a63506772e03a04c4b1616eab4e0c779b74f2.png | Bin 101436 -> 0 bytes ...be6a7a4160105ee4702528ae9560e29d955782.png | Bin 55659 -> 0 bytes ...e87d6a3feec93d706aef7dff0c1f6a7032cd78.png | Bin 27300 -> 0 bytes ...82f3a46e43faa6c31200c2a2bef1fd514361f4.png | Bin 35085 -> 0 bytes ...6b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png | Bin 34681 -> 0 bytes .../jupyter_execute/notebooks/bvpSimple.ipynb | 212 - .../jupyter_execute/notebooks/epi.ipynb | 84 - .../jupyter_execute/notebooks/epijson.ipynb | 79 - .../_build/jupyter_execute/notebooks/fh.ipynb | 149 - .../jupyter_execute/notebooks/gradient.ipynb | 370 - .../jupyter_execute/notebooks/sir.ipynb | 880 -- .../notebooks/stochastic.ipynb | 630 - .../notebooks/transition.ipynb | 510 - .../notebooks/unroll/unrollBD.ipynb | 88 - .../notebooks/unroll/unrollHard.ipynb | 104 - .../notebooks/unroll/unrollSimple.ipynb | 75 - 275 files changed, 42638 deletions(-) delete mode 100644 docs/pygom-doc/_build/.doctrees/environment.pickle delete mode 100644 docs/pygom-doc/_build/.doctrees/intro.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/markdown.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/md/getting_started.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/md/unrollOde.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/common_models/.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/doc_to_sort/.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/mod/.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/mdconvert/unroll/.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/bvpSimple.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/epi.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/epijson.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/fh.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/gradient.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/sir.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/stochastic.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/transition.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollBD.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollHard.doctree delete mode 100644 docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollSimple.doctree delete mode 100644 docs/pygom-doc/_build/.jupyter_cache/__version__.txt delete mode 100644 docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb delete mode 100644 docs/pygom-doc/_build/.jupyter_cache/global.db delete mode 100644 docs/pygom-doc/_build/html/.buildinfo delete mode 100644 docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb delete mode 100644 docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb delete mode 100644 docs/pygom-doc/_build/html/_images/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png delete mode 100644 docs/pygom-doc/_build/html/_images/124c0a87b71e3051b37c4e2b32c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png delete mode 100644 docs/pygom-doc/_build/html/_images/2490b23413b63fce1d9d3fa66eac82c80ee47acc51fa9f5f4524d6db35ca6b41.png delete mode 100644 docs/pygom-doc/_build/html/_images/3977d0899645312aa27d27be07098459312ca2a16064752fe16688eef9d59794.png delete mode 100644 docs/pygom-doc/_build/html/_images/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png delete mode 100644 docs/pygom-doc/_build/html/_images/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png delete mode 100644 docs/pygom-doc/_build/html/_images/5d8f7f60739053c865b0e6582da48ea90ce9767e60c91e5df234ee3786fe52cc.png delete mode 100644 docs/pygom-doc/_build/html/_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png delete mode 100644 docs/pygom-doc/_build/html/_images/7384a8151e54a62cf521fd1fdf73fef42f834bed956be9667b897a3b33cbe9ef.svg delete mode 100644 docs/pygom-doc/_build/html/_images/77d7df2c54dad550496302d8c6230ce9bfb40c9f05977928aaf8c36881d21523.png delete mode 100644 docs/pygom-doc/_build/html/_images/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png delete mode 100644 docs/pygom-doc/_build/html/_images/88643cf1ab842448ada04b3ab82205942f9352d2ffcaee47e88de52764a57449.png delete mode 100644 docs/pygom-doc/_build/html/_images/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png delete mode 100644 docs/pygom-doc/_build/html/_images/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png delete mode 100644 docs/pygom-doc/_build/html/_images/a2b4c66c36cd941577d5e6e1b74bf026da21420ebaaa2c33c4960b32e1325dcf.png delete mode 100644 docs/pygom-doc/_build/html/_images/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png delete mode 100644 docs/pygom-doc/_build/html/_images/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png delete mode 100644 docs/pygom-doc/_build/html/_images/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png delete mode 100644 docs/pygom-doc/_build/html/_images/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png delete mode 100644 docs/pygom-doc/_build/html/_images/c99713862d51a7e54f23602d6de87d6a3feec93d706aef7dff0c1f6a7032cd78.png delete mode 100644 docs/pygom-doc/_build/html/_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png delete mode 100644 docs/pygom-doc/_build/html/_images/edaf46c89c79b126b3212a4b236b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png delete mode 100644 docs/pygom-doc/_build/html/_sources/intro.md delete mode 100644 docs/pygom-doc/_build/html/_sources/markdown.md delete mode 100644 docs/pygom-doc/_build/html/_sources/md/getting_started.md delete mode 100644 docs/pygom-doc/_build/html/_sources/md/unrollOde.md delete mode 100644 docs/pygom-doc/_build/html/_sources/mdconvert/common_models/.md delete mode 100644 docs/pygom-doc/_build/html/_sources/mdconvert/doc_to_sort/.md delete mode 100644 docs/pygom-doc/_build/html/_sources/mdconvert/mod/.md delete mode 100644 docs/pygom-doc/_build/html/_sources/mdconvert/unroll/.md delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/bvpSimple.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/epi.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/epijson.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/fh.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/gradient.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/stochastic.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollBD.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollHard.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollSimple.ipynb delete mode 100644 docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css delete mode 100644 docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js delete mode 100644 docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 docs/pygom-doc/_build/html/_static/basic.css delete mode 100644 docs/pygom-doc/_build/html/_static/check-solid.svg delete mode 100644 docs/pygom-doc/_build/html/_static/clipboard.min.js delete mode 100644 docs/pygom-doc/_build/html/_static/copy-button.svg delete mode 100644 docs/pygom-doc/_build/html/_static/copybutton.css delete mode 100644 docs/pygom-doc/_build/html/_static/copybutton.js delete mode 100644 docs/pygom-doc/_build/html/_static/copybutton_funcs.js delete mode 100644 docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css delete mode 100644 docs/pygom-doc/_build/html/_static/design-tabs.js delete mode 100644 docs/pygom-doc/_build/html/_static/doctools.js delete mode 100644 docs/pygom-doc/_build/html/_static/documentation_options.js delete mode 100644 docs/pygom-doc/_build/html/_static/file.png delete mode 100644 docs/pygom-doc/_build/html/_static/images/logo_binder.svg delete mode 100644 docs/pygom-doc/_build/html/_static/images/logo_colab.png delete mode 100644 docs/pygom-doc/_build/html/_static/images/logo_deepnote.svg delete mode 100644 docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg delete mode 100644 docs/pygom-doc/_build/html/_static/jquery-3.6.0.js delete mode 100644 docs/pygom-doc/_build/html/_static/jquery.js delete mode 100644 docs/pygom-doc/_build/html/_static/language_data.js delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/bn/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/bn/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ca/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ca/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/da/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/da/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/de/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/de/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/el/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/el/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/es/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/es/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/et/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/et/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/hr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/hr/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/id/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/id/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/it/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/it/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ja/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ja/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/no/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/no/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/te/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/te/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/th/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/th/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/uk/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/uk/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/vi/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/vi/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo delete mode 100644 docs/pygom-doc/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po delete mode 100644 docs/pygom-doc/_build/html/_static/logo.png delete mode 100644 docs/pygom-doc/_build/html/_static/logo_pygom.jpg delete mode 100644 docs/pygom-doc/_build/html/_static/minus.png delete mode 100644 docs/pygom-doc/_build/html/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css delete mode 100644 docs/pygom-doc/_build/html/_static/plus.png delete mode 100644 docs/pygom-doc/_build/html/_static/pygments.css delete mode 100644 docs/pygom-doc/_build/html/_static/sbt-webpack-macros.html delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/bootstrap.js delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/pydata-sphinx-theme.js delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/pydata-sphinx-theme.js.map delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/sphinx-book-theme.js delete mode 100644 docs/pygom-doc/_build/html/_static/scripts/sphinx-book-theme.js.map delete mode 100644 docs/pygom-doc/_build/html/_static/searchtools.js delete mode 100644 docs/pygom-doc/_build/html/_static/sphinx-thebe.css delete mode 100644 docs/pygom-doc/_build/html/_static/sphinx-thebe.js delete mode 100644 docs/pygom-doc/_build/html/_static/styles/bootstrap.css delete mode 100644 docs/pygom-doc/_build/html/_static/styles/pydata-sphinx-theme.css delete mode 100644 docs/pygom-doc/_build/html/_static/styles/sphinx-book-theme.css delete mode 100644 docs/pygom-doc/_build/html/_static/styles/theme.css delete mode 100644 docs/pygom-doc/_build/html/_static/togglebutton.css delete mode 100644 docs/pygom-doc/_build/html/_static/togglebutton.js delete mode 100644 docs/pygom-doc/_build/html/_static/underscore-1.13.1.js delete mode 100644 docs/pygom-doc/_build/html/_static/underscore.js delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf delete mode 100644 docs/pygom-doc/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 delete mode 100644 docs/pygom-doc/_build/html/_static/webpack-macros.html delete mode 100644 docs/pygom-doc/_build/html/genindex.html delete mode 100644 docs/pygom-doc/_build/html/index.html delete mode 100644 docs/pygom-doc/_build/html/intro.html delete mode 100644 docs/pygom-doc/_build/html/markdown.html delete mode 100644 docs/pygom-doc/_build/html/md/getting_started.html delete mode 100644 docs/pygom-doc/_build/html/md/unrollOde.html delete mode 100644 docs/pygom-doc/_build/html/mdconvert/common_models/.html delete mode 100644 docs/pygom-doc/_build/html/mdconvert/doc_to_sort/.html delete mode 100644 docs/pygom-doc/_build/html/mdconvert/mod/.html delete mode 100644 docs/pygom-doc/_build/html/mdconvert/unroll/.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/bvpSimple.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/epi.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/epijson.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/fh.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/gradient.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/sir.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/stochastic.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/transition.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/unroll/unrollBD.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/unroll/unrollHard.html delete mode 100644 docs/pygom-doc/_build/html/notebooks/unroll/unrollSimple.html delete mode 100644 docs/pygom-doc/_build/html/objects.inv delete mode 100644 docs/pygom-doc/_build/html/reports/notebooks/sir.err.log delete mode 100644 docs/pygom-doc/_build/html/reports/notebooks/stochastic.err.log delete mode 100644 docs/pygom-doc/_build/html/reports/notebooks/transition.err.log delete mode 100644 docs/pygom-doc/_build/html/search.html delete mode 100644 docs/pygom-doc/_build/html/searchindex.js delete mode 100644 docs/pygom-doc/_build/jupyter_execute/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/124c0a87b71e3051b37c4e2b32c1d35b887cdd13067a7a9ccd93b3cbc3a9f8a5.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/2490b23413b63fce1d9d3fa66eac82c80ee47acc51fa9f5f4524d6db35ca6b41.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/3977d0899645312aa27d27be07098459312ca2a16064752fe16688eef9d59794.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/5d8f7f60739053c865b0e6582da48ea90ce9767e60c91e5df234ee3786fe52cc.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/7384a8151e54a62cf521fd1fdf73fef42f834bed956be9667b897a3b33cbe9ef.svg delete mode 100644 docs/pygom-doc/_build/jupyter_execute/77d7df2c54dad550496302d8c6230ce9bfb40c9f05977928aaf8c36881d21523.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/88643cf1ab842448ada04b3ab82205942f9352d2ffcaee47e88de52764a57449.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/a2b4c66c36cd941577d5e6e1b74bf026da21420ebaaa2c33c4960b32e1325dcf.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/c99713862d51a7e54f23602d6de87d6a3feec93d706aef7dff0c1f6a7032cd78.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/edaf46c89c79b126b3212a4b236b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/bvpSimple.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/epi.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/epijson.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/fh.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/gradient.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/sir.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/stochastic.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/transition.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollBD.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollHard.ipynb delete mode 100644 docs/pygom-doc/_build/jupyter_execute/notebooks/unroll/unrollSimple.ipynb diff --git a/docs/pygom-doc/_build/.doctrees/environment.pickle b/docs/pygom-doc/_build/.doctrees/environment.pickle deleted file mode 100644 index b12d937cde6a2505404bc2292d901110af7b5f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71132 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 DhLp&c diff --git a/docs/pygom-doc/_build/.doctrees/intro.doctree b/docs/pygom-doc/_build/.doctrees/intro.doctree deleted file mode 100644 index fe840c78e12d96bb326c655a9111bef7d5ccbc6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7263 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 diff --git a/docs/pygom-doc/_build/.doctrees/mdconvert/common_models/.doctree b/docs/pygom-doc/_build/.doctrees/mdconvert/common_models/.doctree deleted file mode 100644 index 8e980ca34ac22ab9d0546e77f13ecf45af7b0839..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4036 zcmd5<-EJJW6}Bv|q+LlX$*G$Hm4T_9#7>)CB~F1B2HXO6E@~K20lP_V)@8Ue+#xFt zIVCyzsi7df2oM1TdXed6@A?vbnzng^_6hoNe)cc2fhIQ*un_0W;W<2q-}%m&&pUtp z$Ig}N&+pir3w1iANuqSZZ0R==9Tyo>uKcQe`_JWhdDnLhJ+ZnlF)RHQXvAE|#4uGp zFMU6#J0b0`*}raC?1Wa+?YzU+`1oC`H zilAJ{U-w-y%>rNbYfbQn{+bkum50Tc`W|)8h;iYNw2-7#k=T%s^;lACA;h|)XjZQ_ zk|LiyjA?vi*d*u_e%;YDyejz({>GCPe%t^4(f!d!mKi(x4ONQr;U_{$K{Gr0pt&16 zN`(tQUW`ZiS*o)U4s7e?0LxL9#9AFQ<3_R0GOb94>y>si%#xD-gzxcNe6<+!eSiC9 z>HhljzlDV3-+9@jsNKkKAM!Vl1;*b*=={#}lE01L&+r@IcYv_?dwi!3hu_1tt;S#1 zcade98k+O@dmA3&dftgnSR}PRil~dIiU5qLI(Bq|NTYGUNR$MO)VI3t|KDx1IDQ=t z)W$(y8OH;}0oA2AdKu0^#!|;e^MU+jG-jz#FQ^o$V##@LG%+-Okvuzpk+}2dtq0M= zXaF5Y5neQiMp+R(i$52+A(Yg zPJ@janN%e;IwM2z7GzSrv|&R-TKoRtcR#~iHPU$$qnKBEuXy>3Z+rGx)hzgXb@hj; z*<8Ge*#`epE6kuu+n_4w!7}9!0_6_^0hKh6%U$0`C%E?qdP-1O+TiN@p#tXwED(@C z7{WBEOq0s=%lNHrCv={(dUKq$T65N`z}YkgelPIditopT2`z+78^%^EsT+siu*?C1 zDH`owXfaji1QyZoR8so2kEtxsG1}J4cYyYkDYQAKE9fVHmUVzE>R_{WLty&|kGB(oI%11m>34MD7OiwDE2Y1=^k&Hf|GV$kMrQ|Tx9%^#Sla1#LjV?8;>eGzSZrHT zl@>H*NOuBgU&V0cUo$M$CIO0bfCFv>ka6hO(AX!45$O;K0sT$HY01}opB7G&naE!i zK-6|pWI36l4q2@PRkAQC%rEUc*U zxkD0R=~#w9np3W~)xhuhEd*nMe_Bn5fJ~!CCPLPO(htK5PQd9w2iF^{CAjZROrg_9 z;BzmO6kwxLpiqiTxbnl@JHDT@oFFL-g&0=}+X|8~#o0q;_#biSa(n;a0Af4L&m7lk zs7-oM`Wr#BIsi0@V`vO0x6ou*K6vxppCg}rGl`eX2g%I*TdjFiDh+r&VrD3qn^Znf z^9S5z63)7gj!{AhrkN)j{w4sKk!fvC10Z#uyYRdAOgXS07b(YV!2#ZDp)r+y%Vrc+ z_QwK6ZIP(gs^|KVU_PNuYH!9IqgRZXxh^(jxk@2+9~Gg)hFQKE&>IrC0D5#R)C3r4 zS>bx%30sVp^h6fGD>bc4G0e$Fn6()?c7pmn!x1=R4o+^w&^jV4qe2pVcA$NSY57aP z*L*ktta4Iw+J#?b>Nw2Xexv4+s{ii_l?W7vBaWJsft$eldpH!Jb^<`C|#L_2=zxw|B?dTMi(`n`F%chlYdRb^H{|apoG3?FGl3@%9 zx5fWGolaKXZ5?7Y_4nUP{as?|GLMD7z7T5t1#)>>{(0%~{!@g^Puh)sEzk|Jc#aR9 zAgtH?Gk#`$HwfHWjV`4min4;^q0J^(FhqjoqY*#+_DR9wM(Q>a)LNhqf@AiI}@KG0BR IJ(CRo2WHP4fB*mh diff --git a/docs/pygom-doc/_build/.doctrees/mdconvert/doc_to_sort/.doctree b/docs/pygom-doc/_build/.doctrees/mdconvert/doc_to_sort/.doctree deleted file mode 100644 index e8a3ece1a6fda37b9381aef9c47b226cb01143d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15721 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 diff --git a/docs/pygom-doc/_build/.doctrees/mdconvert/unroll/.doctree b/docs/pygom-doc/_build/.doctrees/mdconvert/unroll/.doctree deleted file mode 100644 index 0fc06d93131f978f33a4e72a2732d5b9ac564943..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4733 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 diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/bvpSimple.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/bvpSimple.doctree deleted file mode 100644 index e57e755cfa6affd099cb05df26861b65b4a860d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26612 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 diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/epi.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/epi.doctree deleted file mode 100644 index b450c5c871550e41c891557ab43d8d3acf3545f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11470 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 Su1B*_!Ge2bhN|hwrS*TPT|D;y diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/fh.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/fh.doctree deleted file mode 100644 index 8fc3a77280fdedd5479678f06bffaf9586ffa073..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20183 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 EUy2bGmjD0& diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/gradient.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/gradient.doctree deleted file mode 100644 index f0a499e03a15da49409dfdf47a0f6cf3baf88c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61043 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 h?-yPATS5e}5ZV%CA42FY6871H~%#AomB8#VL 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 diff --git a/docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollSimple.doctree b/docs/pygom-doc/_build/.doctrees/notebooks/unroll/unrollSimple.doctree deleted file mode 100644 index b9fd15d340c2704c59af72ae13237bcb8d02a0ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8188 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 Q2kn|o2SpZB)4ZkrABSM8NB{r; diff --git a/docs/pygom-doc/_build/.jupyter_cache/__version__.txt b/docs/pygom-doc/_build/.jupyter_cache/__version__.txt deleted file mode 100644 index 7ceb0404..00000000 --- a/docs/pygom-doc/_build/.jupyter_cache/__version__.txt +++ /dev/null @@ -1 +0,0 @@ -0.6.1 \ No newline at end of file diff --git a/docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb b/docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb deleted file mode 100644 index 5406f7e7..00000000 --- a/docs/pygom-doc/_build/.jupyter_cache/executed/241840d0abebeb4f04881fdc9ac5ec6b/base.ipynb +++ /dev/null @@ -1,19 +0,0 @@ -{ - "cells": [], - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file diff --git a/docs/pygom-doc/_build/.jupyter_cache/global.db b/docs/pygom-doc/_build/.jupyter_cache/global.db deleted file mode 100644 index 5768aaa8ebe4368643af719619aac83f42c4e77e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 NYE9fOB!>dY^*_+UNNxZC diff --git a/docs/pygom-doc/_build/html/.buildinfo b/docs/pygom-doc/_build/html/.buildinfo deleted file mode 100644 index 62b8a4eb..00000000 --- a/docs/pygom-doc/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: a30965eb3508cc59ee9dc86536a23dfb -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb b/docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb deleted file mode 100644 index 84796466..00000000 --- a/docs/pygom-doc/_build/html/_downloads/289ac28c9b7c69b5b79db17a12b844bf/sir.ipynb +++ /dev/null @@ -1,868 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Motivating Example: SIR Model\n", - "{download}`this notebook <./sir.ipynb>`\n", - "\n", - "## Defining the model\n", - "\n", - "First, we are going to go through an SIR model to show the functionality\n", - "of the package. The SIR model is defined by the following equations\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dS}{dt} &= -\\beta SI \\\\\n", - "\\frac{dI}{dt} &= \\beta SI- \\gamma I \\\\\n", - "\\frac{dR}{dt} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "We can set this up as follows:" - ] - }, - { - "cell_type": "markdown", - "id": "586834ab", - "metadata": {}, - "source": [ - "1. import the classes required to define the transitions" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "4c80a36a", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import Transition, TransitionType" - ] - }, - { - "cell_type": "markdown", - "id": "0ec4c9d0", - "metadata": {}, - "source": [ - "2. define our states, in this case the population states of **S**usceptible, **I**nfected and **R**emoved" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "3ce016f2", - "metadata": {}, - "outputs": [], - "source": [ - "stateList = ['S', 'I', 'R']" - ] - }, - { - "cell_type": "markdown", - "id": "021a1927", - "metadata": {}, - "source": [ - "3. define the set of parameters for our model, here there are only two" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "441e2287", - "metadata": {}, - "outputs": [], - "source": [ - "paramList = ['beta', 'gamma']" - ] - }, - { - "cell_type": "markdown", - "id": "dfd736b2", - "metadata": {}, - "source": [ - "4. specify the transitions of the modelled states; this will form our ODE system" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "b5f80ab0", - "metadata": {}, - "outputs": [], - "source": [ - "odeList = [\n", - " Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),\n", - " Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),\n", - " Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) \n", - " ]" - ] - }, - { - "cell_type": "markdown", - "id": "21629e7b", - "metadata": {}, - "source": [ - "```{note}\n", - "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "69bfb7c3", - "metadata": {}, - "source": [ - "\n", - "5. import the ode module" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "f78c33d4", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import DeterministicOde" - ] - }, - { - "cell_type": "markdown", - "id": "477d6f84", - "metadata": {}, - "source": [ - "6. initialize the model, which constructs our ODE system from all the information we have provided" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "c9fbcce0", - "metadata": {}, - "outputs": [], - "source": [ - "model = DeterministicOde(stateList, paramList, ode=odeList)" - ] - }, - { - "cell_type": "markdown", - "id": "4bf43064", - "metadata": {}, - "source": [ - "That is all the information required to define a simple SIR model. We can verify the model using" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "6ad54e09", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "143a6871", - "metadata": {}, - "source": [ - "where we can see the equations corresponding to their respective $S,I$ and $R$ state. " - ] - }, - { - "cell_type": "markdown", - "id": "08207474", - "metadata": {}, - "source": [ - "```{note}\n", - "The ordering of the equations is in the standard $S,I,R$ sequence because of how we defined the states initially. \n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "7054e58a", - "metadata": {}, - "source": [ - "We can rearrange the state list," - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "07f81fd1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}I \\gamma\\\\- I S \\beta\\\\I S \\beta - I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ I*gamma],\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma]])" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# now we are going to define in a different order. note that the output ode changed with the input state\n", - "stateList = ['R', 'S', 'I']\n", - "\n", - "model = DeterministicOde(stateList, paramList, ode=odeList)\n", - "\n", - "model.get_ode_eqn()\n" - ] - }, - { - "cell_type": "markdown", - "id": "d3f587d4", - "metadata": {}, - "source": [ - "and find that the set of ODEs comes out in the order that we specified. " - ] - }, - { - "cell_type": "markdown", - "id": "1175c832", - "metadata": {}, - "source": [ - "```{tip}\n", - "In addition to showing the equation form of the ODEs, we can also display them as either symbols or latex code, which can save some extra typing when porting the equations to another document.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "960fdc0c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "⎡dR/dt= I⋅γ ⎤\n", - "⎢ ⎥\n", - "⎢dS/dt= -I⋅S⋅β ⎥\n", - "⎢ ⎥\n", - "⎣dI/dt= I⋅S⋅β - I⋅γ⎦\n" - ] - } - ], - "source": [ - "model.print_ode()" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "93e32c75", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\\begin{array}{cc}dR/dt= & I \\gamma\\\\dS/dt= & - I S \\beta\\\\dI/dt= & I S \\beta - I \\gamma\\end{array}\n" - ] - } - ], - "source": [ - "model.print_ode(True)" - ] - }, - { - "cell_type": "markdown", - "id": "79c154ba", - "metadata": {}, - "source": [ - "#TODO links to unroll\n", - "Here the SIR model was provided to PyGOM as a set ODEs by using the `Transition` to define them. \n", - "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section `unrollOde` for more information, and in particular `unrollSimple` for the continuing demonstration of the SIR model." - ] - }, - { - "cell_type": "markdown", - "id": "51ed6fa2", - "metadata": {}, - "source": [ - "## Extracting model information\n", - "\n", - "We may wish to determine if the set of ODEs are linear. " - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "61684654", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.linear_ode()" - ] - }, - { - "cell_type": "markdown", - "id": "4cf58543", - "metadata": {}, - "source": [ - "Since we know that the SIR model is not linear, we may want to have a look at the Jacobian.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "1c8ff090", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\gamma\\\\0 & - I \\beta & - S \\beta\\\\0 & I \\beta & S \\beta - \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[0, 0, gamma],\n", - "[0, -I*beta, -S*beta],\n", - "[0, I*beta, S*beta - gamma]])" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_jacobian_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "bab79c98", - "metadata": {}, - "source": [ - "Or maybe we want to know the gradient." - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "abb02502", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & I\\\\- I S & 0\\\\I S & - I\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ 0, I],\n", - "[-I*S, 0],\n", - "[ I*S, -I]])" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_grad_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "9d0052ec", - "metadata": {}, - "source": [ - "```{Warning}\n", - "Invoking the functions that compute the derivatives, $f(x)$, `model.ode()` or `model.jacobian()`, will return an error\n", - "\n", - "These functions are used to solve the ODEs numerically, and require values of initial state values, time, and parameter values.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "35abe902", - "metadata": {}, - "source": [ - "For setting initial conditions, the numeric values of the states **must** be set in the same order that list of states appear. We can use the following to check the state ordering, as well as displaying all of the states that we have included." - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "e703c888", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[ODEVariable('R', 'R', None, True),\n", - " ODEVariable('S', 'S', None, True),\n", - " ODEVariable('I', 'I', None, True)]" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.state_list" - ] - }, - { - "cell_type": "markdown", - "id": "54e681d0", - "metadata": {}, - "source": [ - "#TODO unsure if this is needed\n", - "There is currently no mechanism to set the numeric initial conditions the states when the states are defined. This is because of an implementation issue with external package, such as solving an initial value problem." - ] - }, - { - "cell_type": "markdown", - "id": "13bed7f9", - "metadata": {}, - "source": [ - "## Initial value problem\n", - "\n", - "By setting the state initial conditions, time, and parameters, we can evaluate our model." - ] - }, - { - "cell_type": "markdown", - "id": "04fb8dd9", - "metadata": {}, - "source": [ - "1. Define the model parameters. (We can call the parameters to check what we must provide.)" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "46042ebf", - "metadata": {}, - "outputs": [], - "source": [ - "model.parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "9ec016b5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{beta: 0.5, gamma: 0.3333333333333333}" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]\n", - "\n", - "model.parameters = paramEval\n", - "\n", - "model.parameters" - ] - }, - { - "cell_type": "markdown", - "id": "efcdac90", - "metadata": {}, - "source": [ - "2. Provide initial conditions for the states." - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "c43074c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "initialState = [0, 1, 1.27e-6]\n", - " \n", - "model.ode(state=initialState, t=1)" - ] - }, - { - "cell_type": "markdown", - "id": "a8dc4681", - "metadata": {}, - "source": [ - "\n", - "3. Implement an ODE solver.\n", - "\n", - "We are well equipped to solve an initial value problem, using the standard numerical integrator such as `odeint ` from `scipy.integrate`. We also used `matplotlib.pyplot` for plotting and `linspace ` to create the time vector." - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "a14b9901", - "metadata": {}, - "outputs": [], - "source": [ - "import scipy.integrate\n", - "import numpy\n", - "\n", - "t = numpy.linspace(0, 150, 100)\n", - "\n", - "solution = scipy.integrate.odeint(model.ode, initialState, t)" - ] - }, - { - "cell_type": "markdown", - "id": "c4feebae", - "metadata": {}, - "source": [ - "We can plot our solution to observe a standard SIR shape." - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "8303885c", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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KfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyI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s76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", - "text/plain": [ - "

        " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plt.figure()\n", - "\n", - "plt.plot(t, solution[:,0], label='R')\n", - "\n", - "plt.plot(t, solution[:,1], label='S')\n", - "\n", - "plt.plot(t, solution[:,2], label='I')\n", - "\n", - "plt.xlabel('Time')\n", - "\n", - "plt.ylabel('Population proportion')\n", - "\n", - "plt.title('Standard SIR model')\n", - "\n", - "plt.legend(loc=0)\n", - "\n", - "#@savefig sir_plot.png In \n", - "\n", - "plt.show()\n", - "\n", - "#plt.close()\n" - ] - }, - { - "cell_type": "markdown", - "id": "ba849579", - "metadata": {}, - "source": [ - "Alternatively, we can integrate and plot via the **ode** object which we initialized earlier." - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "efddd3a5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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", - "text/plain": [ - "
        " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "model.initial_values = (initialState, t[0])\n", - "\n", - "model.parameters = paramEval\n", - "\n", - "solution = model.integrate(t[1::])\n", - "\n", - "model.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "4dd6e250", - "metadata": {}, - "source": [ - "We could solve the ODEs above using the Jacobian as well. Unfortunately, it does not help because the number of times the Jacobian was evaluated was zero, as expected given that our set of equations are not stiff." - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "7a7a568f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "#TODO what does this show?\n", - "%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "91b7f9d4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "\n", - "%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "3403884c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "\n", - "%timeit solution3, output3 = model.integrate(t, full_output=True)" - ] - }, - { - "cell_type": "markdown", - "id": "b6b9ee47", - "metadata": {}, - "source": [ - "It is important to note that we return our Jacobian as a dense square matrix. Hence, the two argument (mu,ml) for the ODE solver was set to `None` to let it know the output explicitly." - ] - }, - { - "cell_type": "markdown", - "id": "5ca18fa3", - "metadata": {}, - "source": [ - "## Solving the forward sensitivity equation\n", - "\n", - "The sensitivity equations are also solved as an initial value problem. Let us redefine the model in the standard SIR order and we solve it with the sensitivity all set at zero, i.e. we do not wish to infer the initial value of the states." - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "id": "87173626", - "metadata": {}, - "outputs": [], - "source": [ - "stateList = ['S', 'I', 'R']\n", - "\n", - "model = DeterministicOde(stateList, paramList, ode=odeList)\n", - "\n", - "initialState = [1, 1.27e-6, 0]\n", - "\n", - "paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]\n", - "\n", - "model.parameters = paramEval\n", - "\n", - "solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "id": "8b63ba62", - "metadata": { - "tags": [ - "hide-output" - ] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
        " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "{\n", - " \"tags\": [\n", - " \"hide-input\",\n", - " ]\n", - "}\n", - "f,axarr = plt.subplots(3,3);\n", - "\n", - "f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')\n", - "\n", - "axarr[0,0].plot(t, solution[:,0])\n", - "\n", - "axarr[0,0].set_title('S')\n", - "\n", - "axarr[0,1].plot(t, solution[:,1])\n", - "\n", - "axarr[0,1].set_title('I')\n", - "\n", - "axarr[0,2].plot(t, solution[:,2]);\n", - "\n", - "axarr[0,2].set_title('R')\n", - "\n", - "axarr[1,0].plot(t, solution[:,3])\n", - "\n", - "axarr[1,0].set_title(r'state S parameter $beta$')\n", - "\n", - "axarr[2,0].plot(t, solution[:,4])\n", - "\n", - "axarr[2,0].set_title(r'state S parameter $gamma$')\n", - "\n", - "axarr[1,1].plot(t, solution[:,5])\n", - "\n", - "axarr[1,1].set_title(r'state I parameter $beta$')\n", - "\n", - "axarr[2,1].plot(t, solution[:,6])\n", - "\n", - "axarr[2,1].set_title(r'state I parameter $gamma$')\n", - "\n", - "axarr[1,2].plot(t, solution[:,7])\n", - "\n", - "axarr[1,2].set_title(r'state R parameter $beta$')\n", - "\n", - "axarr[2,2].plot(t, solution[:,8])\n", - "\n", - "axarr[2,2].set_title(r'state R parameter $gamma$')\n", - "\n", - "plt.tight_layout()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "2f64d869", - "metadata": {}, - "source": [ - "#TODO links\n", - "This concludes the introductory example and we will be moving on to look at parameter estimation next in {doc}`estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in {doc}`transition`." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.15 ('sphinx-doc')", - "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.9.15" - }, - "vscode": { - "interpreter": { - "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb b/docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb deleted file mode 100644 index dd1568bf..00000000 --- a/docs/pygom-doc/_build/html/_downloads/c78f2e88b6a97c6b5b77ae96e28c2fa2/transition.ipynb +++ /dev/null @@ -1,453 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Transition Object\n", - "{download}`this notebook <./transition.ipynb>`\n", - "\n", - "\n", - "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", - "\n", - "\n", - "All transitions that get fed into the ODE system need to be defined as a transition object, `Transition`. It takes a total of four input arguments:\n", - "\n", - "1. The origin state\n", - "2. Equation that describe the process\n", - "3. The type of transition\n", - "4. The destination state\n", - "\n", - "where the first three are mandatory. To demonstrate, we go back to the SIR model defined previously in the section {doc}`sir`. Recall that the set of ODEs are\n", - "\n", - "$$\\begin{aligned}\n", - " \\frac{d S}{d t} &= - beta SI \\\\\n", - "\\frac{d I}{d t} &= beta SI - \\gamma I \\\\\n", - "\\frac{d R}{d t} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "We can define the set of ODEs, as seen previously, via" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68d41d64", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import Transition, TransitionType, common_models\n", - "\n", - "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", - "\n", - "ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)\n", - "\n", - "ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)" - ] - }, - { - "cell_type": "markdown", - "id": "d393a33a", - "metadata": {}, - "source": [ - "\n", - "Note that we need to state explicitly the type of equation we are\n", - "inputting, which is simply of type **ODE** in this case. We can confirm\n", - "this has been entered correctly by putting it into `DeterministicOde`," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b0801dd", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import DeterministicOde\n", - "\n", - "stateList = ['S', 'I', 'R']\n", - "\n", - "paramList = ['beta', 'gamma']\n", - "\n", - "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])" - ] - }, - { - "cell_type": "markdown", - "id": "6e764826", - "metadata": {}, - "source": [ - "\n", - "and then checking it.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5782a96f", - "metadata": {}, - "outputs": [], - "source": [ - "model.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "c693cbc7", - "metadata": {}, - "source": [ - "Now we are going to show the different ways of defining the same set of\n", - "ODEs.\n" - ] - }, - { - "cell_type": "markdown", - "id": "fa631d9f", - "metadata": {}, - "source": [ - "(transition:defining-the-equations)=\n", - "## Defining the equations\n", - "\n", - "We first recognize that the set of ODEs defining the SIR model are the result of\n", - "two transitions,\n", - "\n", - "$$\\begin{aligned}\n", - "S \\rightarrow I &= \\beta SI \\\\\n", - "I \\rightarrow R &= \\gamma I\n", - "\\end{aligned}$$\n", - "\n", - "where $S \\rightarrow I$ denotes a transition from state $S$ to state\n", - "$I$. Therefore, we can define our model by these two transitions,\n", - "but they need to be passed as the `transition`\n", - "argument instead of the `ode` argument of `DeterministicOde` or `SimulateOde`.\n", - "\n", - "```{note}\n", - "We are initializing the model using the `SimulateOde` class, rather than `DeterministicOde`, because the stochastic implementation has more available operations on transitions.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6966fc5e", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import SimulateOde\n", - "\n", - "t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)\n", - "\n", - "t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", - "\n", - "modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])\n", - "\n", - "modelTrans.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "b896d5c9", - "metadata": {}, - "source": [ - "\n", - "We can see that the resulting ODE is exactly the same, as expected. The\n", - "transition matrix that defines this process can be visualized\n", - "using graphviz. Because only certain renderers permit the use of sub and\n", - "superscript, operators such as $**$ are left as they are in the\n", - "equation." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "1e17eb7c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[0, I*S*beta, 0],\n", - "[0, 0, I*gamma],\n", - "[0, 0, 0]])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "modelTrans.get_transition_matrix()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "570ceed5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nI\n\nI\n\n\n\nS->I\n\n\nβ*S*I\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nγ*I\n\n\n\n", - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "# TODO why are two images produced? issue #75\n", - "modelTrans.get_transition_graph(show=False)" - ] - }, - { - "cell_type": "markdown", - "id": "5d982b87", - "metadata": {}, - "source": [ - "```{warning}\n", - "The execution will error if the incorrect `TransitionType` is used against the wrong argument.\n", - "\n", - "`modelTrans = DeterministicOde(stateList, paramList, ode=[t1, t2])`\n", - "\n", - "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde` is expecting a `TransitionType.ODE` argument.\n", - "\n", - "Similarly `DeterministicOde(stateList, paramList, transition=[ode1, ode2, ode3])` would fail.\n", - "\n", - "This therefore forces us to construct our model carefully.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "d590f4d5", - "metadata": {}, - "source": [ - "The third option is to reframe the system as a set of birth processes, using `transition_type=TransitionType.B`. For this simple example, this formulation takes a similar form to defining using ODE equations.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "9f24cb0a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)\n", - "\n", - "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", - "\n", - "birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)\n", - "\n", - "modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])\n", - "\n", - "modelBirth.get_ode_eqn()\n" - ] - }, - { - "cell_type": "markdown", - "id": "f1d61012", - "metadata": {}, - "source": [ - "Alternatively, we can use the negative of the equation to configure the ODEs to represent death processes. Since the death process is the removal of a flow, we take the negative of the birth process alongside using `transition_type=TransitionType.D`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "9a3b3758", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)\n", - "\n", - "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", - "\n", - "death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)\n", - "\n", - "modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])\n", - "\n", - "modelBD.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "1c8d48b8", - "metadata": {}, - "source": [ - "\n", - "We can see that all four approaches have yielded the same set of ODEs at the end." - ] - }, - { - "cell_type": "markdown", - "id": "23a105af", - "metadata": {}, - "source": [ - "\n", - "## Model Addition\n", - "\n", - "Because we allow the separation of transitions between states and birth/death processes, the birth/death processes can be added later on. The following example takes the model that was defined using transitions (`modelTrans`) and includes a birth process to the $S$ state, and death processes to the $S$ and $I$ states." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "3a6a15ea", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}B - I S \\beta - S \\mu\\\\I S \\beta - I \\gamma - I \\mu\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ B - I*S*beta - S*mu],\n", - "[I*S*beta - I*gamma - I*mu],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "modelBD2 = modelTrans\n", - "\n", - "modelBD2.param_list = paramList + ['mu', 'B']\n", - "\n", - "birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", - " Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), \n", - " Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)\n", - " ]\n", - "\n", - "modelBD2.birth_death_list = birthDeathList\n", - "\n", - "modelBD2.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "076bdc12", - "metadata": {}, - "source": [ - "\n", - "This demonstrates that we can approach our in stages. Start off with a standard closed system using `TransitionType.T`, and then extend it with additional flows that interact with the populations' surrounding environments using `TransitionType.B` or `TransitionType.D`." - ] - }, - { - "cell_type": "markdown", - "id": "ec63c1e1", - "metadata": {}, - "source": [ - "## Transition type summary\n", - "\n", - "In summary, there are four different types of transitions allowed. These are B, D, ODE and T, which are defined in an enum class also located in `transition`." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "ce5787f8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TransitionType.B = Birth process\n", - "TransitionType.D = Death process\n", - "TransitionType.T = Between states\n", - "TransitionType.ODE = ODE _equation\n" - ] - } - ], - "source": [ - "from pygom import transition\n", - "\n", - "for i in transition.TransitionType: \n", - " print(str(i) + \" = \" + i.value)\n" - ] - }, - { - "cell_type": "markdown", - "id": "89607b7d", - "metadata": {}, - "source": [ - "Each birth process is added to the origin state, while each death\n", - "process is deducted from the origin state (alternatively added to the state after\n", - "multiplying the flow with a negative sign). An ODE type is also added to the state, but we forbid the number of input ODEs to be greater than the number of states inputted. These strict definitions should help us to improve the bookeeping of states and flows when we have models of greater complexity." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.15 ('sphinx-doc')", - "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.9.15" - }, - "vscode": { - "interpreter": { - "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/pygom-doc/_build/html/_images/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png b/docs/pygom-doc/_build/html/_images/0bbd9ae219fda3e5af2c2faf5b8745cf0187f817a37553a042c31af498e6c31f.png deleted file mode 100644 index b297fb03cfd1615974fa8520f5be5fdb611c2cf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29179 zcmbTe2{e^`+cv(9Awp&uipso^P_`juOp!5}hmd*RWGYi;l0=ybk&HWY=2?hB*=3#* zwlQO*@4W8kd*Ao_*7LsK`mewBJZrDJz4x_$*Kat_<2;VzyrOPts?t!gQ=w2O8g(@# z9TbWfi$W27r67lY`Tepz8eT4YDI0p}y4rgASbEr?Zd!V|Ik|c{*;}2)+IV={yShlA zrO+3IPv7(Ma`TiC6?Oj451?H=>_qv0vRc7KDBaZVc%o3WmdO8!-YDeTqfqYm)Rh$V zeA8FP{R5J=#}$r7l5^Gl)5L=5EEvY?)QQ(RF7?bPnNsm(}MdQ70auyIyu@ z{9%jSUeDbN_*L;5_gLHqx1yf&IU(t!bEmsJ9Q|DKg||xux14)&A}ws zX_YIzuG2oOU#lE3YkR2}`e|@5L`#03ba|w-D^t$j?QqYXHBRMqgeoKB&gyuK|7z_q z5_0P1`uo2gzjzVdn<6@!q$S_dlPt6`<~blBr^J(uX2lnL`m;Nk5XHbpjLHo9ZGZOM zx#{BSiPoK!(T%;?1R+_O?5XwgtUuH^9ByxGNQ<6@Wn|GYIXSt9Iy&+VOL{a7k3%-OQ9_yMO=wUZ-?p@XBblbziFZ-Vf=fsLoDUAQi@^TYhrLm82(p zNnD%$NWneeYzwom*dEOx&B#|TamE?y}O3Tk)Xt^+9@8;Mn%54?R1NShZ$`W z$tGcI@#pup?~mtpPq|KLH^UBD_%u8mrpg`2$g3J3_Qj!NqQM_`|CjAu8=F@zUtU=} zbCTY>CDt@@@ApVk{F!TyEEWe}mwj`(P8-2LC1U!Xad*s<7E8bfXJ_*;GBH{HJ^HgZ zvD+9Cc(CI=T9X>7W*>qdHz7d|4jHHI|HqSpe7ZpC)1)W=@*pU*`Yqqv|gKaPAJoh(kw$>)i7cG66 z2F~da51iv!bDKAzif%^B$gn@0CF^K!=a*&Isr&ug@2;(FPm_;Bt7p_<)WXR`pBhgz znX(1n>so6oD_`Qo$v5tP;R`1Pg8zBX1AV{Zr{(t2m+qdPkk9v&G&N7`tW7=`nssz^ z+#r+>@Q8@ekcSerMbLJ|b7Exozamj!n50?)nNs30jojhL^IX2n1}|I?0d5%>bkbBrL2Rk-TWNOL-<(gCcIBd?f~f5HwW#G_ zttr8K`RjC-!jXH*>`1Y3#ETc~gz-8SOG``C!=j?1#<&+qV0!Q7DEQT(a%QR}w7a+0 z@d0rhIc!UQ5s{T0@zH8mRTmd@X5h}9+}vCX*rL9(ancs$-~0~cnPbSdx3@D~knwwY zx{zVNeE9+kucofP==I?Gb*dZZb*mFDKRA+|@L!X|J4q2>$B8x_UU(*A{3z>aD_<@s zYi7o(y|c4N`q@(kSkdkN1y0@-ECz0OqaU+o(HcgXdfD@Q&}LGW#m5(ta`LvHvz6Zz z7ACo-h??(giy?O&l4^9YiR7XhKNB;9*Vh!gkh@tE;a<@q}@n;_~gmSefhfaczB)r@dGY_S*;eJ-p7Au^^WMg3WhYyKORsOp!MdnS7LmRcVwR>|(T1YDJTKtuKC@M$E}<jd zzH?MdrA12BQPlCb+WL$s(U--v-zA&=P5!CCF4$C;iaG>y;A5NQ1pf3lRfFr3gRsznk^Zc zSW6>TFLny^qw`9+4#iTK9!F!b)8bbbU%g=`!RVO8eTzQ+#nzTy_?UU&D$Sp(O3k*DBx#o;2 z`5mXFc={AbczCjmcM?R)ewZ(;E0lN6PP;E&r&Xyxp78_j?A=I z`k6=@%LU2Dp?+4dhatE5;>7dpezvoUZUN}#4N+8kc%i~QBykj$HZBd~LZ9%Q2@)tf z@JQ#Ap?&-=lPCSot8pV?`l{A6D%oXXD{l^t0eQG!B!Jvxvj!EjqysLGExl+R}I39hH`j;xo8zWp@j zuO2+PW)(T4W>p$P98@!O)!M?FFdTgdZ;7;VlbuAWcvHe3MIl)sL zt~2qb#centZ`M%-gK6yohQBgT22w?w_e|~Cf)28dZ&K2r1jNb5#LrUB9_zGrQW1WX zuXN_>fO*FR#0o12KakO)pF*k2BBibU~K>XiEq;m-cA<1FZ@?nGWSHMQo4 zL?mVRKJ%C~_%SsdjIW_k1G2xU4T_Dzx&QoB-Rt*h45d{#r2D)3;BUn4hiD8K>< zhqV`NWbFDmAUJUWTB-3`d~&$07)m}3AhYY&fI z{BwcG1d2Ah+e_<{4`c&|PCt))YW>!c2$kE(dWM4d0s}{f+3j>9?)xmI?}zQO%nRFe zoBlA;h&ZP{WlAWXObgMr7r#y$qvvwZgYm1JBqezU`MG>SoaLJG>j)*Kaeg0itUXQz zb>*+GYUoU_^b5vQNiW39a^wq&To)OK|EyvzN5*^-k`tz)pFP$-+i^^V2sN>HAdp_@ zpy#Wkv}Kd$r)rThLru6a%gI*PE7^zNCnmvc8Ww(xx0B|&svkp5{iGX3(Gh7l6)rT z{3?5yNL*!mZSG32Djlit{d*U^*opqi-ic~hc$>@xsPgp9j=UaSTz@R*2!0=ms?Ba# zM1u!&KU;P>N4l(T>EyQZX5W&6NZFVyfkKsSg$_|AJc^XL@WGM5L6lL^xhg1um52Ij z?0hs2v$NbIsk%rAT2qeIc>;20c^HpI#C}$?bG+A!xt8Jr=y>zpm%`h;LPEz?a_BE# zz6{v?@6CkCcQ(gW;yEaDK1brLyRhFX$xxb^vQZJ-L99^kAk{;zdXmg`{Mj|JKmqHN zMQXy^Q^oh*RS8I;D_>jCuC>d$dczA%Gc`JnC+Uk?$5wP zVAkpx0GGF~j@P+w{nV~M-0T%&k2~_abLQ2n*Gx3bs_W;;usHg7x#r*kzoGNa;4zU!wqH#g@FF0#|W>n$Ur?<>|w^5>*Qa{uNAwvKbH>971F zTJHG6!+^7Ve7t;o$40B1e|=k~(4Xgg!QeA2`W;7O;hod5X03xE$Ie~QX2k7GE)bzS z*Eq%&$62&r`rfU#me~=dCg{C-|DIhcjYdE~AY)ZaT|F4``HuMcq{Y0h+Xe>NI2^re zlUO|7aR1r!=Zgbpjul69UBFT%#>bl8WFWz~T3e{1 z4^|$aiBYyUxgO%(c8YSE8MzC(hNu6aP@@XgU(xt;=gt8%&W69CKTJ$aYBz5J+Ak<5 zkd~7d5TKOFIFX~8u}aYbD{Dj;jz zMO9s$(!!2SXeKW9W=Q@wFDR-!)3Vc zeVzg8=M!qRNH211di1so`Uy|U;o=liB#+y{6e;zMyAoDZPUh~m1of0&h80z2(L#J9Lx!pMnMfOg zY;UGXO#`LkyO7~Cw_sA^cE+|pJ*qTdUZ`dv)4$AfLGuvSy93T$vTxK|{ZRr1VaAVw zP$E(GONJafEL3OO{w(x13YDNW_x>bRfVwvM*mnhH)zabVNprnf9OWMfaoa6@&n2|= z^}{=2SlaGhID^5Q!uYH{J$@E#`kpi{FOb-w=cxd`#+}#9Z}D6`ln|^^POMeVqmRU` zJG;ANfB(!eEVreJj)~cr{QGB;Rosdc$|{9vsGYVBmUYWz1j=G8I{VF8@!F*)%u706 zzc>$DuI2%?&-0g4V&1+A91S`V4+6D;&LE>Yeq7to5Wh0=zW3e7RB;js+rFAb&!7d& zWQ$MZFHTqL1ixF$Ce|#cO4huZ81ds477N}c)~XHP@7Hsn*1u>AP>eV-anU3?u5wMM z#{b#7!Q_P1p8iZ1o|kz68`a-j(lSV{k@j(IR!4#y>!q8`KeN`w*^sr$JrqdBu6>$) zMBzlDpNK=6k$c_~XRXM?n~ciCQr_J74%W7pUoKVU)LXi2AK-^$gE_~C7eKErg&ZI{v&qOtUL z%R;=uN49-nz5Djurp;=AVP( zs%!5{SIUdibm5Ezmp4-U@#-gEJ9ikeE$dSg-l+b)e49p_6riN{x8~>k ztV*Za#CXoJqud@Z6Cw}aRz*Y`Qu=?}Cnv!yeeN>XBeAH84@s-&*X)sJNPM8?NN5~u z(`+5*3kVJ7^wwZhzVC{!dn8eoGv%%E-dbybVPuJki&Fbu!HQ*;p}G}g8sh;Z@ujcH zr#{vgj1Xt2G|v^0Lav^}eYS@cN{2gB_#%ZNuFA}_n&r8~w0s-UzApVKsihgJ~8KY9ru<=IN(+`EN_P<6`uM)wPpACP~cVJOuENb00qP`wYib@w= zIKilNG&oek@PsudN7^A!;sAdiLe$bT4!k@2Gd&A0KVei!IqxQ4tuIgZ!A#UnEGGmo zSSr(D$;z4I3llFGQgOUYQ!*Hyze%GRTVhP7X6u_?y{3^`_-Z}u0|P{o_Z7xqMfJp= zEY7$5E-3{{34Z+CyV@>UC3|KwMaF(1Dw7yveefsF#BMzrLiP zEIZG(gz;#;L5|Bw{0B0|KKy+en2g+ajbzC*%=btwo_e-iPGqNET)20?wK=|f7s?t7 zmOLhlPupY1^^NSh3JljQEmSi&JZ+aBZN*#-Yh3WTqts$sCSmQ<*i*Ew7CEdX_$czi z*rCkHwr6~1UCr?_iNtj{6LVF;wgN+*zxHmn1Q#iq<6h~}Hu^=?Vr4m+x!c~>P)YVs zt7A1g45Y3yev^plPWdi@9lzavJ$IZB_JJH185W3W6$1li;GR7^Jjwu{b0wHI1<8>r z{`8VykK>|E4bWKX8)%LnJ})GGGGq#$^6q_NT0FzPPL6~%%f|x4CQnS+X#IVO=;-LO zyB|(+$aqoAcE()`3X&HT67mnYapMMcPjBzM@tr$&vdC{XYEKRVbdJ9{_`1zg3Un|Sh+uUzFc7pIs)I9$FuOC1}q99>)zL0dJqo)rB)@yr@Rgn%j zZNW($9i877?`_6OFvUB!>sZIiNj*JFWqU_Gei8p}S@`AY&2#tTOkLS91|5DG#=#jt zaJGaVOH4@_IU@Z}oH08KRhBpq(!d1HB&u??EMz?h8d|f)8QwBCpIlUF^!Yy5ZAEQY z6|W~KA)SjL*5~rxz1coTn7{}-l+=BR{iuTW9p4O7j6llUyF>Z zPdwP~HD7P~d(c!ix{`XqhN{G*c5rrA0F730aw-bw?d$WhOPzZqn$A{7FQ5(dZnre~ z*-Lp=qLWjr3`&i|_uTJJnYj1>#2(qJ7nG8gW+}HDP{CrQ@-#D|fr!pFZwlIjWHml( zjd0QL-^=V{f&Db6P5Q)zr_r+Pj2{*lV#Axhg{?KG5tkmVA8X8cFX`V%wf9>bKpi5u zu0K<5bXFYlGI?lA#;Zh@ZZ?c&$CK;o9SrHw=QfK~Vyv_96U23f|I8^Hrok+MlHvTz z++3x`0hj8W++0%Nq|kB^A8p$JQv<8^V?ymieu=cvt?_%|r%~6EE;DH?oxRy%AZ_%C zF!nM%vcB{)+nepi&VG745FVEHvzHfXfL>yT#J=*q5?^LXf?)FfUkh#jM`9N?s!)?Z zLWB^7qYc`0g$G;_CpcTHoBlWhRW`ktpS3el_)`8LyH)#AA{%#0al2Zj6>lruO8qC3 zX$Uu2?v)9q6^h4zIO!Ybt8ZHo+WYUbwcx+9wVYYK`z-m7k7>t}K7{S<`QAtsBl6!} z?fCgQr(sv{%>Y^t^IbvASk)ngjXRiOe!E6*D9qAC>-ro64cef?;UaN1jm&U$#jD2G zOn&1=p^}w#dq6B0e z)12^r^*s@HYL4(r`DnTyjV>-O_FbtQ5xd(>2eMD>Dd`h{FScgyeNillwIL!)9H=pp zB|?4fCypkslHH(MWzs;w!KWr1c8!~wAfV$A;B04U(6&(eC3j+kMBobC(&ms4zz^`! zx;&@sH^WLBUQwJA+SGFrWvh$tx_F`N7Zo{{6m@Bhnm`U%=#-C-`~IJ`2MH|Z0ra%8 z>nL(su2@*8+2CVb&F^e_4`nx}I-l_=HJ*#k=Ezlk{}`9_&X1-jb{nn|CY8pSQi4Hy z+<_6bCYhSRJjAM4=O47Twc&t0%!=1{{*Cd;sxjz|zA3Y|T~vz`-#J1pNoZl+KMV|XZO-?)|L9}GuV4w^D~}sjyC?(aoiG_O z`pY|+d6|N6!&?Lnnp%cTNpg(WtKO?mJ>xj@tr{TFepp_9carzjX9}n_{oZ-ZU#C7L zMU6-!W~Hi@mS=!|m(hRqfUSCASy1Hb#*g{;-=d!x?0n?etcnk3C^6Cfo^Qp5zfVGf zaWFR@Nf;_Sn)!f6gXGc%z|KM{P20fWk#4@`89_m+&||c#8wYOwjU`rXZFF3DWGKC1 z2}jjAXIp7OE27gXf|+G*aT(H3R#(YrUopqJi?hdpZg|Dm_|!i*5CYZWhGA&S!_?GN z&FWix6d~!Abq2kVS4K@%Ecq<|0XXz%1I%&0lWh3?q`JBq!e})uOhyN+(8fj=xApf5 zdx%MUpA&*|hczgS?A_y=OX}kx`A_`Nq{Te!V3_D^$e~EdFcwmeGyb43Hs102^=mTG zhOLwRSqcen-tfz=Ht9oIDcnqP{d$}`Nq*>_JL5TJ_6jtoDA~g} zg7pFuNQ~}zznLq(D}~vU<(7S+43E@XV8XI8I6 zx~Gz}@1Kccml8NZ_5Z8z$8btJf4}%NC8f6-0$ak7@8!3AHU!xA$s_nXqZU3c$|{-G z7A!O9NjGNAc7TJQ=ow0`0ke9uy$9c19kB1wmnKb1Mn=Xe=XVhin<68TEL1W&d%MIW z%6=%%a=JB~Rnmdc?7<)JG3=@Zo`O#jsI=67ut8)q=pUi~yJ}lxN+JbPkKBYJ}KmTFZ{vtcPz5+FJvwEUP&2uZ4lG?d1`Fj$^x~*o-?R(cU7~Knc_3c^7T`kg03@ z=hoDNIVG@+R=}j7P=K7^2c>mQO=;3Tp5OI(3QAS;-3#6atVth+mp5P`+SY=0F;Aa9 zokC>mrlW09M3gA|_CD*yLSt`&!jz=gpIBk~J1+XYf21cUJY1>GfTR6+3{q%`%ap9QvjoN|i)WzFZ|p4bc)F>99A z5}8vBs!NrTF%-JK7nP2ZIabo6ou~AiPHSAh9%4`kUsldP5E2vwr~+&TOz^l2*FP~b zH}`D1oPX75spq84NbTq<>CYN-;WWlwCfLCStAy!fE|wFD7PJ^Dkq_cf_v_0^V1sXz zj#z_e#xEd{xK=*802gM)+h66=C-;HubPR(A?UZ7omv|{{blbN>K50-JheU=9FOs zx+c0_MKW}k;HmCbTqz{xIIWjgLPCi*Pc)LgvmxaFXplaVm&D?dY~QzlRm z&&Q6YtV}f2^#(#Y+#Jg$@m@||R+fW1U_DqmLRAxVDkJCk^KJAl%vvZD>jfH!LzX(7 zXpv`ZaLD0e&bmUv&SQZg-KSp2Tx7*oj#GYW>@3M-tCNRK+?p$iU4#<)3_qHO+OK$4 z%YvyKt7LYjxO8awBE`^qE-N)%oGr7~78|TMWXJmClMp+ULr%NNJnQcL?vJm{EGGG0 z&19|bGzo*(_WoFW&!e$?Mo&0g@N$`TF9T2MV`7ZY*Ab$XVr^FZHYZ%h`{SKU081mp z`x<-8GEhF?tF<>&DC#7)tx$iLP86 zL28vcx{g-L>>V?#aOUaF6PK+QR`rCTqC?*BzA2b)(HVc$Q0FPH_3iO{NWrvZQFYys zAe$ELY|&XV08#Y~m7PTjR5n))t)6nB+{XJLaZ6vkGd8J7{c{WgiE?Rz&{JdxO#K}* z1>)2Mey?+vN$QqVz$`N{<=)xPhX1DgvNoBf?I0xBH1e%mm5&;r)-%H5gW^p78M-(n zvuXPcsL_riu&oE*XlcQc4Yxp!Wo&(tzM}b}s7llL41JpA{D2fp zDJ~d)pCfxK(2u26dd06(8m_poC(&KRsXZzA0i#uuf+NBA_8Y@3oG!4t9cCs}>UbJi zjP7LI$VV{v{O)nuF7nNug;Hu8nGHSdNqHI}wHWrut55aVj6a%Tl>*O;*t_{GP`+$< z7@~^{Y->i7st0FOWSrFIcO1Zrm+>wMm6wmJ*Bmp}SMe15Dun!&ecLa+oig65R=LBQ zVQ_bWUovsOECdY(oICzC=r83w&(xly`9Fxrl;Z7OPb;1~2SGSw)NenuW$>YxwS14mn9n-%bvDPpX$!&uieF+#GgZX~~;QvMB{pnNtIYx-`sEyB_R-prXig#HcWP$w>E-m4fLiD-YCG1!=>Lou%wA8jpjNtCZ>ROahxph8?@#ijk!vAhw;NB4I$ob8~YR zU`9d9A*mXQbfDFD=SH7E)K(o%X2jzzJnQzfwXS9T92q%E~%5{65h@jF4Qm*(^TpMd~vP3A|o|| zt?tc<4hAgqh5P@vVMEMs>t4~Fa&j<17*@NOCM4j#IqiL|ZVbO|9>|2iz@di)uE2vV z3Cdr68*2k)nt;I2k41Kjy&&^F^HSASPoc8%|76I&XI;rr1eX(V-KHFNwj$*p-ubIvnBGb@IrIO zGzJFsTr;dB1jsq@f&|mBmS0>21e*~bmwAnUuS~I*k3b-)@!jCz^80xPF>&CQgEjNp z7Kif1?{+^%CrGeTi?OC^Z%WmfI*DdR+HR00o)v%c&w;v|d;yzzvxAtExQ@95_v@+g z|4^@*#&cixI13=}5rF;fYDCsRtWEJ8msj zX*G&$CqBh#%wVmE+Mq;)TL`A-RXGhw@%i)TzDN5Dp9cqL@;|@5U7;8uR-E&ZIE|6v zeqKR>aWqjz8e@`Os?qT?D|MQ1R!LV^XWqHbsvPchDRd&I2^=)_puggQBQguvP*zAV z2_#jtNV3Y7-|S}xu_myi86BpF*=@ON!NLlKhRxbUL(ObFW*yOqfiyVeGVL?QuomFuRo2k{IQZ879V;mo`nzTGz;BEzj_BI5WFkbQj{~(c1FX5PwJ$-4M)H zN5@l))3E5&bcY!vMj?)>%z#aG#C(H#2y{xTlhkb8(e!lhpL$xkzSe|9&x5uJgOIF z!73!?F{g%{2~G?%221$4fw#-NPabmGq9dBgjLZAyy`{&N$Jeffx>jKpAs0Q0T<*6w zv`)>_TITNdhg~xNI>ij?G2g}4DQ??K`diB*w6t@BkkQBoJmmW5zml`3l++^*8eDlB%_jeYA-&L6V;@Z{Vj{~h5MX=(0@gXfCO z8jL0$JpY{+h)@h9admRs|Ib3K#H=A2B&ZV)_S(4Vn3;bhq+}bxnc5ODKWjsHQ3O_` zaZ&MCX#g>KN~GU?q5S-@;x?=*i<<1>z9ERFi@qq3m)E@N$6dN$>`~#zS!SLYyDWNh z{D-4&xLe|I48(3+X*JNmc{Mb#w}o+SS14`JTag_=98U zCC)+@IEU>}li-5>_@$)e!7iZyoA2fdP&D#fHg1U_WsSB3QpLwUSr#@$c5sj>>;(Z~ zXRiW!t8we{686cW;KvkD7p#o{ivj&MfBZ6mIG#_A+tbq%QI+ekD^C(0Y<}QFq;-zV z9!ia`^Yg7?*Z$*j+qKf`b8;uePFn`LR<$&jxZ+pODygy6k!p6F+~z-{li;au3pG?K zoCOHc#~AoD+y7<8jYi9HOMrdT#Dp4USY|^9X*RR60VgL>HB zu5|YNdF*d4pj|e$NuC7T{b zr?DD(gn~iBC_+ww1in1j7GJOG;4_$F%6HaDXH1%!aJAiAB8D&0kGE3RvJ<_|$jqEw zR#rAz`hOKXCP7CrETVpwE)ah=PV&tm3IY*nmvRIjj?!kFcYbn-Nn==|KwTWJGd47_ zn!6TkS|I^03BF9g-NZ}AAj1)+J_6FPLwMm>6WQtT0z=qTzm8C!N5i)=&0xgMjELcF@_?fpQ6E_wS z1M-~7$XtvhaHX=a2&BVqBa}QT2xgSa=I;Si&uM7xR{Br*K@7OfBcr0fr0O}0>o%~I zWtT^C{X8|q3qPLFNGl!~V1aRmqu@-K@Hq?p!)0pZwo*1@Iv5f;GehrScA>l@A^;G2 zZ@BZ0*CR&nlI17+mtQCXgXD`<9*?~D$jCSVV|)5*U_XdKIvd6msBh4~y`nd4J*}cH za*j5~W{e`AcH1B zYzeZR&6@Ky%cP0^Gp(;@DB(ENW*2<<*4CfqNC1&>H^!SA{Od^s?h^8~vr_38ExOva>JEm0(0MfS!#12JdG63_%uyALt6$SN z_1y^@u6m7e??v&%0A5+bdO;ldkSkv&>>3TLw$Vw_FSv&xZ*DjCA-NoxCXPa@sIiR)f+jKFVgjK+GaOSw_l3k1M{rmC|+xj z6Gn8yK~q@L8C&`%73KL++@+ z5V^95c_RnZW!DrHiBuA};v^lvLPrVl^4H?!oxQrX##0IMzxh?-*u#|pB6Ab`DiKr=9Ty+pnaHcU4%*g?ox%YdqP2nq#g$=U2jr8>NyxuouXA^@fNKRfe=d;DnPp?o92?VEf z+50B}4@?`w)_o zeqw1K`T6-#sJ=|OQ*3N(U}z?vG8C0|pHV^>S^zQt7MqcMS^sBebRzKFaMbIMVQ_Hf2O0BjH%K9ID&)>X#+d9(`V|n5E;Bwno)Pz5%IpbAbzPjiiS_M) z0>f%wJy~$pM811>!BChP(O1A)xH*Ca!W&rb-mJgi*y(sKVfSflEcRdh87Ybx+-i3o z)vSx%yEq}D$hYQh$C83<MGf;ilNKF+fO2)^|EqC|VF>C}`NPOzgjs(E1* zjsBOGRU3c_I=ob2Bx2i_I=zq>K@OP7kr3(k^=vg}!$x0tK+#96OjiIZkpL(op1}DV z9@g8havVWJQ-WC8FZ#us+9HsV{mwFJDed1y02lZ-bp?P~q^)~6JYs5sni}_+>|oH6 z4est%GpCWr?dU~RU~*!gXCkQPe@E_H+qcc`lfld>-MxEuW_A`NcBBbtfAid%Cu6Ja zy$9{YkNwp>7AOI3>I&HZjyz~5Kd&!>x%+4rw-cT`A$_%5)@Q0M|xB)T)6GY0nAR z_7c;&$4{RQuXuXgxwacn`-`;M44Y{I1MkC=HU3Y<-J9OoiNIY`#G@J&6?Merp%x{z zbh`54-ChRo_fWC8&2`fw{YQu*Gn=3=G5cN)?fBCyiPk3*1%@bSh!pe=btDi^09?j- zE$RrH)w6#4_U#f>fGMUX;10pa{n%O@!k616XbhDNOS8wpsEC@AY>q>SLUVGnu|>VQ z7BRCk>e>az<#>i>1mf);U6_0KXjPpiI`DJXiJ$mhz!!y(MTcn&I>^apX zdCY&UA&ATV-i!=p{{B0sGt$!4LmQ|vXz(#hxePk7q3|=8rcN80aYu9Og|t}HSP3}a zJm*u~8MK)k%D>HTQy>uSa;>^J2}b$fEr(ursviG~;XyTrkR2EEUeXgbuA+w4p3_p! z-@{0botVn-nIM|tzw-OrK+q$EUb45hN17cW1-nD(Ds_kr9Y^=9Xa*$XVrW3#^noq= z>irLcNMM}>X0Ir%COx|_Hl<6DtC}?obY8t(8r~A;|AhuUIz_$7HUK7IZ5)IA76K}dCUo5 z7!cR780jl8ybS|5v&h5fJgk^M?}SOrujxd){d*npQ~bd8B0J7|*}(OL=vnolvJh0Q zNK|!4nc!FF`lZ5KBD+!NHmQ)J>4pP4$LkSAI?}9wgj6@xqo}x6Q`pwwbFGvB`Ii_9 z_98nNluY;EM{s_!j00GKoZ44A27KUe8fI}vxUn4anA!TDHQOoG?t)(f0Ra6ZhbUHm zbpk{lPHmQ>ZamJn75R6y9(21ne1Xp$A-lB^m(mKDin=ASt5(oxI(T)B6cG9ET)DDY zp3`isDL_DPMpB)95|>(D8oH zPfYMDZ=Q`t(ccee#8-Y(zOQwI$K#&Y>f};y0sh{CUJ*Yr4Ku(jXy#;k-vY3)RP2%c z%aO}RH?DvAp)~jDXGCmVz9bzgT z2R^Nir9cim4itR&g&W1+Hsa6A-Z*ZZx_13j)Yb3`Npl(iM&2`}1%?GFP$Snq0(3rn z(H$es;~H%ziph4_cN7F8_gGuArj6kx#W_;=SS{A1KYCPKyNSbHla z&)VaBt6E^#7#>t$h-8?xz`p=GM?oJ=`EYtFlt->VYYs^1FGpJW54lX*5o*kfF#o)L zA6ac4*L$LwQ_A6LgM$tcAHM~+>>_?6?_*F*)V9n}@|4c7W3o%wF-~ht)3Yb2bvBel zV2eODVY@FVg%pLZk;`Sj!uUNHJa}GSD`W^g!5%j?w8nI*1;n5hxPiGqux7w=d7AqZ4*;DB`d1@YOFa(@?j~9BL_A{ttJhAv za_853TicJO$mO8$+e9nU%}EyavC>@zX5gLzDOM*t`^)+44?RWqp_DC%#n6Frq&^r)yRbAFNlMdD`(CXZ#3B^;dk>w=kY?B|rjDb^o! z#ykF#o|N%z@!irVd1+Ai)iAZesXly1*nxmGOUpQ)2{L}9WOP+?eFh$CUgDR{?0_cT z#|CFa!_4_g@txm%+x})p9*f0PU*vg0T*s=Q1+3Nxkg|e2c1S5Tr?1021}+liS*2Hf ze>)iBJxrJ#U~zOQL@ z7ETWF!yg8xochmE9+gDT>p89cce;@r7qCM{W8NdCkqHT^0RghmlHlSedmlN3l2}CY z$uPO{`JOhYpgm9Cc^kz&q-c0hRr>U;l?e1UR(wC)lnYG;_8tsl+Mo-Z(|9%o4VOrR z<>s$n+IQ}JTiHM;Vo-&UmThoMFapDlaNIy+eu2v6yQJawPY#~-q1Qol?Or~aE}{i< z@Tz2@wqK;@<*(75Wbjjav3CJFTK)0=a!PvpAA)FgEMU!l@)~#sq1Pn}p|-*H1O9=< zUsDAc!2?ice^{uH&Nh54X0qG+U-qm{?eNrKAiRZES7dOY}WHYeSzKWUMr23aYfnx{s%o zy6k{r%3h`5&PVA2yQ25KHl7s7-{XY$m3h@^%sW<(Ewc1x978O)NfpP!nBVOIL z#AThMUZA>l<=-nI=|IBZYmJQ`X|6NSN%$j(u zpXnQ}bWWj0`I7+^dmeV`E(0yT7vja+Ee5$zWHVagE)& zg+ir5-!ak_j_``U%f;15M=`<$f;h5iR1fG*Nm=>+#_O;uFj-4vC^epD(i%=Jrc?gx z>dX~M9H-+*n470_^6}7hDaEBhQ}Q#kX*6^u@IqSx(&CF)FG8Zhdhx2h-bDUrrF!xa zm}RXKGAe9g~|Q zurW5^84VWD8V;RQN`8Jah^+)5*ZyytHz6~@oaH~H=e0MKz*pDP(*xbJWv-L*Al!DF zk2d&Ae=Ri^eGs%UqYT>g{7#Qh>6SNPSP_Up#Sh~#`p(WG|Fo^Ye%)drX0f+Eoq;x- z!*q&?WK;M5v8p`?Gp`+GeE=d-s-z?HkN%7p=*UM(hgA7MnRsr66V0Eo%Wxun_vcgG zLFsiGf6s(e`)#xegn<;Mil@MXmqy!kuG-ezF1lXk%d=PGk9%iSjFj!}Fs6EVMSAzY zmYBxG#!@RJ$byq0-@5QyF1~ckIkxG4t|d??DEJXsgzLefJK~6{o(#eu&6`kK%)sV5 z3b0o!Xnd}Z3x?o$T@7Ng7AdWdr~&XD*KXdV0sqS*q;VZqJr%5TfcF-l{wvAlS5>Kh z!G>wt$Q2I)WSL@C0K&DjbFTUA+Y9*d)98}X(sK78Oo5=m2YGBZ|L<-8V?e?Rege)a z=?hN4gZLEVF)}T*!Tw@6%~{NRiJ*J!D!99=yUO6| z9bfSP51;|9&){f$nG$l+<2=i@3h=%j$$jpY$TTTJe1kA`w9tBml<>WxO|b|!4o~~A z2Ycon^0n*H;8T}^OcV3vL426s>xB?F=f9nP>cHG=~AKJW%8+Gc^<`U(kp4NxXA zLEB**U)+YSuCA$!8PyVO!F6~n$WCf83I39~Re8+4vP&1Rxap&{*2i=OU0=T2Lhp6r zbGqr>HE!xuoGuYm*Ya>nV6+ko*mDC;Wxo-6=34GvXmMDP|77v3r4EQeWWomi%b+#1 zp>xXzoT-NpAC#=DvR%y{_CTlkRilYKB@31{r^Sv~(*a0V4~K^$Bc#IyO1v9O;uXI zNp*tb(nENt04o0FDz1yGEturkdW6Cu5v&T*0_Xaq`&G#|ahg*F0DyiyprGe&kxTOj z3`kZY4N6n&ScBn5cp8GFq$HwmH15qDM@-7dqa)Vg2^fOgC$DNM0J%wmY4WHRKY}N< zlz|eAXdX!ZLmn65G+ISt-5E=SLRy$%$8|wdFt9S?1^18O@gq$4<65%6)-H#h{3i3V z;TM=XGlATt0>6}cQ6!C^gk8UqzCIJPs2Md_u?YkMnnfrs?@z;RTif&Uds8H`e-D2l z93Y~&lO1QC3TH99wRA3w0U`{(z|QN0H$8OIe+DM9(!9wq)*8&330~>GPt$##cS&EQi4XWlo%ayk=#cb{)FAG z6MY7Sm3cB@B3`x}9c)UM^p5O9`lEB3g>(1dY=R9^rsSA~MVEJpDds;C!&O3uZKZLVSo#TX;8AbET1)q1vC^6`^ez8lG*V zaMdB4ZwT3qf2K*_`<~BLaNja_!KBB74?p;mnFbYfYKz>f#62wFg;{_5#WqD_;0}}# z5A6H!+7y(C1V?Z2$o_vdb{1e+t=qnzGy>A{Asr$hQi6ztbcr;ABBdyjf|Al9At@zD zDj}hih%|zvMZ<>+kQV9gI%BT2@45G$z1QA{$MxvrlF9t$d}EAv{Qti}0Lf@v4Sa7BXJ(HcgO@uH+vUM6fOf$I;uQ+~#oQwA=MWpiXdvTq- zmISrc$mCcEq^CG4%51xRR(qBK1kHu2)%0Z$ee5Rt?Upi2FE-?mnzm_NSl;dy7?+!%uX(oqhkog&KQ(Jzo0r`UJi`03K9;kit zX6nUF7=fM6h4lTz38X#L4d2z!VdY>x6z1f);(M)8s@Ag)J4i_ZY*Ho5myY<6&Fs2O zE607}JaHbq^LUTv1G|(l$D7g72x4s6>Zf01Brr&tdeQZ8a<{br9l-HVVM(G*d@)v8 zVqA2))vphHhgCERSCLJP1h6mOT4KJF{ z;_+?vgaVSW2q+ynPrI5|03{1WUZHXi=iihNiG_eKUEjdK)zb^IBGd_UY1E4b4llh~ zgj~K2mWD9L^z4Cx5~`dFy102920d56=%zUVm-;uVeQtn+nL!ZaKJk>>TnPWCppsB5 z47yM*-E`yA;P%ij@QySYGjSr6===x_8#MOXl~>!Yh9ntFzrB301ueycrw>Q=GycmiZ}5N6>A+74Kix3Q&Gp{r-}|ojV-( zat%<_@)F-0;|jau*(!j9bK}d&K3`|5)wVZq7xiandvgc#|M=Q+LTH7~F&cH*(7fs; zwsVuGMF`I*%D$oMx?BDkBfBQx2E~_uLsj@@DY8_%u2~BK!jZ>mh_tIt4t!`Ba>>l{ ze+t{%l!19-d^~=k0pwv}n%jo@`tIdIpUj2W&YpeU8_6Vq6@TY4`*0k}K~R@ggad~M z`d&o^V1>?$tFf*5dtpz4*Edv*1NoMlk&&Va$Yz^^LkR2?4&Ex>Z(Rc8i(iU=8k7ei zXw}x$cePi3G5Y$I0 zLy5(z!M1&Y5IBu#H56zxn0nbs2nuG`fJ4V;@Ye5#oiY?q5%aBuAE=86Vqv6B?eRqO ziQP#szf1sH1}c=FASJ5X(UlL3FO5siq>fo5b+j6-9j2(F=A)Gov)W$?H%#? z?%JM_V|WX0c#e00w0_uL_K{=HfQdiP*UP6oOOy3V{fPcXxu})-m%3jI-?YZ{3xh98YryhnkYWO3A)MQ`=KqR}=6a1*wE5@YybW(RdD80f1hG`7(`9_T8uK2@ zvadr=g)J}#=rx&q8&C_*P$HHp=7Mf!Br!#A=68V!>Xd8`6BHZ=spd&Wu`y5?CCT{u zB$kha)A7efn?VSU9x|Y5RA0WH`*eaKDlvkC`Y&xjCqtP*YYZzOf1ZRtnJ#`VAZ!#m zMT-1oT7GvS&EG_bx7gPIJ4kiy^Q!mrN>uiC#Y77)rq59{1bI8QhRDf0HA3~+&+I4btWkhp65Gpk# z30q8A0BJD_5GRwMh{8vtR-0*1(CPy)t1|xgdq*TzmQH;SJN1sl8(r<=!Ol}pQ zcP6te-c$AtzUabjOrKQ#2BYvD`~kq;-Eycq1@-kCFp6GZdl3Lc4W`5W?d2`uS4N+6 zpN#W%i~E$bzXUQ~N?=IBmS!uhU`2zCJP*u{hob;QtMvw^zqjU+txy|+E4_3SIq0mV) z;DbnC2_9PC?QGXqY4yX<>5^J&xOt=skHwwPZC$dv$7#3K_45x1qA6qOg2*k+F&nj| z;p#VT(6>gjMuV?+%l%rO!5Z&v#R3cALtdJ)%xv;Sh-W^&_LP;!CzCh{;tyl;RWy+Gwi9DSWy@f?Vu?P{fAtDigrg;yfT@E#7@Yvou$cyX*x39$0&C(MPVa-VuE;}`|WUF-Q?js1cW^`!^HD00;N!V5}P zR@5474#zOyMtiR-=q~|Md`{i0(qs9Pnkfv9>K<=<6gcMM!m&BQJB?I>C*$}m6eLm6 zrmAuEPy8BU*o#!ddibQ7)~I3D`hY2RBJtxv4y&?KIzvnk%ODkjr1f(vM_tD=G}+UX z++P*;4<_~Po{0-;G;M`HVZ(QIq1MS`NceT5$vrcbfR=Wc!N^Fbf6OZ3%wiDJ@7BBG z@22jbW9+g!Ir8T-MME}%`dj;w0_TC{AxEoFGmT4dDW6n9Hy%g0RVYYhGC7_e54dI} z;SHZDi!{MNaHiujCh$TDCy8;BUgj&TjW%}pOJNI7-sj#Dx!6KHrg`I>wTu7po zFT-1F=AB7q&OdREih!j~Gf-z1eCk<-^4p)}8<%U#-g&B061XBl1E&X>NypdGVN&u# zsY(z=(-u1?$=!;pnCFxo^x7+utl3|Evu!pev2ZGkvoPTz0t4eoh_x^q`--F=P0+j2 zHHjLddqnbmM2nKl1S(2z6(x>4^hKZ8WjR84G!|dx?CEaf+^~#Qp`B~pjK)KlJ{nPY zhA!V!YyA8G6Zj~S8Od&A05g$Fib?YfdvZDCocNlOZ#>=C4f184?*dvWH8 zNL^m>1Z>62s(!*WWm(H-->E^mIYiiuhmb$-2V%!P2<>pW(}HL?A&4cAN;3!?B9ss~ zpJ7V&os^WIBCg{awrh&#iFKghwWN5iG~Y|KEKe^4Ec>3vPkUs!0A(jyrbmQa2(o1Y z$lXSj>51$GWIk zm6hq~Yy_X%qQ?THb&gs2r)E->*j_#HH}Q)*HxJ`Khc6y>*baQA*Ij^o`$d9cDDZacdCi1~q^xKf*(Vv$I&^)%_%`gLpqGg%Cy zLp0-AvA=ooVvwI zE?G+HM&wYj!W{(m3!L@Bz01`M`19!ByWh$QwzExs`!z<jN2i-RK!xz8Bln;4Jycal6Tbq3cFCSwplp--q zHF%f;{Khb?)bJv1GO{C@2p-xIY4~ez=W1Q}M4L-rBF`GXvGv#FWV=N`;HekFjlTX7 zSrex>pR!h2;aS*4J9TfSbtt`5q%~e*>84<4EPXIbJ(RBP7w3Alii?wu$^-J;*&3Xu zRIuy^0foba`&>Lr)F=!e?Zl!>y}2Ff z4srVN*W6bI^pS?P`vvlr65tl}+lv+{sR`^YQIxa)BT4_aD6Zyn?4;ejEI?JwJTQRQsKtp2kTft`R1X%mDD<)uMN+WdT|K8JvObWQN(j>&CuQys|u zM))pI-w1r3b~*$4a??{Zl%!fG$MkVZJxqG zm@ssIsyQfKHpkUerd@yL(ZY9lM{E41C{%99#W;+GhXI&)(h0pr$7EEw_-;kE{2MBG zC{&yMhAL+{xmx|^E%~nONI4g*^N5SyvR^yjZK%QpV`^Fbsqn-bPUhnI=zT#bhmOK5 zHwVq-F2ymPMK5}V$ALiKp^0O$=H8?TJl*!!T7r$17-1lnHC?an@aKt#M7n_{P6P)jKH9{$b1f?8oE}`{II0}& z#=RRHR^}25kVvI%aw6pI-U=BcEwn5#4ltT2BcF@eIo1d63@qZsGm}y6UhA&oq_pT8 zzx!BPELb*(g`g-_FG1X-+m9!ZJUYtI*PICHEfWzE5FrN|jlfi#NH%C&fXc1dK^|UI?P~i(Ju8G3gWM8k}A< z#D*vG<2L6v=TS4nC6xR+YW@I;y`}S^bY+Tx4Ou8Qhq? z_xAkdtc_86M`m?oa%Wo#fybMNv2;DZ9@=21Bp9Nzo zZhEx^CEbV&HBvH{RmO8Ld0W)z4_cN}`Q6+z#gjqXQMkyjQEB|`2<_4OlBH^IM-Cqm zPY%G?9zA}C8+}|&YxqEvSNbi;;dA}U5+dCXusN0Pbtg_g97pd$=(qf~35`zP{_$&a zxm9eNd@j|>QTLVSp&-A!NZNAEa(KUZ=87l$+s9tZ!VJ6y3UY5ej4qw@$J zPkkLmX0KOA^rn3~b80Am=QTNH<4WMMXClJ9d^nOHeKD3ZUA?|Bi z{_gj;@adbx75dV?Jt4MxY)Rs?*1!YNs<>-8xf2jY4HGZ>1Sb{|wb2%`Ri6%f0P1K6 z?^^+3^eiqe5FmBtK%)DL{$107MNcfucE1=xaW|sad(jr9!u!O;DXeWZ@8>;Bk}Cc1NRE8|}-0)$Q-sZG7x) zoIbq6c_Skcf)3samR{n9%5UOR^I0KF*q$t9 zw5FiCJ7Cny3+H%W?Pl)9Vp!IN?x}K|C5vd|pA~Mu8nL0ieACTm6jTeqni8_^IrG-2 zoCGni7>WTHHfnuBxfeA|GC&6a9Kpe&gKyk&4d{H)6cfbXl^fD{v-s3XRQ!dmNrm=S zR@SH-`9V@)o}E=={~vU)>`h)%;)JA4_EyO5u2mp;*(1WSSxF-H%dfX(7_w7k_q^A| zE`Ag%FUWIf^du@CgHQ4BU2XkWEEt#Xaw)L^iz>fV`HTu<41JD@*Ate~@!O#nepBA- zVmB^Usx&3d(wwX~`}-$cX3Ir|Rw+9-cM`QA`G8{!7Xgyuv)I@GQ2$N>T4H6$)+uO2 z;8V}9%B8+b6`3EZPF;*N&=-9_HWz6bZ{mQ0B7w@P*v98!6F~)>$|nxL$YitSW_pDS z5`OdqfAn!ZIV4jPtkq%GmY6saWKBSJEke=KOT1^|Qw+7eqOSA)E(VyJJuelqO+!|M z_{nZF0PnhDG@@#K|JT6r`@eu!rGN|Gy%MP$SX(QFf;sk+dU|x>@Y1DP5JdW@gJ^Xh z)THohcYSZK$oCsEw$m?ByE9`k;!`*&SV3Icd)R|j6vw@&mDeAiw%eoIwr8g{`k!&3eQUbNb@3an zco`-|O;rWTumCz9*hoj2Egmi3brZ#XiA7-`!w~5iMIw=7JJ?lWHsUDXivfrnC7VeY ze&a(t1P2!#O?(ui6NeazQDZj&<4Oc-f$-sW=b^d|hq`ibLRJA%P%IbXZapLnC`9bI z5$6Zr^IMLK4^7?vu;T!7imQ;+yH6D~oX6AWvw_^ltm2iE7x82~j7H+$PC((7l?eEH4_k=wTQ zw}0m4gR9g>!~~cni>qhj^4peC#wVO>m19?7!4fYR`!oTYy|6O#1m~t|lo;E^flydj z$QCg{fC7d+j-^EJj3TWUEVIH+J;=9IQ3L@T@1$(T%-_=PH*efj=Cet8 zo9AGy0Mqmv9b>Yj^FT$oEOdo0c_sX~k9`dj zMR@$SYQ!UBx1Kvq!a~Bh=*)!$;&XQ@)mp+}sL-&C*vW0lZKsMMB?$FfgKR_uu%b=+ zqXA#`==8tNnDN1G*9FrtuK%oHJ~F0C=hAyY@Dr&w0p5j6HQ-d$T>daOKM%9~$8_a5 zug;C_KE>Vjt?f8wViTE#wGNsnw;acMk;R>k>tU~5jBo&YOqfOoj!W18>uESRlpqr$ z(}-&An)+=To$z}7yuH|Enm(JdtnW+h)a5@GAypn!q7tjI*pjD}JSG)?r?C~)%YsmI zcw+_$NDPbBk(H(csywG6hxsLjsdhh!qqMRBdsoSYtqzfh^hbOp|Bm#6wjv1rdCRX^ z>G!G`r=Ev&R47lMb!x9vOP*FXRI*jn%ne1d1F9zUGoMEF8tmOl7cN^;H;%Z5&1!*l1+ChXg<@7!KMLgoBiU& z@?K#esSiQ`SFAz1F`OR8f9`*CB8>WHP+1A=v%y5HUX&?f_McF30I1X5w-YF-V$MC@ zujVAitv^0oo&?bbFEmFuTOp~YrPT(~?F5e(0O)Wvzw|G;E=qa-$8M1d5InI5!=Z_$ z9w!9rcR1i8!O)+e3QD=5q4MY^B(v8Y4Z5e*k!2rDd3kvyXa`Dx$(rZ^2M8A`_6K?W z>nhqa4tDoHcx>9B3J<@}cRy7=oLqThc1Qxcsin<_=&hsjx^~X!;rA|GiL1sOzPjtn zDamGx1T3)qR2rU-kr#9L83B6t^Ecn&qx3kq!n2HwXi$QrTv>uhU}v1dH?(G{`l}Wv z7e}T!KowNk|CXNY;S~YIyNdcv{@T5{H}q2OC9Epyii(YXP{zm2ez3W&GstzgvCV)2As7RNXrlE?FfJ%Bc;#M=80o`{1$I}d*AI?A(L2_%iZ`K)& zGXU1yGyQPME)X0bjR0nj!Ig0BO=QTtI* ztjCyL6cq&@guy@cZOOj@tvf(E#x5bj08W{``t-t5-O)v$F-a zCR?3&SMqjeI-JzJk8}Ms3uQdrI&xmN4+5MDI>H>kZUd)8-kgl^jl9j7q7MrJPiAz- zbmu$MW@7h_v;zGZe7B0y)#p4&mEb|qeu5(__{vx8B60=2jr#NRx81yDCOb{McYF)T zj)wa~j&r|^cV1Bq<3^ixMX)KGi!#JO2nc7? zeA3x3x5354ho*?Gv=fQbYPgMz!eI4DmY!HA^!=V|_}(LK65ckWPP zFd+kgoo-#p$!O9OK`+@vc(v=e_uDiIPpA?6b5rFLS)x zxhiwKE`!2`Q4S&aeWqq+vT|~iuKYrO+?C@4CzPV+3s#dA^lnEFm)s6FsoU|SGHRn| zbgd?;ro5#RhtCk^gR3UI^UD6)gR1YAG`+pOEigz4RB{B6X7s15&A8T>fQ|c%Tdk+@rbOR?om}1OW|!%IgQvxdhgNxecf2$Veqk&8Pz>L4JNEV`C<8 zm+`R1B_|#`&Ce7a=m$GcwitH9AQVJ_&on~8@=PG+MyB^Jb$=o3F!a{I{F+S2m$Y@FKcD}r(WxU7P&YGS-8L`qW>0UQ#J#TH7r_cEmYj9i>ZVT=u;rdYK@YRNIK;j5qfCWK%q~eB zkR3Uu)Kz{naoelLBpOnQFl1sq1H?*blynaIi+#Ar>4jwb<~JvxtknW6F~wPSf;wu)-I(gOF3R^Wov1%R?v|-O<;Nr>CLeq@$$` zg=LbYmf;amC-?G16>YVFd)1q&=RVK}UPMN^y!=DiIen3V1hcYzn->BO`-=HMj(& z=(*T6D3{luZQI77ug?|KUs=%7ZWPbB>70qaSwJ^^s+u@bhURNVdHCUZFQ~k z1uXjnXS5WD?-lSvp%%Az83$Wi8ct5m7VZo$-TGpX8soD)fBqcie;BBxtKCPvw_QAb z!X6urG(*kOb32HVH{u_U@Y?xw?N?CkyMA=zO+SaQFp6bNSXNh4!$ClGfs0((Ul8#E zQvXO%xVYOA6Eq4~nxvv3IGe5xJ^Y+L`+}}c`^JqMxt#<+HO|oQzgsbcgG5F~y8nI^ zvNCYX!R2ugNS#@u;(1E`@o|ot8loJB>?_8#eD`Qz>3-R}Y8cS2CzTjl8#og?19o!v ztsnPw^z;I6mRXL2gRun`Ww14~zJymImZC8`PDOC?A3q+>XNh5h+UfK?!b|xc3~!SH z#Y&=`m6}^xA z@A+`fb)7Hg!wkcqGxxps+AIF+x5Cv__HA4M_!um7jtzjN5O~6+!FftYS3nCfW7q1Cv z)MHIw;>k+Az*0x@Kcb??7_XNaa0>#H6X@4sk$@W0>Ay5H7< zs6XCw+>@5;iSjDbwkL7Dbi?8||Gr68;*M9u^MDQyJ$+|=P%ob|9qzYEwv=5}6}Oq` z8(maX)U+uqBBDB&`)_exy!UKDWEgtELqLXscV~YmCXV-=0@LIuy@OjHZdxU}iqq=< zsGWeVAMWqcJtp;0a`Ccra^Pza`F~g7a?~x*@(gc^uXl|)1P->ozrAvptBJ}G@yvX@ zS76b(9dRgxpT6?&I4d;z1D3<=crhgLfRG@F>CvxurB5>UVSczSf9RvSKSCSZJ}op( zecUiQ`WGZ5*^P~9<~`BJ#U^(V<$mj|mv;e+XJwulJKqLv9&f8@ALeAHvv9ca zEy;Lg>3)Anui6TGaBxuc$BY#Uds*0Tv*1(=S1nyP#fb<&Nw|kA_{#~Q_MpZw@>PjSJ zV@TwXE=4JGXMI4=;^Qu`?04f5&tiJK4}F*Vt1SCRJTe|_4UNk0OJX8%S>r*2X0!Ca z>y+)R+^F(@M=d3y>Cpesd^A^PKHz3Q`MY;f5)ZBVo|%j6zptRf@3jqc|DRJC zL>T&C=Mx|8f1lO==euFHqsy~ZY|&H_D&F2g5xIcH%hOHQ3@$IfthOGO)wUkGOAwu+ z(~R2oD(gkab5D@;d-Jjf!;e>cQh+m3XdEi7@q08+F6EyobO%!p^Yv<33TN1#h{h>t z%eql2V?p(djd4EVYN@NcMCj7SzM{j29?aLLEDff7_`iH|j(wM|me!wmCGKy@won@H zGKKFf8H|G81_y!zd;MjKmOYCQA`y9pM+{Dk-JJr}(h z6_YsVNx(g^X%Lzy0Z$cugo&-pfN zf%)HnZTFn4_s`V1(B`Opx;bbp-?|?bMS#l#?{@!LsiGp5Q{c_q)lry)Xl_4K>;Pdt z=U3ox_2gudFHgVAJ3b^Ox3q7dyeK)4d4%n&px2xkS|yEP_CZzLm*e; zg<287S6_UQ|IRv|%cB3!l~j%`EJWF+^78XW$EQT}1WK0mTF@C`Z2abzJp#r9J z{Grezz#6Tl)lNdO$u9eJTex%VljK#1#<(7@BfJxe*ckLfq%Ey2J=`sM!$Y2XUBbh> zPezH)MC%F4 z>qA(}o49H5=;Km8|K|v$R2ur9O}Kk_xa^kJjx8<@^(C-+-yZkypfJltllQuzx8ANp z@|ZA9?oX0zVX$v4Et$Ya#5n;mqF{$so{o{ID-(6miw-{r2pI3*BMEtGaMLFjw#M_E zxhZ^yj30Zt3YY0~SHI{#TuXKXKiqCgxUDDXa{Hb;5X!)(TJO(3mCrPJ^K51XiU+i2 zbwxgR1AIu#8SK9UaQr}W2$YT3yeop}(VOPYJ}kF=G<4}A0%D#M^yYlu@4zi<^?J8_ z69{*A$CJM7z_?FNZu^;vWN6-eTZtcNCjmMbKfuMI$KPdm}~k?sVJ_@NMRU zseI=CH&3D|#e;0OQ09mjt)YK8D!QFq@QQU`>D9x=8&PToc{SXi& zz}xzMj-!5G3nE7on+~dhjmPi7M}AYk%`0{96xmWfA4}RZSEHg!jE?2Rr~CZWmNm+8 zC%=^UyQSGQY9b6eYb6U-@rV_m)R`<_V@!Hj3y$X6Zm(!=Zr&2im8X-WiG4`|CT_AS z`ux0#h^SiYr+%I)cj1`fk zE1doP{Sv*(4^%+TW9WC>C3CUx%l>)oq7Um_4Q%xY-to9AWak?@220n(zzN)}&bng* z9NgxbUy$wZ=mUzMJ+t1Yzw_o#8VuBkW*W3D{0s>g;mZhKpcubrwcv>>+K zJoH3=fY7X8>u9vGDNolvU+)%q;Opdp?Za{tX@*>5E3!0~oJikN&F0YGSp`$-_^q^? zuZ-OBchn=}XXeY4H?d=y$%TZWjyZ4fej*3|eTk%sKDbL;x}874+mJ|8cJ^$_jKrAp zmbhjKWJ22Il*=lv@l+n~q}Ri)wsE+7tQB;y4A$I2Y2FQmT_gVzr`w z=ImMPiz*|!a(?IEk}0aNbtTOiD_Mc^=cV%4S&i z1vlX6IlJpG)l<8ot=L7CLJxZo${yP#7dRs9VKxtb>Ot#Vov9j($R#iKEKv-r!2rR_7ZLm_uLP7 zX5Qe0(S(6U2%{oXIaaU-otB$I5qcWU!9jAQ4Dr4BSRINS^}#)qzHCl&1gfIyuH>Uy zG|L!A(I|(@FvL?&96WN!fJZ z(a^fns%L*o@57xr>n}84!SQj~^^&BNiKe94SsfqIK-!ZAT_MEk(%O@KNmK!t+458? z^>KXTHha0nZv7@=fJpaP$phH{&CG$~QzaYu@}x}lRpZ+k0{e!%U18u@ncrQXrND}c zs(jAuY8+-oUoRlu5`6Dd6#@h2YAThG`>QIH8F5FeD%i0c$mYCFHwk}C zOZCtZm+A-=+89INMLPt--GCG4CAC~?@lVOZr4;>hzCTx3SO{Hg@-8uH&77Rnx!-NQ z#|i>6N1j_CU05@@UpKkzWE5|sdbpGeIF2+q0yZ;qq+OLEwa8^(e`*ZRZrSAi7INEp zNwL&?oOZjPx#UuIjB1ynJXKk2>o;XELfMK0TOw%c=l1FuY&Bgq!9jdvlr;3Q;Eye% z54OXpy!_m%t~1%wFXCtcZ}<4=w@g)dzl^4^H!m||q9% z#n((h{Nx0w%v4=YE`s` zP$70?da?YgWl9AO6qgFjE8Bwh4|R!~vt3JNG3*Z{4|OY4%!q`jE4}Z~k)=`Dz#A7D zqYUXApK#pMcoK3tqL{dd9tB1M62J?UnUmPEb^PWY48PYa2%b?KTI(>m8N#42AJ|#B z+RWNycj{gAXsi#KGWKPEtRZ1A7`c!u9pd%_3YHg;)6`#Wq+Q)#v<{~Wxm^xF+zw;d zYP(f=Z+`Hs%JW5&@Lp&1^PlqcIx-0y$TPVUPAbyX;8IguibnZsj6m;GT|`F9Y)7oI zm-uhi)>nKB-3`1Iy)p0imeYMPm-mZJuP$n1LyTO|87=W!wGDjm>9BZYy~MR=uIfWV z4a7e@!brqxsX$_g56B+H+=iAj&5dpws zoDu!0ES1#@Me##-I>^`gR;Oe!di>tPm$r0Q1Myk#uA%1`z8!v>%1iJlw?)C7se*Wg z=slnC4v5p{WpU%SxGVZNCxc~aMDB-`jh78qpAH_dXFT)gI~3kvk2f(+7NK@igCUK3 z+@Wc?x(-FXmPtn4Ktd%rS(_T?cW^s=oMavdS6jnt-Sv$S@LwTtxNlo1v2BT7TNKBC zo~f|a?AZYkM-7}qSDZX*kO}Njb<*n!yI<80NJ#EM!zV>MFV4qbXEVGd55u{`%c>2n zcPmH9-oq}phC2l)?@9z_PLHedc#SLH1_CRhozxOLyeHfV&mZzNneXwpu65Rr0<)_M z?Ck7}@Rr&fz%(_->!RynbNoOtF7$AV;F(hzUjqz|N8%QatME<3CROLCp%Sn-IajIP zFjSma{&B|nRYjUuC2$Q4@yoikJ2C^JalpEHFyZN@awnAM1Dmt=^*+96wOpEH&)4j2 z+HAT9X;)im>My<0SEhg$*?m|iy6k}7=5Q{)0+kQP^c?oAp5^+8+E7A@Sgt8qQ$urq z{3wdZEh;dg(s~g?PAfjx!#I3JS9^O#d~ZJ$cnrU|iw-4HoUT4}O4q*gLB02sXd5

        {f6B#^O-8kTfq6)tE&r+S2{#y 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%0An8z*#+yb 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

        AsjAGT*3@6%gMg$w7CCk>OiFx*ww{Ey5>K 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

        btNWmEuSLy*x4`KoMRXL~P1SZb$mxcNyu%ai}*4 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 diff --git a/docs/pygom-doc/_build/html/_images/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png b/docs/pygom-doc/_build/html/_images/51194285eefa4a971e8a387ab7b2e125ef46610b644f753350393f6b7570ed19.png deleted file mode 100644 index eda9c37bd95ed2a9f72d2d4264fedf09ff36be5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27752 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 diff --git a/docs/pygom-doc/_build/html/_images/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png b/docs/pygom-doc/_build/html/_images/5bc73ee726871a07756efbfcc86834065460905c685c115099ea1ec6c422183c.png deleted file mode 100644 index e066d434fefa8d0cf6157f54e135b763c307a289..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44906 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

        e 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�(gResLADlN22&{H~a|2v*eFRB^t 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 diff --git a/docs/pygom-doc/_build/html/_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png b/docs/pygom-doc/_build/html/_images/61cf086b003e645ccb1eaeebd0a201f4793ce35568e2df3fd9897fe93e8c4d57.png deleted file mode 100644 index a1e2907a6aebeb0d3b875d394563b1da39c8f552..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28430 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

        2g|G8IjEHdhjq)Vu9->m- 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 n;(sg2_P^{o|F?>6c - - - - - - - - -S - -S - - - -I - -I - - - -S->I - - -β*S*I - - - -R - -R - - - -I->R - - -γ*I - - - \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_images/77d7df2c54dad550496302d8c6230ce9bfb40c9f05977928aaf8c36881d21523.png b/docs/pygom-doc/_build/html/_images/77d7df2c54dad550496302d8c6230ce9bfb40c9f05977928aaf8c36881d21523.png deleted file mode 100644 index 54f3a8057d3e13690a5dac15f57eac39ee9ebab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50942 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­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 NlTwnbkoXkv{{ZC4I9>n% diff --git a/docs/pygom-doc/_build/html/_images/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png b/docs/pygom-doc/_build/html/_images/847c39431f11bfdb20b4106329302c51ded12a791b68c599cd254c0ea8db65dd.png deleted file mode 100644 index 7c268a94807898a629ba8b0f41f6e496d1636b18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96634 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 z 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

        Ypr5Jplu$6
        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
        J6)Rj1{y$rVflmMc
        
        diff --git a/docs/pygom-doc/_build/html/_images/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png b/docs/pygom-doc/_build/html/_images/8fed7a65b57e8ae4bd443c30393827f0322ce73e04fa56be79899e536d192ffe.png
        deleted file mode 100644
        index fda7a4567beb10f3eb9e3b7f74a4339fcdcf8536..0000000000000000000000000000000000000000
        GIT binary patch
        literal 0
        HcmV?d00001
        
        literal 28637
        zcmZ_0bySq!7dJ`>h?D{jAf*_fv`9&*gp{BlFmx&1-Q9zv(yfTnAq?F^m(txsGxX5h
        zGkkydUGM$lvKEWAo;c4rXV+(c_CAEZS9nWu>)tIaEG!ZkX$d7PEF2gX7WT$Xd~hY_
        zXmkMl5p=nJ>rjTw35%z5EbN4)*E;HUw0kZ%b1>9B>?
        zRAb!%KWp`r5J?FMi67#(U`*iW--AHO>+4a?S(qmsr1d|5+Y&E-6tiIN)0a9sV%OW$
        zOjF*y8=a64f-qQHx07gY<{~yTGwbN>MVOJC&)S-ClC!`0Yc!{Xh?BFLc+}is)Vm!hY-Ud0dE~0d0kyy
        zXJ*l_e%DF=xhZ-57N|u*81}wU;aN5d2}NwIk~1fp!hxJ$xx-D
        zx}$sFrM@t6a76t1^Wx{bWGQWJdMsAe{JGlwzK0?rsY^?r`d)6ZsTS!>Z@a({&AOL+
        zR2)@H2?a`7CW+au^xJdef?)`wxgm2*n%R}@g(4d=_8G(t{n-Y4C<9o^jz
        zMMcx{3ai6%b8|^I9BQU}lKCSqFU}~asM-^_4PCa%M-^Nwz0W3R69jCTLPJA885`S!
        zi*BP2z{3Yylkx40-nG-*<|Fw{X62>MC>^Y4tgI*7&JA)>Qus15GAZ_bg87>8?F4hz
        zy-wz}*#@zak`gR7t;#5#J^_Cql7IjHRW8NIOY3
        zjZ*=dhnCM`u9=AQ(SrxR`T1;x4VP|RU0n(;)AMuA(DUQP$V6^K{Hm%dC>sRA2DSNT
        z2;tP}Io@5geVIyp??s4lx+kBH5)cbhFc338-08HNi#UB<$YtmLsFpp+?Bx-Byw;Tm
        zM#YKT>*ho==qf9>^d$1AmwqBl_r4VLCm=&+!8o#h{`@)Zy4`T)WmP$kKT@dOU98_y
        zc{E{uGJ~#fPj#N@?E1#aP3%8jW(*fH0()P(*Tq_UIHHMJEwA~=P7C8@af`-EZ*u#7
        zzgYkI$^Lky?L+vC8|&=p2>f{Ud*n;upV`@gXQ+mB$BmH^y(XNa&GD8m{4+OwhRv3f
        z%nRocRJs<fdX@e1gh8!Qk8+w=Hb-n)e
        zqh{)oVVv~|DDSJY+MQ-1HjO_aC@*x)($W%_=jnk@7zDVd?Ry$p;g#q*g{!LM?PP`8
        z#U<}LMq!tzkr7pnhI2b>fqT4WU(shPDfS9A{a1%Y-j5$Y4vZ8%4UyxhYCXHmS1+r@
        zMjlOC8+UzuI%VH4GSjf=y%(F#1r*R}#mvHD>0~86M=@O#OZas4yOzf;Lik`n94IaP
        z%tBe2f=qY^>*@mKo%sCoEi7DoV!h6o$G{%E=kv?@UTz06;>RZdh_0LHxL10%>ifUZ1yS*
        z=Az)i~wp7
        z1%3xs`uo$x(t*+L4~Uatb9o%wU?z2SF?$ur##X3(KwdyHyfrJ_ry(B4iBfO$8=lf&
        zgJQuDX4{(VWBGiWs;qo9BsJ4PEmq8Z^Y{DK8rMRw^XM(OEjbCsQuQJO69jA?C7@s+
        zc8D9ch0lXs|2*{TgM7MZDp*>&wZ|gukDotr-YY3JPdm@{E+Al-%~-bkpsTB>udiRT
        zAI=~$QIr1d8{QwXRCRUr7kqq5+S>1wl*qBbUe09PUOYQ?~=!2%Fdk=-{y?gg2NS>lMMvJuH-x#a+6hhCqb9TqEf6vd)
        zpYCT6w0i_T{`p|_?~J~=k4)^7a-sHW$BpBi7BU%WX#wPf)ArPOT}xI&9EWz-AJf5!
        zI)2Yn2d~q?bSD>ipjGeQy_+e@%gYlwXL~gfqZ@5ZiKk)=9ZR{Le8cwl?Q~MY#Hb+x
        zrM(RFs}4H+PS3vPd2qkzSvY#u
        zJN+%A=hvF;YS`!QxW5hF-bQ^XGOn(I-p4JBtD{AX3OTV)m4DLlgg$(Nlx`0({;;}O
        zw?Zg?nOjhRHwPS&DHRvCb>wXP@bEAt?!2rar7>uU8^
        z;Xgin0+~Ib-Ro0%350C(^fed8I3FEtel+28zTk6yR8%{uE<0m!5^M~
        zGR1@U&<$6qKYu>4p3^QdkgVwsXB11rxNb^HNC$Y>t0n+Jr8QCv~H^0c)*c8SSZI7->@b5DCu_{
        zU5Ul`a|pXeEAXm{04xEUSscg|CuS6-^J(%Ya5ts|fn~oe{bI9{Uf4I}%a_l{p2YJ@
        zbVE*cbrR#%al4k|uu41eYuraqp4d%V!fiJS;0sPQf{WoizjAXI1{K8~KYbbs*2Q2i
        z@8u;*8tjizcuWAX7%TP#f$%D!|1KpZm*e`!`u$YYoL$xN#ArS8Vg^`Y0`TGSI&M!J
        z&Zbe+&p+Lil#~R>NJz_R{4+ogyOpDHNlCIA8uz>}Hgr2XJ2Qc7g|;idPa7B39cgS=
        zZ*W-EpBQadE|T6NB02#vfsAe~v~D?0(`6x)xe}RVetgpJtpH-$c!?naXWaq0qUgyZ
        zzGQ2Wj?CLf#R;jY?*O`~LCea@0^qv76W_Py;51e~HOvMf3N7J&)Ydk@SwIyVd8*@S
        z&x*2Un;-8#Dt6L+Y%f+gzq|!WOXLmBzbt7_%P*&q<$E>1Qfz-`^OBm>(ie>iiu59g
        zZ6Gr~r=)9lvW2-gtQ;}@oBmZt7yb2XD}Y-)4PP9yG=)1>8tlW~81k_7;1Rxt1-E6WcA(EzcllYV-y%gZwq^TUV!uKUOm
        z^HB~ZB_(R`a>Fr#Gve$dJe)Yq^GMxm7pA+@E_N9W)Oa66wt8*qgG#V-$Ma;~9VGly
        z103-HaLst4wK3ai)SH9=%G}Y{hh)_~>EeF)^KF?%LG8gmx%1<8F{7o9XkbiVuLCQ<
        zq%-}G9zWh4(X`(6XFT^QF>HTsHpGH4QH*p@p5Xw@d4Nbc<#o1|;(dAYf|vI%a6cTC
        zb2#}UecC4j2FEYkFI@;U*=l#&Xqi18^>4vv`)W}2-N3}_P}=TW`3N!LcwS}b|{{%m4vW4NKUl4VZGExvP#I5F((4YzWSVh)`SN9RrmkjM!`;pU1E|%D^Gt`MYP$w&;0{UPSx^J~CgsX5=im)*WpHaN|ZQz2i!%vt0`bzl#_Kj-+eX
        zIPC&ol)|oAv9ls}m8hoU8mMVqH$2No&kYnxmvJ%}51!KJbD%@_%VKV_zc3@Wez}#P
        z?MX|kbqiW7kTsph-$3QT`Nb{hd4_BM50IHi)UKp^r#+U7D+V70ptupUK`Lt6cS|!b
        z-|q>r6>3$*0C4A;lh>cfgMoRrs5&$bvijXy#XJ;%>8RR$QlKf`)I3JSWFiN*f%<>?
        zm|v1GDwL+yAQmY4)OM4-XoZ=xsA>5q^WmsjpfX3Grf9HogLysNg`xIR+on9I+z2FY
        zgbg4X)E^dDa|2{zRd=XbSi2{Cc{|2(lX)lqor}!Phdd&=BnzQ?=Nvk0pF?
        zITB0u)_c5iV=i~4N3wCW!K^O{K+ZdBH*UdFmo#$@4c{B#1aD{_w`6Tyrt6I%Y)&YU
        zm;c0?+W6mSW`Hg0uw`L$ilI*a=FUNb-MBA@ey=pWdL<*JLz;8dI(0Q_AyCU7a2Jz=
        z(#h$UP^9uc@>eEOGIgY_-EsAKjY@HU;C<`GXmgF2x%((riF=+!jy|Wh<^Oj=}v#;+y*D$+k3Vp`9$TKM{k+ZxB&&ER7qdF9Y>J&Ncai
        zuwI%c7sI6l-NaFsDM`^7p!M-CBC}z+r*|$d-4V2Yv93*dCpyZ+O4N0wr7u+oSeE|!
        z&~E^-4dIg)mx4k10~5J9F_Jie2oAf>RXVJhOQw)wY6|yHPg9o_O^p78gdA^yM9&E1
        zHs=80J_f1m+F(wZehWTF?amu=a`KL@u7%T$qMZDEVjmE!qZuz&-%>|?7y78b0=
        zEhir98R1hjN>NLT4g*NbM|JiuQxGsJ!xHE*2&KINgcLR}Q`yu@TUQn_!K*ctA~Z76
        z7|haQy1IPY5tEZ)z5N2H(S$WT^SA=vdVXKg~A>e*OB@W>`fHdnZ`z-1ls|CKBKdyPdh$s`*gt##+~Xm&=ot
        zL@{qsT7Ih~;2W1UXHOxFo(CUl(jD9Bop#>Um9L!@XEgS4f
        zIKfU-ILnfELrH*ykpWxm85+5-eYX}~l7LDRykAU#$ZqUl)!UlYALfY?6a3*A79#DV
        zu|DrR)pu3Zz=HFZvw@UG*o6xdgt3l6y4G81y9n|Xg4$VcOrrCDl9qthRtXC}+VSym
        zpK*J1BQDtv$XMe6dd1?>YrM{)F#H9E&_GoI7$pi40O5wnvtDbj#fwu6vR{C4{wyhp
        z9vg#t?I+LffE%$GFgep7NyCHh)7<Svz?8g$K7^E+11u
        zY6kwyt9#Vv`9;Fx@faZ3Px_v>ECh|}pW@!06>^XS%ZlXJZ@z)L{J(*}y^!En{Es@Ez<
        zE4(h;v^Yk&9r<~AqvPV7rVM|G0Hbgii6Zv8=rfAjdX`gykhBPAFQzz5#8UsB@kzwu
        zG@gb*QsRd>qBXhBLwnc$VkmDkI;~@3Lc^#hp~)H$F@~Zmgr>TxnwmrjElogMP0=Db
        zgRaf#%Nw@b+}tysFa%BlS_Y>TfuM(T^!EcgEMKGiR&v3`Y*{-|s~sDd!3!21-_0M;
        zusmAzk{mxC0^=J_OfWnt?Y|HR6$>EQ90(w=*_Nj1CcvPafN&)9`n7L=S<2gRYTv=N
        zAH~JR(*w4Z5oe`;zrQU53TD*%@(9%c_GI3!iUm*+Jv{xy$Ho#o?`+oIKwyD91Ua}n
        zokyi}3VaJ2NGCM&do_knpMlX7SXC`Uo;`bp0b9@#13a+VOLgcOLl8kLwc5SqEe#Bq
        zFeZs%Ncu(4bQobAt`B1pdtvmHJ^f|=tH`s`D*KhaNbhrh@E2nnBSpHXEgE`&2SH{-
        z&p%~@Thws*vc?%@bh5XMA-8~qv^QJ{e2~>Ifq8xo8Badmtq^ZY{e{NrU?2%1s;H&+
        z>ynUobZ;4n+yf-bf?bus)%iXRuNkG-#hN0(d`)Is0(?{6R~H!i0W;!!OR#+t9@P#|
        z*?|V{D~ik7SCK*!z^C@+71ehoTi17vl^9|i0kr2
        z9V{Q{j_6gmi4k}Bc7uTK|G_K(^bHL!2Mo!7`%LU4tmE&S-5Q46qkm	oy42|8Z`w&%L!C-DEx$Ax1iDi@>zm
        z%H#d-2qGCL_C)SBrCPLR1Ie@xKt|S+VR^r;EC{zhU9-^S
        zZ*IY+Ul}Q}UHn_Hr7iwh{Jb*uZVDlU_Ty$ii~E}oX&Ai19f+_pFc7n6ag!_-|63vx
        zHF~sjkjjX!{tZNomVJpk(S^4QXT?OCvXceM?|<_yoMAiPD;`X$U#?**K=(kT0nC!S#4@Iv>WtOYv8rU!
        zZ}ouP#69K1{E8km@?j1TzeT<(>%|#*1w=&3yN*r!8InH7$1Z#O`-+t=ZufyZ3B_Kk
        zlXjT+ZEE&eQ-=Maoj+7w(3uTtm{HMMYh40I<;}rDr1j`X34mDtR8%+}LxrPlO2#e5
        zwvLJqOjy~RC{*(T|GIX1RDVx#JY)4If^pj#=}k4@9I-0{0(k8au$+VhYCvdLS5rnu
        z{k;)y^+|q~5^H2DkNEPFYizIO{L23}Jq|4A`4dh&pYqI`u#=p`NzZOSv3SguvV$%C
        zWT6S2QdJW7v^Te5-alZAvkD68n(KQE1o;7=7}`$Ru*X7AA#iM3(vJkrr2+ENTV&M8
        zy6fTrHqZm3wx!3o59+OV8*}ISuiuijz#p5(Pu)uiHaFBm$zV4
        z89AGnWICcoq(5&{YER-#Q~w^%Lk@s_q_M!3XDUwwW%1Mfx^?+!CUdp?f2)rGBQMc}
        z&Ag}dEB+q@3jNisY~B|yYW#%Mk4)?}
        ztEkpl{qp58y88tT^!3})BatTGNuOTC>m!b~>{qh&Rl3!Js}q0
        ze8kQU+`2Ew5hVH)X?RtEe=*i@iBv^jm#fIY_glG83sbLW;A8GSRVtY3&K*V;HmQ(@
        zv0872%AlIWy{`)=F=7w_?lXWojv}iZvZ&Nc^$M|lKaU)2aGHWX_Zt@@32XMkCi+do
        zs~42);Av4MX!vbB(_MirRluoJV)W#H8xjqMDW1$H?!2}8D82>cOJEENA{I8$qcKCk
        zDcz=}?Oy7PRj>CrAr!mnco@m$u=;*sVF6Tw76ItYE-B&8@cW)HYggz&`c!f=bQ58EL^dV=0G@pv=4@ahRJ6DCzt#^a?~Ekw&To8VJA&
        zMWi&EeV+JZ%BEd?P}we@`tlp7wz{^=7i!nIpr@UyR1Q>VIVxFjs-k5J}F%Xn6_uL{wm;9qEk{fJ(ri4Pn3-!zfE+%c2Z)yy<~XB23ghC
        z+uo>0gybACEeL^6Tm^da9RSYU6=3FL3>~>XoacIRIO+-rg37DQGa+Flz!g7obGyza
        z;MTg8-Qmwh&pp0YyYB230KkMr+6JD8=jbm|z-%pny4-6{r
        z4Iy=lfibhKr(tT(g4p0~Y(NZRYHEp~j2Qdm-9q$RhRnjk2q1lI8^D7M~c7)
        zX1_Y{07D^#!C;sQC&+9M6x^P&v0049Vq_1}!%849L7O=&8XB5w*7_XDpIH;eq7*ek
        zlrt^sSq7`Sdw8ITx;qvc!4SkpZ2u2bJwiI-kLe-UM*V5MAc=}Rs{?r<{0iGi2xAA^
        zQ&qm_EGOi^7Y}SoV2D?w|FCZ`;;V2Y4*TJIHGD#v2L;N&fZXs!XkX&Ej%X5_NdX@z
        zWP)N${Dflma
        z6O1qj0}(eJm+BEf-&Y7>fD7ggnYREp)=I#WU*X2w3Hqx6^2P0b^B~uMkc$b8Zsg#d
        zWpz>Gx27b$1>21Z1|`>lQJp#qKxK&^%paiP?>&_kq{GSw7oLyl+-rURhndYR2D5o|
        z!N3`nLfJCaQzm&HRx4e1A4FsqQ#VO1J;DV}an&^p2G|@hRRJ)8v8R?IFk1h0^&u`m
        z6ofd)>vQ|L24(V7sTfjA=`sJkzMA3#yf*FEM4uL;?4Q5CT?EtO2!%4Ujl{i@^I5qK
        zoE?K4cnvTm#GMLQdWIiV^q50YB&7RvAGe7mrvv89VlWVUJ8X~CY
        z-|U5(pqi(yLF+$^Hx|l{tnyHJ&yyw6y<#GTnUY5+xJ;WC8-Tz;41f7L%!lVheu#1P
        z*OJuo8&m+X`+mp_f|9)l6PFt}Q4D+?ZQapVC%+YpHAw_QCVokJ82!Hp-##F95H1e
        zg2CX^08iE-B^5?F0F)$~2j9_A5;uf(Us0G8Tz{SvJjTQ?7&mlGtuc*1DQgCZEM_)7
        z)i;JdXc5fPBLPPu4!B^cibD?k7nED_KF2TYb+19>KPmkZf?eSwYw--8EZ*zLrJGee
        z=I@fWl=UB61As>)#F*M`zsXEP+v-X&Y8|M=^)@9?LfoUg>K0{eCQQv7%l6-=UNOJF
        zhE*6TkQsoWAHAq<&Fymr8NLQGn2}pj{v)
        z_c!1mF4G(BXBXy09u#159;R3@tRY;TCXJ$XVd`np5)dTQTd>uya+chTBnY@VAFFh)
        zfN?tRfOST#)Jy)SEyZAM84n{b@|t&?3F)q{b$q~FdoWHoRsbO#g}?teygJ*ImWIf^
        zm~#rO7XShZ#Yi@4(8^F+mFafldj};BsA1zYsOU7mPX(U<&KJR8_GvO!i|>>cQotwO
        z$&W7ghyVf_0)Q{GHdYHK>5jIZ)pd&sCRrnMl(o9eljV-)hu^Ichel(@V8V>yqQIm|
        z^mXLL2aT0W2a|CRHr)Yo6-%g~DoCsRu+v3S*^Z(y}fvR35Q
        z`GSpYOkya_g9D5Px9Eq+kvN(HnN92Db@x&cOAGn)+%1z^UT5_x-eA$3Zq&6jx8*-uxGPP
        zL3@HVWq)5PS!WL8;H}kBrzF0*I=FF~jTmHp95MA3`aIS^#$loa%BKC%6Hv@YdJpY-
        z%OPYR`QCpRl}G82&XR3U&l1D#);w_5N_YnF<{Cpq{Ls$%zdAOkd&ablol<`4Q`|v;
        z@(ljPJ!P8cSc#ODk-%?GqF`=pAdL9^aXI=rT2}Ha3~)ooUN&afo0>l{w)*dT!BgR$
        z?~I#s{_NQ^XuDX$s!#G9E0G-rT3*li%=_1$9>jxfc9u>5gc)G|Re8Gp2aNJd_p3m4
        z`fI(dk+Za6*!C_bwRhCDyfv_u34ZE-+4FIE0lsYYG5yob$wI~z%--EdA`cVU-J(?E
        zlXK!Wk@Hs;-+vE(8ODi^M0K<4(o0+&=xA%}z<&U9|8gMQi9pf()ewCP-iQMv_xUlS
        zIkX(jg$0JUMTOrX?p9b|=&I%iAKCs2@*?-{jo)S_4+J^d;JAYmki+~5GIo;N6jVQN
        z0q5C_irorMxLCLcKt4$DtBl)j7N!iq+k3T02}HJwg5|cBGZe#U4$d{KxkX7*I(@EP
        zbf}5^>l9@vI=mNH4h_
        zi%lM1oK0dK?^gM{uI6$JZ2c{lGGJLvL$KH^$#8fDN%nifF#bOJ=Kd0M&GBN^7S@#O
        zJXgK*NFzrfi`{Qy?prR+3x%aG&F*P>hz(4ZRk9MRfYd9XyZ$hpcD`B8iFMpZb8#|1ek-gABqHQ9nI_)N2B-=`
        z4qk%HDvtk#?8{7gVs$ww3v6AUHmy^eiexl=~W}@;wr$Tnvx22^T8Wj81x
        zjP9GL{c9@(Q0kYT<~T@trp
        z8)$xV0BwVjXD1*{!SLFct}gSUy0(!5O;=ECULDL)96-Rlr4C8-Y_~zeSz)0`{R||2
        zgnbn0n?}IZ#Vi^e_hvuj&3sG@zCb2+&c#3NKv8DYYtR~U2Xq>w18yqK>vV0=>k?3w
        zKS7}v^dQ-Q1WFksPwK|02+*kI$Dwn+=o!;}DLYHH7l06-Y~*^Q`xTg`PuMfsS|aON
        z`_7xdvD8#%rF9k+k4;VWo0LI7DRd2
        z-p<4GI^-o03sxR87O$DMdd|ahvY~s`1?ohVr|Wr`OejIj+bg(z3S?cFGO_O2(H4<&
        z;)e$h|9Zs0^c$t7;bVrsKrX1Tm2J#L?C*NT$GGA=z2p_%@os$~%#E)`j8Q>RvE8Wb
        zgObv}?TeTga?oiS=`IgCX#godX2FMY2VF`zm6ZuV1?WiIx!VO&6;c#(#Ii#pr4D6~
        zdMXb$$UbtrzDlwt_)P3;d8G>7{P|z<^^d2vrapo5NbPU8{vz`rzO$pCNSdw)4D?D6
        zQar&Fcu?+E@MK9Cg!^;X*F^?uGyU3nrxEMnY8hw1VGTQ10FJ<~(xwSx;%#spq-
        z2o{F62K;#rdSC3giR{;}Uvtc2CxoCYZ4opZ&HEBC%mE7`oK^|xmpXihJxA1FBtgat
        z|2!$K6A6%o7zBjgv^}?fZi2_#iMZ9(DZl1Mxn495tLgTF#(_%El=YN@!)SA?1T;(z
        z2(4uo7vIi1l*aD`yacEVV7LiPkJiE3U~u~R5;LYXAhYJy?s!5)8bW0G@Z&H%iVoGX
        z81-+m`q(@yqvW1}qc!-fLp=y0?V>Lj$!+)5@T2AqgxUhq^?mYak~VtO%nc{=XtdrT
        z(OLy_R@lzwlii=|iK(cq_LrRi1ti)sUEz_so6U}_Us*Xy#_@a-a2|tmS|sd#WC8L)
        z&nXnUPVI35`loziGpM#RbVSD7mJ4+r;ABs$TR!x#&4>X3H03;_l2W?EZ-Ttcxx{+a
        z`wj>)3djP^urXyFMKcfL*_Q>nE0;SXPXuZSo;isRi~bVDD$hpd)zjT06*s*5VmRS-
        zF{}KU3Yri`J}!lR$KA4U`E0hC=~WvS4`6dKjm6OlD^9fMCoQR19_SwIgImT$2If3;
        zS_FY|nI~zV)&G|g1!N?zy=5zkDjS*LLuAG)!;k7tHI#}a|jrWd><0Sxf%tDDO=6S>#
        z&5q#BpH}NU$)WRpedzQ&2p958=tg<){ib$zdLTl-gUuXwtV)xQq#*MJY;ub})PXVI
        z1D~ts4EL=LcB~bj`(ppQOYKJE
        z7iA(pAT^r&jqcr4XPav)hn4SY82=0_*jX7}`L3#l>>i
        zD@kLTxL?M=V{%p-Tm4AQ<;dXI3|SpP;}=xpUB#p`J5Y7`V5X(%uL&^pmDSviC=LO{kFkB+xt1X
        z;fN(g@Gbf={wsa%urIxGczW;jv#kjZ81y)vPfTEao@`c207**SdK=`jE|c1al^J>B
        z?e~R9Zxz%O6l!$@0CJ8qtQ##`2Q4E75r1{-?^@#!^5QgjDRgEk^>7OY#Wt
        z_;Oo5)E8wPzd__>vaOg%65Bv^it{}L;I93iXOkLA;_tpkl8N-wn_Iy~g1$cj*%y|M
        z_Gi-9x`HJ|-V~Y|$@7QF8QG+#>3D-)cYogc4u}rQZuzimYcsl_`L`&8KB#>jhW{dr
        z75VI#|1`hV%vY}ca2GWf=}qvMwx|72d-qeMtEjyi*ke12(?m3T;l#!wpal92cHL}h
        znw3FtmMDi$K;}g~-@i-@6%~#d`R;=2u~%H>-Ffx;jS+P&OcY4iDyu=C+wyknfnS{4
        zJ3GLBMDY;&l!V*mPyjKjpghlufE?_adSv($@zI99$y9Nitk
        z%$EkDwz*qk%$?2n=#y`af+BsoR2G)dgI{p0}z`hEkBZ*q1p$)
        zl|DI;Ls*sDWR&_|1aByM`5-`lY43$+dN3TM-=X)?+RwBFp0}g@h5NnI94J~(PkvDC
        zhBjy21}>vCa=bAPb>zr0K>>*m{{0L*|3paEeC&gUTzGG@V2h^~V~GpyrY62>joaN8
        za0~}4VXA>2tJ~>>780Lmt_dRYjrqDSkA13c!~4rJ)I>j91#1(Bda;!~^!fm$#Ck%;
        z)v{ox%Urb-&OKV1%Ne|vs*kB$Wi@5>8bMR|guCImNoI2}wVsR6SwdwMoLjJeMsFHs
        zK<`gYe#F1^wpd0zXFByaIX0#)FbY7D6@V1R#wj5bpMHqZN}|pi_aZFnWabVCr$&WYQ0-y=Dnfu$FR(->)wd_Har^k-HDdoTOcig2@>^f
        z*ZQ8%l6EBDI1>29&OKTQtaMjdIS&>Ir^lJo(nYCF?Yz``HDl`bN0%A%j?9I-VVMR9
        zp8dYEjA=av&TlSFk(Y&$&6+8I3YE?~qWf7mF6rjy|H0Eki}^3ljRGBnLS`|G4rt2^
        z-!|tPQgl8Zt62pl!*T&O-cXR69{qJHQ`=?r=PB0ktV9U2qo(Ajs=dJC=udOvrtj^vA>a6MK%0~PwX4#Ur
        ztg+r5OkJj~m)GcIAhE5>tdfen1m&`Zud4i|CwjaPq7=cg_Br_BEYhh1Z=O|t;sf-n
        zQ`<_;!XHh+kAtlhF%v*wqyU4ewNHKJdKxgM`@dv)zk8
        zNx?RCOY|3yC37g9OT@`)LrcwnZ?tj|qds-<5S+O*WCdl^1T<&SE#_w$eb=t9@vDBq
        z_@qF9B0}C_d{2Rz6=+hLfw>IHvSV*6VvIUH-E9wd%4+Pyw+dttzbPTh)VTlL|MK%j
        z7{w>|JD(iCpz42r5C?C;xbXw(^lh#yFTrweYdR;!1?jaXzc~F9Tvpx967pidKV|E}
        zG(Q@X9fF>KvB$_HHA(Xf3wP=~%qJW7{}lhm9rO^=bDnHrJbi~(^H5%;bC-p!%Qls_
        z)kAcJKvULJ^9}O@T>Mn?ZSP&#>zPWAuG^JasNvas@|=y`6MmY1r49u466kxo<7vhV
        zK;oQ{@gG+NkT$O7^=?sdnyX^svy5XIJnm_UvaJL5?StXCmHm*Z($!4;bP=@T
        zZc=W~;oUN+z^a#m3_!&)VN%OjJL3`0pKT<23Yje3y`7G)a;CRPtDmm`=+oZ4inF`S
        zhp4Sd?6e1~q7;orWXdXbOt)ZmZ!QMixrLcSRpCu%w4N!eTzks&k76EDCrOS+*;qztHka+wOq
        z==633L8zrAHirg%Cr=N?NC8Dd&
        zsA%EX>-U(Ys6^C+`1_KRT-4T5)6w*`qC1H69M)7$8MtLmjTicpn_2ktCg>t!Js79b_(&R+LP2wZvDUoBn*
        zc6sXm0A-ShAtsO)N-EBp|V6
        zzV@u=0<^39>jq@L1SDf$1o7)L7nFYQ>tF2HFp^TKppxf;G=Y-4qsp3st7
        z$zJwSP%VMZ?KQkPy$up1P8~cFFMI{?qBKb_2OoVt{&@nS_Med{vzyi3;Gn2(Vd7VU
        z#z|eeA3sYF4gQNt^Al?KMd`yDd{*l55AW*#Qj(CUjy)vEwW%U0jY(O0(thd`h4w;}
        z=;z6KfR%dDq^Eaf^xOcI^~-k-yQ|ZTM)ibs&wCn=hfdyCh#Uk0Fae*hax~S_c?N+k
        zFA-3;MJEmj8n&p$A4}1Cyze&AIqg
        zTJrdlik^uWceD&Co3O-ktT^1O=wU*Vx${ESXsS>UY?PDZtz&NXlVX>NOK9OjCetu^}
        zQGc)@qmb=59Yoetqc6@kUn0={LuF$H$2+z3(Tg=}J=mD;O{%!Ndo4wzOoALwDk(JB
        zxHb)_-R^AaV&|p#_gcTPEP0vh^a<46UE
        zi;oil#|7|xK-FGMQv@~*;Np$VJaHbHq;DM~G50PnPjswK)-wiD#teLGWsn;&!TRX-
        z;>Ctyb8fl`oM3c9QLlA{SRVrsp*pfIYIn`ZCH!5`*duUAj$fwzz%Kz>+@2^t$HzQI
        zrw8NK9ic9s=%H~@O?KtXUNJ{?<3JTk5mRWbNc2QLvL7fg4m$@wZCEarShK;2lMUR5
        zhcITpSuF+RP9JcL$~7>x4?v8*OgnKPn-%;nR>Cbh6S=@zLxG=eT#t3{S#O|*9N()o
        z$iDY8FtvU%OUr<+I%HnWJv(fzGdnf42TcE-R(u;87+ZM4J%XuC&XT@#yQ%SAa@r59
        z`*T}@7K58NEx|L|CLJ2j{eoS*E_$SWMJ=E7<6lYjqBa;02HtH
        za6pTQ{SaxaN!yc2szyDtPtMam(uzFItoCq8_m8+AjXEc3C6n*6Gq4oaZQEZNn|
        zl%D~IG!9`f(_jMQMmhfx>W#WbVLU^&wu;vmP@$G}686rl#=3NCdB>JoO5z6r6y8A2
        z>jBstDRM-OhldB+!=JnEeTw7M-5#{XG){xwFFDS-7g3C?(;vfo
        zyCVB(h#MDS&PwXDQwTt)Nvq|VW4ZxJ=GvFykS~8ddx7Q&3e4f!O`g@?1xIAT;XOf2
        ze+)Qh%VX3-4Nl`Jn3}E;MoyL)lVSQ?jniC>8WFN+$CKlF;$GPwxtW1tp2gquxr>wlV;{v*Fa-ekc1Y6pW1h
        z;C$8eJU2%?3^1G#m~Lre>f1=d+y5SeT+CVL(rq1Yp(?2z65Ul#_pewem
        zc0l|(Ppw3Amz9l=pTEp(_!&5W?zD76l@%OYHC+3bP0!#w>xqs|Ozd>7-=_y>Y(V=w
        zIAyq{^Y0>6b^XEz}4scd*q7IxAm9(|pwT;9ay;c-Cq*N5%4e0;B315w`JW4&O+u=S@ztT
        zgmZ?g$g+@h$uIq^D2I3-BBjidH8AA2;+ABqvl(aV_uTqGK;mJAuP^p<{c(fTJZyk?
        z%KeYz{a4@q>&K6P&CN|i(FSm=9>eH^&XrnJ)wI<V=XYkDzmw>@OWpJ%^&EZrz
        z$>E{cOJgqULRN#Td3OvKzFQ61bX*Q4m$~wqUsfJP2vB)
        zM6aQ!n8g?u=yvX(C^xSwD)QVi_c+Yc{k%0%zJ7_yT%hCgaz>b7=|ELG+9ydJZ6!hV
        zE)l0%x5Oj(WWaw65R$}i)yeNSFfwxk!WXD!CpaaM_`;MtQh4vCqoZR_5-*VttyQJ3
        zsOKpcIB#KKXh9j`+S+lT$n`MUU-?al4$8&P@HA-+#Ly
        zuK(dBVvCA+5g`2+@amI3dscOL5jbT7SQDdqy);31-8z&gkq1o
        zqKE;|@i-g5D}2()LEN&s{tvt+?W<_DJ5}_nlYKfGBr4UQ=+A7O(D9Apbb$|3C`86l
        zsVS?>{u|B)zV9|p(iF~H_GJ6bhd$XGPuXPSZN>`Dw`spup=0iVeuf!s-JXNDqR6^0
        z2yN{oKy|QWbh2mQRn-UvO0GQzp4B@2Z~CaWz_-h_I+jAKC3kO41Uy~4sUjw+kV8>I
        z;+%3|38F?sH)FVMP7NwN(61c))z-IAm&fv6E=R96Rf!lao-X@=FSK7lTYhG(U%%z?
        zeul3K?>uG7&V`ejBV-LPbR6J$KajLdze#Cn>*u6ybBB8c61_EAM+{gHIqGMzdUyvGCeb!D3DJ#Pu7d&`>4Mvc%fX_P8k76g3rj}D+MVmT2$Q*_hyJawP(WcnD3pF9ssEw6JpTvO%VAs3D4iz+P}m;D*Kmv{mHaG@0W7&5Rq)M+BNAYKFsx4Vuij
        z84XR!lg?COcrb(?-hKt`#)q@CnLfWiI$FXnnQN~~z`w0gSMek|dv?!9FDP@kY)l&{
        znnalMn4smWdpRW1`}Ly>cFNEXiu#fw1f=}$KaRgLeMgba`|jfquWe;vAmH2AleDpb
        z5&kx@+#ag#r-}Owy6r?Fa@4pRoP|5V5q!o~GvBT^_PY8dlR!8O58I4B>q+6@@{lVW
        zSAjZGQkyD>6ThvUKFm(Zio;-S5USn+t9zPLU`%k{+SInn)RE>-<#eSMet{Kk{AA;2
        z>g$e{#$|lm{!z;_`~*d=7dAD$>E?P|Y?J-&t{};4#77xSd0mPXmfoH!(2MlH!Ja&b
        zS=dm?Wd4sMyQqoozr)#pEV-HX+5X(i4iJ>~lQm*cM@CoYY%vV1s{on*liKaeV{t
        zdKj1$T);#Wh5&zkz{AjlRYvL
        zvX0F`cG>fOeU9(%zJJ&6|G%&6{$AhfJLH`6KJU+azFyDgMAkM)h
        zv`nRiFq5zFm7>DYi*FQDYfg%um#n#InvxWuLsl}J8}sPQpK^{u9M6a2{B40ot9-3J
        z@&4`tWXVayDZmIGs}D`lqWd&`*@ZvA-DU_eN5B`cTv4`Ob>_PAl>WLmVp;O{9|e(t
        zB_ElsJ@LQ&tT_7Dj|KY(YKwFm^LS4}u?L{{aezJbpLgGCFQ}g2DSN4G{fyCjDUv8e
        zpEXBWMg^x)+$-+-J4NeBH+hou=56{TrFk4|Lh8q3G50^T@P*4A{n~^*qvapJhV!np
        zMV6{Z-ARF7;LrRBVkh0;H^NV(9*322lT{Byqu+mGNt3=W>6d0)
        zj_%j5;>RfR>B-=F&wYX@h~2x&Am91$2Q^2+zkc|FtB|Wij_#<_TRs^k5|P3uD&bzD
        z`XwhLa(Mc=mn-eZBZ5+V4`^=bPd?_nrl@9n(g`$h{zq^t?joUn)~6-J7m3?F;D-?9
        zgSo*?vo;m=8-L9DL>xY)gN#fgUp@LeUPTUCF#^qcC$qIQqT0oy;V2{Sw8>S7I-1Uv+$HAdfGi
        zl3m}=OVX-*YJuambKKC@6@OCW3p(Wxn1u)D__X^bOiEVmfU66~8vO!`^I`_2(&%O%}CX+_$cm!Il3%2@n2ouRFrXnVDpm3
        zB7PmI&}vv1O-gI3@V{Q?O6&8UXfXkEAMd4<=A-g=xW=E0PB*i2xe(RfwI4`vDLHSe
        z-z4hcxh^PB3Eba0q@ABcLuMyqs
        zOj*(l)&gq*(1>EMIba2ymvn)S)ehp97%7kIX=!Oq`+Fd@FGJuCz;;3Wus};d@B-(q
        z+Mb`CfUGWu1SsWTN~bn9g(XlkZUtO)iq(;%x^BG9M9YHOG6G{K7Xmr}^bANwqyQc!
        zvA@<0?~5>*$UV1Y8$*~7ER+ktt^kq(2&B(-NnJfXa&V-si1t61G#KQ++@tSaGT?wV
        zwx*0SToPIHZ76)n`dO*m8#Wy#8dUS>Y;8>`E$vTtKtvN$
        zSZpzIyn)ldU4}Z7F3YC`{?j(+sTRH(-nar5-F8EV8}_4T9&#nLkHktZ)DW^vrA6x-
        zuTC`7H#)f=`rs}%PR38z!tWg2nyT$8NRNh6XthC?IdQe%93|K@*47-s`wJwe#SsA>
        z9#(PjUEihypoGjI?}$F!7x;KPbOU`KRItkv_Fb7V?l1k%tVIZzy7n0S
        zoUWczjuHGYJVo94I1)5SjxHF$ONk>uF2w5#_ZR$J4N&CPT6fo6#PfU1ea3{?SP}aN
        z3VM2;j8UL97J&?yK^k6sz16<>KH73p-PfMm~Xqw=&4ij8KSx
        z^tLN)H_Yl-xPt%A%*BG86XUjA1qKmerv)u&)ocP}6}9|(U8f9KL!}R{wzszfFKP6t
        zb0Xqf{cdn@x%4+O?4}@udCc3L>&m$@vwL+vDEN|z_~CMcnB<%GM_|wnc~qHoCf-2#
        zBJ(|*-GY~k5Jg!+OtvhvDMG^31;LiT7Kjy7wF
        z-y2!wXlNurr63`9^<9gB_)|xCI{lG`QXeE3?kg{e6_~)ySAR_f+R2j_My;*82?@2s
        z9Yu~-B4VmHIT%yuOfi+&JcWC2
        z88`zLsbpVW&^Y;c?ex-P2EQecS3_UdyP+rY7UYaAZ`R|N>^2k7k;?w_68kAsgJBZp
        z{=-w*q%iW8&|nhNJ30+ie#a6>Qk6Rvl&P?s7Ih1IsOX%G+fFP=dQA?L#A1iqjBaXh
        z4C8hUg?E>-ty2p>5e1#_BNQjmD{sJJlP*P8W)Dlmom-rn{Zz}z@8CK;-L#vQ^pvYif_FnLRIIlNfSi=
        z(-6vOQCBk=!n3rJ5jvOsydP40O#hJt91sQS%q$yIh&i067XI)YZLEgd8Yvt86>bOu
        zE9S@(2S@l5-2O<}5Ta~NWPgew`SC|^o-7>oSxWy-aUT8J8AlV52Mbp=9U2L=BOSSM
        z{d{jBXx~)pT(=l!DHTnwSc#%XvZkx;%v)=?jKIKFV#=}jl$XNnb+3j$PJQoH*~468
        za0|drOqnJj`vd%I98HAR%BIJzJH$y|Z~l^6f!kvP?i(!R5*Ru{Kj0C>1=)p
        zl5eGZ@5a=MJt4;w2X4>Qp?_Xzar)9R`sgGEOu+9;$(C_tqnbwf+_*hA;4)<5<_DwN
        z&$3u*N&FBc7c;zn2FzJG@HDz(~QBY9n0h^bxHd5wh(JVOPI
        z<3M`?Be=7U);U`ZWPIbU5|r{%qfh)ATK0W(v5mdQ-K0b|3FE;eo~m=yShnv@C9fKe
        zRr!c_9Yp@PPq_Ll?1j>)ixK}cR|!OUd1<8#UW)rZBtekhJAhFAgq+$ZX+31H=Nqe?
        z@H+>v@NdOfoaJG$pL@=
        zToQapcmyp8qgC64+$g(W-&jX&O+36>IIwrH6gnQ5o~#+>$rI$;%sm7EzOQPOb3`5A
        z)OvKu#c5-A>-dpHZ5Y>rTEVgX3ZuECwp?ycmX0dAb5$Yk*fkxa;h>eJPQyN97uV~U
        zl~32?_4VwBj6!<+Ra8A)g#~Fi0RfM08PA#A_MSL_ensp#Bz3{N
        z%)J@-T`DX$?3v#!dztb3wt6HOF)2wZHgQ$UjBTE+%tiVsoyp^ux_1?>}^sN
        zxU~w)2)w!p)2K{{Q<9!eGGfm-?%bUfW|iwzbVfEG$-p72l|QW>6058HPLaJQ9La)C
        zK)B)S1WBTKSpq7%mzq2Db$HMR@shj|T^?^0)f^2AAPQif
        zR+$s~6BLJE;x1%7ORX%9g$M&E1%yZ(`0uEgTyidyl9%3PCOfO>o;_9ZPO3Wo-4;DR
        zLu4Jz1hS>$G0#0eG?I=aS%3~uUHuoXxn9yzup2_C@1DGbw(xjODpG>G*<>CxSrhwWvEj)q0j+HAQ*X8-#=mZ_
        z4DxD;j#fsmJ_cu(Z?m{TOjV#6Y0G&bQLYs#kAs*pCRbJtf@_Mmz@d-==|l43cPsno
        z+)rh_?J?CY5>CS|JD(bNJ(x3lWh(1b-G`59?Fr-Yn(e*2^hvLi<_1`7z7Eq=R`1~1
        zc-*Tm-+#C__No_&CC$*0OfRsWW!k(FQi+LQ_%muy>*g$@l=$m&M4q_oshzi7*WmoH
        zb3V(h1(UQh2@@e4l0WhsDIUci+Zd@k8N(ayh^Y}>xZqm$Xe?>;<)@3YARAlfUoKe?
        zy_8O_H1i>|F>fuzVQcl853ITa?s@OEJF~`i(xbqHUq0!Obf6w%%T90YvN)7y^J46I
        z;Fck%KAeh3Zzc)z`j33;JS536ZB8=Ycz5RkEdSyDMH!#p$0Zufkp_BJTT9r5oaYYZ
        zE$^%p_#SI1^|HZf�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
        D9yXa1
        
        diff --git a/docs/pygom-doc/_build/html/_images/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png b/docs/pygom-doc/_build/html/_images/988075d7f4c1d6d001cc004b513ed17d7a9b3136c85a1aae69c00bc3f813fc49.png
        deleted file mode 100644
        index 862b8500f2df3dc43e2dd4a87beba1ff5061a1e0..0000000000000000000000000000000000000000
        GIT binary patch
        literal 0
        HcmV?d00001
        
        literal 32819
        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�c
        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
        
        diff --git a/docs/pygom-doc/_build/html/_images/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png b/docs/pygom-doc/_build/html/_images/a41ee48b4c02f2ffb96d803d748a3fd307285265d95928863ec35ca238282231.png
        deleted file mode 100644
        index 70c84ba424c6c35565c6a2abe5a70b66cfb87e51..0000000000000000000000000000000000000000
        GIT binary patch
        literal 0
        HcmV?d00001
        
        literal 65130
        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̎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
        Y-UDNU9=cUR$xvXE5Rnxw6V&(nFQq?U6aWAK
        
        diff --git a/docs/pygom-doc/_build/html/_images/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png b/docs/pygom-doc/_build/html/_images/a91b6e3f57f738858bd3a18bfcfda2cf782787c777b79466b814cebf406b6e4b.png
        deleted file mode 100644
        index 8fb1bed9de8932f10e9059655fd39c75f09ddce8..0000000000000000000000000000000000000000
        GIT binary patch
        literal 0
        HcmV?d00001
        
        literal 27643
        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�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
        
        diff --git a/docs/pygom-doc/_build/html/_images/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png b/docs/pygom-doc/_build/html/_images/ab20c75bd7c6ee640cf34904982a63506772e03a04c4b1616eab4e0c779b74f2.png
        deleted file mode 100644
        index d9c4ddb61f4b303f91c68083854e30fe9e1425f3..0000000000000000000000000000000000000000
        GIT binary patch
        literal 0
        HcmV?d00001
        
        literal 101436
        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	QMFnN~izs~oaDoZ*`s14
        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
        G@c#iZD$a2L
        
        diff --git a/docs/pygom-doc/_build/html/_images/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png b/docs/pygom-doc/_build/html/_images/c0aa142200428595aa44bb6588be6a7a4160105ee4702528ae9560e29d955782.png
        deleted file mode 100644
        index 9462eff2db6e2d7cf0d54617c330ea8c93d6ac72..0000000000000000000000000000000000000000
        GIT binary patch
        literal 0
        HcmV?d00001
        
        literal 55659
        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

          IpJF5 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 diff --git a/docs/pygom-doc/_build/html/_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png b/docs/pygom-doc/_build/html/_images/e521435122381780396ee20a8582f3a46e43faa6c31200c2a2bef1fd514361f4.png deleted file mode 100644 index 3054a777d51c8821b5a04a161d498190de31c9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35085 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 Mrmb40Y!&jq0MnqwqyPW_ diff --git a/docs/pygom-doc/_build/html/_images/edaf46c89c79b126b3212a4b236b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png b/docs/pygom-doc/_build/html/_images/edaf46c89c79b126b3212a4b236b512c0c1cc9a324dc2ba7c19d035ea3da00a0.png deleted file mode 100644 index e190eb560199bb007c324ec96b62171db8e735e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34681 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 a=P>y5*xCRQH4h5@Q^u&t=iM;${eJ*h`Qp_8 diff --git a/docs/pygom-doc/_build/html/_sources/intro.md b/docs/pygom-doc/_build/html/_sources/intro.md deleted file mode 100644 index 02905b2c..00000000 --- a/docs/pygom-doc/_build/html/_sources/intro.md +++ /dev/null @@ -1,24 +0,0 @@ -# Welcome to the documentation for PyGOM - -PyGOM (Python Generic ODE Model) is a Python package that aims to facilitate the application of ordinary differential equations (ODEs) in the real world, -with a focus in epidemiology. -This package helps the user define their ODE system in an intuitive manner and provides convenience functions - -making use of various algebraic and numerical libraries in the backend - that can be used in a straight forward fashion. - -This is an open source project hosted on [Github](https://github.com/PublicHealthEngland/pygom). - -A manuscript containing a shortened motivation and use is hosted on [arxXiv](https://arxiv.org/abs/1803.06934). - -#TODO insert intro text - - - -```{tableofcontents} -``` - -# Code Documentation and FAQ -#TODO from index.rst -# References -#TODO -# Indices and tables -#TODO \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_sources/markdown.md b/docs/pygom-doc/_build/html/_sources/markdown.md deleted file mode 100644 index 0ddaab3f..00000000 --- a/docs/pygom-doc/_build/html/_sources/markdown.md +++ /dev/null @@ -1,55 +0,0 @@ -# Markdown Files - -Whether you write your book's content in Jupyter Notebooks (`.ipynb`) or -in regular markdown files (`.md`), you'll write in the same flavor of markdown -called **MyST Markdown**. -This is a simple file to help you get started and show off some syntax. - -## What is MyST? - -MyST stands for "Markedly Structured Text". It -is a slight variation on a flavor of markdown called "CommonMark" markdown, -with small syntax extensions to allow you to write **roles** and **directives** -in the Sphinx ecosystem. - -For more about MyST, see [the MyST Markdown Overview](https://jupyterbook.org/content/myst.html). - -## Sample Roles and Directives - -Roles and directives are two of the most powerful tools in Jupyter Book. They -are kind of like functions, but written in a markup language. They both -serve a similar purpose, but **roles are written in one line**, whereas -**directives span many lines**. They both accept different kinds of inputs, -and what they do with those inputs depends on the specific role or directive -that is being called. - -Here is a "note" directive: - -```{note} -Here is a note -``` - -It will be rendered in a special box when you build your book. - -Here is an inline directive to refer to a document: {doc}`markdown-notebooks`. - - -## Citations - -You can also cite references that are stored in a `bibtex` file. For example, -the following syntax: `` {cite}`holdgraf_evidence_2014` `` will render like -this: {cite}`holdgraf_evidence_2014`. - -Moreover, you can insert a bibliography into your page with this syntax: -The `{bibliography}` directive must be used for all the `{cite}` roles to -render properly. -For example, if the references for your book are stored in `references.bib`, -then the bibliography is inserted with: - -```{bibliography} -``` - -## Learn more - -This is just a simple starter to get you started. -You can learn a lot more at [jupyterbook.org](https://jupyterbook.org). diff --git a/docs/pygom-doc/_build/html/_sources/md/getting_started.md b/docs/pygom-doc/_build/html/_sources/md/getting_started.md deleted file mode 100644 index fd7094b7..00000000 --- a/docs/pygom-doc/_build/html/_sources/md/getting_started.md +++ /dev/null @@ -1,73 +0,0 @@ -# Getting started - -## What does this package do? - -The purpose of this package is to allow the end user to easily define a -set of ordinary differential equations (ODEs) and obtain information -about the ODEs by invoking the the appropriate methods. Here, we define -the set of ODEs as - -$$\frac{d \mathbf{x}}{d t} = f(\mathbf{x},\boldsymbol{\theta})$$ - -where $\mathbf{x} = \left(x_{1},x_{2},\ldots,x_{n}\right)$ is the state -vector with $d$ state and $\boldsymbol{\theta}$ the parameters of $p$ -dimension. Currently, this package allows the user to find the algebraic -expression of the ODE, Jacobian, gradient and forward sensitivity of the -ODE. A numerical output is given when all the state and parameter values -are provided. Note that the only important class is -`DeterministicOde`{.interpreted-text role="file"} where all the -functionality described previously are exposed. - -#TODO do we want this updating or referencing issue board? -The current plan is to extend the functionality to include - -- Solving the ode analytically when it is linear -- Analysis of the system via eigenvalues during the integration -- Detection of DAE - -## Obtaining the package - -The location of the package is current on GitHub and can be pulled via -https from: - - https://github.com/PublicHealthEngland/pygom.git - -#TODO required? -The package is currently as follows: - - pygom/ - bin/ - doc/ - pygom/ - loss/ - tests/ - model/ - tests/ - sbml_translate/ - utilR/ - LICENSE.txt - README.rst - requirements.txt - setup.py - -with files in each of the three main folders not shown. You can install -the package via command line: - - python setup.py install - -or locally on a user level: - - python setup.py install --user - -Please note that there are current redundant file are kept for -development purposes for the time being. - -## Testing the package - -Testing can be performed prior or after the installation. Some standard -test files can be found in their respective folder and they can be run -in the command line: - - python setup.py test - -which can be performed prior to installing the package if desired. diff --git a/docs/pygom-doc/_build/html/_sources/md/unrollOde.md b/docs/pygom-doc/_build/html/_sources/md/unrollOde.md deleted file mode 100644 index 9da3bd11..00000000 --- a/docs/pygom-doc/_build/html/_sources/md/unrollOde.md +++ /dev/null @@ -1,15 +0,0 @@ -# Convert ODE into transitions - -As seen previously in `transition`{.interpreted-text role="ref"}, we can -define the model via the transitions or explicitly as ODEs. There are -times when we all just want to test out some model in a paper and the -only available information are the ODEs themselves. Even though we know -that the ODEs come from some underlying transitions, breaking them down -can be a time consuming process. We provide the functionalities to do -this automatically. - -::: {.toctree} -unroll/unrollSimple.rst -unroll/unrollBD.rst -unroll/unrollHard.rst -::: diff --git a/docs/pygom-doc/_build/html/_sources/mdconvert/common_models/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/common_models/.md deleted file mode 100644 index 7aa8ca23..00000000 --- a/docs/pygom-doc/_build/html/_sources/mdconvert/common_models/.md +++ /dev/null @@ -1,35 +0,0 @@ -# `.SIR_Birth_Death`{.interpreted-text role="func"} - -Next, we look at an SIR model with birth death - -$$\begin{aligned} -\frac{dS}{dt} &= B -\beta SI - \mu S \\ -\frac{dI}{dt} &= \beta SI - \gamma I - \mu I \\ -\frac{dR}{dt} &= \gamma I -\end{aligned}$$ - -Continuing from the example above, but now with a much longer time -frame. Note that the birth and death rate are the same. - -::: {.ipython} -In \[1\]: from pygom import common_models - -In \[1\]: import numpy - -In \[1\]: B = 126372.0/365.0 - -In \[1\]: N = 7781984.0 - -In \[1\]: ode = common_models.SIR_Birth_Death({\'beta\':3.6, -\'gamma\':0.2, \'B\':B/N, \'mu\':B/N}) - -In \[1\]: t = numpy.linspace(0, 35\*365, 10001) - -In \[1\]: x0 = \[0.065, 123.0\*(5.0/30.0)/N, 0.0\] - -In \[1\]: ode.initial_values = (x0, t\[0\]) - -In \[1\]: solution = ode.integrate(t\[1::\]) - -\@savefig common_models_sir_bd.png In \[1\]: ode.plot() -::: diff --git a/docs/pygom-doc/_build/html/_sources/mdconvert/doc_to_sort/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/doc_to_sort/.md deleted file mode 100644 index 07745c25..00000000 --- a/docs/pygom-doc/_build/html/_sources/mdconvert/doc_to_sort/.md +++ /dev/null @@ -1,201 +0,0 @@ -# Solving Boundary Value Problems {#bvpSimple} - -In addition to finding solutions for an IVP and estimate the unknown -parameters, this package also allows you to solve BVP with a little bit -of imagination. Here, we are going to show how a BVP can be solved by -treating it as a parameter estimation problem. Essentially, a shooting -method where the first boundary condition defines the initial condition -of an IVP and the second boundary condition is an observation. Two -examples, both from MATLAB[^1], will be shown here. - -## Simple model 1 - -We are trying to find the solution to the second order differential -equation - -$$\nabla^{2} y + |y| = 0$$ - -subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert -this into a set of first order ODE - -$$\begin{aligned} -\frac{d y_{0}}{dt} &= y_{1} \\ -\frac{d y_{1}}{dt} &= -|y_{0}| -\end{aligned}$$ - -using an auxiliary variable $y_{1} = \nabla y$ and $y_{0} = y$. Setting -up the system below - -::: {.ipython} -In \[1\]: from pygom import Transition, TransitionType, -DeterministicOde, SquareLoss - -In \[1\]: import matplotlib.pyplot as plt - -In \[2\]: stateList = \[\'y0\', \'y1\'\] - -In \[3\]: paramList = \[\] - -In \[4\]: ode1 = Transition(origin=\'y0\', - -: \...: equation=\'y1\', \...: transition_type=TransitionType.ODE) - -In \[5\]: ode2 = Transition(origin=\'y1\', - -: \...: equation=\'-abs(y0)\', \...: - transition_type=TransitionType.ODE) - -In \[6\]: model = DeterministicOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2\]) - -In \[7\]: model.get_ode_eqn() -::: - -We check that the equations are correct before proceeding to set up our -loss function. - -::: {.ipython} -In \[1\]: import numpy - -In \[2\]: from scipy.optimize import minimize - -In \[3\]: initialState = \[0.0, 1.0\] - -In \[4\]: t = numpy.linspace(0, 4, 100) - -In \[5\]: model.initial_values = (initialState, t\[0\]) - -In \[6\]: solution = model.integrate(t\[1::\]) - -In \[7\]: f = plt.figure() - -\@savefig bvp1_random_guess_plot.png In \[8\]: model.plot() - -In \[9\]: plt.close() -::: - -Setting up the second boundary condition $y(4) = -2$ is easy, because -that is just a single observation attached to the state $y_{1}$. -Enforcing the first boundary condition requires us to set it as the -initial condition. Because the condition only states that $y(0) = 0$, -the starting value of the other state $y_1$ is free. We let our loss -object know that it is free through the targetState input argument. - -::: {.ipython} -In \[10\]: theta = \[0.0\] - -In \[11\]: obj = SquareLoss(theta=theta, - -: \....: ode=model, \....: x0=initialState, \....: t0=t\[0\], \....: - t=t\[-1\], \....: y=\[-2\], \....: state_name=\[\'y0\'\], \....: - target_state=\[\'y1\'\]) - -In \[12\]: thetaHat = minimize(fun=obj.costIV, x0=\[0.0\]) - -In \[13\]: print(thetaHat) - -In \[14\]: model.initial_values = (\[0.0\] + thetaHat\[\'x\'\].tolist(), -t\[0\]) - -In \[15\]: solution = model.integrate(t\[1::\]) - -In \[16\]: f = plt.figure() - -\@savefig bvp1_solution_plot.png In \[17\]: model.plot() - -In \[18\]: plt.close() -::: - -We are going to visualize the solution, and also check the boundary -condition. The first became our initial condition, so it is always -satisfied and only the latter is of concern, which is zero (subject to -numerical error) from thetaHat. - -## Simple model 2 - -Our second example is different as it involves an actual parameter and -also time. We have the Mathieu\'s Equation - -$$\nabla^{2} y + \left(p - 2q \cos(2x)\right)y = 0$$ - -and the aim is to compute the fourth eigenvalue $q=5$. There are three -boundary conditions - -$$\nabla y(0) = 0, \quad \nabla y(\pi) = 0, \quad y(0) = 1$$ - -and we aim to solve it by converting it to a first order ODE and tackle -it as an IVP. As our model object does not allow the use of the time -component in the equations, we introduce a anxiliary state $\tau$ that -replaces time $t$. Rewrite the equations using -$y_{0} = y, y_{1} = \nabla y$ and define our model as - -::: {.ipython} -In \[1\]: stateList = \[\'y0\', \'y1\', \'tau\'\] - -In \[2\]: paramList = \[\'p\'\] - -In \[3\]: ode1 = Transition(\'y0\', \'y1\', TransitionType.ODE) - -In \[4\]: ode2 = Transition(\'y1\', \'-(p - 2\*5\*cos(2\*tau))\*y0\', -TransitionType.ODE) - -In \[5\]: ode3 = Transition(\'tau\', \'1\', TransitionType.ODE) - -In \[6\]: model = DeterministicOde(stateList, paramList, ode=\[ode1, -ode2, ode3\]) - -In \[7\]: theta = \[1.0, 1.0, 0.0\] - -In \[8\]: p = 15.0 - -In \[9\]: t = numpy.linspace(0, numpy.pi) - -In \[10\]: model.parameters = \[(\'p\',p)\] - -In \[11\]: model.initial_values = (theta, t\[0\]) - -In \[12\]: solution = model.integrate(t\[1::\]) - -In \[13\]: f = plt.figure() - -\@savefig bvp2_random_guess_plot.png In \[14\]: model.plot() - -In \[15\]: plt.close() -::: - -Now we are ready to setup the estimation. Like before, we setup the -second boundary condition by pretending that it is an observation. We -have all the initial conditions defined by the first boundary condition - -::: {.ipython} -In \[1\]: obj = SquareLoss(15.0, model, x0=\[1.0, 0.0, 0.0\], t0=0.0, -t=numpy.pi, y=0.0, state_name=\'y1\') - -In \[2\]: xhatObj = minimize(obj.cost,\[15\]) - -In \[3\]: print(xhatObj) - -In \[4\]: model.parameters = \[(\'p\', xhatObj\[\'x\'\]\[0\])\] - -In \[5\]: model.initial_values = (\[1.0, 0.0, 0.0\], t\[0\]) - -In \[5\]: solution = model.integrate(t\[1::\]) - -In \[6\]: f = plt.figure() - -\@savefig bvp2_solution_plot.png In \[7\]: model.plot() - -In \[8\]: plt.close() -::: - -The plot of the solution shows the path that satisfies all boundary -condition. The last subplot is time which obvious is redundant here but -the `DeterministicOde.plot`{.interpreted-text role="meth"} method is not -yet able to recognize the time component. Possible speed up can be -achieved through the use of derivative information or via root finding -method that tackles the gradient directly, instead of the cost function. - -**Reference** - -[^1]: diff --git a/docs/pygom-doc/_build/html/_sources/mdconvert/mod/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/mod/.md deleted file mode 100644 index 8c6b1b35..00000000 --- a/docs/pygom-doc/_build/html/_sources/mdconvert/mod/.md +++ /dev/null @@ -1,5 +0,0 @@ -# stochastic - -::: {.automodule members="" noindex=""} -pygom.model.simulate -::: diff --git a/docs/pygom-doc/_build/html/_sources/mdconvert/unroll/.md b/docs/pygom-doc/_build/html/_sources/mdconvert/unroll/.md deleted file mode 100644 index 07b17497..00000000 --- a/docs/pygom-doc/_build/html/_sources/mdconvert/unroll/.md +++ /dev/null @@ -1,57 +0,0 @@ -# Simple Problem {#unrollSimple} - -For a simple problem, we consider the SIR model defined by - -$$\begin{aligned} -\frac{dS}{dt} &= -\beta SI \\ -\frac{dI}{dt} &= \beta SI - \gamma I \\ -\frac{dR}{dt} &= \gamma I. -\end{aligned}$$ - -which consists of two transitions - -::: {.graphviz} - -digraph SIR_Model { - -: rankdir=LR; size=\"8\" node \[shape = circle\]; S -\> I \[ label = - \"βSI\" \]; I -\> R \[ label = \"γI\" \]; - -} -::: - -Let\'s define this using the code block below - -::: {.ipython} -In \[1\]: from pygom import SimulateOde, Transition, TransitionType - -In \[2\]: ode1 = Transition(origin=\'S\', equation=\'-beta\*S\*I\', -transition_type=TransitionType.ODE) - -In \[3\]: ode2 = Transition(origin=\'I\', equation=\'beta\*S\*I - -gamma\*I\', transition_type=TransitionType.ODE) - -In \[4\]: ode3 = Transition(origin=\'R\', equation=\'gamma\*I\', -transition_type=TransitionType.ODE) - -In \[6\]: stateList = \[\'S\', \'I\', \'R\'\] - -In \[7\]: paramList = \[\'beta\', \'gamma\'\] - -In \[8\]: ode = SimulateOde(stateList, - -: \...: paramList, \...: ode=\[ode1, ode2, ode3\]) - -In \[9\]: ode.get_transition_matrix() -::: - -and the last line shows that the transition matrix is empty. This is the -expected result because `SimulateOdeModel`{.interpreted-text -role="class"} was not initialized using transitions. We populate the -transition matrix below and demonstrate the difference. - -::: {.ipython} -In \[1\]: ode = ode.get_unrolled_obj() - -In \[2\]: ode.get_transition_matrix() -::: diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/bvpSimple.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/bvpSimple.ipynb deleted file mode 100644 index 6ca0ce57..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/bvpSimple.ipynb +++ /dev/null @@ -1,198 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Solving Boundary Value Problems\n", - "\n", - "In addition to finding solutions for an IVP and estimate the unknown\n", - "parameters, this package also allows you to solve BVP with a little bit\n", - "of imagination. Here, we are going to show how a BVP can be solved by\n", - "treating it as a parameter estimation problem. Essentially, a shooting\n", - "method where the first boundary condition defines the initial condition\n", - "of an IVP and the second boundary condition is an observation. Two\n", - "examples, both from MATLAB[1], will be shown here.\n", - "\n", - "## Simple model 1\n", - "\n", - "We are trying to find the solution to the second order differential\n", - "equation\n", - "\n", - "$$\\nabla^{2} y + |y| = 0$$\n", - "\n", - "subject to the boundary conditions $y(0) = 0$ and $y(4) = -2$. Convert\n", - "this into a set of first order ODE\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{d y_{0}}{dt} &= y_{1} \\\\\n", - "\\frac{d y_{1}}{dt} &= -|y_{0}|\n", - "\\end{aligned}$$\n", - "\n", - "using an auxiliary variable $y_{1} = \\nabla y$ and $y_{0} = y$. Setting\n", - "up the system below\n", - "\n", - "In \\[1\\]: from pygom import Transition, TransitionType,\n", - "DeterministicOde, SquareLoss\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[2\\]: stateList = \\['y0', 'y1'\\]\n", - "\n", - "In \\[3\\]: paramList = \\[\\]\n", - "\n", - "In \\[4\\]: ode1 = Transition(origin='y0', \n", - "...: equation='y1', ...: transition_type=TransitionType.ODE)\n", - "\n", - "In \\[5\\]: ode2 = Transition(origin='y1', \n", - "...: equation='-abs(y0)', ...: transition_type=TransitionType.ODE)\n", - "\n", - "In \\[6\\]: model = DeterministicOde(stateList, \n", - "...: paramList, ...: ode=\\[ode1, ode2\\])\n", - "\n", - "In \\[7\\]: model.get_ode_eqn()\n", - "\n", - "We check that the equations are correct before proceeding to set up our\n", - "loss function.\n", - "\n", - "In \\[1\\]: import numpy\n", - "\n", - "In \\[2\\]: from scipy.optimize import minimize\n", - "\n", - "In \\[3\\]: initialState = \\[0.0, 1.0\\]\n", - "\n", - "In \\[4\\]: t = numpy.linspace(0, 4, 100)\n", - "\n", - "In \\[5\\]: model.initial_values = (initialState, t\\[0\\])\n", - "\n", - "In \\[6\\]: solution = model.integrate(t\\[1::\\])\n", - "\n", - "In \\[7\\]: f = plt.figure()\n", - "\n", - "@savefig bvp1_random_guess_plot.png In \\[8\\]: model.plot()\n", - "\n", - "In \\[9\\]: plt.close()\n", - "\n", - "Setting up the second boundary condition $y(4) = -2$ is easy, because\n", - "that is just a single observation attached to the state $y_{1}$.\n", - "Enforcing the first boundary condition requires us to set it as the\n", - "initial condition. Because the condition only states that $y(0) = 0$,\n", - "the starting value of the other state $y_1$ is free. We let our loss\n", - "object know that it is free through the targetState input argument.\n", - "\n", - "In \\[10\\]: theta = \\[0.0\\]\n", - "\n", - "In \\[11\\]: obj = SquareLoss(theta=theta, \n", - ".…: ode=model, .…: x0=initialState, .…: t0=t\\[0\\], .…: t=t\\[-1\\], .…:\n", - "y=\\[-2\\], .…: state_name=\\['y0'\\], .…: target_state=\\['y1'\\])\n", - "\n", - "In \\[12\\]: thetaHat = minimize(fun=obj.costIV, x0=\\[0.0\\])\n", - "\n", - "In \\[13\\]: print(thetaHat)\n", - "\n", - "In \\[14\\]: model.initial_values = (\\[0.0\\] + thetaHat\\['x'\\].tolist(),\n", - "t\\[0\\])\n", - "\n", - "In \\[15\\]: solution = model.integrate(t\\[1::\\])\n", - "\n", - "In \\[16\\]: f = plt.figure()\n", - "\n", - "@savefig bvp1_solution_plot.png In \\[17\\]: model.plot()\n", - "\n", - "In \\[18\\]: plt.close()\n", - "\n", - "We are going to visualize the solution, and also check the boundary\n", - "condition. The first became our initial condition, so it is always\n", - "satisfied and only the latter is of concern, which is zero (subject to\n", - "numerical error) from thetaHat.\n", - "\n", - "## Simple model 2\n", - "\n", - "Our second example is different as it involves an actual parameter and\n", - "also time. We have the Mathieu's Equation\n", - "\n", - "$$\\nabla^{2} y + \\left(p - 2q \\cos(2x)\\right)y = 0$$\n", - "\n", - "and the aim is to compute the fourth eigenvalue $q=5$. There are three\n", - "boundary conditions\n", - "\n", - "$$\\nabla y(0) = 0, \\quad \\nabla y(\\pi) = 0, \\quad y(0) = 1$$\n", - "\n", - "and we aim to solve it by converting it to a first order ODE and tackle\n", - "it as an IVP. As our model object does not allow the use of the time\n", - "component in the equations, we introduce a anxiliary state $\\tau$ that\n", - "replaces time $t$. Rewrite the equations using\n", - "$y_{0} = y, y_{1} = \\nabla y$ and define our model as\n", - "\n", - "In \\[1\\]: stateList = \\['y0', 'y1', 'tau'\\]\n", - "\n", - "In \\[2\\]: paramList = \\['p'\\]\n", - "\n", - "In \\[3\\]: ode1 = Transition('y0', 'y1', TransitionType.ODE)\n", - "\n", - "In \\[4\\]: ode2 = Transition('y1', '-(p - 2\\*5\\*cos(2\\*tau))\\*y0',\n", - "TransitionType.ODE)\n", - "\n", - "In \\[5\\]: ode3 = Transition('tau', '1', TransitionType.ODE)\n", - "\n", - "In \\[6\\]: model = DeterministicOde(stateList, paramList, ode=\\[ode1,\n", - "ode2, ode3\\])\n", - "\n", - "In \\[7\\]: theta = \\[1.0, 1.0, 0.0\\]\n", - "\n", - "In \\[8\\]: p = 15.0\n", - "\n", - "In \\[9\\]: t = numpy.linspace(0, numpy.pi)\n", - "\n", - "In \\[10\\]: model.parameters = \\[('p',p)\\]\n", - "\n", - "In \\[11\\]: model.initial_values = (theta, t\\[0\\])\n", - "\n", - "In \\[12\\]: solution = model.integrate(t\\[1::\\])\n", - "\n", - "In \\[13\\]: f = plt.figure()\n", - "\n", - "@savefig bvp2_random_guess_plot.png In \\[14\\]: model.plot()\n", - "\n", - "In \\[15\\]: plt.close()\n", - "\n", - "Now we are ready to setup the estimation. Like before, we setup the\n", - "second boundary condition by pretending that it is an observation. We\n", - "have all the initial conditions defined by the first boundary condition\n", - "\n", - "In \\[1\\]: obj = SquareLoss(15.0, model, x0=\\[1.0, 0.0, 0.0\\], t0=0.0,\n", - "t=numpy.pi, y=0.0, state_name='y1')\n", - "\n", - "In \\[2\\]: xhatObj = minimize(obj.cost,\\[15\\])\n", - "\n", - "In \\[3\\]: print(xhatObj)\n", - "\n", - "In \\[4\\]: model.parameters = \\[('p', xhatObj\\['x'\\]\\[0\\])\\]\n", - "\n", - "In \\[5\\]: model.initial_values = (\\[1.0, 0.0, 0.0\\], t\\[0\\])\n", - "\n", - "In \\[5\\]: solution = model.integrate(t\\[1::\\])\n", - "\n", - "In \\[6\\]: f = plt.figure()\n", - "\n", - "@savefig bvp2_solution_plot.png In \\[7\\]: model.plot()\n", - "\n", - "In \\[8\\]: plt.close()\n", - "\n", - "The plot of the solution shows the path that satisfies all boundary\n", - "condition. The last subplot is time which obvious is redundant here but\n", - "the `DeterministicOde.plot` method is not yet able to recognize the time\n", - "component. Possible speed up can be achieved through the use of\n", - "derivative information or via root finding method that tackles the\n", - "gradient directly, instead of the cost function.\n", - "\n", - "**Reference**\n", - "\n", - "[1] " - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/epi.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/epi.ipynb deleted file mode 100644 index 48711b33..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/epi.ipynb +++ /dev/null @@ -1,70 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simple Epidemic Analysis\n", - "\n", - "A common application of ordinary differential equations is in the field\n", - "of epidemiology modeling. More concretely, compartmental models that is\n", - "used to describe disease progression. We demonstrate some of the simple\n", - "algebraic analysis one may wish to take when given a compartment model.\n", - "Our use one of the simplest model, an SIR model with birth and death\n", - "processes, which is an extension of the one in `sir`. First, we\n", - "initialize the model below.\n", - "\n", - "In \\[1\\]: from pygom import common_models\n", - "\n", - "In \\[2\\]: ode = common_models.SIR_Birth_Death()\n", - "\n", - "In \\[3\\]: print(ode.get_ode_eqn())\n", - "\n", - "## Obtaining the R0\n", - "\n", - "The reproduction number, also known as the $R_{0}$, is the single most\n", - "powerful piece and reduced piece of information available from a\n", - "compartmental model. In a nutshell, it provides a single number - if the\n", - "parameters are known - which can the intuitive interpretation where\n", - "$R_{0} = 1$ defines the tipping point of an outbreak. A $R_{0}$ value of\n", - "more than one signifies an potential outbreak where less than one\n", - "indicates that the disease will stop spreading naturally.\n", - "\n", - "To obtain the $R_{0}$, we simply have to tell the function which states\n", - "represent the *disease state*, which in this case is the state **I**.\n", - "\n", - "In \\[1\\]: from pygom.model.epi_analysis import \\*\n", - "\n", - "In \\[2\\]: print(R0(ode, 'I'))\n", - "\n", - "## Algebraic R0\n", - "\n", - "We may also wish to get the $R_{0}$ in pure algebraic term. This can be\n", - "achieved by the following few lines. Note that the result below is\n", - "slightly different from the one above. The difference is due to the\n", - "internal working of the functions, where `getR0` computes the\n", - "disease-free equilibrium value for the states and substitute them back\n", - "into the equation.\n", - "\n", - "In \\[1\\]: F, V = disease_progression_matrices(ode, 'I')\n", - "\n", - "In \\[2\\]: e = R0_from_matrix(F, V)\n", - "\n", - "In \\[3\\]: print(e)\n", - "\n", - "To replicate the output before, we have to find the values where the\n", - "disease-free equilibrium will be achieved. Substitution can then be\n", - "performed to retrieve $R_{0}$ in pure parameters.\n", - "\n", - "In \\[1\\]: dfe = DFE(ode, \\['I'\\])\n", - "\n", - "In \\[2\\]: print(dfe)\n", - "\n", - "In \\[3\\]: print(e\\[0\\].subs(dfe))" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/epijson.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/epijson.ipynb deleted file mode 100644 index 1df66d51..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/epijson.ipynb +++ /dev/null @@ -1,65 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Reading and using EpiJSON data\n", - "\n", - "Epidemiology data is complicated due to the many different stages a\n", - "patient can go through and whether a modeling technique is applicable\n", - "depends heavily on the recording of data. EpiJSON is a framework whih\n", - "tries to captures all the information [\\[Finnie2016\\]](), in a JSON\n", - "format as the name suggests.\n", - "\n", - "This package provides the functionality to process EpiJSON data. Due to\n", - "the nature of this package, modeling of ode, it processes the data file\n", - "with this in mind. The output is therefore in the cumulative form as\n", - "default, shown below, in a `pandas.DataFrame` format. The input can be\n", - "in a string format, a file or already a `dict`.\n", - "\n", - "In \\[1\\]: from pygom.loss.read_epijson import epijson_to_data_frame\n", - "\n", - "In \\[2\\]: import pkgutil\n", - "\n", - "In \\[3\\]: data = pkgutil.get_data('pygom', 'data/eg1.json')\n", - "\n", - "In \\[3\\]: df = epijson_to_data_frame(data)\n", - "\n", - "In \\[4\\]: print(df)\n", - "\n", - "Given that the aim of loading the data is usually for model fitting, we\n", - "allow EpiJSON as input directly to the loss class\n", - "`pygom.loss.EpijsonLoss` which uses the Poisson loss under the hood.\n", - "\n", - "In \\[1\\]: from pygom.model import common_models\n", - "\n", - "In \\[2\\]: from pygom.loss.epijson_loss import EpijsonLoss\n", - "\n", - "In \\[3\\]: ode = common_models.SIR(\\[0.5, 0.3\\])\n", - "\n", - "In \\[4\\]: obj = EpijsonLoss(\\[0.005, 0.03\\], ode, data, 'Death', 'R',\n", - "\\[300, 2, 0\\])\n", - "\n", - "In \\[5\\]: print(obj.cost())\n", - "\n", - "In \\[6\\]: print(obj.\\_df)\n", - "\n", - "Given an initialized object, all the operations are inherited from\n", - "`pygom.loss.BaseLoss`. We demonstrated above how to calculate the cost\n", - "and the rest will not be shown for brevity. The data frame is stored\n", - "inside of the loss object and can be retrieved for inspection at any\n", - "time point.\n", - "\n", - "Rather unfortunately, initial values for the states is still required,\n", - "but the time is not. When the time is not supplied, then the first time\n", - "point in the data will be treated as $t0$. The input Death indicate which column of the data is used\n", - "and $R$ the corresponding state the data belongs to." - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/fh.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/fh.ipynb deleted file mode 100644 index 24e06f9a..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/fh.ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Example: Fitz Hugh\n", - "\n", - "## Defining the model\n", - "\n", - "We are going to investigate another classic model here, the\n", - "FitzHugh-Nagumo, or simply FitzHugh here. The model has already been\n", - "defined in `common_models` so we can load it easily\n", - "\n", - "In \\[1\\]: from pygom import SquareLoss, common_models\n", - "\n", - "In \\[2\\]: import numpy\n", - "\n", - "In \\[3\\]: import scipy.integrate, scipy.optimize\n", - "\n", - "In \\[4\\]: import math,time,copy\n", - "\n", - "In \\[5\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[1\\]: x0 = \\[-1.0, 1.0\\]\n", - "\n", - "In \\[2\\]: t0 = 0\n", - "\n", - "In \\[3\\]: \\# params\n", - "\n", - "In \\[4\\]: paramEval = \\[('a',0.2), ('b',0.2), ('c',3.0)\\]\n", - "\n", - "In \\[5\\]: ode = common_models.FitzHugh(paramEval)\n", - "\n", - "In \\[5\\]: ode.initial_values = (x0, t0)\n", - "\n", - "Define a set of time points and lets see how the two states $V$ and $R$\n", - "are suppose to behave.\n", - "\n", - "In \\[6\\]: t = numpy.linspace(1, 20, 30).astype('float64')\n", - "\n", - "In \\[7\\]: solution = ode.integrate(t)\n", - "\n", - "@savefig fh_plot.png In \\[8\\]: ode.plot()\n", - "\n", - "## Estimate the parameters\n", - "\n", - "Obtaining the correct parameters for the FitzHugh model is well known to\n", - "be difficult, this is because the surface is multimodal. Although this\n", - "has been shown many times in the literature, so we will omit the\n", - "details. Regardless, we give it a go with some initial guess. with some\n", - "luck, we will be able to recover the original parameters. First, we try\n", - "it out with only one target state\n", - "\n", - "In \\[26\\]: theta = \\[0.5, 0.5, 0.5\\]\n", - "\n", - "In \\[27\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", - "'R')\n", - "\n", - "In \\[28\\]: boxBounds = \\[ \n", - ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0) .…: \\]\n", - "\n", - "In \\[29\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", - ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", - "method='L-BFGS-B')\n", - "\n", - "In \\[30\\]: print(res)\n", - "\n", - "Then we try the same again but with both state as our target. Now we\n", - "won't look at the iterations because they are pretty pointless.\n", - "\n", - "In \\[30\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", - "\\['V','R'\\])\n", - "\n", - "In \\[31\\]: res = scipy.optimize.minimize(fun=objFH.cost, \n", - ".…: jac=objFH.sensitivity, .…: x0=theta, .…: bounds=boxBounds, .…:\n", - "method='L-BFGS-B')\n", - "\n", - "In \\[32\\]: print(res)\n", - "\n", - "Note how the estimates are the same, unlike other models.\n", - "\n", - "## Estimate initial value\n", - "\n", - "We can further assume that we have no idea about the initial values for\n", - "$V$ and $R$ as well. We also provide guesstimate to set off the\n", - "optimization. The input vector $\\theta$ must have the parameters first,\n", - "then the initial values, along with the corresponding bounds.\n", - "\n", - "First, only a single target state, i.e. we only have observations for\n", - "one of states which is $R$ in this case\n", - "\n", - "In \\[35\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,1\\],\n", - "'R')\n", - "\n", - "In \\[35\\]: boxBounds = \\[ \n", - ".…: (0.0,5.0), .…: (0.0,5.0), .…: (0.0,5.0), .…: (None,None), .…:\n", - "(None,None) .…: \\]\n", - "\n", - "In \\[36\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", - ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5,0.5\\], .…:\n", - "bounds=boxBounds, .…: method='L-BFGS-B')\n", - "\n", - "In \\[37\\]: print(res)\n", - "\n", - "then both state as target at the same time\n", - "\n", - "In \\[38\\]: objFH = SquareLoss(theta, ode, x0, t0, t, solution\\[1::,:\\],\n", - "\\['V','R'\\])\n", - "\n", - "In \\[38\\]: res = scipy.optimize.minimize(fun=objFH.costIV, \n", - ".…: jac=objFH.sensitivityIV, .…: x0=theta + \\[-0.5, 0.5\\], .…:\n", - "bounds=boxBounds, .…: method='L-BFGS-B')\n", - "\n", - "In \\[39\\]: print(res)\n", - "\n", - "See the difference between the two estimate with the latter, both state\n", - "were used, yielding superior estimates. Note that only the forward\n", - "sensitivity method is implemented when estimating the initial value, and\n", - "it is assumed that the starting condition for all the states are\n", - "unknown.\n", - "\n", - "The choice of algorithm here is the **L-BFGS-B** which is a better\n", - "choice because the parameter space of the FitzHugh is rough (i.e. large\n", - "second derivative) as well as being multimodal. This means that the\n", - "Hessian is not guaranteed to be positive definite and approximation\n", - "using $J^{\\top}J$ is poor, with $J$ being the Jacobian of the objective\n", - "function." - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/gradient.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/gradient.ipynb deleted file mode 100644 index e67c71b3..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/gradient.ipynb +++ /dev/null @@ -1,356 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Gradient estimation under square loss\n", - "\n", - "Assuming that we have a set of $N$ observations $y_{i}$ at specific time\n", - "points $t_{i}$, $i = 1,\\ldots,N$, we may wish to test out a set of ode\n", - "to see whether it fits to the data. The most natural way to test such\n", - "*fit* is to minimize the sum of squares between our observations $y$ and\n", - "see whether the resulting solution of the ode and the estimationed\n", - "parameters makes sense.\n", - "\n", - "We assume that this estimation process will be tackled through a\n", - "non-linear optimization point of view. However, it should be noted that\n", - "such estimates can also be performed via MCMC or from a global\n", - "optimization perspective. A key element in non-linear optimization is\n", - "the gradient, which is the focus of this page.\n", - "\n", - "Multiple ways of obtaining the gradient have been implemented. All of\n", - "them serve a certain purpose and may not be a viable/appropriate options\n", - "depending on the type of ode. More generally, let $d,p$ be the number of\n", - "states and paramters respectively. Then finite difference methods have a\n", - "run order of $O(p+1)$ of the original ode, forward sensitivity require\n", - "an integration of an ode of size $(d+1)p$ rather than $d$. The adjoint\n", - "method require two run of size $d$ in principle, but actual run time is\n", - "dependent on the number of observations.\n", - "\n", - "For the details of the classes and methods, please refer to `mod`.\n", - "\n", - "## Notation\n", - "\n", - "We introduce the notations that will be used in the rest of the page,\n", - "some of which may be slightly unconventional but necessary due to the\n", - "complexity of the problem. Let $x \\in \\mathbb{R}^{d}$ and\n", - "$\\theta \\in \\mathbb{R}^{p}$ be the states and parameters respectively.\n", - "The term *state* or *simulation* are used interchangeably, even though\n", - "strictly speaking a state is $x$ whereas $x(t)$ is the simulation. An\n", - "ode is defined as\n", - "\n", - "$$f(x,\\theta) = \\dot{x} = \\frac{\\partial x}{\\partial t}$$\n", - "\n", - "and usually comes with a set of initial conditions $(x_0,t_0)$ where\n", - "$t_0 \\le t_{i} \\forall i$. Let $g(x,\\theta)$ be a function that maps the\n", - "set of states to the observations,\n", - "$g : \\mathbb{R}^{d} \\rightarrow \\mathbb{R}^{m}$. For compartmental\n", - "problems, which is our focus, $\\nabla_{\\theta}g(x,\\theta)$ is usually\n", - "zero and $\\nabla_{x}g(x,\\theta)$ is an identity function for some or all\n", - "of the states $x$. Denote $l(x_{0},\\theta,x)$ as our cost function\n", - "$l : \\mathbb{R}^{m} \\rightarrow \\mathbb{R}$ and $L(x_{0},\\theta,x)$ be\n", - "the sum of $l(\\cdot)$. Both $x$ and $x_{0}$ are usually dropped for\n", - "simplicity. We will be dealing exclusively with square loss here, which\n", - "means that\n", - "\n", - "$$L(\\theta) = \\sum_{i=1}^{N} \\left\\| y_{i} - g(x(t_{i})) \\right\\|^{2} = \\mathbf{e}^{\\top} \\mathbf{e}$$\n", - "\n", - "where $\\mathbf{e}$ is the residual vector, with elements\n", - "\n", - "$$e_{i} = y_{i} - x(t_{i}).$$\n", - "\n", - "## Model setup\n", - "\n", - "Again, we demonstrate the functionalities of our classes using an SIR\n", - "model.\n", - "\n", - "In \\[1\\]: from pygom import SquareLoss, common_models\n", - "\n", - "In \\[2\\]: import copy,time,numpy\n", - "\n", - "In \\[2\\]: ode = common_models.SIR()\n", - "\n", - "In \\[3\\]: paramEval = \\[('beta',0.5), ('gamma',1.0/3.0) \\]\n", - "\n", - "In \\[7\\]: \\# the initial state, normalized to zero one\n", - "\n", - "In \\[8\\]: x0 = \\[1., 1.27e-6, 0.\\]\n", - "\n", - "In \\[5\\]: \\# initial time\n", - "\n", - "In \\[6\\]: t0 = 0\n", - "\n", - "In \\[5\\]: ode.parameters = paramEval\n", - "\n", - "In \\[6\\]: ode.initial_values = (x0, t0)\n", - "\n", - "In \\[9\\]: \\# set the time sequence that we would like to observe\n", - "\n", - "In \\[10\\]: t = numpy.linspace(1, 150, 100)\n", - "\n", - "In \\[11\\]: numStep = len(t)\n", - "\n", - "In \\[11\\]: solution = ode.integrate(t)\n", - "\n", - "In \\[12\\]: y = solution\\[1::,2\\].copy()\n", - "\n", - "In \\[13\\]: y += numpy.random.normal(0, 0.1, y.shape)\n", - "\n", - "Now we have set up the model along with some observations, obtaining the\n", - "gradient only requires the end user to put the appropriate information\n", - "it into the class `SquareLoss`. Given the initial guess $\\theta$\n", - "\n", - "In \\[210\\]: theta = \\[0.2, 0.2\\]\n", - "\n", - "We initialize the `SquareLoss` simply as\n", - "\n", - "In \\[20\\]: objSIR = SquareLoss(theta, ode, x0, t0, t, y, 'R')\n", - "\n", - "where the we also have to specify the state our observations are from.\n", - "Now, we demonstrate the different methods in obtaining the gradient and\n", - "mathematics behind it.\n", - "\n", - "## Forward sensitivity\n", - "\n", - "The forward sensitivity equations are derived by differentiating the\n", - "states implicitly, which yields\n", - "\n", - "$$\\frac{d\\dot{x}}{d\\theta} = \\frac{\\partial f}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial f}{\\partial \\theta}.$$\n", - "\n", - "So finding the sensitivies $\\frac{dx}{d\\theta}$ simply require another\n", - "integration of a $p$ coupled ode of $d$ dimension, each with the same\n", - "Jacobian as the original ode. This integration is performed along with\n", - "the original ode because of possible non-linearity.\n", - "\n", - "A direct call to the method `sensitivity `\n", - "computed the gradient\n", - "\n", - "In \\[33\\]: gradSens = objSIR.sensitivity()\n", - "\n", - "whereas `.jac` will allow the end user to obtain the Jacobian (of the\n", - "objective function) and the residuals, the information required to get\n", - "the gradient as we see next.\n", - "\n", - "In \\[33\\]: objJac, output = objSIR.jac(full_output=True)\n", - "\n", - "## Gradient\n", - "\n", - "Just the sensitivities alone are not enough to obtain the gradient, but\n", - "we are $90\\%$ there. Differentiating the loss function\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dL}{d\\theta} &= \\nabla_{\\theta} \\sum_{i=1}^{N}\\frac{dl}{dg} \\\\\n", - " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial \\theta} \\\\\n", - " &= \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta} + \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial \\theta}\n", - "\\end{aligned}$$\n", - "\n", - "via chain rule. When $\\frac{\\partial g}{\\partial \\theta} = 0$, the total\n", - "gradient simplifies to\n", - "\n", - "$$\\frac{dL}{d\\theta} = \\sum_{i=1}^{N} \\frac{\\partial l}{\\partial g}\\frac{\\partial g}{\\partial x}\\frac{dx}{d\\theta}$$\n", - "\n", - "Obviously, the time indicies are dropped above but all the terms above\n", - "are evaluated only at the observed time points. More concretely, this\n", - "means that\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{\\partial l(x(j),\\theta)}{\\partial g} = \\left\\{ \\begin{array}{ll} -2(y_{i} - x(j)) & , \\; j = t_{i} \\\\ 0 & \\; \\text{otherwise} \\end{array} \\right.\n", - "\\end{aligned}$$\n", - "\n", - "When $g(\\cdot)$ is an identity function (which is assumed to be the case\n", - "in `SquareLoss`)\n", - "\n", - "$$\\frac{\\partial g(x(t_{i}),\\theta)}{\\partial x} = I_{d}$$\n", - "\n", - "then the gradient simplifies even further as it is simply\n", - "\n", - "$$\\frac{dL}{d\\theta} = -2\\mathbf{e}^{\\top}\\mathbf{S}$$\n", - "\n", - "where $\\mathbf{e}$ is the vector of residuals and\n", - "$\\mathbf{S} = \\left[\\mathbf{s}_{1},\\mathbf{s}_{2},\\ldots,\\mathbf{s}_{n}\\right]$\n", - "with elements\n", - "\n", - "$$\\mathbf{s}_{i} = \\frac{dx}{d\\theta}(t_{i}),$$\n", - "\n", - "the solution of the forward sensitivies at time $t_{i}$, obtained from\n", - "solving the coupled ode as mentioned previously.\n", - "\n", - "## Jacobian\n", - "\n", - "Now note how the gradient simplifies to $-2\\mathbf{e}^{\\top}\\mathbf{S}$.\n", - "Recall that a standard result in non-linear programming states that the\n", - "gradient of a sum of sqaures objective function $L(\\theta,y,x)$ is\n", - "\n", - "$$\\nabla_{\\theta} L(\\theta,y,x) = -2(\\mathbf{J}^{T} \\left[\\mathbf{y} - \\mathbf{f}(x,\\boldsymbol{\\theta}) \\right] )^{\\top}$$\n", - "\n", - "with $f(x,\\theta)$ our non-linear function and $J$ our Jacobian with\n", - "elements\n", - "\n", - "$$J_{i} = \\frac{\\partial f(x_{i},\\boldsymbol{\\theta})}{\\partial \\boldsymbol{\\theta}}.$$\n", - "\n", - "This is exactly what we have seen previously, substituting in reveals\n", - "that $J = \\mathbf{S}$. Hence, the Jacobian is (a necessary)by product\n", - "when we wish to obtain the gradient. In fact, this is exactly how we\n", - "proceed in `sensitivity ` where it makes\n", - "an internal call to `jac ` to obtain the Jacobian\n", - "first. This allows the end user to have more options when choosing which\n", - "type of algorithms to use, i.e. Gauss-Newton or Levenberg-Marquardt.\n", - "\n", - "To check that the output is in fact the same\n", - "\n", - "In \\[1\\]: objJac.transpose().dot(-2\\*output\\['resid'\\]) - gradSens\n", - "\n", - "## Adjoint\n", - "\n", - "When the number of parameters increases, the number of sensitivies also\n", - "increases. The time required scales directly with the number of\n", - "parameters. We describe another method which does not depend on the\n", - "number of parameters, but rather, the number of states and observations.\n", - "\n", - "The full derivations will not be shown here, but we aim to provide\n", - "enough information to work out the steps performed in the our code. Let\n", - "write our optimization problem as\n", - "\n", - "$$\\begin{aligned}\n", - "min_{\\theta} \\quad & \\int_{t_{0}}^{T} l(x_{0},\\theta,x(t)) dt \\\\\n", - "s.t. \\quad & \\dot{x} = f(x,\\theta)\n", - "\\end{aligned}$$\n", - "\n", - "which is identical to the original problem but in a continuous setting.\n", - "Now write the constrained problem in the Lagrangian form\n", - "\n", - "$$min_{\\theta} \\; L(\\theta) + \\int_{t_{0}}^{T} \\lambda^{\\top}(\\dot{x} - f(x,\\theta))$$\n", - "\n", - "with Lagrangian multiplier $\\lambda \\ge 0$. After some algebraic\n", - "manipulation, it can be shown that the total derivative of the\n", - "Lagrangian function is\n", - "\n", - "$$\\frac{dL}{d\\theta} = \\int_{t_{0}}^{T} \\left(\\frac{\\partial l}{\\partial \\theta} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta} \\right) dt.$$\n", - "\n", - "Using previously defined loss functions (the identity), the first term\n", - "is zero and evaluating $\\frac{\\partial f}{\\partial \\theta}$ is trivial.\n", - "What remains is the calculation of $\\lambda(t)$ for\n", - "$t \\in \\left[t_{0},T\\right]$.\n", - "\n", - "Although this still seem to be ill-posed problem when Looking at the\n", - "Lagrangian function, one can actually obtain the *adjoint equation*,\n", - "after certain assumptions and\n", - "\n", - "$$\\frac{d\\lambda^{\\top}}{dt} = \\frac{\\partial l}{\\partial x} - \\lambda^{\\top}\\frac{\\partial f}{\\partial \\theta}.$$\n", - "\n", - "which is again an integration. An unfortunate situation arise here for\n", - "non-linear systems because we use the minus Jacobian in the adjoint\n", - "equation. So if the eigenvalues of the Jacobian indicate that our\n", - "original ode is stable, such as -1, the minus eigenvalues (now 1)\n", - "implies that the adjoint equation is not stable. Therefore, one must\n", - "integrate backward in time to solve the adjoint equation and it cannot\n", - "be solved simultaneously as the ode, unlike the forward sensitivity\n", - "equations.\n", - "\n", - "Given a non-linearity ode, we must store information about the states\n", - "between $t_{0}$ and $T$ in order to perform the integration. There are\n", - "two options, both require storing many evaluated $x(j)$ within the\n", - "interval $\\left[t_{0},T\\right]$. Unfortunately, only one is available;\n", - "interpolation over all states and integrate using the interpolating\n", - "functions. The alternative of using observed $x(j)'s$ at fixed points is\n", - "not competitive because we are unable to use fortran routines for the\n", - "integration\n", - "\n", - "The method of choice here to perform the adjoint calcuation is to run a\n", - "forward integration, then perform an interpolation using splines with\n", - "explicit knots at the observed time points.\n", - "\n", - "In \\[326\\]: odeSIRAdjoint, outputAdjoint =\n", - "objSIR.adjoint(full_output=True)\n", - "\n", - "This is because evaluating the Jacobian may be expensive and Runge-kutta\n", - "method suffers as the complexity increases. In non-linear model such as\n", - "those found in epidemiology, each element of the Jacobian may be the\n", - "result of a complicated equation where linear step method will shine as\n", - "it makes as little function evaluation as possible. Note that\n", - "derivations in the literature, the initial condition when evaluating the\n", - "adjoint equation is $\\lambda(T)=0$. But in our code we used\n", - "$\\lambda(T) = -2(y(T)-x(T))$. Recall that we have observation $y(T)$ and\n", - "simulation $x(T)$, so that the adjoint equation evaluated at time $T$\n", - "\n", - "$$\\frac{\\partial \\lambda^{\\top}}{\\partial t} \\Big|_{T} = -2(y-f(x,\\theta))\\Big|_{T} - \\lambda(T)\\frac{\\partial f}{\\partial \\theta}\\Big|_{T}$$\n", - "\n", - "with the second term equal to zero. Integration under step size $h$\n", - "implies that\n", - "$\\lambda(T) \\approx \\lim_{h \\to 0} \\lambda(T-h) = -2(y(T)-x(T))$.\n", - "\n", - "## Time Comparison\n", - "\n", - "A simple time comparison between the different methods reveals that the\n", - "forward sensitivity method dominates the others by a wide margin. It\n", - "will be tempting to conclude that it is the best and should be the\n", - "default at all times but that is not true, due to the complexity of each\n", - "method mentioned previously. We leave it to the end user to find out the\n", - "best method for their specific problem.\n", - "\n", - "In \\[319\\]: %timeit gradSens = objSIR.sensitivity()\n", - "\n", - "In \\[326\\]: %timeit odeSIRAdjoint,outputAdjoint =\n", - "objSIR.adjoint(full_output=True)\n", - "\n", - "## Hessian\n", - "\n", - "The Hessian is defined by\n", - "\n", - "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\frac{\\partial l}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\frac{\\partial x}{\\partial \\theta}^{\\top}\\frac{\\partial^{2} l}{\\partial x^{2}}\\frac{\\partial x}{\\partial \\theta}$$\n", - "\n", - "where $\\otimes$ is the Kronecker product. Note that $\\nabla_{\\theta} x$\n", - "is the sensitivity and the second order sensitivities can be found again\n", - "via the forward method, which involve another set of ode's, namely the\n", - "forward-forward sensitivities\n", - "\n", - "$$\\frac{\\partial}{\\partial t}\\left(\\frac{\\partial^{2} x}{\\partial \\theta^{2}}\\right) = \\left( \\frac{\\partial f}{\\partial x} \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + \\left( I_{d} \\otimes \\frac{\\partial x}{\\partial \\theta}^{\\top} \\right) \\frac{\\partial^{2} f}{\\partial x^{2}} \\frac{\\partial x}{\\partial \\theta}.$$\n", - "\n", - "From before, we know that\n", - "\n", - "$$\\frac{\\partial l}{\\partial x} = (-2y+2x) \\quad and \\quad \\frac{\\partial^{2} l}{\\partial x^{2}} = 2I_{d}$$\n", - "\n", - "so our Hessian reduces to\n", - "\n", - "$$\\frac{\\partial^{2} l}{\\partial \\theta^{2}} = \\left( \\left(-2y+2x\\right) \\otimes I_{p} \\right) \\frac{\\partial^{2} x}{\\partial \\theta^{2}} + 2S^{\\top}S,$$\n", - "\n", - "where the second term is a good approximation to the Hessian as\n", - "mentioned previously. This is the only implementation in place so far\n", - "even though obtaining the estimate this way is relatively slow.\n", - "\n", - "Just to demonstate how it works, lets look at the Hessian at the optimal\n", - "point. First, we obtain the optimal value\n", - "\n", - "In \\[211\\]: import scipy.linalg,scipy.optimize\n", - "\n", - "In \\[212\\]: boxBounds = \\[(0.0, 2.0), (0.0, 2.0)\\]\n", - "\n", - "In \\[213\\]: res = scipy.optimize.minimize(fun=objSIR.cost, \n", - ".….: jac=objSIR.sensitivity, .….: x0=theta, .….: bounds=boxBounds, .….:\n", - "method='L-BFGS-B')\n", - "\n", - "Then compare again the least square estimate of the covariance matrix\n", - "against our version\n", - "\n", - "In \\[211\\]: resLS, cov_x, infodict, mesg, ier =\n", - "scipy.optimize.leastsq(func=objSIR.residual, x0=res\\['x'\\],\n", - "full_output=True)\n", - "\n", - "In \\[212\\]: HJTJ, outputHJTJ = objSIR.hessian(full_output=True)\n", - "\n", - "In \\[311\\]: print(scipy.linalg.inv(HJTJ))\n", - "\n", - "In \\[312\\]: print(cov_x)\n", - "\n", - "also note the difference between the Hessian and the approximation using\n", - "the Jacobian, which is in fact what the least squares routine uses.\n", - "\n", - "In \\[313\\]: print(scipy.linalg.inv(outputHJTJ\\['JTJ'\\]))" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb deleted file mode 100644 index 0767ca96..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/sir.ipynb +++ /dev/null @@ -1,867 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Motivating Example: SIR Model\n", - "\n", - "## Defining the model\n", - "\n", - "First, we are going to go through an SIR model to show the functionality\n", - "of the package. The SIR model is defined by the following equations\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dS}{dt} &= -\\beta SI \\\\\n", - "\\frac{dI}{dt} &= \\beta SI- \\gamma I \\\\\n", - "\\frac{dR}{dt} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "We can set this up as follows:" - ] - }, - { - "cell_type": "markdown", - "id": "586834ab", - "metadata": {}, - "source": [ - "1. import the classes required to define the transitions" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "4c80a36a", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import Transition, TransitionType" - ] - }, - { - "cell_type": "markdown", - "id": "0ec4c9d0", - "metadata": {}, - "source": [ - "2. define our states, in this case the population states of **S**usceptible, **I**nfected and **R**emoved" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "3ce016f2", - "metadata": {}, - "outputs": [], - "source": [ - "stateList = ['S', 'I', 'R']" - ] - }, - { - "cell_type": "markdown", - "id": "021a1927", - "metadata": {}, - "source": [ - "3. define the set of parameters for our model, here there are only two" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "441e2287", - "metadata": {}, - "outputs": [], - "source": [ - "paramList = ['beta', 'gamma']" - ] - }, - { - "cell_type": "markdown", - "id": "dfd736b2", - "metadata": {}, - "source": [ - "4. specify the transitions of the modelled states; this will form our ODE system" - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "b5f80ab0", - "metadata": {}, - "outputs": [], - "source": [ - "odeList = [\n", - " Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE),\n", - " Transition(origin='I',equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE),\n", - " Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE) \n", - " ]" - ] - }, - { - "cell_type": "markdown", - "id": "21629e7b", - "metadata": {}, - "source": [ - "```{note}\n", - "Here, we have invoked a class from `Transition` to define the ODE object. We proceed here and ignore the details for now. The details of defining a transition object will be covered later in {doc}`transition`. Both the set of states and parameters should be defined when constructing the object, even though not explicitly enforced, to help clarify what we are trying to model. Similarly, this holds for the rest, such as the derived parameters and transitions, where we force the end user to input the different type of transition/process via the correct argument. See {ref}`transition:defining-the-equations` for an example when the input is wrong.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "69bfb7c3", - "metadata": {}, - "source": [ - "\n", - "5. import the ode module" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "f78c33d4", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import DeterministicOde" - ] - }, - { - "cell_type": "markdown", - "id": "477d6f84", - "metadata": {}, - "source": [ - "6. initialize the model, which constructs our ODE system from all the information we have provided" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "c9fbcce0", - "metadata": {}, - "outputs": [], - "source": [ - "model = DeterministicOde(stateList, paramList, ode=odeList)" - ] - }, - { - "cell_type": "markdown", - "id": "4bf43064", - "metadata": {}, - "source": [ - "That is all the information required to define a simple SIR model. We can verify the model using" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "6ad54e09", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "143a6871", - "metadata": {}, - "source": [ - "where we can see the equations corresponding to their respective $S,I$ and $R$ state. " - ] - }, - { - "cell_type": "markdown", - "id": "08207474", - "metadata": {}, - "source": [ - "```{note}\n", - "The ordering of the equations is in the standard $S,I,R$ sequence because of how we defined the states initially. \n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "7054e58a", - "metadata": {}, - "source": [ - "We can rearrange the state list," - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "id": "07f81fd1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}I \\gamma\\\\- I S \\beta\\\\I S \\beta - I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ I*gamma],\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma]])" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# now we are going to define in a different order. note that the output ode changed with the input state\n", - "stateList = ['R', 'S', 'I']\n", - "\n", - "model = DeterministicOde(stateList, paramList, ode=odeList)\n", - "\n", - "model.get_ode_eqn()\n" - ] - }, - { - "cell_type": "markdown", - "id": "d3f587d4", - "metadata": {}, - "source": [ - "and find that the set of ODEs comes out in the order that we specified. " - ] - }, - { - "cell_type": "markdown", - "id": "1175c832", - "metadata": {}, - "source": [ - "```{tip}\n", - "In addition to showing the equation form of the ODEs, we can also display them as either symbols or latex code, which can save some extra typing when porting the equations to another document.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "id": "960fdc0c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "⎡dR/dt= I⋅γ ⎤\n", - "⎢ ⎥\n", - "⎢dS/dt= -I⋅S⋅β ⎥\n", - "⎢ ⎥\n", - "⎣dI/dt= I⋅S⋅β - I⋅γ⎦\n" - ] - } - ], - "source": [ - "model.print_ode()" - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "93e32c75", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\\begin{array}{cc}dR/dt= & I \\gamma\\\\dS/dt= & - I S \\beta\\\\dI/dt= & I S \\beta - I \\gamma\\end{array}\n" - ] - } - ], - "source": [ - "model.print_ode(True)" - ] - }, - { - "cell_type": "markdown", - "id": "79c154ba", - "metadata": {}, - "source": [ - "#TODO links to unroll\n", - "Here the SIR model was provided to PyGOM as a set ODEs by using the `Transition` to define them. \n", - "We have also provided the capability to obtain a *best guess* transition matrix when only the ODEs are available. See the section `unrollOde` for more information, and in particular `unrollSimple` for the continuing demonstration of the SIR model." - ] - }, - { - "cell_type": "markdown", - "id": "51ed6fa2", - "metadata": {}, - "source": [ - "## Extracting model information\n", - "\n", - "We may wish to determine if the set of ODEs are linear. " - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "61684654", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.linear_ode()" - ] - }, - { - "cell_type": "markdown", - "id": "4cf58543", - "metadata": {}, - "source": [ - "Since we know that the SIR model is not linear, we may want to have a look at the Jacobian.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "1c8ff090", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & 0 & \\gamma\\\\0 & - I \\beta & - S \\beta\\\\0 & I \\beta & S \\beta - \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[0, 0, gamma],\n", - "[0, -I*beta, -S*beta],\n", - "[0, I*beta, S*beta - gamma]])" - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_jacobian_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "bab79c98", - "metadata": {}, - "source": [ - "Or maybe we want to know the gradient." - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "abb02502", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & I\\\\- I S & 0\\\\I S & - I\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ 0, I],\n", - "[-I*S, 0],\n", - "[ I*S, -I]])" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.get_grad_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "9d0052ec", - "metadata": {}, - "source": [ - "```{Warning}\n", - "Invoking the functions that compute the derivatives, $f(x)$, `model.ode()` or `model.jacobian()`, will return an error\n", - "\n", - "These functions are used to solve the ODEs numerically, and require values of initial state values, time, and parameter values.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "35abe902", - "metadata": {}, - "source": [ - "For setting initial conditions, the numeric values of the states **must** be set in the same order that list of states appear. We can use the following to check the state ordering, as well as displaying all of the states that we have included." - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "e703c888", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[ODEVariable('R', 'R', None, True),\n", - " ODEVariable('S', 'S', None, True),\n", - " ODEVariable('I', 'I', None, True)]" - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "model.state_list" - ] - }, - { - "cell_type": "markdown", - "id": "54e681d0", - "metadata": {}, - "source": [ - "#TODO unsure if this is needed\n", - "There is currently no mechanism to set the numeric initial conditions the states when the states are defined. This is because of an implementation issue with external package, such as solving an initial value problem." - ] - }, - { - "cell_type": "markdown", - "id": "13bed7f9", - "metadata": {}, - "source": [ - "## Initial value problem\n", - "\n", - "By setting the state initial conditions, time, and parameters, we can evaluate our model." - ] - }, - { - "cell_type": "markdown", - "id": "04fb8dd9", - "metadata": {}, - "source": [ - "1. Define the model parameters. (We can call the parameters to check what we must provide.)" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "46042ebf", - "metadata": {}, - "outputs": [], - "source": [ - "model.parameters" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "id": "9ec016b5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{beta: 0.5, gamma: 0.3333333333333333}" - ] - }, - "execution_count": 77, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "paramEval = [('beta',0.5), ('gamma',1.0/3.0)]\n", - "\n", - "model.parameters = paramEval\n", - "\n", - "model.parameters" - ] - }, - { - "cell_type": "markdown", - "id": "efcdac90", - "metadata": {}, - "source": [ - "2. Provide initial conditions for the states." - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "c43074c6", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ 4.23333333e-07, -6.35000000e-07, 2.11666667e-07])" - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "initialState = [0, 1, 1.27e-6]\n", - " \n", - "model.ode(state=initialState, t=1)" - ] - }, - { - "cell_type": "markdown", - "id": "a8dc4681", - "metadata": {}, - "source": [ - "\n", - "3. Implement an ODE solver.\n", - "\n", - "We are well equipped to solve an initial value problem, using the standard numerical integrator such as `odeint ` from `scipy.integrate`. We also used `matplotlib.pyplot` for plotting and `linspace ` to create the time vector." - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "id": "a14b9901", - "metadata": {}, - "outputs": [], - "source": [ - "import scipy.integrate\n", - "import numpy\n", - "\n", - "t = numpy.linspace(0, 150, 100)\n", - "\n", - "solution = scipy.integrate.odeint(model.ode, initialState, t)" - ] - }, - { - "cell_type": "markdown", - "id": "c4feebae", - "metadata": {}, - "source": [ - "We can plot our solution to observe a standard SIR shape." - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "id": "8303885c", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABr1UlEQVR4nO3dd3wUdf7H8dfuJtk0UiCQEAgkhF4EqQIqKlGkiBW7FEVOjwORs+GpnPpTLHcKp5ycnApWUFROBVQERJROAEF6h0ACIZBed+f3x5KFkADZkM0mm/dT57Gz3/nOzOe7wOaT73znOybDMAxEREREvITZ0wGIiIiIVCYlNyIiIuJVlNyIiIiIV1FyIyIiIl5FyY2IiIh4FSU3IiIi4lWU3IiIiIhXUXIjIiIiXkXJjYiIiHgVJTciUmGxsbEMHz68Ss41fPhwYmNjq+RcNdnPP/+MyWTi559/dnnfGTNmYDKZ2LdvX6XHJVKVlNyIVDObNm3itttuo2nTpvj7+9OoUSOuvfZa3nrrrRL1Xn75ZebOneuZIKsxu93Ohx9+SI8ePahbty516tShZcuWDB06lJUrVzrrFScBc+bMcZYV/3AvXnx8fGjUqBHDhw8nKSnJE80RkQrw8XQAInLa8uXLufrqq2nSpAkPPvggUVFRHDx4kJUrVzJlyhTGjBnjrPvyyy9z2223cdNNN3ku4Gpo7NixTJ06lRtvvJF77rkHHx8ftm/fzoIFC2jWrBmXXXbZBY/xwgsvEBcXR15eHitXrmTGjBn8+uuvbN68GX9//ypohYhcDCU3ItXISy+9RGhoKGvWrCEsLKzEtqNHj3omqCqSl5eHn58fZnPFO5RTUlL497//zYMPPsi7775bYtvkyZM5duxYuY7Tv39/unbtCsDIkSOJiIjg1Vdf5ZtvvuH222+vcHwiUjV0WUqkGtm9ezft2rUrldgANGjQwLluMpnIzs5m5syZzksoxWNf9u/fz5///GdatWpFQEAA9erVY8iQIaXGURRfgvntt98YP3489evXJygoiJtvvrlUEmAYBv/3f/9H48aNCQwM5Oqrr+aPP/4oFWNaWhqPPfYYHTp0IDg4mJCQEPr378/GjRtL1Cu+JDRr1iyeeeYZGjVqRGBgIBkZGQDMnTuX9u3b4+/vT/v27fn666/L9fnt3bsXwzDo3bt3qW0mk6nEZ+iKK664AnD8+VzI8OHDCQ4O5sCBAwwaNIjg4GAaNWrE1KlTAcdlx2uuuYagoCCaNm3Kp59+WuoYe/bsYciQIdStW5fAwEAuu+wy5s2bV6reoUOHuOmmmwgKCqJBgwY8+uij5OfnlxnXqlWruP766wkNDSUwMJA+ffrw22+/ufIxiNQY6rkRqUaaNm3KihUr2Lx5M+3btz9nvY8++oiRI0fSvXt3Ro0aBUB8fDwAa9asYfny5dx55500btyYffv28c4773DVVVexZcsWAgMDSxxrzJgxhIeHM3HiRPbt28fkyZP5y1/+wuzZs511nnvuOf7v//6PAQMGMGDAABITE7nuuusoKCgocaw9e/Ywd+5chgwZQlxcHCkpKfznP/+hT58+bNmyhejo6BL1X3zxRfz8/HjsscfIz8/Hz8+PH3/8kVtvvZW2bdsyadIkjh8/zogRI2jcuHG5Pj+AL774giFDhpRqa0UVJ4bh4eHlqm+z2ejfvz9XXnklr732Gp988gl/+ctfCAoK4m9/+xv33HMPt9xyC9OmTWPo0KH07NmTuLg4wNH71KtXL3Jychg7diz16tVj5syZDB48mDlz5nDzzTcDkJubS9++fTlw4ABjx44lOjqajz76iMWLF5eKZ/HixfTv358uXbowceJEzGYzH3zwAddccw3Lli2je/fulfI5iVQbhohUGz/++KNhsVgMi8Vi9OzZ03jiiSeMH374wSgoKChVNygoyBg2bFip8pycnFJlK1asMADjww8/dJZ98MEHBmAkJCQYdrvdWf7oo48aFovFOHnypGEYhnH06FHDz8/PGDhwYIl6Tz/9tAGUiCEvL8+w2Wwlzr13717DarUaL7zwgrNsyZIlBmA0a9asVLydOnUyGjZs6Dx/8ecCGE2bNi3VtrMNHTrUAIzw8HDj5ptvNv7xj38YW7duLVWvOIYvvvii1Gfy008/GceOHTMOHjxozJkzx6hfv75htVqNgwcPXvD8w4YNMwDj5ZdfdpadOHHCCAgIMEwmkzFr1ixn+bZt2wzAmDhxorNs3LhxBmAsW7bMWZaZmWnExcUZsbGxzs938uTJBmB8/vnnznrZ2dlG8+bNDcBYsmSJYRiGYbfbjRYtWhj9+vUr8eeXk5NjxMXFGddee22p9u/du/eC7RSpznRZSqQaufbaa1mxYgWDBw9m48aNvPbaa/Tr149GjRrxzTfflOsYAQEBzvXCwkKOHz9O8+bNCQsLIzExsVT9UaNGYTKZnO+vuOIKbDYb+/fvB+Cnn36ioKCAMWPGlKg3bty4UseyWq3OMTM2m43jx48THBxMq1atyjz3sGHDSsR75MgRNmzYwLBhwwgNDS3xubRt27Zc7f/ggw94++23iYuL4+uvv+axxx6jTZs29O3bt9x3PCUkJFC/fn1iYmK47bbbCAoK4ptvvilX71GxkSNHOtfDwsJo1aoVQUFBJcbstGrVirCwMPbs2eMsmz9/Pt27d+fyyy93lgUHBzNq1Cj27dvHli1bnPUaNmzIbbfd5qwXGBjo7MkrtmHDBnbu3Mndd9/N8ePHSU1NJTU1lezsbPr27csvv/yC3W4vd7tEagIlNyLVTLdu3fjqq684ceIEq1evZsKECWRmZnLbbbc5f7CdT25uLs899xwxMTFYrVYiIiKoX78+J0+eJD09vVT9Jk2alHhffOnlxIkTAM4kp0WLFiXq1a9fv9RlGrvdzptvvkmLFi1KnPv3338v89zFl2KKnetc4EgEysNsNjN69GjWrVtHamoq//vf/+jfvz+LFy/mzjvvLNcxpk6dysKFC5kzZw4DBgwgNTUVq9Varn0B/P39qV+/fomy0NBQGjduXCJBLC4v/qzB8RmU1dY2bdo4txe/Nm/evNTxzt53586dgCORrF+/fonlv//9L/n5+WX+2YjUZBpzI1JN+fn50a1bN7p160bLli0ZMWIEX3zxBRMnTjzvfmPGjOGDDz5g3Lhx9OzZk9DQUEwmE3feeWeZv6FbLJYyj2MYhssxv/zyyzz77LPcf//9vPjii9StWxez2cy4cePKPPeZvTbuUK9ePQYPHszgwYO56qqrWLp0Kfv373eOzTmX7t27O++Wuummm7j88su5++672b59O8HBwRc877k+08r8rMur+HN//fXX6dSpU5l1ytMmkZpEyY1IDVD8g/bIkSPOsrN/Yy82Z84chg0bxj//+U9nWV5eHidPnqzQuYsTgZ07d9KsWTNn+bFjx0r0OBSf++qrr+a9994rUX7y5EkiIiJcOtfZtm/f7nLsZ+ratStLly7lyJEjF0xuzmSxWJg0aRJXX301b7/9Nk899dRFxXEhTZs2LbOt27Ztc24vft28eTOGYZT4u3D2vsUDzUNCQkhISHBX2CLVii5LiVQjS5YsKfO3+Pnz5wMlLzkEBQWVmbBYLJZSx3jrrbew2WwViikhIQFfX1/eeuutEsedPHlyuc79xRdflHusS8OGDenUqRMzZ84scalk4cKF5bokl5ycXGa9goICFi1ahNlspnnz5uWK5UxXXXUV3bt3Z/LkyeTl5bm8vysGDBjA6tWrWbFihbMsOzubd999l9jYWOfYowEDBnD48OESMyzn5OSUmt+nS5cuxMfH849//IOsrKxS5yvv3D8iNYl6bkSqkTFjxpCTk8PNN99M69atKSgoYPny5cyePZvY2FhGjBjhrNulSxd++ukn3njjDaKjo4mLi6NHjx4MGjSIjz76iNDQUNq2bcuKFSv46aefqFevXoViql+/Po899hiTJk1i0KBBDBgwgPXr17NgwYJSvTGDBg3ihRdeYMSIEfTq1YtNmzbxySeflOjxuZBJkyYxcOBALr/8cu6//37S0tJ46623aNeuXZk/nM906NAhunfvzjXXXEPfvn2Jiori6NGjfPbZZ2zcuJFx48aVqwepLI8//jhDhgxhxowZPPTQQxU6Rnk89dRTfPbZZ/Tv35+xY8dSt25dZs6cyd69e/nyyy+dA7YffPBB3n77bYYOHcq6deto2LAhH330Uanb381mM//973/p378/7dq1Y8SIETRq1IikpCSWLFlCSEgI3377rdvaI+IRHrxTS0TOsmDBAuP+++83WrdubQQHBxt+fn5G8+bNjTFjxhgpKSkl6m7bts248sorjYCAgBK3ZJ84ccIYMWKEERERYQQHBxv9+vUztm3bZjRt2rTEbdvFt/2uWbOmxHGLb5EuvpXYMAzDZrMZzz//vNGwYUMjICDAuOqqq4zNmzeXOmZeXp7x17/+1Vmvd+/exooVK4w+ffoYffr0KXWOM2/DPtOXX35ptGnTxrBarUbbtm2Nr776yhg2bNgFbwXPyMgwpkyZYvTr189o3Lix4evra9SpU8fo2bOnMX369BK3Qp/vVvCzP5PizyA+Pt6Ij483ioqKzhnDsGHDjKCgoFLlffr0Mdq1a1eqvGnTpsbAgQNLlO3evdu47bbbjLCwMMPf39/o3r278d1335Xad//+/cbgwYONwMBAIyIiwnjkkUeM77//vtSfn2EYxvr1641bbrnFqFevnmG1Wo2mTZsat99+u7Fo0aJS7det4FLTmQzDjSPZRERERKqYxtyI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s76IiIjULh6/LDV+/HiGDRtG165d6d69O5MnTyY7O5sRI0YAMHToUBo1asSkSZMAeOSRR+jTpw///Oc/GThwILNmzWLt2rW8++67nmyGiIiIVBMeT27uuOMOjh07xnPPPUdycjKdOnXi+++/dw4aPnDgAGbz6Q6mXr168emnn/LMM8/w9NNP06JFC+bOnVuuOW5ERETE+3l8npuqpkn8REREah5Xfn5rTm0RERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8ipIbERER8Soef/xCVSuekDkjI8PDkYiIiEh5Ff/cLs+DFWpdcpOZmQlATEyMhyMRERERV2VmZhIaGnreOrXu2VJ2u53Dhw9Tp04dTCZTpR47IyODmJgYDh48WCueW6X2eje117vVtvZC7Wuzt7XXMAwyMzOJjo4u8UDtstS6nhuz2Uzjxo3deo6QkBCv+ItUXmqvd1N7vVttay/UvjZ7U3sv1GNTTAOKRURExKsouRERERGvouSmElmtViZOnIjVavV0KFVC7fVuaq93q23thdrX5trW3jPVugHFIiIi4t3UcyMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyU0mmTp1KbGws/v7+9OjRg9WrV3s6pEoxadIkunXrRp06dWjQoAE33XQT27dvL1EnLy+P0aNHU69ePYKDg7n11ltJSUnxUMSV65VXXsFkMjFu3Dhnmbe1NykpiXvvvZd69eoREBBAhw4dWLt2rXO7YRg899xzNGzYkICAABISEti5c6cHI644m83Gs88+S1xcHAEBAcTHx/Piiy+WeFZNTW/vL7/8wg033EB0dDQmk4m5c+eW2F6e9qWlpXHPPfcQEhJCWFgYDzzwAFlZWVXYivI7X3sLCwt58skn6dChA0FBQURHRzN06FAOHz5c4hje0t6zPfTQQ5hMJiZPnlyivCa1t6KU3FSC2bNnM378eCZOnEhiYiIdO3akX79+HD161NOhXbSlS5cyevRoVq5cycKFCyksLOS6664jOzvbWefRRx/l22+/5YsvvmDp0qUcPnyYW265xYNRV441a9bwn//8h0suuaREuTe198SJE/Tu3RtfX18WLFjAli1b+Oc//0l4eLizzmuvvca//vUvpk2bxqpVqwgKCqJfv37k5eV5MPKKefXVV3nnnXd4++232bp1K6+++iqvvfYab731lrNOTW9vdnY2HTt2ZOrUqWVuL0/77rnnHv744w8WLlzId999xy+//MKoUaOqqgkuOV97c3JySExM5NlnnyUxMZGvvvqK7du3M3jw4BL1vKW9Z/r6669ZuXIl0dHRpbbVpPZWmCEXrXv37sbo0aOd7202mxEdHW1MmjTJg1G5x9GjRw3AWLp0qWEYhnHy5EnD19fX+OKLL5x1tm7dagDGihUrPBXmRcvMzDRatGhhLFy40OjTp4/xyCOPGIbhfe198sknjcsvv/yc2+12uxEVFWW8/vrrzrKTJ08aVqvV+Oyzz6oixEo1cOBA4/777y9Rdssttxj33HOPYRje117A+Prrr53vy9O+LVu2GICxZs0aZ50FCxYYJpPJSEpKqrLYK+Ls9pZl9erVBmDs37/fMAzvbO+hQ4eMRo0aGZs3bzaaNm1qvPnmm85tNbm9rlDPzUUqKChg3bp1JCQkOMvMZjMJCQmsWLHCg5G5R3p6OgB169YFYN26dRQWFpZof+vWrWnSpEmNbv/o0aMZOHBgiXaB97X3m2++oWvXrgwZMoQGDRpw6aWXMn36dOf2vXv3kpycXKK9oaGh9OjRo0a2t1evXixatIgdO3YAsHHjRn799Vf69+8PeF97z1ae9q1YsYKwsDC6du3qrJOQkIDZbGbVqlVVHnNlS09Px2QyERYWBnhfe+12O/fddx+PP/447dq1K7Xd29p7LrXuwZmVLTU1FZvNRmRkZInyyMhItm3b5qGo3MNutzNu3Dh69+5N+/btAUhOTsbPz8/5RVEsMjKS5ORkD0R58WbNmkViYiJr1qwptc3b2rtnzx7eeecdxo8fz9NPP82aNWsYO3Ysfn5+DBs2zNmmsv5+18T2PvXUU2RkZNC6dWssFgs2m42XXnqJe+65B8Dr2nu28rQvOTmZBg0alNju4+ND3bp1a/xnkJeXx5NPPsldd93lfJCkt7X31VdfxcfHh7Fjx5a53dvaey5KbqTcRo8ezebNm/n11189HYrbHDx4kEceeYSFCxfi7+/v6XDczm6307VrV15++WUALr30UjZv3sy0adMYNmyYh6OrfJ9//jmffPIJn376Ke3atWPDhg2MGzeO6Ohor2yvnFZYWMjtt9+OYRi88847ng7HLdatW8eUKVNITEzEZDJ5OhyP0mWpixQREYHFYil1t0xKSgpRUVEeiqry/eUvf+G7775jyZIlNG7c2FkeFRVFQUEBJ0+eLFG/prZ/3bp1HD16lM6dO+Pj44OPjw9Lly7lX//6Fz4+PkRGRnpVexs2bEjbtm1LlLVp04YDBw4AONvkLX+/H3/8cZ566inuvPNOOnTowH333cejjz7KpEmTAO9r79nK076oqKhSN0MUFRWRlpZWYz+D4sRm//79LFy40NlrA97V3mXLlnH06FGaNGni/P7av38/f/3rX4mNjQW8q73no+TmIvn5+dGlSxcWLVrkLLPb7SxatIiePXt6MLLKYRgGf/nLX/j6669ZvHgxcXFxJbZ36dIFX1/fEu3fvn07Bw4cqJHt79u3L5s2bWLDhg3OpWvXrtxzzz3OdW9qb+/evUvd2r9jxw6aNm0KQFxcHFFRUSXam5GRwapVq2pke3NycjCbS37tWSwW7HY74H3tPVt52tezZ09OnjzJunXrnHUWL16M3W6nR48eVR7zxSpObHbu3MlPP/1EvXr1Smz3pvbed999/P777yW+v6Kjo3n88cf54YcfAO9q73l5ekSzN5g1a5ZhtVqNGTNmGFu2bDFGjRplhIWFGcnJyZ4O7aI9/PDDRmhoqPHzzz8bR44ccS45OTnOOg899JDRpEkTY/HixcbatWuNnj17Gj179vRg1JXrzLulDMO72rt69WrDx8fHeOmll4ydO3can3zyiREYGGh8/PHHzjqvvPKKERYWZvzvf/8zfv/9d+PGG2804uLijNzcXA9GXjHDhg0zGjVqZHz33XfG3r17ja+++sqIiIgwnnjiCWedmt7ezMxMY/369cb69esNwHjjjTeM9evXO+8OKk/7rr/+euPSSy81Vq1aZfz6669GixYtjLvuustTTTqv87W3oKDAGDx4sNG4cWNjw4YNJb7D8vPzncfwlvaW5ey7pQyjZrW3opTcVJK33nrLaNKkieHn52d0797dWLlypadDqhRAmcsHH3zgrJObm2v8+c9/NsLDw43AwEDj5ptvNo4cOeK5oCvZ2cmNt7X322+/Ndq3b29YrVajdevWxrvvvltiu91uN5599lkjMjLSsFqtRt++fY3t27d7KNqLk5GRYTzyyCNGkyZNDH9/f6NZs2bG3/72txI/6Gp6e5csWVLmv9lhw4YZhlG+9h0/fty46667jODgYCMkJMQYMWKEkZmZ6YHWXNj52rt3795zfoctWbLEeQxvaW9ZykpualJ7K8pkGGdMzSkiIiJSw2nMjYiIiHgVJTciIiLiVZTciIiIiFdRciMiIiJeRcmNiIiIeBUlNyIiIuJVlNyIiIiIV1FyIyI1yvDhw7nppps8HYaIVGN6KriIVBsXepLxxIkTmTJlCpp7VETOR8mNiFQbR44cca7Pnj2b5557rsSDPYODgwkODvZEaCJSg+iylIhUG1FRUc4lNDQUk8lUoiw4OLjUZamrrrqKMWPGMG7cOMLDw4mMjGT69OlkZ2czYsQI6tSpQ/PmzVmwYEGJc23evJn+/fsTHBxMZGQk9913H6mpqVXcYhFxByU3IlLjzZw5k4iICFavXs2YMWN4+OGHGTJkCL169SIxMZHrrruO++67j5ycHABOnjzJNddcw6WXXsratWv5/vvvSUlJ4fbbb/dwS0SkMii5EZEar2PHjjzzzDO0aNGCCRMm4O/vT0REBA8++CAtWrTgueee4/jx4/z+++8AvP3221x66aW8/PLLtG7dmksvvZT333+fJUuWsGPHDg+3RkQulsbciEiNd8kllzjXLRYL9erVo0OHDs6yyMhIAI4ePQrAxo0bWbJkSZnjd3bv3k3Lli3dHLGIuJOSGxGp8Xx9fUu8N5lMJcqK78Ky2+0AZGVlccMNN/Dqq6+WOlbDhg3dGKmIVAUlNyJS63Tu3Jkvv/yS2NhYfHz0NSjibTTmRkRqndGjR5OWlsZdd93FmjVr2L17Nz/88AMjRozAZrN5OjwRuUhKbkSk1omOjua3337DZrNx3XXX0aFDB8aNG0dYWBhms74WRWo6k6GpPkVERMSL6FcUERER8SpKbkRERMSrKLkRERERr6LkRkRERLyKkhsRERHxKkpuRERExKsouRERERGvouRGREREvIqSGxEREfEqSm5ERETEqyi5EREREa+i5EZERES8yv8DfcADsE88RHkAAAAASUVORK5CYII=", - "text/plain": [ - "

          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plt.figure()\n", - "\n", - "plt.plot(t, solution[:,0], label='R')\n", - "\n", - "plt.plot(t, solution[:,1], label='S')\n", - "\n", - "plt.plot(t, solution[:,2], label='I')\n", - "\n", - "plt.xlabel('Time')\n", - "\n", - "plt.ylabel('Population proportion')\n", - "\n", - "plt.title('Standard SIR model')\n", - "\n", - "plt.legend(loc=0)\n", - "\n", - "#@savefig sir_plot.png In \n", - "\n", - "plt.show()\n", - "\n", - "#plt.close()\n" - ] - }, - { - "cell_type": "markdown", - "id": "ba849579", - "metadata": {}, - "source": [ - "Alternatively, we can integrate and plot via the **ode** object which we initialized earlier." - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "efddd3a5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABxaElEQVR4nO3de3yT9d0//teVpEl6PtIjhXI+CFLkUIs69F61qFNxE5Ftgh2yn8x6M7sxh1PwsFndgME9+MpkMtjuMbhxjLHJcKzKJqOCnATkIMdyanqg9JS2SZtcvz+S62prW5qkSa7kyuv5eORBm15JPym9er3z/nze748giqIIIiIiIgp6GqUHQERERETewcCOiIiISCUY2BERERGpBAM7IiIiIpVgYEdERESkEgzsiIiIiFSCgR0RERGRSjCwIyIiIlIJBnZEREREKsHAjoiIiEglGNipyPr16yEIgnzT6XTIyMjAU089hatXryo9PKKgc+zYMTz22GMYOHAgjEYjMjIycO+99+JXv/qV0kMjCkrSderAgQNKD0W1dEoPgLzvtddew6BBg9DS0oJPPvkE69evx549e3D8+HEYjUalh0cUFPbu3Yt77rkHAwYMwLx585CamorLly/jk08+wcqVK/Hcc88pPUQioi4Y2KnQ/fffj4kTJwIAnn76aSQlJeGtt97C9u3b8fjjjys8OqLg8LOf/QyxsbH49NNPERcX1+lrlZWVygyKiKgXnIoNAXfddRcA4Ny5cwqPhCh4nDt3DrfcckuXoA4AkpOT/T8gIiIXMLALARcvXgQAxMfHKzsQoiAycOBAHDx4EMePH1d6KERELmNgp0J1dXWorq7GlStX8Kc//QmvvvoqDAYDvva1ryk9NKKg8cMf/hBNTU3Izs7GlClT8MILL+Af//gHWltblR4aEVGPGNipUF5eHvr164fMzEw89thjiIyMxPbt29G/f3+lh0YUNO69916Ulpbi4YcfxmeffYaf//znyM/PR0ZGBrZv36708IiIusXAToVWr16NXbt24b333sMDDzyA6upqGAwGpYdFFHQmTZqErVu34saNG9i/fz8WLVqEhoYGPPbYYzhx4oTSwyMi6oKBnQpNnjwZeXl5+MY3voHt27djzJgx+OY3v4nGxkalh0YUlPR6PSZNmoQ33ngDb7/9NlpbW7Flyxalh0VE1AUDO5XT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", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "model.initial_values = (initialState, t[0])\n", - "\n", - "model.parameters = paramEval\n", - "\n", - "solution = model.integrate(t[1::])\n", - "\n", - "model.plot()" - ] - }, - { - "cell_type": "markdown", - "id": "4dd6e250", - "metadata": {}, - "source": [ - "We could solve the ODEs above using the Jacobian as well. Unfortunately, it does not help because the number of times the Jacobian was evaluated was zero, as expected given that our set of equations are not stiff." - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "id": "7a7a568f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.58 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "#TODO what does this show?\n", - "%timeit solution1, output1 = scipy.integrate.odeint(model.ode, initialState, t, full_output=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 83, - "id": "91b7f9d4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.84 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "\n", - "%timeit solution2, output2 = scipy.integrate.odeint(model.ode, initialState, t, Dfun=model.jacobian, mu=None, ml=None, full_output=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "id": "3403884c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.68 ms ± 161 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" - ] - } - ], - "source": [ - "\n", - "%timeit solution3, output3 = model.integrate(t, full_output=True)" - ] - }, - { - "cell_type": "markdown", - "id": "b6b9ee47", - "metadata": {}, - "source": [ - "It is important to note that we return our Jacobian as a dense square matrix. Hence, the two argument (mu,ml) for the ODE solver was set to `None` to let it know the output explicitly." - ] - }, - { - "cell_type": "markdown", - "id": "5ca18fa3", - "metadata": {}, - "source": [ - "## Solving the forward sensitivity equation\n", - "\n", - "The sensitivity equations are also solved as an initial value problem. Let us redefine the model in the standard SIR order and we solve it with the sensitivity all set at zero, i.e. we do not wish to infer the initial value of the states." - ] - }, - { - "cell_type": "code", - "execution_count": 85, - "id": "87173626", - "metadata": {}, - "outputs": [], - "source": [ - "stateList = ['S', 'I', 'R']\n", - "\n", - "model = DeterministicOde(stateList, paramList, ode=odeList)\n", - "\n", - "initialState = [1, 1.27e-6, 0]\n", - "\n", - "paramEval = [('beta', 0.5), ('gamma', 1.0/3.0)]\n", - "\n", - "model.parameters = paramEval\n", - "\n", - "solution = scipy.integrate.odeint(model.ode_and_sensitivity, numpy.append(initialState, numpy.zeros(6)), t)" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "id": "8b63ba62", - "metadata": { - "tags": [ - "hide-output" - ] - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApsAAAHYCAYAAAACtiM7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAADR8ElEQVR4nOzdd3yTVdsH8N+d3b33pkBLGS2zFFEQKgVUNrKUIaKi4CgPan19GC5w4QLFhaCi4EDgEUWhbCmrrEIpFGjp3nslTXLeP9IEQtORNmma9Pp+zEd6j5NzJzm5r5zJMcYYCCGEEEIIMQKeqTNACCGEEEIsFwWbhBBCCCHEaCjYJIQQQgghRkPBJiGEEEIIMRoKNgkhhBBCiNFQsEkIIYQQQoyGgk1CCCGEEGI0FGwSQgghhBCjoWCTEEIIIYQYDQWbBpKamoolS5YgLCwMNjY2kEgk8PX1xeDBg7FkyRL89ttvjc4ZOXIkOI7DqlWrtLYfOnQIHMc1etja2qJ379547rnnkJ6e3jEX1oRVq1bpzHtrzJ8/HxzHYfPmzQbNk1QqxauvvooePXpALBaD4zgEBgYa9DkslfqzeOjQIVNnxSTa83luz7l3S09P73KfW2N9HxhSR+VR/d0/cuRIoz6PMZnD+0k6HgWbBrBjxw707dsXGzZsQEFBAe655x5MnToV/fr1Q3Z2NjZs2ICnnnqqTWnPmzcP8+bNw9y5cxEZGYn09HR8+umn6Nu3LxISEgx8Je1nyi/L//73v1izZg0qKysxceJEzJs3D9OmTevwfBDL0Zlu/oGBgeA4zuQ/NAkhRF8CU2fA3OXn52PevHmQSqVYtmwZ3nzzTUgkEq1jEhMT8euvv7Yp/bt/HWZmZmL06NFITU3FE088gcuXL7c16+2yZMkSzJw5E66uriZ5fl1+/vlnAMDRo0fRo0cPE+eGmJP2fJ4NWRZ8fHxw5coVCIXCdqdFzM+QIUNw5coVWFtbmzorhBgUBZvt9Mcff6Cqqgre3t54//33dR4zcOBADBw40CDP5+fnh1WrVmHOnDlITk7GzZs30a1bN4OkrQ9XV9dOFWgCQEZGBgBQoEn01p7PsyHLglAoRGhoqEHSIubH2tqa3n9ikagZvZ3y8/MBAG5ubh32nP369Wv0/M1JSkrCtGnTIBKJwHEc3Nzc8MADD+DTTz8FABQUFIDH44HjOLz00kuNzh81ahQ4jsOBAwc023T1Uxs5ciTuv/9+AMDhw4e1+ps21QctLS0Njz32GDw9PSEWixEcHIzXXnsNUqm0NS8FgNvNi4wxANB63rtrhrdt24bRo0fD2dkZYrEYAQEBePzxx3Ht2rVm005PT8euXbswatQoODs7a/o3xsbGguM4rFu3rtG5YWFh4DgOQ4YMabTv9ddfB8dxWLFihWZbfX09fvjhB8yZMwehoaGwt7eHlZUVQkJC8NxzzyEnJ0dnHu/sb3n06FE8/PDDcHNzA4/H07r+zMxMPP744/Dy8oJEIkGPHj3wf//3f6itrW3pJdZJKpXivffew8CBA2FnZweRSARPT08MHjwYL730EkpKShqdU1tbiw8++ABDhw6Fo6MjJBIJQkJC8NJLL6G4uLjR8Zs3bwbHcZg/fz6qq6sRFxeH7t27QywWw9PTE/PmzUN2drbO/O3fvx8PP/wwPDw8IBQK4eTkhB49euDRRx/FkSNHtI7V9/Ps6uoKjuNw5swZnefGxcWB4zg8/fTTTb5+ly5dAsdx8PDwQH19PQDdfTbVr8GtW7cAAEFBQVp5OXToEL799ltwHIeYmJgmny8nJwdCoRBWVlY6X2tdUlNT8fjjjyMoKAhisRi2trYICAjAgw8+iG+//VbnOX///TceeughuLu7QyQSwdvbGzNmzMCZM2da9ZwAMGvWLHAch7Vr1zZ5zB9//AGO49C/f/9G+65du4annnoKwcHBkEgkcHBwwH333YcffvihyfRKSkrwwgsvICAgAGKxGP7+/liyZInOz7Gx8t9ct439+/dj6dKliIiIgKurK8RiMXx9fTFjxgycPn1a7zyqteX9as9rFR8fj4EDBzYak+Dm5ob58+c3WZ6JmWOkXb7//nsGgPH5fLZ//369zh0xYgQDwFauXKm1/eDBgwwAa+rt+ffffzX7b9y40exz/Pvvv0wkErHu3buz4cOHMwBs9OjRbMyYMSw4OJgxxtjWrVs16fXv31/r/JqaGiYWi5mVlRWrq6vTbF+5cmWjvK9Zs4bFxMQwAMzDw4PNmzdP81i2bJnmuHnz5jEA7Pnnn2f29vYsICCAPfLIIyw6OppZWVkxAGzSpEmteQkZY4wtW7ZMkyYArec9evQoY4wxpVLJ5s6dywAwgUDARo0axWbOnMl69uzJADBra2v2119/NUo7ICCAAWBLlixhANigQYPYrFmz2IgRI9iRI0fYnj17GAA2btw4rfOys7M1+eHxeKy0tFRr/7333ssAsMOHD2u2ZWZmMgDMwcGBDR06lE2fPp2NHz+eeXt7MwDMzc2NpaamNsqj+nP0zDPPMB6Px8LCwtjMmTPZmDFj2I8//sgYY+zKlSvM3d2dAWBeXl6atK2srFhUVBSLiopiANjBgwdb9ZorFAo2evRoBoDZ29uzcePGsVmzZrHo6GjNa3bu3LlGr0nfvn0ZAObs7Myio6PZ5MmTNccHBgay9PR0rXO+/fZbzeehX79+zNHRkT388MNs4sSJmusJCAhgZWVlWudt3ryZcRzHOI5jkZGRbMaMGWzChAlswIABjM/ns+eff17reH0/z+rtp0+f1nnu1atXGQDm6OjIamtrdb6GsbGxDACLjY3VbEtLS9Nck9rRo0fZvHnzmI2NDQPApk6dqpWXK1eusLq6Oubm5sY4jmNXr17V+XwrVqxgANiCBQt07r9bUlISs7e3ZwBYSEgImzJlCps+fTqLiopitra2LDw8vNE5r732GgPAOI5j99xzD5s1axaLiIjQfEd+8803jc5Rl91vv/1Ws+3vv/9mAFhoaGiT+ZsyZQoDwD755BOt7T///DOTSCSa8ydPnsxGjRqlef10XX9eXh7r0aMHA8CcnJzYlClT2KRJk5ijoyMLDg5mEyZMaJTH5rQ1/+rv/hEjRjQ6Pjg4mIlEIta/f382YcIENmXKFBYWFqb5Tvv1119blbc7teX9as9rtWzZMs3zAWC9e/dmwcHBmrLKcRwLDg5usswQ80XBZjtVVlYyHx8fTQEaOXIke+ONN9iePXtYQUFBs+e2Ndh89dVXGQDWt29fplQqm32O8ePHMzc3N1ZaWqr5AnzggQcYY4zl5+czxhhbsGABA8D69evHOI5jhYWFmvPvPkdN1w32zrzr+rJUuzMw/L//+z8ml8s1+5KSkjQ3hePHjzd7bXdr7jX7/PPPGQDm6uqqFQQplUrNtTg6OjZ6z9SBEJ/PZ7t27WqUblVVFRMKhczGxoZJpVLN9i1btmheUwDst99+03mOTCbTbK+oqGC7du3SSocxxmQyGYuLi2MA2Pjx4xvlQf05AsA2bNig8/oHDx7MALBHHnlE64v81q1bLDg4WHN+a4PNw4cPa36cVFRUNNp/+vRpVlRUpPlbqVSye+65hwFgCxcu1Dqnvr5ecxO6//77tdJRB5sAWExMDCsvL9fsKykp0dwY3377ba3zgoKCGADNj4075efns7Nnz2pt0/fzrM5XU8EmY0xzvT/99FOjPNTX12uC5aSkJM12XcGmmvqzmJaW1mgfY4z93//9HwPAnnvuuUb7ZDIZ8/T0ZABYYmKizvPvpv5eePPNNxvtq6mp0fqhxBhjf/31FwPAJBIJ++eff7T2ff311wwAEwqF7NKlS1r7dAWbCoWC+fv7MwAsISGh0fMXFhYyoVDIRCKR1ufs4sWLTCwWM4lEolXmGGMsPT1d82Nny5YtWvumTZvGALB7771X64dLcXExi4yM1HwGWxtstjX/zX1//v7776ykpETndoFAwFxcXFhNTU2r8sdY29+vtr5WX375JQPAunfvzl5//XVN+WFM9X1iZ2fH+Hw+A8C2b9/e6usg5oGCTQNISUnRKmR3PiIiItjnn3+uFVCp6RNsKpVKlpGRwd577z0mEomYk5MTO3XqVIt5CwkJYSNHjmSMNV1L6e/vzwICAtiGDRsYALZt2zbNvuXLlzMA7J133tFK1xDB5sCBA3UGy08//TQDwF5//fUWr+9OzQWb6oDq7loQxlSvrToofOutt7T2qW/wjz/+eJPPq66lPHTokGbbY489xgBoaj6ffvppzb6makNb4u3tzXg8XqPgTv05GjVqlM7zjh07xgAwGxsbrRub2u+//653sPnzzz83Gdjoor6xRUREsPr6+kb7FQoF69OnT6PgSx3U2djYsJycnEbnbdu2Tee1W1tbMwcHh1bljTHjBJvffPMNA8DGjBnT6Pl27tzJAFVN+Z3aE2xmZ2czoVDIHBwcWFVVlda+n376iQFgUVFROs/VZfz48QxAo8C8Keqa7jtrau/00EMPMQBs0aJFWtt1BZuMMfbf//6XAWBPPvlko7Q++ugjBoBNmzZNa/uMGTMYAPb+++/rzMOpU6c03z1qGRkZjMfjMY7j2OXLlxudc+7cOb2DzbbmvzXfn7rMmjVL833TWm15v9r6WikUCk0LzZkzZ7TKj9q7776rOffuH4/E/FGfTQMICQnBiRMncPLkSaxYsQIxMTGaPpznz5/H4sWLMXbsWMhkMr3TVvdn4fF48Pf3x/Lly+Hn54eLFy9i8ODBLZ4fEBCAxMREXLp0CVZWVhg2bBhqa2tx7NgxAKq+TRkZGXjggQcQHR0NQNU3SE39b/U+Q3rooYfAcVyj7b169QIAg/XdycrKwo0bNwCoppK6G8dxWLBgAQDg4MGDOtNobgolXa9bfHw8unfvjvHjx8Pb21uv1/TChQtYt24dli5discffxzz58/H/PnzIZfLoVQqcf36db3yqJ47c+zYsXBxcWm0f+LEiXBwcGjy+nQZMGAA+Hw+Nm3ahA0bNiA3N7fZ4/fs2QMAmDp1KgSCxuMSeTwe7rvvPgDA8ePHG+0fNGgQvLy8Gm1v6rMyZMgQlJeXY+7cuUhMTIRSqWzdhRnQI488AhsbG+zfvx9ZWVla+9T9HR9//HGDPZ+3tzemTZuG8vJyfP/991r7NmzYAEA1cr611H2NFy9ejL///ht1dXVNHiuXy/Hvv/8CUM2zqMvChQsBNF3G7qaer3H79u2N+hXrev2USiX++usvAMCMGTN0pjlo0CDY2tri3Llzmus5cuQIlEolBgwYgLCwsEbnREREaPWTby19898aOTk5+Oqrr7Bs2TI88cQTmu8G9awkV69ebVU6bX2/2vpanTt3Djk5OQgODm5ysOyd/VSdnJxadR3EfFCwaUBDhgzB6tWrsXfvXuTn5yMxMREzZ84EoAowPv74Y73TVM+zOXv2bERGRgIAbty4gdmzZ7cqeP3Pf/6DmpoaREREYNiwYZDL5QBUncLV+QKABx54AD179oSfn59mW3FxMc6fPw8XFxednfDby9/fX+d2e3t7AGj25qYPdSDi4uKiSftuwcHBWsferblJtu8ONpOTk5GTk4MHHngAADB69Ghcv35dM8CjqWCzuroaU6ZMQUREBJYtW4b169fj22+/xZYtW7BlyxYUFBQAACoqKvTKozrQCQoK0rm/LZOIBwcH48MPP0R9fT2WLFkCb29vBAYGYtasWdi6dWujz+bNmzcBqOZC1bVgAcdx+OyzzwAAhYWFjZ5P38/KZ599hm7duuH777/HoEGD4OjoiNGjR+Ott97SzFpgbLa2tpg+fTqUSiW+++47zfaCggLs2bMHEokEs2bNMuhzPvfccwBuB5cAcPHiRRw7dgweHh56zTu7fPlyREdH4+TJkxg7dizs7e0xePBgLFu2rNGAlOLiYs170NTnrKUydrdu3bphxIgRKC8vx++//67Zfu7cOVy4cAHe3t4YM2aMVh7UZcPPz0/nZ4zH46GqqgpKpVIzSKql8tHSPkPlvyWrV69GYGAgnnzySaxbtw7ffPON5rvh4sWLAJr+brhbW9+vtr5W6vJ/48YNrR/3gwcP1rw36h83HMfhoYceatV1EPNBwaaRcByHAQMG4KeffsKECRMAADt37tQ7nc2bN2Pz5s3YunUrTpw4gWPHjsHOzg5Hjx7Fa6+91uL5DzzwABISEjBhwgRcuHABR48eBQB8+OGH2L17N/bv3w8ej4fRo0cDUAVA6enpuH79OuLj48EY04xGNzQez3w+flZWVk3uGzJkCOzt7XH69GmUl5drBfDA7aBy3759KCgowKVLl+Du7o6+fftqpRMXF4fff/8doaGh2LlzJ7KzsyGVSsFU3V0QFRUFAJpR9/rk0RiWLl2KW7du4csvv8TcuXPB5/Oxbds2PProowgLC9Oq7VTXLA4fPlzzA6qpR+/evRs9l76flV69euHq1avYs2cPli1bhj59+mjKTI8ePZodlWxI6pqrLVu2aLb98MMPkMvlmDRpEhwdHQ36fEOHDsWQIUNw6dIlHD58GMDtwPPJJ5+ESCRqdVrW1tbYt28fTp06hddffx2jR4/GtWvXsG7dOgwZMgTPPvusQfOui/r1u3NWBXWtoPozp3Zn7XVLn7F58+ZBLBZ3qvw3Z8eOHVi1ahXEYjG++OILpKamorq6GkqlEowxxMXFAWj6u8HU1O+NegaJe+65R+dxNjY2mDJlCnx9fTsye6QD0DybHWDMmDHYvXs3ioqK2p3WPffcgw8//BBPPPEEPv74Yzz99NMtzrM5ePBg7NixAzKZDOfOncPIkSNRV1eHqVOnwtraGhEREZrm1ejoaHz77bfYv38/zp49q9lmznx8fADcrvnQVbup/uWtPlYfAoEAI0aMwP/+9z8cPHgQ+/fvB5/P10ybc2fNp7W1NRhjGD16dKMAXj0p/fbt23U2RaWmpuqdN+D2NTW38oy61lVfHh4eWLRoERYtWgQASElJweOPP46EhAS88sormiDLz88PgKrJ/j//+U+bnktfAoEA48ePx/jx4wGoan3WrVuH1atX46mnnsLkyZNhY2Nj1Dzce++96N69O65du4Z///0X99xzjybwMGQT+p2ee+45PProo1i/fj3Cw8OxdetWCASCZqdhas7gwYM1XXbkcjl27tyJuXPn4rPPPsO0adNw//33w8XFBWKxGFKpFDdv3tT5+W1LGZs6dSqWLFmC+Ph4ZGZmwsPDAz/++CMAaGrH1FxdXWFlZYXa2lq8//77rZ77tDXlo62rNumT/+aovxveeustPPnkk4326/vd0Nb3q62vlbr8u7i4aCpQ/v33X2zYsAE9e/ZEeXk5Nm3ahCNHjmDp0qV6XQsxD+ZTtdRJteaXpLrZzlC/1h5//HFERERAJpNh9erVrT5PJBIhMjIS48aNA6C6cVRUVGhq4ABogqB9+/a1qb+muuZE3VzfGfj6+mqahHSt18sY02xXB4j6Ur9Gf/31Fw4fPqxpugVUfel69eqF+Ph47Nu3T+v4O6nnqAsICGi07++//27zj5URI0YAAPbu3atzHrzdu3ejrKysTWnfLTQ0FC+//DIAVX9lNfVn7pdffjFZ7Yu9vT1WrVoFR0dH1NTUNDm36p0M8XlWBxWbN29GYmIikpKS4Ofnp2lNaK3W5uWRRx6Bl5cXdu7cibfeegvV1dWYPHkyvL2923YBdxAIBJg2bZpmPk/1eywQCDB8+HAAussYAGzatAmAfmXM2toaM2bM0HRF+N///ofi4mLcc8896Nmzp9axfD5f812mDs5a47777gPHcTh79ixSUlIa7b9w4YKmmVpf+uS/Oc19NxQUFGi+V1qrre9XW1+rwYMHw9XVFcnJyVqr3g0ZMgTR0dGYOnUqdu/ejT59+mD27NmoqqrS63pI50fBZjt99tlnmDdvns5BDYwx7NixA+vXrwcATf/N9uI4Dm+//TYAYOvWra26ad7p7kDnzmDTw8MDffr0wZ9//om0tDQEBQXptUKROqBOTU3VTFTdGahr09544w1cuHBBs50xhjfffBPnz5+Ho6OjpoZOX+rX9LvvvmsUwKv3FxUVYdu2bVrH30k92EU92b7a1atX21wrBahq1wYMGICqqio8++yzWhPmZ2Zmtqmm8cCBA/jzzz8bvceMMfzxxx8AtG+MEydOxODBg3Hq1CksWLBAZ7/M0tJSbNy4sd0/VGpqarBu3Tqdz3H06FGUlZWBz+e36sefIT7P8+bNA4/Hw88//6xp0lZv04c6Ly0tUSsUCrF48WLI5XLNqmb6DAxS++yzz3QOOMnLy9NM+H3ne7xs2TIAwOeff474+HitczZv3ozdu3dDKBTi+eef1ysfdzZFqwOgpmoFV65cCZFIhOXLl2PLli06B4ZdunQJO3bs0Pzt7++PyZMnQ6lUYvHixVr9HktLS/HMM8+06weSPvlvivq74csvv9TqD11eXo558+ahvLxc73y15f1q62slFAqxcuVKMMYwefLkJu9Z06dPR05OjuaeSSxIxw+AtywffvihZroGNzc3NmbMGDZ79mw2fvx4FhgYqNn36KOPMoVCoXVuW+fZVLvvvvsYADZ79uwmjzlw4ECj6YXUE06jYR61O6dBYoyxF198UbP/7mlK1Jqa7oUxxgYNGsQA1UTQc+bMYQsXLmQvv/yyZn9TU52oqafFmDdvXpPXpUtzr5lSqdRMRyQQCNjo0aPZrFmzWEhICAPArKys2J9//tnovJamm7mTemoPAI3mINy1a5dmX48ePXSe/9tvv2kmO+7bty+bOXMmGzVqFBMKhWzUqFFs2LBhOqcnUn+Ompu26PLly8zNzY0BYN7e3uyRRx5hDz30ELO2tmZDhw7Ve1J39efe3t6ejRw5ks2ePVtrgnYHBwedk7qr58W0sbFhw4YNYzNnzmRTpkxhERERmjn27pwHtKXPgq6pgkpLSxmgmkw/PDycTZs2jc2aNYtFRUVpXt8VK1ZopaPv51k9LVBzUx/daezYsZr3n+O4JhdjaG7qo/Xr1zMAzNbWlk2ZMoUtXLiQLVy4kKWkpDQ6Nj8/n4nFYgao5npti/DwcAaABQUFsYcffpjNmTOHjRkzRrPwwqhRoxpNY3XnJOHDhw9ns2fPZgMGDGCAfpO6361Xr16a18/GxoZVVlY2eezPP//MrK2tGQDm6+vLxowZw+bMmcPGjRvHfH19GQA2Y8YMrXNyc3M106M5OzuzKVOmsMmTJ7d5Uve25r+pqY9u3rzJHB0dGQDm4+PDpk6dyiZMmMAcHByYl5cXe/zxx1v8DOrSlverPa+Veio99WPEiBFs5syZbOTIkZrrCwwMZB4eHjSxu4WhYLOdKioq2M6dO9nSpUvZkCFDmK+vLxMKhczKyooFBwezWbNm6VyZhrH2B5vHjx/X3FSTk5N1HtO7d28WFBTEYmNj2ZdffsnWr1/PZs+erUn/7km0Gbs9DyTQ9OS6zd1gb926xWbPns28vLyYQCBodPM0RbCp9uOPP2q+2IRCIfPz82Pz58/XecNmTL9gUx3M3j1ZO2OMlZeXa16LxYsXN5nGkSNH2OjRo5mrqyuztrZmffr0YW+99RaTSqVNBpWtCTYZU70v8+fPZx4eHkwkErFu3bqxl19+mVVXV7c6DbXr16+zVatWsdGjRzN/f38mkUiYk5MT69evH3vllVdYZmamzvPq6urYxo0b2f33389cXFyYQCBg7u7uLCIigj377LPs77//1jq+LcFmfX0927hxI5s1axYLDQ1lDg4OmvI4depUFh8f3ygdfT/PLi4uegWb6nlJdQUSLV2PmkKhYGvWrGG9e/fWrJDT3Humnvv3iy++aPL5mvPHH3+wxYsXs/79+zM3NzcmEomYr68vGzlyJNuyZUujz7jaX3/9xcaPH695fz09Pdn06dPZyZMndR7fmmDzzjkYW/O9kJaWxl588UXWp08fZmNjwyQSCQsICGAjR45ka9euZdevX290TlFREVu6dCnz9fXVXOvTTz/NCgsLW5XH5rQ2/83Ns5mWlsbmzJnD/P39mVgsZgEBAezpp59meXl5rfoMNkXf94ux9r1W//77Lxs6dCgDwEQiEbOzs2M9e/ZkkyZNYl9//bWmzH/++ed6XwvpvDjGOunwNWIQe/fuxS+//ILjx48jKysLMpkM/v7+GDduHF577TW4u7ubOouEmJ3NmzdjwYIFOH36NAYNGmTq7DRy7do1hIaGwsHBAdnZ2bC2tjZ1lgjRaK78KJVKTX/Wq1evtnrEPuncKNgkhBALM3PmTGzfvh1xcXGa/t2EEGIqFGwSQogF2L17N3bt2oXLly/j5MmT8PT0xJUrVww+lychhOiLRqMTQogFOHv2LDZt2oTk5GRER0fjn3/+oUCTENIpUM0mIYQQQggxGqrZJIQQQgghRkPBJiGEEEIIMRqLWBtdqVQiJycHdnZ2jdabJkRfjDFUVlbC29tb71VeLAGVJ2IoVJaoLBHDMPeyZBHBZk5ODvz8/EydDWJhMjMzDbaevTmh8kQMjcoSIYZhrmVJ72DzyJEjeO+995CYmIjc3Fz8/vvvmDRpUrPnHDp0CLGxsbh8+TL8/Pzw2muvYf78+VrHbNiwAe+99x7y8vIQHh6OTz/9FEOGDGlVnuzs7ACo3gR7e3t9L4kQLRUVFfDz89N8rroaKk/EUKgsUVkihmHuZUnvYLO6uhrh4eF4/PHHMWXKlBaPT0tLw4MPPoinn34aW7duRXx8PJ544gl4eXkhJiYGALB9+3bExsZi48aNiIyMxEcffYSYmBhcvXq1VSvcqJsn7O3tqUATg+mqzV5UnoihUVmiskQMw1zLkt7B5rhx4zBu3LhWH79x40YEBQXhgw8+AAD06tULx44dw4cffqgJNtetW4dFixZhwYIFmnP27NmDTZs24ZVXXtE3i1q+PnoTlXVynfuae884aO/kOGi2cJzqDec4gMdx4DX8X8DjwOfzIORxEPJ5EAl4EAt4sBLxYS0SwF4igIOVEI7WIogE5tfnghAClNfUY9eFbIzo6YYAFxtTZ4cQYmB19QpU1NajUipHjVSB2noF6uoVkMmVkCmUkMmVqFcooVAyyJUMSsagUKoejAFKxqBkAIPqb8ZU/wcABuDOCScZVH/cuW1sH0/08rKsHydG77OZkJCA6OhorW0xMTF44YUXAAAymQyJiYmIi4vT7OfxeIiOjkZCQoLONKVSKaRSqebvioqKJp9/07E05JTXteMKjMPZRgRvRwkCXGzQ090O/XwdMMDfCQ7WQlNnjRDShKzSGszbdAo3CqshEvAQNy4UC+4JMnW2CCF6KKyUIiWvAtcLqnCruAbZZbXIK69DUZUUJdUySOVKk+YvyNWGgk195eXlwcPDQ2ubh4cHKioqUFtbi9LSUigUCp3HpKSk6ExzzZo1WL16dauef/IAH5TX1rfqWF3T27O79ql/oSiZ6veIsuFvhZJBwRgUCga5UgmZgkEmV0AqV6JWpkC1TI7KOjkqauuhZEBJtQwl1TJcyq7AHuQCAHgc0N/fCQ/188LECB8424halW9CiPExxvD0D4m4UVgNsYAHqVyJ1/9Ixr09XNHd3Tz7URHSFRRVSXEgpQDHUotwJr2kVRVQPA6wEQtgIxLASsSHWMCDWMiHmM+DUKBqvRTwOFWrJl/1fz5P1SbK43HgoGr1VLeAqlpSVe2jd7aUqv9W7VX9I8jV8lpMzHI0elxcHGJjYzV/qzvO6rI8JrSjstUqSiVDWW098ivqkFVai7SiKqTkVuJcZhnSiqqReKsUibdK8c7eFMwc7I+lo7rDxVZs6mwT0uWdTi/FpewKWAn5iF82Ait3X8a+5Hx8HH8dn87qb+rsEULuIFco8U9yPn46lYF/rxdBeUdlEscBQS426O5uiyA3G/g6WcPLXgI3OzGcbURwtBbCViww2/6RnZHRg01PT0/k5+drbcvPz4e9vT2srKzA5/PB5/N1HuPp6akzTbFYDLHYPAMwHo+Ds40Izjaihmry2zW6OWW1+PtyHn5NzMLlnApsPp6O385mYeXDvTF1gA998AkxoS0J6QCASf294e1ohReje2Jfcj7+uJiD50f3QHd3W9NmkBACpZLh93PZ+Dg+FRklNZrtfXzsMSrEHUO7uSDczxE2YrOsazNbRh+lEhUVhfj4eK1t+/btQ1RUFABAJBJh4MCBWscolUrEx8drjukqvB2tsOCeIPyxdDi2PhGJ3t72qKyT4z+/XMCyXy5AZuJ+JIR0VQWVdfj7Uh4A4LGhgQCAMG97jA51B2PA7gs5JswdIQQAruVXYvJn/2LZLxeQUVIDJ2shnr0/GIeXj8QfS+9F7JgQDOvuSoGmCegdbFZVVeH8+fM4f/48ANXURufPn0dGRgYAVRP33LlzNcc//fTTuHnzJl566SWkpKTgs88+w88//4wXX3xRc0xsbCy++uorbNmyBVeuXMHixYtRXV2tGZ3e1XAch3u6u2L3kuFYHhMCPo/DjrPZWLjlNOrqFabOHiFdzuGrhZArGfr6OCDM+3bH/Qf7eQGAJhAlhHQ8xhi2nryFhz45hgtZ5bATC/Dy2FD8+8ooLI8JpVkjOgG9w/szZ87g/vvv1/yt7js5b948bN68Gbm5uZrAEwCCgoKwZ88evPjii/j444/h6+uLr7/+WjPtEQDMmDEDhYWFWLFiBfLy8hAREYG9e/c2GjTU1fB5HJ69vzt6e9vjma1ncTS1CM/9dA6fzRkAAZ+mTiKkoxy7XgQAuK+nq9b20aEeEPA4XM2vxM3CKnRzo6Z0QjqSUsmwcvdlfH/iFgBgVKg71kzpCw97iYlzRu7EMaZrDLZ5qaiogIODA8rLyy124tyTN4vx2KZTkMmVWHRvEP7vwTBTZ8lidYXPU3O6+vXfTalkGPL2fhRVybDtyaEY2s1Fa/9j35zE0dQivDQ2BM+M7G6iXHZOXf2z1NWv39gUSoZlP5/HzvM54DhgeUwIFo8ItsjxDeb+WaLqMTMR2c0FHz4SAQD46mgaDqYUmDZDhHQRKXmVKKqSwVrExwB/p0b7x4SpWmAOXy3s6KwR0mUxxrBy9yXsPJ8DAY/DxzP745mR3S0y0LQEFGyakQf7eWFeVAAAYPmvF1s9fyghpO2OXVcFkUO7uehc+WtYd1XT+rnMMupTbUIbNmxAYGAgJBIJIiMjcerUqSaP3bx5c8MqcLcfEol2sytjDCtWrICXlxesrKwQHR2N1NRUY18GaaVvjqXhhxMZ4Djg45n9MSHc29RZIs2gYNPMxI3vhWA3GxRVSfHBP1dNnR1CLN7ZW2UAgKHdnHXu7+ZqA3c7MWRyJc5llHVcxojG9u3bERsbi5UrV+Ls2bMIDw9HTEwMCgqabgGyt7dHbm6u5nHr1i2t/e+++y4++eQTbNy4ESdPnoSNjQ1iYmJQV9f5VqTrak7eLMaav1SLvqx4KEwzUI90XhRsmhmJkI83JvYBAHx/4hau5Da9VCchpP3OZ5YBACL8GjehA6rZI9T9OE/cLO6obJE7rFu3DosWLcKCBQsQFhaGjRs3wtraGps2bWryHI7j4OnpqXncOSCVMYaPPvoIr732GiZOnIh+/frhu+++Q05ODnbu3NkBV0SaUlFXjxe2n4dCyTC5vw/mDws0dZZIK1CwaYaGdXfFg329wBiwbt81U2eHEIuVV16HvIo68DjVpNBNUQebCRRsdjiZTIbExERER0drtvF4PERHRyMhIaHJ86qqqhAQEAA/Pz9MnDgRly9f1uxLS0tDXl6eVpoODg6IjIxsNk2pVIqKigqtBzGst/64gtzyOgS4WOOtyX2oj6aZoGDTTL34QE/wOGBfcj4uZpWZOjuEWKQLDWWrp4cdrEVNzxQXFawKNs9nUL/NjlZUVASFQtFoqjwPDw/k5eme/zQkJASbNm3Crl278MMPP0CpVGLYsGHIysoCAM15+qQJAGvWrIGDg4Pm0dQyyqRtTqWVYPuZTHAc8N608GbLJOlcKNg0U93dbTGpvw8AYP2B6ybODdFFnwELAPDLL78gNDQUEokEffv2xZ9//qm1f/78+Y0GNYwdO1brmJKSEsyZMwf29vZwdHTEwoULUVVVZfBr6youaJrQHZs9LtDFGi42IsgUSlzOodqszi4qKgpz585FREQERowYgR07dsDNzQ1ffPFFu9KNi4tDeXm55pGZmWmgHBOFkmHVblXt88zB/hgSpLsPNemcKNg0Y4tHBAMA9l3JR0ZxTQtHk46k74CF48ePY9asWVi4cCHOnTuHSZMmYdKkSbh06ZLWcWPHjtUa1PDTTz9p7Z8zZw4uX76Mffv24Y8//sCRI0fw5JNPGu06LZ26ZjO8hWCT4zj0b5gW6VxGqZFzRe7k6uoKPp+P/Px8re35+fnw9PRsVRpCoRD9+/fH9euqH+7q8/RNUywWw97eXutBDOO3xCwk51bATiLAf8b0NHV2iJ4o2DRjPTzscF9PNzAGbElIN3V2yB30HbDw8ccfY+zYsVi+fDl69eqFN954AwMGDMD69eu1jhOLxVqDGpycbg9auXLlCvbu3Yuvv/4akZGRGD58OD799FNs27YNOTm0dre+GGO4mFUOAOjn69Di8f39HQGARqR3MJFIhIEDByI+Pl6zTalUIj4+HlFRUa1KQ6FQICkpCV5eqlHNQUFB8PT01EqzoqICJ0+ebHWaxHBkciU+jldNO/XcqB5wsRWbOEdEXxRsmrnH7wkEAPx8OhO1Muor1hm0ZcBCQkKC1vEAEBMT0+j4Q4cOwd3dHSEhIVi8eDGKi4u10nB0dMSgQYM026Kjo8Hj8XDy5Mkm80uDGnTLKq1FZZ0cQj6HHu52LR4/gGo2TSY2NhZfffUVtmzZgitXrmDx4sWorq7GggULAABz585FXFyc5vjXX38d//zzD27evImzZ8/i0Ucfxa1bt/DEE08AUNVUv/DCC3jzzTexe/duJCUlYe7cufD29sakSZNMcYld2i+Jmcguq4WbnRiPNcw1TcwL9a41c/f1cIOfsxUyS2rx9+U8TT9OYjrNDVhISUnReU5eXl6LgxHGjh2LKVOmICgoCDdu3MCrr76KcePGISEhAXw+H3l5eXB3d9dKQyAQwNnZucVBDatXr9b3Mi2eelqx7u52Oidzv1s/XwfwOCCnvA555XXwdKC1mTvKjBkzUFhYiBUrViAvLw8RERHYu3evpkxlZGSAx7v9HpaWlmLRokXIy8uDk5MTBg4ciOPHjyMs7PYywC+99BKqq6vx5JNPoqysDMOHD8fevXsbTf5OjEuuUOLzQzcAAM+MDIZEyDdxjkhbULBp5ng8DtMG+OHD/dfw85lMCjYt2MyZMzX/7tu3L/r164fg4GAcOnQIo0ePbnO6cXFxiI2N1fxdUVFBo2gBJDcEm2Feret3ZyMWINTTHsm5FTibUYrxfWmi6Y60ZMkSLFmyROe+Q4cOaf394Ycf4sMPP2w2PY7j8Prrr+P11183VBZJG+y9nIes0lo424gwa4i/qbND2oia0S3A1IE+4Djg+I1iZJbQQCFTa8uABU9PT70HI3Tr1g2urq5agxruHoAkl8tRUlJCgxraQF2z2cur5SZ0tYiGfpsXaDoyQtqNMYavjqYBAB4dGkC1mmaMgk0L4OtkjWEN8/ztvkADQUytLQMWoqKitI4HgH379jU7GCErKwvFxcWaQQ1RUVEoKytDYmKi5pgDBw5AqVQiMjKyPZfUJWlqNr1bH3yHNwwkUk+ZRAhpu/OZZbiQWQaRgIfHhlJfTXNGwaaFmBDuDQD4HwWbnYK+Axaef/557N27Fx988AFSUlKwatUqnDlzRtMsWFVVheXLl+PEiRNIT09HfHw8Jk6ciO7duyMmJgYA0KtXL4wdOxaLFi3CqVOn8O+//2LJkiWYOXMmvL29O/5FMGMVdfXILKkF0PpmdOD2FEmXsiugUDJjZI2QLuOnUxkAgIf6esHNjkagmzMKNi1ETG9PCHgcUvIqcb2g0tTZ6fJmzJiB999/HytWrEBERATOnz/faMBCbm6u5vhhw4bhxx9/xJdffonw8HD8+uuv2LlzJ/r06QMA4PP5uHjxIiZMmICePXti4cKFGDhwII4ePQqx+PaX8NatWxEaGorRo0dj/PjxGD58OL788suOvXgLcDVPVYa8HCRwtBa1+rzubrawEvJRJZXjZiFNpk9IW1XU1eN/F1TfkbMjqa+muaMBQhbC0VqE+3q64UBKAf53IRcvPtD6fmbEOPQZsAAA06dPx/Tp03Ueb2Vlhb///rvF53R2dsaPP/6oVz5JYykNTeihnvqVIwGfhz4+9jidXooLWeXo4UHlkJC22HU+B7X1CvT0sMXAAKeWTyCdGtVsWpAHG0a//n256WluCCEtS2mo2Qzx1H+wVLivIwDqt0lIe/yWqFqn/pFBfuA4zsS5Ie1FwaYFGd3LHfyGpnRavpKQtlM3o+tbswkA/Rr6bV6kEemEtMmNwiqczywDn8dhYgRN52cJKNi0II7WIkQGOQMA/kmm2k1C2oIxhqv56ppN/YNN9Yj0K7mVkMmVBs0bIV3BznPZAIB7e7jSwCALQcGmhXkgTDUA5Z/k/BaOJIToklteh8o6OQQ8DsFutnqf7+9sDUdrIWQKJVLyaOlPQvTBGMPO86pgczItUmIxKNi0MOpg80x6CUqrZSbODSHmR92E3s3NplXLVN6N4zj09WmYbzOr3KB5I8TSJWWXI7OkFlZCvuZ+RswfBZsWxtfJGqGedlAy4EhqoamzQ4jZac/gIDX1IKGLNEiIEL3sSVJNdzSqlzusRTRhjqWgYNMC3R/qDgA4kFLQwpGEkLtdzWvbtEd3CtcMEqKaTUJaizGGPRdVwaZ6dhViGSjYtECjGoLNQ1cLIVfQAAVC9JHSjpHoaupBQqkFlaiWyg2SL0Is3aXsCmSVqprQ7w9xN3V2iAG1KdjcsGEDAgMDIZFIEBkZiVOnTjV57MiRI8FxXKPHgw8+qDlm/vz5jfaPHTu2LVkjAPr7OcLBSojy2nqco2Y8QlqtXqHEjYaVf9oyEl3N3V4CLwcJlEzVB40Q0jL1HNH3h7rBSsQ3cW6IIekdbG7fvh2xsbFYuXIlzp49i/DwcMTExKCgQHeT7Y4dO5Cbm6t5XLp0CXw+v9FKKWPHjtU67qeffmrbFREI+Dzc19MNAHDoKjWlE9JaNwurUa9gsBML4ONo1a60Ihqa0s/TDz5CWkUdbMb09jRxToih6R1srlu3DosWLcKCBQsQFhaGjRs3wtraGps2bdJ5vLOzMzw9PTWPffv2wdraulGwKRaLtY5zcqLlqdpjZEOwefgaDRIipLXUUxWFeNq1e9USTbCZUdbOXBFi+W4WViG1oAoCHoeR1IRucfQKNmUyGRITExEdHX07AR4P0dHRSEhIaFUa33zzDWbOnAkbGxut7YcOHYK7uztCQkKwePFiFBcXN5mGVCpFRUWF1oNoU9dsXsquQGGl1MS5IcQ83B6J3v41zalmk5DWU88NHRXsAgcroYlzQwxNr2CzqKgICoUCHh7ac195eHggL6/lFWtOnTqFS5cu4YknntDaPnbsWHz33XeIj4/HO++8g8OHD2PcuHFQKBQ601mzZg0cHBw0Dz8/P30uo0twsxOjj49q6pYjVLtJSKuk5LZ/JLpaHx8H8Dggr6IOeeV17U6PEEu2vyHYHENza1qkDh2N/s0336Bv374YMmSI1vaZM2diwoQJ6Nu3LyZNmoQ//vgDp0+fxqFDh3SmExcXh/Lycs0jMzOzA3Jvfkb2bBiVTsEmIa2iWRPdq+1zbKrZiAXo6aEKWs9nlrY7PUIsVUm1DGczVGVkdC8KNi2RXsGmq6sr+Hw+8vO1l0LMz8+Hp2fzHXqrq6uxbds2LFy4sMXn6datG1xdXXH9+nWd+8ViMezt7bUepLERIaqm9GOphVAomYlzQ0jnVlYjQ05DDaQ6SGyvAQGqvudnqd8mIU06mFIAJQPCvOzh3c6BeaRz0ivYFIlEGDhwIOLj4zXblEol4uPjERUV1ey5v/zyC6RSKR599NEWnycrKwvFxcXw8qJJXdujv58j7CQClNbU42JWmamzQ0inltzQhO7nbGWwPmMD/VXBZuItqtkkpCnxKaoKrOheNDDIUundjB4bG4uvvvoKW7ZswZUrV7B48WJUV1djwYIFAIC5c+ciLi6u0XnffPMNJk2aBBcXF63tVVVVWL58OU6cOIH09HTEx8dj4sSJ6N69O2JiYtp4WQRQTYF0bw9XADQqnZCWJOeogs0wAzShqw1sqNlMyiqHVK67DzohXZlMrsSRa0UAgFHUhG6x9F54dMaMGSgsLMSKFSuQl5eHiIgI7N27VzNoKCMjAzyedgx79epVHDt2DP/880+j9Ph8Pi5evIgtW7agrKwM3t7eGDNmDN544w2IxeI2XhZRG9HTDX8m5eHwtUK8EN3T1NkhpNNS12yGeTkYLM0AF2u42opQVCXDpewKTfBJCFE5nV6CKqkcrrZi9PMxXNkjnUubVrlfsmQJlixZonOfrkE9ISEhYEx3n0ErKyv8/fffbckGaQX1FEjnM8tQWi2Dk43IxDkipHPS1Gx6G65mk+M4DPB3wj/J+Ui8VULBJiF3ib+iWnjk/hA38Hjtm9uWdF60NrqF83KwQoiHHRgDjqRSUzohukjlClwvUC1T2cvLMIOD1NQB5pl06rdJyN0ONqxyNyqU+mtaMgo2u4CRoQ2rCV2lYJMQXa4XVEGuZLCXtH+ZyrsNCnQGAJy5VQolzQphNBs2bEBgYCAkEgkiIyNx6tSpJo/96quvcO+998LJyQlOTk6Ijo5udPz8+fPBcZzWY+zYsca+jC4lragaaUXVEPI5DG8YX0AsEwWbXYB6vs3D1wrpZkeIDpeyywGomtDbu0zl3fr5OsBKyEdJtQypDbWnxLC2b9+O2NhYrFy5EmfPnkV4eDhiYmJQUFCg8/hDhw5h1qxZOHjwIBISEuDn54cxY8YgOztb67ixY8ciNzdX8/jpp5864nK6jPgrqlHogwOdYSehVYMsGQWbXcCgQCfYigUorpbhYsNNlRBy24UsVbkI93U0eNpCPg+DAlVN6SduNr0ML2m7devWYdGiRViwYAHCwsKwceNGWFtbY9OmTTqP37p1K5555hlEREQgNDQUX3/9tWYavzuJxWJ4enpqHk5O1OfWkKgJveugYLMLEN4xBdKBFN2/9Inh6dOsB6jmog0NDYVEIkHfvn3x559/avbV19fj5ZdfRt++fWFjYwNvb2/MnTsXOTk5WmkEBgY2avpbu3atUa7PkiQ1BJv9jBBsAsDQbqop3yjYNDyZTIbExERER0drtvF4PERHRyMhIaFVadTU1KC+vh7Ozs5a2w8dOgR3d3eEhIRg8eLFKC5u/v2TSqWoqKjQehDdKuvqcfJmCQBaNagroGCzi1D/clQ3WxDj0rdZ7/jx45g1axYWLlyIc+fOYdKkSZg0aRIuXboEQHUzPHv2LP773//i7Nmz2LFjB65evYoJEyY0Suv111/XavpbunSpUa/V3EnlCqTkqYKCfr7GmXolMkgVxJxMK2lyZg7SNkVFRVAoFJrp99Q8PDyQl5fXqjRefvlleHt7awWsY8eOxXfffYf4+Hi88847OHz4MMaNGweFoun5UtesWQMHBwfNw8/Pr20X1QUcSy2CXMnQzdUGQa42ps4OMbI2TX1EzM/9oe7gOOByTgVyy2vh5UBLghnTnc16ALBx40bs2bMHmzZtwiuvvNLo+I8//hhjx47F8uXLAQBvvPEG9u3bh/Xr12Pjxo1wcHDAvn37tM5Zv349hgwZgoyMDPj7+2u229nZtbh87J2kUimkUqnm765WG3MltxL1CgYnayF8nYxTLvr5Omr6babkVaKXASeOJ+2zdu1abNu2DYcOHYJEItFsnzlzpubfffv2Rb9+/RAcHIxDhw5h9OjROtOKi4tDbGys5u+KigoKOJsQ39DKdj81oXcJVLPZRbjaihHh5wjg9rxmxDja0qyXkJCgdTwAxMTENNsMWF5eDo7j4OjoqLV97dq1cHFxQf/+/fHee+9BLpc3m9+uXhuT1LCUaz9fR4MPDlITCXiI7Kaq3TxKU5AZlKurK/h8PvLztVtt8vPzW/zR9f7772Pt2rX4559/0K9fv2aP7datG1xdXXH9+vUmjxGLxbC3t9d6kMYUSqbp0jWalqjsEijY7EKiG/rF7KemdKNqS7NeXl6eXsfX1dXh5ZdfxqxZs7RuaM899xy2bduGgwcP4qmnnsLbb7+Nl156qdn8xsXFoby8XPPIzMxszWVajPOZ6v6axl295L4eqinI1EvzEcMQiUQYOHCg1uAe9WCfqKioJs9799138cYbb2Dv3r0YNGhQi8+TlZWF4uJieHl5GSTfXdn5zFKUVMtgLxFgcKBzyycQs0fN6F3ImDAPvPf3VRy/XoyKunrY01QTZqm+vh6PPPIIGGP4/PPPtfbd2YTXr18/iEQiPPXUU1izZk2Ty7+KxeIuvTRs4i3VIIUBRl7dR72a16n0EtTKFLAS8Y36fF1JbGws5s2bh0GDBmHIkCH46KOPUF1drenGMnfuXPj4+GDNmjUAgHfeeQcrVqzAjz/+iMDAQM2POltbW9ja2qKqqgqrV6/G1KlT4enpiRs3buCll15C9+7dERMTY7LrtBT7klW1miND3CHkU51XV0DvchfS3d0W3dxsIFMocZBGpRtNW5r1PD09W3W8OtC8desW9u3b12IzXWRkJORyOdLT0/W/kC6gsFKK9OIacBwwwN+4wWawmw28HSSQyZU4mUaj0g1pxowZeP/997FixQpERETg/Pnz2Lt3r6a1ICMjA7m5uZrjP//8c8hkMkybNg1eXl6ax/vvvw8A4PP5uHjxIiZMmICePXti4cKFGDhwII4ePdqlf5gZirp1LTqMRqF3FRRsdiEcx2FcH1XwsvdS60ZpEv21pVkvKiqq0Rx/+/bt0zpeHWimpqZi//79cHFxaTEv58+fB4/Hg7s79YvSRV2rGeJhBwcr49b0cxyHESGq2k2agszwlixZglu3bkEqleLkyZOIjIzU7Dt06BA2b96s+Ts9PR2MsUaPVatWAQCsrKzw999/o6CgADKZDOnp6fjyyy8bdXUh+rtRWIXrBVUQ8DiMaKjtJ5aPgs0uZmxvVX+jQ1cLUStregoP0j6xsbH46quvsGXLFly5cgWLFy9u1KwXFxenOf7555/H3r178cEHHyAlJQWrVq3CmTNnsGTJEgCqQHPatGk4c+YMtm7dCoVCgby8POTl5UEmkwFQDTL66KOPcOHCBdy8eRNbt27Fiy++iEcffZQmo27C6Yb1ytWTrhvb6NCGftPJ+TQFEumS/r6squgY1t3V6D/wSOdBfTa7mD4+9vBztkJmSS32X8nHw+Heps6SRZoxYwYKCwuxYsUK5OXlISIiolGzHo93+7fesGHD8OOPP+K1117Dq6++ih49emDnzp3o06cPACA7Oxu7d+8GAERERGg918GDBzFy5EiIxWJs27YNq1atglQqRVBQEF588UWtfpxE25l0Vc1mRw1SGN7DFVZCPnLK63A5pwJ9fIw7KImQzubvhla1sb1bPz0bMX8UbHYxHMdhQrg3Nhy8gV3ncyjYNKIlS5ZoaibvdujQoUbbpk+fjunTp+s8PjAwsMWasAEDBuDEiRN657Orqqyrx6Uc1ZyiA408OEhNIuTjvp6u+PtyPv65nEfBJulSsstqcSGrHBwHPED9NbsUakbvgiZG+AAADl8rQFmNzMS5IcQ0TtwsgULJEOhiDV8n6w573jFhDf2mL1O/adK1/JWkGqQ1OMAZbnY00KoroWCzC+rpYYdQTzvUKxj2JOW2fAIhFkg9ufq9PTp2kEJ0mAdEfB6u5VfhSm7XWq2JdG3/u6i63zwUTnOVdjUUbHZRUwaoajd/PpNl4pwQYhrHUlWTq9/bw7VDn9fBSoj7Q1UB7s7z2R363ISYyq3ialzILAOPA8b1oWCzq6Fgs4uaMsAXAh6HC5llVLtCupzMkhrcLKoGn8dhaHDLU0gZ2qSGriz/O58DpZJGpRPL90dDreY93V2pCb0LomCzi3K1FWs6aG8/3bWWJyTk0FXVPJf9/RxNspLW/aHusBMLkFNeh+M3aIJ3YtkYY/jtrKoV7eF+NCi1K6JgswubOcQfAPBbYhaqpHIT54aQjvNXw/QrphoRKxHyMbmhK8vWk7dMkgdCOsrZjDLcLKyGlZCP8f2oCb0romCzC7u3uyu6udmgUirHz1S7SbqIkmoZTqap5tc0Zd+xOZEBAIB/kvORX1FnsnwQYmy/nFHdX8b39YKtmGZc7Ioo2OzCeDwOj98TBAD49ngaFNR3jHQB+5PzoVAyhHnZw9+l46Y8uluIpx0GBzpBoWTYeoJqN4llqpLKNf01pw/yNXFuiKlQsNnFTR3gC0drITJLavHHxRxTZ4cQo/tfw+d8bB/Tr2Ayf5jqx96WhFvUlYVYJHU3rW6uNogM6piVukjnQ8FmF2cl4mPRvd0AAB/vT4VcoTRxjggxnsySGhy7rprySD0i3JTG9vFEN1cblNfW40fqu0ksjFLJsPl4OgBg/j2B4DjOtBkiJtOmYHPDhg0IDAyERCJBZGQkTp061eSxmzdvBsdxWg+JRKJ1DGMMK1asgJeXF6ysrBAdHY3U1NS2ZI20wbxhgXCyFuJmUTV2nKN5/4jl+iUxC4wB93R3MWkTuhqfx+HpkcEAgC+P3KTaTWJRDl4tQFpRNezEAkwdQE3oXZneweb27dsRGxuLlStX4uzZswgPD0dMTAwKCgqaPMfe3h65ubmax61b2r/g3333XXzyySfYuHEjTp48CRsbG8TExKCujjrNdwRbsQBPj1Dd8N77+yrd8IhFkiuUmoEKMwb7mzg3t03u74MgVxsUVcnwxeEbps4OIQbBGMMnB64DAGZF+sOGBgZ1aXoHm+vWrcOiRYuwYMEChIWFYePGjbC2tsamTZuaPIfjOHh6emoeHh63pxthjOGjjz7Ca6+9hokTJ6Jfv3747rvvkJOTg507d7bpooj+5t8TiAAXaxRWSvHpAapVJpbnfxdzkFteB2cbEcaYaMojXYR8Hl4eGwoA+OroTWSV1pg4R4S036FrhbiQWQaJkKfpqkW6Lr2CTZlMhsTERERHR99OgMdDdHQ0EhISmjyvqqoKAQEB8PPzw8SJE3H58mXNvrS0NOTl5Wml6eDggMjIyCbTlEqlqKio0HqQ9hEL+Pjvg2EAgK+PpuFCZplpM0SIASmVDJ8dVNUaLhweBImQb+IcaYvp7YHIIGfU1SsRtyMJjNHMEMR8KZQM7+29CgB4bGgArRhE9As2i4qKoFAotGomAcDDwwN5eXk6zwkJCcGmTZuwa9cu/PDDD1AqlRg2bBiyslSrCajP0yfNNWvWwMHBQfPw8/PT5zJIE6LDPPBQPy8olAyxP59HrUxh6iwRYhB7knKRWlAFO4kAj0UFmDo7jXAchzVT+kIs4OFoahG20by3xIxtO52B5NwK2Elud9EiXZvRR6NHRUVh7ty5iIiIwIgRI7Bjxw64ubnhiy++aHOacXFxKC8v1zwyM+mL2VDemNgHbnZi3Cisxis7LlINCzF7NTI51vx5BYCqVtMUy1O2Rjc3Wywb0xMAsGr3ZVzKLjdxjgjRX2GlFO//rarVjH2gJ1xsqVaT6Blsurq6gs/nIz8/X2t7fn4+PD1bN2edUChE//79cf26quOw+jx90hSLxbC3t9d6EMNwshHh01n9IeBx2HU+BxsOXjd1lghpl08PXEdOeR18naw6fS3LE8O74f4QN0jlSjz1fSKtLETMCmMML/92EaU19Qj1tMOjQztfKwIxDb2CTZFIhIEDByI+Pl6zTalUIj4+HlFRUa1KQ6FQICkpCV5eqmXigoKC4OnpqZVmRUUFTp482eo0iWEN7eaCFQ+r+m++/881bP43zcQ5IqRtjl8vwsaGEd7/fSis0/XVvBuPx+HDGREIcrVBdlktHvvmJIqqpKbOFiGt8vXRNBxIKYCIz8NHMyMg5NNU3kRF709CbGwsvvrqK2zZsgVXrlzB4sWLUV1djQULFgAA5s6di7i4OM3xr7/+Ov755x/cvHkTZ8+exaOPPopbt27hiSeeAKDqq/TCCy/gzTffxO7du5GUlIS5c+fC29sbkyZNMsxVEr3NjQrE0lHdAQCr/peMD/ddoyZ1YlYyS2rw/PbzYAyYMcgPMb1Nv2JQazhai/Dd40PgYS/GtfwqTN+YgIxiGqFOOre/L+fh7b9U3VVeHR+KUE9qcSS36T3x1YwZM1BYWIgVK1YgLy8PERER2Lt3r2aAT0ZGBni82zFsaWkpFi1ahLy8PDg5OWHgwIE4fvw4wsLCNMe89NJLqK6uxpNPPomysjIMHz4ce/fubTT5O+lYsQ/0BAfgkwPX8XF8Ki7nVOC9af3gZCMyddYIaVZeeR0e/eYkCiulCPW0w6oJvU2dJb34OVvjp0VD8dg3p5BWVI2H1x/DB9PDEd2JpmwiRG3vpVws/ekcGANmR/pj3rBAU2eJdDIcs4DqqoqKCjg4OKC8vJz6bxrBtlMZWLHrMmQKJVxsRHh1fC9M6u8DPs8ylx7r6p8nc7/+pKxyLPruDPIqVP00f1s8DB725vnDNa+8Dk/9kKiZimxihDdeGRcKLwcr02aslcz9s9Reln79SiXD54dv4P1/roIx4MF+XvhoBjWfG4O5f5boE0FaNHOIP3Y8Mww93G1RXC3Dsl8uYNzHR/DLmUzU1dP0SKRzqJHJsW7fNUz+7F/kVdShu7stflo01GwDTQDwdJDg56eG4onhQeBxwK7zORj53iGs3HUJaUXVps4e6cIuZZdj+hcJeO9vVaA5a4g/PpnZnwJNohN9Kkir9PFxwJ7n7sXLY0NhLxHgWn4Vlv96EYPf2o/lv1zA35fzUF5bb+psdiobNmxAYGAgJBIJIiMjcerUqWaP/+WXXxAaGgqJRIK+ffvizz//1NrPGMOKFSvg5eUFKysrREdHIzVVe7WnkpISzJkzB/b29nB0dMTChQtRVVVl8GvrTLLLavHx/lTc9+4hfBKfCrmSYWxvT/y2eBj8nE2//nl7iQV8vPZQGHY+ew+GBDpDKldiS8It3P/+IUz9/Di+PnoTqfmVXb5PtSnKW1dTr1DiQEo+nthyGg99egyJt0phI+Lj3an9sGZKX4tt7SLtR83oRG/lNfX48VQGfjhxC9lltZrtPA7o6WGHPj4OCPGwQzc3G/g5W8PLQQJbsQAcZx5fRIb4PG3fvh1z587Fxo0bERkZiY8++gi//PILrl69Cnd390bHHz9+HPfddx/WrFmDhx56CD/++CPeeecdnD17Fn369AEAvPPOO1izZg22bNmCoKAg/Pe//0VSUhKSk5M1/ZvHjRuH3NxcfPHFF6ivr8eCBQswePBg/Pjjjx16/cZSr1Aio6QGV/MqcT6zDAk3ipF0x3yU/s7WeHlsKMb39TSbz5s+GGM4fqMYXx+9icPXCqG849vb2UaEcF8H9PKyR3d3WwS4WMPH0RqutiIITFTb1FGfJVOVt5Z05rLUEsYYiqtluF5QhUvZ5Ui8VYpj14tQWScHAHAcMCHcvLp1mDNz/iwBFGySdlAqGU6kFeOfy/k4cq0QN5tp1rMW8eFsI4KjtRAOVkLYiYWwFvNhLeLDSsiHWMCHkM+DSMCDkM9BwOPA5/PA51T/5jiAx3HgN/yb4zhwUH3hcWjY1vBcqhjjdqChjjnuDj2EfB7uD218IzLE5ykyMhKDBw/G+vXrG14rJfz8/LB06VK88sorjY6fMWMGqqur8ccff2i2DR06FBEREdi4cSMYY/D29sayZcvwn//8BwBQXl4ODw8PbN68GTNnzsSVK1cQFhaG06dPY9CgQQCAvXv3Yvz48cjKyoK3t3er8t7U9Z/PLEOBjnkf7/wC0f42YWBMtV/1fwYlU93ElIxBoVR9huRKBrlSiXoFg0yuRF29AnVyBWplClTWyVFeW4/iKikKKqXIr6jTCrAA1fs7JNAZsyP9Ma6PF0SCrtFgk1deh78u5SL+SgFOp5dAKlfqPI7HqQJRJ2tV+bOTCGEjFsBGxIdEyIdYyINYwIdYwIOAx0HAV/2fz1OVPR6nKl/8O/6tq/zd19MNtmLtMacd9d1sivLWGk1df1pRNVLzK/W6xrtv1LfL2u1ypt7OGrYpmer/CiWDgjEolQz1Sga5QgmZXPWokytQI1OgWipHRa0cpTUyFFZJkVdehxodq8i52oowMcIHsyP9Eexmq9c1kLYz9zhH79HohKjxeByGBbtiWLArAKCgog7nMstwJbcCqflVSCuqRlZpDSrq5KiRKVAjq0VWaW0LqXYcO4kASatiDJ6uTCZDYmKi1hRgPB4P0dHRSEhI0HlOQkICYmNjtbbFxMRg586dAIC0tDTk5eUhOjpas9/BwQGRkZFISEjAzJkzkZCQAEdHR02gCQDR0dHg8Xg4efIkJk+erPO5pVIppNLbczlWVFToPG7joRvYe1n3ErIdyVrER7CbLfr4OGBIkBPu6e4Kdzvz7ZfZVp4OEiy4JwgL7gmCVK5Ack4FkrLLkZJXibTCamSU1CCvog4KJUNRlQxFVTKj5ufgf0Y2CjY7gqnKmy6tLUt7L+Xhnb0prbo+U+I4wMfRCr287BHh54ih3VwQ4edIzeVEbxRsEoNxt5cgprdno/kMa2RyFFRIUVwtQ3mtDOW19aiqk6Napqq9qqtXQCpXQipXQq5Qol6hRL2SQaFQ/RpXKFU1YXfWiimVt3+9M0Dzs57d9SsfQKO+bOq/bETG+fgXFRVBoVBopgNT8/DwQEqK7htMXl6ezuPz8vI0+9Xbmjvm7iZDgUAAZ2dnzTG6rFmzBqtXr27xuoLcbNDf31Fr2923HHXT9Z21zBxU1c4c0KiWjN9Qg6aqzeZByOdBIuTBSqiq9bYRC+BoLYSzjRhudmJ4O0rgZiu2yCby9hAL+Ojv74T+/k5a2xVKhuIqKYqqZCitUZW9yrp6VEkVqJHKUSdXoK7+di1XvUIJuVJV5uoVyoYaaFXZU9eSMegofwAkQtPUKJuqvOnS2rLkYS9uVJbu1twn/O5yptrWUNbU/24oZxw48Hgc+A1/8xtqr8UNLUkSIR9WIj5sxQLYSwRwtBbBxVYELwcreDlIOv1CCMQ8ULBJjM5aJECgqwCBrjamzgrRIS4uTquWp6KiAn5+fo2Oe3lsaEdmixgAn8fB3V4CdzMekW9OWluWpgzwxZQBvh2ZNUJMqmt0biKkA7m6uoLP5yM/P19re35+Pjw9da9i4+np2ezx6v+3dExBQYHWfrlcjpKSkiafFwDEYjHs7e21HoSYC1OVN12oLBGim0XUbKqbSZvqH0OIPtSfo7aOnROJRBg4cCDi4+M1S64qlUrEx8djyZIlOs+JiopCfHw8XnjhBc22ffv2ISoqCgAQFBQET09PxMfHIyIiQpPPkydPYvHixZo0ysrKkJiYiIEDBwIADhw4AKVSicjIyFbnn8oTMZT2lqXWMFV5aw0qS8RQOqIsGRWzAJmZmQwNg17pQQ9DPTIzM9v8mdy2bRsTi8Vs8+bNLDk5mT355JPM0dGR5eXlMcYYe+yxx9grr7yiOf7ff/9lAoGAvf/+++zKlSts5cqVTCgUsqSkJM0xa9euZY6OjmzXrl3s4sWLbOLEiSwoKIjV1tZqjhk7dizr378/O3nyJDt27Bjr0aMHmzVrFpUnepj00Z6y1BqmKm8tobJED0M/jF2WjMUiaja9vb2RmZkJOzu7RgMH1H1mMjMzqUnDSCztNWaMobKystVTBekyY8YMFBYWYsWKFcjLy0NERAT27t2rGXCQkZEBHu92L5Zhw4bhxx9/xGuvvYZXX30VPXr0wM6dOzVz/gHASy+9hOrqajz55JMoKyvD8OHDsXfvXq05/7Zu3YolS5Zg9OjR4PF4mDp1Kj755BO98t5UebK097mzsqTX2RBlqTVMVd5aQvcm07Kk17ijypKxWMQ8m80x97mpzAG9xl0Dvc8dg17nroHeZ+Oj17jzoAFChBBCCCHEaCjYJIQQQgghRmPxwaZYLMbKlSshFotNnRWLRa9x10Dvc8eg17lroPfZ+Og17jwsvs8mIYQQQggxHYuv2SSEEEIIIaZDwSYhhBBCCDEaCjYJIYQQQojRULBJCCGEEEKMhoJNQgghhBBiNBYfbG7YsAGBgYGQSCSIjIzEqVOnTJ0ls3HkyBE8/PDD8Pb2Bsdx2Llzp9Z+xhhWrFgBLy8vWFlZITo6GqmpqVrHlJSUYM6cObC3t4ejoyMWLlyIqqqqDrwKYihUltqOyhK5E5WltqOyZJ4sOtjcvn07YmNjsXLlSpw9exbh4eGIiYlBQUGBqbNmFqqrqxEeHo4NGzbo3P/uu+/ik08+wcaNG3Hy5EnY2NggJiYGdXV1mmPmzJmDy5cvY9++ffjjjz9w5MgRPPnkkx11CcRAqCy1D5UlokZlqX2oLJkpZsGGDBnCnn32Wc3fCoWCeXt7szVr1pgwV+YJAPv99981fyuVSubp6cnee+89zbaysjImFovZTz/9xBhjLDk5mQFgp0+f1hzz119/MY7jWHZ2doflnbQflSXDobLUtVFZMhwqS+bDYms2ZTIZEhMTER0drdnG4/EQHR2NhIQEE+bMMqSlpSEvL0/r9XVwcEBkZKTm9U1ISICjoyMGDRqkOSY6Oho8Hg8nT57s8DyTtqGyZFxUlroOKkvGRWWp87LYYLOoqAgKhQIeHh5a2z08PJCXl2eiXFkO9WvY3Oubl5cHd3d3rf0CgQDOzs70HpgRKkvGRWWp66CyZFxUljoviw02CSGEEEKI6VlssOnq6go+n4/8/Hyt7fn5+fD09DRRriyH+jVs7vX19PRs1OldLpejpKSE3gMzQmXJuKgsdR1UloyLylLnZbHBpkgkwsCBAxEfH6/ZplQqER8fj6ioKBPmzDIEBQXB09NT6/WtqKjAyZMnNa9vVFQUysrKkJiYqDnmwIEDUCqViIyM7PA8k7ahsmRcVJa6DipLxkVlqRMz9QglY9q2bRsTi8Vs8+bNLDk5mT355JPM0dGR5eXlmTprZqGyspKdO3eOnTt3jgFg69atY+fOnWO3bt1ijDG2du1a5ujoyHbt2sUuXrzIJk6cyIKCglhtba0mjbFjx7L+/fuzkydPsmPHjrEePXqwWbNmmeqSSBtRWWofKktEjcpS+1BZMk8WHWwyxtinn37K/P39mUgkYkOGDGEnTpwwdZbMxsGDBxmARo958+YxxlTTTPz3v/9lHh4eTCwWs9GjR7OrV69qpVFcXMxmzZrFbG1tmb29PVuwYAGrrKw0wdWQ9qKy1HZUlsidqCy1HZUl88QxxlhH16YSQgghhJCuwWL7bBJCCCGEENOjYJMQQgghhBgNBZuEEEIIIcRoKNgkhBBCCCFGQ8EmIYQQQggxGgo2CSGEEEKI0VCwSQghhBBCjIaCTUIIIYQQYjQUbBJCCCGEEKOhYJMQQgghhBgNBZuEEEIIIcRoKNgkhBBCCCFGQ8EmIYQQQggxGgo2CSGEEEKI0VCwSQghhBBCjIaCTUIIIYQQYjQUbBJCCCGEEKOhYJMQQgghhBgNBZuEEEIIIcRoKNgkXUJtbS34fD7efvttU2eFELND5YcQ4+gqZatTBpvHjx/HqlWrUFZWZtI0mpKUlIRp06YhICAAEokEPj4+eOCBB/Dpp58a/LksjTHfl+YkJydDqVSiT58+BkuTMYbXX38dR48eNViaxtSZy9XmzZvBcRzOnDlj0HQtDZUf0zGH8qN+CAQC+Pj4YP78+cjOzjboc1kqKlvG1WmDzdWrV7e7ULc3jabSHTRoEC5cuIBFixZh/fr1eOKJJ8Dj8fDxxx8b9LkskbHel5YkJSUBAHr37m2wNK9du4aVK1ciNzfXYGkaU2cuV6R1qPyYjjmUn9dffx3ff/89Nm7ciHHjxuGHH37AiBEjUFdXZ5TnsyRUtoxLYOoMmJu33noLDg4OOH36NBwdHbX2FRQUmCZTd6muroaNjY2ps9GhWrrmpKQkWFtbo1u3bgZ7zsTERADAgAEDDJYm6Ry6Whmi8mMZxo0bh0GDBgEAnnjiCbi6uuKdd97B7t278cgjj5g4d12vXAFUtjSYCVRUVLDnn3+eBQQEMJFIxNzc3Fh0dDRLTExkK1euZAAaPdLS0hhjjKWnp7PFixeznj17MolEwpydndm0adM0+xljLaaRlZXFFixYwNzd3ZlIJGJhYWHsm2++aVXeQ0JC2MiRI9t87eq8XblyhU2fPp3Z2dkxZ2dn9txzz7Ha2lrNca25zjvTu3z5Mps1axZzdHRkEREReqVxZzpXr15lc+bMYfb29szV1ZW99tprTKlUsoyMDDZhwgRmZ2fHPDw82Pvvv98ojZZeV0O9L81dc1MeeOABNnDgQHb8+HE2YsQIZm1tzUJCQtiPP/7Y6NiDBw+ycePGMQcHB+bk5MQefPBBdv36da1jBg8e3Og6HBwcGGOMJScns6eeeor17NmTWVlZMQ8PDzZ79myWk5PTbB7by5zL1bfffssAsNOnTzd7XGvLT2uv6c4021OGOkP5aU0aLV1vU/QpP4y1XIao/HRM+fnjjz8YAPb222+3mEZnvDcZolwxRvcmU5ctxhgzSc3m008/jV9//RVLlixBWFgYiouLcezYMVy5cgVTpkzBtWvX8NNPP+HDDz+Eq6srAMDNzQ0AcPr0aRw/fhwzZ86Er68v0tPT8fnnn2PkyJFITk6GtbV1s2nk5+dj6NCh4DgOS5YsgZubG/766y8sXLgQFRUVeOGFF5rNe0BAABISEnDp0qV29bF45JFHEBgYiDVr1uDEiRP45JNPUFpaiu+++67V13mn6dOno0ePHnj77bfBGGtTGgAwY8YM9OrVC2vXrsWePXvw5ptvwtnZGV988QVGjRqFd955B1u3bsV//vMfDB48GPfddx8AtOp1NfT7ouuam5KUlAQHBwfMmDEDixYtwtSpU/HZZ59h9uzZ6NatGyIjIwGo+j4tXLgQDzzwAN58803U1NTg008/RXR0NJKTk2FlZQUAePnll7Fq1SpIpVKsWLECADQ13Zs2bUJaWhoee+wxeHp64uLFi/jiiy+Qn5+P/fv3t+bj0SbmXK701VL5ae013ckQZchU5ae1abR0vU1pbfkBWleGqPx0TPlJT08HADg5ObX6nM54b2pruQLo3gSYvmwBME3NpoODA3v22Web3P/ee+81+sWuVlNT02hbQkICA8C+++67FtNYuHAh8/LyYkVFRVrbZ86cyRwcHHSmf6d//vmH8fl8xufzWVRUFHvppZfY33//zWQyWbPnqal/+UyYMEFr+zPPPMMAsAsXLuh1ner0Zs2a1ej41qZxZzpPPvmkZptcLme+vr6M4zi2du1azfbS0lJmZWXF5s2bp9nW2tfVEO9Lc9esS2FhIQPAnJ2dtZ43IyODiUQizTUnJSUxkUjE3njjDa3zL1y4wACw3377TWu7v78/mz9/fqPnq66ubrTttddeYzwer1HtmyGZc7nSt2azpfKjzzUZogyZuvzok4axyg9j+pUhKj+3Gar87N+/nxUWFrLMzEz266+/Mjc3NyYWi1lmZmaz5zPWOe9N7S1XjNG96U6mKluMMWaSAUKOjo44efIkcnJy9D5XHb0DQH19PYqLi9G9e3c4Ojri7NmzzZ7LGMNvv/2Ghx9+GIwxFBUVaR4xMTEoLy9vMY0HHngACQkJmDBhAi5cuIB3330XMTEx8PHxwe7du1t9Hc8++6zW30uXLgUA/Pnnn226zqeffrrRtra8Vk888YTm33w+H4MGDQJjDAsXLtRsd3R0REhICG7evAmg/a9rW8/Xdc26XLp0CQDwf//3fwgMDNRs9/PzQ0hICNLS0gCoOtf7+/vjqaee0sqDt7c3hEKh5noBoLy8HBkZGejXr1+j57vzV3lZWRmKiorg5OQEpVIJuVzeqjy3hTmXK321VH4A05QhU5SftqZh6PIDtL4MUfm5zZDlJzo6Gm5ubvDz88O0adNgY2OD3bt3w9fXt9XX0hnvTW0pVwDdm+5mqrIFmGiA0Lvvvot58+bBz88PAwcOxPjx4zF37txWdZCtra3FmjVr8O233yI7O1urirq8vLzZcwsLC1FWVoYvv/wSX375pc5jWjPIZ/DgwdixYwdkMhkuXLiA33//HR9++CGmTZuG8+fPIywsrMU0evToofV3cHAweDyeptlD3+sMCgpqtK0tr5W/v7/W3w4ODpBIJJpmhTu3FxcXA2j/69rW83Vdsy7q0X6PPvpoo308Hg/W1taQSqXYs2cPampq4O7urjMdOzs7zb8vXrwIAI0KtEKhwJYtW7B+/XqkpKSgtrZWs8/V1RW2tratynNbmHu50kdL5QcwTRkyRflpaxqGLD8A9CpDVH5uM2T52bBhA3r27Iny8nJs2rQJR44cgVgsbtW5ap3x3tSWcgXQvelOpixbgImCzUceeQT33nsvfv/9d/zzzz9477338M4772DHjh0YN25cs+cuXboU3377LV544QVERUXBwcEBHMdh5syZUCqVzZ6r3v/oo49i3rx5Oo/R9WugKSKRCIMHD8bgwYPRs2dPLFiwAL/88gtWrlzZ6jTUOI7T+lvf67zzl2Jb0wBUvxpbsw2A5guiva9rW8/Xdc26JCUlwdvbu1FBrampQUpKCiZMmICbN2+ipqYGb7zxBoYOHaoznfDwcM2/1QX6zm0AMHfuXPz888+YN28eXnjhBbi6ukIkEuG5556Dl5dXq/LbVpZSrtri7vIDmKYMmaL8tDUNQ5YfAHqVISo/txmy/AwZMkQzGn3SpEkYPnw4Zs+ejatXr7Y5mOgM96a2lCuA7k13MmXZAkw49ZGXlxeeeeYZPPPMMygoKMCAAQPw1ltvYdy4cTpvHGq//vor5s2bhw8++ECzra6urtHcWLrScHNzg52dHRQKBaKjow12LQA0Bby181qlpqZq/fq5fv06lEqlpiq9tdfZHEOk0Rr6vK4d/b4AqgKt64vp22+/hVQqxZQpU1BZWQkA6NWrV6vycPHiRXh5eWn9sk5OTsaPP/6IDz/8UKvTeG5uLq5du4axY8e2/2JaYGnlqiktlR/AfMpQe8uPvmnoqzXlB4BeZYjKz23Geu/4fD7WrFmD+++/H+vXr8crr7zSqvPo3tS289uiK92bOrzPpkKhaFRN7u7uDm9vb0ilUgDQzEml64PH5/Mbje769NNPoVAotLbpSoPP52Pq1Kn47bffNH0l7lRYWNhi/g8ePKhzdJm6P0tISEiLaQCq5o47qVcfUv+Cbu11NscQabT2eVr7uhrrfWkKYwyXLl1CdnY2bty4oZXm2rVrMWHCBERERCAwMBAcx+G3335rlIZcLkdpaanWtoyMjEb9oLKysgAA3bt312yrr6/HE088AYVCYdTaPXMvV/pqqfyo82UOZai95UffNPTR2vIDQK8yROXndhrGLD8jR47EkCFD8NFHH7V6Yne6N5W16Xx9dZV7k1qH12xWVlbC19cX06ZNQ3h4OGxtbbF//36cPn1a8ytn4MCBAFSdZmfOnAmhUIiHH34YNjY2eOihh/D999/DwcEBYWFhSEhIwP79++Hi4qL1PE2lsXbtWhw8eBCRkZFYtGgRwsLCUFJSgrNnz2L//v0oKSlpNv9Lly5FTU0NJk+ejNDQUMhkMhw/fhzbt29HYGAgFixY0KrXIS0tDRMmTMDYsWORkJCAH374AbNnz9ZUfbf2OptjiDRaq7Wvq7Hel6akp6ejqqoKAwcOxIMPPojnnnsONTU1WL9+PXg8nqYfjru7O2bNmoUff/wRFRUVGDduHBQKBa5fv44dO3Zg27ZtGD58uCbdoKAgHDhwAO+++y68vb3Rq1cvREREwNraGs8//zzS0tJQW1uL77//XvPL9e5mDUMy93Klr5bKD2BeZai95cfGxsYo70Fryw+gXxmi8tNx5Wf58uWYPn06Nm/e3KqBK3RvonuTURhjiHtzpFIpW758OQsPD2d2dnbMxsaGhYeHs88++0zruDfeeIP5+PgwHo+nNR1BaWkpW7BgAXN1dWW2trYsJiaGpaSksICAgEZTHjSVRn5+Pnv22WeZn58fEwqFzNPTk40ePZp9+eWXLeb/r7/+Yo8//jgLDQ1ltra2TCQSse7du7OlS5ey/Pz8Fs9XT42QnJzMpk2bxuzs7JiTkxNbsmSJ1tQDrb1OdXqFhYWNnkuf16qpdObNm8dsbGwapT1ixAjWu3dvrW2tfV3b+740d81327VrFwPAzp07x5599lnm4ODAHB0d2dy5cxtNZFtXV8fefvttFhYWxqysrJiLiwsbPHgwW7lyZaMpI7Kzs1lMTAyztbVlANgnn3zCGFNNohwaGsokEgnr168f+/bbb9mqVauYQCBgdXV1Lea3rcy9XOk79VFL5UefazJEGeoM5ae1aRir/DDW+jJE5afjyo9CoWDBwcEsODiYyeXyJtPojPcmQ5QrxujexJjpypYax1gLM44Sg1q1ahVWr16NwsLCRiPpCCHNo/JDiHFQ2SLGZJJ5NgkhhBBCSNdAwSYhhBBCCDEaCjYJIYQQQojRUJ9NQgghhBBiNFSzSQghhBBCjMZkKwgZklKpRE5ODuzs7Jpd5YGQ1mCMobKyEt7e3uDxut7vMSpPxFCoLFFZIoZh7mXJIoLNnJwc+Pn5mTobxMJkZmY2WomhK6DyRAyNyhIhhmGuZalTBZsbNmzAe++9h7y8PISHh+PTTz/FkCFDWjzPzs4OgOpNsLe3N3Y2iYWrqKiAn5+f5nPV1VB5IoZCZYnKEjEMcy9LnSbY3L59O2JjY7Fx40ZERkbio48+QkxMDK5evQp3d/dmz1U3T9jb21OBJgbTVZu9qDwRQ6OyRGWJGIa5lqVOE2yuW7cOixYt0qwtvnHjRuzZswebNm3CK6+8onWsVCqFVCrV/F1RUdFkurO/OoHCSmmT+++m633kwGm2cxwHHgfwGv7P53EQ8Hjg8ziIBDyIBTxIhHzYiPmwlwjhYC2Eq60Y3g5WCHCxhrejFfg88/ywEEJUamUKvLbzEi5mlcHXyQpvTu4LH0crU2eLEItUJZVj64lbOHi1AL29HfDY0AAEutqYOltED50i2JTJZEhMTERcXJxmG4/HQ3R0NBISEhodv2bNGqxevbpVaacXVSOnvM5geW0vKyEffXzsEdXNBaN7eaCfr4PZ/lIhpCtijOG1nZfw29ksAEBqQRUWbj6NXxcPg624U3ylEmIx6hVKzP7qBC5mlQMATtwswbZTGfhm/mAM7eZi4tyR1uoU34xFRUVQKBTw8PDQ2u7h4YGUlJRGx8fFxSE2Nlbzt7ovgy6fzh4AmVzZ7PMz6JhqlGn/Uz0bqZIxKBkDY6p/y5UMCiVDvUKJegWDVK5ArUyBGpkCFbX1KK2pR2GVFDlltcgoqUFtvQKn00txOr0Unxy4jmA3Gzx5XzdM7u8LkcD8RpgR0tX8dSkPv53NAo8D3pjUBx/uS0VKXiXe2nMFa6b0NXX2CLEoXx65iYtZ5XCwEmLJ/d2x93IeEm+VYt6mU9j+VBQi/BxNnUXSCp0i2NSXWCyGWCxu1bEDA5yMnJvWUygZbhZW4WxGKY5cK0J8Sj5uFFbj5d+S8PXRNKyd2hcDA5xNnU1CSDM2H08HADw9IhhzIgPQzdUWs746gd8Ss/BCdA942EtMm0FCLER+RR0+3p8KAFj5cBimDPDFY1EBeOr7RBy+Vohnt57FnueGw9FaZOKckpZ0iqo0V1dX8Pl85Ofna23Pz8+Hp6eniXJleHwehx4edpgx2B8b5gzA6f+LxmsP9oKLjQipBVV45IsT+C4h3dTZJIQ04VZxNU6llYDHAY9FBQAAooJdMDjQCTKFEpv+TTNxDgmxHLvP50CmUKK/vyMm9/cBAEiEfHw6uz8CXKyRXVaLV39PMnEuSWt0imBTJBJh4MCBiI+P12xTKpWIj49HVFSUCXNmXHYSIZ64txvil43AhHBvKJQMK3Zd1vySI4R0Lr8mqvppDu/hBi+H2wOCnrovGADw44kM1NUrTJI3QizN7gs5AIAp/X20xjbYS4RYP2sABDwOfybl4c+kXFNlkbRSpwg2ASA2NhZfffUVtmzZgitXrmDx4sWorq7WjE63ZI7WInw8MwLLY0IAAB/uv4bvT9wyca4IIXf746LqpjZtoPakyqNC3eHjaIVKqRwHUwpMkTVCLEpaUTWSssvB53EY39er0f6+vg5YPFL1I2/Frksoq5F1dBaJHjpNsDljxgy8//77WLFiBSIiInD+/Hns3bu30aAhS8VxHJ69vztejO4JAHj9f5eR1DD6jhBietlltUgrqgafx+H+EDetfTweh4fCVTdEdW0MIaTt1LWV93R3hYut7jEaS0Z1Rw93WxRVybDmz8aDiUnn0WmCTQBYsmQJbt26BalUipMnTyIyMtLUWepwz43ujrG9PVGvYHhu2zlqkiOkkzh+vQgA0M/XAXYSYaP9D/fzBgAcSClAZV19h+aNEEtzKq0EABr9sLuTWMDH2w0zQGw/k4kTN4s7JG9Ef50q2CSqGs61U/vC016CtKJqfH30pqmzRAgBkHBDdSMbFqx7br/e3vbo5mYDqVyJA9SUTkibKZUMZzNKAQCDWpihZXCgM2ZH+gMAXt2RRBU0nRQFm52Qo7UIr4wLBQB8dugGCio6z6T0hHRFjDH8e0NVszks2FXnMRzHYWxv1ewZ8Vco2CSkra4XVqGyTg4rIR+hXi2vBf7y2FC424lxs6ganx6gAbadEQWbndSEcG+E+zmiRqbA54dvmDo7hHRpaUXVyK+QQiTgNTt376hQdwDAoasFkCuaX0yCEKJb4i1VrWaEnyOE/JbDFAcrIV6f2BsAsPHwTRrv0AlRsNlJ8XgcYh9QDRb6+XQmymupDxghpnI+swwA0NfHARIhv8nj+vs7wdFaiIo6ueaGSQjRj7rs6LMoy9g+XniwnxcUSoZlv5yn5vROhoLNTuy+Hq4I8bBDtUyBn05lmDo7hHRZ6nWZ+/k6NHucaqS6qnaT+m0S0jbq/poDAhz1Ou+NiX3gaivCtfwqrP2LRqd3JhRsdmIcx2HhvUEAgO8TbkGp1LGGOyHE6C5klQEAwn0dWzz2/oam9MPXCo2YI0IsU129AulF1QCAPt7N/7i7m7ONCO9NCwegWlb278t5Bs8faRsKNju5CeHesBULkF1WizPULEdIh6tXKJGcUwGg5ZpNABje3RUcB6TkVSKfBvcRopebhdVQMsBeIoCbne75NZtzf6g7Hr9HVUmz7OcLuFFYZegskjagYLOTkwj5GNdHNcL193NZJs4NIV3P1bxKSOVK2EkECHSxafF4ZxsR+vqogtKjqUXGzh4hFiW1oBIA0NPDTmuJSn3EjQ/FkEBnVEnleGLLGRRXSQ2ZRdIGAlNngLRs8gAf/JKYhT8u5mLlw72bHaBgKWRyJcpr61FZV48qqRzVUgXq5ApI6xWQypWQ1ishUyghVyghVzLIlQyKOx6MMSgZoGz4PwNDw39QKhkYAImQh+Uxoaa+VNLJ3dlfk8dr3c3vvh5uuJhVjiPXChstbUkIadq1fFWw2cOj5SmPmiLk87BhzgBM2vAv0oqq8fiWM/hh4RCdizGQjkHBphkYGuQCT3sJ8irqkHCjWNMnzJzV1SuQml+F1IJKpBVVI7OkBjlldSiorENRlQxVUrnR82AnEVCwSVp0KUcVbPb1cWz1Off2cMX6g9dx7HoRlErW6iCVkK4uNV/V7N3Tw7Zd6bjZibHl8SGYtvE4LmSWYd6mU9j8+BDYU8BpEhRsmgEej8PoXu7YejIDB1IKzDLYlMoVOHGzBEevFeJUegmScyogb8WAJzuJADYiAazFfFiL+JAI+BALeRDxeRAJeBDweRDwOPB5nOb/PO72/wGAx3HgOIDHqQZdcQDAARKB5dcQk/ZLyVX11+zVisml1QYEOMFGxEdJtQzJuRXo46PfQAdCuqrUAnWw2faaTbXu7rb4YWEk5nx9EmczyvDIxgRsmj8Y3o5W7U6b6IeCTTMxKvR2sPk6Y23uy9LRzmWUYtupTPyZlIvKu2ornayF6Olhh25utghwsYa3oxU87SVwsRXB2VoEeysh+FQjRExIqWRIyVM164V52bf6PCGfh6hgF+y/UoCjqUUUbBLSCnX1CtwqVo1E7+HevppNtT4+DvhxUSTmf3saKXmVePjTY/h4Zn8M76F7JTBiHBRsmolhwa4QC3jILqvFtfwqhHi2/1efMR2/XoQP9l3Tmtja3U6MUaHuiAp2waBAZ3g7SMwmaCZdU2ZpDWpkCogEPAS5tjw46E7Du7ti/5UCHLteiMUjg42UQ0Ish3okuoOVsE0j0ZvS29sBvz8zDIu+S8SV3Ao8+s1JPDY0AMvHhlCzegehYNNMWIn4GBbsgoNXC3EgpaDTBpu55bVYsesy9iXnAwBEfB4eCvfCjEF+GBzoTH3XiFm50tCE3tPDFoJWLJt3p+E93AAAp9NLUVev6BID+whpD3WtZjc3G4NXRPg6WeP3Z4bhjT+SsfVkBr4/cQt7knLx7P3dMXuIP6xEVD6NiaY+MiP39VTdvBJuFps4J7rtvZSHMR8ewb7kfAh4HOZFBeDYy/dj3SMRiOzmQoEmMTvJuaom9F6erW9CVwt2s4GXgwQyuRIn00oMnTVCLM6tkhoAgL+ztVHSlwj5eGtyX2x9IhLBbjYoqZbhjT+Scc87B7DmryuakfDE8CjYNCORQS4AgMT0EsgVShPn5jbGGD7cdw1P/5CIyjo5wv0csee5e7F6Yh+420tMnT1C2uz24CD9g02O43BvQ7+wo7SakNnasGEDAgMDIZFIEBkZiVOnTpk6SxbrVrEq2AwwUrCpdk93V+x94T68Pbkv/JytUFItwxeHb2LMh0cQve4w3tqTjAMp+SirkRk1H10JNaObkVBPOzhYCVFeW49LORWI8HM0dZbAGMN/d13CDydUa7cvujcIL40NhVDPJkdCOiP14KBQPUai3+neHm74+UwWjqRSsGmOtm/fjtjYWGzcuBGRkZH46KOPEBMTg6tXr8Ld3fxmBensMtU1m61YPKG9hHweZkf645FBvjiQUoCfz2Ti8LVCXC+owvWCKnx1NA0A4OtkhVBP1UBWP2dr+DhK4GEvgZutGE42IrrXtRIFm2aEx+MwONAZ+6/k4+TNYpMHm4wxvLnnCn44kQGOA96c1AdzIgNMmidCDKVaKkdGw80vtA3N6MDtpSuv5Vcht7wWXg405Yo5WbduHRYtWoQFCxYAADZu3Ig9e/Zg06ZNeOWVV9qc7oXMMpxOb3vXCvUUbhwHcFDdGziOA49DwxRwPAj5HIR8HsQCHqyEfFiLBbCTCOBkLYKjlbBTdmu6VaLqs2msZnRdBHwexvT2xJjeniivrcfha4X4N7UIp9JLkFZUjazSWmSV1gJXCnSebyPiw95KCBuxADZiAayEPEiEqmn6RAIehHweRAIOAh4P/Dum6ePxOPAb3jM0/J/X8L6O6e3ZacdltBUFm2ZmaLeGYDOtBE+NMO0I1+9P3MI3x1S//t6Z2g+PDPIzaX4IMST1fH9udmI424jalIaTjQj9fB1xIbMMR1OLqIyYEZlMhsTERMTFxWm28Xg8REdHIyEhQec5UqkUUuntpRErKip0Hnf8RjHe2Zti2Azrgc/j4GkvgZ+zFXq426GvrwOiurnArwODvLvVK5TIKasDAAS4mCYfDlZCTAj3xoRwbwBAWY0MV3Ircb2gEjeLqpFZUovc8lrkV0hRUi2FkgHVMgWqZQqD5sPfxZqCTWJaQ4KcAQBn0ktMujLJqbQSrP5fMgDg5bGhdBMlFudaQxN6SDsnl76vhysuZJbh8LVCKidmpKioCAqFAh4eHlrbPTw8kJKiO1Bcs2YNVq9e3WLaPT1sMbm/T6vywZj24hcMAGPq/zMwzbK8qqV51Uv2ypVK1MsZ6uQK1MoUqJEpUFFbj0qpHAolQ3ZZLbLLanHi5u0a1h7utpg8wAezBvvDqY0/sNoqp6wWCiWDWMCDm63hpj1qD0drEaKCXRAV7NJon0LJUFFbj/LaelQ0LKtcI1Wgpl6BuoZllWUND7lCiXolg0KpWl5ZqWRQKO983xqWVWYAwBDQAd0IOhoFm2aml5c9RAIeKurkSC+uRjc3w0x8q4+Kunq8uP08FEqGiRHeeHpEtw7PAyHGdrVhZGp7VzIZ0dMNnx64jqPXCiFXKPWeQomYj7i4OMTGxmr+rqiogJ9f4x8Yo3t5YHQvj0bbO0K9QoniKhmyy2qRXlSNlLwKnM0ow/nMMqQWVOHdvVex/sB1LLq3GxaPDO6wKbvUg4P8na07ZRP/3fg8Dk42og4Pys0VBZtmRsjnoY+3Pc5mlOFiVrlJgs03/peM7LJa+Dtb463JfWlidmKRrqoHB7WzOSvCz1EzsO9cZhkGBzobInvEyFxdXcHn85Gfn6+1PT8/H56enjrPEYvFEIs7R61cU4R8HjwdJPB0kGBggJNme3ltPfZeysWW47eQnFuBj+NTsScpF188NhDBHXCfUfePNlUTOjEu+olthsIbBgadzyzr8Oc+nV6CXxKzwHHAukfCYSum3yvEMmlqNtsZbAr4PIxomCP3YIruQQak8xGJRBg4cCDi4+M125RKJeLj4xEVFWXCnBmHg5UQMwb7Y89zw7F+dn+42YlxvaAKk9b/i5MdMLezOtg0Zb9RYjwUbJoh9Sj0C1llHfq8coUS/915CQAwc7AfBlENDbFQJdUyFFaqBnoYYo3mUaGqaXIOULBpVmJjY/HVV19hy5YtuHLlChYvXozq6mrN6HRLxHEcHurnjb+evxeDA51QKZXj8c2njV65kV1aCwDwc6Jg0xJRsGmGwn0dAQCXcyogk3fc5O47z+cgJa8SDlZCLI8J7bDnJaSjqZvQ/ZytYGOA2vsRPd3A41TzdmaX1bY7PdIxZsyYgffffx8rVqxAREQEzp8/j7179zYaNGSJXG3F+H5hJIYFu6BapsATW85ofoAZQ1ZDufB2pOnBLBEFm2YowMUajtZCyORKzU3R2GRyJT6OvwYAWDwyuM1TwRBiDtTL1oV4tG1+zbs52YgwKEDVErA/Ob+Fo0lnsmTJEty6dQtSqRQnT55EZGSkqbPUYSRCPr6aOwg9PWxRVCXFsl8uQKlkLZ/YBjkNwaavEwWbloiCTTPEcRz6eDsAAC7nlHfIc/52NguZJbVwsxNjXlRghzwnIaaiXjkoxNNwAyPG9FbVhv19Oc9gaRJibDZiAdbPHgCJkIcj1wrx+7lsgz9HXb1CU2tKNZuWiYJNMxXmrapxuZKre9JgQ1IqGb46chMA8PSIYFiJOmYqDKK/VatWqVYXueMRGkpdHvSlqdls48pBujwQpgo2T6aV0JrLxKz09LDD86N7AgDe2ZuCKqncoOnnlasmc7cS8uFkLTRo2qRzoGDTTIV5qW6CyR0QbB5IKcDNomrYSQSYMZgmpe7sevfujdzcXM3j2LFjps6SWWGMGWxC9zsFuNgg1NMOCiVDfBNL3xHSWT0+PBABLtYoqJRqKh8MJVvTX1NCU+lZKAo2zVQvL3XNZqXR+tCofX1M9cUyO9KfpjoyAwKBAJ6enpqHq6trs8dLpVJUVFRoPbqynPI6VErlEPI5BLkadiWPmN6q+Rn3JOUaNF1CjE0s4OOlhoGhWxLSUSMzXO1mNg0OsngUbJqpbm42EAl4qJLKkVlaY7TnuVlYhRM3S8DjQH01zURqaiq8vb3RrVs3zJkzBxkZGc0ev2bNGjg4OGgeulY86Uqu5qmC7W6uthAJDPsV+XC4FwDgyLVClFZTUzoxL2P7eCLQxRplNfXYfjrTYOmqpz2iwUGWi4JNMyXk8zRNfMk5xquJUn+hjAxxp1+dZiAyMhKbN2/G3r178fnnnyMtLQ333nsvKiubnrUgLi4O5eXlmkdmpuFuIubo9uAgwzWhq3V3t0MvL3vIlQx7aaAQMTN8HodF96mWJ/7mWJrBWtXUI9G9HegeY6ko2DRjxu63KZMr8dvZLACgvppmYty4cZg+fTr69euHmJgY/PnnnygrK8PPP//c5DlisRj29vZaj67sqhGDTQCYEO4NANh13vCjegkxtqkDfGEnESCrtBYn0gyzspC6Gd2HajYtVqcINgMDAxuNoF27dq2ps9XphXqpboYpRppr88i1QhRVyeBqK9asgELMi6OjI3r27Inr16+bOitmQz3DQy8vIwWbEd7gOODEzRJklhivCwwhxiAR8vFwww+mXxOzDJJmDvXZtHidItgEgNdff11rBO3SpUtNnaVOT13zop6mxdB2X8gBoOpnJuR3mo8K0UNVVRVu3LgBLy8vU2fFLNTVK3CjsBrA7UF4hubjaIXh3VWDtn4x0M2akI40baAvAOCvpLx2T4OkVDLkNEx95EPBpsXqNBGEnZ2d1ghaG5umR4HS6FmVng19NjNKagw6MhAAamRy7GtY6UTd7Ec6v//85z84fPgw0tPTcfz4cUyePBl8Ph+zZs0yddbMQmp+FRRKBkdrITztJUZ7numDVN1Sfj2TCYWRZ5MgxND6+zmim6sNausViL/SvhWxiqtlkMmV4DjA08F4ZY6YVqcJNteuXQsXFxf0798f7733HuTypoMnGj2r4morhouNCIwB1wuqDJr2/isFqK1XwN/ZGhF+jgZNmxhPVlYWZs2ahZCQEDzyyCNwcXHBiRMn4ObmZuqsmQVNE7qnvVHn+xsT5gEHKyFyyutw6CrNuUnMC8dxGNdXNY3XP+1cfjW3XNWE7mYrphY0C9Yp3tnnnnsO27Ztw8GDB/HUU0/h7bffxksvvdTk8TR69jZ17aah10jfe0k1D+BD/bxokl0zsm3bNuTk5EAqlSIrKwvbtm1DcHCwqbNlNpI1/TWNO0hKIuRrBt19+2+6UZ+LEGN4IEwVbB5KKYBUrmhzOjllqiZ06q9p2YwWbL7yyiuNBv3c/UhJSQEAxMbGYuTIkejXrx+efvppfPDBB/j0008hlUp1pk2jZ28zRr/NunoFDl0tBKCaV42QrsLYg4Pu9NjQAPA44Nj1IqP1uybEWPr5OMDDXoxqmQIJN9o+Kj3njtWDiOUyWrC5bNkyXLlypdlHt27ddJ4bGRkJuVyO9PR0Y2XPYqhrNq/lG64Z/fiNItTIFPC0l6Cvj4PB0iWkM2OM3RFsGv8HrJ+ztWa99C8NvPwfIcbG43Gaz+/+dvTbVDeje9EcmxbNaGsPurm5tbmf2Pnz58Hj8eDuTtPttCTE0xaAYZvR1QODxvT2oCZ00mVklNSgok4OEZ+n+RFnbE+PCMbfl/Px+7lsPDeqB/xdrDvkeQkxhJE93fHDiQz8e70dNZvl1IzeFZi8z2ZCQgI++ugjXLhwATdv3sTWrVvx4osv4tFHH4WTk5Ops9fp9Wi4KeZV1KGirr7d6SmVDPuvqAYsqH+1EtIVXMwqB6BqQjf0MpVN6e/vhPt6ukGhZFh/MLVDnpMQQ4ns5gw+j0NaUTWy2rhs8u3Vg6gZ3ZKZPNgUi8XYtm0bRowYgd69e+Ott97Ciy++iC+//NLUWTML9pLbU7SkGqApPTm3AoWVUliL+BgS5Nzu9AgxF0nZqmCzr2/Hdh15fnR3AKoJsg090I8QY7KTCBHeUF6Ot7F2M7dhgJAX1WxaNJMHmwMGDMCJEydQVlaG2tpaJCcnIy4uDmKx2NRZMxs9PFRN6akGGGRw+JpqYNCwYFeIBfx2p0eIubiYVQYA6Ofj2KHPOzDAGTG9PaBkwJt7ksEYzbtJzId6gYJj14v0PrdeoUR+pboZnWo2LZnJg03Sfj3cVU3pqQaYa/Nwwyj0kSE0LyPpOpRKhkvZqsFBHV2zCQBx43pByOdwNLUIey/ldfjzE9JW9zQEm8dvFOn9Qym/og6MAUI+B1cbqmCyZBRsWgB1zWZ7p08pr61HYkYpAGBETwo2SdeRVlyNKqkcYgEPPdxtO/z5A11t8NR9qvlQ/7vrMspqZB2eB0LaIsLfESIBD0VVMqQVVet1bm7D4CBPBwl4PBqMasko2LQAPRuCzfauIpRwoxgKJUM3Nxv4OdOoWNJ1nMsoAwD09raHwESrmCwZ1R3d3W1RVCXFq78nUXM6MQtiAV/Tb/NMeqle52aXqgcHUX9NS0fBpgXo3tCMnlvevhHp/zb0ubm3oVmEkK4i8VYJAGBQoOkGxUmEfHwwPRxCPoc/k/Kw+Xi6yfJCiD7U5eZMQzlqreyGkei+TlS5Yeko2LQADlZCeNir+ru0Z0S6Oti8h4JN0sWoa2QGBph2urVwP0e8Or4XAODNPVdwMIXWTTeVt956C8OGDYO1tTUcHR1NnZ1ObVBDudG3ZjOroWbTx4lqNi0dBZsWQj0J9fWCtvXbzC6rxc2iavA4YGiwiyGzRkinVlYj0wyuG2TiYBMA5g8LxNQBvlAoGZ7ZehYnbrZ9wmzSdjKZDNOnT8fixYtNnZVOT/0j7WZRNYqqdC8zrYumZpOmPbJ4FGxaCPWI9Kt5bavZVNdqhvs5wl4iNFi+COnsEm+pamO6udrAxdb0I2I5jsPaqX0xoqcbausVmP/tKarhNIHVq1fjxRdfRN++fVt9jlQqRUVFhdajK3C0FmkG1qnLU2tkN0wETzWblo+CTQuhXrayrSPSj6ub0IOpCZ10LWdudY4m9DsJ+Tx88dhA3B/ihrp6JRZuOY3PD92AUkmDhjqzNWvWwMHBQfPw8/MzdZY6zAB/Vfk5n1nWquMZY5qaTR+q2bR4FGxaCHUzeluCTcYYEhqa6oZREzrpYo7fUH32B3eyFbMkQj6+eGwQZg72g5IB7+xNwZyvT+JmYfvn0yXGERcXh/Lycs0jMzPT1FnqMBH+jgCA8w0zO7SkpFqGunolOA7wogndLR4FmxZCvUZ6QaVU7zn60oqqkV8hhYjPw4BOVLtDiLGV1cg0Kwfd26Pz1eqLBDysmdIXa6b0hZWQj4SbxYj56AhW7b6M/Io6U2fP7LzyyivgOK7ZR0pKSpvTF4vFsLe313p0Ff0bgs2LWWVQtKIGXj04yN1OTKvVdQECU2eAGIatWAAfRytkl9XiWn6VXuuaq2s1+/s7QiKkQk+6jn+vF4MxoIe7Lbw66Vx/HMdh1hB/DAt2wcrdl3HoaiE2H0/H1pO3MLaPF6YO8ME93V0hNNH8oOZk2bJlmD9/frPHdOvWrWMyY2F6uNvBRsRHtUyB6wVVCPG0a/Z4akLvWijYtCAhnnbILqvF1fxK/YLNhmbEKGpCJ13Mseuq5Vnv7dH5V8wKcLHBt/MH49/rxfgkPhWn0kvwvws5+N+FHNhLBLi3hxuGdnNGf38n9PSwg0hAwefd3Nzc4ObW+d9rc8Tncejr64ATN0twPrO05WBTM+0RzbHZFVCwaUF6eNjiQEoBruW1vt8mYwwnbqom4o3qRsEm6ToYYzhyrWEhg56drwldF47jMLyHK4b3cMWl7HL8ciYTf1zMRXG1DHuScrEnKRcAIOBxCHK1QTc3G/g6WcPLQQIPewlcbcVwshHC0UoEO4kA1iI+OI6WCdQlIyMDJSUlyMjIgEKhwPnz5wEA3bt3h61txy9pag4i/Jwags0yzBjs3+yxVLPZtVCwaUF6ear6B6XktX66jesFVSiqkkIs4Gk6eBPSFSTnViC7rBZiAQ+RnWxwUGv08XFAHx8HrHi4N85nluHf60U4nV6CC5llqKiTI7WgSjN/aFM4DrAS8mEt4kMs4EMs5EHE50Ek4EHA4yDg88DnOAj4HHgcBz6PA49TBb08DuBxHDgO4MBhxcNh8LC3nIEeK1aswJYtWzR/9+/fHwBw8OBBjBw50kS56twi/BwB3F7+tTm3ilXrqPs5U7DZFVCwaUHCvFXB5pXcSiiVDDxeyzUW6v6agwOdqZM26VL+SsoDAIwMcYO1yHy/Cvk8DgMDnDRTNzHGkFNeh+sFVUgvqkZWaQ1yy+tQUCFFUbUUZTX1KK+th0LJwBhQI1OgRqZodz7+ExPS7jQ6k82bN2Pz5s2mzoZZUQ8SupZfiRqZvNlylV6smmMzyNWmI7JGTMx8v2FJI91cbSAS8FAllSOztAYBLi0XYuqvSboixhj+bGhyHt/Xy8S5MSyO4+DjaAUfRyuM6Km7fyJjDLX1ClRJ5aiVKVBbr0CtTAGpXIl6hfrBIFcwyJVKKBmDQgkolUz1b6YKVBljYFBtd7YRdeyFkk7Hw14CT3sJ8irqcCm7osmxA3KFEpklFGx2JRRsWhABn4dQTztczCpHck5Fi8GmUnl7fs2h1F+TdCHX8qtws6gaIgEPo0LdTZ2dDsdxHKxFArOu0SWdU7ifA/Iu1+F8ZmmTwWZWaS3kSgaJkAcPO8vpekGaRsMVLUyYl6opPTm35X6bKXmVKKuph7WIj36+DsbOGiGdxi9nVJNtj+jpBjtanpUQg4nwU3XnuJBZ3uQxaUWq/pqBLjat6u5FzB8FmxZG3W8zOaflYFO9HvqQIGeao490GXX1Cvx6NgsAMGtI11lOkJCOEO6nqrhobtnKO4NN0jVQhGFh1DWbl1sRbB5tCDaHdzePaV8IMYS/LuWirKa+oU9j12tCJ8SY+vk6gseppjZqapWr9IaR6IHUX7PLoGDTwvTysgePA/Iq6ppdzq6uXoFTaar+muYwoTUhhsAYw6Zj6QCAGYP9wKcmPEIMylYsQEjDNHyJt0p1HqOu2QxypQnduwoKNi2MjViA0IaCfiZdd0EHgLO3SlFXr4S7nRg9PWiCYtI1xF8pQFJ2OaxFfMyJbH7SaUJI2wxqmIar5WCT7j1dBQWbFmhQYPMFHdBuQqcVREhXoFQyfBR/DQAwNyoQLrZiE+eIEMuknvP1jI57ULVUrlk9iKY96joo2LRAAzW/KkuaPObAlQIAwH1NzMNHiKXZevIWLmVXwFYswJP3dTN1dgixWOp70OXsctTetWDApexyMAZ42kvgZkc/+LoKCjYtkKag51Q0KugAkF5Ujav5lRDwONwfQgMkiOXLKavFO3uvAgCWx4TQBOSEGJGvkxU87MWQKxkuZJVp7UvKVk2JRNPtdS0UbFogH0creNpLIFcynMts3IyxLzkfABDZzRkO1jTHILFsdfUKLP4hEVVSOfr7O+LRoQGmzhIhFo3jOAwJUi0Uop5iT+1CFgWbXREFmxaI4zjN8pPq5vI7qYPNMWGeHZovQjpavUKJ2J/P40JWORythfh4Rn8agU5IBxjZ0EXr4FXte1BSQ01nP1/HDs4RMSUKNi1UTG9VIPnXpTwwxjTbM0tqcLqhL2d0mIdJ8kZIRyivrcdT3yfiz6Q8CPkcPps9AP4uNNUKIR1hRIgq2LyUXYGChmn4ymvqkV6sWhO9rw/VbHYlFGxaqBE93WAl5CO7rFbTRwYAfjh5C4wB9/ZwhY+jlQlzSIhxMMZw8GoBHvzkKA6kFEAs4OGruYMwjBYvIKTDuNqKEd7QVH7oWiEAaLp1+Ttbw4n6TXcpFGxaKCsRH6NCVYN//riYC0DVd+3n06o1oR+jfmsWbcOGDQgMDIREIkFkZCROnTpl6iwZXbVUjl3nszF9YwIWfHsaWaW18He2xs9PRWEkDYQjpMOpy92ehnvQjrPZAIB76IdflyMwdQaI8UyI8MaepFx8l5COOZH+2HE2G6UNy/SN7kVN6JZq+/btiI2NxcaNGxEZGYmPPvoIMTExuHr1KtzdzT/okiuUKKmWIbe8DunF1biaV4lzGWU4m1EKqVwJABDxeZh/TyCWjuoOOwkNgiPEFCb198GnB1Jx+FohDqTkY++lPADA7CG0oEJXQ8GmBRsT5oGobi5IuFmMuZtOIaNE1VdmeUwIDZKwYOvWrcOiRYuwYMECAMDGjRuxZ88ebNq0Ca+88kqj46VSKaRSqebviooKneluOpaGi3dNY9ISdvff7PY2xpjq3wxQMtbwUE2+Llcy1CuUqFcoIZMrUVuvQLVUgcq6elRK5WB3J9wgwMUaE8O9MWdoADzsJXrllRBiWEGuNpgywBe/Jmbh2a3nIFMo0dfHAX1pJHqXQ8GmBeM4Dm9P6YvxHx/FrYZO2XMi/TGpv4+Jc0aMRSaTITExEXFxcZptPB4P0dHRSEhI0HnOmjVrsHr16hbTPpVWgr2X8wyW1/bgcYCbnRgBzjYIdrdFHx97RAY5I9jNllbEIqQTeX50D+w6n43aetWcz3OjqAtXV0TBpoULcrXBPy/eh4QbxQAHTKZA06IVFRVBoVDAw0O7m4SHhwdSUlJ0nhMXF4fY2FjN3xUVFfDz82t03LSBvpqlUPV1ZwDIAVD/yTXs4zVs5HMc+DyAz+NBwOMgEvAgFvAgEfJhJeLDXiKAo7UIjlZCCPjU5ZyQzs7P2RrbnhyKq3lVCHCxxrCGaflI10LBZhfg52wNP2ea8oXoJhaL/7+9Ow9vqkz/Bv49SZqka9J931haQKAspQUFBalTGAcEBwREpyLKiIALLq/4UxZHBWREBmEGdUarzqi44YagUlGGoZSylK20bC2ULunepEuSJud5/0gTCd3SNmm2+3OZS3pyzsmTk949d54VEkn3y8bRVFmEkN4YGxuAsbEB9i4GsSOqGiDEhQQFBUEoFEKhUJhtVygUCAujSfwJIYT0P5eo2TROWt7ZwAZCesL4e8Q6G4XiwMRiMcaOHYusrCzMmjULAMDzPLKysrB8+XKLzkHxRKzFmWPJGiiWiLU4eyy5RLKpUqkAoMN+ZoT0lkqlgkzmfKMmV65ciYyMDCQnJyMlJQVbtmxBU1OTaXR6dyieiLU5ayz1FcUSsTZnjSWOOWuafB2e51FWVgZfX992I1GNgx1KSkrg5+dnpxK6Nle7xowxqFQqREREQCBwzp4m27Ztw6ZNm1BRUYFRo0Zh69atSE1NtejYzuLJ1T5nR+VK19kVYqkv6N5kX650jZ09llwi2eyKUqmETCZDQ0OD0/+yOSq6xu6BPuf+QdfZPdDnbHt0jR2H86XHhBBCCCHEaVCySQghhBBCbMblk02JRII1a9ZYNI8g6R26xu6BPuf+QdfZPdDnbHt0jR2Hy/fZJIQQQggh9uPyNZuEEEIIIcR+KNkkhBBCCCE2Q8kmIYQQQgixGUo2CSGEEEKIzbh8srl9+3bExcVBKpUiNTUVR44csXeRnMaBAwcwY8YMREREgOM4fPXVV2bPM8awevVqhIeHw9PTE2lpabhw4YLZPrW1tVi4cCH8/Pwgl8uxePFiNDY29uO7INZCsdR7FEvkehRLvUex5JxcOtncuXMnVq5ciTVr1uD48eNISkpCeno6Kisr7V00p9DU1ISkpCRs3769w+dfe+01bN26FTt27EBOTg68vb2Rnp4OtVpt2mfhwoU4e/YsfvrpJ3z33Xc4cOAAlixZ0l9vgVgJxVLfUCwRI4qlvqFYclLMhaWkpLBly5aZftbr9SwiIoKtX7/ejqVyTgDYrl27TD/zPM/CwsLYpk2bTNvq6+uZRCJhH3/8MWOMsfz8fAaA5ebmmvbZs2cP4ziOlZaW9lvZSd9RLFkPxZJ7o1iyHool5+GyNZtarRbHjh1DWlqaaZtAIEBaWhqys7PtWDLXUFRUhIqKCrPrK5PJkJqaarq+2dnZkMvlSE5ONu2TlpYGgUCAnJycfi8z6R2KJduiWHIfFEu2RbHkuFw22ayuroZer0doaKjZ9tDQUFRUVNipVK7DeA27ur4VFRUICQkxe14kEiEgIIA+AydCsWRbFEvug2LJtiiWHJfLJpuEEEIIIcT+XDbZDAoKglAohEKhMNuuUCgQFhZmp1K5DuM17Or6hoWFtev0rtPpUFtbS5+BE6FYsi2KJfdBsWRbFEuOy2WTTbFYjLFjxyIrK8u0jed5ZGVlYcKECXYsmWuIj49HWFiY2fVVKpXIyckxXd8JEyagvr4ex44dM+3z888/g+d5pKam9nuZSe9QLNkWxZL7oFiyLYolB2bvEUq29MknnzCJRMIyMzNZfn4+W7JkCZPL5ayiosLeRXMKKpWKnThxgp04cYIBYJs3b2YnTpxgV65cYYwxtmHDBiaXy9nXX3/NTp06xe666y4WHx/PWlpaTOeYNm0aGz16NMvJyWEHDx5kgwcPZgsWLLDXWyK9RLHUNxRLxIhiqW8olpyTSyebjDH25ptvspiYGCYWi1lKSgo7fPiwvYvkNPbv388AtHtkZGQwxgzTTLz44ossNDSUSSQSNnXqVFZYWGh2jpqaGrZgwQLm4+PD/Pz82KJFi5hKpbLDuyF9RbHUexRL5HoUS71HseScOMYY6+/aVEIIIYQQ4h5cts8mIYQQQgixP0o2CSGEEEKIzVCySQghhBBCbIaSTUIIIYQQYjOUbBJCCCGEEJuhZJMQQgghhNgMJZuEEEIIIcRmKNkkhBBCCCE2Q8kmIYQQQgixGUo2CSGEEEKIzVCySQghhBBCbIaSTUIIIYQQYjOUbBJCCCGEEJuhZJMQQgghhNgMJZuEEEIIIcRmKNkkhBBCCCE2Q8kmIYQQQgixGUo2CSGEEEKIzVCySQghhBBCbIaSTUIIIYQQYjM2TzYPHTqEtWvXor6+3q7n6Mzp06cxZ84cxMbGQiqVIjIyEnfccQfefPNNq7+Wq7Hl50K65shxlZmZCY7jcPToUaue19VQ/NiPM8SP8SESiRAZGYkHHngApaWlVn0tV0Wx5Xj6Jdlct25dn4O6r+fo7LzJyck4efIkHn74YWzbtg0PPfQQBAIB/va3v1n1tVyRrT4X0j1HjitiGbr+9uMM8fPSSy/hww8/xI4dOzB9+nT8+9//xm233Qa1Wm2T13MlFFuOR2TvAtjTK6+8AplMhtzcXMjlcrPnKisr7VOoGzQ1NcHb29vexehX7vieie242++Tu71fVzV9+nQkJycDAB566CEEBQVh48aN+Oabb3DPPffYuXTu+Xvmju/ZalgfKZVK9vjjj7PY2FgmFotZcHAwS0tLY8eOHWNr1qxhANo9ioqKGGOMFRcXs6VLl7KEhAQmlUpZQEAAmzNnjul5xli357h27RpbtGgRCwkJYWKxmA0bNoz961//sqjsiYmJbPLkyb1+78aynTt3js2dO5f5+vqygIAA9thjj7GWlhbTfpa8z+vPd/bsWbZgwQIml8vZqFGjenSO689TWFjIFi5cyPz8/FhQUBB74YUXGM/z7OrVq2zmzJnM19eXhYaGsr/+9a/tztHddbXW59LVe+5KZmYmGzFiBJNKpWzMmDHs0KFDbO7cuWzkyJGmffLz89mf//xnlpCQwDw9PVloaCi79957WVlZWbvzpaWlsfHjx7NDhw6x2267jXl5ebGBAwey3bt3M8YY2717N0tNTWVeXl4sKSmJHT161KrH31jW4OBglpiYyKKiopwurt577z0GgOXm5na5n6XxY+l7uv6cfYkhR4gfS87R3fvtiiXxw5jlMUTxY/v4+e677xgA9uqrr3Z7Dke8N1kjrhije5O9Y6ursnalzzWbjzzyCD7//HMsX74cw4YNQ01NDQ4ePIhz587h7rvvxvnz5/Hxxx/jjTfeQFBQEAAgODgYAJCbm4tDhw5h/vz5iIqKQnFxMf7xj39g8uTJyM/Ph5eXV5fnUCgUGD9+PDiOw/LlyxEcHIw9e/Zg8eLFUCqVeOKJJ7ose2xsLLKzs3HmzBkMHz6819fgnnvuQVxcHNavX4/Dhw9j69atqKurwwcffGDx+7ze3LlzMXjwYLz66qtgjPXqHAAwb948DB06FBs2bMDu3bvx8ssvIyAgAG+99RZuv/12bNy4Ef/5z3/w9NNPY9y4cbj11lsBwKLrau3PpaP33Jn169fj+eefx+zZs7FixQrk5eVh5syZkMlkGD9+vGm/d999F0VFRbj//vsRFhaGU6dO4a233oJCocC+ffvMznnq1CkEBgZi3rx5WLx4MWbPno1XX30V9957LzZu3IhNmzbh4Ycfxl133YVXX30VDz74IE6ePGm1428s66ZNm1BYWIiYmBj8/e9/d6q46qnu4sfS93Q9a8SQveLH0nN09347Y2n8AJbHEMWP7eOnuLgYAODv72/xMY54b+ptXAF0b3KE2OqqrF3qUWraAZlMxpYtW9bp85s2bWr3jd2oubm53bbs7GwGgH3wwQfdnmPx4sUsPDycVVdXm22fP38+k8lkHZ7/ej/++CMTCoVMKBSyCRMmsGeffZb98MMPTKvVdnmckfGbz8yZM822P/roowwAO3nyZI/ep/F8CxYsaLe/pee4/jxLliwxbdPpdCwqKopxHMc2bNhg2l5XV8c8PT1ZRkaGaZul19Uan0tX77kjx44dY0KhkK1atardawJg69evN21rampqd/wLL7zABAKB2bd7hULBALDQ0FCzb2tbt25lANiQIUNYQ0ODafvKlSsZx3FMrVZb5fiOyiqTyVhycnK7sho5clz1tGazu/jpyXuyRgzZO356cg5bxg9jlsUQxY/5OawVP/v27WNVVVWspKSEff755yw4OJhJJBJWUlLS5fGMOea9qa9xxRjdm4zsGVudlbU7fR4gJJfLkZOTg7Kysh4f6+npafp3a2srampqMGjQIMjlchw/frzLYxlj+OKLLzBjxgwwxlBdXW16pKeno6Ghodtz3HHHHcjOzsbMmTNx8uRJvPbaa0hPT0dkZCS++eYbi9/HsmXLzH5esWIFAOD777/v1ft85JFH2m3rzbV66KGHTP8WCoVITk4GYwyLFy82bZfL5UhMTMTly5cB9P269vb4jt5zR1599VWEh4dj3bp1ZtsnTZoEABgxYoRp2/XfqOvr61FdXQ1/f3/wPA+dTmd67tSpUwCAtWvXIjw83LTdx8cHALBp0yb4+fmZtstkMggEAggEAqsc31FZ/fz8oFAo2pXVEvaOq57qLn4A+8SQPeKnt+ewRfwAlsUQxc9vrBk/aWlpCA4ORnR0NObMmQNvb2988803iIqKsvi9OOK9qTdxBdC9yVFiq7OydqfPzeivvfYaMjIyEB0djbFjx+L3v/89/vSnP2HAgAHdHtvS0oL169fjvffeQ2lpqVkVdUNDQ5fHVlVVob6+Hm+//TbefvvtDvexZJDPuHHj8OWXX0Kr1eLkyZPYtWsX3njjDcyZMwd5eXkYNmxYt+cYPHiw2c8DBw6EQCAwNXv09H3Gx8e329abaxUTE2P2s0wmg1QqNTUrXL+9pqYGQN+va2+P7+g930ij0WDPnj1YunQpPDw8zJ5rbGwE8FtA6/V6vP/++9i2bRsKCgrQ0tJi2jcoKMgUbIBh+isAmDlzptk5CwsL4enpiTvuuMNs+/nz5zFw4EBTGfp6fFdlBYDbb7/d6eKqJ7qLH8A+MWSP+OntOawdP4DlMUTx8xtrxs/27duRkJCAhoYGvPvuuzhw4AAkEolFxxo54r2pN3EF0L3peo4QWzeWtTt9TjbvueceTJo0Cbt27cKPP/6ITZs2YePGjfjyyy8xffr0Lo9dsWIF3nvvPTzxxBOYMGECZDIZOI7D/PnzwfN8l8can7/vvvuQkZHR4T4jR460+H2IxWKMGzcO48aNQ0JCAhYtWoTPPvsMa9assfgcRhzHmf3c0/d5/TfF3p4DMHxrtGQbANMfiL5e194e39F7vtGlS5fQ3NyMpKSkds9dvnwZfn5+pj9kf/rTn/Dpp58iIyMDTzzxBIKCgiAWi/HYY4+ZfcMDDN/+wsPDERERYbb95MmTGD58eLs/8CdPnjR7D309vrOyLl26FAKBABEREU4bV71xY/wA9okhe8RPb89h7fgBLI8hip/fWDN+UlJSTKPRZ82ahYkTJ+Lee+9FYWFhj27y13OEe1Nv4gqge9P17B1bHZW1O1aZ+ig8PByPPvooHn30UVRWVmLMmDF45ZVXMH369A5vHEaff/45MjIy8Prrr5u2qdXqdnNjdXSO4OBg+Pr6Qq/XIy0tzRpvw8QY4OXl5Rbtf+HCBbNvPxcvXgTP84iLiwNg+fvsijXOYYmeXNf+/lyM36qur+IHDN8qP/74Y9Mgr/z8fHz00Ud44403zDp8l5eX4/z585g2bZrZ8adOnerwj8TJkydx5513mm1rbW1FYWGh2dQjfTm+q7IWFRXhsccew+bNm10irjrTXfwAzhNDfY2fnp6jJyyNH6BnMUTx8xtbfXZCoRDr16/HlClTsG3bNjz33HMWHUf3pt4d31Pudm/qqKzd6VOfTb1e366aPCQkBBEREdBoNABgmpOqo188oVDYbnTXm2++Cb1eb7ato3MIhUL88Y9/xBdffIEzZ860O3dVVVW35d+/f3+Ho8uM/VkSExO7PQdgaO64nnH1IeM3aEvfZ1escQ5LX8fS62qrz6UzsbGxAICDBw+abd+wYQPKy8tNAX3t2jUAwKBBg0z7tLa24qGHHoJerzf75qbX65Gfn98uIKurq1FeXt5u+7lz59Da2mo6R1+P76isarUaGRkZZmV1prjqqe7ix1guZ4ihvsZPT8/RE5bGD2B5DFH89F/8TJ48GSkpKdiyZYvFE7vTvam+V8f3lLvcmzorqyX6VLOpUqkQFRWFOXPmICkpCT4+Pti3bx9yc3NN33LGjh0LAPi///s/zJ8/Hx4eHpgxYwa8vb3xhz/8AR9++CFkMhmGDRuG7Oxs7Nu3D4GBgWav09k5NmzYgP379yM1NRUPP/wwhg0bhtraWhw/fhz79u1DbW1tl+VfsWIFmpubMXv2bAwZMgRarRaHDh3Czp07ERcXh0WLFll0HYqKijBz5kxMmzYN2dnZ+Pe//417773X9GFa+j67Yo1zWMrS62qrz6UzQUFBmDZtGt5++22IRCKMHDkS+/btw7FjxwD81idm1KhR8PLywuOPP46ioiK0tLTgww8/NDXVXB9kFy5cgFqtbhd4xqkfbtxu7HBtDLS+Ht9RWTMzM1FYWAjA0OfmnXfecaq46qnu4gdwrhjqa/x4e3vb5DOwNH4Ay2OI4qd/4+eZZ57B3LlzkZmZadHAFbo30b3JmrHVWVktYvG49Q5oNBr2zDPPsKSkJObr68u8vb1ZUlIS+/vf/26231/+8hcWGRnJBAKB2XQEdXV1bNGiRSwoKIj5+Piw9PR0VlBQwGJjY9tNedDZORQKBVu2bBmLjo5mHh4eLCwsjE2dOpW9/fbb3ZZ/z5497MEHH2RDhgxhPj4+TCwWs0GDBrEVK1YwhULR7fHGqRHy8/PZnDlzmK+vL/P392fLly83mxLA0vdpPF9VVVW71+rJtersPBkZGczb27vduW+77TZ20003mW2z9Lr29XPp6j13RKFQsFmzZjE/Pz8WHh7OHn/8cbZr1y4GgB0+fNi033fffceGDBnCpFIpGzlyJHvvvffY2rVrmUgkMpvW4dNPP2UA2JkzZ8xeZ/PmzQwAq6+vN9v+7LPPMj8/P8bzvFWO76is77zzDrv55psZAKeMq55OfdRd/PTkPVkjhhwhfiw9h63ihzHLYojip3/jR6/Xs4EDB7KBAwcynU7X6Tkc8d5kjbhijO5N9oytzspqCY6xbmYpJZ1au3Yt1q1bh6qqqnYj6Uj/Wb58OXbu3Iny8nKIRG69AqtTofhxDBQ/rodiyzFQbP2mz/NsEtJfNBpNu75BBw4cwFtvvYVHHnnE7YOZkK5Q/BBiGxRb3aMrQJzGDz/8gJdeeglz5swxTRj83nvvYfTo0Xj++eftXTxCHBrFDyG2QbHVPUo2idMICAiAWCzGhg0b0NzcjLi4OPy///f/sGrVKovmQiPEnVH8EGIbFFvdoz6bhBBCCCHEZqjPJiFO5MCBA5gxYwYiIiLAcRy++uors+cZY1i9ejXCw8Ph6emJtLQ0XLhwwT6FJYQQQkDJJiFOpampCUlJSe0mazZ67bXXsHXrVuzYsQM5OTnw9vZGenq6xZNAE0IIIdbmEs3oPM+jrKwMvr6+XS5DRoglGGNQqVSIiIhot/yYI+E4Drt27cKsWbMAGModERGBp556Ck8//TQAoKGhAaGhocjMzMT8+fM7PI9GozGtrAIY4qm2thaBgYEUT6RPnCWWbIXuTcRanD6WejQrp4MqKSlhAOhBD6s+SkpK7P2r3SUAbNeuXaafL126xACwEydOmO136623sscee6zT8xgnL6YHPWz1cPRY6sq2bdtYbGwsk0gkLCUlheXk5Fh8LN2b6GHth7PGkkuMRvf19QUAlJSUwM/Pz86lIc5OqVQiOjra9HvlLCoqKgAAoaGhZttDQ0NNz3Vk1apVWLlypennhoYGxMTEUDyRPnPWWDLauXMnVq5ciR07diA1NRVbtmxBeno6CgsLERIS0u3xdG8i1uLsseQSyaaxecLPz8/tA7q+WQuZpwc12ViBu1xDiUQCiUTSbjvFU8cYY6hSaRDsK3Gb35G+ctbrtHnzZjz88MNYtGgRAGDHjh3YvXs33n33XTz33HPdHt/Zvam2SYuaRk1nh1nM/LJy4DhAwHHgAAgFhp+FAg4igQBioQAeIg4SkRBCgXN+HsR5Y8klkk1i8P6hYqz99iwmDgrC1vmj4e8ttneRSD8KCwsDACgUCoSHh5u2KxQKjBo1yk6lci1nShuw9puzOHqlDmlDQ/DGvFHwlXrYu1jEBrRaLY4dO4ZVq1aZtgkEAqSlpSE7O7vDY27s/6xUKjvcb2duCTbuLbBugXtALBTARyqCr1QEfy8xQnwliPT3RHyQNxJDfTEySg5PsdBu5SOuh5JNF3HoUjVe+i4fjAH/vVCNe/+Zg90rJkJA32DdRnx8PMLCwpCVlWVKLpVKJXJycrB06VL7Fs4FNGt1WJSZiyqVIZnYd64S9/0zB18+egvVFLmg6upq6PX6DrulFBR0nCiuX78e69at6/bcUg8BAnpZGcBuGNPLADD223bGDNv0PAPPGPQ8g443P0ar51HbpEVtkxZXaprbvYZIwGFsrD+mDw/D7NFRkHnRFyrSN5RsugDGGFZ/fRZ6niFtaCiyL1XjXLkSJ6/VY3SMv72LR6yosbERFy9eNP1cVFSEvLw8BAQEICYmBk888QRefvllDB48GPHx8XjxxRcRERFhGrFOeu/9Q1dQpdIgOsATL80cjsc/OYGT1xrw1YlS/HFslL2LRxzAjf2fjf3sbrTolngsuiW+38rFmCHhbNXzULfyaGnVo0mjQ0NLK2oatahSqVFS14JLlY04U9YAhVKDnKJa5BTVYsPeAtw/PhbLpgyC3Itay0jvULLpAs6WKXGxshESkQBvzEvC87vO4NuTZdh7toKSTRdz9OhRTJkyxfSz8caWkZGBzMxMPPvss2hqasKSJUtQX1+PiRMnYu/evZBKpfYqskto1Oiw49dLAIAnpiZgypAQLJ08CBv3FuCNfefxh6RwSETU7OhKgoKCIBQKoVAozLYrFApTl5Ubddb/2d44joOHkIOHUIDu8kXGGEpqW/DTOQU+O1qCggoV3vlvEXadKMOmOSMxZUj3A6MIuZETTtZEbrTrRCkA4I5hofCVemDaTYY/hD+cqWjX5EKc2+TJk8EYa/fIzMwEYLipvPTSS6ioqIBarca+ffuQkJBg30K7gP0FlWhoaUVsoBdmjY4EADxwcxxCfCW4VteC3afK7VxCYm1isRhjx45FVlaWaRvP88jKysKECRPsWDLb4jgOMYFeWDwxHnsen4T3Fo3D4BAfVDdqsCgzF/86WGTvIhInRMmmk9PzDN+cLAMAzBpluAlOTgyGWCRAcU0zChUqexaPEJeQdc5QuzVteJipf6anWIiFqbEAgC+OX7Nb2YjtrFy5Eu+88w7ef/99nDt3DkuXLkVTU5NpdLqr4zgOUxJD8O2KibhvfAwA4C/f5Ztq+QmxFCWbTi6vpA5VKg1knh64NSEYAOAtEWHCgEAAwJGiWnsWjxCnp9Pz2F9YBQBIG2o+WOTuMYYveIcu1aCsvqXfy0Zsa968efjrX/+K1atXY9SoUcjLy8PevXvbDRpydVIPIf5y13A8k54IANiwpwB7TlNtPrEcJZtO7uCFGgDAxEFBEIt++ziHRxrmdDtX3vHUG4QQyxy9UoeGllb4e3lgzA19oKMDvDB+QAAY+607C3Ety5cvx5UrV6DRaJCTk4PU1FR7F8kuOI7DsimD8MDNcQCAZz4/hVL6gkUsRMmmk/vfxWoAwMTBQWbbh4Ybks38cmpGJ6Qvfmmr1ZySGNLhFEd3jzGMRKd+m8QdvPiHYUiO9UejRofnvjhF4wKIRSjZdGJNGh2OX60DYKjZvJ4x2SysUELP0x8DQnrr+BVDjI0fGNjh83cMDYWAA/LLlSipbT9nISGuRCjg8NqckZCIBPjvhWp8f7rzpXAJMaJk04nlFNVAxzPEBHghOsDL7Lm4QG9IPQRQt/Ioqm6yUwkJcW6teh6nSusBoF0TupG/txgp8QEAgB/zFR3uQ4grGRDsg0duGwgA2PxTIXR63s4lIo6Okk0nduiiob/mLYPa17gIBRyGhFG/TUL64ly5EupWHjJPDwwI8u50v3TjdGNnqZaHuIeHJsVD7uWBS1VN1F+ZdIuSTSeWW2wYaZ4a33HznrEpnZJNQnrnxNV6AMCoaHmXS7/eMcwwOvlocS3qmrT9UTRC7MpX6mGq3fzXwSLqu0m6RMmmk2rS6HCmzJBEjmtrwrvR0HBfAEBhBQ0SIqQ3jH2iO2tCN4ry98KQMF/wDDhwoao/ikaI3S0YFwOphwAFFSrkFtfZuzjEgVGy6aROXK2HnmeIlHsiUu7Z4T7xbc1+V2jQAiG9kldSDwAYHSPvdl/jMn77CyptWCJCHIfMywOz21bU+iC72L6FIQ6Nkk0ndaTI0F9zXFznNS6xAYZk82ptM3gakU5IjyjVrbhSY/iiNjJK1u3+UxINyeav56toBgjiNu4fHwfA0F+5obnVvoUhDouSTSd1pK2/ZmdN6AAQIZdCJOCg1fGoUKr7q2iEuISCtjlqI2RSyL3E3e4/JkYOmacH6ppbkVdCTYrEPQyL8ENiqC9a9YwGyJFOUbLphLQ63jRwISWu82RTJBQg0t/QxG6soSGEWMY4sM440K47IqHAtGTs/gLqt0ncx4ykcADAt6fK7FwS4qgcItk8cOAAZsyYgYiICHAch6+++sreRXJop0sboNHx8PfywKAQny73jWmbf/NqLc21SUhP5LcNwBsWYVmyCQBTEg3J5i/nqd8mcR9/GBkBADh0qQY1jRo7l4Y4IodINpuampCUlITt27fbuyhOwTjlUXJcADiu8+lYACA20JBsUs0mIT1zrqIt2bSwZhOAqWbzTKkSldR1hbiJuCBv3BThBz3PkEUD5EgHHCLZnD59Ol5++WXMnj3b3kVxCrlFhmSzqyZ0I+MgIRqRTojldHoeBW1ThlnajA4AQT4SJLUNJvrlPDWlE/cxtW02hgP0e0864BDJZk9pNBoolUqzh7vgeYajbWs1dzU4yCimrWbzKtVsEmKxy9VN0Op4eIuFpq4olpqcSFMgEfdzW1sXkv9eqKblK0k7Tplsrl+/HjKZzPSIjo62d5H6zflKFRpaWuHpIcRNFvQliwtsq9msoT6bhFjKuBBCQphvlysHdeT2thqe/16ohlZHN13iHpKi5PCTitDQ0oqT1xrsXRziYJwy2Vy1ahUaGhpMj5KSEnsXqd9kXzLMr5kc5w8PYfcfn7FWRqnW0RxohFjovMKQbA4J8+3xsSMiZQjykaBRozP1rybE1YmEAkwabKjd/LWQavWJOadMNiUSCfz8/Mwe7sKYbE4Y2PF66DfyFAsR4G2YI7CsocVm5SLElRhrNgeH9DzZFAg43D7EcNPdd05h1XIR4sgmDQ4CAGRfrrFzSYijccpk013peYactsFBEwZYlmwChsndAaC0jpJNQixxobIRAJDYi5pNALh9SCgAIOtcJRij1YSIe0hpG0dwsqQB6la9nUtDHIlDJJuNjY3Iy8tDXl4eAKCoqAh5eXm4evWqfQvmYM6VK9HQ0gofiQgjIrtfPs/IuHY61WwS0j11qx7FbX2cB4d2PY9tZyYNDoJYJMDV2macVzRas3iEOKz4IG8E+Uig1fM4WVJv7+IQByKydwEA4OjRo5gyZYrp55UrVwIAMjIykJmZaadSOR5jE3pKfABEFvTXNIpoSzZL6ynZJKQ7FysbwRjg7+WBYB9Jr87hLRFh4qAg/FxQiR/OVvS6hpQQZ8JxHFLi/fH96QrkFtcitQctcM6gUaODQqlGTaMWtU1aNLRooVLr0KjRoVmrR4tWj5ZWPTQ6HlqdHq16hlY9D52eQc8z6HgeemaYVYZnDDwDGDP8mzEY/g/g/34/FFOHhtr77VqVQySbkydPpqYmCxy4YJi/7GYL+2samWo262mSaUK6YxwclBDq2+2iCV2ZdlOYKdl8bOpgaxWPEIc2Li4A35+uwJHiOnsXpdcqVWrkXa1HfrkSFyobUVTVhJK6ZqjUun55/f56nf7kEMkm6V6TRoecy4b+mlPaplaxVIQp2aSaTUK6U3hdstkXU4eGQMABZ8uUKKltRnQP5+skxBmNa1ts5PiVOuh5BmEPpw6zB52ex+HLtfgpvwL/vVCNy9WdTxXoIxEhyEcMf28x/L3E8JWK4C0RwVsshKdYBKmHABKREGKRABKhACIhB6GAg0jQ9m+Og0AACDjDdg4cBBwAzrANAAYG9677jiOjZNNJHLpUA62eR3SAJwYEeffoWEo2CbHchbY+lgm97K9pFOgjQUp8AA5frsWeM+VYcutAaxSPEIc2NNwPXmIhGjU6XKpq7POXNltSKNX4ILsYnx69hirVb2u6cxyQEOKLEVEyJIb6YkCwN2ICvBAh94S3hNKm3qCr5iR+aZu3bEpiSI+b9oyj0RVKNVr1vEXzcxLirozN6IOtcJO8c2QEDl+uxTcnyyjZJG5BKOAwPEKGI8W1OFlS75DJZm2TFluzLuCjnKvQtq125O/lgfSbwnD7kBCMHxgIP6mHnUvpWijZdAKMMdPSd1MSe9aEDgBB3hKIhQJo9TwqGtTUnEdIJ5o0OlxrmyLMGjfJ3w8Pw9pvzuJMqRKXqxoxwAWbxwi5UVJ0W7J5rR5zkx1nhT/GGL44XoqXd+ejvm2Rk3Fx/njwlnhMHRoKsYgqYmyFrqwTOFFSj7IGNbzFQosnc7+eQMCZajepKZ2Qzl1sm18zyEdsWgyhLwJ9JKaJrr85Wdbn8xHiDEZGyQEApxxo2comjQ4rPj6Bpz87ifrmVgwJ88V/HkrFZ4/cjOkjwinRtDG6uk5g96lyAEDasFBIPYS9OgdNf0RI94yDg3qzclBnZiZFAAB2nSilWTeIW0hqSzbPlSuh0dl/cveKBjXm7sjGd6fKIRJweCY9Ed+tmIhbBgXZu2hug5JNB8fzDN+fNiSbd44I7/V5wmWGZLO8gaY/IqQzF0wj0a3X3D1teBh8JCJcqWk2rQBGiCuLDvCEv5cHWvUM58pVdi1LWX0L5r2djfxyJYJ8xNj55wlYNmVQj+aqJn1HV9vB5RbXorxBDR+JCLcmBPf6PNSMTkj3jKv9WGNwkJGXWIQZSYYvijtzS6x2XkIcFcdxGNFWu3n6Wr3dylHbpMXCf+bgSk0zYgK8sOvRWzA21t9u5XFnlGw6uI+PGJbs/P2IsF43oQNUs0mIJS5YaY7NG80bFwMA+P50ORraBiYQ4spuivADAOTbqWZTo9Pjzx8eRVF1EyLlnvh4yXgaHGtHlGw6sNomLb4/UwEAWJga26dzhVPNpltYu3YtOI4zewwZMsTexXIKSnUrytq+jFmzGR0AkqJkGBruB42Ox8e5V616bkIc0W/JptIur7/++wLkFtfBVypC5qJxppX0iH1QsunAPj9WAq2Ox/BIP4yMkvXpXBFUs+k2brrpJpSXl5seBw8etHeRnML5CkMNTJifFHKvvo9Evx7HcXjwljgAwPuHitHaNrcfIa5qWLgh2SwoV0LXz7/vP56tQOahYgDA3+aPsmq3GNI7lGw6KHWrHv/8bxEA4P7xsX1aoxn4rc9mQ0srmjSut+4q+Y1IJEJYWJjpERTU9YhLjUYDpVJp9nBHBW3JZmKYbW5MM5IiEOQjRnmDGnvaWiwIcVWxgd7wEguh0fEorul8+Udrq2/W4vldpwEAD0+Kx+1DQvvttUnnKNl0UJ8cuYpKlQaRck/MHh3V5/P5Sj3g27bMVnkDNaW7sgsXLiAiIgIDBgzAwoULcfVq182269evh0wmMz2iox1nEub+ZFw5aIiNkk2phxD3j48DAGz7+QJ4nqZBIq5LKOBMsXS2rP++wL76/TlUN2oxMNgbT6cn9tvrkq5RsumAVOpW/P2XSwCApZMHWm2y2d/6bVJTuqtKTU1FZmYm9u7di3/84x8oKirCpEmToFJ13kl/1apVaGhoMD1KStxzxLStazYB4IFb4uArFeG8opFqN4nLuynC0P2rv/pt5pXU49Oj1wAAG/84EhJR7wfVEuuiZNMBvf7jeVSqNIgL9MLc5L7Xahr9NiKdajZd1fTp0zF37lyMHDkS6enp+P7771FfX49PP/2002MkEgn8/PzMHu6GMYbCfkg2ZZ4eWDwxHgDw+k+F1HeTuLRhxkFC/VCzyRjDK7vzAQB/HBOF5LgAm78msRwlmw4mt7gWH2QXAwBenjXCqt/MIqhm0+3I5XIkJCTg4sWL9i6KQ1MoNWhoaYVQwGFQiG3XL39wYjwCvMW4XNWED7Ov2PS1SO/FxcW1m9lhw4YN9i6WUzE2oxu/yNnSvnOVyC2ug9RDgKfTE2z+eqRnKNl0IJVKNR79z3HwDLh7dCQmDrbuUlpUs+l+GhsbcenSJYSH9371KXdQUGGoeYkP8rZ505uf1ANP/87Ql2zLvvOoUmls+nqk91566SWzmR1WrFhh7yI5FeN8tZUqDWqbtDZ7HcYY/pZ1HgDwwM3xpnsdcRyUbDqI2iYtMt7LRZVKg4RQH/xl1nCrv0a4jGo2Xd3TTz+NX3/9FcXFxTh06BBmz54NoVCIBQsW2LtoDs04gGFoeP90IZg3Lho3RfhBqdbhxa/O0JrpDsrX19dsZgdvb297F8mpeEtEiGmbSN34hc4WfimswplSJbzEQiy5dYDNXof0HiWbDuByVSPmvZWNc+VKBPlI8Nb9yfBuGzluTcZJbWlid9d17do1LFiwAImJibjnnnsQGBiIw4cPIzi490udugNjnzLjRNS2JhRweG3OSIgEHPaercBXeaX98rqkZzZs2IDAwECMHj0amzZtgk7X9bRxNI1Ye4n90JT+918M3YTuGx+LAG/rzpFLrMP6GQ2xmE7P48PDV/D6j+fRqNEhxFeCjx4ej/gg23x7jvQ3JJul9S1gjPV57k7ieD755BN7F8EpnS1rANB/yabhtWR4bOpgbP7pPJ7/8gyGhctsOjiJ9Mxjjz2GMWPGICAgAIcOHcKqVatQXl6OzZs3d3rM+vXrsW7dun4speMbEuaLn/IVNks2T19rQG5xHUQCzjT4jjgeh6rZ3L59O+Li4iCVSpGamoojR47Yu0g2UdGgxjsHLmPyX3/Bum/z0ajRISUuAN+tmGjTwQnhMk9wHKDR8aixYf8ZQpyJSt2K4ppmAL9N1dJflk0ZhEmDg9DSqsdDH+SiUkVdXGzpueeeazfo58ZHQUEBAGDlypWYPHkyRo4ciUceeQSvv/463nzzTWg0nfexpWnE2hsS1raSkI2Szff+Z1j85A8jwxHqJ7XJa5C+c5iazZ07d2LlypXYsWMHUlNTsWXLFqSnp6OwsBAhISH2Ll6PMcbQrNWjUqVBWX0LLlc34Vy5Esev1JkFXYC3GE/9LgHzx8VAKLBtTaNYJECIrwQKpQaldS0I8pHY9PUIcQbnyg3xGC6T9nsTnFDA4W/zR2PW9v/ham0zMt7NxUcPpcKfmgJt4qmnnsIDDzzQ5T4DBnTc5y81NRU6nQ7FxcVITOx4snCJRAKJhP6uXu/6ZnSeZxBY8T5X06jBt6fKAACLbqFaTUfmMMnm5s2b8fDDD2PRokUAgB07dmD37t1499138dxzz5ntq9FozL5ddtUv5sWvzqCuuftaPNbJDwwMjAGMATxj4JkhkeQZg54ZmsJ1egaNnoemVY+WVj2aNDoo1TpodZ3PoZcc64+7x0Th7jGRkHr038SzkXJPQ7JZ34KkaHm/vW5fGBP3umYtGlpaoVLr0KTRoUmrh7pVD02rHhodD62eR6uOQcfzaNUz6HkeOp6B5w2f242fn9RDiJfusv5ALOJc7NGEfr0AbzE+XJyCP/7D0G/7nrey8cHiFBpRawPBwcG97r+cl5cHgUDglJUf9hQX6AWxSICWVj1K6poRG2i9bmJfHi9Fq54hKUrmNPczd+UQyaZWq8WxY8ewatUq0zaBQIC0tDRkZ2e3278n/WKyzilQ1mC/pilPDyHC5VLEBXpjcKgPkqLkSI0PQKCdahUj/b1w/Go9Susca5AQzzNcrm5CQYUSFysbcaWmGaV1LShXtqBKpYG61fqTX/tKRZRsEtNI9GH93IR+vdhAb3z8cCru/9cRXKhsxIw3D2LbvWMwfkCg3crkzrKzs5GTk4MpU6bA19cX2dnZePLJJ3HffffB39/f3sVzKiKhAINDfHC2TInCCpXVkk3GGD7JNSzFO29cjFXOSWzHIZLN6upq6PV6hIaGmm0PDQ019Z+53qpVq7By5UrTz0qlstP1nJ9IS0CTtv0Iws4q8q8fNGP8J9f2g4ADOBj+LxBwEAk4CAUcPIQCeAgFkHoIIPUQwlssgq9UhABvMbzEQocaiGOc2L3UziPSGWM4r2jEzwWVOHSpGieu1qNR0/VIT7FQAJmXB3ylIvhIRPASC+HpIYREJITEQwCxUAAPkQAeAg5CgQAeQs70OXEcByHHgeNg+Bw5DhIrLQNKnFteST0AICnKfskmAAwO9cVnj0zAwx8cRUGFCgveOYwHb4nHk3ckwMcGs1OQzkkkEnzyySdYu3YtNBoN4uPj8eSTT5rdd4jlEkN9Tcnm724Ks8o5j12pw6WqJnh6CDEjieYRdnRO+ResJ/1i7hnXcRLqrqLapj+6ZqeazepGDT47eg2fHyvBpaoms+c8PYRICPNFQogP4oK8ER3ghQiZFCG+UgT6OF7iTpxfQ0srLlY2AgBGOUAzXHSAF7589Gas+fosPjt2Df86WISv88qwbMpAzB8XA08xrfXcH8aMGYPDhw/buxguw9hvs0BhvUFCXxw3TBd258hw+Eo9rHZeYhsOkWwGBQVBKBRCoVCYbVcoFAgLs863IGJgnP6ov+farFSq8ebPF7HzaImpL6tYKMDNgwJxW0IwUuMDkRDqA5GQahtJ/zl1rR4AEBPgZbeuLTfyEouwaW4Sfj8iHOu+PYvimmas+zYfW/ZdwB/HROGuUREYGSWjL17EaSS0JZvnrTQiXaPTY3fbwKC7R0da5ZzEthwi2RSLxRg7diyysrIwa9YsAADP88jKysLy5cvtWzgXEyk3rObQX83oOj2Pfx4swtasC2jW6gEAI6NkWJgag+kjwuFH30iJHZ24Wg8AGB0jt2s5OjJlSAhuGRSET4+WYMevl3CtrgXv/q8I7/6vCKF+EtwyKAgpcQEYGSXHoBAfiKlbCHFQxjXSL1c3QaPT93lJ2F8Kq6BU6xDqJ0Eq9Wt2Cg6RbAKGOc0yMjKQnJyMlJQUbNmyBU1NTabR6cQ6jDWbhlHdrTZtfrha04zlHx/HqWuG0b6jY+R4Jj0REwYEUq0McQjG/pqO0ITeEbFIgPvGx2JBSgwOnK/CF8evIetcJRRKDb48Xoov25oSRQIOMYFeiAv0RqTcE2EyKYJ9JQj0FkPu5QE/qQd8pCJ4S0Tw9BDCg1oQSD8K85PCTyqCUq3DpcomDOvjzA9ft624ddeoSJtPGUisw2GSzXnz5qGqqgqrV69GRUUFRo0ahb1797YbNET6xkcigr+XB+qaW1FS24JhEbZJNg+cr8Kyj45DpdZB5umBF+4cijljoyjJJA6DMWZKNkfHOPYIY6GAw5QhIZgyJATqVj1yi2tx+HINjl2pw9lSJVQaHS5XNeHyDf2gOyMSGAbISTyE8BByELUNqBMJBRAJOAg4w+BHgYADB8OgOgFn2A7Df+DaBkxynOHff52bRNM1kQ5xHIfEMF/kFtehUKHsU7LZrNXh54JKAMDMpAhrFZHYmMMkmwCwfPlyajbvB7GB3qhrrseVmr5/w+zIrhPX8Mxnp6DjGcbG+uPNBaMRIaebEHEsFyobUdukhdRDgKHhzrNMpNRDiEmDgzFpsGG+SMYYyhvUKKpuMkwZVt+MigYNqhs1qG3Sor5FC5VaB5VaBz1vmERYxzPotHo0tXVtsQZbTE9GXMeQMD/kFtf1eSWhnwsqoW7lERvoZbe5cUnPOVSySfpHXKAX8krqTUv0WdOXx6/hqc9OgjFg1qgIbJwzss/9cwixhexLNQCA5NgAp/4d5TgOEXJPRMg9ccugzvdjjEGj46Fu1UPdavi/Vs9Dq+PRqjcsgNCq58HzgJ4ZFkPQ88y0GAJgXBThusUu2s4LAMG+jjHAijimIW1f6IwrdvXW96fLAQDTh4dTS5kToWTTDRkn1b1SY1mTm6X2F1Ti6bZEc2FqDP5y13CrLk1GiDUZk80JA91jgAHHcZB6CPt1xTJCjIaGt62RXt75in/dub4J/c4RNLemM6Fe4m4oLsgwIv2KFWs2CyqUWP7RcfAM+OOYKEo0iUPjeYbDRYZkk1bpIcT2EkN9wXFApUqDmkZN9wd04MD5KqhbeUQHeGJ4JDWhOxNKNt1QTIB1azZV6lY8+u/jaNLqcfPAQKy/ewQlmsShFVSoUN/cCi+xECPtvHIQIe7AWyJCbIChoqO3Tek/nDXMxZ0+LIya0J0MJZtuKC7QEPBlDWqoW/s+QODFr87gcnUTwmVSbLt3DM33Rxzer+erAACp8QE0DRAh/cTUlF7R86Z0rY5H1rm2ZHM4LfbibOivrBsK8BbDt22t5ZLavjWlf3+6HF/llUHAAdvuHYMAb7E1ikiITe1ru2lNHUpTqxHSX4zJZn4v+m0evlwDpVqHIB8xxjj4VGWkPUo23RDHcYht67fZlxHpdU1avPDVGQDA0skDMTaW/gAQx1fdqMHxq3UAgKlDQ+xcGkLchynZLOt5svljfgUA4I5hoTSRuxOiZNNNGUekF1U39vocG/cWoLZJi4RQHzw2dbC1ikaITf1cUAnGgBGRMpqEnJB+ZOwffaGyES09mOOV5xl+yje0RvzuJmpCd0aUbLqphBDDnGeFFb1LNo9frcMnuSUAgFdmj3DqeQqJe/nhjKGGJI2a0AnpV6F+UoT4SqDnWY+a0k+VNkCh1MBbLMTNbjJVmauhZNNNGSfY7U1HbcYYXvo2HwAwZ2wUxsUFWLVshNhKlUqDX9oGB905kmpICOlvxtrN09fqLT7mx7OGL4iTE0OoYsNJUbLppoaEGZLNC5WN0Ol7tszct6fKkVdSDy+xEM+mJ9qieITYxNd5pdDzDKOi5RgU4jxLVBLiKkZEygEYaist9aOpCZ1aI5wVJZtuKtrfC15iIbQ6HsU9mG9Tq+Px2t4CAMDS2wYixE9qqyISYlWMMXx+7BoAQ408IaT//VazaVmyebFShYuVjfAQcpgyhAb0OStKNt2UQMAhMczYlG75BLuf5F7FtboWBPtKsHhSvK2KR4jV5RTVoqBCBbFIgBkjI+xdHELc0vBIQ7J5saoRjRpdt/sbJ3K/ZVAQ/KQeNi0bsR1KNt2YsSm9wMLVHFq0emzNuggAeOz2QfASi2xWNkKs7R+/XAIA3JMcBZkX3bQIsYdgXwmi/D3BGHDsSl23++9tG9A3jUahOzVKNt3YkLCerebwQXYxqhs1iPL3xLxxMbYsGiFWdbasAb+er4KAA5ZMGmjv4hDi1sYPMIwoP3y5psv9Smqbcbq0AQIOSBtG/TWdGSWbbuymCEOymVdSD8ZYl/s2anTY8auhZujxqYNpSUriNBhj+Mt3htkT7hwZgZi25VoJIfaRGm+YwSSnm2Tzm5NlbfsHIshHYvNyEduhjMGNjYiSQeohQHWjFhcru55vM/N/RahrbsWAIG/MHh3ZTyUkpO92ny7H4cu1kIgENHsCIQ7AWLN56loDmrrot/lNniHZnDWa+lg7O0o23ZhEJERyrOEbZnYX3zAbmlvx1oHLAIDH0wZDJKRfG+IcyhtasPrrswAMS6pGB1CtJiH2Fh3ghUi5J3Q867TfZkGFEoUKFcRCAabdFN7PJSTWRlmDmxs/oC3ZvNR5svnOfy9DpdYhMdSXRvESp6Fu1WPFRydQ26TFTRF+eOQ26qtJiKOY0LYS0M8FlR0+/+XxUgDA5MRgGtDnAhwi2XzllVdw8803w8vLC3K53N7FcSvGgD98uQY8377fZkWDGv88aKjVfPKOBAgEXL+Wj5De0Oj0WPrvYzh6pQ6+EhG23zsGUg9aeYQQRzF9uGF0+e7T5dDfcO9p0eqxs2055LnJ0f1eNmJ9DpFsarVazJ07F0uXLrV3UdzOyCg5vMRC1DW34mgHzRmbfiiEupVHcqw/0mn1BuIEKhrUmP/2YewvrIJEJMBbfxqLuCBvexeLEHKdSYODIfP0QJVKg5wi85a1b06WoqGlFVH+nridJnJ3CQ6RbK5btw5PPvkkRowYYe+iuB0P4W8TXH94+IrZc0eKavHlCcOKKy/8YRg4jmo1ieNSt+rxr4NFuGPzrzhxtR5+UhHefWAcbh4YZO+iEUJuIBYJTLWbxoFAAKDT8/jXwSIAwJ8mxEJIrWkuwSGSzZ7SaDRQKpVmD9J790+IBQDsOV2OSqUagGGqo6c+ywNjhkmwR0XL7VhC0lPbt29HXFwcpFIpUlNTceTIEXsXySa0Oh6HL9dg3bdnccuGn/GX7/Kh0uiQFCXDN8sn4pZBlGgS4qjuGmWY2eTL46UoqjYsm/xB9hWcVzRC7uWBeck0n7OrcMolYNavX49169bZuxguY3ikDGNj/XHsSh1WfXkar949Ao9/cgIltS2IlHvixT8Ms3cRSQ/s3LkTK1euxI4dO5CamootW7YgPT0dhYWFCAlxrCYpxhgYA/SMQc8b/t3K82jV8dDqeahbeTRrdWjS6FHfrEVtkxYVSjWu1jbjUmUjzlWooNXxpvNF+Xti2ZRBuCc5mmpECHFw4wcE4LaEYPx6vgrPf3kaiyfGY/NP5wEAz6YPoYFBLoRj3c3m3UvPPfccNm7c2OU+586dw5AhQ0w/Z2Zm4oknnkB9fX2Xx2k0Gmg0GtPPSqUS0dHRaGhogJ+fX5/K7a5yi2tx3z9zoLnuxu0jEeH9B1MwNtbfjiXrf0qlEjKZzGl/n1JTUzFu3Dhs27YNAMDzPKKjo7FixQo899xz7fa3NJ6WfXQcP7WtU9wVBvM/Kdf/hWFoSzBv2N4XQT5iTBocjDtHhGNyYjBNzeVAnD2W+srd378liqub8LstB8y+NI6N9cenf55AXxiv4+y/Szar2XzqqafwwAMPdLnPgAEDenVuiUQCiYRWE7CmcXEBeOdPyVj+0XEo1TrEBXph271jMDxSZu+ikR7QarU4duwYVq1aZdomEAiQlpaG7OzsDo+xtKVAr2fQ6vlu97MWDyEHqUgIT7EQ3hIR/Dw9EOgtRqifBJFyTwwI9sGwcD/EBHjRLAmEOKm4IG+8ff9YvP7jeZwubcC85GisnjGMEk0XY7NkMzg4GMHBwbY6PbGBWxOCkftCGnR6Bm+JU/awcHvV1dXQ6/UIDTWfOSA0NBQFBQUdHrNq1SqsXLnS9LOxZvNG6+8egTUze9algoP5DYPjYNjStlnAcRBwHIRtT4gEHERCDh4CASWQhLiJyYkhmJwYgkaNDj5073FJDvGpXr16FbW1tbh69Sr0ej3y8vIAAIMGDYKPj499C+dmJCIhKNbdi6UtBf7e4n4oDSHEXVGi6boc4pNdvXo13n//fdPPo0ePBgDs378fkydP7vZ4Y7dTGpVOrMH4e2Sj7sw2FRQUBKFQCIXCvG+lQqFAWFiYReegeCLW4syxZA0US8RanD2WHCLZzMzMRGZmZq+PV6lUANBh0x8hvaVSqSCTOVefVbFYjLFjxyIrKwuzZs0CYBgglJWVheXLl1t0DoonYm3OGEvWQLFErM1ZY8lmo9H7E8/zKCsrg6+vb7uJx439z0pKSpxyBJczcLVrzBiDSqVCREQEBALnG9m8c+dOZGRk4K233kJKSgq2bNmCTz/9FAUFBe36cnaks3hytc/ZUbnSdXb2WOorujfZlytdY2ePJYeo2ewrgUCAqKioLvfx8/Nz+l82R+dK19gZvzkazZs3D1VVVVi9ejUqKiowatQo7N2716JEE+g+nlzpc3ZkrnKdnTmW+oruTY7BVa6xM8eSSySbhBBzy5cvt7jZnBBCCLEl56uLJYQQQgghTsPlk02JRII1a9bQJPA2RNfYPdDn3D/oOrsH+pxtj66x43CJAUKEEEIIIcQxuXzNJiGEEEIIsR9KNgkhhBBCiM1QskkIIYQQQmyGkk1CCCGEEGIzlGwSQgghhBCbcflkc/v27YiLi4NUKkVqaiqOHDli7yI5jQMHDmDGjBmIiIgAx3H46quvzJ5njGH16tUIDw+Hp6cn0tLScOHCBbN9amtrsXDhQvj5+UEul2Px4sVobGzsx3dBrIViqfcolsj1KJZ6j2LJObl0srlz506sXLkSa9aswfHjx5GUlIT09HRUVlbau2hOoampCUlJSdi+fXuHz7/22mvYunUrduzYgZycHHh7eyM9PR1qtdq0z8KFC3H27Fn89NNP+O6773DgwAEsWbKkv94CsRKKpb6hWCJGFEt9Q7HkpJgLS0lJYcuWLTP9rNfrWUREBFu/fr0dS+WcALBdu3aZfuZ5noWFhbFNmzaZttXX1zOJRMI+/vhjxhhj+fn5DADLzc017bNnzx7GcRwrLS3tt7KTvqNYsh6KJfdGsWQ9FEvOw2VrNrVaLY4dO4a0tDTTNoFAgLS0NGRnZ9uxZK6hqKgIFRUVZtdXJpMhNTXVdH2zs7Mhl8uRnJxs2ictLQ0CgQA5OTn9XmbSOxRLtkWx5D4olmyLYslxuWyyWV1dDb1ej9DQULPtoaGhqKiosFOpXIfxGnZ1fSsqKhASEmL2vEgkQkBAAH0GToRiybYoltwHxZJtUSw5LpdNNgkhhBBCiP25bLIZFBQEoVAIhUJhtl2hUCAsLMxOpXIdxmvY1fUNCwtr1+ldp9OhtraWPgMnQrFkWxRL7oNiybYolhyXyyabYrEYY8eORVZWlmkbz/PIysrChAkT7Fgy1xAfH4+wsDCz66tUKpGTk2O6vhMmTEB9fT2OHTtm2ufnn38Gz/NITU3t9zKT3qFYsi2KJfdBsWRbFEsOzN4jlGzpk08+YRKJhGVmZrL8/Hy2ZMkSJpfLWUVFhb2L5hRUKhU7ceIEO3HiBAPANm/ezE6cOMGuXLnCGGNsw4YNTC6Xs6+//pqdOnWK3XXXXSw+Pp61tLSYzjFt2jQ2evRolpOTww4ePMgGDx7MFixYYK+3RHqJYqlvKJaIEcVS31AsOSeXTjYZY+zNN99kMTExTCwWs5SUFHb48GF7F8lp7N+/nwFo98jIyGCMGaaZePHFF1loaCiTSCRs6tSprLCw0OwcNTU1bMGCBczHx4f5+fmxRYsWMZVKZYd3Q/qKYqn3KJbI9SiWeo9iyTlxjDHW37WphBBCCCHEPbhsn01CCCGEEGJ/lGwSQgghhBCboWSTEEIIIYTYDCWbhBBCCCHEZijZJIQQQgghNkPJJiGEEEIIsRlKNgkhhBBCiM1QskkIIYQQQmyGkk1CCCGEEGIzlGwSQgghhBCboWSTEEIIIYTYzP8H+x3qjm7lda4AAAAASUVORK5CYII=", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "{\n", - " \"tags\": [\n", - " \"hide-input\",\n", - " ]\n", - "}\n", - "f,axarr = plt.subplots(3,3);\n", - "\n", - "f.text(0.5,0.975,'SIR with forward sensitivity solved via ode',fontsize=16,horizontalalignment='center',verticalalignment='top')\n", - "\n", - "axarr[0,0].plot(t, solution[:,0])\n", - "\n", - "axarr[0,0].set_title('S')\n", - "\n", - "axarr[0,1].plot(t, solution[:,1])\n", - "\n", - "axarr[0,1].set_title('I')\n", - "\n", - "axarr[0,2].plot(t, solution[:,2]);\n", - "\n", - "axarr[0,2].set_title('R')\n", - "\n", - "axarr[1,0].plot(t, solution[:,3])\n", - "\n", - "axarr[1,0].set_title(r'state S parameter $beta$')\n", - "\n", - "axarr[2,0].plot(t, solution[:,4])\n", - "\n", - "axarr[2,0].set_title(r'state S parameter $gamma$')\n", - "\n", - "axarr[1,1].plot(t, solution[:,5])\n", - "\n", - "axarr[1,1].set_title(r'state I parameter $beta$')\n", - "\n", - "axarr[2,1].plot(t, solution[:,6])\n", - "\n", - "axarr[2,1].set_title(r'state I parameter $gamma$')\n", - "\n", - "axarr[1,2].plot(t, solution[:,7])\n", - "\n", - "axarr[1,2].set_title(r'state R parameter $beta$')\n", - "\n", - "axarr[2,2].plot(t, solution[:,8])\n", - "\n", - "axarr[2,2].set_title(r'state R parameter $gamma$')\n", - "\n", - "plt.tight_layout()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "2f64d869", - "metadata": {}, - "source": [ - "#TODO links\n", - "This concludes the introductory example and we will be moving on to look at parameter estimation next in {doc}`estimate1` and the most important part in terms of setting up the ODE object; defining the equations in various different ways in {doc}`transition`." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.15 ('sphinx-doc')", - "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.9.15" - }, - "vscode": { - "interpreter": { - "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/stochastic.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/stochastic.ipynb deleted file mode 100644 index f037f47b..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/stochastic.ipynb +++ /dev/null @@ -1,617 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Stochastic representation of ODEs\n", - "\n", - "There are multiple interpretations of the stochasticity of a deterministic\n", - "ODE. We have implemented two of the most common interpretations; when the\n", - "parameters are realizations of some underlying distribution, and when we\n", - "have a so called chemical master equation where each transition\n", - "represent a jump. Again, we use the standard SIR example as previously\n", - "seen in {doc}`sir`." - ] - }, - { - "cell_type": "markdown", - "id": "d945f972", - "metadata": {}, - "source": [ - "#TODO add comment about using a density or frequency formulation (use of population size) - currently unexplained" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "3f44792d", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import SimulateOde, Transition, TransitionType\n", - "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "import numpy as np\n", - "\n", - "# initial conditions\n", - "Ix0 = [1, 1.27e-6, 0]\n", - "\n", - "# time period\n", - "t = np.linspace(0, 150, 100)\n", - "\n", - "stateList = ['S', 'I', 'R']\n", - "\n", - "paramList = ['beta', 'gamma']\n", - "\n", - "transitionList = [Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T), \n", - " Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)]\n", - "\n", - "# create the ODEs\n", - "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", - "\n", - "# assign parameter values\n", - "odeS.parameters = [0.5, 1.0/3.0]\n", - "\n", - "# assign initial values\n", - "odeS.initial_values = (Ix0, t[0])\n", - "\n", - "# solve deterministic solution\n", - "solutionReference = odeS.integrate(t[1::], full_output=False)" - ] - }, - { - "cell_type": "markdown", - "id": "0e516f09", - "metadata": {}, - "source": [ - "\n", - "## Stochastic Parameters\n", - "\n", - "In our first implementation, we assume that the parameters follow some\n", - "underlying distribution. Given that both $\\beta$ and $\\gamma$ in our SIR\n", - "model has to be non-negative, it seems natural to use a Gamma\n", - "distribution. We make use of the familiar syntax from\n", - "[R](http://www.r-project.org/) to define our distribution.\n", - "Unfortunately, we have to define it via a tuple, where the first item is the\n", - "function handle (name) and the second the parameters. \n", - "\n", - "```{note}\n", - "The parameters can be defined as either a dictionary or as the same sequence\n", - "as [R](http://www.r-project.org/) (without specifying the arguments), which for the [Gamma distribution](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/GammaDist.html) is the shape followed by the rate.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "a3e9bc81", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom.utilR import rgamma\n", - "\n", - "d = dict()\n", - "\n", - "# E(X) = 0.5 = shape * scale = shape / rate \n", - "d['beta'] = (rgamma,{'shape':100.0, 'rate':200.0})\n", - "\n", - "# E(X) = 1.0/3.0 = shape / rate\n", - "d['gamma'] = (rgamma,(100.0, 300.0))\n", - "\n", - "odeS.parameters = d\n", - "\n", - "Ymean, Yall = odeS.simulate_param(t[1::], 10, full_output=True)" - ] - }, - { - "cell_type": "markdown", - "id": "2221479d", - "metadata": {}, - "source": [ - "```{note}\n", - "Note that a message may be printed above where PyGOM is trying to connect to an\n", - "mpi backend, as our module has the capability to compute in parallel\n", - "using the IPython. We have simulated a total of 10 different solutions\n", - "using different parameters, the plots can be seen below.\n", - "```\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "8849566b", - "metadata": { - "tags": [ - "hide-input" - ] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "f, axarr = plt.subplots(1,3, layout='constrained')\n", - "\n", - "#TODO tidy up plots\n", - "for solution in Yall: \n", - " axarr[0].plot(t, solution[:,0]) \n", - " axarr[1].plot(t, solution[:,1]) \n", - " axarr[2].plot(t, solution[:,2])\n", - "\n", - "for idx, state in enumerate(stateList):\n", - " axarr[idx].set_title(state)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "1fd28659", - "metadata": {}, - "source": [ - "\n", - "We then see how the expected results, using the sample average of the\n", - "simulations\n", - "\n", - "$$\\tilde{x}(T) = \\mathbb{E}\\left[ \\int_{t_{0}}^{T} f(\\theta,x,t) dt \\right]$$\n", - "\n", - "differs from the reference solution\n", - "\n", - "$$\\hat{x}(T) = \\int_{t_{0}}^{T} f(\\mathbb{E}\\left[ \\theta \\right],x,t) dt$$ " - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "4e6f4164", - "metadata": { - "tags": [ - "hide-input" - ] - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAosAAAHrCAYAAACn9tfQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACG5klEQVR4nO3de3xU9Zk/8M+ZSWYm9wu5DIFAQNCgIGAQiFKtmm6otUpFKqxblKX4W2usNV2ruIpWu6W1SvFCl9XWWrdSLa2lVi0tjaJVwh1UroKgXMLkSjK5zSUz5/fHzDmTSCaZy7nM5fN+vea16+TMzBmak3nmeb7P8xVEURRBRERERDQIg94nQERERESxi8EiEREREQXFYJGIiIiIgmKwSERERERBMVgkIiIioqAYLBIRERFRUAwWiYiIiCgoBotEREREFBSDRSIiIiIKisEiEREREQXFYJGC+vjjj3HTTTdh7NixsFgsGDVqFL7yla/gmWee0fvUiOLeiy++CEEQsHPnTr1PhShuSdeRdEtJScGoUaNw22234fTp03qfXsJI0fsEKDZt2bIFV111FcaMGYNly5bBarXi5MmT2Lp1K5566incddddep8iERERAODRRx/FuHHj4HA4sHXrVrz44ot4//33sW/fPlgsFr1PL+4xWKRB/fd//zdycnKwY8cO5ObmDvhZU1OTPidFREQ0iK9+9auYMWMGAODb3/42CgoK8NOf/hSvv/46vvnNb+p8dvGPZWga1KeffoqLLrronEARAIqKirQ/ISIiohB96UtfAuD7LKPoMVikQY0dOxa7du3Cvn379D4VIiKisHz22WcAgLy8PH1PJEEwWKRB/ed//id6enowbdo0XHbZZbjvvvvw97//HW63W+9TIyIiGqCjowMtLS04deoU/vjHP+KHP/whzGYzrrvuOr1PLSEwWKRBfeUrX0F9fT2uv/56fPjhh3j88cdRXV2NUaNG4fXXX9f79IiIiGRVVVUoLCxEaWkpbrrpJmRkZOD111/H6NGj9T61hMBgkYK69NJL8dprr+Hs2bPYvn07li9fjs7OTtx00004cOCA3qdHREQEAFizZg02bdqEP/zhD7j22mvR0tICs9ms92klDAaLNCyTyYRLL70UP/7xj/E///M/cLvdWL9+vd6nRUREBACYOXMmqqqqMH/+fLz++uuYPHky/vVf/xVdXV16n1pCYLBIYZFGE5w5c0bnMyEiIjqX0WjEypUr0dDQgGeffVbv00kIDBZpUO+88w5EUTzn/rfeegsAcMEFF2h9SkRERCH58pe/jJkzZ2L16tVwOBx6n07c41BuGtRdd92Fnp4efOMb30B5eTlcLhe2bNmCV199FWVlZViyZInep0hERBTUvffeiwULFuDFF1/Ef/zHf+h9OnGNmUUa1BNPPIGrrroKb731Fmpra1FbW4vt27fjO9/5DrZt2zbosG4iIqJYceONN+K8887DE088AY/Ho/fpxDVBHKzWSEREREQEZhaJiIiIaAgMFomIiIgoKAaLRERERBQUg0UiIiIiCorBIhEREREFxWCRiIiIiIJKyqHcXq8XDQ0NyMrKgiAIep8OJSBRFNHZ2YmSkhIYDIn/nYzXFKkt2a4pgNcVqS/U6yopg8WGhgaUlpbqfRqUBE6ePInRo0frfRqq4zVFWkmWawrgdUXaGe66SspgMSsrC4DvHyc7O1vns6FEZLfbUVpaKv+uJTpeU6S2ZLumAF5XpL5Qr6ukDBaldH52djYvQFJVspSOeE2RVpLlmgJ4XZF2hruukmPhBxERERFFhMEiEREREQXFYJEoDq1ZswZlZWWwWCyYNWsWtm/fPuTx69evR3l5OSwWC6ZMmYK33npL/pnb7cZ9992HKVOmICMjAyUlJVi8eDEaGhrUfhtERBQHGCwSxZlXX30VtbW1ePjhh7F7925MnToV1dXVaGpqGvT4LVu2YNGiRVi6dCn27NmDefPmYd68edi3bx8AoKenB7t378ZDDz2E3bt347XXXsPhw4dx/fXXa/m2iIgoRgmiKIp6n4TW7HY7cnJy0NHRwUXDpAo1f8dmzZqFSy+9FM8++ywA3yy20tJS3HXXXbj//vvPOf7mm29Gd3c33njjDfm+2bNnY9q0aVi7du2gr7Fjxw7MnDkTn3/+OcaMGTPsOfGaIrUl4+9YMr5n0laov2PMLBLFEZfLhV27dqGqqkq+z2AwoKqqCvX19YM+pr6+fsDxAFBdXR30eADo6OiAIAjIzc0d9OdOpxN2u33AjYiIEhODRaI40tLSAo/Hg+Li4gH3FxcXw2azDfoYm80W1vEOhwP33XcfFi1aFPSb5sqVK5GTkyPfODiYiChxMVgkIpnb7cY3v/lNiKKI//mf/wl63PLly9HR0SHfTp48qeFZEhGRlpJyKDdRvCooKIDRaERjY+OA+xsbG2G1Wgd9jNVqDel4KVD8/PPP8fbbbw+5fsVsNsNsNkf4LoiIKJ4ws0gUR0wmEyoqKlBXVyff5/V6UVdXh8rKykEfU1lZOeB4ANi0adOA46VA8ciRI/jHP/6BESNGqPMGiIgo7jCzSBRnamtrceutt2LGjBmYOXMmVq9eje7ubixZsgQAsHjxYowaNQorV64EANx999248sor8eSTT+JrX/saXnnlFezcuRPPPfccAF+geNNNN2H37t1444034PF45PWM+fn5MJlM+rxRIiKKCQwWieLMzTffjObmZqxYsQI2mw3Tpk3Dxo0b5SaWEydOwGAIFA0uu+wyrFu3Dg8++CAeeOABTJw4ERs2bMDkyZMBAKdPn8brr78OAJg2bdqA13rnnXfw5S9/WZP3RUREsYlzFjm7ilSQbL9jyfZ+SXvJ+DuWjO+ZtMU5i0RERCEKZwvN/fv3Y/78+SgrK4MgCFi9enXUz0kUyxgsEhENQhRF9Hm8ep8GaSDcLTR7enowfvx4/OQnPwk6hSDc5ySKZQwWSRUnWnvwpcffxtVPbsbL2z5HEq52oDj2P5s/xfkP/hUT/uuv+NEbB/Q+HVLZqlWrsGzZMixZsgQXXngh1q5di/T0dLzwwguDHn/ppZfiZz/7GRYuXBh0hFS4z0nneuT1/Zj+6N/x4cl2vU8l6TFYJMV19Lrx77/ZgZNtvTjW3I3/+tM+/Hbr53qfFlFIHG4PfrH5KNwe3xecX31wHIds3M4wUUWyhaZaz8ltNAPeOdSEF7d8hrM9bnzv1b3ocfXpfUpJjcEiKW7NO0dxtKkL1mwLllxeBgBYtekTdPS49T0xohBsOtCITkcfRuWmYe5FVogi8NO/HtL7tEglkWyhqdZzchtNH4fbg//608cAAEEAjrd0Y/U/juh8VsmNwSIpShRFvPnRGQDAI9dfiP+6dhImFGXibI8bv9h8VOezIxreH3adAgDceMko3PfVcqQYBLxzuBmHbZ06nxklOm6j6bP1WCsaOhwoyjLjZzdNBQD842DjMI8iNTFYJEV9dKoDp9t7kW4y4ssXFCHFaMB9c8sBAOt3nYKbDQMUw9q6XfjnkWYAwPxLRmNcQQauPL8QAD+sElUkW2iq9ZxmsxnZ2dkDbslo2/E2AMCV5xfi6vIiAMCx5m509LI6pRcGi6Sov+7zlViuuqAIllSj//8vREGmCW3dLrx/pEXP0yMa0oEGO7wiMK4gA2UFGQCAqyf5PqzePsQu1kQUyRaaejxnMtl6rBUAMHv8CORnmDA6Lw0AsO90h56nldQYLJKi/r7fFyzOnRz49pxiNOC6i0sAABv2ntblvIhCcaTJV2qeWJQp3ydlNnafOIu2bpcu50Xqqq2txfPPP4/f/OY3OHjwIO64445zttBcvny5fLzL5cLevXuxd+9euFwunD59Gnv37sXRo0dDfk4aXLezDx+f8gWFs8bnAwCmluYCAD481a7TWRG3+yPFtHW7cKylGwBw5QWFA352w7QSvLjlM/x9fyN6XH1IN/FXj2LPkaYuAMDE4kCwODInDReOzMaBM3a8c6gJ8ytG63V6pJJwt9BsaGjA9OnT5f9+4okn8MQTT+DKK6/E5s2bQ3pOGtyuz8+izytidF4aRuelAwCmjs7Bmx+dwUcnmVnUCz+xSTEHz/jGPJSNSEe2JXXAz6aV5mJ0XhpOne3FtmNtuMqfrSGKJUcafZnF84uzBtx/VXkhDpyxo/5YK4PFBFVTU4OamppBfyYFgJKysrKQZscO9Zw0uO3+9Yqzxo2Q77t4dC4AZhb1xDI0KWZ/g+9b34Ul5y7KFgQBV/gbBd7zNxAQxRJRFPFJoy+zOKFfGRoAppXmAeCaKSK1STNNp5bmyPdNHpUDQQDOdDjQ3OnU69SSGoNFUsyBBt9FfuHIwTv4vjShAADwTza5UAxq7nKio9cNgwCcVzgwWJwyyvfBdaSpCw63R4/TI0oK0he2iUWB7H6mOQUlOb4ml5Nne3Q5r2THYJEUc8Bfhh4sswgAl51XAIMAHG3qQkN7r5anRjSso/4PqTH56XInv6Q424yCTBM8XlH+PSciZfW6PHIweH7xwC9sJbkWAMDps/zs0AODRVKEw+3Bp82+5pYLR+YMekxOeqrc1fZPlqIpxnziX684oSjrnJ8JgoDJ/uwiS9FE6vi0uQuiCORnmDAic+Ce26NyfZlFJhr0wWCRFPFJYyc8XhEjMkwozjYHPW6OvxS97VibVqdGFJLPWn0ZjfOKMgb9+RQGi0SqGmx0laSEwaKuGCySIg75t0IrH5kFQRCCHjdznG9u1o7PGSxSbLF1OAAAI7Mtg/5cyix+fJplaCI1yOsVi4MHi6fbHZqeE/kwWCRFnGzzZWXGjhg8KyOZPiYPBgE42dYrfzgTxQKb3ff7aM0ZPFi8yL8W90hjJ/q4bSWR4o4M0twiYRlaXwwWSRFSsFjqH6IaTKY5RW6A2cnsIsWQRn+wWBwks1iSkwZTigF9XhENzG4QKe6oVIYeJLM4Kk/KLDJY1AODRVLEKX+HWml+2rDHzhjrK0Xv/OysqudEFCqvV0STf35bsMyiwSBgTL7vy9Dnbd2anRtRMnD1eXHCn3SYUHhusDjSf1129LrR5ezT9NyIwSIpRBp3MFxmEQAuLfMFi9KkfiK9tXQ74fGKMAhAYWbwBq2yEb7fb6kZhoiU0dDeC68IpKUaUZh17jWYZUlFtsW36dwZZhc1x2CRouZwe9Bo92VlRueFkFks8+2GcchmR4+L3xBJf40dvt/fgkwzUozB/yyOyfetyT3RyswikZKkrGJpflrQJslR/mQES9HaY7BIUZMu3HSTEfkZpmGPL862YGSOBV4R+PgUx5CQ/oZrbpGMZWaRSBVSsCgt9RjMKGkwN4NFzTFYpKjJ6xXz0occm9PfVG4MTzHENkxzi0QKFk8wWCRSlNwkOUSwyFmL+lE9WFyzZg3KyspgsVgwa9YsbN++Peix+/fvx/z581FWVgZBELB69eqon5PUd7Jf+SBU08bkAgD2nmxX4YyIwtPYIQWLwdcrAoHRUJ+3dUMURdXPiyhZnAhhokaBfz1xa5dLk3OiAFWDxVdffRW1tbV4+OGHsXv3bkydOhXV1dVoamoa9Pienh6MHz8eP/nJT2C1WhV5TlKf1NwyOoTmFomcWTzJMjTpTy5DD5NZHJWbBqNBgMPtlbuniSh6oZShpWVOrd0MFrWmarC4atUqLFu2DEuWLMGFF16ItWvXIj09HS+88MKgx1966aX42c9+hoULF8JsHvwbfrjPSeqTytChNLdILh6dA4PgW3vS1MmZdaSv4WYsSkwpBpT41019zlI0kWKkCtWYEcGDxRH+YLGNwaLmVAsWXS4Xdu3ahaqqqsCLGQyoqqpCfX29ps/pdDpht9sH3Eg5p+VgMfTMYoY5RZ7Sv/dEuxqnRRSyxhAbXABgrNQR3cZgkUgJHT1u2B2+yRhDlaHzGSzqRrVgsaWlBR6PB8XFxQPuLy4uhs1m0/Q5V65ciZycHPlWWloa0evT4Jr95bjh1nt90cWjfXvt7jvNUjTpSxr9NFwZGghkH6UAk4iiI33xKsg0I81kDHrciEx/GbqLS0C0lhTd0MuXL0dHR4d8O3nypN6nlDBEUZSDxcEGqQ5FChY/YrBIOnL1edHR6wYQWEA/lCL/l6JmrlkkUkRgveLQS5nyM3zXnt3RBzf3Z9dUilpPXFBQAKPRiMbGxgH3NzY2Bm1eUes5zWZz0DWQFB17bx9c/os2lA/a/iaP8gWLH5/qgCiKIY/dIVLS2R5fSctoEJCTljrs8cX+L0XMLBIp43S7L1gcNcxSpty0VBgEwCsCZ7tdKAqhEkDKUC2zaDKZUFFRgbq6Ovk+r9eLuro6VFZWxsxzUnSau3wfmDlpqbCkBi8fDGbSyGykGAS0drtwpoMfvKQPaQxHXnoqDIbhv7BIH1DshiZSRkO77++/1DwWjMEgIC+dHdF6UC2zCAC1tbW49dZbMWPGDMycOROrV69Gd3c3lixZAgBYvHgxRo0ahZUrVwLwNbAcOHBA/v9Pnz6NvXv3IjMzExMmTAjpOUlbTfbIStAAYEk1YmJxFg6eseOjUx3ywFUiLUmL5UPZfQgAivy/6+ziJ1LGmQ5fk2RJzvCfAfkZJrR2u9jkojFVg8Wbb74Zzc3NWLFiBWw2G6ZNm4aNGzfKDSonTpyAwRBIbjY0NGD69Onyfz/xxBN44okncOWVV2Lz5s0hPSdpq9m/0LgwzBK05OJROTh4xo59pzswd3JkyxOIotHa7fsdDj1Y9GcW7U4unyBSQCCzGFqwCDCzqDVVg0UAqKmpQU1NzaA/kwJASVlZWUi7Igz1nKStSJtbJJNH5+DVnSfZ5EK6kTIUIzJC+x2WGlycfV7Ye/uQkz78OkciCk7KLI4MYXSV1BHdxo5oTSVFNzSpJ9pgcYq/yWX/6Q5un0a6CLcMbUk1Itvi+57NUjRRdJx9HrT41w2Hk1lkGVpbDBYpKk1RBovl1iwY/U0uNnaXkg5awwwWATa5ECnF5m9utKQakBdCll4an8MytLYYLFJUpMxiUYTBoiXViIlFmQCAfae5sw5pr82f1ZDKW6FgkwuRMk63B5pbQln/yy3/9MFgkaISbRkaCMxb5E4upIdwG1yAQLAo7fxCRJE5429uGTnM2BwJG1z0wWCRoiJ3Q0cTLJZkAwD2NzBYJO1FUoaWtvxrYrBIFJVAc0too9OYWdQHg0WKmKvPK1+wkY7OAfpnFlmGJu1Jv8Ph7EBUyDI0kSIaOkIfmwMA+ZkMFvXAYJEiJpXvUvpN1Y/EpJHZEATAZndwv13SVJ/Hi/Ye377QbHAh0l6DvGYxtDJ0bprvOu3odXOChoYYLFLEWjoD5btQtkkLJsOcgvEFGQBYiiZtnfUHioKAsL7wSKWws8xuEEVF6oYeGWJmMTvNN7bK4xXR4/Kodl40EINFitjZnvDXegXDJhfSg1TKyk1LhTGMLzy5/hEfUrBJRJGRRqZZs0PLLKalGpFq9F2rdgevP60wWKSIScFirgI7WEwu4bpF0l4kndBAIAvZ3uNiKYwoQg63R14GEmqwKAgCsi2+zxx7b59q50YDMVikiEkXeTTrFSUXjfJ1RO9jGZo0FO5WfxLpd77PK6LLyQ8sokhI0wTMKQa5vByK7DR/sMjMomYYLFLEAplFBYJFf2bx1NletPdwHRhpQ1pzmJcRXnbckmqAKcX357OdpWiiiMgl6BxLSAO5JdJ2mx289jTDYJEiFsgsRl+GzklLxZj8dADA/gaWokkbZyPohAZ8pTDp957BIlFkpGCxOMQStISZRe0xWKSISZlFJcrQADDZX4r+mE0upBG5wSWC32Hp9/4sM+FEEWnsCK+5RSIHi70MFrXCYJEiJmVllGhwAQKlaGYWSSvSkof8CILFQEc0g0WiSDT2K0OHQ25wcXC9sFYYLFLE2hXPLHJ8DmmrLYovPNJwYJahiSITeRnat2aRmUXtMFikiMll6DCbA4KR9og+3tLNtSikiWi+8Ei/9wwWiSLTKAeL4U0jCGQWee1phcEiRay9W8rKKJNZHJFplrd8OsBSNGmgTe6GjqQMzTWLRNEIdyC3RFqz2MHMomYYLFJE3B4vOv3z5ZQqQwMsRZO2ounoD3RDM1gkCpcoimj0z1kMuwxtkcrQXLOoFQaLFJH2fnvq5qQpU4YGgCkMFkkjrj6vPFA7ki0rA5lFZjeIwtXe44arzwsg/GAxh6NzNMdgkSIiZVOyLeHtqTscKbPI8TmkNul32CAE1kCFIzeNmUWiSEkl6PwMkzzgPlScs6g9BosUkbMKDuTuTwoWj7V0cxs1UlVbvx2IDBF84ZHWObZz3RRR2Jo6fSXooqzwmlsAcG9oHTBYpIgoudVff4VZZozMsUAUgf3MLpKKznZHNydU+qIkbRlIRKFrjHBsDhAYndPpcMPrFRU9Lxocg0WKSGDkiLKZRSCwbpGlaFJTNAO5gcAXJbujD30er2LnRZQMmhXILHpFoMvF7KIWGCxSRAJlaGUziwBw8WgGi6S+tiiz47n9Grs4woMoPE3+zGJRmDMWAcCSaoTZv86Rg7m1wWCRIqJWGRoApozOBQB8fIrBIqlH6ujPj3CofIrRgCyzrxzGjmii8ATWLIZfhgb67w/NzKIWGCxSRKRvc0rtC93flH5NLux2G9yaNWtQVlYGi8WCWbNmYfv27UMev379epSXl8NisWDKlCl46623Bvz8tddew7/8y79gxIgREAQBe/fuVfHsY4M8kDuKLzzsyiSKjLRmMZIyNNBv1iKvPU0wWKSISN/mpAtWSfkZJozOSwMA7GN28Ryvvvoqamtr8fDDD2P37t2YOnUqqqur0dTUNOjxW7ZswaJFi7B06VLs2bMH8+bNw7x587Bv3z75mO7ubsyZMwc//elPtXobugtsVxl5sJjl//3vcjC7QRQOObMYQYMLwF1ctMZgkSIifZvLVnAgd3/SusWPuG7xHKtWrcKyZcuwZMkSXHjhhVi7di3S09PxwgsvDHr8U089hblz5+Lee+/FpEmT8Nhjj+GSSy7Bs88+Kx/zrW99CytWrEBVVZVWb0N3Z7ujb9KSgsVOBotEIRNFMarROQCQ5W9y4Rc1bTBYpIjY/RdoVgTDjEMx1b9u8cOT7ao8f7xyuVzYtWvXgKDOYDCgqqoK9fX1gz6mvr7+nCCwuro66PGhcDqdsNvtA27xpq0n+r3N5Q8sJ7MbRKHq6A3s3lIYYbCYaTYCAOfxaoTBIkWkU8osqlCGBoCppbkAGCx+UUtLCzweD4qLiwfcX1xcDJvNNuhjbDZbWMeHYuXKlcjJyZFvpaWlET+XXqTM4ggFytDMLBKFTsoq5qSlwpJqjOg5Mv3NZQwWtcFgkSIirVlUK7M4ZVQODALQ0OGQRyxQ7Fi+fDk6Ojrk28mTJ/U+pbBJwWIk+0JLpA8sO4NFopA12aMrQQNABoNFTTFYpIjImcU0dTKLGeYUTCzKAgB8yCYXWUFBAYxGIxobGwfc39jYCKvVOuhjrFZrWMeHwmw2Izs7e8Atnjj7POj0f8hEEyxy3RRR+Jo6I9+9RSKNrepmsKgJBosUNofbA6d/vYlamUUAmFrqa3JhKTrAZDKhoqICdXV18n1erxd1dXWorKwc9DGVlZUDjgeATZs2BT0+GUgzFo0GQd4NIhKBMjTXLBKFqlHJzCK/qGlCnbQQJTRpfZYgBL7dqWFqaS5+v/MU9jJYHKC2tha33norZsyYgZkzZ2L16tXo7u7GkiVLAACLFy/GqFGjsHLlSgDA3XffjSuvvBJPPvkkvva1r+GVV17Bzp078dxzz8nP2dbWhhMnTqChoQEAcPjwYQC+rGQ0GchY1doV6IQ2GISIn0cencPsBlHIpMxiYQS7t0gyee1pisEihU3KomSaU6L6oB3ONKnJ5VQ7vF5R1deKJzfffDOam5uxYsUK2Gw2TJs2DRs3bpSbWE6cOAGDIVA0uOyyy7Bu3To8+OCDeOCBBzBx4kRs2LABkydPlo95/fXX5WATABYuXAgAePjhh/HII49o88Y0JM9YjHIHIja4EIWvOcrdWwA2uGiNwSKFTVrMH035LhQXFGchLdWITkcfPm3uwsTiLFVfL57U1NSgpqZm0J9t3rz5nPsWLFiABQsWBH2+2267DbfddptCZxf7WhVobgGALLPvGmAZmih0UrAY6dgcIBAscs2iNrhmkcImfTBmqTQ2R5JiNMjDuXefOKvqa1FyUaITGgiUwjr5gUUUsuYoB3IDgTWLvPa0wWCRwhbY6k/dzCIAXDI2DwCw50S76q9FyUOxzCLL0ERhY2Yx/jBYpLCpPTanv+n+dYvMLJKSlMosSmVodmQShabXFRhbpUSwyGtPGwwWKWx2uQytfmZx+hhfZvFIU5f8ukTRalO4waXX7YHb4436vIgSnZRVNKcYopqmIS0B6XZ54PWKipwbBcdgkcLWKTe4qJ9ZLMwyozQ/DaII7GUpmhTS5h+dMyJTmTWLADMcRKFo7vKNzSnKNkMQIp9wkdkv0Ox28dpTG4NFCpu9V7vMIgDMGJsPANj5OUvRpAylRuekGg2wpPr+jHKEB9Hw5PWKmZGXoAFfZjLFP06t2+mJ+rxoaAwWKWxyZlGDNYsAMKPMV4re+VmbJq9HiU+pBhcg8KWJyySIhqdEcwsACILQb39oXntqY7BIYZM+FLXohgYCmcW9J9u5LoyiJoqiYg0uQL9dXFiGJhpWkwIDuSWBwdzMLKqNwSKFTRrKrVUZemJRJrItKehxeXDwjF2T16TEZXf0oc+/IF6RYNHM8TlEoVIqswiwI1pLDBYpbNKaRa3K0AaDgIqxUima6xYpOlJWMS3VCEuqMernk740dbIURjQsJYPFDLPv+uV6YfUxWKSwdWqcWQSAGWW+UvQOrlukKLV0KfdhBbAMTRSO5i5lGlwAINP/GcRgUX0MFilsgTWL2m0tPmucL1jcfrwNosiZWhQ5JTMbQKAUZmewSDSsJrt/zWK2EmVoX2aRu7ioT7tPe0oIoijK3+IyNQwWp4zOgTnFgNZuFz5t7sKEoizNXpsSi5KZDSCQYY/l7EZDey/+vt+Gli4XKs8bgcvOGxHVjDuiSHi9opzZL1Aisyg3uMTutZcoGCxSWHpcHkiJPWmrMy2YU4y4ZEwe6o+1YuuxNgaLFDEps1iQFX1zC9B/f+jYXLO447M2LHtpJ9p7fOf37DtHMXt8Pn5xS4UiDT5EoWrvdcvNZUoEixkMFjXDMjSFRbooDQLkYcRamTXeV4redpzrFilygaHA0Y/uAAKL7HtcsTe+49PmLvzbL7ehvceNcmsW5k0rgTnFgK3H2vDN/61Hk92h9ylSEpGuvbz0VJhSov/8yGI3tGYYLFJY5BK0OUXzMtascSMAANuOtXLdIkVM6TWL6SbfB1ZPDM56+8lfD8HZ58Xs8fn403cux+qF0/Hmd+fAmm3B0aYu/L/f7oKzL/bOmxKT0teelFnkmkX1MViksHT3Cxa1Nn1MLkwpBjR1OnGspVvz16fE0KxwN7SUWYy1/Wm3H2/DpgONMBoE/GjeZKSZfOc5oSgLr/6/2chJS8WeE+147I0DOp8pJQtpX2jFmsukJSAMFlXHYJHCIqX7M3QIFi2pRlSM8c1b3HK0RfPXp8TQolZmMcbK0L/85zEAwDdnlJ6zxnfsiAysXjgNggD8dusJvHO4SY9TpCSj1L7QkkxmFjXDYJHCIpWh9QgWAeDyCb5S9AdHW3V5fYpvoigqn1k0xd4Hlt3hxuZPmgEAiyvHDnrMVRcUYcll4wAA9//xI3T0xGaDDiWOli7fQHzFr70Y+6KWiBgsUlikUluWhmNz+rtsQgEAoP5YKzxerluk8HT0uuH2SN2YynQCp8dgg8um/Y1w9XkxoSgT5dbgkwPurb4A4woy0Gh34vG/HdLwDCkZKb9e2H/txdAXtUTFYJHCIpehTfoEixePykGmOQUdvW7uE01hkz6sctJSYU6Jfqs/oN8HVgytWXzjowYAwHUXjxyyES3NZMTKG6cAANZtP4HdJ5J3O801a9agrKwMFosFs2bNwvbt24c8fv369SgvL4fFYsGUKVPw1ltvDfj5bbfdBkEQBtzmzp2r5luIeYoHi+bYXAKSiBgsUli6/B2fepWhU4wGzPaP0PnnEa5bpPAo/WEF9C9Dx8YHVo+rD+/71/Red3HJsMfPHj8C8y8ZDVEEHvzTvqTM2L/66quora3Fww8/jN27d2Pq1Kmorq5GU9Pgazm3bNmCRYsWYenSpdizZw/mzZuHefPmYd++fQOOmzt3Ls6cOSPffve732nxdmKWPONUoTWLGabYbC5LRAwWKSzSuiy9ytAA8KWJhQCA9/xrsohCpfTuLUAgs9jr9sREoLX3RDvcHhElORZMKMoM6TEPXFuOnLRUHDhjx8vbPlf5DGPPqlWrsGzZMixZsgQXXngh1q5di/T0dLzwwguDHv/UU09h7ty5uPfeezFp0iQ89thjuOSSS/Dss88OOM5sNsNqtcq3vLy8Ic/D6XTCbrcPuCUSpdcLM7OoHQaLFJZAg4syJbxIfGmib93izs/bYqr0R7FPlcxivyx7r1v/D60dn/lKyTPK8kN+zIhMM/7zX84HADzxt8PylmzJwOVyYdeuXaiqqpLvMxgMqKqqQn19/aCPqa+vH3A8AFRXV59z/ObNm1FUVIQLLrgAd9xxB1pbh27MW7lyJXJycuRbaWlphO8q9rg9XrR1+xtcFM4suvq8cHu8ijwnDY7BIoVF725oABhXkIHReWlwe0RsPcauaAqd0mUwADCnGGDwLwuMhYX2Oz7z7XB06bjQg0UA+NdZY3FRSTbsjj48vjF5ml1aWlrg8XhQXFw84P7i4mLYbLZBH2Oz2YY9fu7cuXjppZdQV1eHn/70p3j33Xfx1a9+FR5P8C8Uy5cvR0dHh3w7efJkFO8strT6O6GNBgF56Qo1l/VbO8/soroYLFJY9BzKLREEAVecL5WiuW6RQtfQ4RsKPDJHma3+AN/vY6yM8OjzeOUmlUvLhi55fpHRIODRGy4CAPx+56mkbnZRwsKFC3H99ddjypQpmDdvHt544w3s2LEDmzdvDvoYs9mM7OzsAbdEEfiiZoLBoMzuX6YUA1KNvudilUldDBYpLF0xECwCwBX+dYubOUyYwtDQ3gsAKMlNU/R5pfE5es9aPHimEz0uD7ItKTi/KPjInGAqxuZj/iWjAQAPbdiHviQo7RUUFMBoNKKxsXHA/Y2NjbBarYM+xmq1hnU8AIwfPx4FBQU4evRo9Ccdh5TevUWSHmMNZomKwSKFJRbK0AAwZ2IBUo0CPmvtwbHmLl3PheKHFCyOylM2WMyIkV1c9pz0ZQMrxuZFnL1Zfm05si0p2N9gx2+3Jn6zi8lkQkVFBerq6uT7vF4v6urqUFlZOehjKisrBxwPAJs2bQp6PACcOnUKra2tGDlypDInHmfUWAICBNYtMrOoLgaLFJZYKENLrz9rnG83l7cPMbtIw3N7vGi0+7IbJbnKlaGB/oO59c8sAsCFJZGXLwsyzfjB3HIAwBN//wRnOnoVObdYVltbi+effx6/+c1vcPDgQdxxxx3o7u7GkiVLAACLFy/G8uXL5ePvvvtubNy4EU8++SQOHTqERx55BDt37kRNTQ0AoKurC/feey+2bt2Kzz77DHV1dbjhhhswYcIEVFdX6/Ie9SYFi0UKZxalPc+ZWVQXg0UKS7fOcxb7u6q8CACDRQqNrcMBrwiYjAYUZKhTCtM7s/hJoy9YvMAa3Vq3RTPHYPqYXHQ5+7Diz/shivqPBFLTzTffjCeeeAIrVqzAtGnTsHfvXmzcuFFuYjlx4gTOnDkjH3/ZZZdh3bp1eO655zB16lT84Q9/wIYNGzB58mQAgNFoxEcffYTrr78e559/PpYuXYqKigr885//hNms7O9evFBjEgEQ+CzS+4taotP/E5/iSqysWQSAa8qL8NgbB7D9eBs6HW5kWVL1PiWKYYH1ihbFFthL5OHAOq5ZFEURn9j8wWJx+OsV+zMaBPzkxovxtaf/iU0HGvHmx2dCGvAdz2pqauTM4BcN1pSyYMECLFiwYNDj09LS8Le//U3J04t7asw4BfrvoMTMopqYWaSQiaIYU8FiWUEGxhdmoM8r4l0O6KZhnFapuQWIjczi6fZedDr7kGoUML4wI+rnu8Cahe9cNQGAr9lFygwRRSKQWVR2CUhgvTAzi2pisEghc/Z55R0q9BzK3d9XLvSVif6+v3GYIynZyc0tqgSL+m87JpWgzyvMRKpRmT/tNVdNwKSR2Tjb48YDf/o44cvRpB61ytDSLi5cs6guBosUsq5+JbYMk/6ZRQCovsg3quKdQ01w9SX+mA+K3Ol2qblF+WBRXjel4wfWIX8J+vwoS9D9mVIMeHLBVKQaBWw60Ih1208o9tyUXFRbs8huaE0wWKSQdTn8Y3NMRsXXfEVq2uhcFGaZ0ensQz13c6EhJHxmUVqvaFUuWAR8ndX3+bujH3vjAA77X4coVN3OPnlgvdLd0OkxMhA/0TFYpJDFyozF/gwGQS5Fb9w3+NZcREBgzaLSMxaB2MgsftLomzeqZGZR8u+Xj8MV5xfC4fbijt/uGlBlIBqOtNd4usmo+OeHtCQqFrbaTGQMFilksTJj8Yu+OtlXiv7bfltS7DhB4RNFEafPqtngom9mURRFnGjrAeDbO11pBoOA1TdPw8gcC461dKP21b3werl+kULTpFIJGug3Z5GZRVUxWKSQxWJmEQAqx49AXnoq2rpd2Ha8Te/ToRh0psOBXrcHKQYBo9XILOrcDd3W7ZKvTzXeHwDkZ5jwi1sugclowN8PNGLVpk9UeR1KPPJ6RYXH5gDshtYKg0UKWSyNzekvxWjAXH928c2PzwxzNCWjo02+Eu3YEemKdQr3p/fe0FJW0ZptgSVVvUkF08fkYeWNUwAAz75zFL/fcVK116LEoVZzC8A5i1phsEghC+zeEhtjc/q7dopvv9WN+2xwsxRNXyAFixOKMlV5fr0zi1KwOGZEuuqvNb9iNO686jwAwPI/fYy3D3FsFQ1NzWAxFtYLJwNNgsU1a9agrKwMFosFs2bNwvbt24c8fv369SgvL4fFYsGUKVPw1ltvDfj5bbfdBkEQBtzmzp2r5lsgBNL8sVaGBnyl6BEZJrR1u/DB0Ra9T4dizKfN6gaLeq9ZPNHqDxbz1Q8WAeA//+UC3Dh9FDxeEf/x293Y8imvOQpOzTK03tdeslA9WHz11VdRW1uLhx9+GLt378bUqVNRXV2NpqbB9/PdsmULFi1ahKVLl2LPnj2YN28e5s2bh3379g04bu7cuThz5ox8+93vfqf2W0l6UtYkPUZmLPaXYjTguot92cU/723Q+Wwo1qieWdQ5u/G5P7M4VqNgURAE/PSmi/GVC4vh6vNi6Ys7Uf8pR1fR4OSt/tTMLLIMrSrVg8VVq1Zh2bJlWLJkCS688EKsXbsW6enpeOGFFwY9/qmnnsLcuXNx7733YtKkSXjsscdwySWX4Nlnnx1wnNlshtVqlW95eXlqv5WkJ31zk77JxZobpo8C4OuK5mJn6k/KLJ5XqE6wmKZ3ZlHDMrQk1WjAM4um48sXFKLX7cGSF7dz200alJRZLFAzs8jROapSNVh0uVzYtWsXqqqqAi9oMKCqqgr19fWDPqa+vn7A8QBQXV19zvGbN29GUVERLrjgAtxxxx1obQ3+rdbpdMJutw+4UfikrElGjAaL00tzMSY/HT0uDzYd4Doq8mnvcaGlywVAvWCx/5pFPbbE07oMLbGkGrH23ypwdXkRHG4vvv2bHXjjI2b2aaCmTt/uScXZyu4LDei/XjhZqBostrS0wOPxoLi4eMD9xcXFsNkGH6Bss9mGPX7u3Ll46aWXUFdXh5/+9Kd499138dWvfhUez+C/LCtXrkROTo58Ky0tjfKdJSe5DB2DaxYBX2lsnj+7+Iddp3Q+G4oVUgm6JMei2npbKbPo8Ypwe7QNFh1uD2x234ex1sEiEAgYr7t4JNweETXr9uD5945xH2kC4LsmpMxiUbYKmUVzIKvP3zn1xGU39MKFC3H99ddjypQpmDdvHt544w3s2LEDmzdvHvT45cuXo6OjQ76dPMlxD5GQG1xiNLMIAPMv8QWL7x9twZmOXp3PhmKBtGfyeSqtVwSAtH7janrd2mY4TvmHjWeaU5CfYdL0tSWmFAOeWjgdt11WBgD477cO4r827ONkAkJrtxNeERAEYIQKv5/SGnpRBBxu/r6pRdVgsaCgAEajEY2NA0uCjY2NsFqtgz7GarWGdTwAjB8/HgUFBTh69OigPzebzcjOzh5wo/B1x3CDi2TsiAzMHJcPUQRe231a79OhGLD7xFkAvmUKakk1CjD690t3aBwsSntel+RaIAj67dluNAh4+OsX4sGvTYIgAOu2ncC3frUNrf7mBkpOTXbf//4jMsxIUWHGaf8vauyIVo+qwaLJZEJFRQXq6urk+7xeL+rq6lBZWTnoYyorKwccDwCbNm0KejwAnDp1Cq2trRg5cqQyJ06D6o3xBhfJgorRAID1O0+yLEHYc6IdADB9rHpNcIIgyB9avRqvnbJ1+ErQI3PU2bklHIIg4NtfGo/nvzUDmeYUbD3Whq8/8z72+AN2Sj5yCVqFTmjA9yVFuvY4a1E9qpeha2tr8fzzz+M3v/kNDh48iDvuuAPd3d1YsmQJAGDx4sVYvny5fPzdd9+NjRs34sknn8ShQ4fwyCOPYOfOnaipqQEAdHV14d5778XWrVvx2Wefoa6uDjfccAMmTJiA6upqtd9OUpOGcsfqmkXJtVNGItOcgs9aezjOI8m1djlxvKUbAHBJqboTE6SdU7QuQ5/xB4tWFZoHIlV1YTE23HkZxhdkoKHDgW/+bz1++U+uY0xGgeYWdYJFoN8uLm5mFtWierB4880344knnsCKFSswbdo07N27Fxs3bpSbWE6cOIEzZwJbtF122WVYt24dnnvuOUydOhV/+MMfsGHDBkyePBkAYDQa8dFHH+H666/H+eefj6VLl6KiogL//Oc/YTar98tI8bFmEfDN3bphWgkAYN32EzqfDelJyipOLMpETnqqqq+l17ZjUnOLNSd2gkUAmFCUhT/XXI5rp1jh9oj40ZsH8e8v7kALy9JJRSpDF2Wp9/uZxi3/VKdJiqimpkbODH7RYE0pCxYswIIFCwY9Pi0tDX/729+UPD0KUTysWZQsmjkGL287gb/tt6Gly6nKfC+Kfbv85c9Lxqg/h1UqhWm9ZtHmb+SKtWARALIsqVjzr5fg/7Z+jh+9eRDvHG7G3NXv4cffmIJ/uSj4OnRKHI3+zKIandAS6Yua1ktAkklcdkOTPnrlYDG2M4sAMHlUDqaOzoHbI+LVHex+T1Y7jrcBAC4Zm6v6a1l0+sCy+TM3sRgsAr51jIsry/B6zeW4oDgLLV0u3P5/u/C9V/agrdul9+mRygKZRfWCxTTOWlQdg0UKiSiKgR1czLEfLALAtyrLAAAvb/0cfRzhkXSaOh1yZnHOxELVXy8t1ffnVOs1i1JmcWSMBouScms2Xr/rcvy/K8fDIAAb9jagatW7+OOuU1zLmMCapH2hVSxDp0sNLuyGVg2DRQqJw+2F9Pc8Iw7K0ABw3cUjkZ9hQkOHA/84OPhe5JS4/ra/EaIITCvNxahc9TuF03RocHG4PTjb4wYQWw0uwZhTjFj+1Ul47Tu+LGNbtwvfX/8hvvm/9dh3ukPv0yMVSN3QWjS4sAytHgaLFJL+86v6z7WKZZZUIxZe6tut54UPjut8NqS1jft8jXNfnazN2jhpkb2WaxYb/c0tllQDctLUbeBR0rTSXLzx3Tm4b2450lKN2PHZWXz92ffx/d9/iNPtHKafKESx/+4tbHCJZwwWKST91ysaDPoN/g3X4soypBgEbD/eho9Otet9OqSR5k4nth7zrVf86mRt5q+mpWq/bqr/2Bw9B3JHItVowB1fPg91378S108tgSgCf9x9Clf9bDN++c9jep8eKaC9xw2XfwlQoYpNhnJmUeMlIMmEwSKFpDtOBnJ/kTXHgq9P9Y3R+eU/mV1MFr/+4Dg8XhHTSnMxZoQ2+yWnmfxrFjUMFhtjdGxOOEpy0/D0oun403cuw+zx+XB5vBidp/0e16Q8qRM6Lz0VphT1wg1pQke3k2sW1cJgkUIiD+SOk/WK/X37S+MAAG9+fAYn23p0PhtSW0ePGy/Vfw4A+M6Xz9PsdfUYnXMmhnZvidb0MXn43bLZ+P3/q0T1RcV6nw4poNEurVdU98uMXjNOkwmDRQpJT5xmFgHgopIcfGliATxeEc+9x/JWovufdz9Fl7MP5dYsVE3SLujQo8FF2upP7Q9jrQiCgJnj8uOupE6D02oGKBtc1MdgkUIifWPLiPGt/oK5w59h+v3Ok/KCa0o89Z+24n/f+xQAcM9Xztd0fa0ecxbV3neXKBq2Dt/vp9pjneQ5i1yzqBoGixSSeM4sAkDl+BGYPiYXzj4vnufi+YR0oMGOu363B6IIfHPGaFRrvEOIHpnFZv/WeQUMFikG2ey+zKJWZehezllUDYNFCklgzWJ8BouCIOC7V08EALxU/1nc70+7Zs0alJWVwWKxYNasWdi+ffuQx69fvx7l5eWwWCyYMmUK3nrrrQE/F0URK1aswMiRI5GWloaqqiocOXJEzbegGK9XxO93nsTN/1uPli4nJo3MxsNfv0jz89CjFNYqBYuZJs1ekyhUNnlNLdcsxjsGixQSKbMYLwO5B/PlCwoxtTQXDrcX//vup3qfTsReffVV1NbW4uGHH8bu3bsxdepUVFdXo6lp8MHjW7ZswaJFi7B06VLs2bMH8+bNw7x587Bv3z75mMcffxxPP/001q5di23btiEjIwPV1dVwOBxava2wONwe7DlxFmveOYqqn7+LH/zhI3Q6+zCzLB+v3D5bl+USFh0yiy1dvu3y1BxLQhSpMxqtqU1LZbCotvj95CdNSRdhvGz1NxhBEPC9qolY8usdeKn+cyydMz4uR46sWrUKy5Ytw5IlSwAAa9euxZtvvokXXngB999//znHP/XUU5g7dy7uvfdeAMBjjz2GTZs24dlnn8XatWshiiJWr16NBx98EDfccAMA4KWXXkJxcTE2bNiAhQsXRnW+f9pzCofOdA64r//mbqIoyrsDiQC8/v/u83rR5xHh8njhcHvQ7fSgvdeNZrsDZ+wO9N8hLtOcgu9eMwG3XTZO1REdQ9G6DO3q86Kj17d7ywgGixSDpNFOanfrS1M62OCiHgaLFBI5WIzjzCIAfPn8Qlxalocdn53FU3VHsPLGKXqfUlhcLhd27dqF5cuXy/cZDAZUVVWhvr5+0MfU19ejtrZ2wH3V1dXYsGEDAOD48eOw2WyoqqqSf56Tk4NZs2ahvr5+0GDR6XTC6QyU8u12e9Bz/sfBJrz50ZmQ3l848tJTMaMsH9eUF+G6qSXI1Ln5Kk3jMnRrt+/f32gQkBtHu7dQchiwFaXqDS7+zKKbaxbVEt+f/KQZadhpvK5ZlAiCgPvmluOmtfX4/c6TWDpnHCYUZep9WiFraWmBx+NBcfHAkTDFxcU4dOjQoI+x2WyDHm+z2eSfS/cFO+aLVq5ciR/+8IchnXPVpKKgezMLX/gPAQIMgi8AMggCUgwCUlMMSEs1It1kRE5aKoqyLRiVm4aCTFNMjVjRes5iq78EPSLDFFe7KlFykLKKaalGZFvUDTU4Okd9DBYpJNJFGM9rFiUzyvJRNakY/zjYiJVvHcSvbrtU71OKO8uXLx+QrbTb7SgtLR302G9MH41vTNfqzPSj9ZpFuROaJWiKQWf6Nbeo/aWODS7qY4MLhUTe7i+O1yz2t/zacqQYBNQdasL7R1r0Pp2QFRQUwGg0orGxccD9jY2NsFoHHxVjtVqHPF76v+E8p9lsRnZ29oBbstP6A6vFP2NxBDuhKQZJmUUtBsan9dsbWuy/mJkUw2CRQtKTQJlFADivMBP/NnssAOCHf9kPt3+z+1hnMplQUVGBuro6+T6v14u6ujpUVlYO+pjKysoBxwPApk2b5OPHjRsHq9U64Bi73Y5t27YFfU46l/SBpVUZmp3QFMvOaDQ2BwispRdFwOGOj7/l8YbBIoVEWrOYFudrFvu7p+p85GeYcKSpCy9+8JnepxOy2tpaPP/88/jNb36DgwcP4o477kB3d7fcHb148eIBDTB33303Nm7ciCeffBKHDh3CI488gp07d6KmpgaAv0v8e9/Dj370I7z++uv4+OOPsXjxYpSUlGDevHl6vMW4JK1ZdHtETb58tHIgN8UweStKDYJF6doDAmPeSFmJkSYi1QW6oRMnWMxJT8X9Xy3HD/7wEVb/4xN87eKRKAnSiBFLbr75ZjQ3N2PFihWw2WyYNm0aNm7cKDeonDhxAgZD4HvgZZddhnXr1uHBBx/EAw88gIkTJ2LDhg2YPHmyfMwPfvADdHd34/bbb0d7ezvmzJmDjRs3wmKJv9FCerH0+8ByuD1INar7XVwaLD8ig2Voij0N7b7dW0o0CBaNBgHmFAOcfV70uDwYoforJh8GixQSadF+IgWLAHDTJaPx+x0nsfPzs3howz788tYZMdVhG0xNTY2cGfyizZs3n3PfggULsGDBgqDPJwgCHn30UTz66KNKnWLSMacYIAi+Uliv24Msi7rjbKQyNBtcKBadOusLFkfnpWvyeukmI5x9Xk2H4icTlqEpJFJmMS01sb5fGAwCVt44BSajAXWHmvD6hw16nxLFKUEQAuNzXOqXoVtYhqYYdupsDwBgdJ421Rpp3SI7otXBYJFC0puAZWjJxOIs3HnVBADAij/vl7v4iMKl5S4ugcwiy9AUW+wON+wO39rBURoFi/Jgbq5ZVAWDRRqWKIoJW4aWfOeq8zBlVA46et34wR8+gtfL8QsUPq0+sLxeEW3dnLNIsem0vwSdn2HSbNcvDuZWF4NFGpbL44XHHzxZEjRYTDUasOqbU2FOMeDdT5rxwgfH9T4likNaZRY7et2Qvs/kpTOzSLElsF5Ru4ZB6dpjGVodDBZpWP2/qaWnJmawCPjK0Q9ddyEA4KcbD2HPibM6nxHFG61mLZ7t8ZWgM80pMKXwzzjFFq3XKwJAhn9veGYW1cG/MjQs6ZuayWhAisrjQPR2y6wxuHaKFW6PiO+8vFtuIiAKhbzln8oNLmd73ACA3HR1O66JIqF1JzTANYtqS+xPflKE3AmdoCXo/gRBwE/nX4zxhRk40+HAd367G84+flOl0ARKYep+YLX7M4ssQVMsktYsjtJwbq1U9epmZlEVDBZpWL3y2JzEDxYBIMuSiue+VYEscwq2f9aGB17bx/1GKSTy6Jw+dTOLbd3+YJEDuSkGnWrXvgzNBhd1MVikYSV6J/RgJhRl4dlbLoFBAP64+xSe+PthvU+J4oAl1fcn1anymsV2fxk6j2VoikH6lKE5Z1FNDBZpWFJJLRnK0P1deX4hfvyNKQCANe98iufe+1TnM6JYJ61Z1KrBhWVoijV2h1v+MqPVjEWgX2aRO7iogsEiDSuRB3IPZ+HMMbi3+gIAwI/fOoRf/vOYzmdEscyi0egcNrhQrDrW3A0AKMoyI9Os3Y5f8tgqNriogsEiDSvQ4JJYW/2F6s6rJuC7V/t2ePnRmwex+h+fcA0jDcrsL0M73OquWWSDC8Wq4y1dAIDxhRmavm4aM4uqYrBIw+pxSw0uyfvrcs9XzkftV84HAKz+xxE88KeP4faov/8vxRdLisZlaDa4UIyRMovjCzM1fd10E4dyqyl5P/0pZA65DJ2cmUXAN1Lnu9dMxKM3XASDAPxu+0ks/tV2tHIOI/UTWLOo8pzFbja4UGySg8UCjTOLqeyGVhODRRpWMs1ZHM7iyjL877dmIN1kRP2xVnz9mfdx8Ixd79OiGCF1QztUns3JBheKVcdapMwiy9CJhMEiDavH7VswnMhb/YXjKxcW4893Xo7xBRnwiCJGZPIDm3yk7Iaao3NEUZS7TdngQrHE6xUDaxYLtC5Dc7s/NSVvXZFClszd0MFMLM7ChprL0dDei6Isi96nQzFCizJ0j8sDl3+9LDOLFEvO2B1wuL1INQqaDuQG+u+exGBRDQwWaVjSxWdhsDhAtiUV2VZmdihALkOrmFmUStAmo4Ff4CimHPevVxyTn44Uo7aFS+4NrS6WoWlYcmaRZWiiIZk1mLMo796SkQpBEFR7HaJwHW3qBKB9JzQQqHyp3VyWrBgs0rAC2/0xEU00FC1G58j7QrMETTFmf4Ov2W/SyGzNX1sqQ7s8XvRxrJniGCzSsJJ1uz+icFk0GMotlaHZ3EKxZp8/WJxcokOw2O/zqYcd0YpjsEjDYoMLUWikBheniqNzOnqlGYvMLFLscPZ5cKTRV4a+aFSO5q9vTjHA4F+V4WCTi+IYLNKw5DmLXLNINCQtuqE7/GsWc9KYWaTY8YmtC31eEXnpqSjJ0X5ChCAI7IhWEYNFGhaHchOFJi1V/TWLUmaRwSLFkn0NHQCAyaNydGu8SvOvq2ewqDwGizQsBxtciEIirVns84qqLbKXgsVsBosUQ/ad9gWLF5VoX4KWpHMXF9UwWKRh9XDNIlFILP2Wajj61AkW7Q4GixR7PpaDRe2bWyTcH1o9DBZpSF6vKH9Ls3DNItGQzCmBP6lqfWCxDE2xxu5wy5nFS8bm6XYeHMytHgaLNCRHv65OZhaJhiYIghwwqrVu0d7r+yDMtnBZCMWGbcfa4BWBcQUZGJWr7TZ//bEMrR4GizSk/guF2Q1NNDy1x+cws0ix5oOjLQCAy84boet5sAytHgaLNCTporOkGmAwcGsxouGoPZjbzgYXijFbPvUFi5dPKND1PAJlaAaLSmOwSEPiVn9E4bGoOD7H4xXR6fSVoZlZpFjQZHfgk8YuCAJQOV7fzCLL0OphsEhD4kBuovCkqTiYu9PfCQ0A2RYGi6S/v+6zAQAuHpWDvAx9dxViGVo9DBZpSL0cyE0UFrOKmUVpvWJaqhGmFP75Jv39cfcpAMC86aN0PhMO5VYT/9rQkKQPPGYWiUJjkbqhVWhwkTqhWYKmWHCksRMfnepAikHA16eW6H06LEOriMEiDYllaKLwWFQshbETmmLJ73eeBAB8+YJCFGSadT6b/mVozllUGoNFGpL0DY1laKLQyN3QKuzgEtjqjw1npK8muwO/3XoCALDw0jE6n40Pu6HVw2CRhtTLMjRRWOQ5iyqUwqSt/phZJL098/ZR9Lo9mD4mF9dMKtL7dACwDK0mBos0JCmdz8wiUWgsKeo3uLATmvRU/2kr1m33ZRXvm1sOQYiNGbzshlYPg0UaUq/LV0pjsEgUGjWHcndwIDfp7ERrD2rW7YbHK2L+JaMxW+fZiv2xDK0eBos0JJahicJjMamXWbSzwUU1a9asQVlZGSwWC2bNmoXt27cPefz69etRXl4Oi8WCKVOm4K233hrwc1EUsWLFCowcORJpaWmoqqrCkSNH1HwLqtt6rBXf+MUHaO124cKR2fjvb0zW+5QGkDaPUGtf9mTGYJGGJJehGSwShUQuQ6swOoeZRXW8+uqrqK2txcMPP4zdu3dj6tSpqK6uRlNT06DHb9myBYsWLcLSpUuxZ88ezJs3D/PmzcO+ffvkYx5//HE8/fTTWLt2LbZt24aMjAxUV1fD4XBo9bYU4erz4t1PmvH//m8nFj63Fa3dLlxUko0XbrtUXp8bK6TPKWYWlceWOhoSu6GJwmNRcQcXu4NzFtWwatUqLFu2DEuWLAEArF27Fm+++SZeeOEF3H///ecc/9RTT2Hu3Lm49957AQCPPfYYNm3ahGeffRZr166FKIpYvXo1HnzwQdxwww0AgJdeegnFxcXYsGEDFi5cGNX5tnQ5cdjWGfLxouj/vxAhioAIX+bTK4ro84jo84pw9XnR6/agy9GHsz0u2OwOHG/pxoEGO5z+zn6DANx8aSkeuu7CmNwCNlCG5ugcpcXe/9oUU3r9H3jMLBKFRlqzqEZHZqDBhX+6leJyubBr1y4sX75cvs9gMKCqqgr19fWDPqa+vh61tbUD7quursaGDRsAAMePH4fNZkNVVZX885ycHMyaNQv19fVBg0Wn0wmn0yn/t91uH/S47cfb8J2Xd4f0/pQwIsOEa6eMxL/NHosLrFmavW642A2tHv7FoSFxuz+i8Kg5OqeTZWjFtbS0wOPxoLi4eMD9xcXFOHTo0KCPsdlsgx5vs9nkn0v3BTtmMCtXrsQPf/jDYc8505yCC4pDC9q+2KgsCAIE//1GgwCjQUCqwYDUFAGWFCOyLCnITTehMMuMshEZuMCahfMKM2Km43koUrDo9ojo83iRYuRKO6UwWKQh9bp96fx0BotEIVGzG1oqQ2cxs5iQli9fPiBjabfbUVpaes5xV5xfiCvOL9Ty1OJC/zWUPW4PshksKob/kjQkKbMYawuZiWKVmnMWu5ycs6i0goICGI1GNDY2Dri/sbERVqt10MdYrdYhj5f+bzjPCQBmsxnZ2dkDbhQ6c4oBBn8ClLMWlcVgkYbENYtE4ZEbXBTuhnZ7vHK2kplF5ZhMJlRUVKCurk6+z+v1oq6uDpWVlYM+prKycsDxALBp0yb5+HHjxsFqtQ44xm63Y9u2bUGfk6InCILceMOOaGXxLw4NSRqdwzI0UWjM/jK0U+EydKcj0OGZaeafbiXV1tbi1ltvxYwZMzBz5kysXr0a3d3dcnf04sWLMWrUKKxcuRIAcPfdd+PKK6/Ek08+ia997Wt45ZVXsHPnTjz33HMAfEHL9773PfzoRz/CxIkTMW7cODz00EMoKSnBvHnz9HqbSSHNZESXs4+ZRYXxLw4NSeoqYxmaKDRqZRY7/ftCp6UauXBfYTfffDOam5uxYsUK2Gw2TJs2DRs3bpQbVE6cOAGDIfBvftlll2HdunV48MEH8cADD2DixInYsGEDJk8ODKn+wQ9+gO7ubtx+++1ob2/HnDlzsHHjRlgsFs3fXzKRt/xzc3yOkhgs0pDYDU0UHnOKOg0unWxuUVVNTQ1qamoG/dnmzZvPuW/BggVYsGBB0OcTBAGPPvooHn30UaVOkUKQzi3/VMGvpzQkbvdHFB61RucwWCQaHveHVgeDRQrK7fHC7fGN/ueaRaLQBMrQSmcWfWXoLHZCEwUlD+ZmsKgoBosUVP/RH1yzSBQaqQzt6vNClPZZUwAzi0TDS0v1XR/cxUVZDBYpKOmbmSAEPgCJaGj9v1g5FcwudjkZLBINh2VodTACoKCkb2bpqca42OqJKBb0/2Kl5PgcuQxtZhmaKJh0qRvaxW5oJWkSLK5ZswZlZWWwWCyYNWsWtm/fPuTx69evR3l5OSwWC6ZMmYK33nprwM9FUcSKFSswcuRIpKWloaqqCkeOHFHzLSQlubmF6xWJQpZqNMDo30ZCyfE5LEMTDY+ZRXWoHiy++uqrqK2txcMPP4zdu3dj6tSpqK6uRlNT06DHb9myBYsWLcLSpUuxZ88ezJs3D/PmzcO+ffvkYx5//HE8/fTTWLt2LbZt24aMjAxUV1fD4XCo/XaSSg+3+iOKSGB8jnIfWIF9oZlZJApGbnDhmkVFqR4srlq1CsuWLcOSJUtw4YUXYu3atUhPT8cLL7ww6PFPPfUU5s6di3vvvReTJk3CY489hksuuQTPPvssAF9WcfXq1XjwwQdxww034OKLL8ZLL72EhoYGbNiwQe23k1Qc/mCRndBE4ZHH56iwZjGTmUWioNgNrQ5V/+q4XC7s2rULy5cvl+8zGAyoqqpCfX39oI+pr69HbW3tgPuqq6vlQPD48eOw2WyoqqqSf56Tk4NZs2ahvr4eCxcuPOc5nU4nnE6n/N92uz3oOZc/9NeQ3hsACPCVmgQBMAgCBAEwGgSkGAwwpxhgTjUgw5SCnLRUFGSaMDovHROLM1ExNg+j89JDfh29cMYiUWQsKmQWA6NzGCwSBSN9UWMZWlmq/tVpaWmBx+ORt0ySFBcX49ChQ4M+xmazDXq8zWaTfy7dF+yYL1q5ciV++MMfhnTOSu+6EMwFxVn4t9ljcFNFacyuCeRWf0SRMauQWZTWLGYzWCQKKt3kuz4YLCorKf7qLF++fEC20m63o7S0dNBj37/vqmGf74uj00QRECHC4/Xd+rwiXH1eONwedLv60N7jRlOnEyfaenCgwY6PT3fgcGMnHvrzfvzy/eN4csFUzCjLj+o9qqGHZeiY09bWhrvuugt/+ctfYDAYMH/+fDz11FPIzMwM+hiHw4Hvf//7eOWVV+B0OlFdXY1f/OIXA75wffe738UHH3yAffv2YdKkSdi7d68G7yZxqbFmkUO5iYYXWLPIbmglqRosFhQUwGg0orGxccD9jY2NsFqtgz7GarUOebz0fxsbGzFy5MgBx0ybNm3Q5zSbzTCbzSGdsxbl4Y4eNzbsPY21736Kz1t7cPNzW7HmXy/B3MmD/5voxcFu6Jhzyy234MyZM9i0aRPcbjeWLFmC22+/HevWrQv6mHvuuQdvvvkm1q9fj5ycHNTU1ODGG2/EBx98MOC4f//3f8e2bdvw0Ucfqf02Ep6UWVSyUtHFbmiiYaVxzaIqVG1wMZlMqKioQF1dnXyf1+tFXV0dKisrB31MZWXlgOMBYNOmTfLx48aNg9VqHXCM3W7Htm3bgj5nrMlJT8Wtl5Xhb/dcga9NGQmPV8Rdv9uNLUdb9D61AXrZDR1TDh48iI0bN+KXv/wlZs2ahTlz5uCZZ57BK6+8goaGhkEf09HRgV/96ldYtWoVrr76alRUVODXv/41tmzZgq1bt8rHPf3007jzzjsxfvx4rd5OQpPWLDpVGJ2TaWawSBRMGtcsqkL1buja2lo8//zz+M1vfoODBw/ijjvuQHd3N5YsWQIAWLx48YAGmLvvvhsbN27Ek08+iUOHDuGRRx7Bzp07UVNTAwAQBAHf+9738KMf/Qivv/46Pv74YyxevBglJSWYN2+e2m9HUdmWVDy1cBq+NmUk3B4R/7n+Q7njMRZIFxsbXGJDfX09cnNzMWPGDPm+qqoqGAwGbNu2bdDH7Nq1C263e0BDWHl5OcaMGRO0ySwUTqcTdrt9wI0CLApnFr1eEV0ujs4hGg5H56hD9a+oN998M5qbm7FixQrYbDZMmzYNGzdulNdLnThxAgZDIGa97LLLsG7dOjz44IN44IEHMHHiRGzYsAGTJ0+Wj/nBD36A7u5u3H777Whvb8ecOXOwceNGWCwWtd+O4lKMBvxswcX46HQ7Trb14om/HcYj11+k92kBCJShuWYxNthsNhQVFQ24LyUlBfn5+UGbu2w2G0wmE3JzcwfcP1RDWCjCaRpLRmaFM4vdrj55rTTL0ETBcSi3OjTZwaWmpgaff/45nE4ntm3bhlmzZsk/27x5M1588cUBxy9YsACHDx+G0+nEvn37cO211w74uSAIePTRR2Gz2eBwOPCPf/wD559/vhZvRRXpphSs/MbFAID/2/o5Trf36nxGPhydo437778fgiAMeQs2PUAvy5cvR0dHh3w7efKk3qcUU5TOLEolaJPRwGUhREOQuqG5ZlFZ/IoaI+ZMLEDl+BGoP9aK/6v/HPd/tVzvUwrs4MLMoqq+//3v47bbbhvymPHjx8NqtZ6z81FfXx/a2tqGbBhzuVxob28fkF0cqsksFOE0jSUjpbuh5fWKzCoSDal/GVoURQiCoPMZJQb+5YkhSy4vQ/2xVvxu+wl895oJ8jckvUiZxXRmMlRVWFiIwsLCYY+rrKxEe3s7du3ahYqKCgDA22+/Da/XOyBb319FRQVSU1NRV1eH+fPnAwAOHz6MEydOxE1DWDxSegeXLicHchOFQrr2PF4RLo8X5hR+filBkzI0heaaScUozU9DR68bb350Ru/Tkbf74+ic2DBp0iTMnTsXy5Ytw/bt2/HBBx+gpqYGCxcuRElJCQDg9OnTKC8vx/bt2wH4djdaunQpamtr8c4772DXrl1YsmQJKisrMXv2bPm5jx49ir1798Jms6G3txd79+7F3r174XK5dHmv8c6S6l+zqHRmkZ3QREPqv8aepWjl8C9PDDEaBHxj+mg8XXcE/zjYiAUzBh8crhXu4BJ7Xn75ZdTU1OCaa66Rh3I//fTT8s/dbjcOHz6Mnp4e+b6f//zn8rH9h3L39+1vfxvvvvuu/N/Tp08H4Ntes6ysTN03lYCkbIZSmcVup+9azGCwSDSkVKMBqUYBbo+IHpcHubG/s25c4F+eGFM1qQhP1x3BP4+0wOH26BqoBXZw4a9JrMjPzx9yAHdZWRnEL2wxZLFYsGbNGqxZsybo4zZv3qzUKRICmUWl1izKZWgGi0TDSks1wu3pY0e0gliGjjGTS3JQlGVGj8uDrcdadT0XB7uhiSKidGaxi5lFopBJCQ4lt9tMdgwWY4zBIOCaSb5Zem8fahrmaHXJo3NM/DUhCofimUV2QxOFjLMWlccoIAZdXe4bWP6+ztv/9XC7P6KISJlFpYLFbhcbXIhCFdjyL3Z2RIt3DBZjUMXYPADAseZudPS4dTsPB9csEkXELHVDK1SGZjc0UejkWYvMLCqGwWIMys8wYewIXwvXh6fadTsP7uBCFJnADi4KZRb9e8ZzzSLR8FiGVh6DxRg1rTQXALD3ZLsur+/q86LP6+uqZbBIFJ7A3tBKNbj4gkV2QxMNT8os9rDBRTEMFmOU3sFib7+LjEO5icKjdGaxi5lFopAF9ofmmkWlMFiMUf2DxS/OzdOC9CFnNAhINXJvTaJwBPaGViiz6JCCRX5xIxoOy9DKY7AYoy4syYbJaEBbtwunzvZq/vrSwuC0VCM3YicKk9J7Q0vd0Nwbmmh4GQwWFcdgMUaZU4yYUJQJADhs69T89Xu4LzRRxORgUeE5iyxDEw0vzV+G5ugc5TBYjGFSsHi0uUvz12YnNFHk1Gpw4egcouGlM7OoOAaLMUwOFpu0Dxa51R9R5KTMosvjhccb3Zpjt8crB50MFomGxzmLymOwGMP0DBbl3VtYhiYKm5RZBHxjqKIhzVgEWIYmCoXUDd3NYFExDBZjmBQsftrUpXlHtFSGTmdmkShs/YPFaMfnSLu3mFMMSDXyTzbRcAKZRa5ZVAr/8sSwshEZMBoEdDr70Gh3avraDja4EEUsxWhAisE3RcDRF12wyE5oovBwdI7yGCzGMFOKAWPzfdv+aV2KlrrIuGaRKDKBjujoytDshCYKj1QR45pF5TBYjHHnyesWtR2f0+v/gGNmkSgyllT/YO4oM4vshCYKj/TFqptlaMUwWIxx8rrF5m5NX5ejc4iiY06RtvyLMrPIrf6IwsIytPIYLMY4qQx96myPpq8rj85hZpEoImZ/ZjHawdzdzCwShYWjcwba9flZOKOscDBYjHGj86RgUdst/7hmkSg6cmYxytE5Ujc0g0Wi0Eijc/q8YtSjq+Ldxn1nsPC5etSs2wO3J/J/CwaLMW50XhoAX7Co5ficXhfXLBJFw6JYZtH3eJahiUKT3u9zK5m3/Hv9wwbcuW4P3B5xwDivSDBYjHEjcy0QBN8awrZul2avyx1ciKJjUSiz2OV0A+DoHKJQpRoNSDX6Rlcl67rFjfvO4J5X98LjFXFTxWg8tXB6VHNaGSzGOHOKEcVZFgDASQ1L0SxDE0VHWrMY7VDuLimzaGKwSBQq6bMrGYPFLUdbcNfv9sDjFTH/ktF4fP7FMPrnvkaKwWIcCJSitWty6WWDC1FUpMyiU6Ht/jLMvBaJQiUt20i2JpdDNjv+3//tgtsj4topVjx+08UwRBkoAgwW40L/dYtakecsMrNIFBHl1iyywYUoXFKiI5lmLbZ2ObH0xZ3odPZh5rh8rPrmtKgzihIGi3Eg0BGtXWaR2/0RRcesUGaRcxaJwpds43P6PF7cuW43Trf3YuyIdDz3rQp5FyklMFiMA3pkFnvc/jWLDBaJImJRaM2itOaKmUWi0KWn+q6XZFmz+OSmT7D1WBsyTEb8cvEM5KabFH1+BotxQI9Zi/LoHJahiSJiTpV2cFGmDJ3OL25EIUs3Sw0uiV+GfudwE/5n86cAgJ/edDEmFmcp/hoMFuNA/wYXrWYtcnQOUXQs/rlmLEMTaS89Sbb8a+ly4t71HwEAFleOxXUXl6jyOgwW44A1xzc6x+H2oqPXrfrriaIofxtjNoMoMkplFlmGJgpfWhKUoUVRxAOvfYyWLifOL87EA9dOUu21GCzGAUuqEXnpqQAAm92h+uu5PF54/QlMMzOLRBGRdkxwuCPPLIqiKHdzpnN0DlHIAg0uiVuGfv3DBvz9QCNSjQJW3zxd0YaWL2KwGCeKs33ZRVuH+sFi/+4xZhaJIiP94Xb2RZ7Z6HF5IK08YWaRKHSBNYuJmVls7XLikdf3AwBqrpqIC0uyVX09BotxQipFN2qQWZQurlSjENX2QETJzCKXoSPPLEpZRUHg+mGicEjd0N0JGiz++K1DONvjRrk1C9+56jzVX4+RQJywyplFp+qv1cvmFqKomeUGl8g/rLr7bfUnCMoM1yVKBolcht56rBV/3H0KggCsvHGKJkkdBotxokgKFjXILEpl6HTuRUsUMUUyi9zqjygiaQnaDd3n8crl50Uzx2D6mDxNXpfBYpyQMotNGpahOZCbKHKBBpdoMoscm0MUCekLVm+U0whize92nMQhWydy01Pxg+oLNHtdBotxwppjBqBNZlEam8MyNFHkpMyiK4o5i9KaRTa3EIVHGp0jfeFKBB29bqz6+2EAQO1Xzld8l5ahMFiME1I3tBYNLlImhJ3QRJFTYru/LievRaJIZCRgN/Tadz/F2R43JhRl4l9njtH0tRksxgmpDN3S5YoqUxEKlqGJomdO8a9ZjOJ67XEys0gUCWnpRneCNLic6ejFC+8fBwDcN7ccKRpPKmGwGCfy0k1INfq6IZs61c0uysEiy9BEEZMyi86oMotcs0gUiQx/g2aPMzEyi8+8fRTOPi8uLctD1aQizV+fwWKcMBgEFGVpU4pmGZooenI3dDRrFp2cTEAUCenzKxEyiyfbevD7HScBAPdWl+syRovBYhyRBnOrPWuRZWii6End0B6viD5PZAFjj9zgwmuRKBxSNt7h9sIj7V8bp555+wj6vCK+NLEAM8fl63IODBbjiFWjJpdAGZrZDKJI9d+nNdLsIsvQRJHpXxmL5+ziybYevLb7NADgnq+cr9t5MFiMI4VZvvE5LV3qZhZZhiaKnqnfAvRIO6K72eBCFBFzigEpBl+5Np7XLf7ve5+izytizoQCXKLRAO7BMFiMI1Kw2NypdhnaP2eRwSJRxAwGASZ5y7/IMovd3E2JKCKCIMT9usUmuwO/33kKAHDnVRN0PRcGi3GkMNMfLKqcWWQ3NJEyLFHu4sLt/ogiJy3fiNfM4m/qP4Orz4tLxuRi9nh91ipKGCzGEa0yiyxDEynD7P/C5Yxwf2iWoYkiF8+ZxW5nH3679QQA4PYrztOlA7o/BotxRLsyNLuhiZQg7+LSF1lmQ2pwYRmaKHzSl6x43PJv/c6T6Oh1o2xEOr5yYbHep8NgMZ5IwWJrtwteFUcBsAxNpAyLtItLhGVo6VpkZpEofNKXrO442/LP6xXx4pbPAABL54yD0aBvVhFgsBhX8jNMEATf3LazPS7VXqeXi+qJFGFOja7BpYtrFokiJu8PHWeZxXc/acZnrT3IsqRgfsVovU8HAIPFuJJqNCA/3QRA3SaXXjfL0ERKkDKLkWz5J4pivwYXfnEjCle8ZhZ/7c8qLry0NGaSNgwW40xBpvrrFlmGJlKGlFl0RNDg4uzzQlptwmCRKHzxmFn8rKUb733SDEEAvjW7TO/TkTFYjDNaNLn0uqRF9QwWiaIhZxYjaHDpvyg/nV/ciMKW4c/KdcVRN/Tvtvs6oK88vxBjRqTrfDYBDBbjjNrBoiiKchmawSJRdKQt/yLJLHY7A9ehIQYWuBPFm/Q4m7Po7PNg/S7fEO5bZo3V+WwGYrAYZ9QOFvuXviwMFomiYpZ3cIkgs+jiekWiaGTE2ZzFv+1vRFu3C9ZsC666oFDv0xmAwWKcUXsXl95+C4FZ+iKKjjmqzKI/WOSXNqKIxFtm8fc7TgIAvjljNFKMsRWexdbZ0LDUzixKJWiT0RBzv6xE8cYcxXZ/3BeaKDrxlFk8dbYHH3zaAgBYMKNU57M5F6OBOKN2sCh1Qks7TxBR5KQ1i5HMWeRWf0TRkfeGjoPROX/cdRqiCFx23giU5sdOY4uEEUGcGZHpm7PYonIZmtkMoujJ2/1FklmUtvrjQG6iiEjd0LG+3Z8oivjjbl9jy4IZsTGE+4sYLMYZac7i2R43+jyR7QoxFHZCEyknum5oNrhooa2tDbfccguys7ORm5uLpUuXoqura8jHOBwO3HnnnRgxYgQyMzMxf/58NDY2DjhGEIRzbq+88oqab4W+QPqiFetl6N0n2nGirQfpJiOqL7LqfTqDYrAYZ/LSTZCmaLR1K7/lX4//orKwuYUoahZpzWJE3dC+x7DBRV233HIL9u/fj02bNuGNN97Ae++9h9tvv33Ix9xzzz34y1/+gvXr1+Pdd99FQ0MDbrzxxnOO+/Wvf40zZ87It3nz5qn0LmgwUmYx1htcNuw5DQCYe5E1Zqt6DBbjjNEgID9DvY7oQBmaH1CxSI0syIcffohFixahtLQUaWlpmDRpEp566im130pSkNcsRlCG7pGH48fmh0ciOHjwIDZu3Ihf/vKXmDVrFubMmYNnnnkGr7zyChoaGgZ9TEdHB371q19h1apVuPrqq1FRUYFf//rX2LJlC7Zu3Trg2NzcXFitVvlmsVi0eFvklxEHmUVXnxdvfOT7XZs3fZTOZxMcg8U4VCCvW1Qjs8h9oWOZGlmQXbt2oaioCL/97W+xf/9+/Nd//ReWL1+OZ599Vu23k/CkYLE3ojWLvsewwUU99fX1yM3NxYwZM+T7qqqqYDAYsG3btkEfs2vXLrjdblRVVcn3lZeXY8yYMaivrx9w7J133omCggLMnDkTL7zwAkRRHPJ8nE4n7Hb7gBtFTsosOtxeeLxD/9vr5f2jzTjb40ZBphmXnTdC79MJin+F4lBhlhmHbJ1oUaEjWvpQ477QsUfKguzYsUP+cHvmmWdw7bXX4oknnkBJSck5j5GyIOvWrcPVV18NwFcamzRpErZu3YrZs2fj3//93wc8Zvz48aivr8drr72Gmpoa9d9YAlNizSIbXNRjs9lQVFQ04L6UlBTk5+fDZrMFfYzJZEJubu6A+4uLiwc85tFHH8XVV1+N9PR0/P3vf8d3vvMddHV14bvf/W7Q81m5ciV++MMfRv6GaID+1063qw/ZllQdz2Zwb3x4BgBw3cUjY3pcXeyeGQU1IkO9juge7hoRs9TOgvTX0dGB/Pz8oD9nBiQ0UXVDuzg6J1L333//oA0m/W+HDh1S9RweeughXH755Zg+fTruu+8+/OAHP8DPfvazIR+zfPlydHR0yLeTJ0+qeo6JzmQ0IMW/yD8W1y063B78/YBvSdDXLh6p89kMjX+F4pDUEd2qSoML1yzGKjWzIP1t2bIFr776Kt58882g58IMSGgCmcXIy9Bcsxi+73//+7jtttuGPGb8+PGwWq1oamoacH9fXx/a2tpgtQ7elWq1WuFyudDe3j7gumpsbAz6GACYNWsWHnvsMTidTpjN5kGPMZvNQX9G4RMEAekmI+yOPnTF4Picdz9pRpezD9ZsCyrG5Ol9OkNiZjEOFfgHc6tRhpaCRWYWtRMLWRDJvn37cMMNN+Dhhx/Gv/zLvwQ9jhmQ0CgyOodf3MJWWFiI8vLyIW8mkwmVlZVob2/Hrl275Me+/fbb8Hq9mDVr1qDPXVFRgdTUVNTV1cn3HT58GCdOnEBlZWXQc9q7dy/y8vIYDGosUx7MHXvB4lsf+0rQX7t4JAzSmJMYxYggDhWouD+0vE6KH1CaiZUsyIEDB3DNNdfg9ttvx4MPPjjk+TADEpq0aDKL/OKmukmTJmHu3LlYtmwZ1q5dC7fbjZqaGixcuFBeA3z69Glcc801eOmllzBz5kzk5ORg6dKlqK2tRX5+PrKzs3HXXXehsrISs2fPBgD85S9/QWNjI2bPng2LxYJNmzbhxz/+Mf7zP/9Tz7eblDItKUAH0OWIrWDR1efF2wd9f8+vnRKbsxX741+hOKRmNzRH52ivsLAQhYWFwx7XPwtSUVEBILwsyPz58wEMngXZv38/rr76atx666347//+bwXeFQHRrVkMrB/mtaiml19+GTU1NbjmmmtgMBgwf/58PP300/LP3W43Dh8+jJ6eHvm+n//85/KxTqcT1dXV+MUvfiH/PDU1FWvWrME999wDURQxYcIErFq1CsuWLdP0vVEgs9gZY2XoLZ+2oNPZh8IsM6aXxnYJGmCwGJekzKIaDS7dnO0Ws9TKguzbtw9XX301qqurUVtbK69lNBqNIQWxFJxchu7zQhRFCELopSbu4KKN/Px8rFu3LujPy8rKzhl5Y7FYsGbNGqxZs2bQx8ydOxdz585V9DwpMtL1E2tb/v1tv+/vbPVFxTFfgga4ZjEuFfrXLLZ1u+BVeHZUYM0isxmx6OWXX0Z5eTmuueYaXHvttZgzZw6ee+45+efBsiDXXXcd5s+fjyuuuAJWqxWvvfaa/PM//OEPaG5uxm9/+1uMHDlSvl166aWavrdEZEnxXUcerwi3J7xrVWpwyeAXN6KIZVl8108sNbh4vCL+vt/XBR2r2/t9Ef8KxaF8/+gcj1dEe69b/m8lSN++0lL5qxGL1MiCPPLII3jkkUeUPE3ys5gC38cdfR6YUkL7fu7xitynnUgBchk6htYs7j15Fq3dLmRZUjB7fOwO4u5P1cwiN2hXR6rRgNx033BRpUvRzCwSKcdkNECqPIezbrF/5ybL0ESRi8Uy9D/8jS1fvqAIqTE8iLs/Vc+SG7SrR163qPD4nMCcRX5AEUVLEAS5FO0MY3yOVII2GgSYQ8xGEtG5ssyxV4auO+hLgFVNKhrmyNihWkSg1tZkEmmD9mRVkGnC0Sblx+ewA5NIWZZUA3rdnrD2h5YazTJMxrCaYohooExpzWKMlKFPtvXgk8YuGA0Cvnx+/ASLqn1ljaUN2hNxa7JAR7Sy43PkzCLXLBIpIpJdXNgJTaSMjBgbnfP2IV8JesbYPOSkx95e1cGo9pcoljZoT8StydQYn+P1ioFgkZlFIkWkRbCLS2CrP16HRNHIjLE1i5sP+4LFq8vjJ6sIRJBZjIWtycLdoD0RtyaTBnO3Khgs9i+TcVwHkTLMEWQWpeUgmcwsEkUllkbnONwe1B9rBQBceUF8zbAN+y9RrGxN1t9wG7Qn4tZkapShpayiIAR2niCi6EjXUjhrFrucHI5PpAQp8RELaxa3H2+Dw+2FNduCC4qz9D6dsIT9lygWtib7omTcoF2NMrSUzUhP5aJ6IqVI3dDhZRa5LzSREjJjKLO4+XAzAODK8wvj7jNWtb9E3KBdXQVZyo/OkddJ8QOKSDFppkhG53AqAZESssy+JpJYCBbfO+IPFuOsBA2ovIMLN2hXj7RmsaXLFfaes8H0ugPjOohIGVIZ2tEXfhmamUWi6EhfuHpcHni8Iow67cN8pqMXR5u6YBCAy88r0OUcoqHqXyJu0K4eqQzt8nhhd/QhJy36Fnwps5jGdVJEipHK0L2uCMrQ/OJGFBWpDA345pdmW/QZV/PBUV9jy5TRuXE1MkfCLoY4ZUk1yp2SSnVE97iYWSRSmjmC0TnMLBIpw5xihMm/pZ6eTS7v+0vQcybEx17QX8RgMY71L0UrgWsWiZQnz1kMowwtrVnk6Byi6EmlaL3WLYqiiPf9mcXLJ8RfCRpgsBjXlO6I7nFLu7cws0ikFHnNIndwIdKFVIru1Cmz+EljF1q6nLCkGlAxNk+Xc4gWg8U4pniwKM12YwcmkWIi2+6PO7gQKSXT3xGt1y4u9Z+2AAAuLcuHOSU+r2kGi3GsIMtfhlZofE63vKie2QwipQQyi2GMzuEOLkSKydS5DL31WBsAYPb4+FyvCDBYjGsjMnyZxWaF1iz2uphZJFJaWgSZRTa4EClH+tKlR4OL1yti63HfekUGi6SLwixly9BSZjE9lR9QREqJZG9oNrgQKSfTot9g7sONnWjvcSPdZMTFo3M0f32lMFiMY0oHiz3cNYJIcdKaxXD2hu5xcrs/IqXoWYau/9SXVZxRlo9UY/yGXPF75iQ3uDQrtGZRGgSczjWLRIqxpIS3ZlEURXnNImeeEkVPLkPrECxuk0vQ+Zq/tpIYLMaxoqxAsPjFnXAiIe8awcwikWKkvaFDLUP3uj3w+i9nZhaJoid1Q3c63Jq+riiK2PnZWQDArHEMFkknUmbR2edFpwLfmKRsRhrnLBIpRipDO/tCyyxK2Q9B4OgcIiVkp/m+dNk1bnD5tLkbrd0umFMMmDIqV9PXVhqDxTiWZgps+afE+ByukyJSXrh7Q8vXoSkFgiCodl5EyULaD9req21mccdnvpE500pzYUqJ73Arvs+e5CYXJdYtdrEDk0hx8pzFELf762KjGZGistP8waLGmcUdx33B4sw4L0EDDBbjXqHU5KJARzRnuxEpL9wdXOSt/thoRqSIbGm7P40zi9v9mcVLyxgsks7k8TlRZhZFUZSDxSwLP6SIlBIIFr0hNaLJndD80kakiEBmUbtgsdHuwKmzvTAIwCVxuh90fwwW41xBpm/Lv2gzi84+Lzz+Fkx+SBEpJ61fk0oo43O6nZxKQKQkPcrQuz73dUGXW7MTYmkXg8U4p9SaxU5Hvw5MdkMTKab/dIEe1/AfVty9hUhZUrXM1ecNayelaEjBYkUCZBUBBotxL7CLS3T7Q/dfJ2UwsAOTSClGgwCzvxOyJ4SOaK4dJlJWpikF0mABrUrRDBYppii1iws7oYnUkx7GYG6pDM2dlIiUYTAIyPJ/ttl71S9FO9we7G/oAABcMobBIsUApcrQHNdBpB4p8AslsyiVqjN5LRIpRssml32nO+D2iCjINKM0P03119MCg8U4FyhDO+H1Rr7lX5d/zWKmf3gpESlHanJhGZpIH1oO5pZK0JeMyU2YwfoMFuPciAxfsNjnFdEexUXQzWwGkWqkJpdeNxtciPSg5ZZ/e0+2AwCmJ0gJGmCwGPdMKQbkZ/jG5zR1OiJ+Hqkbmh9QRMoLL7PINYtESpMyi50alKEDwWKu6q+lFQaLCUDaxaXJHvm6RZa+iNSTHkaw2OPi+mEipclrFlVucLF1OHCmwwGDAEwZlaPqa2mJwWICKMr2B4tRNLlIpa8sBotEipOCxd4QgkWWoYmUJ81aVLvBZe9J33rF84uzEir5wmAxAUhNLkqUoRPpl5soVqSlht4NzSw/kfK0anDZk4AlaIDBYkIoyrIAiK4MLWczuC80keLkzGIIcxY585RIeVpt+bf3RDsAYHpp4jS3AAwWE0KRArMW+QFFpJ5AGXr4DyppjFUWv7gRKSZbKkOrmFn0eEV8fNo3jHtqaa5qr6MHBosJILBmMfIyNINFIvWE2g3t8Yro9h/Da5FIOVJmUc1u6E+bu9Dj8iDdZMSEokzVXkcPDBYTgFyGViCzyHVSRMoLtcGlu1/mkUtCiJQjr1lUsQz9oX+94uSSHBgNiTGMW8JgMQFIZegmuxOiGNkuLuyGJlKPNJR7uMyiVII2GQ0wp3B0DpFS5KHcKpahPzrlK0FfPDpxRuZIGCwmAKkM3ev2yBnCcHWxG5pINWnS3tDDNLh0sdGMSBVSZrFD1WCxHQBwcYKtVwQYLCaEdFOKvL4p0lI0P6SI1BNqgwt3UiJSR066L1h09nnhCGEqQbhcfV4cPNMJAJjKzCLFqsKsyHdxEUWRDS5EKkoLcXQOr0MidWSZU5DiX0d4tsel+PMfstnh8niRm56KMfnpij+/3hgsJggpWGzuCj9Y7HV74PUvdeSHFJHy0sNcs8gMP5GyBEFArj+7eLZb+VK0tF5xyqgcCEJiNbcADBYTRnG2NJg7/PE5UjZDEALlMiJSTrp/zeJw3dBdTt+HGBvNiJSXm24CALSrkFncdzoQLCYiBosJotifWWyMJFiUshmmlIT8RkSkt1DnLHYys0ikmnx/sHi2R/nM4scMFikeWHN8mUVbBGsWu52+DzB2QhOpI9Q5i1yzSKQeuQytcGbR4fbgsM3X3DIlAZtbAAaLCaPIX4aOJLNo90+05/ZiROqQgkWXx4s+jzfocVyzSKSePJXK0IdtnejzishLT8Wo3DRFnztWMFhMENYogkVp7lSOfzskIlKWJTWwFnioWYtdHI5PpJrcDCmzqGwZ+iN/CXpygja3AAwWE0ZxdmDNYri7uNgZLBKpypxigLT711Cl6E6WoYlUkyevWVQ2s7jvVGKvVwQYLCYMqRva4fbC3hveLi5SZjGbwSKRKgRBCKkjWipDZ1l4LRIpLc+/ZrFd4czivobE3eZPwmAxQVhSjfLiXVuYpWiWoYnUF0pHNHdSIlKPNDqnrVu5zKKzz4NPGn3NLReVMFikOFCcFdm6RanBhZlFIvXIHdHu4Jl/ObPIMjSR4tRocPnE1gW3R0RueipG5yVmcwvAYDGhFMvjc8LNLPo+oLKZzSBSTVoIu7gws0iknrx05RtcpBL05JLEbW4BGCwmlGJ5f2iWoYliTXoIZehOf5afDS5EypPK0HaHGx5veI2gwUg7t1w0KluR54tVDBYTiDXCzCK7oYnUN1yDiyiKzCwSqUha1y+KgSRJtBJ9mz8Jg8UEUizPWgxvFxc7u6GJVDdcg0uPywMp2ZFl5rVIpLRUo0HefEKJ8TlujxcH/Tu3TE7g5haAwWJCKY5wMDfL0ETqk0rL3c7BG1ykrKLRIMCSyj/NRGpQssnlaFMXXH1eZJlTMCY/Perni2X8i5RARvrL0Gc6Qg8WRVGUu6EZLBKpRwoWO4MEi52OwEDuRF4oT6QnucmlO/oydP/1igZDYl+zDBYTiBQstnQ54eoLvv9sf71uD9weX+2LZejY19bWhltuuQXZ2dnIzc3F0qVL0dXVNeRjHA4H7rzzTowYMQKZmZmYP38+Ghsb5Z+3trZi7ty5KCkpgdlsRmlpKWpqamC329V+O0lFKn9JTSxf1MXdW4hUJ89aVCCzuL/B9zcy0UvQAIPFhJKfYYIpxQBRDL0ULe32YjQIyDAZhzma9HbLLbdg//792LRpE9544w289957uP3224d8zD333IO//OUvWL9+Pd599100NDTgxhtvlH9uMBhwww034PXXX8cnn3yCF198Ef/4xz/wH//xH2q/naQiNa1IsxS/SAois9jcQqSagkzf1JCWrvDW9g9mX789oRMd/yolEEEQMDLHgs9be3Cmw4HSENZQ9F+vyNJXbDt48CA2btyIHTt2YMaMGQCAZ555Btdeey2eeOIJlJSUnPOYjo4O/OpXv8K6detw9dVXAwB+/etfY9KkSdi6dStmz56NvLw83HHHHfJjxo4di+985zv42c9+ps0bSxLSFn6dQYJFbrtJpL5C/4i55s7ogkWPV8SBM77M4kUliT02B2BmMeEE1i32hnS8/AHFbEbMq6+vR25urhwoAkBVVRUMBgO2bds26GN27doFt9uNqqoq+b7y8nKMGTMG9fX1gz6moaEBr732Gq688sqg5+J0OmG32wfcaGjSrixdQdYsSvvV5jJYJFKNFCy2dEVXhj7e0o0elweWVAPGF2YqcWoxjcFiginJ8W031NAeahmazS3xwmazoaioaMB9KSkpyM/Ph81mC/oYk8mE3NzcAfcXFxef85hFixYhPT0do0aNQnZ2Nn75y18GPZeVK1ciJydHvpWWlkb2ppLIcGsWOZWASH2BzGJ4U0O+aL9/55YLR2bDmODNLQCDxYQzMjfCzCI/oHRz//33QxCEIW+HDh1S/Tx+/vOfY/fu3fjzn/+MTz/9FLW1tUGPXb58OTo6OuTbyZMnVT+/eDdcNzS/uBGprzBTmTL0x6eSZ70iwDWLCcfqzyyGOj6HwaL+vv/97+O2224b8pjx48fDarWiqalpwP19fX1oa2uD1Wod9HFWqxUulwvt7e0DsouNjY3nPMZqtcJqtaK8vBz5+fn40pe+hIceeggjR44853nNZjPMZnNob5AAhL5mkcEikXqUWrMo7wnNYJHiUUmYaxY5Y1F/hYWFKCwsHPa4yspKtLe3Y9euXaioqAAAvP322/B6vZg1a9agj6moqEBqairq6uowf/58AMDhw4dx4sQJVFZWBn0tr9c3esnpjL5jkHyyhumGloPFdF6LRGqRgkW7ow8OtweW1PCngHi9IvafTp6xOQCDxYQzUsoshrhmkdmM+DFp0iTMnTsXy5Ytw9q1a+F2u1FTU4OFCxfKndCnT5/GNddcg5deegkzZ85ETk4Oli5ditraWuTn5yM7Oxt33XUXKisrMXv2bADAW2+9hcbGRlx66aXIzMzE/v37ce+99+Lyyy9HWVmZju84sUjBom+2qRepxoGrgHgtEqkv25ICU4oBrj4vWrqcGJ0X/s4rn7f1oNPZB1OKAROLE7+5BeCaxYRT4l+z2NrtgsM9+B60/XX08AMqnrz88ssoLy/HNddcg2uvvRZz5szBc889J//c7Xbj8OHD6Onpke/7+c9/juuuuw7z58/HFVdcAavVitdee03+eVpaGp5//nnMmTMHkyZNwj333IPrr78eb7zxhqbvLdFl9Bu2PdiWf+28FolUJwhC1OsWpfmKk0Zmn/OlL1Exs5hgctJSkZZqRK/bA1uHA2UFGUMe39LtGx8wIsOkxelRlPLz87Fu3bqgPy8rK4MoigPus1gsWLNmDdasWTPoY6666ips2bJF0fOkc6UaDfK12enok3eSkDCzSKSNwiwzTrf3Rh0sTk6C+YqS5AiJk4ggCHJHdEP78OsWW/1T7KWp9kSknsD4nHMzi+yGJtKG3OQS4S4uUnPLlCRpbgEYLCYkaQ3GqZCCRX9mMZOZRSK1ZQaZtejxivJIHQaLROqKpiNaFMWkG5sDMFhMSKPzfE0up9p6hjxOFEW0djOzSKQVaXzOF3dxkbKKAMdYEaktmjWLn7f2wO7wNbecX5yl9KnFLAaLCahUyiyeHTqzaO/tg9vjW9+WzzWLRKqTtvz7YhlaWq+YYTImzYJ5Ir1Ek1n8qF9ziyklea7V5HmnSUTOLA4TLErrNbLMKRHNmiKi8MhrFp2DB4tfbHohIuVJwWJjBMHix6faAQBTRydPCRpgsJiQpGDx5Nmhy9Byc0sWS9BEWpC3/PvCmsV27qREpJkS/zziUJpAv+jDU8nX3AIwWExIUoOLze6Aq88b9LhWjs0h0pS8ZjFIGTonjdPMiNQmJVSaO50hzSOWeLwi9vvL0BePzlXj1GIWg8UEVJBpgiXVAFEcetu/Fn9mkZ3QRNrIDDI6hzMW9dPW1oZbbrkF2dnZyM3NxdKlS9HV1TXkY5577jl8+ctfRnZ2NgRBQHt7uyLPS9rITU9Fhsm39Cqc7OKx5i50uzxISzViQlFy7NwiYbCYgARBkLOLJ9uGChZ9mUV2QhNpI1vaHzpINzSDRe3dcsst2L9/PzZt2oQ33ngD7733Hm6//fYhH9PT04O5c+figQceUPR5SRuCIGBUiGv7+9t7sh0AMHlUNowGQY1Ti1mseSSo0XlpONrUhVNDrFtslTOLDBaJtBBszSIzi/o4ePAgNm7ciB07dmDGjBkAgGeeeQbXXnstnnjiCXnP9S/63ve+BwDYvHmzos/rdDrhdAaaLux2e4TvjIYzOi8dnzR2hRUs7vEHi9PH5Kl0VrGLmcUEFcr4nBZ59xaWoYm0IK1ZPKcM3cNuaD3U19cjNzdXDugAoKqqCgaDAdu2bdP8eVeuXImcnBz5VlpaGvE50NBG5foyi6fbh24E7W/viXYAwPTSXBXOKLYxWExQ0gLeE0MM5m5lGZpIU9KaRfsXgkWp2Sw3nZlFLdlsNhQVFQ24LyUlBfn5+bDZbJo/7/Lly9HR0SHfTp48GfE50NBCHTEn6XH14ZDNl+llZpESRllBBgDgWEvwBdVygwu7oYk0IV1rrV/Yk7a50wEAKMqyaH5Oiej++++HIAhD3g4dOqT3aZ7DbDYjOzt7wI3UMTrEzSskH53qgFcERuZYYM1JvuuUaxYT1HmFvmDxeHM3RFGEIJy7GDewLzQzi0RaKPLPNG3pcsLjFeVF8o12X/BYnM1rUQnf//73cdtttw15zPjx42G1WtHU1DTg/r6+PrS1tcFqtUb8+mo9LylHanA5HWKwuMdfgp6WhCVogMFiwhqTnwGjQUC3y4OmTieKswd+E+p1eeRdJAoZLBJpYkSmGQYB8IpAW7cLhVlmeL2ivJsSM4vKKCwsRGFh4bDHVVZWor29Hbt27UJFRQUA4O2334bX68WsWbMifn21npeUI5WhGzsdcPZ5YE4Zehez3SfOAgCmj8lV+9RikmplaM6u0pcpxYBS/8XwafO5/z5Sl3SWOQXZHARMpAmjQUB+xsB9aVu7XfB4RQgCm820NmnSJMydOxfLli3D9u3b8cEHH6CmpgYLFy6UO5ZPnz6N8vJybN++XX6czWbD3r17cfToUQDAxx9/jL1796KtrS3k5yV9jcgIzCNuaHcMeazXK2LHZ77/bS8ty9fi9GKOasEiZ1fpb3yhb2josebuc34mNb6U5qcPWqImInVI+9JK2cQm/3rFERlmpBi5jFxrL7/8MsrLy3HNNdfg2muvxZw5c/Dcc8/JP3e73Th8+DB6egLNgmvXrsX06dOxbNkyAMAVV1yB6dOn4/XXXw/5eUlfgiCgbIRvudanTUMnnI40daG9x410kxGTk2ybP4kqKaVYm12VrMYXZOBtDB0sjh2RrvFZESW3wiwzDp4JZBabOqUSNJeD6CE/Px/r1q0L+vOysjKIojjgvkceeQSPPPJIVM9L+iu3ZuGQrROHbHZUXVgc9Lhtx1sBABVj85CapF/oVHnXsTa7yul0wm63D7glg3GFwTuipWBxTD6DRSItSWuEpYxik93fCc3mFiJNXWD1dZsfsnUOedy2474S9MwkLUEDKgWLsTa7KlkHnY4v8JWhj7ecm1k82a8MTUTakcvQUmbRzswikR7KR2YBAA4PESyKoojtUrA4jsFiSOJ1dlWyDjqVxuecbOuBw+0Z8LPPW5lZJNLDOcFipzQ2h53QRFoqt/qCxWMt3XD2eQY95khTF5o7nTCnGDA1ScfmAGGuWYzX2VVmsxlmc/J9ay/MMmNEhgmt3S4cPGOXp86LosgyNJFOvhgsNkplaGYWiTRlzbYg25ICu6MPR5u6cFHJuc0r7xzyxRyV542AJXXo8TqJLKxgkbOr4osgCJhamou3DzXhw5PtcrDY3OmEs88LgxAYTEpE2pDWLAa6oX3/t5AzFok0JQgCykdmY/vxNhy2dQ4aLL7tDxavuqDonJ8lE1XWLHJ2Vey4eLTvl/+jUx3yfVJWsSQ3LWk7u4j0ImcW/WsVmzu5ewuRXqRS9IGGcxtf7Q43dn7uG8bNYFElnF0VG6aOzgUA7D3VLt/HEjSRfqRgsdPZhx5Xn9wVXcQ1i0Sak3Zk+eDT1nN+9s9PWuDxijivMANjknzMnGpbd3B2VWyQMovHmrthd7iRbUnF3pPtAICJRZk6nhlRcsq2pMCcYoCzz4u9J9rh9ohIMQjcdpNIB1dMLIQgAAfP2GHrcMCaE/jStmHvaQBA1aTgMxiTBWuQCW5EplneA/Njfyn6/aMtAIDLJhTodl5EyUoQBLnzed32EwCAqaW5MKXwzzGR1kZkmuUK3LufBBpom+wOeb3iTRWj9Ti1mMK/Tklgmr/d/71PmtHQ3otjzd0wCMDs8SP0PTGiJHXZeb5r742PzgAAZo9P3vltRHqT1iO+c6hZvu+Pu0/D4xVxyZhcTCzO0uvUYgaDxSRw/VRf88/6XafwzmHfN6WppbnISUvV87SIklb15IGjvvjFjUg/V5X7pry8d6QZTXYHOh1u/F/9ZwCAhZeO0fHMYodqaxYpdlxdXgRrtgU2uwOr/v4JAGAOS9BEurnsvBHINKegy9mHVKOAirF5ep8SUdKaXJKDi0fn4KNTHfivDfuQZUlBQ4cDo/PScN3UkXqfXkxgZjEJpBgNWDjTt8Vha7cLgC+AJCJ9mFOMuMp/DU4dnYt0E7+3E+nFYBDw0/kXI8UgYNOBRry2+zQEAXhiwVRem34MFpPELbPGYtLIbMwYm4e1/1YhD+gmIn18e844jMlPx22Xl+l9KkRJb9LIbNw3txxZlhSMzkvDozdM5vKQfhgyJ4nCLDP+eveX9D4NIvKbWpqL935wld6nQUR+y64Yj2VXjNf7NGISM4tEREREFBSDRSIiIiIKisEiEREREQXFYJGIiIiIgmKwSERERERBMVgkIiIioqAYLBIRERFRUAwWiYiIiCgoBotEREREFBSDRSIiIiIKisEiEREREQXFYJGIiIiIgmKwSERERERBMVgkIiIioqAYLBIRERFRUAwWiYiIiCioFL1PQA+iKAIA7Ha7zmdCiUr63ZJ+1xIdrylSW7JdUwCvK1JfqNdVUgaLnZ2dAIDS0lKdz4QSXWdnJ3JycvQ+DdXxmiKtJMs1BfC6Iu0Md10JYjJ9TfPzer1oaGhAVlYWBEEY8DO73Y7S0lKcPHkS2dnZOp1hcknEf3NRFNHZ2YmSkhIYDIm/2oPXVGxJxH/zZLumAF5XsSRR/71Dva6SMrNoMBgwevToIY/Jzs5OqF+IeJBo/+bJkv0AeE3FqkT7N0+mawrgdRWLEvHfO5TrKjm+nhERERFRRBgsEhEREVFQDBa/wGw24+GHH4bZbNb7VJIG/80TG//31R7/zRMf/zfWVrL/eydlgwsRERERhYaZRSIiIiIKisEiEREREQXFYJGIiIiIgmKwSERERERBMVgkIiIioqAYLH7BmjVrUFZWBovFglmzZmH79u16n1Jceu+99/D1r38dJSUlEAQBGzZsGPBzURSxYsUKjBw5EmlpaaiqqsKRI0cGHNPW1oZbbrkF2dnZyM3NxdKlS9HV1aXhuyAl8JpSBq8pkvCaUg6vq9AwWOzn1VdfRW1tLR5++GHs3r0bU6dORXV1NZqamvQ+tbjT3d2NqVOnYs2aNYP+/PHHH8fTTz+NtWvXYtu2bcjIyEB1dTUcDod8zC233IL9+/dj06ZNeOONN/Dee+/h9ttv1+otkAJ4TSmH1xQBvKaUxusqRCLJZs6cKd55553yf3s8HrGkpERcuXKljmcV/wCIf/rTn+T/9nq9otVqFX/2s5/J97W3t4tms1n83e9+J4qiKB44cEAEIO7YsUM+5q9//asoCIJ4+vRpzc6dosNrSh28ppIXryn18LoKjplFP5fLhV27dqGqqkq+z2AwoKqqCvX19TqeWeI5fvw4bDbbgH/rnJwczJo1S/63rq+vR25uLmbMmCEfU1VVBYPBgG3btml+zhQ+XlPa4TWVHHhNaYvXVQCDRb+WlhZ4PB4UFxcPuL+4uBg2m02ns0pM0r/nUP/WNpsNRUVFA36ekpKC/Px8/u8RJ3hNaYfXVHLgNaUtXlcBDBaJiIiIKCgGi34FBQUwGo1obGwccH9jYyOsVqtOZ5WYpH/Pof6trVbrOQu2+/r60NbWxv894gSvKe3wmkoOvKa0xesqgMGin8lkQkVFBerq6uT7vF4v6urqUFlZqeOZJZ5x48bBarUO+Le22+3Ytm2b/G9dWVmJ9vZ27Nq1Sz7m7bffhtfrxaxZszQ/Zwofrynt8JpKDrymtMXrqh+9O2xiySuvvCKazWbxxRdfFA8cOCDefvvtYm5urmiz2fQ+tbjT2dkp7tmzR9yzZ48IQFy1apW4Z88e8fPPPxdFURR/8pOfiLm5ueKf//xn8aOPPhJvuOEGcdy4cWJvb6/8HHPnzhWnT58ubtu2TXz//ffFiRMniosWLdLrLVEEeE0ph9cUiSKvKaXxugoNg8UveOaZZ8QxY8aIJpNJnDlzprh161a9TykuvfPOOyKAc2633nqrKIq+kQQPPfSQWFxcLJrNZvGaa64RDx8+POA5WltbxUWLFomZmZlidna2uGTJErGzs1OHd0PR4DWlDF5TJOE1pRxeV6ERRFEUtc5mEhEREVF84JpFIiIiIgqKwSIRERERBcVgkYiIiIiCYrBIREREREExWCQiIiKioBgsEhEREVFQDBaJiIiIKCgGi0REREQUFINFIiIiIgqKwSIRERERBcVgkYiIiIiC+v+Kw+D02QERJwAAAABJRU5ErkJggg==", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "f, axarr = plt.subplots(1,3, layout='constrained')\n", - "\n", - "for i in range(3): \n", - " axarr[i].plot(t, Ymean[:,i] - solutionReference[:,i])\n", - " axarr[i].set_title(stateList[i])\n", - "\n", - "plt.show()\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "ee4d496d", - "metadata": { - "tags": [ - "hide-input" - ] - }, - "outputs": [ - { - "data": { - "image/png": "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Jqnzk4QQnbNXJVsjo9l+vILBaXHEGSO7OckFhjglMGyUAhRveO+995g/fz5Lly5l0qRJPP/888yYMYP9+/eTmpra7vjevXvz8MMPM3ToUPR6PR9//DFz584lNTXVMT0aKjQaDeeffz7nn38+CxcupF+/fnz00UfMnz+fb775hj//+c/MmjULgKKiIo8VPhQWFnLq1CkyMzMB+Pbbb9FqtQwZMqTNcc1NTQwfnIvBoOf0iRNces70dmf27dvHmTNneOqpp8jOzgZgy5Yt7Y67+eabeeSRR9i6dSsffPABS5cudfxs7NixFBcXExERQU5OjtOv7cyZM+zfv59ly5Zx4YUXAsq0dGtDhgzh73//OyaTyRHcfvfdd22OGTt2LB9++CE5OTlERPguXJOq5BA1MC0WCzpMOvtieSlAEcJ99qnkfx+o4dpXNjJ20Vp+8/4Omi2uZ0A6JAUoXvXss89y9913M3fuXIYPH87SpUuJjo5m+fLlHR4/bdo0rrnmGoYNG8aAAQO47777GD16dLsP92C3adMmnnzySbZs2UJhYSErVqygrKyMYcOGATBo0CDeeust9u7dy6ZNm7jllluIivLMzj9Go5Hbb7+dHTt28NVXX/HLX/6SG264oe00MtDc3ERcbAy//NmdzJ8/nzfffJPDhw+zbds2XnzxRd58880OH79v377o9XpefPFFjhw5wqpVq1i0aFG743JycpgyZQp33nknFouFq666yvGz6dOnM3nyZGbPns1nn33GsWPH2LBhAw8//HCHQaaqV69eJCUl8dprr3Ho0CH++9//Mn/+/DbH3HzzzVitVn7605+yd+9ePv30U5555hmgJcN67733UlFRwU033cR3333H4cOH+fTTT5k7dy4Wewsfb5DAMEQNsq8zrNHYP3CkAEUIt1lMSmB4oMKKVgNNFhsfbD3B618f9cwTSC9DrzGbzWzdupXp06c77tNqtUyfPp2NGzd2e77NZmPdunXs37+fiy66qNPnsFqtWCwWxyUYxMfH8+WXXzJr1iwGDx7MI488wpIlS7j88ssBeP311zl79ixjx47l1ltv5Ze//GWHGVZ3DBw4kB/96EfMmjWLyy67jNGjR/PnP/+53XGWZqW59aO/+w2PPvooixcvZtiwYcycOZNPPvmE/v37d/j4KSkpvPHGG7z//vsMHz6cp556yhF4neuW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", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "f, axarr = plt.subplots(1,3, layout='constrained', sharey=False)\n", - "\n", - "for i in range(3): \n", - " axarr[i].plot(t, Ymean[:,i], label='sample average')\n", - " axarr[i].plot(t, solutionReference[:,i], label='reference')\n", - " axarr[i].set_title(stateList[i])\n", - "\n", - "axarr[2].legend()\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "aa230d7f", - "metadata": {}, - "source": [ - "The difference between the deterministic reference and averaged solutions is relatively large, especially for the $S$ state. \n", - "We can decrease this difference as we increase the number of simulations, and also by using more sophisticated sampling methods for the generation of random\n", - "variables." - ] - }, - { - "cell_type": "markdown", - "id": "39d66f12", - "metadata": {}, - "source": [ - "```{tip}\n", - "In addition to using the built-in functions to represent stochasticity,\n", - "we can also use standard frozen distributions from scipy. Note that it\n", - "must be a frozen distribution as that is the only for the parameters of\n", - "the distributions to propagate through the model.\n", - "```\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "b8a806bc", - "metadata": {}, - "outputs": [], - "source": [ - "import scipy.stats as st\n", - "\n", - "d = dict()\n", - "\n", - "d['beta'] = st.gamma(a=100.0, scale=1.0/200.0)\n", - "\n", - "d['gamma'] = st.gamma(a=100.0, scale=1.0/300.0)\n", - "\n", - "odeS.parameters = d" - ] - }, - { - "cell_type": "markdown", - "id": "030d6487", - "metadata": {}, - "source": [ - "There may be scenarios where only some of the parameters are\n", - "stochastic. Let's say that the $\\gamma$ parameter is fixed at $1/3$,\n", - "then we can replace the distribution information with a scalar. A quick\n", - "visual inspection at the resulting plot suggests that the system of ODEs\n", - "potentially has less variation when compared to the case where both\n", - "parameters are stochastic." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "fa0d6ee2", - "metadata": {}, - "outputs": [], - "source": [ - "d['gamma'] = 1.0/3.0\n", - "\n", - "odeS.parameters = d\n", - "\n", - "YmeanSingle, YallSingle = odeS.simulate_param(t[1::], 5, full_output=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "id": "eb4e969a", - "metadata": { - "tags": [ - "hide-input" - ] - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "f, axarr = plt.subplots(1,3)\n", - "\n", - "for solution in YallSingle: \n", - " axarr[0].plot(t,solution[:,0]) \n", - " axarr[1].plot(t,solution[:,1]) \n", - " axarr[2].plot(t,solution[:,2])\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "2f01a3d9", - "metadata": {}, - "source": [ - "## Continuous Markov Representation\n", - "\n", - "Another common method of introducing stochasticity into a set of ODEs is\n", - "by assuming each movement in the system is a result of a jump process.\n", - "More concretely, the probabilty of a move for transition $j$ is governed\n", - "by an exponential distribution such that\n", - "\n", - "$$\\Pr(\\text{process $j$ jump within time } \\tau) = \\lambda_{j} e^{-\\lambda_{j} \\tau},$$\n", - "\n", - "where $\\lambda_{j}$ is the rate of transition for process $j$ and $\\tau$\n", - "the time elapsed after current time $t$.\n", - "\n", - "Two of the commmon algorithms for the jump process have been\n", - "implemented for use during simulation; the reaction method [\\[Gillespie1977\\]]() and the $\\tau$-Leap method\n", - "[\\[Cao2006\\]](). The two change interactively depending on the size of the states." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "id": "a0a0bcbc", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "x0 = [2362206.0, 3.0, 0.0]\n", - "\n", - "stateList = ['S', 'I', 'R']\n", - "\n", - "paramList = ['beta', 'gamma', 'N']\n", - "\n", - "transitionList = [Transition(origin='S', destination='I', equation='beta*S*I/N', transition_type=TransitionType.T),\n", - " Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", - " ]\n", - "\n", - "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", - "\n", - "odeS.parameters = [0.5, 1.0/3.0, x0[0]]\n", - "\n", - "odeS.initial_values = (x0, t[0])\n", - "\n", - "solutionReference = odeS.integrate(t[1::])\n", - "\n", - "simX, simT = odeS.simulate_jump(t[1:10], 10, full_output=True)\n", - "\n", - "f, axarr = plt.subplots(1, 3)\n", - "\n", - "for solution in simX: \n", - " axarr[0].plot(t[:9], solution[:,0])\n", - " axarr[1].plot(t[:9], solution[:,1]) \n", - " axarr[2].plot(t[:9], solution[:,2])\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "e18e4fa7", - "metadata": {}, - "source": [ - "Above, we see 10 different simulations, again using the SIR model but\n", - "without standardization of the initial conditions (we include $N$ as a parameter in our model). \n", - "For demonstration purposes, we restrict our time\n", - "frame to be only the first 10 time points so that the individual changes or stochasticity\n", - "can be seen more clearly. If we use the same time frame as the one\n", - "used previously for the deterministic system (as shown below), the\n", - "trajectories are smoothed out and we no longer observe the *jumps*.\n", - "Looking at the raw trajectories of the ODEs below, we see that the\n", - "mean from a jump process is very different to the deterministic\n", - "solution. This occurs because the jump process above was able\n", - "to fully remove all the initial infected individuals before any new\n", - "ones occured." - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "id": "525a069b", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
          " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "simX,simT = odeS.simulate_jump(t, 5, full_output=True)\n", - "\n", - "simMean = np.mean(simX, axis=0)\n", - "\n", - "f, axarr = plt.subplots(1,3)\n", - "\n", - "for solution in simX: \n", - " axarr[0].plot(t, solution[:,0]) \n", - " axarr[1].plot(t, solution[:,1]) \n", - " axarr[2].plot(t, solution[:,2])\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "fbef64f3", - "metadata": {}, - "source": [ - "\n", - "## Repeatable Simulation\n", - "\n", - "One of the possible uses of compartmental models is to generate\n", - "forecasts. Although most of the time the requirement would be to have\n", - "(at least point-wise) convergence in the limit, reproducibility is also\n", - "important. For both types of interpretation explained above, we have\n", - "given the package the capability to repeat the simulations by setting a\n", - "seed. When the assumption is that the parameters follows some sort of\n", - "distribution, we can set the seed which governs the global state of\n", - "the random number generator." - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "id": "415cab81", - "metadata": {}, - "outputs": [], - "source": [ - "x0 = [2362206.0, 3.0, 0.0]\n", - "\n", - "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", - "\n", - "d = {'beta': st.gamma(a=100.0, scale=1.0/200.0), 'gamma':st.gamma(a=100.0, scale=1.0/300.0), 'N': x0[0]}\n", - "\n", - "odeS.parameters = d\n", - "\n", - "odeS.initial_values = (x0, t[0])\n", - "\n", - "Ymean, Yall = odeS.simulate_param(t[1::], 10, full_output=True)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 37, - "id": "7a51e644", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Different in the simulations and the mean: (81103473.8935847, 52437230.37979218) \n", - "Different in the simulations and the mean using same seed: (0.0, 0.0) \n" - ] - } - ], - "source": [ - "\n", - "np.random.seed(1)\n", - "\n", - "Ymean1, Yall1 = odeS.simulate_param(t[1::], 10, full_output=True)\n", - "\n", - "np.random.seed(1)\n", - "\n", - "Ymean2, Yall2 = odeS.simulate_param(t[1::], 10, full_output=True)\n", - "\n", - "sim_diff = [np.linalg.norm(Yall[i] - yi) for i, yi in enumerate(Yall1)]\n", - "\n", - "sim_diff12 = [np.linalg.norm(Yall2[i] - yi) for i, yi in enumerate(Yall1)]\n", - "\n", - "print(\"Different in the simulations and the mean: (%s, %s) \" %(np.sum(sim_diff), np.sum(np.abs(Ymean1 - Ymean))))\n", - "\n", - "print(\"Different in the simulations and the mean using same seed: (%s, %s) \" % (np.sum(sim_diff12), np.sum(np.abs(Ymean2 - Ymean1))))" - ] - }, - { - "cell_type": "markdown", - "id": "e1fe54a8", - "metadata": {}, - "source": [ - "In the alternative interpretation, setting the global seed is\n", - "insufficient. Unlike simulation based on the parameters, where we can\n", - "pre-generate all the parameter values and send them off to individual\n", - "processes in the parallel backend, this is prohibitive here. In a\n", - "nutshell, the seed does not propagate when using a parallel backend\n", - "because each *integration* requires an unknown number of random samples.\n", - "Therefore, we have an additional flag **parallel** in the function\n", - "signature. By ensuring that the computation runs in serial, we can make\n", - "use of the global seed and generate identical runs." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "id": "d5a9e235", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Difference in simulation: 2534.4614923250074\n", - "Difference in simulation using same seed: 0.0\n" - ] - } - ], - "source": [ - "x0 = [2362206.0, 3.0, 0.0]\n", - "\n", - "odeS = SimulateOde(stateList, paramList, transition=transitionList)\n", - "\n", - "odeS.parameters = [0.5, 1.0/3.0, x0[0]]\n", - "\n", - "odeS.initial_values = (x0, t[0])\n", - "\n", - "simX, simT = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)\n", - "\n", - "np.random.seed(1)\n", - "\n", - "simX1, simT1 = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)\n", - "\n", - "np.random.seed(1)\n", - "\n", - "simX2, simT2 = odeS.simulate_jump(t[1:10], 10, parallel=False, full_output=True)\n", - "\n", - "sim_diff = [np.linalg.norm(simX[i] - x1) for i, x1 in enumerate(simX1)]\n", - "\n", - "sim_diff12 = [np.linalg.norm(simX2[i] - x1) for i, x1 in enumerate(simX1)]\n", - "\n", - "print(\"Difference in simulation: %s\" %np.sum(np.abs(sim_diff)))\n", - "\n", - "print(\"Difference in simulation using same seed: %s\" %np.sum(np.abs(sim_diff12)))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.15 ('sphinx-doc')", - "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.9.15" - }, - "vscode": { - "interpreter": { - "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb deleted file mode 100644 index 2ed607d2..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/transition.ipynb +++ /dev/null @@ -1,452 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Transition Object\n", - "\n", - "\n", - "The most important part of setting up the model is to correctly define the set ODEs, which is based solely on the classes defined in `transition`. These transitions describe how members of one state can move into another state. We choose to define the models using transitions because it enables the computer to do our bookeeping, therefore reducing the error of, for example, including a flow out of one state, but forgetting to include it in the recipient state. (This does not apply to birth and death processes.) \n", - "\n", - "\n", - "All transitions that get fed into the ODE system need to be defined as a transition object, `Transition`. It takes a total of four input arguments:\n", - "\n", - "1. The origin state\n", - "2. Equation that describe the process\n", - "3. The type of transition\n", - "4. The destination state\n", - "\n", - "where the first three are mandatory. To demonstrate, we go back to the SIR model defined previously in the section {doc}`sir`. Recall that the set of ODEs are\n", - "\n", - "$$\\begin{aligned}\n", - " \\frac{d S}{d t} &= - beta SI \\\\\n", - "\\frac{d I}{d t} &= beta SI - \\gamma I \\\\\n", - "\\frac{d R}{d t} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "We can define the set of ODEs, as seen previously, via" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "68d41d64", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import Transition, TransitionType, common_models\n", - "\n", - "ode1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.ODE)\n", - "\n", - "ode2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.ODE)\n", - "\n", - "ode3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.ODE)" - ] - }, - { - "cell_type": "markdown", - "id": "d393a33a", - "metadata": {}, - "source": [ - "\n", - "Note that we need to state explicitly the type of equation we are\n", - "inputting, which is simply of type **ODE** in this case. We can confirm\n", - "this has been entered correctly by putting it into `DeterministicOde`," - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b0801dd", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import DeterministicOde\n", - "\n", - "stateList = ['S', 'I', 'R']\n", - "\n", - "paramList = ['beta', 'gamma']\n", - "\n", - "model = DeterministicOde(stateList, paramList, ode=[ode1, ode2, ode3])" - ] - }, - { - "cell_type": "markdown", - "id": "6e764826", - "metadata": {}, - "source": [ - "\n", - "and then checking it.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5782a96f", - "metadata": {}, - "outputs": [], - "source": [ - "model.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "c693cbc7", - "metadata": {}, - "source": [ - "Now we are going to show the different ways of defining the same set of\n", - "ODEs.\n" - ] - }, - { - "cell_type": "markdown", - "id": "fa631d9f", - "metadata": {}, - "source": [ - "(transition:defining-the-equations)=\n", - "## Defining the equations\n", - "\n", - "We first recognize that the set of ODEs defining the SIR model are the result of\n", - "two transitions,\n", - "\n", - "$$\\begin{aligned}\n", - "S \\rightarrow I &= \\beta SI \\\\\n", - "I \\rightarrow R &= \\gamma I\n", - "\\end{aligned}$$\n", - "\n", - "where $S \\rightarrow I$ denotes a transition from state $S$ to state\n", - "$I$. Therefore, we can define our model by these two transitions,\n", - "but they need to be passed as the `transition`\n", - "argument instead of the `ode` argument of `DeterministicOde` or `SimulateOde`.\n", - "\n", - "```{note}\n", - "We are initializing the model using the `SimulateOde` class, rather than `DeterministicOde`, because the stochastic implementation has more available operations on transitions.\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6966fc5e", - "metadata": {}, - "outputs": [], - "source": [ - "from pygom import SimulateOde\n", - "\n", - "t1 = Transition(origin='S', destination='I', equation='beta*S*I', transition_type=TransitionType.T)\n", - "\n", - "t2 = Transition(origin='I', destination='R', equation='gamma*I', transition_type=TransitionType.T)\n", - "\n", - "modelTrans = SimulateOde(stateList, paramList, transition=[t1, t2])\n", - "\n", - "modelTrans.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "b896d5c9", - "metadata": {}, - "source": [ - "\n", - "We can see that the resulting ODE is exactly the same, as expected. The\n", - "transition matrix that defines this process can be visualized\n", - "using graphviz. Because only certain renderers permit the use of sub and\n", - "superscript, operators such as $**$ are left as they are in the\n", - "equation." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "1e17eb7c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & I S \\beta & 0\\\\0 & 0 & I \\gamma\\\\0 & 0 & 0\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[0, I*S*beta, 0],\n", - "[0, 0, I*gamma],\n", - "[0, 0, 0]])" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "modelTrans.get_transition_matrix()" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "570ceed5", - "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": "\n\n\n\n\n\n\n\n\nS\n\nS\n\n\n\nI\n\nI\n\n\n\nS->I\n\n\nβ*S*I\n\n\n\nR\n\nR\n\n\n\nI->R\n\n\nγ*I\n\n\n\n", - "text/plain": [ - "" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "# TODO why are two images produced? issue #75\n", - "modelTrans.get_transition_graph(show=False)" - ] - }, - { - "cell_type": "markdown", - "id": "5d982b87", - "metadata": {}, - "source": [ - "```{warning}\n", - "The execution will error if the incorrect `TransitionType` is used against the wrong argument.\n", - "\n", - "`modelTrans = DeterministicOde(stateList, paramList, ode=[t1, t2])`\n", - "\n", - "Here the error occurs because `t1` and `t2` used `transition_type=TransitionType.T` argument, but `DeterministicOde` is expecting a `TransitionType.ODE` argument.\n", - "\n", - "Similarly `DeterministicOde(stateList, paramList, transition=[ode1, ode2, ode3])` would fail.\n", - "\n", - "This therefore forces us to construct our model carefully.\n", - "```" - ] - }, - { - "cell_type": "markdown", - "id": "d590f4d5", - "metadata": {}, - "source": [ - "The third option is to reframe the system as a set of birth processes, using `transition_type=TransitionType.B`. For this simple example, this formulation takes a similar form to defining using ODE equations.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "9f24cb0a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "birth1 = Transition(origin='S', equation='-beta*S*I', transition_type=TransitionType.B)\n", - "\n", - "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", - "\n", - "birth3 = Transition(origin='R', equation='gamma*I', transition_type=TransitionType.B)\n", - "\n", - "modelBirth = DeterministicOde(stateList, paramList, birth_death=[birth1, birth2, birth3])\n", - "\n", - "modelBirth.get_ode_eqn()\n" - ] - }, - { - "cell_type": "markdown", - "id": "f1d61012", - "metadata": {}, - "source": [ - "Alternatively, we can use the negative of the equation to configure the ODEs to represent death processes. Since the death process is the removal of a flow, we take the negative of the birth process alongside using `transition_type=TransitionType.D`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "9a3b3758", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- I S \\beta\\\\I S \\beta - I \\gamma\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ -I*S*beta],\n", - "[I*S*beta - I*gamma],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "death1 = Transition(origin='S', equation='beta*S*I', transition_type=TransitionType.D)\n", - "\n", - "birth2 = Transition(origin='I', equation='beta*S*I - gamma*I', transition_type=TransitionType.B)\n", - "\n", - "death3 = Transition(origin='R', equation='-gamma*I', transition_type=TransitionType.D)\n", - "\n", - "modelBD = DeterministicOde(stateList, paramList, birth_death=[death1, birth2, death3])\n", - "\n", - "modelBD.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "1c8d48b8", - "metadata": {}, - "source": [ - "\n", - "We can see that all four approaches have yielded the same set of ODEs at the end." - ] - }, - { - "cell_type": "markdown", - "id": "23a105af", - "metadata": {}, - "source": [ - "\n", - "## Model Addition\n", - "\n", - "Because we allow the separation of transitions between states and birth/death processes, the birth/death processes can be added later on. The following example takes the model that was defined using transitions (`modelTrans`) and includes a birth process to the $S$ state, and death processes to the $S$ and $I$ states." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "3a6a15ea", - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}B - I S \\beta - S \\mu\\\\I S \\beta - I \\gamma - I \\mu\\\\I \\gamma\\end{matrix}\\right]$" - ], - "text/plain": [ - "Matrix([\n", - "[ B - I*S*beta - S*mu],\n", - "[I*S*beta - I*gamma - I*mu],\n", - "[ I*gamma]])" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "modelBD2 = modelTrans\n", - "\n", - "modelBD2.param_list = paramList + ['mu', 'B']\n", - "\n", - "birthDeathList = [Transition(origin='S', equation='B', transition_type=TransitionType.B), \n", - " Transition(origin='S', equation='mu*S', transition_type=TransitionType.D), \n", - " Transition(origin='I', equation='mu*I', transition_type=TransitionType.D)\n", - " ]\n", - "\n", - "modelBD2.birth_death_list = birthDeathList\n", - "\n", - "modelBD2.get_ode_eqn()" - ] - }, - { - "cell_type": "markdown", - "id": "076bdc12", - "metadata": {}, - "source": [ - "\n", - "This demonstrates that we can approach our in stages. Start off with a standard closed system using `TransitionType.T`, and then extend it with additional flows that interact with the populations' surrounding environments using `TransitionType.B` or `TransitionType.D`." - ] - }, - { - "cell_type": "markdown", - "id": "ec63c1e1", - "metadata": {}, - "source": [ - "## Transition type summary\n", - "\n", - "In summary, there are four different types of transitions allowed. These are B, D, ODE and T, which are defined in an enum class also located in `transition`." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "ce5787f8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TransitionType.B = Birth process\n", - "TransitionType.D = Death process\n", - "TransitionType.T = Between states\n", - "TransitionType.ODE = ODE _equation\n" - ] - } - ], - "source": [ - "from pygom import transition\n", - "\n", - "for i in transition.TransitionType: \n", - " print(str(i) + \" = \" + i.value)\n" - ] - }, - { - "cell_type": "markdown", - "id": "89607b7d", - "metadata": {}, - "source": [ - "Each birth process is added to the origin state, while each death\n", - "process is deducted from the origin state (alternatively added to the state after\n", - "multiplying the flow with a negative sign). An ODE type is also added to the state, but we forbid the number of input ODEs to be greater than the number of states inputted. These strict definitions should help us to improve the bookeeping of states and flows when we have models of greater complexity." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.15 ('sphinx-doc')", - "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.9.15" - }, - "vscode": { - "interpreter": { - "hash": "4dc1e323c80fe09539c74ad5c5a7c7d8d9ff99e04f7b3dbd3680daf878629d6e" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollBD.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollBD.ipynb deleted file mode 100644 index ea56ca47..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollBD.ipynb +++ /dev/null @@ -1,79 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# ODE With Birth and Death Process\n", - "\n", - "We follow on from the SIR model of `unrollSimple` but with additional\n", - "birth and death processes.\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dS}{dt} &= -\\beta SI + B - \\mu S\\\\\n", - "\\frac{dI}{dt} &= \\beta SI - \\gamma I - \\mu I\\\\\n", - "\\frac{dR}{dt} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "which consists of two transitions and three birth and death process\n", - "\n", - "digraph SIR_Model { \n", - "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", - "\\]; I -\\> R \\[ label = \"γI\" \\]; B \\[height=0 margin=0 shape=plaintext\n", - "width=0\\]; B -\\> S; \"S\\**2*μ\" \\[height=0 margin=0 shape=plaintext\n", - "width=0\\]; S -\\> \"S\\**2*μ\"; \"I\\*μ\" \\[height=0 margin=0 shape=plaintext\n", - "width=0\\]; I -\\> \"I\\*μ\";\n", - "\n", - "}\n", - "\n", - "Let's define this in terms of ODEs, and unroll it back to the individual\n", - "processes.\n", - "\n", - "In \\[1\\]: from pygom import Transition, TransitionType, SimulateOde,\n", - "common_models\n", - "\n", - "In \\[1\\]: import matplotlib.pyplot as plt\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[1\\]: paramList = \\['beta', 'gamma', 'B', 'mu'\\]\n", - "\n", - "In \\[1\\]: odeList = \\[ \n", - "...: Transition(origin='S', ...: equation='-beta\\*S\\*I + B - mu\\*S',\n", - "...: transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", - "...: equation='beta\\*S\\*I - gamma\\*I - mu\\*I', ...:\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='R', ...:\n", - "equation='gamma\\*I', ...: transition_type=TransitionType.ODE) ...: \\]\n", - "\n", - "In \\[1\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", - "\n", - "In \\[1\\]: ode2 = ode.get_unrolled_obj()\n", - "\n", - "In \\[1\\]: f = plt.figure()\n", - "\n", - "@savefig sir_unrolled_transition_graph.png In \\[1\\]:\n", - "ode2.get_transition_graph()\n", - "\n", - "In \\[1\\]: plt.close()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.11.0 ('pygom-dev')", - "language": "python", - "name": "python3" - }, - "language_info": { - "name": "python", - "version": "3.11.0" - }, - "vscode": { - "interpreter": { - "hash": "fc17efc1b95c7b1781d7b7ce7a7c317a91a744529621a3902877be6d49554249" - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollHard.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollHard.ipynb deleted file mode 100644 index 64e14bd0..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollHard.ipynb +++ /dev/null @@ -1,90 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Hard Problem\n", - "\n", - "Now we turn to a harder problem that does not have a one to one mapping\n", - "between all the transitions and the terms in the ODEs. We use the model\n", - "in `Influenza_SLIARN`, defined by\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dS}{dt} &= -S \\beta (I + \\delta A) \\\\ \n", - "\\frac{dL}{dt} &= S \\beta (I + \\delta A) - \\kappa L \\\\ \n", - "\\frac{dI}{dt} &= p \\kappa L - \\alpha I \\\\\n", - "\\frac{dA}{dt} &= (1 - p) \\kappa L - \\eta A \\\\\n", - "\\frac{dR}{dt} &= f \\alpha I + \\eta A \\\\\n", - "\\frac{dN}{dt} &= -(1 - f) \\alpha I.\n", - "\\end{aligned}$$\n", - "\n", - "The outflow of state **L**, $\\kappa L$, is composed of two transitions,\n", - "one to **I** and the other to **A** but the ode of **L** only reflects\n", - "the total flow going out of the state. Same can be said for state **I**,\n", - "where the flow $\\alpha I$ goes to both **R** and **N**. Graphically, it\n", - "is a rather simple process as shown below.\n", - "\n", - "digraph SLIARD_Model { \n", - "labelloc = \"t\"; label = \"Original transitions\"; rankdir=LR; size=\"8\"\n", - "node \\[shape = circle\\]; S -\\> L \\[ label = \"-Sβ(I + δA)/N\" \\]; L -\\> I\n", - "\\[ label = \"κLp\" \\]; L -\\> A \\[ label = \"κL(1-p)\" \\]; I -\\> R \\[ label =\n", - "\"αIf\" \\]; I -\\> D \\[ label = \"αI(1-f)\" \\]; A -\\> R \\[ label = \"ηA\" \\];\n", - "\n", - "}\n", - "\n", - "We slightly change the model by introducing a new state **D** to convert\n", - "it into a closed system. The combination of state **D** and **N** is a\n", - "constant, the total population. So we can remove **N** and this new\n", - "system consist of six transitions. We define them explicitly as ODEs and\n", - "unroll them into transitions.\n", - "\n", - "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", - "\n", - "In \\[1\\]: stateList = \\['S', 'L', 'I', 'A', 'R', 'D'\\]\n", - "\n", - "In \\[2\\]: paramList = \\['beta', 'p', 'kappa', 'alpha', 'f', 'delta',\n", - "'epsilon', 'N'\\]\n", - "\n", - "In \\[3\\]: odeList = \\[ \n", - "...: Transition(origin='S', equation='- beta\\*S/N\\*(I + delta\\*A)',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='L',\n", - "equation='beta\\*S/N\\*(I + delta\\*A) - kappa\\*L',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='I',\n", - "equation='p\\*kappa\\*L - alpha\\*I', transition_type=TransitionType.ODE),\n", - "...: Transition(origin='A', equation='(1 - p)*kappa* L - epsilon\\*A',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='R',\n", - "equation='f\\*alpha\\*I + epsilon\\*A',\n", - "transition_type=TransitionType.ODE), ...: Transition(origin='D',\n", - "equation='(1 - f)*alpha*I', transition_type=TransitionType.ODE) \\]\n", - "\n", - "In \\[4\\]: ode = SimulateOde(stateList, paramList, ode=odeList)\n", - "\n", - "In \\[5\\]: ode.get_transition_matrix()\n", - "\n", - "In \\[6\\]: ode2 = ode.get_unrolled_obj()\n", - "\n", - "In \\[7\\]: ode2.get_transition_matrix()\n", - "\n", - "In \\[8\\]: ode2.get_ode_eqn()\n", - "\n", - "After unrolling the odes, we have the following transition graph\n", - "\n", - "@savefig sir_unrolled_transition_graph_hard.png In \\[1\\]:\n", - "ode2.get_transition_graph()\n", - "\n", - "In \\[2\\]: plt.close()\n", - "\n", - "In \\[3\\]: print(sum(ode.get_ode_eqn() - ode2.get_ode_eqn()).simplify())\n", - "\\# difference\n", - "\n", - "which is exactly the same apart from slightly weird arrangement of\n", - "symbols in some of the equations. The last line with a value of zero\n", - "also reaffirms the result." - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollSimple.ipynb b/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollSimple.ipynb deleted file mode 100644 index 88bbd592..00000000 --- a/docs/pygom-doc/_build/html/_sources/notebooks/unroll/unrollSimple.ipynb +++ /dev/null @@ -1,61 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simple Problem\n", - "\n", - "For a simple problem, we consider the SIR model defined by\n", - "\n", - "$$\\begin{aligned}\n", - "\\frac{dS}{dt} &= -\\beta SI \\\\\n", - "\\frac{dI}{dt} &= \\beta SI - \\gamma I \\\\\n", - "\\frac{dR}{dt} &= \\gamma I.\n", - "\\end{aligned}$$\n", - "\n", - "which consists of two transitions\n", - "\n", - "digraph SIR_Model { \n", - "rankdir=LR; size=\"8\" node \\[shape = circle\\]; S -\\> I \\[ label = \"βSI\"\n", - "\\]; I -\\> R \\[ label = \"γI\" \\];\n", - "\n", - "}\n", - "\n", - "Let's define this using the code block below\n", - "\n", - "In \\[1\\]: from pygom import SimulateOde, Transition, TransitionType\n", - "\n", - "In \\[2\\]: ode1 = Transition(origin='S', equation='-beta\\*S\\*I',\n", - "transition_type=TransitionType.ODE)\n", - "\n", - "In \\[3\\]: ode2 = Transition(origin='I', equation='beta\\*S\\*I -\n", - "gamma\\*I', transition_type=TransitionType.ODE)\n", - "\n", - "In \\[4\\]: ode3 = Transition(origin='R', equation='gamma\\*I',\n", - "transition_type=TransitionType.ODE)\n", - "\n", - "In \\[6\\]: stateList = \\['S', 'I', 'R'\\]\n", - "\n", - "In \\[7\\]: paramList = \\['beta', 'gamma'\\]\n", - "\n", - "In \\[8\\]: ode = SimulateOde(stateList, \n", - "...: paramList, ...: ode=\\[ode1, ode2, ode3\\])\n", - "\n", - "In \\[9\\]: ode.get_transition_matrix()\n", - "\n", - "and the last line shows that the transition matrix is empty. This is the\n", - "expected result because `SimulateOdeModel` was not initialized using\n", - "transitions. We populate the transition matrix below and demonstrate the\n", - "difference.\n", - "\n", - "In \\[1\\]: ode = ode.get_unrolled_obj()\n", - "\n", - "In \\[2\\]: ode.get_transition_matrix()" - ] - } - ], - "nbformat": 4, - "nbformat_minor": 5, - "metadata": {} -} diff --git a/docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css deleted file mode 100644 index 3225661c..00000000 --- a/docs/pygom-doc/_build/html/_sphinx_design_static/design-style.4045f2051d55cab465a707391d5b2007.min.css +++ /dev/null @@ -1 +0,0 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js b/docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js deleted file mode 100644 index 36b38cf0..00000000 --- a/docs/pygom-doc/_build/html/_sphinx_design_static/design-tabs.js +++ /dev/null @@ -1,27 +0,0 @@ -var sd_labels_by_text = {}; - -function ready() { - const li = document.getElementsByClassName("sd-tab-label"); - for (const label of li) { - syncId = label.getAttribute("data-sync-id"); - if (syncId) { - label.onclick = onLabelClick; - if (!sd_labels_by_text[syncId]) { - sd_labels_by_text[syncId] = []; - } - sd_labels_by_text[syncId].push(label); - } - } -} - -function onLabelClick() { - // Activate other inputs with the same sync id. - syncId = this.getAttribute("data-sync-id"); - for (label of sd_labels_by_text[syncId]) { - if (label === this) continue; - label.previousElementSibling.checked = true; - } - window.localStorage.setItem("sphinx-design-last-tab", syncId); -} - -document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js deleted file mode 100644 index 8549469d..00000000 --- a/docs/pygom-doc/_build/html/_static/_sphinx_javascript_frameworks_compat.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - * _sphinx_javascript_frameworks_compat.js - * ~~~~~~~~~~ - * - * Compatability shim for jQuery and underscores.js. - * - * WILL BE REMOVED IN Sphinx 6.0 - * xref RemovedInSphinx60Warning - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} diff --git a/docs/pygom-doc/_build/html/_static/basic.css b/docs/pygom-doc/_build/html/_static/basic.css deleted file mode 100644 index 9e364ed3..00000000 --- a/docs/pygom-doc/_build/html/_static/basic.css +++ /dev/null @@ -1,930 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 270px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} -nav.contents, -aside.topic, - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ -nav.contents, -aside.topic, - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, - -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, - -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -/* Footnotes & citations ends */ - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/check-solid.svg b/docs/pygom-doc/_build/html/_static/check-solid.svg deleted file mode 100644 index 92fad4b5..00000000 --- a/docs/pygom-doc/_build/html/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/pygom-doc/_build/html/_static/clipboard.min.js b/docs/pygom-doc/_build/html/_static/clipboard.min.js deleted file mode 100644 index 54b3c463..00000000 --- a/docs/pygom-doc/_build/html/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/docs/pygom-doc/_build/html/_static/copybutton.css b/docs/pygom-doc/_build/html/_static/copybutton.css deleted file mode 100644 index f1916ec7..00000000 --- a/docs/pygom-doc/_build/html/_static/copybutton.css +++ /dev/null @@ -1,94 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -/* Show the copybutton */ -.highlight:hover button.copybtn, button.copybtn.success { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

          Short

          - */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/docs/pygom-doc/_build/html/_static/copybutton.js b/docs/pygom-doc/_build/html/_static/copybutton.js deleted file mode 100644 index 2ea7ff3e..00000000 --- a/docs/pygom-doc/_build/html/_static/copybutton.js +++ /dev/null @@ -1,248 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copier dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for a moment, then changes it back -// We want the timeout of our `success` class to be a bit shorter than the -// tooltip and icon change, so that we can hide the icon before changing back. -var timeoutIcon = 2000; -var timeoutSuccessClass = 1500; - -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - // Remove success a little bit sooner than we change the tooltip - // So that we can use CSS to hide the copybutton first - setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) - setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const COPYBUTTON_SELECTOR = 'div.highlight pre'; - const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - - // get filtered text - let exclude = '.linenos'; - - let text = filterText(target, exclude); - return formatCopyText(text, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/copybutton_funcs.js b/docs/pygom-doc/_build/html/_static/copybutton_funcs.js deleted file mode 100644 index dbe1aaad..00000000 --- a/docs/pygom-doc/_build/html/_static/copybutton_funcs.js +++ /dev/null @@ -1,73 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -export function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css b/docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css deleted file mode 100644 index 3225661c..00000000 --- a/docs/pygom-doc/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css +++ /dev/null @@ -1 +0,0 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative}details.sd-dropdown .sd-summary-title{font-weight:700;padding-right:3em !important;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary{list-style:none;padding:1em}details.sd-dropdown summary .sd-octicon.no-title{vertical-align:middle}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown summary::-webkit-details-marker{display:none}details.sd-dropdown summary:focus{outline:none}details.sd-dropdown .sd-summary-icon{margin-right:.5em}details.sd-dropdown .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary:hover .sd-summary-up svg,details.sd-dropdown summary:hover .sd-summary-down svg{opacity:1;transform:scale(1.1)}details.sd-dropdown .sd-summary-up svg,details.sd-dropdown .sd-summary-down svg{display:block;opacity:.6}details.sd-dropdown .sd-summary-up,details.sd-dropdown .sd-summary-down{pointer-events:none;position:absolute;right:1em;top:1em}details.sd-dropdown[open]>.sd-summary-title .sd-summary-down{visibility:hidden}details.sd-dropdown:not([open])>.sd-summary-title .sd-summary-up{visibility:hidden}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #007bff;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0069d9;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem} diff --git a/docs/pygom-doc/_build/html/_static/design-tabs.js b/docs/pygom-doc/_build/html/_static/design-tabs.js deleted file mode 100644 index 36b38cf0..00000000 --- a/docs/pygom-doc/_build/html/_static/design-tabs.js +++ /dev/null @@ -1,27 +0,0 @@ -var sd_labels_by_text = {}; - -function ready() { - const li = document.getElementsByClassName("sd-tab-label"); - for (const label of li) { - syncId = label.getAttribute("data-sync-id"); - if (syncId) { - label.onclick = onLabelClick; - if (!sd_labels_by_text[syncId]) { - sd_labels_by_text[syncId] = []; - } - sd_labels_by_text[syncId].push(label); - } - } -} - -function onLabelClick() { - // Activate other inputs with the same sync id. - syncId = this.getAttribute("data-sync-id"); - for (label of sd_labels_by_text[syncId]) { - if (label === this) continue; - label.previousElementSibling.checked = true; - } - window.localStorage.setItem("sphinx-design-last-tab", syncId); -} - -document.addEventListener("DOMContentLoaded", ready, false); diff --git a/docs/pygom-doc/_build/html/_static/doctools.js b/docs/pygom-doc/_build/html/_static/doctools.js deleted file mode 100644 index c3db08d1..00000000 --- a/docs/pygom-doc/_build/html/_static/doctools.js +++ /dev/null @@ -1,264 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.highlightSearchWords(); - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); - document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/pygom-doc/_build/html/_static/documentation_options.js b/docs/pygom-doc/_build/html/_static/documentation_options.js deleted file mode 100644 index 30637825..00000000 --- a/docs/pygom-doc/_build/html/_static/documentation_options.js +++ /dev/null @@ -1,14 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '', - NAVIGATION_WITH_KEYS: true, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, -}; \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/file.png b/docs/pygom-doc/_build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/pygom-doc/_build/html/_static/images/logo_binder.svg b/docs/pygom-doc/_build/html/_static/images/logo_binder.svg deleted file mode 100644 index 45fecf75..00000000 --- a/docs/pygom-doc/_build/html/_static/images/logo_binder.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -logo - - - - - - - - diff --git a/docs/pygom-doc/_build/html/_static/images/logo_colab.png b/docs/pygom-doc/_build/html/_static/images/logo_colab.png deleted file mode 100644 index b7560ec216b2d1b6f77855525fe966c741833428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7601 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 diff --git a/docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg b/docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg deleted file mode 100644 index 60cfe9f2..00000000 --- a/docs/pygom-doc/_build/html/_static/images/logo_jupyterhub.svg +++ /dev/null @@ -1 +0,0 @@ -logo_jupyterhubHub diff --git a/docs/pygom-doc/_build/html/_static/jquery-3.6.0.js b/docs/pygom-doc/_build/html/_static/jquery-3.6.0.js deleted file mode 100644 index fc6c299b..00000000 --- a/docs/pygom-doc/_build/html/_static/jquery-3.6.0.js +++ /dev/null @@ -1,10881 +0,0 @@ -/*! - * jQuery JavaScript Library v3.6.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright OpenJS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2021-03-02T17:08Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 - // Plus for old WebKit, typeof returns "function" for HTML collections - // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) - return typeof obj === "function" && typeof obj.nodeType !== "number" && - typeof obj.item !== "function"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.6.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), - function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); - } ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
          " ], - col: [ 2, "", "
          " ], - tr: [ 2, "", "
          " ], - td: [ 3, "", "
          " ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - // - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = "1px"; - trChild.style.height = "9px"; - - // Support: Android 8 Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block - // gets around this issue. - trChild.style.display = "block"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ).filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ).map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - -originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script but not if jsonp - if ( !isSuccess && - jQuery.inArray( "script", s.dataTypes ) > -1 && - jQuery.inArray( "json", s.dataTypes ) < 0 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " -{% endmacro %} diff --git a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js deleted file mode 100644 index 766173ab..00000000 --- a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see bootstrap.js.LICENSE.txt */ -(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>w,afterRead:()=>b,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>m,beforeWrite:()=>A,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>Dt,createPopperBase:()=>Lt,createPopperLite:()=>$t,detectOverflow:()=>mt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>T,offset:()=>wt,placements:()=>g,popper:()=>d,popperGenerator:()=>kt,popperOffsets:()=>At,preventOverflow:()=>Et,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>u,write:()=>E});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",u="viewport",d="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),g=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),m="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",A="beforeWrite",E="write",C="afterWrite",T=[m,_,b,v,y,w,A,E,C];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const $={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];L(s)&&O(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function S(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function j(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function M(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!M()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,u=n.height/o;return{width:h,height:u,top:c,right:l+h,bottom:c+u,left:l,x:l,y:c}}function W(t){var e=H(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function F(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function B(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function q(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function R(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function V(t){return L(t)&&"fixed"!==B(t).position?t.offsetParent:null}function K(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===B(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===B(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&L(t)&&"fixed"===B(t).position)return null;var i=R(t);for(D(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=B(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return I(t,N(e,i))}function Y(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,u=r.modifiersData.popperOffsets,d=S(r.placement),f=Q(d),p=[o,s].indexOf(d)>=0?"height":"width";if(h&&u){var g=function(t,e){return Y("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),m=W(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-u[f]-r.rects.popper[p],y=u[f]-r.rects.reference[f],w=K(h),A=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,E=v/2-y/2,C=g[_],T=A-m[p]-g[b],O=A/2-m[p]/2+E,x=X(C,O,T),k=f;r.modifiersData[l]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&F(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=t.variation,u=t.offsets,d=t.position,f=t.gpuAcceleration,p=t.adaptive,g=t.roundOffsets,m=t.isFixed,_=u.x,b=void 0===_?0:_,v=u.y,y=void 0===v?0:v,w="function"==typeof g?g({x:b,y}):{x:b,y};b=w.x,y=w.y;var A=u.hasOwnProperty("x"),E=u.hasOwnProperty("y"),C=o,T=i,O=window;if(p){var k=K(r),L="clientHeight",D="clientWidth";k===x(r)&&"static"!==B(k=q(r)).position&&"absolute"===d&&(L="scrollHeight",D="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(T=n,y-=(m&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(C=s,b-=(m&&k===O&&O.visualViewport?O.visualViewport.width:k[D])-a.width,b*=f?1:-1)}var $,S=Object.assign({position:d},p&&Z),I=!0===g?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},S,(($={})[T]=E?"0":"",$[C]=A?"0":"",$.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",$)):Object.assign({},S,((e={})[T]=E?y+"px":"",e[C]=A?b+"px":"",e.transform="",e))}const et={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:S(e.placement),variation:J(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,tt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,tt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var it={passive:!0};const nt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return H(q(t)).left+lt(t).scrollLeft}function ht(t){var e=B(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:ut(R(t))}function dt(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(dt(R(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===u?ft(function(t,e){var i=x(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=M();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=H(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ft(function(t){var e,i=q(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===B(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,r=t.reference,a=t.element,h=t.placement,u=h?S(h):null,d=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(u){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var g=u?Q(u):null;if(null!=g){var m="y"===g?"height":"width";switch(d){case l:e[g]=e[g]-(r[m]/2-a[m]/2);break;case c:e[g]=e[g]+(r[m]/2-a[m]/2)}}return e}function mt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,g=o.boundary,m=void 0===g?h:g,_=o.rootBoundary,b=void 0===_?u:_,v=o.elementContext,y=void 0===v?d:v,w=o.altBoundary,A=void 0!==w&&w,E=o.padding,C=void 0===E?0:E,T=Y("number"!=typeof C?C:U(C,a)),x=y===d?f:d,D=t.rects.popper,$=t.elements[A?x:y],S=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=dt(R(t)),i=["absolute","fixed"].indexOf(B(t).position)>=0&&L(t)?K(t):t;return k(i)?e.filter((function(t){return k(t)&&F(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(k($)?$:$.contextElement||q(t.elements.popper),m,b,p),P=H(t.elements.reference),j=gt({reference:P,element:D,strategy:"absolute",placement:l}),M=ft(Object.assign({},D,j)),W=y===d?M:P,z={top:S.top-W.top+T.top,bottom:W.bottom-S.bottom+T.bottom,left:S.left-W.left+T.left,right:W.right-S.right+T.right},V=t.modifiersData.offset;if(y===d&&V){var Q=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=Q[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var u=c.mainAxis,d=void 0===u||u,f=c.altAxis,m=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,A=c.flipVariations,E=void 0===A||A,C=c.allowedAutoPlacements,T=e.options.placement,O=S(T),x=_||(O!==T&&E?function(t){if(S(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(T):[ot(T)]),k=[T].concat(x).reduce((function(t,i){return t.concat(S(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,u=J(n),d=u?l?p:p.filter((function(t){return J(t)===u})):a,f=d.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=d);var m=f.reduce((function(e,i){return e[i]=mt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[S(i)],e}),{});return Object.keys(m).sort((function(t,e){return m[t]-m[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:E,allowedAutoPlacements:C}):i)}),[]),L=e.rects.reference,D=e.rects.popper,$=new Map,I=!0,N=k[0],P=0;P=0,F=W?"width":"height",B=mt(e,{placement:j,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=W?H?s:o:H?n:i;L[F]>D[F]&&(z=ot(z));var q=ot(z),R=[];if(d&&R.push(B[M]<=0),m&&R.push(B[z]<=0,B[q]<=0),R.every((function(t){return t}))){N=j,I=!1;break}$.set(j,R)}if(I)for(var V=function(t){var e=k.find((function(e){var i=$.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},K=E?3:1;K>0&&"break"!==V(K);K--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function vt(t){return[i,s,n,o].some((function(e){return t[e]>=0}))}const yt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=mt(e,{elementContext:"reference"}),a=mt(e,{altBoundary:!0}),l=bt(r,n),c=bt(a,s,o),h=vt(l),u=vt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:u},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":u})}},wt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,a=n.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,n){return t[n]=function(t,e,n){var r=S(t),a=[o,i].indexOf(r)>=0?-1:1,l="function"==typeof n?n(Object.assign({},e,{placement:t})):n,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[o,s].indexOf(r)>=0?{x:h,y:c}:{x:c,y:h}}(n,e.rects,l),t}),{}),h=c[e.placement],u=h.x,d=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=u,e.modifiersData.popperOffsets.y+=d),e.modifiersData[r]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Et={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,r=t.options,a=t.name,c=r.mainAxis,h=void 0===c||c,u=r.altAxis,d=void 0!==u&&u,f=r.boundary,p=r.rootBoundary,g=r.altBoundary,m=r.padding,_=r.tether,b=void 0===_||_,v=r.tetherOffset,y=void 0===v?0:v,w=mt(e,{boundary:f,rootBoundary:p,padding:m,altBoundary:g}),A=S(e.placement),E=J(e.placement),C=!E,T=Q(A),O="x"===T?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,D="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,$="number"==typeof D?{mainAxis:D,altAxis:D}:Object.assign({mainAxis:0,altAxis:0},D),P=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,j={x:0,y:0};if(x){if(h){var M,H="y"===T?i:o,F="y"===T?n:s,B="y"===T?"height":"width",z=x[T],q=z+w[H],R=z-w[F],V=b?-L[B]/2:0,Y=E===l?k[B]:L[B],U=E===l?-L[B]:-k[B],G=e.elements.arrow,Z=b&&G?W(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[H],it=tt[F],nt=X(0,k[B],Z[B]),st=C?k[B]/2-V-nt-et-$.mainAxis:Y-nt-et-$.mainAxis,ot=C?-k[B]/2+V+nt+it+$.mainAxis:U+nt+it+$.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===T?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(M=null==P?void 0:P[T])?M:0,ct=z+ot-lt,ht=X(b?N(q,z+st-lt-at):q,z,b?I(R,ct):R);x[T]=ht,j[T]=ht-z}if(d){var ut,dt="x"===T?i:o,ft="x"===T?n:s,pt=x[O],gt="y"===O?"height":"width",_t=pt+w[dt],bt=pt-w[ft],vt=-1!==[i,o].indexOf(A),yt=null!=(ut=null==P?void 0:P[O])?ut:0,wt=vt?_t:pt-k[gt]-L[gt]-yt+$.altAxis,At=vt?pt+k[gt]+L[gt]-yt-$.altAxis:bt,Et=b&&vt?function(t,e,i){var n=X(t,e,i);return n>i?i:n}(wt,pt,At):X(b?wt:_t,pt,b?At:bt);x[O]=Et,j[O]=Et-pt}e.modifiersData[a]=j}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=L(e),r=L(e)&&function(t){var e=t.getBoundingClientRect(),i=P(e.width)/t.offsetWidth||1,n=P(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==O(e)||ht(a))&&(c=(n=e)!==x(n)&&L(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:lt(n)),L(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ct(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Tt(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Ot={placement:"bottom",modifiers:[],strategy:"absolute"};function xt(){for(var t=arguments.length,e=new Array(t),i=0;i{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return e},Nt=t=>{const e=It(t);return e&&document.querySelector(e)?e:null},Pt=t=>{const e=It(t);return e?document.querySelector(e):null},jt=t=>{t.dispatchEvent(new Event(St))},Mt=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Mt(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(t):null,Wt=t=>{if(!Mt(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Ft=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),Bt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?Bt(t.parentNode):null},zt=()=>{},qt=t=>{t.offsetHeight},Rt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Vt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Rt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Vt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Vt)t()})),Vt.push(e)):e()},Xt=t=>{"function"==typeof t&&t()},Yt=(t,e,i=!0)=>{if(!i)return void Xt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(St,o),Xt(t))};e.addEventListener(St,o),setTimeout((()=>{s||jt(e)}),n)},Ut=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Gt=/[^.]*(?=\..*)\.|.*/,Jt=/\..*/,Zt=/::\d+$/,te={};let ee=1;const ie={mouseenter:"mouseover",mouseleave:"mouseout"},ne=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function se(t,e){return e&&`${e}::${ee++}`||t.uidEvent||ee++}function oe(t){const e=se(t);return t.uidEvent=e,te[e]=te[e]||{},te[e]}function re(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function ae(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return ne.has(o)||(o=t),[n,s,o]}function le(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=ae(e,i,n);if(e in ie){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=oe(t),c=l[a]||(l[a]={}),h=re(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const u=se(r,e.replace(Gt,"")),d=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return fe(s,{delegateTarget:r}),n.oneOff&&de.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return fe(n,{delegateTarget:t}),i.oneOff&&de.off(t,n.type,e),e.apply(t,[n])}}(t,r);d.delegationSelector=o?i:null,d.callable=r,d.oneOff=s,d.uidEvent=u,c[u]=d,t.addEventListener(a,d,o)}function ce(t,e,i,n,s){const o=re(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function he(t,e,i,n){const s=e[i]||{};for(const o of Object.keys(s))if(o.includes(n)){const n=s[o];ce(t,e,i,n.callable,n.delegationSelector)}}function ue(t){return t=t.replace(Jt,""),ie[t]||t}const de={on(t,e,i,n){le(t,e,i,n,!1)},one(t,e,i,n){le(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=ae(e,i,n),a=r!==e,l=oe(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))he(t,l,i,e.slice(1));for(const i of Object.keys(c)){const n=i.replace(Zt,"");if(!a||e.includes(n)){const e=c[i];ce(t,l,r,e.callable,e.delegationSelector)}}}else{if(!Object.keys(c).length)return;ce(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Rt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());let l=new Event(e,{bubbles:o,cancelable:!0});return l=fe(l,i),a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function fe(t,e){for(const[i,n]of Object.entries(e||{}))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}const pe=new Map,ge={set(t,e,i){pe.has(t)||pe.set(t,new Map);const n=pe.get(t);n.has(e)||0===n.size?n.set(e,i):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`)},get:(t,e)=>pe.has(t)&&pe.get(t).get(e)||null,remove(t,e){if(!pe.has(t))return;const i=pe.get(t);i.delete(e),0===i.size&&pe.delete(t)}};function me(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function _e(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const be={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${_e(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${_e(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${_e(e)}`))};class ve{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=Mt(e)?be.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Mt(e)?be.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const n of Object.keys(e)){const s=e[n],o=t[n],r=Mt(o)?"element":null==(i=o)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class ye extends ve{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),ge.set(this._element,this.constructor.DATA_KEY,this))}dispose(){ge.remove(this._element,this.constructor.DATA_KEY),de.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Yt(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return ge.get(Ht(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.2.3"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const we=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;de.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Ft(this))return;const s=Pt(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Ee=`close${Ae}`,Ce=`closed${Ae}`;class Te extends ye{static get NAME(){return"alert"}close(){if(de.trigger(this._element,Ee).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),de.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Te.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}we(Te,"close"),Qt(Te);const Oe='[data-bs-toggle="button"]';class xe extends ye{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=xe.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}de.on(document,"click.bs.button.data-api",Oe,(t=>{t.preventDefault();const e=t.target.closest(Oe);xe.getOrCreateInstance(e).toggle()})),Qt(xe);const ke={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Ft(t)&&Wt(t)))}},Le=".bs.swipe",De=`touchstart${Le}`,$e=`touchmove${Le}`,Se=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},je={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Me extends ve{constructor(t,e){super(),this._element=t,t&&Me.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return je}static get NAME(){return"swipe"}dispose(){de.off(this._element,Le)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Xt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(de.on(this._element,Ie,(t=>this._start(t))),de.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(de.on(this._element,De,(t=>this._start(t))),de.on(this._element,$e,(t=>this._move(t))),de.on(this._element,Se,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const He=".bs.carousel",We=".data-api",Fe="next",Be="prev",ze="left",qe="right",Re=`slide${He}`,Ve=`slid${He}`,Ke=`keydown${He}`,Qe=`mouseenter${He}`,Xe=`mouseleave${He}`,Ye=`dragstart${He}`,Ue=`load${He}${We}`,Ge=`click${He}${We}`,Je="carousel",Ze="active",ti=".active",ei=".carousel-item",ii=ti+ei,ni={ArrowLeft:qe,ArrowRight:ze},si={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},oi={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class ri extends ye{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=ke.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Je&&this.cycle()}static get Default(){return si}static get DefaultType(){return oi}static get NAME(){return"carousel"}next(){this._slide(Fe)}nextWhenVisible(){!document.hidden&&Wt(this._element)&&this.next()}prev(){this._slide(Be)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?de.one(this._element,Ve,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void de.one(this._element,Ve,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?Fe:Be;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&de.on(this._element,Ke,(t=>this._keydown(t))),"hover"===this._config.pause&&(de.on(this._element,Qe,(()=>this.pause())),de.on(this._element,Xe,(()=>this._maybeEnableCycle()))),this._config.touch&&Me.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of ke.find(".carousel-item img",this._element))de.on(t,Ye,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ze)),rightCallback:()=>this._slide(this._directionToOrder(qe)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Me(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ni[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=ke.findOne(ti,this._indicatorsElement);e.classList.remove(Ze),e.removeAttribute("aria-current");const i=ke.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Ze),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===Fe,s=e||Ut(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>de.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Re).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Ze),i.classList.remove(Ze,c,l),this._isSliding=!1,r(Ve)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return ke.findOne(ii,this._element)}_getItems(){return ke.find(ei,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===ze?Be:Fe:t===ze?Fe:Be}_orderToDirection(t){return Kt()?t===Be?ze:qe:t===Be?qe:ze}static jQueryInterface(t){return this.each((function(){const e=ri.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}de.on(document,Ge,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=Pt(this);if(!e||!e.classList.contains(Je))return;t.preventDefault();const i=ri.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===be.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),de.on(window,Ue,(()=>{const t=ke.find('[data-bs-ride="carousel"]');for(const e of t)ri.getOrCreateInstance(e)})),Qt(ri);const ai=".bs.collapse",li=`show${ai}`,ci=`shown${ai}`,hi=`hide${ai}`,ui=`hidden${ai}`,di=`click${ai}.data-api`,fi="show",pi="collapse",gi="collapsing",mi=`:scope .${pi} .${pi}`,_i='[data-bs-toggle="collapse"]',bi={parent:null,toggle:!0},vi={parent:"(null|element)",toggle:"boolean"};class yi extends ye{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=ke.find(_i);for(const t of i){const e=Nt(t),i=ke.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return bi}static get DefaultType(){return vi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>yi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(de.trigger(this._element,li).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(pi),this._element.classList.add(gi),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gi),this._element.classList.add(pi,fi),this._element.style[e]="",de.trigger(this._element,ci)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(de.trigger(this._element,hi).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(gi),this._element.classList.remove(pi,fi);for(const t of this._triggerArray){const e=Pt(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(gi),this._element.classList.add(pi),de.trigger(this._element,ui)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(fi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(_i);for(const e of t){const t=Pt(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=ke.find(mi,this._config.parent);return ke.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=yi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}de.on(document,di,_i,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();const e=Nt(this),i=ke.find(e);for(const t of i)yi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(yi);const wi="dropdown",Ai=".bs.dropdown",Ei=".data-api",Ci="ArrowUp",Ti="ArrowDown",Oi=`hide${Ai}`,xi=`hidden${Ai}`,ki=`show${Ai}`,Li=`shown${Ai}`,Di=`click${Ai}${Ei}`,$i=`keydown${Ai}${Ei}`,Si=`keyup${Ai}${Ei}`,Ii="show",Ni='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Pi=`${Ni}.${Ii}`,ji=".dropdown-menu",Mi=Kt()?"top-end":"top-start",Hi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",Fi=Kt()?"bottom-start":"bottom-end",Bi=Kt()?"left-start":"right-start",zi=Kt()?"right-start":"left-start",qi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Vi extends ye{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=ke.next(this._element,ji)[0]||ke.prev(this._element,ji)[0]||ke.findOne(ji,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return qi}static get DefaultType(){return Ri}static get NAME(){return wi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Ft(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!de.trigger(this._element,ki,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))de.on(t,"mouseover",zt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Ii),this._element.classList.add(Ii),de.trigger(this._element,Li,t)}}hide(){if(Ft(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!de.trigger(this._element,Oi,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))de.off(t,"mouseover",zt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Ii),this._element.classList.remove(Ii),this._element.setAttribute("aria-expanded","false"),be.removeDataAttribute(this._menu,"popper"),de.trigger(this._element,xi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Mt(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${wi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:Mt(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Ii)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Bi;if(t.classList.contains("dropstart"))return zi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?Hi:Mi:e?Fi:Wi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(be.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,..."function"==typeof this._config.popperConfig?this._config.popperConfig(t):this._config.popperConfig}}_selectMenuItem({key:t,target:e}){const i=ke.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Wt(t)));i.length&&Ut(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Vi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=ke.find(Pi);for(const i of e){const e=Vi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ci,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ni)?this:ke.prev(this,Ni)[0]||ke.next(this,Ni)[0]||ke.findOne(Ni,t.delegateTarget.parentNode),o=Vi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}de.on(document,$i,Ni,Vi.dataApiKeydownHandler),de.on(document,$i,ji,Vi.dataApiKeydownHandler),de.on(document,Di,Vi.clearMenus),de.on(document,Si,Vi.clearMenus),de.on(document,Di,Ni,(function(t){t.preventDefault(),Vi.getOrCreateInstance(this).toggle()})),Qt(Vi);const Ki=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",Qi=".sticky-top",Xi="padding-right",Yi="margin-right";class Ui{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Xi,(e=>e+t)),this._setElementAttributes(Ki,Xi,(e=>e+t)),this._setElementAttributes(Qi,Yi,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Xi),this._resetElementAttributes(Ki,Xi),this._resetElementAttributes(Qi,Yi)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&be.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=be.getDataAttribute(t,e);null!==i?(be.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Mt(t))e(t);else for(const i of ke.find(t,this._element))e(i)}}const Gi="backdrop",Ji="show",Zi=`mousedown.bs.${Gi}`,tn={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},en={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class nn extends ve{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return tn}static get DefaultType(){return en}static get NAME(){return Gi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Ji),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ji),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(de.off(this._element,Zi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),de.on(t,Zi,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Yt(t,this._getElement(),this._config.isAnimated)}}const sn=".bs.focustrap",on=`focusin${sn}`,rn=`keydown.tab${sn}`,an="backward",ln={autofocus:!0,trapElement:null},cn={autofocus:"boolean",trapElement:"element"};class hn extends ve{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return ln}static get DefaultType(){return cn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),de.off(document,sn),de.on(document,on,(t=>this._handleFocusin(t))),de.on(document,rn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,de.off(document,sn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=ke.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===an?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?an:"forward")}}const un=".bs.modal",dn=`hide${un}`,fn=`hidePrevented${un}`,pn=`hidden${un}`,gn=`show${un}`,mn=`shown${un}`,_n=`resize${un}`,bn=`click.dismiss${un}`,vn=`mousedown.dismiss${un}`,yn=`keydown.dismiss${un}`,wn=`click${un}.data-api`,An="modal-open",En="show",Cn="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},On={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class xn extends ye{constructor(t,e){super(t,e),this._dialog=ke.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ui,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return On}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||de.trigger(this._element,gn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(An),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(de.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(En),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){for(const t of[window,this._dialog])de.off(t,un);this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new nn({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new hn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=ke.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(En),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,de.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){de.on(this._element,yn,(t=>{if("Escape"===t.key)return this._config.keyboard?(t.preventDefault(),void this.hide()):void this._triggerBackdropTransition()})),de.on(window,_n,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),de.on(this._element,vn,(t=>{de.one(this._element,bn,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(An),this._resetAdjustments(),this._scrollBar.reset(),de.trigger(this._element,pn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(de.trigger(this._element,fn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Cn)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Cn),this._queueCallback((()=>{this._element.classList.remove(Cn),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=xn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}de.on(document,wn,'[data-bs-toggle="modal"]',(function(t){const e=Pt(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),de.one(e,gn,(t=>{t.defaultPrevented||de.one(e,pn,(()=>{Wt(this)&&this.focus()}))}));const i=ke.findOne(".modal.show");i&&xn.getInstance(i).hide(),xn.getOrCreateInstance(e).toggle(this)})),we(xn),Qt(xn);const kn=".bs.offcanvas",Ln=".data-api",Dn=`load${kn}${Ln}`,$n="show",Sn="showing",In="hiding",Nn=".offcanvas.show",Pn=`show${kn}`,jn=`shown${kn}`,Mn=`hide${kn}`,Hn=`hidePrevented${kn}`,Wn=`hidden${kn}`,Fn=`resize${kn}`,Bn=`click${kn}${Ln}`,zn=`keydown.dismiss${kn}`,qn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Vn extends ye{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return qn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||de.trigger(this._element,Pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ui).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Sn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add($n),this._element.classList.remove(Sn),de.trigger(this._element,jn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(de.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(In),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove($n,In),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ui).reset(),de.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new nn({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():de.trigger(this._element,Hn)}:null})}_initializeFocusTrap(){return new hn({trapElement:this._element})}_addEventListeners(){de.on(this._element,zn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():de.trigger(this._element,Hn))}))}static jQueryInterface(t){return this.each((function(){const e=Vn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}de.on(document,Bn,'[data-bs-toggle="offcanvas"]',(function(t){const e=Pt(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Ft(this))return;de.one(e,Wn,(()=>{Wt(this)&&this.focus()}));const i=ke.findOne(Nn);i&&i!==e&&Vn.getInstance(i).hide(),Vn.getOrCreateInstance(e).toggle(this)})),de.on(window,Dn,(()=>{for(const t of ke.find(Nn))Vn.getOrCreateInstance(t).show()})),de.on(window,Fn,(()=>{for(const t of ke.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Vn.getOrCreateInstance(t).hide()})),we(Vn),Qt(Vn);const Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i,Xn=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i,Yn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)||Xn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Un={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Gn={allowList:Un,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
          "},Jn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Zn={entry:"(string|element|function|null)",selector:"(string|element)"};class ts extends ve{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Gn}static get DefaultType(){return Jn}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Zn)}_setContent(t,e,i){const n=ke.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Mt(e)?this._putElementInTemplate(Ht(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Yn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return"function"==typeof t?t(this):t}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const es=new Set(["sanitize","allowList","sanitizeFn"]),is="fade",ns="show",ss=".modal",os="hide.bs.modal",rs="hover",as="focus",ls={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},cs={allowList:Un,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,0],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},hs={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class us extends ye{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return cs}static get DefaultType(){return hs}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),de.off(this._element.closest(ss),os,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=de.trigger(this._element,this.constructor.eventName("show")),e=(Bt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),de.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ns),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))de.on(t,"mouseover",zt);this._queueCallback((()=>{de.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!de.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ns),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))de.off(t,"mouseover",zt);this._activeTrigger.click=!1,this._activeTrigger[as]=!1,this._activeTrigger[rs]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),de.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(is,ns),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(is),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new ts({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(is)}_isShown(){return this.tip&&this.tip.classList.contains(ns)}_createPopper(t){const e="function"==typeof this._config.placement?this._config.placement.call(this,t,this._element):this._config.placement,i=ls[e.toUpperCase()];return Dt(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return"function"==typeof t?t.call(this._element):t}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,..."function"==typeof this._config.popperConfig?this._config.popperConfig(e):this._config.popperConfig}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)de.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===rs?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===rs?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");de.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?as:rs]=!0,e._enter()})),de.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?as:rs]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},de.on(this._element.closest(ss),os,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=be.getDataAttributes(this._element);for(const t of Object.keys(e))es.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ht(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const e in this._config)this.constructor.Default[e]!==this._config[e]&&(t[e]=this._config[e]);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(us);const ds={...us.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},fs={...us.DefaultType,content:"(null|string|element|function)"};class ps extends us{static get Default(){return ds}static get DefaultType(){return fs}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=ps.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(ps);const gs=".bs.scrollspy",ms=`activate${gs}`,_s=`click${gs}`,bs=`load${gs}.data-api`,vs="active",ys="[href]",ws=".nav-link",As=`${ws}, .nav-item > ${ws}, .list-group-item`,Es={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Cs={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ts extends ye{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Es}static get DefaultType(){return Cs}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ht(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(de.off(this._config.target,_s),de.on(this._config.target,_s,ys,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=ke.find(ys,this._config.target);for(const e of t){if(!e.hash||Ft(e))continue;const t=ke.findOne(e.hash,this._element);Wt(t)&&(this._targetLinks.set(e.hash,e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(vs),this._activateParents(t),de.trigger(this._element,ms,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))ke.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(vs);else for(const e of ke.parents(t,".nav, .list-group"))for(const t of ke.prev(e,As))t.classList.add(vs)}_clearActiveClass(t){t.classList.remove(vs);const e=ke.find(`${ys}.${vs}`,t);for(const t of e)t.classList.remove(vs)}static jQueryInterface(t){return this.each((function(){const e=Ts.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}de.on(window,bs,(()=>{for(const t of ke.find('[data-bs-spy="scroll"]'))Ts.getOrCreateInstance(t)})),Qt(Ts);const Os=".bs.tab",xs=`hide${Os}`,ks=`hidden${Os}`,Ls=`show${Os}`,Ds=`shown${Os}`,$s=`click${Os}`,Ss=`keydown${Os}`,Is=`load${Os}`,Ns="ArrowLeft",Ps="ArrowRight",js="ArrowUp",Ms="ArrowDown",Hs="active",Ws="fade",Fs="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,Rs=`.${Hs}[data-bs-toggle="tab"], .${Hs}[data-bs-toggle="pill"], .${Hs}[data-bs-toggle="list"]`;class Vs extends ye{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),de.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?de.trigger(e,xs,{relatedTarget:t}):null;de.trigger(t,Ls,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Hs),this._activate(Pt(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),de.trigger(t,Ds,{relatedTarget:e})):t.classList.add(Fs)}),t,t.classList.contains(Ws)))}_deactivate(t,e){t&&(t.classList.remove(Hs),t.blur(),this._deactivate(Pt(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),de.trigger(t,ks,{relatedTarget:e})):t.classList.remove(Fs)}),t,t.classList.contains(Ws)))}_keydown(t){if(![Ns,Ps,js,Ms].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[Ps,Ms].includes(t.key),i=Ut(this._getChildren().filter((t=>!Ft(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return ke.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=Pt(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`#${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=ke.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Hs),n(".dropdown-menu",Fs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Hs)}_getInnerElement(t){return t.matches(qs)?t:ke.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}de.on(document,$s,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Ft(this)||Vs.getOrCreateInstance(this).show()})),de.on(window,Is,(()=>{for(const t of ke.find(Rs))Vs.getOrCreateInstance(t)})),Qt(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends ye{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){de.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),qt(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),de.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(de.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),de.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){de.on(this._element,Qs,(t=>this._onInteraction(t,!0))),de.on(this._element,Xs,(t=>this._onInteraction(t,!1))),de.on(this._element,Ys,(t=>this._onInteraction(t,!0))),de.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}var ao;we(ro),Qt(ro),ao=function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new us(t,{delay:{show:500,hide:100}})}))},"loading"!=document.readyState?ao():document.addEventListener("DOMContentLoaded",ao)})(); -//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt deleted file mode 100644 index 91ad10aa..00000000 --- a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.LICENSE.txt +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ diff --git a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map b/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map deleted file mode 100644 index d83e2f7c..00000000 --- a/docs/pygom-doc/_build/html/_static/scripts/bootstrap.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend'; // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n/**\n * Public Util API\n */\n\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n\n return prefix;\n};\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n\n return selector;\n};\n\nconst getSelectorFromElement = element => {\n const selector = getSelector(element);\n\n if (selector) {\n return document.querySelector(selector) ? selector : null;\n }\n\n return null;\n};\n\nconst getElementFromSelector = element => {\n const selector = getSelector(element);\n return selector ? document.querySelector(selector) : null;\n};\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n } // Get transition-duration of the element\n\n\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n } // If multiple durations are defined, take the first\n\n\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n\n return typeof object.nodeType !== 'undefined';\n};\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(object);\n }\n\n return null;\n};\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'; // Handle `details` element as its content may falsie appear visible when it is closed\n\n const closedDetails = element.closest('details:not([open])');\n\n if (!closedDetails) {\n return elementIsVisible;\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n\n if (summary === null) {\n return false;\n }\n }\n\n return elementIsVisible;\n};\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n\n if (element.classList.contains('disabled')) {\n return true;\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n } // Can find the shadow root otherwise it'll return the document\n\n\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n\n if (element instanceof ShadowRoot) {\n return element;\n } // when we don't find a shadow root\n\n\n if (!element.parentNode) {\n return null;\n }\n\n return findShadowRoot(element.parentNode);\n};\n\nconst noop = () => {};\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\n\n\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n\n return null;\n};\n\nconst DOMContentLoadedCallbacks = [];\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\n\nconst isRTL = () => document.documentElement.dir === 'rtl';\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\n\nconst execute = callback => {\n if (typeof callback === 'function') {\n callback();\n }\n};\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\n\n\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement); // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n\n index += shouldGetNext ? 1 : -1;\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\n\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n\n return fn.apply(element, [event]);\n };\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n\n hydrateObj(event, {\n delegateTarget: target\n });\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n\n return fn.apply(target, [event]);\n }\n }\n };\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'; // todo: tooltip passes `false` instead of selector, so we need to check\n\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n\n return [isDelegated, callable, typeEvent];\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction); // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n\n callable = wrapFunction(callable);\n }\n\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n if (!fn) {\n return;\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n\n for (const handlerKey of Object.keys(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n const event = storeElementEvent[handlerKey];\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n\n for (const keyHandlers of Object.keys(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n const event = storeElementEvent[keyHandlers];\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n\n let evt = new Event(event, {\n bubbles,\n cancelable: true\n });\n evt = hydrateObj(evt, args);\n\n if (defaultPrevented) {\n evt.preventDefault();\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n\n return evt;\n }\n\n};\n\nfunction hydrateObj(obj, meta) {\n for (const [key, value] of Object.entries(meta || {})) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n\n get() {\n return value;\n }\n\n });\n }\n }\n\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n\n const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n\n instanceMap.set(key, instance);\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n\n return null;\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n\n if (value === 'false') {\n return false;\n }\n\n if (value === Number(value).toString()) {\n return Number(value);\n }\n\n if (value === '' || value === 'null') {\n return null;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n\n return attributes;\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n\n static get DefaultType() {\n return {};\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n\n this._typeCheckConfig(config);\n\n return config;\n }\n\n _configAfterMerge(config) {\n return config;\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return { ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const property of Object.keys(configTypes)) {\n const expectedTypes = configTypes[property];\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst VERSION = '5.2.3';\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n\n if (!element) {\n return;\n }\n\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n } // Public\n\n\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n\n this._typeCheckConfig(config);\n\n return config;\n } // Static\n\n\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n\n static get VERSION() {\n return VERSION;\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n\n if (isDisabled(this)) {\n return;\n }\n\n const target = getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n } // Public\n\n\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n if (closeEvent.defaultPrevented) {\n return;\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n } // Private\n\n\n _destroyElement() {\n this._element.remove();\n\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config](this);\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nenableDismissTrigger(Alert, 'close');\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n } // Public\n\n\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n\n return parents;\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling;\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n\n previous = previous.previousElementSibling;\n }\n\n return [];\n },\n\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n\n next = next.nextElementSibling;\n }\n\n return [];\n },\n\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n\n if (!element || !Swipe.isSupported()) {\n return;\n }\n\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n\n this._initEvents();\n } // Getters\n\n\n static get Default() {\n return Default$c;\n }\n\n static get DefaultType() {\n return DefaultType$c;\n }\n\n static get NAME() {\n return NAME$d;\n } // Public\n\n\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n } // Private\n\n\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n\n this._handleSwipe();\n\n execute(this._config.endCallback);\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n\n if (!direction) {\n return;\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n } // Static\n\n\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n\n this._addEventListeners();\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n } // Getters\n\n\n static get Default() {\n return Default$b;\n }\n\n static get DefaultType() {\n return DefaultType$b;\n }\n\n static get NAME() {\n return NAME$c;\n } // Public\n\n\n next() {\n this._slide(ORDER_NEXT);\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n\n prev() {\n this._slide(ORDER_PREV);\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n\n this._clearInterval();\n }\n\n cycle() {\n this._clearInterval();\n\n this._updateInterval();\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n\n this.cycle();\n }\n\n to(index) {\n const items = this._getItems();\n\n if (index > items.length - 1 || index < 0) {\n return;\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n\n const activeIndex = this._getItemIndex(this._getActive());\n\n if (activeIndex === index) {\n return;\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n this._slide(order, items[index]);\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n\n super.dispose();\n } // Private\n\n\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n } // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n\n this.pause();\n\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n\n const direction = KEY_TO_DIRECTION[event.key];\n\n if (direction) {\n event.preventDefault();\n\n this._slide(this._directionToOrder(direction));\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n\n if (!element) {\n return;\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n\n const activeElement = this._getActive();\n\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n\n if (nextElement === activeElement) {\n return;\n }\n\n const nextElementIndex = this._getItemIndex(nextElement);\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n\n const slideEvent = triggerEvent(EVENT_SLIDE);\n\n if (slideEvent.defaultPrevented) {\n return;\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // todo: change tests that use empty divs to avoid this check\n return;\n }\n\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n\n this._setActiveIndicatorElement(nextElementIndex);\n\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n\n if (isCycling) {\n this.cycle();\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n }\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = getElementFromSelector(this);\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n\n if (slideIndex) {\n carousel.to(slideIndex);\n\n carousel._maybeEnableCycle();\n\n return;\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n\n carousel._maybeEnableCycle();\n\n return;\n }\n\n carousel.prev();\n\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n for (const elem of toggleList) {\n const selector = getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n\n this._initializeChildren();\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n\n if (this._config.toggle) {\n this.toggle();\n }\n } // Getters\n\n\n static get Default() {\n return Default$a;\n }\n\n static get DefaultType() {\n return DefaultType$a;\n }\n\n static get NAME() {\n return NAME$b;\n } // Public\n\n\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n\n let activeChildren = []; // find active children\n\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n\n if (startEvent.defaultPrevented) {\n return;\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n\n const dimension = this._getDimension();\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n this._element.style[dimension] = 0;\n\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n this._isTransitioning = true;\n\n const complete = () => {\n this._isTransitioning = false;\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n\n this._queueCallback(complete, this._element, true);\n\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n\n if (startEvent.defaultPrevented) {\n return;\n }\n\n const dimension = this._getDimension();\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n for (const trigger of this._triggerArray) {\n const element = getElementFromSelector(trigger);\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n\n this._isTransitioning = true;\n\n const complete = () => {\n this._isTransitioning = false;\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n\n this._element.style[dimension] = '';\n\n this._queueCallback(complete, this._element, true);\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n } // Private\n\n\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n\n config.parent = getElement(config.parent);\n return config;\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n\n for (const element of children) {\n const selected = getElementFromSelector(element);\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth\n\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n } // Static\n\n\n static jQueryInterface(config) {\n const _config = {};\n\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n }\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n\n const selector = getSelectorFromElement(this);\n const selectorElements = SelectorEngine.find(selector);\n\n for (const element of selectorElements) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/\n\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n } // Getters\n\n\n static get Default() {\n return Default$9;\n }\n\n static get DefaultType() {\n return DefaultType$9;\n }\n\n static get NAME() {\n return NAME$a;\n } // Public\n\n\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n\n if (showEvent.defaultPrevented) {\n return;\n }\n\n this._createPopper(); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n\n this._element.focus();\n\n this._element.setAttribute('aria-expanded', true);\n\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n this._element.classList.add(CLASS_NAME_SHOW$6);\n\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n };\n\n this._completeHide(relatedTarget);\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n\n super.dispose();\n }\n\n update() {\n this._inNavbar = this._detectNavbar();\n\n if (this._popper) {\n this._popper.update();\n }\n } // Private\n\n\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n\n if (hideEvent.defaultPrevented) {\n return;\n } // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n\n if (this._popper) {\n this._popper.destroy();\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n this._element.setAttribute('aria-expanded', 'false');\n\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n\n _getConfig(config) {\n config = super._getConfig(config);\n\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n\n return config;\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n\n let referenceElement = this._element;\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n\n const popperConfig = this._getPopperConfig();\n\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n\n _getPlacement() {\n const parentDropdown = this._parent;\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n } // We need to trim the value because custom properties can also include spaces\n\n\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n\n _getOffset() {\n const {\n offset\n } = this._config;\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n\n return offset;\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }; // Disable Popper if we have a static display or Dropdown is in Navbar\n\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // todo:v6 remove\n\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n\n return { ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n };\n }\n\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n\n if (!items.length) {\n return;\n } // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n });\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n\n if (!context || context._config.autoClose === false) {\n continue;\n }\n\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n\n const relatedTarget = {\n relatedTarget: context._element\n };\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n\n context._completeHide(relatedTarget);\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n\n if (isInput && !isEscapeEvent) {\n return;\n }\n\n event.preventDefault(); // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/\n\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n\n instance._selectMenuItem(event);\n\n return;\n }\n\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n } // Public\n\n\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n\n hide() {\n const width = this.getWidth();\n\n this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n\n isOverflowing() {\n return this.getWidth() > 0;\n } // Private\n\n\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n\n this._element.style.overflow = 'hidden';\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n\n this._saveInitialAttribute(element, styleProperty);\n\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty); // We only want to remove the property if the value is `null`; the value can also be zero\n\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n\n};\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n } // Getters\n\n\n static get Default() {\n return Default$8;\n }\n\n static get DefaultType() {\n return DefaultType$8;\n }\n\n static get NAME() {\n return NAME$9;\n } // Public\n\n\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n\n this._append();\n\n const element = this._getElement();\n\n if (this._config.isAnimated) {\n reflow(element);\n }\n\n element.classList.add(CLASS_NAME_SHOW$5);\n\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n\n dispose() {\n if (!this._isAppended) {\n return;\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n this._element.remove();\n\n this._isAppended = false;\n } // Private\n\n\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n\n this._element = backdrop;\n }\n\n return this._element;\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n\n _append() {\n if (this._isAppended) {\n return;\n }\n\n const element = this._getElement();\n\n this._config.rootElement.append(element);\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n\n};\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n } // Getters\n\n\n static get Default() {\n return Default$7;\n }\n\n static get DefaultType() {\n return DefaultType$7;\n }\n\n static get NAME() {\n return NAME$8;\n } // Public\n\n\n activate() {\n if (this._isActive) {\n return;\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n\n deactivate() {\n if (!this._isActive) {\n return;\n }\n\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n } // Private\n\n\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement);\n\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n\n this._addEventListeners();\n } // Getters\n\n\n static get Default() {\n return Default$6;\n }\n\n static get DefaultType() {\n return DefaultType$6;\n }\n\n static get NAME() {\n return NAME$7;\n } // Public\n\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n\n if (showEvent.defaultPrevented) {\n return;\n }\n\n this._isShown = true;\n this._isTransitioning = true;\n\n this._scrollBar.hide();\n\n document.body.classList.add(CLASS_NAME_OPEN);\n\n this._adjustDialog();\n\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n this._isShown = false;\n this._isTransitioning = true;\n\n this._focustrap.deactivate();\n\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n\n dispose() {\n for (const htmlElement of [window, this._dialog]) {\n EventHandler.off(htmlElement, EVENT_KEY$4);\n }\n\n this._backdrop.dispose();\n\n this._focustrap.deactivate();\n\n super.dispose();\n }\n\n handleUpdate() {\n this._adjustDialog();\n } // Private\n\n\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n\n this._element.style.display = 'block';\n\n this._element.removeAttribute('aria-hidden');\n\n this._element.setAttribute('aria-modal', true);\n\n this._element.setAttribute('role', 'dialog');\n\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n\n reflow(this._element);\n\n this._element.classList.add(CLASS_NAME_SHOW$4);\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n\n if (this._config.keyboard) {\n event.preventDefault();\n this.hide();\n return;\n }\n\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n\n return;\n }\n\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n\n _hideModal() {\n this._element.style.display = 'none';\n\n this._element.setAttribute('aria-hidden', true);\n\n this._element.removeAttribute('aria-modal');\n\n this._element.removeAttribute('role');\n\n this._isTransitioning = false;\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n\n this._resetAdjustments();\n\n this._scrollBar.reset();\n\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY; // return if the following background transition hasn't yet completed\n\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n\n this._element.classList.add(CLASS_NAME_STATIC);\n\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n\n this._element.focus();\n }\n /**\n * The following methods are used to handle overflowing modals\n */\n\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n const scrollbarWidth = this._scrollBar.getWidth();\n\n const isBodyOverflowing = scrollbarWidth > 0;\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n } // Static\n\n\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config](relatedTarget);\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = getElementFromSelector(this);\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n }); // avoid conflict when clicking modal toggler while another one is open\n\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n\n this._addEventListeners();\n } // Getters\n\n\n static get Default() {\n return Default$5;\n }\n\n static get DefaultType() {\n return DefaultType$5;\n }\n\n static get NAME() {\n return NAME$6;\n } // Public\n\n\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n\n if (showEvent.defaultPrevented) {\n return;\n }\n\n this._isShown = true;\n\n this._backdrop.show();\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n\n this._element.setAttribute('aria-modal', true);\n\n this._element.setAttribute('role', 'dialog');\n\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n\n this._element.classList.add(CLASS_NAME_SHOW$3);\n\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n\n this._queueCallback(completeCallBack, this._element, true);\n }\n\n hide() {\n if (!this._isShown) {\n return;\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n this._focustrap.deactivate();\n\n this._element.blur();\n\n this._isShown = false;\n\n this._element.classList.add(CLASS_NAME_HIDING);\n\n this._backdrop.hide();\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n\n this._element.removeAttribute('aria-modal');\n\n this._element.removeAttribute('role');\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n\n this._queueCallback(completeCallback, this._element, true);\n }\n\n dispose() {\n this._backdrop.dispose();\n\n this._focustrap.deactivate();\n\n super.dispose();\n } // Private\n\n\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n\n this.hide();\n }; // 'static' option will be translated to true, and booleans will keep their value\n\n\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n\n if (!this._config.keyboard) {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n\n this.hide();\n });\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config](this);\n });\n }\n\n}\n/**\n * Data API implementation\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = getElementFromSelector(this);\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n\n if (isDisabled(this)) {\n return;\n }\n\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\n\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n */\n\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));\n }\n\n return true;\n } // Check if a regular expression validates the attribute.\n\n\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\n\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
          '\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n } // Getters\n\n\n static get Default() {\n return Default$4;\n }\n\n static get DefaultType() {\n return DefaultType$4;\n }\n\n static get NAME() {\n return NAME$5;\n } // Public\n\n\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n\n hasContent() {\n return this.getContent().length > 0;\n }\n\n changeContent(content) {\n this._checkContent(content);\n\n this._config.content = { ...this._config.content,\n ...content\n };\n return this;\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n\n const template = templateWrapper.children[0];\n\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n\n return template;\n } // Private\n\n\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n\n this._checkContent(config.content);\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n\n if (!templateElement) {\n return;\n }\n\n content = this._resolvePossibleFunction(content);\n\n if (!content) {\n templateElement.remove();\n return;\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n\n return;\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n\n templateElement.textContent = content;\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n\n _resolvePossibleFunction(arg) {\n return typeof arg === 'function' ? arg(this) : arg;\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n\n templateElement.textContent = element.textContent;\n }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 0],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
          ' + '
          ' + '
          ' + '
          ',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n\n super(element, config); // Private\n\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null; // Protected\n\n this.tip = null;\n\n this._setListeners();\n\n if (!this._config.selector) {\n this._fixTitle();\n }\n } // Getters\n\n\n static get Default() {\n return Default$3;\n }\n\n static get DefaultType() {\n return DefaultType$3;\n }\n\n static get NAME() {\n return NAME$4;\n } // Public\n\n\n enable() {\n this._isEnabled = true;\n }\n\n disable() {\n this._isEnabled = false;\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n\n this._activeTrigger.click = !this._activeTrigger.click;\n\n if (this._isShown()) {\n this._leave();\n\n return;\n }\n\n this._enter();\n }\n\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n\n this._disposePopper();\n\n super.dispose();\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n } // todo v6 remove this OR make it optional\n\n\n this._disposePopper();\n\n const tip = this._getTipElement();\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n\n const {\n container\n } = this._config;\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n\n if (this._isHovered === false) {\n this._leave();\n }\n\n this._isHovered = false;\n };\n\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n\n hide() {\n if (!this._isShown()) {\n return;\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n const tip = this._getTipElement();\n\n tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n\n if (!this._isHovered) {\n this._disposePopper();\n }\n\n this._element.removeAttribute('aria-describedby');\n\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n\n update() {\n if (this._popper) {\n this._popper.update();\n }\n } // Protected\n\n\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n\n return this.tip;\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml(); // todo: remove this check on v6\n\n\n if (!tip) {\n return null;\n }\n\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); // todo: on v6 the following can be achieved with CSS only\n\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n\n return tip;\n }\n\n setContent(content) {\n this._newContent = content;\n\n if (this._isShown()) {\n this._disposePopper();\n\n this.show();\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({ ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n\n return this._templateFactory;\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n } // Private\n\n\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n\n _createPopper(tip) {\n const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n\n _getOffset() {\n const {\n offset\n } = this._config;\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n\n return offset;\n }\n\n _resolvePossibleFunction(arg) {\n return typeof arg === 'function' ? arg.call(this._element) : arg;\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return { ...defaultBsPopperConfig,\n ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n };\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n\n context._leave();\n });\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title');\n\n if (!title) {\n return;\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n\n\n this._element.removeAttribute('title');\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n\n this._isHovered = true;\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n\n this._isHovered = false;\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n\n config = { ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n\n this._typeCheckConfig(config);\n\n return config;\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n\n return config;\n }\n\n _getDelegateConfig() {\n const config = {};\n\n for (const key in this._config) {\n if (this.constructor.Default[key] !== this._config[key]) {\n config[key] = this._config[key];\n }\n }\n\n config.selector = false;\n config.trigger = 'manual'; // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n\n return config;\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n\n this._popper = null;\n }\n\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n });\n }\n\n}\n/**\n * jQuery\n */\n\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = { ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
          ' + '
          ' + '

          ' + '
          ' + '
          ',\n trigger: 'click'\n};\nconst DefaultType$2 = { ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n\n static get DefaultType() {\n return DefaultType$2;\n }\n\n static get NAME() {\n return NAME$3;\n } // Overrides\n\n\n _isWithContent() {\n return this._getTitle() || this._getContent();\n } // Private\n\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n } // Static\n\n\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n\n if (typeof config !== 'string') {\n return;\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n\n data[config]();\n });\n }\n\n}\n/**\n * jQuery\n */\n\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.2.3): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config); // this._element is the observablesContainer and config.target the menu links wrapper\n\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n } // Getters\n\n\n static get Default() {\n return Default$1;\n }\n\n static get DefaultType() {\n return DefaultType$1;\n }\n\n static get NAME() {\n return NAME$2;\n } // Public\n\n\n refresh() {\n this._initializeTargetsAndObservables();\n\n this._maybeEnableSmoothScroll();\n\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n\n dispose() {\n this._observer.disconnect();\n\n super.dispose();\n } // Private\n\n\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body; // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n\n return config;\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n } // unregister any previous listeners\n\n\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n } // Chrome 60 doesn't support `scrollTo`\n\n\n root.scrollTop = height;\n }\n });\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n } // The logic of selection\n\n\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n\n this._process(targetElement(entry));\n };\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n\n this._clearActiveClass(targetElement(entry));\n\n continue;\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop; // if we are scrolling down, pick the bigger offsetTop\n\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry); // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n\n if (!parentScrollTop) {\n return;\n }\n\n continue;\n } // if we are scrolling up, pick the smallest offsetTop\n\n\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n\n const observableSection = SelectorEngine.findOne(anchor.hash, this._element); // ensure that the observableSection exists & is visible\n\n if (isVisible(observableSection)) {\n this._targetLinks.set(anchor.hash, anchor);\n\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n\n this._clearActiveClass(this._config.target);\n\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n\n this._activateParents(target);\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both