From 7c4c6b821ea5b40a5bafc15f55c976117967c3a8 Mon Sep 17 00:00:00 2001 From: Jonathan Taylor Date: Tue, 4 Jun 2024 19:38:29 -0700 Subject: [PATCH] Ch10 of v2.2 --- Ch10-deeplearning-lab.Rmd | 6 +- Ch10-deeplearning-lab.ipynb | 2038 +++++++++++++++++++++++++---------- 2 files changed, 1458 insertions(+), 586 deletions(-) diff --git a/Ch10-deeplearning-lab.Rmd b/Ch10-deeplearning-lab.Rmd index b16371a..fec369f 100644 --- a/Ch10-deeplearning-lab.Rmd +++ b/Ch10-deeplearning-lab.Rmd @@ -1630,9 +1630,9 @@ For a categorical series in `pandas`, we can form the indicators using the `get_dummies()` method. ```{python} -X_day = pd.merge(X, - pd.get_dummies(NYSE['day_of_week']), - on='date') +X_day = pd.concat([X, + pd.get_dummies(NYSE['day_of_week'])], + axis=1).dropna() ``` Note that we do not have to reinstantiate the linear regression model diff --git a/Ch10-deeplearning-lab.ipynb b/Ch10-deeplearning-lab.ipynb index 2123131..395f2a5 100644 --- a/Ch10-deeplearning-lab.ipynb +++ b/Ch10-deeplearning-lab.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "f90b09a3", + "id": "5afc399d", "metadata": {}, "source": [ "# Deep Learning\n", @@ -16,7 +16,7 @@ }, { "cell_type": "markdown", - "id": "9fad9264", + "id": "2f2304ae", "metadata": {}, "source": [ "In this section we demonstrate how to fit the examples discussed\n", @@ -34,7 +34,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "6897e881", + "id": "71bd6b71", "metadata": { "lines_to_next_cell": 2 }, @@ -58,7 +58,7 @@ }, { "cell_type": "markdown", - "id": "fbbdb8eb", + "id": "9b799d88", "metadata": {}, "source": [ "### Torch-Specific Imports\n", @@ -71,7 +71,7 @@ { "cell_type": "code", "execution_count": 2, - "id": "255d9f07", + "id": "3298bdf1", "metadata": {}, "outputs": [], "source": [ @@ -83,7 +83,7 @@ }, { "cell_type": "markdown", - "id": "28049973", + "id": "51c32fa5", "metadata": {}, "source": [ "There are several other helper packages for `torch`. For instance,\n", @@ -102,7 +102,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "6ba3faab", + "id": "aeae9bd9", "metadata": {}, "outputs": [], "source": [ @@ -113,7 +113,7 @@ }, { "cell_type": "markdown", - "id": "071252f4", + "id": "1049a398", "metadata": {}, "source": [ "The package `pytorch_lightning` is a somewhat higher-level\n", @@ -126,7 +126,7 @@ { "cell_type": "code", "execution_count": 4, - "id": "8e5d7b86", + "id": "a5a39702", "metadata": {}, "outputs": [], "source": [ @@ -136,7 +136,7 @@ }, { "cell_type": "markdown", - "id": "13f7ec45", + "id": "e1b27f4d", "metadata": {}, "source": [ "In order to reproduce results we use `seed_everything()`. We will also instruct `torch` to use deterministic algorithms\n", @@ -146,7 +146,7 @@ { "cell_type": "code", "execution_count": 5, - "id": "b1412627", + "id": "11bf06a4", "metadata": {}, "outputs": [ { @@ -165,7 +165,7 @@ }, { "cell_type": "markdown", - "id": "8efd2d69", + "id": "4bd719f8", "metadata": {}, "source": [ "We will use several datasets shipped with `torchvision` for our\n", @@ -176,7 +176,7 @@ { "cell_type": "code", "execution_count": 6, - "id": "c85dbdf7", + "id": "062cd869", "metadata": { "lines_to_next_cell": 0 }, @@ -194,7 +194,7 @@ }, { "cell_type": "markdown", - "id": "d6986913", + "id": "7c2a507a", "metadata": {}, "source": [ "We have provided a few utilities in `ISLP` specifically for this lab.\n", @@ -212,7 +212,7 @@ { "cell_type": "code", "execution_count": 7, - "id": "6381b2a7", + "id": "4a05884a", "metadata": {}, "outputs": [], "source": [ @@ -224,7 +224,7 @@ }, { "cell_type": "markdown", - "id": "1dfdc3be", + "id": "a6f41487", "metadata": {}, "source": [ "In addition we have included some helper\n", @@ -241,7 +241,7 @@ { "cell_type": "code", "execution_count": 8, - "id": "0be1302b", + "id": "1474e88b", "metadata": {}, "outputs": [], "source": [ @@ -253,7 +253,7 @@ }, { "cell_type": "markdown", - "id": "64efdd31", + "id": "86123617", "metadata": {}, "source": [ "Finally, we introduce some utility imports not directly related to\n", @@ -270,7 +270,7 @@ { "cell_type": "code", "execution_count": 9, - "id": "4add98c3", + "id": "0100ff28", "metadata": { "lines_to_next_cell": 2 }, @@ -282,7 +282,7 @@ }, { "cell_type": "markdown", - "id": "b7fe490d", + "id": "b0f81cea", "metadata": {}, "source": [ "## Single Layer Network on Hitters Data\n", @@ -292,7 +292,7 @@ { "cell_type": "code", "execution_count": 10, - "id": "d0d835db", + "id": "ef59d53a", "metadata": { "lines_to_next_cell": 0 }, @@ -304,7 +304,7 @@ }, { "cell_type": "markdown", - "id": "2ac27ca3", + "id": "e302823e", "metadata": {}, "source": [ " We will fit two linear models (least squares and lasso) and compare their performance\n", @@ -320,7 +320,7 @@ { "cell_type": "code", "execution_count": 11, - "id": "097fcaf9", + "id": "4deacf91", "metadata": { "lines_to_next_cell": 0 }, @@ -333,7 +333,7 @@ }, { "cell_type": "markdown", - "id": "e8ec3f83", + "id": "d030ccab", "metadata": {}, "source": [ "The `to_numpy()` method above converts `pandas`\n", @@ -346,7 +346,7 @@ }, { "cell_type": "markdown", - "id": "7b7726c0", + "id": "13ffb53a", "metadata": {}, "source": [ "We now split the data into test and training, fixing the random\n", @@ -356,7 +356,7 @@ { "cell_type": "code", "execution_count": 12, - "id": "307d176d", + "id": "8593f62b", "metadata": {}, "outputs": [], "source": [ @@ -371,7 +371,7 @@ }, { "cell_type": "markdown", - "id": "7fbc81df", + "id": "d1e980ad", "metadata": {}, "source": [ "### Linear Models\n", @@ -381,7 +381,7 @@ { "cell_type": "code", "execution_count": 13, - "id": "d6b4d16a", + "id": "54b14993", "metadata": {}, "outputs": [ { @@ -403,7 +403,7 @@ }, { "cell_type": "markdown", - "id": "28bd1c97", + "id": "c18abe13", "metadata": {}, "source": [ "Next we fit the lasso using `sklearn`. We are using\n", @@ -417,7 +417,7 @@ { "cell_type": "code", "execution_count": 14, - "id": "7a237f92", + "id": "84c668ad", "metadata": {}, "outputs": [], "source": [ @@ -429,7 +429,7 @@ }, { "cell_type": "markdown", - "id": "d0755015", + "id": "aab2c215", "metadata": {}, "source": [ "We need to create a grid of values for $\\lambda$. As is common practice, \n", @@ -440,7 +440,7 @@ { "cell_type": "code", "execution_count": 15, - "id": "4c29582f", + "id": "093f8ce9", "metadata": { "lines_to_next_cell": 0 }, @@ -455,7 +455,7 @@ }, { "cell_type": "markdown", - "id": "eb1fb3ce", + "id": "def35611", "metadata": {}, "source": [ "Note that we had to transform the data first, since the scale of the variables impacts the choice of $\\lambda$.\n", @@ -465,7 +465,7 @@ { "cell_type": "code", "execution_count": 16, - "id": "31a8e175", + "id": "38773381", "metadata": {}, "outputs": [], "source": [ @@ -481,7 +481,7 @@ }, { "cell_type": "markdown", - "id": "9d033f22", + "id": "53f2dc95", "metadata": {}, "source": [ "We extract the lasso model with best cross-validated mean absolute error, and evaluate its\n", @@ -492,7 +492,7 @@ { "cell_type": "code", "execution_count": 17, - "id": "6cdb5d78", + "id": "adc24a51", "metadata": { "lines_to_next_cell": 0 }, @@ -516,7 +516,7 @@ }, { "cell_type": "markdown", - "id": "aa5cd48d", + "id": "252e9dc1", "metadata": {}, "source": [ "This is similar to the results we got for the linear model fit by least squares. However, these results can vary a lot for different train/test splits; we encourage the reader to try a different seed in code block 12 and rerun the subsequent code up to this point.\n", @@ -534,7 +534,7 @@ { "cell_type": "code", "execution_count": 18, - "id": "46182e56", + "id": "415cf74b", "metadata": {}, "outputs": [], "source": [ @@ -556,7 +556,7 @@ }, { "cell_type": "markdown", - "id": "a9f87207", + "id": "ca326fd5", "metadata": {}, "source": [ "The `class` statement identifies the code chunk as a\n", @@ -592,7 +592,7 @@ { "cell_type": "code", "execution_count": 19, - "id": "d8a7b5f2", + "id": "60469c96", "metadata": {}, "outputs": [], "source": [ @@ -601,7 +601,7 @@ }, { "cell_type": "markdown", - "id": "094b44db", + "id": "114db3d4", "metadata": {}, "source": [ "The object `self.sequential` is a composition of four maps. The\n", @@ -616,7 +616,7 @@ }, { "cell_type": "markdown", - "id": "1da9b02e", + "id": "9f5be00d", "metadata": {}, "source": [ "The package `torchinfo` provides a `summary()` function that neatly summarizes\n", @@ -627,7 +627,7 @@ { "cell_type": "code", "execution_count": 20, - "id": "9cbb2ca6", + "id": "84720ca7", "metadata": { "lines_to_next_cell": 0 }, @@ -673,7 +673,7 @@ }, { "cell_type": "markdown", - "id": "70d1528c", + "id": "48833aad", "metadata": {}, "source": [ "We have truncated the end of the output slightly, here and in subsequent uses.\n", @@ -695,7 +695,7 @@ { "cell_type": "code", "execution_count": 21, - "id": "58579f70", + "id": "6f8038ce", "metadata": { "lines_to_next_cell": 0 }, @@ -708,7 +708,7 @@ }, { "cell_type": "markdown", - "id": "f28bc04d", + "id": "3b0c854a", "metadata": {}, "source": [ "We do the same for the test data." @@ -717,7 +717,7 @@ { "cell_type": "code", "execution_count": 22, - "id": "f6b292b4", + "id": "ffe8314e", "metadata": {}, "outputs": [], "source": [ @@ -728,7 +728,7 @@ }, { "cell_type": "markdown", - "id": "eb63c350", + "id": "8806a619", "metadata": {}, "source": [ "Finally, this dataset is passed to a `DataLoader()` which ultimately\n", @@ -752,7 +752,7 @@ { "cell_type": "code", "execution_count": 23, - "id": "ef6d13f3", + "id": "337f4f07", "metadata": {}, "outputs": [], "source": [ @@ -761,7 +761,7 @@ }, { "cell_type": "markdown", - "id": "2734e2bf", + "id": "18928238", "metadata": {}, "source": [ "The general training setup in `pytorch_lightning` involves\n", @@ -784,7 +784,7 @@ { "cell_type": "code", "execution_count": 24, - "id": "56454d6a", + "id": "c60b1e3f", "metadata": {}, "outputs": [], "source": [ @@ -797,7 +797,7 @@ }, { "cell_type": "markdown", - "id": "4494e403", + "id": "9e5f527d", "metadata": {}, "source": [ "Next we must provide a `pytorch_lightning` module that controls\n", @@ -812,7 +812,7 @@ { "cell_type": "code", "execution_count": 25, - "id": "2f1a4c97", + "id": "916cfd66", "metadata": {}, "outputs": [], "source": [ @@ -822,7 +822,7 @@ }, { "cell_type": "markdown", - "id": "3b0ba006", + "id": "cf7f2d1b", "metadata": {}, "source": [ " By using the `SimpleModule.regression()` method, we indicate that we will use squared-error loss as in\n", @@ -839,7 +839,7 @@ { "cell_type": "code", "execution_count": 26, - "id": "a30e9bab", + "id": "44a44fb1", "metadata": {}, "outputs": [], "source": [ @@ -848,7 +848,7 @@ }, { "cell_type": "markdown", - "id": "2827cb02", + "id": "f37f19f0", "metadata": {}, "source": [ "Finally we are ready to train our model and log the results. We\n", @@ -870,7 +870,7 @@ { "cell_type": "code", "execution_count": 27, - "id": "9d84cbf5", + "id": "8e91122a", "metadata": { "lines_to_next_cell": 0 }, @@ -899,357 +899,357 @@ "name": "stdout", "output_type": "stream", "text": [ - "Epoch 0: 100%|█████████████████████████████████████████████████████████████████████████████| 6/6 [00:01<00:00, 4.36it/s, v_num=5]\n", + "Epoch 0: 100%|█████████████████████████████████████████████████████████████████████████████| 6/6 [00:01<00:00, 4.03it/s, v_num=7]\n", "Validation: | | 0/? [00:00 this film was just brilliant casting location scenery story direction everyone's\"" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "lookup = load_lookup(root='data/IMDB')\n", "' '.join(lookup[i] for i in sample_review)" @@ -3017,7 +3474,7 @@ }, { "cell_type": "markdown", - "id": "96ed27a6", + "id": "be8794d4", "metadata": {}, "source": [ "For our first model, we have created a binary feature for each\n", @@ -3029,8 +3486,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "601c565a", + "execution_count": 72, + "id": "46a4749f", "metadata": { "lines_to_next_cell": 0 }, @@ -3048,7 +3505,7 @@ }, { "cell_type": "markdown", - "id": "6ef166d3", + "id": "b1772177", "metadata": {}, "source": [ "We’ll use a two-layer model for our first model." @@ -3056,8 +3513,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "cfefb222", + "execution_count": 73, + "id": "7400ab60", "metadata": { "lines_to_next_cell": 0 }, @@ -3085,7 +3542,7 @@ }, { "cell_type": "markdown", - "id": "c85191b6", + "id": "f4596108", "metadata": {}, "source": [ "We now instantiate our model and look at a summary." @@ -3093,10 +3550,40 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "9de0f069", + "execution_count": 74, + "id": "51960f4e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "===================================================================================================================\n", + "Layer (type:depth-idx) Input Shape Output Shape Param #\n", + "===================================================================================================================\n", + "IMDBModel [25000, 10003] [25000] --\n", + "├─Linear: 1-1 [25000, 10003] [25000, 16] 160,064\n", + "├─ReLU: 1-2 [25000, 16] [25000, 16] --\n", + "├─Linear: 1-3 [25000, 16] [25000, 16] 272\n", + "├─ReLU: 1-4 [25000, 16] [25000, 16] --\n", + "├─Linear: 1-5 [25000, 16] [25000, 1] 17\n", + "===================================================================================================================\n", + "Total params: 160,353\n", + "Trainable params: 160,353\n", + "Non-trainable params: 0\n", + "Total mult-adds (Units.GIGABYTES): 4.01\n", + "===================================================================================================================\n", + "Input size (MB): 1000.30\n", + "Forward/backward pass size (MB): 6.60\n", + "Params size (MB): 0.64\n", + "Estimated Total Size (MB): 1007.54\n", + "===================================================================================================================" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "imdb_model = IMDBModel(imdb_test.tensors[0].size()[1])\n", "summary(imdb_model,\n", @@ -3108,7 +3595,7 @@ }, { "cell_type": "markdown", - "id": "2e30e4ed", + "id": "6433c5a4", "metadata": {}, "source": [ "We’ll again use\n", @@ -3125,8 +3612,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5b0c47c7", + "execution_count": 75, + "id": "75faa2be", "metadata": {}, "outputs": [], "source": [ @@ -3138,7 +3625,7 @@ }, { "cell_type": "markdown", - "id": "897560e1", + "id": "71fbb840", "metadata": {}, "source": [ "Having loaded the datasets into a data module\n", @@ -3148,10 +3635,33 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "463561b6", + "execution_count": 76, + "id": "2637adf5", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "GPU available: True (mps), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "IPU available: False, using: 0 IPUs\n", + "HPU available: False, using: 0 HPUs\n", + "\n", + " | Name | Type | Params\n", + "--------------------------------------------\n", + "0 | model | IMDBModel | 160 K \n", + "1 | loss | BCEWithLogitsLoss | 0 \n", + "--------------------------------------------\n", + "160 K Trainable params\n", + "0 Non-trainable params\n", + "160 K Total params\n", + "0.641 Total estimated model params size (MB)\n", + "/Users/jtaylo/anaconda3/envs/ISLP_v22_312/lib/python3.12/site-packages/pytorch_lightning/loops/fit_loop.py:298: The number of training batches (45) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n", + "`Trainer.fit` stopped: `max_epochs=30` reached.\n" + ] + } + ], "source": [ "imdb_logger = CSVLogger('logs', name='IMDB')\n", "imdb_trainer = Trainer(deterministic=True,\n", @@ -3165,7 +3675,7 @@ }, { "cell_type": "markdown", - "id": "1ee3fa9b", + "id": "e077efc8", "metadata": {}, "source": [ "Evaluating the test error yields roughly 86% accuracy." @@ -3173,12 +3683,46 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "986f0884", + "execution_count": 77, + "id": "0500cc62", "metadata": { "lines_to_next_cell": 2 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃        Test metric               DataLoader 0        ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│       test_accuracy           0.8450000286102295     │\n",
+       "│         test_loss             1.2167928218841553     │\n",
+       "└───────────────────────────┴───────────────────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│\u001b[36m \u001b[0m\u001b[36m test_accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8450000286102295 \u001b[0m\u001b[35m \u001b[0m│\n", + "│\u001b[36m \u001b[0m\u001b[36m test_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 1.2167928218841553 \u001b[0m\u001b[35m \u001b[0m│\n", + "└───────────────────────────┴───────────────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[{'test_loss': 1.2167928218841553, 'test_accuracy': 0.8450000286102295}]" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "test_results = imdb_trainer.test(imdb_module, datamodule=imdb_dm)\n", "test_results" @@ -3186,7 +3730,7 @@ }, { "cell_type": "markdown", - "id": "cf4f1ede", + "id": "f73c7526", "metadata": {}, "source": [ "### Comparison to Lasso\n", @@ -3198,8 +3742,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "7ab7c0f6", + "execution_count": 78, + "id": "a6e81d74", "metadata": {}, "outputs": [], "source": [ @@ -3212,7 +3756,7 @@ }, { "cell_type": "markdown", - "id": "6b45e80c", + "id": "3be8b857", "metadata": {}, "source": [ "Similar to what we did in\n", @@ -3222,8 +3766,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "abee7bb6", + "execution_count": 79, + "id": "b3049398", "metadata": { "lines_to_next_cell": 0 }, @@ -3236,7 +3780,7 @@ }, { "cell_type": "markdown", - "id": "bf34925c", + "id": "f08819f7", "metadata": {}, "source": [ "With `LogisticRegression()` the regularization parameter\n", @@ -3247,8 +3791,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "9a73437c", + "execution_count": 80, + "id": "e075f0b6", "metadata": { "lines_to_next_cell": 0 }, @@ -3263,7 +3807,7 @@ }, { "cell_type": "markdown", - "id": "07a2108d", + "id": "94c8b4ff", "metadata": {}, "source": [ "The path of 50 values takes approximately 40 seconds to run." @@ -3271,8 +3815,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ca655e51", + "execution_count": 81, + "id": "a546c39a", "metadata": {}, "outputs": [], "source": [ @@ -3288,7 +3832,7 @@ }, { "cell_type": "markdown", - "id": "d08104ab", + "id": "5a33b90e", "metadata": {}, "source": [ "The coefficient and intercepts have an extraneous dimension which can be removed\n", @@ -3297,8 +3841,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "d05720f2", + "execution_count": 82, + "id": "2190268a", "metadata": { "lines_to_next_cell": 0 }, @@ -3310,7 +3854,7 @@ }, { "cell_type": "markdown", - "id": "1823469a", + "id": "1271d2a2", "metadata": {}, "source": [ "We’ll now make a plot to compare our neural network results with the\n", @@ -3319,8 +3863,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "a8872289", + "execution_count": 83, + "id": "39221738", "metadata": { "lines_to_next_cell": 0 }, @@ -3352,7 +3896,7 @@ }, { "cell_type": "markdown", - "id": "eeeab46c", + "id": "d40e3d0e", "metadata": {}, "source": [ "Notice the use of `%%capture`, which suppresses the displaying of the partially completed figure. This is useful\n", @@ -3362,12 +3906,24 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "4f55d099", + "execution_count": 84, + "id": "9ba471b4", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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XV1yuXdPbNtWbW1tliICAOQav9+v4uLiHivrLcvSlClT5Pf7sxwZAGSQMdLGje5uHR3SFVd0v71e4r65c51xbuZzuU0fuZTs5lKouOxvt97q3FJpa3MqKdN9kcyc2f1y8auucm69ZNu2LrzwQi1ZskTf+973khdBf/7znxWLxTR79mz9+c9/1tVXX60xY8booYceUlVVlQ466CAdf/zxaeePx+OqqKjQxIkT9cwzz6i9vb3LHg4Jo0eP1pIlS7TvvvvqpZde0iWXXKLRo0frO9/5js477zytXr1ajz76qB577DFJUmFh4S5zbNy4UaeddppOOukkPfvss4pEIqqpqdFll13W5ZtJY2OjioqK1NjYqNdff13nnXeepk2bpksuuaTXHz8AyJT169cnl4X3JBqNKhKJZCkiAECu8Xg8WrBggSorK2VZVpcmPYnr+Pnz57NPJYD8tmmTNGpUZuYyxlk+3k0OoVsffyy5WK5NLiW7uRQqLvtbR4dTopzqtmmTu8z+pk3dP7+jY7fDu/jii/XGG28oFAol71u8eLHOOecc7b///vrWt76ladOm6cADD9Tll1+u008/XX/6059czf3YY4/pX//6l+6++24dffTRKikp0c9+9rNdxn3/+9+Xz+fT1KlTVVZWpm9961vJc+y5554aNWqUbNvWpEmTNGnSJO255567zHHPPfdoy5Ytuvvuu/WZz3xGn//853XHHXeotrZW69evT44bN26c7rjjDh1++OE688wzdcYZZ+jxxx/v7YcNADLmww8/1OrVq9OOs21bXq83CxEBAHJVRUWFli1bpsmTJ3e5v7i4WMuWLVNFP+zlBgDYFbmU7OVSqLjsb2PGSDtdWOyirU3avDl98nLkyO4rLseM2e3wDj/8cPl8Pt11112aMWOGXn/9dYXDYd1www2KxWL62c9+pj/96U9qaWnR1q1b9cknn2jkyJGu5n7llVc0ZcoU7bvvvsn7TjrppF3G3Xfffbrtttv0xhtv6OOPP1Y0GtWYXr6mV155RUcffXSXzWynT5+ueDyuf//735o4caIk6dOf/nSXv0IXFRXppZde6tW5ACBT/v73v+u8887TW2+9lXZsNBpVVVVV/wcFAOhXiX2LW1tbVVRUJL/f36sqyYqKCpWXl/dpDgDIWSNHOpWPbjQ1OStT03n4YamkxN25XSKXkr1cConL/uZmGXcwKJWWpp/r4YelfmjEMGfOHF1++eX69a9/rcWLF+uggw5SIBDQL37xCy1YsEDz58/XkUceqb322kvz5s3T1q1bM3bup556Sl/5yld0/fXX67TTTlNhYaH++Mc/6pe//GXGztHZsGHDuvzfsizF4/F+ORcASE7H8FAopLq6umQH8NmzZysQCOihhx5KJi1t21Y8Hu/2e5LH45HP51OJmwsuAEDOqq+v19y5c/VOp863xcXFWrBgQa+qJT0ej2bMmNEPEQLAALMsV8u1JUmnnup0D29p6b4QzLKcx089VeqHP+6QS8lOLoWl4rkgEJD8/p6/kDwe5/F++oX13HPPVUFBge655x7dfffduvjii2VZllauXKny8nLNnj1bRx99tA488EC9+uqrruc94ogjtG7dOrW2tibve/rpp7uMaW5u1v7776/vfe97OvbYY3XIIYfo7bff7jJm+PDhivXUuKjTuVatWqWNGzcm71u5cqUKCgp02GGHuY4ZADKpra1NgUBApaWlWrp0qR588EEtXbpUpaWlCgQCuuyyy1RSUqKTTjpJzz33nKZPny5JyUY9iaPP51NDQ0OPDRkAALmvvr5elZWVXZKWktTS0qLKykrV19cPUGQAkKc8HmnBAuffO18nJ/4/f36/JC0lcinZQuIyF1iW1NAg+XzO/xOdZRNHn895vJ9+YR01apTOO+88XXvttWptbdVFF10kSTrkkEP0t7/9Tc3NzXrllVf0ta99rcseB+mccsopOvTQQ1VdXa1Vq1YpHA7re9/7XpcxhxxyiNauXas//vGPeuONN3Tbbbfp/vvv7zJm6tSpWrNmjV544QW9//77+uSTT3Y511e+8hWNGDFC1dXVWr16tRobG3X55ZerqqoqWdoMANlkjFF5ebmam5slKdl8J3Fsbm7WOeeco+XLlysUCunII49UKBRSMBhUdXW1ysrKVF1drWAwqFAopHHdbRUCAMgLsVhMc+fO7dJQJyFx37x589L+ggkA2ElFhbRs2a5b9BUXO/f3496/5FKyg8Rlrhg3TgqFnGXj1dVSWZlzDAad+/v5F9Y5c+aora1Np512WnIfhe9///v63Oc+p9NOO00zZszQpEmTdNZZZ7mes6CgQPfff782b96s448/XjU1NfrpT3/aZcysWbN05ZVX6rLLLtO0adPU3Nys6667rsuYc845R6effrpKS0s1YcIE3Xvvvbuca+TIkfrrX/+qDRs26LjjjlNlZaW+8IUv6I477uj9BwMAMiAUCikcDvf4S2hij7N//vOfyaUXlmUpEAho4cKFWrFihRYuXKhAIEClJQDkuXA4vEulZWfGGK1bt07hcDiLUQHAIFFRIb31ltTYKN1zj3Ncs6Zfk5YJ5FL6n2W6+7MfdtHR0aHCwkK1t7fvstnpli1btGbNGh1wwAEaMWLEAEWI/sB7C2B31dTUaOnSpckKy+7Ytq3q6motXLgwi5FhKEt1PYP8wHuYn+69915dcMEFacfdc889Ov/887MQEQAMPH7fHrxSvbe9vZahOQ8AAP0gEomkTFpKzrLxSCSSpYgAAH3Rl27gRUVFGR0HAMBQwVJxAAD6QaKxTroxXq83C9EAAPqivr5eU6dOVWlpqS644AKVlpZq6tSprhvq+P1+FRcX97j1h2VZmjJlivx+fybDBgAg75G4BAAgwxoaGvTII4+kHReNRlVVVZWFiAAAuysT3cA9Ho8WbO98u3PyMvH/+fPnu67gBABgqCBxCQDAbjDGKBgMqqamRrNmzVJNTY0aGxv185//XGeffba2bNmS8vkej0d+v18lJSVZihgA0FuZ7AZeUVGhZcuWafJOnW+Li4u1bNkyVWShiQQAAPmGPS4BAOiltrY2lZeXKxwOy7ZtRaNR2batRYsWdRlXUVGhd999V83NzV3GRaNR+Xw+NTQ00DEcAHJYb7qBz5gxI+18FRUVyZ8fu7NXJgAMRvSMHnwy+Z6SuAQAoBeMMSovL1dzc7MkJRvwJI4FBQWKx+O64YYb9P3vf1+S1NTUpNraWkUiEXm9XlVVVamkpISkJQDkuNbW1oyOk5yKezdJTgAY7IYNGyZJ2rRpk/bcc88BjgaZtHXrVknKyB/mSFwCANALoVBI4XC4x8fj8bgkdUlMBgIBBQKBrMQHAMgcuoEDQP/xeDwaO3asIpGIJGnkyJH8YX8QiMfjeu+99zRy5EhXDUvTIXEJAEAv1NXVJZd798S2bdXW1pKsBIA8l+gG3tLS0u2yN8uyVFxcTDdwANhNkyZNkqRk8hKDQ0FBgfbbb7+MJKJJXAIA0AuRSCRl0lJylo1z8QUA+S/RDbyyslKWZXVJXtINHAD6zrIsFRUVyev1atu2bQMdDjJk+PDhKijITD9wEpc5xBgpFJLq6qRIRPJ6pdmzpUBAoloaAHKD1+tN7mPZE9u25fV6sxgVAKAnsVisT81wEt3A586d26VRT3FxsebPn083cADIAI/Hwx+B0C0SlzmirU0qL5fCYcm2pWjUOS5aJPn9UkODNG5cZs+ZrmT3hz/8oX70ox/t9tz333+/zjrrrN16PgDkqnRJS8mpuKyqqspSRACAntTX13ebcFywYEGvEo50AwcAYGCQuMwBxjhJy+0NapVYgZg4Njc7j4dCma287Nz98L777tMPfvAD/fvf/07eN2rUqMydDADynDFG11xzje68886U4zwej3w+n0pKSrIUGQCgO/X19aqsrNxlb8qWlhZVVlZq2bJlvUpe0g0cAIDsy8yCc/RJKORUWsZi3T8eizmPNzVl9ryTJk1K3goLC2VZVpf7/vjHP+qII47QiBEjdPjhh+s3v/lN8rlbt27VZZddpqKiIo0YMUL777+/brzxRknS1KlTJUlnn322LMtK/h8A8lUsFtOll16qm266KXlf4ntbolNe4ujz+dTQ0EBHRAAYQLFYTHPnzu22oU7ivnnz5inW0wU4AADICVRc9rNbb3VuqbS1OZWU3VxXdTFzZvfLxa+6yrll0h/+8Af94Ac/0B133KHPfvazev7553XJJZdor732UnV1tW677TatWLFCf/rTn7Tffvtp3bp1WrdunSTp2Wefldfr1eLFi3X66aezhAZA3jDGKBQKqa6uTpFIRF6vV+eee65+//vfa/ny5ZKcrTB++9vf6tJLL1VTU5Nqa2uTY6uqqlRSUkLSEgAGWDgc7rI8fGfGGK1bt07hcJgqSgAAchiJy37W0SG1tGRmrk2bnFt358i0H/7wh/rlL3+ZXD5zwAEH6OWXX9b//M//qLq6WmvXrtUhhxyik08+WZZlaf/9908+d8KECZKksWPHatKkSZkPDgD6QVtbW3L/Mtu2FY1GZdu2Fi1alKymHDZsmGpra3XeeedJkgKBgAKBwECGDQDoRuctkTIxDgAADAwSl/1szBhp8uTUY9rapM2b01dcjhzZfcXlmDG7H193Nm7cqDfeeENz5szRJZdckrw/Go2qsLBQknTRRRfpi1/8og477DCdfvrpOvPMM3XqqadmNhAAyBJjjMrLy9W8fbPh6PZNhhPHeDyuYcOGacWKFTr99NMHLE4AgDtFRUUZHQcAAAYGict+5mYZ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zf/tiJRjPIrKr7BKXrwjS1EBAIBs4poUAAAMZXmXuNwdwWBQP/vZz/Sb3/xGzz33nOrr6/XQQw/pxz/+cY/Pufbaa9Xe3p68rVu3LosRY6jasGGD1q9fL0l69FGpOXKIJGm4nEZStrZJMtuPkk/NatAsWe9FBiReAADQv7gmBQAAQ1mf9rj8zGc+ozlz5mj27NmaMGFCpmJKafz48fJ4PMnkTsL69es1adKkbp9z3XXXqaqqSjU1NZKkI488Uhs3btSll16q733veyoo2DV/u8cee2iPPfbI/AsAemCM0de//nUFg0H9/ve/11lnnaXlX/iNvvb4l/UXnaEt2lO1qlJEXnkVUZVqVaImWbbtNOEBAACDDtekAABgKOtT4vLll1/Wt771LV1zzTU688wz9dWvflUzZ87sNhGYKcOHD9cxxxyjxx9/XGeddZYkKR6P6/HHH9dll13W7XM2bdq0S0wej0eSkywCBoIxRqFQSHV1dYpEIvroo48UDAYlSXPmzFFpaakqvneETnt8qvbSJklSQE27ThSNOp3DAQAAAAAABpE+JS4/+9nP6vnnn9e2bdv0wAMP6IEHHtCkSZN04YUX6qtf/aoOPfTQTMXZxVVXXaXq6mode+yxOv744zV//nxt3Lgx2WX8wgsv1OTJk3XjjTdKksrKynTrrbfqs5/9rE444QS9/vrruu6661RWVpZMYALZ1NbWpvLycoXDYdm2rWg02uXxW265RYWFhdJrryWTlt3yeCSfTyop6eeIAQAAAAAAsqtPict//OMfeumll3TXXXfpD3/4g95//321trbqpptu0k033aSTTjpJc+bM0bnnnqu99torUzHrvPPO03vvvacf/OAHevfddzVt2jQ9+uijyYY9a9eu7VJh+f3vf1+WZen73/++WlpaNGHCBJWVlemnP/1pxmIC3DLGqLy8XCtXNksKKBqdLckrKSJpP0l/1uLFi3VRICDr//2/rk+2bafCMnH0+aSGBsmysv46AAAAAAAA+pNlMrRWOhqN6sEHH9TixYv16KOPKhqNytqeTNlrr7305S9/WV/96ld18sknZ+J0WdfR0aHCwkK1t7drzJgxAx0O8lgwGFRp6dmSGiSVSNom528IcUmJCuDfqO3o32vsqlXOf2tqpNmzpdpaKRJx9rSsqnIqLUlaAgBc4nom//EeAgCAfNbba5mMJS47W79+vZYuXaolS5boX//6l3Oi7cmVgw8+WBdffLEuvPBCFRUVZfrU/YaLRGTKnDk1uuuuakknqaeiZ4/+qRcnfVGferdVmjpVevFFafTobIYJABiEuJ7Jf7yHAAAgn/X2WqZfuuhMnDhR3/nOd/Tyyy/rqaeeUk1NjUaPHi1jjF577TV997vf1f7776+ysjI98MADisfj/REGkJNeecUrya9UOzXE9GldckC1dPvt0uLFJC0BAAAAAMCQ03/tv7c74YQT9Pvf/15/+MMfNGnSpGTlZTQa1cMPP6xzzjlH++23n2677TbFYrH+DgcYcB988CU5y8NT2ab3P5gpXXaZNGNGFqICAAAAAADILf2auFy7dq1uuOEGHXTQQZo1a5bWr18vY4wKCgp06qmnavLkyTLG6D//+Y+uvPJKnXjiiWpra+vPkIABt88+R0galmaUrfHjj8hGOAAAAAAAADkp44nLLVu26A9/+INOOeUUHXjggbr++uu1Zs0aGWN04IEH6qc//anWrl2rRx99VG+//bYeeeQRzZgxQ8YYPffcc7r++uszHRKQU444Yh9ZVjTlGMuK6fDD98lSRAAAAAAAALknY4nLp59+Wl/72tdUVFSkCy+8UI2NjYrH4xo+fLjOP/98Pf7443rttdd07bXXJpvyWJal0047TU888YS+8Y1vyBijFStWZCokICdVVVkypuf9LSXJGFsXXki3cAAAAAAAMHSlzp6k0draqtraWi1ZskT//ve/JUmJJuVHHnmkampqNHv2bI0bNy7tXHPmzNFvfvMbrVu3ri8hATnLGKNgMKhASUCf3et1Pb/xEEm7Jic9iso3ZrVK/Ed3+zgAAAAAAMBQ0KfE5X777ad4PJ5MVo4ePVr/9V//pZqaGh133HG9mivRAp0O4xisFi9erDlz5ujHX/iCHt/4D83Uw3paJ8nWNkVly1ZUUQ2TT81q6CiXFX5ACgQGOmwAAAAAAIAB0afEZaIL+EknnaSamhqdd955Gjly5G7NNXHiRC1evLgv4QA5a/Xq1brsssskSZMef1yFHo+aYz41qUS1qlJEXnkVUZVqVaImWbYt1daSuAQAAAAAAENWnxKXV155pWpqanTEEX3vfjxq1ChVV1f3eR4g12zcuFHnnnuuNm+eIul1HbdfsQrWrpUkBdSkgJp2fVI0KkUi2Q0UAAAAAAAgh/QpcfnLX/4yU3EAg4YxRqFQSHV1dYpEIvrXv/6l117bKukfGjXqVU08bqm07vfS9i0WumXbktebtZgBAAAAAAByTZ8SlwC6amtrU3l5ucLhsGzbVjQalbSHpCcl7aOPPz5JP2ifpN+b/0k9UTQqVVVlIWIAAAAAAIDcVNCXJ7/77ru6+OKLdfHFF6ulpSXt+JaWFl188cWaM2eONmzY0JdTAznHGKPy8nKtfHKljlZAJ0Z/q+PUoIlaJelYSdKIEe/oF/ftLx11VM8TeTyS3y+VlGQncAAAAAAAgBzUp8RlbW2tlixZohdeeEGTJ09OO37y5Ml64YUXtGTJEtXV1fXl1EDOCYVCWhV+SZ8xjVqloJ5WtZ5VmdbrMEmSpZjsLefpxZfCUjAonXSS80Tb7nr0+aSGBsmysv8iAAAAAAAAckSfEpf/+7//K8uyVFlZ6fo55513nowxeuSRR/pyaiDn1N5dq6lq0D/lkyRFNUzSjuSjJelA3ai7l94tjRsnrVzpJDCrq6WyMucYDEqhkPM4AAAAAADAENanPS5Xr14tSTr++ONdP+fYY50lsy+++GJfTg3knC3PjNCL6nl5d1wevagSfeaZPzp3WJYUCDg3AAAAAAAAdNGnissPPvhAkjRhwgTXzxk/fnyX5wKDRfs7M2RrW8oxtrap/Z3SLEUEAAAAAACQv/qUuBw1apQkqb293fVzOjo6JEnDhw/vy6mBnBP1TNq+PDzFGNmKeoqyFBEAAAAAAED+6lPisri4WJL01FNPuX7OypUrJclVMx8gn0waF3VRcRnV5AnxLEUEAAAAAACQv/qUuJwxY4aMMbr99tuTlZSpdHR06I477pBlWZoxY0ZfTg3kFGOMtgy7z0XF5TBd+I0xWYoKAAAAAAAgf/Upcfm1r31NlmWptbVVZ5xxhtavX9/j2HfffVdnnHGG/vOf/8iyLH3ta1/ry6mBnHLffffpw3//j/xqkkfRbsd4FJV/zCqVXH50lqMDAAAAAADIP33qKv7pT39ac+fO1fz589Xc3KyDDz5Y5513nvx+v4qKnH38Wltb1dTUpD/96U/atGmTLMvSN7/5TU2bNi0T8QMDbsOGDbri8m/rTk1SicpVrgaFVSJb2xSVLVtRRTVMvjH/VMML+8sqsAY6ZAAAAAAAgJzXp8SlJN1yyy1qb2/X4sWLtXHjRi1evFiLFy/eZZwxRpJUU1Oj+fPn9/W0QM64+uqr9d77X9dZ+oa+M+6nCp50s8JfHK3a336sSPtweQu3quobo1Vy+dEkLQEAAAAAAFyyTCKj2EcrVqzQL37xCz399NPaeUrLsuTz+XT11VfrzDPPzMTpsq6jo0OFhYVqb2/XmDHsUQhHKBTSjBlXSPo/ScM0bJjRy89v1cGf3mOgQwMAYBdcz+Q/3kMAAJDPenst0+eKy4RZs2Zp1qxZ2rBhg1544QW9//77kqTx48frs5/9rMaNG5epUwE5YcuWLbr00m9IWiptb8pz7bUWSUsAAAAAAIAMyFjiMmHvvffW5z//+UxPC+ScBdddpxNe/ZJe1bGSpCOOMPrud1kKDgAAAAAAkAkZT1wCg5GJx7Xqttv00W9/q+Ht7fpoxAgd+Lat6/WiJMmyjBYtsrQHxZYAAAAAAAAZQeISSOPDNWv09rRpmtbRoW1yvmhikk7V49qskZKkyy/epJNO2msgwwQAAAAAABhUMpa4/Oijj/TYY49p1apVev/997V58+ZdmvR0ZlmWFi1alKnTA/3CxON6e9o0faqjQ0EFVKfZisirNo3Tk/JLkiZbb+snt04Z4EgBAAAAAAAGlz4nLuPxuH784x/rl7/8pTZu3OjqOcYYEpfIC6tuu037dxToCwoprBLZ2qboTl82881VemNxiabNnTtAUQIAAAAAAAw+BX2d4KKLLtINN9ygjz/+WAUFBZowYUKy0rK4uFh77bWXjDHJ+8aPH6/9999f++23X19PDfS7jt/8VrPUoGb5JElRDZNkbb9JluJaoLnq+PVvBi5IAAAAAACAQahPicu//vWvqqurk+QkMCORiB577LHk42+//bY6Ojr0yiuv6IorrlBBQYHGjRunRx55RGvWrOlb5EAWrH7/03pSJYr1UJxsVKAnVaJ/vv+pLEcGAAAAAAAwuPUpcbl48WJJ0qc//WndddddGjdunCzL2mXcYYcdpvnz56u+vl5vvPGGZs6cqfb29r6cGsiKh2Pny9a2lGNsbdNDsQuyFBEAAAAAAMDQ0KfE5dNPPy3LsvTNb37T1fiysjJVV1fr7bff1m233daXUwNZ8dGUz21fHt6zqGx9NOWYLEUEAAAAAAAwNPQpcRmJRCRJhx56aPI+j8eT/Pcnn3yyy3MqKytljNH999/fl1MDWXHwCQfKk6bi0qOoDj7hgCxFBAAAAAAAMDT0uTmPJO29997Jf48ePTr570RiszOv1ytJeuuttzJxaqBfVVVZiqWpuIxpmC68cNctEgAAAAAAALD7+pS4nDhxoiRpw4YNXe4bPny4JOnFF1/c5Tlvv/22JGnLli19OTWQFUceuUEez6oeH/d4jPx+qaQki0EBAAAAAAAMAX1KXB555JGSpJdffjl5n23b+uxnPytpR/Oezn77299Kkvbff/++nBrIip/+9KeKxT5K/r9g+1eMvb3JuM9nqaFB6qYnFQAAAAAAAPqgT4nLGTNmyBijxx57rMv9s2fPTu5jWV1drYceekh/+tOfdMYZZ+ixxx6TZVkqLy/vU+BAf3vzzTf1/II1kk6WJE2aFFV1tVRWJlVXS8GgFApJ48YNaJgAAAAAAACDkmWMMbv75DVr1uiggw7SHnvsobfeeiu5dDwajerEE0/Uc889J2unUjRjjPbff38999xzGpdHGZ+Ojg4VFhaqvb1dY8aMGehwkAWVlefr2eU3aK0OkSTdf/PrOutbBw9wVAAA7D6uZ/If7yEAAMhnvb2W6VPF5QEHHKA333xTq1ev7nIy27b1t7/9TV/5yldk27aMMUrkR8844wyFw+G8Slpi6DHGaMx/KpJJy5JR/1D5VQcNcFQAAAAAAABDh93XCaZOndrt/ePGjVNtba1+85vf6LXXXlM0GtXBBx/cpQM5kKs2bLB0/7OnS5IsxfWrH3woq4CNLAEAAAAAALKlz4nLdEaPHq3Pfe5z/X0aIKNuuGy9Pow6Wx9cOPoBfe4q9mQFAAAAAADIpj4tFS8oKJBt27rpppsyFQ+QE45ds0xF+o/21Cb99LsbJY9noEMCAAAAAAAYUvpUcTl8+HBt27ZNfr8/U/EAA+rXv/61Wpub9eNn/6gKfUfPFn5Rk+feO9BhAQAAAAAADDl9Slzuu+++evvtt2Xb/b7iHOgXxhiFQiHV1dWppaVFjY2NuumTT2RJ2kubNOP/HSPtuedAhwkAAAAAADDk9GmpeElJiSTpH//4R0aCAbKpra1NJSUBlZb+SHfd5dOjj/639MkdOkQBGUlm5EjpG98Y6DABAAAAAACGpD4lLi+//HJ5PB7dcsst6ujoyFRMQL8zxmjmzK/oySd/KikoY6oklekTXayZCiqgkJaO2V9m770HOlQAAAAAAIAhqU+Jy2OOOUa333673n77bQUCATU3N2cqLqBfBYMhPf30NZJO2n7PMEmWEl8SYfn0tXd/p1CoaYAiBAAAAAAAGNr6tDnlxRdfLEk67LDDtGrVKvn9fk2ZMkVHHXWUxo0bJ0+KTsyWZWnRokV9OT2w22655VlJ304xwtZWlejmm2/SjBmBbIUFAAAAAACA7fqUuFyyZIksy5LkJCKNMVq7dq3WrVuX8nnGGBKXGFCrVx8taZucSsuebNPq1dOyExAAAAAAAAC66FPicr/99ksmLoF8YoxXqZOWkmRLxpuNcAAAAAAAALCTPiUu33rrrQyFAWTXMfvaal23TdEUyUtbUX1ucp++RAAAAAAAALCb+tScB8hXV+z9cMqkpSRFNUxzxz2UpYgAAAAAAADQGYlLDEkzPE/qZDVJMt0+7lFUfjUp4FmZ3cAAAAAAAAAgicQlhihroleXWHdJ2t5cSnFJRra2SZJ8alaD5xxZE9njEgAAAAAAYCD0aQO/tWvX9unk++23X5+eD+y22bM1etECHajX9aYO1mn6q4Zpm7yKqEq1KlGTrJikqqqBjhQAAAAAAGBI6lPi8oADDtjt51qWpWg02pfTA7ttyZo1+q9j1mnWPw7T3/RFnaa/bq+93M7jkXw+qaRkoEIEAAAAAAAY0vqUuDSm+/0BgVz25ptv6uI5c/RPY3SzpNP1V8myJGMk25aiUSdp2dDg3A8AAAAAAICs61PicvHixWnHbNy4Ua+++qqWL1+ulpYWTZ8+XTU1NX05LdAnd9xxh2SMLul851lnOQlLr9dZHl5SQtISAAAAAABgAPUpcVldXe167M0336wrr7xSv/3tbzV9+nT9/Oc/78upgd3y0Ucf6Xe/e0/H6AgdqlecO0tLpfr6gQ0MAAAAAAAAXWStq/iwYcN0xx13aMaMGbr55pv117/+NVunBpL+53/u0ebNt+v/9LI+PbFZ5pxK6corBzosAAAAAAAA7CRricuEr33tazLG6Pbbb8/2qTHExeNx3XRTRNJYSdJhvsNkLfuzVFY2oHEBAAAAAABgV1lPXB5yyCGSpP/7v//L9qkxxD300KN6772vJP9/ww17D2A0AAAAAAAASCXricv29vYuRyBbrrvuWUkHSpKmTYvoM58Z2HgAAAAAAADQs6wnLpcuXSpJKioqyvapMYS9/PLLWrXq88n///QLL0pbtw5gRAAAAAAAAEgla4nL1157TV//+te1dOlSWZalmTNnZuvUgH760/+V5JckfUr/1Jd+eaq0du3ABgUAAAAAAIAe2X158oEHHph2TDwe14cffqiPPvooeZ/X69X3vve9vpwa6JVY7PLkv6/Ur2SVnSkdfPAARgQAAAAAAIBU+pS4fOutt3r9nJNOOkl33XUXS8WRNevWScuXeyRJ4/WevqI/SPMeGuCoAAAAAAAAkEqfEpfV1dVpxxQUFGj06NE64IADFAgENG3atL6cEnDFGKNQKKS6ujo9+WRA0WiVJOkb+o32/MzBUmnpAEcIAAAAAACAVPqUuFy8eHGm4gAypq2tTbNmlevJJwtkWRfKmLH6jP6m4dpb/63faGPNd7WXZQ10mAAAAAAAAEihT4lLINcYYzRz5lf09NM/leSXMdsk2fqXoopqmM7WnzX8np8peMUVskheAgAAAAAA5KysdRUHsiEYDOnpp6+RdNL2e4ZJshTVMEnSM/Kp6e/fVSjUNFAhAgAAAAAAwIU+JS5jsZiamprU1NSk9vb2tOM//PDD5HhjTF9ODXTrlluelVSinoqJjWxJJbr55meyGRYAAAAAAAB6qU+JywceeEAzZszQOeeco2HDhqUdP3z4cFVUVKi0tFQPPURXZ2Te6tVHS9qWZtQ2rV49LQvRAAAAAAAAYHf1KXF5//33S5K+/OUva+TIkWnHjxw5Uuedd56MMVq+fHlfTg10yxivpHRJdFsy3myEAwAAAAAAgN3Up8Tls88+K8uy9PnPf971cxJjn3766b6cGujWMfvastNUXNqK6nOT6UsFAAAAAACQy/qUuFy3bp0k6YADDnD9nKlT/397dx4XVb3/cfw9MCxqogiyuKJlmop7EhhiaVp6zVLTui5kaeVSlvem1a2s2y2rW95u6U+zMrfKtGthmZWaAoa74paZWe4C7rjDzJzfHyMDJJsyMMz4ej4e8+A753zPmc8sD5jHm+/3fCPyHQs40xM1vnUsxFMYi3w0OpBLFQAAAAAAAFRkThl2diUL7eT0tVgsznhoIJ+ax9bLJKsMeRe431sWxShFcd4/lXNlAAAAAAAAuBKlGnFZs2ZNSdIvv/xS4mNy+gYHB5fmoYECPb59YL7Q0j5t3HBMH49RihK8+8gUyjUuAQAAAAAAKrJSBZc333yzDMPQrFmzSnzMjBkzZDKZ1KZNm9I8NHCZn36SVpy9W5IUpCP6Rj0Ur5nqqa8Vr5laoTglKk6B1qPSoEEurhYAAAAAAABFKVVw2bdvX0nSsmXL9Pbbbxfb/+2339aPP/4oyb4SOeAsNps0enTu/Vf1vHroW32oYVqoXvpQwxSnJJm8vaXYWKljR9cVCwAAAAAAgGKVKrjs37+/WrZsKcMwNHbsWPXt21crV67Md/1Ki8Wi5ORk9enTR2PHjpXJZFLz5s01cODAUhcP5EhKkjZssLdbXLdbQ/Wh/Y73pWnj5kuXc42JkRISJJOp/IsEAAAAAABAiZVqcR6TyaQvv/xSHTp00OHDh/Xll1/qyy+/lI+Pj2rUqCFJOn78uLKz7dcXNAxDtWrVUkJCgkwER3CiTp2klSulJ0dc1JtbhslbNiksTOreXTpyRAoJsU8P79iR0BIAAAAAAMANlGrEpSRFRERo06ZNuueeeyTZw8msrCylpaUpLS1NWVlZjpXEe/furY0bNyoiIqK0Dws4rFq1Sp07d5bJlKK1Pf6p27TcvuPxx6WPPpIWLpQ+/FCKiyO0BAAAAAAAcBMmIydVdIJff/1VixYt0qZNm3T06FFJ9tXD27Rpox49eqhRo0bOeqhyl5mZqWrVqunUqVMKCAhwdTnIo2vXrlqyZInMkk5Xry7/kyftU8P377ePugQAAJL4PuMJeA8BAIA7u9LvMqWaKv5nN954o2688UZnnhIo0jvvbNWSJUslSY+EhMg/I8O+4557CC0BAAAAAADcWKmnigOusny59NRTkZLWSIrSP4KDc3c++qirygIAAAAAAIATOHXEJVCWDENKTJTmzJHS06XExCxJvpJuVmjobQqZP0iaPt2+Ss/tt7u6XAAAAAAAAJRCqUZcpqSkyNvbW5UqVdLBgweL7X/w4EH5+/vLbDZrw4YNpXloXGNOnLCvrXPbbdLMmdI33xg6fdr30t7TevnlNjI3bSq99Za0apXkxWBiAAAAAAAAd1aqdGfu3LkyDEN/+ctfVLt27WL7165dWz179pTNZtOnn35amofGNcQwpF69pJQU+zpSFosk5V0dvLLmzOkrxzJTrBwOAAAAAADg9koVXK5cuVImk0l33XVXiY/p0aOHJCkpKak0D41rSGKilJwsWa2FBZLeWrnSJD5SAAAAAAAAnqNUweXu3bslSU2bNi3xMU2aNJEk/fbbb6V5aFxDZs82ZDJZiuzjJYtmTTtXThUBAAAAAACgrJUquLxw4YIkyd/fv8TH+Pn5SZLOnj1bmofGNWTHjmMyjKLXkbLJW4e/WlVOFQEAAAAAAKCslSq4rFGjhiRp3759JT7mwIEDkqTq1auX5qFxDTl2bIek7CL7mGXRhSqE4QAAAAAAAJ6iVMFlzhTxhQsXlviYr776SpLUuHHj0jw0riFBQYsl+RTZxyIfeUUkl09BAAAAAAAAKHOlCi67d+8uwzA0a9YsJScXHxolJSVp9uzZMplM+stf/lKah8Y15KabMiQlSyr4OpfesuhGJal+5IlyrQsAAAAAAABlp1TB5aOPPqrg4GBZrVZ1795dkyZNclz3Mq8LFy7o3XffVY8ePWSxWBQYGKjhw4eX5qFxDRk0aKCkuyWlXNqSLcmQ96Xp4zFKUYB6afDgQS6qEAAAAAAAAM5mMgzDKM0Jli5dqu7du8tqtUqSqlSporZt2yo8PFySdPjwYa1fv17nzp2TYRgym81atGiR7rjjjtJXX44yMzNVrVo1nTp1SgEBAa4u55piGIY6duyolStXSuooaZCqKkT9lKFBmq3qStLjt96qxKQkmUwmV5cLAECFxfcZ98d7CAAA3NmVfpcpeqnmEujSpYu+//57DRo0SIcOHdKZM2eUlJSUr09ONlq7dm3Nnj1bnTp1Ku3D4hpiMpn0+OOPa+XKlYpTkgYpSbdLanBp/8SGDZWwcCGhJQAAAAAAgAcpdXApSbfddpt2796tWbNm6ZtvvtGmTZt09OhRSVJwcLDatGmjnj17auDAgfLz83PGQ+IacvSoNPLR5npCo/S85irQdEzeeQYKPxUaKiJLAAAAAAAAz+KU4FKS/Pz8NGzYMA0bNqzYvps2bdKsWbP0n//8x1kPDw82deoJHT3ZVO/qPfmrjt4wnsm337R2rdSrl5SYKDHqEgAAAAAAwCOUanGeK3H48GH9+9//VosWLdSuXTu9++675fXQcHPT/5u7Wvggzb68g9UqJSdLf7pEAQAAAAAAANyX00ZcFuT8+fNasGCBZs2apR9//FE2m02S/ZqXXI8QJbF9u1V/HG0oSWqtjWqu7QV3NJul2bOluLhyrA4AAAAAAABlpUyCy+XLl2vWrFlasGCBzpw5Iyl3gZ7w8HDde++96tOnT1k8NDzMP//5h6QbJBUy2jKHxSJlZJRPUQAAAAAAAChzTgsuf/nlF82aNUuffPKJDhw4ICk3rKxTp4769Omjvn37KiYmhtGWKBGbTfr66wBJkrcsekCfFd7ZbJZCQsqpMgAAAAAAAJS1UgWXx44d02effaZZs2Zpw4YNknLDyurVq+vkyZMymUx666231K9fv9JXi2vKV18d0/nz9jCyq35QmNIL72yxSIMGlVNlAAAAAAAAKGtXHFxmZ2fr66+/1qxZs/Tdd98pOzvbEVb6+vqqe/fuGjhwoHr06KFKlSo5vWBcO775poaj3T14sXS0kI7e3lJMjNSxY/kUBgAAAAAAgDJX4uBy9erVmjVrlubNm6cTJ+yrPOcsstOhQwcNHDhQ/fr1U2BgYJkVi2vH+fPSF1/YLylQtar08Ludpb9Osu80mSTDsE8Pt1jsoWVCgn07AAAAAAAAPEKJg8uca1PmjK5s3LixBg4cqAEDBigiIqKs6sM1au1ae3gpSX37SpXmzczdefvtUuXK9mtaDhpkH2lJaAkAAAAAAOBRrniqeNWqVfXuu+8qPj6+LOoBJElxcdKhQ9LcudItDdKlXgvtO2rVkr77zj7aEgAAAAAAAB7L60o6G4ahM2fO6KGHHlKbNm00ceJEHT58uKxqwzXq0KFDuuWWW/TVVx9oyJAzunnNJPsS45L06KOElgAAAAAAANeAEgeXK1as0IMPPqjrrrtOhmEoNTVVTz/9tOrVq6c77rhDs2bN0pkzZ8qyVlwjPvroI61Zs0aPPPKI/vPGG9IHH9h3eHtLQ4e6tjgAAAAAAACUixIHlx07dtT06dOVnp6uTz75RN26dZOXl5esVqt+/PFHDRkyRGFhYXrggQf07bffymq1lmXdkqTJkycrIiJC/v7+ioqK0tq1awvt26lTJ5lMpstuPXr0KPM6UXJWq1UffPCxJMlkMml4WJiUnm7fee+99qniAAAAAAAA8HhXNFVckvz9/fXAAw9o8eLF2r9/v958801FRkbKMAydO3dO8+bNU8+ePRUeHl4W9Tp8/vnnGjNmjMaPH6+NGzeqZcuW6tatmzIyMgrsv2DBAh0+fNhx27Ztm7y9vXXfffeVaZ24Mh9+mKL9+9dIek8dOgxX8Lx5uTtHjHBZXQAAAAAAAChfJiNnmfBS2rx5s2bOnKnPPvtM6ZdGyJkurfQcHh6uPn36qG/fvoqNjXXGwykqKko333yzJk2aJEmy2WyqW7euHn/8cT3zzDPFHv/OO+/oxRdf1OHDh1WlSpXL9l+8eFEXL1503M/MzFTdunV16tQpBQQEOOU54HI33viFdu3qK0ka+vAWfXDTEmnKFMnHR/r5Z1YPBwCgFDIzM1WtWjW+z7gRvpMCAABPcqXfR694xGVhWrZsqYkTJ+rAgQP65ptv1K9fP/n5+ckwDB06dEiTJk1Sp06dFB4erhEjRmjZsmVX/VhZWVnasGGDunTp4tjm5eWlLl26aNWqVSU6x0cffaT777+/wNBSkiZMmKBq1ao5bnXr1r3qelE0wzC0YsUK3X//X7VrV9SlrRa99PJN0t/+Jv36q7RkCaElAAC45vCdFAAAXMucNuKyIJmZmfr88881e/Zs/fTTT8p5qJzrS1oslqs676FDh1S7dm2lpKQoOjrasX3s2LFKTEzUmjVrijx+7dq1ioqK0po1a9S+ffsC+/Df7fJx4sQJ3X13L61c6SVprKTul/as0q23jtPChQkKDAx0YYUAAHgORly6H76TAgAAT+KyEZcFCQgI0LBhw5SUlKTdu3dr/Pjxuv7662UYhsowLy3WRx99pMjIyEJDS0ny8/NTQEBAvhucyzAMde8+QCtXvipphaQ78+yN1sqV/1L37gNc+lkBAABwJb6TAgCAa1mZBpd5RUREaPz48dq1a5eSk5M1bNiwqz5XcHCwvL29HdfSzJGenq6wsLAijz179qzmzp2rhx9++KofH86xYkWiVq9+RlLOqNk/fxxjtHr1M0pMTCrnygAAAAAAAOBq5RZc5tWhQwdNnTr1qo/39fVV27Zt810n02azadmyZfmmjhdk/vz5unjxogYOHHjVjw/neOutdZI6SjIX0sMsqaP+/e+ip/4DAAAAAADA8xSWGFV4Y8aMUXx8vNq1a6f27dvrnXfe0dmzZzVkyBBJ0uDBg1W7dm1NmDAh33EfffSR7rnnHgUFBbmibOSxbVtLSdmSfArtY1K2tm1rVV4lAQAAAAAAoIJw2+Cyf//+OnLkiF588UWlpaWpVatW+u677xQaGipJ2rdvn7y88g8o3blzp1auXKkffvjBFSXjTwwjREWFlpJkyCwppFzqAQAAAAAAQMXhtsGlJI0aNUqjRo0qcN+KFSsu29a4cWMWeqlAIiNDtX9/0SMuJYuaNw8tr5IAAAAAAABQQbjkGpeAJPXseUrFjbiUfPT000UvuAQAAAAAAADPQ3AJl7BarZo2bYC8lSQvWQrs4yWLom8+r7g4UzlXBwAAAAAAAFcjuIRLvPfeVG3atFEJ6qUYpUiSzMqW/aqW2ZKkDkrRIu8+Monp/QAAAAAAANcat77GJdzToUOHNG7cGVXTcjXUcCUpTknqqNkapAyFKEQZGqTZ6qgkmVZLSkqS4uJcXTYAAAAAAADKEcElyt3QoW8pK+t1ZclXN2ud9qme4i7Fl5cxm6XZswkuAQAAAAAArjFMFUe5+v77H7R48d2SfCVJo/Vf1dCJwg+wWKSMjPIpDgAAAAAAABUGwSXKzfnz5zVo0BJJnSRJdfwP6R/ebxR9kNkshYSUeW0AAAAAAACoWAguUW5efPG/OnJkrOP+tJeOqLL1dNEHWSzSoEFlXBkAAAAAAAAqGoJLlIvdu3dr4sQQSTUlSd26ndJdpu+lG26QvL0LPsjbW4qNlTp2LL9CAQAAAAAAUCGwOA/KhGEYSkxM1Jw5c5SRkSGLJVo227OSJF/fC/r40R1S32clm00KDpaOHrVPC7dYcn/GxEgJCZLJ5OJnAwAAAAAAgPJGcAmnO3HihO6+u5dWrvSSyTRYhhEiqYNj//i/H1P4E/fZQ0tJGjlSuu02++rhGRn2a1oOGmQfaUloCQAAAAAAcE0iuIRTGYah7t0HaPXqVyXFyjCyZf+Y5QSQp9Vicpx06oD9bqdO0gsv2KeFx8W5pGYAAAAAAABUPFzjEk61YkWiVq9+RlL0pS0+yg0tJZMq6c1T02VI9inin3xS+DUuAQAAAAAAcM0iuIRTvfXWOkkdVdhgXkNmJaujktRRmjVLqlWrXOsDAAAAAACAeyC4hFNt29ZSUnaRfczK1itVR0p33VU+RQEAAAAAAMDtEFzCqewL8fgU2ccis3ZVb1Q+BQEAAAAAAMAtEVzCqSIjQ+RdzIhLb1nUPDKsnCoCAAAAAACAOyK4hFP9vUu6rMWMuLTKR0/fkVZOFQEAAAAAAMAdEVzCqTptm6xYJctblgL3e8uiWCUrbuvkcq4MAAAAAAAA7oTgEk5lOpKhBN2tNtqQZ6sh86Xp4zFKUYLululIhmsKBAAAAAAAgFsguIRzhYQo0HxG/9Crjk2NtEvxmqkVilOi4hRoPiOFhLiwSAAAAAAAAFR0BJdwroEDJYtFm9XKselfel4fapjilCSTJFks0qBBrqoQAAAAAAAAboDgEs4VFyfFxipVLR2bWik1d7+3txQbK3XsWP61AQAAAAAAwG2YXV0APIzJJCUkKDXstJQlVdZZXa/dktlsH2kZEyMlJNj7AQAAAAAAAIVgxCWcLtM7UH9k1ZMkRWqrvH3NUny8tGKFlJgoBQa6tkAAAAAAAABUeIy4hNNt3ZrbbqVUqW1b6cMPXVYPAAAAAAAA3A/BJZyucWPps7cOKvXvsxWrZKlhQ1eXBAAAAAAAADdDcAmn27Nnvdp4r9T9eta+ocHzri0IAAAAAAAAbofgEk43fvx4Nfj2W03K2cCISwAAAAAAAFwhFueB023btk35okqCSwAAAAAAAFwhgks41a5dp7VvXztVUkPZZLJvJLgEAAAAAADAFWKqOJxq7tw0Sf/TCEkLG8/S4rEWqVYtV5cFAAAAAAAAN0NwCadateqso123Y6D0UE8XVgMAAAAAAAB3xVRxONWOHb6O9m231XBhJQAAAAAAAHBnBJdwqkOHQi+1juu2225waS0AAAAAAABwXwSXcJqMDCkrK0iSVNdrm0K3bJaOH3dxVQAAAAAAAHBHBJdwmuTkTEe7t22jTN26SYmJLqwIAAAAAAAA7orgEk6Td2GeVkq1Nxo0cE0xAAAAAAAAcGsEl3Ca9PRwR7ulNtsbBJcAAAAAAAC4CgSXcJrUVPtPs7LVVD9LQUFStWourQkAAAAAAADuieASTmEYUs2aUtWqhm7SDvkpS2rY0NVlAQAAAAAAwE2ZXV0APIPJJP34o2T7ZZeO33S7fSPBJQAAAAAAAK4SwSWcIiMjQz179lT/atU0RsfsGwkuAQAAAAAAcJUILuEU27Zt09q1a9U270aCSwAAAAAAAFwlrnEJp9i2bZskKV9USXAJAAAAAACAq0RwiVIzDGn8+PskfadFGqdzDRpI/v4ElwAAAAAAALhqTBVHqe3fL508GS4pXCtklSX1OalqVVeXBQAAAAAAADfGiEuU2qZNhqMdEPCHAgIC7MuMm0wurAoAAAAAAADujOASpZacnOloN2x42oWVAAAAAAAAwFMQXKLUVq8+72i3aePtwkoAAAAAAADgKQguUWo7d/pJkrx1Tq9/P0m65x7pxx9dWxQAAAAAAADcGsElSuX0aeno0UBJUoi2qubBfVJCgnT8uIsrAwAAAAAAgDsjuESpbN2a225T9Y/cOw0bln8xAAAAAAAA8BgElyiVzZtz293D03PvEFwCAAAAAACgFAguUSqpqbntlpnJ9kZgoFS9uivKAQAAAAAAgIcwu7oAuLe//1269VZp8yarWryzxL6R0ZYAAAAAAAAoJYJLlEpW1nY1b56l+9r4yv8/mfaNBJcAAAAAAAAoJaaKo1QmTJigNm3aqFdkZO5GgksAAAAAAACUEsElSmXbtm2SpHxRJcElAAAAAAAASongEldtyRKrtm+/XlJdtakemLuD4BIAAAAAAAClxDUucdVeffW8LJb/SZLW3/RXDftrB+n336WmTV1cGQAAAAAAANwdwSWu2tat3pdaJxTW5UZp5EiX1gMAAAAAAADPwVRxXJWjR6XjxytdurdZkZHNXVoPAAAAAAAAPAvBJa7K5s357qlZs2auKgUAAAAAAAAeiOASVyVvcFnNe6saZWRIhw5JNpvrigIAAAAAAIDHILjEVdm40epo/6XmYZk7dZJq15befNN1RQEAAAAAAMBjsDgProhhSImJ0jff5GyxqU6lujIkmSSpQQOX1QYAAAAAAADPwYhLlNiJE1JcnHTbbdKpUzkripv0xh9TFadEnVB1qWFDV5YIAAAAAAAAD0FwiRIxDKlXLykl5c97TJKkFMWolxJkNCC4BAAAAAAAQOkRXKJEEhOl5GTJai14v1VmJaujkrbVKN/CAAAAAAAA4JEILlEic+ZI5mKuiGqWRbPnmMqnIAAAAAAAAHg0gkuUSEaGZLEU3ccib2VklE89AAAAAAAA8GwElyiRmjUNmUxFJ5desqhmTaOcKgIAAAAAAIAnI7hEiURGbpZhFD1X3CYftWixuZwqAgAAAAAAgCcjuESJbN06SVKypIJX5/GWRYFK0pYtk8q1LgAAAAAAAHgmgkuUyJEjGZLulnQsz1ZDUrYkyUcpuqBel/oBAAAAAAAApVPMOtGAXUhIiMzmM7JYzkgKkWSRtFhSuqTZuqAkmc1mhYSEuLROAAAAAAAAeAZGXKJEBg4cKIulhqSGl7akyD4Cc5ikJEmSxWLRoEGDXFMgAAAAAAAAPArBJUokLi5ON930cJ4tq/Lt9/b2VmxsrDp27Fi+hQEAAAAAAMAjMVUcJWIymdS164vasSNnyyo1kvSyyaTdhqG0Zs30SkKCTCaTC6sEAAAAAACApyC4RIlt2uTvaJtMaxXfuo0e2LhRkmTcd59MgYGuKg0AAAAAAAAehuASJZKdLa1bZ29Xr35CQ4bcr3/UqiVdCi5N11/vwuoAAAAAAADgabjGJUpk61bp/Hl7+667AjVx4kTp999zOzRsWPCBAAAAAAAAwFUguESJrFmT246OvtQguAQAAAAAAEAZYao4SuSRR6Rbb5VWr5Zuv/3Sxpzg8rrrpOBgl9UGAAAAAAAAz8OIS5SIYViUkvK+2rffrIgIq2S1Snv22Hc2bCixmjgAAAAAAACciOASJbJlyxY99thjatWqlR588EHp0CH7ij0S08QBAAAAAADgdASXKJFVq1Y52jfffDPXtwQAAAAAAECZIrhEsWbOlN5/P0xSV0l+io6OJrgEAAAAAABAmWJxHhTr44+lrVv7SOojf//r1apVK+niRemxx+wBZmSkq0sEAAAAAACAhyG4RJEsFmntWpvsg3P36uaba8vHx8e+xPitt7q6PAAAAAAAAHgopoqjSFu3SufP53xMVikmJsal9QAAAAAAAODaQHCJIuVZk0cElwAAAAAAACgvTBVHkVavzntvlW6Jek5atsy+Ys/Jk1JIiDRwoBQXJ5lMLqoSAAAAAAAAnobgEkVKScm5vuUFtYo4pZD77pOSk3M7eHlJH30kxcZKCQlSYKCrSgUAAAAAAIAHYao4CnXkiLR7t/0j4uOzRXPPnZRSUvJ3stnsP1NSpF69JMMo3yIBAAAAAADgkQguUag1a3Lbj98TpsYZGZLVWnBnq9U+EjMpqXyKAwAAAAAAgEcjuESh8i7ME31skWQu5soCZrM0e3bZFgUAAAAAAIBrAte4RKE6dZKOH7cHmNFeaySLpegDLBYpI6NcagMAAAAAAIBnI7hEoTp2vKi4OJN8fX2loWb7iMqiwkuz2b7KOAAAAAAAAFBKTBVHob766isFBATo1ltv1dobbyzZiMtBg8qnOAAAAAAAAHg0gksUatWqVbp48aJ++uknHWveXIqNlbwK+ch4e9v3d+xYvkUCAAAAAADAIxFcokCpqVJi4s+O+7dER0sJCVLNmvk75izYExNj328ylV+RAAAAAAAA8Fhc4xIF6tfPpl27fpC0XU2a9FNgYKB9R4MGUnq6PaC86y4pPNw+PbxjR0JLAAAAAAAAOA3BJS5z7Ji0a1fOYNxMxcTckrvzp5+knTvtt3vucUV5AAAAAAAAuAYQXOIyq1fnvbdKMTExuXe9vKSbbrLfAAAAAAAAgDLCNS5xmSKDSwAAAAAAAKAcEFziMqtWGY52QMAONW7c2IXVAAAAAAAA4FrEVHHkY7VKq1cbkkySDqhDh3ry8rqUbz/wgHTDDfaFeO64w5VlAgAAAAAAwMMRXCKfn3+Wzp7NGYi7StHR0fbmgQPS3Ln2dufOBJcAAAAAAAAoUwSXyGfVqtx2fHxj9evXwn5nzZrcHVFR5VsUAAAAAAAArjkEl8gnb3D5yCMt5Li8JcElAAAAAAAAypHbLs4zefJkRUREyN/fX1FRUVq7dm2R/U+ePKmRI0cqPDxcfn5+uvHGG/Xtt9+WU7Xu48IFycfHfmvTJs8OgksAAAAAAACUI7cccfn5559rzJgxmjp1qqKiovTOO++oW7du2rlzp0JCQi7rn5WVpTvuuEMhISH64osvVLt2be3du1fVq1cv/+LLkWFIiYnSnDlSRoYUEiINHCjFxUkmU8H9zp6VBgyQOnSQ/PwudbBYpPXr7e369aXQ0HJ/LgAAAAAAALi2uGVwOXHiRA0bNkxDhgyRJE2dOlWLFi3S9OnT9cwzz1zWf/r06Tp+/LhSUlLk4+MjSYqIiCjPksvdiRNSr15ScrJkNtuzR7NZ+ugjKTZWSkiQAgML6mfIZLJpxgxvTZ9u0aJFZgXu2y6dO2c/MaMtAQAAAAAAUA7cbqp4VlaWNmzYoC5duji2eXl5qUuXLlqV9wKNeSxcuFDR0dEaOXKkQkND1bx5c7322muyWq2FPs7FixeVmZmZ7+YuDMMeRqak2O9bLPl/pqTY99tsBfUzyTC8JUlr13qrVy/JWM00cQAAAFdw5++kAAAApeV2weXRo0dltVoV+qfpyqGhoUpLSyvwmN9//11ffPGFrFarvv32W73wwgt6++239a9//avQx5kwYYKqVavmuNWtW9epz6MsJSbaR1AWlstarfb9775bXD+TkpOlpIQTuRsJLgEAAMqNO38nBQAAKC23Cy6vhs1mU0hIiKZNm6a2bduqf//++sc//qGpU6cWesyzzz6rU6dOOW779+8vx4pLZ84c+7Tv4owZU3wfs1maveqG3Dv5VuwBAABAWXLn76QAAACl5XbXuAwODpa3t7fS09PzbU9PT1dYWFiBx4SHh8vHx0fe3t6ObTfddJPS0tKUlZUlX1/fy47x8/OTn2N1GveSkZE7LbwohlF8H4vFUEbDKClmlJSZKVWqVPoCAQAAUCLu/J0UAACgtNxuxKWvr6/atm2rZcuWObbZbDYtW7ZM0dHRBR7ToUMH/fbbb7LZbI5tv/76q8LDwwsMLd1dzZqGTKbikktDvr6GpKLTS5PJqpqtakvvvSfNnOm0GgEAAAAAAICiuF1wKUljxozRBx98oJkzZ2rHjh0aPny4zp4961hlfPDgwXr22Wcd/YcPH67jx49r9OjR+vXXX7Vo0SK99tprGjlypKueQpmKjNwswyhuMK1J3bsnSjIV2cswzGrRYrPTagMAAAAAAABKwu2miktS//79deTIEb344otKS0tTq1at9N133zkW7Nm3b5+8vHIz2bp16+r777/XU089pRYtWqh27doaPXq0xo0b56qnUKa2bp0kKV5StAp+iy2SVmnbtkclfVhsvy1bZl7qBwAAAAAAAJQPtwwuJWnUqFEaNWpUgftWrFhx2bbo6GitXr26jKuqGI4cyZB0t6QESR0vbTVkDyJ9JKVI6qXTp/3+1C9b9o9Ebr+u6iXL/pvL9wkAAAAAAADgmueWU8VRtJCQEJnNZyTdkWfrcUkzJcVJipPZfEbVqlW71C/u0m2mpK8d/eoqTt/rpGYuWSINGFDOzwIAAAAAAADXMoJLDzRw4EBZLBZJIXm2rpA0TFKSJMlisWj48OGX+unS9mGSejn63ZL3pA0blnHVAAAAAAAAQC6CSw8UFxen2NhYeXmF59ma4Wh5e3srNjZWTzzxhGJjY+Xt7V3geaJNeRbuiYoqo2oBAAAAAACAyxFceiCTyaSEhAQ1adIxz9Z0mc32S5rGxMQoISFBXl5eSkhIUExMjCQ59uf87Fy1au7hBJcAAAAAAAAoRwSXHiowMFDDhv3Dcb9q1QuKj4/XihUrlJiYqMDAQEe/xMRErVixQvHx8erZs6fi4+OVuHSpIrOy7Ac3aCDVrOmKpwEAAAAAAIBrlNuuKo7ipaUZjnZMzA368MPXC+xnMpkUFxenuLi43I0bN0oXLtjbjLYEAAAAAABAOWPEpQezWGo42s89N/TKDl6zJrdNcAkAAAAAAIByRnDpwTJy1+NRaOgVHkxwCQAAAAAAABdiqrgHi4iQbr5ZSk+XQkKu8OCc4NLHR2rd2tmlAQAAAAAAAEVixKUH++c/pbVrpb17pUtr8ZRMdrYUFCT5+UktW0r+/mVWIwAAAAAAAFAQRlx6sLFjx2rt2rUKCwvTpEmTFBwcXLIDfXyklSulrKz8880BAAAAAACAcsKISw+2YcMGJSYm6vPPP5efn9+Vn8DXV6pTx/mFAQAAAAAAAMUguPRgaWlpkqRKlSrpuuuuc3E1AAAAAAAAQMkxVdxD7dol/fLLAkmHVbnycplMppIdaBj2nyXtDwAAAAAAAJQBRlx6qH37smWzNZbUSb6+jUt+4J49Uu3a0r33SvPnl1V5AAAAAAAAQJEILj3Url2ZjnaNGtklP3DNGunwYemrr6Tt251fGAAAAAAAAFACBJce6o8/zjraNWtewYFr1uS2o6KcVxAAAAAAAABwBQguPdT+/Rcc7Vq1vEt+YN7gsn17J1YEAAAAAAAAlBzBpYc6fNjqaNer51eyg7KypI0b7e0bbpCCgsqgMgAAAAAAAKB4BJce6siR3FXBeyYvkO6+Wxo6VFqxInfl8ByGYd/er5908aJ9W0TE5f0AAAAAAACAcmJ2dQEoG2aFOtqtVy2UbOcks1n66CMpNlZKSJACA6UTJ6RevaTkZMkrT469dKkUF5fbDwAAAAAAAChHjLj0RIahc7+fkSRV00lVsp2zb7dY7D9TUuxhpc1m/5mSYt9us+U/T04/Rl4CAAAAAACgnBFceqLERGWcrypJClHG5futVvsIy3Hj7D+t1sv75O2XlFSGxQIAAAAAAACXY6q4BzJmz9G/veYq3RasKjpbeMdZs+zTx3NGYhbEbJZmz7ZPGwcAAAAAAADKCcGlBzIdydAw29fFdzx/vujQUrLvzyhg1CYAAAAAAABQhpgq7oEsQUHKLq6Tl5cUHGwfUVkUs1kKCXFWaQAAAAAAAECJEFx6oGN33imf4jrZbNITT5RsxOWgQc4qDQAAAAAAACgRgksPtCngBn2iRjqmABW4Hri3txQbaw8uY2Pt94vq17FjWZYLAAAAAAAAXIbg0gPN/bySBupXBeuU/qc+kslk35EzLTwmRkpIsE8XT0iw38+7/8/9co4HAAAAAAAAygmL83igQ4dyp3/v6n+7dF11+wI7ISH2ad8dO+aGkYGBUmKilJRkXz28sH4AAAAAAABAOSK49EB5FwGv1rGJNGJE0QeYTFJcnP0GAAAAAAAAVABMFfdAJ07k5tGNGgW4sBIAAAAAAADg6hBceqBTpypdamWrUd2qLq0FAAAAAAAAuBoElx7o/PnrJEmVlKGIm5pIAQH261cCAAAAAAAAboLg0sMYhpSVVV2SFGA6Yt94+rTk7++6ogAAAAAAAIArRHDpYU6ckCQfSVKT0Dxvb82aLqkHAAAAAAAAuBoElx4m74ridSufyb0TElL+xQAAAAAAAABXieDSw+QNLkONtNw7jLgEAAAAAACAGzG7ugA4V4cOUnq6PcAMGPCxfaPJJNWo4drCAAAAAAAAgCtAcOlhfv55q7777juFhYXp/mOb7BuDgyVvb9cWBgAAAAAAAFwBgksP89NPP2ns2LGSpPt9fe0bmSYOAAAAAAAAN8M1Lj1Menq6JKmSJJ+sLPtGgksAAAAAAAC4GYJLD5OYWF/S31VJg3RRjLgEAAAAAACAe2KquIfZsqW9pAd1XFLaggdU389gYR4AAAAAAAC4HYJLD3P2bJVLrZMK79FZyrnOJQAAAAAAAOBGmCruYbKyAiVJXl5H5UtoCQAAAAAAADdFcOlBLlwwZLMFSJL8/E65uBoAAAAAAADg6hFcepA9e8462uF+J6XPP5eWL5fOnHFdUQAAAAAAAMBV4BqXHmTnzhOSrpMkNbemSfcPtO/YulVq3tx1hQEAAAAAAABXiBGXHiQtzXC065iP5+6oWdMF1QAAAAAAAABXj+DSg/j713O0mwZcyN0RFOSCagAAAAAAAICrR3DpQTIyctuh5/fYG0FBkpkrAgAAAAAAAMC9kGh5kJo1pehoKT1dqnV4Z+5GAAAAAAAAwM0QXHqQBx+033T+vFR5mX0jwSUAAAAAAADcEMGlBxkxYoS2bNmi5gEBmpqzMSTElSUBAAAAAAAAV4Xg0oNs2LBBa9eu1YW8GxlxCQAAAAAAADfE4jweJD09XZJ0fbVquRsJLgEAAAAAAOCGCC49hM1maN++xZKStdP2plSrluTjQ3AJAAAAAAAAt8RUcQ+xb99pGcZNkqT9Pv7SwYOSYUhWq4srAwAAAAAAAK4cIy49xI4dxxztgIBLV7k0mSQz2TQAAAAAAADcD8Glh/jtt0xHOyiIUZYAAAAAAABwbwSXHuKPP8462qGhLiwEAAAAAAAAcAKCSw+xf3+Wo91h71rpr3+VnnzSfp1LAAAAAAAAwM0QXHqItDSbo93k0Gbps8+kWbPs17kEAAAAAAAA3AzBpYcIDr7J0a5zYZ+9UbOmi6oBAAAAAAAASofg0kN4eYU72uHn/7A3CC4BAAAAAADgpgguPUR6em67po7YGyEhrikGAAAAAAAAKCWzqwuAc4wZI/3lL9LJnenyn3HRvpERlwAAAAAAAHBTBJcewDAMNWmyQ506hSlwXao049IOgksAAAAAAAC4KYJLD3DixAk1a9ZMkvRmixZ6OmcHU8UBAAAAAADgprjGpQdIS0tztGv5+OTuYMQlAAAAAAAA3BTBpQf444+jkppIqqFQb4JLAAAAAAAAuD+minuApCSbpB2SpA+yFqrLiO+ljAwpIsKldQEAAAAAAABXi+DSA+zff9HRrtQyXJo82YXVAAAAAAAAAKXHVHEPcPiw1dGuX9/fhZUAAAAAAAAAzkFw6QGOHDE52g0aVHFhJQAAAAAAAIBzEFx6gBMnchfkaVyPEZcAAAAAAABwfwSXHuD06cqOduPOzaXKlaU+fVxYEQAAAAAAAFA6LM7jAS5cqHqpla1AnZDOS7JaizoEAAAAAAAAqNAYcekBgoObSZJCArPluNplzZouqwcAAAAAAAAoLYJLN2cY0pEj9rexVg1L7g6CSwAAAAAAALgxgks3d/KkZLmUV4ZUPpu7IyTEJfUAAAAAAAAAzsA1Lt1c9erSsWNSRoakWUukrZd2MOISAAAAAAAAbozg0s1t2LBeS5YsUVhYmO7N3JC7g+ASAAAAAAAAbozg0s0lJibqueeekyTFdu6s6jk7mCoOAAAAAAAAN8Y1Lt1cWlqao13twoXcHYy4BAAAAAAAgBtjxKWb27gxRNI4SRk6m7lPjrgyONh1RQEAAAAAAAClRHDp5n79tYmknpKkPU9tVUTtw9Lx45Kfn2sLAwAAAAAAAEqB4NLNZWZWcrQbdm4u1Yt0YTUAAAAAAACAc3CNSzd3/vx1jnZIiMmFlQAAAAAAAADOQ3DpxqxWq7KzAyVJ3t5n5O/v4oIAAAAAAAAAJ2GquBs7evSopFBJUmW/k9KnC+2riTduLNWr59LaAAAAAAAAgNJgxKUb27cvXVJ1SVKQ3ylpwACpa1dpyhSX1gUAAAAAAACUFsGlGztxInfAbGjls7k7QkJcUA0AAAAAAADgPASXbiw4uKmj3Soid3Vx1azpgmoAAAAAAAAA5yG4dGMZGbntUK+juXcILgEAAAAAAODmWJzHjfn7S7feag8w63ntz91BcAkAAAAAAAA3R3Dpxjp1kpKTL93pk5C7g+ASAAAAAAAAbo7g0o0NGjRIu3btUlhYmBYcPZo775/gEgAAAAAAAG6O4NKNbdq0Sdu3b5e/v79MERH2jVWr2ueQAwAAAAAAAG6MxXncWFpamiQpNDRUppyVehhtCQAAAAAAAA/AiEs3lZ2drWPHpkuqqdOZ56SAh6Vz5wguAQAAAAAA4BEILt1URkaGpLaSauvc+WPS8T2SYUhZWS6uDAAAAAAAACg9poq7qbS0dEkhkqQqVc7aN5pMkp+f64oCAAAAAAAAnITg0k399ttRST6SpGrVGGUJAAAAAAAAz0Jw6aZ27z7taAcFWV1YCQAAAAAAAOB8BJduau/eC4729Ua61K+fNGqUtHmzC6sCAAAAAAAAnIPFedzUgQO508MbKE2aP99+p0cPqWVLF1UFAAAAAAAAOAfBZQVhGIYSExM1Z84cZWRkKCQkRAMHDlRcXJxMJtNl/fbuPe/YVv3C/twT1axZnmUDAAAAAAAAZYLgsgI4ceKEevXqpeTkZJnNZlksFpnNZn300UeKjY1VQkKCAgMD8/UzmV52HH9y27Lck4WEuOAZAAAAAAAAAM7FNS5dzDAM9erVSykpKZIki8WS72dKSop69eolm82Wr59h5I6srK+M3PMFB5dX6QAAAAAAAECZIbh0scTERCUnJ8tqtUqKk/SBpIRLP+NktVqVnJysNm3a/KlfXUnbJW1RlmrLkHRGUtK6dS56JgAAAAAAAIDzuHVwOXnyZEVERMjf319RUVFau3ZtoX1nzJghk8mU7+bv71+O1RZszpw58vYOlpQoaYWkeEk9L/1ccWl7dW3evFlS9Tz9uklqKukmPaEExSlRv6m6Zs+eXd5PAQAAAAAAAHA6tw0uP//8c40ZM0bjx4/Xxo0b1bJlS3Xr1k0ZGRmFHhMQEKDDhw87bnv37i3HiguWnp4hq/V/kmIubfGRZLr0U5e2J1xqJxTaL0UxGqIEpacX/vwBAAAAAAAAd+G2weXEiRM1bNgwDRkyRE2bNtXUqVNVuXJlTZ8+vdBjTCaTwsLCHLfQ0NByrLhgNluspI4qfJ0ks6SO8vHZXmQ/q8xKVUfZbLeWSZ0AAAAAAABAeXLLVcWzsrK0YcMGPfvss45tXl5e6tKli1atWlXocWfOnFH9+vVls9nUpk0bvfbaa2rWrFmBfS9evKiLFy867p86dUqSlJmZ6aRnYZed3UvSMeWOsCysXx1JRT+2SdnKzr7H6TUCAADPkPMdwTAMF1eCkiqv76QAAADl4Uq/j7plcHn06FFZrdbLRkyGhobql19+KfCYxo0ba/r06WrRooVOnTqlt956SzExMdq+fbvq1KlzWf8JEybo5Zdfvmx73bp1nfMkyoAhackSqVo1V1cCAAAqstOnT6saXxjcgjt+JwUAAChOSb+Pmgw3/Jf7oUOHVLt2baWkpCg6OtqxfezYsUpMTNSaNWuKPUd2drZuuukmPfDAA3rllVcu2//n/27bbDYdP35cQUFBMplMznkiuExmZqbq1q2r/fv3KyAgwNXl4Arw3rk33j/3xXvnvlzx3hmGodOnT6tWrVry8nLbKwZdU1zxnZTfK2WP17hs8fqWLV7fssdrXLZ4fctWca/vlX4fdcsRl8HBwfL29lZ6enq+7enp6QoLCyvROXx8fNS6dWv99ttvBe738/OTn59fvm3Vq1e/qnpx5QICAvgF4qZ479wb75/74r1zX+X93jHS0r248jspv1fKHq9x2eL1LVu8vmWP17hs8fqWraJe3yv5PuqW/2r39fVV27ZttWzZMsc2m82mZcuW5RuBWRSr1aqtW7cqPDy8rMoEAAAAAAAAcJXccsSlJI0ZM0bx8fFq166d2rdvr3feeUdnz57VkCFDJEmDBw9W7dq1NWHCBEnSP//5T91yyy264YYbdPLkSf373//W3r17NXToUFc+DQAAAAAAAAAFcNvgsn///jpy5IhefPFFpaWlqVWrVvruu+8cC/bs27cv31z5EydOaNiwYUpLS1NgYKDatm2rlJQUNW3a1FVPAQXw8/PT+PHjL5sShYqP98698f65L94798V7h4qKz2bZ4zUuW7y+ZYvXt+zxGpctXt+y5ezX1y0X5wEAAAAAAADg2dzyGpcAAAAAAAAAPBvBJQAAAAAAAIAKh+ASAAAAAAAAQIVDcAkAAAAAAACgwiG4RIXz+uuvy2Qy6cknn3R1KSihgwcPauDAgQoKClKlSpUUGRmp9evXu7osFMNqteqFF15QgwYNVKlSJV1//fV65ZVXxJptFVNSUpJ69uypWrVqyWQy6auvvsq33zAMvfjiiwoPD1elSpXUpUsX7dq1yzXFIp+i3rvs7GyNGzdOkZGRqlKlimrVqqXBgwfr0KFDrisY17zJkycrIiJC/v7+ioqK0tq1a11dkkd46aWXZDKZ8t2aNGni6rLcGn8by1Zxr++DDz542Wf6zjvvdE2xbmjChAm6+eabVbVqVYWEhOiee+7Rzp078/W5cOGCRo4cqaCgIF133XXq06eP0tPTXVSxeynJ69upU6fLPsOPPfaYiyp2P1OmTFGLFi0UEBCggIAARUdHa/HixY79zvr8ElyiQlm3bp3ef/99tWjRwtWloIROnDihDh06yMfHR4sXL9bPP/+st99+W4GBga4uDcV44403NGXKFE2aNEk7duzQG2+8oTfffFPvvfeeq0tDAc6ePauWLVtq8uTJBe5/88039e6772rq1Klas2aNqlSpom7duunChQvlXCn+rKj37ty5c9q4caNeeOEFbdy4UQsWLNDOnTt19913u6BSQPr88881ZswYjR8/Xhs3blTLli3VrVs3ZWRkuLo0j9CsWTMdPnzYcVu5cqWrS3Jr/G0sW8W9vpJ055135vtMf/bZZ+VYoXtLTEzUyJEjtXr1ai1ZskTZ2dnq2rWrzp496+jz1FNP6euvv9b8+fOVmJioQ4cOqXfv3i6s2n2U5PWVpGHDhuX7DL/55psuqtj91KlTR6+//ro2bNig9evX6/bbb1evXr20fft2SU78/BpABXH69GmjUaNGxpIlS4y4uDhj9OjRri4JJTBu3Djj1ltvdXUZuAo9evQwHnrooXzbevfubQwYMMBFFaGkJBlffvml477NZjPCwsKMf//7345tJ0+eNPz8/IzPPvvMBRWiMH9+7wqydu1aQ5Kxd+/e8ikKyKN9+/bGyJEjHfetVqtRq1YtY8KECS6syjOMHz/eaNmypavL8Fj8bSxbBf39io+PN3r16uWSejxRRkaGIclITEw0DMP+efXx8THmz5/v6LNjxw5DkrFq1SpXlem2/vz6GoZB7lAGAgMDjQ8//NCpn19GXKLCGDlypHr06KEuXbq4uhRcgYULF6pdu3a67777FBISotatW+uDDz5wdVkogZiYGC1btky//vqrJGnz5s1auXKl7rrrLhdXhiv1xx9/KC0tLd/vz2rVqikqKkqrVq1yYWW4GqdOnZLJZFL16tVdXQquMVlZWdqwYUO+3yVeXl7q0qULv0ucZNeuXapVq5YaNmyoAQMGaN++fa4uyWPxt7F8rFixQiEhIWrcuLGGDx+uY8eOubokt3Xq1ClJUo0aNSRJGzZsUHZ2dr7PcJMmTVSvXj0+w1fhz69vjk8++UTBwcFq3ry5nn32WZ07d84V5bk9q9WquXPn6uzZs4qOjnbq59fs7GKBqzF37lxt3LhR69atc3UpuEK///67pkyZojFjxui5557TunXr9MQTT8jX11fx8fGuLg9FeOaZZ5SZmakmTZrI29tbVqtVr776qgYMGODq0nCF0tLSJEmhoaH5toeGhjr2wT1cuHBB48aN0wMPPKCAgABXl4NrzNGjR2W1Wgv8XfLLL7+4qCrPERUVpRkzZqhx48Y6fPiwXn75ZcXGxmrbtm2qWrWqq8vzOPxtLHt33nmnevfurQYNGmj37t167rnndNddd2nVqlXy9vZ2dXluxWaz6cknn1SHDh3UvHlzSfbPsK+v72X/yOQzfOUKen0l6a9//avq16+vWrVqacuWLRo3bpx27typBQsWuLBa97J161ZFR0frwoULuu666/Tll1+qadOmSk1Nddrnl+ASLrd//36NHj1aS5Yskb+/v6vLwRWy2Wxq166dXnvtNUlS69attW3bNk2dOpXgsoKbN2+ePvnkE3366adq1qyZUlNT9eSTT6pWrVq8d4ALZGdnq1+/fjIMQ1OmTHF1OQCcLO+MhhYtWigqKkr169fXvHnz9PDDD7uwMuDq3H///Y52ZGSkWrRooeuvv14rVqxQ586dXViZ+xk5cqS2bdvGdW/LSGGv7yOPPOJoR0ZGKjw8XJ07d9bu3bt1/fXXl3eZbqlx48ZKTU3VqVOn9MUXXyg+Pl6JiYlOfQymisPlNmzYoIyMDLVp00Zms1lms1mJiYl69913ZTabZbVaXV0iihAeHq6mTZvm23bTTTcx9ckNPP3003rmmWd0//33KzIyUoMGDdJTTz2lCRMmuLo0XKGwsDBJumyVvvT0dMc+VGw5oeXevXu1ZMkSRlvCJYKDg+Xt7c3vknJSvXp13Xjjjfrtt99cXYpH4m9j+WvYsKGCg4P5TF+hUaNG6ZtvvtHy5ctVp04dx/awsDBlZWXp5MmT+frzGb4yhb2+BYmKipIkPsNXwNfXVzfccIPatm2rCRMmqGXLlvrvf//r1M8vwSVcrnPnztq6datSU1Mdt3bt2mnAgAFKTU1lmkEF16FDB+3cuTPftl9//VX169d3UUUoqXPnzsnLK/+fAW9vb9lsNhdVhKvVoEEDhYWFadmyZY5tmZmZWrNmjaKjo11YGUoiJ7TctWuXli5dqqCgIFeXhGuUr6+v2rZtm+93ic1m07Jly/hdUgbOnDmj3bt3Kzw83NWleCT+Npa/AwcO6NixY3ymS8gwDI0aNUpffvmlfvzxRzVo0CDf/rZt28rHxyffZ3jnzp3at28fn+ESKO71LUhqaqok8RkuBZvNposXLzr188tUcbhc1apV811nQpKqVKmioKCgy7aj4nnqqacUExOj1157Tf369dPatWs1bdo0TZs2zdWloRg9e/bUq6++qnr16qlZs2batGmTJk6cqIceesjVpaEAZ86cyfff3z/++EOpqamqUaOG6tWrpyeffFL/+te/1KhRIzVo0EAvvPCCatWqpXvuucd1RUNS0e9deHi4+vbtq40bN+qbb76R1Wp1XPenRo0a8vX1dVXZuEaNGTNG8fHxateundq3b6933nlHZ8+e1ZAhQ1xdmtv7+9//rp49e6p+/fo6dOiQxo8fL29vbz3wwAOuLs1t8bexbBX1+taoUUMvv/yy+vTpo7CwMO3evVtjx47VDTfcoG7durmwavcxcuRIffrpp0pISFDVqlUdf/+rVaumSpUqqVq1anr44Yc1ZswY1ahRQwEBAXr88ccVHR2tW265xcXVV3zFvb67d+/Wp59+qu7duysoKEhbtmzRU089pY4dO6pFixYurt49PPvss7rrrrtUr149nT59Wp9++qlWrFih77//3rmfX6euew44SVxcnDF69GhXl4ES+vrrr43mzZsbfn5+RpMmTYxp06a5uiSUQGZmpjF69GijXr16hr+/v9GwYUPjH//4h3Hx4kVXl4YCLF++3JB02S0+Pt4wDMOw2WzGCy+8YISGhhp+fn5G586djZ07d7q2aBiGUfR798cffxS4T5KxfPlyV5eOa9R7771n1KtXz/D19TXat29vrF692tUleYT+/fsb4eHhhq+vr1G7dm2jf//+xm+//ebqstwafxvLVlGv77lz54yuXbsaNWvWNHx8fIz69esbw4YNM9LS0lxdttso7O//xx9/7Ohz/vx5Y8SIEUZgYKBRuXJl49577zUOHz7suqLdSHGv7759+4yOHTsaNWrUMPz8/IwbbrjBePrpp41Tp065tnA38tBDDxn169c3fH19jZo1axqdO3c2fvjhB8d+Z31+TYZhGFeaqgIAAAAAAABAWeIalwAAAAAAAAAqHIJLAAAAAAAAABUOwSUAAAAAAACACofgEgAAAAAAAECFQ3AJAAAAAAAAoMIhuAQAAAAAAABQ4RBcAgAAAAAAAKhwCC4BAAAAAAAAVDgElwAAAAAAoNzt2bNHJpNJJpNJM2bMcHU5ACoggksAAAAAAMrRihUrHIFdSW9PPvmkq8sGgHJHcAkAJTRjxgzHF8c9e/a4upwSycrKUqNGjWQymfTFF18U2s8wDAUEBMjLy0uhoaHq37+/9u3bV+z5R44cKZPJpPj4eGeWDQAAAACAzK4uAABQdv773//qt99+U/PmzdWnT59C++3evVunT5+WJGVkZGjevHn65ZdftHnz5iLPP27cOH344YeaPXu2nnjiCbVt29ap9QMAAHi64cOHa8SIEcX2Cw4OLodqAKBiIbgEAA91+vRpvfHGG5Kk559/XiaTqdC+4eHh2rp1qw4ePKgRI0bo999/15YtW7R582a1bNmy0OPq1aun+Ph4ffDBB3rhhRf07bffOv15AAAAeLKQkBA1b97c1WUAQIXEVHEA8FBTpkzRsWPHVK9ePd13331F9q1SpYqaN2+ubt266ZVXXnFsT01NLfZx/va3v0mSFi9erA0bNpSqZgAAAAAAchBcAoAHslqtmjRpkiTpgQcekJdXyX/dR0dHO9rbtm0rtn/jxo3Vpk0bSdJ77713hZUCAADgakRERMhkMunBBx+UJK1bt04PPPCA6tatK39/f9WtW1dDhgzRL7/8UqLzff311+rbt6/q1KkjPz8/BQUFKTo6Wq+//rrOnDlTonNs27ZNjz/+uCIjIxUYGCgfHx+FhYWpS5cuevPNN3X48OFiz7FkyRL17NlTYWFh8vPzU4MGDTR8+HAdOHCgRDUA8CwElwDggZYsWaL9+/dLkgYMGHBFx0ZERKhKlSqSShZc5n2M+fPnO66VCQAAgPIxffp0xcTEaO7cuTpw4IAuXryoAwcOaMaMGWrVqpXmz59f6LEXLlxQ7969dffdd+t///ufDh48qKysLB0/flyrV6/Ws88+q8aNGxc5E8dqtWrMmDFq0aKFJk2apG3btunkyZOyWCxKT0/XsmXLNG7cOD377LNFPo9nn31WXbt21TfffKP09HRlZWVpz549mjp1qtq0aaMdO3Zc7UsEwE0RXAKAE2VlZen//u//dNttt6lmzZry9fVVWFiYunfvrjlz5shmsxV7jmPHjmns2LFq3LixKlWqpNDQUN1xxx368ssvJZVsdfN58+ZJkho1aqTIyMgreg4mk0nXX3+9pJIHlzkL/5w7d04JCQlX9HgAAAC4eqmpqXrssccUEhKi9957T2vWrFFiYqLGjRsnPz8/Xbx4UQMGDND69esLPD4+Pt7xPbNly5aaNWuW1q1bp++//15DhgyRyWTSoUOH1LlzZx08eLDAczzyyCP6z3/+I8MwFB4erldffVXLly/Xxo0b9f333+uVV14p8rrpkvTBBx/o9ddfV1xcnD799FOtX79eS5cu1eDBgyVJR44c0UMPPVSKVwqAO2JxHgBwkj179uiuu+66bDpOenq6Fi9erMWLF+v9999XQkKCatSoUeA5tm7dqjvuuEPp6emObRcuXNDSpUu1dOlSPfLII/mmchdm+fLlkqRbbrnlip/HqlWrtHXrVknSgQMHdOrUKVWrVq3IY+rXr6+wsDClpaVp8eLFGjhw4BU/LgAAwLUoIyOjxJfn8fHxuWz75s2bVb9+fa1evVphYWGO7R07dlS3bt3UtWtXZWdna8SIEVq7dm2+YxctWuT4h3fnzp317bffytfX17G/a9euio6O1iOPPKLjx49rzJgx+vzzz/OdY+HChZo+fbok+yWHvv32W1WvXj1fn65du+r55593zAgqSEpKioYNG6b3338/36KSnTt3lq+vrz788EOtXr1amzZtUuvWrYt5tQB4CkZcAoATnDlzRp07d3aElvfcc48WLlyo9evXa/78+YqLi5MkrVy5Uj179pTVar3sHCdPntSdd97pCC0HDRqkxYsXa/369Zo7d66io6M1bdo0TZ06tchaDhw44BiJefPNN1/R87BYLHrsscdkGIZj2/bt20t0bPv27SVJiYmJV/SYAAAA17IpU6YoMjKy2Fthox0l6e23384XWua47bbbNGzYMEn2a2D+edTl5MmTJUk+Pj76+OOP84WWOYYNG6YuXbpIkhYsWHDZdSpff/11SVLlypX1xRdfXBZa5lW3bt1C94WHh+u9997LF1rm+Pvf/+5oJycnF3oOAJ6H4BIAnODll1/W77//Lkl6/vnn9eWXX6pnz55q27at+vbtq+XLlzuuA5mSkqJp06YVeI5Dhw5Jkt555x3NmjVLd955p9q2bav+/fsrOTlZvXr1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", + "text/plain": [ + "
" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "imdb_results = pd.read_csv(imdb_logger.experiment.metrics_file_path)\n", "summary_plot(imdb_results,\n", @@ -3387,7 +3943,7 @@ }, { "cell_type": "markdown", - "id": "37afe4d5", + "id": "95e2c89f", "metadata": {}, "source": [ "From the graphs we see that the accuracy of the lasso logistic regression peaks at about $0.88$, as it does for the neural network.\n", @@ -3397,8 +3953,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c6c3cec7", + "execution_count": 85, + "id": "5f8c7df0", "metadata": { "lines_to_next_cell": 2 }, @@ -3414,7 +3970,7 @@ }, { "cell_type": "markdown", - "id": "0af048fe", + "id": "d2a9982b", "metadata": {}, "source": [ "## Recurrent Neural Networks\n", @@ -3424,7 +3980,7 @@ }, { "cell_type": "markdown", - "id": "af4b1761", + "id": "51642336", "metadata": {}, "source": [ "### Sequential Models for Document Classification\n", @@ -3443,8 +3999,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "29c82e2f", + "execution_count": 86, + "id": "af4d3414", "metadata": {}, "outputs": [], "source": [ @@ -3458,7 +4014,7 @@ }, { "cell_type": "markdown", - "id": "3fdb73dd", + "id": "3aa82266", "metadata": {}, "source": [ "The first layer of the RNN is an embedding layer of size 32, which will be\n", @@ -3475,7 +4031,7 @@ }, { "cell_type": "markdown", - "id": "147bbf0c", + "id": "ed2d5d9b", "metadata": {}, "source": [ "The second layer is an LSTM with 32 units, and the output\n", @@ -3486,8 +4042,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "4428019a", + "execution_count": 87, + "id": "053cda21", "metadata": { "lines_to_next_cell": 0 }, @@ -3508,7 +4064,7 @@ }, { "cell_type": "markdown", - "id": "f84bf887", + "id": "aad0a983", "metadata": {}, "source": [ "We instantiate and take a look at the summary of the model, using the\n", @@ -3517,10 +4073,38 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "c8b60bfa", + "execution_count": 88, + "id": "1375cc01", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "===================================================================================================================\n", + "Layer (type:depth-idx) Input Shape Output Shape Param #\n", + "===================================================================================================================\n", + "LSTMModel [10, 500] [10] --\n", + "├─Embedding: 1-1 [10, 500] [10, 500, 32] 320,096\n", + "├─LSTM: 1-2 [10, 500, 32] [10, 500, 32] 8,448\n", + "├─Linear: 1-3 [10, 32] [10, 1] 33\n", + "===================================================================================================================\n", + "Total params: 328,577\n", + "Trainable params: 328,577\n", + "Non-trainable params: 0\n", + "Total mult-adds (Units.MEGABYTES): 45.44\n", + "===================================================================================================================\n", + "Input size (MB): 50.00\n", + "Forward/backward pass size (MB): 2.56\n", + "Params size (MB): 1.31\n", + "Estimated Total Size (MB): 53.87\n", + "===================================================================================================================" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "lstm_model = LSTMModel(X_test.shape[-1])\n", "summary(lstm_model,\n", @@ -3532,7 +4116,7 @@ }, { "cell_type": "markdown", - "id": "137fd8cd", + "id": "fa9049a4", "metadata": {}, "source": [ "The 10,003 is suppressed in the summary, but we see it in the\n", @@ -3541,8 +4125,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "2560f427", + "execution_count": 89, + "id": "f89f58af", "metadata": {}, "outputs": [], "source": [ @@ -3552,12 +4136,34 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "61931078", + "execution_count": 90, + "id": "ae8fc1fe", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "GPU available: True (mps), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "IPU available: False, using: 0 IPUs\n", + "HPU available: False, using: 0 HPUs\n", + "\n", + " | Name | Type | Params\n", + "--------------------------------------------\n", + "0 | model | LSTMModel | 328 K \n", + "1 | loss | BCEWithLogitsLoss | 0 \n", + "--------------------------------------------\n", + "328 K Trainable params\n", + "0 Non-trainable params\n", + "328 K Total params\n", + "1.314 Total estimated model params size (MB)\n", + "`Trainer.fit` stopped: `max_epochs=20` reached.\n" + ] + } + ], "source": [ "lstm_trainer = Trainer(deterministic=True,\n", " max_epochs=20,\n", @@ -3570,7 +4176,7 @@ }, { "cell_type": "markdown", - "id": "bd1f8819", + "id": "cf6061b3", "metadata": {}, "source": [ "The rest is now similar to other networks we have fit. We\n", @@ -3579,17 +4185,51 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "31247bff", + "execution_count": 91, + "id": "9c8dd061", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃        Test metric               DataLoader 0        ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│       test_accuracy           0.8505200147628784     │\n",
+       "│         test_loss             0.7480539679527283     │\n",
+       "└───────────────────────────┴───────────────────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│\u001b[36m \u001b[0m\u001b[36m test_accuracy \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.8505200147628784 \u001b[0m\u001b[35m \u001b[0m│\n", + "│\u001b[36m \u001b[0m\u001b[36m test_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.7480539679527283 \u001b[0m\u001b[35m \u001b[0m│\n", + "└───────────────────────────┴───────────────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[{'test_loss': 0.7480539679527283, 'test_accuracy': 0.8505200147628784}]" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "lstm_trainer.test(lstm_module, datamodule=imdb_seq_dm)" ] }, { "cell_type": "markdown", - "id": "f0cfa4a3", + "id": "40823178", "metadata": {}, "source": [ "We once again show the learning progress, followed by cleanup." @@ -3597,12 +4237,33 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e021773c", + "execution_count": 92, + "id": "774197a2", "metadata": { "lines_to_next_cell": 2 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(0.5, 1.0)" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiEAAAISCAYAAAAa+R+EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAABBbElEQVR4nO3dfVxUZf7/8fcwCoIK3gMyJFpmdqOWN4QtrZaFtetqyGbaprndbH3NMB/+1lw1u9nVx1ZrWLq1u1/TaldzpdHtu5WtERaVZV/vss0syxIJMCtBKVGH8/uDL7OOoDJwDtcMvJ6Pxzx0Ls6c+QzDcN5c57qu47IsyxIAAEATizBdAAAAaJkIIQAAwAhCCAAAMIIQAgAAjCCEAAAAIwghAADACEIIAAAwghACAACMIIQAAAAjCCEAAMAIoyHkzTff1KhRo9S9e3e5XC6tXbv2jI/ZsGGDLrnkEkVFRemcc87R8uXLHa8TAADYz2gIqaioUP/+/bVkyZJ6bb9nzx795Cc/0fDhw7Vt2zZNmzZNt956q1599VWHKwUAAHZzhcoF7Fwul9asWaMxY8accpuZM2fqpZde0ocffuhvu+GGG3Tw4EGtW7euCaoEAAB2aWW6gGBs3LhRI0aMCGjLyMjQtGnTTvmYyspKVVZW+u9XVVXp22+/VefOneVyuZwqFQCAZseyLB06dEjdu3dXRETjT6aEVQgpKSlRfHx8QFt8fLzKy8v1ww8/KDo6utZjFixYoAceeKCpSgQAoNkrLCyUx+Np9H7CKoQ0xKxZszR9+nT//bKyMp111lkqLCxUbGyswcoAIHT5fD698847KikpUUJCgoYOHSq32x2y+3VSONTs8/l04YUX6quvvjrlNklJSdqxY0ejai8vL1dycrLat2/f4H2cKKxCSEJCgkpLSwPaSktLFRsbW2cviCRFRUUpKiqqVntsbCwhBADq4PV6lZ2drX379vnbPB6PFi1apMzMzJDbr1R9EC4oKFBxcbESExOVnp5uS1BwsmY7bdiw4bQBRJKKioq0fft2DRs2rNHPZ9dwhrBaJyQtLU15eXkBbevXr1daWpqhigCgefF6vcrKygo46ErVB7CsrCx5vd6Q2m/NvlNSUjR8+HBNmDBBw4cPV0pKSqP26XTNdisuLrZ1uyZjGXTo0CFr69at1tatWy1J1sKFC62tW7daX375pWVZlnXvvfdaN910k3/7zz//3IqJibH+3//7f9bOnTutJUuWWG6321q3bl29n7OsrMySZJWVldn+egAgnB0/ftzyeDyWpDpvLpfLSk5Oto4fPx4S+7Usy3rhhRcsl8tV5z5dLpf1wgsvBL1Pp2t2Qn5+/ilrPfGWn5/fqOex+xhqNISc6ps2adIky7Isa9KkSdaPf/zjWo8ZMGCAFRkZafXq1ctatmxZUM9JCAGAujl1IHNqv04GhaY6qNul5ntRVyCzMzTZfQw1OiZk2LBhsk6zTEldq6EOGzZMW7dudbCq6ilIx48fl8/nc/R50DTcbrdatWrFlGzgDJzq0ndqvwUFBbVOlZzIsiwVFhaqoKAg6HEQ4XZ6w+12a9GiRcrKypLL5Qo4ttb87svJyQm5AbVhNTC1KRw9elTFxcX6/vvvTZcCG8XExCgxMVGRkZGmS0EL5dTASTslJibaup3T+3UyKDhV84ns/pnIzMxUbm5unQNpc3JyQmogbY2QWTG1qZSXlysuLk5lZWW1ZsdUVVXp008/ldvtVteuXRUZGclfz2HOsiwdPXpUX3/9tXw+n3r37m3LAjtAMMJlhoXP51NKSoqKiorq7KV2uVzyeDzas2dPUAdLp/a7YcMGDR8+/Izb5efnB90T4lTNNcJxppB0+mNog9hyUieMnO581g8//GB99NFHVkVFhYHK4KSKigrro48+sn744QfTpaCFcWrgpFNq6j255sbW68R+nR4H4fT3Ilx+Jk7UrAammlCfEMKBqvnhvUV9HT9+3MrPz7dWrFhh5efnN2ogX1PMsLCz3hovvPBCrbqTk5MbfXB0Yr9OBQWnag63WTcnI4Q0EiGkZeK9RX3UdcDxeDwNPuA4PcPC7npP5ES4cWq/ToWmGnbWHG6zbk7WrGbHAECoqFmYyjrp/H/NwlS5ublBn6t3cuCkE/WeyO1227KyZlPsNzMzU6NHj3ZsHISdNYfbrBunMULPIT6fTxs2bNDKlSu1YcOGsJzum5KSopycnHpvv2HDBrlcLh08eNCxmgAn+Hw+ZWdn1zkAsaZt2rRpQX+OnZph4VS94awmKIwfP17Dhg0LuZlHNZpi1k04IYQ4wKklhE/F5XKd9nb//fc3aL/vv/++br/99npvP3ToUBUXFysuLq5BzweYEsx6E8FIT0+Xx+M55Sw7l8ul5ORkpaenh0S9cJ5TPxPhihBiMxPXGiguLvbfcnJyFBsbG9A2Y8YM/7bW/y3EVh9du3ZVTExMveuIjIxUQkIC05rhFy49gk51kdcsICXVvuBXYxaQoks/fDn1MxGuCCFnYFmWKioq6nUrLy/X3Xfffdou0uzsbJWXl9drf3Xtpy4JCQn+W1xcnFwul//+xx9/rPbt2+uVV17RwIEDFRUVpbfeekufffaZRo8erfj4eLVr106DBw/Wa6+9FrDfk0/HuFwu/fd//7euu+46xcTEqHfv3nrxxRf9Xz/5dMzy5cvVoUMHvfrqq+rbt6/atWunkSNHBvxiPH78uO6++2516NBBnTt31syZMzVp0iSNGTOmnu8QQpWTPYJ2hxsnu8hrFpBKSkoKaPd4PA0et0GXfnhz4mcibNkyvDWMBDs75vDhw/UayezE7fDhw0G/vmXLlllxcXH++zUjsfv162f961//snbv3m1988031rZt26ynnnrK2rFjh/XJJ59Yc+bMsdq0aeO/eKBlWVaPHj2sxx57zH9f/zfyfsWKFdann35q3X333Va7du2sb775JuC5vvvuO38trVu3tkaMGGG9//771ubNm62+fftaEyZM8O/zt7/9rdWpUyfL6/VaO3futO644w4rNjbWGj16dNCv/XSYHdO0nFwHwYkZIU1x3Q0npv46fZ0QOMupGUhOYopuI7XUELJ27dozPvaCCy6wnnjiCf/9ukLInDlzan1vXnnllYDnOjGESLJ2797tf8ySJUus+Ph4//34+HjrkUce8d8/fvy4ddZZZxFCwlg4XjH1xH07td6E3cKtXjQPdocQTsecQUxMjA4fPlyv28svv1yvfb788sv12l8w4zHOZNCgQQH3Dx8+rBkzZqhv377q0KGD2rVrp507d2rv3r2n3U+/fv38/2/btq1iY2O1f//+U24fExOjs88+238/MTHRv31ZWZlKS0s1ZMgQ/9fdbrcGDhwY1GtDaHFq0KTTM0LCrYs83OoF6sI6IWfgcrnUtm3bem179dVXy+PxnPFaA1dffXWTDzo6+TXMmDFD69ev16OPPqpzzjlH0dHRysrK0tGjR0+7n9atWwfcd7lcqqqqCmr7ur43aD7C8YqpNZxeb8Ju4VYvcDJCiI3C6VLKb7/9tm6++WZdd911kqp7Rr744osmrSEuLk7x8fF6//33dfnll0uq/mt3y5YtGjBgQJPWAvuE4xVTT+TUIl1OCbd6gRNxOsZm4dJF2rt3b3m9Xm3btk3bt2/XhAkTTtuj4ZSpU6dqwYIF+sc//qFdu3YpOztb3333HdN8w5hT6yAwIwRofgghDsjMzNQXX3yh/Px8rVixQvn5+dqzZ0/IBBBJWrhwoTp27KihQ4dq1KhRysjI0CWXXNLkdcycOVPjx4/XxIkTlZaWpnbt2ikjI0Nt2rRp8lpgD6fWQWCRJ6D5cVkt7AR9eXm54uLiVFZWptjY2ICvHTlyRHv27FHPnj05CBpSVVWlvn376vrrr9dDDz1k2355b5ue1+tVdnZ2wDiO5ORk5eTkNDiQ1ywGKKnO052h1NsINEenO4Y2BGNCYNSXX36pf/3rX/rxj3+syspKLV68WHv27NGECRNMl9ai+Hw+2wc3OjFosuZ058nhxuPxNCrcADCDEAKjIiIitHz5cs2YMUOWZenCCy/Ua6+9pr59+5ourcWoq8fC4/Fo0aJFjT6oh+MVUwE0HUIIjEpOTtbbb79tuowWy+nLwTuFGSFA88DAVKCF4nLwAEwjhAAtFJeDB2AaIQRoobgcPADTCCFAC8XiXwBMI4QALRSLfwEwjRACtFBOrWwKAPVFCHGKzydt2CCtXFn9b4jPMBg2bJimTZvmv5+SkqKcnJzTPsblcmnt2rWNfm679oPghcu1jgA0T6wT4gSvV8rOlk6ceeDxSIsWSQ78Uh81apSOHTumdevW1fpaQUGBLr/8cm3fvl39+vWr9z7ff/99tW3b1s4ydf/992vt2rXatm1bQHtxcbE6duxo63Oh/lj8C4AphBC7eb1SVpZ08toLRUXV7bm5tgeRW265RWPHjtW+ffvk8XgCvrZs2TINGjQoqAAiSV27drWzxNNKSEhosudC3Vj8C4AJnI45E8uSKirqdysvl+6+u3YAqdmPVN1DUl5ev/3V89qCP/3pT9W1a1ctX748oP3w4cNavXq1xowZo/HjxyspKUkxMTG66KKLtHLlytPu8+TTMZ9++qkuv/xytWnTRueff77Wr19f6zEzZ87Uueeeq5iYGPXq1Utz587VsWPHJEnLly/XAw88oO3bt8vlcsnlcvnrPfl0zI4dO3TFFVcoOjpanTt31u23367Dhw/7v37zzTdrzJgxevTRR5WYmKjOnTtrypQp/ucCAIQHekLO5PvvpXbt7NmXZVWfoomLq9/2hw9L9Tgl0qpVK02cOFHLly/X7Nmz/YMKV69eLZ/Pp1/84hdavXq1Zs6cqdjYWL300ku66aabdPbZZ2vIkCFn3H9VVZUyMzMVHx+v9957T2VlZQHjR2q0b99ey5cvV/fu3bVjxw7ddtttat++vX79619r3Lhx+vDDD7Vu3Tq99tprkqS4Or4PFRUVysjIUFpamt5//33t379ft956q+66666AkJWfn6/ExETl5+dr9+7dGjdunAYMGKDbbrvtjK8HABAa6AlpJn75y1/qs88+0xtvvOFvW7ZsmcaOHasePXpoxowZGjBggHr16qWpU6dq5MiR+vvf/16vfb/22mv6+OOP9eyzz6p///66/PLLNX/+/FrbzZkzR0OHDlVKSopGjRqlGTNm+J8jOjpa7dq1U6tWrZSQkKCEhARFR0fX2seKFSt05MgRPfvss7rwwgt1xRVXaPHixXruuedUWlrq365jx45avHixzjvvPP30pz/VT37yE+Xl5QX7bQMAGERPyJnExFT3SNTHm29K11575u1eflm6/PL6PXc9nXfeeRo6dKiefvppDRs2TLt371ZBQYEefPBB+Xw+zZ8/X3//+99VVFSko0ePqrKyUjH13P/OnTuVnJys7t27+9vS0tJqbbdq1So9/vjj+uyzz3T48GEdP35csbGx9X4NNc/Vv3//gEGxl112maqqqrRr1y7Fx8dLki644IKAgZOJiYnasWNHUM8FADCLnpAzcbmqT4nU53b11dWzYE6x+JNcLik5uXq7+uzvVPs5hVtuuUUvvPCCDh06pGXLlunss8/Wj3/8Yz3yyCNatGiRZs6cqfz8fG3btk0ZGRk6evSoDd+gahs3btSNN96oa6+9Vv/85z+1detWzZ4929bnOFHr1q0D7rtcLlVVVTnyXAAAZxBC7OR2V0/DlWoHiJr7OTnV2zng+uuvV0REhFasWKFnn31Wv/zlL+VyufT2229r9OjR+sUvfqH+/furV69e+uSTT+q93759+6qwsDDgGiLvvvtuwDbvvPOOevToodmzZ2vQoEHq3bu3vvzyy4BtIiMjz3hF1r59+2r79u2qqKjwt7399tuKiIhQnz596l0zACD0EULslplZPQ33pMWf5PE4Mj33RO3atdO4ceM0a9YsFRcX6+abb5Yk9e7dW+vXr9c777yjnTt36le/+lXA+IozGTFihM4991xNmjRJ27dvV0FBgWbPnh2wTe/evbV37149//zz+uyzz/T4449rzZo1AdukpKRoz5492rZtmw4cOKDKyspaz3XjjTeqTZs2mjRpkj788EPl5+dr6tSpuummm/ynYgAAzQMhxAmZmdIXX0j5+dKKFdX/7tnjaACpccstt+i7775TRkaGfwzHnDlzdMkllygjI0PDhg1TQkKCxowZU+99RkREaM2aNfrhhx80ZMgQ3Xrrrfrd734XsM3PfvYz3XPPPbrrrrs0YMAAvfPOO5o7d27ANmPHjtXIkSM1fPhwde3atc5pwjExMXr11Vf17bffavDgwcrKytKVV16pxYsXB//NaIZ8Pp82bNiglStXasOGDWfsWQKAUOayrHouRtFMlJeXKy4uTmVlZbUGTR45ckR79uxRz5491aZNG0MVwglN/d76fD7bVyD1er3Kzs7WvhNW4vV4PFq0aBHLqwNoEqc7hjYEPSGAzbxer1JSUjR8+HBNmDBBw4cPV0pKirxeb6P2mZWVFRBAJKmoqEhZWVmN2jcAmEIIAWzkRFjw+XzKzs5WXZ2WNW3Tpk3j1AyAsEMIAWziVFgoKCioFWpO3ndhYaEKCgqCKxgADCOEADZxKiycODXaju0AIFQQQurQwsbqtghN8Z46FRYSExNt3Q4AQgUh5AQ1q3B+//33hiuB3Wre05NXWrWTU2EhPT1dHo/Hf2HCk7lcLiUnJys9PT2o/QKAaVw75gRut1sdOnTQ/v37JVWvWXGqX/wID5Zl6fvvv9f+/fvVoUOHRk+TPZ2asFBUVFRnz4vL5ZLH4wk6LLjdbi1atEhZWVlyuVwB+675+czJyXH0tQGAEwghJ0lISJAkfxBB89ChQwf/e+sUJ8NCZmamcnNz61wnJCcnh3VCAIQlFis7BZ/Pp2PHjjVhZXBK69at6zzwO7GgmFT3omLJycm2hAWnagaA+rB7sTJCCFokp1cfJSwAaI4IIY1ECEHNgmIn/+jXnDLJzc3l9AYA1IFl24FGYPVRAAgdhBC0KKw+CgChgxCCFoXVRwEgdBBC0KKw+igAhA5CCFoUVh8FgNBBCEGLUrOgmKRaQYTVRwGgaRFC0OLUrD6alJQU0O7xeJieCwBNiHVC0GKxoBgABMfuYyjXjkGL5Xa7NWzYMNNlAECLxekYAABgBD0hCHmcNgGA5okQgpDm9IXmAADmcDoGIavmQnMnL7NeVFSkrKwseb1eQ5UBAOxACEFI4kJzAND8EUIQkrjQHAA0f4QQhCQuNAcAzR8hBCGJC80BQPNHCEFI4kJzAND8EUIQkrjQHAA0f4QQhCwuNAcAzRsXsEPIY8VUAAgNXMAOLQ4XmgOA5onTMQAAwAhCCAAAMIIQAgAAjCCEAAAAIwghAADACEIIAAAwghACAACMIIQAAAAjCCEAAMAI4yFkyZIlSklJUZs2bZSamqpNmzadcttjx47pwQcf1Nlnn602bdqof//+WrduXRNWCwAA7GI0hKxatUrTp0/XvHnztGXLFvXv318ZGRnav39/ndvPmTNHf/rTn/TEE0/oo48+0h133KHrrrtOW7dubeLKAQBAYxm9gF1qaqoGDx6sxYsXS5KqqqqUnJysqVOn6t577621fffu3TV79mxNmTLF3zZ27FhFR0frr3/9a72ekwvYAQDQMHYfQ431hBw9elSbN2/WiBEj/lNMRIRGjBihjRs31vmYyspKtWnTJqAtOjpab7311imfp7KyUuXl5QE3AABgnrEQcuDAAfl8PsXHxwe0x8fHq6SkpM7HZGRkaOHChfr0009VVVWl9evXy+v1qri4+JTPs2DBAsXFxflvycnJtr4OAADQMMYHpgZj0aJF6t27t8477zxFRkbqrrvu0uTJkxURceqXMWvWLJWVlflvhYWFTVgxAAA4lVamnrhLly5yu90qLS0NaC8tLVVCQkKdj+natavWrl2rI0eO6JtvvlH37t117733qlevXqd8nqioKEVFRdlaO+rm8/lUUFCg4uJiJSYmKj09XW6323RZAIAQZawnJDIyUgMHDlReXp6/raqqSnl5eUpLSzvtY9u0aaOkpCQdP35cL7zwgkaPHu10uTgDr9erlJQUDR8+XBMmTNDw4cOVkpIir9drujQAQIgyejpm+vTp+stf/qJnnnlGO3fu1J133qmKigpNnjxZkjRx4kTNmjXLv/17770nr9erzz//XAUFBRo5cqSqqqr061//2tRLgKoDSFZWlvbt2xfQXlRUpKysLIIIAKBOxk7HSNK4ceP09ddf67777lNJSYkGDBigdevW+Qer7t27N2C8x5EjRzRnzhx9/vnnateuna699lo999xz6tChg6FXAJ/Pp+zsbNU109uyLLlcLk2bNk2jR4/m1AwA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VFFRocmTJ0uSJk6cqKSkJC1YsECS9OCDD+rSSy/VOeeco4MHD+qRRx7Rl19+qVtvvdXkywAAAEEyHkLGjRunr7/+Wvfdd59KSko0YMAArVu3zj9Yde/evQHdPt99951uu+02lZSUqGPHjho4cKDeeecdnX/++aZegqKiojRv3rxap30Q+njvwhfvXfjivQtfdr93LsuueTYAAABBML5YGQAAaJkIIQAAwAhCCAAAMIIQAgAAjCCE2GDJkiVKSUlRmzZtlJqaqk2bNpkuCWdw//33y+VyBdzOO+8802WhDm+++aZGjRql7t27y+Vyae3atQFftyxL9913nxITExUdHa0RI0bo008/NVMsApzpvbv55ptrfQ5HjhxpplgEWLBggQYPHqz27durW7duGjNmjHbt2hWwzZEjRzRlyhR17txZ7dq109ixY2stPnomhJBGWrVqlaZPn6558+Zpy5Yt6t+/vzIyMrR//37TpeEMLrjgAhUXF/tvb731lumSUIeKigr1799fS5YsqfPrDz/8sB5//HE99dRTeu+999S2bVtlZGToyJEjTVwpTnam906SRo4cGfA5XLlyZRNWiFN54403NGXKFL377rtav369jh07pquvvloVFRX+be655x79z//8j1avXq033nhDX331lTIzM4N7IguNMmTIEGvKlCn++z6fz+revbu1YMECg1XhTObNm2f179/fdBkIkiRrzZo1/vtVVVVWQkKC9cgjj/jbDh48aEVFRVkrV640UCFO5eT3zrIsa9KkSdbo0aON1IPg7N+/35JkvfHGG5ZlVX/OWrduba1evdq/zc6dOy1J1saNG+u9X3pCGuHo0aPavHmzRowY4W+LiIjQiBEjtHHjRoOVoT4+/fRTde/eXb169dKNN96ovXv3mi4JQdqzZ49KSkoCPoNxcXFKTU3lMxgmNmzYoG7duqlPnz6688479c0335guCXUoKyuTJP+F6zZv3qxjx44FfPbOO+88nXXWWUF99gghjXDgwAH5fD7/6q414uPjVVJSYqgq1EdqaqqWL1+udevW6cknn9SePXuUnp6uQ4cOmS4NQaj5nPEZDE8jR47Us88+q7y8PP3+97/XG2+8oWuuuUY+n890aThBVVWVpk2bpssuu0wXXnihpOrPXmRkZK0Lwgb72TO+bDtgwjXXXOP/f79+/ZSamqoePXro73//u2655RaDlQEtxw033OD//0UXXaR+/frp7LPP1oYNG3TllVcarAwnmjJlij788ENHxs3RE9IIXbp0kdvtrjUauLS0VAkJCYaqQkN06NBB5557rnbv3m26FASh5nPGZ7B56NWrl7p06cLnMITcdddd+uc//6n8/Hx5PB5/e0JCgo4ePaqDBw8GbB/sZ48Q0giRkZEaOHCg8vLy/G1VVVXKy8tTWlqawcoQrMOHD+uzzz5TYmKi6VIQhJ49eyohISHgM1heXq733nuPz2AY2rdvn7755hs+hyHAsizdddddWrNmjV5//XX17Nkz4OsDBw5U69atAz57u3bt0t69e4P67HE6ppGmT5+uSZMmadCgQRoyZIhycnJUUVGhyZMnmy4NpzFjxgyNGjVKPXr00FdffaV58+bJ7XZr/PjxpkvDSQ4fPhzwl/GePXu0bds2derUSWeddZamTZum3/72t+rdu7d69uypuXPnqnv37hozZoy5oiHp9O9dp06d9MADD2js2LFKSEjQZ599pl//+tc655xzlJGRYbBqSNWnYFasWKF//OMfat++vX+cR1xcnKKjoxUXF6dbbrlF06dPV6dOnRQbG6upU6cqLS1Nl156af2fyO5pPC3RE088YZ111llWZGSkNWTIEOvdd981XRLOYNy4cVZiYqIVGRlpJSUlWePGjbN2795tuizUIT8/35JU6zZp0iTLsqqn6c6dO9eKj4+3oqKirCuvvNLatWuX2aJhWdbp37vvv//euvrqq62uXbtarVu3tnr06GHddtttVklJiemyYVl1vm+SrGXLlvm3+eGHH6z/+q//sjp27GjFxMRY1113nVVcXBzU87j+78kAAACaFGNCAACAEYQQAABgBCEEAAAYQQgBAABGEEIAAIARhBAAAGAEIQQAABhBCAEAAEYQQgA0Cy6XS2vXrjVdBoAgEEIANNrNN98sl8tV6zZy5EjTpQEIYVzADoAtRo4cqWXLlgW0RUVFGaoGQDigJwSALaKiopSQkBBw69ixo6TqUyVPPvmkrrnmGkVHR6tXr17Kzc0NePyOHTt0xRVXKDo6Wp07d9btt9+uw4cPB2zz9NNP64ILLlBUVJQSExN11113BXz9wIEDuu666xQTE6PevXvrxRdfdPZFA2gUQgiAJjF37lyNHTtW27dv14033qgbbrhBO3fulCRVVFQoIyNDHTt21Pvvv6/Vq1frtddeCwgZTz75pKZMmaLbb79dO3bs0Isvvqhzzjkn4DkeeOABXX/99frggw907bXX6sYbb9S3337bpK8TQBBsvfYvgBZp0qRJltvtttq2bRtw+93vfmdZVvVlwe+4446Ax6Smplp33nmnZVmW9ec//9nq2LGjdfjwYf/XX3rpJSsiIsJ/affu3btbs2fPPmUNkqw5c+b47x8+fNiSZL3yyiu2vU4A9mJMCABbDB8+XE8++WRAW6dOnfz/T0tLC/haWlqatm3bJknauXOn+vfvr7Zt2/q/ftlll6mqqkq7du2Sy+XSV199pSuvvPK0NfTr18///7Zt2yo2Nlb79+9v6EsC4DBCCABbtG3bttbpEbtER0fXa7vWrVsH3He5XKqqqnKiJAA2YEwIgCbx7rvv1rrft29fSVLfvn21fft2VVRU+L/+9ttvKyIiQn369FH79u2VkpKivLy8Jq0ZgLPoCQFgi8rKSpWUlAS0tWrVSl26dJEkrV69WoMGDdKPfvQj/e1vf9OmTZu0dOlSSdKNN96oefPmadKkSbr//vv19ddfa+rUqbrpppsUHx8vSbr//vt1xx13qFu3brrmmmt06NAhvf3225o6dWrTvlAAtiGEALDFunXrlJiYGNDWp08fffzxx5KqZ648//zz+q//+i8lJiZq5cqVOv/88yVJMTExevXVV5Wdna3BgwcrJiZGY8eO1cKFC/37mjRpko4cOaLHHntMM2bMUJcuXZSVldV0LxCA7VyWZVmmiwDQvLlcLq1Zs0ZjxowxXQqAEMKYEAAAYAQhBAAAGMGYEACO46wvgLrQEwIAAIwghAAAACMIIQAAwAhCCAAAMIIQAgAAjCCEAAAAIwghAADACEIIAAAw4v8DkicCELGJmswAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "lstm_results = pd.read_csv(lstm_logger.experiment.metrics_file_path)\n", "fig, ax = subplots(1, 1, figsize=(6, 6))\n", @@ -3617,8 +4278,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "200a23cf", + "execution_count": 93, + "id": "dbae5960", "metadata": { "lines_to_next_cell": 2 }, @@ -3634,7 +4295,7 @@ }, { "cell_type": "markdown", - "id": "a9e7da2f", + "id": "5d8a3c8f", "metadata": {}, "source": [ "### Time Series Prediction\n", @@ -3645,8 +4306,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "def12326", + "execution_count": 94, + "id": "023c7d14", "metadata": {}, "outputs": [], "source": [ @@ -3661,7 +4322,7 @@ }, { "cell_type": "markdown", - "id": "3024f29a", + "id": "03d5171b", "metadata": {}, "source": [ "Next we set up the lagged versions of the data, dropping\n", @@ -3670,8 +4331,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "44d90fb9", + "execution_count": 95, + "id": "24aa4a0a", "metadata": {}, "outputs": [], "source": [ @@ -3686,7 +4347,7 @@ }, { "cell_type": "markdown", - "id": "b47698d6", + "id": "e2a02e25", "metadata": {}, "source": [ "Finally, we extract the response, training indicator, and drop the current day’s `DJ_return` and\n", @@ -3695,12 +4356,27 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "84957b3a", + "execution_count": 96, + "id": "5f0a4c0e", "metadata": { "lines_to_next_cell": 2 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['DJ_return_1', 'log_volume_1', 'log_volatility_1', 'DJ_return_2',\n", + " 'log_volume_2', 'log_volatility_2', 'DJ_return_3', 'log_volume_3',\n", + " 'log_volatility_3', 'DJ_return_4', 'log_volume_4', 'log_volatility_4',\n", + " 'DJ_return_5', 'log_volume_5', 'log_volatility_5'],\n", + " dtype='object')" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "Y, train = X['log_volume'], X['train']\n", "X = X.drop(columns=['train'] + cols)\n", @@ -3709,7 +4385,7 @@ }, { "cell_type": "markdown", - "id": "c25f2e20", + "id": "6bc66b8e", "metadata": {}, "source": [ "We first fit a simple linear model and compute the $R^2$ on the test data using\n", @@ -3718,10 +4394,21 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "0573692b", + "execution_count": 97, + "id": "4ec80811", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0.4128912938562521" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "M = LinearRegression()\n", "M.fit(X[train], Y[train])\n", @@ -3730,7 +4417,7 @@ }, { "cell_type": "markdown", - "id": "7c5435a5", + "id": "3053ae12", "metadata": {}, "source": [ "We refit this model, including the factor variable `day_of_week`.\n", @@ -3740,21 +4427,21 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "5e9935fc", + "execution_count": 98, + "id": "ec2de6ca", "metadata": { "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "X_day = pd.merge(X, \n", - " pd.get_dummies(NYSE['day_of_week']),\n", - " on='date')" + "X_day = pd.concat([X, \n", + " pd.get_dummies(NYSE['day_of_week'])],\n", + " axis=1).dropna()" ] }, { "cell_type": "markdown", - "id": "a4c2da04", + "id": "765b70b4", "metadata": {}, "source": [ " Note that we do not have\n", @@ -3764,12 +4451,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "97c2ee18", + "execution_count": 99, + "id": "8ff00b65", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0.4595563133053273" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "M.fit(X_day[train], Y[train])\n", "M.score(X_day[~train], Y[~train])" @@ -3777,7 +4475,7 @@ }, { "cell_type": "markdown", - "id": "700625bd", + "id": "88374112", "metadata": {}, "source": [ "This model achieves an $R^2$ of about 46%." @@ -3785,7 +4483,7 @@ }, { "cell_type": "markdown", - "id": "d1b2345f", + "id": "f2160545", "metadata": {}, "source": [ "To fit the RNN, we must reshape the data, as it will expect 5 lagged\n", @@ -3805,12 +4503,27 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "df5e92ea", + "execution_count": 100, + "id": "08107439", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['DJ_return_5', 'log_volume_5', 'log_volatility_5', 'DJ_return_4',\n", + " 'log_volume_4', 'log_volatility_4', 'DJ_return_3', 'log_volume_3',\n", + " 'log_volatility_3', 'DJ_return_2', 'log_volume_2', 'log_volatility_2',\n", + " 'DJ_return_1', 'log_volume_1', 'log_volatility_1'],\n", + " dtype='object')" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "ordered_cols = []\n", "for lag in range(5,0,-1):\n", @@ -3822,7 +4535,7 @@ }, { "cell_type": "markdown", - "id": "09de0720", + "id": "d7f38634", "metadata": {}, "source": [ "We now reshape the data." @@ -3830,12 +4543,23 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "ca704cd6", + "execution_count": 101, + "id": "1776f3d2", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(6046, 5, 3)" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "X_rnn = X.to_numpy().reshape((-1,5,3))\n", "X_rnn.shape" @@ -3843,7 +4567,7 @@ }, { "cell_type": "markdown", - "id": "0a90aa0a", + "id": "385f3387", "metadata": {}, "source": [ "By specifying the first size as -1, `numpy.reshape()` deduces its size based on the remaining arguments.\n", @@ -3857,8 +4581,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "a6b2bfa8", + "execution_count": 102, + "id": "355e86eb", "metadata": {}, "outputs": [], "source": [ @@ -3879,7 +4603,7 @@ }, { "cell_type": "markdown", - "id": "0e784307", + "id": "e3abd764", "metadata": {}, "source": [ "We fit the model in a similar fashion to previous networks. We\n", @@ -3894,8 +4618,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "dbcd92b7", + "execution_count": 103, + "id": "72ab9a66", "metadata": {}, "outputs": [], "source": [ @@ -3909,7 +4633,7 @@ }, { "cell_type": "markdown", - "id": "ecf915fb", + "id": "b81c1f1e", "metadata": {}, "source": [ "Following our usual pattern, we inspect the summary." @@ -3917,12 +4641,40 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "3fd92eeb", + "execution_count": 104, + "id": "1c10263b", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "===================================================================================================================\n", + "Layer (type:depth-idx) Input Shape Output Shape Param #\n", + "===================================================================================================================\n", + "NYSEModel [1770, 5, 3] [1770] --\n", + "├─RNN: 1-1 [1770, 5, 3] [1770, 5, 12] 204\n", + "├─Dropout: 1-2 [1770, 12] [1770, 12] --\n", + "├─Linear: 1-3 [1770, 12] [1770, 1] 13\n", + "===================================================================================================================\n", + "Total params: 217\n", + "Trainable params: 217\n", + "Non-trainable params: 0\n", + "Total mult-adds (Units.MEGABYTES): 1.83\n", + "===================================================================================================================\n", + "Input size (MB): 0.11\n", + "Forward/backward pass size (MB): 0.86\n", + "Params size (MB): 0.00\n", + "Estimated Total Size (MB): 0.97\n", + "===================================================================================================================" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "summary(nyse_model,\n", " input_data=X_rnn_t,\n", @@ -3933,7 +4685,7 @@ }, { "cell_type": "markdown", - "id": "aca8f98a", + "id": "0ba24d5c", "metadata": {}, "source": [ "We again put the two datasets into a data module, with a\n", @@ -3942,8 +4694,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "02080bf5", + "execution_count": 105, + "id": "c36032ef", "metadata": { "lines_to_next_cell": 0 }, @@ -3958,7 +4710,7 @@ }, { "cell_type": "markdown", - "id": "444a450f", + "id": "719a7cf8", "metadata": {}, "source": [ "We run some data through our model to be sure the sizes match up correctly." @@ -3966,10 +4718,20 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "403bc22a", + "execution_count": 106, + "id": "90df0c75", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "torch.Size([64]) torch.Size([64])\n", + "torch.Size([64]) torch.Size([64])\n", + "torch.Size([64]) torch.Size([64])\n" + ] + } + ], "source": [ "for idx, (x, y) in enumerate(nyse_dm.train_dataloader()):\n", " out = nyse_model(x)\n", @@ -3980,7 +4742,7 @@ }, { "cell_type": "markdown", - "id": "cc099ff8", + "id": "a85106c8", "metadata": {}, "source": [ "We follow our previous example for setting up a trainer for a\n", @@ -3990,8 +4752,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "e3a71b32", + "execution_count": 107, + "id": "064fcd0d", "metadata": {}, "outputs": [], "source": [ @@ -4004,7 +4766,7 @@ }, { "cell_type": "markdown", - "id": "28411abb", + "id": "cf9a430a", "metadata": {}, "source": [ "Fitting the model should by now be familiar.\n", @@ -4013,12 +4775,67 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "744fd6e1", + "execution_count": 108, + "id": "95ff00af", "metadata": { "lines_to_next_cell": 2 }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "GPU available: True (mps), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "IPU available: False, using: 0 IPUs\n", + "HPU available: False, using: 0 HPUs\n", + "\n", + " | Name | Type | Params\n", + "------------------------------------\n", + "0 | model | NYSEModel | 217 \n", + "1 | loss | MSELoss | 0 \n", + "------------------------------------\n", + "217 Trainable params\n", + "0 Non-trainable params\n", + "217 Total params\n", + "0.001 Total estimated model params size (MB)\n", + "`Trainer.fit` stopped: `max_epochs=200` reached.\n" + ] + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃        Test metric               DataLoader 0        ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│         test_loss              0.616382360458374     │\n",
+       "│          test_r2              0.4150230884552002     │\n",
+       "└───────────────────────────┴───────────────────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│\u001b[36m \u001b[0m\u001b[36m test_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.616382360458374 \u001b[0m\u001b[35m \u001b[0m│\n", + "│\u001b[36m \u001b[0m\u001b[36m test_r2 \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4150230884552002 \u001b[0m\u001b[35m \u001b[0m│\n", + "└───────────────────────────┴───────────────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[{'test_loss': 0.616382360458374, 'test_r2': 0.4150230884552002}]" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "nyse_trainer = Trainer(deterministic=True,\n", " max_epochs=200,\n", @@ -4032,7 +4849,7 @@ }, { "cell_type": "markdown", - "id": "66ffb484", + "id": "8a0fb76e", "metadata": {}, "source": [ "We could also fit a model without the `nn.RNN()` layer by just\n", @@ -4048,8 +4865,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "9b93ef81", + "execution_count": 109, + "id": "6b1b56fc", "metadata": {}, "outputs": [], "source": [ @@ -4064,7 +4881,7 @@ }, { "cell_type": "markdown", - "id": "5eb73e7d", + "id": "75ea59a7", "metadata": {}, "source": [ "Creating a data module follows a familiar pattern." @@ -4072,8 +4889,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "84373f9e", + "execution_count": 110, + "id": "10c70d0a", "metadata": {}, "outputs": [], "source": [ @@ -4086,7 +4903,7 @@ }, { "cell_type": "markdown", - "id": "e9e77ecf", + "id": "9c2a76bb", "metadata": {}, "source": [ "We build a `NonLinearARModel()` that takes as input the 20 features and a hidden layer with 32 units. The remaining steps are familiar." @@ -4094,8 +4911,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8013a469", + "execution_count": 111, + "id": "42fca594", "metadata": {}, "outputs": [], "source": [ @@ -4113,8 +4930,8 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "1619551d", + "execution_count": 112, + "id": "9a134064", "metadata": {}, "outputs": [], "source": [ @@ -4128,7 +4945,7 @@ }, { "cell_type": "markdown", - "id": "5c9c9ea7", + "id": "2ac1a2df", "metadata": {}, "source": [ "We continue with the usual training steps, fit the model,\n", @@ -4137,12 +4954,67 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "636b34f2", + "execution_count": 113, + "id": "0591bf1d", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "GPU available: True (mps), used: True\n", + "TPU available: False, using: 0 TPU cores\n", + "IPU available: False, using: 0 IPUs\n", + "HPU available: False, using: 0 HPUs\n", + "\n", + " | Name | Type | Params\n", + "-------------------------------------------\n", + "0 | model | NonLinearARModel | 705 \n", + "1 | loss | MSELoss | 0 \n", + "-------------------------------------------\n", + "705 Trainable params\n", + "0 Non-trainable params\n", + "705 Total params\n", + "0.003 Total estimated model params size (MB)\n", + "`Trainer.fit` stopped: `max_epochs=20` reached.\n" + ] + }, + { + "data": { + "text/html": [ + "
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃        Test metric               DataLoader 0        ┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│         test_loss             0.5626183152198792     │\n",
+       "│          test_r2              0.4660477638244629     │\n",
+       "└───────────────────────────┴───────────────────────────┘\n",
+       "
\n" + ], + "text/plain": [ + "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", + "┃\u001b[1m \u001b[0m\u001b[1m Test metric \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m DataLoader 0 \u001b[0m\u001b[1m \u001b[0m┃\n", + "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", + "│\u001b[36m \u001b[0m\u001b[36m test_loss \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.5626183152198792 \u001b[0m\u001b[35m \u001b[0m│\n", + "│\u001b[36m \u001b[0m\u001b[36m test_r2 \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m 0.4660477638244629 \u001b[0m\u001b[35m \u001b[0m│\n", + "└───────────────────────────┴───────────────────────────┘\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "[{'test_loss': 0.5626183152198792, 'test_r2': 0.4660477638244629}]" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "nl_trainer = Trainer(deterministic=True,\n", " max_epochs=20,\n", @@ -4154,7 +5026,7 @@ }, { "cell_type": "markdown", - "id": "bdf8fccd", + "id": "1bf8c38e", "metadata": {}, "source": [ " \n",