From 5a06ab25e9ce9592e4dc9dff2402fe6c0a427853 Mon Sep 17 00:00:00 2001 From: "George G. Vega Yon" Date: Wed, 3 Apr 2024 13:34:20 -0600 Subject: [PATCH] Formally addresses implementing the observed hospitalizations module (#39) * Copy doc from wastewater model on Hosp Admin to class * Rename metaclasses to metaclass (#36) * Create typos.yaml (#42) * Create typos.yaml * Does this make it run on the whole repo? * remove trailing whitespace * Delete .github/workflows/typos.yaml trying to use typos in pre-commit instead * Update .pre-commit-config.yaml add typos to pre-commit * fixed typos * 34 port notebooks under modeldocs to quarto (#35) * Porting to quarto and adding a makefile entry to render them * Now it should be easier to deal with pre-commit under docs (only skipping cache) * Forgot to remove the pyrenew_demo notebook * Update model/Makefile * Fixing typos * Removes progress bar - adds doc/ figures - sets jupyter as kernel * Update model/docs/getting-started.qmd Co-authored-by: Dylan H. Morris --------- Co-authored-by: Dylan H. Morris * Extra mathematical description of discrete delay distributions (#44) * Update description of discrete delay distributions * remove double desciption * minor eq fix * Update equations.md * update equations.md contents * Update equations.md * fix contents * Escaping tau * Adding deterministic obs and process to the equation * Cleaning the quarto documents and working on the getting started diagram * Flexible IHR (now RandomVariable) * Adding weekday and phosp effect to latent hosp * Adding back figures * Adding a test for deterministic/stochastic weekday effect * Typo Co-authored-by: Dylan H. Morris * Correcting tests (class name) and improving readme a bit * Adding deterministic module (midway, expected to fail) [skip ci] * Refactoring I0 and gen_int (expected to fail) [skip ci] * gen_int and I0 now are directly passed to the models * In latent hosp, change inf_hosp_int to inform_hosp (clearer name) * Adding missing figures (pyrenew demo was not compiling) * Renaming inform_hosp * Removing defaults for hosp rate * Changing language (initial infections) + adding section to getting-started * Update model/src/pyrenew/latent/hospitaladmissions.py Co-authored-by: Dylan H. Morris * Addressing comments on default priors and varnames * Rt is not default now for basic model * Commas and title * Update model/src/pyrenew/latent/hospitaladmissions.py Co-authored-by: Dylan H. Morris * Renaming hosp reporting variable in latent var * Renaming hosp report * Update model/src/pyrenew/latent/hospitaladmissions.py Co-authored-by: Dylan H. Morris * Final renaming of vars in tests * Different vector for hosp_report_prob_dist in tests --------- Co-authored-by: George G. Vega Yon Co-authored-by: George G Vega Yon <156135298+gvegayoncdc@users.noreply.github.com> Co-authored-by: Nate McIntosh Co-authored-by: Dylan H. Morris Co-authored-by: Samuel Brand <48288458+SamuelBrand1@users.noreply.github.com> Co-authored-by: George G. Vega Yon Co-authored-by: Dylan H. Morris --- model/Makefile | 11 +- model/README.md | 9 +- model/docs/.gitignore | 1 + model/docs/getting-started.md | 289 ++++++++++------ model/docs/getting-started.qmd | 214 +++++++----- .../figure-commonmark/basic-fig-output-1.png | Bin 36449 -> 36656 bytes .../figure-commonmark/output-rt-output-1.png | Bin 25656 -> 26746 bytes model/docs/pyrenew_demo.md | 149 ++++---- model/docs/pyrenew_demo.qmd | 49 ++- .../figure-commonmark/fig-hosp-output-1.png | Bin 13617 -> 14325 bytes .../fig-sampled-rt-output-1.png | Bin 34974 -> 38249 bytes model/equations.md | 13 +- model/src/pyrenew/deterministic/__init__.py | 6 + .../pyrenew/deterministic/deterministic.py | 63 ++++ .../pyrenew/deterministic/deterministicpmf.py | 77 +++++ model/src/pyrenew/latent/__init__.py | 8 +- .../src/pyrenew/latent/hospitaladmissions.py | 172 ++++++++-- model/src/pyrenew/latent/i0.py | 77 +++++ model/src/pyrenew/latent/infections.py | 49 ++- model/src/pyrenew/model/hospitalizations.py | 19 +- .../src/pyrenew/model/rtinfectionsrenewal.py | 66 +++- model/src/pyrenew/process/rtrandomwalk.py | 2 +- .../src/test/test_latent_hospitalizations.py | 47 ++- model/src/test/test_latent_infections.py | 6 +- model/src/test/test_model_basic_renewal.py | 35 +- model/src/test/test_model_hospitalizations.py | 322 +++++++++++++++++- 26 files changed, 1322 insertions(+), 362 deletions(-) create mode 100644 model/src/pyrenew/deterministic/__init__.py create mode 100644 model/src/pyrenew/deterministic/deterministic.py create mode 100644 model/src/pyrenew/deterministic/deterministicpmf.py create mode 100644 model/src/pyrenew/latent/i0.py diff --git a/model/Makefile b/model/Makefile index ca9b21a5..a6560b69 100644 --- a/model/Makefile +++ b/model/Makefile @@ -7,9 +7,14 @@ test: docs: docs/pyrenew_demo.md docs/getting-started.md docs/pyrenew_demo.md: docs/pyrenew_demo.qmd - quarto render docs/pyrenew_demo.qmd + poetry run quarto render docs/pyrenew_demo.qmd docs/getting-started.md: docs/getting-started.qmd - quarto render docs/getting-started.qmd + poetry run quarto render docs/getting-started.qmd -.PHONY: install test docs +clean: + rm -rf docs/*_files/ + rm -f docs/getting-started.ipynb + rm -f docs/pyrenew_demo.ipynb + +.PHONY: install test docs clean diff --git a/model/README.md b/model/README.md index f79bfa16..8c873ad6 100755 --- a/model/README.md +++ b/model/README.md @@ -1,12 +1,15 @@ -# PyRenew +# PyRenew: A Package for Bayesian Renewal Modeling with JAX and Numpyro. -A package for Bayesian renewal modeling with JAX and Numpyro. +`pyrenew` is a flexible tool for simulating and statistical inference of epidemiological models, emphasizing renewal models. Built on top of the [`numpyro`](https://num.pyro.ai/) Python library, `pyrenew` provides core components for model building, including pre-defined models for processing various types of observational processes. ## Installation + Install via pip with + ```bash pip install git+https://github.com/cdcent/cfa-pyrenew.git ``` ## Demo -The `docs` folder contains a Jupyter notebook with an interactive demo to get you started. It simulates observed hospitalizations using a simple renewal process model and then fits to it using a No-U-Turn Sampler. + +The [`docs`](docs) folder contains quarto documents to get you started. It simulates observed hospitalizations using a simple renewal process model and then fits it using a No-U-Turn Sampler. diff --git a/model/docs/.gitignore b/model/docs/.gitignore index f0813f1c..4b7530c4 100644 --- a/model/docs/.gitignore +++ b/model/docs/.gitignore @@ -1 +1,2 @@ !*png +*_files/libs diff --git a/model/docs/getting-started.md b/model/docs/getting-started.md index 2da19805..884dbac6 100644 --- a/model/docs/getting-started.md +++ b/model/docs/getting-started.md @@ -1,127 +1,142 @@ # Getting started with pyrenew -This document illustrates two features of `pyrenew`: (a) the set of -included `RandomVariable`s, and (b) model composition. +`pyrenew` is a flexible tool for simulating and making statistical +inference of epidemiological models, emphasizing renewal models. Built +on `numpyro`, `pyrenew` provides core components for model building and +pre-defined models for processing various observational processes. This +document illustrates how `pyrenew` can be used to build a basic renewal +model. + +## The fundamentals + +`pyrenew`’s core components are the metaclasses `RandomVariable` and +`Model`. From the package’s perspective, a `RandomVariable` is a +quantity models can sample and estimate, **including deterministic +quantities**. Mainly, sampling from a `RandomVariable` involves calling +the `sample()` method. The benefit of this design is the definition of +the sample function can be arbitrary, allowing the user to either sample +from a distribution using `numpyro.sample()`, compute fixed quantities +(like a mechanistic equation), or return a fixed value (like a +pre-computed PMF.) For instance, we may be interested in estimating a +PMF, in which case a `RandomVariable` sampling function may roughly be +defined as: -## Hospitalizations model - -`pyrenew` has five main components: - -- Utility and math functions, -- The `processes` sub-module, -- The `observations` sub-module, -- The `latent` sub-module, and -- The `models` sub-module - -All three of `process`, `observation`, and `latent` contain classes that -inherit from the meta class `RandomVariable`. The classes under `model` -inherit from the meta class `Model`. The following diagram illustrates -the composition the model `pyrenew.models.HospitalizationsModel`: - -``` mermaid -flowchart TB - - subgraph randprocmod["Processes module"] - direction TB - simprw["SimpleRandomWalkProcess"] - rtrw["RtRandomWalkProcess"] - end - - subgraph latentmod["Latent module"] - direction TB - hosp_latent["Hospitalizations"] - inf_latent["Infections"] - end - - subgraph obsmod["Observations module"] - direction TB - pois["PoissonObservation"] - nb["NegativeBinomialObservation"] - end - - subgraph models["Models module"] - direction TB - basic["RtInfectionsRenewalModel"] - hosp["HospitalizationsModel"] - end - - rp(("RandomVariable")) --> |Inherited by| randprocmod - rp -->|Inherited by| latentmod - rp -->|Inherited by| obsmod - - - model(("Model")) -->|Inherited by| models +``` python +class MyRandVar(RandomVariable): + def sample(...) -> ArrayLike: + return numpyro.sample(...) +``` - simprw -->|Composes| rtrw - rtrw -->|Composes| basic - inf_latent -->|Composes| basic - basic -->|Composes| hosp +Whereas, in some other cases, we may instead use a fixed quantity for +that variable (like a pre-computed PMF), where the `RandomVariable`’s +sample function could be defined like: +``` python +class MyRandVar(RandomVariable): + def sample(...) -> ArrayLike: + return jax.numpy.array([0.2, 0.7, 0.1]) +``` - obsmod -->|Composes|models - hosp_latent -->|Composes| hosp +This way, when a `Model` samples from `MyRandVar`, it could be either +adding random variables to be estimated (first case) or just retrieving +some quantity needed for other calculations (second case.) - %% Metaclasses - classDef Metaclass color:black,fill:white - class rp,model Metaclass +The `Model` metaclass provides basic functionality for estimating and +simulation. Like `RandomVariable`, the `Model` metaclass has a +`sample()` method that defines the model structure. Ultimately, models +can be nested (or inherited), providing a straightforward way to add +layers of complexity. - %% Random process - classDef Randproc fill:purple,color:white - class rtrw,simprw Randproc +## ‘Hello world’ model - %% Models - classDef Models fill:teal,color:white - class basic,hosp Models -``` - -We start by loading the needed components to build a basic renewal -model: +This section will show the steps to build a simple renewal model +featuring a latent infection process, a random walk Rt process, and an +observation process for the reported infections. We start by loading the +needed components to build a basic renewal model: ``` python import jax.numpy as jnp import numpy as np import numpyro as npro +import numpyro.distributions as dist from pyrenew.process import RtRandomWalkProcess -from pyrenew.latent import Infections +from pyrenew.latent import Infections, Infections0 from pyrenew.observation import PoissonObservation +from pyrenew.deterministic import DeterministicPMF from pyrenew.model import RtInfectionsRenewalModel ``` - /mnt/c/Users/xrd4/Documents/repos/msr/model/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html - from .autonotebook import tqdm as notebook_tqdm - An NVIDIA GPU may be present on this machine, but a CUDA-enabled jaxlib is not installed. Falling back to cpu. - -In the basic renewal model we can define three components: Rt, latent -infections, and observed infections. +The basic renewal model defines five components: generation interval, +initial infections, Rt, latent infections, and observed infections. In +this example, the generation interval is not estimated but passed as a +deterministic instance of `RandomVariable`. Here is the code to +initialize the five components: ``` python -latent_infections = Infections( - gen_int=jnp.array([0.25, 0.25, 0.25, 0.25]), - ) +# (1) The generation interval (deterministic) +gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), +) -observed_infections = PoissonObservation( - rate_varname='latent', - counts_varname='observed_infections', - ) +# (2) Initial infections (inferred with a prior) +I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) +# (3) The random process for Rt rt_proc = RtRandomWalkProcess() + +# (4) Latent infection process (which will use 1 and 2) +latent_infections = Infections() + +# (5) The observed infections process (with mean at the latent infections) +observed_infections = PoissonObservation( + rate_varname = 'latent', + counts_varname = 'observed_infections', + ) ``` -With observation process for the latent infections, we can build the -basic renewal model, and generate a sample calling the `sample()` -method: +With these five pieces, we can build the basic renewal model: ``` python model1 = RtInfectionsRenewalModel( - Rt_process=rt_proc, - latent_infections=latent_infections, - observed_infections=observed_infections, + gen_int = gen_int, + I0 = I0, + Rt_process = rt_proc, + latent_infections = latent_infections, + observed_infections = observed_infections, ) +``` + +The following diagram summarizes how the modules interact via +composition; notably, `gen_int`, `I0`, `rt_proc`, `latent_infections`, +and `observed_infections` are instances of `RandomVariable`, which means +these can be easily replaced to generate a different version of +`RtInfectionsRenewalModel`: + +``` mermaid +flowchart TB + genint["(1) gen_int\n(DetermnisticPMF)"] + i0["(2) I0\n(Infections0)"] + rt["(3) rt_proc\n(RtRandomWalkProcess)"] + inf["(4) latent_infections\n(Infections)"] + obs["(5) observed_infections\n(PoissonObservation)"] + + model1["model1\n(RtInfectionsRenewalModel)"] + + i0-->|Composes|model1 + genint-->|Composes|model1 + rt-->|Composes|model1 + obs-->|Composes|model1 + inf-->|Composes|model1 +``` +Using `numpyro`, we can simulate data using the `sample()` member +function of `RtInfectionsRenewalModel`: + +``` python np.random.seed(223) -with npro.handlers.seed(rng_seed=np.random.randint(1, 60)): - sim_data = model1.sample(constants=dict(n_timepoints=30)) +with npro.handlers.seed(rng_seed = np.random.randint(1, 60)): + sim_data = model1.sample(constants = dict(n_timepoints=30)) sim_data ``` @@ -131,14 +146,14 @@ sim_data 1.271196 , 1.3189521, 1.3054799, 1.3165426, 1.291952 , 1.3026639, 1.2619467, 1.2852622, 1.3121517, 1.2888998, 1.2641873, 1.2580931, 1.2545817, 1.3092988, 1.2488269, 1.2397509, 1.2071848, 1.2334517, - 1.21868 ], dtype=float32), latent=Array([ 3.7023427, 4.850682 , 6.4314823, 8.26245 , 6.9874763, - 7.940377 , 9.171101 , 10.051114 , 10.633459 , 11.729475 , - 12.559867 , 13.422887 , 15.364211 , 17.50132 , 19.206314 , - 21.556652 , 23.78112 , 26.719398 , 28.792412 , 32.40454 , - 36.641006 , 40.135487 , 43.60607 , 48.055103 , 52.829704 , - 60.43277 , 63.97854 , 69.82776 , 74.564415 , 82.88904 , - 88.73811 ], dtype=float32), observed=Array([ 4, 3, 6, 5, 7, 7, 10, 11, 6, 9, 7, 13, 16, 19, 20, 27, 23, - 31, 28, 30, 43, 42, 55, 57, 44, 52, 64, 52, 77, 85, 94], dtype=int32)) + 1.21868 ], dtype=float32), latent=Array([ 2.3215084, 3.0415602, 4.0327816, 5.180868 , 4.381411 , + 4.978916 , 5.750626 , 6.3024273, 6.66758 , 7.354823 , + 7.8755097, 8.416656 , 9.63394 , 10.973988 , 12.043082 , + 13.516833 , 14.911659 , 16.75407 , 18.053928 , 20.318869 , + 22.975292 , 25.166464 , 27.34265 , 30.13236 , 33.126217 , + 37.89362 , 40.11695 , 43.784634 , 46.754696 , 51.974545 , + 55.642136 ], dtype=float32), observed=Array([ 1, 2, 3, 5, 4, 4, 7, 4, 8, 4, 7, 3, 8, 12, 13, 18, 14, + 20, 17, 18, 28, 27, 36, 37, 26, 31, 40, 27, 48, 54, 60], dtype=int32)) The `sample()` method of the `RtInfectionsRenewalModel` returns a list composed of the `Rt` and `infections` sequences. @@ -162,11 +177,12 @@ plt.tight_layout() plt.show() ``` - +![Rt and +Infections](getting-started_files/figure-commonmark/basic-fig-output-1.png) -Let’s see how the estimation would go +To fit the model, we can use the `run()` method of the model +`RtInfectionsRenewalModel`; an inherited method from the metaclass +`Model`: ``` python import jax @@ -183,7 +199,8 @@ model1.run( ) ``` -Now, let’s investigate the output +Now, let’s investigate the output, particularly the posterior +distribution of the Rt estimates: ``` python import polars as pl @@ -202,6 +219,64 @@ ax.set_yticks([0.5, 1, 2]) ax.set_yscale("log") ``` - +![Rt posterior +distribution](getting-started_files/figure-commonmark/output-rt-output-1.png) + +## Architecture of pyrenew + +`pyrenew` leverages `numpyro`’s flexibility to build models via +composition. As a principle, most objects in `pyrenew` can be treated as +random variables we can sample. At the top-level `pyrenew` has two +metaclass from which most objects inherit: `RandomVariable` and `Model`. +From them, the following four sub-modules arise: + +- The `process` sub-module, +- The `deterministic` sub-module, +- The `observation` sub-module, +- The `latent` sub-module, and +- The `models` sub-module + +The first four are collections of instances of `RandomVariable`, and the +last is a collection of instances of `Model`. The following diagram +shows a detailed view of how meta classes, modules, and classes interact +to create the `RtInfectionsRenewalModel` instantiated in the previous +section: + +``` mermaid +flowchart LR + rand((RandomVariable\nmetaclass)) + models((Model\nmetaclass)) + + subgraph observations[Observations module] + obs["observed_infections\n(PoissonObservation)"] + end + + subgraph latent[Latent module] + inf["latent_infections\n(Infections)"] + i0["I0\n(Infections0)"] + end + + subgraph process[Process module] + rt["rt_proc\n(RtRandomWalkProcess)"] + end + + subgraph deterministic[Deterministic module] + detpmf["gen_int\n(DeterministicPMF)"] + end + + subgraph model[Model module] + model1["model1\n(RtInfectionsRenewalModel)"] + end + + rand-->|Inherited by|observations + rand-->|Inherited by|process + rand-->|Inherited by|latent + rand-->|Inherited by|deterministic + models-->|Inherited by|model + + detpmf-->|Composes|model1 + i0-->|Composes|model1 + rt-->|Composes|model1 + obs-->|Composes|model1 + inf-->|Composes|model1 +``` diff --git a/model/docs/getting-started.qmd b/model/docs/getting-started.qmd index 85f57f51..f17bbbca 100644 --- a/model/docs/getting-started.qmd +++ b/model/docs/getting-started.qmd @@ -4,130 +4,125 @@ format: gfm engine: jupyter --- -This document illustrates two features of `pyrenew`: (a) the set of included `RandomVariable`s, and (b) model composition. +`pyrenew` is a flexible tool for simulating and making statistical inference of epidemiological models, emphasizing renewal models. Built on `numpyro`, `pyrenew` provides core components for model building and pre-defined models for processing various observational processes. This document illustrates how `pyrenew` can be used to build a basic renewal model. -## Hospitalizations model +## The fundamentals -`pyrenew` has five main components: +`pyrenew`'s core components are the metaclasses `RandomVariable` and `Model`. From the package's perspective, a `RandomVariable` is a quantity models can sample and estimate, **including deterministic quantities**. Mainly, sampling from a `RandomVariable` involves calling the `sample()` method. The benefit of this design is the definition of the sample function can be arbitrary, allowing the user to either sample from a distribution using `numpyro.sample()`, compute fixed quantities (like a mechanistic equation), or return a fixed value (like a pre-computed PMF.) For instance, we may be interested in estimating a PMF, in which case a `RandomVariable` sampling function may roughly be defined as: -- Utility and math functions, -- The `processes` sub-module, -- The `observations` sub-module, -- The `latent` sub-module, and -- The `models` sub-module - -All three of `process`, `observation`, and `latent` contain classes that inherit from the meta class `RandomVariable`. The classes under `model` inherit from the meta class `Model`. The following diagram illustrates the composition the model `pyrenew.models.HospitalizationsModel`: - -```{mermaid} -%%| label: overview-of-hospitalizationsmodel -flowchart TB - - subgraph randprocmod["Processes module"] - direction TB - simprw["SimpleRandomWalkProcess"] - rtrw["RtRandomWalkProcess"] - end - - subgraph latentmod["Latent module"] - direction TB - hosp_latent["Hospitalizations"] - inf_latent["Infections"] - end - - subgraph obsmod["Observations module"] - direction TB - pois["PoissonObservation"] - nb["NegativeBinomialObservation"] - end - - subgraph models["Models module"] - direction TB - basic["RtInfectionsRenewalModel"] - hosp["HospitalizationsModel"] - end - - rp(("RandomVariable")) --> |Inherited by| randprocmod - rp -->|Inherited by| latentmod - rp -->|Inherited by| obsmod - - - model(("Model")) -->|Inherited by| models +```python +class MyRandVar(RandomVariable): + def sample(...) -> ArrayLike: + return numpyro.sample(...) +``` - simprw -->|Composes| rtrw - rtrw -->|Composes| basic - inf_latent -->|Composes| basic - basic -->|Composes| hosp +Whereas, in some other cases, we may instead use a fixed quantity for that variable (like a pre-computed PMF), where the `RandomVariable`'s sample function could be defined like: +```python +class MyRandVar(RandomVariable): + def sample(...) -> ArrayLike: + return jax.numpy.array([0.2, 0.7, 0.1]) +``` - obsmod -->|Composes|models - hosp_latent -->|Composes| hosp +This way, when a `Model` samples from `MyRandVar`, it could be either adding random variables to be estimated (first case) or just retrieving some quantity needed for other calculations (second case.) - %% Metaclasses - classDef Metaclass color:black,fill:white - class rp,model Metaclass +The `Model` metaclass provides basic functionality for estimating and simulation. Like `RandomVariable`, the `Model` metaclass has a `sample()` method that defines the model structure. Ultimately, models can be nested (or inherited), providing a straightforward way to add layers of complexity. - %% Random process - classDef Randproc fill:purple,color:white - class rtrw,simprw Randproc - %% Models - classDef Models fill:teal,color:white - class basic,hosp Models -``` - -We start by loading the needed components to build a basic renewal model: +## 'Hello world' model +This section will show the steps to build a simple renewal model featuring a latent infection process, a random walk Rt process, and an observation process for the reported infections. We start by loading the needed components to build a basic renewal model: ```{python} #| label: loading-pkgs +#| output: false +#| warning: false import jax.numpy as jnp import numpy as np import numpyro as npro +import numpyro.distributions as dist from pyrenew.process import RtRandomWalkProcess -from pyrenew.latent import Infections +from pyrenew.latent import Infections, Infections0 from pyrenew.observation import PoissonObservation +from pyrenew.deterministic import DeterministicPMF from pyrenew.model import RtInfectionsRenewalModel ``` -In the basic renewal model we can define three components: Rt, latent infections, and observed infections. +The basic renewal model defines five components: generation interval, initial infections, Rt, latent infections, and observed infections. In this example, the generation interval is not estimated but passed as a deterministic instance of `RandomVariable`. Here is the code to initialize the five components: ```{python} #| label: creating-elements -latent_infections = Infections( - gen_int=jnp.array([0.25, 0.25, 0.25, 0.25]), - ) +# (1) The generation interval (deterministic) +gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), +) -observed_infections = PoissonObservation( - rate_varname='latent', - counts_varname='observed_infections', - ) +# (2) Initial infections (inferred with a prior) +I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) +# (3) The random process for Rt rt_proc = RtRandomWalkProcess() -``` -With observation process for the latent infections, we can build the basic renewal model, and generate a sample calling the `sample()` method: +# (4) Latent infection process (which will use 1 and 2) +latent_infections = Infections() +# (5) The observed infections process (with mean at the latent infections) +observed_infections = PoissonObservation( + rate_varname = 'latent', + counts_varname = 'observed_infections', + ) +``` + +With these five pieces, we can build the basic renewal model: ```{python} #| label: model-creation model1 = RtInfectionsRenewalModel( - Rt_process=rt_proc, - latent_infections=latent_infections, - observed_infections=observed_infections, + gen_int = gen_int, + I0 = I0, + Rt_process = rt_proc, + latent_infections = latent_infections, + observed_infections = observed_infections, ) +``` +The following diagram summarizes how the modules interact via composition; notably, `gen_int`, `I0`, `rt_proc`, `latent_infections`, and `observed_infections` are instances of `RandomVariable`, which means these can be easily replaced to generate a different version of `RtInfectionsRenewalModel`: + +```{mermaid} +%%| label: overview-of-RtInfectionsRenewalModel +flowchart TB + genint["(1) gen_int\n(DetermnisticPMF)"] + i0["(2) I0\n(Infections0)"] + rt["(3) rt_proc\n(RtRandomWalkProcess)"] + inf["(4) latent_infections\n(Infections)"] + obs["(5) observed_infections\n(PoissonObservation)"] + + model1["model1\n(RtInfectionsRenewalModel)"] + + i0-->|Composes|model1 + genint-->|Composes|model1 + rt-->|Composes|model1 + obs-->|Composes|model1 + inf-->|Composes|model1 +``` + +Using `numpyro`, we can simulate data using the `sample()` member function of `RtInfectionsRenewalModel`: + +```{python} +#| label: simulate np.random.seed(223) -with npro.handlers.seed(rng_seed=np.random.randint(1, 60)): - sim_data = model1.sample(constants=dict(n_timepoints=30)) +with npro.handlers.seed(rng_seed = np.random.randint(1, 60)): + sim_data = model1.sample(constants = dict(n_timepoints=30)) sim_data ``` The `sample()` method of the `RtInfectionsRenewalModel` returns a list composed of the `Rt` and `infections` sequences. - ```{python} #| label: basic-fig +#| fig-cap: Rt and Infections +#| fig-cap-location: bottom import matplotlib.pyplot as plt fig, axs = plt.subplots(1, 2) @@ -146,8 +141,7 @@ plt.tight_layout() plt.show() ``` -Let's see how the estimation would go - +To fit the model, we can use the `run()` method of the model `RtInfectionsRenewalModel`; an inherited method from the metaclass `Model`: ```{python} #| label: model-fit @@ -165,10 +159,12 @@ model1.run( ) ``` -Now, let's investigate the output +Now, let's investigate the output, particularly the posterior distribution of the Rt estimates: ```{python} #| label: output-rt +#| fig-cap: Rt posterior distribution +#| fig-cap-location: bottom import polars as pl samps = model1.spread_draws([('Rt', 'time')]) @@ -184,3 +180,55 @@ ax.set_ylim([0.4, 1/.4]) ax.set_yticks([0.5, 1, 2]) ax.set_yscale("log") ``` + +## Architecture of pyrenew + +`pyrenew` leverages `numpyro`'s flexibility to build models via composition. As a principle, most objects in `pyrenew` can be treated as random variables we can sample. At the top-level `pyrenew` has two metaclass from which most objects inherit: `RandomVariable` and `Model`. From them, the following four sub-modules arise: + +- The `process` sub-module, +- The `deterministic` sub-module, +- The `observation` sub-module, +- The `latent` sub-module, and +- The `models` sub-module + +The first four are collections of instances of `RandomVariable`, and the last is a collection of instances of `Model`. The following diagram shows a detailed view of how meta classes, modules, and classes interact to create the `RtInfectionsRenewalModel` instantiated in the previous section: + +```{mermaid} +%%| label: overview-of-RtInfectionsRenewalModel +flowchart LR + rand((RandomVariable\nmetaclass)) + models((Model\nmetaclass)) + + subgraph observations[Observations module] + obs["observed_infections\n(PoissonObservation)"] + end + + subgraph latent[Latent module] + inf["latent_infections\n(Infections)"] + i0["I0\n(Infections0)"] + end + + subgraph process[Process module] + rt["rt_proc\n(RtRandomWalkProcess)"] + end + + subgraph deterministic[Deterministic module] + detpmf["gen_int\n(DeterministicPMF)"] + end + + subgraph model[Model module] + model1["model1\n(RtInfectionsRenewalModel)"] + end + + rand-->|Inherited by|observations + rand-->|Inherited by|process + rand-->|Inherited by|latent + rand-->|Inherited by|deterministic + models-->|Inherited by|model + + detpmf-->|Composes|model1 + i0-->|Composes|model1 + rt-->|Composes|model1 + obs-->|Composes|model1 + inf-->|Composes|model1 +``` diff --git a/model/docs/getting-started_files/figure-commonmark/basic-fig-output-1.png b/model/docs/getting-started_files/figure-commonmark/basic-fig-output-1.png index bf3ee9b85224e38fceb701ec2d2f6cbe2dc77174..a751b6c433666840733455cfaff86229a2b0a84f 100644 GIT binary patch literal 36656 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�oYdnran0 z@$W%V^7!y!q*#0;G521l5ZHQY&?e6GUc2+SGn=s^TGuAr%+MMOhTCL#=z33H7IIuh z z`(~P9LO9jGjaO4h|LZi64b(l0g;+m0)$+8_cen&CH24uROh8zmIm8W;Co038hnz^} z1n`wX5Tzo5FNU6MqXwDkg!3%#|Om8yVRFvvCtKVWHbXx0-7pu;0dTpQ&N-z z%s9Euliw3FClRtobEHUa2F!9Gq8tn0s0glTy!xMUF^VJi{#;Q7Qj0aSW#S;@MFj)k z5Ex8SAShms<9{1T`qdc%k<6~{(kwrY913+(t*OY@fx+3j);2>;gopZ*p>+&m*&&OY zh%O$|pVN1p{r#^|oIj6b`0`Eq^IMvZw^$0DL7f_KW-Chivvn zcvJgmsr~+ed)(VUKLX&N;GN#sTz*h(aB|)Aj7f7TT-BT2dku@}*7yk2X-M+b91sVT z07Zh>0w9gY6e^{)0KOSQ|AaE5(am2gG+NCNG|US3D{#M^5fPQbFuui9;7?lpT@!y? zn4MvUqBwiNL<9d3bghx->&-&hW7TyunNHMPZLX$n(P#ZPw&Wvr04-`AEkiydgNfAO z{K~ku-&%b{naQZv%CB2zgM}1Akwta{`3e91qWXJPj-UH)mR9qde@|WlhfAGwljDpG zlEbZ|qXR3kbG|bM`|HM&wu=Q0Nj_Qbw0?8!@`~#FEwScTfchi&LBM{q; z?(TeGaR6YA1sQKbAg^B6?ZX71j->T~z!)BcflR4L;5S@^inx4Y4Yj{BdfSiDjd2G5 zUBpH>xD5|;uG6O`CNjat&^Q>gt0n+RdmC6aI2K+XO{87{gLlYhyOj0&buQ>9$;pc@ zGnH0-VIb_5Nd1n1GMWWN#?8%*BS#hnhYtd~Y6CFPr{i%QxlGkjxICe5TShW_}` z{BB5k9`fY-o&SCrk(aM<%Dfm|vC>Zo{Mz6xj1<3quxf_<*BS$G3HyCXyKa-Uyz09CkMpIw%H2yNYGDep!c(}1@*3u*~Z zZwL6V#NB^VLL?yi5YR|Sa2>GG4}D$*49+H?%XE*k$eQ!(xUsd|(Ue8-6*13(9E{wGeD z=d_v%oP|X0OGwOnE>!4a&4JAbAaD-&0I9y?0SGnw63F_)AuX?Zzjo@;r3eyw?hk*7 zsKb}t1^|pO@GKBEA5LxfHRztcaTphxgRc{^;pJ6Tqc<~Vj+COJqsd{pLlOzBFuwW! z?QslgpCdykf=m(;_h5^azjG(G9JYnJw52p~eKDbIJtp8#c=>DyLV=kBkpd+Iha)@; z2nSbj5~thd`>KT^8?mb**zvF*5SQG4d|#(?X?R1CfOx z4_v`8cnWd>y3huPN=_gNOf1oy9Jw>h;KLW$S~}-zw)}oe<|P@9rWtgTnDa^(0R9Vq z{^xh<-`n5+!%O-9`vo{{xhNldIKrDt-2dPzoU1`3!-YwTj>7uOU>%o?+`A9HI3t-X z8Gp$LQpR|2QmbRaBO_UWs0R28MR+&)HOMpP&E}CoHis{{qGA)mUxP?33cvxR`f@2M z%0)xlhQRwuN}DT0e5a;HG&D#XI(J@xFB%c$d?_;_MR|cO0sg-;aA?eMY@!Cg0^i_+ zs_{(_Oj&?q;w&ktG9b4YycfygP-GHduc#;kDNIo>FMtRP(j&zXz#)=J@cl~(ErOOu z#9zpHWZG}%ChVU?2yJV!&ecf96OK=aLTRhWWZy(W<&`aU~G6n@C1{8wqgXia^9ygfG<`F9ifFfex zA6k@vRWBvH0xaOiAyoj-r4|orAdD~qaI1ND00g26=Qkocak3y`70OVxt$>XFi1~SQ zR156J;pOE5laL~c_b#_5WE2NPp+0b?G9#u|#YHoOgaaGC)5OEKW+z9#5oI4B;gI5um{xQa&{B$kwOKM| zCr|7~YK!d<5H=w^jc)KPB1R&Bld*tX6<%(D5laRBoT4!(dyxX7hXs`S$e;haa`pe@ c$%s0|$1g6HY+6}LK*1l?8=8ux@}?pG3*`WAOaK4? literal 36449 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 ->d#mH~ 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 WW^%k=;4KP%?%h$9|0ru3{J#Kp%M|wj diff --git a/model/docs/getting-started_files/figure-commonmark/output-rt-output-1.png b/model/docs/getting-started_files/figure-commonmark/output-rt-output-1.png index c1fb3f65d78501bb723c01be74e88d35f6eecff2..c67d4967d8e6fdbccdf035c950f08adc9e57e329 100644 GIT binary patch literal 26746 zcmd42RZv`C^fib>aDp{%!Aax6AxHxuxI=IY4vo9J6EtY>;2PYWAdMtQfZzc_2;DfL zfw{l$|J78@)6By>d=C^=^u6@C`<%V^T5GQxuc@v?fJ=>wf`UTuMp;1{1qC$-_{qn? z0{${l$qfg7iFrW`y>#5{ynHP^Y*ExKz1*GMyqq1Z7=3I#JRRIz1;L_VK^{hXFE4jb zab8}R|N8>4o5y?JiC=~~z(0BBu59Fqf1*d)fnI`Xp z423a~tqss}GVir;j)Xs_F(T|yZhC{S-o)gOZTI{ziIgp)*G6nK$s(+P){5{e zo+W=0zrc%YRS=G-VD2i;y2S+EWTI81%T#^+_qX0FAvb}=H>rox8ossfwBNc`+iq4<&*TXLsgxga$E2IF=UCKg<}*m;xIEEP4|TvplOkntT{7hOug31JTN1aB_5>(S-aC> zA9zsJ1pEn>eD=s}|0@5pe(iK0egtFOo`A4$bbo)pbx0vbD2a^#6$)}pNX_%3fjlt= zKjnJ6R=s|OJ{{h3B!qETw9?_jHYo;l*`qW~kk#e?Wi@HQrLr$Do(BQn67~P}5&loT zi77oI^k&m{FM+#ZFw4L!zUQnzuqy|M5mZqVWbNEV31xHmV%&NDl^d~YohqwEX5zDE z>$jh-q{)?)awpa9!jeBb+`^Mv>5pab7P!lbqE;(@eMjcsQQ2yXE#CQ^q(>KRyYpIv z5<{?8R}KWY=(9`q)@~w&20)&Gi(XiPH)3q0&NGs{*K2`M8(DQeAx&ECN4@C(F zZUkfQ4QL$H?zWY(vtzmMA!ZVM^?kMVeJb+bw{K)M-)oS*=H?8Qm6h4f$-sem&;6F` zHlcJoMdI)4KC=l=m=rcd%l-7r3jGBlRq7fYMs&tUgIy1h?UfiK%1 z2;O@C#W?wNqbq}d+^}`chSJ0x_2ep`ZsnvI58N3hoIktwNS|%Xk22FzNBTJT-$Uh% zIev3U-g$z@%8dT_;-por`zv^s4JMJ+gtGiZ z{t~gavf9lI@u}7w26h2{yO%nBAHg`7p&=a)1f+P;^ErlWudyL;D2FNg!({%I$qY-~ zY(%=Ox6|D;_n+-;o`s08v9m*;9&W7d?QtZ0|BhzAeAncCqMwwKGIw9Zhrc6AC<#MH z>1@E8fD%K}gJxz$wvyht^^pf&{|R?lU+oW;z#kFa8H)vqo*qowE&-L#bj1jqlkXV_ zAHt>#LKgb|oN`_-@_m{sl=!$Odhz$^-^#!o%1qDck1ubf*%Fwqn^S|62nY!UmW0-T zwm2i?o#$waCbDIq?a9rKwco z$j1b1#+=2z?Xv-THD=m&v1J6~@MRnNxZQ^qUP?VZ&H6m$Dq#f@%HS1(Y>O{I?&L8J z$wVrUj9j)Qb65eNWvU#r2D(DD=2voLU)4tPTR46Vce!W3qU~oGZV6H#5%wn;ttCm= zDP{ugSutSX$CQ*d^0w|1=q8kYGMRg=X9@%zh^6IZ8jRtIY)2Foh+q-r7;KL@UpQ@= zDw7B(A0#hs-^VGAgdalYg=`nB7$Eq4MX8K&X)v0J`kx=wnsZ|+If3nKTc;mRE74V9 zNdW2UrNdl|qywZFEGK<|9R|hV!V>3C5RD%zQ%vU4#9}zC;19&dLVe!AVZaJ@)F5Ss z)|_zta3M+|{c3n0ufiV5DAzIVLas1X>4H6ZfDeR>^Tz~B&R(k1D^pdqH4wuYQ;wh} zPbD!VcWJxg1lOaBYCUF6#(V?V;e^t`8x{o;dGLE42jv9DxFw=zj}E)rL$7|gFtneJ zK;@3QBf`UJgJhyCKhJxU*VMdT(&gN3p!u|ZwbL!A_o_NGfn%34+zb}$g3UqU|EBUa zGHFc$iZU-mt~EOEh%gRaC*a_eAmEe=$R9;P7~HI4){7~Z^VAWE3mk2K5Y;SHWcumi8$$`n4bt!bJ% z0V;x7w$u@t7+eUdB(GfS@o-CLRf;X$1_C!6<4K5LC^ORX zGl=@@kdSxz5_Lq_(1qM>NED+*6AzKKwN#X4l;ii&8a+%ZW7M#K%?}9gt<+uDA7nuM zvdOn6)9LXei-|qN&^H@m5m4;*S>NNa(r|6g$e^FE$(lvQrme4m+*Dx|oET8j3e#1I zJc-FIYHto5AR5t3pQZxQ&M*~=Y>P4h+uaZIeMmwD7XNu9htUib$N(&mb#89c{OLas z{al&$)J&ji>+x&7@W&7f$Ap#HciFLzk33|UpI7`LsSVs5S&Kj}cDmw>gU(D(*;-r)&$m$Y4xUn&vBrsuUuaL-c&Vxy<`((zNx1-rh+MLiJuD|h9N~F!rl*Hl zL^*sRWYdbZ=s-||tE#%1ThKNL8UY@^#YK9AZ=84cxUK(lFQF_)5}Q*2@p^mutevG1 zh3b;z&K{LDi0<^OsaM5^k2(j7_M*T}B%o!gIQW^xrKeMr;&4!m5t@frBHWWIt8pT5 zuDYWYMdV=}*7`)6*k~ zLGGivr}L8GE0D~e%zpcIB7XLF7I+{H2~n@lq%x`T!cGZqkzYwChTDUU!fioZHF_Be zGDAH2W%jY5)S6_N^73Nk+SEZZ!{0KKt@xw8jB~!+)_k27)Zy%Rl0Kv*zrPlS!YwGP zGh@QTd6pY_=kT&_L*n>sfCZ0?_}k~tl*0R|DrNqza)hCr_=HQRYn+Ez zvhl0}PSIqz*I<;AmLku=oq&z#5ZNuD|Fu<8?*p8l%T{?{mRjA{(E zUtD}_{wOu%{Pz3u25SI~0_HdEgIA-y80nV=daOSc>_4yEIlRnRm|y9*y%m9(A}Xstue_v{Tt&5h4X(0&`1f49x+}I;e;U$wShjv3uP#nU^f8H0O~(S% z8zq>vXj2djlv%#D9U=lT_V+FX641#RD>w@$EFqr|Yl>E_QpQ@3fz;=B+&JvC?&9Oz$l zBte(3oLgxh2; zZfsq#^_U5t#ps!}ku=Y=l6d{JO2Jy`BuKt>inOcdtEosAUKQT@^}%4Km$7`s2idNI zn7t@>)1Rc8wYDWSDg`v#kJ4jSzjI&VCn5MgoF%@CLm=oYD{1}AaDY^RkN~|Z0qvV3 z)&7NpjR5mPZRt9}uRogp25xay{N#=Ntvt}9vcu;E_(}X?nd2>foX*mX(}__HPJH;} z)tR_U-wu;2$yj*0ZqY3#dHF0sQ;AAk6|yUO#{+Hi@sk&FM#5Pz8V-tTPVgH|{7@6+KPz55xh)?1iwM6ax)Jx6R%kp@ga4e0s_dvL;k{{(>c0~}`nnEY_z zrC@hS=?pZBW85Z}l_ef(@$)nU3FNYc;vr({gqG_#!}v!f{K${nxO`#Ja^n5&&>pO5 zT;Qy*8P0>iWM)T=!xT|ZzgtTmuaoBa*%Rc5ES%9Z_KlHe`t3w_BFD zbOmoe003=kb*LlTQ|7QlVvJoh603k8Syi;AE5PkQUziR;4SgvI6hQkgCP(57D~259 z*`u%i`QaRDBY@ga4S806+vz1v5A?l4!p2Na3LSxORv=@O@vj=XKxEtf&lHH8R$J|V zoiTwKllc9$C`Hn_QE$f-k#wmCwl+q{HZ+thmAsfub`0EO9;T}2izHJLdYC36A9`dE zsQdl5y;g^YRwI3%>w-JE*2z|6lmsxmg_FC_EA^}Ta*)taEK8h^e&8%^ z4vMA4k%9FC=Jk^<}8^S*6+SJtQmhR)RVPNQS}O2vx=W zi;g27skI%`db`OZFwlZ|nRu&Il(fh`reSs-B^pX<;I!=Nd&CJyPCT;_V{g2Db^y-L z2|XXB8-(=fs!TwG)Np;OMj+~=8Sh?#ajn=nb}w7UynVJ%!uH1RPzSy5juijSOw~d` zIwc*ehC^Hd6-~a;WiY)g_z!yL#;KvlA1(%D43(n5pv7 z@W>xcwD^$!*Rcb(<>bDr7k|$fhn4##%Eu(o_;B)yHfMkSuV%Lpk{zgXbL6igY1u&l z6OQRgJLuN-`nxbeSG>*oGN-97YQlk&3Ow+>6PwTX>P)PqZ&v1??wEL>(2rf5?gc1i zWqqr8%paK7w~D1~nF<4;CL1T*~HUc=q_*gDXOYe<7nJ*DG(LaU^Z3%%>#n1Kaz4*qG_$_F^!%@Zn$EAF&XKgUUVp1s zXx0fyv4LhUe19vQag2d;&MwKj@NDp*Mt0)r#N3F#M2lx;dR-I2Y-LP^ze2>ZiF^QJ zqmsI_BkA~M%-4Mmd_m?!N;kN)lybSqOQsEk=4V5Y)o=tr8(-1!RSvfFcA~}Lk)*!6 zm`Df;BNiN)2goth3pxiqO_|pBaK?A&Bc}V5wFhnu4PS4(pMVhivSwiiy-k??r`AlPO!|u zcgISeaPLjxZ1S0EtmiEJ5QbRd04)MGFiPp!YeNUp_mnSg-%eJK!%-&->o_(^`3<#* zil-}VD#o2#1s7OP?zIX&EtNRb)WMZ2?5x&y<-gJddzEV=BW0vr0dNJvq6~&;*_ig% za5eFmy?oIvdT~c4l$=A_Zro5uBcrup#`o?Ifjk5xV6@1oU^H5I;V)0<@TS5KJ%jk# z%Q%BS2x=+rQI0;1YX#knc*$i*7X1Y7ZWtXgZd+}S$mu;-5aM;2Iq*V3qH!(*I>3Ik zwijkC7t!9g6Cc{IP)iWfYZ&q&r{7~jCnOzc#CIkQG**71sX;|KB@~IrVoT!+lTO#s zx+b3?I4^USc0|K3Rg6Cq7PEf>YRS#Kb2n5wZ_2&2vU(BZ=FZ3dRx4i(d$uysZYk@G zU&|p={iIoA37IJAeNhx5PUkk1yovY^1ev95Cl*?CoQ(av3UN-InVkn9fwY@4$zBPy z*{{iHB}jGVhvtBhZ3Z8NrA<=F`qhGK4>V#f%o2XvcXUpkC9+HKVw@-8T=u6h4FDCi zcs#7zRH8*3!1>ERRDrcZ%@8nd+IYO>N; zqAzIMN)p=3t04~XS6vlr0An}`M>1Lf1bK{7|M6c+%JsbcswNrO>SQHHv-TrE9oy*! z`E>7$FIu#P3G-)z$VNG>gEk^;?+~tHk>TNWJhma4CsMV*dGH(zq@#^FhVov%X-9lTj~ro|-|C03ltTSXTWzgAd6* zMU>-|$vEE~vA7K=_Q$QPN@D{GZ-4=TUAkN!t$%EJr2E()&HsFh zPK(Dd>vNs5u?F&IR-sf?_gnc*fHW=pAW&AQ9CwEgzizfUoR@Hve#G16|JxUspPT1l zbCuZSLD6HIu1i4~X2u&Q^_V4UGUjwOeURCE8^76)lM|;xA40O*cu=F~f7G2IANwP> zz-#`*AHm7>nhfDsZ2U42;7lH3Ed8$&H1QMV`Fj7f>h5NNv&X7}l7Y~>UeLL}s%0r$ zwmodiC1n)P^EQ=jJ)YdEHS5^E2PhSp;}?7{)5yK37DvSu^4!XB0-CP^U10Ff%?5Uj z$lkvpuH%CENJNoUvewlj2K`EkGnENSsZ$Q0K6YysFm~U?-Pm`JeEb2Q`!AyznTYls=ao z+!XXr`pC{QmI7-*v!_m*0-fK2rH_t?4eZPtEm?Pij^o0aEdXYb^NY zEh|g=JB#xOG7J-wKq;d8n+|>{ml5x-fq~EC{P^i{cF;dY84@09dzPiHE0D6CaDIvb zGx70>K=%Sh=|Y>`zc!eK>Y%fBJzXvbe8M~cB{lI#@7r1pCwNl5uCN+cvjOOW3D6OE z4rlD{&gyDv>ZXA*%#owRH=9Yz%Q@P;1a04C*3NP04B)2?9(QjIl(i+x2bQM zfp0cG_l2Cx6v4Ymtcs_P;lW^9Kz#A{KGY)TP=jS#4b|oPNstcq(b#e zQ)2}>@!lJck3$S&`5`gBou47AO(juT+<0)wqF#E?Bon^;t@M_6<&vYMUv%K5Qu^mf zOT>w_MbL&^&nXj*+-f_~7Pbm&jH7U(TzIifi_v87REaztt=OV`efH4r@0j}+Sk4ld zu)X-X_r-+~hX^i^G@*c8v;8Oi=@L!lGLu*7vyM=+h=JwP_Ee5tc2L+@*E1<~KWvY~ z$`fNrZqb*#D8Qrl!sXC`Umv-vzpLujR^or;NSG9X54>-r9CfYUXv7KYC05f2Jjb|P ze5(e0-fKaD%XxY89)Y}Ag34ewIq29H9i0=iz}EcCKc> zD|T+Y5dY>Q);G+ItH$LZ@Ozo#uHfrPl%=!p-D%j)X<*HO;5ckrfh=a1o7AAu8( z2r@nNzA6pW8La|1uf5R5YEDsNy8FP)VREOJI~($Y`bmp~f!BeDr{LcLF}}2XTf53q zLm?ZS7>2VuLLi%L1O%4}Ehm98+*C*WF)4wZ``oar1?4rM*D|z{y!mz|h?QFzV*-w5 z#7S2!A^>Vmvn>~8i34PBQ*VfQ zBu>xo?gXGz)brg&&)!gZ73TCUpQzIY;2t7rLn3w~idCwiS0CsS#fWZf1%l|lW*5%?RILY2Of%Z zwz+vNsN1cwlwBD145LqUoHZIvfqdzY4{UNaT4?jO8xL7n7FSv`gm z$8&Sr0J>(SEN;b_;AgH#%Oe4LB6v-j87yOmU}T#>DP<(s85a}1pJB@K*Kr#gw?R>8 zf4E{KyQ1le5;#ZEoIxXG`DDZKpV(TYEy9$A$fZ0@y|&4P2%FGr;RKU| zg5dJzu*t`Tzd`XMKTZDWGZqzyrx;67%NVcFRX6zr(qG!Tk}L}kkJq5ET48sG_@@n9 zcN&ED-HXqOV?t&ZdD8nH)vKOy=9lB+0jnL2@#xs%aLLDxNxQqjkKb$YKnxx8$G3cH zbiu)F;NGSfKrvl8Xl&*Pt=V<| zgSXGv@|J0%{gP;sb_Yjgi zZuyuY`DDp0#BY)(#<*QJ74sDS??R8%Xh>#aNLosJVl+nRGqLaL@21ZyIE3=S;&dVn zi#RBJYpa>Fj&aPaDLLoBK+wZlNK5+2pGj3`B2U;KpNLYE3o*oDZ7tahis?nQzxs_P zq&Ae!ve9iQs&`JulDG$_|Lsk4EaWx=XjDTNqpo?0tqwH;1%uo%j29%bgT9~F>e$|* zK>nEEZ2n1ESUbr3h(DkVj7v!YF4Tz{H}NgnFm54Xwvxs?4rN61lLHbB;Lv~`$}LYY zwwrX;pNqNO4Nwzwr{#TMG?JXZ5!ANcud4a9OQ{1W#(=z8QbPOhzSZNV`a}}!nrG4$ z6Vt+{2B<PU_r!qoDakvE$E&(G7_J_qwg2oK=r76@ zLT&3C9I5v-h$Y?naqhIyDW;5t3aX+bBt^t%{g=D5-EQfiVkR6Au%M%p>DMNo!ar{I z99`u~QNCtWFJ<=f_c~G%{n)SV^T=$##C1LzN<}(G;aVV{&-t+^x#5EE(2D7Q+B*^L zHUqr5*_GD7z(mO+lau9`=!isj7|@#KJ9uRN&UjZiWLti2IgUBRyk#V8zW3VH z3=#Dz6hT!}H`dg{OoB2U$ZOm-cm-{IxLV^j__fCcV$jiG6-{uP_=ze;lPmgJg^~vQqaPAd^6T#J8gj*RTE)zyW5~wIg^Tn;-^G9d z1q;wmxD6=h-6iWzVP%`=?njz5vz6%ldxk=rVuTtXydBKUPUHADi3iU58LYWi-7NCv zC@?yp86a=opAVpvS7|ldTZ|P?RcXC>Zq+k>;%AeJBk{h;%+Dlsey%$I;2>KBM6-$S z5+%JLoHHu=e0>X00Ik!Eg6x__sdIl`p#$Xb^z4P|Ot8yyK){xKOceKd^kd-R#qh#(bUx^XawH~yM_a!B zX!vfnO#4^FsVLO;!*k1W*B$qf@u8UL5jvW^ejo4|-D zF(9KjBwTEAq0GntOY*)3$>r@KgsVzUs4J^n471rYwt#kPmCo*49PER8)%`Mh2h^4Md)~uNlyBn4DB9qVcT$>Cb-h}_~dxo zzShOUjw{d7{(PX7?){kJj(ya?2Y09`&;KIZw>w**Pmi6te3_4kyC5#tjW-jf^`4E} z8;1%x@wH{C{u|fJke*Y^fFCg~7lj259>xA7_Y@Oe>x2u(qLVg$qOn8<{N;VXcmud( z>{}+C0W{a6gF{7zZX&jFHtCR5qE>Dw&bLgEGSv*0sDX(b6%cbMS#Y;%L~3ToH5ls+ z{{9Z(!=j3$m>RT77rAdUF2d(@$UBPA+ZF5X)i=k9I*AcTpPi;0>HH=n*EkUx>-8hd z<-R3;+M7j}OA`M@0Yry01i_QF*zAHXBaCcRQiOMGJz@5mg(YXv3e+S}PW(7BLXP0+ zML&OfSiU-JZkI`1=uVC#HEj!!ZYv-J;p$d0o-=>mM)+_ie6sV-#YBI%oQW9Uk*?$U zC@?oYdr^A3KODWnN2ZYe{Qe~N$Vj@SlFgGF#b%9-a#xquc$bM3iZK7el`6*+t)Cbh z`S0Ii(<$*)H>Ms0nP0{NhPDC!bFxAHL#de}+q5bB2_bwF zoc|>|`P`;T`CzcHyad>bLn*6|zEy8Y+zG<(Xv6wb>CClAxbqQeCo$p|jae!CPsx}P zOXs@8sW<)8VaQ)tfTJ!6DGjJglP*nf0%H}(JRb37P`NIq zJS!=UK4p_@QyBT3Pz*O4?wU{$ozsreK*6Zsp37%Wa!ZlHe+luvCX!JX|8O<;sDqe1 z=wwFQPAq#*tm^i*x7(5xSH>{EOaAPIqEMMeS2l~jPyaCMSe;27JLkvgUNur1{PiG7 z^|$8&?9<9#)+=7sOZc`jokns;$>*?2huf^=;M;?tSL5S7uY)31dn+S+o#}@w@@pm! z3H~c;C27FC)*rQ$s($6-K;a8O?|Bkw7NMk~(zidoBh%rd|gORw5r)$z>#nYGeBgiup1P;`A?@#*gjiddEIz8-5kY_Pqt5}|yjE3}|Lf2-i%9a-jK0{mA$ocx z5Uq5*yl`^+dQy|4(*16n%UNR7erY^Cn_z`-h#5=IV7K5i+7T|X!le9AJ6;TQVO$_# zObEazfG?v*YbAMiB_$Th##ZNtJ*UZ4!4HswJ-+fKTr+#)+iTKT_;5NQG1_rKN{2aL zoUf@+Qbb9~a`6x;3jy*>iO}LEQ6~;G$oxqrf0#z(d(%~Kh{qp!@ua{BqtH8tB6O}*G)1h0TL4Q!B z{}sL;1i{yH>V|JZLqLV?v0EFGNwD6hD?T;(fOm9sPKUM&UkeDb;h&#ZX+8GqR8U!P zRm|m2IOj=D*sTi+5>d3Uk*Fo7kdA-1$Dgf?HA(Tc-x=t?*btqG?`+{@4a5nM`pLu2(|F zVCAbBr1b9x3*f;9h-qkdbVdo#K3;}Br^&Badk#Ei&@AhUTOLU-G zCy&ERJH!O$BH=#yIn8#hlB1*1Z)M3KttymvPAG6V>Q+6!k=0k4CGB}{OkfUELD1yj z2wmgxEhW=~6jAQRrqYd{%7l>6hk4G`TTH})$7=e!`uVFfxoDbiPe`W{p6?Kf_xvhI zZS^9K(c19Gr;1(nW=$cvP}l!!&9GxJJ%slXFVdFu5TCNCUnW-0SibgPB3_jqFot59 z5$`-wvbmoVtsYuVc;|w-O67-P%f$-4ae>fqJNU~Bh6c87<^Ha=8N8R`s zI%_#W{~MCXlM`==zi0-#+6F{gqc3ak@BQUhzhy>pB+PHQSsi>utI_lP+2p&lfA*w4 zF|tCxn#e2FL}W3@FknmiGxWgtPUIHhxp#ZvhNLYb-R;Xa*dYpWA;rQvZ}A<24tIL~ z$e{RnATTfqH=)|S`Is92j3x<6+ND>U;JJ&~9cBt}j*`jX6C?wKHDC3>#T`ANGg|?1 zULckR8s@^)E2hfzHUa8!ZnqN<2+_x z<5CVLH^;!J2P}KICXTLb%0b zQ$<}so!L|xSq)XriWlbp2ZN&h+1kn`Fh@tPL{Q>VI|BJ$jIKb2c)9^wZU|*N+U{Bf!BUgM2Vow@PXr4~} zW|86Ybdvve$$X>&F$Pw*u$Zw}E38aI=?z?tMo#pzh%u1EUweFBDv;P5TM$R#$cL>f zm+$6-B|@e6klV*vl9!h+{%}NDeg3S!*!gSmyWiIGmwA?u@V8ZZLiroGa=LACtG(`6 zSCSOIianEd{;fZMd>LD1iJRD>+G7!a8ekZR<3*m}S@fZVdVOc>-TM*=%}Qh1ln%X} zAqmuUcGWiW;}a#)FZ9g6m(6mvlX*O~8OGVsb9fZE#zbe2KqTQrY;q~V&(OPLStjg|tntZ^1Vs5B3 z%q2Ej7)3-~r-HYCPeI$J)rjulfsKcIbX0*Tq13`+FmrjZpW$mUtIC6qv_J$e@(99_ z7au*Ig3>>JRO`K4xghTEnuJ!_%{+j zI=~5JYD?QG_z*vP@(&)f^6gVi!k>F$Df&{m8to~I?=@%vQbYi402KF(J_f+T3|J;t~GP&6kJ~DEHqV?Dtvu28SW-@WYPAVRqi7pofsVC=4 zA2^)nz4flmRd39A*+Mde$&tF4hV5(k6}DH#2b zlFwhoRXlj?JCSWEgSz;qn3#gOW!FH@0#`gt`NxM=BhxuCV%E%!65%)+!f4*_svOBr zA%fP2qfxD1##wu+-liFz?4$A5HvjMe!*!Yt3DO*Cg*#gr>6jH*4lf)T4jpt|$v__; zJL(49UW9bNRhoY_D-c)(q{lTUvXPNoP;Pcx*$ea1cz!xbXfq*??1h+U8zPq-dzoX{ zlc?|`8#|VE7{1zNOwiy(uSE*qVo$Y8(TWYbfEmdr<2eAlAA2rT*0nK?{_y>-{t#(Dqwp7+vo2q`p26Q zY(z5l^$;HOz9*-lEY4^AxG?f){GUOOC=Jq~D405_5-tAV7pY+_w>*0^zujG)a*w;Jk*p=yXG`BPNB760XbPCm(fE{_a zBF7l;=K?yqVNW|SLAr=z-mbkFh=YYZQKDF{hHN@PM;aS)&;x-{u9`3tXqXB4Eo9ei(o}!`D$T;z6T2Q_{GR-E^9_jcZ2eP&w{1(y?y@ew zYK;d6`m2(b?$5%)rc4BjJ;XF2mx#5#P@@r!bdEFaVbkZ9` zNA{F}Q@(M?MB}+D&xDM#w6)*O))N_v4#neM_SLQ1iWwsVB?ifVCYZTTT(4Ytrd86` zQXM)>k9SzWlguxOV|W^r7k5R4esRVW(LfMPsph^fJ=t5&vhlb=6n_q19uSae-|?3)(PP7pPWeK zYxEQvS+&~vT24^&igYWB0uP!b*5}tY*vj&dSM@_eUb&p)ild*R@oO5ben6Xiha)UM z-)gvR0{nl8y3X|7e-`7B*g)v8dF&wq7F~&2YjBZ!Z<aSCUV!Rsoh;KR>_8n4yVHhX~nawk0*ex(czx_BBd^H^#yaAjq zah(ms9_fB$loP#W*gOtDnz)KX}_mihm=2wHrZqdp4ND^LqdV)U{AS!SA)wv zqB^1Y7r<$beP6H{P{qWAqk3k`(mhG}J;^h2OWg)$cii~~N{5_ZzWB;X@L)??Yj6nt z=^uRII20@+Ck@kZ1`KB7hP|BIkN2%3F1@KN3J!s$$&{F-G1OoJ92?*I=+vf@b0nc(G3{?UmbqOh1@JXj-DR)@Uz zU?Zfi;lO>NE7rB>ApVuVFjlX6pD>GItTYhiVX|-G9d9THZFs*MoCLeIC9<7Zxe)+RgK3)U;dFb{)>tH%|BNIeEN5{i+D{5IhbBJ{0$g=ZbLPot>x|@0`mdHtH(19Yz z*^8r}-?g7kzj@C*RCR)@sOUFYd*LN{xj0!Igo;$e}56OT~0;k`EAWqD!H z2nKv1zq${6S;^;W4FGi|gT$UxRkq&JcK^(7a$yy%lUnCUXZVgn=wj5lHN1(!Uua(y8_28c?b|UIE;n02D3X}KwYE@XQS71dOQOBKSK|{s9=#51WtM)O zVM9aC&h@2JMUiH(iT!d?w^0x<*X#V1r^bG}4}1MT8X6wSbuhgTyqB>dz&2#MxrL$Kr`<0j|Yss?`cU%t?s%$RG>&~wlpWf|F%Nt@nDVR z_VE3&(MU^FF*{!Rj}dg3ON-MAon6KGsr4(vq1^WA41C-Ey&mJ< z=wcAnKjV6O>693VK0$J$AcLQ-7mB>Fy`SoU@jA7unwUVR^o0RQvKhj>W(9BFQEXd^ zP4W-B^DDD}YAW_iPv{a|@xsOl^k!8%9(b3=l;MBB7!p%rwb}i==DVs%#PoikzG1v4 zj9o{a+jEnHo^f}(>+m;_+XOK5m{_&UX*=hWPt1ktOc`3%f)bBGR;@tOM(iu#!BV}O zZ`|>)3B3V+Y=Md*9HFl&%k7}aLhkgI?dQc0at@2}jG9K?$ekTpGDueb3#gUrtN#=u zK+&)G5DrXh0SCN=1tWVh>e#bBv$LJ;Auupb5>*fDmnI#!cA}xU5<>&PWu^`tltZOH zYO|ggYx;aoJeWR@SdS*A|~>06XYQpMZVrywk%0nMCL!E^B%05+?kuPMtiRg^X6 zj&HxFU|mYMN2Mn7qGfQIh{YR(L}inHa=5cMq^HhK1*FSn zx4Ohh0z|gj!);{ka#<$HGxJf>PlkUKrXGG8)J-z1IPfKbLJpl$cX#@{olOnK-iPeT z&9q-gEjuxDffah`Ups47PWgB29-bF=3sjMZHpeB<7xm^#faGtd;#{3cYMzVH_iJhH zVVod~*Iau<{h9#Z!7|Osa@H@Z?6p_0mAI6@LDH;!@E%hQ{bzR}Aa*hTxyg2UJ~l32 zZJ@&cxJfr$N z@4;?o53{fHUcg)R=Czi~u$)wUS`zww}5|CQkkY#rT2wN4_}SckY$sz-0jZlR`7BOV<0;BHVdhO1`MI1eK#= zIXjtF_N=ki6A!uz@4G!YlS)h|*~x!G7--IV(mZoLt>fVJ~7U#Q~G0*lNzVbN<_edA%e~TmAYbgkPIHSQ%tKsvLVJ{ZWW4 zva|=$3fU5}X6;(GYflZ1M$xg`-^ITV_z^F|AoF{TJJ z90~=b&52SR5(hmdJo!P)q_>19UqoMX5&=Ga%Uc0@Y;os`;O&-<-q9h3|Jwy1tR-j+ zz5XtChKNNHX+`&hyd;rq=}6(*wM-c@!CjwY7>zNezxgW`p;XlPR`v{50k1v$24BXD znP04&&~fN!!Y(oFr~H9$_k29%UC124WQ_kioM|9yt} z{emC8hT=O4hW-{yc`?F6MA`?C?6cSUXER08tm8h{0sa41b>|(`WcTI!D1snL5s*&6 zLXl>qNDV52f)w!uQA!XH5Co(M1}TwV1r_Nff(kaeQbP~|L`8^-G${!nptJ-Kl8^-E z#Ch+UxwC$=?w$3UyVl&lSg;@8}Iwev(M-vi3O(3XI1s#HyTbm*H$^LO9{TN!h zT^Sogo1@jGNFrIFIwe=+Y5g5_It?>4z9Y$rbB!?qL?!kQy2@?Zz9Z~*Ri`%y2+^Tk=*NQRedl` z(B-lu;NR%0HPKjdG+qEA@4$y;b;?CBR*ZEF1~_=dZB5#UH@9w}a`Fr}D9UmI^ zdu@AkshR2U%JAA)d48zG$ovV~S2nyQ*umw389t?KCNmg`HK^|$3^kW~)?0&JYgPx%4(>e!;`m2L8X-RfvV8~dA4HYzn4Z%7x)2D> zv%=>L4mA}MC zC)pn1u|`S_SsY&9Xj)+?QpCb8fYAR0i6rcbspKEHu(EkC5{ZvjrsRiY z4RfRtysANGwB%%tkhFm#nKbEQF*Opo?-<&3JYYx0GA(33bB1KgiH0S7NKc(J9YwCv zl@^N@r%v{CM;E95Dn2n+BgqJEoUGMC5+pB`<{NEQg9dNfuL(UYof5^Q5b*+=g1Lmu z8}v8n>&mM-x9tQackdbgjK%>sUAUo}i>H%T?`LFyg=^kvX=Ve|Ad#gi+4Lx(EsWgN zxDkR&-6{e*Yd=F{b?WuqKVUw`&myOyRD9JtMN!Oy*wuG%q-&g;DPA9;ANNXofYNPg zw^#W1n#2Gft*4G~e3d}rMBXqSG43Ef|>!hPoBYpD-P zrk8eNYLcnk6e$Q)_?z)jkN3qpAT@78AcW~HyHYc&NAFiBlFo>J`oV)4Um6crqbd zeqMW-wt|SDCdYCMbLL_A&^sOo-3{64i@4Hp6HzZwb;TvSe8j>u!?Hvzne@99|{x3x$uGY)a?c5mYRi}%Ctg9MbFP@Yxl>w zAY-}rGVk=Mq5DIcwrffT%{L{`td%v29p@as2!#qoa%gYNiN4Ji$D6x!qfNN4hIaKV zj`r|`FBUAiF{oS8{JrLfIo^fEa{7+g;_T*ZR}uz9j;VKSNBRh(=!Ee5+945Soc*Mh za!NTf*yY}>7B!20ofkEC6iNqz0!SwnLb*5xD^Z!fg&_%w3Z}N`M{AmDP)YTP) z{j&JhSbovR>FcMK*I+wD?IB6Vw#msne^X?SsR79}6?GPN=RwJ6h`YU`bXTch!Pgbj zmXZ<`pSK3WoVAplq^7uJ9^OR0xAb#8vK`y>F2TjT<@V3EzE_;v9s8Ef!fhAxU5t6i+dswY}1uQpzH zhk}%iRM>8ikdlh_th+4cE_PE7=}FYwNT*h#niGvJC3ia<;IkT`#B!%pp0<2(^;Fz@ zudD4AzD0OJy2(_7+Lie2ElE)ss;w*qb79bdBgt}NuXnKQ!;j@0-C|L&!FFqx*V78> zgDXF=-oslKBKInff&zv#QTgWU4sdvAFDK2~zQRcLhTN=Bf*^?M<9~Te-aR-y57x3i z5R>LXX?l-g`emk${0X7bJIVSE^MT0D`z9O}2MBU@ug0>YB}Yz$R;2bnEj>&=U)P*u;TtmuY5f|O_ghpug;uQtLK`OQ*q7gE10uQ z%UHW_3u@&+VrG6MRzx|7-L8rG@Zt2|#SB%{&kIP!XN}ey$@3jK`(dG$7G)QOW!>k0 z?vgVtS533l|Cz8O-#_U^acY_9)$i*z4am|BLVZyp5qoQ$2i5mQDEf?-HyrIyANNc$ zZaDI>k~+j%+V`}ta231(dOHH7^LlxkK8N>)O*^zKb&Y?yuZ=(T?#H>aSL+pn*Wh3F zDt72ad=w}13T`hi^jrnSi+hc6opJG?hVJXslZ$3O>9-KhopT4kK2)Hnu8}Tf&Ui6N z9CX&}SSea_fvrR9%2V&kKLwWb^~{=lku3GzGgzT~+71*@=+#1ETt3-e&Q1)~Pl|l9 z_qB@)s6=i%xw86~&D9#({X>5YN5ikYTslwS<-n&ShDX)op6|>bA5q$$>-zp`zQfqY z@`s0?gLI|&A0U{DT6a;TGgG{|H>Eokpoi(zl-yf77v<*JT>*KbA@=8F}NL`a`qhSc>{#anO_~oXVwXnF%+|F9WXm%s%sd zJh$~TTXSPj43PRr@y5QGbA90uq=+Q6p@~-g=iOdL(Eu03q1V8Bt|jx7#pnG~yeBt@ zQxjyr$OySBO(N=*^(nNdMQ)0+K7)zA5S*nJj|QF%{R+i z%WISisak0!2JxAI9vPvEPKz6sf7u)jBtIV+|5WyZu+pWs&73cF`PcrxSGVF`4E>Vj zF4g4_MM~;cC0u#F84c6MhuRHO`_vvN3nMWPtxfV*QjNZITWVSa-nQO<$1M=l7JM*U z?!k@Q=2V)SH^v239X&w3biGFU1hsgs>}F|djTc<9AE*a7rmC%U*`LSzT^oLD*M zj!dGm8_P{~YMYmHVxO9oR$8wUH$ACexY-$wyR-EDYbgo^$~CSj%~Nvr$bBpAW6pH< zcHK=M38XzC3fAE@WR|qe1Qd*0mbycwJF?vZ-)^OXHhW#`?3;0oS#K021df!{oy|xI z;WlouHFu=2#+UAVUZ+2MS~_}VI9Ktb1z$(4Cs#H16HV-b^&xIgE-^ZsirMdq#=<8` zdKr8NcC)Qhn;Y(~5we<^_vTh@l9&Rt41S1$mmr)ID38e%^SrWEnEB-AtccmyoY(-F znZbRSlWD z74^$?x{4KT?9w;|Vct?oXj4DD1q%4fF-0n8^)vd?Cce#z_3-GY<%|ji8N?Y0k`268 z&m8ivV?Cb_nLxb@7EDziN4z$*c{O=uZ$m=JwZ^Vv-%RLOjMTZsWDU+L>|`v-Fry%g zXJsxp*6XxUY5v)7U(n|Y?d*~b$ziZqfl$IU&Mi*;VG2W$%*)SQJ-vLusYih`7t<&%W`nzVS>A+!ffK&ij@8(=Fz)FSN3;nLL1M4g&MxrPF`w4C(!Np$=t8F=6usNN~e_q-+Mo==ZB z*E}mOfIj-k{H}n5H~2y8_tKrO4kbft)5!tny-u{_kuL)ZFKB1<7JI99AKZCTFEVIw z52(T4R>6hPAM@D!<@Dm(^X{T^nx_lB4#h$5{_aAvT%y_zMg~~Dahx51mAwfFC_Gjl zg>aa(E??IaRgt^$Z@%C*FYb`wi+_0mTiM+q-$6fcA!3s(AB--{b zBtnkaar_E*TR?L}liiuL8XaG)x_(huQ>?z^^%<>x?}juPwN%#sE~Po0}My z9P1}3`X`he%$Z)>d7wp(*BCD85EtM%cf>Y}x+AHN)*n`?(C*?X=3XaZazKXvoIvO5 zDiHydHoJSW&)irO1zJzn82HDEU2p(MH%#a)>^QxabK6=9Z~iC*0}fT_JUk5dc+T= zG?q8anXI;zI$87!|6cca{v=DbFG$!V+FJsY`eO-}Uuh?)+{JT!VXrHdgF{!mjN$13 zj?>=r-gDR1&qLD3rfqPB9WNFi$|B4tu1c7N@mgfeZF!k0bQaosKeNB{baq$i`3uO1 zOdj!5m{l8L`1-tUxm}UjIf}Iq;Cwh|Tsz-b`O2&7LAq?xkJB-zd>v`$AV8T@-<_f) z@K16L?<=;qF_v2byF~0sAC;>*$8Qr`$9m)dX6T7xS`8iBT6Nl?;y@*4)!YD3_y7ea z$2nA7ChUjcBlBlMQB{7U?>+0PRd~z1i=zhsluf0$%g5FYl&8Ws71;>E2zZ8*TB53B zJ?YC?sPnRi;I31JFa#_HHROETbz!gqumr(9PYHaY>$&e8ZMcc2P>uomU?q0bXK|$N zY*eI=&z=DvyRDY0D*nIz`pe6g1>U=-SJ{-JoVCXvOZQwHu5oX#BHmf3Xk=}S29jH; zrHCr`o@~|OdOykLaW#k<<({cA9Q)<^rzQv(EX?FPfQ@EdC=slt@$d7 zC~8G?m00hW`BP}uO3Iv_9IeYu5c1hqdv1()U9&o9=3{0QKn-0L>%ORR4}j}lPudB7 zRmw8I+~6-QgJK4Txd`k+u6|Ic30s@>a1sYR&Ji3KO5CxyX&pc#gpiumr0}3J3UasL zCRUt{Sln0~;TWy2iDZO|B}6Y&w)pGjSOUi2ASH$8*I3wG5$$s#{P1=WVQvS6jW8^j z_$?pt;}G;zd4K!p#D?~pQ9q|Uzn;^$&9VyQwnw{W@8398fbJ9qK*9e=U;XFD z?Y|q6x*4QS@|~?8^~d=&j3+3jWQQxU6-+W7)}0+L=%xQ}RMMtD@{@~m(@Ht52d?>F zMA`pA?{uz^bk-)W!m*+B(yPgANB=9!GeBAjVE|b8F3;4?j)^m3axAxPM`37FsXeVy zz~(eer$T9v>O1T6Gl-qQ@xg>OhktM3od-nuZf zA}F!YP8v;Teq9evZ6chqdBh3b1{Bz6SUriw3oxVsYrQAj@#)fdCtO9tM9S#RHfica zxH`C=E!O~`Su(ox5$^=%gEfDk(c>RjwQPlxA2tgbu(Pi*V)Yw2e{(k^xQn_(z!<>$ zJ7Z+;Q&C%MXs-dEtfkQgaxSsu#*iA_lyME~6{q2oN^nj06eehhL$+nCO zU}cWDum)UI=WG7vrkWTTflQQUi+gv#f;!S=w4|TeQ z$XbTAsiO(*0NN@Bg|a8gO$Ng{to`3l0Y8QSE;5N;_=uEae#CdIaV3}Mdpso)dSWbq z14wynBxA#My89k-t$>)84B7<{uP@{NQ^4xs=*-HmbU?68(_e1nu!hqQmnwEpu~b6? z$~z7uA$&rE{9k9S&OVBqh*;}wTpx6-@gm3!*WUv+gFCkOWd}RvkSTvCxV6x>b)(*A z;Al2sZUjuCBe&ZaYcz^%Pj??-4s&Gi+13M>qxqF4(qUXa=G(53H3ph6~sjA1;y zn``&(Jnwv8V0VkZ%F*yF7Y~~YS%5t4rI9+I7+=Gg@*`O{>1l<>m1CB{f1t^*L=dqY ztN<8R*@xW!FK43vZbkh^tk}pV(E#n>QNM;sV9>_GCOxfSj!Vk92RPn6tx0v#{{|g& z`XgDN*w{HaX>iT|_f+ivB9%5-h^d&u1_FQc(E=o8)xT9b0XxR4)BpTs3W}D9ddH#? zGl0$o{xOum?sH>&P{^e!MC;gj5Vz<|V^rGPmYWwIEACka4DM$R{NNWg-|=R^h80XH z1($?nxTd)>HkQO>WK7j^a0B)(_W*hyE#yGx?dCWP83Vwj9^Yf@zWVb z>FWza1bQ)${vD7g@HgmMSR1WNed-XD&aKw`^C09M2!G8YmTtJ*Y_IhT|4^I>@Wn3#zQ6fAdxvlFaB^uv?q#awIuCZ=rcH6U{sQf$UEiK9b|qfuJ@I!63JuNRIyuy+j0v z@$^@b3az;9uQ}LV-C{s=%S;Th4i!^d3^HD8$SHQMPoF;xX7Ky7@$eh({tsK%AtzhL zxgd{vW^}3cM@8swg;p}QX&I?^#w<^a#})WD^ZYxYy-6g%z*g24z+oh&VlZjw%)fwMt==6p{F9UA*<))w+B_s061v`<*$jI{Ft!3U=w~6aJ9oF)uvl{)ukI8F8g}t8E zwA@Vd?{M(=;2Ao=0K_;{Bsf%XL6GEdV)!TNHZr3T3|TeM*~QTYe#sO5odraur-g+@ z;iru3N9IRfJ2voT7;QCT)VX(p2I0(MOxT)|p#os~@7Gak-(Dha`LX{INdHsJj(7Ih zRS{+{k=cvEGq4$KRn9Fe>}2~$Nr~Jduw=)2-*!N{hUw|)k;6OwV^XmSW81ZV>-r^- z+3l|Pa|e!bY;Ww#0N@PiIJ5X$wIho$c<}u7SKosPA%esKeYZa3l3^jw0RcH88`B;* zS9H77p#lKB^~o3^=;r6dA8i0W4!H^@eq?{a#4ZT!{aJX7Re5Yf>yqE~hS5fV_*jXB zGEc%cd`}LA_!6IJuS0F+=W?+z(fnrW8Y>4Rg z7GCcKBw@{7-6{qkzt>s3nqkhkY#m{{mT;=c>&rDeL5g>XPsTuJ4z`<5>K)rKPnX;U zUnQGs{?OxFPrKV7#(!Mz+VMQys&&9Qud`6*g0Cc7gTkYGidp8*2Yf)XTc8pwT9{7N z1dQUVF#lpNNqa=tk>>GAjOt+2ltrL{=l~cN;N-3#HwM7`MiBL_yse5{YD|CS71O2D z7PZYFqSu;vjo;0jwh<@>bcp;Xq$kObO`K8hQ*e@kD-THz8_6!+=JL zrPUcR>gqy!W7H!id4mxPH!7Pv#V_?V0mGwo3RyoM@NvC$OPGwr>$8;$phHNS*mBVs zZPP;Ge-IpcI1SW{fJk?=)}tp#-Q7mz+RNK`>D$$y@n4s^G+YzwH(c$io2`@KF1}+Y z{)CKylh;X)GGv$g{b!?!yN&dM-JN+M-g>dwjG$=SE(z&YfP6M1?Ln zYz$OIg^1gS_)6hj(TuScsXI6_8XA4$DVWC0t*@T5M)&d(?2)NX7xb=M7HGJ~ERJM1>QS zgcGD!F0A<=buSqs<|Ka&_Cqp7Yr?9+B#L@3+D1> z*-ZXA0vz<#^B6EGIN&ii!$(K^<^{g_eqY*%scN8oANd$b9Z$?b+~GN!F4bNRUsqz% z(c8M%-_O)lskMgzlOM`9D^ickRxO6?i>eTH(11itOA_Brw1&fAuxND@y@xg>+Li>C zFg)@ueFz(BnTYqSOMdY}DPp4z-38)drMA#!1bex57U^F+b;CtE7 z=3`NeC7lS`F}AkPAikG^^&ejB1h`K5X5@mSYrg!&7s64jA(S*bP)-A04uUjJNaI{_ zcmQjCXd1|u`~-4=j1@*=%s|8>x>T_TF;jaP0rC*`=?cLwuNEVxczl6vjhOtrcEN7_ zHL|yDz2fF12b2a`#xj<}65`luy#i)0S05kq2`Vsc*@E7wF>qc*|M@Jbo4ve&^_amJ z#S{_)jzCUwLdsVRS+&O@oiP!!8fe#7_Enw)gSEYNDyfmbpFlluINa<0UnCXb9bb^ce#~{;JO>q;_Nx9&5OGamWZ@9H9O&( zUowvO)D8nh!GVaR7tRS=vlc zo*{5s-YCPp#-U$KL~FJw&@GM|4Wqu>Tdc*9s&Hur2>Bxt?DcTTgG}Zcp>8)c0`#q9 z7_4$Tg5;`H;YSf4h)&wOySv5Q(=074s)^eyqSv#F$@kLJk9QAyhg)X?r7Tr+gMx^B zm_(A*u*~!uZ(ff(B%PCaqpCF!EjBjR7fco^DWyPX*a_G$eGW|k%Y@2V=8IFQ>Ygr}UvsiUTGLiO z%Kd#vLxE};aO1@x6pMXmgFBc;7x}j-{NSJlucdrwq@xzhYoXvIl3F|z718Hzg%8gkJO1aSnXdoS@i+gsixt~O a@%MMQhNvAl1%0>RxOxVu{j?(Xg$Ab8+l!4lkEgS)#s2X_e$!Gc4W&i!xA%hXiO z<6H`gDyr$zz4s?;t#9o}6(w0TWI|*R2!!@gPD%{~g7O1?G7#Z`zYG_DxCDOjdr0ee zs5@JEd^UBn1Sy(&xHvd_IM|wzds(`<+d4aOvhcBRGLhSOc(}L=u(CS-?+aL*-K<%M z4|LRln;^N!>AHhJ=mY1$0a%<}_Q>3Z9q9Uif>S^=vk$EeJ zHWbqYA8cxLee|Id1UAJ#nC}UhW<&jfsdGsHHhl+;BGS*MAYsyLjSv2a$n=2P&xRBX zmt%@gOOg7aGYAhx6(`TAnkq|464H=lgx=3K0Ue6zVu-izM$i`U$6pBLFJnu^OABEgniJKf&LS#vOEQ(SFflKCewR+#`MV~nh zTzcW?aiet_?cO`J?7*LGbqB7HzWr{$7+S2oNlQz!)TaVM;&`kMxvSXrVJ@XB^!V8JG2e6>XKvYx6?ED1zc=;uCDdp+j+kk-Q4|p z{s3&(x25jCx5FLIB00lp*4dGfkx1XZeKP^RM!TDJn4m$x+JvmxH>N+40@XrI*Q@t! zOuH-ObJtB)%VG8xmkrM)lAErsi@m4Q>ftKG_L?vEP7doWSk(cy73}={t%X~Lj7c@X zP6*vCo1Zk1Bi6VdDmiR+_jnR-cA)=zW&IyfqyE3GyFgz89sJt!p=dKC6UWR`sY#H(%E>bQ zju?2Y{O;TfqcRzY6k;w#!ToMgR4R{lDB@vROhnJ;iEq(nvoa#iIoI6msP%O<+c~hI zn9I%8a7$>jPG9f|MyWCymD(;*D7M?6+BQI)Mx{=?sAy@ZuVrhFWRu0=MyyiC#)NGm z&BaQ?Ur)g!hs+{yY!ja_|7zsGaw+zY$dNwZ^Um5m@_E;MmFSgWv8G6=$Bj5cp^1VO zVhufocgX}vI3B<$sE0eA&UliDV^T!HMoFWb^B7_l7q=aqe(LA)oIhnTNMU)`X%wL_ zBvqEEx7f(>pGT!0+vieafC)$UoH>4&@kCRlo^kpzvd{GE<}QDL3zZ5HDzzA$0@hD7 zuHvEO?`Ni4K1gM(BEq4mg8 zg5IdY7|x59D6^pYQLD83;dV|Ev6j+Q2+U8)^gx%OFx0ngf;(A^FpZLD8-$6Yb?o71 zQSUDJm!8sb-5|lV>Q%v>b+4~F+616R2N=B zU9$bW|DI~zPFSPDRzb;&UGNkdgdB!=x|Cv~3-88{5+j2Fyu4mzxD&5fnS~@`=?@9U z#>>y_9;(>ua+qd;Yu9mA*KsD1*c~J zHhcT4f^>i5O1x?-n-GL~eW*^4<4_2JXBr3Fp0J@ZoIQoS$=4p=LVM0$bzp+?cFIcZ zfGZNm8A9{KSgcLG7Nvph2E~u2Ui!cDn?|X1&Jh!FrbziQYJ^di80@epCE!@T^&S>W zfP}2m2&4$fwbi*aHq3br6eG`RHh$M`x`Z}k^Jm7v*QQyxP>t44RH89m_pT=OBHX6g zzY*)m%O4fhg8yZR7!UVFU92oo0$;{u0}}`|JMOP+9F=Brv2B`RfE#cS zpfoA6dp~sr`)vZZ3U(x7Lp?7IIeyNQpMj>XQ>Cs63`A+Fq>6&&aiFJ2;!v$5f%oFdXjuE4i5Y|^N)`-6ay6a=#P{l0nmj7V3i9=I?x|iEyUDTCCGkS`=vLxE zB+KgQnG>Icxu+@S$E!6TgH(c8{l}7At?{oH;qMocUiaLE7j`zT@qmxmXdk&HpmsQl9(YPN7rAb z=}@V-GO|~p)EqX04yEzQE(ShsV(!<)bakP^Bh<5@D!zW}xSSAW9*GVYio`+24Fv%o zz?DIoA0eS|eaQStmPPhHk`h@^HyO8DId}GQ#?A*6l#oCyBa1?htNzK?Q9H_rRjhMU z5_9I%G5t>mLmc$PlrONDO^zlD@F)6T z3}q@cD)h^2s3Z^wdY=mU5B3G5n2)&83-q`z(lx{(WYW;LZPBmK`iPRj61{z3G)tO4 zH+$WncqJnG6iE2_Um$NgfA`%`f^<|AsXk|@h4!&Ug<1TS7B79Cn!3XTW62lcXjQWi z^U|`yR=RpEhV8+ggaB~}l*36Yj95veeTiTvQZDCh2}WCNL(S`0soG{2<>sUg3h8nsf? z%uAZqKj~v&?Ng;TS(6R)PsI}j)&TuDQ_7+dyp9CU6D#@-J`5YNU}{(skuRDLxv(b; z3#!vC|CV4z{rR!Dte{&o+AAaUv)AJAyarx!QNcpKA-NbHYAXz^O^UOwK$Ns#)pn$b zt^h49@x)Y{%La&uClLdsa%Ahm2g@&KzySHZ*n(t|JaREZzfzlkCn8j#8vNKkPH3)< zd*$L+%tQ>G=BfyTslEXzgh|@-yVF}zAbO52riq*JdTu1zt=m7w`!il4WHl6xwE42QDs_7u@48mN82hclGdAswUuW^oe7 z+?}DoTlpDjFeTHxCf!U_id^2+#T6nZTbn8Yy#DD^YMLv%@Ol2)EhhN7u>hq|2+pd$ z*w-lWSKPKwL#%>~Z2fV8mV3f@t6b4HIJ|e`bIS4}!9K3Nf=p z^^;?PJLk)p__h(DBox0ZJ8p>V>Pn0{MW$dA{1iePcV#M9>!Lddak$&v>x%fCM9Y}O z#X;aME_Yy~NnELg@qE`fa~j5`NOHRPKKB%-@2cad<`M?<9#~jRpemp9AlZpH=NTyF z=}qP0Z44Ny0C3J=y*06>#2^AUcG(yq7a?wCe zPD>Q(k9(0CayBnsNInXyrfjQI5P2>(&?WooJUrTQtY*2;s)$PCb@NQ})JDmF@ZaxD=`VnH3f=VtKzJ)%L*2*Rq2;?8W|DR78B&t zPVQlXOlNMOxLTYL*LZ4tJ<;2$h6TOeec38eUpV_24Sc3Ki*^1+@x7ignc+)c{34~h zSd#ox&3yzNwr}uXJ6o*@Wh;mkwBG9TD3qB;3w!!B{_r83W3mS0i+JFi( zFlaPKps&?uDKXLIKqBnBhify$P?e$-;P@`O!=k%|akcJ_*09z!hBlJbRb^k}XqXhB zmz*ad!O4k!cj0VmH6+esZ|cDn&TSthuM(R3tf1(*l4AX}geA%?>oK$9dVIj;gi!UYoOj-kIDistk!>ku_nntP{)Vv0GK$*{Iw zKoIIxa<9keB@FUEE^uf-NkS_?Q}1Hbp+V*o$!8JBPFz#wXg-AYxKA&z^B)h;CE&or z*OgO5k1-s|vszmbH|PmBtU;l|03d4L4Y@V5=w!N|tq$mF)>R(NdTu0==#|oOW zMW=*7$=kN$5>im`zyw3Tz7pspgUcB3BoH+!2omKzo>H@b!0^Z`)xyBg9X$~C2@z5& zt8tk6fyZ$0C+OcYM{U2IXmh5f+E68N?C}LeI4r8QQ$LZfhSNYoF;OHafLr2&(U)#r zk5mvE^)Nv3<7uTD8~}DKRFg3{pr3bAUTVZX`F{JVqKP$%8DpxVrWJLv9u`)v20)h9 zOyC=AYggVj(&YK;hKDf5h}ar^hfhRExwIw(hX-^O)~~(MUGzOBFOP|sPO5%IvhpB* zsT2+eTB_bXu1+}#Zz|bo{!_;i6 zcym`gYCk(;0~l9hUFZjU!lWLM)&LqpSu2i?usj~IV*Yb)z1>D}cV=ti*YVYe^;^FK zZU}jlJFP}#kuBl14~lh`X5_dF+HD7_q-_04bbB6F4)u{#{OAOY6T_cFlMAD|Yq_E$ zVXJfiYGMzXAwPD+XpH^aX`?u)ZncjUKQhnevb#UVPk#=;&b^q<;&aSUQoVU*OT_~- zAp#W``^3e%*H|X`-CTkq9|S@IAXw8i9ChPH#%6Nb*Ov{g&fh~4Ak7Prt*bd#zdycM zb-LJLAu$R=8kPwwKg&Y37B_)9?Xenk0f{}A8}`}4VCUQ$B58mJVSQd!8;qD>MWn!l zg}(L00D8vGjsx*t)BN5DTjJ?=Zb=-~5vcO1aoni7>5oDs9xq18sX z7M8FKbYh!fQc-vr*=TxP=1>Y6Gt2k#JfA+QkLSn!(i)G;`KmA_BVY63J)?9I$+!g# zmKdTUO?t*8DJ@-l>C%@PCbSI};h{?xbUb6B2si#1D@gx<6z^~E#e`{n*O2r+7JwqG z@yxU2xN%?sYkk}hT#{X0Az#*LA1#YI%pZ%fgqAR_3t$T}?z9eIAAyE~DUAh>zv6)x0fc}k-eJ{cq8<*yH zI!Q*gWlICHpr`H0skWOwiB!A~i)?K1VVDsaz0m)P>@ybAxLBSEMO3al^O~b^*uOnG zZ^D=^aQhTBS~8CyjLHxo!m}t*u^`D~PnE)%cgo@V6JP_HjmQ4}?u#&Wk^j&X&muhN zNI(NReG!{}&6Xk*ne$j6QV(d5)vRdab9+NIAZ+ZcmM6=qkWn@dPw^u4??^%AWmZ-O zNn}u5T!g~-@Vf)0KwyZ~rivGRmnoAfDgj8uQcUhCz+P(a6L3FEWn3LgsYBc0Q~&g! zy!n?H0NK@3Ea=X8w~$_3QMYO^rRGHp&SO3*FRGh)Op+tDvNmkcGs;{;R4FUOlvZhf zGMI{D1$(5AA3FZJ!9|sXVWVS9hhHFzmuF_uelL-`cB|PNM4iQ>!c@$+?jACdnR+1` zp4Ej5gYuW74yQNpZiSE#P1&>I&exQ9nwyO;b+89??qW&eizCg5#b6GZLy?8ZIau~- zfQ^ewvfx}Vj%^vM3oT6LlV|{RCr~-u9X=qVRX2Ys+*qHI#QCm&#_S@8v=7s@PCZwH zayFjbs2myz3+(P}5cPQtK&B)62ZZGzL1t?lu6p#q8zhVwhEjy7X8V?dop>b#D$OmZ z;~MSDM7p)yXKlP)h|9eglISyk`KTJWl~bS|7tY&#%;Qc_Iz5rv@yT0F7|#Z!ef#r@ zX>QI8gJU-zVWlDYgq?(+C3HjG!TLg7=^gcEKhxH!W80|Cv3ae15iC5BREEC{a z1ZecpMG0dXefpP}l9Kk+v^-c5M@0JBj7hyQI$7GD{lO*!rCwKhSEe`gIdpTg{0gt_ z*H>E)f#8#)MK0#43lIW&!-BNMWO}|`@ej+KI#eCXXBLamnt_{Ac87p4NRJr!^K-P6 z)3$|A?N2vBtQPdZu;YvATpa~*NNIh;LjLlX&dvU8VH|rB;t2^vyAiwQe|(WmC{taN zql=6|JXzN1dMD3GO91XDcZ1;^zTMDR7Y`L}pG_cLwpw;nbqzfUUse@%7>Ob@!XDz; z2uUFo^r(e;dah5+Dl+6S^rPgKws)IT-6erFCAL=@?WVArTVpjV37vRji<5BQW~V0?A*oQ@ z7*2S&J3tXpF%C5*-X3dxbY)pTL;g6oiIqU$^_a<;9Lq0<4U{Ow+Rw!ya_h)&Q59sZ zwx3FK?792^^6klvCRsjzd`sye;IZ>_$?$!EU9+%7z1F&lrTN=mFN4Q<)g&RHVF0O9 zvM0XesljLqv?Yg(^!7SkB8dp^PLG{MPZJYzK@g@{|xw z@yoE22AX1)m*cLLJ4rjIpPpB?4!yle!^F#o{HwHgE%>Xh(F3uVEW?!rsY^u(JwxGB zQ;&9M^3eTqzW)H4>H9vQ#+iFGxGb|9`W{bAv@r6pnm>S4DiZK9&<}vzn>n6Q`lK~6 z<9?Y`yY$BcF9sa$#vkS<66UZdR?m-j4ahKMY2V%tKQIVUZ*c4j%-LeM5^KisDS^g0 z;wSZhOaQpdc~dvJQkAU=1yvf3LWv>{GBx>pu9OxG1Y!v2Hd;xFIDh9f(5Zj0t1{^! zLI>B@;)aOPLy-bcHknSjSowhk({w2*n^*P48ChRZS zBZoOz8DEgbrtF;4k6W2M6W|H^uvndLB(a++>$|5_F(q;#dBq=F>sfKnAL=D`x3+Q& z|LnQSS^vW}(^CR28!G;CmTuogY7Ea-Ab@l+aC;8lr;=-+Wa`2OGabEKrSFR^X9|_u zropWk{c7WjLReTB9^(hGsBfrnY#!~MyQd-+lG_Obni|0JL&!rMGitf(kcO{j?clDa zcs1TLH8~EntICI@7n62>9IfLA0JLFAoE1biPpo}TreC)6H+@DBu!q6Hs6dnQZeXs}EJl|m^qgEwju1;ZmlGd^ShQDf(yFL^f4#-zI5a4Z|=`sIg%sR%k|i{T_{K zm3`K!ZQc^dyxXO)KZNQ!XX>F92RaZceTbg17 z0764CG=-3G?e8OXW_S0x5e?c`9dd>iPy;@BVLKX-d7uO6|1k#!dsLsW{938t4_=IZ zY2&E&o%RGbl`jK;a{g3b^^>DS7{s#BUwZ(W$ROwRJe%NJbVkm%mi81S<+&U1 zn5OV@Q=~i%+}a{JY?#K0CmsTNytNXoIS|y8WBZBkd{-??a!;Wf)5F;cv4hS+lXi%P zk#pQ)(7%9>^9mIB=a*8nz+u<*pY!wBa9=Df$|y)y!&Gf^ak}Z>$p@`EVsLUQ8KC?IU`yob zVVSSgJ8;4YF&x)I(#n#oVd;%%e0@Fo-MM|X{?7O@%wcGcEM0p-ozUD@$0?wGVc( zUr~bmG01}t{c%GI3!wg_VIf>y1wyc$oABkDgk^v_n)!BZiIM0FZ$akqD~>d71TZN zzTETdT6hI{=*8`wCE}lZ!Emh!PjLC-A5ZVDyFUYkNfk|@fzxaD*t^`7F{k-pk~EhX z@zo!+RHU@ymn|<-6!!H{wTwP#!fwPW#=9w`%;BAb{_uPvb~waizet^42S9awHx@te z-y^F)QYww`t~v8%s^w|EdaX&)nh!m~3TLMtl%qHq8~cj$)_cGvZOoK>P^C`1+KgOH z1~p)1WS->%j9#X_tLqO|jJ7!6gjmOZ>4RSU6A+zyuSiY6hk>|@57Dt5rIMh~2R(bL9*ltgqO^Wpz zhmumeL^*E>{@Ke+;sn;nK$U`oXM5K*?02Mjg`ojJB-z_LZ>cgiIbVf#Sd*%d7Rqykecd%j@QW9h9ee@66`G zt;dv>zAgm7Kir}T{T&5fR5n8{_@UKMz~tk`N; zo|O8;V;y|(RU{1{mZ-KnEujH<8u|GLtpEu!ze;m8*2U(r1v{Hq27iHdAtM!v56REDs0w8RQZP5)}^>#OcheeIs7TZ`v)hqmQbcVtdZ;fH`AgDGGl z7)!!zJEtS!43twf2YZFQ{PSt09mu_Cj0y-Z2G=ya2fN+ghO2ZQ7dnC~I5E%MKajNI znuqq3Wr$X=v{}fe7-|ywTLV&o1*PW4yu>=TuJ+(kqFyB;?{jDLy|zzFCY}_PZYUh{ zRI-M1Q|Z?fZB>x1C8X`a)_jeq^agnNIeJ{k6@xszy}baO3Zje_)aVOT+O29JRHQdx z!`LoSc-d}c5c+e5>T?>7B{N3wvM5c};@}9^1OnR40FoYxzyJK3DpPTdohG`!Ki6T8 zD*&w>?o9Ci2$e5r5X)y)Y>8qC#_wI78}2>Kh`yp$3w;4K8@<(GzY91nqVCt5>yzx7 za^v(8^6eBOpiygf*V9~Lrek^-A5r`HKHv!w*^)*ZS~bnDJXYY2ITEWN&oV_O!SV@# zli$o!Szc<{vXh4U9Fb2?w?5xulM~6_ z0Quui9w})={@GF<7v2>+nT(fXQZr^^O2GA96k*rX(;Ohk{u{~KB@F%pz5QSgaQKZ} ziERl1n2Y}dVyGQGA>r5%9VxP+>RYf1`=i%dbcN%QPZ0#?4w$Ya#b;;#?sKIlQ(;*f zu~L-6+Qo2*pwGvYZOx1ow(>}nw>=U_YEi>;Aw2#T`F7iHeKmL?5?zY7!;BZRE9oqP zu!4$4{P^fz@BJ$UvfNk#wjL71cW(Q|?O-zl3zC!^TdXy0h(O`_v%@=e)L)zjJw?c3 z;!Pg?>_ysl_;)|W+hYj_1T{HdQ!5&`lqncGK2_RxI@&FZIE`J(PkIs%q=#eDacZjE z8GY=Fky6dDx2o9hvSzfdk7YWU{tjs7Vu-$*IPj1?HvG;hi+(gv`l^CTYH>J1AWyKf zD1WT+WP|B11^lMqluE|kvJ(4JPvIk57_Y^igPnIqB5J)u!KhEq48(L5c^m|v2w=S0 z1I{X`HRjs%6oH;kS-ybUW@tQkZ)u+9!1qJO>E`XjTVTNPm0wrw9_a5W5E`Z(y52X^ zR1bdyjo|nAC|_R)kZ%r|CaTj?D9X*l@2lYj3}HdMLpp*YyXUl<5lH zC@QDs|^$#-tFbrm)me3cEtP& zOMFoa0`zLqzsG!}50BIV>gPT@(*)N5JLGX&LU@yG z%Uj6Lj6EC7MU%^wH+;VVG7E)B~)jjr~2yL|$&`C}1yRKP_$>=Lm&* zvG$;)RQBc=f9_TNG2kZ2E$XLEzl`$x&F{AZ&pWfbec4auX8|tkO zR8&59bGk^$ln>8$+`BIF0AgF%+rjlUATSN`(uyEz$R$RyUG`zUV=K8t8oYusq`N99 z#M_NRdAD+P#RDj=74kXJEQG);Gm_}%ks?3$zKPXPns&6}78OcR_Vr7GAZHpEK#NIo zSOCL>mci?+=G7awJ+fR0^Fo7Uau;Fgryu3?vjGU{KV3v!3unml#gi(QWDP zj4?Xtjy-k&B@LEqHvGuU_F71+_E=R(5~>R>Tet=W{s=K(?BTeZ+8#^QvO-ON@8;7% zewa3~-_`sNJzH_GRx4%2?4+EXuAkfR`Deq3Pc2*?WMRxDS))l?4c&KR0HLBmQm_rs!wXG7RKaX_Z z)Q*n=#I8GO3@tecZrJp{1KAu5;|NH#fWq`sFG;%uiejJx`xDNyNLXt6N&Zp+%WvQj zc$}D6x9+x8m!>ga8ldpQVGAHn-Xam`8n2A5FJu@okfWXwFa;s7(rGbd0{XzB71|V4*cWgY1LuWs+dFv=P#Xkel^l4uT46ZBH z;>0J&8!kD?l8c<(d$w}DS^5lITw9enXxw>2Y2Z40$?k7jXflFs_xL#}C(v*S3rvAd za#H?IOEG%84GR?p80vc)l?vU<%DCC!W09_?510RCVtI=Zclc>#3g*(0zH=R6u*3># z|NL!d9OFWI9;Mc{B?zN?$3VlqDV@^+Uxj=7y3gHZu@@sJyEnFzyG0xk$|RRHrrDqi z9zX<`0jxk-HMJ^6;D4tM!R#iJ;{m)wfc|=R`sZ>Zhpca^#0qPuk6%w=?;1@rlRI9P zaS9F)=uJzo^Hpl*i$esGCtLhdcqlxs7xwB@-O`eX$W~t_JSo? zj#jzxCGk^SXX(+m&OH^b6-_5Ih4Ni=FkW10hZK3PdI979azoI9w*45ZA#L-jqphu2 zpw4w;-0p0I2r${AOybyXvxsIgzvFQI*bc*Js!*ix(mgS^1x5bS1!8<~?Ct5NkweEueM;EGOtb}J-Lx@1S{m$NR-N$`n3`ul8Jq#)V)*SD)mW6F0uNr!*- z_MAIG`+kg0?#4D)Vt-}21O~Y?jL!7U%`B*^3A;e_C7-4XHsMw@nKxw6zDhYyXTzhD zIt)*xaj}Z~&Ws1Z5?VM7<#94^VydL=#nuXlJWVT``7Mg`SZ*tCd9ZBy&6d_x#O5QK zBM7zx4paEO9qv8cdLUpztMc~cT5d-v!nF9Qi+U)ATiUuJ?HiOhRLforrxD<_u_U(J z;!t?abIo2$3jI0#cqX(QQ~{NaNpI=kz+aD%QdL1&^dn2E{1A*QvCqC5-p13(S${@|~))NV3$c%(#3J1q`fFD&nVqM>l!dC!}qk>t< z5-R3dN6iA!zydEJoqsbh#J||e3V=sxk30Z{9tEcekG+GCD2BU%d84i%C|dHe}m7;C2GP| zeUx#3{Wig;Y7v0IA6w4%<3ey{(y-EMVd6k$d~kXw-TOt1WRCzdN!5l zC+q%8+_68WYB_~KPRf@k0}P!~0$UK?UhS2kK_b^f?pN*liy!)1iYT!wuemw`1F_qx z2F-HxW_oDbdyWgw&HOsv-*ez!MH*^voSiNv;da9R)BPAi-X8YC0j*5DFS3T)eU1;Pdh6rRg4r0=56+7vYoK zq8+m1W#kli%Zp9J{@$-7M*;vnQ{r}24X1g$0=Q_9E#a66b4H_TS-iA!!Oq}EYe}@x zagc?yQt0dRS}mt_DU0tMa%vlUKcCNgij)Ea1kigyR$NCK@5E(v;C7@7c3S*A zW4+8bOX@5o8t&NVZKH<=bjs7a-J3U@h=?!EygA|aEch~&i_xrOV%5CXfvPN!s!w_p zBj69Zqv9XeRkGF#uQG5f$E5LV`J}u>xNyI-G`Q77VE*!yDhg^tb{$odu?^1}*F7tPS*o&N7NHTa;+WBS)na16iY5T$Lvv^H{07teP@OC0|Q%pfb{9hKxxZUr5!y zDGjT43Cv}G{r+ML;M$_tGmesgVA25Y#Q|)Dbnm9k;Ou6TWx_cLS*;^EIIL?1lnQOU z8ZWN6Ow0UC9(J9n+<5jqmQ5}lnebmE-`QMeCC`{7jSys*c!-SA>=nz=y8DYjfB~f zfTC4gzM8mPn{G|F{J@rnft2}!K46=}^*1*n*y!7mm0god>YUwEozVPkHG26?$mEyU z4+XG0MoIPRF911D$t>_upXYm)+O8_qnQ(A|XMr9R^Aj>amA#Gh9zu4S&P>#ckv@3uRPRc^;1^ zSog3)SkO7bDOf>Sv2mlL=mI1dD`y5evdPd>ImxtW+gxbn42n}V8=M=x2;DF0XN2~B zb6g#Mnn>C}&U59cl}vb~m$w#dg)4!(@cIdTD^gOUW<}t+W)*kk*I@ zO*@9@r`9N0j@PYw9COSR;2^EjG$F zx{6}qS*18HIvkc!#@>Xk!?|6tN{+AOeFMJ3}SeNJTgDs|RBxf}6Jx zc8o0GFS}nC^Tms9&+wk|TQ{A{z4^0?7EL(o>+q+9NM*Bh89bG1;{4!qE|ozQlJPPe z!=Haz=H>L{K|#4nG;RGS#wq>Ov-5OD9s&^N;4^C(~UG(l)g%!W_4^ zdwGV2N+nP+YnW_rO@@5XB==2$VK`uwQQ-FFLEB%T`L|aJd1psoaG=1z_XXr%|>1t)Qn+0-*)m z*SoPfzlRT-FTe~z8Ah#G8DNxUw)pM}%H7l- z{x6%|$-oDG*GRqf+ZKJT=!`%qgJ2Hr1L+tgjTJSfReb!B(v1q*tzTD4Q(VW;z(EH_ z4f1|r(7dZL$l^gxN z9})KI(Th)6(qqHDSc6Vw5gpO8X=l(V`BXz=@$!%1ZSMVA0zxHLrD&`RG8<=88fQ`( zRj2eyEgW$;aTysPWYC0o@38tQ?(rKhHy zOV|j6mQf_}QlRD@hPAjj67=sA`wEjCHxTgtP%Y&^rTP|oppnm;#RE9iUHx*1wYr}M zpk8u}zez^F1*C&GieqQh;3XM|Bz=g!KH`)&#mGB3ZO1#RLk$2zMMWU(0XXN8LF*dT&IU z(&%k1Jt`(|69orDPu*!0bZl!ET#}Vs?3KXv8X+a~yU-HhA^{K$#4apoGoEjNwt%V_^9Gc9{?N-do>& z2qaGfCBMhO`C`gkuM6|_D_5sttoeFpJK%kwB}Btmu+!5F8(p6U zNIMWh;yBV{mABiyELPUG@FB#s&brhmi3ptRe5w80CQ6!MC@fmqHjqu|!I6!UqV$bW z9d%lo>)r_+%5+2f^3s{v&jYicJNcXEv(JQtm{183AjSSC2|{PSFPQ$tk$}YkU(KnX z3y|1kFMH}{_=K@b}n)(vP#iz@qin8r`Njp3IpS!w|>vD9KKoOOlnR z1)H~QYgZ~4QyX`e^^j#wNwQ5|W3G^lEpHb1Xj_^Pj%F81GcpsP-&8ROt~X5;O)9-bU|Ko_dvuuktYB}paaSn%6cuHEhuBO^VebBDqCBtKFil@;eG z1!m)sN97iK33u}t@_cV~Dm_>kiz?{q@*uAGZDKd3S~9H`Ii_4v+yCCx>ymDh3Y`4#Lgcfl)bdqXKY~lTKeu~>LX8!Xg zlKs8>p!1L8pIsh4J1z6943kz=rrWvtPY96y4s;@Xdw9S{pC`HXr-0p-_8weCu4?zj z(RL)1;;s_QgIf3{OI0Be)T&b@WGZKY*4nY%pyxr|=vXH~ia%0b8)`~_S>MV1as|lV z=Jn`q;8=`KFKiak_NW~@9uZx9Iz_fG;t{MuHAKz+Zv=lr5FZmGF}i*`y!?HCYBB^f zYRDVm7=+hc@pp|(D7yQh**H(sd2dU^%Kq|9PE!~l#|z(lm_L^*z^N3+6>9%rQ8 z79jG3G1=*86eWH8H#~R09RbD(BLq9!q*|RG}n<|(S%$}p-k;+(9pDhR`0$f za9sO**lYm8n>lfu0FdZ_lXC%W_V8PONAbNBxv&TcO^#;J#2%m}u!E{h&rL`VV{mG1 z+2ZQK$n+Mr{hlk9(bc48|Gd1E4?TUhf9leX<*^DO6lcW>*7zw3Vd zBdCYJAI|Tj?Z)-0Z460x>W4X6$E~|)2pO{9)kezh!XZ=FpL363aH)z!(g4^iF&3LX zI2rGG5FI~HKC{0ft?+$)11Q0ceQO(4CzT5Ula33<^J(O8v_bKy=UIeC&=Py&C71*7 z&H=(;?RiM?HKxD6hiNuY_cjE$!-ZcxNH{rxV^UqnSAY+%K`#*kSZ@IiHj`n;O@tAA zF_eQ{hn6DaR+i{+U9cVrsA}>FlQ#;({r7>w!G~?asr=YPOUaix#;sV^nm0DhoqViV zX46u5TU*?*BnT&%VDzINI7#V_r*(=5F_WJwgYJ%a%99N{VbJMS;>xEZiRvwXCISq6 zyxw1Ynbht02WS}|dJGI38`zTjE38+Ag}7&jV3ZYiD=^M_J?arQ78AzOA1b%-hyLxv z2Of=ChbbDywSb@tVZoSovaLA(dYl6`5438*&xqab$99>bYJFm+PIR)j+u6wX6T@sa zlx!E~U1;hkjXE%I@h@CWZ#R41ZYMp#t;+hMS|`K_wv&x_OSS_P2l z3xhhsK!D4sOp*nrY~Df}Jc|ZKY(Plvjn#-b+9$oTKb*ux;J6*;WpJ0jpX^GNwJy6%jj&6cf>bfMM^g%>>qQX;@TL06d(X zE`bBpR)(J~qZd!Yq>g&lg^q#BQfGjpgpM!TcBMT~$`8U($T$Y~i0f?O-;&uIw~! z81^&iCW~;BMUY>PR&4$Dho3JujFsq7bU^fl3YqNj{oudEJgC2FP07O>_nF}5a1|7z zPpit-GO)` zF68GN?R`=%e$uXwr~i+QClVVJJ7)70AMOIP$|2F`!+?R^um zAzZPTZzm0?Ylh#Lxooc%`uh3dL$4a_Tlab=%vzvu7+5mqqXeQ? zRo)rn8us;+-lqg;pxvY5s^K#gUv8^I9*(-tBv>O{rd*)jPP4irV_+V!{RWlL+DlfK z?6qs4Z(!Kmp8hvavscS1 z2V>Ytf4BVGP2X+hdn1j__fI`vXARO%yB7O);gMjap76>153HE@=XpuVyaX=NLCx@RK@G>q~56%_#L4X{~=)B0BaeBoe;$eRG{+9o9`>snn!9a765-(!#w< z@2ZxgXN}D^`wYy6$Z6WH94vy*JZQ>q4pvv&N%I$Lua$A!+a2)S0sZ|ByekYF>bH1ImVB!B&OFxkq)}o0ecpwKr($?+R2E_j zenf*2lSMcFTxO;x4U#oReiJfM6Z=7F5Vnr%D?bv`1RgVbg%DO*Oz{U__JLr7f z5S#j9Evz6*CSC8k*9JpH)KTs4*W|L)_{v(IuI@}}Jm-mh>bWB`>i@^+QWs_NUhyFW zykCU)S=ht&3(n?jxaR$ngry~_^;%NUkcjWlDD~c8i?mur$UAB0*ypmw&wQS{n^I|> zN-NIF@)b^A{&_0L7Nb)!-<6!;WTNT(bj$qLTcn}rL((0%ylPL7dxK<2S>0Gbvb&S} zX$MEGEObu4rJs#@@;IY*ftJ$7lj&yraf+5rE4T*?W{#i8(*+HHPG#|;o=BD}*0-F? zoD}<`*ByF)imjDvSRd1mWK8;7KOdG?#rT?d@zvb=4a!11W^1`BUEE;X?coqE~e~HJ+(_yi&1Wl#0<2Nq?FCj>ynX)D*8# zWsdgeR{ci22G}THyp@f&*9NaNV^crcENO_cYg`i!Eh#y<6|T8*PHsW=Y71UW>IhT1 zBI~uMFEkY=q=x3Oj=bPZ1gs*hlmhR^C-+vr+z1|1nAKEv;=L%N!Q^ver{v@OaX(T1Dek~_x*YTuxN!I_`oj`uT_nT+1EbFS?1 zr+3b>m8s=rX>eVPZw1piVG+92b^C`cOPXEs>rr!kn*Z^HYp^knlzRl!3ec1b#ySAR$QoQz^0nNzH)A2 z^nr!kjdo|rN0yC3w{GYZxda5QfAy?c4}64iyvx$o3NvO5v>y@4Zrsy9KFRcU$4T&4jU{IxQP z^|OO9WeHl*NYsBX)|4E&qp;`GbJuD@LQ)Zdt~gqGdyUe(DQabOuH$en7sc~yMO~-l6(vGL*+%+)s_h`F#{T@ znm+3#IY%p)fMHv3CmwdD`*r8vY>;-7`WQSA{t5hM8^qXeoFF6POwU}=!|0wo6 zs}k|&4HaqEyiZGfT*2{S(;pJ~&%TB|387S9bkwO)Dv)(Ey2e=e3}b1{qo_E0+od?E z^sHjuV*26dXR{Y?d_?wMSx^YUDC$4KPX25^r7UW%eC{nY$d;D=*7>-L`v*<68b++# zNB?Q_qK7v^-CZ=K`A_+Xr!^IFDt=f;8Z>`Oi^+LK+n0Vz-=t~54nEIvA@hr>gUzjR z)FXd)!|$?;n~&p&n_luSRq1Goi}{@Ug5TzUoHKw{?W|jDorg(+@QsvMXPz>jdEMZJ z(bskDWe2+G7HdPH^bPJO1I#Yjzy2+^q2`X{L7ub^-=jJqmCwkK~ zkAL1C%aJ6oKzJ|PV_**A@DZk=KJ)VJCvn;wshgfns>8U)y`TnX!}F9UzW8vn{&MU- z7o8|?=ag*vk}u2|Jmm1NBaa;u-rF4yV39%-{jL4FI3ZY) zX}B_gtd($FqZ33T8o1SyuTVn>F#gD`>uy=``qC&47ImVGUeTZ*;+r3zQ>{f{i;a`) zGm|%#fP&Qpv4;AXDXBXA9U14W9$^+zd*|Lb_j0KM@|Ofk5*%XEopfa#*GBO6oM`6k za$w6U7Nm=zodkjUSiRSA9v)4p%+6b8HgPsB!KFA%U*B`fiZXp9Urx<7Ag;ZZ zlRnXbTVC$GrZ^F6<%8P3KZyo3CEuQtAyaLHwa%?AIfyLgQQ35OHJBH66kcI!vRgHD zhd~MkE=)SeRxSq7FF!mL&+FYD&%}$|BVnR;YWKb*T#RLqYJ@#AIGn%tUUVvqzm2?I zMGb@2hPa-f4xn3?8^*d)qPB!uiF4BGGmiUhEIoc)@IM$kTSvkM=*ZP>awkS=U0I}B zR%C;+-Lpno!_Eh_CMnmY6J@x~TRAcnD z)|0wU!=Bq#NjIWQ%k2XLw_*h_HIn8Tb$t4cfDq;tdNnpsujtsfD!Y^({s@B!E}BEZ zYvT|4vlXkRK0z2S0k9wf@q*UFaSH%5Vq0}&IEd{s8*HjL+xy+QhVdA%5gmSf5Nj>N zdAfPI((0o#*o7R0RyVB+ArnE|5aR3=Vqr53*1oekhA%Ti(F+`WN%(T7&UbsrtZ>wG z=CQt12OxQQ1*wDmf0=gNBaWNON&-Stb$+78qK`cPeG=5hU>%;){uAHvKL(?UX&Piu%55U;jQJ5(8-x;Hq}$Si z1!B1JCwA`_@;{(yBv5?NX#)hD(#y_&2$}f5dxd@Jw(Y|@bzdaWCI<$ERtsNYfc6@)7#Z2x&%*xi~K)`S3G05UMThsz}5yPCsVS0 z+QN!5!6pQJk}(TERC2;*7|%jkXKAF63HZMAnAcnWkgD+j1|oHPmb`~)_)*Bn<_I4p zce1EI9B!SL7vrE8%j^y9lCZrimYCtJ88R8E2w~(Ls_Cv_S!p`#ciH~JM4s!#0WxM- zssFne%6ccuYy*POfL{wi^RlzEKh4YQE>S1ByJZEx|BX3h)#AhN2n`GmCuDm!A8q&% zzI=VyxA$Db6jEiaJ#u#<0l*PGM{8&S+>Yt{YJD?iF4Hb*WH<=$=NybO0GqQYR!Ot6 zbwdxYgV@qZYOY!cn|a3|&4CNUL|kH}S=t%%Zn*~Ni`5akYlY+$U=3(t(*&~pq!l^} z)wuo5Y6u-U$xR}WW&p^}dTVoUh8rygSvAR}wh3=D80&<0$Uq99e+HC+s5JKrGkR=w zrXYbo#{PKYN=>hEg{dFDi+k1spa$7+KK}^ikl|+GKzp8AgzuN(>ii{Xg!j0f42qFypO_}w|g_riMAR7(ZeRQmkmD4&ArTV zd5?gmM2tt^P>^MB+wb?8fp~%}QR~!@^GqNa)LC{xAV7~Q6j!!_R}3o^%f-D@pH(;e zgwHjOdQ!nY&27Yt0mS6jU1X0L`e5kt1g@Lc=RJTQ()IW~>US}6%Z0>(SM+VCGzUE_ zIs{FaXxtjqx6cy!aqz8SW~eGkz73!3!?(Qv5SrkF4Z!QRlM@X!HMPF2Z?!oM?CbJ2 zZNu;#`E4}_rs`{`yRKh!Ou>6R^efG3>UyNWupL4zc=dbSL`#U{Ys}gcL@icrhd-6SW z?XBAtK58ovU9sOM>U?o=u`h+R>lhk(Jmg21DCCJNtQuyfI_`n>IUWxXhtP$?oiK>CnPKJK0icXiO3d|MV~2Zd8tD_jshdj*3lSF(XLm?Yq_l6>H^ zygDeHO~`~WUyt(2jtZ{Tq_Hw$WYvy1!%Z9A*;el}S-Hl3IdyMQM_oKVKK_zO8k<#v zHz(jBzQ2+8>BW>dFeiqt07sg|sw4K;mFrYm{e(C7GXt03>RTJ#b?4^k3QnM`kLmuu z0}=y@xP31K05>uVe4h@-WeF4qkZ10P0J$rHx{p2iTjT~-g8?-1&!CS1Xq}%fSbPz| z|6Nb0u8Nvq23seg!BTj^{?4LrPlsxSi?uwNf|H$;pR z)Bu$BFRZn|CZsDTL&onC)>>GwSS-XEt!$b<@pjBBC?C*ziEpZwD_hp~j2?nB6#n$s zVb9Ug@ptUmDL`gj{#K!~M1oKDL`)KFt>O5ty?5Mguud5mEPubxb-g+zk}*YX=lEw( z(xp`o05LKQMkY;CNUu@|qnIczD5?W&UTzrdBL0EV6pp-xTi>oioWz9>x4>ZPWPD2I z##iM1*4xU+T2Ba^T5GNAbzyKm{Ll=|gBQB3Ye7})`4r+p+;bi7Nzz(KN;m~L9LU<< zZ$Pbjy%=78U<99GcL)tN2inTsLsT1U@ZpBV;s^}hRm00v(V>e430&jk=3$f}eEpt) z_1Az#^1*T!1jhy8tu#cdrN?X{L(v!nd2?naNt%n>CNLG&Zb$60BL-O_`uqC$ObCXd z36v&GB(oOXc<5|$QZwSewA$>XAy~9a?NJzT%naTj#_d|IL)ElJ{mqM|*AK@7}%3ez3pKk#rfRfwHypji@l~TwGjyEU;_7 z*o@RGs(G2;?<6aorI-~v3||WUqcVFKen)9Q-nDjg_Qyi(<9f*JxVX6Z0%uu>MhgI$ zhDAdwtTTZpw52Rpq4`^aSKqBov{d`eUTHlTs_Opv^XCKNoy(;+-~AmQAlO04o!mdU z@&m=I60&yF4z|9JLGUB++z7uBQsiV$_9W58;M%omG6C1KzAm%Yx@ibS6Ttj-bpRMH z;h7BMbhDHyh8ngNuGUzYB$oI!(!2SW$T*-ZkJNc^^YwH92XNbh%WN71e|-1Y>3=!Z zjtcSf0xWXM@r^f<3^@3L3Vx>neeze}3D|S@6W%SW3gaL=0bu0>QXlXNal5SxYD<&* zaDLdENJ4Py(yb~g7<^G%0N`@o4Vl>`yVO3=mujM!B=0l~MH(Fe5drj-S<-nfF1DMc zvt5ne;McTMr3L#;XpkzDo9N%YWC?PW&NFO(3Hl~q)oA@NuByIMozfx0_;WLCI|yWJ zueWNrd{w!JMDs$a%xr=<0qy$Al`D{jt?ad(7JW8bVS$wcSu<@FACv8=GxYfPcqxi=%-w)=(BB$jH2zst09&Tb?6t?1eKzkL#SLqCtA8 zhF*B{?>KIH!PvcB1SP~is~E7FZ|v@OE4B&NjK1~-Rnm;6=!Gf^IzbS~i?*%DNxz;d zLn4=(XR!I?x3E(pqM~uEqBymF6{2(TfZJ_Mo*ER1e)TGLci5co9|5r>edWps1kMI8 z^9JveQDF7BF#w*fC+$9znUuC)1iSqgviPJ2FH%h07o0uLu@|+#u zhjUsA;;SeJRlq>$mSFb^)enRq%Xssmqv*0)e+;@$G9i1Rbbi$bp%R5pvb*i?e~d+K zixo7V0A+}@On5$z^;AgN3-86{RzhB@GXSHOpq;=xot95LL;h(*rpYIaFPMf~B;q1* z5qo<*>PR$c41KF1cdcqW^&2A$LD@y5xaLQ4rKP3qjiE_a@SWQHu71VIR;}_gKlZv6 z0m$6Z#pN)9G>k}=sBF}V#5tipgI?gi>T%V%T|>ps>J<2Es|Mz*VoT-6CY z(P_IE05{~kG_9f$1j_xMXx1c|k%?MyhITkc{ArH>f{$0h)7+2k0$ZSs`Z?RpD)^j4 z=z_}Rg9re}m(hL)9UKb1J%7H?I|4{}YQKx$&ZuktQjs{aZeGZ*x%Jy)vBW9D#k{Bk zcbF(%jT9pb>toyRMHBU_UHVVpf2J8FdN)WwyPTAo$~JJP&NSRz=VxBT+V!iAc)TCJ zG6ba$mda2ryPwl`luwftBn|ID+9nFSAKY?|uZPY4c%n<~+4zKnt^{?WJ&5eOfN?qd z?X`sv`2a}CTboTtJMnw7DM_|fqVP%X-HDL=#pPvo#HJ#m_Jv2=YW>)yCTp(W*m1N# zd_m(>48waIg^WuApS!a*AtBYgcp6UznE*#sAab^1zqBOp7&tmQd{rQ7&)%<_$5k?1 z>&M3_fY0Zgot@R969gL61%(^e#naydFA&E%^Ac5Jv2H|lo#O$hr4>53x#>E|@>B;c zf15=HT3>~1$^$Yv3L=?*_;CNXgU1@FqXv5|+X3~wO9&Y_))v{qs&zk~wBkDRNurA5 znZXrCCZ-2~qy9iF(Qr&20WuSgg`5B+crd_=o8k``q+5;QYXSLI1KaeP>DtBaiPlmL zQyy(k*G6k~TBn(OSevX3Z;Er`6A*g|?}8?P)k;y_xDWc)87^PU=Z@3T%nA6cJY$l7 z@b$V*b{;(>)`=Y*nqY^!*4N)a&k;DoAF)zRyQ|EDa}Vxyg6g$=o&WiX75}ZEnn+1y YyKh^r@Kp#r#RGQrvf-slt=lpG27eMr$N&HU diff --git a/model/docs/pyrenew_demo.md b/model/docs/pyrenew_demo.md index 014aa454..3fea2bc7 100644 --- a/model/docs/pyrenew_demo.md +++ b/model/docs/pyrenew_demo.md @@ -10,7 +10,6 @@ installations of `matplotlib`, `numpy`, `jax`, `numpyro`, and `polars` ``` python import matplotlib as mpl import matplotlib.pyplot as plt - import jax import jax.numpy as jnp import numpy as np @@ -18,9 +17,6 @@ from numpyro.handlers import seed import numpyro.distributions as dist ``` - /mnt/c/Users/xrd4/Documents/repos/msr/model/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html - from .autonotebook import tqdm as notebook_tqdm - ``` python from pyrenew.process import SimpleRandomWalkProcess ``` @@ -36,32 +32,58 @@ with seed(rng_seed=np.random.randint(0,1000)): plt.plot(np.exp(q_samp[0])) ``` - +![](pyrenew_demo_files/figure-commonmark/fig-randwalk-output-1.png) ``` python -from pyrenew.latent import Infections, HospitalAdmissions -from pyrenew.observation import PoissonObservation +from pyrenew.latent import ( + Infections, HospitalAdmissions, Infections0, InfectHospRate, +) +from pyrenew.observation import PoissonObservation +from pyrenew.deterministic import DeterministicPMF, DeterministicVariable from pyrenew.model import HospitalizationsModel from pyrenew.process import RtRandomWalkProcess -# Initializing model parameters -latent_infections = Infections(jnp.array([0.25, 0.25, 0.25, 0.25])) +# Initializing model components: + +# A deterministic generation time +gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), + ) + +# Initial infections +I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + +# The latent infections process +latent_infections = Infections() + +# A deterministic infection to hosp pmf +inf_hosp_int = DeterministicPMF( + (jnp.array([0, 0, 0,0,0,0,0,0,0,0,0,0,0, 0.25, 0.5, 0.1, 0.1, 0.05]),), + ) + +# The latent hospitalization process latent_hospitalizations = HospitalAdmissions( - inf_hosp_int=jnp.array( - [0, 0, 0,0,0,0,0,0,0,0,0,0,0, 0.25, 0.5, 0.1, 0.1, 0.05], - ) + infection_to_admission_interval=inf_hosp_int, + infect_hosp_rate_dist = InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), + ), ) + +# And observation process for the hospitalizations observed_hospitalizations = PoissonObservation( rate_varname='latent', counts_varname='observed_hospitalizations', ) + +# And a random walk process (it could be deterministic using +# pyrenew.process.DeterministicProcess()) Rt_process = RtRandomWalkProcess() # Initializing the model hospmodel = HospitalizationsModel( + gen_int=gen_int, + I0=I0, latent_hospitalizations=latent_hospitalizations, observed_hospitalizations=observed_hospitalizations, latent_infections=latent_infections, @@ -80,20 +102,20 @@ x 1.2466507, 1.2800207, 1.2749145, 1.2619376, 1.2189837, 1.2192641, 1.2290158, 1.2128737, 1.1908046, 1.2174997, 1.1941082, 1.2084603, 1.1965215, 1.2248698, 1.2308019, 1.2426206, 1.2131014, 1.207159 , - 1.1837622], dtype=float32), infections=Array([ 1.4125489, 1.8606048, 2.373585 , 3.1091077, 2.6433773, - 2.8573434, 3.161715 , 3.5246303, 3.74528 , 3.893561 , - 4.314205 , 4.76846 , 5.211469 , 5.8201566, 6.4110003, - 7.0072513, 7.4510007, 8.13536 , 8.911782 , 9.553016 , - 10.137069 , 11.181891 , 11.876529 , 12.9149685, 13.793039 , - 15.239348 , 16.561634 , 18.176119 , 19.339912 , 20.919167 , - 22.194605 ], dtype=float32), IHR=Array(0.04929917, dtype=float32), latent=Array([0. , 0. , 0. , 0. , 0. , + 1.1837622], dtype=float32), infections=Array([0.05214045, 0.06867922, 0.08761451, 0.11476436, 0.09757317, + 0.10547114, 0.1167062 , 0.13010225, 0.13824694, 0.14372033, + 0.15924728, 0.17601486, 0.19236736, 0.21483542, 0.23664482, + 0.25865382, 0.27503362, 0.30029488, 0.3289544 , 0.35262382, + 0.37418258, 0.41274938, 0.43839005, 0.47672123, 0.50913286, + 0.5625195 , 0.6113282 , 0.67092246, 0.7138808 , 0.77217466, + 0.819254 ], dtype=float32), IHR=Array(0.04929917, dtype=float32), latent=Array([0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0.01740937, 0.05775031, - 0.08208082, 0.11296336, 0.13357335, 0.13198984, 0.14360985, - 0.15615721, 0.16922975, 0.18031327, 0.19277987, 0.21146055, - 0.23146638, 0.25456703, 0.28231323, 0.31053045, 0.33770248, - 0.36442798], dtype=float32), sampled=Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 1, 1, 0, 0], dtype=int32)) + 0. , 0. , 0. , 0.00064262, 0.0021317 , + 0.00302979, 0.00416974, 0.0049305 , 0.00487205, 0.00530097, + 0.00576412, 0.00624666, 0.00665578, 0.00711595, 0.0078055 , + 0.00854396, 0.00939666, 0.01042083, 0.0114624 , 0.01246538, + 0.01345188], dtype=float32), sampled=Array([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, 1, 0, 0, 0], dtype=int32)) ``` python fig, ax = plt.subplots(nrows=3, sharex=True) @@ -105,8 +127,7 @@ for axis in ax[:-1]: axis.set_yscale("log") ``` - +![](pyrenew_demo_files/figure-commonmark/fig-hosp-output-1.png) ``` python sim_dat={"observed_hospitalizations": x.sampled} @@ -129,39 +150,39 @@ hospmodel.print_summary() mean std median 5.0% 95.0% n_eff r_hat - I0 7.14 1.75 6.87 4.30 9.69 1052.68 1.00 - IHR 0.05 0.00 0.05 0.05 0.05 1712.91 1.00 - Rt0 1.13 0.12 1.13 0.92 1.32 960.40 1.00 - Rt_transformed_rw_diffs[0] -0.00 0.02 -0.00 -0.04 0.04 1315.29 1.00 - Rt_transformed_rw_diffs[1] -0.00 0.03 0.00 -0.04 0.04 1886.70 1.00 - Rt_transformed_rw_diffs[2] -0.00 0.02 -0.00 -0.04 0.04 1460.97 1.00 - Rt_transformed_rw_diffs[3] -0.00 0.02 -0.00 -0.04 0.04 1669.85 1.00 - Rt_transformed_rw_diffs[4] -0.00 0.02 -0.00 -0.04 0.04 1667.25 1.00 - Rt_transformed_rw_diffs[5] 0.00 0.03 0.00 -0.05 0.04 1702.68 1.00 - Rt_transformed_rw_diffs[6] -0.00 0.02 -0.00 -0.04 0.04 1558.87 1.00 - Rt_transformed_rw_diffs[7] -0.00 0.02 -0.00 -0.04 0.04 2296.40 1.00 - Rt_transformed_rw_diffs[8] -0.00 0.02 -0.00 -0.04 0.04 1850.65 1.00 - Rt_transformed_rw_diffs[9] 0.00 0.02 0.00 -0.04 0.03 1460.40 1.00 - Rt_transformed_rw_diffs[10] -0.00 0.02 0.00 -0.04 0.04 2055.47 1.00 - Rt_transformed_rw_diffs[11] -0.00 0.03 0.00 -0.04 0.04 1332.18 1.00 - Rt_transformed_rw_diffs[12] 0.00 0.02 0.00 -0.04 0.04 2042.44 1.00 - Rt_transformed_rw_diffs[13] -0.00 0.03 -0.00 -0.04 0.04 1278.69 1.00 - Rt_transformed_rw_diffs[14] -0.00 0.03 -0.00 -0.04 0.04 1777.71 1.00 - Rt_transformed_rw_diffs[15] 0.00 0.03 0.00 -0.04 0.04 1683.29 1.00 - Rt_transformed_rw_diffs[16] -0.00 0.02 -0.00 -0.03 0.04 1383.06 1.00 - Rt_transformed_rw_diffs[17] -0.00 0.03 -0.00 -0.04 0.04 1581.60 1.00 - Rt_transformed_rw_diffs[18] 0.00 0.03 0.00 -0.04 0.04 1576.48 1.00 - Rt_transformed_rw_diffs[19] 0.00 0.03 0.00 -0.04 0.04 2169.46 1.00 - Rt_transformed_rw_diffs[20] -0.00 0.02 -0.00 -0.04 0.04 2041.61 1.00 - Rt_transformed_rw_diffs[21] 0.00 0.02 0.00 -0.03 0.05 1861.29 1.00 - Rt_transformed_rw_diffs[22] 0.00 0.03 -0.00 -0.04 0.04 1796.97 1.00 - Rt_transformed_rw_diffs[23] -0.00 0.02 0.00 -0.04 0.04 1542.73 1.00 - Rt_transformed_rw_diffs[24] 0.00 0.03 0.00 -0.04 0.04 1625.01 1.00 - Rt_transformed_rw_diffs[25] -0.00 0.02 -0.00 -0.05 0.04 1711.34 1.00 - Rt_transformed_rw_diffs[26] 0.00 0.03 0.00 -0.04 0.04 1496.53 1.00 - Rt_transformed_rw_diffs[27] -0.00 0.03 -0.00 -0.05 0.04 1411.17 1.00 - Rt_transformed_rw_diffs[28] -0.00 0.02 0.00 -0.04 0.04 1478.24 1.00 - Rt_transformed_rw_diffs[29] -0.00 0.03 -0.00 -0.04 0.04 1557.55 1.00 + I0 1.27 1.10 0.97 0.10 2.42 1132.34 1.00 + IHR 0.05 0.00 0.05 0.05 0.05 2306.45 1.00 + Rt0 1.23 0.17 1.23 0.93 1.48 1327.22 1.00 + Rt_transformed_rw_diffs[0] -0.00 0.02 -0.00 -0.04 0.04 1404.95 1.00 + Rt_transformed_rw_diffs[1] 0.00 0.03 0.00 -0.04 0.04 2280.86 1.00 + Rt_transformed_rw_diffs[2] -0.00 0.02 -0.00 -0.04 0.04 2119.83 1.00 + Rt_transformed_rw_diffs[3] 0.00 0.02 -0.00 -0.04 0.04 2196.86 1.00 + Rt_transformed_rw_diffs[4] 0.00 0.02 -0.00 -0.03 0.04 2391.45 1.00 + Rt_transformed_rw_diffs[5] 0.00 0.03 0.00 -0.04 0.04 2043.02 1.00 + Rt_transformed_rw_diffs[6] 0.00 0.02 0.00 -0.04 0.04 1514.40 1.00 + Rt_transformed_rw_diffs[7] -0.00 0.02 -0.00 -0.04 0.04 2619.69 1.00 + Rt_transformed_rw_diffs[8] 0.00 0.03 0.00 -0.04 0.04 1883.84 1.00 + Rt_transformed_rw_diffs[9] 0.00 0.03 0.00 -0.04 0.04 2015.66 1.00 + Rt_transformed_rw_diffs[10] 0.00 0.02 0.00 -0.04 0.04 2045.47 1.00 + Rt_transformed_rw_diffs[11] -0.00 0.03 0.00 -0.04 0.04 1615.10 1.00 + Rt_transformed_rw_diffs[12] 0.00 0.02 0.00 -0.04 0.04 2206.32 1.00 + Rt_transformed_rw_diffs[13] 0.00 0.03 0.00 -0.04 0.04 1175.93 1.00 + Rt_transformed_rw_diffs[14] -0.00 0.03 -0.00 -0.04 0.04 1606.26 1.00 + Rt_transformed_rw_diffs[15] -0.00 0.03 -0.00 -0.04 0.04 2344.62 1.00 + Rt_transformed_rw_diffs[16] -0.00 0.02 0.00 -0.04 0.04 1522.33 1.00 + Rt_transformed_rw_diffs[17] 0.00 0.03 0.00 -0.04 0.04 2157.17 1.00 + Rt_transformed_rw_diffs[18] -0.00 0.02 -0.00 -0.04 0.04 1594.95 1.00 + Rt_transformed_rw_diffs[19] 0.00 0.03 -0.00 -0.04 0.04 1698.70 1.00 + Rt_transformed_rw_diffs[20] 0.00 0.02 0.00 -0.04 0.04 1726.18 1.00 + Rt_transformed_rw_diffs[21] 0.00 0.02 -0.00 -0.04 0.04 2386.35 1.00 + Rt_transformed_rw_diffs[22] 0.00 0.03 0.00 -0.04 0.04 2028.63 1.00 + Rt_transformed_rw_diffs[23] 0.00 0.02 0.00 -0.04 0.03 1669.71 1.00 + Rt_transformed_rw_diffs[24] 0.00 0.02 0.00 -0.04 0.04 2126.33 1.00 + Rt_transformed_rw_diffs[25] -0.00 0.02 -0.00 -0.04 0.04 2119.74 1.00 + Rt_transformed_rw_diffs[26] 0.00 0.03 0.00 -0.04 0.04 2657.91 1.00 + Rt_transformed_rw_diffs[27] -0.00 0.03 0.00 -0.04 0.04 1939.30 1.00 + Rt_transformed_rw_diffs[28] -0.00 0.02 -0.00 -0.04 0.04 1737.84 1.00 + Rt_transformed_rw_diffs[29] -0.00 0.03 -0.00 -0.04 0.04 2105.55 1.00 Number of divergences: 0 @@ -186,6 +207,4 @@ ax.set_yticks([0.5, 1, 2]) ax.set_yscale("log") ``` - +![](pyrenew_demo_files/figure-commonmark/fig-sampled-rt-output-1.png) diff --git a/model/docs/pyrenew_demo.qmd b/model/docs/pyrenew_demo.qmd index 4e9f6bc4..68d2f694 100644 --- a/model/docs/pyrenew_demo.qmd +++ b/model/docs/pyrenew_demo.qmd @@ -9,9 +9,11 @@ This demo simulates some basic renewal process data and then fits to it using `p You'll need to install `pyrenew` first. You'll also need working installations of `matplotlib`, `numpy`, `jax`, `numpyro`, and `polars` ```{python} +#| output: false +#| label: loading-pkgs +#| warning: false import matplotlib as mpl import matplotlib.pyplot as plt - import jax import jax.numpy as jnp import numpy as np @@ -25,6 +27,7 @@ from pyrenew.process import SimpleRandomWalkProcess ```{python} #| label: fig-randwalk +#| fig-cap: Random walk example np.random.seed(3312) q = SimpleRandomWalkProcess(dist.Normal(0, 0.001)) with seed(rng_seed=np.random.randint(0,1000)): @@ -34,27 +37,55 @@ plt.plot(np.exp(q_samp[0])) ``` ```{python} -from pyrenew.latent import Infections, HospitalAdmissions -from pyrenew.observation import PoissonObservation +from pyrenew.latent import ( + Infections, HospitalAdmissions, Infections0, InfectHospRate, +) +from pyrenew.observation import PoissonObservation +from pyrenew.deterministic import DeterministicPMF, DeterministicVariable from pyrenew.model import HospitalizationsModel from pyrenew.process import RtRandomWalkProcess -# Initializing model parameters -latent_infections = Infections(jnp.array([0.25, 0.25, 0.25, 0.25])) +# Initializing model components: + +# A deterministic generation time +gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), + ) + +# Initial infections +I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + +# The latent infections process +latent_infections = Infections() + +# A deterministic infection to hosp pmf +inf_hosp_int = DeterministicPMF( + (jnp.array([0, 0, 0,0,0,0,0,0,0,0,0,0,0, 0.25, 0.5, 0.1, 0.1, 0.05]),), + ) + +# The latent hospitalization process latent_hospitalizations = HospitalAdmissions( - inf_hosp_int=jnp.array( - [0, 0, 0,0,0,0,0,0,0,0,0,0,0, 0.25, 0.5, 0.1, 0.1, 0.05], - ) + infection_to_admission_interval=inf_hosp_int, + infect_hosp_rate_dist = InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), + ), ) + +# And observation process for the hospitalizations observed_hospitalizations = PoissonObservation( rate_varname='latent', counts_varname='observed_hospitalizations', ) + +# And a random walk process (it could be deterministic using +# pyrenew.process.DeterministicProcess()) Rt_process = RtRandomWalkProcess() # Initializing the model hospmodel = HospitalizationsModel( + gen_int=gen_int, + I0=I0, latent_hospitalizations=latent_hospitalizations, observed_hospitalizations=observed_hospitalizations, latent_infections=latent_infections, @@ -71,6 +102,7 @@ x ```{python} #| label: fig-hosp +#| fig-cap: Infections fig, ax = plt.subplots(nrows=3, sharex=True) ax[0].plot(x.infections) ax[0].set_ylim([1/5, 5]) @@ -106,6 +138,7 @@ samps = spread_draws(hospmodel.mcmc.get_samples(), [("Rt", "time")]) ```{python} #| label: fig-sampled-rt +#| fig-cap: Posterior Rt import numpy as np import polars as pl fig, ax = plt.subplots(figsize=[4, 5]) diff --git a/model/docs/pyrenew_demo_files/figure-commonmark/fig-hosp-output-1.png b/model/docs/pyrenew_demo_files/figure-commonmark/fig-hosp-output-1.png index 44a1a59ad85c3aaf39f195c1dd41bfcbc5786251..73cb803fc8ea1b9b1f3d5ea5312ebcc9cbf3ecb1 100644 GIT binary patch literal 14325 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 X#A3hulF5MR2gyh&JT8_neEmNFsWZmc diff --git a/model/docs/pyrenew_demo_files/figure-commonmark/fig-sampled-rt-output-1.png b/model/docs/pyrenew_demo_files/figure-commonmark/fig-sampled-rt-output-1.png index 1f46b6cf3b87fa884b8d88582753fb02f4beed34..7f94e989d16ceb16a1199be57b7159c24151992c 100644 GIT binary patch literal 38249 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 literal 34974 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 wastewater model the eventual expected number of hospitalizations with [reference time](#reporting-delay-between-the-time-of-reference-and-the-time-of-report) $t$ is given by: +In the wastewater model[^ww], the observed hospitalizations $h_t$ are the realization of a count random variable with mean modeled as a function of a renewal process, $H(t)$. Following the wastewater model's notation, the two equations that characterized this model component are: -$$H(t) = \omega(t) ~ p_\mathrm{hosp}(t) \sum_{\tau = 0}^{T_d} d(\tau) I(t-\tau).$$ +[^ww]: https://github.com/cdcent/cfa-forecast-renewal-ww/blob/main/model_definition.md#hospital-admissions-component + +$$ +\begin{align} +H(t) & = \omega(t) ~ p_\mathrm{hosp}(t) \sum_{\tau = 0}^{T_d} d(\tau) I(t-\tau).\\ +h_t & \sim \text{CountDistribution}(\theta(H(t))) +\end{align} +$$ + +Where $\omega(t)$ is a weekday effect, $p_{hosp}(t)$ is the probability of hospitalization, $d(\tau)$ is akin to incubation but representing infection to hospitalization time, $I(t)$ is the incidence, and $\text{CountDistribution}(\theta)$ can be a Negative Binomial or Poisson distribution (for example,). More details are provided in the documentation of the wastewater model ([link](https://github.com/cdcent/cfa-forecast-renewal-ww/blob/e7976925d5eea960ae1b907cddb857bce88f3d7a/model_definition.md#wastewater-component)). ### Wastewater diff --git a/model/src/pyrenew/deterministic/__init__.py b/model/src/pyrenew/deterministic/__init__.py new file mode 100644 index 00000000..87a504c0 --- /dev/null +++ b/model/src/pyrenew/deterministic/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- + +from pyrenew.deterministic.deterministic import DeterministicVariable +from pyrenew.deterministic.deterministicpmf import DeterministicPMF + +__all__ = ["DeterministicVariable", "DeterministicPMF"] diff --git a/model/src/pyrenew/deterministic/deterministic.py b/model/src/pyrenew/deterministic/deterministic.py new file mode 100644 index 00000000..5aa772e8 --- /dev/null +++ b/model/src/pyrenew/deterministic/deterministic.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- + +from pyrenew.metaclass import RandomVariable + + +class DeterministicVariable(RandomVariable): + """A deterministic (degenerate) random variable. Useful to pass fixed + quantities.""" + + def __init__( + self, + vars: tuple, + label: str = "a_random_variable", + ) -> None: + """Default constructor + + Parameters + ---------- + vars : tuple + A tuple with arraylike objects. + label : str + A label to assign to the process. + + Returns + ------- + None + """ + + self.validate(vars) + self.vars = vars + self.label = label + + return None + + @staticmethod + def validate(vars: tuple) -> None: + if not isinstance(vars, tuple): + raise Exception("vars is not a tuple") + + return None + + def sample( + self, + random_variables: dict = None, + constants: dict = None, + ) -> tuple: + """Retrieve the value of the deterministic Rv + + Parameters + ---------- + + random_variables : dict + Ignored. Default None. + constants : dict + Ignored. Default None. + + Returns + ------- + tuple + Containing the stored values during construction. + """ + + return self.vars diff --git a/model/src/pyrenew/deterministic/deterministicpmf.py b/model/src/pyrenew/deterministic/deterministicpmf.py new file mode 100644 index 00000000..e480d355 --- /dev/null +++ b/model/src/pyrenew/deterministic/deterministicpmf.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +from pyrenew.deterministic.deterministic import DeterministicVariable +from pyrenew.distutil import validate_discrete_dist_vector +from pyrenew.metaclass import RandomVariable + + +class DeterministicPMF(RandomVariable): + """A deterministic (degenerate) random variable that represents a PMF.""" + + def __init__( + self, + vars: tuple, + label: str = "a_random_variable", + tol: float = 1e-20, + ) -> None: + """Default constructor + + It automatically checks that the elements in `vars` can be indeed + consireded to be a PMF by calling + pyrenew.distutil.validate_discrete_dist_vector on each one of its + entries. + + Parameters + ---------- + vars : tuple + A tuple with arraylike objects. + label : str + A label to assign to the process. + tol : float + Passed to pyrenew.distutil.validate_discrete_dist_vector + + Returns + ------- + None + """ + + vars2 = list(vars) + for i in range(0, len(vars2)): + vars2[i] = validate_discrete_dist_vector( + discrete_dist=vars2[i], + tol=tol, + ) + + self.basevar = DeterministicVariable(tuple(vars2), label) + + return None + + @staticmethod + def validate(vars: tuple) -> None: + return None + + def sample( + self, + random_variables: dict = None, + constants: dict = None, + ) -> tuple: + """Retrieves the deterministic PMF + + Parameters + ---------- + + random_variables : dict + Ignored. Default None. + constants : dict + Ignored. Default None. + + Returns + ------- + tuple + Containing the stored values during construction. + """ + + return self.basevar.sample( + random_variables=random_variables, + constants=constants, + ) diff --git a/model/src/pyrenew/latent/__init__.py b/model/src/pyrenew/latent/__init__.py index 0c1a0607..c4133a7b 100644 --- a/model/src/pyrenew/latent/__init__.py +++ b/model/src/pyrenew/latent/__init__.py @@ -1,6 +1,10 @@ # -*- coding: utf-8 -*- -from pyrenew.latent.hospitaladmissions import HospitalAdmissions +from pyrenew.latent.hospitaladmissions import ( + HospitalAdmissions, + InfectHospRate, +) +from pyrenew.latent.i0 import Infections0 from pyrenew.latent.infection_functions import ( logistic_susceptibility_adjustment, sample_infections_rt, @@ -10,8 +14,10 @@ __all__ = [ "HospitalAdmissions", + "InfectHospRate", "Infections", "logistic_susceptibility_adjustment", "sample_infections_rt", "sample_infections_with_feedback", + "Infections0", ] diff --git a/model/src/pyrenew/latent/hospitaladmissions.py b/model/src/pyrenew/latent/hospitaladmissions.py index 359d293f..cd80b7cd 100644 --- a/model/src/pyrenew/latent/hospitaladmissions.py +++ b/model/src/pyrenew/latent/hospitaladmissions.py @@ -5,8 +5,7 @@ import jax.numpy as jnp import numpyro as npro import numpyro.distributions as dist -from numpy.typing import ArrayLike -from pyrenew.distutil import validate_discrete_dist_vector +from pyrenew.deterministic import DeterministicVariable from pyrenew.metaclass import RandomVariable HospAdmissionsSample = namedtuple( @@ -16,54 +15,156 @@ ) """Output from HospitalAdmissions.sample()""" +InfectHospRateSample = namedtuple( + "InfectHospRateSample", + ["IHR"], + defaults=[None], +) + + +class InfectHospRate(RandomVariable): + """Infection to Hospitalization Rate""" + + def __init__( + self, + dist: dist.Distribution, + varname: str = "IHR", + ) -> None: + """Default constructor + + Parameters + ---------- + dist : dist.Distribution, optional + Prior distribution of the IHR, by default + dist.LogNormal(jnp.log(0.05), 0.05) + varname : str, optional + Name of the random_variable that may hold observed IHR, by default + "IHR" + + Returns + ------- + None + """ + + self.validate(dist) + + self.dist = dist + self.varname = varname + + return None + + @staticmethod + def validate(distr: dist.Distribution) -> None: + assert isinstance(distr, dist.Distribution) + + def sample( + self, + random_variables: dict = None, + constants: dict = None, + ) -> InfectHospRateSample: + return InfectHospRateSample( + npro.sample( + "IHR", + self.dist, + obs=random_variables.get(self.varname, None), + ) + ) + class HospitalAdmissions(RandomVariable): - """Latent hospital admissions""" + r"""Latent hospital admissions + + Implements a renewal process for the expected number of hospitalizations. + + Notes + ----- + + The following text was directly extracted from the wastewater model + documentation + (`link `_). + + Following other semi-mechanistic renewal frameworks, we model the _expected_ + hospital admissions per capita :math:`H(t)` as a convolution of the + _expected_ latent incident infections per capita :math:`I(t)`, and a + discrete infection to hospitalization distribution :math:`d(\tau)`, scaled + by the probability of being hospitalized :math:`p_\mathrm{hosp}(t)`. + + To account for day-of-week effects in hospital reporting, we use an + estimated _weekday effect_ :math:`\omega(t)`. If :math:`t` and :math:`t'` + are the same day of the week, :math:`\omega(t) = \omega(t')`. The seven + values that :math:`\omega(t)` takes on are constrained to have mean 1. + + .. math:: + + H(t) = \omega(t) p_\mathrm{hosp}(t) \sum_{\\tau = 0}^{T_d} d(\tau) I(t-\tau) + + Where :math:`T_d` is the maximum delay from infection to hospitalization + that we consider. + """ def __init__( self, - inf_hosp_int: ArrayLike, + infection_to_admission_interval: RandomVariable, + infect_hosp_rate_dist: RandomVariable, infections_varname: str = "infections", - IHR_obs_varname: str = "IHR", hospitalizations_predicted_varname: str = "predicted_hospitalizations", - IHR_dist: dist.Distribution = dist.LogNormal(jnp.log(0.05), 0.05), + weekday_effect_dist: RandomVariable = DeterministicVariable((1,)), + hosp_report_prob_dist: RandomVariable = DeterministicVariable((1,)), ) -> None: """Default constructor Parameters ---------- - inf_hosp_int : ArrayLike - pmf for reporting (informing) hospitalizations. + infection_to_admission_interval : RandomVariable + pmf for reporting (informing) hospitalizations (see + pyrenew.observations.Deterministic). + infect_hosp_rate_dist : RandomVariable + Infection to hospitalization rate distribution. infections_varname : str Name of the entry in random_variables that holds the vector of infections. - IHR_obs_varname : str - Name of the entry in random_variables that holds the observed IHR + infect_hosp_rate_varname : str + Name of the entry in random_variables that holds the observed + infection-hospitalization rate (IHR). (if available). hospitalizations_predicted_varname : str Name to assign to the deterministic component in numpyro of predicted hospitalizations. - IHR_dist : dist.Distribution, optional - Infection to hospitalization rate pmf. + weekday_effect_dist : RandomVariable, optional + Weekday effect. + hosp_report_prob_dist : RandomVariable, optional + Distribution or fixed value for the hospital admission reporting probability. Defaults to 1 (full + reporting). Returns ------- None """ - HospitalAdmissions.validate(IHR_dist) + HospitalAdmissions.validate( + infect_hosp_rate_dist, + weekday_effect_dist, + hosp_report_prob_dist, + ) - self.IHR_obs_varname = IHR_obs_varname self.infections_varname = infections_varname self.hospitalizations_predicted_varname = ( hospitalizations_predicted_varname ) - self.IHR_dist = IHR_dist - self.inf_hosp = validate_discrete_dist_vector(inf_hosp_int) + self.infect_hosp_rate_dist = infect_hosp_rate_dist + self.weekday_effect_dist = weekday_effect_dist + self.hosp_report_prob_dist = hosp_report_prob_dist + self.infection_to_admission_interval = infection_to_admission_interval @staticmethod - def validate(IHR_dist) -> None: - assert isinstance(IHR_dist, dist.Distribution) + def validate( + infect_hosp_rate_dist, + weekday_effect_dist, + hosp_report_prob_dist, + ) -> None: + assert isinstance(infect_hosp_rate_dist, RandomVariable) + assert isinstance(weekday_effect_dist, RandomVariable) + assert isinstance(hosp_report_prob_dist, RandomVariable) return None @@ -93,18 +194,43 @@ def sample( if constants is None: constants = dict() - IHR = npro.sample( - "IHR", - self.IHR_dist, - obs=random_variables.get(self.IHR_obs_varname, None), + IHR, *_ = self.infect_hosp_rate_dist.sample( + random_variables=random_variables, + constants=constants, ) IHR_t = IHR * random_variables.get(self.infections_varname) + ( + infection_to_admission_interval, + *_, + ) = self.infection_to_admission_interval.sample( + random_variables=random_variables, + constants=constants, + ) + predicted_hospitalizations = jnp.convolve( - IHR_t, self.inf_hosp, mode="full" + IHR_t, infection_to_admission_interval, mode="full" )[: IHR_t.shape[0]] + # Applying weekday effect + predicted_hospitalizations = ( + predicted_hospitalizations + * self.weekday_effect_dist.sample( + random_variables=random_variables, + constants=constants, + )[0] + ) + + # Applying probability of hospitalization effect + predicted_hospitalizations = ( + predicted_hospitalizations + * self.hosp_report_prob_dist.sample( + random_variables=random_variables, + constants=constants, + )[0] + ) + npro.deterministic( self.hospitalizations_predicted_varname, predicted_hospitalizations ) diff --git a/model/src/pyrenew/latent/i0.py b/model/src/pyrenew/latent/i0.py new file mode 100644 index 00000000..595b98f2 --- /dev/null +++ b/model/src/pyrenew/latent/i0.py @@ -0,0 +1,77 @@ +import numpyro as npro +import numpyro.distributions as dist +from pyrenew.metaclass import RandomVariable + + +class Infections0(RandomVariable): + """Initial infections helper class. + + It creates a random variable for the initial infections with a prior + distribution. + """ + + def __init__( + self, + name: str = "I0", + I0_dist: dist.Distribution = dist.LogNormal(0, 1), + ) -> None: + """Default constructor + + Parameters + ---------- + name : str, optional + Name of the random variable, by default "I0" + I0_dist : dist.Distribution, optional + Distribution of the initial infections, by default dist.LogNormal(0, 1) + + Returns + ------- + None + """ + self.validate(I0_dist) + + self.name = name + self.i0_dist = I0_dist + + return None + + @staticmethod + def validate(i0_dist): + """Validate the initial infections distribution. + + Parameters + ---------- + i0_dist : dist.Distribution + Distribution of the initial infections. + + Returns + ------- + None + """ + assert isinstance(i0_dist, dist.Distribution) + + def sample( + self, + random_variables: dict, + constants: dict, + ) -> tuple: + """Sample the initial infections. + + Parameters + ---------- + random_variables : dict + Dictionary of random variables. + constants : dict + Dictionary of constants. + + Returns + ------- + tuple + Tuple with the initial infections. + """ + return ( + npro.sample( + name=self.name, + fn=self.i0_dist, + ), + ) diff --git a/model/src/pyrenew/latent/infections.py b/model/src/pyrenew/latent/infections.py index 19706e8c..e38cd2ef 100644 --- a/model/src/pyrenew/latent/infections.py +++ b/model/src/pyrenew/latent/infections.py @@ -4,13 +4,7 @@ import jax.numpy as jnp import numpyro as npro -import numpyro.distributions as dist import pyrenew.latent.infection_functions as inf -from numpy.typing import ArrayLike -from pyrenew.distutil import ( - reverse_discrete_dist_vector, - validate_discrete_dist_vector, -) from pyrenew.metaclass import RandomVariable InfectionsSample = namedtuple( @@ -25,18 +19,18 @@ class Infections(RandomVariable): def __init__( self, - gen_int: ArrayLike, + gen_int_varname: str = "gen_int", I0_varname: str = "I0", Rt_varname: str = "Rt", infections_mean_varname: str = "latent_infections", - I0_dist: dist.Distribution = dist.LogNormal(2, 0.25), ) -> None: """Default constructor Parameters ---------- - gen_int: ArrayLike - A vector representing the pmf of the generation interval + gen_int_varname : str. + Name of the element in `random_variables` that will hold the value + of 'generation interval'. I0_varname : str. Name of the element in `random_variables` that will hold the value of 'I0'. @@ -47,17 +41,14 @@ def __init__( Name of the element in `random_variables` that will hold the value of mean 'infections'. I0_dist : dist.Distribution, optional - Distribution from where to sample the baseline number of infections. + Distribution from where to sample the initial number of infections. Returns ------- - RandomVariable + None """ - Infections.validate(I0_dist, gen_int) - - self.I0_dist = I0_dist - self.gen_int_rev = reverse_discrete_dist_vector(gen_int) + self.gen_int_varname = gen_int_varname self.I0_varname = I0_varname self.Rt_varname = Rt_varname self.infections_mean_varname = infections_mean_varname @@ -65,10 +56,7 @@ def __init__( return None @staticmethod - def validate(I0_dist, gen_int) -> None: - assert isinstance(I0_dist, dist.Distribution) - validate_discrete_dist_vector(gen_int) - + def validate() -> None: return None def sample( @@ -78,33 +66,34 @@ def sample( ) -> tuple: """Samples infections given Rt + A random variable representing the pmf of the generation interval. + Parameters ---------- - obs : random_variables, optional + random_variables : dict A dictionary containing an observed `Rt` sequence passed to `sample_infections_rt()`. It can also contain `infections` and `I0`, both passed to `obs` in `numpyro.sample()`. - constants : dict - Possible dictionary of constants. + constants : dict, optional + Ignored. Returns ------- InfectionsSample Named tuple with "infections". """ - I0 = npro.sample( - name="I0", - fn=self.I0_dist, - obs=random_variables.get(self.I0_varname, None), - ) - n_lead = self.gen_int_rev.size - 1 + I0 = random_variables.get(self.I0_varname) + + gen_int_rev = jnp.flip(random_variables.get(self.gen_int_varname)) + + n_lead = gen_int_rev.size - 1 I0_vec = jnp.hstack([jnp.zeros(n_lead), I0]) all_infections = inf.sample_infections_rt( I0=I0_vec, Rt=random_variables.get(self.Rt_varname), - reversed_generation_interval_pmf=self.gen_int_rev, + reversed_generation_interval_pmf=gen_int_rev, ) npro.deterministic(self.infections_mean_varname, all_infections) diff --git a/model/src/pyrenew/model/hospitalizations.py b/model/src/pyrenew/model/hospitalizations.py index 7db65665..3ee19887 100644 --- a/model/src/pyrenew/model/hospitalizations.py +++ b/model/src/pyrenew/model/hospitalizations.py @@ -4,7 +4,6 @@ from pyrenew.metaclass import Model, RandomVariable, _assert_sample_and_rtype from pyrenew.model.rtinfectionsrenewal import RtInfectionsRenewalModel -from pyrenew.process import RtRandomWalkProcess HospModelSample = namedtuple( "HospModelSample", @@ -33,8 +32,10 @@ def __init__( self, latent_hospitalizations: RandomVariable, latent_infections: RandomVariable, + gen_int: RandomVariable, + I0: RandomVariable, + Rt_process: RandomVariable, observed_hospitalizations: RandomVariable = None, - Rt_process: RandomVariable = RtRandomWalkProcess(), ) -> None: """Default constructor @@ -42,18 +43,24 @@ def __init__( ---------- latent_hospitalizations : RandomVariable Latent process for the hospitalizations. - observed_hospitalizations : RandomVariable - Observation process for the hospitalizations. latent_infections : RandomVariable The infections latent process (passed to RtInfectionsRenewalModel). - Rt_process : RandomVariable, optional + gen_int : RandomVariable + Generation time (passed to RtInfectionsRenewalModel) + I0 : RandomVariable + Initial infections (passed to RtInfectionsRenewalModel) + Rt_process : RandomVariable Rt process (passed to RtInfectionsRenewalModel). + observed_hospitalizations : RandomVariable, optional + Observation process for the hospitalizations. Returns ------- None """ self.basic_renewal = RtInfectionsRenewalModel( + gen_int=gen_int, + I0=I0, latent_infections=latent_infections, observed_infections=None, Rt_process=Rt_process, @@ -135,7 +142,7 @@ def sample( if constants is None: constants = dict() - # Getting the baseline quantities from the basic model + # Getting the initial quantities from the basic model Rt, infections, *_ = self.basic_renewal.sample( constants=constants, random_variables=random_variables, diff --git a/model/src/pyrenew/model/rtinfectionsrenewal.py b/model/src/pyrenew/model/rtinfectionsrenewal.py index e302bf29..662737eb 100644 --- a/model/src/pyrenew/model/rtinfectionsrenewal.py +++ b/model/src/pyrenew/model/rtinfectionsrenewal.py @@ -3,7 +3,6 @@ from collections import namedtuple from pyrenew.metaclass import Model, RandomVariable, _assert_sample_and_rtype -from pyrenew.process import RtRandomWalkProcess # Output class of the RtInfectionsRenewalModel RtInfectionsRenewalSample = namedtuple( @@ -24,8 +23,10 @@ class RtInfectionsRenewalModel(Model): def __init__( self, latent_infections: RandomVariable, + gen_int: RandomVariable, + I0: RandomVariable, + Rt_process: RandomVariable, observed_infections: RandomVariable = None, - Rt_process: RandomVariable = RtRandomWalkProcess(), ) -> None: """Default constructor @@ -34,13 +35,17 @@ def __init__( latent_infections : RandomVariable Infections latent process (e.g., pyrenew.latent.Infections.) + gen_int : RandomVariable + Generation interval. + I0 : RandomVariable + Initial infections. + Rt_process : RandomVariable + The sample function of the process should return a tuple where the + first element is the drawn Rt. observed_infections : RandomVariable, optional Infections observation process (e.g., pyrenew.observations.Poisson.) It should receive the sampled Rt via `random_variables`. - Rt_process : RandomVariable, optional - The sample function of the process should return a tuple where the - first element is the drawn Rt., by default RtRandomWalkProcess() Returns ------- @@ -48,17 +53,29 @@ def __init__( """ RtInfectionsRenewalModel.validate( + gen_int=gen_int, + i0=I0, latent_infections=latent_infections, observed_infections=observed_infections, Rt_process=Rt_process, ) + self.gen_int = gen_int + self.i0 = I0 self.latent_infections = latent_infections self.observed_infections = observed_infections self.Rt_process = Rt_process @staticmethod - def validate(latent_infections, observed_infections, Rt_process) -> None: + def validate( + gen_int, + i0, + latent_infections, + observed_infections, + Rt_process, + ) -> None: + _assert_sample_and_rtype(gen_int, skip_if_none=False) + _assert_sample_and_rtype(i0, skip_if_none=False) _assert_sample_and_rtype(latent_infections, skip_if_none=False) _assert_sample_and_rtype(observed_infections, skip_if_none=True) _assert_sample_and_rtype(Rt_process, skip_if_none=False) @@ -74,6 +91,26 @@ def sample_rt( constants=constants, ) + def sample_gen_int( + self, + random_variables: dict = None, + constants: dict = None, + ) -> tuple: + return self.gen_int.sample( + random_variables=random_variables, + constants=constants, + ) + + def sample_i0( + self, + random_variables: dict = None, + constants: dict = None, + ) -> tuple: + return self.i0.sample( + random_variables=random_variables, + constants=constants, + ) + def sample_infections_latent( self, random_variables: dict = None, @@ -129,9 +166,24 @@ def sample( constants=constants, ) + # Getting the generation interval + gen_int, *_ = self.sample_gen_int( + random_variables=random_variables, + constants=constants, + ) + + # Sampling initial infections + i0, *_ = self.sample_i0( + random_variables=random_variables, + constants=constants, + ) + # Sampling from the latent process latent, *_ = self.sample_infections_latent( - random_variables={**random_variables, **dict(Rt=Rt)}, + random_variables={ + **random_variables, + **dict(Rt=Rt, gen_int=gen_int, I0=i0), + }, constants=constants, ) diff --git a/model/src/pyrenew/process/rtrandomwalk.py b/model/src/pyrenew/process/rtrandomwalk.py index 55d452ba..a349e670 100644 --- a/model/src/pyrenew/process/rtrandomwalk.py +++ b/model/src/pyrenew/process/rtrandomwalk.py @@ -23,7 +23,7 @@ def __init__( Parameters ---------- Rt0_dist : dist.Distribution, optional - Baseline distributiono of Rt, defaults to + Initial distributiono of Rt, defaults to dist.TruncatedNormal( loc=1.2, scale=0.2, low=0 ) Rt_transform : AbstractTransform, optional Transformation applied to the sampled Rt0, defaults diff --git a/model/src/test/test_latent_hospitalizations.py b/model/src/test/test_latent_hospitalizations.py index ced2ac8f..79042ecd 100644 --- a/model/src/test/test_latent_hospitalizations.py +++ b/model/src/test/test_latent_hospitalizations.py @@ -4,7 +4,9 @@ import numpy as np import numpy.testing as testing import numpyro as npro -from pyrenew.latent import HospitalAdmissions, Infections +import numpyro.distributions as dist +from pyrenew.deterministic import DeterministicPMF +from pyrenew.latent import HospitalAdmissions, InfectHospRate, Infections from pyrenew.process import RtRandomWalkProcess @@ -20,17 +22,48 @@ def test_hospitalizations_sample(): with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): sim_rt, *_ = rt.sample(constants={"n_timepoints": 30}) - inf1 = Infections(jnp.array([0.25, 0.25, 0.25, 0.25])) + gen_int = jnp.array([0.25, 0.25, 0.25, 0.25]) + i0 = 10 + + inf1 = Infections() - i0 = dict(I0=10) with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): - inf_sampled1 = inf1.sample(random_variables=dict(Rt=sim_rt, data=i0)) + inf_sampled1 = inf1.sample( + random_variables=dict(Rt=sim_rt, gen_int=gen_int, I0=i0), + ) # Testing the hospitalizations + inf_hosp = DeterministicPMF( + ( + jnp.array( + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.25, + 0.5, + 0.1, + 0.1, + 0.05, + ] + ), + ), + ) hosp1 = HospitalAdmissions( - inf_hosp_int=jnp.array( - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.1, 0.1, 0.05] - ) + infection_to_admission_interval=inf_hosp, + infect_hosp_rate_dist=InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), + ), ) with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): diff --git a/model/src/test/test_latent_infections.py b/model/src/test/test_latent_infections.py index 947b4f91..5bc01449 100755 --- a/model/src/test/test_latent_infections.py +++ b/model/src/test/test_latent_infections.py @@ -19,10 +19,12 @@ def test_infections_as_deterministic(): with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): sim_rt, *_ = rt.sample(constants={"n_timepoints": 30}) - inf1 = Infections(jnp.array([0.25, 0.25, 0.25, 0.25])) + gen_int = jnp.array([0.25, 0.25, 0.25, 0.25]) + + inf1 = Infections() with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): - obs = dict(Rt=sim_rt, I0=10) + obs = dict(Rt=sim_rt, I0=10, gen_int=gen_int) inf_sampled1 = inf1.sample(random_variables=obs) inf_sampled2 = inf1.sample(random_variables=obs) diff --git a/model/src/test/test_model_basic_renewal.py b/model/src/test/test_model_basic_renewal.py index 889c041d..9c034470 100644 --- a/model/src/test/test_model_basic_renewal.py +++ b/model/src/test/test_model_basic_renewal.py @@ -4,10 +4,13 @@ import jax.numpy as jnp import numpy as np import numpyro as npro +import numpyro.distributions as dist import polars as pl -from pyrenew.latent import Infections +from pyrenew.deterministic import DeterministicPMF +from pyrenew.latent import Infections, Infections0 from pyrenew.model import RtInfectionsRenewalModel from pyrenew.observation import PoissonObservation +from pyrenew.process import RtRandomWalkProcess def test_model_basicrenewal_no_obs_model(): @@ -16,11 +19,22 @@ def test_model_basicrenewal_no_obs_model(): from the perspective of the infections. It returns expected, not sampled. """ - latent_infections = Infections( - gen_int=jnp.array([0.25, 0.25, 0.25, 0.25]), + gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), ) - model0 = RtInfectionsRenewalModel(latent_infections=latent_infections) + I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + + latent_infections = Infections() + + rt = RtRandomWalkProcess() + + model0 = RtInfectionsRenewalModel( + gen_int=gen_int, + I0=I0, + latent_infections=latent_infections, + Rt_process=rt, + ) # Sampling and fitting model 0 (with no obs for infections) np.random.seed(223) @@ -53,18 +67,27 @@ def test_model_basicrenewal_with_obs_model(): from the perspective of the infections. It returns sampled, not expected. """ - latent_infections = Infections( - gen_int=jnp.array([0.25, 0.25, 0.25, 0.25]), + gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), ) + I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + + latent_infections = Infections() + observed_infections = PoissonObservation( rate_varname="latent", counts_varname="observed_infections", ) + rt = RtRandomWalkProcess() + model1 = RtInfectionsRenewalModel( + I0=I0, + gen_int=gen_int, latent_infections=latent_infections, observed_infections=observed_infections, + Rt_process=rt, ) # Sampling and fitting model 1 (with obs infections) diff --git a/model/src/test/test_model_hospitalizations.py b/model/src/test/test_model_hospitalizations.py index a78a9be2..3cc2d1d2 100644 --- a/model/src/test/test_model_hospitalizations.py +++ b/model/src/test/test_model_hospitalizations.py @@ -4,30 +4,89 @@ import jax.numpy as jnp import numpy as np import numpyro as npro +import numpyro.distributions as dist import polars as pl -from pyrenew.latent import HospitalAdmissions, Infections +from pyrenew.deterministic import DeterministicPMF, DeterministicVariable +from pyrenew.latent import ( + HospitalAdmissions, + InfectHospRate, + Infections, + Infections0, +) +from pyrenew.metaclass import RandomVariable from pyrenew.model import HospitalizationsModel from pyrenew.observation import PoissonObservation from pyrenew.process import RtRandomWalkProcess +class UniformProbForTest(RandomVariable): + def __init__(self, pname: str): + self.name = pname + + return None + + @staticmethod + def validate(self): + return None + + def sample(self, random_variables, constants): + return ( + npro.sample(name=self.name, fn=dist.Uniform(high=0.99, low=0.01)), + ) + + def test_model_hosp_no_obs_model(): """ Checks that the partially deterministic Hospitalization model runs """ - latent_infections = Infections(jnp.array([0.25, 0.25, 0.25, 0.25])) + gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), + ) + + I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + + latent_infections = Infections() Rt_process = RtRandomWalkProcess() - latent_hospitalizations = HospitalAdmissions( - inf_hosp_int=jnp.array( - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.1, 0.1, 0.05], + inf_hosp = DeterministicPMF( + ( + jnp.array( + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.25, + 0.5, + 0.1, + 0.1, + 0.05, + ], + ), ), + ) + latent_hospitalizations = HospitalAdmissions( + infection_to_admission_interval=inf_hosp, infections_varname="infections", hospitalizations_predicted_varname="observed_hospitalizations", + infect_hosp_rate_dist=InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), + ), ) model0 = HospitalizationsModel( + gen_int=gen_int, + I0=I0, Rt_process=Rt_process, latent_infections=latent_infections, latent_hospitalizations=latent_hospitalizations, @@ -64,21 +123,268 @@ def test_model_hosp_with_obs_model(): Checks that the random Hospitalization model runs """ - latent_infections = Infections(jnp.array([0.25, 0.25, 0.25, 0.25])) + gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), + ) + + I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + + latent_infections = Infections() + Rt_process = RtRandomWalkProcess() + observed_hospitalizations = PoissonObservation( + rate_varname="latent", + counts_varname="observed_hospitalizations", + ) + + inf_hosp = DeterministicPMF( + ( + jnp.array( + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.25, + 0.5, + 0.1, + 0.1, + 0.05, + ], + ), + ), + ) + + latent_hospitalizations = HospitalAdmissions( + infection_to_admission_interval=inf_hosp, + infections_varname="infections", + infect_hosp_rate_dist=InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), + ), + ) + + model1 = HospitalizationsModel( + gen_int=gen_int, + I0=I0, + Rt_process=Rt_process, + latent_infections=latent_infections, + latent_hospitalizations=latent_hospitalizations, + observed_hospitalizations=observed_hospitalizations, + ) + + # Sampling and fitting model 0 (with no obs for infections) + np.random.seed(223) + with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): + model1_samp = model1.sample(constants={"n_timepoints": 30}) + + model1.run( + num_warmup=500, + num_samples=500, + rng_key=jax.random.PRNGKey(272), + random_variables=dict( + observed_hospitalizations=model1_samp.sampled, + infections=model1_samp.infections, + ), + constants=dict(n_timepoints=30), + ) + + inf = model1.spread_draws(["predicted_hospitalizations"]) + inf_mean = ( + inf.group_by("draw") + .agg(pl.col("predicted_hospitalizations").mean()) + .sort(pl.col("draw")) + ) + + # For now the assertion is only about the expected number of rows + # It should be about the MCMC inference. + assert inf_mean.to_numpy().shape[0] == 500 + + +def test_model_hosp_with_obs_model_weekday_phosp_2(): + """ + Checks that the random Hospitalization model runs + """ + + gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), + ) + + I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + + latent_infections = Infections() Rt_process = RtRandomWalkProcess() observed_hospitalizations = PoissonObservation( rate_varname="latent", counts_varname="observed_hospitalizations", ) + inf_hosp = DeterministicPMF( + ( + jnp.array( + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.25, + 0.5, + 0.1, + 0.1, + 0.05, + ], + ), + ), + ) + + # Other random components + weekday = jnp.array([1, 1, 1, 1, 2, 2]) + weekday = weekday / weekday.sum() + weekday = jnp.tile(weekday, 10) + weekday = weekday[:31] + + hosp_report_prob_dist = UniformProbForTest("hosp_report_prob_dist") + weekday = UniformProbForTest("weekday") + latent_hospitalizations = HospitalAdmissions( - inf_hosp_int=jnp.array( - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.5, 0.1, 0.1, 0.05], + infection_to_admission_interval=inf_hosp, + infections_varname="infections", + weekday_effect_dist=weekday, + hosp_report_prob_dist=hosp_report_prob_dist, + infect_hosp_rate_dist=InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), ), + ) + + model1 = HospitalizationsModel( + I0=I0, + gen_int=gen_int, + Rt_process=Rt_process, + latent_infections=latent_infections, + latent_hospitalizations=latent_hospitalizations, + observed_hospitalizations=observed_hospitalizations, + ) + + # Sampling and fitting model 0 (with no obs for infections) + np.random.seed(223) + with npro.handlers.seed(rng_seed=np.random.randint(1, 600)): + model1_samp = model1.sample(constants={"n_timepoints": 30}) + + model1.run( + num_warmup=500, + num_samples=500, + rng_key=jax.random.PRNGKey(272), + random_variables=dict( + observed_hospitalizations=model1_samp.sampled, + infections=model1_samp.infections, + ), + constants=dict(n_timepoints=30), + ) + + inf = model1.spread_draws(["predicted_hospitalizations"]) + inf_mean = ( + inf.group_by("draw") + .agg(pl.col("predicted_hospitalizations").mean()) + .sort(pl.col("draw")) + ) + + # For now the assertion is only about the expected number of rows + # It should be about the MCMC inference. + assert inf_mean.to_numpy().shape[0] == 500 + + +def test_model_hosp_with_obs_model_weekday_phosp(): + """ + Checks that the random Hospitalization model runs + """ + + gen_int = DeterministicPMF( + (jnp.array([0.25, 0.25, 0.25, 0.25]),), + ) + + I0 = Infections0(I0_dist=dist.LogNormal(0, 1)) + + latent_infections = Infections() + Rt_process = RtRandomWalkProcess() + observed_hospitalizations = PoissonObservation( + rate_varname="latent", + counts_varname="observed_hospitalizations", + ) + + inf_hosp = DeterministicPMF( + ( + jnp.array( + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0.25, + 0.5, + 0.1, + 0.1, + 0.05, + ], + ), + ), + ) + + # Other random components + weekday = jnp.array([1, 1, 1, 1, 2, 2]) + weekday = jnp.tile(weekday, 10) + weekday = weekday / weekday.sum() + weekday = weekday[:31] + + weekday = DeterministicVariable((weekday,)) + + hosp_report_prob_dist = jnp.array([0.9, 0.8, 0.7, 0.7, 0.6, 0.4]) + hosp_report_prob_dist = jnp.tile(hosp_report_prob_dist, 10) + hosp_report_prob_dist = hosp_report_prob_dist / hosp_report_prob_dist.sum() + + hosp_report_prob_dist = hosp_report_prob_dist[:31] + + hosp_report_prob_dist = DeterministicVariable( + vars=(hosp_report_prob_dist,) + ) + + latent_hospitalizations = HospitalAdmissions( + infection_to_admission_interval=inf_hosp, infections_varname="infections", + weekday_effect_dist=weekday, + hosp_report_prob_dist=hosp_report_prob_dist, + infect_hosp_rate_dist=InfectHospRate( + dist=dist.LogNormal(jnp.log(0.05), 0.05), + ), ) model1 = HospitalizationsModel( + I0=I0, + gen_int=gen_int, Rt_process=Rt_process, latent_infections=latent_infections, latent_hospitalizations=latent_hospitalizations,