diff --git a/colab/chap01.ipynb b/colab/chap01.ipynb index 7a39ec16c..a385d9221 100644 --- a/colab/chap01.ipynb +++ b/colab/chap01.ipynb @@ -1,532 +1,890 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Jupyter\n", - "\n", - "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", - "\n", - "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Selecting and running cells\n", - "\n", - "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", - "\n", - "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", - "\n", - "To run a cell, hold down SHIFT and press ENTER. \n", - "\n", - "* If you run a text cell, Jupyter formats the text and displays the result.\n", - "\n", - "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", - "\n", - "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Adding and removing cells\n", - "\n", - "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", - "\n", - "Try the following exercises:\n", - "\n", - "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", - "\n", - "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", - "\n", - "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", - "\n", - "4. In the new cell, type some text, and then run it.\n", - "\n", - "5. Use the arrow buttons in the toolbar to move cells up and down.\n", - "\n", - "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", - "\n", - "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", - "\n", - "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Installing modules\n", - "\n", - "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", - "\n", - "They also use two less common modules: Pint, which provides units, and `modsimpy`, which contains code I wrote specifically for this book.\n", - "\n", - "The following cells check whether you have these modules already and tries to install them if you don't." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n", - "\n", - "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n", - "\n", - "You can find out what version of Python and Jupyter you have by running the following cells." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "!python --version" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "!jupyter-notebook --version" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## The penny myth\n", - "\n", - "The following cells contain code from the beginning of Chapter 1.\n", - "\n", - "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n", - "\n", - "The following lines create new variables named `meter` and `second`." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "meter = UNITS.meter" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "second = UNITS.second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a variable named `a` and give it the value of acceleration due to gravity." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "a = 9.8 * meter / second**2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create `t` and give it the value 4 seconds." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "t = 4 * second" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "a * t**2 / 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", - "\n", - "1. Start from the bottom and read up.\n", - "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", - "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", - "\n", - "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", - "\n", - "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Falling pennies\n", - "\n", - "Now let's solve the falling penny problem.\n", - "\n", - "Set `h` to the height of the Empire State Building:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "h = 381 * meter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Compute the time it would take a penny to fall, assuming constant acceleration.\n", - "\n", - "$ a t^2 / 2 = h $\n", - "\n", - "$ t = \\sqrt{2 h / a}$" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "t = sqrt(2 * h / a)\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given `t`, we can compute the velocity of the penny when it lands.\n", - "\n", - "$v = a t$" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "v = a * t\n", - "v" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can convert from one set of units to another like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "mile = UNITS.mile\n", - "hour = UNITS.hour" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "v.to(mile/hour)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", - "\n", - "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", - "\n", - "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n", - "\n", - "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n", - "\n", - "You can break this question into three parts:\n", - "\n", - "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n", - "2. How far would the penny fall during that time?\n", - "3. How long to fall the remaining distance with constant velocity 18 m/s?\n", - "\n", - "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Restart and run all\n", - "\n", - "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", - "\n", - "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", - "\n", - "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap01.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "OzGdJy9CoSjm" + }, + "source": [ + "# Chapter 1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "aGq99IikoSjn" + }, + "source": [ + "*Modeling and Simulation in Python* - Edit by Chun San Yip (7 June 2021)\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "z_kbjgvmoSjq" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bnkbKVIaoSjt" + }, + "source": [ + "## Jupyter\n", + "\n", + "Welcome to *Modeling and Simulation in Python*, and welcome to Jupyter.\n", + "\n", + "This is a Jupyter notebook, which is a development environment where you can write and run Python code. Each notebook is divided into cells. Each cell contains either text (like this cell) or Python code." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A_F3OefeoSju" + }, + "source": [ + "### Selecting and running cells\n", + "\n", + "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", + "\n", + "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", + "\n", + "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", + "\n", + "To run a cell, hold down SHIFT and press ENTER. \n", + "\n", + "* If you run a text cell, Jupyter formats the text and displays the result.\n", + "\n", + "* If you run a code cell, Jupyter runs the Python code in the cell and displays the result, if any.\n", + "\n", + "To try it out, edit this cell, change some of the text, and then press SHIFT-ENTER to format it." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-px6O_mooSjx" + }, + "source": [ + "### Adding and removing cells\n", + "\n", + "You can add and remove cells from a notebook using the buttons in the toolbar and the items in the menu, both of which you should see at the top of this notebook.\n", + "\n", + "Try the following exercises:\n", + "\n", + "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pulldown menu that says \"Code\".\n", + "\n", + "2. In the new cell, add a print statement like `print('Hello')`, and run it.\n", + "\n", + "3. Add another cell, select the new cell, and then click on the pulldown menu that says \"Code\" and select \"Markdown\". This makes the new cell a text cell.\n", + "\n", + "4. In the new cell, type some text, and then run it.\n", + "\n", + "5. Use the arrow buttons in the toolbar to move cells up and down.\n", + "\n", + "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", + "\n", + "7. As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", + "\n", + "8. Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zerXNqFsoSj0" + }, + "source": [ + "### Installing modules\n", + "\n", + "These notebooks use standard Python modules like NumPy and SciPy. I assume you already have them installed in your environment.\n", + "\n", + "They also use two less common modules: Pint, which provides units, and `modsimpy`, which contains code I wrote specifically for this book.\n", + "\n", + "The following cells check whether you have these modules already and tries to install them if you don't." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "_0vFQPawoSj2" + }, + "source": [ + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "sCvWFzFfoSj2" + }, + "source": [ + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gQCGjWeaoSj3" + }, + "source": [ + "The first time you run this on a new installation of Python, it might produce a warning message in pink. That's probably ok, but if you get a message that says `modsim.py depends on Python 3.7 features`, that means you have an older version of Python, and some features in `modsim.py` won't work correctly.\n", + "\n", + "If you need a newer version of Python, I recommend installing Anaconda. You'll find more information in the preface of the book.\n", + "\n", + "You can find out what version of Python and Jupyter you have by running the following cells." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "trFF44WeoSj4", + "outputId": "9f92f543-d712-46d1-d98e-c263d620bb4f" + }, + "source": [ + "!python --version" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Python 3.7.10\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2_Vu5cDfoSj5", + "outputId": "966521c8-9661-4d9f-8665-911591a2e44d" + }, + "source": [ + "!jupyter-notebook --version" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "5.2.2\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-8_DQC3opU_e" + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m20S6C9ZoSkA" + }, + "source": [ + "## The penny myth\n", + "\n", + "The following cells contain code from the beginning of Chapter 1.\n", + "\n", + "`modsim` defines `UNITS`, which contains variables representing pretty much every unit you've ever heard of. It uses [Pint](https://pint.readthedocs.io/en/latest/), which is a Python library that provides tools for computing with units.\n", + "\n", + "The following lines create new variables named `meter` and `second`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ba_iObTfoSkB" + }, + "source": [ + "meter = UNITS.meter" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "4hexcmG8oSkC" + }, + "source": [ + "second = UNITS.second" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ES7CSCsvoSkD" + }, + "source": [ + "To find out what other units are defined, type `UNITS.` (including the period) in the next cell and then press TAB. You should see a pop-up menu with a list of units." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6ZEFLQedoSkD" + }, + "source": [ + "" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "acfO_OayoSkD" + }, + "source": [ + "Create a variable named `a` and give it the value of acceleration due to gravity." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1M72SCL9oSkE" + }, + "source": [ + "a = 9.8 * meter / second**2" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b4j7NKBXoSkE" + }, + "source": [ + "Create `t` and give it the value 4 seconds." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IPEqFRvCoSkF" + }, + "source": [ + "t = 4 * second" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rzPmxRC3oSkF" + }, + "source": [ + "Compute the distance a penny would fall after `t` seconds with constant acceleration `a`. Notice that the units of the result are correct." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "78_yVeKYoSkF", + "outputId": "a2d2797e-e4d3-4ed5-c2a3-0cda3be0b3f0" + }, + "source": [ + "a * t**2 / 2" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$78.4\\ \\mathrm{meter}$", + "text/html": [ + "78.4 meter" + ], + "text/plain": [ + "78.4 meter" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-SwFHTWFoSkG" + }, + "source": [ + "**Exercise**: Compute the velocity of the penny after `t` seconds. Check that the units of the result are correct." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "P5ggIxGDoSkG" + }, + "source": [ + "# Solution goes here" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tfrYScO6oSkG" + }, + "source": [ + "**Exercise**: Why would it be nonsensical to add `a` and `t`? What happens if you try?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U9q48xkkoSkG" + }, + "source": [ + "The error messages you get from Python are big and scary, but if you read them carefully, they contain a lot of useful information.\n", + "\n", + "1. Start from the bottom and read up.\n", + "2. The last line usually tells you what type of error happened, and sometimes additional information.\n", + "3. The previous lines are a \"traceback\" of what was happening when the error occurred. The first section of the traceback shows the code you wrote. The following sections are often from Python libraries.\n", + "\n", + "In this example, you should get a `DimensionalityError`, which is defined by Pint to indicate that you have violated a rules of dimensional analysis: you cannot add quantities with different dimensions.\n", + "\n", + "Before you go on, you might want to delete the erroneous code so the notebook can run without errors." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H-0OiM4uoSkH" + }, + "source": [ + "## Falling pennies\n", + "\n", + "Now let's solve the falling penny problem.\n", + "\n", + "Set `h` to the height of the Empire State Building:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8Je-Q6j2oSkI" + }, + "source": [ + "h = 381 * meter" + ], + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GvZ8tOV5oSkI" + }, + "source": [ + "Compute the time it would take a penny to fall, assuming constant acceleration.\n", + "\n", + "$ a t^2 / 2 = h $\n", + "\n", + "$ t = \\sqrt{2 h / a}$" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "zCxPZ-lHoSkI", + "outputId": "dd41175a-a23d-4b16-c0e1-6ab6b44471df" + }, + "source": [ + "t = sqrt(2 * h / a)\n", + "t" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$8.817885349720552\\ \\mathrm{second}$", + "text/html": [ + "8.817885349720552 second" + ], + "text/plain": [ + "8.817885349720552 second" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VEeVOMjnoSkJ" + }, + "source": [ + "Given `t`, we can compute the velocity of the penny when it lands.\n", + "\n", + "$v = a t$" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "UGK075NEoSkJ", + "outputId": "df17a0fe-dfde-40cc-9b64-97b2758a94f0" + }, + "source": [ + "v = a * t\n", + "v" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$86.41527642726142\\ \\frac{\\mathrm{meter}}{\\mathrm{second}}$", + "text/html": [ + "86.41527642726142 meter/second" + ], + "text/plain": [ + "86.41527642726142 meter/second" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9qldAeyXoSkJ" + }, + "source": [ + "We can convert from one set of units to another like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "i272L4JHoSkJ" + }, + "source": [ + "mile = UNITS.mile\n", + "hour = UNITS.hour" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "Vnk8emljoSkK", + "outputId": "9512a719-e2da-4b0c-e942-5dc88d7e246f" + }, + "source": [ + "v.to(mile/hour)" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$193.30546802805432\\ \\frac{\\mathrm{mile}}{\\mathrm{hour}}$", + "text/html": [ + "193.30546802805432 mile/hour" + ], + "text/plain": [ + "193.30546802805432 mile/hour" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bpgthZdZoSkK" + }, + "source": [ + "**Exercise:** Suppose you bring a 10 foot pole to the top of the Empire State Building and use it to drop the penny from `h` plus 10 feet.\n", + "\n", + "Define a variable named `foot` that contains the unit `foot` provided by `UNITS`. Define a variable named `pole_height` and give it the value 10 feet.\n", + "\n", + "What happens if you add `h`, which is in units of meters, to `pole_height`, which is in units of feet? What happens if you write the addition the other way around?" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "T7V9GvpEoSkL", + "outputId": "483ce0d6-cfa8-4420-c730-a67eb5c42ba6" + }, + "source": [ + "# Solution goes here\n", + "foot=UNITS.foot\n", + "pole_height=10*foot\n", + "h+pole_height" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$384.048\\ \\mathrm{meter}$", + "text/html": [ + "384.048 meter" + ], + "text/plain": [ + "384.048 meter" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "YToiA3_eoSkL", + "outputId": "24e23121-ee50-4cee-8e57-c1accba46ae0" + }, + "source": [ + "# Solution goes here\n", + "\n", + "pole_height+h" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$1260.0\\ \\mathrm{foot}$", + "text/html": [ + "1260.0 foot" + ], + "text/plain": [ + "1260.0 foot" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "unUAXwgDoSkL" + }, + "source": [ + "**Exercise:** In reality, air resistance limits the velocity of the penny. At about 18 m/s, the force of air resistance equals the force of gravity and the penny stops accelerating.\n", + "\n", + "As a simplification, let's assume that the acceleration of the penny is `a` until the penny reaches 18 m/s, and then 0 afterwards. What is the total time for the penny to fall 381 m?\n", + "\n", + "You can break this question into three parts:\n", + "\n", + "1. How long until the penny reaches 18 m/s with constant acceleration `a`.\n", + "2. How far would the penny fall during that time?\n", + "3. How long to fall the remaining distance with constant velocity 18 m/s?\n", + "\n", + "Suggestion: Assign each intermediate result to a variable with a meaningful name. And assign units to all quantities!" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "SFILc8NdoSkL", + "outputId": "7dab4810-ac11-46ca-ec2f-872853851e0e" + }, + "source": [ + "# Solution goes here\n", + "v18= 18*meter / second\n", + "time= v18/a\n", + "time\n" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$1.8367346938775508\\ \\mathrm{second}$", + "text/html": [ + "1.8367346938775508 second" + ], + "text/plain": [ + "1.8367346938775508 second" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "8ZtmWNtpoSkM", + "outputId": "ccb50e3a-107f-40e2-abc7-77f86a085df8" + }, + "source": [ + "# Solution goes here\n", + "h18 = a * (time**2) / 2\n", + "h18" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$16.530612244897956\\ \\mathrm{meter}$", + "text/html": [ + "16.530612244897956 meter" + ], + "text/plain": [ + "16.530612244897956 meter" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "Auup6eSIoSkM", + "outputId": "233d9c68-87c9-4dcc-a11c-f9aec51bd186" + }, + "source": [ + "# Solution goes here\n", + "Time_remain = (381 * meter - h18) / v18\n", + "Time_remain" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$20.24829931972789\\ \\mathrm{second}$", + "text/html": [ + "20.24829931972789 second" + ], + "text/plain": [ + "20.24829931972789 second" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "id": "122rmGw8oSkM", + "outputId": "88abb120-f204-4e36-b29c-2d399ce84ae4" + }, + "source": [ + "# Solution goes here\n", + "Total_time = time + Time_remain\n", + "Total_time" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$22.085034013605444\\ \\mathrm{second}$", + "text/html": [ + "22.085034013605444 second" + ], + "text/plain": [ + "22.085034013605444 second" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QhQ5bC-EoSkN" + }, + "source": [ + "# Solution goes here" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V_oPwSs8oSkN" + }, + "source": [ + "### Restart and run all\n", + "\n", + "When you change the contents of a cell, you have to run it again for those changes to have an effect. If you forget to do that, the results can be confusing, because the code you are looking at is not the code you ran.\n", + "\n", + "If you ever lose track of which cells have run, and in what order, you should go to the Kernel menu and select \"Restart & Run All\". Restarting the kernel means that all of your variables get deleted, and running all the cells means all of your code will run again, in the right order.\n", + "\n", + "**Exercise:** Select \"Restart & Run All\" now and confirm that it does what you want." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "B_KVXjOzoSkO" + }, + "source": [ + "" + ], + "execution_count": 23, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap02.ipynb b/colab/chap02.ipynb index 52250e76b..dad0f02e1 100644 --- a/colab/chap02.ipynb +++ b/colab/chap02.ipynb @@ -1,893 +1,2209 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Modeling a bikeshare system" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start with a `State` object that represents the number of bikes at each station.\n", - "\n", - "When you display a `State` object, it lists the state variables and their values:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can access the state variables using dot notation." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "bikeshare.wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n", - "\n", - "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating\n", - "\n", - "We can use the update operators `+=` and `-=` to change state variables." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin -= 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we display `bikeshare`, we should see the change." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.wellesley += 1\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Functions\n", - "\n", - "We can take the code we've written so far and encapsulate it in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley():\n", - " bikeshare.olin -= 1\n", - " bikeshare.wellesley += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Conditionals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", - "\n", - "The Python function `help` looks up a function and displays its documentation." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "help(flip)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "flip(0.7)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.7):\n", - " print('heads')\n", - "else:\n", - " print('tails')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Step\n", - "\n", - "Now let's get back to the bikeshare state. Again let's start with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "def step():\n", - " if flip(0.5):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(0.4):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since this function takes no parameters, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "step()\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Parameters\n", - "\n", - "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n", - "\n", - "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " print('Moving a bike to Wellesley')\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()\n", - " print('Moving a bike to Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "step(0.5, 0.4)\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. " - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## For loop" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Before we go on, I'll redefine `step` without the print statements." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def step(p1, p2):\n", - " if flip(p1):\n", - " bike_to_wellesley()\n", - " \n", - " if flip(p2):\n", - " bike_to_olin()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And let's start again with a new `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use a `for` loop to move 4 bikes from Olin to Wellesley." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(4):\n", - " bike_to_wellesley()\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or we can simulate 4 random time steps." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(4):\n", - " step(0.3, 0.2)\n", - " \n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If each step corresponds to a minute, we can simulate an entire hour like this." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(60):\n", - " step(0.3, 0.2)\n", - "\n", - "bikeshare" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n", - "\n", - "But first, we want to plot the results." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## TimeSeries\n", - "\n", - "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n", - "\n", - "We can create a new, empty `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can add a value to the `TimeSeries` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "results[0] = bikeshare.olin\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n", - "\n", - "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a for loop that runs 10 steps and stores the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(10):\n", - " step(0.3, 0.2)\n", - " results[i] = bikeshare.olin" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can display the results." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "results.mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "results.describe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting\n", - "\n", - "We can also plot the results like this." - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", - "\n", - "It should:\n", - "\n", - "1. Create a `TimeSeries` object to hold the results.\n", - "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", - "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", - "4. After the for loop, it should plot the results and\n", - "5. Decorate the axes.\n", - "\n", - "To test your function:\n", - "\n", - "1. Create a `State` object with the initial state of the system.\n", - "2. Call `run_simulation` with appropriate parameters.\n", - "3. Save the resulting figure.\n", - "\n", - "Optional:\n", - "\n", - "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Opening the hood\n", - "\n", - "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n", - "\n", - "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n", - "\n", - "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pandas\n", - "\n", - "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n", - "\n", - "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n", - "\n", - "The primary differences between `TimeSeries` and `Series` are:\n", - "\n", - "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n", - "\n", - "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n", - "\n", - "3. I provide a function called `set` that we'll use later.\n", - "\n", - "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Pyplot\n", - "\n", - "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n", - "\n", - "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines." - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [], - "source": [ - "help(decorate)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### NumPy\n", - "\n", - "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n", - "\n", - "You can get the source code for `flip` by running the following cell." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "source_code(flip)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap02.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "QFAuYhOc0ljq" + }, + "source": [ + "# Chapter 2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "GvoWOfg40ljt" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun San Yip (7 Jun 2021)\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "bGn3AD9p0ljy" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nCTyN4Nd0lj3" + }, + "source": [ + "## Modeling a bikeshare system" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HrH931E90lj6" + }, + "source": [ + "We'll start with a `State` object that represents the number of bikes at each station.\n", + "\n", + "When you display a `State` object, it lists the state variables and their values:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "l1dU_fhm0lj7" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2, babson=0)" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Xsx63Wr20lj7" + }, + "source": [ + "We can access the state variables using dot notation." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vu-rx73-0lj8", + "outputId": "27f05656-3c85-4160-b0f8-f8e3fcd41d83" + }, + "source": [ + "bikeshare.olin" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "10" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "-uM8G_N70lj9", + "outputId": "aaa1d1d9-9985-4fc8-fef6-807d714ce22c" + }, + "source": [ + "bikeshare" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin10
wellesley2
babson0
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "babson 0\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qMUJzvoz0lj-" + }, + "source": [ + "**Exercise:** What happens if you spell the name of a state variable wrong? Edit the previous cell, change the spelling of `wellesley`, and run the cell again.\n", + "\n", + "The error message uses the word \"attribute\", which is another name for what we are calling a state variable. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2yf1gSo90lj_" + }, + "source": [ + "**Exercise:** Add a third attribute called `babson` with initial value 0, and display the state of `bikeshare` again." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D0BzeBhb0lkA" + }, + "source": [ + "## Updating\n", + "\n", + "We can use the update operators `+=` and `-=` to change state variables." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RyGmC3w10lkB" + }, + "source": [ + "bikeshare.olin -= 1" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XuwGLBuw0lkC" + }, + "source": [ + "If we display `bikeshare`, we should see the change." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "wtujy6gs0lkC", + "outputId": "1c08bf57-545a-4992-efdd-2d88e57b5c96" + }, + "source": [ + "bikeshare" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin9
wellesley2
babson0
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 2\n", + "babson 0\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_MRSpPti0lkD" + }, + "source": [ + "Of course, if we subtract a bike from `olin`, we should add it to `wellesley`." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "hPMC6bUD0lkE", + "outputId": "5082dbcf-7e92-4422-9dbf-5589b1cf7feb" + }, + "source": [ + "bikeshare.wellesley += 1\n", + "bikeshare" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin9
wellesley3
babson0
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "babson 0\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gc6-zahA0lkF" + }, + "source": [ + "## Functions\n", + "\n", + "We can take the code we've written so far and encapsulate it in a function." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "YN4EIlld0lkG" + }, + "source": [ + "def bike_to_wellesley():\n", + " bikeshare.olin -= 1\n", + " bikeshare.wellesley += 1" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "__96TlVC0lkH" + }, + "source": [ + "When you define a function, it doesn't run the statements inside the function, yet. When you call the function, it runs the statements inside." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "1ZO83RJG0lkH", + "outputId": "39da02cc-5328-405e-cd8e-7f80e72a27da" + }, + "source": [ + "bike_to_wellesley()\n", + "bikeshare" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin8
wellesley4
babson0
\n", + "
" + ], + "text/plain": [ + "olin 8\n", + "wellesley 4\n", + "babson 0\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8QOv1uQf0lkI" + }, + "source": [ + "\n", + "One common error is to omit the parentheses, which has the effect of looking up the function, but not calling it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cbI4fWiY0lkI", + "outputId": "0986071c-7c54-4f14-839f-571af23f9ce5" + }, + "source": [ + "bike_to_wellesley" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R5W1Pvi-0lkJ" + }, + "source": [ + "The output indicates that `bike_to_wellesley` is a function defined in a \"namespace\" called `__main__`, but you don't have to understand what that means." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "07-qXxjN0lkJ" + }, + "source": [ + "**Exercise:** Define a function called `bike_to_olin` that moves a bike from Wellesley to Olin. Call the new function and display `bikeshare` to confirm that it works." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "y1ZId40K0lkJ" + }, + "source": [ + "def bike_to_olin():\n", + " bikeshare.olin += 1\n", + " bikeshare.wellesley -= 1" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "VlWlj8_I0lkK", + "outputId": "ffca7ff4-d4f8-4024-a4de-e836016cca9e" + }, + "source": [ + "bike_to_olin()\n", + "bikeshare" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin9
wellesley3
babson0
\n", + "
" + ], + "text/plain": [ + "olin 9\n", + "wellesley 3\n", + "babson 0\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4baYyLnO0lkK" + }, + "source": [ + "## Conditionals" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TD54hv2S0lkK" + }, + "source": [ + "`modsim.py` provides `flip`, which takes a probability and returns either `True` or `False`, which are special values defined by Python.\n", + "\n", + "The Python function `help` looks up a function and displays its documentation." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "kDEEivnn0lkL", + "outputId": "953e18b5-d07d-4c57-f665-7ba49b79b11a" + }, + "source": [ + "help(flip)" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Help on function flip in module modsim.modsim:\n", + "\n", + "flip(p=0.5)\n", + " Flips a coin with the given probability.\n", + " \n", + " p: float 0-1\n", + " \n", + " returns: boolean (True or False)\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yc0xev470lkL" + }, + "source": [ + "In the following example, the probability is 0.7 or 70%. If you run this cell several times, you should get `True` about 70% of the time and `False` about 30%." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZqIvQgBO0lkL", + "outputId": "b31635a7-6886-4400-af48-d50c6c0ee9ab" + }, + "source": [ + "flip(0.7)" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "True" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "y1oOwr270lkL" + }, + "source": [ + "In the following example, we use `flip` as part of an if statement. If the result from `flip` is `True`, we print `heads`; otherwise we do nothing." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eWUFkKG-0lkM", + "outputId": "eb152148-aae7-4714-90f7-98d930f86f5e" + }, + "source": [ + "if flip(0.7):\n", + " print('heads')" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "heads\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bYn30YsZ0lkM" + }, + "source": [ + "With an else clause, we can print heads or tails depending on whether `flip` returns `True` or `False`." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HVvMfxJK0lkM", + "outputId": "477223cc-7277-4656-9a75-b2e395f9e174" + }, + "source": [ + "if flip(0.7):\n", + " print('heads')\n", + "else:\n", + " print('tails')" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "heads\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tl9FhyB30lkM" + }, + "source": [ + "## Step\n", + "\n", + "Now let's get back to the bikeshare state. Again let's start with a new `State` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Q1BB7VKq0lkN" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iIF_1Oo_0lkN" + }, + "source": [ + "Suppose that in any given minute, there is a 50% chance that a student picks up a bike at Olin and rides to Wellesley. We can simulate that like this." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "lerNa83a0lkN", + "outputId": "91827aab-a5e6-4c27-a9a1-fc4ee0f0a490" + }, + "source": [ + "if flip(0.5):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + "\n", + "bikeshare" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1Sb28rzY0lkO" + }, + "source": [ + "And maybe at the same time, there is also a 40% chance that a student at Wellesley rides to Olin." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "BH0t2_1K0lkO", + "outputId": "00b4fcec-f9cf-43f5-be7c-f7e18cfc7f90" + }, + "source": [ + "if flip(0.4):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')\n", + "\n", + "bikeshare" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin10
wellesley2
\n", + "
" + ], + "text/plain": [ + "olin 10\n", + "wellesley 2\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qhk_vLa10lkP" + }, + "source": [ + "We can wrap that code in a function called `step` that simulates one time step. In any given minute, a student might ride from Olin to Wellesley, from Wellesley to Olin, or both, or neither, depending on the results of `flip`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Lo7lt9cd0lkP" + }, + "source": [ + "def step():\n", + " if flip(0.5):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + " \n", + " if flip(0.4):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')" + ], + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KA8mFnI50lkQ" + }, + "source": [ + "Since this function takes no parameters, we call it like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 130 + }, + "id": "uzs7VIcy0lkQ", + "outputId": "49de3e86-335d-4afa-8948-d07fd8dc5c99" + }, + "source": [ + "step()\n", + "bikeshare" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Moving a bike to Olin\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin11
wellesley1
\n", + "
" + ], + "text/plain": [ + "olin 11\n", + "wellesley 1\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3iFNgPpi0lkR" + }, + "source": [ + "## Parameters\n", + "\n", + "As defined in the previous section, `step` is not as useful as it could be, because the probabilities `0.5` and `0.4` are \"hard coded\".\n", + "\n", + "It would be better to generalize this function so it takes the probabilities `p1` and `p2` as parameters:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JlS4VTt40lkS" + }, + "source": [ + "def step(p1, p2):\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "okjGrQZP0lkS" + }, + "source": [ + "Now we can call it like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 130 + }, + "id": "UBZd_iO60lkT", + "outputId": "5c26cdbc-1572-4178-ef7d-6fbad57e5786" + }, + "source": [ + "step(0.5, 0.4)\n", + "bikeshare" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Moving a bike to Olin\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin12
wellesley0
\n", + "
" + ], + "text/plain": [ + "olin 12\n", + "wellesley 0\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fE-m3XQ70lkV" + }, + "source": [ + "**Exercise:** At the beginning of `step`, add a print statement that displays the values of `p1` and `p2`. Call it again with values `0.3`, and `0.2`, and confirm that the values of the parameters are what you expect. " + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UnhzEx0D0lkW", + "outputId": "4152433e-2765-49eb-a6f2-ff7d9d84b458" + }, + "source": [ + "def step(p1, p2):\n", + " print('p1=', p1, 'p2=', p2)\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " print('Moving a bike to Wellesley')\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()\n", + " print('Moving a bike to Olin')\n", + "\n", + "step(0.3, 0.2)" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "text": [ + "p1= 0.3 p2= 0.2\n", + "Moving a bike to Wellesley\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Xam3Fuor0lkX" + }, + "source": [ + "## For loop" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1V7M1Bvb0lkX" + }, + "source": [ + "Before we go on, I'll redefine `step` without the print statements." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AQrDMM8m0lkY" + }, + "source": [ + "def step(p1, p2):\n", + " if flip(p1):\n", + " bike_to_wellesley()\n", + " \n", + " if flip(p2):\n", + " bike_to_olin()" + ], + "execution_count": 25, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DkPc8fTa0lkY" + }, + "source": [ + "And let's start again with a new `State` object:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "NAMsNXPf0lkY" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ], + "execution_count": 26, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fkAUaRlB0lkZ" + }, + "source": [ + "We can use a `for` loop to move 4 bikes from Olin to Wellesley." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "Naic0Oay0lkZ", + "outputId": "7fca019d-33ad-468d-a6b5-2a9df01aeb5d" + }, + "source": [ + "for i in range(4):\n", + " bike_to_wellesley()\n", + " \n", + "bikeshare" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin6
wellesley6
\n", + "
" + ], + "text/plain": [ + "olin 6\n", + "wellesley 6\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 27 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Z9Sl6dcQ0lkZ" + }, + "source": [ + "Or we can simulate 4 random time steps." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "mxHg-0GN0lkZ", + "outputId": "a3b509ac-eae8-4ae0-e695-8da500b4b8f3" + }, + "source": [ + "for i in range(4):\n", + " step(0.3, 0.2)\n", + " \n", + "bikeshare" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin5
wellesley7
\n", + "
" + ], + "text/plain": [ + "olin 5\n", + "wellesley 7\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3oRMRBk00lka" + }, + "source": [ + "If each step corresponds to a minute, we can simulate an entire hour like this." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "U4U71TDT0lka", + "outputId": "7e2f914a-9445-40d7-fa95-53da1f00af2f" + }, + "source": [ + "for i in range(60):\n", + " step(0.3, 0.2)\n", + "\n", + "bikeshare" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin-5
wellesley17
\n", + "
" + ], + "text/plain": [ + "olin -5\n", + "wellesley 17\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "g-CGIhul0lkb" + }, + "source": [ + "After 60 minutes, you might see that the number of bike at Olin is negative. We'll fix that problem in the next notebook.\n", + "\n", + "But first, we want to plot the results." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0PU3A-a20lkb" + }, + "source": [ + "## TimeSeries\n", + "\n", + "`modsim.py` provides an object called a `TimeSeries` that can contain a sequence of values changing over time.\n", + "\n", + "We can create a new, empty `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "n5SEqZl50lkb" + }, + "source": [ + "results = TimeSeries()" + ], + "execution_count": 30, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "u57SRPtg0lkb" + }, + "source": [ + "And we can add a value to the `TimeSeries` like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 80 + }, + "id": "236NfEyR0lkc", + "outputId": "d5b79c52-d6b1-4084-f1a7-bf96f7053a15" + }, + "source": [ + "results[0] = bikeshare.olin\n", + "results" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
0-5
\n", + "
" + ], + "text/plain": [ + "0 -5\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 31 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1hN0D03A0lkc" + }, + "source": [ + "The `0` in brackets is an `index` that indicates that this value is associated with time step 0.\n", + "\n", + "Now we'll use a for loop to save the results of the simulation. I'll start one more time with a new `State` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dDlH52fK0lkc" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2)" + ], + "execution_count": 32, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zwoO6ACQ0lkc" + }, + "source": [ + "Here's a for loop that runs 10 steps and stores the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CmqCCV6y0lkd" + }, + "source": [ + "for i in range(10):\n", + " step(0.3, 0.2)\n", + " results[i] = bikeshare.olin" + ], + "execution_count": 33, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NkOu_B0D0lke" + }, + "source": [ + "Now we can display the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 363 + }, + "id": "o2PjbPfm0lke", + "outputId": "bdbfbd48-920b-44a7-f66a-b66c6ce2348e" + }, + "source": [ + "results" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
010
111
211
310
411
511
611
711
812
912
\n", + "
" + ], + "text/plain": [ + "0 10\n", + "1 11\n", + "2 11\n", + "3 10\n", + "4 11\n", + "5 11\n", + "6 11\n", + "7 11\n", + "8 12\n", + "9 12\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 34 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9h9dx0or0lkf" + }, + "source": [ + "A `TimeSeries` is a specialized version of a Pandas `Series`, so we can use any of the functions provided by `Series`, including several that compute summary statistics:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ob0sLUyT0lkf", + "outputId": "cf082548-8542-4cf7-fd9b-ab0bb0614fa9" + }, + "source": [ + "results.mean()" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "11.0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 35 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QHsnJEyU0lkf", + "outputId": "1ade7af1-0370-4e10-abb3-0fa9a3e79b6f" + }, + "source": [ + "results.describe()" + ], + "execution_count": 36, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "count 10.000000\n", + "mean 11.000000\n", + "std 0.666667\n", + "min 10.000000\n", + "25% 11.000000\n", + "50% 11.000000\n", + "75% 11.000000\n", + "max 12.000000\n", + "dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 36 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cTClmkpm0lkg" + }, + "source": [ + "You can read the documentation of `Series` [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LQOM8HeK0lkg" + }, + "source": [ + "## Plotting\n", + "\n", + "We can also plot the results like this." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "BT9ZO5aH0lkg", + "outputId": "81d12be1-4b83-4f2a-8821-6bad875791fd" + }, + "source": [ + "plot(results, label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bdNyrdp30lkn" + }, + "source": [ + "`decorate`, which is defined in the `modsim` library, adds a title and labels the axes." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hi0pCVXp0lko" + }, + "source": [ + "**Exercise:** Wrap the code from this section in a function named `run_simulation` that takes three parameters, named `p1`, `p2`, and `num_steps`.\n", + "\n", + "It should:\n", + "\n", + "1. Create a `TimeSeries` object to hold the results.\n", + "2. Use a for loop to run `step` the number of times specified by `num_steps`, passing along the specified values of `p1` and `p2`.\n", + "3. After each step, it should save the number of bikes at Olin in the `TimeSeries`.\n", + "4. After the for loop, it should plot the results and\n", + "5. Decorate the axes.\n", + "\n", + "To test your function:\n", + "\n", + "1. Create a `State` object with the initial state of the system.\n", + "2. Call `run_simulation` with appropriate parameters.\n", + "3. Save the resulting figure.\n", + "\n", + "Optional:\n", + "\n", + "1. Extend your solution so it creates two `TimeSeries` objects, keeps track of the number of bikes at Olin *and* at Wellesley, and plots both series at the end." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KLO6ahxo0lko" + }, + "source": [ + "def run_simulation(p1,p2,num_steps):\n", + " \n", + " results1=TimeSeries()\n", + "\n", + " for i in range(num_steps):\n", + " step(p1, p2)\n", + " results1[i] = bikeshare.olin\n", + " \n", + " plot(results1, label='Olin')\n", + "\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')\n", + "\n", + "def run_simulation2(p1,p2,num_steps):\n", + " \n", + " results2=TimeSeries()\n", + " results3=TimeSeries()\n", + "\n", + " for i in range(num_steps):\n", + " step(p1, p2)\n", + " results2[i] = bikeshare.olin\n", + " results3[i] = bikeshare.wellesley\n", + " \n", + " plot(results2, label='Olin')\n", + " plot(results3, label='Wellesley')\n", + "\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')\n", + " \n", + " " + ], + "execution_count": 38, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "vRbNRFNA0lkp", + "outputId": "64d6b3b3-b399-4948-d513-a112184fb263" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation(0.5, 0.6, 120)\n", + "\n", + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation2(0.2, 0.3, 60)" + ], + "execution_count": 39, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nWcFaS8Q0lkp" + }, + "source": [ + "## Opening the hood\n", + "\n", + "The functions in `modsim.py` are built on top of several widely-used Python libraries, especially NumPy, SciPy, and Pandas. These libraries are powerful but can be hard to use. The intent of `modsim.py` is to give you the power of these libraries while making it easy to get started.\n", + "\n", + "In the future, you might want to use these libraries directly, rather than using `modsim.py`. So we will pause occasionally to open the hood and let you see how `modsim.py` works.\n", + "\n", + "You don't need to know anything in these sections, so if you are already feeling overwhelmed, you might want to skip them. But if you are curious, read on." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7YczWzah0lkp" + }, + "source": [ + "### Pandas\n", + "\n", + "This chapter introduces two objects, `State` and `TimeSeries`. Both are based on the `Series` object defined by Pandas, which is a library primarily used for data science.\n", + "\n", + "You can read the documentation of the `Series` object [here](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)\n", + "\n", + "The primary differences between `TimeSeries` and `Series` are:\n", + "\n", + "1. I made it easier to create a new, empty `Series` while avoiding a [confusing inconsistency](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html).\n", + "\n", + "2. I provide a function so the `Series` looks good when displayed in Jupyter.\n", + "\n", + "3. I provide a function called `set` that we'll use later.\n", + "\n", + "`State` has all of those capabilities; in addition, it provides an easier way to initialize state variables, and it provides functions called `T` and `dt`, which will help us avoid a confusing error later." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ygpGbu340lkp" + }, + "source": [ + "### Pyplot\n", + "\n", + "The `plot` function in `modsim.py` is based on the `plot` function in Pyplot, which is part of Matplotlib. You can read the documentation of `plot` [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html).\n", + "\n", + "`decorate` provides a convenient way to call the `pyplot` functions `title`, `xlabel`, and `ylabel`, and `legend`. It also avoids an annoying warning message if you try to make a legend when you don't have any labelled lines." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "06yAaxtz0lkq", + "outputId": "dd048647-2e06-46b1-a984-811a1aa81cdd" + }, + "source": [ + "help(decorate)" + ], + "execution_count": 40, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Help on function decorate in module modsim.modsim:\n", + "\n", + "decorate(**options)\n", + " Decorate the current axes.\n", + " \n", + " Call decorate with keyword arguments like\n", + " \n", + " decorate(title='Title',\n", + " xlabel='x',\n", + " ylabel='y')\n", + " \n", + " The keyword arguments can be any of the axis properties\n", + " \n", + " https://matplotlib.org/api/axes_api.html\n", + " \n", + " In addition, you can use `legend=False` to suppress the legend.\n", + " \n", + " And you can use `loc` to indicate the location of the legend\n", + " (the default value is 'best')\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bw5lkwxm0lkq" + }, + "source": [ + "### NumPy\n", + "\n", + "The `flip` function in `modsim.py` uses NumPy's `random` function to generate a random number between 0 and 1.\n", + "\n", + "You can get the source code for `flip` by running the following cell." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "q8t4GFPT0lkr", + "outputId": "3dc1a281-8f2b-4baa-9526-3611707e240e" + }, + "source": [ + "source_code(flip)" + ], + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "text": [ + "def flip(p=0.5):\n", + " \"\"\"Flips a coin with the given probability.\n", + "\n", + " p: float 0-1\n", + "\n", + " returns: boolean (True or False)\n", + " \"\"\"\n", + " return np.random.random() < p\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OTikBy2n0lkr" + }, + "source": [ + "" + ], + "execution_count": 41, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap03.ipynb b/colab/chap03.ipynb index 9aae16912..cf26b878e 100644 --- a/colab/chap03.ipynb +++ b/colab/chap03.ipynb @@ -1,606 +1,1069 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 3" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap03.ipynb", + "provenance": [] + } }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More than one State object\n", - "\n", - "Here's the code from the previous chapter, with two changes:\n", - "\n", - "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n", - "\n", - "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(state, p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " state: State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " results = TimeSeries() \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " results[i] = state.olin\n", - " \n", - " plot(results, label='Olin')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can create more than one `State` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1 = State(olin=10, wellesley=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare2 = State(olin=2, wellesley=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whenever we call a function, we indicate which `State` object to work with:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_olin(bikeshare1)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "bike_to_wellesley(bikeshare2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And you can confirm that the different objects are getting updated independently:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare1" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Negative bikes" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n", - "\n", - "If you run this simulation a few times, it happens often." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can fix this problem using the `return` statement to exit the function early if an update would cause negative bikes." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now if you run the simulation again, it should behave." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2)\n", - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Comparison operators" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The `if` statements in the previous section used the comparison operator `==`. The other comparison operators are listed in the book.\n", - "\n", - "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n", - "\n", - "Remember that `=` creates a variable or gives an existing variable a new value." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "x = 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Whereas `==` compares two values and returns `True` if they are equal." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "x == 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can use `==` in an `if` statement." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "if x == 5:\n", - " print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you use `=` in an `if` statement, you get an error." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# If you remove the # from the if statement and run it, you'll get\n", - "# SyntaxError: invalid syntax\n", - "\n", - "#if x = 5:\n", - "# print('yes, x is 5')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n", - "\n", - "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next we need versions of `bike_to_wellesley` and `bike_to_olin` that update the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now when we run a simulation, it keeps track of unhappy customers." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "run_simulation(bikeshare, 0.4, 0.2, 60)\n", - "decorate_bikeshare()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the simulation, we can print the number of unhappy customers at each location." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.olin_empty" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare.wellesley_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** As another metric, we might be interested in the time until the first customer arrives and doesn't find a bike. To make that work, we have to add a \"clock\" to keep track of how many time steps have elapsed:\n", - "\n", - "1. Create a new `State` object with an additional state variable, `clock`, initialized to 0. \n", - "\n", - "2. Write a modified version of `step` that adds one to the clock each time it is invoked.\n", - "\n", - "Test your code by running the simulation and check the value of `clock` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "bikeshare = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0,\n", - " clock=0)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n", - "\n", - "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n", - "\n", - "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_empty` to `clock` (but only if `t_first_empty` has not already been set).\n", - "\n", - "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "r7MxV54KCu2S" + }, + "source": [ + "# Chapter 3" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "zoe_3W9vCu2U" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun San Yip (07 June 2021)\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "w7fTDgw0Cu2Y" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Jrn6YMIiCu2Z" + }, + "source": [ + "## More than one State object\n", + "\n", + "Here's the code from the previous chapter, with two changes:\n", + "\n", + "1. I've added DocStrings that explain what each function does, and what parameters it takes.\n", + "\n", + "2. I've added a parameter named `state` to the functions so they work with whatever `State` object we give them, instead of always using `bikeshare`. That makes it possible to work with more than one `State` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rWNkJy0ZCu2a" + }, + "source": [ + "def step(state, p1, p2):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)\n", + " \n", + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " state.wellesley -= 1\n", + " state.olin += 1\n", + " \n", + "def decorate_bikeshare():\n", + " \"\"\"Add a title and label the axes.\"\"\"\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GcuiSj-8Cu2b" + }, + "source": [ + "And here's `run_simulation`, which is a solution to the exercise at the end of the previous notebook." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "00h1GyFVCu2c" + }, + "source": [ + "def run_simulation(state, p1, p2, num_steps):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " state: State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " num_steps: number of time steps\n", + " \"\"\"\n", + " results = TimeSeries() \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " results[i] = state.olin\n", + " \n", + " plot(results, label='Olin')" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xAfeYlTUCu2d" + }, + "source": [ + "Now we can create more than one `State` object:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AH4cVp6tCu2d" + }, + "source": [ + "bikeshare1 = State(olin=10, wellesley=2)" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5kCjl5ssCu2f" + }, + "source": [ + "bikeshare2 = State(olin=2, wellesley=10)" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ftO3n2heCu2h" + }, + "source": [ + "Whenever we call a function, we indicate which `State` object to work with:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ysxQxU0wCu2j" + }, + "source": [ + "bike_to_olin(bikeshare1)" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "gedSjSMFCu2j" + }, + "source": [ + "bike_to_wellesley(bikeshare2)" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cYnoX2YwCu2k" + }, + "source": [ + "And you can confirm that the different objects are getting updated independently:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "VSdg3pTiCu2k", + "outputId": "13cd8513-7b20-4779-b21e-c53f7321885b" + }, + "source": [ + "bikeshare1" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin11
wellesley1
\n", + "
" + ], + "text/plain": [ + "olin 11\n", + "wellesley 1\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 112 + }, + "id": "vq_JKVYbCu2k", + "outputId": "33e388f8-3bd0-46b4-d55b-783106ec3f85" + }, + "source": [ + "bikeshare2" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
olin1
wellesley11
\n", + "
" + ], + "text/plain": [ + "olin 1\n", + "wellesley 11\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QK1uJoL2Cu2l" + }, + "source": [ + "## Negative bikes" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nS0aga5ACu2l" + }, + "source": [ + "In the code we have so far, the number of bikes at one of the locations can go negative, and the number of bikes at the other location can exceed the actual number of bikes in the system.\n", + "\n", + "If you run this simulation a few times, it happens often." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "7-D_eG_sCu2l", + "outputId": "7a981d26-0e05-4900-95b1-fa252772cb33" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "I6LhN0LECu2m" + }, + "source": [ + "We can fix this problem using the `return` statement to exit the function early if an update would cause negative bikes." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "08kSIuVBCu2m" + }, + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "e5AVH_puCu2m" + }, + "source": [ + "Now if you run the simulation again, it should behave." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "Za7vR2wrCu2m", + "outputId": "75ddd159-28ca-48e7-f765-e1aeff089a4d" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2)\n", + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tCt8GKWNCu2n" + }, + "source": [ + "## Comparison operators" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zOEQiBq4Cu2n" + }, + "source": [ + "The `if` statements in the previous section used the comparison operator `==`. The other comparison operators are listed in the book.\n", + "\n", + "It is easy to confuse the comparison operator `==` with the assignment operator `=`.\n", + "\n", + "Remember that `=` creates a variable or gives an existing variable a new value." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "V40W6zTGCu2n" + }, + "source": [ + "x = 5" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LEoA40kbCu2o" + }, + "source": [ + "Whereas `==` compares two values and returns `True` if they are equal." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KEYIsiPkCu2o", + "outputId": "12de2eec-d980-455f-f32d-34f6b64e49a8" + }, + "source": [ + "x == 5" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "True" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Tsrar4p9Cu2o" + }, + "source": [ + "You can use `==` in an `if` statement." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nrvabwhCCu2p", + "outputId": "49069f5a-55ad-4672-d33d-c0587f031251" + }, + "source": [ + "if x == 5:\n", + " print('yes, x is 5')" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "yes, x is 5\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "w1oonDNOCu2p" + }, + "source": [ + "But if you use `=` in an `if` statement, you get an error." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NFKrWhOFCu2p", + "outputId": "a25a2395-8a46-471e-e0dc-770622cec54d" + }, + "source": [ + "# If you remove the # from the if statement and run it, you'll get\n", + "# SyntaxError: invalid syntax\n", + "\n", + "if x == 5:\n", + " print('yes, x is 5')\n", + "else:\n", + " print('no, x is not 5')\n", + " " + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "yes, x is 5\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m2OwIx7nCu2q" + }, + "source": [ + "**Exercise:** Add an `else` clause to the `if` statement above, and print an appropriate message.\n", + "\n", + "Replace the `==` operator with one or two of the other comparison operators, and confirm they do what you expect." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b-btGKjJCu2q" + }, + "source": [ + "## Metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s6Wa4tuYCu2q" + }, + "source": [ + "Now that we have a working simulation, we'll use it to evaluate alternative designs and see how good or bad they are. The metric we'll use is the number of customers who arrive and find no bikes available, which might indicate a design problem." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hMPvl4yYCu2r" + }, + "source": [ + "First we'll make a new `State` object that creates and initializes additional state variables to keep track of the metrics." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DG-HdLlOCu2s" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0)" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7yqE-wWuCu2s" + }, + "source": [ + "Next we need versions of `bike_to_wellesley` and `bike_to_olin` that update the metrics." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "I-mx6tjUCu2s" + }, + "source": [ + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1" + ], + "execution_count": 18, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gl3ZZ7V6Cu2t" + }, + "source": [ + "Now when we run a simulation, it keeps track of unhappy customers." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "XHjsn88KCu2t", + "outputId": "34b5ba30-5bae-443b-b989-bef74e376cd2" + }, + "source": [ + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pVq-Nu4ACu2t" + }, + "source": [ + "After the simulation, we can print the number of unhappy customers at each location." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "b6T1-_AoCu2t", + "outputId": "d3d6c2b9-c3b9-4bdf-d5f7-94103f48d871" + }, + "source": [ + "bikeshare.olin_empty" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "4" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mV5g0TauCu2u", + "outputId": "c5e08e49-7f11-4d20-87e1-1f2bd76e12d7" + }, + "source": [ + "bikeshare.wellesley_empty" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NX9c2ms4Cu2v" + }, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** As another metric, we might be interested in the time until the first customer arrives and doesn't find a bike. To make that work, we have to add a \"clock\" to keep track of how many time steps have elapsed:\n", + "\n", + "1. Create a new `State` object with an additional state variable, `clock`, initialized to 0. \n", + "\n", + "2. Write a modified version of `step` that adds one to the clock each time it is invoked.\n", + "\n", + "Test your code by running the simulation and check the value of `clock` at the end." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "piSxzPqYCu2w" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0,\n", + " clock=0)" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "67cNAqpzCu2y" + }, + "source": [ + "def step(state, p1, p2):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)\n", + " \n", + " state.clock += 1" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "HcgqqRYBCu2z", + "outputId": "b4c20993-36cc-407f-96b5-bb87edbe4b6a" + }, + "source": [ + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "D7i_1lqRCu2z", + "outputId": "231985ad-40a0-42aa-c617-6d6c6bdb7c2c" + }, + "source": [ + "bikeshare.clock" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "60" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 25 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "APnj13fECu20" + }, + "source": [ + "**Exercise:** Continuing the previous exercise, let's record the time when the first customer arrives and doesn't find a bike.\n", + "\n", + "1. Create a new `State` object with an additional state variable, `t_first_empty`, initialized to -1 as a special value to indicate that it has not been set. \n", + "\n", + "2. Write a modified version of `step` that checks whether`olin_empty` and `wellesley_empty` are 0. If not, it should set `t_first_empty` to `clock` (but only if `t_first_empty` has not already been set).\n", + "\n", + "Test your code by running the simulation and printing the values of `olin_empty`, `wellesley_empty`, and `t_first_empty` at the end." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2IxdAcggCu20" + }, + "source": [ + "bikeshare = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0,\n", + " clock=0, t_first_empty = -1)" + ], + "execution_count": 26, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "UEYWCj5hCu21" + }, + "source": [ + "def step(state, p1, p2):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\" \n", + "\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if state.olin_empty != 0:\n", + " if state.t_first_empty == -1:\n", + " state.t_first_empty = state.clock\n", + "\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)\n", + "\n", + " if state.wellesley_empty != 0:\n", + " if state.t_first_empty == -1:\n", + " state.t_first_empty = state.clock\n", + " \n", + " state.clock += 1" + ], + "execution_count": 27, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "Tv9aP9eECu21", + "outputId": "9f94fa59-8a6f-439d-dd2c-f60c7fc657c3" + }, + "source": [ + "run_simulation(bikeshare, 0.4, 0.2, 60)\n", + "decorate_bikeshare()" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXycZbnw8d9ka5qlS5omaUvp3qtJW7qRsggIoggeDvhyVFRQ8QWEAx5xQY4imzsooiACiqKvikfxiAgooKyFsjTd6JL06r43adIkbdI2zTbvH/czyXSaZCbJJLPk+n4++STzPDPPc00mmWvu+76e+/b5/X6MMcaYeJMS6wCMMcaYrliCMsYYE5csQRljjIlLlqCMMcbEJUtQxhhj4pIlKGOMMXHJEpSJCRG5SkRag26fKyJ+ETkplnF1R0Qme/GdFbTNLyJXRvEcx/1OYk1E7hKRzd3dHoDznfA7NkNbWqwDMMlFRAqB24B/B8YDB4ElwLdVdXUPD30TGAfs78e5pwJbgA+p6nNB2+8HvtDN9n9X1al9PWciEpFzgVeCNrUAu4E/AneoaiBJ3gs8OLjRGdPJWlAmakRkIrAcOBP4T2A68G9AM/C2iFzY3WNVtVlVK1W1va/nV9WtwHbgfSG7zgd2drP9xb6eLwksxH0omAH8N/B54OuBnaraqKo1MYotqkQkPdYxmN6zFpSJpp8B6cB5qnrI27YT+ISI/AP4jYhMUdWjoQ8M+lQ/UVV3B92+ALgdOBWXfL4S3Arqwku4xBM4bhFQjEuY14dsnw18y7tdCNyDS6iZwBrg66q6JNInLyI5wHeBjwCjAcW1HJ8Mus+twDXABOAQsBL4cFe/E+/+i4Dv45L+UeB14EuqusNrMW4GzlLVN4Mecw7udzdVVXf0EHK1qlZ6P+8QkY/jfs+B49wFXKmq07uJLQ94GtcCu1RVD3nH+BowC6gEngRuV9XD3mPOwv2eT/EOsxW4RVVfCDr0eBF5FveBohL4lqr+Jui8NwGfxX0AagRe9X4n+7z953rP/2Jcwj0V+BLwsIj8F3AjMBnYBfwGuCeo1WjiiLWgTFSIyGjcm/uDQckp2PeBQuADvTz0vcD3gHnAO8CfvHN15yVgvvfmCe5Nbg3ujfKUkO1+4GURGY57Q8sFLgIWAP8A/iUixZEEKSI+4BkvzsuBOcDDwB9F5HzvPpfh3rxvwrVaPgB0m2xFpAR4DXgL9yb7PqDNiyvTazH+C7g25KHXAv8Mk5xCzzUPeA+uqzWS+58MLAX2Ahd6yekq3HP+EVACfBp4P/CI95g0XEJ7B9d6WwjcBRwJOfzdwG9xSeyPwC9FZGbIfW4G5gL/BzjZu1+oH+GSYTHwjJdwb8YlrWLc63AdcGckz9kMPmtBmWiZgfvAs76b/YHt0svjflNVnwcQka8BVwGLgRe6uf/L3vfzgL/g3tRfUdUaEVkfsv1db/tVwAjg8qBP0t/1Est1wBcjiPO9wBlAoaoe9Lb9QkROB/4Llzgn4VoEz6tqC6512dO43C3As6ra8QbqFWXUARcCTwE/B34nIjd5SWIU8B/AFRHErCLix7V6M4DHgR+Ee5CInIJLrE8CNwV1y96Fa3X+zru9VUQ+D7wmIl/wto0GnlbVTd7twPdgD6rqE965bsf9/s4DNgKo6v1B990mIjcCK0VkgqruCdr3XVV9xjtOFu73eVng78l77G3AA7hWuokzlqBMvOt4A1fVKhFpw7XEEJFHgOAquhJV3Ski63DdfH/xvv+Xt/+VkO1/8baXAkVAvchx+XMYrlstEqW4N/k9IcfIoPNN+AlcscYOEfknLmk9paoNPRxzuog0hmzPxH0gANciOYhLSA/jfh8Hca25cD6IS5jpuNbIA7jWy3/38JixuKKXR1X1q4GNIjIWl4DvE5F7g+7v875PV9UyEfkl8IKIvIxrHf5VVTXkHMGveZuI7Md7zb1znYtrBZUAo+jsCZoEBCeoZUE/zwaGA3/xknJAKpApImNVtbqH521iwLr4TLRsxnWZzelm/2zve+ibUTjNXWwL/N3eAcwP+trrbX8JON8bo5mIe0MFL0F52yfTWSCRAlSEHGs+rhsotPusOym4xBB6jBJctyHep/tZwP/FVSvejmvFTOzhmL/r4pgzgV96x2wFfhUU5zXAryMcU9muqptVtcJrsfwE+LKIZPbwmHrcONiHQy4JCLwmN4XEOg+XTNd68V4LLMJ1Tb4XWCci14WcI/Q19weO73Ut/gM3HhkYM7vEu19GyOMOdxHfR0Pim+vFV9vDczYxYi0oExWqWusVQnxeRO7vYhzq60AV7o0pWufcT9dl6S/huuU+AywPimUJbmD9M7g3wUDiWo4bLznkHbMvluM+zWeq6roeYj4GPA8873VfVQEfBn7azTFPAbaoak/r4vwSuFVErvfuf1nfngJtuBZFBtDUzX1avOP/Cdd19z5V3eG1bncBoqqP9nQS7/ezDtfaegT4HK6rMhKluJbQFwOFJV4hSTjrcc9pqqr+I8JzmRizBGWi6UbcIPvLXt/+elzX2ZdwYz7dVqtF2WtAq3fejut4VLVORFZ7299W1cDg/OPetr+LyDdwYx2FXswVqvpUBOd8Gdcie1JEbsEVZozGVd81qeqjInI17pP8MlxL5HxcYUZ5N8f8nnff33vXbFXjWn4fBu73iiTwKvqeB+4HXgpsj8BY78LgQBffTcDL3RS5dFDVFhH5GO73FkhSW4FvAL8SkTrgb7hkVgxcpKrXich0XEvvGVwF3XjgbFwlY6Q24VpUXxGRx3EttDvCPUhVG0Xke8D3vC6+F3Hvf3OBBaraU7emiRHr4jNR41WNLcJVaf0cd9Hsc7ixnDOCBqcHOo4GoAz35v9yyO5Atd6LQfdvwnU3LQd+jUtQT+KKMSKqhPNaOJd4j/sxsAH4O66ycYt3tzpcefSruC7FLwOfU9WXujlmBS7B5eCKQsqBR3EtiPqQu/8C1/L5RSTxelYC+4BtuPGrZ3DdZmF5XYifBN7AJakZXnHEx3Dl3ctwr8FddI4LHcZ1p/0R9zv+C+4DzecjDVhV1+DGFK/D/T5uJrIiFlT127jf+bXAu17sX8J1F5o45LMVdY1JfCJyA65ceqKqdjVuZ0zCsS4+YxKYd3HwSbgS6p9ZcjLJxLr4jElsD+LGu9YDP4xxLMZElXXxGWOMiUtJ1cUnIsNwZaj7cCWzxhhj4lsqbtLiMu8yjA5JlaBwyen1WAdhjDGm187GVVZ2SLYEtQ/g8ccfp6ioKNaxGGOMCaOyspIrrrgCvPfvYMmWoNoAioqKOOmkuFyY1RhjTNdOGJaxKj5jjDFxyRKUMcaYuGQJyhhjTFyyBGWMMSYuDWqRhIh8HDfj9TwgV1V9IfsXAD/DrdNSA9yrqg8MZozGGGPiw2C3oOqAh+hi9mERGYFbJ+cFIA83K/JdIvKRwQquvd1Pa1t7+DsaY4wZcIOaoFT1BVX9H6Cr9Wouw5UZfltVm1T1bdzSAjcMVny/eGotV97xHDX1g7FkkTHGmJ7E0xjUPGCVqgY3YZbjuvsGRcORZg43tfLmmr3h72yMMWZAxVOCGsGJi7DVe9sHRWlxIQBl5VWDdUpjjDHdiKcEdQgYGbJtlLd9UCycVUiKD9ZtreFIU8tgndYYY0wX4ilBvQssEJHgmBYBqwcrgBHZGcyanEdrm59VG6sH67TGGBNX3nnnHUSk4/YjjzzCNddcM+hxDHaZeSqQDmR4tzO9Xc3Ak8A9wDdE5Ae4MalrgesHM8bSkiLKt9VSVl7Je04ZP5inNsaYQbFu3ToefPBBVq5cybFjxxg/fjyXXnopV199Nenp6Sfc//rrB/VtuMNgt6A+BRzFlZLj/XwUOEdVDwEXAh/CjT39Bfimqv55MAMsLXHjUMsrqmhvt8UcjTHJ5a233uKTn/wk06dP5+9//ztlZWV861vf4q9//Ss33ngj7e3xc6nNoLagVPU3wG962L8KOGOw4unKyYW5FORlsb/2CJt21SGT8mIZjjHGRNVdd93FBRdcwM0339yxrbS0lIceeohLLrmE5557jvz8/OMe89Of/pRly5bxu9/9DoBPfepTlJSUUFNTwyuvvEJubi433HADl19+eVRjTbblNvrN5/OxuLiQZ5duo6y8yhKUMaZXvvnLt1leMXiVwKcWF3LnNadHdN9t27axfft27rzzzhP2TZs2jblz5/LKK6/w0Y9+NOyxnnzySR588EF++MMf8vzzz3PzzTdz5plnMnHixF4/h+7EU5FE3CgtcYsdWrm5MSaZ1NbWAlBYWNjl/qKioo77hHPhhRdy2mmnkZKSwoc+9CFyc3MpLy+PWqxgLaguzZk2hsyMVLbuPUhN/VHyRw2PdUjGmAQRaWsmFvLyXI9QVVUV06ZNO2F/ZWVlxIu9FhQUHHc7Ozubw4cP9z/IINaC6kJGeirzZ44FoGwQm+rGGDOQpkyZwqRJk3jqqadO2Ld161bWrl3LueeeO/iBdcMSVDc6u/kqYxyJMcZEz5133slzzz3HfffdR01NDS0tLSxfvpwbbriB008/nYsuuijWIXawLr5unOpNe/TuxmqamlvJzLBflTEm8b3nPe/h8ccf56GHHuKiiy7i2LFjjBs3jksvvZRrrrmG1NTUWIfYwef3J8+1PiIyGdj20ksvRdyP2pMv/eQ1Nu+q546rT+toURljjIme3bt3c/755wNMUdXtwfusi68Hi23yWGOMiRlLUD0IHodKppamMcYkAktQPZg6YSR5I4ZRc7CJ7fsGbVJ1Y4wxWILqUUqKj1OLXStqyao9VNcdPe7rYOOxGEdojDHJy0rTwigtKeSf7+zgf1/exP++vOmE/V+9chHnLOh/QYYxxpjjWQsqjIVSwPwZY8kfmXnc18icDABeWr4rxhEaY0xyshZUGBnpqXz7+jNP2F7fcIxPf/N51myq4eixVoYPs1+lMcZEk7Wg+mhU7jBmnjya1rZ23t1kq+8aY0y0WYLqh8DihnadlDHGRJ8lqH5Y7F0ntbyi0lbfNcaYKLME1Q+Tx40gf2QmtYeOsXXPwViHY4wxScUSVD/4fD6b9dwYYwaIJah+CoxDLbN1o4wxJqosQfXTKTPGkpGeyuZd9dQeaop1OMYYkzQsQfXTsPRU5s3IB2C5taKMMSZqLEFFgY1DGWNM9FmCioJSb92o1RuraW5pi3E0xhiTHCxBRUH+qOFMHT+SpuY21m05EOtwjDEmKViCipLOWSWsm88YY6LBElSUBJeb2+q7xhjTf5agomTGxNGMzMlgf+0RdlY1xDocY4xJeHG3RoSIFAI/Bt4PZADlwNdUdUlMAwvDrb5byEtluygrr2JS0YhYh2SMMQktHltQDwHjgRJgDPAX4O8iMiqmUUXAys2NMSZ64jFBTQf+rKo1qtoG/BzIAabFNqzwFswcS1qqjw3bazl0uDnW4RhjTELrU4ISEZ+IzBaR3GgHBNwDXCYiRSKSDtwIbATWDcC5oiorM505U/Np98PKDTarhDHG9EdECUpE7hWRq72ffcBLwFpgt4icEeWY3gRagH3AUeDLwFWqeizK5xkQHdV8toihMcb0S6QtqI8C672fPwicApwB/Bb4XrSCEZEUXPLbDeQBmcDngOdEZG60zjOQAuNQKzdU0drWHuNojDEmcUWaoApxSQPgQtwY0TvAA8D8KMYzGpgK3K+qdaraqqp/A7YCF0TxPANmXH42JxXkcLiplYpttbEOxxhjElakCaoOKPJ+fh/wqvezD0iNVjCqegCoAD4vIiNEJEVELgFmAyuidZ6BFmhFLbNqPmOM6bNIE9TzwKMi8hgwBXjB2z4b2B7lmC7Ftdg2A/XAd4EbVfXVKJ9nwHROe2TjUMYY01eRXqj7BVyiOBn4D1Wt97YvAp6IZkCqugn4cDSPOdhKJueRPTydPdWN7K1uZPzYnFiHZIwxCSeiBKWqDbgkFbr9tqhHlARSU1NYNKuAJav2UFZRxaWWoIwxptcivg5KRMaIyBdE5KciMsbbdrqITBq48BKXzSphjDH9E1ELSkTmAK8AB4FJuLnyDgAX47r9Pj1QASaqRbMKSPHBui0HONLUQlZmeqxDMsaYhBJpC+pHwB+AGUBT0PbngbOjHVQyyM3KoHjKGNra/azS6liHY4wxCSfSBFUKPKiqoQsd7aKz/NyECCwFb+XmxhjTe5EmKB/QVR/VROBQ9MJJLoFy8xUbqmhrt0UMjTGmNyJNUC8BNwTd9otIBnAb8M+oR5UkJhbmUpiXxcHGZjbtqot1OMYYk1AiTVBfA/5DRN4EhgE/AzYBc4BbByi2hOfz+eyiXWOM6aOIEpSqbgbm4WaQCLSY/h+wUFV3DVBsScHKzY0xpm8iLTM/S1XfAL7Zxb7rVfWRqEeWJOZOG0NmRirb9h5if90RCkZnxTokY4xJCJFOdfSUiJyjquXBG701on4EWILqRnpaKgukgLfW7uO1lbs5e/6E4/YPH5bGyJxhER2r4Ugzh4+2DESY5GRlkDPcrtUyxsSPSBPUvcALInK6qu4BEJFPAz8FLh+o4JJFaXEhb63dx2//UcFv/1Fxwv67rj2dRbMKezzGlt31fPn+JbQPUDVgeloKP735PCbYtEzGmDgR6Vx8d4vIBOCfInIWcBHwC+CTqvrMQAaYDM48ZTwvLd9FTf3R47Yfa26jvvEYr67YHTZBLVm1h/Z2P7lZ6VGflaLxaAuHj7bwxrt7uPz9EtVjG2NMX0XaggI3WewTwFLckhufUdUnBySqJJM9PJ27bzzrhO17qhu5/u6X3HVSbe2kpnZfs1JW4Yosvn7VYuZOy49qfG+v28d3f72MsvIqS1DGmLjRbYISkTO72Pww8GvgMWBX4D6q+ubAhJfcJozNYXx+NntrDrNhRx2zp47p8n77ag6zq6qR7OHpFE/Oi3oc82aMJT0thY0766hvOMao3MjGxIwxZiD1VGb+BvC69z3w9S/c7BH/GbTv9QGOMalFUoYeaD0tkgLSemhl9dXwYWnMnZ6P3+9mvTDGmHjQ07vdFGCq931KF7enBn03fdRxIW9F94mhbH3VcfcdCIuL7YJiY0x86baLT1V3DGYgQ1XJlDFkZaaxs7KBygOHKRqTfdz+I00trNtaQ4oPFoYppOiPU0uK4K9rWan7aWltJz0t+i01Y4zpjXBjUO+oals341EdbAyq79LTUlggBSx9dy/LK6q4+KzjG6SrNlbT2uanZEoeI7IzBiyOwrwsJhXlsqOygfKtB5g3c+yAncsYYyIRbgxqTNDPoeNRb2BjUFGxuIf5+gJjU4GxqoEUOMeyCpuWyRgTe+HGoKqDfg4djwoeizL9sGhWIT4frNlcw9FjrR3b29v9LK8Y+PGngI7xsPVV+P22PIgxJrYiGoOy8aiBNTJnGHLyaDbsqGP1xmrOmDsOgE276jjY2ExBXhYnF+YOeBwyKY/crHT2HTjMnupGTioY+HMaY0x3Ir5QV0QKcWtCzfY2rQceVlXrD4qC0pIiNuyoo6y8siNBBbr8FhcX4vP5BjyG1BQfi4oLeXXFbsrKqyxBGWNiKqJSLRE5D9gCfAZo974+A2wWkfcNXHhDR6B7bXlFVcd8e4EENRjjTwGLiwPXZVm5uTEmtiJtQT0A/BG4TlXbAEQkFTeL+QO4hQtNP0weN4L8UcOpqT/Klj31jM7NZOveg2RmpDJnWtczTAyEBbMKSEnxsX7bARqPttgM58aYmIn0YpfpwA8DyQnA+/lHwLSBCGyoCV19N3Dh7vyZY8lITx20OHKGpzN7yhja2/2s2rB/0M5rjDGhIk1Qa+i6Wm8KbizKRMHioGmPBrO8PFQgUVq5uTEmlnq6UHd80M1vAz/xCiXe9radDnwNuHngwhta5k7PJyM9lc27D5KW2gDAqcUDX14eqrSkkMeeWc+Kiira2v2kpgx8gYYxxoTqaQxqNxB8MYwPN4u5P+g2wN+AqPZBich7ge8AC4Bm4HVVvTSa54hHw9JTmT9jLMvKK2lta2f6xFHkjcgc9DgmjM1hXH42+2oOoztqKZkyeGNgxhgT0FOCOm/QoggiIucAT+NK2p8E2oD5sYglFkpLClnmde8tjkHrCTrHw55espUlq/acsPzGsPRUxowcHpPYjDFDR08X6r42mIEEuRv4hao+HrRtWYxiGXTBM0bEYvwpYHFxEU8v2crfl27j70u3nbD/xo/M48IzJg9+YMaYIaM3K+oOOBHJBk4DlorIclwRxkbgNlV9KabBDZIxI4fzH+dNp+FIC1MnjIxZHLOnjeGMuePYvvfQcdubW9s4cLCJV1bssgRljBlQcZWggNG4ysIrgQ8B64CrgGdEZI6qbo1hbIPmqotnh7/TAEtLTeHWqxafsP1IUwtX3PEcG7bXcuhw84DOsG6MGdribdGfBu/7Y6q6SlVbVPVRYBvwwRjGZTxZmenMmZpPux9W2uq7xpgB1G2CEpGTRWRQ64tV9SCwleOrB+nitomh0h6WBzHGmGjpqQW1DRgLICIvi8iowQmJnwH/V0TmikiqiHwWmAw8N0jnN2EEijdW6H5a29pjHI0xJln1lKAagHzv53OBwZqU7ce4Of5eAOqAzwH/pqrbB+n8Joxx+dmcVJDD4aMtVGyvjXU4xpgk1VORxCvAiyISmMrozyLS3NUdVfWCaAWkqn7gW96XiVOlJUXs3r+ZsvIq5k7LD/8AY4zppZ5aUJ8GfgJsx40BVQJ7uvkyQ0znOJTN12eMGRg9XajbAPwAQETeD9yoqgcGKzAT34on55E9PJ3d+xvZW9PI+PycWIdkjEkyEZWZq+oUS04mWFpqCoukAIDlVs1njBkAvVny/TzgG3Qu+b4O+K6qvjoAcZkEUFpSyJLVeygrr+KSc2xZMGNMdEW65PsngBeBQ7i58u4GGnFFFJcPXHgmni2cVUiKD9ZtreFIU0uswzHGJJlIW1C34ebD+37QtvtF5FbgduBPUY/MxL0R2RnMmpxH+bZaVmk175k3PvyDjDEmQr1Z8v3PXWz/s7fPDFGBi3aXWTWfMSbKIk1Q1cApXWyf5+0zQ1Sg3HzFBrf6rjHGREukXXy/B34uImOB171t5+CWgn90IAIzieHkwlwK8rLYX3uETbvqmDUpL9YhGWOSRG/GoFKB+3FTHvmAY8ADwB0DE5pJBD6fj8XFhTy7dBtl5VWWoIwxURNRglLVVuCrInIHnWNOm1X16IBFZhJGaUkRzy7dxjvr9vG+Uycet88HFI7JJjVlUCfGN8YkgV4tWOglpLUDFItJUHOmjSEzI5UdlQ1cf/eJCx+fPqeIb3z2tBhEZoxJZPG2oq5JQBnpqXziAuGf7+zAH1InUXngMMvKq2g80kxOlq2+a4yJnCUoExWXnTeDy86bccL2Wx9aytotNazU/Zyz4KQYRGaMSVTxtuS7STK2+q4xpq/CJigRSROR60TEpgkwvXbcdVK2+q4xphfCJiivgu/HDN6KuiaJTBibw7j8bBqOtLBhR12swzHGJJBIu/hWAHMGMhCTnHw+ny1uaIzpk0iLJL4P3CsiI4Ey4HDwTlXdG+3ATPJYXFzE00u2UlZRxVUXzw7/AGOMIfIE9az3/fe45d8DfN7t1GgGZZJLydQxDB+Wxs7KBioPHKZoTHasQzLGJIBIE9R5AxqFSWrpaSkslAKWrtnL8ooqLj5raqxDMsYkgEinOnptoAMxya20pJCla/ZSVm4JyhgTmd4s+S7AdcAM4FpVrRSRS4AdqvruQAVoksOiWYX4fLBmcw1Hj7UyfJhdI26M6VmkS76fDazGrf90AZDl7SrBZjM3ERiVO4yZJ4+mta2d1RttCTFjTHiRlpl/D/iWqp4PNAdtfxlYHPWoTFJa7K2+a+XmxphIRJqg5gF/6mJ7FTA2euGYZBa4Hmp5RRXttvquMSaMSBNUEzCyi+0zsSXfTYQmjxtB/qjh1DUcY8ue+liHY4yJc5EmqH8AXxeRwP39IpIPfAd4ekAiM0nn+FklbPJYY0zPIk1QtwCzge1AJvAUsA0YjlsOPupE5K8i4heRcwfi+CY2bBzKGBOpiBKUqu4HFuEq9n4OLAVuAkpVNeozgIrIp+msFDRJZO70fDLSU9m8+yAHDh6NdTjGmDgW8cUoqtoE/Mb7GjAichKu6/AsYMdAnssMvmHpqcyfMZZl5ZUsr6jig6dPjnVIxpg41ZsLdecBX8Z19QGUAz+K5kW6IuIDHgO+o6o73bXBJtmUlhSyrLySsnJLUMaY7kV6oe7luCU3puOufXoZmAqs8PZFy38CPlX9RRSPaeJMoFBi9aZqmlvaYhyNMSZeRdqC+h7wfVW9PXijiHzL29fVNVK9IiLTgNuB0/t7LBPfxowcztQJI9m65yBrt9SwaFZhrEMyxsShSKv4xgG/7WL777x90XA2MAbXKqsRkRpv+99E5OEoncPECSs3N8aEE2mCehNXxRfqVOCdKMXyBK7bcH7QF8A1wK1ROoeJE8Hl5n6/zSphjDlRt118InJm0M1f41bUnQW87W07Hbga+Fo0AlHVI8CRkBgAqgeilN3E1vSTRjEqZxj7646ys7KBSeNGxDokY0yc6WkM6g3carm+oG1dzVz+W+DxaAYVoKq+8PcyiSglxcepxYW8WLaTZeWVlqCMMSfoqYtvCq7LbUqYL1t9zvSJjUMZY3rSbQtKVe0iWTOg5s8cS1qqD91Ry8HGY4zMGRbrkIwxcaQ3F+qOBs4ACghpeanqY1GOywwBWZnpzJmWz+qN1azU/Zy3aGKsQzLGxJGIEpSIXIYba8rCLVgYXHblx83+YEyvlZYUsnpjNWXlVZagjDHHibQF9UNcErpDVW0hHxM1pcVFPPrUOlZuqKK1rZ201EivfDDGJLtI3w3GAj+x5GSibVx+NhMLczjc1ErFttpYh2OMiSORJqincbOLGxN1pcXuot1ltkaUMSZIpF18NwD/IyILgbVAS/BOVe1qGiRjIlJaUsiTr26mrLyKqy+ZE+twjDFxItIE9QHgPOAiIHT6aT9dz9NnTESKJ+eRPTydPdWN7K1uZPzYnFiHZIyJA5EmqPtwRRJ3qWpNuDsb0xupqSksmlXAklV7KKuo4lJLUGeTelIAABwxSURBVMYYIk9QY4D7LDmZgbK4pIglq/bw5pq9zJ85tl/HKhidxfBhEV/iZ4yJU5H+Fz8LnAlsHcBYzBC2cFYBKSk+yrfV8vkfvtKvYxWMHs7Pv/5+K1k3JsFFmqDeAH4gIguANZxYJPGHaAdmhpbcrAw+dv5Mlq7Z26/jVNcdYX/dUSq21TJ3en6UojPGxEKkCeoB7/uXutjnByxBmX674sJZXHHhrH4d47Fn1vPXVzezrLzSEpQxCS6iBKWq1ldiEkJpSSF/tZJ1Y5KCJR6TVEJL1o0xiSvSyWK7Wqiwg6p+KzrhGNM/aakpLJIClqy2knVjEl2kY1CfCrmdDkwAmoB9gCUoEzdKZxe5BFVeyaXnTIt1OMaYPop0DGpG6DYRKQD+H/DzaAdlTH8smlVAig/WbTnAkaYWsjLTYx2SMaYP+jwGpar7gduAe6IXjjH9l5uVQfGUMbS1+1ml1bEOxxjTR/0tkmgBxkcjEGOiqbS4ELAZ0o1JZJEWSZwZssmHS0y3AMujHZQx/VVaUshv/l7Oig1VtLX7SU3xxTokY0wv9WYmCT8uMQVbClwb1YiMiYKJhbkU5mVRVXuETbvqmDUpL9YhGWN6KdIENSXkdjtQrapNUY7HmKjw+XyUlhTy7BvbKCuvsgRlTAKKtIpvx0AHYky0lZYUeQmqkk9dVBzrcIwxvdRjghKRcyI5iKouiU44xkTP3GljyMxIZdveQ1TXHWXs6OGxDskY0wvhWlCv0vXYE972wHdbfMfEnfS0VBZIAW+t3cfyikouOjO0p9oYE8/ClZlPBE72vgd/TQHuxs0ksWcgAzSmPzrLzatiHIkxprd6bPmo6gnJR0Quxl2cOx43xdFPohWMiNwDXIxLgo3Ac8AtqnogWucwQ8upXoJas6mapuZWMjOssW9Mooj4v1VEFgL3Amfhpjf65gAsAd8GXAmsA0YDvwd+A/x7lM9jhojRIzKZMXEUm3bVs2ZTDYtnF8U6pISzv+4IR5paT9g+MjuD0SMywz7e7/dTVXuEpua2iM7nAyYU5NiKyCZ8ghKRicD3gU8AfwNmq+qmgQhGVW8NurlfRB7AFkM0/VRaUsSmXfUsK6+0BNVLyyuq+OYv3+5yX2qKj5/efB4TC3N7PMYrK3bx4/9Z1avzLi4p4varT+vVY0zyCVfFdzfwBeBd4BxVXTooUXU63zu3MX1WWlLIH17YQFl5FX6/H5/PZpWI1GsrdwOQP2o42ZmdbxcHG5upbzzG0jV7+fgHpMdjvLrCHaMgL4vhGalhz7mrqoHlG6poONJMblZGP6I3iS5cC+oW4ChuPOhOka7/EFX1gijHhYh8DLgGeG+0j22GlmkTRpI3IpPaQ01s3XOQaSeNinVICaGtrZ0VG1xxyXeuP5MJQWtrLVtfybcfe4ey8soeE9SRphbWbjmAzwf33XQOI3OGhT3vNx5eyprNNazcsJ/3Ljyp/0/EJKxwnby/BZ4AduOq9br7iioR+ThunOsSVV0Z7eOboSUwqwRAWYVV80Vqw446Go60MD4/+7jkBHDKjHwy0lLYuLOeuobuJ5R5d1M1rW3tyMmjI0pOQOdrZZWXQ164Kr6rBimODiJyNfBD4OIYdCmaJLW4pIgX3t4R9hO/6VTmzQRfWnLiuF1mRhqnzBjL8ooqVlRU8f7Fk7o5RlW3x+hOaUkRv3p6vZvot62dVCuWGLLi6pUXkS/gStgvsORkoinST/ymU6C1GWjRhAps7+4as/Z2f9hjdGXC2BzG52fTeLSFDTvqehOySTJxlaCA+4GRwKsi0hj0dXKsAzOJLfCJH2CFdfOFVXngMDsrG8jKTKNkypgu7xO4xmz1xv20tJ5YQr55dz31DcfIHzWcyeNG9Or8gRZXma3nNaTFVYJSVZ+qpqtqTsjXzljHZhJfuE/8ptNyL4kvkALS07p+mygYncXkcSM4eqyNdVtOvJa+s3uvsNeVk/ZaGYizBGXMQAr3id90CiSXxWG65noqPimrqPSO0ftrz0qmjCErM41dVQ1UHjjc68eb5GAJygwZ4T7xG+fosVbWbK7B54NFs3pOUIHks2x9JX6/v2P7gYNH2bL7IBnpqcydnt/rGNLTUlggBYBV8w1llqDMkGLl5uGt3hh5afiMk0czIjuDqtoj7N7f2LE90EU4f8ZYhqWHvzi3K4s7ys1tHGqosgRlhpTuPvGbTj2Vl4dKTfF1dJ0GJ5Lg8ae+WjSrEJ8P1m45wJGmlj4fxyQuS1BmSOnuE79x2tv9Ha2fSJNLaEHDsZY2Vm+q7tUxujIyZxizJuXR2tbOu97xzNBiCcoMKd194jfOlj311PWyNHzBzAJSU3xUbK+l4UgzazfXcKy5jWknjWTMyP6tYmyzSgxtlqDMkGMlzN3rS2l49vB0Zk8dQ3u7nxUb9nd2ERb3f+b4juuhKqpob7cu2aHGEpQZckI/8ZtOy8r7VhrekUjWV/Zp9ojuTCrKZezo4dQ3HGPz7vp+H88kFktQZsgJ/sS/csP+WIcTN/pTGh6ouHtz7V6q644yKncY06Mwa7zP56O02Lr5hipLUGZI6pxKx970AvpTGj5+bA4TxmbT2ua64UqLC0lJic66W53dfDZmONREvOS7MclkcUkhv3p6HSs2VLFld/0J4y3j87PJHBbdfw+/30994zFG54ZfJh2g9lAT9Q3HTtielZlG0ZjsPsfR1u5nd1UDbSFjOm+8uxfoe9dcaUkRe17b0q9jdOWU6fkMy0hly+6DrN1cQ/bw9LCPSUnxMbEgp18zoe+vPULj0cjL2wfibyZedPc3AzB+bDaZGQPzvJPzt2lMGIFP/HuqD/PFH792wv5JRbn89Obzorr67ovLdvLAE6v58icXct6iiT3ed/f+Bj7/w1e6fEMAuO2zizltzrg+xfHLv63l2Te2dbu/7wmqkKde20JaagrzvIl5oyEjPZX5M8byzvpKbn048kUOzi+dyBc/vrBP51yzuZpvPPxmrx4zedwIHvjKuUm5YvMvn1rLs0u7/puZOn4k93/l3AE5ryUoM2RdcWExf3ll0wnVYXuqD7OjsoGdlQ1M6uUs3D15afkuAF4u2xU2QS1ds5e2dj+jcocxOrdzNofDTa3srz3CklV7+pSg2tr9vL7arTE6qSj3hG64hVLQ59Lw2VPG8MHTJ3FSQS5ZmeFbOb1x2XnTqW84RnMEcyj6/bB93yHeXLOXGz8yv9vJbnuyZJX7HeWPGk5uVvjnsmd/I9v3HWJnVQOTiqL3NxMP2tr9LPH+ZiaPG0Fo/j19Tv+rNbtjCcoMWWfPn8DZ8yecsP2BP63iX8t2sqy8MmoJ6tDhZiq2ufn/1m2t4UhTS49v4oGxsRs/Mo/TgxLRvprDfO77L7JC99Pa1k5aL7uwNu2q42BjM4V5WVFvIaampvD5j86P2vGClUwZw703nRPx/f/r3lfYvu8Q67fWMH9mQa/O1d7u7yiVv+Pq05gyfmTYx9z/x1W8WLaTsvKqpEtQm3bWcehwM0Vjsga9hWhFEsaEGIiLQ1duqCLQUGtt87NKu58Zob7hGBt31pGedmJX2bj8bE4qyOHw0RYqttf2Oo7+LIGRSPrzGm7dc5DaQ8fIH5kZ8cXKpUk8b+CyoKmvBvtvxhKUMSHmzRhLWmoKG3bUcrDxxCKFvgi8URbmZQGd//RdWbGhCr8f5k7PZ3gXg+79qUDszTx7iaxjzsXy3s+5WNaHN+T5M8eSlupjw/ZaDh1OrmvrOj7UFEev8CVSlqCMCZGVmc7caWPw+2FFFK6Tam1rZ4W643zuw3MBl4S6K4DoWIupmzeEvn5ar647yra9h8jMSGXutK5XyU0WgTkXKw/0fs7FZX240DgrM5050/Jp97vWcrLYX3eE7fsOMXxYKnNi8DdjCcqYLkRzyfGK7bUcPtrCSQU5lJYUUpiXxcHGZjbtqjvhvi2t7az0ktmp3bRyiifnkT08nd37G9lbE/mb73LvOiK3Sm7flsBIFMfPuRh5wqg91MTmXfVkpKdySi8rEZNx3sCOa+NmxuZvxhKUMV0IvNms9IoR+qNz3Md1GfX0Rla+9QBHj7UyqSi3ozswVFpqCou8xfyW9+LNcFkMu2pioXPtr8g/ZATekOfNyO/1xcqBuQdXROFvJl5EurLyQLEEZUwXisZkM7EwlyNNrZRv69/qu51jGoXe9+5bZ8sqIhsj6u2n9abmVtZ4S1acOkQSVGDOxfJttTRGOOdif8boxuVnM7Gw7wUs8abpWGvHMieLYvQ3YwnKmG4sjkKXzd6aRnbvbyR7eDrFk/MAmDttDJkZqWzbe4jquqMd9/X7/ZStj2z8Y+GsQlJ8nSXr4azZXENzazszJo5i9IjIZrJIdMfNuajhxxKbW9pYvdFbx6qPb8iBVlQydPOt2VxDS2s7M08eFfHsJ9FmCcqYbkRjHCrQBbdICjquWUpPS2VBoIsuqPtpT3Uj+w4cJjcrHZmU1+NxR2RnMGtynitZ3xh+Mb/gbsahpDcVj+u2HKCpuY2p40eSP6pvFysnU7n5sjio+LQEZUw3Zk0aTc7wdPZUH2ZPdd9W3+1u6fPAJ/TgNakC911UXEhqBBOtRppA/X7/Cd2MQ0WgFbxiQxVtYcaFovE76msBS7xxfzOxH7O0BGVMN1JTU1g0q+/dfEeaWli3tYYUn+uSCxYYB1qzqZqm5tbjzrE4woX+Am+ky8Ms5rdt7yEOHGwib0Qm0yaEnxUhmQTmXGw40sKGHSdWTQb4/f4+lZeHcn8zvS9giTfuYmX3NzM1hn8zlqCM6UF/umxWbaymtc3PrMl5jMjOOG7f6BGZzJg4iubWdtZsrqHxaAvrtx0gJcXHglmRTc1zcmEuBT2UrAcEtwySefaI7kTS0txZ1cD+2iOMzMlgxsTRUTpf4iao4EUnY/k3YwnKmB4snFVASoqP9VsPcLgXSy9A+Iqw4DeyVRv2097uZ/aUMeREsJwEuMX8FkdwrU88dNXEUme5efjf0alRWMdq0ayCXhWwxKOyPq6sHG2WoIzpQW5WBsWT82hr97NqY+SzSrS3+zuuqemuyyi4dbasj+Mf4T6t1zU0sXFX1/P6DRUlU8aQlZnGzsoGKg8c7vI+0ZwCKjcrg+IpYyIuYIk3dQ1NbNxZT0ZaCqfM6N3KytFmCcqYMPpSbh6YNbwgL4uTC3O7vM+0CSPJG5HJgYNNvPGuW86gtwlqjleyvnXvQWrqj56wf0XFfvx+t+hfsi6mF05aagoLO6omT3wNDx1uZsP2WtJSfSyYGZ0k3rlMfeJV863wfkenzBg7YAsRRiruEpSIpIjI90SkSkQaReR5EZkU67jM0BX4VL28ovv580IFz6fXXR9+8KwSrW1+xudnc1JB18msOxnpnSXrXXVhBWZRWDx7aJWXh+qppRmYaX7O1PyorWMVaQFLPFoW49kjgsXjR6pbgE8A5wB7gPuAZ0Rkvqomx/whJqGcVJBD0ZgsKg8c4fVVuzmpmxZRsLfX7QMimBGiuJAX3t4R0X17OsZba/fxxuo9zJg4qmO73+9nVWBevyE6/hSwaFYBPp+7+HTDjtrj1tEKLMYXzRL8iYVuqqqq2iO8vnoPEwpyonbsgeT3+1m9MfA3E/sPNfGYoK4H7lFVBRCRW4Aq4CxgSSwDM0OTa+kU8czrW/nRH1ZG/LjMjPAzQM+bMZb0tBRaWtv7/AbZUbK+uYYvdbF8/eRxIygY3fW8fkPFyJxhzJqUR8X2Wr76wOtd3ieaF6QGWsfPvrGNex9fEbXjDpYp40cwdnTfLlaOprhKUCIyEpgELA9sU9V6EdkMzMcSlImRf3vPFLbuOcjRY60RP+b8UyeSEWbC0cxhaXz24tnsqDzEnKl9W85g9IhMLn//zC67+FJTfHz0/Jl9Om6y+fgHhMdfqKC17cQut7nT8hmXnx3V81181lS27T3Uq7+ZeBBPfzNxlaCAwPKV9SHb64P2GTPoJozN4e4bzxqQY//72VP7fYwrLyrmyouKoxBN8lo4q4CFEV5jFg0D+TczVMRbkcQh73vopcujgvYZY4wZAuIqQanqQWAHcGpgm9ftNw1YHau4jDHGDL546+IDeAT4qoi8jKviuwfYCLwR06iMMcYMqnhMUD/AdfG9AWR73y+xEnNjjBla4i5BeYno696XMcaYISquxqCMMcaYgLhrQfVTKkBlZeLNf2WMMUNR0Pv1CRcNJluCGgdwxRVXxDoOY4wxvTMO2BK8IdkSVBlwNrAPaItxLMYYY8JLxSWnstAdPr8/sWbaNcYYMzRYkYQxxpi4ZAnKGGNMXLIEZYwxJi5ZgjLGGBOXLEEZY4yJS5agjDHGxCVLUMYYY+KSJShjjDFxyRKUMcaYuJRsUx31mYikAN8BrqZzHarrVHVHTAPrIxH5OHAjMA/IVVVfyP4FwM+A+UANcK+qPjDogfaRiNwDXAxMBBqB54BbVPVA0H0S9jmKyG3AZ4F8oAVYAfy3qq729ifsc+uKiPwV+DBwnqq+6m17P/AjYAawG7hNVZ+IWZC9JCJ3AbcDR4M2P6Oqn/D2J8VrKCLvxb13LgCagddV9VJvX79eQ2tBdboF+ARwDlAE7ASe8RJXIqoDHgK+GLpDREYAzwMvAHnAx4C7ROQjgxph/7QBVwJjcP/gE4HfBHYmwXN8AjhVVUcC44F/As+JSEoSPLfjiMingayQbZOBp4EHgFHAl4HfiMhpgx5g/7yuqjlBX4HklBSvoYicg3udHgHG4t47v+vtm0w/X0NrQXW6HrhHVRVARG4BqoCzgCWxDKwvVPUFABE5t4vdl+He4L/tLRD5tog8CtwA/O+gBdkPqnpr0M39IvIA8IegbQn9HFV1Y9BNH+65FOFWm76UBH5uwUTkJNyn77OA4N6Kq4C1qvor7/azIvIMcB3wzqAGOTAS+u8zyN3AL1T18aBty7zvV9HP1zBRWwdRJSIjgUnA8sA2Va0HNuM+nSebecAq7x8jYDmJ/VzPB94Nup3wz1FE/k1E6oEm4D7gPlWtIwmeG4CI+IDHgO+o6s6Q3fMI+n/0JNxzBE4VkWoR2SEifxCRKd72hH8NRSQbOM37ebmIHBCRt0TkfO8u/X4NLUE5I7zv9SHb64P2JZMRJNFzFZGPAdcANwVtTvjnqKp/V9VRuG7MrwBversS/rl5/hPwqeovutiXDM/xf4HZQAFwBtAKvCgiOSTH8xuNyyFXAtfiWviP4YZGphKF52hdfM4h7/vIkO2jgvYlk0NAYci2hHyuXjHIw8AlqroyaFfSPEdVrRWR+4E6EdlAEjw3EZmGKyA4vZu7HCLB/x9VdV3Qzb0icjVwEDiTJHgNgQbv+2Oqusr7+VER+SLwQaLwGloLClDVg7j+71MD27xuv2nA6ljFNYDeBRaEFIAsIsGeq/cP/xBwsaq+ErI7KZ5jkBQgHVcNlQzP7Wxcy3CFiNSISI23/W8i8jDuOZ4a8phEe46h/N6XjyR4Db33za245xQscLvfr6G1oDo9AnxVRF4G9gD3ABtx5eYJR0RScW9oGd7tTG9XM/Ak7vl9Q0R+gOsrvhZXKJIQROQLwB3ABaoa2s8NCf4cvef3hKpWishYXGXUMeAtXNlywj43zxPAiyHbduG6al/EfdK+RUQ+C/we+ADw78D7BjPI/hCRy4GXVbVaRApwr1k1rqvWR+K/huDK5G8WkT8B5cCngcm4yz589PM1tBV1Pd4nme9y4nVQ22MZV1+JyFXAr7vYdZ6qvupdg/EQnddg/DCRrsEQET+uT/9YyK6SwIB7Ij9HEXkK1/2Vi+sSWQZ8M9CNmcjPrTveaxp6HdR9HH8NzZ9iF2HviMjTuLGnbNxlH0uA21V1s7c/4V9Dr9DldlxizQHWA19T1de8/f16DS1BGWOMiUs2BmWMMSYuWYIyxhgTlyxBGWOMiUuWoIwxxsQlS1DGGGPikiUoY4wxcckSlBkyRORcEfF7M2gbQEQuE5E1/V1WRkTuEpHNvXzMGSKyU0SG9+fcJnnZTBImKXgXefZkBzATGAfsH/iIekdEzgJeB6YM1sXhIpIG3At8JWRW7b64F3iwNw9Q1bdEZB1uItzv9PP8JglZgjLJYlzQz2cCfwEWAvu8bW2q2gxUDnZgcez/AJm4ReX6RVUbcSsb99YvgZ+JyD2q2tLfOExysQRlkoKqdiQeEan1fqwO2X4u8AowUVV3B93+N9x0LfPpnE8M4Oe4JLcOuEpVy4OOtQj4Pi4ZHsW1fr6kqsGL7h1HRC4F7gIENyfiRtzibXXe4wG2iQjAa6p6rve4jwNfA2bhEuyTuClzDnv7X8VN2rkfN5ddBvBH4Auq2tTDr+0K4FlVbQuK8S7c8gm34qb+moBbzffTwPu95zwetxLs1d6EoR2PU9XpIcf5Cm7OuYlAGXCtqm4KiuEfuBVlz8etMGtMBxuDMsa9EX8DN9NyM/A/uCU87gza1jGvoYiUAK/hJm49FTf5ZRvwr6BJeY8jIkXAn71jz8bN0fYT3HyCu3Cr5AIsxrUGL/Med5UXy4+AEjoTxSMhp/gIbnbws3GJ58O4ZNKT99K5+mmwccBngP8ALgLeg1vb6Brc0uQXeee5tYvHhh7nP714zsTNK/hY8B28BPoucF6YY5khyFpQxrhJWF8GEJH7cDNtf0RVX/K2/Qh4UkRyvK6sW3AtjzsDBxCRK3EtoQuBp7o4xzjc7PJPBI0xVQQ9vstWH67F9XVV/Z13e6uIfB54TUS+4K2wC1ALXO+1hipE5DbgARG5LdDSCiYio3Azhu/pItZhwGdUtca77xO4yUCLVLXa2/ZHXKunJ8OATwU95gfA/4hIZkjLbjcwNcyxzBBkCcqY45eKDySHNV1sK8CNs5QC00UkdMwlEzdrc1fW4LrF1onIv4BXgSdVdVd3QXnLbEwC7hORe4N2+bzv03HdZgDLgrvqgKW4BDEt5LkEBCrnuuoC3BNITp5KoDKQaIK2FXQXu2dvyGP2erEXAMFLvDeRWCvJmkFiXXzGQPDgvL+HbSlB33+HG7MK/pqJG/Q/gZc8LsJ1B5bhus82isjFPcQVON9NIeeZh0uEa8M8r57U4J5XXhf7QosV/N1sC/f+0dzFY+jicXm4dZKMOY61oIzpveXAKcAWVY14vRrvvsu8r++JyPPAZ4Fn6XwzTw26f5WI7AJEVR8Nc/hSEUkNakWdiVsra0s3sbR4Jd6zcRWPsTQXeCbGMZg4ZAnKmN77Hi7J/F5E7sd9+p+MK0y4X1W3hj5ARM7Ejdn8E1f6PgOX5H7l3WUH0A58yFud9JhXIfcN4FciUgf8DdeSKQYuUtXrgk4xBleufT9uPOfbwM+7Gn8K8g9coUTMiMgM3Pjcc7GMw8Qn6+IzppdUtQLXQsnBjSuVA4/ixnXqu3nYQVzl3t+ATbhqtsdxiQRVrQK+jisn3+fdD6844mPAxbikWIYrnAgtbvhfoAG3EvQfca2yr4V5Kr8AzhGRiWGf9MC5EvhXV0ndGFtR15gE510HtVlVr+nDY38FNKjqF6MeWPhz5wCbgQ+r6tuDfX4T/6wFZczQ9nWgsr9z8fXRFOA2S06mO9aCMibB9acFZUw8swRljDEmLlkXnzHGmLhkCcoYY0xcsgRljDEmLlmCMsYYE5csQRljjIlL/x8TtMQ1Lz6nlgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6EJ0ZIdzCu22", + "outputId": "6cda5580-3b90-487e-b4a4-2075deaca95f" + }, + "source": [ + "print(bikeshare.olin_empty, bikeshare.wellesley_empty, bikeshare.t_first_empty)" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "stream", + "text": [ + "6 0 25\n" + ], + "name": "stdout" + } + ] + } + ] +} \ No newline at end of file diff --git a/colab/chap04.ipynb b/colab/chap04.ipynb index 5a790b562..57b00f8a5 100644 --- a/colab/chap04.ipynb +++ b/colab/chap04.ipynb @@ -1,681 +1,1288 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 4" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Returning values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a simple function that returns a value:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def add_five(x):\n", - " return x + 5" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "y = add_five(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you run a function on the last line of a cell, Jupyter displays the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n", - "\n", - "In the following example, Jupyter shows the second result, but the first result just disappears." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "add_five(3)\n", - "add_five(5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "y1 = add_five(3)\n", - "y2 = add_five(5)\n", - "\n", - "print(y1, y2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", - "\n", - "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running simulations" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the code from the previous notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def step(state, p1, p2):\n", - " \"\"\"Simulate one minute of time.\n", - " \n", - " state: bikeshare State object\n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " \"\"\"\n", - " if flip(p1):\n", - " bike_to_wellesley(state)\n", - " \n", - " if flip(p2):\n", - " bike_to_olin(state)\n", - " \n", - "def bike_to_wellesley(state):\n", - " \"\"\"Move one bike from Olin to Wellesley.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.olin == 0:\n", - " state.olin_empty += 1\n", - " return\n", - " state.olin -= 1\n", - " state.wellesley += 1\n", - " \n", - "def bike_to_olin(state):\n", - " \"\"\"Move one bike from Wellesley to Olin.\n", - " \n", - " state: bikeshare State object\n", - " \"\"\"\n", - " if state.wellesley == 0:\n", - " state.wellesley_empty += 1\n", - " return\n", - " state.wellesley -= 1\n", - " state.olin += 1\n", - " \n", - "def decorate_bikeshare():\n", - " \"\"\"Add a title and label the axes.\"\"\"\n", - " decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Time step (min)', \n", - " ylabel='Number of bikes')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(p1, p2, num_steps):\n", - " \"\"\"Simulate the given number of time steps.\n", - " \n", - " p1: probability of an Olin->Wellesley customer arrival\n", - " p2: probability of a Wellesley->Olin customer arrival\n", - " num_steps: number of time steps\n", - " \"\"\"\n", - " state = State(olin=10, wellesley=2, \n", - " olin_empty=0, wellesley_empty=0)\n", - " \n", - " for i in range(num_steps):\n", - " step(state, p1, p2)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now `run_simulation` doesn't plot anything:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.4, 0.2, 60)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But after the simulation, we can read the metrics from the `State` object." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.2, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When `p1` is large, we probably do." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "state = run_simulation(0.6, 0.2, 60)\n", - "state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More for loops" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` creates a NumPy array of equally spaced numbers." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "p1_array = linspace(0, 1, 5)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use an array in a `for` loop, like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " print(p1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This will come in handy in the next section.\n", - "\n", - "`linspace` is defined in `modsim.py`. You can get the documentation using `help`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "help(linspace)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** \n", - "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "help(linrange)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Sweeping parameters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`p1_array` contains a range of values for `p1`." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "p2 = 0.2\n", - "num_steps = 60\n", - "p1_array = linspace(0, 1, 11)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " print(p1, state.olin_empty)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "sweep = SweepSeries()\n", - "\n", - "for p1 in p1_array:\n", - " state = run_simulation(p1, p2, num_steps)\n", - " sweep[p1] = state.olin_empty" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "plot(sweep, label='Olin')\n", - "\n", - "decorate(title='Olin-Wellesley Bikeshare',\n", - " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", - " ylabel='Number of unhappy customers')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", - "\n", - "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional Exercises\n", - "\n", - "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n", - "\n", - "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", - "\n", - "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", - "\n", - "`num_runs` specifies how many times it should call `run_simulation`.\n", - "\n", - "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n", - "\n", - "Test your function with parameters\n", - "\n", - "```\n", - "p1 = 0.3\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 10\n", - "```\n", - "\n", - "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", - "\n", - "```\n", - "p2 = 0.3\n", - "num_steps = 60\n", - "num_runs = 20\n", - "```\n", - "\n", - "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", - "\n", - "What value of `p1` minimizes the average number of unhappy customers?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap04.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "hJqZ6trlvHt_" + }, + "source": [ + "# Chapter 4" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "4VHCpHssvHuF" + }, + "source": [ + "*Modeling and Simulation in Python* Chun San Yip 13 June 2021\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "mQD7oFW1vHuI" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LykixBw0vHuK" + }, + "source": [ + "## Returning values" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_phSFofYvHuL" + }, + "source": [ + "Here's a simple function that returns a value:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rKUNhLXbvHuL" + }, + "source": [ + "def add_five(x):\n", + " return x + 5" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f1lbJYfxvHuM" + }, + "source": [ + "And here's how we call it." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zWxCyBqJvHuM" + }, + "source": [ + "y = add_five(3)" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_Vtld2FMvHuM" + }, + "source": [ + "If you run a function on the last line of a cell, Jupyter displays the result:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vCoivTKlvHuO", + "outputId": "08f599d5-d108-40eb-cd91-7fb77cceb169" + }, + "source": [ + "add_five(5)" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "10" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "05iajahhvHuP" + }, + "source": [ + "But that can be a bad habit, because usually if you call a function and don't assign the result in a variable, the result gets discarded.\n", + "\n", + "In the following example, Jupyter shows the second result, but the first result just disappears." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "A5TJW9XavHuQ", + "outputId": "dba1ddae-e267-4bbf-ce2f-e501caf11699" + }, + "source": [ + "add_five(3)\n", + "add_five(5)" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "10" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qz0K3UFXvHuR" + }, + "source": [ + "When you call a function that returns a variable, it is generally a good idea to assign the result to a variable." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "LuuiHxwZvHuR", + "outputId": "02cc1bf3-355f-4893-ff07-b6a92b91c260" + }, + "source": [ + "y1 = add_five(3)\n", + "y2 = add_five(5)\n", + "\n", + "print(y1, y2)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "8 10\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H--GoNGJvHuR" + }, + "source": [ + "**Exercise:** Write a function called `make_state` that creates a `State` object with the state variables `olin=10` and `wellesley=2`, and then returns the new `State` object.\n", + "\n", + "Write a line of code that calls `make_state` and assigns the result to a variable named `init`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JJcGx5LrvHuS" + }, + "source": [ + "def make_state():\n", + " return State(olin=10, wellesley=2)" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "3Fo5zVkqvHuS" + }, + "source": [ + "init = make_state()" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xIcij9HqvHuT" + }, + "source": [ + "## Running simulations" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LlpVHfJWvHuT" + }, + "source": [ + "Here's the code from the previous notebook." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6DJ8lvnkvHuT" + }, + "source": [ + "def step(state, p1, p2):\n", + " \"\"\"Simulate one minute of time.\n", + " \n", + " state: bikeshare State object\n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " \"\"\"\n", + " if flip(p1):\n", + " bike_to_wellesley(state)\n", + " \n", + " if flip(p2):\n", + " bike_to_olin(state)\n", + " \n", + "def bike_to_wellesley(state):\n", + " \"\"\"Move one bike from Olin to Wellesley.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.olin == 0:\n", + " state.olin_empty += 1\n", + " return\n", + " state.olin -= 1\n", + " state.wellesley += 1\n", + " \n", + "def bike_to_olin(state):\n", + " \"\"\"Move one bike from Wellesley to Olin.\n", + " \n", + " state: bikeshare State object\n", + " \"\"\"\n", + " if state.wellesley == 0:\n", + " state.wellesley_empty += 1\n", + " return\n", + " state.wellesley -= 1\n", + " state.olin += 1\n", + " \n", + "def decorate_bikeshare():\n", + " \"\"\"Add a title and label the axes.\"\"\"\n", + " decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time step (min)', \n", + " ylabel='Number of bikes')" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uTNT3WVsvHuU" + }, + "source": [ + "Here's a modified version of `run_simulation` that creates a `State` object, runs the simulation, and returns the `State` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rjj6PvkuvHuU" + }, + "source": [ + "def run_simulation(p1, p2, num_steps):\n", + " \"\"\"Simulate the given number of time steps.\n", + " \n", + " p1: probability of an Olin->Wellesley customer arrival\n", + " p2: probability of a Wellesley->Olin customer arrival\n", + " num_steps: number of time steps\n", + " \"\"\"\n", + " state = State(olin=10, wellesley=2, \n", + " olin_empty=0, wellesley_empty=0)\n", + " \n", + " for i in range(num_steps):\n", + " step(state, p1, p2)\n", + " \n", + " return state" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f42qVmi3vHuU" + }, + "source": [ + "Now `run_simulation` doesn't plot anything:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "KHPTTF6UvHuU" + }, + "source": [ + "state = run_simulation(0.4, 0.2, 60)" + ], + "execution_count": 43, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aGx5TYmcvHuV" + }, + "source": [ + "But after the simulation, we can read the metrics from the `State` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Mg3NbpSfvHuV", + "outputId": "085b2ba1-47ab-47d7-98ae-79f9d47eadc6" + }, + "source": [ + "state.olin_empty" + ], + "execution_count": 44, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 44 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4gs2MRMKvHuW" + }, + "source": [ + "Now we can run simulations with different values for the parameters. When `p1` is small, we probably don't run out of bikes at Olin." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "R4Rzil5VvHuX", + "outputId": "4bf6c094-c3e0-4fa8-d0ea-7637a6c8d273" + }, + "source": [ + "state = run_simulation(0.2, 0.2, 60)\n", + "state.olin_empty" + ], + "execution_count": 47, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 47 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0KWHc4wWvHuX" + }, + "source": [ + "When `p1` is large, we probably do." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EQCkb5J9vHuY", + "outputId": "abdf74d1-8a8c-4fbb-b239-1d103041b814" + }, + "source": [ + "state = run_simulation(0.6, 0.2, 60)\n", + "state.olin_empty" + ], + "execution_count": 48, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "12" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 48 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pcCMjqh9vHuZ" + }, + "source": [ + "## More for loops" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-21-2GlDvHuZ" + }, + "source": [ + "`linspace` creates a NumPy array of equally spaced numbers." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AiMQdg-cvHuZ" + }, + "source": [ + "p1_array = linspace(0, 1, 5)" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UFkbjfaUvHua" + }, + "source": [ + "We can use an array in a `for` loop, like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Khby-fjMvHub", + "outputId": "e91f59e8-65d6-4708-cd58-f82b9121dab8" + }, + "source": [ + "for p1 in p1_array:\n", + " print(p1)" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.0\n", + "0.25\n", + "0.5\n", + "0.75\n", + "1.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DWdGgkhMvHub" + }, + "source": [ + "This will come in handy in the next section.\n", + "\n", + "`linspace` is defined in `modsim.py`. You can get the documentation using `help`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "PBfBZuCyvHub" + }, + "source": [ + "help(linspace)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9QoYH55OvHub" + }, + "source": [ + "`linspace` is based on a NumPy function with the same name. [Click here](https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html) to read more about how to use it." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SQy_y1CLvHub" + }, + "source": [ + "**Exercise:** \n", + "Use `linspace` to make an array of 10 equally spaced numbers from 1 to 10 (including both)." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9H25skYIvHuc", + "outputId": "23df88df-2699-40f5-95f0-9e337b21fa60" + }, + "source": [ + "linspace(1,10,10)" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "15AnbCt1vHuc" + }, + "source": [ + "**Exercise:** The `modsim` library provides a related function called `linrange`. You can view the documentation by running the following cell:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1DxrfOcZvHuc" + }, + "source": [ + "help(linrange)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ez5dhDukvHuc" + }, + "source": [ + "Use `linrange` to make an array of numbers from 1 to 11 with a step size of 2." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WjdtApA8vHuc", + "outputId": "f2d3a318-cff1-4f83-99dc-f1d48c9c6667" + }, + "source": [ + "linrange(1,11,2, True)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([ 1, 3, 5, 7, 9, 11])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3LJYCdPqvHuc" + }, + "source": [ + "## Sweeping parameters" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yLenAlEOvHud" + }, + "source": [ + "`p1_array` contains a range of values for `p1`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "cgaeX-q9vHud" + }, + "source": [ + "p2 = 0.2\n", + "num_steps = 60\n", + "p1_array = linspace(0, 1, 11)" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Yg4mZhr9vHud" + }, + "source": [ + "The following loop runs a simulation for each value of `p1` in `p1_array`; after each simulation, it prints the number of unhappy customers at the Olin station:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OmJyBnEKvHue", + "outputId": "6eda5d55-2e26-4316-c4b7-22170a762038" + }, + "source": [ + "for p1 in p1_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " print(p1, state.olin_empty)" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.0 0\n", + "0.1 0\n", + "0.2 0\n", + "0.30000000000000004 3\n", + "0.4 0\n", + "0.5 8\n", + "0.6000000000000001 12\n", + "0.7000000000000001 24\n", + "0.8 29\n", + "0.9 31\n", + "1.0 43\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1EnKHF63vHuf" + }, + "source": [ + "Now we can do the same thing, but storing the results in a `SweepSeries` instead of printing them.\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EnjRgurLvHuf" + }, + "source": [ + "sweep = SweepSeries()\n", + "\n", + "for p1 in p1_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " sweep[p1] = state.olin_empty" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sZC1BhzfvHug" + }, + "source": [ + "And then we can plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "I9GjwyuxvHug", + "outputId": "51e644c9-5e5d-439f-941c-c03d602cd0f7" + }, + "source": [ + "plot(sweep, label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Y41T1a-HvHuh" + }, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** Wrap this code in a function named `sweep_p1` that takes an array called `p1_array` as a parameter. It should create a new `SweepSeries`, run a simulation for each value of `p1` in `p1_array`, store the results in the `SweepSeries`, and return the `SweepSeries`.\n", + "\n", + "Use your function to plot the number of unhappy customers at Olin as a function of `p1`. Label the axes." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 589 + }, + "id": "yO5cdEV5vHuh", + "outputId": "22ff5e74-c7bc-4214-9f2e-a84efc91ffaf" + }, + "source": [ + "def sweep_p1(p1_array):\n", + " sweep = SweepSeries()\n", + " for p1 in p1_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " sweep[p1]=state.olin_empty\n", + " print(sweep[p1], p1)\n", + " return sweep\n", + "\n", + "sweep_p1(p1_array)\n" + ], + "execution_count": 46, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0 0.0\n", + "0 0.1\n", + "0 0.2\n", + "0 0.30000000000000004\n", + "1 0.4\n", + "7 0.5\n", + "9 0.6000000000000001\n", + "19 0.7000000000000001\n", + "14 0.8\n", + "31 0.9\n", + "39 1.0\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
0.00
0.10
0.20
0.30
0.41
0.57
0.69
0.719
0.814
0.931
1.039
\n", + "
" + ], + "text/plain": [ + "0.0 0\n", + "0.1 0\n", + "0.2 0\n", + "0.3 0\n", + "0.4 1\n", + "0.5 7\n", + "0.6 9\n", + "0.7 19\n", + "0.8 14\n", + "0.9 31\n", + "1.0 39\n", + "dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 46 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "TEYNByt3vHuh", + "outputId": "11f10a52-8910-4f9a-a3b7-52c9d597fbd3" + }, + "source": [ + "\n", + "plot(sweep_p1(p1_array), label='Olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Olin (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UpJ4SQn6vHui" + }, + "source": [ + "**Exercise:** Write a function called `sweep_p2` that runs simulations with `p1=0.5` and a range of values for `p2`. It should store the results in a `SweepSeries` and return the `SweepSeries`.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JgrQASKmvHuj" + }, + "source": [ + "p1=0.5\n", + "p2_array=linspace(0, 1, 5)\n", + "\n", + "def sweep_p2(p2_array):\n", + " sweep2 = SweepSeries()\n", + " for p2 in p2_array:\n", + " state = run_simulation(p1, p2, num_steps)\n", + " sweep2[p2]=state.wellesley_empty\n", + " return sweep2" + ], + "execution_count": 27, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "K8Ke89X5vHuj", + "outputId": "3f99ada0-57e6-41bd-8195-1ba36e13944a" + }, + "source": [ + "plot(sweep_p2(p2_array), label='Wellesley')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Arrival rate at Wellesley (p1 in customers/min)', \n", + " ylabel='Number of unhappy customers')" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "joTaW-bavHuk" + }, + "source": [ + "## Optional Exercises\n", + "\n", + "The following two exercises are a little more challenging. If you are comfortable with what you have learned so far, you should give them a try. If you feel like you have your hands full, you might want to skip them for now.\n", + "\n", + "**Exercise:** Because our simulations are random, the results vary from one run to another, and the results of a parameter sweep tend to be noisy. We can get a clearer picture of the relationship between a parameter and a metric by running multiple simulations with the same parameter and taking the average of the results.\n", + "\n", + "Write a function called `run_multiple_simulations` that takes as parameters `p1`, `p2`, `num_steps`, and `num_runs`.\n", + "\n", + "`num_runs` specifies how many times it should call `run_simulation`.\n", + "\n", + "After each run, it should store the total number of unhappy customers (at Olin or Wellesley) in a `TimeSeries`. At the end, it should return the `TimeSeries`.\n", + "\n", + "Test your function with parameters\n", + "\n", + "```\n", + "p1 = 0.3\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 10\n", + "```\n", + "\n", + "Display the resulting `TimeSeries` and use the `mean` function provided by the `TimeSeries` object to compute the average number of unhappy customers (see Section 2.7)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hsaYA6ZuvHuk" + }, + "source": [ + "def run_multiple_simulations(p1, p2, num_steps, num_runs):\n", + " results = TimeSeries() \n", + " for i in range(num_runs):\n", + " state = run_simulation(p1,p2,num_steps)\n", + " #print(state)\n", + " results[i] = state.wellesley_empty\n", + "\n", + " return results" + ], + "execution_count": 55, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 315 + }, + "id": "l7_4Pc16vHuk", + "outputId": "9d4c5197-d55c-4de5-d63a-414a3ab5d8db" + }, + "source": [ + "results1=run_multiple_simulations(0.3,0.3,60,10)\n", + "plot(results1, label='wellesley')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time', \n", + " ylabel='Number of unhappy customers')\n", + "\n", + "results1.mean()" + ], + "execution_count": 56, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "2.9" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 56 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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AD/99BPjxo1j69atbNiwgUceeYQOHToQERHBXXfdxYEDB9i4cWOj9/nss89IS0vjmmuuISIigsTERO68804+/fRT7HY74eHhVFRUsGPHDsrLy+nQoQPDhg2r81rvvvsuZ511Fueeey5hYWF07dqVGTNm1BRkjBo1ii5duvDFF8YyrYWFhSxevJipU6d66F0zWGpBKaUuBd7EmKBbyS8XjHUC8z0alRABwtW916dbBwAGpycBsHVnIVXVDsLDLH8HFC1gtTXjK2PHjmXZsmUMHDiQrl27ctZZZ/HAAw9QWFjI8uXLueuuu9i9ezdVVVVMmDDhF6+12+3k5eU1eo9du3aRmZnJiBEjao45nU5sNhv5+fmMGjWKe+65h3nz5nH33XczcOBAbrnlFsaMGVPntVatWsW3335bc8zhcOB0nvjonzp1Kh988AGXX345n3zyCf3792fgwIHNeXvqZbWL768YSWiW23bvQrR5WblGCyrdTFAJcVH0SI1jT14J2/ccYVBaki/DE35i3LhxzJ8/n379+jFu3DjCw8MZOXIk//rXv8jNzWXMmDFs376dqKgoVq5cSViY5dGXGikpKYwaNYr58+tvL1x22WVcdtllVFZW8s4773DTTTexcuVKoqOjT7rWxRdfzKOPPlrvtS6++GKeffZZtm7dygcffMANN9zQ5JgbY/XrXQrwgiQnIX7JVQzhSlAAGX2SAcjcIVMEhSEjI4OQkBDeffddxo8fDxhJa+7cuQwcOJAOHTowfPhw0tLSePjhhykoKACgqKiIr7/+mrKyskbvcemll7J582bee+89ysrKcDqdHDhwgMWLFwOQmZnJmjVrKC8vJzw8vGbsKCTk5DRwxRVXsGjRIr7++msqKyux2+3s3r2bH374oeY5cXFxnH/++TzwwAPk5+dz3nnntfh9qs1qgloIjPf43YUIYMfLq9ifX0pYqI2eneNqjmf0NROUTNgVptDQUEaPHk1VVVVNF9y4ceMoKSlh3LhxNc95/fXXiYyM5Ne//jXDhg3joosu4ptvvsFma3yV/C5duvDee+/x008/MWXKFEaMGMG0adPQWgNw7NgxnnzyScaMGcOIESNYsGABL7/8MpGRkSddKyMjg9dee40FCxYwceJERo8eze23387+/b/cm3bq1Kls2bKFCy+8kJiYmJOu01I29z7F+iil2gPvATuA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Hoxo_PJIvHuk" + }, + "source": [ + "**Exercise:** Continuting the previous exercise, use `run_multiple_simulations` to run simulations with a range of values for `p1` and\n", + "\n", + "```\n", + "p2 = 0.3\n", + "num_steps = 60\n", + "num_runs = 20\n", + "```\n", + "\n", + "Store the results in a `SweepSeries`, then plot the average number of unhappy customers as a function of `p1`. Label the axes.\n", + "\n", + "What value of `p1` minimizes the average number of unhappy customers?" + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "id": "xBpQ5fzkvHuk" + }, + "source": [ + "def run_multiple_simulations(p1_array, p2, num_steps, num_runs):\n", + " unhappy = TimeSeries()\n", + " results2 = SweepSeries() \n", + " for p1 in p1_array:\n", + " for i in range(num_runs):\n", + " state = run_simulation(p1,p2,num_steps)\n", + " unhappy[i] = state.wellesley_empty\n", + " #print(state, unhappy[i])\n", + " results2[p1]=unhappy.mean()\n", + " print('result', results2[p1])\n", + "\n", + " return results2" + ], + "execution_count": 69, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 513 + }, + "id": "7WOIEqsIvHuk", + "outputId": "610fe5ee-2697-47e7-885f-4d15d81eb2ea" + }, + "source": [ + "p1_array = linspace(0, 1, 11)\n", + "\n", + "plot(run_multiple_simulations(p1_array,0.3,60,20), label='olin')\n", + "\n", + "decorate(title='Olin-Wellesley Bikeshare',\n", + " xlabel='Time', \n", + " ylabel='Average Number of unhappy customers')" + ], + "execution_count": 70, + "outputs": [ + { + "output_type": "stream", + "text": [ + "result 16.25\n", + "result 9.15\n", + "result 6.8\n", + "result 2.15\n", + "result 0.6\n", + "result 0.0\n", + "result 0.0\n", + "result 0.05\n", + "result 0.0\n", + "result 0.0\n", + "result 0.0\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uV_RE5D6oXvi" + }, + "source": [ + "p1>0.5 has minimum number of unhappy customers" + ] + } + ] +} \ No newline at end of file diff --git a/colab/chap05.ipynb b/colab/chap05.ipynb index 2dca482e3..a7cb59df0 100644 --- a/colab/chap05.ipynb +++ b/colab/chap05.ipynb @@ -1,617 +1,1318 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 5" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap05.ipynb", + "provenance": [] + } }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reading data\n", - "\n", - "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence.\n", - "\n", - "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", - "\n", - "`head` selects the header and the first five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2 = tables[2]\n", - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`tail` selects the last five rows." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "table2.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Long column names are awkard to work with, but we can replace them with abbreviated names." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the DataFrame looks like now. " - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "table2.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", - "\n", - "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", - "\n", - "`NaN` is a special value that indicates missing data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Series\n", - "\n", - "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "census.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n", - "\n", - "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From here on, we will work in units of billions." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what these estimates look like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year',\n", - " ylabel='World population (billion)')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n", - "\n", - "So the largest relative error between the estimates is about 1.3%." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "max(abs(census - un) / un) * 100" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n", - "\n", - "1. Compute the elementwise differences, `census - un`\n", - "2. Compute the absolute differences, `abs(census - un)`\n", - "3. Compute the relative differences, `abs(census - un) / un`\n", - "4. Compute the percent differences, `abs(census - un) / un * 100`\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Constant growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can select a value from a `Series` using bracket notation. Here's the first element:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "census[1950]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And the last value." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "census[2016]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "t_end = get_last_label(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "elapsed_time = t_end - t_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can get the first and last values:" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "p_end = get_last_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Then we can compute the average annual growth in billions of people per year." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "total_growth = p_end - p_0" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### TimeSeries" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's create a `TimeSeries` to contain values generated by a linear growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "results = TimeSeries()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "results[t_0] = census[t_0]\n", - "results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After that, the population in the model grows by a constant amount each year." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "for t in linrange(t_0, t_end):\n", - " results[t+1] = results[t] + annual_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the results looks like, compared to the actual data." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - "plot(results, color='gray', label='model')\n", - "\n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Constant growth')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well after 1990, but not so well before." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", - "\n", - "Hint: \n", - "\n", - "1. Copy the code from above and make a few changes. Test your code after each small change.\n", - "\n", - "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n", - "\n", - "3. You might want to add a constant to the starting value to match the data better." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "census.loc[1960:1970]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "iPE3oY-oHF4k" + }, + "source": [ + "# Chapter 5" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "OL-k7bYZHF4q" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun San Yip 14 June 2021\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "SKoI-0GzHF4u" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yD_qlKjoHF4w" + }, + "source": [ + "## Reading data\n", + "\n", + "Pandas is a library that provides tools for reading and processing data. `read_html` reads a web page from a file or the Internet and creates one `DataFrame` for each table on the page." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-w9PSt6GHF4x" + }, + "source": [ + "from pandas import read_html" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HQwRgN-NHF4x" + }, + "source": [ + "The following cell downloads a copy of https://en.wikipedia.org/wiki/World_population_estimates" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XUfgy8SYHF4y" + }, + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "r06mR0RHHF4z", + "outputId": "b6ffe2f0-9295-4e6a-ace5-feb17082dbb5" + }, + "source": [ + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "len(tables)" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "6" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5_yvjBxaHF40" + }, + "source": [ + "The arguments of `read_html` specify the file to read and how to interpret the tables in the file. The result, `tables`, is a sequence of `DataFrame` objects; `len(tables)` reports the length of the sequence.\n", + "\n", + "We can select the `DataFrame` we want using the bracket operator. The tables are numbered from 0, so `tables[2]` is actually the third table on the page.\n", + "\n", + "`head` selects the header and the first five rows." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "id": "yXWwe2T8HF41" + }, + "source": [ + "table2 = tables[2]\n", + "table2.head()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dCRWa6o-HF42" + }, + "source": [ + "`tail` selects the last five rows." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "bamRq_drHF45" + }, + "source": [ + "table2.tail()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1ln86agCHF46" + }, + "source": [ + "Long column names are awkard to work with, but we can replace them with abbreviated names." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "k4VOfUYFHF47" + }, + "source": [ + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2AY8uySnHF47" + }, + "source": [ + "Here's what the DataFrame looks like now. " + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 237 + }, + "id": "0IYk34OqHF48", + "outputId": "ab6f3be7-a7f2-41c6-a9f8-ecf7c4301424" + }, + "source": [ + "table2.head()" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
censusprbunmaddisonhydetantonbirabenmjthomlinsondurandclark
Year
195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
19512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
19522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
19532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
19542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " census prb un ... thomlinson durand clark\n", + "Year ... \n", + "1950 2557628654 2.516000e+09 2.525149e+09 ... 2.400000e+09 NaN 2.486000e+09\n", + "1951 2594939877 NaN 2.572851e+09 ... NaN NaN NaN\n", + "1952 2636772306 NaN 2.619292e+09 ... NaN NaN NaN\n", + "1953 2682053389 NaN 2.665865e+09 ... NaN NaN NaN\n", + "1954 2730228104 NaN 2.713172e+09 ... NaN NaN NaN\n", + "\n", + "[5 rows x 11 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Hi2zwKG2HF49" + }, + "source": [ + "The first column, which is labeled `Year`, is special. It is the **index** for this `DataFrame`, which means it contains the labels for the rows.\n", + "\n", + "Some of the values use scientific notation; for example, `2.544000e+09` is shorthand for $2.544 \\cdot 10^9$ or 2.544 billion.\n", + "\n", + "`NaN` is a special value that indicates missing data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8pBb-0xGHF4-" + }, + "source": [ + "### Series\n", + "\n", + "We can use dot notation to select a column from a `DataFrame`. The result is a `Series`, which is like a `DataFrame` with a single column." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EqY5l84xHF4-", + "outputId": "3bd17f42-d110-4b5d-eada-fac68fbb3559" + }, + "source": [ + "census = table2.census\n", + "census.head()" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2557628654\n", + "1951 2594939877\n", + "1952 2636772306\n", + "1953 2682053389\n", + "1954 2730228104\n", + "Name: census, dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RkvvaZGYHF4-", + "outputId": "a0da5455-001d-4a21-8927-b0cd6f54d14b" + }, + "source": [ + "census.tail()" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "2012 7013871313\n", + "2013 7092128094\n", + "2014 7169968185\n", + "2015 7247892788\n", + "2016 7325996709\n", + "Name: census, dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WYS0-BN7HF4_" + }, + "source": [ + "Like a `DataFrame`, a `Series` contains an index, which labels the rows.\n", + "\n", + "`1e9` is scientific notation for $1 \\cdot 10^9$ or 1 billion." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aU_OUgtsHF4_" + }, + "source": [ + "From here on, we will work in units of billions." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8JJ7oszbHF4_", + "outputId": "baf7586c-6380-491d-8542-71f15fbd69c0" + }, + "source": [ + "un = table2.un / 1e9\n", + "un.head()" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2.525149\n", + "1951 2.572851\n", + "1952 2.619292\n", + "1953 2.665865\n", + "1954 2.713172\n", + "Name: un, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "g0X7PmvmHF5A", + "outputId": "d2b8fe0a-fe2f-4a98-94dc-682796ffaecf" + }, + "source": [ + "census = table2.census / 1e9\n", + "census.head()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2.557629\n", + "1951 2.594940\n", + "1952 2.636772\n", + "1953 2.682053\n", + "1954 2.730228\n", + "Name: census, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tgN0O_qlHF5A" + }, + "source": [ + "Here's what these estimates look like." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "hnk8748HHF5A", + "outputId": "4bc601d1-9a9f-46db-dd8c-fd37e618caf6" + }, + "source": [ + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + " \n", + "decorate(xlabel='Year',\n", + " ylabel='World population (billion)')" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3l4iekJmHF5B" + }, + "source": [ + "The following expression computes the elementwise differences between the two series, then divides through by the UN value to produce [relative errors](https://en.wikipedia.org/wiki/Approximation_error), then finds the largest element.\n", + "\n", + "So the largest relative error between the estimates is about 1.3%." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZdVcUlWkHF5B", + "outputId": "5e33c0be-c304-4b62-98eb-d544649aadc9" + }, + "source": [ + "max(abs(census - un) / un) * 100" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1.3821293828998855" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Rl2Jm74gHF5B" + }, + "source": [ + "**Exercise:** Break down that expression into smaller steps and display the intermediate results, to make sure you understand how it works.\n", + "\n", + "1. Compute the elementwise differences, `census - un`\n", + "2. Compute the absolute differences, `abs(census - un)`\n", + "3. Compute the relative differences, `abs(census - un) / un`\n", + "4. Compute the percent differences, `abs(census - un) / un * 100`\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vvuQKby4HF5B", + "outputId": "cde36e90-0434-46ee-fed8-8a9175afe95d" + }, + "source": [ + "census-un" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 0.032480\n", + "1951 0.022089\n", + "1952 0.017480\n", + "1953 0.016188\n", + "1954 0.017056\n", + " ... \n", + "2012 -0.066201\n", + "2013 -0.069991\n", + "2014 -0.073816\n", + "2015 -0.101579\n", + "2016 NaN\n", + "Length: 67, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GVJSlr7VHF5B", + "outputId": "a0d181c0-ce0a-4492-af2e-821eb63ecad8" + }, + "source": [ + "abs(census-un)" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 0.032480\n", + "1951 0.022089\n", + "1952 0.017480\n", + "1953 0.016188\n", + "1954 0.017056\n", + " ... \n", + "2012 0.066201\n", + "2013 0.069991\n", + "2014 0.073816\n", + "2015 0.101579\n", + "2016 NaN\n", + "Length: 67, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SPTLRwB_HF5B", + "outputId": "43d3fdcf-c29e-496e-ad76-0bf69978c207" + }, + "source": [ + "abs(census - un) / un" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 0.012862\n", + "1951 0.008585\n", + "1952 0.006674\n", + "1953 0.006072\n", + "1954 0.006286\n", + " ... \n", + "2012 0.009350\n", + "2013 0.009772\n", + "2014 0.010190\n", + "2015 0.013821\n", + "2016 NaN\n", + "Length: 67, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CYB2B6liHF5C", + "outputId": "e0f08b43-d74a-4487-860e-929cb8bf417b" + }, + "source": [ + "abs(census - un) / un * 100" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 1.286247\n", + "1951 0.858540\n", + "1952 0.667365\n", + "1953 0.607232\n", + "1954 0.628640\n", + " ... \n", + "2012 0.935034\n", + "2013 0.977243\n", + "2014 1.019023\n", + "2015 1.382129\n", + "2016 NaN\n", + "Length: 67, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yqC3O7EIHF5C" + }, + "source": [ + "`max` and `abs` are built-in functions provided by Python, but NumPy also provides version that are a little more general. When you import `modsim`, you get the NumPy versions of these functions." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Begn8UVKHF5D" + }, + "source": [ + "### Constant growth" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_RxpSAa8HF5D" + }, + "source": [ + "We can select a value from a `Series` using bracket notation. Here's the first element:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZfEQcyG6HF5D", + "outputId": "04e4aa0c-d8b0-436c-e75f-421854362217" + }, + "source": [ + "census[1950]" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "2.557628654" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 34 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Fz3PmF8MHF5D" + }, + "source": [ + "And the last value." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_J44zrGSHF5E", + "outputId": "c47cb545-566f-46d7-f63c-b755c24aeeec" + }, + "source": [ + "census[2016]" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "7.325996709" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 35 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GNBkf8h8HF5E" + }, + "source": [ + "But rather than \"hard code\" those dates, we can get the first and last labels from the `Series`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "60c5WHJPHF5E" + }, + "source": [ + "t_0 = get_first_label(census)" + ], + "execution_count": 43, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "5IwDaNlqHF5E" + }, + "source": [ + "t_end = get_last_label(census)" + ], + "execution_count": 44, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "E4TPprrQHF5F" + }, + "source": [ + "elapsed_time = t_end - t_0" + ], + "execution_count": 38, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L7xeINEqHF5F" + }, + "source": [ + "And we can get the first and last values:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CtHyFe18HF5G" + }, + "source": [ + "p_0 = get_first_value(census)" + ], + "execution_count": 45, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "YiQiKDLGHF5I" + }, + "source": [ + "p_end = get_last_value(census)" + ], + "execution_count": 46, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qzkfMRFKHF5J" + }, + "source": [ + "Then we can compute the average annual growth in billions of people per year." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "glAZa0lWHF5J" + }, + "source": [ + "total_growth = p_end - p_0" + ], + "execution_count": 47, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "3iKi6GMlHF5J" + }, + "source": [ + "annual_growth = total_growth / elapsed_time" + ], + "execution_count": 62, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "r--bqUFAHF5K" + }, + "source": [ + "### TimeSeries" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gsltgerOHF5K" + }, + "source": [ + "Now let's create a `TimeSeries` to contain values generated by a linear growth model." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6ZLEKlnPHF5K" + }, + "source": [ + "results = TimeSeries()" + ], + "execution_count": 59, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Mn0WcJASHF5K" + }, + "source": [ + "Initially the `TimeSeries` is empty, but we can initialize it so the starting value, in 1950, is the 1950 population estimated by the US Census." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 80 + }, + "id": "3lPdt511HF5K", + "outputId": "17ccfb79-7805-4bd0-b67c-29a0f91600cd" + }, + "source": [ + "results[t_0] = census[t_0]\n", + "results" + ], + "execution_count": 51, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
19502.557629
\n", + "
" + ], + "text/plain": [ + "1950 2.557629\n", + "dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 51 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SfzjPn0gHF5L" + }, + "source": [ + "After that, the population in the model grows by a constant amount each year." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "_23TZCdsHF5M" + }, + "source": [ + "for t in linrange(t_0, t_end):\n", + " results[t+1] = results[t] + annual_growth" + ], + "execution_count": 53, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jqf8dbd7HF5M" + }, + "source": [ + "Here's what the results looks like, compared to the actual data." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "BSUvVaqlHF5N", + "outputId": "80b454e8-63c1-4c8c-ad4d-013a6638a945" + }, + "source": [ + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + "plot(results, color='gray', label='model')\n", + "\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Constant growth')" + ], + "execution_count": 54, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3hUVfrA8e9MeiOkQUISOhx6l14CSVBQ0YVdXSzYVhFX1952LT/dFVdFV9S1t7XCrmVdFYQUei8C0g69hJKEENLLZOb+/rhDDCEJkzAhCXk/z5PHyZl7z30nQl7Oveec12IYBkIIIURjY23oAIQQQoiqSIISQgjRKEmCEkII0ShJghJCCNEoSYISQgjRKEmCEkII0ShJghJC1Dul1GKl1PsNHYdoWjwbOgAhakspFQY8ClwFtANygZ3A+8AXWuuyCxTHSGAZ0EFrfaAe+k8G0rTWN7u77/qilLoB+FRrbWnoWETTJwlKNClKqVhgOVAGPAX8DNiA4cBDwBZgU4MF2EQopSyAp9ba1tCxCFEdi+wkIZoSpdT3wCWA0lrnVHrPC/DWWhc4X/8VuBGIAPYAf9Naf1HheAP4IzAMuBrIAf6ptX6+wjFXAf8HKKAU2AVMB7KB/ZXCW6K1jlNKDQCeAwYC/sAO4Emt9U8V+j0AfAIEO2O0AV8AD2uty5RSHwM3Vep/rNZ6cTU/l/swE3Qo5qjuM2f/sVrrNKXUzZgjzETgFaAn5gh0OTALmAy0AH4B/qy1Xujs91PAqrW+3vn9LcCHwO1a6/edbZ9jPi54B1hUKbR/aa1vVkotxvx/cBDzZ+4N/ADcpbXOr+ozCSHPoESToZQKBSYCb1ROTgBaa5vWusD57UzgduA+oBfmL+zPlFLxlU57GlgK9AOeB2aePkYpFQn8B/gS8xf6MOBVzNHbYcxf8ACDgSjMX/Jg/qKfC4wFBgALgP8ppbpWuvY9wDFgiPP13fyalO7FTDT/dvYdBays5ucyGTPJvAT0dcb7QhWHWp3tDwDdgPWYyeZS4Abnz2AF8INSqpvznEXOz3HaOCDT+d/TxgKpzvjudradjvneCsf9FjOBxgG/B67AvFUrRJXkFp9oSjpj/pLdXtNBSil/4E/A/Vrr/zibZyqlLgH+AqRUOHyu1vo95+t/KqXuBhKcx0QBXsC/Kzxj2lHhOiedLzO11sdPt1cxynlCKXUl8DvMkdVpy7TWf3e+3u0cnSQAH2itc5RSpUBRxb6r8SDwpdZ6doW+unH2L38L8KDWepkz/s6YSeNyrfUC5zH3KqVGAY8At2ImniilVA+t9XbMZPQC5mgNpVR3588pVWtdqpTKcf4Mqor5oNb6fufrnUqpuc7P++Q5Pp9opiRBiabE1QfvnTFvIS2t1L4EeLxSW+XnVUeB1s7XWzBHP1uVUknAYuAbrfXhmi6ulIoAnsEcZURi/j3zxZzQca5rd6ip72r0wLw9WNGqao5dV+k8OPvntBRztIjW+oDzduQ4pZQdaAm8CTyllOqBmbAOaa33uhDn5krfH8UcvQlRJbnFJ5qS3YCDX3+xukNppe8NnH8vtNZ2YAJmolkHTAF2KaWuOEefHwOnRyGjMG+dbcJMmi5duw5ceZhs11oX16HvVCAe8+ewXGtdhJnExjm/Ul3sx52fVzQD8odDNBla65PAfOBupVRw5feVUl5KqQDMh/ElwOhKh4wBttbymobWeq3WeqbWejTmKOwW59unf+F6VDptNPCm1vp/WutfMJ8zdazNdSv0X7nvqmzHOeKpYKgL521z/rfyz2k0Z/6cFmH+7E7f+oRfk1YcZyaoUgCllCtxC1EjucUnmpq7MB/kb1BKPYU5MinF/IX8MHCT1nqTUuo14K9KqUzMW0u/xZzUkOjqhZRSwzF/CS/ETDJdgD7AB85DDmKO6CY6n6eUOCdvaOB6pdRyzATzLK4lmsr2A2OVUp0wZxjmVDMt/GVgrlJqLWYCHw5Mc75X7chKa71XKfUf4E2l1HTn55mBOankugqHpgIhwCTMySen217E/B1SMUGdntk4yfn5i2SWnqgrGUGJJkVrfQhzZtx/Mad/b8ScPXY75iy20//y/wvwHuasu62Ys9Ru0Fqn4LoczJHJd5i3Fz8EPsecvo7WOh3zmdZjmAnsO+d5t2D+3VrrjPMnznz246qXgROYCTYTGFHVQVrrbzBvJz6GOU38esxnYADnuqX3B8znbJ85rzMCuEJrvbNC/0cxp9fnYa47A/P53Clgl9b6SIVj1wGzMaecZwBvuPZRhTibrIMS4iLkHF3+SWsd3tCxCFFXcotPiCbOuSj5QWAeUIA5s+5h4J8NGZcQ50sSlBBNn4E5WeFBIAjzOdBMzFueQjRZcotPCCFEo9RkRlBKKR/MPdiOAfYGDkcIIYR7eGDuRrJOa11S8Y0mk6Awk9Oyhg5CCCFEvRiFuXlxuaaUoI4BfP7550RGRjZ0LEIIIdzg+PHjXH/99eD8HV9RU0pQdoDIyEhiYmIaOhYhhBDuddajG1moK4QQolGSBCWEEKJRkgQlhBCiUZIEJYQQolGSBCWEEKJRkgQlhBCiUZIEJYQQoloOWwmZP75FaebhM9oNwyA/P5/63C6vKa2DEkIIcQHZcjJI/8+LlKbvp+T4PqJvfRGLxcIvO/axdEkqJ9KPMHHiRC655JJ6ub4kKCGEEGcpOriN9G9m4SjMxTMkklaT7iEvL4/vf1zAbr0diwV8fHxo1apVvcUgCUoIIcRZ8rcuxVGYi1/HfgRPuItlGzaxevVqysrKwGLBu2V7br5uEpERLestBklQQgghADAMBxaLOTUh/NI/4BEey7q8IFa//g44bAD07NmT0WPiaBVR/8WaJUE1gHHjxnH33XczefLkM9pvvPFGBg8ezD333APA/Pnzee+99zh48CAWi4WoqCiuueYabrzxxmr7PnnyJG+++SaLFy/mxIkTBAUF0bVrV6ZNm8aYMWPq9XMJIZomw3CQ93MyOet+JPqmmVh8/Nm5ew/Ja/dz8uRJALz8w5g29eoLuheqJKhGauPGjTz++OO8+uqrjBo1Crvdzq5duzh69Gi152RmZnLttdfSoUMH3njjDTp16oRhGKxcuZJ58+ZJghJCnKU04yCZ89+hJE0DsGvZPJYfyuVIWhoAwS1DcAR24dZrxtIyyPeCxuZyglJKBQBtAT8gU2t9+ByniPOwadMmOnToQFxcHAAeHh706tWLXr16VXvOa6+9hpeXF2+99Rbe3t7l7XFxceX9AGzevJlZs2axa9cu/P39ueqqq7j77rvx9DT/OCileOqpp/j+++/RWhMTE8MzzzzDgAEDAFi9ejUvvvgiBw8exNPTkw4dOvDOO+8QHBx81igQzhwx5ubm8vTTT7Ny5UpsNhsRERHcf//9XHbZZW786QkhzsVhK+HU8v9wavX/wGGnwDecjYF9OLByOwD+/v7ExcUxYMAAPDw8GiTGGhOUUioQmAbcAAzCrHxoAQylVAYwH3hba722vgOtiysf/A6A71++qrzt2Q9Ws257Ok/eOoTBPc26Uj+tOsA/v9rMpUPbcffv+gGQlVPEzc8uJLSFD/96+tdfnvf9YzF703L4x31j6Bxbfw8HBwwYwKxZs3jmmWeIi4ujZ8+ehIfXfM938eLFTJ48+YzkVNm+ffu4+eabmTlzJomJiaSnp3PXXXfh4+PDjBkzyo/76quvmD17Nm3atOH555/nkUceITk5GYCHH36Y++67j8mTJ2Oz2di2bRteXl4ufa4PPviAgoICUlJSCAgI4OjRoxQVFbl0rhDCPYoObiXzh39SdiqDEsMTHTGMXzKKcOSfwGFYyDYimXHr72kV1qJB46x2oa5S6m7gADAdWAhcBfQDFDAceBLwBlKUUj8qpTrWe7TNSL9+/fj000/Jzc3lqaeeYuTIkUyePJn169dXe87Jkydp3bp1jf1+8cUXJCQkMGHCBDw9PYmOjmb69Ol88803Zxx366230rZtWzw9Pbn22ms5fPgw2dnZAHh5eXHo0CEyMjLw9vamf//++Pv7u/S5vLy8OHXqFPv27cMwDKKjo+ncubNL5woh3MMos1GSnclO/y58a+nD5uMFOBwO+vXrR8KV1/Pcozc3eHKCmkdQVwATtNbrqnl/DfC+c5Q1A5gA/NPN8Z2XiiOn0566behZbZcNa89lw9qf0RYW7Ffl+a/eH3fecXl6eppTNSux2Wzlt9kABg4cyMCBAwE4duwYL774ItOnT2fRokW0aHH2H57Q0FDS09NrvPaBAwdYs2YNixYtKm9zOBxnrQavuLbhdPIpKCggJCSEt956i3fffZfJkycTEBDApEmTmDFjhku3AW677TbsdjtPPPEEx48fZ9iwYTz00EPExsae81whRN0YhoOStF34xnbDMAz2FHiQ4nMJubnFQBkRkTFMvuryRletvNoEpbV26aGA1jofeOlcxymltgHtKjRZMZ9nTdZaf+vKtS4WMTExHDhw4Iw2h8NBWloabdu2rfKcqKgo7rzzTubNm8fhw4fp2bPnWcfExcXx008/cffdd1d7yy0iIoKrr76av/71r3WOXynFyy+/DMCOHTu47bbbiIqKYsqUKQQEBFBYWFh+bFlZGVlZWeXf+/n5ce+993Lvvfdy6tQpnn32WR5//HE+++yzOscjhKheacYhMue/TUnaLmzj72XJzzs4dsysru7jH8z+gkgmjIxrdMkJLuBefFrrnlrrwNNfwGNAFuZzrGZl8uTJfPXVV+WL3vLz8/nHP/4BwKhRowBITk7m66+/JiMjAzBv3/3rX/8iJCSEjh2rvpv6pz/9CZvNxl133YXWmrKyMkpLS1m6dCmPP/44AFOnTmX+/PksWLCA0tJS7HY7Bw8eZOnSpS7FXlpaytdff10+9TQwMBCr1Vo+eurVqxcpKSlkZGRQXFzMyy+/fMZoMSUlhd27d1NWVoafnx8+Pj5YrbIlpBDu5rCVcHLR56R98BDphw+wiM7MmZfKsWPHCAoKYtKkSdx/7x/5x2NTyp/HNza1mcU3FkgAWlMpsWmtb63DtWcAH2iti+twbpN2xRVXUFJSwvPPP8+RI0fw8fGhd+/efPzxx+W37lq2bMncuXN55ZVXKCgoICAggN69e/PRRx/h5+dXZb8RERF89dVXvPnmm8yYMYOsrCyCgoLo1q0b06ZNA6BPnz588MEHzJ49m6effpqysjKio6OZOnWqy/EvWLCAWbNmUVRURMuWLZk8eTKTJk0C4Oabb2bXrl1cdtlltGjRgunTp5/xXCwtLY0XXniBzMxMvL296du3L3/729/q+qMUQlShcN9mTsx/h7zsLDY7ItljhGEAdsNKvmcMD8+Yir/fhZ0yXhcWV3aiVUo9BswEdgJHgTNO0lon1uaiSqlxQBLQWWu938Vz2gP7U1JSLuhCMSGEaEpyN/zEsfnvs8OIYJvRmjLDgsVioX//Aaw9FEDi8C6M6heNxWJp6FAB8x+t8fHxAB201gcqvufqCOqPwN1a6zfdFNNdwE+uJichhBDn5nA40CUBLHL0oMgwb7t36dqV8YmJhIeHc2UDx1dbriaoYNz0rEgp1QZzyvrV7uhPCCGas9LMQ5xa8wOnusSTnJJCZmYm4IHNGsjevEhGdh5xzjWUjZWrCeq/wDjgAzdc8w7gMM1wcoQQQriLuRPEV+xbuYAN9lYc35AJmM+vx40bh0dAG07llzCsd1QDR1p3riaoVcDflFK9gM1AacU3tdZfuNKJUsoTuB14TWvtqE2gQgghTIV7f+bAj++z4ZQX+4yOgAW7YSWibW9mTLvijPWUTZmrn+L0Atx7q3jPAFxKUJi39sJwz0hMCCGalbK8bI4u+JC12/exwwjHgRWr1Upn1Ye5a8oY5hndYPvm1QeXEpTW2i0LVbTWXwNfu6MvIYRoTux2OysWfs+qbacowdzppWePHsQnJBASEsKwUbm0j2r47Ync6eIYBwohxEWqrDCPXQcOk5KS4lwg70mR3ZdDJW25Y+xEQkICAC665AS1X6j7F+D0Hjtbgee01ovrIS4hhGjWHCVFbP/hXyzdfoBMh7k4PywsjMTERBZtLaZ3gA/BgdVXLrgYuJSglFJTgc+A74C/O5vjgGSl1PVa67n1E54QQjQvhmFwZH0qyUlJHLT5AX5YsDB4RByJY0fg4eGBUg0d5YXh6gjqCeAJrfXzFdpmK6X+jFl2QxKUEEKcp5xjB0j+9ydsO+XAwA8Pi0GLkBhSDoTSpiD0opoA4QpXE1Rn4D9VtP8HeMp94TQPFSvMVlSxGu3p7T+io6P56aefyosQnm6vbsun0+/7+flhsVjw8PCgTZs2jBw5kltvvfWMBXtKKXx8fM76Q7906VKCgoI4fPgwL730Ehs2bKCwsJAWLVrQq1cv/vGPf5xVFPGaa67hl19+ISUlhTZt2rjrRyVEs2Cz2Vj2v7ms3roLG+bfxx4x4Yyfch0ePoH03ZHO6P7RDRzlhedqgsoE+gB7KrX3db4n6klhYSEff/wxd9xxR63O++GHH4iJicFut7Njxw7eeOMNJk2axNy5c8+ovfTee+8xZMiQKvu4/fbbGTZsGPPnzycoKIj09PQz6kidtn37djZv3ly+we39999fuw8pRDNlGAZbtmwhNTWV3NxcwINAyjgV2I8pt0zGajX3yxszoHnuP+pqgvoMeEcpFQEsc7aNBv4KvFcfgbnDvuemVPte+ITptBgwHoDcjQs5Mf+dao/t+JdfZ8anffAwpcf3Vfu+u91zzz288sorTJkyhbCwsFqf7+HhQa9evXjttdeYNGkSs2fPZtasWec8Lzs7m/379/Pqq6+W77AeGRlZ5a7nX375JX369CE+Pp7PPvusxnpUQgjT7m1bSFrwE5l5RQC0bt2aEQP7MWveKVp7B5BXWEpwoE8DR9mwavMMygOYDXgBFqAEeA25xVevxowZQ2pqKrNnz+bZZ5+tcz/e3t6MHz+er792LZmGhITQpUsXnnzySa677jp69epF586dz9oBOT8/nx9++IE///nPjBkzhtdff53k5GQmTJhQ51iFuJilHz/GT9/M5UBmDgDenl5cOnEC/fr2xWq18kLHAlqF+JePnpozVxfqlgEPK6WewnweBbBHa11Ub5G5gasjmxYDxpePps4l5rZzFg92u0cffZTJkydzww03lJdfr4vIyEhycnLOaLvzzjvPeAYVGxvLt9+aBY4/+eQTPv74Yz755BN2795NUFAQN9xwA3fddVd5ovrvf/8LwMSJEwkICGD06NHMmTNHEpQQleTl5ZH843f8ovdgYMELO208bCw51YF+xSHlhTsjwwIaONLGo1YLdZ0J6Zd6iqXZ8PT0PKPK7Gk2m63KPbS6du3KlClTeOGFF3jmmWfqfN3jx4/TsmXLM9refvvtap9BhYaG8sADD/DAAw9QVFTE/PnzefLJJ2ndujW//e1vAZgzZw6XX345AQHmX6prrrmGO++8k/3799OhQ4c6xyrExaK0tJTlixexas1qyhzm7aduPvmMvexKdtGRrUv20SW25Tn7aY6qTVBKqXeBB7TW+c7X1dJa1+4JfjMXExPDgQMHzmhzOBykpaXRtm3bKs+59957SUxMZMmSJXW6ZmlpKUlJSQwdOrRO5/v5+TF58mQ+++wzdu7cCcC6devYvXs3x44dK588cboA5pw5c8rLzAvRHDkcDn7++WcWLVpEQUEBADGWXDq1iWX0tEexevsRYRgM7xMtt/OqUdMIqkuF97vUcNy5S/KKM0yePJlnn32W0aNHM2jQIIqLi3nnHXOSxqhRo6o8JzQ0lBkzZvD666/X6loOh4OdO3fyxhtvkJOTw733VrXf79lycnJ4//33ufLKK+nQoQMWi4WUlBR27drF7bffDpiTI3r16sXbb799xrlz5szh008/5YEHHsDHp3k/5BXNj2EY7N69m6SkhZw4kQVAmzZRdHWc4NM9fUg5GMFQwwtfwGKx0EgK2zZK1SYorfXYql6L83fFFVdQUlLC888/z5EjR/Dx8aF37958/PHH5TPmqjJt2jTmzJlDdna2S9ewWCxYrVaio6MZMWIEzzzzDBEREWccd/vtt5+1Duqrr74iKiqKrKws7rnnHjIyMvD09CQ6OponnniCCRMmkJWVxcKFC3nxxRfP6vOmm27io48+Yt68efzmN7+pxU9GiKbt6NGjLPzpJw4ePgxAcIsWJI4fT48ePQDY98N2RvWLxtdHtkF1heX0LZnGTinVHthf3QJVIYRoKKdOnSI1NYVfftkKgDdl9LZmsMHWh3seuo3QFr4NHGHjdXpzAaCD1vpAxfdqegb1Z1cvoLWeWefohBCiiSouLmbZsmWsWbMau92BFQfdLFkMahvCD8VXsnGPnU27Mhk3KPbcnYmz1DTOvN3FPgxAEpQQotmw2+2sW7eOpUuXUlRkrrZpb8lmQEAB7S+9kcCeo7gmu4jLi2x0jA5u4GibrpqeQckcYSGEqMAwDLZv305KSkr5s+DY1mH0OrGGrSXtSAr/HQ/0GgFA69C6r1kUJnlSJ4QQLjh06BBJSUmkpaUBEB4eTkJCAl27diX90CReefcXLgtricNhyLRxN6npGdR1rnaitf7CPeEIIUTjkpWVRUpKCjt27ADAFxt9rBnkhQ1FOQszRbZry4dPRuHvK3tQulNNI6jPXOzDACRBCSEuKoWFhSxZsoT169fjcDjwxEF3SyY9vbJZVtyN+evyUAMy6dvVXGYhycn9anoGZb2QgQghRGNgs9lYs2YNy5cvp6SkBAsGnS3Z9LUeJ7xrP8ISn0JvLeCakjK6dwht6HAvavIMSgghqKo2E8QGedK3cDsOfLANv4PIcfEATKp6wxfhZjU9gxoOrNFa252vq6W1Xun2yMR5UUrxySefVLsR7PkeL8TFZN++fSQlJXH8+HHA3Pk/MTGRthEhrP3+G17cEMLgQ0H0b+A4m5uaRlDLgUggw/nawNyItzID8KiiXQghGrX09HSSk5PZs8csFu5vKWNAixLaXjaFju3CARh87S38qWsaYwbIYtsLraYE1YFfy7nLmighxEUjLy+PRYsWsWnTJgzDwMti0NNynO6WE6TnhfLGp8t44ZEr8fX2xNPDyrhBVVcZEPWrpkkSB6t6Lc7fjTfeiFKK9PR0li9fTmhoKM8++yweHh4899xzHDlyhCFDhvDSSy8RGBjIsWPHmDlzJuvXr8fDw4PRo0fz6KOPEhxsrlDPysri6aefZvXq1QQHB3P//fefdc3Nmzcza9Ysdu3ahb+/P1dddRV33313lfWnhLhYlZSUsHLlSlatWoXNZsNqga7WLPpYjuMfEEDLMdN5M9UDf39v8gtt+HrL34+G5PJPXynVGrgL6Ols2ga8pbU+Xh+Bna8vvviC3bt3X5BrdenSheuuc3nZGADff/89b7/9Nq+++iqzZ8/mkUceYeDAgXz66acYhsHUqVP5+OOPmTFjBnfccQc9e/YkKSmJ0tJSHnzwQR599NHyMhcPP/wwnp6epKSkAPDYY4+dca19+/Zx8803M3PmTBITE0lPT+euu+7Cx8eHGTNmuOeHIEQj5nA42LhxI4sXLy6vzdTOp4R+ZfsJtNgIHHAZEWOn4uEbwDNdS2gR4F1eNVo0HJemkiulxgJ7gZsAh/PrJmCPUmpc/YV38br00kvp378/Hh4eTJo0iRMnTnDLLbfQsmVLQkJCGDNmDFu3bmXLli3s3buXJ554gsDAQEJDQ3n88cdZtGgRmZmZpKens2LFivIRVXBwMA899NAZ1/riiy9ISEhgwoQJ5WUzpk+fzjfffNNAn16IC8MwDLTWvPXWW/z4448UFBQQExPDLbfcwuTxceR5R/L3U1ey0BiOh69ZFTo40EeSUyPh6gjqNWAOMF1rbQdQSnkAbzvf61U/4dVdbUc0F1rFGkq+vr5VthUUFHDs2DFCQkIIDAwsf69du3YAHDt2rLyCbcUSJJXLkRw4cIA1a9aUV70F81+UTaXUihB1cfToURYuXMjBg+YTihbeFkZ0jab/VTfj5emBERtD67BBdFy0h/FD2jVwtKIqriaozsBvTycnAOf085eBn+slMgFAVFQU2dnZ5OfnlyepQ4cOlb/ncDgAs6ZKp06dyl9XFBERwdVXX81f//rXCxi5EA3j1KlTpKSksHWrWZvJ19NKb+MoXeyZlOrdfPJ9f277zQAsFitd24Xy55sHN3DEojqu7haxBehYRXsHzGdRLlNKjVFKLVNK5SulTiqlvqvN+c1N79696dSpE8899xwFBQWcPHmSv//978TFxREREUHr1q0ZNmwYL730Ejk5OeTk5PDKK6+c0cfUqVOZP38+CxYsoLS0FLvdzsGDB1m6dGkDfSoh3K+oqIiFCxfyxhtvsHXrVjysVnr55HGVsYVulgw8Og3hheyJpP6cTmGxraHDFS6oaaFumwrf/hV41TlRYrWzbSjwGPBQ5XNr6HM08D/MyRbfAHagXy1jblY8PT15++23mTlzJvHx8Xh6ejJq1CgeffTR8mNeeuklnn76acaNG0dwcDAPPPAAycnJ5e/36dOHDz74gNmzZ/P0009TVlZGdHQ0U6dObYiPJIRblZWVsW7dOpYtW1Zem6lzgIPexTsItNvwjupE+KW34hvTjVu7HqZf11ayb14TUW3Jd6WUA3MRbvmxzv8alb/XWru0UFcptRJYobV+uLaBSsl3IURFhmGwbds2UlJSOHXqFADt27cnISEBUt4iO+0g3+X3Zeofb6NjdEgDRyuqU6eS78BYdwahlAoAhgArlFLrMW8P7gKe0FqnuPNaQoiL28GDB0lKSuLIkSMAhAb6Eh83hu4DhmCxWLBN+hMLUg+y65cscvLldl5TVdNC3SVuvlYI5jOvG4CJwFbgZuB7pVQvrfU+N19PCHGROXHiBCkpKezcuRMAf18f+nufpH3BFvLX5LI7QtG1bQheLVvx+4kh/H6ilMFoyqqdJFHpGdQ5KaWiznFInvO/H2qtf9Za27TW7wH7gUtrcy0hRPNSUFDAjz/+yJtvvsnOnTvx8vRkQLgHk2wb6Fi4F5tfGHMOteHtrzfjcJhPIfx9vSQ5NXE13eLbopT6BFLFNlkAACAASURBVHhHa62rOkAp5QP8BnOixJfAy9V1prXOUUrt48znWlTxvRBCAGZtptWrV7N8+XJKS0uxWCz0jAqme9Z6/E4VYfH2JWTkb/HuexnWf21kalwnKbd+EakpQfUDZmImqv3AWuAIUAyEYm55NBhIB57RWrtSgfefwENKqbnAdmAa0B6YX9cPIIS4+DgcjvLaTHl55s2XLl26EHdJX4q/fhYcZWjPboyb/gA+wWEAzLxrREOGLOpBTc+g0oBpSqlHgN8Do4HLAD/MXc43Ai8BC7XWro6C/gEEAguc/90GXF555oYQovnau3cvSUlJpKenA9A6IpzESy8rX4ieNfZmZidl8nNGMJHH7fQPbshoRX06504Szs1gX3V+nRdnInvW+SWEEOXS09NJSkpi7969ALRoEcTgSB8i9y/BJ7Mr9vYd8PCwEjZkApNDMrjGw0qvTuENHLWoT7KXvBCiQeXm5pbXZgLw8fFhcNdY2h1ejGXfSQws/DhvJVGlHZk02hxF9evaqiFDFheIJCghRIMoKSlhxYoVrFq1irKyMqxWKwN6dadH/jaMHeZO+z5RnUjvOoUfvj3OFScKGjhicaFJghJCXFB2u728NlNhYSEAPXr0YISKofjHVzEcZTi8/GmVcCNB/eKJtnrweqdc2ke1aODIxYUmCUoIcUGcrs2UnJxMVlYWYJaGGT9+PLGxsTjKSjm4LIK1mYH8VDCIlzqOwmI1d1GT5NQ8SYISQtS7I0eOsHDhwvJSMSEhIYwdPoTWx9YTFt4SAKunN+1un8WXX2yhqwVZzyQkQQkh6k92djYpKSls22ZW5fHz82P06FF0JZOcRa+RX1rMtkO59LruPiJC/LB6+/LwDQPx8nRp/2lxkXMpQSmlIoBZQALQml93MgfA1d3MhRDNQ1FREUuXLmXt2rU4HA48PDwYOnQol3SJIS/5Q04dN6eSH/fvykcH2tLj+608Nu0SAElOopyrI6j3gd7AbOAosj2REKIKZWVlrF27lmXLllFcXAyY9cjiRg7HsXk+WZ+/A4YDj6Awwi/9Ay1a96bL11u44bJuDRy5aIxcTVBxwHit9Zp6jEUI0UQZhsHWrVtJTU0tr83UoUMHEhMTiYqKoujgNo6t+R4DC7sDBzF++n1YffwIAJ68bUjDBi8aLVcTVDa/7kYuhBDlDhw4QFJSEkePHgUgIiKCxMREOraNwcPHDwC/dj3xGfo7Zi0qYW92S7qdtNE+yq8hwxZNgKsJ6jngL0qpm7TWZfUZkBCiacjMzCQ5OZldu3YBEBgYyNixY+nbty+FW5dw+J/PEXj5/YSrvgBEx/+eyWFHaB3qL9PGhUtcTVDXAJcAaUqpnUBpxTe11uPdHZgQonHKz89n8eLFbNy4EcMw8PLyYvjw4QwfPhxLwUky5v6Nov1bAFjw5b/pOKUVw3qb5eJG9YtuyNBFE+NqgkpzfgkhmimbzcaqVatYsWJFeW2mAQMGMHbsWAL8/chdP5+Ti7/AsJVg9QvkUNsrmLPKiyv2ZJYnKCFqw6UEpbW+pb4DEUI0Tg6Hg82bN7No0aLy2kxdu3YlISGBiIgIbKfSOfrpTErSzLqmAT1HEp54K7F+LQjue4K+XSIaMnzRhNVqoa5SKhbo4fx2m7NmlBDiIrVnzx6SkpLIyMgAICoqivHjx9O+ffvyYyyePpScOEKe4c88x0juvexWPJyl1iU5ifPh6kJdf+At4AZ+XaTrUEp9BszQWhfVU3xCiAZw/PhxkpKS2LdvHwDBwcHEx8fTq1cvLBYLpSfS8AqJxOLhiWdgSyJ/9zjvfn2IIsOb3IJS/J0JSojz4eoI6iXMtVC/AZY42+KA15zv3e3uwIQQF15ubi6pqals3rwZMGszjR49msGDB+Pp6YnhsJO98juyl84lr8tldL3yRvx8PPFv241HbmtPcIA3Hh7WBv4U4mLhaoL6LTBNa72gQtt3SqkS4F9IghKiSSspKWH58uWsXr26vDbTJZdcwujRo/H39wegNPMwmd+/QcmxPQBs3LyHNZ47uOPq3gCEtvBtsPjFxcnVBBUM7K+ifT8gCxqEaKLsdjsbNmxgyZIlZ9Rmio+PJzQ0FADDYSdnzfdkL5mDYbfh0SKcsiHTSPo+l5sigxoyfHGRczVBbQXuAB6q1D7d+Z4QogmpqjZTbGws48ePJyYmpvw4e1Eex//9d0rSdgIQ1DeesISbsPoG8GG/Mny9pSCCqD+u/ul6CvOW3khgqbNtNDAAmFQfgQkh6kdaWhpJSUnltZlCQ0NJSEigW7duWCxn1mCy+gZQZljJcfgxt2AYf+h7HRG+AQCSnES9c3Ud1Dyl1EDMEVS8s3kbcLvW+pf6Ck4I4T6VazP5+/szZswYBg4ciIfHryUuyvJPgcOOZ4swLBYr0VPuZ8WifXQyfIhuFdhQ4YtmyOV/AmmttwDT6jEWIUQ9qFybydPTk6FDhzJixAh8fc+c2FCg15I57y1OWsNoOeUvdIwJwTMolKlXhpw1uhKivskYXYiLVFlZGWvWrGH58uXltZn69u3L2LFjCQ4OPuNYR2kRWQs/Im9zCgAZNn++nLuWF+4fj9VqkeQkGkS1CUopVQpEa60zlVI2aihSqLX2ro/ghBC1d7o2U0pKCjk5OQB07NiRxMREIiMjzzq+OE2T8b/XKMs+jsXDi6DRU1m9NYJbE7thtUpiEg2nphHU7UBuhddSRVeIRq5ybaZWrVqRmJhIp06dqhwFZS/7DyeXzcViGHi1akfrq+7Du1Vb/m/4hY5ciLNVm6C01v+q8PrjCxKNEKJOKtdmCgoKKq/NZLVWv7ODwzDAMEgp6klM9xuJbdX2QoUsxDm5uhffPuASrXVWpfaWwEatdcf6CE4IUbP8/HwWLVrEzz//jGEYeHt7M2LECIYOHYq399l33g3DwJ6XhWeLcABCR04hzbMdXicDGTdE/hqLxsXVSRLtAY8q2n2AmCrahRD1qLS0tLw2k81mw2KxMHDgQOLi4ggMrHoquL0wj4wf3yRn71YODH6Qy8b1w2L1oO/wIfS9wPEL4YoaE5RSanSFb4cppbIrfO8BjAcOu3IhpdT/AU8CFXc+/15rPdW1UIUQDoeDTZs2sWjRIvLz8wFQSpGQkEB4eHi15xXt30LG/17Hnn8Sh+HF0tS1jBzWk0A/2XVcNF7nGkEtxpwcYQDfVvF+PnBXLa63TGsdV4vjhRCYt+b27NlDcnJyeW2mNm3aMH78eNq1a1fteY6yUk4u+pzctT8A4BPTjfXBE7mpf3dJTqLRO1eCisWs/3QIc1ujzArvlQIntNYyu0+IenTs2DGSkpLYv9/cr7lly5bEx8fTs2fPGtcnlWYc5NC/Z2HNOQoWKyGjrqHliMlcY63qbr0QjU+NCUprfcT50l0FXgYppTKBQmAF8BetdVW7pAvR7OXk5JCamsqWLVsA8PX1ZdSoUeW1mc7FXlyAJecoGfYg9na8hutHTazvkIVwK5d3klBKeQKXAO2AM6YHaa0/caGLr4CPMEdjUcDfgWSlVF+tdb7LEQtxkSsuLi6vzWS32/Hw8CivzeTn51fjufbiAvDyw8PDil/bHgROvJ/1x1pwzfieFyh6IdzH1WnmXYAfgc78umDXAjicX+dMUFrrimU5jiqlbgNygOHAwlrELMRFyW63s379epYuXVpem6lnz57Ex8cTEhJS47mGYZC1IZmspI9Y3nISt955LRaLhdb9R3Jt/wsRvRDu5+oI6h/AdmAocBAYBIQBrwIP1vHapydfyF4qolkzDIMdO3aQkpLCyZMnAWjbti3jx48nOjr6nOfbC3LInPcWhbvW4QX4HNvM4fSJtI2UWqKiaXM1QQ0BErTWJ5VSBoDWeqVS6nHMJDXwXB0opa4FUp17+7UCXsCcdLGybqEL0fSlpaWxcOFCDh82V2uEhYWRkJCAUsqlDVqztqwgL+V9HIW5WHz8yekxmZH9xklyEhcFVxOUF+btOIATQGtAY5Z87+5iH9cDbyilAoBszMKHCVrrPNfDFeLicPLkSVJSUti+fTtg1maKi4tjwIABZ9Rmqo69KJ/tX75GwLENAPi1703EFX+kQ3BEvcYtxIXkaoLaCfQEDgCbgD8ppdKBP+HiQl2ttVTeFc1eYWEhS5YsYf369WfUZho5ciQ+Pj6ud2Sx4J21m1LDg53h8Vx13e1YLO6abCtE4+BqgpoNnF6m/iywAPOZVAlwQz3EJcRFxWazlddmKikpAaBfv36MHTuWFi1cux1XmHuK9Bw7HWLD8PANIPbaR9iZXsZVg3pJvSZxUXK15PuXFV5vUkq1x7y1d7DyBrJCiF8ZhsEvv/xCSkoKublm9ZpOnTqRkJBQZW2m6hzbsIQTP73HJkdXWj/8OP6+Xvi37c4A2XxcXMTqVFFXa10EbHRzLEJcVPbv309SUhLHjh0Dfq3N1LlzZ5f7KMvL5sSC9yjSawgAYj1OcDKnEH/f4HOeK0RTV1NF3T+72onWeqZ7whGi6cvIyCA5OZndu3cDrtdmqqjUVsaqb/5D28PzMEoKsXj74jPs9wwfMgFvrzr9u1KIJudcFXVdYQCSoESzl5eXx6JFi9i0adMZtZmGDRuGl5frG7M6SovZ+PpfiC0+gAH4dRpAxMTp5TWchGguaqqo2+FCBiJEU1VaWsrKlStZuXJleW2mQYMGERcXR0BAQK37s3j50CqiJUWHfTGGTKVD/OUyCUI0S3KvQIg6cjgc/PzzzyxevLi8NlO3bt2Ij4+vsTbT2f0YLFm4lBMFBr+bEofFYqHtb+7GsFjwCmxZX+EL0ei5uhffUzW9r7V+1j3hCNH4GYbB7t27SU5OJjPTrEATHR1NYmJijbWZquIoKeTQvI+J3ZaCYQ/n0PD+tI0KxjOo5r33hGgOXB1B3Vjpey8gGigGjmGujRLionfs2DEWLlzIgQMHANdrM1VWarNTumctWQs/xJF/EovFSpjqR0x4zbuVC9GcuLoOqkvlNud+ev8C3nF3UEI0NqdOnSI1NZVffvkFMGszjR49mksuucSl2kwVrV61hZyUD+liMTdh8WnThfCJd+LTur27wxaiSavzMyitdYZS6gngC+C/7gtJiMajuLiYZcuWsWbNmvLaTIMHD2bUqFHnrM1UFYethJZLZ9HKUoDN6kPU+JsI6p+ARarcCnGW850kYQPauCMQIRoTu93OunXrWLp0KUVFRQD06tWLcePGnbM2U2VldgfZucVEhPhj9fIhfORkjujtdP/dDLzlWZMQ1XJ1ksTwSk0WzMT0CLDe3UEJ0VAMw2D79u2kpKSQnZ0NQLt27UhMTHSpNlNlRw8eZvMXb3DUGs3ND92Nh4eVsOFXET7ianeHLsRFx9UR1HKqLi64AtcX9ArRqB0+fJiFCxeSlpYGmLWZEhMT6dq1a63XIRn2MnLWzaNk6VyUo5g2jqNkZOUR1SpY1jQJ4SJXE1TlRbsOIFNrXezmeIS44LKyskhJSWHHjh0ABAQElNdmcnVrotPsDoN1KYtps+87yk6YkyAs7QbQ6dJbCIyQ/fOEqA1XZ/EdrO9AhLjQCgoKWLJkCRs2bCivzTR8+HCGDx9eu9pMTo6SQpb9cyZti3ZQBni2bE34+Nvw73LOgtNCiCq4PElCKdUXeACzcCGY9aBe1lpvro/AhKgvlWszWSyWWtdmqorFy4c23vnYCj0p7nYpva++AauntxsjF6J5cXWSxLXA58AaINXZPBzYoJS6Xms9t57iE8JtDMNgy5YtpKamltdm6ty5MwkJCbRu3brW/WXnFpP09f/wbt2eqycOxmL1oN01D+Dw9MEvtPb9CSHO5OoIaibwvNb6yYqNSqlnne9JghKN2r59+0hKSuL48eMAREZGkpiYSMeOHevUX2nmYTL/9y6Djm9n86GOFMcPwNfHE59WUkFQCHdxNUFFAZ9U0f4p8JD7whHCvTIyMkhKSmLPnj0AtGjRorw2U61n5hkGhw+n479zHrnr5+NpOCjz8KX/0GH4eMtCWyHczdUEtRIYCOyu1D4I87afEI1KVbWZRo4cydChQ2tVm+m00lIbc/75Lv3yV1BmLQGLlaAB4wkd/Xs8AmR2nhD1wdUE9REwSynVDVjtbBsK3AY8VnEhr9Z6pXtDFMJ1paWlrFixglWrVmGz2bBarQwaNIgxY8bUqTZTuZzjjChchMVqYAvvTPur7sQnUkqmCVGfXE1Qnzr/W1XZjU8rvDYAudchLjiHw8HGjRtZvHgxBQUFAHTv3p34+HjCwsJq3V9uQSnfzVvHmFG9aRvZAu+IWPyGTsE7PJawPiNksa0QF0BdF+oK0Sicrs2UlJTEiRMnAIiJiSExMZG2bes2YcFelM+GT99iyIm1pGRezS13XQ9Am/ipbotbCHFuslBXNFlHjx4lKSmpvDZTSEgI8fHx9OjRo9YjHIfDIDe/CMuupWQvnUO7ojwMC4xpZ6+HyIUQrqjNQt2umJvDnl6ouxV4UWtdeeKEEPWqcm0mPz+/8tpMHh61v8N8OD2Pf//rW+IcywmxZwHg27YnYYm3yHMmIRqQqwt1E4EfMJPSUmfzaOAXpdTlWuuUeopPiHJFRUUsW7aMtWvXltdmGjJkCKNGjcLX17fO/foeXsNvbN8BYG0RQUTizfirIfKcSYgGVpuFum9pre+r2KiUmg08Dwx2d2BCnFZVbabevXszbtw4WrZsWev+0k8WkrTmANdd2h2r1UJYnxHkrvqWFv3GET5sEhbP2k9DF0K4n6sJqjdwQxXtbwJ3uC8cIX5VVW2m9u3bk5iYSJs2dauTWVZWxtdvvUufsl9YGf5nRl7SCau3Hx3/+JpUtRWikXE1QeUCsYCu1N7O+Z4QbnXo0CEWLlzIkSNHAAgPDycxMZEuXbrU+tabrcyO1Wql9NBWspI+5DIOgSd4FW0HOgFIchKiEXI1QX0LvKuUmgEsc7aNxhxBfVOXCyulvgWuBsZqrRfXpQ9x8cnKyiI5OZmdO3cCZm2msWPH0r9//1rXZgJYvyOdOd8sZ1rELwRmmpMqPINbEZowjQA11K2xCyHcy9UE9SDmbhLzMRfjnvYV8HBtL6qUmgb41/Y8cfGqXJvJy8urvDaTt3fdS1ZYd6Zyu/ENXpkOLF6+tBwxheAhV0gZDCGaAFfXQeUDv1NKdQa6O5u3aa331faCSqkY4G/ASEDWVzVzNpuN1atXs3z5ckpLS7FYLAwYMIC4uDiCgoJq3V9GdiFp6fkM6NYKANWrK+nbHQT0HE3YuBvwbFH7XSWEEA3D5XVQAFrrPUqp487X+bW9mFLKAnwI/E1rfUgpVdsuxEXC4XCU12bKy8sDoEuXLiQkJNCqVas69XkkM5+XXvk3nX0y6fLI/QT5exPQZSAxd7yKd0SsO8MXQlwAtVmoew9maY0Y5/dHgFla69dqcb0ZgEVr/W6tohQXlb1795KUlER6ejpg1mYaP348HTrUfVFsWV42Xqs/50+BizCA4mP7COrUDUCSkxBNlKsLdZ8D7gVmAyuczSOA55RSrbXWf3Ghj07Ak5i7oItmKD09naSkJPbu3QtAcHAw48aNo3fv3nVaFLvz4Em+nLeNO7unU7zuW4zSYvDwpOXgKwiJaefu8IUQF5irI6g7gOla688rtM1TSm3DTFrnTFDAKCAMs0x8xfbvlFJfaK1nuBiLaGJyc3PLazMB+Pj4MHLkSIYMGVKn2kynrfzxJyacWEjRSfMWoX+XQYQl3IxXaJRb4hZCNCxXE5Q3sLaK9nXO91zxbyC5Utth4A9VtIuLQElJSXltprKysjNqM/n7134SZ6nNTonNTpC/+UduXNhRHNl5eIS2IWL8rfh36u/ujyCEaECuJqh/A9cD/1epfSrmVPNz0loXAoUV25wjqUytdbaLcYgmwG63s3HjRpYsWeKW2kxg3s57/bOV9GrjxYxbLgUgZsItFOzsRouBl2HxqNV8HyFEE+Dq3+p04D6l1FhglbNtKNAPeF0p9efTB2qtZ7p6ca217MZ5ETEMA601ycnJZGWZu4Kfb20ms18HQWmrucPxJUXHAiksGou/nzeeLcIIHnyFu8IXQjQyriao64FsoK3z67Rsztyjz8DcWFY0M0eOHCEpKYmDB82lbSEhISQkJNC9e/c6TYDIL7KxastRRkUXcWLBh5Qe30uQFcKj2+HjKML1O8tCiKbK1YW6UhRHVCk7O5vU1FS2bt0KmLWZxowZw6BBg+pUmwnAbnfw1Cs/MLRkBUd99gPgERRKWPw0AnqMlDIYQjQTcuNe1ElRURFLly5l3bp1bq3NBGC1GNzh/T3e5JjTxodeTcvhv8HqfX79CiGaFklQolbKyspYu3Yty5Yto7i4GIA+ffowduzYOtVmAsjOK+azeTsY1qs1g3q2wWL1IHLMbyk+vI2w+Jvwalm3nSWEEE2bJCjhEsMw2Lp1K6mpqZw6dQo4/9pMp61btga1Yw5b93VkQPeHsFotBF8ygZaDJ7ojdCFEEyUJSpzTwYMHWbhwIUePHgUgIiKCxMREOnfuXKfnQYZhcCq/hCBLEdmLv6Dz5kXgZdA5wMCCA/CQ50xCCElQononTpwgOTkZrc06lYGBgcTFxdW5NhNATn4Jr362hugTq4n32YJRWgRWT4IvmUjIyN9K4UAhRDlJUOIs+fn55bWZDMNwW20mAF97HpOyPiLYkotRCv5dLiEsYRpeoed3m1AIcfGpNkEppWycWZywWlprWZRyEbDZbKxatYoVK1a4pTYTgK3MwcLVBxg7KBZ/Xy+8W4QR3KoVHvZgIi69Bf8Ofd38KYQQF4uaRlC382uCCgGextwzb7mzbSQQDzxTb9GJC8LhcLB582YWLVpUXpupa9euxMfH17k202nvfr6UkL3z+SHjCq6ZPAqLxULbqY/h4d9CbucJIWpUbYLSWn98+rVS6kvgOa31rAqHzFZKPYhZdmN2vUUo6tWePXtISkoiIyMDgKioKBITE8+rNpPDYUBZCTmr/8dlx77F4lNKae4SzA3twTMwxB2hCyEucq4+g7ocs5ZTZd9x9gayogk4fvw4SUlJ7Nu3Dzj/2kwA6ScL+eh/W+hlaHrnLsOen40F8Os6mNj4aW6MXgjRHLiaoIowN4fdU6l9qPM90UTk5uaSmprK5s2bAbM206hRoxgyZAienuc3Z6YgbQ8jDr5PtGc2dsAnqhOhCTfh17anGyIXQjQ3rv5Gehd4SynVlV93Mx+OWWW3NiXfRQMpKSlh+fLlrF692i21mcDc0HXTrgxG9o0GICY6HMMrB0tAGOHxNxDYcyQWS92mowshhKsJ6ingBPAQ8ISz7YizXZ4/NWKnazMtXryYwkKzHFePHj2Ij48nNDS0zv0Wl5bx+Av/pXvZdmIi7qN9m2C8w9oQ9fsn8I3thtXLx10fQQjRTLm6m7mBmYhmK6WCnG159RmYOD9V1WaKjY0lMTGR2NjYOvXpcBhYrRbshbkUrPyGe73nYfWyw4H10CYeAP+OMm1cCOEetX7oIImp8UtLSyMpKYlDhw4BEBoaSkJCAt26davzBIi1247z+fcb+WP3dLx2pWCUFmEFAnqOIrRHbzdGL4QQppoW6i50tROt9Xj3hCPOR3Z2NikpKWzbtg0Af39/xowZw8CBA+tcm+m0nA0L+IPtJzy3lmIAfp36Exp3HT6RHd0QuRBCnK2mEdSRCxaFOC+nazOtXbsWh8OBp6cnQ4YMYeTIkXWuzbTn8CnsDgeqnfmcqm/7APIPl+IT052wcdfjG9vdnR9BCCHOUtNC3VtOv1ZK+QA2rbXjgkQlXFJVbaa+ffsyduxYgoOD69zvms0HWTr3S1oGB9Ll4T9itVoIH3oFgTGd8evQV3YaF0JcEOd8BqWU8gQKgL7AtnqPSJxTVbWZOnbsSGJiIpGRkXXq0+4wsNhLyduUTOsV3zIlIJtSw5+SolvwCwjA6u2Lf8d+7vwYQghRo3MmKK11mVLqMCALWhqBAwcOkJSUVF6bqVWrViQmJtKpU6c6jWxKbHa+WbiFsq0pjPLejqMwBwCv1h1oPfpafOu4RkoIIc6Xq7P4Xgb+Tyl1g9Zado5oAJmZmSQnJ7Nr1y4AgoKCGDt2LH379q1zbSYAR85x+m56EV9KcZSBd2QnQkb9Dv8ug+RWnhCiQbmaoK4CBgNHlFI7MG/5lZNZfPUnPz+fxYsXs3HjRgzDwNvbm+HDhzNs2LA61WZyOAxWrt/NoH4d8fX2xDesDV4tW+Hw9qdN/LXyjEkI0Wi4mqDSnF/iAiktLWXVqlWsXLmyvDbTwIEDiYuLIzAwsE59lhzfz+q5HxGVt4MFmQ9y1eVDsVgsdLxtJh6+AW7+BEIIcX5c3UnilnMfJdzB4XCwadMmFi9efEZtpoSEBCIiIurUX/7ezRSs+56i/ZuJBRxYaFP26783JDkJIRqjWu0koZSKBXo4v92m9f+3d+fxUZXnAsd/k4WEbITNFQIt4KMGZJOwCQETqEVcr9fdivaqV221+mn1ar29rRV7rbdu96OtVau2tlepSxURMQlhUWpERECRh8UoqGGRhD0h29w/3jN4jEAGk0zOhOf7+cwnzDlnzrwPZ2aeec95533UelWtJBwOs3btWoqLi/fVZjrmmGOYNGkSffv2/Vb7XFXyKjvKXqFH2E11FEpOJWtoIWnDp9C/25Gt1XRjjGkTUSUoEUkDfg9cCkQuUDSKyDPAtTZwomUqKiooKiqivLwccLWZCgoKGDhw4CFfD6pvaCQp0Q2aSN78ET3CW9lJGr3zz6bL8O+R2PnbnR40xphYi7YHdS8wATgHmO8tm4ArtXEv8KPWbtjhYPv27ZSWlu6rzZSamsq4cePIy8s75NpM65av4KPZM9iceQJXXncxAL0Lzuejrsdx/ITTSEm12cWNMfEl2k/B84AfqOoc37KXRWQv8DRRJCgRuQO4AugB1AFLgFtV9f1Da3L8q6mp6A3nvgAAEMhJREFU4c0336SsrGxfbaa8vDzGjx9P586dm318Y2OY1RuqqK+t5zsN5WxfPIvQ+g85EUj5chv1DReSlJhApyP6MPi0Pm0fkDHGtIFoE1QXoHw/y8uBrCj3MQN4WFWrRKQT8GNgtogce7hModTQ0MCSJUuYP3/+vtpMubm5FBQU0LVr16j3U/beWt5+aQYT09eyKbwDgFCnVGr7jGF0/ln7TvEZY0w8izZBfQBcjStY6HeNt65ZqrradzcENABH4ZJfVZTtiEvhcJhVq1ZRXFxMZWUlADk5OUyaNIlevXod9LGbK/cw661ysjNTOGdCfwD6V6/gyLT3IAxJ2UfSZcQUMgefSkKKzfpgjOk4DqWi7ssicgqwwFs2HhgGnBntk4nI6cBfcUkpDNynqh06OW3YsIGioiI2bNgAQPfu3SksLEREohoAsWFjFR8vKqZnZjLhfDedUbeTJ9HwxSoyh00mrd9QQgktK6VhjDFBFO3voF4TkeHAz4ACb/GHwFWquiLaJ1PVWUC2iHQDLgfWH2J740ZlZSUlJSWsXLkScLWZJkyYwLBhww5Ym6lqZw0zF35MUmIC54/uyY6lb9BjaTFXZGwjnNKFcEMdoaROJHbO5KgLbo9lOMYYE3MHTVAi8jhQBMxV1eXAZa3xpKpaKSIPAlUiskpVO8ws6Xv27GHBggUsXrx4X22m0aNHM3bsWFJSDj6SbmvVHpbPn09+2hrWL9kAYXdpLrlnb7KGnRaL5htjTGA014MagRt5h4h8gEtWJcACVd19sAdGIQFIBgbQAcp41NfXU1ZWxsKFC9m7dy8AQ4YMYeLEiWRlfXMcSV19I28t/4JNW3dzwSQB4NhwBddlFbsNQomknzCWrOHfI7X3iTY/njHmsHPQBKWqg0WkB+603qm4SWNvBupEpAyXrIpV9a3mnkhEbgBmqOpGEekJTAf2Av9sYQztKhwOs2LFCubOncv27a5URb9+/SgsLDxobabK7XuYOWMWvZMqqRx5E92yUknNOYHO3zmJ1JxcMgcXkJQZ/cg+Y4zpaKKpB/Ul8Jx3Q0RycAmrAJes/jOa/eAS3O0ikgnsAN4BClR107drevsrLy+nqKiIiooK4KvaTP379//aduFwGF1fxYq1X3LOyJ7sWl7K3vdLuD5zI2FCpNRtB1IJhRI4+uL/aodIjDEmeA51Lr5uuLIbecBIIB1YGs1jVfXsQ25dQG3ZsoWioiLWrFkDNF+bqbqmlmcee46TE5X1ZZ/vu7aUmNmdzMETSU1NjWn7jTEmHjQ3SCIdN5y8ACgEcnG/eyrF9Z4WqOr2tm5kUOzcuZN58+axdOnSfbWZxo4dy6hRo75Wm2ndZ9v454oKLjnteEKhECmNNUzrPJcEGoEE0o7LI2toIZ2/O8SGiBtjzAE014OqBCqAl4FfAfNVtbLNWxUwtbW1LFq0iEWLFlFXV0coFOLkk08mPz//G7WZ6vbs4tUnnyan/hM+6H8bgwYcQWJ6F7LzppCU3oWMkyaSlGHXlowxpjnNJahVuF7TeKAeqBWR+aq6q81bFgCNjY0sXbqUefPmsWuXC1lEKCwspEePHgCsXl9F6eJPuWhQA9UrF7BH3+GMhFroBCm7PwaOAKDHJCupZYwxhyLaUXyn4k7zPQD0EZH3gLne7U1VrWnzlsZQpDZTUVERW7ZsAVxtpsmTJ9Onz1eTrzbW7WXZ/z1CXu1HfLnqq4ojqX1yyRw0gfQTBse87cYY01FEO4pvhndrOorveaAT0GEmgauoqOCNN97gk08+ASA7O5uCggJyc3OZ/95n/Pm1Em647BS6ZKQQSkrmpKRykuurCWUdSfaQiWQMyic5+4j2DcIYYzqAlo7iy8KVzoh727Zto7S0lOXLlwOuNtPYsacwatRIEur3smt5KcklM7mg9jMWvdOd7586hFAogV5TryYxLYuUXtHNrWeMMSY6hzKKrwAYhJuJfBnwD7xZJdq4jW2qpqaGhQsXUlZWRkNDA4mJiYwYMYLyqi4Uz1lCr/ULCa9/n3BDHUcDjQmJ5B3x1em8dMlrv8YbY0wH1lwPqgpIBD7GJaO7cfPybW3rhrW1hoYGFi9ezIIFC6iudgnnxNxcCgsK6JKRxqrfXUVq6m4avSpYqTm5ZAwcR/rxo61sujHGxEBzCeoaoERVO8ys4+FwmJUrV1JSUkJVlav0EQ51Jruumtyh+fsKB6Yd04/wnm10HZxPRu4pJGX1aM9mG2PMYae5UXxPxqohsbBp02Yef/o56qvdT7m6pqUwPGUrR+1YTigV9m5eDf16ApBz4a0kdLIZHowxpr0c0iCJeFc6t4T66kqSwo0MS6xgwN6tJNRCQloG6SeModeAr4aQW3Iyxpj2dVglqAkT8sn69G361X9BclIC6QNGkTEwn7T+QwklJrd384wxxvgcVgnqqKOP4ZTJpwOQfsIYG+xgjDEBdlglKICsYZPbuwnGGGOi8M3aEMYYY0wAWIIyxhgTSJagjDHGBJIlKGOMMYFkCcoYY0wgWYIyxhgTSPE0zDwRYOPGje3dDmOMMa3E95me2HRdPCWoowEuueSS9m6HMcaY1nc0sM6/IJ4S1GJgHFABNLRzW4wxxrSORFxyWtx0RSgcDse+OcYYY0wzbJCEMcaYQLIEZYwxJpAsQRljjAkkS1DGGGMCyRKUMcaYQLIEZYwxJpAsQRljjAkkS1DGGGMCyRKUMcaYQIqnqY72EZELgeuBwUCmqoaarD8L+CXQH9gC3KOqj/rWPwVcAuz1PexhVb3Vt00h8DtgAPAZcIeqzghaLN425wJ3AMcB1cAMVb3et/4i4E6gF7AauElV57Z2LK0Rj4jsarLLJCAFGKaqS71tYnJsWimeAcD9wGggBCwBblbVFb5tYnJ8WiGWHOA+YDyQDMwEfqyq29shlnuAqUBvYBcwG7hFVbf6thkKPAwMAb4E/kdVH/Kt7ww8APwr7nU2G7hWVSvjNJ4bcJ9rg4DNqtp3P88Ts/dOa4jXHlQV8Ajwk6YrRGQk8CxwG9AFuBy4T0TOabLpX1U1w3fzJ6e+wCvAQ0A2cDPwlLfvQMUiIhcDfwB+DnQFcoAnfOvHAH8CbvL28RAw0/uwaQstiqfJMcnw9vWBLzn1JXbHpsXxeOt3AX1x8419AMwSkZC3j1gen28di4gk4v7fK4E+uA+43sCfffuIZSwNwKVAd9wHdm/gKV9bsoDXgTlAN+B84Jcicp5vH/cDw4GBXkwZcR7PF8Bvgen7e4J2eO+0WFz2oFR1DoCITNjP6nOBElV93bu/UEReAn4EvBTlU0wDVqhq5IP+VRGZCVwDlH3bdu9PS2IRkQTcC/JXqjrb26YOeM+3j6uBV1T1Ve/+EyJyNS7GO1szFmjdY+N9w52GS74R04jRsYFWiac/8AtV3ent5wlcgugGbCWGx6eFsRyH63kVqmo1UC0i04EiEclR1fUxjuV2393NIvIQ8Lcm8TQAv1bVRuBtEXkMuA543nttXQ6cq6pfAIjIT4GV8RiPt4/nvTimHeBpphHD905riNce1MEk4E6l+IWAoU2WnS0iW0VknYj8QUR6+tYNBt5tsv27uG82sdRcLMcBxwLdReRDEdkiIiXeqYCIoMQC0R+biItwX6L+4lsWb/FMB34gItkikob7MJjvO3UTlHiaiyXBt4wm/460tT1jKQCW+e4PBpZ6H+b7a8txQCq+9qrqR8Ae4jOeaATltRa1uOxBNeMV4EYRmYrrEo8DzgY6+bb5X+A/gE3Ad3HndV8RkTGqGgaygJVN9rvNWx5LzcXSw/t7AXAW7pzy7cBsETleVSNt3tZkv9sAaeO27080x8bvWuAvquq/LhWUYwPRxTMH+BfcqbEw8Anwfd/6oByf5mJRYBXw3yJyI+50WKRnm+n9bZdYROR84N+AfN/iA7Uly7eeKLaJl3iiEaT3TlQ6XA9KVRfiurLTgc3AL4DHcBcVI9ssUdWNqhpW1XW4F8Mo3Hl1gB24c85+2d7ymIkilp3e3wdUda2q1uAucqfjLspDQGKB6I5NhIjkASfjrpn4xU08IpINlOKSVCaQhjsl+5aIHOXtJhDxNBeLqtYDZwA9cUXlFgGRi+uR4xfzWLyBH48CZ6qq/9R2c22J/G1um3iJJxqBeK0dio7Yg0JV/4bv/K2IvID7oDiQSLc5cspiGXBak22GA++3Vhuj1Uwsijsl4S/qFW5yfxnug95vOPBaqzc2CodwbK4DFqjqh02WB+bYQLPx9MMNXLlXVXd7yx4Vkd8AY4EXCNDxae7YqOpa4Ezf+jNwo0Yj1y9iGouI/BC4F5iqqm81Wb0MOF9EEnynxfyvk9VAjdfe1739HY/7ErHMt494iScagXrvRCMuE5Q3oigZ7/SDiKR6q2q9v8NxAwU6A1cCk4A837ZTgSJV3S4ifXDf0pcAa7zHPw3cIiJXAM94jz8DODVIsahqTeSiu4gUA5/jRmHtwn3DBfgjUCwiU4Ai3EihQbjTgq2uJfH49tHNa9+0/TxFzI6N15aWxLMK17u42RtGXA9cgetNLfe2idnxaemxEZFBwKfAbm/5A8Dd3qnkWMdyA66XN1lVm15XAXgRuAf4uYj8Fnf95Srg3wFUtVpEngbuFJFluGR1L/Caqn4ab/F4+0jCfaYnAyHf8d3rXbqI6XunNcTrKb7LcN/c5nj3q73beFz54EdwQ2orcMkoX1VXedsmADcC5SKyG1iAu3YzNfLNRFXLcd8Ub8J1fx8ErlTVthjp0pJYAH4KlOAudm72Hnda5LcpqroI+KEXww4vpjN8b8KgxQPuQ3wb7k35NTE+NtCCeLxe0xTc9ZzPccnqauA8VV3jbRPL49PSY3MWsBZ3avlJ4D5VvSuyMsaxPIg7XTVPRHb5bjleW3bgegtTcK+lF3CjXf/u28dNuN7DSlzircb9H8VrPHd4MfwR93OTyPHt4+0j1u+dFrOS78YYYwIpXntQxhhjOjhLUMYYYwLJEpQxxphAsgRljDEmkCxBGWOMCSRLUMYYYwLJEpQxxphAisuZJIyJB17Np9m4yTjHqWqDb90w4G3gkiY/tjTGeKwHZUwb8aaXuQI3CfFtkeVeLaJncEUzWzU5iUhIRJJbc5/GtBebScKYNiYiZ+Nm/h6jqu96xehOx9XhuQs4DzeprOIK0r3oe+x0XLG6PrgCh7OAWyNTWXnF6R7Hzat2H5ALnOUrYGlM3LIelDFtTFX/gSvf/YyInImb4PNSXA2mwbjJRwcCvweeFZEC38OrcfP3nYibPHcCrmS3XwJuItGbgeP5ZlE6Y+KS9aCMiQERSQeW4kpw/BqYhyvzcGSkN+Rt9yegm6qefYD9nAM8C3RW1UavB/UkMN6r6WRMh2GDJIyJAVXdLSL34npJd+FmlO4EfC7ytQKtnfiq7Asici7wE6A/brBFgrfNUcAXvsctbsv2G9MeLEEZEzt14KrTikgCsB0YsZ/tagFEZCTwd+A3wM9wpTBG4er6+MvKN3jVlI3pUCxBGdM+3sWV205V1Q8OsM0pwJeqekdkgYicF4vGGRMElqCMaR9zgWLgRRG5BVdhtyswBqhR1cdwo/p6eqXAS3EJ67p2aq8xMWej+IxpB95vpM7EVQ2+H1cefhZu+Pk6b5tXgenA3cAK4ELcqT5jDgs2is8YY0wgWQ/KGGNMIFmCMsYYE0iWoIwxxgSSJShjjDGBZAnKGGNMIFmCMsYYE0iWoIwxxgSSJShjjDGB9P+4xNnLxvpdOgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "scpaSz0iHF5O" + }, + "source": [ + "The model fits the data pretty well after 1990, but not so well before." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wWPFNNZXHF5O" + }, + "source": [ + "### Exercises\n", + "\n", + "**Optional Exercise:** Try fitting the model using data from 1970 to the present, and see if that does a better job.\n", + "\n", + "Hint: \n", + "\n", + "1. Copy the code from above and make a few changes. Test your code after each small change.\n", + "\n", + "2. Make sure your `TimeSeries` starts in 1950, even though the estimated annual growth is based on later data.\n", + "\n", + "3. You might want to add a constant to the starting value to match the data better." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "Z1IiNUM-HF5P", + "outputId": "1b849d0b-1e33-46fa-ba17-e14190b7b49a" + }, + "source": [ + "results2 = TimeSeries()\n", + "results2[t_0] = census[t_0]-0.4\n", + "\n", + "total_growth2 = p_end - census[1970]\n", + "elapsed_time2 = t_end - 1970\n", + "\n", + "annual_growth2 = total_growth2 / elapsed_time2\n", + "\n", + "for t in linrange(t_0, t_end):\n", + " results2[t+1] = results2[t] + annual_growth2\n", + "\n", + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + "plot(results2, color='gray', label='model')\n", + "\n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Constant growth by changing annual_growth rate')" + ], + "execution_count": 75, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3r95bb-cHF5P", + "outputId": "9eaeae93-ba91-4a73-826d-1b1323dfd5fa" + }, + "source": [ + "census.loc[1960:1970]" + ], + "execution_count": 58, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1960 3.043002\n", + "1961 3.083967\n", + "1962 3.140093\n", + "1963 3.209828\n", + "1964 3.281201\n", + "1965 3.350426\n", + "1966 3.420678\n", + "1967 3.490334\n", + "1968 3.562314\n", + "1969 3.637159\n", + "1970 3.712698\n", + "Name: census, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 58 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "I-bGN_PUHF5P" + }, + "source": [ + "" + ], + "execution_count": 74, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap06.ipynb b/colab/chap06.ipynb index 6d32eff36..cc85446c4 100644 --- a/colab/chap06.ipynb +++ b/colab/chap06.ipynb @@ -1,560 +1,938 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 6" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "elapsed_time = t_end - t_0\n", - "\n", - "p_0 = get_first_value(census)\n", - "p_end = get_last_value(census)\n", - "total_growth = p_end - p_0\n", - "\n", - "annual_growth = total_growth / elapsed_time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### System objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can rewrite the code from the previous chapter using system objects." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " annual_growth=annual_growth)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And we can encapsulate the code that runs the model in a function." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation1(system):\n", - " \"\"\"Runs the constant growth model.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = results[t] + system.annual_growth\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also encapsulate the code that plots the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation1(system)\n", - "plot_results(census, un, results, 'Constant growth model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Proportional growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a more realistic model where the number of births and deaths is proportional to the current population." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation2(system):\n", - " \"\"\"Run a model with proportional birth and death.\n", - " \n", - " system: System object\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " births = system.birth_rate * results[t]\n", - " deaths = system.death_rate * results[t]\n", - " results[t+1] = results[t] + births - deaths\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "I picked a death rate that seemed reasonable and then adjusted the birth rate to fit the data." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "system.death_rate = 0.01\n", - "system.birth_rate = 0.027" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation2(system)\n", - "plot_results(census, un, results, 'Proportional model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The model fits the data pretty well for the first 20 years, but not so well after that." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Factoring out the update function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation1` and `run_simulation2` are nearly identical except the body of the loop. So we can factor that part out into a function." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func1(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " births = system.birth_rate * pop\n", - " deaths = system.death_rate * pop\n", - " return pop + births - deaths" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The name `update_func` refers to a function object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "update_func1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which we can confirm by checking its type." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "type(update_func1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`run_simulation` takes the update function as a parameter and calls it just like any other function." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we use it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " birth_rate=0.027,\n", - " death_rate=0.01)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func1)\n", - "plot_results(census, un, results, 'Proportional model, factored')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Remember not to put parentheses after `update_func1`. What happens if you try?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t_0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Combining birth and death" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func2(pop, t, system):\n", - " \"\"\"Compute the population next year.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "system.alpha = system.birth_rate - system.death_rate\n", - "\n", - "results = run_simulation(system, update_func2)\n", - "plot_results(census, un, results, 'Proportional model, combined birth and death')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", - "\n", - "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use. Note: Don't forget the `return` statement.\n", - "\n", - "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap06.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "_QjCrl6Ow5so" + }, + "source": [ + "# Chapter 6" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "YKlzrRYYw5sq" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun Yip 14 June 2021\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "2fPI2e00w5st" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UJk2GcnRw5su" + }, + "source": [ + "### Code from the previous chapter\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "uR7-Ffuww5sv" + }, + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "IM0iHBymw5sw" + }, + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "j3Im3XoJw5sx", + "outputId": "faf66252-16f0-4f1a-982e-d7bed67dfed2" + }, + "source": [ + "un = table2.un / 1e9\n", + "un.head()" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2.525149\n", + "1951 2.572851\n", + "1952 2.619292\n", + "1953 2.665865\n", + "1954 2.713172\n", + "Name: un, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "djuU-Uolw5s2", + "outputId": "b2ded8e9-7034-4e54-d97a-d53308f272fb" + }, + "source": [ + "census = table2.census / 1e9\n", + "census.head()" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2.557629\n", + "1951 2.594940\n", + "1952 2.636772\n", + "1953 2.682053\n", + "1954 2.730228\n", + "Name: census, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EtlCiYRJw5s4", + "outputId": "17df2a9e-84f4-4cc5-fd48-3075cebb80b3" + }, + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "elapsed_time = t_end - t_0\n", + "\n", + "p_0 = get_first_value(census)\n", + "p_end = get_last_value(census)\n", + "total_growth = p_end - p_0\n", + "\n", + "annual_growth = total_growth / elapsed_time\n", + "print(t_0, t_end)" + ], + "execution_count": 41, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1950 2016\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WevMteN2w5s6" + }, + "source": [ + "### System objects" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "smFTtXACw5s8" + }, + "source": [ + "We can rewrite the code from the previous chapter using system objects." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WMa4ffXKw5s8" + }, + "source": [ + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " annual_growth=annual_growth)" + ], + "execution_count": 48, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4qGHkdD8w5s9" + }, + "source": [ + "And we can encapsulate the code that runs the model in a function." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mZp2oOLxw5s9" + }, + "source": [ + "def run_simulation1(system):\n", + " \"\"\"Runs the constant growth model.\n", + " \n", + " system: System object\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = results[t] + system.annual_growth\n", + " \n", + " return results" + ], + "execution_count": 51, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_OonmsDAw5s-" + }, + "source": [ + "We can also encapsulate the code that plots the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SdC0W0Z_w5s-" + }, + "source": [ + "def plot_results(census, un, timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " census: TimeSeries of population estimates\n", + " un: TimeSeries of population estimates\n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ], + "execution_count": 52, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0bISh6F-w5s_" + }, + "source": [ + "Here's how we run it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "aw4woYwrw5s_", + "outputId": "d38caf86-ee9d-4766-d5ff-af20e274a9dc" + }, + "source": [ + "results = run_simulation1(system)\n", + "plot_results(census, un, results, 'Constant growth model')" + ], + "execution_count": 53, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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NBYuXHhW7aX33nuP4cOHV3mM2267jZEjR7J48WICAgJIS0s7q45UmV27drF169byBW7vu+++2r1IIVoou93Otm3bSEpKIicnB3DDn1LO+A9kxs3TMZuN9fLGD26Z6486m6A+A95RSoUBKx1t44C/A+/VR2CucPDZGdU+FzplNq0GTwIgZ8tSTi1+p9ptu/ztt5HxKe8/RMnJg9U+72p33303L7/8MjNmzCAkJKTW+7u5udG3b19ee+01pk2bxvz585k3b95598vKyuLQoUO8+uqr5Sust2vXrspVz7/88kv69+9PTEwMn332WY31qIQQhn07txG/5GcycgsBaNu2LaOHDGTeojO09fQjt6CEQH+vBo6yYdXmHpQbMB/wAExAMfAacomvXo0fP56kpCTmz5/PM888U+fjeHp6MmnSJL7+2rlkGhQURPfu3XniiSe49tpr6du3L926dTtnBeS8vDx+/PFH/vrXvzJ+/Hhef/11EhISmDJlSp1jFaI5SzuZys/fLORwRjYAnu4eXDp1CgMHDMBsNvN8l3zaBPmW955aMmcn6pYCDymlnsS4HwWwX2tdWG+RuYCzPZtWgyeV96bOJ/LW8xYPdrlHHnmE6dOnc/3115eXX6+Ldu3akZ2dfVbbHXfccdY9qKioKL791ihw/Mknn/DRRx/xySefsG/fPgICArj++uu58847yxPV//73PwCmTp2Kn58f48aNY8GCBZKghKgkNzeXhJ++Y7vejx0THlhp72Zh+ZnODCwKKi/c2S7Er4EjbTxqNVHXkZC211MsLYa7u/tZVWbLWCyWKtfQ6tGjBzNmzOD555/n6aefrvN5T548SevWrc9qe/vtt6u9BxUcHMz999/P/fffT2FhIYsXL+aJJ56gbdu2/OEPfwBgwYIF/O53v8PPz/iluuqqq7jjjjs4dOgQnTt3rnOsQjQXJSUlrFqWzNr16yi1GZefenrlMWHy5eylCzuWH6R7VOvzHqclqjZBKaXeBe7XWuc5HldLa127O/gtXGRkJIcPHz6rzWazkZKSQocOHarc55577iEuLo7ly5fX6ZwlJSXEx8czYsSIOu3v4+PD9OnT+eyzz9izZw8AGzduZN++faSmppYPnigrgLlgwYLyMvNCtEQ2m41ffvmF5ORk8vPzAYg05dC1fRTjZj2C2dOHMLudUf0j5HJeNWrqQXWv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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jsh_GI2ow5tA" + }, + "source": [ + "## Proportional growth" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qq-oVOB6w5tA" + }, + "source": [ + "Here's a more realistic model where the number of births and deaths is proportional to the current population." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "k3PCKn1gw5tB" + }, + "source": [ + "def run_simulation2(system):\n", + " \"\"\"Run a model with proportional birth and death.\n", + " \n", + " system: System object\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " births = system.birth_rate * results[t]\n", + " deaths = system.death_rate * results[t]\n", + " results[t+1] = results[t] + births - deaths\n", + " \n", + " return results" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6t-1ydXGw5tC" + }, + "source": [ + "I picked a death rate that seemed reasonable and then adjusted the birth rate to fit the data." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "WOTkQeqOw5tD" + }, + "source": [ + "system.death_rate = 0.01\n", + "system.birth_rate = 0.027" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pScv8BYXw5tE" + }, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "Xun5tAPew5tF", + "outputId": "5869064d-918f-4809-ceee-d85d8c14e73f" + }, + "source": [ + "results = run_simulation2(system)\n", + "plot_results(census, un, results, 'Proportional model')" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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U8VtizccZeRj83n/m1+K21Izchn52HzueKH0D8+/vLOSkY/N5+CJ862veGl69uyJ1poXXniBVatWkZKSct5jVq5cyQ033ICnp2eF+xw+fJg777yTCRMmsG7dOqZPn86KFSv45JNPSu03Z84cXn/9dbZs2ULfvn158skni7c98cQTTJw4ka1bt7JmzRqeeuopPDw83LqvTz/9lOzsbGJjY9m2bRufffYZ7du3d+tYIUTN2LVrFzNmzKCgoIDOnTszYcIEvL29azyOChOUUupB4CgwBViKWaYoDFDAAOCvmMu2xyqlflRKta32aK8iYWFhTJs2jczMTP72t78RERFBTEwMW7durfCYtLQ0QkJCKj3vzJkziY6OZsSIEdjtdkJDQ5kyZco578TuuusuWrZsid1u57bbbuPEiROkp5s1fj08PDh+/DhJSUl4enrSo0cPfH193bovDw8PTp8+zeHDhzEMg9DQUElQQtQiGzZsYO7cuTidTvr168fYsWOrtVpEZSq76s3ACK31lgq2bwL+q5TyB+4HRgD/ruL4LsmCt0af0/a3u/uf03ZDeGtuCG9dqq1hfZ9yj3/3kcGXHJfdbi/1SO2swsLCUn8RevXqRa9evQBISEjg9ddfZ8qUKaxYsYKAgIBzjg8KCiIxMbHSax89epRNmzaxYsWK4jan04lhGKX2a9y4cfHns8knOzubBg0a8MEHH/Dxxx8TExODn58fo0aN4v7778dms5333u+++26Kiop47rnnOHXqFOHh4Tz++OO0aCFPjYW4nJxOJ0uXLmXTpk0AXHfddYSHh2OxWC5bTBUmKK31De6cQGudhVkAVripefPmHD16tFSb0+kkLi6Oli1blntM06ZNue+++1i4cCEnTpygc+fO5+wzePBgFi9ezIMPPljhI7fg4GDGjBnDSy+9dNHxK6V46623ANi7dy933303TZs2ZezYsfj5+ZGTk1O8r8PhIDU1tfhrHx8fHn74YR5++GFOnz7Niy++yDPPPMP06dMvOh4hxKUpLCzku+++Y+/evVitVsaMGUPXrpd/mT4ZZn4ZxMTEMGfOHDZu3IjD4SArK4t33nkHgMjISACWLVvG3LlzSUpKAszHd//73/9o0KABbduW/zT1z3/+M4WFhTzwwANorXE4HBQUFLB69WqeeeYZAMaPH8+iRYtYsmQJBQUFFBUVcezY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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KLZUWdsnw5tG" + }, + "source": [ + "The model fits the data pretty well for the first 20 years, but not so well after that." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z1bgIlxEw5tI" + }, + "source": [ + "### Factoring out the update function" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EJd8QKmIw5tI" + }, + "source": [ + "`run_simulation1` and `run_simulation2` are nearly identical except the body of the loop. So we can factor that part out into a function." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rTEdaeYVw5tJ" + }, + "source": [ + "def update_func1(pop, t, system):\n", + " \"\"\"Compute the population next year.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " print(pop, t)\n", + " births = system.birth_rate * pop\n", + " deaths = system.death_rate * pop\n", + " return pop + births - deaths" + ], + "execution_count": 36, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TycxQuvlw5tJ" + }, + "source": [ + "The name `update_func` refers to a function object." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QUmgZ1t9w5tK", + "outputId": "e9128422-9799-419d-9a2c-fa3495fef68f" + }, + "source": [ + "update_func1" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d4VZWqZCw5tK" + }, + "source": [ + "Which we can confirm by checking its type." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7aVssdtKw5tK", + "outputId": "ee80d558-4a8d-4dfd-8662-16aae39c7ed7" + }, + "source": [ + "type(update_func1)" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "function" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "r4HlU8_Gw5tL" + }, + "source": [ + "`run_simulation` takes the update function as a parameter and calls it just like any other function." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "6N-IQQ_nw5tL" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ], + "execution_count": 37, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_REao6ZPw5tL" + }, + "source": [ + "Here's how we use it." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "lj6zOEfCw5tL" + }, + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "p_0 = census[t_0]\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " birth_rate=0.027,\n", + " death_rate=0.01)" + ], + "execution_count": 56, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "dZWUdntTw5tM", + "outputId": "43b7d2e7-d013-4155-f5bc-af8e3a11d18f" + }, + "source": [ + "results = run_simulation(system, update_func1)\n", + "plot_results(census, un, results, 'Proportional model, factored')" + ], + "execution_count": 57, + "outputs": [ + { + "output_type": "stream", + "text": [ + "2.557628654 1950\n", + "2.601108341118 1951\n", + "2.645327182917006 1952\n", + "2.6902977450265952 1953\n", + "2.7360328066920476 1954\n", + "2.7825453644058125 1955\n", + "2.829848635600711 1956\n", + "2.8779560624059233 1957\n", + "2.926881315466824 1958\n", + "2.9766382978297603 1959\n", + "3.0272411488928666 1960\n", + "3.078704248424045 1961\n", + "3.131042220647254 1962\n", + "3.184269938398258 1963\n", + "3.2384025273510284 1964\n", + "3.293455370315996 1965\n", + "3.349444111611368 1966\n", + "3.406384661508761 1967\n", + "3.46429320075441 1968\n", + "3.523186185167235 1969\n", + "3.583080350315078 1970\n", + "3.6439927162704344 1971\n", + "3.7059405924470314 1972\n", + "3.768941582518631 1973\n", + "3.833013589421448 1974\n", + "3.8981748204416125 1975\n", + "3.9644437923891203 1976\n", + "4.031839336859735 1977\n", + "4.100380605586351 1978\n", + "4.170087075881319 1979\n", + "4.240978556171301 1980\n", + "4.313075191626214 1981\n", + "4.3863974698838595 1982\n", + "4.460966226871885 1983\n", + "4.536802652728707 1984\n", + "4.613928297825096 1985\n", + "4.692365078888122 1986\n", + "4.77213528522922 1987\n", + "4.8532615850781164 1988\n", + "4.935767032024445 1989\n", + "5.0196750715688605 1990\n", + "5.1050095477855315 1991\n", + "5.191794710097886 1992\n", + "5.28005522016955 1993\n", + "5.369816158912433 1994\n", + "5.461103033613944 1995\n", + "5.553941785185382 1996\n", + "5.648358795533533 1997\n", + "5.744380895057604 1998\n", + "5.8420353702735826 1999\n", + "5.941349971568234 2000\n", + "6.042352921084894 2001\n", + "6.145072920743337 2002\n", + "6.249539160395973 2003\n", + "6.355781326122704 2004\n", + "6.46382960866679 2005\n", + "6.573714712014126 2006\n", + "6.685467862118366 2007\n", + "6.799120815774378 2008\n", + "6.9147058696425425 2009\n", + "7.032255869426465 2010\n", + "7.151804219206714 2011\n", + "7.273384890933229 2012\n", + "7.397032434079093 2013\n", + "7.522781985458438 2014\n", + "7.650669279211232 2015\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XRNf-49sw5tM" + }, + "source": [ + "Remember not to put parentheses after `update_func1`. What happens if you try?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CxEcJJKsw5tM" + }, + "source": [ + "**Exercise:** When you run `run_simulation`, it runs `update_func1` once for each year between `t_0` and `t_end`. To see that for yourself, add a print statement at the beginning of `update_func1` that prints the values of `t` and `pop`, then run `run_simulation` again." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rCZBGpo0w5tN" + }, + "source": [ + "### Combining birth and death" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lNEI2oTTw5tN" + }, + "source": [ + "Since births and deaths get added up, we don't have to compute them separately. We can combine the birth and death rates into a single net growth rate." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EF87MFVrw5tN" + }, + "source": [ + "def update_func2(pop, t, system):\n", + " \"\"\"Compute the population next year.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " net_growth = system.alpha * pop\n", + " return pop + net_growth" + ], + "execution_count": 58, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WiccbJ6Yw5tO" + }, + "source": [ + "Here's how it works:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 315 + }, + "id": "oNo8yf9Nw5tO", + "outputId": "1948c15d-dbdb-46b1-bc37-c6da952e06d6" + }, + "source": [ + "system.alpha = system.birth_rate - system.death_rate\n", + "print(system.alpha)\n", + "\n", + "results = run_simulation(system, update_func2)\n", + "plot_results(census, un, results, 'Proportional model, combined birth and death')" + ], + "execution_count": 68, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.017\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s-XPWn8Gw5tO" + }, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Maybe the reason the proportional model doesn't work very well is that the growth rate, `alpha`, is changing over time. So let's try a model with different growth rates before and after 1980 (as an arbitrary choice).\n", + "\n", + "Write an update function that takes `pop`, `t`, and `system` as parameters. The system object, `system`, should contain two parameters: the growth rate before 1980, `alpha1`, and the growth rate after 1980, `alpha2`. It should use `t` to determine which growth rate to use. Note: Don't forget the `return` statement.\n", + "\n", + "Test your function by calling it directly, then pass it to `run_simulation`. Plot the results. Adjust the parameters `alpha1` and `alpha2` to fit the data as well as you can.\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "id": "Nw-8UtjHw5tP" + }, + "source": [ + "def update_func3(pop, t, system):\n", + " if t < 1980:\n", + " net_growth = system.alpha1 * pop\n", + " else:\n", + " net_growth = system.alpha2 * pop\n", + " \n", + " return pop + net_growth" + ], + "execution_count": 60, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "HoU60dsTw5tP" + }, + "source": [ + "system.alpha1 = 0.0185\n", + "system.alpha2 = 0.015" + ], + "execution_count": 99, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "YNfDJ3BIw5tP", + "outputId": "acbfc6fe-b5a6-4a43-bf85-5fad899220b4" + }, + "source": [ + "results = run_simulation(system, update_func3)\n", + "plot_results(census, un, results, 'Different Rate Model')" + ], + "execution_count": 103, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/colab/chap07.ipynb b/colab/chap07.ipynb index e8ed937c7..71e849a90 100644 --- a/colab/chap07.ipynb +++ b/colab/chap07.ipynb @@ -1,547 +1,870 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 7" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Quadratic growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the implementation of the quadratic growth model." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Compute the population next year with a quadratic model.\n", - " \n", - " pop: current population\n", - " t: current year\n", - " system: system object containing parameters of the model\n", - " \n", - " returns: population next year\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a `System` object with the parameters `alpha` and `beta`:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = census[t_0]\n", - "\n", - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Can you find values for the parameters that make the model fit better?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Equilibrium\n", - "\n", - "To understand the quadratic model better, let's plot net growth as a function of population." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "pop_array = linspace(0, 15, 100)\n", - "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2\n", - "None" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "sns.set_style('whitegrid')\n", - "\n", - "plot(pop_array, net_growth_array)\n", - "decorate(xlabel='Population (billions)',\n", - " ylabel='Net growth (billions)')\n", - "\n", - "sns.set_style('white')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like. Remember that the x axis is population now, not time." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n", - "\n", - "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the equilibrium the population tends toward." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dysfunctions" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n", - "\n", - "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's see all the ways that can go wrong.\n", - "\n", - "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity():\n", - " K = -sys1.alpha / sys1.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity()\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n", - "\n", - "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " system = System(alpha=0.025, beta=-0.0018)\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n", - "\n", - "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n", - "\n", - "\n", - "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " \n", - "sys1 = System(alpha=0.025, beta=-0.0018)\n", - "pop = carrying_capacity(sys1)\n", - "print(pop)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n", - "\n", - "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def carrying_capacity(system):\n", - " K = -system.alpha / system.beta\n", - " return K\n", - " \n", - "sys2 = System(alpha=0.025, beta=-0.0018)\n", - "carrying_capacity(sys2)\n", - "\n", - "# print(K) This line won't work because K only exists inside the function." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n", - "\n", - "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n", - "\n", - "For example, you could eliminate the temporary variable `pop` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "print(carrying_capacity(sys1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or if you had more than one system, you could compute the total carrying capacity like this:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n", - "total" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n", - "\n", - "$ \\Delta p = r p (1 - p / K) $\n", - "\n", - "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap07.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "aD40efaGygw4" + }, + "source": [ + "# Chapter 7" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "UybVyT0rygxA" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun San Yip 20 June 2021\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "VL4xnAS-ygxE" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 51, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "77k6xwPTygxJ" + }, + "source": [ + "### Code from the previous chapter" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "VCsqQ4qkygxL" + }, + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ], + "execution_count": 52, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "D2uof7SxygxL" + }, + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cn0f4khoygxO", + "outputId": "b7fe18c4-8334-45c7-d675-0c9492350f53" + }, + "source": [ + "un = table2.un / 1e9\n", + "un.head()" + ], + "execution_count": 53, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2.525149\n", + "1951 2.572851\n", + "1952 2.619292\n", + "1953 2.665865\n", + "1954 2.713172\n", + "Name: un, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 53 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IypSE8ezygxS", + "outputId": "73ec697e-d40c-4fbd-dd17-3375a648b5d2" + }, + "source": [ + "census = table2.census / 1e9\n", + "census.head()" + ], + "execution_count": 54, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Year\n", + "1950 2.557629\n", + "1951 2.594940\n", + "1952 2.636772\n", + "1953 2.682053\n", + "1954 2.730228\n", + "Name: census, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 54 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aiF0uIOZygxZ" + }, + "source": [ + "def plot_results(census, un, timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " census: TimeSeries of population estimates\n", + " un: TimeSeries of population estimates\n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ], + "execution_count": 55, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "9OVoZ8dHygxd" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ], + "execution_count": 56, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fzyzumpVygxh" + }, + "source": [ + "### Quadratic growth" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3iPvUUPUygxl" + }, + "source": [ + "Here's the implementation of the quadratic growth model." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "RR4g3njRygxm" + }, + "source": [ + "def update_func_quad(pop, t, system):\n", + " \"\"\"Compute the population next year with a quadratic model.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " net_growth = system.alpha * pop + system.beta * pop**2\n", + " return pop + net_growth" + ], + "execution_count": 57, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Mu7L1Reeygxo" + }, + "source": [ + "Here's a `System` object with the parameters `alpha` and `beta`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "XWq57fchygxp" + }, + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "p_0 = census[t_0]\n", + "\n", + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " alpha=0.0265,\n", + " beta=-0.0022)" + ], + "execution_count": 58, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o4dRSwSQygxq" + }, + "source": [ + "And here are the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "W1jK1FcBygxs", + "outputId": "e9344670-52fc-4a69-c669-a95f9620b36e" + }, + "source": [ + "results = run_simulation(system, update_func_quad)\n", + "plot_results(census, un, results, 'Quadratic model')" + ], + "execution_count": 59, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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68bl1x+Hh4cHOTk5pbaNGDGi1FLt9erV45dffgFKZg5Zvnw5K1as4NKlS9SqVYvXX3+dUaNGGYNq48aNAERGRmJra0toaChr1qyRgBLiIYpuXuLO9sXGVphLSh92nbpKrYR4ABwcHIzNeU/LYNs/o1wDda2srJ7JdtCKplKpSq0ye59Go0GlevC/pHHjxvTr14/PP/+cTz755LHPm5aWhqOjY6ltixYtKvMelLOzM++++y7vvvsuhYWFbNu2jSlTplC7dm3jdFVr1qyhd+/e2NraAiWdJUaMGMG1a9fw8fF57FqFeJroCu6Rte8n7p3aDRhQ2LmQ2qg7x09fppb5PZRKpXHuvJo023hlKzOgpkyZwgcffICtrS1Tpkx55EGmTZtW4YU9zby8vLh+/XqpbXq9npSUFOrXr//QfcaNG0f37t3Zv3//Y51TrVaza9cuOnTo8Fj7W1tbExUVxY8//mic+urYsWNcunSJ1NRUY+eJ++tfrlmzxrjMvBDPutwT27h3ahd6lFx378g1gw23TpwDwMfHh8jISFxdXau4yuqnzIC6fv06Op3O+LgschlaflFRUXz66aeEhobStm1bioqK+O67kk4aISEhD93H2dmZkSNHGruhm0qv13PhwgUWLFhATk4O48aNM2m/nJwcvv/+e1544QV8fHxQKBRER0eTmJhoHKy9evVqAgMDWbRoUal916xZw8qVK3n33XextLQsV71CPC306kKUFtYAOHR4kaRLV/jpqiW2N3NRKHKpVasWPXv2pFmzZvJ7tAxlBtTKlSsf+lj8eX369KG4uJiZM2dy8+ZNLC0tad68OcuXLzf2mHuYQYMGsWbNGrKzs006h0KhQKlU4unpSceOHfnkk09wc3Mr9b633nqr1D0ogPXr11OnTh0yMzN55513yMjIQKVS4enpyT/+8Q8iIiLIzMxk586dzJo164FjDh48mGXLlrF161b+8pe/lOMrI0TNpyvMI3v/avITj+IyeA629vacPnueXZkq7MzvoVAojCvbyh9wj6Yw3G+TqeYetW69EEJUNYNBz734vWTt/RF9QS56FPxUHEqdejak3roJlHQui4yMxN3dvYqrrT4e9bu9zCuo/262eZQRI0Y8fnVCCFHDFade5c6Of1J8MxEApVcz1mXUxaDJIPVWNra2tnTv3p0WLVpIc145lBlQ69atM+kA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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cX3L0OJEygxt" + }, + "source": [ + "**Exercise:** Can you find values for the parameters that make the model fit better? The value I created above look a little better." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "khaZQm2Wygxt" + }, + "source": [ + "### Equilibrium\n", + "\n", + "To understand the quadratic model better, let's plot net growth as a function of population." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "0LEa4DwZygxu" + }, + "source": [ + "pop_array = linspace(0, 15, 100)\n", + "net_growth_array = system.alpha * pop_array + system.beta * pop_array**2\n", + "None" + ], + "execution_count": 61, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wCNSPyUXygxv" + }, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "BTLciQ0Cygxv", + "outputId": "0360429a-4996-498f-9709-f1bd5a312c23" + }, + "source": [ + "sns.set_style('whitegrid')\n", + "\n", + "plot(pop_array, net_growth_array)\n", + "decorate(xlabel='Population (billions)',\n", + " ylabel='Net growth (billions)')\n", + "\n", + "sns.set_style('white')" + ], + "execution_count": 62, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pWChdo61ygxw" + }, + "source": [ + "Here's what it looks like. Remember that the x axis is population now, not time." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fU1P9F-Aygxy" + }, + "source": [ + "It looks like the growth rate passes through 0 when the population is a little less than 14 billion.\n", + "\n", + "In the book we found that the net growth is 0 when the population is $-\\alpha/\\beta$:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K7HXGcYtygxz", + "outputId": "c1fbb108-1656-4fd8-bbea-380aae8d68a6" + }, + "source": [ + "-system.alpha / system.beta" + ], + "execution_count": 63, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "12.045454545454545" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 63 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BgLOPYX1ygx3" + }, + "source": [ + "This is the equilibrium the population tends toward." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kmESMfaUygx4" + }, + "source": [ + "`sns` is a library called Seaborn which provides functions that control the appearance of plots. In this case I want a grid to make it easier to estimate the population where the growth rate crosses through 0." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "du9lSD2Gygx7" + }, + "source": [ + "### Dysfunctions" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xD0WdSbzygx8" + }, + "source": [ + "When people first learn about functions, there are a few things they often find confusing. In this section I present and explain some common problems with functions.\n", + "\n", + "As an example, suppose you want a function that takes a `System` object, with variables `alpha` and `beta`, as a parameter and computes the carrying capacity, `-alpha/beta`. Here's a good solution:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mH3HsTY7ygx9", + "outputId": "09aa8e23-d86e-4741-c72b-7273fbb9861d" + }, + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ], + "execution_count": 64, + "outputs": [ + { + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4-gbutp9ygx-" + }, + "source": [ + "Now let's see all the ways that can go wrong.\n", + "\n", + "**Dysfunction #1:** Not using parameters. In the following version, the function doesn't take any parameters; when `sys1` appears inside the function, it refers to the object we created outside the function.\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "atlAqcVTygx-", + "outputId": "273b5117-c4bb-43bf-bd5e-a6f2b332824e" + }, + "source": [ + "def carrying_capacity():\n", + " K = -sys1.alpha / sys1.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity()\n", + "print(pop)" + ], + "execution_count": 65, + "outputs": [ + { + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V4UZAKFrygx_" + }, + "source": [ + "This version actually works, but it is not as versatile as it could be. If there are several `System` objects, this function can only work with one of them, and only if it is named `system`.\n", + "\n", + "**Dysfunction #2:** Clobbering the parameters. When people first learn about parameters, they often write functions like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Onp1QBfhygyY", + "outputId": "439792a8-7fb4-4132-b6eb-370c5d3bc72f" + }, + "source": [ + "def carrying_capacity(system):\n", + " system = System(alpha=0.025, beta=-0.0018)\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ], + "execution_count": 66, + "outputs": [ + { + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "n8mxGjrbygya" + }, + "source": [ + "In this example, we have a `System` object named `sys1` that gets passed as an argument to `carrying_capacity`. But when the function runs, it ignores the argument and immediately replaces it with a new `System` object. As a result, this function always returns the same value, no matter what argument is passed.\n", + "\n", + "When you write a function, you generally don't know what the values of the parameters will be. Your job is to write a function that works for any valid values. If you assign your own values to the parameters, you defeat the whole purpose of functions.\n", + "\n", + "\n", + "**Dysfunction #3:** No return value. Here's a version that computes the value of `K` but doesn't return it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h88I6XCxygyb", + "outputId": "78ee26ac-9c27-411c-a185-e28f3a572ef2" + }, + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " \n", + "sys1 = System(alpha=0.025, beta=-0.0018)\n", + "pop = carrying_capacity(sys1)\n", + "print(pop)" + ], + "execution_count": 67, + "outputs": [ + { + "output_type": "stream", + "text": [ + "None\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Hw2v9HTtygyb" + }, + "source": [ + "A function that doesn't have a return statement always returns a special value called `None`, so in this example the value of `pop` is `None`. If you are debugging a program and find that the value of a variable is `None` when it shouldn't be, a function without a return statement is a likely cause.\n", + "\n", + "**Dysfunction #4:** Ignoring the return value. Finally, here's a version where the function is correct, but the way it's used is not." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "iy_M_odYygye", + "outputId": "de7824a3-56c8-45ba-a8e3-eab2bfa26939" + }, + "source": [ + "def carrying_capacity(system):\n", + " K = -system.alpha / system.beta\n", + " return K\n", + " \n", + "sys2 = System(alpha=0.025, beta=-0.0018)\n", + "carrying_capacity(sys2)\n", + "\n", + "# print(K) This line won't work because K only exists inside the function." + ], + "execution_count": 68, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "13.88888888888889" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 68 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KJ87E4Q9ygye" + }, + "source": [ + "In this example, `carrying_capacity` runs and returns `K`, but the return value is dropped.\n", + "\n", + "When you call a function that returns a value, you should do something with the result. Often you assign it to a variable, as in the previous examples, but you can also use it as part of an expression.\n", + "\n", + "For example, you could eliminate the temporary variable `pop` like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BgWdx9v9ygyf", + "outputId": "f20bafc6-2f0b-4c6e-861c-740f937ad1c1" + }, + "source": [ + "print(carrying_capacity(sys1))" + ], + "execution_count": 69, + "outputs": [ + { + "output_type": "stream", + "text": [ + "13.88888888888889\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b7Tb6Xhzygyg" + }, + "source": [ + "Or if you had more than one system, you could compute the total carrying capacity like this:\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gsktd5jwygyh", + "outputId": "171c6597-c4cc-49f9-d108-0e75d44b0ea0" + }, + "source": [ + "total = carrying_capacity(sys1) + carrying_capacity(sys2)\n", + "total" + ], + "execution_count": 70, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "27.77777777777778" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 70 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WGmOmd1Mygyi" + }, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** In the book, I present a different way to parameterize the quadratic model:\n", + "\n", + "$ \\Delta p = r p (1 - p / K) $\n", + "\n", + "where $r=\\alpha$ and $K=-\\alpha/\\beta$. Write a version of `update_func` that implements this version of the model. Test it by computing the values of `r` and `K` that correspond to `alpha=0.025, beta=-0.0018`, and confirm that you get the same results. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jHdMeaOpygyj" + }, + "source": [ + "def update_func_quad_para(pop, t, system):\n", + " \"\"\"Compute the population next year with a quadratic model in parameterized way.\n", + " \n", + " pop: current population\n", + " t: current year\n", + " system: system object containing parameters of the model\n", + " \n", + " returns: population next year\n", + " \"\"\"\n", + " net_growth = system.r * pop*(1-pop/system.K)\n", + " return pop + net_growth" + ], + "execution_count": 81, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "HYL_WInwygyk" + }, + "source": [ + "alpha = 0.025\n", + "beta = -0.0018\n", + "system.r=alpha\n", + "system.K=-alpha/beta" + ], + "execution_count": 82, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "pTTLxQUtygyl", + "outputId": "1fd22e0b-46ab-4656-b9fa-4bfec902aa33" + }, + "source": [ + "results = run_simulation(system, update_func_quad_para)\n", + "plot_results(census, un, results, 'Quadratic model in Parameterized way')" + ], + "execution_count": 83, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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zZw507a+pqZGJSUlqeXLl6vGxkaVk5OjDAaD2rp1q22bV199VU2ZMkWdPn1aVVZWqhkzZqgnnniiw/azdetW9Y9//EOlpqaqm2+++YL7cPRzpz10yIA6x2QyXfBEW7Jkid2DTCmlnn/+efXoo4/abl8uoN555x1177332i2bM2eOmj9/fjtUfXG/pReLxaJGjhypPv7440vud968eWrOnDl2y+699161fPnydqr84n7rsTlfQ0ODMhgM6pNPPrEtc8axUeq39xMXF6e+//572+0jR46osLAwVV5erpRyzvH5Lb0UFRWpsLAwVVZWZlu/b98+FRYWZnvBdtZjTSmlduzYoWJjY223N27cqIYPH64sFott2ZIlS9QjjzyilGp9bOl0OrVz507b+nM9dsR+zrdx48aLBpSznjtXo0N+xPdrrFYr6hfz3yqlOHTokN2y7777jsTERMaPH8+CBQsoLy+3rTt8+DBRUVF220dFRXH48OFrV/hFXK6Xo0ePcubMGSoqKrj99tsxGo2kpKTYfRzmKr1A24/NOV9++SVms5m77rrLtqyj9TNr1iy++OILqquraWhoYN26dSQkJBAcHAy4Tj+X68VqtV7wO+e2P7eNM3tJT08nIiLCdvvw4cNERkai1f7vS9z5tRw7doympiZ0Op1t/U033YSPj0+H7KctXOWxdiU6XUCNGzeOtLQ0vv/+e8xmMyaTie3bt1NXV2fb5uGHH2br1q2YTCZWr15NcXExTz75pO0JV1tbS2BgoN1+AwMDqa2tdalezn1GvXXrVlJTU9m1axdxcXHMmDGD6upql+oF2nZszve3v/2Nu+66Cz8/P9uyjtbPyJEjKS4utp3n2LVrF3/6059s612ln8v1MmDAAAYOHMjbb79NXV0dpaWlrFq1CsC2jbN6+frrr9mwYQMvv/yybVltbS0BAQGXrOXcv7/cJiAgwG6bjtJPW7jKY+1KdLqAio+P580332TZsmUkJyezcuVK7rvvPttfrND6V0P37t3RaDT069eP119/ndzcXI4dOwaAv7//BSd/q6ur8ff3d2Qrl+3lXD0pKSn0798fLy8vnn76aerr68nJyXGpXqBtx+ac/Px8CgoKePDBB+2Wd6R+qqurefTRRxkxYgTZ2dnk5eXx+OOP88ADD9guwOkq/VyuF3d3d1atWkV5eTkTJkxg6tSp/O53vwOwezw6upevvvqKP/7xj7z77rsMHTrUttzf3/+CF97zazn37y/rrampsdumo/TTFq7yWLsSnS6gAO688042b95MRkYGH330EadPnyYxMfGS22s0GuB/P7KIiIigoKDAbpuDBw/aveV2lF/rZcCAAfj4+Njqh9Zezr/tSr1A24/Np59+isFgYPDgwXbLO1I/J06coKqqiunTp+Pr64unpydTp07FarWSnZ0NuFY/lzs2/fv3Z9WqVaSlpbF9+3Z69eqFt7c3er0ecHwvGzZsYNGiRaxatQqj0Wi3LiIigsLCQruPJs+v5cYbb8TLy8uu3h9//JGGhgbbNh2pn7ZwpcdamznlzNdVMpvNqrGxUe3Zs0eFhYWpxsZG1djYqCwWi7JYLCovL0+ZzWZVW1ur1qxZo2JjY1VRUZFSSqnGxka1detWVV1drZRS6tSpU2rGjBlqypQpthOQJ06cUNHR0erzzz9Xzc3NaufOnUqv11+T0S5X04tSSi1evFjdfvvt6uTJk6q5uVktX75cDR8+3NZfVlaWio6Oto3y+/zzz5Ver1enTp1q917aox+llKqoqFA6nU599dVXF+zfkcfmavupq6tTiYmJtpFXLS0tat26dSoyMlIdPXpUKeXY43O1x+bw4cOqpqZGmc1mlZ2drcaNG6dWrlxpW+/IXtasWaMSEhJUfn7+RdefG/W2YsUK1dTUpPLy8lRCQoL6+uuvbdu8+uqr6p577lFnzpxRlZWVaubMmWrGjBkdtp+WlhbV2Nio1q1bp8aMGWM7vudGjDr6udMeOmRAbdy4UYWFhV3wYzKZVHNzs7r77rtVbGysiomJUdOmTVMHDx60/W59fb164IEHlMFgUHq9Xo0ZM0a9+uqr6uzZs3b3sW/fPnXHHXconU6nJkyYcNEXS2f3opRSTU1NavHixSohIUHFx8erlJQUdejQIbtttmzZoiZMmKB0Op264447VFpa2jXppT36UUqp999/Xw0fPlw1Nzdf9D4cdWzao5+8vDyVkpKiEhIS1LBhw9Tdd9+tvv32W7ttHHV8rraXlStXKqPRqKKjo9Wtt9560dGjjuolLCxMRUZGqpiYGLuf84eAHzx4UN1///1Kp9OpUaNGqTVr1tjto6GhQb3yyisqPj5excbGqtmzZ6uKiooO288777xz0eN78uRJ2zaOfO60B7nkuxBCCJfUKc9BCSGE6PgkoIQQQrgkCSghhBAuSQJKCCGES5KAEkII4ZIkoIQQQrgkCSghhBAuSQJKiGtEKcX06dOZOnUqFovFbt3BgweJiopi69atTqpOCNcnASXENaLRaHjzzTc5duwY7733nm15Y2Mjc+fO5c4772TixIntep9KKVpaWtp1n0I4iwSUENdQjx49eO2110hNTeXAgQMAvP322zQ3N/Pyyy/z2muvMXLkSPR6PZMnT2bbtm12v79s2TImTpyIXq9n9OjRLFiwwG5G6k2bNhEZGYnJZGLy5MnodDrS0tIc2qMQ14q7swsQorMbP348U6ZMYe7cucydO5fPPvuMjz76iCeffBJoDaHQ0FDS0tJ47rnn+Otf/0pSUhIAXl5eLF68mJ49e3Ly5EkWLVrEa6+9xltvvWXbv9Vq5e2332b+/Pn07t3b7vpZQnRkMhefEA5QX1/PlClTOHHiBE899RQJCQk8/vjjpKWl2V2I7qWXXqKqqorU1NSL7ufbb7/l2WefJT8/H61Wy6ZNm3jppZf45JNPiI+Pd1Q7QjiEvIMSwgF8fX2ZPn06Cxcu5Mknn+TDDz+kpaWFUaNG2W3X0tJC//79bbe3bdvGmjVrOH78OHV1dVitVlpaWigtLSU0NNS23fmXLheis5CAEsJB3N3dbf9arVYCAgL4/PPPL9jOw8MDgLy8PObMmcMTTzzBiy++SGBgIHl5ecybN89uIISbmxteXl6OaUIIB5KAEsIJdDod1dXVNDU1ERYWdtFtsrKyCA4O5tlnn7Ut++abbxxVohBOJwElhBMYjUaSk5N5+umnmTt3LuHh4VRVVZGTk4OXlxf3338/AwYMoLy8nA0bNmA0GsnKyuLTTz91dulCOIwElBBOoNFoePfdd1mxYgVvvPEGZ8+epUuXLkRERPD4448DcPPNNzNr1iyWLVtGfX09BoOBF198keeff97J1QvhGDKKTwghhEuSL+oKIYRwSRJQQgghXJIElBBCCJckASWEEMIlSUAJIYRwSRJQQgghXJIElBBCCJckASWEEMIl/X9T1winMfmC6AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "11Bpvovhygyl" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap08.ipynb b/colab/chap08.ipynb index a77508ed6..e5a4fc0b2 100644 --- a/colab/chap08.ipynb +++ b/colab/chap08.ipynb @@ -1,609 +1,1292 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 8" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap08.ipynb", + "provenance": [] + } }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# Configure Jupyter so figures appear in the notebook\n", - "%matplotlib inline\n", - "\n", - "# import functions from the modsim.py module\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Functions from the previous chapter" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(census, un, timeseries, title):\n", - " \"\"\"Plot the estimates and the model.\n", - " \n", - " census: TimeSeries of population estimates\n", - " un: TimeSeries of population estimates\n", - " timeseries: TimeSeries of simulation results\n", - " title: string\n", - " \"\"\"\n", - " plot(census, ':', label='US Census')\n", - " plot(un, '--', label='UN DESA')\n", - " plot(timeseries, color='gray', label='model')\n", - " \n", - " decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title=title)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate the system using any update function.\n", - " \n", - " system: System object\n", - " update_func: function that computes the population next year\n", - " \n", - " returns: TimeSeries\n", - " \"\"\"\n", - " results = TimeSeries()\n", - " results[system.t_0] = system.p_0\n", - " \n", - " for t in linrange(system.t_0, system.t_end):\n", - " results[t+1] = update_func(results[t], t, system)\n", - " \n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Reading the data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the data file\n", - "\n", - "import os\n", - "\n", - "filename = 'World_population_estimates2.csv'\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates2.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "table2 = pd.read_csv('World_population_estimates2.csv')\n", - "table2.index = table2.Year\n", - "table2.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "census = table2.census / 1e9\n", - "plot(census, ':', label='US Census')\n", - "plot(un, '--', label='UN DESA')\n", - " \n", - "decorate(xlabel='Year', \n", - " ylabel='World population (billion)',\n", - " title='Estimated world population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Running the quadratic model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func_quad(pop, t, system):\n", - " \"\"\"Update population based on a quadratic model.\n", - " \n", - " pop: current population in billions\n", - " t: what year it is\n", - " system: system object with model parameters\n", - " \"\"\"\n", - " net_growth = system.alpha * pop + system.beta * pop**2\n", - " return pop + net_growth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the starting time and population." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "t_0 = get_first_label(census)\n", - "t_end = get_last_label(census)\n", - "p_0 = get_first_value(census)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Initialize the system object." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=t_end,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model and plot results." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'Quadratic model')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generating projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To generate projections, all we have to do is change `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "system.t_end = 2250\n", - "results = run_simulation(system, update_func_quad)\n", - "plot_results(census, un, results, 'World population projection')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The population in the model converges on the equilibrium population, `-alpha/beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "results[system.t_end]" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "-system.alpha / system.beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Comparing projections" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can compare the projection from our model with projections produced by people who know what they are doing." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Get the data file\n", - "\n", - "import os\n", - "\n", - "filename = 'World_population_estimates3.csv'\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates3.csv\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def read_table3(filename = 'data/World_population_estimates.html'):\n", - " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", - " table3 = tables[3]\n", - " table3.columns = ['census', 'prb', 'un']\n", - " return table3" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "#table3 = read_table3()\n", - "#table3.to_csv('data/World_population_estimates3.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "table3 = pd.read_csv('World_population_estimates3.csv')\n", - "table3.index = table3.Year\n", - "table3.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_projections(table):\n", - " \"\"\"Plot world population projections.\n", - " \n", - " table: DataFrame with columns 'un' and 'census'\n", - " \"\"\"\n", - " census_proj = table.census / 1e9\n", - " un_proj = table.un / 1e9\n", - " \n", - " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n", - " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the model until 2100, which is as far as the other projections go." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "system = System(t_0=t_0, \n", - " t_end=2100,\n", - " p_0=p_0,\n", - " alpha=0.025,\n", - " beta=-0.0018)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func_quad)\n", - "\n", - "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", - "plot_results(census, un, results, 'World population projections')\n", - "plot_projections(table3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "People who know what they are doing expect the growth rate to decline more sharply than our model projects." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n", - "\n", - "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n", - "\n", - "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "alpha_census = compute_rel_diff(census)\n", - "plot(alpha_census, label='US Census')\n", - "\n", - "alpha_un = compute_rel_diff(un)\n", - "plot(alpha_un, label='UN DESA')\n", - "\n", - "decorate(xlabel='Year', label='Net growth rate')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n", - "\n", - "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n", - "\n", - "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n", - "\n", - "3. Create a `System` object that includes `alpha_func` as a system variable.\n", - "\n", - "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", - "\n", - "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n", - "\n", - "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", - "\n", - "7. Compare your projections with those from the US Census and UN." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "0_YM0iUXpVVp" + }, + "source": [ + "# Chapter 8" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "-h5aOosbpVVw" + }, + "source": [ + "*Modeling and Simulation in Python* edit by Chun San Yip \n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "WOcq5JVupVVy" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "eYIJJJNPpVV0" + }, + "source": [ + "# Configure Jupyter so figures appear in the notebook\n", + "%matplotlib inline\n", + "\n", + "# import functions from the modsim.py module\n", + "from modsim import *" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0DDBEYaFpVV0" + }, + "source": [ + "### Functions from the previous chapter" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "1maBu1MOpVV1" + }, + "source": [ + "def plot_results(census, un, timeseries, title):\n", + " \"\"\"Plot the estimates and the model.\n", + " \n", + " census: TimeSeries of population estimates\n", + " un: TimeSeries of population estimates\n", + " timeseries: TimeSeries of simulation results\n", + " title: string\n", + " \"\"\"\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries, color='gray', label='model')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "8UNCFPjGpVV2" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZbrI5dj-pVV4" + }, + "source": [ + "### Reading the data" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QdetVNyYpVV6" + }, + "source": [ + "# Get the data file\n", + "\n", + "import os\n", + "\n", + "filename = 'World_population_estimates2.csv'\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates2.csv" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 237 + }, + "id": "vlfyzU9ppVV8", + "outputId": "2ff7ed6b-2b81-4c65-df66-95dc07079bc0" + }, + "source": [ + "table2 = pd.read_csv('World_population_estimates2.csv')\n", + "table2.index = table2.Year\n", + "table2.head()" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Yearcensusprbunmaddisonhydetantonbirabenmjthomlinsondurandclark
Year
1950195025576286542.516000e+092.525149e+092.544000e+092.527960e+092.400000e+092.527000e+092.500000e+092.400000e+09NaN2.486000e+09
195119512594939877NaN2.572851e+092.571663e+09NaNNaNNaNNaNNaNNaNNaN
195219522636772306NaN2.619292e+092.617949e+09NaNNaNNaNNaNNaNNaNNaN
195319532682053389NaN2.665865e+092.665959e+09NaNNaNNaNNaNNaNNaNNaN
195419542730228104NaN2.713172e+092.716927e+09NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " Year census prb ... thomlinson durand clark\n", + "Year ... \n", + "1950 1950 2557628654 2.516000e+09 ... 2.400000e+09 NaN 2.486000e+09\n", + "1951 1951 2594939877 NaN ... NaN NaN NaN\n", + "1952 1952 2636772306 NaN ... NaN NaN NaN\n", + "1953 1953 2682053389 NaN ... NaN NaN NaN\n", + "1954 1954 2730228104 NaN ... NaN NaN NaN\n", + "\n", + "[5 rows x 12 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "S4Mx5F6cpVV9", + "outputId": "8dd58cfd-d0b4-4297-e60f-ff32f7296489" + }, + "source": [ + "un = table2.un / 1e9\n", + "census = table2.census / 1e9\n", + "plot(census, ':', label='US Census')\n", + "plot(un, '--', label='UN DESA')\n", + " \n", + "decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title='Estimated world population')" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XEDkde5ppVV-" + }, + "source": [ + "### Running the quadratic model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QUIaOwSFpVV_" + }, + "source": [ + "Here's the update function for the quadratic growth model with parameters `alpha` and `beta`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "hJBtvhc-pVV_" + }, + "source": [ + "def update_func_quad(pop, t, system):\n", + " \"\"\"Update population based on a quadratic model.\n", + " \n", + " pop: current population in billions\n", + " t: what year it is\n", + " system: system object with model parameters\n", + " \"\"\"\n", + " net_growth = system.alpha * pop + system.beta * pop**2\n", + " return pop + net_growth" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NIoHJP-wpVWA" + }, + "source": [ + "Extract the starting time and population." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zBgkucrmpVWA" + }, + "source": [ + "t_0 = get_first_label(census)\n", + "t_end = get_last_label(census)\n", + "p_0 = get_first_value(census)" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ql_vrD8IpVWB" + }, + "source": [ + "Initialize the system object." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "id": "k8qYDNHDpVWB" + }, + "source": [ + "system = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " alpha=0.025,\n", + " beta=-0.0018)" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Pf-yWDnYpVWB" + }, + "source": [ + "Run the model and plot results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "EPMBLXHhpVWB", + "outputId": "cfc6002d-c768-4184-9d52-d927807d064f" + }, + "source": [ + "results = run_simulation(system, update_func_quad)\n", + "plot_results(census, un, results, 'Quadratic model')" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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Scfx9fVlypQpbN682aPtw8PD6datG4899hhff/01hw4dOq/qLpjFz7799ltuuOEGZs2aRXZ2NqtWrbqkWIVoio4cOcJbb71FfHw8GC56WtK52qrp2qsP7X67gK7TfsXogR0afVKqyNOJug7gIaXU45j3owAOa60L6yyyWuBpzyZkwJTy3tTFRN9++YsHP/zww8yaNYubb765vPx6TbRq1YqcnJyz2n7729+edQ+qXbt2fP21uXbvRx99xMKFC/noo484dOgQwcHB3Hzzzdx9993lNWL+97//AXDVVVcRGBjImDFjWLRoEdOmTatxnEI0JYWFhaxYsYIdO8yKtpFBfgwp3IPN1ozkmN/QfYZZ3HzcABg3oGGsAFFbqjVR152QdtdRLE2G3W4/q8psmdLS0vIZ4BV1796d66+/nueee44nnniixudNSUkhLCzsrLa33377gvegIiIieOCBB3jggQcoLCxk2bJlPPbYY7Rs2ZJf/OIXACxatIjp06cTGGguoXLDDTfw29/+lqNHj9KpU6caxypEY2cYBvv27WPZsmXk5+djs9kYO3Ysw4YMYs+y//HEBj9a7fFh9FUGVqv3igZ60wUTlFLqn8ADWus89+ML0lpX7w5+ExcdHc2xY8fOanO5XCQmJtK+fftK97nvvvuYPHky69atq9E5S0pKWLlyJcOGDavR/v7+/syaNYtPPvmEAwcOAJCQkMChQ4dITk4uHzxRdhlw0aJF5WXmhRBny83NZenSpWitAWhhK2LEzDn07WOO0Ot3zf9xW8QRJgxq12STE1Tdg+pW4fWqSixevCSvOMusWbN48sknGTNmDIMGDaKoqIh33jEHaYwePbrSfSIiIpg3bx7/+Mc/qnUul8vFgQMHeP3118nJyeG++ypb7/d8OTk5vPfee1x99dV06tQJi8VCbGwsBw8e5I477gDMwRG9e/fm7bfPXvN30aJFfPzxxzzwwAP4+flVK14hGjPDMNi2bRsrV6yguKQEH5wMsCbT3GLwr/9s44lOXQgL9sNisTBzTBdvh+t1F0xQWuvxlT0Wl27GjBkUFxfz7LPPkpSUhJ+fHzExMSxcuLB8xFxl5s6dy6JFi8jOzvboHBaLBavVStu2bRk5ciRPPPEEUVFRZ213xx13nDcP6ssvv6R169ZkZmZy7733kpaWht1up23btjz66KNMmzaNzMxM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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vJBlG3rHpVWB" + }, + "source": [ + "### Generating projections" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "92nr3Bc-pVWB" + }, + "source": [ + "To generate projections, all we have to do is change `t_end`" + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "eSvLbxXCpVWC", + "outputId": "5014aed2-c3d2-42a5-e899-dd3da47f0369" + }, + "source": [ + "system.t_end = 2250\n", + "results = run_simulation(system, update_func_quad)\n", + "plot_results(census, un, results, 'World population projection')" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "T4rSrRtzpVWC" + }, + "source": [ + "The population in the model converges on the equilibrium population, `-alpha/beta`" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "z2Mm-jZrpVWC", + "outputId": "b5ed83a0-e85c-49cd-f0b2-7a6df5bff0c2" + }, + "source": [ + "results[system.t_end]" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "13.856665141368708" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Dg7lXLflpVWD", + "outputId": "b8a7835e-ec3f-4156-f9e9-e85cfd7472ab" + }, + "source": [ + "-system.alpha / system.beta" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "13.88888888888889" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V8XkAxpZpVWD" + }, + "source": [ + "**Exercise:** What happens if we start with an initial population above the carrying capacity, like 20 billion? Run the model with initial populations between 1 and 20 billion, and plot the results on the same axes." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "NjJbDIcOpVWD", + "outputId": "12ee5fed-6bb4-4163-9de3-f1cbf6b3fa52" + }, + "source": [ + "system1 = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=20,\n", + " alpha=0.025,\n", + " beta=-0.0018)\n", + "results1 = run_simulation(system1, update_func_quad)\n", + "\n", + "system.t_end = 2015\n", + "results = run_simulation(system, update_func_quad)\n", + "\n", + "def plot_results1(census, un, timeseries1, timeseries2, title):\n", + "\n", + " plot(census, ':', label='US Census')\n", + " plot(un, '--', label='UN DESA')\n", + " plot(timeseries1, color='gray', label='model1')\n", + " plot(timeseries2, color='red', label='model2')\n", + " \n", + " decorate(xlabel='Year', \n", + " ylabel='World population (billion)',\n", + " title=title)\n", + " \n", + "plot_results1(census, un, results, results1, 'Quadratic model with different initial population')\n" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3uJLLeIupVWD" + }, + "source": [ + "### Comparing projections" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q-cLnTLKpVWD" + }, + "source": [ + "We can compare the projection from our model with projections produced by people who know what they are doing." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "N3c3anoJpVWE" + }, + "source": [ + "# Get the data file\n", + "\n", + "import os\n", + "\n", + "filename = 'World_population_estimates3.csv'\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates3.csv\n" + ], + "execution_count": 16, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Ydg-RLv0pVWE" + }, + "source": [ + "def read_table3(filename = 'data/World_population_estimates.html'):\n", + " tables = pd.read_html(filename, header=0, index_col=0, decimal='M')\n", + " table3 = tables[3]\n", + " table3.columns = ['census', 'prb', 'un']\n", + " return table3" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "yViKl4ccpVWE" + }, + "source": [ + "#table3 = read_table3()\n", + "#table3.to_csv('data/World_population_estimates3.csv')" + ], + "execution_count": 18, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 237 + }, + "id": "RfeLLL_apVWF", + "outputId": "819e501c-50ae-4af9-fc04-1c2abca31f69" + }, + "source": [ + "table3 = pd.read_csv('World_population_estimates3.csv')\n", + "table3.index = table3.Year\n", + "table3.head()" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Yearcensusprbun
Year
201620167.334772e+09NaN7.432663e+09
201720177.412779e+09NaNNaN
201820187.490428e+09NaNNaN
201920197.567403e+09NaNNaN
202020207.643402e+09NaN7.758157e+09
\n", + "
" + ], + "text/plain": [ + " Year census prb un\n", + "Year \n", + "2016 2016 7.334772e+09 NaN 7.432663e+09\n", + "2017 2017 7.412779e+09 NaN NaN\n", + "2018 2018 7.490428e+09 NaN NaN\n", + "2019 2019 7.567403e+09 NaN NaN\n", + "2020 2020 7.643402e+09 NaN 7.758157e+09" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5bBFMNZupVWF" + }, + "source": [ + "`NaN` is a special value that represents missing data, in this case because some agencies did not publish projections for some years." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ijHqbm3RpVWF" + }, + "source": [ + "This function plots projections from the UN DESA and U.S. Census. It uses `dropna` to remove the `NaN` values from each series before plotting it." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EJe4VxBOpVWG" + }, + "source": [ + "def plot_projections(table):\n", + " \"\"\"Plot world population projections.\n", + " \n", + " table: DataFrame with columns 'un' and 'census'\n", + " \"\"\"\n", + " census_proj = table.census / 1e9\n", + " un_proj = table.un / 1e9\n", + " \n", + " plot(census_proj.dropna(), ':', color='C0', label='US Census')\n", + " plot(un_proj.dropna(), '--', color='C1', label='UN DESA')" + ], + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jNXOqUGTpVWG" + }, + "source": [ + "Run the model until 2100, which is as far as the other projections go." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "NI34nu3EpVWG" + }, + "source": [ + "system = System(t_0=t_0, \n", + " t_end=2100,\n", + " p_0=p_0,\n", + " alpha=0.025,\n", + " beta=-0.0018)" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "69_AnQGhpVWG", + "outputId": "d5529b91-a317-49dc-cf0f-23b170a8335d" + }, + "source": [ + "results = run_simulation(system, update_func_quad)\n", + "\n", + "plt.axvspan(1950, 2016, color='C0', alpha=0.05)\n", + "plot_results(census, un, results, 'World population projections')\n", + "plot_projections(table3)" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MWpCXMSdpVWI" + }, + "source": [ + "People who know what they are doing expect the growth rate to decline more sharply than our model projects." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D20CaVqbpVWJ" + }, + "source": [ + "## Exercises\n", + "\n", + "**Exercise:** The net growth rate of world population has been declining for several decades. That observation suggests one more way to generate projections, by extrapolating observed changes in growth rate.\n", + "\n", + "The `modsim` library provides a function, `compute_rel_diff`, that computes relative differences of the elements in a sequence.\n", + "\n", + "Here's how we can use it to compute the relative differences in the `census` and `un` estimates:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 523 + }, + "id": "kcjtnJh-pVWJ", + "outputId": "54273697-3478-40d0-b813-6b0285f77dcd" + }, + "source": [ + "alpha_census = compute_rel_diff(census)\n", + "plot(alpha_census, label='US Census')\n", + "\n", + "alpha_un = compute_rel_diff(un)\n", + "plot(alpha_un, label='UN DESA')\n", + "\n", + "decorate(xlabel='Year', label='Net growth rate')\n", + "print(alpha_un)\n" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Year\n", + "1950 0.018891\n", + "1951 0.018050\n", + "1952 0.017781\n", + "1953 0.017745\n", + "1954 0.017868\n", + " ... \n", + "2012 0.011588\n", + "2013 0.011402\n", + "2014 0.014590\n", + "2015 NaN\n", + "2016 NaN\n", + "Length: 67, dtype: float64\n" + ], + "name": "stdout" + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0eZD6MWepVWK" + }, + "source": [ + "Other than a bump around 1990, net growth rate has been declining roughly linearly since 1965. As an exercise, you can use this data to make a projection of world population until 2100.\n", + "\n", + "1. Define a function, `alpha_func`, that takes `t` as a parameter and returns an estimate of the net growth rate at time `t`, based on a linear function `alpha = intercept + slope * t`. Choose values of `slope` and `intercept` to fit the observed net growth rates since 1965.\n", + "\n", + "2. Call your function with a range of `ts` from 1960 to 2020 and plot the results.\n", + "\n", + "3. Create a `System` object that includes `alpha_func` as a system variable.\n", + "\n", + "4. Define an update function that uses `alpha_func` to compute the net growth rate at the given time `t`.\n", + "\n", + "5. Test your update function with `t_0 = 1960` and `p_0 = census[t_0]`.\n", + "\n", + "6. Run a simulation from 1960 to 2100 with your update function, and plot the results.\n", + "\n", + "7. Compare your projections with those from the US Census and UN." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8JwS4y86pVWK" + }, + "source": [ + "def alpha_func(t):\n", + " intercept = 0.765\n", + " slope = -0.0003778\n", + " alpha = intercept + slope * t\n", + " return alpha\n" + ], + "execution_count": 51, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + }, + "id": "Al01bvZvpVWL", + "outputId": "bc70d11e-c3c3-4340-faf0-162990449d53" + }, + "source": [ + "growth_rate = TimeSeries()\n", + "for ts in linrange(1960,2020):\n", + " growth_rate[ts]=alpha_func(ts)\n", + "\n", + "plot(growth_rate, label='Growth Rate')" + ], + "execution_count": 65, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 65 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "e9tw5VcdpVWL" + }, + "source": [ + "system2 = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0,\n", + " alpha=alpha_func(t_0),\n", + " beta=-0.0018)" + ], + "execution_count": 69, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "LoIST0t4pVWM" + }, + "source": [ + "def update_func_alpha(pop, t, system):\n", + " \"\"\"Update population based on a quadratic model and variable alpha.\n", + " \n", + " pop: current population in billions\n", + " t: what year it is\n", + " system: system object with model parameters\n", + " \"\"\"\n", + " net_growth = system.alpha * pop + system.beta * pop**2\n", + " return pop + net_growth" + ], + "execution_count": 70, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "L84ndKkrpVWM", + "outputId": "84d670c0-2d4e-4962-c329-65e44c464494" + }, + "source": [ + "t_0 = 1960\n", + "p_0 = census[t_0]\n", + "print(t_0, p_0)\n", + "update_func_alpha(p_0, t_0, system2)" + ], + "execution_count": 71, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1960 3.043001508\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "3.1009238162442534" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 71 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + }, + "id": "4VIwgglIpVWN", + "outputId": "c9646593-b718-4ff8-db28-30953bdd4f9b" + }, + "source": [ + "system2.t_0 = 1960\n", + "system2.t_end = 2100\n", + "results3=TimeSeries()\n", + "\n", + "results3 = run_simulation(system2, update_func_alpha)\n", + "\n", + "plot(results3, ':', label='Population based on alpha function')\n" + ], + "execution_count": 76, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 76 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "RX7tSjsYpVWO", + "outputId": "a810983b-783a-45a6-e78b-7056a6cf2d57" + }, + "source": [ + "plot_results(census, un, results3, 'World population projections')" + ], + "execution_count": 77, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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YmIix44do/RKFU2aNKFjx45ERETQvn17vLy8ai222q45ZQLvYSafT8psCwW+Am4DMoCpwHylVIzWelutRimEEPWU1Wrl2LFj7N+/nwMHDpCZmVmyzd3dnfbt29OpUyc6d+5MkyZNnBZnrSYnrfUqAKXU8HK2LS9TtFAp9SQwFGhwyWnEiBHcf//9xMXFXVR+yy23MGDAAB544AEAVqxYwZw5czh69Chubm60bNmS66+/nltuuaXCc2dkZPDee+8RHx/PmTNnCAgIoHPnztx6660MGzasRn8vIUTtKyoq4vDhw+zbtw+tNRcuXCjZ5ufnR6dOnejUqRMRERE1+hypOlz2mZNSqhXQFUhwdiyuaseOHTz55JO8/fbbREdHY7FYOHDgwCUPLktLS0vjhhtuoEOHDrz77rtERERgGAabNm1i+fLlkpyEqCcKCgpISkpi3759JCYmkp//+5JJoaGhdOnShS5dutC6dWvc3V1vVJHdyUkp1Rhoi9kkl6a1Pl5TQSml/IFFwDKt9dqauk5d9+uvv9KhQweGDx8OmA8so6KiiIqKqvCYd955By8vL95//328vb1LyocPH15yHoCEhARmzZrFgQMH8PPzY/Lkydx///14epr/ZZRSPPvssyxbtgytNeHh4Tz//PP06dMHgC1btvDaa69x9OhRPD096dChAx9++CFBQUGX1P7g4priuXPneO6559i0aROFhYU0a9aMhx9+mHHjxjnw7glR/xQWFnLgwAF2795NUlLSRWORwsLC6Nq1K126dKnxzgyOUGlysiWJW4GbMTsqeABugKGUSgVWAB848pmQUioI+A5zjY9bHXXeilz7lyUALHtjcknZC59sYfve0zwzfSADIs11oVZuPsL/fZ3A2EHtuP//9QIgPSuX21/4ntBAHz577vc3zofeiudgchZvPTSMjm2Cayz2Pn36MGvWLJ5//nmGDx9OZGQkTZs2rfSY+Ph44uLiLkpMZR06dIjbb7+dl19+mdGjR3P69Gnuu+8+fHx8mDlzZsl+X3/9NbNnz6ZVq1a88sorPP7446xZswaAxx57jIceeoi4uDgKCwvZs2eP3Q9TP/nkE3Jycli7di2NGzfm5MmT5Obm2nWsEA1NUVERBw8eZPfu3WitKSwsLNkWHh5ekpBCQ0OdGGX1VZiclFL3A38HTgDfAC8CyUAeZueF7sBwYK1Saj3wgNb60JUEo5RqAqwCEoFbtNY1OwS5juvVqxdffPEF8+fP59lnn+X06dN069aNp556in79+pV7TEZGBmFhYZWed/78+YwaNYrx48cD0Lp1a2bMmMFbb711UXKaPn06bdu2BeCGG25g3rx5ZGZmEhISgpeXF8eOHSM1NZWwsDB69+5t9+/l5eXF2bNnOXToEFFRUbRu3druY4VoCKxWK4cPH2b37t3s37//oi7f4eHhREZG0q1bNwIDA50Y5ZWprOY0ERivtd5ewfatwMe22tVMYDzwf5VdTCnlAXgB3rafi5+8FQDNgTWYnR/u0lpb7f0lrkTpGlOxZ+8cdEnZuMHtGTe4/UVlTYIalXv82w8Pv+K4PD09y50epLCwsKRpDaBv37707dsXgFOnTvHaa68xY8YMfvzxx3L/Y4aGhnL69OlKr33kyBG2bt3Kjz/+WFJmtVov6mIK0Lx585LXfn5+AOTk5BASEsL777/PRx99RFxcHI0bN2bSpEnMnDkTDw+PKn/3O++8E4vFwtNPP01KSgqDBw/m0UcfpU2bNlUeK0R9ZRgGp06dIiEhgd27d1/UqSEsLIyoqCgiIyMJCQlxYpSOU2Fy0lrb1cCvtc4GXrfzercAn5b6ubitJhYYBkQCHYDrlVLF+8zTWt9r5/nrjfDwcI4cOXJRWfGI7eLaSlktW7bk3nvvZfny5Rw/fpzIyMhL9hk+fDgrV67k/vvvr7CZrVmzZkyZMoUXX3zxsuNXSvHGG28AsG/fPu68805atmzJtGnTaNy48UV/WEVFRaSnp5f83KhRIx588EEefPBBzp49ywsvvMCTTz7JvHnzLjseIeqqc+fOsWvXLnbt2kVaWlpJeZMmTUoSUrNmzZwYYc2o7a7kc4G5FWyOB56vrVhcXVxcHC+88AIxMTH069ePvLw8PvzwQwCio6MBWLNmDVlZWURHR9O8eXMyMjL47LPPCAkJ4aqrrir3vH/+85+54YYbuO+++3j00UeJiIjAarWyZcsWVqxYwSuvvMKNN97I9OnTGTp0KLGxsXh4eJCcnMzRo0eJiYmpMvaCggKWLVtGbGwsoaGh+Pv74+7uXlJrioqKYunSpdxxxx0EBgYye/bsi2qJa9eupW3btnTo0IFGjRrh4+Pjkr2JhKgpBQUF7N+/n4SEBA4d+v1piZ+fH927d6dnz560aNHC5Ts1XInq9NaLBUYBYZSZzVxrPd3BcTV4EydOJD8/n1deeYUTJ07g4+ND9+7dmTt3bklzXXBwMF999RVvvvkmOTk5NG7cmO7du/Ppp5/SqFGjcs/brFkzvv76a9577z1mzpxJeno6AQEBdOnShVtvNfuf9OjRg08++YTZs2fz3HPPUVRUROvWrbnxxhvtjn/VqlXMmjWL3NxcgoODiYuLY9KkSQDcfvvtHDhwgHHjxhEYGMiMGTMueg6WnJzMq6++SlpaGt7e3vTs2ZN//OMfl3srhagTDMPg+PHj7Ny5k71791JQUACYvXA7d+5Mz5496dixo11N4/WBW9nnCOVRSv0VeBnYD5wELjpIaz26RqKrJqVUe+Dw2rVrCQ8Pd3Y4QghRpQsXLpCQkMCOHTs4c+ZMSXnr1q3p2bMnUVFRFX7YrMuSk5MZOXIkQAet9ZGy2+2tOf0JuF9r/Z4DYxNCiAbJMAyOHDnCjh072LdvHxaLBYDGjRvTq1cvevXqVeWwkPrO3uQUhDmmSQghxGXKzs4uqSVlZGSUlHfs2JE+ffrQuXPnBtNsVxV7k9NiYASXTtYqhBCiEoZhkJyczLZt29i7dy9WqzlKJiAggN69e9O7d2+Cg2tusH5dZW9y2gz8QykVhTnXXUHpjVrr+Y4OTAgh6rLCwkJ2797Ntm3bSElJAcDNzQ2lFH369KFjx47SC7US9ian4sG1D5azzQAkOQkhBHD27Fm2b9/Ozp07S6bd8vPzo0+fPvTr14+goCAnR1g32JWctNaS3oUQogKGYXD48GG2bduG1rqkvFWrVgwYMIDIyMiLZnYRVZO7JYQQl8lisfDbb7+xefNmUlNTAXNcUmRkJAMGDJB5Ia9AdQfh/g1ziiGA3cBLWuv4GohLCCFcVm5uLj///DPbtm0jOzsbAH9/f/r370+fPn3w9/d3coR1n13JSSl1IzAPWAL801Y8HFijlLpJa/1VzYQnhBCuIzMzky1btrBz586SpSmaN2/O4MGDiYqKkqY7B7L3Tj4NPK21fqVU2Wyl1FPAM4AkJyFEvZWcnMymTZvYv39/yez8V111FYMHDyYiIqJez3HnLPYmp47A/8op/x/wrOPCEcVKrwxbWulVZIun/2jdujUrV64sWUCwuLyiaZyKtzdq1Ag3Nzc8PDxo1aoVQ4cOZfr06ReNTFdK4ePjc8nAwPXr1xMQEMDx48d5/fXX+eWXX7hw4QKBgYFERUXx1ltvXbKg4fXXX89vv/3G2rVradWqlaNulRA1oriTw08//VSyQoC7uzs9evRg0KBBtGjRwrkB1nP2Jqc0oAeQVKa8p22bcKILFy4wd+5c7rnnnmod9+233xIeHo7FYmHfvn28++67TJo0ia+++uqitZPmzJnDwIEDyz3H3XffzeDBg1mxYgUBAQGcPn36onWgiu3du5eEhISSyWoffvjh6v2SQtQSwzA4cOAAP/30EydOnADAx8eHfv36MXDgQAICApwcYcNgb3KaB3yolGoG/GQri8FcHXdOTQRWWw69NK3CbU3HzyCwzxgAzu34njMrPqxw36v+trDkdfInj1GQcqjC7Y72wAMP8OabbzJt2jSaNGlS7eM9PDyIiorinXfeYdKkScyePZtZs2ZVeVxmZiaHDx/m7bffLpkpvUWLFuXOXv6f//yHHj16MHLkSObNm1fpelJCOIPVamXPnj1s2LChpOedn58fAwcOZMCAAfj6+lZxBuFI9o5fehpzHabZwG+YPfXeAv6NNOs53bBhw+jVqxezZ8++ovN4e3szZswYNm/ebNf+ISEhdOrUiWeeeYZvvvmGxMTES1bLBXM+sW+//Zbrr7+euLg4MjMzWbNmzRXFKoSjFBUVsWPHDt59910WLVpEamoqAQEBjB07lgcffJCYmBhJTE5g7yDcIuAxpdSzmM+fAJK01rmVHFYn2FujCewzpqQWVZXwO+1dGNhxnnjiCeLi4rj55ptLlky/HC1atCArK+uisnvvvfeiZ05t2rThm2++AeDzzz9n7ty5fP755yQmJhIQEMDNN9/MfffdV/KQePHixQBcc801NG7cmJiYGBYsWMD48eMvO04hrpTFYmHnzp389NNPnDt3DjA/cA0dOpQePXpIzzsnq9bdtyWj32ooFlGKp6fnRavDFissLCz3j6Zz585MmzaNV199leefv/wFhVNSUi6ZhPKDDz6o8JlTaGgojzzyCI888gi5ubmsWLGCZ555hrCwMK677joAFixYwIQJE2jcuDFgdoy49957OXz4MB06dLjsWIW4HBaLhYSEBNavX1/yQaxZs2ZER0cTGRkp8925iAqTk1LqI+ARrXW27XWFtNbVexIvqhQeHl7SQ6iY1WolOTmZtm3blnvMgw8+yOjRo1m3bt1lXbOg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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rlQDxjSNpVWP" + }, + "source": [ + "# Solution goes here" + ], + "execution_count": 31, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fg6MiOijpVWP" + }, + "source": [ + "**Related viewing:** You might be interested in this [video by Hans Rosling about the demographic changes we expect in this century](https://www.youtube.com/watch?v=ezVk1ahRF78)." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4cX1kY7-pVWQ" + }, + "source": [ + "" + ], + "execution_count": 31, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap09.ipynb b/colab/chap09.ipynb index 9e3b0cd5a..4a83b9f61 100644 --- a/colab/chap09.ipynb +++ b/colab/chap09.ipynb @@ -1,657 +1,1401 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 9" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following displays SymPy expressions and provides the option of showing results in LaTeX format." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy.printing import latex\n", - "\n", - "def show(expr, show_latex=False):\n", - " \"\"\"Display a SymPy expression.\n", - " \n", - " expr: SymPy expression\n", - " show_latex: boolean\n", - " \"\"\"\n", - " if show_latex:\n", - " print(latex(expr))\n", - " return expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis with SymPy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a symbol for time." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import sympy as sp\n", - "\n", - "t = sp.symbols('t')\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you combine symbols and numbers, you get symbolic expressions." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "expr = t + 1\n", - "expr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `Add` object, which just represents the sum without trying to compute it." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "type(expr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "expr.subs(t, 2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`f` is a special class of symbol that represents a function." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "f = sp.Function('f')\n", - "f" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The type of `f` is `UndefinedFunction`" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "type(f)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "f(t)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`diff` returns a `Derivative` object that represents the time derivative of `f`" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "dfdt = sp.diff(f(t), t)\n", - "dfdt" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "type(dfdt)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a symbol for `alpha`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "alpha = sp.symbols('alpha')\n", - "alpha" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation for proportional growth." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "eq1 = sp.Eq(dfdt, alpha*f(t))\n", - "eq1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And use `dsolve` to solve it. The result is the general solution." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = sp.dsolve(eq1)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", - "\n", - "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "C1, p_0 = sp.symbols('C1 p_0')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "particular = solution_eq.subs(C1, p_0)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the next example, we have to work a little harder to find the particular solution." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the quadratic growth equation \n", - "\n", - "We'll use the (r, K) parameterization, so we'll need two more symbols:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "r, K = sp.symbols('r K')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can write the differential equation." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "eq2 = sp.Eq(sp.diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", - "eq2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And solve it." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "solution_eq = sp.dsolve(eq2)\n", - "solution_eq" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "general = solution_eq.rhs\n", - "general" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can evaluate the right-hand side at $t=0$" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "at_0 = general.subs(t, 0)\n", - "at_0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", - "\n", - "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", - "\n", - "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "solutions = sp.solve(sp.Eq(at_0, p_0), C1)\n", - "type(solutions), len(solutions)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "value_of_C1 = solutions[0]\n", - "value_of_C1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "particular = general.subs(C1, value_of_C1)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is complicated, but SymPy provides a method that tries to simplify it." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "particular = sp.simplify(particular)\n", - "particular" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", - "\n", - "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "particular.subs(t, 0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", - "\n", - "In some places you'll see it written in a different form:\n", - "\n", - "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", - "\n", - "where $A = (K - p_0) / p_0$.\n", - "\n", - "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "A = (K - p_0) / p_0\n", - "A" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "logistic = K / (1 + A * sp.exp(-r*t))\n", - "logistic" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "sp.simplify(particular - logistic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", - "\n", - "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", - "\n", - "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", - "\n", - " df(t) / dt = alpha f(t) + beta f(t)^2\n", - "\n", - "or\n", - "\n", - " df(t) / dt = r f(t) (1 - f(t)/K)\n", - "\n", - "Find the general solution and also the particular solution where `f(0) = p_0`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap09.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XoJ2wRI-38lA" + }, + "source": [ + "# Chapter 9" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "gQVncPwG38lF" + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "TNkYDWaC38lK" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QoTU9r0w38lM" + }, + "source": [ + "The following displays SymPy expressions and provides the option of showing results in LaTeX format." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rVRLzBpJ38lM" + }, + "source": [ + "from sympy.printing import latex\n", + "\n", + "def show(expr, show_latex=False):\n", + " \"\"\"Display a SymPy expression.\n", + " \n", + " expr: SymPy expression\n", + " show_latex: boolean\n", + " \"\"\"\n", + " if show_latex:\n", + " print(latex(expr))\n", + " return expr" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IsyzXZTr38lM" + }, + "source": [ + "### Analysis with SymPy" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HQZkV8PD38lN" + }, + "source": [ + "Create a symbol for time." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "-0M8erZM38lO", + "outputId": "4d8012a2-84f0-4e8b-f08f-35ebd27df7eb" + }, + "source": [ + "import sympy as sp\n", + "\n", + "t = sp.symbols('t')\n", + "t" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle t$", + "text/plain": [ + "t" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qrsuXKWB38lP" + }, + "source": [ + "If you combine symbols and numbers, you get symbolic expressions." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "yqQYci4C38lQ", + "outputId": "fb01549b-d3d2-4dea-8135-e38907f7b25d" + }, + "source": [ + "expr = t + 1\n", + "expr" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle t + 1$", + "text/plain": [ + "t + 1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "00HH4F5H38lS" + }, + "source": [ + "The result is an `Add` object, which just represents the sum without trying to compute it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cY3eHD4K38lT", + "outputId": "ac43de3a-d941-4b19-9009-bf4c7e13efa4" + }, + "source": [ + "type(expr)" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "sympy.core.add.Add" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "zNOAe0d-38lU" + }, + "source": [ + "`subs` can be used to replace a symbol with a number, which allows the addition to proceed." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 37 + }, + "id": "TNOki06f38lU", + "outputId": "8b6727eb-d78c-4b46-b402-6624dee11a87" + }, + "source": [ + "expr.subs(t, 2)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle 3$", + "text/plain": [ + "3" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VeHEhQT238lU" + }, + "source": [ + "`f` is a special class of symbol that represents a function." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "19XULknN38lW", + "outputId": "9b11b4a8-0c47-4554-cdf9-c66a4856df9d" + }, + "source": [ + "f = sp.Function('f')\n", + "f" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "f" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q47dvtr-38lW" + }, + "source": [ + "The type of `f` is `UndefinedFunction`" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CxNELR7Y38lW", + "outputId": "9916b57b-24ac-43ad-841a-903b3cbc2931" + }, + "source": [ + "type(f)" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "sympy.core.function.UndefinedFunction" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cFT29OG_38lW" + }, + "source": [ + "SymPy understands that `f(t)` means `f` evaluated at `t`, but it doesn't try to evaluate it yet." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "Kzyh735-38lX", + "outputId": "d249dfa3-e028-4067-d681-a5579e6990f2" + }, + "source": [ + "f(t)" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle f{\\left(t \\right)}$", + "text/plain": [ + "f(t)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p8snjBje38lY" + }, + "source": [ + "`diff` returns a `Derivative` object that represents the time derivative of `f`" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "id": "DVjrAL1l38la", + "outputId": "53c60402-904e-4e5a-97f8-cca11e3afc29" + }, + "source": [ + "dfdt = sp.diff(f(t), t)\n", + "dfdt" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)}$", + "text/plain": [ + "Derivative(f(t), t)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BbBvvTZ-38la", + "outputId": "9f633bcd-7207-4b76-a44b-8e443973acc2" + }, + "source": [ + "type(dfdt)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "sympy.core.function.Derivative" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ghzRo7Dm38lb" + }, + "source": [ + "We need a symbol for `alpha`" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "HGXl8mDG38lb", + "outputId": "defae250-fb3c-470b-a256-3b8712c24f90" + }, + "source": [ + "alpha = sp.symbols('alpha')\n", + "alpha" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\alpha$", + "text/plain": [ + "alpha" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "epcDqt8N38lc" + }, + "source": [ + "Now we can write the differential equation for proportional growth." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "id": "Yf_wxWGH38lc", + "outputId": "d834cfeb-3667-4d9c-b2cd-e84c608c77a9" + }, + "source": [ + "eq1 = sp.Eq(dfdt, alpha*f(t))\n", + "eq1" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)}$", + "text/plain": [ + "Eq(Derivative(f(t), t), alpha*f(t))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QHl1KzcL38lc" + }, + "source": [ + "And use `dsolve` to solve it. The result is the general solution." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "eFDW0tkX38ld", + "outputId": "efa36459-73d7-47de-9009-1e03167a136c" + }, + "source": [ + "solution_eq = sp.dsolve(eq1)\n", + "solution_eq" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle f{\\left(t \\right)} = C_{1} e^{\\alpha t}$", + "text/plain": [ + "Eq(f(t), C1*exp(alpha*t))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6XZ0dyxp38ld" + }, + "source": [ + "We can tell it's a general solution because it contains an unspecified constant, `C1`.\n", + "\n", + "In this example, finding the particular solution is easy: we just replace `C1` with `p_0`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "coZiUDgM38ld" + }, + "source": [ + "C1, p_0 = sp.symbols('C1 p_0')" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "dUTBdrUl38le", + "outputId": "e2814ea7-d3d7-43b7-ca29-f729789dba99" + }, + "source": [ + "particular = solution_eq.subs(C1, p_0)\n", + "particular" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle f{\\left(t \\right)} = p_{0} e^{\\alpha t}$", + "text/plain": [ + "Eq(f(t), p_0*exp(alpha*t))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kzH6AX4K38le" + }, + "source": [ + "In the next example, we have to work a little harder to find the particular solution." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HiKfAr5J38lf" + }, + "source": [ + "### Solving the quadratic growth equation \n", + "\n", + "We'll use the (r, K) parameterization, so we'll need two more symbols:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4-3ffL4D38lg" + }, + "source": [ + "r, K = sp.symbols('r K')" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NuoQL1_h38lg" + }, + "source": [ + "Now we can write the differential equation." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 58 + }, + "id": "MwnXVOoa38lh", + "outputId": "8afded3d-4293-40c9-e270-149ca1a7b084" + }, + "source": [ + "eq2 = sp.Eq(sp.diff(f(t), t), r * f(t) * (1 - f(t)/K))\n", + "eq2" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = r \\left(1 - \\frac{f{\\left(t \\right)}}{K}\\right) f{\\left(t \\right)}$", + "text/plain": [ + "Eq(Derivative(f(t), t), r*(1 - f(t)/K)*f(t))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IEWlt41n38lh" + }, + "source": [ + "And solve it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 56 + }, + "id": "2Tw-9bmL38lh", + "outputId": "dd687968-a834-4b06-c3d8-86eded35bf38" + }, + "source": [ + "solution_eq = sp.dsolve(eq2)\n", + "solution_eq" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle f{\\left(t \\right)} = \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$", + "text/plain": [ + "Eq(f(t), K*exp(C1*K + r*t)/(exp(C1*K + r*t) - 1))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xF9p6WJC38li" + }, + "source": [ + "The result, `solution_eq`, contains `rhs`, which is the right-hand side of the solution." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 56 + }, + "id": "4P7xjTQW38li", + "outputId": "d0e210d0-489f-4457-cd2f-584b4bbc6fdb" + }, + "source": [ + "general = solution_eq.rhs\n", + "general" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{K e^{C_{1} K + r t}}{e^{C_{1} K + r t} - 1}$", + "text/plain": [ + "K*exp(C1*K + r*t)/(exp(C1*K + r*t) - 1)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0beKsoD-38li" + }, + "source": [ + "We can evaluate the right-hand side at $t=0$" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 56 + }, + "id": "re_a3v2e38lj", + "outputId": "b418a950-fd3c-4e4c-a533-4f7ec2d85330" + }, + "source": [ + "at_0 = general.subs(t, 0)\n", + "at_0" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{K e^{C_{1} K}}{e^{C_{1} K} - 1}$", + "text/plain": [ + "K*exp(C1*K)/(exp(C1*K) - 1)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UiH8s9Cl38lj" + }, + "source": [ + "Now we want to find the value of `C1` that makes `f(0) = p_0`.\n", + "\n", + "So we'll create the equation `at_0 = p_0` and solve for `C1`. Because this is just an algebraic identity, not a differential equation, we use `solve`, not `dsolve`.\n", + "\n", + "The result from `solve` is a list of solutions. In this case, [we have reason to expect only one solution](https://en.wikipedia.org/wiki/Picard%E2%80%93Lindel%C3%B6f_theorem), but we still get a list, so we have to use the bracket operator, `[0]`, to select the first one." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "1SuRnoM138lj", + "outputId": "19107371-f426-4d8e-c8df-aef3df49cef1" + }, + "source": [ + "solutions = sp.solve(sp.Eq(at_0, p_0), C1)\n", + "type(solutions), len(solutions)" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(list, 1)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 66 + }, + "id": "s_eBQA2z38lk", + "outputId": "4721c422-c3ce-4f1e-c75c-fdd03ec39c0c" + }, + "source": [ + "value_of_C1 = solutions[0]\n", + "value_of_C1" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{\\log{\\left(- \\frac{p_{0}}{K - p_{0}} \\right)}}{K}$", + "text/plain": [ + "log(-p_0/(K - p_0))/K" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 23 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Cd64BXqT38ll" + }, + "source": [ + "Now in the general solution, we want to replace `C1` with the value of `C1` we just figured out." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 71 + }, + "id": "cjr3ajl938ll", + "outputId": "8b617b89-cc18-4066-f122-3a3c5af587ce" + }, + "source": [ + "particular = general.subs(C1, value_of_C1)\n", + "particular" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle - \\frac{K p_{0} e^{r t}}{\\left(K - p_{0}\\right) \\left(- \\frac{p_{0} e^{r t}}{K - p_{0}} - 1\\right)}$", + "text/plain": [ + "-K*p_0*exp(r*t)/((K - p_0)*(-p_0*exp(r*t)/(K - p_0) - 1))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "15zg5ZW038ll" + }, + "source": [ + "The result is complicated, but SymPy provides a method that tries to simplify it." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 57 + }, + "id": "lwV-slKl38ll", + "outputId": "9f97b57f-02d6-491a-92c2-3bbdeab97d7d" + }, + "source": [ + "particular = sp.simplify(particular)\n", + "particular" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{K p_{0} e^{r t}}{K + p_{0} e^{r t} - p_{0}}$", + "text/plain": [ + "K*p_0*exp(r*t)/(K + p_0*exp(r*t) - p_0)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 25 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nsDdOxrZ38lm" + }, + "source": [ + "Often simplicity is in the eye of the beholder, but that's about as simple as this expression gets.\n", + "\n", + "Just to double-check, we can evaluate it at `t=0` and confirm that we get `p_0`" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "X4nbb_CE38ln", + "outputId": "84a516fb-f539-4225-9c60-a7e9a91c05cf" + }, + "source": [ + "particular.subs(t, 0)" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle p_{0}$", + "text/plain": [ + "p_0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 26 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WVBlZI0r38ln" + }, + "source": [ + "This solution is called the [logistic function](https://en.wikipedia.org/wiki/Population_growth#Logistic_equation).\n", + "\n", + "In some places you'll see it written in a different form:\n", + "\n", + "$f(t) = \\frac{K}{1 + A e^{-rt}}$\n", + "\n", + "where $A = (K - p_0) / p_0$.\n", + "\n", + "We can use SymPy to confirm that these two forms are equivalent. First we represent the alternative version of the logistic function:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 55 + }, + "id": "qhUr0zbl38lo", + "outputId": "ca5f1fc3-51a5-4840-aca5-3cc198a8cc34" + }, + "source": [ + "A = (K - p_0) / p_0\n", + "A" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{K - p_{0}}{p_{0}}$", + "text/plain": [ + "(K - p_0)/p_0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 63 + }, + "id": "hYtsYPar38lp", + "outputId": "631f4665-3584-49bc-9519-90a455851c61" + }, + "source": [ + "logistic = K / (1 + A * sp.exp(-r*t))\n", + "logistic" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{K}{1 + \\frac{\\left(K - p_{0}\\right) e^{- r t}}{p_{0}}}$", + "text/plain": [ + "K/(1 + (K - p_0)*exp(-r*t)/p_0)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "X8bHhb9i38lq" + }, + "source": [ + "To see whether two expressions are equivalent, we can check whether their difference simplifies to 0." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 37 + }, + "id": "-K8w6vE238lq", + "outputId": "e2c3ccf8-3c01-433e-995e-a9123d187c70" + }, + "source": [ + "sp.simplify(particular - logistic)" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle 0$", + "text/plain": [ + "0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vjIdMs7o38lr" + }, + "source": [ + "This test only works one way: if SymPy says the difference reduces to 0, the expressions are definitely equivalent (and not just numerically close).\n", + "\n", + "But if SymPy can't find a way to simplify the result to 0, that doesn't necessarily mean there isn't one. Testing whether two expressions are equivalent is a surprisingly hard problem; in fact, there is no algorithm that can solve it in general." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "raEMeCUw38lr" + }, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Solve the quadratic growth equation using the alternative parameterization\n", + "\n", + "$\\frac{df(t)}{dt} = \\alpha f(t) + \\beta f^2(t) $" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 39 + }, + "id": "cjBcVlfS38lr", + "outputId": "c0522080-0cd1-4ce7-94bf-d3b54adffe9d" + }, + "source": [ + "beta = sp.symbols('beta')\n", + "beta" + ], + "execution_count": 30, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\beta$", + "text/plain": [ + "beta" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 30 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 52 + }, + "id": "FbEj7WZD38ls", + "outputId": "ceb8bcfe-28f2-40a7-a4da-d8f046cd9b30" + }, + "source": [ + "eq3 = sp.Eq(sp.diff(f(t), t), alpha * f(t) + beta * f(t)**2)\n", + "eq3" + ], + "execution_count": 31, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{d}{d t} f{\\left(t \\right)} = \\alpha f{\\left(t \\right)} + \\beta f^{2}{\\left(t \\right)}$", + "text/plain": [ + "Eq(Derivative(f(t), t), alpha*f(t) + beta*f(t)**2)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 31 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 62 + }, + "id": "jtcHfE8I38lt", + "outputId": "969d93a8-fe96-47c6-bae0-cff4a9e8b8e0" + }, + "source": [ + "solution_eq3 = sp.dsolve(eq3)\n", + "solution_eq3" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle f{\\left(t \\right)} = \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$", + "text/plain": [ + "Eq(f(t), alpha*exp(alpha*(C1 + t))/(beta*(1 - exp(alpha*(C1 + t)))))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 32 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 62 + }, + "id": "LBFnUrTO38lt", + "outputId": "3f224941-37a3-4c03-9f3c-e684752325fd" + }, + "source": [ + "general3 = solution_eq3.rhs\n", + "general3" + ], + "execution_count": 33, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{\\alpha e^{\\alpha \\left(C_{1} + t\\right)}}{\\beta \\left(1 - e^{\\alpha \\left(C_{1} + t\\right)}\\right)}$", + "text/plain": [ + "alpha*exp(alpha*(C1 + t))/(beta*(1 - exp(alpha*(C1 + t))))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 59 + }, + "id": "heULtzuG38lt", + "outputId": "ad1c34b7-af37-4815-a84c-280733b24e1f" + }, + "source": [ + "at_03 = general3.subs(t, 0)\n", + "at_03" + ], + "execution_count": 34, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{\\alpha e^{C_{1} \\alpha}}{\\beta \\left(1 - e^{C_{1} \\alpha}\\right)}$", + "text/plain": [ + "alpha*exp(C1*alpha)/(beta*(1 - exp(C1*alpha)))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 34 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "i2jYywfX38lt", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 66 + }, + "outputId": "8768cf6e-c355-4fcc-9545-5568e3f06be2" + }, + "source": [ + "solutions3 = sp.solve(sp.Eq(at_03, p_0), C1)\n", + "solutions3[0]" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{\\log{\\left(\\frac{\\beta p_{0}}{\\alpha + \\beta p_{0}} \\right)}}{\\alpha}$", + "text/plain": [ + "log(beta*p_0/(alpha + beta*p_0))/alpha" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 35 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "nQkf0PrS38lt", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 57 + }, + "outputId": "5a9ad9fe-bbc4-4e1a-8bd6-e5e14d352211" + }, + "source": [ + "particular3 = sp.simplify(general3.subs(C1, solutions3[0]))\n", + "particular3" + ], + "execution_count": 37, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/latex": "$\\displaystyle \\frac{\\alpha p_{0} e^{\\alpha t}}{\\alpha - \\beta p_{0} e^{\\alpha t} + \\beta p_{0}}$", + "text/plain": [ + "alpha*p_0*exp(alpha*t)/(alpha - beta*p_0*exp(alpha*t) + beta*p_0)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 37 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "k8eaB43Z38lt" + }, + "source": [ + "**Exercise:** Use [WolframAlpha](https://www.wolframalpha.com/) to solve the quadratic growth model, using either or both forms of parameterization:\n", + "\n", + " df(t) / dt = alpha f(t) + beta f(t)^2\n", + "\n", + "or\n", + "\n", + " df(t) / dt = r f(t) (1 - f(t)/K)\n", + "\n", + "Find the general solution and also the particular solution where `f(0) = p_0`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9k93qHw938lt" + }, + "source": [ + "Please see the solution above" + ], + "execution_count": 36, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap10.ipynb b/colab/chap10.ipynb index f2e903ab1..e639ec086 100644 --- a/colab/chap10.ipynb +++ b/colab/chap10.ipynb @@ -1,474 +1,1564 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 10" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap10.ipynb", + "provenance": [] + } }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Under the hood\n", - "\n", - "To get a `DataFrame` and a `Series`, I'll read the world population data and select a column.\n", - "\n", - "`DataFrame` and `Series` contain a variable called `shape` that indicates the number of rows and columns." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "filename = 'World_population_estimates.html'\n", - "\n", - "if not os.path.exists(filename):\n", - " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "from pandas import read_html\n", - "\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "table2 = tables[2]\n", - "table2.columns = ['census', 'prb', 'un', 'maddison', \n", - " 'hyde', 'tanton', 'biraben', 'mj', \n", - " 'thomlinson', 'durand', 'clark']\n", - "table2.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "census = table2.census / 1e9\n", - "census.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "un = table2.un / 1e9\n", - "un.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `DataFrame` contains `index`, which labels the rows. It is an `Int64Index`, which is similar to a NumPy array." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `columns`, which labels the columns." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "table2.columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And `values`, which is an array of values." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "table2.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `Series` does not have `columns`, but it does have `name`." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "census.name" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It contains `values`, which is an array." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "census.values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And it contains `index`:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "census.index" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you ever wonder what kind of object a variable refers to, you can use the `type` function. The result indicates what type the object is, and the module where that type is defined.\n", - "\n", - "`DataFrame`, `Int64Index`, `Index`, and `Series` are defined by Pandas.\n", - "\n", - "`ndarray` is defined by NumPy." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "type(table2.values)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "type(census)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "type(census.index)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "type(census.values)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Optional exercise\n", - "\n", - "The following exercise provides a chance to practice what you have learned so far, and maybe develop a different growth model. If you feel comfortable with what we have done so far, you might want to give it a try.\n", - "\n", - "**Optional Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'World_population_estimates.html'\n", - "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Select `tables[1]`, which is the second table on the page." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "table1 = tables[1]\n", - "table1.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "table1.tail()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Again, we'll replace the long column names with more convenient abbreviations." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", - " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "for col in table1.columns:\n", - " table1[col] = pd.to_numeric(table1[col], errors='coerce')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results. Notice that we are working in millions now, not billions." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": false - }, - "outputs": [], - "source": [ - "table1.plot()\n", - "decorate(xlim=[-10000, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='Prehistoric population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use `xlim` to zoom in on everything after Year 0." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "table1.plot()\n", - "decorate(xlim=[0, 2000], xlabel='Year', \n", - " ylabel='World population (millions)',\n", - " title='CE population estimates')\n", - "plt.legend(fontsize='small');" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "See if you can find a model that fits these data well from Year 0 to 1950.\n", - "\n", - "How well does your best model predict actual population growth from 1950 to the present?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "M-MA_DjqAxMO" + }, + "source": [ + "# Chapter 10" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "SuBpqjzAAxMm" + }, + "source": [ + "*Modeling and Simulation in Python* Chun San Yip Summer 2021\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "aIxFbqjKAxMr" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LabxIL2fAxMw" + }, + "source": [ + "### Under the hood\n", + "\n", + "To get a `DataFrame` and a `Series`, I'll read the world population data and select a column.\n", + "\n", + "`DataFrame` and `Series` contain a variable called `shape` that indicates the number of rows and columns." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uzrJil2zAxM0", + "outputId": "760b09bf-ba8d-4e1d-ef5b-77c209888719" + }, + "source": [ + "import os\n", + "\n", + "filename = 'World_population_estimates.html'\n", + "\n", + "if not os.path.exists(filename):\n", + " !wget https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "--2021-07-01 04:25:19-- https://raw.githubusercontent.com/AllenDowney/ModSimPy/master/data/World_population_estimates.html\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.111.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 141997 (139K) [text/plain]\n", + "Saving to: ‘World_population_estimates.html’\n", + "\n", + "World_population_es 100%[===================>] 138.67K --.-KB/s in 0.009s \n", + "\n", + "2021-07-01 04:25:20 (15.4 MB/s) - ‘World_population_estimates.html’ saved [141997/141997]\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QBURE3suAxM1", + "outputId": "886fff58-d2e9-47ca-f885-5ef4ad2e1f7e" + }, + "source": [ + "from pandas import read_html\n", + "\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "table2 = tables[2]\n", + "table2.columns = ['census', 'prb', 'un', 'maddison', \n", + " 'hyde', 'tanton', 'biraben', 'mj', \n", + " 'thomlinson', 'durand', 'clark']\n", + "table2.shape" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(67, 11)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3ZwhpY4nAxM3", + "outputId": "eb093d71-ccf1-4aeb-a922-66ae5e48bda3" + }, + "source": [ + "census = table2.census / 1e9\n", + "census.shape" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(67,)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "l0jsqgG_AxM5", + "outputId": "4ab6be0e-3362-4e04-f8ba-09f943e6c756" + }, + "source": [ + "un = table2.un / 1e9\n", + "un.shape" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(67,)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AaoCtx_8AxM6" + }, + "source": [ + "A `DataFrame` contains `index`, which labels the rows. It is an `Int64Index`, which is similar to a NumPy array." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "diHtQUyBAxM8", + "outputId": "f0eb7705-ade0-413e-f93f-c437c176f22b" + }, + "source": [ + "table2.index" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Int64Index([1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960,\n", + " 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,\n", + " 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,\n", + " 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,\n", + " 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n", + " 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,\n", + " 2016],\n", + " dtype='int64', name='Year')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wa3EHtv_AxM9" + }, + "source": [ + "And `columns`, which labels the columns." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "EYRWTW1PAxM_", + "outputId": "2d95fe3f-460d-428b-ff9f-7d3bdbcef405" + }, + "source": [ + "table2.columns" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Index(['census', 'prb', 'un', 'maddison', 'hyde', 'tanton', 'biraben', 'mj',\n", + " 'thomlinson', 'durand', 'clark'],\n", + " dtype='object')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "003sC8kVAxNA" + }, + "source": [ + "And `values`, which is an array of values." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "v_wERQ9NAxND", + "outputId": "c82464a2-44f3-47d4-98f3-6e4aa8ceec89" + }, + "source": [ + "table2.values" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[2557628654, 2516000000.0, 2525149000.0, 2544000000.0,\n", + " 2527960000.0, 2400000000.0, 2527000000.0, 2500000000.0,\n", + " 2400000000.0, nan, 2486000000.0],\n", + " [2594939877, nan, 2572850917.0, 2571663000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2636772306, nan, 2619292068.0, 2617949000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2682053389, nan, 2665865392.0, 2665959000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2730228104, nan, 2713172027.0, 2716927000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2782098943, nan, 2761650981.0, 2769074000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2835299673, nan, 2811572031.0, 2822502000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2891349717, nan, 2863042795.0, 2879934000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [2948137248, nan, 2916030167.0, 2939254000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3000716593, nan, 2970395814.0, 2995909000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3043001508, nan, 3026002942.0, 3041507000.0, 3042000000.0, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [3083966929, nan, 3082830266.0, 3082161000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3140093217, nan, 3141071531.0, 3135787000.0, nan, nan, nan, nan,\n", + " nan, nan, 3036000000.0],\n", + " [3209827882, nan, 3201178277.0, 3201354000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3281201306, nan, 3263738832.0, 3266477000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3350425793, nan, 3329122479.0, 3333138000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3420677923, nan, 3397475247.0, 3402224000.0, nan, nan, nan, nan,\n", + " nan, nan, 3288000000.0],\n", + " [3490333715, nan, 3468521724.0, 3471464000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3562313822, nan, 3541674891.0, 3543086000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3637159050, nan, 3616108749.0, 3615743000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3712697742, nan, 3691172616.0, 3691157000.0, 3710000000.0, nan,\n", + " 3637000000.0, nan, 3600000000.0, '3,600,000,000– 3,700,000,000',\n", + " 3632000000.0],\n", + " [3790326948, nan, 3766754345.0, 3769818000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3866568653, nan, 3842873611.0, 3846499000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [3942096442, nan, 3919182332.0, 3922793000.0, 3923000000.0, nan,\n", + " nan, nan, nan, nan, 3860000000.0],\n", + " [4016608813, nan, 3995304922.0, 3997677000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4089083233, nan, 4071020434.0, 4070671000.0, nan, nan, nan,\n", + " 3900000000.0, 4000000000.0, nan, nan],\n", + " [4160185010, nan, 4146135850.0, 4141445000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4232084578, nan, 4220816737.0, 4213539000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4304105753, nan, 4295664825.0, 4286317000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4379013942, nan, 4371527871.0, 4363144000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4451362735, nan, 4449048798.0, 4439529000.0, 4461000000.0, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [4534410125, nan, 4528234634.0, 4514838000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4614566561, nan, 4608962418.0, 4587307000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4695736743, nan, 4691559840.0, 4676388000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4774569391, nan, 4776392828.0, 4756521000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [4856462699, nan, 4863601517.0, 4837719000.0, nan, 5000000000.0,\n", + " nan, nan, nan, nan, nan],\n", + " [4940571232, nan, 4953376710.0, 4920968000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5027200492, nan, 5045315871.0, 5006672000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5114557167, nan, 5138214688.0, 5093306000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5201440110, nan, 5230000000.0, 5180540000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5288955934, nan, 5320816667.0, 5269029000.0, 5308000000.0, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [5371585922, nan, 5408908724.0, 5351922000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5456136278, nan, 5494899570.0, 5435722000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5538268316, nan, 5578865109.0, 5518127000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5618682132, nan, 5661086346.0, 5599396000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5699202985, 5760000000.0, 5741822412.0, 5681575000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [5779440593, nan, 5821016750.0, 5762212000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [5857972543, 5840000000.0, 5898688337.0, 5842122000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [5935213248, nan, 5975303657.0, 5921366000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [6012074922, nan, 6051478010.0, 5999622000.0, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [6088571383, 6067000000.0, 6127700428.0, 6076558000.0,\n", + " 6145000000.0, nan, nan, 5750000000.0, nan, nan, nan],\n", + " [6165219247, 6137000000.0, 6204147026.0, 6154791000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6242016348, 6215000000.0, 6280853817.0, 6231704000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6318590956, 6314000000.0, 6357991749.0, 6308364000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6395699509, 6396000000.0, 6435705595.0, 6374056000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6473044732, 6477000000.0, 6514094605.0, 6462987000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6551263534, 6555000000.0, 6593227977.0, 6540214000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6629913759, 6625000000.0, 6673105937.0, 6616689000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6709049780, 6705000000.0, 6753649228.0, 6694832000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6788214394, 6809972000.0, 6834721933.0, 6764086000.0, nan, nan,\n", + " nan, nan, nan, nan, nan],\n", + " [6858584755, 6892319000.0, 6916183482.0, nan, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [6935999491, 6986951000.0, 6997998760.0, nan, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [7013871313, 7057075000.0, 7080072417.0, nan, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [7092128094, 7136796000.0, 7162119434.0, nan, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [7169968185, 7238184000.0, 7243784000.0, nan, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [7247892788, 7336435000.0, 7349472000.0, nan, nan, nan, nan, nan,\n", + " nan, nan, nan],\n", + " [7325996709, 7418151841.0, nan, nan, nan, nan, nan, nan, nan, nan,\n", + " nan]], dtype=object)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "AvJIeaqeAxND" + }, + "source": [ + "A `Series` does not have `columns`, but it does have `name`." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "id": "LE-__w0AAxNE", + "outputId": "60f37c8d-bd7d-4bb0-8ec2-ec28b5db117f" + }, + "source": [ + "census.name" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'census'" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9rqmDgeFAxNF" + }, + "source": [ + "It contains `values`, which is an array." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WXxpv3FNAxNF", + "outputId": "9268120c-8c2d-447d-a0d4-d41dac88854c" + }, + "source": [ + "census.values" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([2.55762865, 2.59493988, 2.63677231, 2.68205339, 2.7302281 ,\n", + " 2.78209894, 2.83529967, 2.89134972, 2.94813725, 3.00071659,\n", + " 3.04300151, 3.08396693, 3.14009322, 3.20982788, 3.28120131,\n", + " 3.35042579, 3.42067792, 3.49033371, 3.56231382, 3.63715905,\n", + " 3.71269774, 3.79032695, 3.86656865, 3.94209644, 4.01660881,\n", + " 4.08908323, 4.16018501, 4.23208458, 4.30410575, 4.37901394,\n", + " 4.45136274, 4.53441012, 4.61456656, 4.69573674, 4.77456939,\n", + " 4.8564627 , 4.94057123, 5.02720049, 5.11455717, 5.20144011,\n", + " 5.28895593, 5.37158592, 5.45613628, 5.53826832, 5.61868213,\n", + " 5.69920299, 5.77944059, 5.85797254, 5.93521325, 6.01207492,\n", + " 6.08857138, 6.16521925, 6.24201635, 6.31859096, 6.39569951,\n", + " 6.47304473, 6.55126353, 6.62991376, 6.70904978, 6.78821439,\n", + " 6.85858475, 6.93599949, 7.01387131, 7.09212809, 7.16996819,\n", + " 7.24789279, 7.32599671])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KefQhVf_AxNG" + }, + "source": [ + "And it contains `index`:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PfeHe89QAxNG", + "outputId": "3e7bcbc7-7c40-42b2-f41c-491b7b2fdcc7" + }, + "source": [ + "census.index" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Int64Index([1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960,\n", + " 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971,\n", + " 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982,\n", + " 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993,\n", + " 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n", + " 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015,\n", + " 2016],\n", + " dtype='int64', name='Year')" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YpTdgmFIAxNH" + }, + "source": [ + "If you ever wonder what kind of object a variable refers to, you can use the `type` function. The result indicates what type the object is, and the module where that type is defined.\n", + "\n", + "`DataFrame`, `Int64Index`, `Index`, and `Series` are defined by Pandas.\n", + "\n", + "`ndarray` is defined by NumPy." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "a4IW2D7QAxNI", + "outputId": "67f3b2a5-7ff1-4536-ee5d-a1c3ba056e5d" + }, + "source": [ + "type(table2)" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "L0cMiUmhAxNI", + "outputId": "233c98fd-e8ed-43d0-fdac-e348c183a78f" + }, + "source": [ + "type(table2.index)" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.indexes.numeric.Int64Index" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DjFqTdohAxNJ", + "outputId": "70540a2a-1b3f-4376-e0c1-d4da53e15ec3" + }, + "source": [ + "type(table2.columns)" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.indexes.base.Index" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BYSxOlSwAxNJ", + "outputId": "c2cd0d3e-5a49-44ab-c3ed-6758fe6d3e13" + }, + "source": [ + "type(table2.values)" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 15 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "F9LKVAYCAxNK", + "outputId": "a728dcb2-4797-437f-abe0-7da6197dc945" + }, + "source": [ + "type(census)" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AIRIFp_xAxNK", + "outputId": "b0212c44-7200-4f27-b6e7-e8bf69f32001" + }, + "source": [ + "type(census.index)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "pandas.core.indexes.numeric.Int64Index" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "y56TDLc0AxNK", + "outputId": "a56e317c-6a8e-4c74-c947-6fceebbe26b6" + }, + "source": [ + "type(census.values)" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vH_tp9CVAxNL" + }, + "source": [ + "## Optional exercise\n", + "\n", + "The following exercise provides a chance to practice what you have learned so far, and maybe develop a different growth model. If you feel comfortable with what we have done so far, you might want to give it a try.\n", + "\n", + "**Optional Exercise:** On the Wikipedia page about world population estimates, the first table contains estimates for prehistoric populations. The following cells process this table and plot some of the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lBIn7euoAxNL", + "outputId": "71ce6e33-dc43-467b-a401-0616f61b224e" + }, + "source": [ + "filename = 'World_population_estimates.html'\n", + "tables = read_html(filename, header=0, index_col=0, decimal='M')\n", + "len(tables)" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "6" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1Y-f6ca7AxNL" + }, + "source": [ + "Select `tables[1]`, which is the second table on the page." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + }, + "id": "NOVFpJXhAxNL", + "outputId": "c7adc2da-6477-4675-ca63-ab8140622619" + }, + "source": [ + "table1 = tables[1]\n", + "table1.head()" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2010)[citation needed]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
Year
-10000NaNNaNNaN2M[24]NaNNaN4.01–10MNaNNaN
-9000NaNNaNNaN4.NaNNaNNaNNaNNaNNaN
-80005.NaNNaN5.NaNNaNNaNNaN5–10MNaN
-7000NaNNaNNaN8.NaNNaNNaNNaNNaNNaN
-6000NaNNaNNaN11.NaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " Population Reference Bureau (1973–2016)[15] ... Clark (1967)[23]\n", + "Year ... \n", + "-10000 NaN ... NaN\n", + "-9000 NaN ... NaN\n", + "-8000 5. ... NaN\n", + "-7000 NaN ... NaN\n", + "-6000 NaN ... NaN\n", + "\n", + "[5 rows x 10 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LqrMxrdeAxNM" + }, + "source": [ + "Not all agencies and researchers provided estimates for the same dates. Again `NaN` is the special value that indicates missing data." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + }, + "id": "EGXdJvWDAxNN", + "outputId": "bf7be506-26a2-4085-8d72-8954ef70e6ad" + }, + "source": [ + "table1.tail()" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Population Reference Bureau (1973–2016)[15]United Nations Department of Economic and Social Affairs (2015)[16]Maddison (2008)[17]HYDE (2010)[citation needed]Tanton (1994)[18]Biraben (1980)[19]McEvedy & Jones (1978)[20]Thomlinson (1975)[21]Durand (1974)[22]Clark (1967)[23]
Year
1913NaNNaN1793.NaNNaNNaNNaNNaNNaNNaN
1920NaN1860.01863.1912.NaNNaNNaNNaNNaN1968.
1925NaNNaNNaNNaNNaNNaN2000.0NaNNaNNaN
1930NaN2070.0NaN2092.NaNNaNNaNNaNNaN2145.
1940NaN2300.02299.2307.NaNNaNNaNNaNNaN2340.
\n", + "
" + ], + "text/plain": [ + " Population Reference Bureau (1973–2016)[15] ... Clark (1967)[23]\n", + "Year ... \n", + "1913 NaN ... NaN\n", + "1920 NaN ... 1968.\n", + "1925 NaN ... NaN\n", + "1930 NaN ... 2145.\n", + "1940 NaN ... 2340.\n", + "\n", + "[5 rows x 10 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 21 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JlE3PrKYAxNN" + }, + "source": [ + "Again, we'll replace the long column names with more convenient abbreviations." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IGCVsA2hAxNO" + }, + "source": [ + "table1.columns = ['PRB', 'UN', 'Maddison', 'HYDE', 'Tanton', \n", + " 'Biraben', 'McEvedy & Jones', 'Thomlinson', 'Durand', 'Clark']" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Qe2YJ8zGAxNO" + }, + "source": [ + "Some of the estimates are in a form Pandas doesn't recognize as numbers, but we can coerce them to be numeric." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Csf9ox_gAxNP" + }, + "source": [ + "for col in table1.columns:\n", + " table1[col] = pd.to_numeric(table1[col], errors='coerce')" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3pnlYRx-AxNP" + }, + "source": [ + "Here are the results. Notice that we are working in millions now, not billions." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": false, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "DgG-2EQgAxNQ", + "outputId": "f9ab9e94-9825-455d-c82c-9a0b89e1e01a" + }, + "source": [ + "table1.plot()\n", + "decorate(xlim=[-10000, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='Prehistoric population estimates')\n", + "plt.legend(fontsize='small');" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TQJ59zkuAxNQ" + }, + "source": [ + "We can use `xlim` to zoom in on everything after Year 0." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "YCEtQ-D1AxNR", + "outputId": "3c8f40ae-2699-4b65-ba9c-a82bf48f036a" + }, + "source": [ + "table1.plot()\n", + "decorate(xlim=[0, 2000], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='CE population estimates')\n", + "plt.legend(fontsize='small');" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3iPtJopUVuL4" + }, + "source": [ + "See if you can find a model that fits these data well from Year 0 to 1950.\n", + "\n", + "How well does your best model predict actual population growth from 1950 to the present?" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f33p0wcLAxNS", + "outputId": "6837730c-1daa-49c6-d551-d377294d1f83" + }, + "source": [ + "\n", + "def update_func_quad(pop, t, system):\n", + " \"\"\"Update population based on a quadratic model.\n", + " \n", + " pop: current population in billions\n", + " t: what year it is\n", + " system: system object with model parameters\n", + " \"\"\"\n", + " #net_growth = system.r * pop*(1-pop/system.K)\n", + " #net_growth = system.alpha * pop + system.beta * pop**2\n", + " net_growth = system.alpha * pop\n", + " return pop + net_growth\n", + "\n", + "\n", + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate the system using any update function.\n", + " \n", + " system: System object\n", + " update_func: function that computes the population next year\n", + " \n", + " returns: TimeSeries\n", + " \"\"\"\n", + " results = TimeSeries()\n", + " results[system.t_0] = system.p_0\n", + " \n", + " for t in linrange(system.t_0, system.t_end):\n", + " results[t+1] = update_func(results[t], t, system)\n", + " \n", + " return results\n", + "\n", + "hyde=table1.HYDE.dropna()\n", + "t_0 = hyde.index[0]\n", + "p_0 = hyde[t_0]\n", + "print(t_0, p_0)\n", + "t_end = hyde.index[-1]\n", + "\n" + ], + "execution_count": 109, + "outputs": [ + { + "output_type": "stream", + "text": [ + "-9000 4.0\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "-vAxK5XSWbu-", + "outputId": "69b395d4-2c0e-4564-e64a-4411abb1f4f1" + }, + "source": [ + "system1 = System(t_0=t_0, \n", + " t_end=t_end,\n", + " p_0=p_0)\n", + "system1.alpha=0.0004\n", + "system1.beta=-0.018\n", + "#system1.r=alpha\n", + "#system1.K=-alpha/beta\n", + "\n", + "results1 = run_simulation(system1, update_func_quad)\n", + "\n", + "table1.plot()\n", + "plot(results1, ':', label='Models')\n", + "\n", + "decorate(xlim=[-9000, 2021], xlabel='Year', \n", + " ylabel='World population (millions)',\n", + " title='CE population estimates')\n", + "plt.legend(fontsize='small');\n" + ], + "execution_count": 147, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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vwlqEHBT4YKDtg9FJBd4E01QFa54MdeYmBgGDRrEkCFDiIiI8N6DWrx4MUlJSQCcc845jBkzhv79+9O7d29efPFFwPrwT0hIYNiwYTgcDs477zxuv/12hg8fzuDBg2nVqhVxcXHea11xxRW8+OKLtG3btkgMtWrV8h4THR2NiPDXX3+xatUqunbt6m3n8XgICgqiT58+LF26lKFDh3rvQWVkZJT4fidOnMiYMWNwu92EhobywgsvMGXKFHbu3EleXh533313hfxclVInzhHkJHCTzP0sFisiOUAnY8zGYtsF+NUYE1HykScXLRZr+fzzz0lOTmbEiBEndPzw4cN59tlniY6OruDIiqppvxelqpvKLhbr72BiEjCqhO232fvUKeKdd97hzTffZNCgQSd0/NixY2ndunWlJyel1KnP3yG+R7CG9M7HWlodrCUzzgauqozAVNW44YYbuOGGG074+JkzZ1ZgNEqpmsyvHpQxZjHWwn8bgUvsr41AF2PMZ5UXnlJKqZrK79p6xpjfgZsqMRallFLKK3AT2pVSSqnjUGoPSkTygKbGmP0ikk8ZixQaY0IrI7iaJicnh5EjRwKQlJREhw4dAIiPj6+QZ4Duv/9+brnlFlwuF2vWrOHGG28s9zmVUqqylDXENxJI83kdwMezaqbw8HBvOaCBAwcyb948fv75Z5YtW1ah1znjjDN0erZSqtorNUEZY970eT0nINFUc+vWrfM+FFseHTp0oH379n6337hxI3feeSc7duxg2rRptGnThk8//ZQ5c+bgcDi46667uOCCC0hMTKRdu3asWbOGCy64gNTUVNasWcNVV13F3//+d+/5CpPefffdxzXXXEPnzp1Zu3Ytffv2ZdSoUSUWaf33v//Nb7/9RkhICI8//jjx8fFcdtlldOrUiT/++IMRI0Zw1VU6oVMpVXH8ugclIn+JSP0StkeLyF8VH5byVVBQwAsvvMDEiRN5//33cblcvPLKK8yfP5/XX3+dZ555xtu2X79+vP3227z33nsMGjSId999l48++qjUc6elpTFixAjefvttb7viRVrXrl3L3r17WbhwIWPHjuWFF14A4MCBAzz88MMsWLDA2/NTSqmK4u8svhZAUAnbw4AaU9W8ffv2x9XzqSiFw3FxcXGkpaWRkpJCkyZNCAsLIywsjJCQEAoKCgAQEZxOJ7GxsbRt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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qfHXxeqJrweP" + }, + "source": [ + "A proportional model is used above and it looks fine for the first 11000 years until somewhere around 1000. The population growth exponentially and the model cannot \"catch up\"." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 423 + }, + "id": "gTBZ1LbYAxNT", + "outputId": "685ea719-58b4-4468-97e1-23337ef1f526" + }, + "source": [ + "results1" + ], + "execution_count": 148, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
-90004.000000
-89994.001600
-89984.003201
-89974.004802
-89964.006404
......
1936317.291121
1937317.418037
1938317.545004
1939317.672022
1940317.799091
\n", + "

10941 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + "-9000 4.000000\n", + "-8999 4.001600\n", + "-8998 4.003201\n", + "-8997 4.004802\n", + "-8996 4.006404\n", + " ... \n", + " 1936 317.291121\n", + " 1937 317.418037\n", + " 1938 317.545004\n", + " 1939 317.672022\n", + " 1940 317.799091\n", + "Length: 10941, dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 148 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QxUS8Vn6AxNX" + }, + "source": [ + "" + ], + "execution_count": 28, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap11.ipynb b/colab/chap11.ipynb index 887d7df7f..2211e63bc 100644 --- a/colab/chap11.ipynb +++ b/colab/chap11.ipynb @@ -1,476 +1,799 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 11" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### SIR implementation\n", - "\n", - "We'll use a `State` object to represent the number (or fraction) of people in each compartment." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "init = State(S=89, I=1, R=0)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To convert from number of people to fractions, we divide through by the total." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "init /= sum(init)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system` creates a `System` object with the given parameters." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example with hypothetical values for `beta` and `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The update function takes the state during the current time step and returns the state during the next time step." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run a single time step, we call it like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "state = update_func(init, 0, system)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run a simulation by calling the update function for each time step." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: State object for final state\n", - " \"\"\"\n", - " state = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " \n", - " return state" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is the state of the system at `t_end`" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", - "\n", - "Hint: what is the change in `S` between the beginning and the end of the simulation?" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using TimeSeries objects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " Add three Series objects to the System: S, I, R\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \"\"\"\n", - " S = TimeSeries()\n", - " I = TimeSeries()\n", - " R = TimeSeries()\n", - "\n", - " state = system.init\n", - " t0 = system.t0\n", - " S[t0], I[t0], R[t0] = state\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " state = update_func(state, t, system)\n", - " S[t+1], I[t+1], R[t+1] = state\n", - " \n", - " return S, I, R" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we call it." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "S, I, R = run_simulation(system, update_func)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And then we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what they look like." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(S, I, R)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Using a DataFrame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n", - "\n", - "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it, and what the result looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)\n", - "results = run_simulation(system, update_func)\n", - "results.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can extract the results and plot them." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "plot_results(results.S, results.I, results.R)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises\n", - "\n", - "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. Simulate this scenario for 14 weeks and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap11.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "l0sqtYtKeIbP" + }, + "source": [ + "# Chapter 11" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "iiaJC4vbeIbY" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun San Yip 1 July 2021\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "7AWouhGPeIbb" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NzmAUON9eIbe" + }, + "source": [ + "### SIR implementation\n", + "\n", + "We'll use a `State` object to represent the number (or fraction) of people in each compartment." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-gtLBbnreIbg" + }, + "source": [ + "init = State(S=89, I=1, R=0)" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jgAN_BIxeIbi" + }, + "source": [ + "To convert from number of people to fractions, we divide through by the total." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qlVR3ZMYeIbj" + }, + "source": [ + "init /= sum(init)" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KSTMgbIGeIbk" + }, + "source": [ + "`make_system` creates a `System` object with the given parameters." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "EMoizfN6eIbn" + }, + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZbHfzw4beIbr" + }, + "source": [ + "Here's an example with hypothetical values for `beta` and `gamma`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JTtJATV8eIbr" + }, + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m1TGqfkZeIbu" + }, + "source": [ + "The update function takes the state during the current time step and returns the state during the next time step." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AMgxLQqKeIbu" + }, + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2C4RkHaLeIbw" + }, + "source": [ + "To run a single time step, we call it like this:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "gioLJGokeIbx" + }, + "source": [ + "state = update_func(init, 0, system)" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LxWWaoUCeIbx" + }, + "source": [ + "Now we can run a simulation by calling the update function for each time step." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xPzI7WkMeIbz" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: State object for final state\n", + " \"\"\"\n", + " state = system.init\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + " \n", + " return state" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "A6D0IZLjeIb0" + }, + "source": [ + "The result is the state of the system at `t_end`" + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 143 + }, + "id": "tuAynrgNeIb1", + "outputId": "33ce4644-251f-4272-e237-e1492b6d9715" + }, + "source": [ + "run_simulation(system, update_func)" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
values
S0.520568
I0.000666
R0.478766
\n", + "
" + ], + "text/plain": [ + "S 0.520568\n", + "I 0.000666\n", + "R 0.478766\n", + "dtype: float64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CGYiRMMfeIb2" + }, + "source": [ + "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. After 14 weeks, how many students, total, have been infected?\n", + "\n", + "Hint: what is the change in `S` between the beginning and the end of the simulation?" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "H-TRR9peeIb3", + "outputId": "628b4520-43dd-4f3b-aa77-cd6b1b4cf74d" + }, + "source": [ + "tc = 4 # time between contacts in days \n", + "tr = 5 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system1 = make_system(beta, gamma)\n", + "\n", + "S, I, R = run_simulation(system1, update_func)\n", + "\n", + "89-S*90\n" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "34.08459698173312" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 10 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Gs-c3Nmwzcew" + }, + "source": [ + "34 students were infected." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vYNp8RtGeIb4" + }, + "source": [ + "### Using TimeSeries objects" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s8eBqra3eIb5" + }, + "source": [ + "If we want to store the state of the system at each time step, we can use one `TimeSeries` object for each state variable." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jvPNKMMxeIb6" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " Add three Series objects to the System: S, I, R\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \"\"\"\n", + " S = TimeSeries()\n", + " I = TimeSeries()\n", + " R = TimeSeries()\n", + "\n", + " state = system.init\n", + " t0 = system.t0\n", + " S[t0], I[t0], R[t0] = state\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " state = update_func(state, t, system)\n", + " S[t+1], I[t+1], R[t+1] = state\n", + " \n", + " return S, I, R" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EVzIo_ZceIb9" + }, + "source": [ + "Here's how we call it." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Bm_0BJNQeIb9" + }, + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "S, I, R = run_simulation(system, update_func)" + ], + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "L0wguPIleIb-" + }, + "source": [ + "And then we can plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "q72qa81heIb_" + }, + "source": [ + "def plot_results(S, I, R):\n", + " \"\"\"Plot the results of a SIR model.\n", + " \n", + " S: TimeSeries\n", + " I: TimeSeries\n", + " R: TimeSeries\n", + " \"\"\"\n", + " plot(S, '--', label='Susceptible')\n", + " plot(I, '-', label='Infected')\n", + " plot(R, ':', label='Recovered')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ur9XHnWveIcB" + }, + "source": [ + "Here's what they look like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "vmuwAhqOeIcB", + "outputId": "71e1db78-6fdb-4179-c83e-71d52ad5218b" + }, + "source": [ + "plot_results(S, I, R)\n" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3hUVfrA8e/MJJOeEAIkJKEFyKFDqAICUkQjioJgR3dlBcV1VVwRdNeyVmCxi64V/YHiuoAdUEEpIk0RpB1aKOmUFNKTmfv7Y4YhDZhokkl5P88zT2bOvTP3Jc/DvDnnnnNek2EYCCGEEHWN2dMBCCGEEJWRBCWEEKJOkgQlhBCiTpIEJYQQok7y8nQANUkp5QP0A1IAm4fDEUIIARagJbBFa114vhMbdILCkZzWeToIIYQQFQwB1p/vhIaeoFIAFi1aREREhKdjEUKIRi81NZWbb74ZnN/P59PQE5QNICIigujoaE/HIoQQ4qwL3naRSRJCCCHqJElQQggh6qRaHeJTSt0A3A30BIK01qYLnN8OeB24GMgF3gL+qbWW/ZmEEKKBq+17UBnAfMAPeOd8JyqlLMCXwI9ABBAFrAAygX/XbJhCCCE8rVaH+LTWK7XWHwGH3Dh9CNABmKG1ztFaa2AOMK0mYxRCCFE31OV7UD2BA1rrzFJtW4F2SqlgD8UkhBCiltTlBBWMYzivtMxSx2pFQnIWhcWyCYUQQtS2urwOKhsIKdfWpNSxGldis/P3l9dhs9lpHx1Cl3ZhdI1xPIL8rbURghBCNFp1OUFtBzoopUK01lnOtj5Agta6VhJURnYhUc0DOJKSzb6jmew7msmnaw4C0LZlMHeO70HXmLDaCEUIIRqd2p5mbgG8Aavzta/zUJHW2l7u9HXAQWC2UuoBHLP4ZuCYdl4rmof68fIDw8krKEYfyWBXwkl2HTqJPpLB4ZRsQgLP9qJWbjxCZk4BfTqFExMZgtl83hn0QgghLqC2e1CTgPdKvc53/hyulDoE7AbitdbrtNY2pdSVwBtAOmfXQdX6FHN/X2/iVAviVAsAiopt7D+WSVTzQNc5X/+YwKHkLBYu30uTIB/6dQ5nQNcIesY2x9dalzuqQojG4NFHHwXgX//6FwAjRozgr3/9K+PHj6/0/KVLl/Lqq6+yevXqWouxvFr95tRaLwAWnOeUwNIvtNYJwGU1GNLvYvW2VBjau2F0LD/vTefnPWmcyCrg281H+XbzUaxeZm4d04Wrh7b3ULRCiN/j2LFjzJ07l59//pm8vDyCg4Pp1q0bL7zwAlZr3b4HXVnyOZOY6hP5076aDOweycDukRiGweGUbDbvTmXzrlT2Hc2kRai/67y9h0+RfCKXi7pF4O/r7cGIhRDnc8cddzBw4ECWL19OUFAQaWlpfP/9954Oq1Gpy9PM6yWTyUS7yBCuH6WYd+8wFjw6mj6dWriOf7b2IC989AuTHlvBc+9vYfOuVEps5W+/CSE8KSMjg4SEBK6//nqCg4MxmUxERERw4403YrVaeeWVV5g0aVKZ98ycOZOZM2cCYBgGL730EkOHDiUuLo6hQ4fy/PPPu85NTk5m+vTpDBkyhD59+jB+/HgOHXLsX2Cz2Xj33XeJj493Hfvpp59c7126dCkjRozgvffeY8iQIQwYMICHH36YvLw8AP7yl7+QnJzMY489RlxcHBMmTKgQX+k4Jk2aRFxcHFdddRU//vjjOX8nF4qrJkgPqoaFhfiVed2nUwsyThey69BJftyRzI87kgkJtDIsLprRA9rQpqWsQRaNx1UPfHbOY3dP6MnlA9sCsOKnw7z2v+3nPPeLeVe7nt/3wg8cTMw653F3hIaG0rFjR/75z39y00030a1bNzp06IDJ5N7kpw0bNrBkyRIWL15MZGQkmZmZJCQkAJCfn89tt91G//79+fzzzwkJCWHfvn0EBAQAMH/+fFavXs38+fNp06YNq1atYtq0aXz22We0bt0acNRUOnDgACtXruT06dPcddddzJ49myeeeIK33377gveXzli0aBGvv/463bp1Y9myZdx1110sX76cqKioCue6E1d1kx5ULRvVvw3P3X0x7/5jNH8a04VW4UFk5RTx+bpDbNiR7OnwhBBOH3zwAQMHDuSDDz5g3LhxDBo0iNdeew3DuPBe1d7e3hQWFrJ//34KCgpo0qQJcXFxAPzwww/k5OTw+OOPExoaitlsplOnToSHhwOwYMECZsyYQbt27TCbzVx66aX06dOHL7/8ssw1Zs2ahb+/P+Hh4dx7770sW7YMu71qozHjx4+nV69eeHl5MXHiRJRSFa5zhrtxVSfpQXlI81A/rh3RkfHDO3AwMYvvthxlZP+zf4V8vSGBwynZjBnUTnpVosFyt2dz+cC2rt7Uhbx4/yW/P6BSmjZtyvTp05k+fTr5+fksX76cf/7zn65Ecj79+/fnwQcf5K233mL69Ol06dKFadOmMXDgQJKSkoiOjsbbu+I96BMnTpCTk8Pdd9+N2Xy2/1BSUlKmVxMaGkpg4Nk5ZdHR0RQWFpKRkUFYmPtrM8sXco2OjiYlpWKhW3fjqm6SoDzMZDLRoVUTOrRq4mozDINP1xwk5UQuyzccpmtMGGOHxDCgW0sssr5KiFrn5+fH+PHjWbhwIXv37iUyMtJ1z+eM9PR0WrQ4e795woQJTJgwgaKiIhYtWsSdd97Jxo0biYqKIjExkeLi4gpJKjg4GB8fH95++2169+59zngyMjLIzc11DQsmJSVhtVoJDQ0FcHsoMikpqcJrpVSF89yNq7rJEF8dZDKZeOTP/bliUFv8fCzsOnSSZ9/fwpRnv+PTNQfIKyj2dIhCNGhZWVnMmzePffv2UVxcTElJCStXrmTfvn306dOHbt26sXfvXrZt24bNZmP58uVs2bLF9f4dO3awZcsWCgoK8Pb2diUSs9nM8OHDCQwM5MknnyQzMxO73c7evXtJS0vDarVyww03MGfOHA4ePIhhGBQUFLBlyxbXPawzZs+eTX5+PmlpabzyyiuMGzfO1btp3rx5hfMrs2zZMnbs2EFJSQlLlixhz549XHnllRXOq0pc1Ul6UHVUm4hg7rq2J7eN6cKqLcf4Yt0hUk7m8s7nuwgL9mNIXM11q4Vo7Ly9vTl58iT33HMP6enpeHl5ERUVxT/+8Q/i4+MBmDJlCtOmTcNmszFmzBhGjx7ten9ubi5z584lISEBs9lM27ZtefXVV/Hx8QEc93PmzJnDmDFjKCgooE2bNsybNw+Ahx56iIULF3LvvfeSkpKCj48PXbp04aGHHnJ9fkREBO3atWP06NEUFhYycuTIMsenTZvGU089xeLFi2nfvj2LFy+u9N954403MnfuXHbu3ElUVBSvvfZahWG/M9yJq7qZ3LnhV18ppdoCCatWrTrnL72+sNkNtu5OZd2vydx/YxwWi+MvpbXbEoltHUpEWICHIxRC1Ia6sMPDH5GYmMjIkSMB2mmtD5/vXOlB1RMWs4kB3VoyoFtLV9up7AJeXLwNm93gkt7RXDcqtsz2S0IIUZ/JPah6zG43GNLLMdS3eusxps1exQsf/ULKiVwPRyaEEH+cDPE1AKknc/lk1X5WbTmKzW5gNpsY2bcVd13bE28v+RtECFF3VGWIT769GoCIsADuua4Xb8wcyah+jrVUp7ILJDkJIeo1uQfVgESEBXDvDXFMHNmxTPuBY5n8otO5elh7fLwtHopOCCGqRhJUAxRZbqLEgq92sX3/CZZvSGDSFV24pHe0FFQUQtR5MgbUCEwcEUtMZAgnsgp44aNfmP7SGnYdOunpsIQQ4rwkQTUCPWOb88L9w7jvhjjCQnw5mJjFzNfWM/f/tnIqu8DT4QkhRKUkQTUSZrOJkf1a88bMkdw4WmH1MrNpdyp2e8OdxSmEqN8kQTUyvlYvbrqsE68/NJIHbupNsyaOelU2u8FvB094ODoh6qc333yTwYMHExcXx4YNGzwdjsuIESNYunSpp8P43SRBNVItmvozsHuk6/U3m47w8Pwfefq9TRzPyPdgZEJ43qRJk3jllVfcOjc1NZXnn3+et956i23btjFo0KA/dO3ExESUUiQmJv6hz2kIJEEJFz8fCxt3pjJtzio+XXMAm5SiF+KCEhMTMQyDLl26eDqUBkemmQsA4ge2pX+XcN789Dc27Ejhnc93sXrrMf46sRexrUM9HZ5ogFIWP03+wV9q5Vp+7XvT8oZHftd7lVI8+uijfPHFF2itiY6O5oknnqB3794sW7aMxx57DIC4uDisViubNm2isLCQ1157ja+//pqsrCxiY2N55JFHyiSxJUuW8P7775OUlISfnx/XXnst999/v6vcxZVXXonJZOL6669n5syZZGdnM2/ePNauXUteXh49evTg0UcfpVWrVoBjB/Wnn36aVatWYbVamTx58h/8rXme9KCES1iIH7Nu68+jkwfQoqk/CcnZPPjyWrbvP+7p0ITwqP/973/MmTOHLVu20L9/f2bMmAHAuHHjeOuttwDYtm0bmzZtAuCxxx5j165dLFq0iJ9++okrrriCyZMnk52dDcDixYuZN28es2bNYvPmzSxfvpwhQ4YAuEqof/nll2zbto2ZM2diGAZ33303eXl5LFu2jHXr1qGUYurUqRQXO+rDPffcc2it+fzzz1m5ciX79+8nLS2tVn9P1c3tHpRSqgMwHAinXGLTWv+rmuMSHtSvSwTd2zdj0cq97Dx0km4x7peQFsJdv7dH4wm33347rVs7thG7/vrrWbhwIRkZGa4KtqVlZGSwbNkyvv32W1d5+JtvvpmFCxfy/fffc/XVV/N///d/TJkyhYEDBwIQFBRE3759z3n93bt38+uvv7J582b8/BwTm+6//34WLVrE9u3b6d27N59++imvvvqq65qzZs1i2bJl1fp7qG1uJSil1G3A20A+kA6UnptsAJKgGhhfHy8mj+1Gic3uqj2VcbqAj7/dxy2XdyLQ3+rhCIWoPaVLufv7+wOOIbXKEtTRo0cBGD9+fJn24uJiV48mKSmJdu3auX39I0eOUFxc7OplnWGz2UhNTeXUqVMUFRWV2RQ7MDCw0vjqE3d7UI8Cc4B/aq3lznkj4mU521l+57NdrNmWyIYdydx1bY8yswCFEA7NmjUD4KuvvnL1ZsqLiori8OHDDBs2rMKxM2Xby3+mr68vGzduxMur4te23W7HarWSlJRE+/btAUcCzcjI+CP/FI9z9x5UBPCOJKfG7YbRsXRu25SM04U8s2ALcxduJTu3yNNhCVGnREVFMWrUKJ544gmSkpIAyMnJYc2aNaSnpwNw66238uabb7J582ZsNhunT59m69atADRt2hSz2UxCQoLrM/v06UNMTAxPPPEEJ086tinLyspi5cqV5OfnYzabGTt2LK+88gppaWnk5+cze/bsWv6XVz93E9RqIK4mAxF1X3SLIJ67+2KmXNMdH6uFtduSuHvuan76LcXToQlRp8ybN4/OnTtz++23ExcXx+WXX84nn3zCmfp7119/Pffddx9PPvkkffv2JT4+nvXr1wPg6+vL/fffz8yZM+nbty9z5szBYrHw3nvv4ePjw8SJE4mLi+Pqq6/m22+/xWRybPw8a9YsOnTowFVXXcXo0aOJiYkhIiLCY7+D6uBWwUKl1ETgWeAVYDtQ5s9mrXXdWTpdSmMpWOgJKSdyeenjbew6dBKTCV57cAStwoM8HZYQoo6rSsFCd+9Bfez8+UIlxwxAigw1Mi2bBfDMXYP56scEMnMKJTkJIaqduwnK/ekmotEwm01cNSSmTNs2nc6PO5K5/aqu+Pt6eygyIURD4FaC0lofqelARP1nsxu8vmQHKSdz+XXfce6/sTddZQ2VEOJ3qspC3VhgBtDV2bQTmKO13l+FzzADTwGTgQBgPTD1XAlQKXUzMBNoA2QD/wMe0loXuntNUXssZhOP/Lk/z3/4C4eSs5g1fz3jhnXglvhOeHvJKLAQomrcmsWnlLoU+A3HTL6Nzkdv4Del1MgqXG8GcCMwFMfU9aPAF87EVf6aPYEPgCeAEGAwcBnwjypcT9SyNi2D+fe9Q7l+VCwmYOkPB5j+4loSkrM8HZoQop5xtwf1DPC61vq+0o1KqZdwzO7r7+bn3AnM1lpr5/tnAGnAxcDacufGAKe01v9zvj6ilPoK6OXmtYSHeHuZuSW+M307h/P8R79wOCWbp97dxH9mjSqz8FcIIc7H3W+L7sDrlbTPdx67IKVUCI6huq1n2rTWmcABKk86K4EEpdQNSimLUqo9cBVQf6tvNTKd2jbl5emXED+wLXdd21OSkxCiStz9xsgGWlXSfubekDuCnT8zy7VnljrmorXOA94B3gAKcSSyn3AM+4l6wtfHi2kTetK389ktX/773T5WbTmKO2vwhBCNl7sJahnwplLqMqWUv/NxOY7k4W6P5kwiCynX3oRKkpxzg9pncfSarEAk0Ax4383riTroaGo2i1bs4cXF23jugy2yVZIQdVRdqOzrboJ6APgZWA6cdj6+ArYAD7rzAVrrLOAI4NpT3jns1x74tZK39AW+11qv01rbtdYpwJvA1W7GLOqgVuFB3HNdHH4+XmzYkcI9/17NL3vTPR2WEGVMmjSJbt26ERcXR+/evRkzZgz//e9/PR1Wo+PuOqgcYKLzPtCZkpC7tNaHqni9N4AHlVKrgSRgNrAPx3Tz8tYBryulBuKYNdgcmIIjUYp6ymQyMap/a7q1D+OFj35hd8IpHnvrJ8YMbsefruyCr1WKPIu6YerUqdxzzz3Y7XZWrFjB9OnTadeuHf369fN0aFVSVFSE1Vo/y+NU6a611vqg1voL56OqyQkcJTv+iyMhpePYoWKs1tqulBqilMpRSrV2Xuu/OOpMvYdjCPA3IBeY9DuuK+qYiLAAnpl2Mbde0Rkvi4mvfkzg3c93eTosISowm81cccUVhISEsGPHDgC2b9/OpEmTGDBgAMOHD+fFF1+kpKTE9Z7k5GSmT5/OkCFD6NOnD+PHj+fQIcdXZkFBAc899xzDhw9nwIAB3H777Rw4cACAAwcO0KVLlwqVcG+55RZeeuklwFED6t133yU+Pt712T/99JPr3KVLlzJixAgWLFjAJZdcwvDhwwE4ePAgU6dOZdCgQQwZMoTHH3+cvLw81/uOHj3KbbfdRu/evYmPj2fjxo018NusIsMwKn3ExsY+HBsb61fq+Tkf5/oMTz9iY2PbxsbGGseOHTNE3XXgWIbx0KvrjJNZ+Z4ORdSyiYvvNCYuvrNM27NrXzMmLr7T2JK43dX27YG1xsTFdxpvbF7oajuZl2FMXHynMeXTh8q8f8bKp42Ji+80Dp48/LvjuuWWW4yXX37ZMAzDKC4uNj7//HMjNjbWWLVqlXHw4EGjV69extdff20UFxcbiYmJxtixY4358+cbhmEYeXl5xqhRo4yHH37YOHXqlGGz2Yw9e/YYqamphmEYxmOPPWZcc801RmJiolFQUGDMnTvXuPjii43Tp08bhmEY1113neuzDMMwEhISjE6dOrm+x15++WXjmmuuMQ4dOmTYbDbjm2++MXr16mUcOXLEMAzDWLJkidG5c2fjscceM3Jzc428vDzj5MmTxoABA4z333/fKCwsNE6ePGn86U9/Mh555BHDMAyjpKTEiI+PNx5++GEjNzfXSE1NNa677jqjJr4/jx07ZsTGxhqxsbFtjQt8h5+vB3UH4F/q+bkef6nJBCoavvbRTXju7otpGuwLgM1m5/Ul20k6nuPhyERj9uabb9K3b1969OjBjBkzmD59OiNGjODDDz9k1KhRxMfH4+XlRVRUFFOnTmXpUsd8sR9++IGcnBwef/xxQkNDMZvNdOrUifDwcOx2O0uXLuW+++4jKioKHx8f7r//fux2O2vWrAFgwoQJLFmyxDXLdcmSJVx00UWuigwLFixgxowZtGvXDrPZzKWXXkqfPn348ssvXbGbzWZmzZqFv78/fn5+fPbZZ8TExHDrrbditVpp2rQp9913H59++ik2m41ff/2Vw4cPu94THh7OtGnTavk3XtE5B/y11u0qey5ETftifQJfbzjMqq3HuP2qrsQPbOuqeSMalv9eX3F55cwhFb8YR7Ufwqj2ZcudN/VrUun7Z49+uFpimzJlCvfccw85OTk8++yzbNiwgcmTJ3P48GE2bdrE999/7zrXbre7EkpSUhLR0dF4e1fcLDkjI4PCwsIy5X8sFgtRUVEkJycDcMUVV/DMM8+wadMm+vXrx7Jly3j4Yce/6cSJE+Tk5HD33XeXqbxbUlJCVFSU63WzZs3w8fFxvT58+DA7duygb1/XHDUMw8BkMnHixAnS0tIIDQ0lMDDQdbwulChy6460UupW4OPye+AppazADVprWZskqs2ofq04cCyTNdsSeX3JDjbtTOVv1/ciLMTP06GJRigwMJDHHnuM+Ph4Fi1aRPPmzbnmmmt48sknKz0/KiqKxMREiouLKySp0NBQfHx8SExMdJVmt9lsJCcnExkZCUBAQADx8fEsWbKE/Px8iouLGTVqFADBwcH4+Pjw9ttv07t373PGXL5sfPPmzenfvz/vvvtupeeHh4eTkZFBbm4uAQEBAK5qwJ7k7iSJ96i4fgkgyHlMiGoT6G/l77f0YcakvgT5e/OLTufuud/zwy+JsrhXeITVauXuu+/m9ddfZ9y4cSxfvpyVK1dSVFSEzWbjyJEjrF3r2K1t+PDhBAYG8uSTT5KZmYndbmfv3r2kpaVhNpsZN24cL730EsnJyRQWFvLyyy8DMGzYMNf1Jk6cyDfffMOCBQsYO3asaxae1WrlhhtuYM6cORw8eBDDMCgoKGDLli1lSsSXN378eHbu3MlHH31Efn4+hmGQkpLCd999B0DPnj1p3bo1s2fPJj8/n7S0NObPn19Tv063uZugTDgKE5YXjmNNlBDVbkivKF59cAR9O4eTm1/MvEU/s3lXqqfDEo3U1VdfTUhICBs2bOCdd97h448/ZujQoQwYMIC//e1vriE6X19fFixYQFZWFmPGjKFfv348/PDDrhlzZ0q533TTTQwZMoTt27fz7rvvlhlei4uLIzo6mo0bNzJhwoQycTz00EPEx8dz77330rdvX0aMGMF//vOfMrMIy4uMjOSjjz5i/fr1XHrppfTt25fJkyfj3BYVLy8v3njjDQ4fPszgwYP505/+xLXXXlvdv8IqO2/Jd+d6JYBhOLYZKr3s3wJ0ArZora+ssQj/ACn53jAYhsE3m46ycWcK/7x9AGaz3I8Sor6qzpLvB50/LwEOA/mljhUBX+DYL0+IGmMymbjsojaMHtDaNVnieEY+i7/V3DamC8EB9XMRohDi/M6boLTWdwAopRKBf2utc2slKiEqUXom33+W7WDTrlQ2705l2rU9Gdi9pQcjE0LUBHe3OnqipgMRoipuH9uVnPxidh06yTMLNjM0Loop13QnJNDnwm8WQtQLVSn5fhtwE44SG2XGVLTWMdUclxDnFdkskGfuGsyXPx7ig6/3sHZbEr/uO87Ucd0Z0itK1k0J0QC4W/J9OvAKsAdoC3yNoz5TU+D/aio4Ic7HbDYxdkh7XnlgON3bNyM7t4jnP/yF1JN5F36zEKLOc3ea+RTgTmfJ92Lgea31aBxJq2lNBSeEO1o2C+CpOwfx14k9ufnyTrRs5lhoaBgGdrusmxKivnI3QbUGfnQ+L8CxQBcc1W1vqO6ghKgqs9nEZRe1ZeLIWFfbht9SmPnaeo6kulv0WQhRl7iboI7jqHwLkAj0cj6PAipuOCWEhxmGwSer9rHn8CnunfcDH3y9m4Kicy9kFELUPe4mqLXAZc7nHwMvKqU+Aj4CVtREYEL8ESaTiafuHMzlA9tisxt8smo/d8/9nq170i78ZiFEneBugroHeN/5fDbwDBAALMRxf0qIOifQz5u7J/Rk7j1DaNsymPRTeTzx9kaefm8TWTmFF/4AIYRHubsOKrPUcwOY63wIUed1atuUF+8fxhfrD/Hhyr0cTsnG10dKywtR18n/UtEoWCxmrhnWgSG9ojiZVYCPtwWA03lF7Dx4gou6tZS1U0LUMedMUEqpYirfwbwCrbVshibqhbAQvzJ1pT76RvPFukP06NCMv1zdjXaRlVWVEUJ4wvl6UHfgZoISor5qFR5EkL83Ow6c4L7nf2BU/zbcfHknV/l5IYTnnK/k+4JajEMIj4gf2JaLe0by4cq9LN9wmG82HWHttkTGD+/INcPa4yf3qoTwGHdn8QnRYAX5W5k6rgevzRjBgK4RFBTZ+HDlXhKSszwdmhCNmlt/Hiql7JxnuE9rbam2iITwkKjmgfzj9gH8dvAE23Q6XdqFuY5t33+cbu2bYZFiiULUGnfHL26lbILyBvoAEwEpxSEalO7tm9G9fTPX671HTvGPNzbQKjyImy/rxMDuLaWqrxC1wN11UAsraV6glNoODAder9aohKhD8vJLaBHqx7G00zz3wRbatgzm+ktjGdQ9UhKVEDXoj96DWg1cVR2BCFFX9e7UgjdmjmLatT0IC/HlcEo2sz/Yyl///T0/7kj2dHhCNFh/NEFdDsidZNHgeXuZiR/UjjdnjeKua3vQ3Nmj2pNwytOhCdFguTtJ4ptyTSYgEugE/KO6gxKirrJ6W7hiUDsu7d+G1VuP0Vu1cB1b92sSScdziB/YVkrPC1EN3J0kkVTutR3YCvxNa72qekMSou7z9jJz2UVtXK/tdoNFK/aSdDyHT77bx/C+rRg7JIbWEcEejFKI+s3dSRJ/rulAhKjPTCa469oefLb2IFt2p7Fy4xFWbjxCz47NGDM4hv5dwrFYZNmhEFVRpWXySqkYoIvz5W6t9aHqD0mI+sdkMtGzY3N6dmzOsbTTfLHuEKt/Psb2/SfYvv8EM27py5C4KE+HKUS94u49qFDgbWBcqWZDKfUZMFlrneHm55iBp4DJOOpJrQemaq2PnON8P+f51wOhQApwj9Z6uTvXE8ITWoUHMW1CT24d04XVW46yfnsyF3WPcB3/6scEwkJ86ds5HC/pVQlxTu72oP4DdMdRVfdHZ9tg4FXnsevc/JwZwI3AUBz3tZ4HvlBK9dJa20ufqJQyAcucLz7FlK4AACAASURBVIdorROUUtFViFkIjwr082bs0PaMHdre1ZabX8x7X+6isMhGk0AfLukTzYi+rWQXdSEq4e6X/RggXmu9tlTbt0qpO4Cvq3C9O4HZWmsNoJSaAaQBF+MoK1/apcAwoJXW+gSA1jqxCtcSos4xmeCm0YrvthzjWNppPl1zkE/XHKRNRBDDekczekAbmQEohJO74wsZwIlK2k8C2e58gFIqBGiDY/Yf4KrUewDoVclbRgAJwD+UUqlKqcNKqVeUUoFuxixEnePv68344R157cHhzLt3KPGD2hLk782R1NN88PUecvKLXecWFds8GKkQnuduD+rfwDNKqVu01jkAzkTxpPOYO87Mt80s155Z6lhpzYDOwDdAjPP1UmAeMNXNawpRJ5lMJmJbhxLbOpQ7ru7ONp3OnsOniGp+9u+vB15ai4+3hYu6t2Rg95ZljgnRGFRliK8/kKyU2u1s64xjA9lApdTlZ07UWo8+x2ec6WmVH2xvQuW9sNOADZiptS4AjiqlZuO47yUJSjQY3l5m+neNoH/XsxMpTmUXkHw8h6ISO/poBu9/tZvoFoH07xJBvy7hdG7bVKatiwbP3QSV6HyUtqcqF9JaZymljgB9cQ7zOYf92gO/VvKWX5w/S++iLhV+RaPQNNiXRf+K5xedzk87U9iyO43E9BwS0w+w9IcDPDp5AP26OBJacYkNby+peCMantpeqPsG8KBSajWOWXyzgX04ppuXtwx4DnhaKfUIEIZjFuD/qikWIeo0Xx8vBvWIZFCPSEpsdvYknGLz7lS27z9O9w5ny4HMXfgzR1Oz6eFch9W9fTOCA6wejFyI6lHVhbqtOLtQd9fvmFU3B8cQ33rOroMaq7W2K6WGAMuBLlrro1rrHKXUaBxDeidx3Kv6BHikitcUot7zspjp3qFZmcQEYBgG+49lciIzn6TjuSzfcBiA1hFBdIsJY1jv6DKFF4WoT0yGceFRM6WUP46aT7fg2CgWHPvxLQTu0lrn11iEf4BSqi2QsGrVKqKjoz0djhA1osRm58CxTLbvP872/SfQR05RVOJYVviXq7txtXMd1oHETHYePIlqHUpMdAg+3jIsKGpfYmIiI0eOBGintT58vnPd7UHNBS7BsZPEGmfbJcDLzmN//R1xCiGqgZfFTKe2TenUtinXX6ooLrGx72gmOw+dKLPb+sadKXz87T4ALGYTbSKCaR8dQsdWTejQqgkdW4V66p8gRKXcTVATgFu11itLtX2mlCoE3kcSlBB1hreXha4xYXSNKTu017ltU0YPaMO+oxkcTc3mUHIWh5Kz+HbzUVqFBzJ/xkjAMWy49PsDRLUIpG3LYFqE+kvlYOER7iaoEByLZstLoPI1TEKIOqZPp3D6dAoHIL+whENJWRxMzORAYiZhIX6u8zJPF7Lgq92u11ZvC9HNA4kOD6RVeBDD4qJp2Syg1uMXjY+7CWonMAX4e7n2qc5jQoh6xM/Hq9JeFjjWclwzrD1HUrI5kprNqexCV28LoFtMmCtBfbJqH1v3pNGyWQDhTQOICPMnvKnjERrkKz0v8Ye4m6AexTGkV3rPvKFAb2BsTQQmhPCMpsG+TB7bzfU6J7+YxLTTHEs7TdLxnDJFGA8kZrI74RS7E05V+BzVJpR//20oADa7wYcr99IsxJewED+aBvsSFuJLcKAPFkli4hzcXQf1tVKqD/AgMNLZvAu4Q2v9W00FJ4TwvEA/b9ckjPKmXNOdKwa1I/lELmknc0k7lUfaqTzSM/JoVmrYMCO7gP9+t6/C+81mE00Crdx3Q2/inBM6fjt4gkNJWYQEWAkJ9HE+rAT5W7HKzMNGxe11UFrrHcCkGoxFCFHPhIX4ERbiR8+OzSscs9nPLmHx9jJz02jF8cx8TmUXcDLL8TidV8Sp7MIyiWfTzlQ+W3uw0uu1Cg9i/owRrtcvLv4FL4uZQD9vAvy8CfS3EuDrhb+vN21bBtOsiSNJ2mx2TCaTDDnWM24nKKWUD3AT0NXZtAv4yLlPnhBClFF66C4k0IcbL+tU4ZziEhuZp4sICTy780XXmDBsdjvZOUVk5hSSnVtEdq7jp4/1bCKz2w1Wbz3GuZZy3jmuO2MujgHg+5+P8dLHv+LnY8HPxws/Hy98fbzwtTqe/+PP/V17G371YwKn84rw8bbga7Vg9bbgY7Xg420hIiyAVuFBrtgzsgvx9jZj9bJg9TbjZTFjMkkSrC7uVtTtCXyJY2PXM3vwTQWeUkpdobXeXkPxCSEaMG8vC81D/cq0DXTu3l6eYRiuBchnXv/95j7k5heTk19MTl4xuQXF5OYXk1dQQnjY2ZmGhUWO0iX5hTbyC21AoeuYxVy2Z7Xip8McTqm8ilD8wLZMm9ATgITkbB54qXwZO0dv0dvLzOy/DqFtS8f9ukUr9rJ5VypeXia8LI5E5uVlxttiJrpFIH+60vF3v81u8J9lO7CYHeeV/mmxmOnXJdxV3PJISjZ7j5zCbDJhsZgwm81YTCbMFhNeZhMDup39HeojpygqtmM2mzCbTJjNjuFVk8lEk0AfV0+zsNjGycx8TCYTJhPOc88+Dw6w1uomxVWpqPsrMMlZwwmlVBPgAxz76w2smfCEEMLBZDKV2f3CYjEzNM69HWLGXBxD/KB2FBSVkFdQQn6h41FQVEJRsb1Mr+eKQW05kVVAQVEJhUU2ioptFBbbKCyy0aZl2VU1zUP9KCq2UVRsp7jERonNoLjETnGJndKjiamncl2zIMvLzj17b89ms7u2q6pMWIivK0FtP3Cctz6tfBK1l8XMsjlXuV6/9PGvHEs7Xem5V17cjqnjegBwMDGTh16tbGtUh1cfHE6biNpbWeRuguoJ9DuTnMBRbNC5ievmGolMCCGqkdlswt/XG39f7/OeFz+onVufF9s6lHf/Uba6kN1uUGxzJCg/n7Nfr7fGd+Hqoe0psdkpKbE7ftoMSmx2AkrFYzabuHNcd2x2gxKbgc1ud/202YwyCbJ1eBCjB7RxHLMb2G0GNsPAbjcwlxtm7NiqCcEBVgzncfuZn3bKTGbx9jLTsllAqfNwPTdwJL7a5G6COohjeK+8JlS+gFcIIRods9mEj9lSYZ/D5qF+FYYyK+NlMbvum11Ir9gW9IptceETgftv7O3WeR1bhfLmrFFunVsb3E1Q9wIvKqX+Dmx0tl2EY3fyv9VEYEIIIRo3dxPUCsAMrKrk2NdKKdcLrbUUohFCCPGHuZug/lKjUQghhBDluLuTxPs1HYgQQghRWu1OyRBCCCHcVKWS70IIIeouwzAotBVht9vxt5baCzE/i/ySApr6NcHXyweAzPwsUnNO0MQ3iIggx2zAwpIifkvbi9XiTY+Izq73b03aQU5RLn2jehBorb1SK9KDEkKIanQqL5PE7BSKbMWutqOZSaw/spmjmUmuthO5p1j822es2P9DmffP3/QBs9fNJ7/47C5y/935BQ+seJLNib+62rYmbee2pffz0k/vuNpsdhu3LrmPyZ89WPYzN7/PfV8/zt7jZ/c43Ji4jUdX/5uv9q12tWUXnmbO+td5fcv/lXn/4t8+Z/7mDziRm1HF38YfIwlKCNFo2ew2cgpzy7TtTt/H6kM/ciLvbAmRHal7eGHD23x7YJ2r7WReBlM+e4jpy/9V5v3Prn2V6cv/RXJ2mqttw7GfeXnje2xOOptgMguyWbp7BWsSNpZ5/7bUXfyc/BuFJWe3YzqVn8WxrGSyC3PKnJtfXEBBSeltmyxYLd74WByLcs9o6hdKy8AWeFvODpqF+oUQGxZD84CzNcF8vHzo3bIb3cPL7pvYJ7I7Q9sOIMB64bVc1emcQ3xKKRvQUmudrpR6F7hXa135XhlCCFFHnMg9RWpOOi0Cm9PC+eV7OOMYn+5ZSWRwBNd1uxIAu93OTZ/cA8BH172K2eT4e/0L/R0/J//G3wdPpZm/YxuiE3kZ/HTsZ3wsVi7tMAQAb4s3mQXZ2Oy2MtdvEdiMYntJmba2TaIZ1KoP0cFn98dr5h/K9d2uIsw/tMy5d/a7Bbthx9/7bDK4tks88R0vKXNur4iuvDduHt7ms1/jJpOJhRNervA7uat/xUIUA6LjGBAdV6Yt2CeQmUPvrnDujT2urtBWG853DyofCATSgduAhwBJUEKIWldkK+ZoZhKFtiK6toh1tb+88T2OZSYxc+jdri/vL/R3LN//Pbf2msCVylG+Lrc4nw3HfqZz8w6AI0GZzWbHfRrDoKCk0JUQuod3IsgaSFO/s5vndG3Rkb9ddDuRQWd3bgi0+vPG2GfxtfiUifXBi++sEP9FrXpzUauyuzk08Qvh2q5XVDi3T2T3Cm2lezlneFm88LI07GkE5/vXbQKWKaU2AybgeaVUfmUnaq2n1ERwQoiGr8Tm6G2c+bLdlb6PVQfXo5q157KOwwDHDf2Hv5tNmH8or1/1jOu9SdkpHMlKIiM/y5WgWoW0pEvzjjTxDXKd1yokkr9d9GdXj+iMd66Z6+o5nXFF7AjKCw9sTnhg2ZpXZpO5TBIT1e98Ceo24GGgI2AAMUBRJeedoxqLEEI4GIZB8uk0Uk6n0TuyuyspzN/8AWsOb2T6oDtcw00Z+ZmsP7qFEsPmSlChfiG0C21F84AwDMNw7T5+R5+bMJvMRAVHuK41qv0QRrUfUub6wT6BXNymf4W4yicnUbecM0FprROBaQBKKTswTmudXluBCSHqp9yiPLal7KTIVsKImEGA497Io6vncbowhzeuepam/o6eh5+XLwBZBWfrL3Vq1oFp/W+ldUikq83b4s3s0Q9XuFaHsLY1+C8RnubuThLyZ4YQooLk02lsTdpOi4BmrnssOUW5vLzxPUJ9Q1wJCqB7C0VucT5FtrMDMdd3v4pJPceXuZfSLKApl7STEnOiaiXfY4EZnC35vhOYq7XeVxOBCSHqloOnjrAjdQ89IzoT07QN4Jgdt3D7MnpHdnclqOYBYQxq1YeIoBbY7XbMZsfft/cNqrilZ+mZakKU527J90txlHzfCZypcTwU2KGUGqO1rmyXcyFEPZWac5y9xw/QP6qXa0eC9Ue28NW+VdgMmytBdQxrx2UdhtG5eUfXe80mc6XJSIiqcrcH9Qzwutb6vtKNSqmXgGeBincfhRD1gmEYpOYcp2WpKdSvbXoffeIgwUOC6B3ZDYDekd2w2W10atbedV7zgDAm97mh1mMWjYO7Cao7cEsl7fMBmWIuRD1lt9u556t/cjzvFG9fPYdg59TsPpHdCfEJwt/b13Vu9/BOFXYYEKImuZugsoFWgC7X3sZ5TAhRx+UV5fO/XV+RnJPOzCHTAMdi1YigFpTYbaTnnnQlqGs6X+bJUIUA3E9Qy4A3lVJ3AWc2oxqKowe1tCYCE0L8MdkFp0nJSUc5h+R8vKysTthAXnE+6TknaBHYDIAHBk3Bz9vXtbZIiLrC3QT1APAesJyyC3P/BzxY6TsqoZQyA08Bk4EAYD0wVWt95ALv6wNsBH7UWl/i7vWEaKyST6dx//InCPEJ4o2xz2I2mbGYLUzufQNh/k1oWmpPN/9a3gBUCHe5uw4qB5iolGoPdHE279JaH6ri9WYAN+LofSUBzwNfKKV6aa3tlb1BKeULLADWuBuvEI1JTmEua49sIq+4gAnOvd1aBrYgIqA5LQKbkVuUR5BPIABD2sp8JlF/VOkLX2t9EDh4wRPP7U5gttZaAyilZgBpwMWcnb5e3tPAKiATuOQPXFuIBqP0dj+5xXks2PYJvl4+jFWjsHpZMZlMPB//KBazxcORCvH71doOEUqpEByTKraeadNaZwIHgF7neM9QHFsPV9zjRIhGKD33JC9seJu5P/7H1RYe2JyxnS5lar+by9xHkuQk6rvaHDILdv7MLNeeWeqYi1IqEHgXuF1rnaeUquHwhKibim3FeFu8AfD18nEUvTMMcopyXeW3b+k53pMhClEjajNBnZmOHlKuvQmVT1X/N/C11vpcQ39CNGgnck/xn60LySnM49nRMwHHrtz3XnQ7HcLaupKTEA1VrSUorXWWUuoI0BfnMJ9z2K898Gslb7kcaKKUusn52h/wVkqdAPpprRNqIWwhalWJ3YaXc2gu2CeQA6eOUGQr5njuSVfRuvKF74RoqGp7VtwbwINKqdU4ZvHNBvbhmG5e3kWUjW86MBCYCKTUcJxC1Kqcolze/eW/HDx1mBcufwyz2YzVy8qDg++kdUgkgT7SWxKNj7ubxTbHMeQ2CgjHUWHXRWvt7t3YOTiG+NZzdh3UWK21XSk1BMc6qy5a66Na69RyMWQDhc46VUI0KP5efuw/cYj0vJMcyjjqqnPUpUXH879RiAbM3R7U2zj243sJSOZ3VtF1rnWa5XyUP7YOCDzPex//PdcUoq6xG3Z+SNjIDwkbeGTY3/DxsmI2m5k24FbC/JvSwjmUJ0Rj526CugQYrbXeVIOxCNEomDDx7cG1HDx1hHVHNjOq/cUAZUpWCCHcT1AZwOmaDESIhiq/uICVB9YwMmYwQT6BmEwmbupxDRn5WQxq3dfT4QlRZ7m7UPdp4BGllGw1JEQVzd/8AR/u+JSv933vause3omhbQe4ZuwJISpyN+FcB/QDEpVSe4Gi0ge11qOrOzAh6quikiKK7SUEWP0BuEqNIqsgm64tYj0cmRD1i7sJKtH5EEKcx47UPczf/AF9I3vwl743AhDbLIZ/jfy7hyMTov5xdzfzP9d0IEI0BE39mpBRkMWhjKPY7DbZD0+IP6BK95SUUq0oW25DelWiUdMnDrI7fT/julwOQHRIS54a+SDtm7bBbKq1vZiFaJDcXajrD7wO3MLZRbp2pdRC4C6tdX4NxSdEnZVZkM0T379Iib2EnhFdiGnaGoCOYe08HJkQDYO7Pai5ONZCjcNROBDn65edx/5a3YEJURcV2YqxOncWb+IbzDWdR2MY0DKohYcjE6LhcTdBTQBu1VqvLNX2mVKqEHgfSVCiEVh3eDMfbF/C9EF/cS2qva7bVR6OSoiGy91B8hCgst3DE6iklpMQDVFKThpZBdmsO7zZ06EI0Si424PaCUwBys+Vneo8JkSDc7owh8yCbFqFRAJwdafLiA5uycBWfTwcmRCNg7sJ6lEcQ3oXA2cKCA4FegNjayIwITzp0KmjPL3mZZr4BjP7skfwMlvw8bLK1kRC1CK3hvi01l8DfXDUbhrpfOwD+mitV9RceEJ4RnRIS/yt/gT7BpFblOvpcIRolNxeB6W13gHcWoOxCOExhSVFrDzwA1d0HIGXxQurxZt/jXiAJr7BmEymC3+AEKLayeavQgBz17/BjrQ92Ox216LbUL8QD0clRON2zgSllCoCorTWx5VSxZynSKHW2loTwQlRW67uPJqswtN0C1eeDkUI4XS+HtQdQHap57+riq4QdY1hGPx4dAu5Rflc1nEY4Ch/MXv0LNmeSIg65JwJSmv9fqnnC2olGiFqwaGMo7y88T28Ld70iexOs4CmAJKchKhj3N2L7xDQT2t9slx7E+AXrXVMTQQnRE1o37QN8R2H06ZJFGH+oZ4ORwhxDu7+ydgWqKxugA8QXW3RCFED0nNPMnvdfNJyjrva/tz7OkbEDJYZekLUYeftQSmlhpZ6OVAplVHqtQUYDRyricCEqC7/2/kVPyf/hsVs4e+Dp3o6HCGEmy40xPcDjskRBrCskuM5wLRqjkmIanVLr/GYzWZu7C6bnghRn1woQbXCUf/pKI5tjY6XOlYEnNBay+w+UWcYhsF3B9ezM11z38DJmEwmgn0CubPfLZ4OTQhRRedNUFrrJOdTmd4k6oXThTl8+Nun5BblMTJmMD0iOns6JCHE7+TuLL6ZwHGt9Tvl2icDYVrrOTURnBDuMAxHJ95kMhHsG8TUvjdjN+ySnISo59ztGU0BdCXte3CU3BDCIzLzs5i7/g02HNvqaruoVW/ZdVyIBsDdvfgigcRK2pOBqOoLR4iq+Tn5N7Ym7+BYVjIXRffGYq5sNYQQoj5yN0GlA92Bw+XaewAnK5wtRA0yDMO1fmlEzGBO5mcwImawJCchGhh3h/iWAi8opeLONCilegPzgP/VRGBCVGZbyk5mffscpwtzAMd9p+u6XUUz/6YejkwIUd3cTVCP4Bji26qUOqGUOgFswTHE93BNBSdEaYZhsGz3Cg5lHGX5/h88HY4Qooa5NcSntc4FLlFKjcSxHgrgZ6316qpcTCllBp4CJgMBwHpgqtb6SCXnXgT8E+gL+AEHgKe01kurck1R/50Z0jOZTEwbcBubE3/lytiRng5LCFHDqlSwUGu9Clj1B643A7gRGAokAc8DXyilemmt7eXObQp8DNwGnALGAR8qpYZqrTf/gRhEPVFUUsTi3z6noKSQKf1uBiAisDljO13q4ciEELXB7QSllAoFLgfaAGUKFGqt/+Xmx9wJzNZaa+dnzgDSgIuBteU+8+ty712ilJrlPFcSVCOQnneSFQfWYDfsjO10KRFBLTwdkhCiFrm7ULcfsALHtkfBOLY8agHkASnABROUUioER3JzLVjRWmcqpQ4AvSiXoCp5fyTQGdjuTsyifrIbdlddpujglkzpexPRwS0lOQnRCLk7SWIusARoBuQDg3Ekm23AQ25+RrDzZ2a59sxSxyqllArEMZPwC+cwo2iADmckMuvb59idvt/Vdkm7gXQIa+u5oIQQHuNuguoFvOC8T2QHrFrrRBzJ6Rk3P+NM+fiQcu1NSh2rwNnzWoGjp3arm9cS9dDmpG0kZBxjye7yo7tCiMbI3XtQNqDY+Twdxy7ne4ETOHpSF6S1zlJKHcExK28ruJJPe+DXyt6jlAoDVgL7gUla6xI34xX1hM1ucy2wHd85Hi+zF1d0HO7hqIQQdYG7PagdOHpRABuBh5VSlwHPUvkefefyBvCgUipWKRUAzAb24ZhuXoZSKgJY47z2zZKcGhab3cay3SuY9e1zFNkcf/t4WbwY3yUeX29fD0cnhKgL3E1QTwNnEsQ/cUyQWA4MAf5WhevNAf6LIyGlA+2AsVpru1JqiFIqRynV2nnuVKArcD2Q7TyWo5R6owrXE3WUzbCz9vAmDmcm8kvyb54ORwhRB5nOlCo4H6WUD1Bceq2SUqopkFGXCxYqpdoCCatWrSI6OtrT4TR6JXYbAF7OIb0DJw+TW5xHz4gungxLCFGLEhMTGTlyJEA7rfXh8517wXtQSikvIBfoCew60661PvXHwhSNyeGMRF7b/D79o3oysduVADI7TwhxXhcc4nPe+znmzrlCnEtecT5HMhP58ehWSmxyO1EIcWHuJp15wONKKb+aDEY0LCfzMlzPu7ToyP2D/sJzo2fhZanSDltCiEbK3W+Kq4H+QJJSag+OIT8XrfXo6g5M1F92w86bWxax7shm5lz2CFHBEQAMbNXHw5EJIeoTdxNUIpVX1BWiArPJDCYTBnDw1BFXghJCiKo4b4JSSl0HfKq1/nMtxSPqqeTTaZgw0dK5Z94tPcYxVo0iUpKTEOJ3utA9qI9wbEUEgFJqT6l1SkIAsDVpB39f8RT/2bKQM8sWAn0CJDkJIf6QCyUoU7nX0VSxhpRo+Do1a0+Atx/hgc0pthVf+A1CCOEGSTaiylJOp7Pq0I/c3OMaTCYTgT4BvHDFYwRaAzwdmhCiAblQgjKcj/JtopGy2+08teZljueepHVIJEPbDgCQ5CSEqHYXSlAm4BOlVJHztS/wgVIqv/RJMs28YbPbHTtcmc1mzGYz13W9kl3p++gR0dnDkQkhGrILJaj3y71eWFOBiLppz/H9vPvzx1zW8RJGtb8YgGHtLmJYu4s8HJkQoqE7b4KS6eUiIz+bI1lJfHdwHSNjBmMylZ83I4QQNUMmSYgy0nNPkpiVTO/I7gAMbNWbwpJJDG7dV5KTEKJWyQawwiXldDr3fv0Yr2x8j5wix25WJpOJ4TGDsHpZPRydEKKxkR5UI1dsK8bb4g1ARGBzujTvSIhvsOw4LoTwOElQjZRhGHz022esPvQjcy57hKZ+TTCZTMwa+ldXQUEhhPAkGeJrpEwmE6mnj5NdmMOWxO2udklOQoi6QnpQjURydiqf7/2WK2JH0LpJFAA39BjLVZ1G0TGsnYejE0KIiiRBNRJf7/+e1QkbKDFs/HXAnwCIDAr3bFBCCHEekqAaoBJbCT8d+4XwwGbENosBYKy6FLvdzlWdLvVwdEII4R65B9UArTjwA69seo8lu5e72loENmNKv5td9ZqEEKKukwRVz9ntdral7GRH6h5X29A2A4gJbc2A6F6u+kxCCFHfyBBfPfdT4s+89NO7tA9t49q8Ndg3iOdGz/JwZEII8cdIgqpH8osL2JS4DRMm12at/SJ7EhPamv7RvbDb7ZjN9btTbBgGGHaw2zGcP51HnD9NYHI8TGYzmC2YTPX73yyEqJwkqHrkUMZR5m/+gOYBYQxp2x+zyYzVy+qx3pJh2LEX5GLPz8FWkOt4XpCDvTDP8SjIw16Uj1GUj72oAHtRAUZxIUZxAfbiQoySYsfDVoRhK8GwlcDv2cHCZAazGZPFG5OXNyaLFyYvK2ZvKyYvH0zePpi9fTBZfTF7+2Ly8cNs9cXs41/24RuA2TcQi28AZt8ATBb57yGEJ8n/wDoqMTuFpbtXEGwN4E+9rwOgc/MO9I/uRVxEV+yGgbma9261lxRhz83ClpuFLe/Mz2zXw56XjS3/NPb8086fudRM/UqTo2dkNjuSj6lUOwYYjodht4Hd5uhx2eyOJFeUf57PrWIUVj8sfoGOpOUfhNkvCItfEGb/YCx+QVgCQs6+9g/B4h8kSU2IaiT/m+qI04U55BTlnZ1lZ8D6I5sJtAYwqde1WMwWzCYzfx88tUqfay8pwpabiS0n05FwcjIcr3Ozyvwsyc3C+P/2zj1MrqJK4L/bPe+ZzGQCkSQQAgI5LuCGGARlCU9Xo0RwWRZwARdhWRC+b0VWw3MVazI6XQAAESFJREFUPh4uiCDsylORzw0+QGFZUIKuEh4iQuShEDzhIcEkJJCQZDKZd3fvH6duz53OvBJmejrT5/flfrduVd17qyvTdfqcOlWns22r222aR4NpH7VB+wgaSVRdR6q6llSVHabBJDSaiqpwVBKlKyGdJkrZMVxik2CsfZkm1k22u4tcTzi6O4P21hE0uXaynUGz6wjaXqdpgL2a4GZyXe30dLXDxneG3x+1DaRjgVXfRLquiVQ4p+ubSNfHZRNNS/Md4h1nQFxAlQBLVr7AN35zK7On7ssFc88GYJemqZwx5x/54JQPkC4YsHOZbjKbW4KAMSHT07qh9zqRznZsHn5DUun8oGrnRtJ1jaTqetN9NInahq0SJqNBFEUQBaFWWT1iz83lsuQ628m0byLT3prQGjclNMo4bZpmtr01f3SvWzX0S1IV1qd9BFdTX+EWl9c1kqqqGbHP5zjbAy6gisyyta+z6NVHmbnD7szb6zAAdm+eTjpKQVcHbctfIte+iczmjezftpHMq39iTWxuC0e2o3X4L0ylbcBraKaiYWIYDCeSbpho5/i6volUTYP/og9EUYoozEVVNg/vnlw2Y/NxbeHHQ1tLwlza0ms2DWW5zjYyre+SaX13eG2qqOr7g6G+MZgYzbyYrm0kVRf/eJhAurbBTY7Odo3/9Y4w2e7OvOPA2pbVLF37GtOiaqZlU2Q7WnmjZQVPdCznrT8/yz6/vi//y/urZKnKvcXqp34z9EuiVO8v77ygmZgXPBX5dDOp2nr3cisSUayB1jfB5OlD1s/P+fURZAmBFgu5thaymzeS6+mip2UttKwdfpuq60jXNJjAqgvzaQmTbKqmvvc6PqrrSVXXjrl27DguoAahZ9N6Ole9QrarjWxne1/vtM7NfdJd7a2synawQ2cnNVlzHFg0qZ7Fk+o5dP1mPrnOTG07pyLmT6hhZlsX3d2Z/LtqaurDr+PGvnMYsakt1nbqmkjVTXChMw5IVVSRappMRdPkIevmcjlyXR15c2LSaSVvbmwP+XmzZCu5zjZ6Ottg49tb3b6oqjbMMQYvx6qQrqoNc4t1RNU1YY6xxurn0+YxGadd2DnbQlEFlIikgCuA04F64AngTFVdPkD92cC3gf2AtcC1qnpjMdqay+VY+b0FZDZtaX7JAOsq00zuzuQdzO6c2oTWN3Lymk3MylaTqm3gr+qqeZtudttpZ5r23IVU7QR2rJ3AjGCGSXqEuSnGGYwoisw9vrqWyuYpw7rHlgG0ke1ozc+j9aZbLR0vDejY3Fu3s41cZxu5rnYyXe1kNq177x8gXWEu/rGDTKGzTFgSYEsDguNM3onGrlMJh5p8ebqCqKIS0pVEFRVWlq7IH6Qq3Gy9HVPsUXEB8FngEGAlcB3wgIjsp6rZZEURaQQWATcBR2BC6uciskpVfzLaDY2iiKYD5rNu+R/YWFXFrjXNYYCo56LVT7Cup51r9zmB9zVNIVVTxz5vPkXL6heZ9JHTmDHjwwBMBw4f7YY6zgBEUYp0bQPp2oZhz6PF5LIZ83js3EwuaT3oDNaErpDX1WHlXSHd1espmevutPVuXR2Q6SGbaYWOVjJDv35kScUCK90rtNJpolRF8BytMA0vn05ZnVQK0hV9F4THXqaplJ2jVO91vB4vsmsri5dKRPl0FK7z9xSUW514QXooi9NQUB4OovAs+tYL55DofRbJe0k8o7deMt/+hfxUBRUNE4vyX1dsAXUWcLWqKoCILADWAAcDjxXUPRZTVi4PwuspEbkdOBsYdQEFkJ11KBcuX8QE6vnOvAX5X2K7PLqCVMsaOqbsSk3YLfyEHadzYnR8MZrlOKNOlEqTrqknXVP/np+Vy+XIZbrDIu0gtPqku8j1JNPx0U2up4tsIp3L9FidTLcdPXYm0xPSvUsNcj3dYVeSHnLZHnLdI9AxDgDNc0+g+ZDRH++KJqBEpAmYASyJ81R1g4i8imlHhQJqFvBcgWa1BDhjtNsa01zTxA51zUyqaaKjp5PaSnPzPX/uOVtEnnUzguP0TxRFRBVVUFEFtROK+m7bLitDricIqXi9XDZj6WyGXCZDLhune8hlg1DL2CJwWxCetfuz2bDuLlkWp+MtujK9W3Xlt+3KbZHOZbNA1haeJ+rn4u29ctmwID1LcoE65OwZifxcomyLesmyZF7+HfTmW6eF59D7/ER+lEpTOWlqUf7/iqlBNYbzhoL8DYmywvrDrTsqRFHETfOv3EL4eFh0x9k+iKIUpG0bLGf7o5iuYC3h3FSQPzFRVlh/uHVHDdeMHMdxxoaiCShV3QgsB/aP84LZbw/g+X5ueQGYHTz/YuYMUNdxHMcZZxR7Mc0twFdEZKaI1ANXA8swd/NC7sVMkBeLSLWIHIDNP91ctNY6juM4Y0axBdQ1wN2YQHob2B04WlWzIjJXRFpFZFcAVW0B5gGfwuaefgpcpqr3FLnNjuM4zhhQVDfz4JF3YTgKyx4HGgryngM+WpzWOY7jOKWE75fjOI7jlCQuoBzHcZySZLxvAJcGWL169Vi3w3Ecx6HPeDzkgtLxLqCmApx00klj3Q7HcRynL1OB1warMN4F1DPAXOAtKP4elY7jOM4WpDHh9MxQFaP8/kuO4ziOU0K4k4TjOI5TkriAchzHcUoSF1CO4zhOSeICynEcxylJXEA5juM4JYkLKMdxHKckcQHlOI7jlCQuoBzHcZySxAWU4ziOU5KM962OtpkQav4K4HSgHguyeKaqLh/Tho0iInI1MB+YDrQCDwELVHVdos5s4NvAfsBa4FpVvXEMmls0ROQ+4DPA4aq6OOR9DPgmsBewArhEVe8es0aOMiJyKPZ9mA10AY+r6jGhrCz6QkR2Aq4HPgZUAUuBC1T1sVA+LvtBRE4EzgFmARNUNSooH3RMEJFa4FvAP2Ay5yHgC6r67lDvdg1qYBYAnwUOAaYAbwIPBME1XskAJwM7YH9s04E740IRaQQWAQ8Dk4DjgUtF5Liit7RIiMjngLqCvN2A/wVuBCYC5wF3isiBRW9gERCRQ7DPewswGfs+XBnKdqN8+uImYBqwN/Yd+SnwMxGZOM77YT322c8tLBjmmHA9MAfYF5iBBab9/nBe7BrUwJwFXK2qCiAiC4A1wMHAY2PZsNFCVS9KXL4tIjcCP0jkHYsJsctDdOSnROR24GzgJ8VraXEQkV0wreFgIKk5nwr8UVW/G64fFJEHgDOB3xW1kcXhP4DbVPWuRN7T4Xwq5dMXe2L9sBZARG4FrgX2AD7NOO0HVX0YQEQO66d40DEhaE//BByrqqvCc74MLBWRXVX1zcHePZ61gW1GRJowSb8kzlPVDcCrmGZRLhwJvJC4ngU8F/4QY5YwDvtERCLgDuCKfr5Es0j8bQTGaz/UAweG9BIRWScivxWRI0OVsukL4GrgWBGZIiKVmNlrGfAi5dUPSYYaE2YCNfQdS18G2hhG37iA6p/GcN5QkL8hUTauEZHjgX8GvpjIbqR8+uQLQKSqt/VTVk790IyNEycDZ2DmvTswc/f7Ka++eBLoxsL3tGNmvFNVtZPy6ockQ33u9zSWuomvf1rCuakgf2KibNwSJkVvBo5W1WcTRS3ATgXVx12fiMgewL8DHxmgSgvl87exKZzvUNXnQvp2ETkX+ARl0hdh7vlXwCPYXMsm4CjgIRGZS5n0Qz8MNSYkx9K1A9QZENeg+kFVN2JzDvvHecHstwfw/Fi1qxiIyOnYhOh8VX2koPgFYHaBo8gcxl+fzMUmwX8vImtFJP5i3S8iN2P9sH/BPeOxH+LvwutAYeC4+Lpc+qIZeD9wg6quV9UeVb0f65uPUz79UMhQY8IyoIO+Y+kHMMej5PRBv3jAwgEQkQswk8YngZWY++hBwH4F9tZxg4j8K/BVYJ6qFtrTY4+dV4D/Aq7B7M8PAWep6j3FbOtoIiJ12K/kJH/BPJT+D/v19xI2B7EQ+FvgHuAIVd2uJ8T7Q0TOA76MaUxLgc8B/4l5ZUWUSV+IyFLgceAr2DKM+dhn/QT2g3Zc9oOIpIFKzKP5YaA2FHVhHnmDjgkicgvwIeAYTFh9H0ip6lFDvdtNfANzDaaWPkHvOqijx6twCtwA9ACLRSSZv7eqvqmqLSIyD9OwLsJU9svGk3ACUNU2bBI3T+iPd1R1PbBeRI4GrsP6YgVw2vY+EA3C9dhA9HA4vwQcpapvAJRRXxwDfANzlqrBhNI5ibVx47UfTgG+l7huD+fDVXXxMMaEL2Fjy1Is3PsizEt6SFyDchzHcUoSn4NyHMdxShIXUI7jOE5J4gLKcRzHKUlcQDmO4zgliQsox3EcpyRxAeU4juOUJL4OynGGIOzi/AgwXVVXjFEbdsFW3s8arA0ikgNOUdWFRWrXDOBZYF9VfasY73TKBxdQTlkTBvTBWI7tyDwVeHv0WzQgXwcWjpWAHAhVXS4iPwYuxzYXdpwRwwWUU+5MTaQPwoLQfQjbsRogo6pdwOpiNyxGRKYCJ1C6oRu+AzwpIhfEsZIcZyRwAeWUNaqaFzwiEoegfqcg/zASJr7E9VHYruf70btHHcCtmJB7EQvHsDTxrDmYNnQQtmXM48CXVDUZELGQE4A3ks8Jzzoc20JmJrYp5xcLbxSRK7GgcjOAdcDPgPNVdaOITABWAWeq6g8S9+yGbYJ6qKo+LiLHAJcCgu2/tizc81zow2dFZA1wHBZ113FGBHeScJxt50rgYmz35i7gh1iYkq8l8vJ7mInI3sCjwG+x3Z2PwKKR/lJEagZ5z6H0RrCNnzUNeBD4PSYM/w0TVoW0A/+ChSk/FTgMC0uOqm7CIiafUXDP6cCfgnCagm16+kNgH+CjwLewPRuT/A44fJDP4DhbjWtQjrPtXKaqvwYQkeuAu4HjVPVXIe+bwL0i0qCqrcAC4EFV/Vr8ABE5GVgPzAP+Z4D37I5t1JrkbGxjzjNUtQcLoX0R8ECykqpekbh8Q0QuBH4kIp8PGx/fioUV2UtVXwk7V38e270fzARaCdwdbw4LvNxPG1dgYUocZ8RwAeU4204ynk1sEvxDP3nvw8IzfBjYU0RaC55TA+w1yHtqsTAFSfYGng7CKeaJwhtF5FjgXGBPLIJpCqjCIuOuCua5JZiDw/lYeJkdsZAI8ed5GHhRRH4JLAbuVdW/FLyqg94wDI4zIriJz3G2ne5EOjdIXipx/m9szip5zMQcDQbiHbaMTzUkInIgZp57DPg7zBQYhzmoSlS9BThVRCoxQXWvqq4DUNUMJrSOAJ4B/h5YJiLzC143KbTTcUYM16Acp3gsAf4aeE1VtybOzbNYcMAkS4FTRCQdhAjA3xTUORhYq6qXxBkiclw/z/8RFsfoTMzx4+PJwtDWp8NxlYgswsyADyaqfRB4cis+k+MMiQsoxykeV2GD/EIRuQHTOHYDPoOFEn99gPt+DpwmIrWqGgeLuxk4D7hNRK4FpmFOG0kUmCwip2Nehwdjc1d9K6luFpGF2LzTn1X1kbhMRA4CjgR+gbne74UJ2e8m6kzAnEIuHmY/OM6wcBOf4xQJVX0Zcy+Po9MuBW7H5m42DHLrL4A1mJkuftZK4NPAAcDzmAffeQXvexATWlcBfwROxMKV98dtmNnv9oL8jZjn3v1YaO87gLuwhbkxx2Fu8IsH+QyOs9V4RF3H2Q4QkVOw0NlzttI8ONznfwq4D1vrNewdM0QkhTmLXKGqPx7pdjnljZv4HGf7YCHmeTcNWDlSDxWROszL8FLgrq0RToGdgTtdODmjgWtQjlPGiMilwCXY3NgxquqeeE7J4ALKcRzHKUncScJxHMcpSVxAOY7jOCWJCyjHcRynJHEB5TiO45QkLqAcx3GckuT/AdU0ateF92ATAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rsPmbuGZeIcB" + }, + "source": [ + "### Using a DataFrame" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "i9Mi1gZveIcC" + }, + "source": [ + "Instead of making three `TimeSeries` objects, we can use one `DataFrame`.\n", + "\n", + "We have to use `row` to selects rows, rather than columns. But then Pandas does the right thing, matching up the state variables with the columns of the `DataFrame`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "UzhUuyVxeIcC" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.row[system.t0] = system.init\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vYe_a733eIcE" + }, + "source": [ + "Here's how we run it, and what the result looks like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "MG58AeO6eIcF", + "outputId": "1c6dfa5a-3c9a-4b52-d019-768b1a1b3e04" + }, + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)\n", + "results = run_simulation(system, update_func)\n", + "results.head()" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SIR
00.9888890.0111110.000000
10.9852260.0119960.002778
20.9812870.0129360.005777
30.9770550.0139340.009011
40.9725170.0149880.012494
\n", + "
" + ], + "text/plain": [ + " S I R\n", + "0 0.988889 0.011111 0.000000\n", + "1 0.985226 0.011996 0.002778\n", + "2 0.981287 0.012936 0.005777\n", + "3 0.977055 0.013934 0.009011\n", + "4 0.972517 0.014988 0.012494" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "g5K2UQCXeIcG" + }, + "source": [ + "We can extract the results and plot them." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "wluBwjiJeIcI", + "outputId": "6b43825b-c11c-4124-80fd-fce5ca625077" + }, + "source": [ + "plot_results(results.S, results.I, results.R)" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HhRNJunbeIcK" + }, + "source": [ + "## Exercises\n", + "\n", + "**Exercise** Suppose the time between contacts is 4 days and the recovery time is 5 days. Simulate this scenario for 14 weeks and plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "IPrd-XbGeIcL", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "outputId": "226ae363-50e2-48c5-ced9-8281d2ebf272" + }, + "source": [ + "tc = 4 # time between contacts in days \n", + "tr = 5 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system2 = make_system(beta, gamma)\n", + "results1 = run_simulation(system2, update_func)\n", + "\n", + "plot_results(results1.S, results1.I, results1.R)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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Aw88QHR0NGBbQf2xxx5j1apVmEwmZs6ceZI/tbYnCUq0GYPBgKd73T/BQD8P+vcIZse+XMeQ9a7B3kwYGs1ZQ7oR7C+jAEXb+PTTT3n++eeJiIjgiSeeYO7cuXz//fdMnTqViIgIrrnmGrZs2eKo/+CDD5KTk8N7771HcHAwH330ETNnzmTlypX4+fnx4Ycf8sILL7Bo0SKGDh1KWVkZWmsAvvrqKyZMmMBXX33l6OKzWq3ccssthIeHs3z5cry8vHjhhReYNWsWn3/+OW5ubjz55JNorfniiy/w9fXlscceIysrq8nvp6NwOkEppXoC44AwGg2u0Fo/3MxxiU6odrv6jEOlrNqYwqqNKWTklrJ0xS427szimdtHt3WIohmdaIumLVx//fV069YNgMsvv5ylS5eSn5/v2MG2vvz8fJYvX853333n2B7+6quvZunSpfzwww9ceOGF/N///R833ngjI0aMAMDX15fExMQj3v/PP/9k69at/Pbbb3h62v5Qu/POO3nvvffYtm0bgwcP5r///S8vvfSS457z589n+fLlzfpzaG1OJSil1AzgDaAcyAbqD72yApKgRLPpGuLN36acxpVn92Hr7my++y2FwapuK+2DWcV8uyGZScNiDlvoVoiWUH8rdy8vL8DWpdZUgkpJSQE4bEHX6upqR4smLS2N2NhYp++fnJxMdXU1o0aNalBuNpvJzMwkLy+PqqqqBoMqfHx8moyvI3G2BfUA8BRwv9bacqzKQjQHF6OBhD5hJPQJa1D+7YZk/vvTPv770z5O6x7EpGExjBwUgYe79FiLthcSEgLA//73P0drprHIyEiSkpIYM2bMYcdqt21vfE0PDw/Wr1+Pq+vh/84tFgsmk4m0tDR69OgB2BJofn7+yXwrbc7ZeVDhwJuSnER7MDo+kknDYvB0d+GvpDye/2gL1yxYycufbmNvakFbhyc6ucjISM466ywWLFhAWloaACUlJfz0009kZ2cDcM011/D666/z22+/YTabKS4uZtOmTQAEBQVhNBo5cOCA45oJCQnExcWxYMECcnNzASgsLGTlypWUl5djNBq54IILePHFF8nKyqK8vJyFCxe28nfe/JxNUKuB+JYMRAhn9YoO5NbLTuedBydz22Wn0ycmkPLKGr5Zl8TXaw8c83whWtqiRYs47bTTuP7664mPj2fy5Ml88skn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/colab/chap12.ipynb b/colab/chap12.ipynb index ef6f4478e..69043dfb0 100644 --- a/colab/chap12.ipynb +++ b/colab/chap12.ipynb @@ -1,887 +1,1434 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 12" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code\n", - "\n", - "Here's the code from the previous notebook that we'll need." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State with variables S, I, R\n", - " t: time step\n", - " system: System with beta and gamma\n", - " \n", - " returns: State object\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " frame = TimeFrame(columns=system.init.index)\n", - " frame.row[system.t0] = system.init\n", - " \n", - " for t in linrange(system.t0, system.t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Metrics" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given the results, we can compute metrics that quantify whatever we are interested in, like the total number of sick students, for example." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's an example.|" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "beta = 0.333\n", - "gamma = 0.25\n", - "system = make_system(beta, gamma)\n", - "\n", - "results = run_simulation(system, update_func)\n", - "print(beta, gamma, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Write functions that take a `TimeFrame` object as a parameter and compute the other metrics mentioned in the book:\n", - "\n", - "1. The fraction of students who are sick at the peak of the outbreak.\n", - "\n", - "2. The day the outbreak peaks.\n", - "\n", - "3. The fraction of students who are sick at the end of the semester.\n", - "\n", - "Note: Not all of these functions require the `System` object, but when you write a set of related functons, it is often convenient if they all take the same parameters.\n", - "\n", - "Hint: If you have a `TimeSeries` called `I`, you can compute the largest value of the series like this:\n", - "\n", - " I.max()\n", - "\n", - "And the index of the largest value like this:\n", - "\n", - " I.idxmax()\n", - "\n", - "You can read about these functions in the `Series` [documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### What if?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use this model to evaluate \"what if\" scenarios. For example, this function models the effect of immunization by moving some fraction of the population from S to R before the simulation starts." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def add_immunization(system, fraction):\n", - " \"\"\"Immunize a fraction of the population.\n", - " \n", - " Moves the given fraction from S to R.\n", - " \n", - " system: System object\n", - " fraction: number from 0 to 1\n", - " \"\"\"\n", - " system.init.S -= fraction\n", - " system.init.R += fraction" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start again with the system we used in the previous sections." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "system = make_system(beta, gamma)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And run the model without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "results = run_simulation(system, update_func)\n", - "calc_total_infected(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now with 10% immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "system2 = make_system(beta, gamma)\n", - "add_immunization(system2, 0.1)\n", - "results2 = run_simulation(system2, update_func)\n", - "calc_total_infected(results2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "10% immunization leads to a drop in infections of 16 percentage points.\n", - "\n", - "Here's what the time series looks like for S, with and without immunization." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plot(results.S, '-', label='No immunization')\n", - "plot(results2.S, '--', label='10% immunization')\n", - "\n", - "decorate(xlabel='Time (days)',\n", - " ylabel='Fraction susceptible')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep through a range of values for the fraction of the population who are immunized." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 11)\n", - "for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " print(fraction, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This function does the same thing and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_immunity(immunize_array):\n", - " \"\"\"Sweeps a range of values for immunity.\n", - " \n", - " immunize_array: array of fraction immunized\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for fraction in immunize_array:\n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " results = run_simulation(system, update_func)\n", - " sweep[fraction] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "immunize_array = linspace(0, 1, 21)\n", - "infected_sweep = sweep_immunity(immunize_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what the results look like." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Fraction immunized',\n", - " ylabel='Total fraction infected',\n", - " title='Fraction infected vs. immunization rate',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If 40% of the population is immunized, less than 4% of the population gets sick." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Logistic function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", - " \"\"\"Computes the generalize logistic function.\n", - " \n", - " A: controls the lower bound\n", - " B: controls the steepness of the transition \n", - " C: not all that useful, AFAIK\n", - " M: controls the location of the transition\n", - " K: controls the upper bound\n", - " Q: shift the transition left or right\n", - " nu: affects the symmetry of the transition\n", - " \n", - " returns: float or array\n", - " \"\"\"\n", - " exponent = -B * (x - M)\n", - " denom = C + Q * exp(exponent)\n", - " return A + (K-A) / denom ** (1/nu)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following array represents the range of possible spending." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "spending = linspace(0, 1200, 21)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", - "\n", - "`M` is chosen so the transition happens around \\$500.\n", - "\n", - "`K` is the maximum reduction in `beta`, 20%.\n", - "\n", - "`B` is chosen by trial and error to yield a curve that seems feasible." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_factor(spending):\n", - " \"\"\"Reduction factor as a function of spending.\n", - " \n", - " spending: dollars from 0 to 1200\n", - " \n", - " returns: fractional reduction in beta\n", - " \"\"\"\n", - " return logistic(spending, M=500, K=0.2, B=0.01)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "percent_reduction = compute_factor(spending) * 100\n", - "\n", - "plot(spending, percent_reduction)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Percent reduction in infection rate',\n", - " title='Effect of hand washing on infection rate',\n", - " legend=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Modify the parameters `M`, `K`, and `B`, and see what effect they have on the shape of the curve. Read about the [generalized logistic function on Wikipedia](https://en.wikipedia.org/wiki/Generalised_logistic_function). Modify the other parameters and see what effect they have." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Hand washing" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can model the effect of a hand-washing campaign by modifying `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def add_hand_washing(system, spending):\n", - " \"\"\"Modifies system to model the effect of hand washing.\n", - " \n", - " system: System object\n", - " spending: campaign spending in USD\n", - " \"\"\"\n", - " factor = compute_factor(spending)\n", - " system.beta *= (1 - factor)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's start with the same values of `beta` and `gamma` we've been using." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "tc = 3 # time between contacts in days \n", - "tr = 4 # recovery time in days\n", - "\n", - "beta = 1 / tc # contact rate in per day\n", - "gamma = 1 / tr # recovery rate in per day\n", - "\n", - "beta, gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can sweep different levels of campaign spending." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "spending_array = linspace(0, 1200, 13)\n", - "\n", - "for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " print(spending, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's a function that sweeps a range of spending and stores the results in a `SweepSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_hand_washing(spending_array):\n", - " \"\"\"Run simulations with a range of spending.\n", - " \n", - " spending_array: array of dollars from 0 to 1200\n", - " \n", - " returns: Sweep object\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for spending in spending_array:\n", - " system = make_system(beta, gamma)\n", - " add_hand_washing(system, spending)\n", - " results = run_simulation(system, update_func)\n", - " sweep[spending] = calc_total_infected(results)\n", - " \n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "spending_array = linspace(0, 1200, 20)\n", - "infected_sweep = sweep_hand_washing(spending_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's what it looks like." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Hand-washing campaign spending (USD)',\n", - " ylabel='Total fraction infected',\n", - " title='Effect of hand washing on total infections',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's put it all together to make some public health spending decisions." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Optimization" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Suppose we have \\$1200 to spend on any combination of vaccines and a hand-washing campaign." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "num_students = 90\n", - "budget = 1200\n", - "price_per_dose = 100\n", - "max_doses = int(budget / price_per_dose)\n", - "dose_array = linrange(max_doses, endpoint=True)\n", - "max_doses" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can sweep through a range of doses from, 0 to `max_doses`, model the effects of immunization and the hand-washing campaign, and run simulations.\n", - "\n", - "For each scenario, we compute the fraction of students who get sick." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " print(doses, system.init.S, system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following function wraps that loop and stores the results in a `Sweep` object." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_doses(dose_array):\n", - " \"\"\"Runs simulations with different doses and campaign spending.\n", - " \n", - " dose_array: range of values for number of vaccinations\n", - " \n", - " return: Sweep object with total number of infections \n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " \n", - " for doses in dose_array:\n", - " fraction = doses / num_students\n", - " spending = budget - doses * price_per_dose\n", - " \n", - " system = make_system(beta, gamma)\n", - " add_immunization(system, fraction)\n", - " add_hand_washing(system, spending)\n", - " \n", - " results = run_simulation(system, update_func)\n", - " sweep[doses] = calc_total_infected(results)\n", - "\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can compute the number of infected students for each possible allocation of the budget." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_doses(dose_array)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "plot(infected_sweep)\n", - "\n", - "decorate(xlabel='Doses of vaccine',\n", - " ylabel='Total fraction infected',\n", - " title='Total infections vs. doses',\n", - " legend=False)\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", - "\n", - "How might you incorporate the effect of quarantine in the SIR model?" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap12.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "5c8c3_2Gy90k" + }, + "source": [ + "# Chapter 12" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "31uS9v5Oy90l" + }, + "source": [ + "*Modeling and Simulation in Python* Edit by Chun San Yip\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "oWw4XQPdy90p" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4aRzeoray90q" + }, + "source": [ + "### Code\n", + "\n", + "Here's the code from the previous notebook that we'll need." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zKlDEpLpy90r" + }, + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "kjElw76hy90s" + }, + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, R\n", + " t: time step\n", + " system: System with beta and gamma\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "GOjWAuB-y90t" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " frame = TimeFrame(columns=system.init.index)\n", + " frame.row[system.t0] = system.init\n", + " \n", + " for t in linrange(system.t0, system.t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9noC6B37y90t" + }, + "source": [ + "### Metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gMhR0bdRy90u" + }, + "source": [ + "Given the results, we can compute metrics that quantify whatever we are interested in, like the total number of sick students, for example." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zi_CXjtEy90x" + }, + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kBcIWpK-y900" + }, + "source": [ + "Here's an example.|" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CtSBm4YFy900", + "outputId": "fc89f10e-b866-4bd6-b175-9e6a0c34493e" + }, + "source": [ + "beta = 0.333\n", + "gamma = 0.25\n", + "system = make_system(beta, gamma)\n", + "\n", + "results = run_simulation(system, update_func)\n", + "print(beta, gamma, calc_total_infected(results))" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.333 0.25 0.46716293183605073\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Bh-4aGwXy901" + }, + "source": [ + "**Exercise:** Write functions that take a `TimeFrame` object as a parameter and compute the other metrics mentioned in the book:\n", + "\n", + "1. The fraction of students who are sick at the peak of the outbreak.\n", + "\n", + "2. The day the outbreak peaks.\n", + "\n", + "3. The fraction of students who are sick at the end of the semester.\n", + "\n", + "Note: Not all of these functions require the `System` object, but when you write a set of related functons, it is often convenient if they all take the same parameters.\n", + "\n", + "Hint: If you have a `TimeSeries` called `I`, you can compute the largest value of the series like this:\n", + "\n", + " I.max()\n", + "\n", + "And the index of the largest value like this:\n", + "\n", + " I.idxmax()\n", + "\n", + "You can read about these functions in the `Series` [documentation](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.html)." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mRHSnT9-y901", + "outputId": "fb43149c-5dc0-44c1-f22e-6f1fd3e6bb7e" + }, + "source": [ + "def student_peak_at_outbreak(results):\n", + " \"\"\"The fraction of students who are sick at the peak of the outbreak.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return results.I.max()\n", + "\n", + "print(student_peak_at_outbreak(results))" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.043536202687592354\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VksIvXdoy901", + "outputId": "30a107da-5d7b-407f-e978-c50e54c149a8" + }, + "source": [ + "def day_at_outbreak_peak(results):\n", + " \"\"\"The day the outbreak peaks.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return results.I.idxmax()\n", + "\n", + "print(day_at_outbreak_peak(results))" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "30\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gStaeArvy902", + "outputId": "6d1d5643-15de-4af2-bf7f-c517a636bb56" + }, + "source": [ + "def student_infected_at_end(results):\n", + " \"\"\"The fraction of students who are sick at the end of the semester.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_last_value(results.I)\n", + "\n", + "print(student_infected_at_end(results))" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.0006741943156034474\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "45k0GUyEy902" + }, + "source": [ + "### What if?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TyxUn9XBy903" + }, + "source": [ + "We can use this model to evaluate \"what if\" scenarios. For example, this function models the effect of immunization by moving some fraction of the population from S to R before the simulation starts." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "bBAXyqB7y903" + }, + "source": [ + "def add_immunization(system, fraction):\n", + " \"\"\"Immunize a fraction of the population.\n", + " \n", + " Moves the given fraction from S to R.\n", + " \n", + " system: System object\n", + " fraction: number from 0 to 1\n", + " \"\"\"\n", + " system.init.S -= fraction\n", + " system.init.R += fraction" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hCcu4JSzy903" + }, + "source": [ + "Let's start again with the system we used in the previous sections." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HziWMX8Yy903" + }, + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "system = make_system(beta, gamma)" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3FsI6wayy905" + }, + "source": [ + "And run the model without immunization." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "plmhij1iy905", + "outputId": "cfe32d14-4d0e-4ce3-b8cb-49cf59834ff9" + }, + "source": [ + "results = run_simulation(system, update_func)\n", + "calc_total_infected(results)" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.468320811028781" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XIqiuHHMy905" + }, + "source": [ + "Now with 10% immunization." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "51A5sPrzy905", + "outputId": "13e0809c-0b0f-49ba-b4ef-ae0d54614856" + }, + "source": [ + "system2 = make_system(beta, gamma)\n", + "add_immunization(system2, 0.1)\n", + "results2 = run_simulation(system2, update_func)\n", + "calc_total_infected(results2)" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "0.30650802853979753" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 13 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VE9IVf1sy905" + }, + "source": [ + "10% immunization leads to a drop in infections of 16 percentage points.\n", + "\n", + "Here's what the time series looks like for S, with and without immunization." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "DPEWH4cjy905", + "outputId": "666bf32f-b26e-4fd7-e338-6d5e24383b8b" + }, + "source": [ + "plot(results.S, '-', label='No immunization')\n", + "plot(results2.S, '--', label='10% immunization')\n", + "\n", + "decorate(xlabel='Time (days)',\n", + " ylabel='Fraction susceptible')\n", + "\n" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rLGYl4h9y906" + }, + "source": [ + "Now we can sweep through a range of values for the fraction of the population who are immunized." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hTxW87Hdy906", + "outputId": "4e60cd81-4e5d-41de-e88d-98037c57c9c0" + }, + "source": [ + "immunize_array = linspace(0, 1, 11)\n", + "for fraction in immunize_array:\n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " results = run_simulation(system, update_func)\n", + " print(fraction, calc_total_infected(results))" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.0 0.468320811028781\n", + "0.1 0.30650802853979753\n", + "0.2 0.16136545700638427\n", + "0.30000000000000004 0.0728155898425179\n", + "0.4 0.03552021675299155\n", + "0.5 0.019688715782459176\n", + "0.6000000000000001 0.011622057998337987\n", + "0.7000000000000001 0.006838737800619332\n", + "0.8 0.003696496253713877\n", + "0.9 0.0014815326722661948\n", + "1.0 -0.00016121210941239666\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m5JJdpWvy907" + }, + "source": [ + "This function does the same thing and stores the results in a `Sweep` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4ULWOKI5y907" + }, + "source": [ + "def sweep_immunity(immunize_array):\n", + " \"\"\"Sweeps a range of values for immunity.\n", + " \n", + " immunize_array: array of fraction immunized\n", + " \n", + " returns: Sweep object\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " \n", + " for fraction in immunize_array:\n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " results = run_simulation(system, update_func)\n", + " sweep[fraction] = calc_total_infected(results)\n", + " \n", + " return sweep" + ], + "execution_count": 16, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pN1624K_y907" + }, + "source": [ + "Here's how we run it." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "id": "DihZbO5ly908" + }, + "source": [ + "immunize_array = linspace(0, 1, 21)\n", + "infected_sweep = sweep_immunity(immunize_array)" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5LlD8ZRAy908" + }, + "source": [ + "And here's what the results look like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "vidwSYGny908", + "outputId": "6d999575-fc59-4a3d-d06c-3ed9e25c49c6" + }, + "source": [ + "plot(infected_sweep)\n", + "\n", + "decorate(xlabel='Fraction immunized',\n", + " ylabel='Total fraction infected',\n", + " title='Fraction infected vs. immunization rate',\n", + " legend=False)\n", + "\n" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "geef4Q5Xy909" + }, + "source": [ + "If 40% of the population is immunized, less than 4% of the population gets sick." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7Ny5nO1py909" + }, + "source": [ + "### Logistic function" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PYngoQzZy909" + }, + "source": [ + "To model the effect of a hand-washing campaign, I'll use a [generalized logistic function](https://en.wikipedia.org/wiki/Generalised_logistic_function) (GLF), which is a convenient function for modeling curves that have a generally sigmoid shape. The parameters of the GLF correspond to various features of the curve in a way that makes it easy to find a function that has the shape you want, based on data or background information about the scenario." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "-fViMb-sy909" + }, + "source": [ + "def logistic(x, A=0, B=1, C=1, M=0, K=1, Q=1, nu=1):\n", + " \"\"\"Computes the generalize logistic function.\n", + " \n", + " A: controls the lower bound\n", + " B: controls the steepness of the transition \n", + " C: not all that useful, AFAIK\n", + " M: controls the location of the transition\n", + " K: controls the upper bound\n", + " Q: shift the transition left or right\n", + " nu: affects the symmetry of the transition\n", + " \n", + " returns: float or array\n", + " \"\"\"\n", + " exponent = -B * (x - M)\n", + " denom = C + Q * exp(exponent)\n", + " return A + (K-A) / denom ** (1/nu)" + ], + "execution_count": 19, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2xx7lD_1y90-" + }, + "source": [ + "The following array represents the range of possible spending." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "2vZd484py90-" + }, + "source": [ + "spending = linspace(0, 1200, 21)" + ], + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nCkaD43Py90-" + }, + "source": [ + "`compute_factor` computes the reduction in `beta` for a given level of campaign spending.\n", + "\n", + "`M` is chosen so the transition happens around \\$500.\n", + "\n", + "`K` is the maximum reduction in `beta`, 20%.\n", + "\n", + "`B` is chosen by trial and error to yield a curve that seems feasible." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "oXW3I83hy90_" + }, + "source": [ + "def compute_factor(spending):\n", + " \"\"\"Reduction factor as a function of spending.\n", + " \n", + " spending: dollars from 0 to 1200\n", + " \n", + " returns: fractional reduction in beta\n", + " \"\"\"\n", + " return logistic(spending, M=800, K=0.3, B=0.02)" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "d4ckdPi7y90_" + }, + "source": [ + "Here's what it looks like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 299 + }, + "id": "a0Ay8gbUy91A", + "outputId": "8990f7cc-f654-49a2-ea70-c668c1ea11cb" + }, + "source": [ + "percent_reduction = compute_factor(spending) * 100\n", + "\n", + "plot(spending, percent_reduction)\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Percent reduction in infection rate',\n", + " title='Effect of hand washing on infection rate',\n", + " legend=False)" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "m2WOLLKey91A" + }, + "source": [ + "**Exercise:** Modify the parameters `M`, `K`, and `B`, and see what effect they have on the shape of the curve. Read about the [generalized logistic function on Wikipedia](https://en.wikipedia.org/wiki/Generalised_logistic_function). Modify the other parameters and see what effect they have." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7q3c6mf3y91B" + }, + "source": [ + "### Hand washing" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wFRIn5CVy91C" + }, + "source": [ + "Now we can model the effect of a hand-washing campaign by modifying `beta`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "SzxAlqsIy91D" + }, + "source": [ + "def add_hand_washing(system, spending):\n", + " \"\"\"Modifies system to model the effect of hand washing.\n", + " \n", + " system: System object\n", + " spending: campaign spending in USD\n", + " \"\"\"\n", + " factor = compute_factor(spending)\n", + " system.beta *= (1 - factor)" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EA2kDZl8y91D" + }, + "source": [ + "Let's start with the same values of `beta` and `gamma` we've been using." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jQV4iKH6y91E", + "outputId": "be3247f9-1c52-41cc-fb9e-c28523c2c0f1" + }, + "source": [ + "tc = 3 # time between contacts in days \n", + "tr = 4 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "\n", + "beta, gamma" + ], + "execution_count": 24, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(0.3333333333333333, 0.25)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 24 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6DPlFHj8y91E" + }, + "source": [ + "Now we can sweep different levels of campaign spending." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ww5lKXJYy91E", + "outputId": "862628ad-bb0e-4d0a-a774-be62e2655dd3" + }, + "source": [ + "spending_array = linspace(0, 1200, 13)\n", + "\n", + "for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " print(spending, system.beta, calc_total_infected(results))" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.0 0.33333332207981714 0.46832077198853206\n", + "100.0 0.33333325018053056 0.468320522558319\n", + "200.0 0.3333327189158731 0.4683186795113009\n", + "300.0 0.33332879354646305 0.468305061505616\n", + "400.0 0.33329979832028667 0.4682044576115967\n", + "500.0 0.33308607101766985 0.4674621974283403\n", + "600.0 0.33153471233712417 0.4620374832742028\n", + "700.0 0.32141304113112157 0.4250046715283893\n", + "800.0 0.2833333333333333 0.261513667406984\n", + "900.0 0.24525362553554508 0.11125062945971698\n", + "1000.0 0.23513195432954248 0.08598331266129344\n", + "1100.0 0.2335805956489968 0.08269082384154103\n", + "1200.0 0.23336686834637993 0.08224852132489047\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8gVYp2Rdy91E" + }, + "source": [ + "Here's a function that sweeps a range of spending and stores the results in a `SweepSeries`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "axxGXg1Xy91E" + }, + "source": [ + "def sweep_hand_washing(spending_array):\n", + " \"\"\"Run simulations with a range of spending.\n", + " \n", + " spending_array: array of dollars from 0 to 1200\n", + " \n", + " returns: Sweep object\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " \n", + " for spending in spending_array:\n", + " system = make_system(beta, gamma)\n", + " add_hand_washing(system, spending)\n", + " results = run_simulation(system, update_func)\n", + " sweep[spending] = calc_total_infected(results)\n", + " \n", + " return sweep" + ], + "execution_count": 26, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cSLNoXk9y91F" + }, + "source": [ + "Here's how we run it." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zqNjlk_ly91F" + }, + "source": [ + "spending_array = linspace(0, 1200, 20)\n", + "infected_sweep = sweep_hand_washing(spending_array)" + ], + "execution_count": 27, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Nu8b9jQBy91G" + }, + "source": [ + "And here's what it looks like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "O1Iem6Ljy91G", + "outputId": "2d4df9dc-8b41-41ea-8ed4-06424614c717" + }, + "source": [ + "plot(infected_sweep)\n", + "\n", + "decorate(xlabel='Hand-washing campaign spending (USD)',\n", + " ylabel='Total fraction infected',\n", + " title='Effect of hand washing on total infections',\n", + " legend=False)\n", + "\n" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hf6GgM0Iy91G" + }, + "source": [ + "Now let's put it all together to make some public health spending decisions." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3-kwqK48y91G" + }, + "source": [ + "### Optimization" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SxBBDPo0y91H" + }, + "source": [ + "Suppose we have \\$1200 to spend on any combination of vaccines and a hand-washing campaign." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tnDuNKMjy91H", + "outputId": "8a8cb355-d095-473e-e6b8-7e966ece760c" + }, + "source": [ + "num_students = 90\n", + "budget = 1200\n", + "price_per_dose = 50\n", + "max_doses = int(budget / price_per_dose)\n", + "dose_array = linrange(max_doses, endpoint=True)\n", + "max_doses" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "24" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gCSx2Q0uy91H" + }, + "source": [ + "We can sweep through a range of doses from, 0 to `max_doses`, model the effects of immunization and the hand-washing campaign, and run simulations.\n", + "\n", + "For each scenario, we compute the fraction of students who get sick." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Qu7DCXBXy91H", + "outputId": "fa53a59d-c626-43b6-dd46-90ac8a257a99" + }, + "source": [ + "for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " print(doses, system.init.S, system.beta, calc_total_infected(results))" + ], + "execution_count": 30, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0 0.9888888888888889 0.23336686834637993 0.08224852132489047\n", + "1 0.9777777777777779 0.23342443845277341 0.07695257715711068\n", + "2 0.9666666666666667 0.2335805956489968 0.07224234951710895\n", + "3 0.9555555555555556 0.2340026184257618 0.0683071885722033\n", + "4 0.9444444444444445 0.23513195432954248 0.06567499152888823\n", + "5 0.9333333333333333 0.23807592065108998 0.06574286882783809\n", + "6 0.9222222222222223 0.24525362553554508 0.07220113833702513\n", + "7 0.9111111111111112 0.26022747547033287 0.09432844039568622\n", + "8 0.9 0.2833333333333333 0.14562678385483518\n", + "9 0.888888888888889 0.3064391911963338 0.20988945533534142\n", + "10 0.8777777777777778 0.32141304113112157 0.24713774714790726\n", + "11 0.8666666666666667 0.32859074601557664 0.2552512054753313\n", + "12 0.8555555555555556 0.33153471233712417 0.2482884325906145\n", + "13 0.8444444444444446 0.33266404824090484 0.23530743125104314\n", + "14 0.8333333333333334 0.33308607101766985 0.2203244703676367\n", + "15 0.8222222222222223 0.33324222821389327 0.20495051777277706\n", + "16 0.8111111111111111 0.33329979832028667 0.18983306561257984\n", + "17 0.8 0.33332099387573466 0.1752536492534772\n", + "18 0.788888888888889 0.33332879354646305 0.1613536699503726\n", + "19 0.7777777777777778 0.3333316631911485 0.148215681800571\n", + "20 0.7666666666666667 0.3333327189158731 0.13589133372385853\n", + "21 0.7555555555555555 0.33333310730090354 0.12441052574880618\n", + "22 0.7444444444444445 0.33333325018053056 0.11378456982033269\n", + "23 0.7333333333333334 0.3333333027431106 0.10400796340169594\n", + "24 0.7222222222222223 0.33333332207981714 0.09506029705383634\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mLmtXuzRy91I" + }, + "source": [ + "The following function wraps that loop and stores the results in a `Sweep` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "oG5zvlaay91J" + }, + "source": [ + "def sweep_doses(dose_array):\n", + " \"\"\"Runs simulations with different doses and campaign spending.\n", + " \n", + " dose_array: range of values for number of vaccinations\n", + " \n", + " return: Sweep object with total number of infections \n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " \n", + " for doses in dose_array:\n", + " fraction = doses / num_students\n", + " spending = budget - doses * price_per_dose\n", + " \n", + " system = make_system(beta, gamma)\n", + " add_immunization(system, fraction)\n", + " add_hand_washing(system, spending)\n", + " \n", + " results = run_simulation(system, update_func)\n", + " sweep[doses] = calc_total_infected(results)\n", + "\n", + " return sweep" + ], + "execution_count": 31, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "CgrMa4rZy91J" + }, + "source": [ + "Now we can compute the number of infected students for each possible allocation of the budget." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "wK4mY_VQy91J" + }, + "source": [ + "infected_sweep = sweep_doses(dose_array)" + ], + "execution_count": 32, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Xwz8LoBBy91J" + }, + "source": [ + "And plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "j2Ooaam1y91J", + "outputId": "53246b56-4658-4a53-949b-d09537716751" + }, + "source": [ + "plot(infected_sweep)\n", + "\n", + "decorate(xlabel='Doses of vaccine',\n", + " ylabel='Total fraction infected',\n", + " title='Total infections vs. doses',\n", + " legend=False)\n", + "\n" + ], + "execution_count": 33, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Uu1OtThXy91J" + }, + "source": [ + "### Exercises\n", + "\n", + "**Exercise:** Suppose the price of the vaccine drops to $50 per dose. How does that affect the optimal allocation of the spending?\n", + "\n", + "ANS: The total fraction infected droped to 10% with the maximum number of doses." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BQ9we9bEy91J" + }, + "source": [ + "**Exercise:** Suppose we have the option to quarantine infected students. For example, a student who feels ill might be moved to an infirmary, or a private dorm room, until they are no longer infectious.\n", + "\n", + "How might you incorporate the effect of quarantine in the SIR model?" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "QKzK6g5Oy91J", + "outputId": "344f0ad9-5200-4945-d45b-142adfd555bf" + }, + "source": [ + "def make_system2(beta, gamma, omega):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " omega: quarantee rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, Q=0, R=0)\n", + " init /= sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma, omega=omega)\n", + "\n", + "def update_func2(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State with variables S, I, Q, R\n", + " t: time step\n", + " system: System with beta, gamma and omega\n", + " \n", + " returns: State object\n", + " \"\"\"\n", + " s, i, q, r = state\n", + "\n", + " infected = system.beta * i * s\n", + " quarantined = system.omega * i \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - quarantined - recovered\n", + " q += quarantined - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, Q=q, R=r)\n", + "\n", + "tc = 4 # time between contacts in days \n", + "tr = 5 # recovery time in days\n", + "\n", + "beta = 1 / tc # contact rate in per day\n", + "gamma = 1 / tr # recovery rate in per day\n", + "omega = 1 / 2 # quarantine rate in per day\n", + "\n", + "system2 = make_system2(beta, gamma, omega)\n", + "results2 = run_simulation(system2, update_func2)\n", + "\n", + "#plot_results(results2.S, results2.I, results2.Q, results2.R)\n", + "print(results2)" + ], + "execution_count": 35, + "outputs": [ + { + "output_type": "stream", + "text": [ + " S I Q R\n", + "0 0.988889 1.111111e-02 0.000000 0.000000\n", + "1 0.986142 6.080247e-03 0.003333 0.002222\n", + "2 0.984643 3.323071e-03 0.005157 0.003438\n", + "3 0.983825 1.814931e-03 0.006154 0.004103\n", + "4 0.983379 9.908728e-04 0.006699 0.004466\n", + ".. ... ... ... ...\n", + "94 0.982842 2.103134e-27 0.007353 0.004902\n", + "95 0.982842 1.147703e-27 0.007353 0.004902\n", + "96 0.982842 6.263134e-28 0.007353 0.004902\n", + "97 0.982842 3.417859e-28 0.007353 0.004902\n", + "98 0.982842 1.865162e-28 0.007353 0.004902\n", + "\n", + "[99 rows x 4 columns]\n" + ], + "name": "stdout" + } + ] + } + ] +} \ No newline at end of file diff --git a/colab/chap13.ipynb b/colab/chap13.ipynb index bff8f833a..cd8636aff 100644 --- a/colab/chap13.ipynb +++ b/colab/chap13.ipynb @@ -1,526 +1,910 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 13" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_results(S, I, R):\n", - " \"\"\"Plot the results of a SIR model.\n", - " \n", - " S: TimeSeries\n", - " I: TimeSeries\n", - " R: TimeSeries\n", - " \"\"\"\n", - " plot(S, '--', label='Susceptible')\n", - " plot(I, '-', label='Infected')\n", - " plot(R, ':', label='Recovered')\n", - " decorate(xlabel='Time (days)',\n", - " ylabel='Fraction of population')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " beta, gamma = system.beta, system.gamma\n", - " s, i, r = state\n", - "\n", - " infected = beta * i * s \n", - " recovered = gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping beta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Make a range of values for `beta`, with constant `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma = 0.2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Run the simulation once for each value of `beta` and print total infections." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " print(system.beta, calc_total_infected(results))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Wrap that loop in a function and return a `SweepSeries` object." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "infected_sweep = sweep_beta(beta_array, gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "label = 'gamma = ' + str(gamma)\n", - "plot(infected_sweep, label=label)\n", - "\n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sweeping gamma" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the same array of values for `beta`" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And now an array of values for `gamma`" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "gamma_array = [0.2, 0.4, 0.6, 0.8]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "For each value of `gamma`, sweep `beta` and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "for gamma in gamma_array:\n", - " infected_sweep = sweep_beta(beta_array, gamma)\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(infected_sweep, label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " loc='upper left')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## SweepFrame\n", - "\n", - "The following sweeps two parameters and stores the results in a `SweepFrame`" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what the `SweepFrame` look like." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's how we can plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "for gamma in gamma_array:\n", - " label = 'gamma = ' + str(gamma)\n", - " plot(frame[gamma], label=label)\n", - " \n", - "decorate(xlabel='Contact rate (beta)',\n", - " ylabel='Fraction infected',\n", - " title='',\n", - " loc='upper left')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also plot one line for each value of `beta`, although there are a lot of them." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(7, 4))\n", - "\n", - "\n", - "for beta in [1.1, 0.9, 0.7, 0.5, 0.3]:\n", - " label = 'beta = ' + str(beta)\n", - " plot(frame.row[beta], label=label)\n", - " \n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Fraction infected')\n", - "\n", - "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n", - "\n", - "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "contour(frame)\n", - "\n", - "decorate(xlabel='Recovery rate (gamma)',\n", - " ylabel='Contact rate (beta)',\n", - " title='Fraction infected, contour plot')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap13.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "Krn5EJ6or12O" + }, + "source": [ + "# Chapter 13" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "DsoL0WYor12R" + }, + "source": [ + "*Modeling and Simulation in Python* - Chun San Yip, Final Exam.\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "bg9KYQ8br12T" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "1KRQ7kZOr12W" + }, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p0JzFfgzr12X" + }, + "source": [ + "`make_system`, `plot_results`, and `calc_total_infected` are unchanged." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3F54lLi7r12Y" + }, + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= np.sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "6AB14gVRr12Z" + }, + "source": [ + "def plot_results(S, I, R):\n", + " \"\"\"Plot the results of a SIR model.\n", + " \n", + " S: TimeSeries\n", + " I: TimeSeries\n", + " R: TimeSeries\n", + " \"\"\"\n", + " plot(S, '--', label='Susceptible')\n", + " plot(I, '-', label='Infected')\n", + " plot(R, ':', label='Recovered')\n", + " decorate(xlabel='Time (days)',\n", + " ylabel='Fraction of population')" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "n88_pawQr12Z" + }, + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "oD4Amr6Zr12a" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " init, t0, t_end = system.init, system.t0, system.t_end\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t0] = init\n", + " \n", + " for t in linrange(t0, t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "got_Wx8tr12i" + }, + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State (s, i, r)\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: State (sir)\n", + " \"\"\"\n", + " beta, gamma = system.beta, system.gamma\n", + " s, i, r = state\n", + "\n", + " infected = beta * i * s \n", + " recovered = gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "77-rg2PSr12k" + }, + "source": [ + "### Sweeping beta" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "agnsuFrtr12l" + }, + "source": [ + "Make a range of values for `beta`, with constant `gamma`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "9AbE6o4Fr12m" + }, + "source": [ + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "gamma = 0.2" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WG459KDQr12m" + }, + "source": [ + "Run the simulation once for each value of `beta` and print total infections." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SY6Ytrszr12m", + "outputId": "49f636f6-9def-44d9-9007-2ccfe9b8e72b" + }, + "source": [ + "for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " print(system.beta, calc_total_infected(results))" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.1 0.010756340768063644\n", + "0.2 0.11898421353185373\n", + "0.3 0.5890954199973404\n", + "0.4 0.8013385277185551\n", + "0.5 0.8965769637207062\n", + "0.6 0.942929291399791\n", + "0.7 0.966299311298026\n", + "0.8 0.9781518959989762\n", + "0.9 0.9840568957948106\n", + "1.0 0.9868823507202488\n", + "1.1 0.988148177093735\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4Dt5Wf-cr12m" + }, + "source": [ + "Wrap that loop in a function and return a `SweepSeries` object." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "kh9NrLVLr12n" + }, + "source": [ + "def sweep_beta(beta_array, gamma):\n", + " \"\"\"Sweep a range of values for beta.\n", + " \n", + " beta_array: array of beta values\n", + " gamma: recovery rate\n", + " \n", + " returns: SweepSeries that maps from beta to total infected\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[system.beta] = calc_total_infected(results)\n", + " return sweep" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rwO8t7ajr12n" + }, + "source": [ + "Sweep `beta` and plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "YXTnrrzZr12n" + }, + "source": [ + "infected_sweep = sweep_beta(beta_array, gamma)" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "jIDyXsMGr12o", + "outputId": "55f761f6-8a2e-4a30-9324-be4d1d213109" + }, + "source": [ + "label = 'gamma = ' + str(gamma)\n", + "plot(infected_sweep, label=label)\n", + "\n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected')\n", + "\n" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXxU9dXH8U8SCPsqSwQVEeQIiCCLShUUrdpFtHWpW2trXdHautK61K3qI6jVtk+Lbd3auq+1qMhjUStgawXZFDyIIMi+BhK2QGaeP+5NmAxJmGBmzff9euU1M79779wzlzAn99zf/f3yotEoIiIimSY/3QGIiIhURwlKREQykhKUiIhkJCUoERHJSI3SHUAymVkTYAiwAihPczgiIrK7AmBf4EN33x67IKcTFEFympzuIEREZI+GAVNiG3I9Qa0AeOqppygqKkp3LCIiEmflypWcf/75EH5fx8r1BFUOUFRUxH777ZfuWEREpGa7XYZRJwkREclISlAiIpKRUlriM7NzgCuB/kArd8/bw/rdgXHAMcBm4M/AL91d4zOJiOS4VF+D2gD8AWgGPFrbimZWALwGTAWKgK7Am0AxcH9ywxQRkXRLaYnP3Se6+zPAwgRWHwb0BEa7e6m7OzAWuCKZMYqISGbI5GtQ/YEF7l4c0zYN6G5mrdMUk4iIpEgmdzNvTVDOi1Ucs2xTasMREUmvaDRKeSTKzvIIkUjwPBKJEo0GyyLR4HkkWnN7ZVsktq3q8kgkWtkeCdevXB6p2talYwu6d2mTlM+byQlqExD/qdvGLBMRqRfRaJQdOyOU7Shn+45ytpeFjzvKg7ay6p5HKC+PsDMSpbw8Upk4yiNRyst3JZEqbZEIkfCxvDxKeSTCzvLorvWqawvX3Rkmo0xTkJ/H07/6Js2bNq73987kBDUL6Glmbdx9Y9g2CFjk7kpQIg3MzvIIJVvKKNlcRsmWHVUSSc1JpGqyqdIevq54ni1zt+bn59EoP4+Cgnzy8/PIz8sjPx/y8vLIzwseY58H61TTnpdHXtx2+Xl55IXPC/J3PY9tr3ieHy7vVtSaZk2Sk0pS3c28AGgMFIavm4aLytw9Erf6ZOBzYIyZXUfQi280QbdzEcliZTvKKdlSxqbNwU/F85LNZWyKfR4uK9lcxuZtO5MaU6OCfJo0zqdJYQFNGjeisNrnBRQ2LqBJYQGFjQooKMijUUE+Bfl5FOTn06gg+GIvKAie51e0hes0CpNKsF5+sH34WHV5RVvV7YOkUevdOTkl1WdQPwAej3m9NXwcYWYLgbnAN919sruXm9kpwMPAanbdB6Uu5iIZIhqNsq2svNbEsil2Wdi2razukwvk50HL5oW0blFIy2aNadqkEU0aB0mjSWGYOPbwvLb1C/Ibzhd/tkhpgnL3J4AnalmlZdz6i4CTkxiSZLlIJMJDDz3Eiy++yNatWxk4cCB33nknXbt2rXb9mTNn8oc//IGPP/6Ybdu20a1bN0aNGsVJJ52U4sizw87yCKvWb2HZmlKWrS5l2ZpSVq7bzMbSXQlnx8744seeNSrIo1WYbFq1KKx8XvHTqnnQ3rpFIa3DZc2bNiZfSaRByeRrUCJ79Mgjj/Daa6/x5JNP0rlzZ+69914uv/xyXn31VfLzd7+LYuPGjXzrW9/i3nvvpW3btrz11ltcd911PPXUUxx22GFp+ATpF41GWb9pW5CE1mxm+ZpSlq4uZfmaUlau37LHC/OFjfIrE03rmGTTKia5xC9r1qRRgypVyd5RgsoS69at49Zbb+WDDz6gdevWXHPNNVx//fX89a9/5cgjj2T16tXccsstzJkzh+3bt9O9e3euv/56hg4dCsDSpUs54YQTuOeee3jsscdYtmwZgwYN4oEHHuDxxx/nhRdeAODyyy/nggsuAOCDDz7gggsu4MEHH+TBBx9kzZo1nHDCCdxxxx2MHTuWCRMm0Lx5c37xi1/wzW9+E4D58+dz11134e6Ul5fTu3dvbrrpJnr37p2U4/Lss89y8cUXc9BBBwFwww038LWvfY3p06czZMiQ3dY/9thjq7w++eST+eMf/8j06dNzPkGVbt3B8jWlYSIqZfmazeFjaY0lt7w86NSuGV07tqRrx5Z06diSfTu0oF2rJrRu0YRWLRrTtFBfI5Ic+s2Kcccj/2HavFUp2dfg3p257eKjEl7/+uuvp0mTJkyaNIm8vDxuuummKssjkQhnnXUWDz30EI0aNeKRRx7hJz/5CW+99Rbt27evXG/ixIk8+eST5OXlcd5553H22Wdz4YUX8t577zF58mSuvPJKRowYwf7771+5zdSpU3n11VcpLi7mjDPO4KyzzuKGG27g9ttv55lnnuHmm29m+PDhtGjRAoBRo0YxcOBAysvLuffee7nyyiuZOHEijRtX3w115MiRrFix21QwlW677TZGjhy5W3tJSQnLli3j0EMPrWxr3bo13bp1Y968edUmqHirVq1i4cKFHHLIIXtcNxvs2FnOirWbq5wNVSSj4tLtNW7XukVhmIBaVCajrh1bUtShBU0aF6TwE4jsogSVBVatWsX777/PhAkTaNMmuDXsmmuu4a233qpcp6ioqMqkjFdccQWPPfYYc+bMqXLWMGrUKNq1awfAcccdx6RJkzjnnHMAGDFiBC1btmTu3LlVEtTPfvYzmjdvTvPmzTniiCMoLS3l+OOPB+C0007jzjvvZNGiRRx66KH06tWrSuzXXXcdzz33HEuWLKFHjx7Vfr7x48fv1XEpLS0FgqQUq1WrVpXLarN582auuuoqRowYUXmmmQ0ikShri7dWnv0sjTkbWrNhCzVV5AobF9C1Ywu6VCagFpVnRa2aF6b2Q4gkQAkqRl3OaFJp5cqVAFUmXYyfgLG4uJgxY8bwwQcfUFxcTH5+PqWlpaxfv77Keh07dqx83qxZMzp16lRledOmTdm8eXOVtth1mjVrRrNmzaqsD1Rus3TpUsaOHcusWbMoKSmpvA60bt26GhPU3mrZMuhTU1JSUqW9pKSkcllNSkpKuPTSS+nYsSNjxoyp17jqW3l5hE8Xb+DDuSuZ4WtYurqEsho6JuTnwb77tKBrp5izoQ5BEtqnTVN1MpCsogSVBSrOjJYuXVp5rWXZsmVV1nnggQdYunQpzzzzTGVCGTJkCNEU331466230q5dO1555RXat2/Pxo0bOeKII2qN49vf/jbLly+vcfkdd9zBqaeeult7q1at6Nq1Kx9//DH9+vUDgsSzZMmSWq95bdiwgYsuuogDDzyQsWPH0qhR5v03KNlSxvRPV/Ph3JV89OlqSrfuqLK8XasmMWdCLSvPjIr2aUHjRpk8xKZI4jLvf6bspnPnzgwdOpT77ruv8q/9hx56qMo6JSUlNG3alNatW7N9+3bGjRvHli1bUh5rSUkJXbp0oVWrVpSUlHDfffftcZvXX399r/d3zjnn8Oijj3LUUUfRuXNn7rvvPg488EAGDRpU7fpr1qzhwgsvpF+/ftx9993V9vRLh2g0ypJVJXw4dxXT5q1i3qJ1VUp1XTu2YEifIgb37szB+7dNyrAyIplGCSpL3Hfffdx6662MGDGCNm3acNVVVzFx4kSaNGkCBNeJbrzxRoYOHUrbtm358Y9/XOWaVKrcfPPN3HbbbQwZMoROnTpx9dVXV/YQTIaLL76YkpISzjvvPLZu3cqgQYMYN25cZeKZNm0al1xyCa+//jpdunThueee47PPPmPp0qW8+eable8zcuRI7rzzzqTFWZ2yHeXM+Xwt0+au4r/zVrF6/a4/KAry8+jfcx+G9CliSO/OdOlYe8lSJBflpboElEpmdiCwaNKkSbtds8l28+fPZ+TIkUyePHm360iSudZt3Mq0eUHpbuZna9ge0727TctCBh3SmSP6FDGgV0daNNNZkuS+iltggO7u/kXsMp1BZYlPP/2UaDSKmbFmzRruuecejjzySCWnDBeJRFmwtJgP567iw3kr+XzpxirLD+rShiF9OjOkT2cO3r+dOjGIxFCCyhIlJSXccsstrFq1qrK7d/y9UJIZtmzbwcz5a4LrSZ+uorhk1/1HhY0LGHBwR4b06czg3p3p0LZZLe8k0rApQWWJIUOGMHHixHSHITVYsXYzH85dyYfzVvHx52vZWb6rdN6hbTOG9AlKd/16dtCNryIJUoIS2Qs7yyPM+2J9ULqbu5Klq3fdGJyfB70PbB+W7oroVtRK486J7AUlKJEEbdpcxvRPV/Hh3FV89OmqKvMTtWjaiIGHBNeSBlon2rRsksZIRXKDEpTIHmzfUc6Lkz7jpXc+qzK1xH6dWjK4d1C66929PY0KMuOeKpFcoQQlUotp81bxx1dms3JdcI/SYT07cGTfIgb36UyXDro3SSSZlKBEqrF6wxYeefVj/j0nGGW9W1ErRp3Rn74H7ZPmyEQaDiUokRg7dkZ49b3PefYtZ3tZOc2aFHDuSYcwcthBKuGJpJgSlEhozoK1jHt5Fl+uCnrkHd2/CxefeqjuVRJJEyUoafA2bNrGY+M/4d2PlgKwb4cWXH76YQw0jdIhkk5KUNJglUeiTHh/EX+bMI8t23ZS2Cifs77ei9OP60mhbqYVSTslKGmQfPF6xr08u3JsvMG9O3PZd/tRtE+LNEcmIhWUoKRBKdlSxl9en8v/fbCYaDQYhujS7/TjqEOLNNqDSIZRgpIGIRKJ8va0JTz+2lw2bS6jID+P747oydlf70XTJvpvIJKJ9D9Tct6i5RsZ99Js5n2xHoB+PTpw+en9OKCodZojE5HaKEFJztqybQdPT3TGT1lIJBKlbasmXDSyL8cO3E/lPJEsoAQlOScajTJl5nIe+ccc1m/aTn4enHJMd87/Rm9aapZakayhBCU5ZdmaUh5+aTYzP1sDQK8D2jLqjP703K9tmiMTkbpSgpKcsK1sZzji+AJ2lkdo2awxPzqlDyce0U3TqItkKSUoyXr/nbuSP74yh9XrgxHHTzziAH747T6ak0kkyylBSdZavX4Lf/r7HD74ZCUAB+7bmivO6E/v7u3THJmI1AclKMk6O3ZG+Pu/FvDsW/Mp21FOsyaNOP8bh3DK0d0p0IjjIjkjpQnKzPKBu4CLgBbAFOAyd19cw/rnA78AugGbgBeBn7v79tRELJlm1mdrePjl2SxdHYw4PnxAV358al/2aaMRx0VyTarPoEYD5wLDgWXAr4HxZjbA3SOxK5pZf+CvwNnAS8ABwJtACfDLVAYt6bd+0zYe/cfHvDdjGQBdO7Zk1OmH0b9XxzRHJiLJkuoEdTkwxt0dwMxGA6uAY4D34tY9CFjv7i+Grxeb2evAgFQFK5lh+dpSrv/Ne5Rs2UFh4wLO/novvntcDxo30ojjIrksZQnKzNoQlOqmVbS5e7GZLSBIOvEJaiKwyMzOAV4ADgRGAvemJGDJCDt2ljP2b9Mo2bKDfj068NOzB2jEcZEGIpVXlCsGPiuOay+OWVbJ3bcAjwIPA9uBBcC/Ccp+0kA88dpcPl+6kU7tm3PThUcoOYk0IKlMUJvCxzZx7W1jllUysx8C/0Nw1lQIdAE6AH9JYoySQT74eAX/mLyQgvw8fv6DwRqmSKSBSVmCcveNwGJgcEVbWPbrAcysZpPBwDvuPtndI+6+AvgTcFoq4pX0WrNhK795bgYAF3yrD70OaJfmiEQk1VLdSeJh4AYze5ugF98YYD5Bd/N4k4FxZjYU+A/QEbgUmJ6iWCVNyssj3P9UcN1p0CGd+M6xPdIdkoikQY0JyszOS/RN3P3pBFcdS1Dim8Ku+6BOdfeImQ0DJgB93H2Juz9vZvsCjwNdgS3Au8CoROOS7PTM/zlzF62nfeumXHPuQI2lJ9JA1XYG9WTc6ygQ/00RDR8TSlDhvU43hj/xyyYDLePafgP8JpH3ltwwa/4anp80n/w8uP78QRpPT6QBq/EalLvnV/wAxwMfE3RYaBf+jARmAyekIlDJfRtKtvHA09OJRuHsE41+PTukOyQRSaNEr0E9BFzr7pNi2l43s23Ab4HD6j0yaVAikSgPPv0RG0q2c2iPfTj7REt3SCKSZon24jOCTg3xlgEH11840lC9/O4CZsxfQ6vmhVx//iAKdN1JpMFLNEHNB64PB3sFwMzygOvDZSJ77dMv1vO3CfMAuObcwzXwq4gAiZf4rgbGAyeY2X/DtiMIun6PTEZg0jCUbilj7JPTiESifOfYHgzpU5TukEQkQyR0BuXu7xCU8p4iSGqNCHr59QqXidRZNBrlt8/PZM2GrRy8f1su+FafdIckIhkk4Rt1w5EcbkliLNLAvPH+F/x7zgqaN23E6B8MpnEjTTYoIrsknKDMzIDLgJ7Ape6+0sxOBRa7+6xkBSi5aeGyjTz6j48B+MlZGqFcRHaX0J+s4SgPM4H+wMlA83BRH+DW5IQmuWrr9p2M/duH7NgZ4eSjujFsQNd0hyQiGSjRmso9wJ3ufgJQFtP+NkFnCZGEPfzybJat2Uy3olZc8p1+6Q5HRDJUogmqP/BcNe2rCHryiSTk7WlLeHvalxQ2LmD0DwbTpLFmxRWR6iWaoLax+zxOAL2ANfUXjuSypatLGPfSbAAu+24/DijabZ5KEZFKiSaoN4AbY27UjZpZB+Au4B9JiUxyStmOYOr2bWXlDD+8KycecUC6QxKRDJdoghoN9AW+AJoCfwcWAc1Q13NJwGPjP2HR8k3su08LrjyzP3l5GspIRGqXUDdzd19tZoOAcwhmus0nmAbjKXffnsT4JAe8P3s5r09dRKOCPEb/YDDNm2rqdhHZs4QSlJkNB9539yeAJ2LaG5nZcHd/LznhSbZbtX4Lv31+JgAXntKXnvu3TXNEIpItEi3xvQO0r6a9TbhMZDc7yyPc9+Q0Nm/dwZF9ixg57KB0hyQiWSTRBJXHrtlzY7UhmIpdZDdPTpiHL95AhzZN+enZh+u6k4jUSa0lPjN7LHwaBX5rZltjFhcAg4DpSYpNsthHn67mpXcWBFO3f38wrVsUpjskEckye7oGtX/4mAd0oeooEmXAu8AD9R+WZLP1m7bx62eCv1vOO/kQ+h60T5ojEpFsVGuCcvcTAczsceBn7r4pJVFJ1iqPRHngqelsLC3jsJ4dOPOEXukOSUSyVKLXoK6mmmRmZu3NTMMBSKUX357P7AVradOykOs0dbuIfAWJJqingfOraT+XYBJDET5ZuI6n3/wUgGvPHUT71k3THJGIZLNEE9SRVN+d/F3gqHqLRrLWps1l3P/kNCJROGNETwYe0indIYlIlks0QbUAdlbTXg60rL9wJBtFo1F++9wM1m7cxiHd2vH9b/ZOd0gikgMSTVCfAKdX034m8Gn9hSPZaPzkhXzwyUpaNGvMDd8fTKMCTd0uIl9dolO+3wf8zcw6A2+FbScRTAH/oyTEJVliwZfFPP7aJwD89HsD6NS++R62EBFJTKKDxT5nZs2B24GrwualwBXu/kySYpMMt2XbDsb+bRo7y6N8++jufO2wLukOSURySKJnULj748DjZtYxfK2JChuwaDTKH16czYp1m+nepTU/Htk33SGJSI6p08UCMzsMGA5sDl83iZnEUBqQf/53Cf+asZSmhcHU7YWaul1E6lmi0220B14mSE5R4GBgIfB7YBNwbbIClMyzZOUmHn5lDgCjzjiM/Tq1SnNEIpKLEj37uZ+gS/mBVB29/EXg5HqOSTLY9nDq9rId5Rw/eH+OH6yp20UkORK9BnUScJq7LzGz2Pb5QMLfUGE58C7gIoJ7q6YAl7n74hrWbxaufzbQDlgBXOXuExLdp9SvP/99DotXltC1Y0suP/2wdIcjIjks0TOo9sCGatpbAZE67G80wfBIw4EiYAkwvrrrWGaWB7wC9AWGuXsL4DhgXh32J/Vo8sxlTPzPYho3yufnFwymWZOE+9iIiNRZot8wHwHfAP4Q134B8EEd9nc5MMbdHcDMRgOrgGOA+GnjTwSOBfZ397UA7r60DvuSerRy3Wb+94Vg6vaLTj2U7l3apDkiEcl1iSaoO4C/m9l+BBMV/sDM+gKnAccn8gZm1gboBkyraHP3YjNbAAxg9wR1PLAIuMXMzgG2AeOBG929NMG4pR7s2Blh7N+msWXbTob225dvfe3AdIckIg1AQiU+d38LGAkMJSjp/ZygRHeyu09NcF8V03IUx7UXxyyL1QGoGNTtIIKy4FA0QWLK/fWNuXz2ZTGd2jXjp98boKnbRSQlajyDMrNbgfvdfYuZHQC84+5vf4V9VUx2GF8bahuzLFYJQc/BX7j7NmCJmY0B/pdgiCVJgbXFW3n1vc/Jz8/jhu8PpmVzTd0uIqlR2xnUrewaqXwR0PGr7MjdNwKLgcEVbWHZrwcws5pNPgofozFt0WrWkySaOns50Sgc2beIQw5sn+5wRKQBqe0a1ArgdDMbD+QBRWZW7fruvjzB/T0M3GBmbwPLgDEEXdWnVLPuK8C9wN1mdjOwD0EvwBcT3JfUg6mzgn/aYf27pjkSEWloajuDGktQTltCcOYyA/gy7mdp+JioscDzBAlpNdAdONXdI2Y2zMxKw3IiYUeIk4BBwDrgv8BU4IY67E++grXFW5n3xXoKG+UzuE/ndIcjIg1MjWdQ7v47M3uRoAT3HnAGsP6r7MzdI8CN4U/8ssnETX7o7p8AI77KPmXvTZ0dnD0N6t1Z9zyJSMrV+q3j7iuAFWZ2BzDR3bfUtr7klory3jH9NY2GiKReovNB3ZHsQCSzxJb3hvQpSnc4ItIAJTqaeXOCe5++DnQm7tqVux9U/6FJOr2v8p6IpFmi3zzjgFOA54DlqLt3zpui8p6IpFmiCeoU4Gx3/2cyg5HMoPKeiGSCREczLyPobi4NgMp7IpIJEk1Qv0fDCzUYKu+JSCZI9M/jbsAZZnY8MIvgjKqSu19a34FJeqi8JyKZItEE1ZMgMUGQrGKpw0QOUXlPRDJFovdBaTSHBkLlPRHJFIleg5IGYN1GlfdEJHPUNh/Un4Br3b00fF4jXYPKDRVDG6m8JyKZoLZvoYNjlh9cy3q6BpUjVN4TkUxS22jmI6p7LrlJ5T0RyTS6BiWAptYQkcyjBCUATJkZJKijD1N5T0QygxKUxJX3NHOuiGQGJSipUt5r3rRxmqMREQkoQYnKeyKSkZSgGriK8l5jlfdEJMMkOqNuR+B+ds2omxe73N0L6j80SYWK8t5glfdEJMMk2p/4EaAf8Bs0o25OqRg9QuU9Eck0iSao44CT3P2DJMYiKbZu41bmLlJ5T0QyU6LXoDYAJckMRFKvsvfeIZ1U3hORjJNogrobuNnMNMRADplaOfZe1zRHIiKyu0QTzveAIcBSM/uU3WfUPam+A5PkUu89Ecl0iSaopeGP5Iips5cTjaq8JyKZK9EZdS9MdiCSWpW991TeE5EMVadrSma2P9AnfPmJu+usKgvFlveOUHlPRDJUojfqNgfGAd9n1026ETN7Ehjl7luTFJ8kwfuzV6i8JyIZL9FefPcR3Av1XaBd+HMGMCJcJllkyqxlgMp7IpLZEi3xnQlc4O4TY9peNbPtwF+An9R7ZJIUKu+JSLZINEG1ARZV074IaJ3ozswsH7gLuAhoAUwBLnP3xXvYbhDwH2Cqux+X6P5kdyrviUi2SLTE9zFwaTXtl4XLEjUaOBcYDhQBS4DxYeKqlpk1BZ4A/lWH/UgNKkaPUHlPRDJdomdQtxKU9I4B3gvbhgMDgVPrsL/LgTHu7gBmNhpYBcS+b7y7gUlAMcF1MNlLwdh761TeE5GskNAZlLu/AQwC5gMnhD/zgUHu/mYi72FmbYBuwLSY9y0GFgADathmOHAKcFMi+5DaqbwnItkk4fug3H02cMFX2FfFtariuPZiqrmOZWYtgceAH7v7FjP7CrsWUHlPRLJLKmfU3RQ+tolrbxuzLNb9wBvuXlPpT+pA5T0RyTY1nkGZWRnQ1d3XmNkOapmk0N0L97Qjd99oZouBwYRlvrDs1wOYWc0m3wDamtl54evmQGMzWwsMcffqehVKDSrKewNN5T0RyQ61lfguYdeZzSXUzyy6DwM3mNnbwDJgDMG1rCnVrHtUXHzXAkOBs4AV9RBLg1JR3jtmgMp7IpIdakxQ7v6XmOdP1NP+xhKU+Kaw6z6oU909YmbDgAlAH3df4u4rYzc0s03Ado3/V3cq74lINkp0LL6FBGW1dXHtbYGP3P2gRN7H3SPAjeFP/LLJQMtatr09kX3I7lTeE5FslGgniQOBgmramwD71Vs0khSV5b3+XdIciYhI4mo9gwrvQ6ow1Mw2xLwuAE4CvkxGYFI/1m/atqu817co3eGIiCRsTyW+dwk6R0SBV6pZXgpcUc8xST16P5w5V+U9Eck2e0pQ+xPM/7SEYFijNTHLyoC17l4fvfskSabMUnlPRLJTrQnK3ZeFT1N5Q6/UE5X3RCSbJZR4zOwXZnZRNe0XhQO+SgZSeU9EslmiZ0aXAl5N+zyCKTckA6m8JyLZLNEE1QWo7gbZ5YCGJshAKu+JSLZLNEGtBvpV034YsK6adkkzlfdEJNslmqBeBh40s8MrGsxsIPAA8GIyApOvRuU9Ecl2ic4HdTPBpILTYm7WbUcwlp4mE8wwKu+JSC5IKEG5+2bgODM7geB+KIDp7v520iKTvabynojkgoRn1AVw90nApCTFIvWkorx3tMp7IpLFEk5QZtaOYBLBbkCVCQrd/c56jkv2Umx570iV90QkiyU63cYQ4E2CYY9aEwx51AnYQjB5oBJUhlB5T0RyRaK9+O4DXgI6AFuBownOpGYAP09OaLI3VN4TkVyRaIIaADwYTjgYAQrDmW1/DtyTrOCkbirKe40K8jmij8p7IpLdEk1Q5cCO8PlqglHOAdYSnElJBvh3WN4bdEgnWjRTeU9EsluinSRmE5xFLQD+A9xkZvnAJVQ/Rp+kwWSV90QkhySaoO4GWobPfwm8Dkwg6CxxZhLikjpSeU9Eck2iCWoyYYnP3b8A+ppZe2CDJizMDCrviUiu2WOCMrNGwGagP/BJRbu7r09iXFJHU2arvCciuWWPnSTcfSfwZSLrSnqs37SNTxaqvCciuSXRpPMAcLuZNUtmMLJ3/h1zc67KeyKSKxK9Bu/T2/YAABKcSURBVHUacASwzMzmEZT8Krn7SfUdmCSuorx3zACV90QkdySaoJZS/Yy6kmYbVN4TkRxVa4Iys+8Bf3f3C1MUj9TR+yrviUiO2tM1qGeAthUvzGyemR2Q3JCkLtR7T0Ry1Z4SVF7c6/2o4xxSkjyx5T1NrSEiuUZdx7PY+3NWqLwnIjlrTwkqGv7Et0kGmDJrGaDynojkpj2V6/KAF8ysLHzdFPirmW2NXUndzFNP5T0RyXV7SlB/iXv95FfZWTgC+l3ARUALYApwmbsvrmbdowgGph0MNCMYSf0ud3/5q8SQK1TeE5FcV2uCSkL38tHAucBwYBnwa2C8mQ0IJ0OM1R54DvghsB74LvC0mQ139//Wc1xZZ6qm1hCRHJfqHnmXA2Pc3QHMbDSwCjgGeC92RXd/I27bl8zsxnDdBp2gNmzaxscL16q8JyI5LWW9+MysDcHsu9Mq2ty9mKB0NyCB7bsAvYFZyYoxW1SU9w63jirviUjOSmU389bhY3Fce3HMsmqZWUvgZWC8u09KQmxZpaK8d0z/rmmOREQkeVKZoDaFj23i2tvGLNtNeOb1JrACuCA5oWUPlfdEpKFIWYJy943AYoJeeUBl8ukBzKxuGzPbB5hEMB/VWe5eVt16DYnKeyLSUKS6k8TDwA1m9jZBL74xwHyC7uZVmFkR8E+CDhEXV9PLr0HaVd5T7z0RyW2pTlBjCUp8U9h1H9Sp7h4xs2HABKCPuy8BLgP6At2B75lZxXs86e6XpzjujBDcnBuU947ou2+6wxERSaqUJqjwLOjG8Cd+2WSgZczrO4A7Uhdd5nt/zgoiURhkHWmp8p6I5DgNFptFVN4TkYZECSpLbCipKO/lqbwnIg2CElSW+HdY3jvcOqm8JyINghJUlpgyU+U9EWlYlKCygMp7ItIQKUFlAZX3RKQhUoLKAuq9JyINkRJUhttQso2PP1d5T0QaHiWoDFdR3hvQS+U9EWlYlKAyWNmOct6e9iUAwwaovCciDUuqx+KTBC1ctpFfPz2dxStLaNakkcp7ItLgKEFlmPJIlJff+YynJ37KzvIoXTu24NrzBqm8JyINjhJUBlmxdjMPPvMR875YD8ApR3fnh6f0oWmh/plEpOHRN18GiEajTPzPYh79x8dsKytnnzZN+enZhzPQOqU7NBGRtFGCSrP1m7bxu+dnMm3eKgCGH96VUacfRsvmhWmOTEQkvZSg0mjqrOX8/sVZlGwpo2WzxlxxRn+GHd413WGJiGQEJag0KN26gz++Mpt3py8F4PBeHfnZOYezT5tmaY5MRCRzKEGl2KzP1vDQszNYW7yVwsYF/HhkX771tQPJy8tLd2giIhlFCSpFtu8o56+vz+UfkxcC0OuAtlx73iC6dmy5hy1FRBomJagUWPBlMb9+ZjpfriqlID+Pc04yzjr+YAoKNJCHiEhNlKCSqLw8wgtvf8az/+eUR6Ls16kl1543kIP3b5fu0EREMp4SVJIsW1PKg09/hC/ZAMCpww7igm/3oUnjgjRHJiKSHZSg6lk0GuWN97/gsfGfULajnA5tmnL1OQPp36tjukMTEckqSlD1aN3Grfz2uZl85KsBOG7Qflz23cM0jp6IyF5Qgqonk2cs4w8vzaJ06w5aNW/MlWcO4GjNgCsisteUoL6i0i1ljHt5Nu/NWAbAoEM68dOzD6d966ZpjkxEJLspQX0FM3w1v3luBus2bqNJYQEXnXoo3ziqm266FRGpB0pQe2Fb2U6eeG0ur09dBMAh3dpxzXkD6dJBN92KiNQXJag6mr9kA79+ejrL1mymID+P804+hDNG9NRNtyIi9UwJKkE7yyM8/8/5PPfP+UQiUQ4oasW15w6kx35t0x2aiEhOUoJKwJerSvj1Mx+x4Mti8vLgO8f24Aff7E2hbroVEUkaJahaRCJRXpu6kL+8NpeynRE6tmvGNecMpF/PDukOTUQk56U0QZlZPnAXcBHQApgCXObui2tY/3Dg98AAYC1wv7v/NkXh8qe/z6nsCHHCkP255LR+tNBNtyIiKZHqK/ujgXOB4UARsAQYHyauKsysNfAmMBFoD3wPuN3MzkxVsJFIlA5tm3HTj4Zw9TkDlZxERFIo1SW+y4Ex7u4AZjYaWAUcA7wXt+7pQDnwK3ePAP8xsz8DVwAvpiLYUWccxijQfU0iImmQsjMoM2sDdAOmVbS5ezGwgKCEF68/MCNMThWm1bBuUuTl5Sk5iYikSSpLfK3Dx+K49uKYZfHrJ7quiIjkmFQmqE3hY5u49rYxy+LXT3RdERHJMSlLUO6+EVgMDK5oC8t+PYCZ1WwyCzg8rgPFoBrWFRGRHJPqXnwPAzeYWS8zawGMAeYTdDeP9zJBJ46bzayJmR0BXAKMS1m0IiKSNqlOUGOB5wkS0mqgO3Cqu0fMbJiZlZrZAQDuvgn4BvAtgmtPLwF3uPsLKY5ZRETSIKXdzMMeeTeGP/HLJgMt49pmAENTE52IiGSSXB/qqABg5cqV6Y5DRESqEfP9vNvgprmeoPYFOP/889Mdh4iI1G5f4PPYhlxPUB8Cw4AVBKNSiIhIZikgSE4fxi/Ii0ajqQ9HRERkDzQNrIiIZCQlKBERyUhKUCIikpGUoEREJCMpQYmISEZSghIRkYykBCUiIhlJCUpERDKSEpSIiGSkXB/qKOOFEzLeBVwEtCCYiuQyd19czbpHAb8kmPSxGbAAuMvdX05dxMlRl+MQt90g4D/AVHc/LtlxJltdj4OZNQvXPxtoRzCs11XuPiE1ESfHXhyH84FfAN0IZt1+Efi5u29PTcT1z8zOAa4E+gOt3D1vD+t3J5gv7xhgM/Bn4JfunrXDBekMKv1GA+cCw4EiYAkwPm4m4QrtgeeAvkBb4G7g6XAyx2xXl+MAgJk1BZ4A/pWKAFMk4eNgZnnAKwS/D8PcvQVwHDAvZdEmT12OQ3/gr8AdQBvgaOBk4JaURZscG4A/AFfvaUUzKwBeIzhORQTH7XzgumQGmGw6g0q/y4Ex7u4AZjYaWEXwV9B7sSu6+xtx275kZjeG6/43BbEmU8LHIcbdwCSCCS2PS0GMqVCX43AicCywv7uvBXD3pSmMNZnqchwOAta7+4vh68Vm9jowIFXBJoO7TwQws+MSWH0Y0BM42t1LATezscANwP1JCzLJdAaVRmbWhqAkMa2izd2LCUp3e/zPZWZdgN7ArGTFmAp7cxzMbDhwCnBTKmJMhb04DscDi4BbzGylmX1hZr8zs5bVrJs19uI4TAQWmdk5ZlZgZj2AkUDWl77roD+wIDxOFaYB3c2sdZpi+sqUoNKr4henOK69OGZZtcIvoZeB8e4+KQmxpVKdjkP42R8DLnH3LUmOLZXq+vvQgeAPFAjOIoYTzED9QFKiS506HYfwd+BR4GFgO0Ei+zdB2a+haE31x6tiWVZSgkqvTeFjm7j2tjHLdhP+hfkmwQXxC5ITWkrV9TjcD7zh7jWV/rJVXY9DCcE8Z79w9y3uvgQYA3wneSGmRJ2Og5n9EPgfgrOmQqALQfL+SxJjzDSbqP54VSzLSkpQaeTuG4HFBL3ygMrk0wOYWd02ZrYPwXWXL4Gz3L0sBaEm1V4ch28AF5jZWjNbS3BB/ejwdfdUxJwMe3EcPgofY3tpZW2PrQp7cRwGA++4+2R3j7j7CuBPwGmpiDdDzAJ6hsepwiBgkbtnbYJSJ4n0exi4wczeBpYR/AU8n6BbbRVmVgT8k6BDxMXuHklloEmW8HEAjqLq7+61BKWtswjOKrNZXY7DK8C9wN1mdjOwD0GyfrGadbNNXY7DZGCcmQ0luOWgI3ApMD1FsSZF2DOvMcFZYUWvVYCyav7vTyaYLn2MmV0HdCX4XRiXonCTQgkq/cYSnJpPYdf9Hqe6e8TMhgETgD5h+eYygi7F3YHvmVnFezzp7penPPL6lfBxcPeVsRua2SZge470YKvLcSg1s5OA/wXWEVxzeAG4OT2h16u6HIfnzWxf4HGCL+YtwLvAqLREXn9+QPCZKmwNH0eY2UJgLvDN8Myx3MxOIUjsq9l1H1TW9uADTfkuIiIZStegREQkIylBiYhIRlKCEhGRjKQEJSIiGUkJSkREMpISlIiIZCQlKBGpkZnlm9kMMzszpi1qZt9PY0x/NLNsH29QEqAbdSUrhEM8/Zxg+JqKSek+BR4Bnnb3nfW4rwUENz/fXl/vGb7vI0DPZE6saGb/BJa6+4/q6S0vBPKAl+rp/QAws/0Ihusa4e7v1nHzO4H5ZvZ7d19Yn3FJZtEZlGQ8M9ufYNy5Mwi+nAYSTEr3KHA9cGj6oks+M8szs8Zp2v01wJ8yaVZWd19GMB7lFemORZJLI0lIxjOz8cAQwMKBRGOXNQYK3X1z+PxXBEPEdCSYduEud386Zv0owTTaQwlG/d4I/N7d/ydc/i7BJICxuhMMXvongjmYuhCM+fcscEfstOJm9nXgNoKBOncQDG764zCm2+Le90J3f6Kaz/sjgjPDE4FfEwxvdRrBGeMDBGMRtiUYe22su/8t3O4J4IdxbzfC3d81s84E49l9G2gKzAZurG1EeDMbAMwAurr78pj2KMEsr8MJBu4tDuP4Tcw6LQkmlDyTYCp6B37l7i/HvEesxe5+YDjYb42fMeb9LwTucfd9a4pfsp/OoCSjmVl74FvA/8YnJwB33+Hum8OX9wCXEHx5Hgo8CTxpZifEbXYbwaysAwimabgnZp3TgS8IviT3DX++JChzrQbOI5iD6WqC8lflhIlhcppIMEjpUOBIgjmJGhOMifY0wTxFFe/7XC0fPZ8goVwLHEIw+VxL4G3gm0A/goT5uJmNCLf5GcGgoc/H7ON9M2sGvAO0Crc9HHgDeMvMKuaTqs6xwLLY5BTjNoLx7g4nGDfvATM7LTwOecB4gkn0zib4txgHPBtznAeGj2eEcQ4JX+/pM1b4ACjaQ/yS5XQNSjJdT4Iv67m1rWRmzYGfAte4+wth8z1mNoRg8NTYSR2fc/c/h89/b2Y/Ab4OTHL39WZWDpTGD0pL1UFYvwhnbr2CXWdGtwET3P3qmPU+jYlxK8FI1PHvW5084Dp3nxzTtgaYE/P6d2FSPI9guomNZlYGbI3dR3hG1ho4O+Za3d1hsriMINlWpzvBSOLVed3dfxc+n29mRxKUW18lSGxDgc4xf1T8ycyOAq4i+LdYE7avj43V3efU9hlj2isGBj4ImFdDjJLllKAk0+UluF5PgmkJ4ktW/wJujGuLn1NoOdB5Tzsws0uAi4EDCUbYbkTVKsQg4BcJxpuID+P23xy4lWBivn0JPm8Tqn5xV2cIUAQUx4yAT7jt1mq3CDQDttWw7N9xr6cSlFcr9lcILIvbXyHwWW2B1uEzVsTVrLb3k+ymBCWZ7jMgAvQhmOK+PsRP8hhlD+VuMzsL+D1BAvoXQS/CswiusyRDubvHJ4f7CK5FXUtwTWczQSkyfibVePkEZxnfrWbZllq2WwN8LaFod9/fRnaV7WLtaYLNRD9j+5gYJUcpQUlGC0tuE4CfmNnvauokQdAhYjvBhfuPY1Y5Nu51IsqAgri24cAMd/91zL4PjFtnOnAS8Ns6vG9dDAeecvfnw/3nA72AVXvYxzTgAmCTu6+uw/4+Aq4zs8buviNu2VHAH2Jef41dZdhpBB0cmrp7Tce+IlFVd5z39BkhuD5VTtCJQ3KUEpRkgysISkjTzexWghJdGcGX5A3AD919ppn9FviVma0hmAL7TIK/xk+s4/4WEUwhfwDBGcZ6gr/mLwo7AnwMnELQoSLWr4AJZvYQ8BhBwhwK/NvdPXzfs8ysL8EXbklsD8AEOHCamb0ElBKcZXSh6pf3IoIJ7XoQnMVsBJ4i6C7+ejjz7nyCkubxwDx3/3sN+6soqx1F0Pki1inhtbuJBD35ziY4o4Sgk8M/gZfNbDRBj8F2BElsW3j9b234GU4ys08IJpzckOBnBDgOmJLN05nLnqkXn2S8cDbhgcDfgdsJ/rJ/n6DH3n3sOkO6mWAW0YfCtu8D33f3SdTNbQRnAE5QQjoA+CPwN4IZTmcQ9NC7PS7O/yPocXgkQS+z/xJ0+644+3iU4LrS++H7nlvHuK4h6O7+DkFHg2XsPr37AwRf/rPCfRwdlgqPJTizeZwgQb0MHBG+X7XChPEsQRf5eHcSdCyZRdCTcbS7vxJuFwVODffxIEFHkdcJurh/Hq4TIeju/z2CDg8VZ0J7/IxhL8HzCP5NJIfpPigRqZGZ9SRIqn1r6G6ecmb2PeCXwAB3L093PJI8OoMSkRq5+wKCrujd0x1LjCYENzkrOeU4nUGJiEhG0hmUiIhkJCUoERHJSEpQIiKSkZSgREQkIylBiYhIRlKCEhGRjPT/OXTlrbrK1VEAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PJ0e7RKJr12o" + }, + "source": [ + "### Sweeping gamma" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sY2icYjkr12p" + }, + "source": [ + "Using the same array of values for `beta`" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2E87qeLMr12p", + "outputId": "c9ec9a46-8f84-4f5b-e6e4-17f9e9b3b8e6" + }, + "source": [ + "beta_array" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fXq4eSbVr12q" + }, + "source": [ + "And now an array of values for `gamma`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "yWI8UxM3r12q" + }, + "source": [ + "gamma_array = [0.2, 0.4, 0.6, 0.8]" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9DRNhSWUr12q" + }, + "source": [ + "For each value of `gamma`, sweep `beta` and plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "2GARRupWr12r", + "outputId": "a1fdcfb7-eb88-4bea-bea0-5154fe1063ee" + }, + "source": [ + "plt.figure(figsize=(7, 4))\n", + "\n", + "for gamma in gamma_array:\n", + " infected_sweep = sweep_beta(beta_array, gamma)\n", + " label = 'gamma = ' + str(gamma)\n", + " plot(infected_sweep, label=label)\n", + " \n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected',\n", + " loc='upper left')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()\n" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe0AAAEYCAYAAABx665RAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeVxU5f4H8M/sAzPAsCOLIqJHQBhUXFBTU0krNTNMzay8Wdzsd9Myl7REA7PyZlhds1vd0iy85U1NsxQRcytXQFQ4boAsw87AzDD7Ob8/BggRdSThsDzv12teOc88h/NtxPnOs/NYlgVBEARBEB0fn+sACIIgCIKwD0naBEEQBNFJkKRNEARBEJ0ESdoEQRAE0UkIuQ6gLVEUJQEwBIAKgJXjcAiC6FoEAHoAOE3TtJHrYIjuoUsnbdgS9lGugyAIokt7AMAxroMguoeunrRVAPDtt9/Cx8eH61gIguhCSkpKMGfOHKD+c4Yg2kNXT9pWAPDx8YG/vz/XsRAE0TXd09DbuXPnJgqFwniWZX1A5hURN2N4PF6JxWJZM2jQoP0tVejqSZsgCKLDOHfu3ESJRPJJYGCgycHBoZrP55PdrYhGDMPw9Hq9S15e3ifnzp37v5YSN/mWRxAE0U6EQmF8YGCgSSaT6UnCJprj8/msTCbTBwYGmoRCYXxLddq1pU1R1CwALwNQAnCiaZp3l/q9AXwKYBQAHYDPAbxF0zT5ZScIotNhWdbHwcGhmus4iI7NwcHBUD98cov27h6vBrAJgAOAL+9UkaIoAYC9AI4D8AHgB+BXAGoA/2zbMAmCINoEn7Swibup/x1psSe8XbvHaZreT9N0MoDrdlR/AEAwgKU0TWtpmqYBvA9gQVvGSBAEQRAdVUce01YCuErTtLpJ2RkAvSmKcuYoJoIgCILgTEeePe4MW1d4U+omr9W2bzgEQbQXlmVhZVhYLAwsVgZWhgXDsmAYFiwLMA3P68say+uvYxvLcVM9WzlavLanjxMCvJ24/l8niDvqyEm7FoBLszJFk9cIgmgjFisDg9GCOqMFBqMFBpMVeoMFepMF+voyvdEKo9kKi5VpTK62B9tYZm4oszQpb/qwsM3q/FmvvTlIhEhOeBgCQUfugCS4ZrVasXbtWr+9e/d6GI1GflhYmPadd97JDwwMNLVU//fff5f961//6nH58mWZyWTi+/r6Gl544QXV448/3rxRapeOnLQzAQRTFOVC03RNfdlgALk0TZOkTRAtqDOYodYYUa0xQmcwNyZXvdECg8nSmHht5RYYjNZbErHeaOEkaTYnFPAgFPAhEPDB5/Eg4PPA5wM8Hg98Pg98Xv2DD/D5PFv57cr4f5bf7vqQQDeSsIm7SkpK8klJSXHbunVrjp+fn3nVqlUBcXFxwfv27bskEAhuqV9dXS2cNGlS9Ycffpjn5uZm2b17t+Ktt94K8vX1zRk2bFjdvd6/vZd8CQCIAIjrn0vrXzLRNN38U+IogGsA3qMoajFss8eXwrYEjCC6DZZlUaszoVpjRFWtAdW1BlTVGqBueN6k3GC6P+fi8Hm2lqeDRAhp/cNRIoRULIRUImh8TSwSQCTkQyiwPUQCHoRNnguFfIga/8z7s1zAtyVlYcN1/JuvE9gSblf3xqZjwReuVTbvUWwzA/q416xbMOqqPXVLS0uFy5cv75WRkeEkl8utL7/8clF8fHzvzz777PLYsWM1xcXFoqVLl/ZqaEH6+/sbXnvttcJx48ZpACA3N1c8adKk8BUrVuRt27bNp7S0VDxgwADtxx9/fH3Tpk0+e/bs8QCA5557TrVgwYIyADh8+LBTXFxcv4SEhOubNm3yq6qqEo0cOVL97rvv5q9Zsybg8OHDrg4ODsyrr75aEBsbWw0AWVlZ0oSEhJ7Xr193sFqtvD59+uhXrlx5Y+DAgfq2eA937drlOXfu3JL+/fsbAWDVqlWFo0aNUh47dkw+ZswYbfP6jzzySE3T59OnT1d/+eWX+lOnTjl1+KQNYC6Ar5o8b3hTH6Qo6jqASwAepmn6KE3TVoqiJgPYDKAMf67TJsu9iC7BYmX+TLz1ybe61oCqhv/Wl6u1Rlis9q0SEgv5cHWWwtVJArmjGFKx4ObkKxbYkm/9w0EihEOzRCyVCCEW8rtF0iRub+HChb3FYjGbmpqaxePxsHjx4sCmr1utVsTGxlZMmDDhukgkYjdu3OizePHiPgcOHLjg6elpaaiXkpLimpycnMPj8TBz5sz+sbGxIXPmzCk5fvx45v79+12WLFkSPGnSJHVQUFBj9/KJEyec9+7de6myslI4Y8aMkOnTp4csWrSocP369flffPGFZ2JiYuDEiRNrnJycGACIi4tTjRgxQmu1Wnnx8fH+r7zySnBqauoFsVjc4j+ciRMnhpaVlYlv9/++bNmyG7NmzapqXq5WqwVlZWXiyMhIXUOZq6ur1dfX13jx4kXHlpJ2c0VFRaKCggJpaGjoPSdsoJ2TNk3TXwP4+g5V5M3q5wKY2IYhEUSbq6o14HpRTeOjqFyLao0BtToTWDtX7MocRHBzlsDVSQo3ZykUThK4OUvh6ixtLHd1lkImFZJk24nY2+ptb4WFhaL09HTn3bt3X3Bzc7MCwJIlS4qOHz/eMK8IAQEB5oCAgMZx2aVLl6qSk5O9z5w54/jwww83DmEuWLBA5eHhYQWAESNG1Bw7dkwxf/78CgCYPHlyTXx8vDUjI8OxadJeunRpsVwuZ+RyuUmpVGq0Wq1gypQpNQAwa9asyg0bNvSkaVoaFRVVFx4ebgBgqL+UXblyZVF0dLTn1atXJaGhoQ3lN9m/f/+l1rwvtbW1fABQKBQ3dWnJZDKrVqu9tW+8GY1Gw3/ppZf6DB8+vGb8+PGa1sTQkce0CaJTYRgWJVW6xuR8rf6/ak3LRy3zeYDCSVKfeG2tY1dnKdyaltUnaInorp8HBHHfFBYWigGg6eSqwMDAm36RKysrBWvWrAlIT0930mg0Qh6Px+r1ekFFRYWoab0ePXqYG/7s4ODAuLm5mZu+LpFImOYJz9fXt7GOVCplpFJp4/Cpo6MjAwAN1+Tm5orXrl3rn52dLdfpdAIej8cCQFlZmTA0NLT1b0ILnJ2dGQCoqam5KV6dTieQy+V3HJtSq9WCefPmBbu7u5s//vjj3NbGQJI2QbSC2cKgoFSD60VqXC+ubUzUeqPllrqOUiF6+7qgj58Lgvxc0MvHGe4uUjjLJRDwSauY6Hj8/f1NAJCXlyduGLvNz8+/qTs5MTHRX6VSiZOTk3MakuzgwYMjWXu7j+6TFStW9HJxcbHs3LnzkpeXl6WqqkoQHR0dCeC2/7hiYmLC7tQ9vnz58vzZs2ff0j2uUCisXl5epoyMDNmQIUPqAFsyVqlUkrCwsNt2d1dUVAieffbZfv7+/oZPPvkkVyQS3a7qXZGkTRB3oTdakFtcc1ML+kaJpsUZ1m7OEgT5KRBUn6D7+LnA282RdFkTnYq/v785MjJSs27dOv+kpKQ8AFi/fr1f0zo6nU4gkUgYV1dXq8Fg4H3wwQe+BoOh3buEtFqtwMfHx6RQKKxqtVqQkJBw13OYU1JSLrb2ftOmTSvftm2b9+jRo2v9/PzMCQkJfn5+foZRo0a1OJ6tUqmEzzzzDBUSEqL78MMP81qaYX4vSNImiCbUGmN9YlbjelENcotrUFyha3HsuYeHrDExNyRpVyfprRUJohNKSkq6vnz58l7jxo0Ll8vl1hdffLH42LFjrhKJhAGAxYsXFy1btqx3dHS00snJyTJnzpxSDw+PFtcqt6UVK1YUrFmzpldUVFSkm5ubecGCBUX79u3zaKv7LVq0qESr1Qrmzp3b32Aw8MPCwrSbN2++2pCMjxw5Iv/HP/7R96effrrYq1cv05YtWzxv3LghLS0tFQ8aNMi14edMmDCh8oMPPrhxr/fntXdXRnuiKCoQQG5qair8/e/65YvoporLtTh4+gZ+Sy9CWdWtPVxCAQ89vZ0bE3OQnwt6+zrDUdr6Li6iY2FZ9p57QwoLCzF+/HgA6E3TdJ4912RmZuYplcqKe4+Qe1lZWdLY2NiwtLS0803HnIm2kZmZ6aFUKgObl5OWNtEt1RnMOJ5ZjIOnb+BS7p9DVw4SAQJ73Nx67unjDJGQbLrRlVgNOhiLr8BYeBmGosswFl+B0MUTfs+/Dx6P/F0DQGZmpgPDMIiIiNCrVCpRYmJiT6VSqSEJm1skaRPdBsuyuHC9EgdP3cCJ88WNG5FIxQKMVPpi/JCeCOvtDj6ZHNalsCwDc3mhLTkX0TAUXYa5ogjAzb2MfK+eJGE3oVarBatXrw6srKwUSaVSJjIyUrN69eoCruPq7kjSJrq8suo6HDpTgNTTN1BS+Wf3d2hvN8QM7YkREb6kq7sLseo1MBbVt6CLLsNQfBWssdmwh0AIiU8QpH79IPHrB6k/BYGTOzcBd1BjxozRpqWlXeA6DuJmJGkTXZLRbMXvWSqknrqBzKvljRPJPFykeDAqABOG9ISvp/zOP4To8FjGClN5AYyFNAzFl2EsvAxzVfEt9YTOHo3JWeLXDxLv3uAJyRc1ovMhSZvoMliWxeUb1Th4ugBH0wuhM9jWTIuEfEQP6IHxQ3tC2deTrI3uxKy6mj9b0EWXYSy+CtZ886ZXPKEYkh59IPHrC6mfLUkLndw4ipgg7i+StIlOr7rWgLSzBTh4+gYKSv9cKtk3QIEJQ3tidKQf5I633UeB6MAstRWou3IGhkLbWLSluuSWOkKFl60V7dfQiu4FnoC0oomuiSRtolMyWxicvlSCg6dv4GxOGRjG1v+tkEswdrA/JgzpiV49nDmOkmgNc5UKupw/oKNPwlh85abXeCIJJD2Cm7Si+0Iod73NTyKIrockbaJTyS2uwcFTN3D4XCFqdbZ9HAR8HoYP8MGEIT0xOMQbQnImcqfCsizM5TegzfkDdfQfMJX9ud8ETySBQ1AkHAIjIPXvB7FXL/D4ZB92ovsiSZvo8OoMZqSetnV/Xy/682jawB7OGD+kJ8YO8ofCScJhhMS9YlkWxuKr0NF/QJfzx03d3nyJIxz7RkFGDYdDn0jwReTvliAakKRNdGjXi2qwbsupxqVacgcRxgyydX/38Xche3p3IixjhaEgpz5Rn4RVU9n4Gt/RGbJ+QyHrPxwOgQPImDTRYVmtVqxdu9Zv7969HkajkR8WFqZ955138pueiHY7Z86ccXzmmWf6h4aG6nbs2EG35v4kaRMdVurpG9i0IxMmC4MgXxfEju+LYWE+EJNjKjsN1mqGPu+CbYz68ikwdY3HLEPg5AYZNRyy/sMgDQgh3d5Ep5CUlOSTkpLitnXr1hw/Pz/zqlWrAuLi4oL37dt36U6Hgej1et6KFSsCw8PDtVartdWtDTL4R3Q4ZosV/9qRiaTt6TBZGDw0rBfWv/IAHoj0Iwm7E2DMRujokyjbvRH5H/4NJdsTock4CKauFkKFN1yGPwbf59ah5z8+g8fE5+HQawBJ2B1QaWmpcN68eX0GDhwY+cADD4Rv377djaKowYcPH3YCgOLiYtHTTz8dPHToUGVkZOTAyZMnhxw6dMip4frc3FwxRVGDt2zZ4h4TExMWEREx8KmnnupbWVkpSEhI8Bs6dKhy6NChyk2bNnk1XHP48GEniqIGf//9965jx44dEBERMfCll17qXVNTw3/ttdd6DRo0KHLkyJERO3bsaJx9mJWVJX3yySf7RUVFKQcOHBgZGxtLpaenO7TV+7Jr1y7PuXPnlvTv39/o5OTErFq1qrCwsFB67NixO278sHbtWr+oqChNZGRki6eB2Yu0tIkOpay6Du9uOY0rBWqIhHz8fXoEHhrWi+uwiLtgjHWou3oWupyTqLt2DqzZ2PiayLMnZNQwyPoPt00kI0MajYq/eSvYcOOSS3vdT9oztMZ3bsJVe+ouXLiwt1gsZlNTU7N4PB4WL14c2PR1q9WK2NjYigkTJlwXiUTsxo0bfRYvXtznwIEDFzw9PRsPlk9JSXFNTk7O4fF4mDlzZv/Y2NiQOXPmlBw/fjxz//79LkuWLAmeNGmSOigoqLF7+cSJE8579+69VFlZKZwxY0bI9OnTQxYtWlS4fv36/C+++MIzMTExcOLEiTVOTk4MAMTFxalGjBihtVqtvPj4eP9XXnklODU19YJYLG7xRKyJEyeG3uk87WXLlt2YNWvWLedpq9VqQVlZmTgyMlLXUObq6mr19fU1Xrx40XHMmDEtJuTffvtNfuLECcWePXsuffTRRz53eNvviiRtosNIp8uwfttZaOpM8HJzxBvPDEFwgILrsIjbsBp00OX8gTr6JOpyMwFr4+c0JD36QNZ/OByp4RC7+3IYJdEahYWFovT0dOfdu3dfcHNzswLAkiVLio4fP974DzIgIMAcEBCgbni+dOlSVXJysveZM2ccH3744cZxkAULFqg8PDysADBixIiaY8eOKebPn18BAJMnT66Jj4+3ZmRkODZN2kuXLi2Wy+WMXC43KZVKjVarFUyZMqUGAGbNmlW5YcOGnjRNS6OiourCw8MNABp22GFXrlxZFB0d7Xn16lVJaGjozTvv1Nu/f/+l1rwvtbW1fABQKBTWpuUymcyq1Wpb7C7SaDT8+Pj4wDVr1uTJZDKmNfdtiiRtgnMMw+KHQ5fx7a85YFlgUH8vvD5nMJzIhigdkkVThZpTe1B77gBYU8NnIg/SgBDI+g+HjBoGoYsnpzF2Fva2ettbYWGhGACaTq4KDAw0Nq1TWVkpWLNmTUB6erqTRqMR8ng8Vq/XCyoqKm6aRdijR4/GU8EcHBwYNze3m04Jk0gkTPOE1/QkMalUykil0sZk5+joyABAwzW5ubnitWvX+mdnZ8t1Op2Ax+OxAFBWViYMDQ1t/ZvQAmdnZwYAampqbopXp9MJ5HK5taVrVq9e7T98+PCa27XC7xVJ2gSntHozPvzuHE5dKgGPB8x+iMKsGIqctNUBmatUUP++C5qsw42tammvMMhDR8Gx3xCyyUkX4u/vbwKAvLw8cf/+/Y0AkJ+ff9O36MTERH+VSiVOTk7OaUiygwcPjmTZFnuk28yKFSt6ubi4WHbu3HnJy8vLUlVVJYiOjo4EcNsPkZiYmLA7dY8vX748f/bs2bd0jysUCquXl5cpIyNDNmTIkDrA1mWuUqkkYWFhdbf+JODUqVMuWq1WcPDgQTcAMBqNfKvVyouKilJ+//332U17GOxBkjbBmdziGqz7+jRUlTrIHURYPGcwokK8uQ6LaMZYmgf1iR+hy/4dYBkAPMj6D4ci+nFIfIO5Do9oA/7+/ubIyEjNunXr/JOSkvIAYP369X5N6+h0OoFEImFcXV2tBoOB98EHH/gaDIZ2n1Go1WoFPj4+JoVCYVWr1YKEhAT/u12TkpJysbX3mzZtWvm2bdu8R48eXevn52dOSEjw8/PzM4waNarFlvT333+fbbFYGr9AbN682fvChQvyTz755FrTXgh7kdnjBCcOnbmB1z86ClWlDkF+Lvjw1TEkYXcwhoJsqLavRdEXi6G7dBzg8SCPGAf/uCR4P7GEJOwuLikp6ToAjBs3Lnzq1KmhY8eOrQFs3dkAsHjx4iKtViuMjo5WxsTEDHB3dzd7eHjcU6vxflixYkVBdna2LCoqKnLatGkh0dHRtXe/qvUWLVpUMm7cuOq5c+f2HzFihLK4uFiyefPmqw3LvY4cOSJXKpUDG3omevToYakf/zcHBASY5XI5IxKJ2ICAALNQeO/tZl57d2W0J4qiAgHkpqamwt//rl++iHZgtljx+e4L+OVEHgAgZmhPxE2PgIQs5eoQWJaF/uo5VJ/4EcbCHAC2rUSdIidAMXwqhM4eHEfYcRQWFmL8+PEA0Jum6Tx7rsnMzMxTKpUVbRpYG8nKypLGxsaGpaWlnW865ky0jczMTA+lUhnYvJx0jxPtprxaj3e3nsLlG7blXHGPR2DicLKcqyNgGSt02SegPrETprJ8AABfKoNz1MNwGfIoBI7k8JXuJjMz04FhGEREROhVKpUoMTGxp1Kp1JCEzS2StIl2kXm5HO9vO4NanQmerg5449kh6BtAJi5xjbGYoD1/GOrfd8GiLgUACOSucBk2Bc4DHwJf0mZ7VBAdnFqtFqxevTqwsrJSJJVKmcjISM3q1asLuI6ruyNJm2hTDMPif2lXsO2XbDAsMLCfJxbPGQwXOTkEgkuMUY/ac/tRc3IPrDrbUluhqw8Uwx+DPGIs+EKy3K67GzNmjDYtLe0C13EQNyNJm2gzWr0ZScnncPKi7QSnmTH9MPuh/hCQ5VycsepqUHN6H2rP/gLGYNvUSewVCMWIxyELiSbbiRJEB0eSNtEmcotrsG7LaagqdJA5iLD4qUEYEvqXdu8j/gJLTTnUJ3+CJv0gWIttgq80IASKEY/Doc8gsrUoQXQSJGkT913a2QJ88kMmTGYrgnxd8MZzQ+DjLuM6rG7JVFEI9e+7oL1wBGBsGzY59BkE15HTIQ0I4Tg6giDuFUnaxH1jtjD48qcL+Pl4LgBgXFQAFsQqyXIuDhiLr6L6xI+oo08BYAEeH7LQkVCMmA6JdyDX4REE0UokaRP3RYVaj3e3ngadXw2hgI8XHw/HpOHkRKf2xpiNqDr0DWrP/GIrEAjhFPEgFMMfg8itB7fBEQTxl7Vr0qYoig8gEcDzAGQAjgGIo2k6/zb15wBYDqAXgFoAOwAso2na2FJ9ghuZV8qxftsZ1GhN8FDYlnP160mWc7U3o+o6yn7aCHNFIcAXwmXII3AZNgVCJzeuQyMI4j5p75b2UgCzAYwGUARgA4A9FEVF0jR905FlFEUpAWwFMBPA/wD0BPArAA2At9ozaOL2fky7ii0/XwTDApH9PPE6Wc7V7ljGipo/fkLVb9sBxgKRux+8HlsESY8grkMjCOI+a++k/XcA79E0TQMARVFLAZQCGAXgSLO6QQCqaJreUf88n6KonwFEtlewxJ2duliCr/ba9t1/ckI/PDWRLOdqb+aaMpT/9DEMN2zHAztHPQy3cXPBF5EvTgTRFqxWK9auXeu3d+9eD6PRyA8LC9O+8847+U2PMW2urq6O98477/gdOnTITavVCtzc3MzLli270fTccXu1W9KmKMoFtm7uMw1lNE2rKYq6Clsibp609wPIpShqFoAfAAQCmALg3XYJmLgjs8WKL36y7bswb3IYpj9IDo9oTyzLQnvxKCp+/RyssQ4CmQKek1+GY/AgrkMjiC4tKSnJJyUlxW3r1q05fn5+5lWrVgXExcUF79u371LDoSFNMQyD+fPnBwPAtm3bcoKCgkwFBQWipid/3Yv2bGk3bF6sblaubvJaI5qm6yiK+hLAZgDbAAgAbIGty5zg2J6j16Gq0MHfS46po0k3bHuy6rWo+PXftpO3ADj2GwrPR/4OgcyF48iIe7X60IbgS+VX2u0vLtSzb83qca9dtaduaWmpcPny5b0yMjKc5HK59eWXXy6Kj4/v/dlnn10eO3aspri4WLR06dJely9flplMJr6/v7/htddeKxw3bpwGAHJzc8WTJk0KX7FiRd62bdt8SktLxQMGDNB+/PHH1zdt2uSzZ88eDwB47rnnVAsWLCgDgMOHDzvFxcX1S0hIuL5p0ya/qqoq0ciRI9Xvvvtu/po1awIOHz7s6uDgwLz66qsFsbGx1YDtIJOEhISe169fd7Barbw+ffroV65ceWPgwIH6tngPd+3a5Tl37tyShnPGV61aVThq1CjlsWPH5GPGjLnleM6DBw86Z2VlOR06dOi8p6enBQACAgJavX97ex7N2dAN0PwXVNHktUYURT0LYB1srWsxAF8AHrAlboJD1RoDtqdcBgDMf2wAhAJywmt70edlofDz16C7dBw8kRQej74E79ilJGET993ChQt7W61WXmpqatZPP/106cCBAzfNLrVarYiNja04dOhQ1smTJzNGjx6tXrx4cZ/y8vKbGoMpKSmuycnJOWlpaefLysrEsbGxIT169DAeP348c9WqVXkff/xxwPXr12/aN/fEiRPOe/fuvbRnz56LZ8+edZ4+fXrIgw8+qD59+nTGM888o0pMTAzUaDSNHzxxcXGqo0ePnj969Oj5Xr166V955ZVgk8l025bsxIkTQwcOHBh5u8f27dtbnL2pVqsFZWVl4sjISF1Dmaurq9XX19d48eJFx5auOXHihJO3t7fxww8/7DFs2DDlAw88EL5s2bKApvHfi3ZradM0XUNRVD6AKNR3kdd3mfcBkNHCJVEA0miaPlr/XEVR1L8BfNse8RK3982+bOiNFkSFeGNwf3IGdntgLWZUHf4ONSd/AgBIfPvC67GFZBlXJ2dvq7e9FRYWitLT05137959wc3NzQoAS5YsKTp+/LiioU79+dCNPadLly5VJScne585c8ax6VjtggULVB4eHlYAGDFiRM2xY8cU8+fPrwCAyZMn18THx1szMjIcg4KCTE1+VrFcLmfkcrlJqVRqtFqtYMqUKTUAMGvWrMoNGzb0pGlaGhUVVRceHm4AYKi/lF25cmVRdHS059WrVyWhoaEN5TfZv3//pda8L7W1tXwAUCgU1qblMpnMqtVqW9yQQq1WCwsKCqRDhw6tPXToUFZFRYVwwYIFfeLj4wM2bNjQ4sqpO2nviWibASyhKOoQbLPH3wNwGbalX80dBfApRVHRAP4A4AngRQBn2ylWogVXC9U4ePoGBHwenp8axnU43YKp7AbKdifZjszk8eE6agYUo54g+4TfJ3VmPfbSB8EDDzMGTOY6nA6h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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qJj9J-2Tr12r" + }, + "source": [ + "**Exercise:** Suppose the infectious period for the Freshman Plague is known to be 2 days on average, and suppose during one particularly bad year, 40% of the class is infected at some point. Estimate the time between contacts." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e4Wbnqhkr12s", + "outputId": "229a8d3b-9d84-4807-e42d-c36e9766401a" + }, + "source": [ + "\"\"\"Infestious period is 2 days\n", + " 1 out of 2 to recover in any particular day\"\"\"\n", + "\n", + "gamma = 1/2\n", + "gamma_array2 = linspace(0, 1.0, 11)\n", + "gamma_array2\n" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 15 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 262 + }, + "id": "xvF2gh6Ar12s", + "outputId": "8fdc91f5-164c-4996-f772-8fcde2cf1d0c" + }, + "source": [ + "plt.figure(figsize=(14, 4))\n", + "\n", + "for gamma in gamma_array2:\n", + " infected_sweep = sweep_beta(beta_array, gamma)\n", + " label = 'gamma = ' + str(gamma)\n", + " plot(infected_sweep, label=label)\n", + " \n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected',\n", + " loc='upper left')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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0zfffKOUSqVsVlaWVSgUcvn5+cqPPvoodPbs2S2evub8+fNb3nvvvdB//OMfgY888kjbN9984/v999/7vfXWW+UAMHLkSEdWVpax8++rymaz8d944w31zJkzW2UyGQcADz30UNOWLVuiZ82a1a7Vaju2b98eBgD3339/OwA88MAD7a+//nrkSy+9FP7ss89eKS4ulu3duzd49erVNQAgl8u5e+65p+WNN95Qp6WldUilUvb555+PHD16tKGrcmLBggXNv/3tbxP37dvnN23aNOPu3bsDqqurZa+++molAEyYMMEUHh5u37hxo3rDhg119fX1onfffTds3rx5TT+3c7Fjx45Ldru9+xf8nj17VO+//37Y+++/f6HnLLunbnYlFNX5fx6ACAA999pzADgCYGt/35QYukxFeQA4d5M2OWnSNhg6nDa8dfpfOFZ7GgBwT9xE/DojF2KB6CbPJPrD0d4O+qVX3M3Y+HxEL1oI9YMPkAvkQUa2IBt8N02+09wz30IRqTYYCE6DrXvNt73x6jU7XyqEIiEQSk0wZFF+pOEaMSRs27atcvXq1dFTpkxJVSgUzJNPPtmQn5+vkkgkLAAsX768ftWqVSNzcnK0SqXStXDhwsagoKBe99IeTGvWrLm8YcOG6Ozs7PSAgADnkiVL6vft2xc0WO+3dOnSK2azWbBo0SKNzWbjp6SkmHfu3FnRNXN69OhRxdNPP53wxRdfnIuOjnZYrVbBli1boq5cuSLh8/lcYGCg8+GHH25cunTpFU9fMzY21vHKK69UbNmyJeqll16KDgwMdPzxj3+s7tquCwC2b99etWbNmhFTpkxJ4/P53OTJk9v/93//93LX4/Pnz29vamoSLVu2LL5z72zrzp07L3aVxvv5+bE7d+4s37BhQ/SuXbvCfX19XY8//nhDbm5u9/7cGzduvLx27doRs2fPTmFZljd69GjDCy+8UNP1+Pjx4y1//OMfa/785z9HrVq1ShwREWHbtm1bRVdyKhQK8eabb15cu3Zt9Lhx47RSqZSdM2dOyzPPPNP4czsXISEh1yTbfn5+DJ/P56Kioq5ZuuEpnielKBRFvQPgWZqmjTc9eAihKCoGQFVeXh4iI296o+1nj2NcqH39t2DM7QhftBGyEQO7RocAavX1ePn4/6HB1AiJUILF2Y9iQvQYb4d1xzGcOw96y8twtrdDpPIHtWIZ/FJSvB3WHU3fZsWJI5UoPFkLl9O9LDAqRoVxU+KRmBRCkpRbZNK3orzoe1SUnEJzQ/c1A0RiKWKSOhuukeR7wLjMDpjL3TPftgZT9zhfLIBPfACUVDDkMf7gkRtLQ1JdXR2mTp0KACNpmq6+1dcrLi6u1mq1LTc/cugpKSmR5ubmphw+fPhszzXcBEHcPsXFxUFarTbm+nFPawOX9nYsRVEBAFzDLUEnemetOAPG3A5RoBrSqCRvh3PHOVJ1Am+f2Q0H40SUbziWjX8Sal/SpXsgcRyHhj1foPqfuwCWhW9KMqg/LIM4QHXzJxM/CdmCbHC1XLmMwm+/QvnZH8Cx7hscIrEUI5PSEZ86GiMSR5Hke4AwVifMF1tgKmtBx2VD9zhPyIdPXEDndmMq8EWktwQxdBUXF8tYlkVaWlqHTqcTbdq0aYRWqzWRJJwghh5PE/H3AHwN4LXrxh8BMBPAnIEMivAOY8FBAICSNGkbUHaXA38r+ACHq44DACbFjMUTWY9AIiQXzwPJZbHg4qtvoO37HwAA6nlzEf2rR0lDtkFAtiAbfA3V5ThzZB9q6GIAAI/PR0LaGCRo78KIhFQIRWQpy0BgbC5YKlphKmuGtUbf3ZaWJ+BBPlIFJRUMn7gA8MXk90h/cByHpqYm0DSNuro6jB07FrGxsd4O62dBr9cL1q9fH9Pa2iqSSqVsenq6af369Zdv/kyCIG43TxPxuwCs6mX8CID1AxUM4T1OfRM6KosAgRDK1MneDueO0WC8gpePv41aQz1EAhGeyFyAu2PHeTusO46lqhplL26BTXcFAh85Ep59GoF3kZL/gda1BVn+oQrU17i3oRWJBci4K4psQTYAOJZFNX0WBd/ug67mIgD3dmPJ2ROR/osZ8FUN2vLJnxXWwcB8qRXmshZYq9vBMV3ZNyCPUUGpCYJPfCAEUtJQsL9aW1tRVlYGmqbR3t69LPOar4nBNWnSJPPhw4dLvR0HQRA35+mnjA+A3jrBMQAUAxcO4S1dTdoUGtKkbaAcrz2Nnad2weayI1wZgmXjfoNof9KrYKA15h1C5c7/A+twwGdkDKhVKyALJyX/A4lsQTa4GMaFi8UnUXB0H9oa6wEAEpkP0nKmIi1nKmQKUmFwq1gnA0tVO8xlLbBUtoFzdW9vDFmUH5SaYCgSAiGQk0qD/mpvbwdN06BpGi0tV5dRy2QyJCYmQqPRQK1W3+AVCIIgfp48TcTPAZgH4E/XjecCKBvQiIjbjmMZmIrzAADKzOlejmb4czJO/KPoYxyoOAoAGBeVhSdHL4RcJPNyZHcW1uFA5Vt/RePBbwAAIdOmIPbJJyCQkG2aBgrZgmxwOR12nD/9HYq++xomfSsAwMdXhYxfzEDy6EkQS6RejnB44xgWlmo9zGXNMFe0gXMy3Y9J1b5QUkFQJAZBSG4k9ZvRaOxOvhsbuxsnQyKRICEhARqNBlFRUeDzSTM7giCIvnh6FbUFwLsURYUCONg5dg+AxQAeG4S4iNvIerGrSVsEpFGkU/qtaDK34OXj/4fK9loI+UL8R3ou7omfSNbcDzDblSsoe/ElWCqrwBeLEbv4CYROm+rtsO4YZAuywWWzmnH2RB7OnvgGNou7wsA/OAyZE+8FlZ4DgZDc4PipOJaDtVYPc1kLzBdbwNqvJt+SUAWUmiAoqCCIfMlNjv6yWCzdyXdDQ0P3uEgkQnx8PDQaDaKjoyEgfTkIgiA84tGnPU3TH1AUJYd7PfjTncN1AJbQNL17kGIjbhNj4QEApEnbrTpVX4w3fvgHrM4OBPsEYtm43yAuINrbYd1x2k6eQvm218BYLJCGhYJatQKK2JHeDuuOQLYgG1xmQxsKv9uP86e+hdNhBwCERsYic/K9iE3KAI/MHv4kHMeho87onvkubwXTcbU5tDhI7i47p4IgVpGqpP6yWq2oqKhAWVkZLl++2u9LKBQiNjYWGo0GMTExEJHmgQRBEP3m8W13mqbfAfAORVHBnd83D1pUxG3jNDSh4xJp0nYrXCyD987uwV7aXSKdrdZiyZhFUIh9vBzZnYVjGNT8azfqP/kMABBw12gkPPM0hApynm8V2YJscLU1NaDw6Fegi06AZdwztCMSRiFz8n1Qj6TIDdCfgOM42HQmmOkWmOgWMGZH92Milaxz5jsYkiDSQLC/7HZ7d/JdW1sLtnPbPD6fj5EjR4KiKMTFxUEsJiX9BEEQt6Jf9W8URaUBSADwVef3EgBOmqbZGz6RGLK6mrT5aMZCICcNgfqrxdqGbcf/ivLWSgh4fCzUPoj7EqeSC+sB5tDrUf7SKzCUlAJ8PqIXLYT6wQfIeb4F3VuQHapARZn7virZgmxgXam9hIJv96HyfAEAgMfjISFtDDIn3YvgCFIt018cx8HeZIG5rBkmugUuo737MaGvBEpNMJSaIIiDfcjvhn5yOp24dOkSysrKUF1dDabzhhGPx0NMTAwoikJ8fDykUlLSTxAEMVA8SsQpigoA8CmAiXDvspkAoBLAGwCMAJYNVoDE4OFYBqaiQwAA34x7vBzN8FOkO4fXvn8HJocFgTIVlo77L1BBcd4O645jPH8BZX/eCmd7O0T+/qBWLIPfqBRvhzVskS3IBhfHcai9WIqCb/ehvtLdy1QgFCIp6xfI+MVM+AWGeDnC4cfeYu1MvpvhbLd1jwsUYiipICg1wZCEKUjy3U8ulwtVVVUoKytDZWUlXK6rm+NERUWBoigkJCRALie/EwiCIAaDpzPiL8G9VVkM3B3Uu3wMYKunb0ZRFB/AJgD/BfeWaPkAFtM0XdPH8bLO4+cDUAHQAXiapumvPH1Pom/WigIw5jaIAiIgHUGatHmKZVl8eG4vPjv/NThw0IYl4+mx/wlfCdnJbyBxHIeGz79E9T/eBVgWvinJoP6wDOIAlbdDG5bIFmSDi2UYVJSeRsG3+9CiqwUAiCUyjBp7N7Tj74GP0s/LEQ4vjvYOd9l5WTMcLdbucYFMBAUVBCUVBGmkL0m++4lhGNTU1ICmaVRUVMDhuFrSHx4eDo1Gg8TERCgU5POMuLMwDIPNmzer9+7dG2S32/kpKSnmP/3pTzUxMTGOmz339OnT8l//+tea5ORky8cff0zfjniJnwdPE/F7ADxA03QtRVE9x8sBjOjH+60E8AjcM+v1AF4G8CVFUenXl7dTFMUD8Fnnt7+gabqKoqjIfsRM3ISxgDRp6y99hwHbv/8bzjWVg8fjYcGo+zE3aQb4PNJkaSC5LBZUvPYGWk/8AABQP/gAohctBI904+03u82Fgh9q8QPZgmxQuJxOlBXko+DoVzC2uUv85Uo/pI+/Byl3TYZESmYTPcU6GRjPNcFY0gh7580iAOBLBFAkume+ZVF+pGlgP7Esi8uXL4OmaVy8eBE229WqgpCQEGg0GlAUBV9fshyFuHNt27Yt7ODBgwH//Oc/y9RqtfO5556LWrx4cfy+ffvO36jTf0dHB2/NmjUxqampZoZhyC8fYkB5egUWAKC9l3ElgP6sD/8tgBdpmqYBgKKolQAaAUwAcPS6Y6cDmAQgiqbpFgCgabquH+9F3IDL0IyOS4XuJm1pk70dzrBwrqkc2078FQabEX5SXzw79nGMCqVu/kSiXyzVNSh7cQtsDToI5HIkPPsUAsfe5e2whh2L2Y6T31Xj1DGyBdlgsNusKP3+MIqPHYDVbAQA+AWEIGPSLGgyxkNIukh7zGV1wlCkg6GwAUyHuzyaJxJAkRAAJRUMeYw/eOTntV84jkN9fT1omkZ5eTms1qtVBYGBgd3Jt0pFKozuNI2NjcLVq1dHFxUVKRUKBfO73/2uft26dSPffPPN8smTJ5saGhpEK1eujC4vL/dxOBz8yMhI27Jly+qmTJliAoCqqirxzJkzU9esWVO9a9eusMbGRvGoUaPMr732WuWOHTvCvvzyyyAAeOyxx3RLlixpAoAjR44oFy9enLhx48bKHTt2qNva2kTjx4/Xv/DCCzUbNmyIOnLkiEomk7G///3vL+fm5rYDQElJiXTjxo0jKisrZQzD8OLi4jrWrl1bm5GR0TEY52XPnj3BixYtuqLRaOwA8Nxzz9VNmDBBm5+fr5g0aZK5r+dt3rxZnZ2dbVIqlcyZM2eUgxEb8fPlaSJeAGAmgB3Xjf8awA+evABFUX4AogGc7hqjaVpPUVQFgHT8OBGfAqC3GN6VAAAgAElEQVQKwB8piloAwAbgSwD/Q9N0n/9gCM8Yu5q0UXeRJm03wXIs9lzYjw9KvwTHcUgJScSzYx+Hv4yUmg60pkOHcekvb4F1OOAzMgbUqj9AFh7u7bCGFY7jUPB9LQ58cR5Oh7vhEtmCbOBYjHoUHzuAkh8Ow2l3zywGR4xA5qT7EDcqG3yyBZnHHO0d0J+uh/FcEziX+56+JFQBVbYaPvEB4ItIBUx/cByHxsZGlJWVgaZpmM1XL5X8/f27k++goCAvRnln+MeO4/E1l9pu20VAdFyA4T+WjKvw5Nhnn312pFgs5vLy8kp4PB6WL18e0/NxhmGQm5vbMm3atEqRSMRt3749bPny5XEHDhwoDQ4O7m4UcPDgQdXu3bvLeDwe5s+fr8nNzU1auHDhlWPHjhXv37/fb8WKFfEzZ87Ux8bGdpd2Hz9+3Hfv3r3nW1tbhQ899FDSvHnzkpYuXVq3ZcuWmrfffjt406ZNMTNmzDAolUoWABYvXqwbN26cmWEY3rp16yKfeeaZ+Ly8vFKxWMz19mebMWNGclNTU5/rqFatWlW7YMGCtuvH9Xq9oKmpSZyenm7pGlOpVExERIT93Llz8r4S8W+//VZx/Phx/y+//PL8q6++GnaD004QP4mnifgGAHs6S8MFABZRFJUC4AG4E2ZPdGV7+uvG9T0e6ykIQBKAAwBiO7//FO416Ys9fE+iFxzLwFScBwDwzSRN2m7EaDfj9e/fQdGV8wCAeckz8VDKbAj45AJxILEOByrf/hsa9x8EAIRMnYLYxU9AIJF4ObLhxWpxYO9HZ1FWcgUAEJ8UgglTyBZkA0Hf0ojC777ChTPHwDLua9XIuCRkTroPUfHJZHlPP3Q0GNF+qh6Wi63dY/JYFVSjIyEj6777heM4tLS0gKZplJWVwWAwdD+mVCpBURQ0Gg1CQkLIef0ZqKurExUWFvp+/vnnpQEBAQwArFixov7YsWP+XcdERUU5o6Kiuq/FV65cqdu9e3fo6dOn5bNmzTJ2jS9ZskQXFBTEAMC4ceMM+fn5/k888UQLAMyePduwbt06pqioSN4zEV+5cmWDQqFgFQqFQ6vVmsxms2DOnDkGAFiwYEHryy+/PIKmaWl2drY1NTXVBvckGwBwa9eurc/JyQmuqKiQJCcnX10/0cP+/fvP/5TzYjQa+QDg7+/P9Bz38fFhzGZzrxd0JpOJv27dupgNGzZU+/j4kN2hiEHhUSJO0/RBiqLmAPh/cJeir4J7ZnsGTdPHPHyvrn/c199B9O/xWE8muBvEraZp2gaglqKoFwG8DpKI3xJrRQEYUxtEAeGQjiDdp/vCsAw2H3kVVfrLUIp98NTYx5ARPsrbYd1xbI2NKHvxJVguVYInEiFu8RMInT7N22ENO1UVLdjzXhFMBhskUiHu/WUqUjPV3g5r2Guqr0bBt/twqfQ0OI4DeDzEpmQha9K9CI2K9XZ4wwbHcbBUtKH9dD1s9e6PfJ6AB2VSCPyz1WS/735qa2vrTr7b2q5OAPr4+CAxMREajQbh4eEk+R4kns5O3251dXViAOjZgCwmJsbe85jW1lbBhg0bogoLC5Umk0nI4/G4jo4OQUtLyzXracLDw51dX8tkMjYgIMDZ83GJRMJen8RGRER0HyOVSlmpVNqdwMrlchYAup5TVVUl3rx5c+SFCxcUFotFwOPxOABoamoSJicPbANhX19fFgAMBsM18VosFoFCoWB6e8769esjx44da7hR2TpB3Ko+E3GKop4D8BJN01aKokYAOEzT9KGf+kY0TRsoiqoBkI3O8vTOcvU4AEW9PKWg8/89y1N6LVUh+sdU6J51JE3abuxAxVFU6S8jWB6ADVOXI0hOZhUHWtup0yh/5VUwFgukYaGgVv0BiliS3PQHw7D4dn858g9VABwQGa3CgwszoAokic1PxXEc6isv4MyRfbhc4d4ohC8QICljHDImzoIqmCyX8BTrZGA634T20/XdW4/xJQL4pYfDPyMCQtKt32MGg6E7+W5ubu4el0ql3cm3Wq0myyN+xiIjIx0AUF1dLe5aC11TU3PNP7JNmzZF6nQ68e7du8u6EuesrKx0jru9l9hr1qyJ9vPzc3322WfnQ0JCXG1tbYKcnJx0AH1emE6fPj3lRqXpq1evrnnkkUd+VJru7+/PhISEOIqKinxGjx5tBdzl6jqdTpKSkmL98SsBJ0+e9DObzYJvvvkmAADsdjufYRhedna29sMPP7zQsxKAIH6qG82IPwdgJwAr3Gu1wwE03eL77QSwgqKoQ3B3TX8R7s7r+b0c+xmAFwBspihqLYBAuLuuf3yLMfysuQzNsF4qBPhCKFMnezucIctgM+KD0i8BAI9lPkyS8AHGMQxq33sfdR9/CgAIGDMaCc8+BSHZMqdf2los+PRfhWio1YPHAyZMT8Ck6Qngk8ZWPwnLsqg6X4Az3+5DU10VAEAkliLlrklIHz8DCj/S2MpTjNUJfZEOhkIdmM5mgUJfCfyzIuCXGga+mCzv8YTJZEJ5eTlomoZOp+seF4vFSEhIgEajQVRUFG7U9Zn4+YiMjHSmp6ebnn/++cht27ZVA8CWLVuuKY2yWCwCiUTCqlQqxmaz8bZu3Rphs9lu+w+Q2WwWhIWFOfz9/Rm9Xi/YuHFj5M2ec/DgwXM3O6Yvc+fObd61a1foxIkTjWq12rlx40a1Wq22TZgwodcZ7w8//PCCy+Xqvimwc+fO0NLSUsXrr79+qWe1AEHcihsl4joA8yiK+hLuu1NhFEX1ejxN0w0evt+f4S5Nz8fVfcTvp2mapSjqFwC+ApBM03QtTdNmiqLugbsUvRXuteQfAVjr4XsRvTAWHwI4Fj5JORD4kGZjffnX2T2wOjuQEZ6C7Ig0b4dzR3Ho9Sjfug2GsyUAn4/oXz0K9YMPgEdmcfrl7Jk67PukFA67C77+Ujz4aAai4wK9HdawxLicoAtPoODoV9C3uNfXS30U0I6bjtSxUyCVkxtEnnLoO6A/3QBjaWOPBmw+UI2OhCIxiDQL9IDVau1Ovuvqrm4WIxKJEBcXB4qiEBMTA6GQbD1I/Ni2bdsqV69eHT1lypRUhULBPPnkkw35+fkqiUTCAsDy5cvrV61aNTInJ0erVCpdCxcubAwKCrrts7tr1qy5vGHDhujs7Oz0gIAA55IlS+r37ds3aJ0Ely5desVsNgsWLVqksdls/JSUFPPOnTsrum5iHT16VPH0008nfPHFF+eio6Md4eHhrp7PVygUrEgk4qKiokgSTgwYXl+lKBRFPQ3gFdygRKTzMY6m6SF5K5aiqBgAVXl5eYiMvOmNtjsexzKoff2/wZhaEb5wPWQxqd4OaUgqb6nEH/O2QMgXYuvM/4dwZYi3Q7pjGM9fAL3lZTja2iDy9wf1h9/DL5Wsu+8Pu82JfZ+UoqSgHgCQlBaO2Q+lQiYnJb795bB34NzJb1GUvx8Wo7t3kdI/EBkTZyEpawJEYtIs0FM2nQntJ+tg7tmAbaQKqtFq997fZBnUDdlsNly8eBE0TaO2thZd12YCgQCxsbGgKAqxsbEQkW3xPFJXV4epU6cCwEiapqtv9fWKi4urtVptyy0H5gUlJSXS3NzclMOHD5/tuYabIIjbp7i4OEir1cZcP97n7VSapl+jKOpjuNdwHwXwSwA/WndBDB/WS4VgTK0QqsIgjSbJT29YlsXfCj4AAMymppIkfIBwHIeGL/ai+u//BFgWvslJSPzDMkgCScl/f9TVtOPTXYXQt1khEgswc24K0sdEkSSnn6xmI84eP4iSE4dgt7mXBwaEqpE16T7Ep42GQEBmGj3BcRwsl9rQfupqAzbwefBNDu5swObj3QCHOIfDgUuXLqGsrAzV1dVgWXcFAZ/Px8iRI0FRFOLi4iAhu0cQ/VBcXCxjWRZpaWkdOp1OtGnTphFardZEknCCGHpueLVB07QOgI6iqA0A9tM03WtDA2J46GrS5kuatPUpr/IYKttrEShTYV7yLG+Hc0dwWa2oePUNtJ74HgAQMfd+RC9aCD4pq/QYy3I4dqgCR/aXg2M5hKl9MW9hJoJCScl0fxjbmlH43dc4f/o7MC73NWlETCIyJ92LaCqN/F70EOtirzZga+sA0NmATRsO/8xwCBUkcbyRpqYmFBQUgKZpuFzu6lcej4cRI0ZAo9EgPj4eMpnMy1ESw5VerxesX78+prW1VSSVStn09HTT+vXrL3s7LoIgfszT7cs2DHYgxOByGVtgrShwN2lLu9vb4QxJJrsZu0s+BwD8OuOXkArJxeStslTXoOzFLbA16CCQy5HwzFMIzLnL22ENK4b2DuzZXYiaS+6CpLGTYjHlXgpC4ZBcETQkteguo+DoPlw8exJc56xjTFI6sibei/CYBC9HN3wwHU4YinTQF+rAWDsbsCkl8M+OgF9qKPhicnOtLyzLorKyEgUFBbh8+WpOpFarodFokJCQAB8fUkFA3LpJkyaZDx8+XOrtOAiCuDmPPjUpipLDvXf4NAChAK7pqkTTNNlvaIgzFXU2adOMJU3a+vB+yRcwOyxIDaUwNjLT2+EMe02Hj+DSjjfBOhyQx0RDs+oPkEVEeDusYeXCWR2+/PAsbB1O+CglmPtIOuKoYG+HNSxwHAdd9UWc+fbfqKHPAgB4fD6ojHHInDgLgWGkb4innHob2s/Uw1jSowFbSFcDtkDwSJf+PtntdpSWlqKwsBAGgwGAu+laamoq0tPToVKRTvwEQRA/V57evv4LgNkAPgDQALKf97DCsQyMRd8AAHwz7/FyNENTZVsNvrmUDwGPj//MmE9KVG8B63Cg8u130Lj/AAAgZMrdiP3tbyAg6xw95rC7cOCL8yj4vhYAEJ8Uggfma+GjJOfwZjiWRTV9Fme+/Teu1FQAAIQiMZJHT0T6hBnwVQ1aU947jk1nQvupepgvtnR/6stjVFCNIQ3Ybqa9vR2FhYUoLS2F0+muHvDz80NGRgZGjRpF1n0TBEEQHifiswHMp2n6m8EMhhgcHZeKejRpS/F2OEMOy7H4a8EH4MBhVuJURPqFezukYcvW2ISyF1+C5dIl8EQixD75BEKnTyUX7P1wpd6AT3cVoqXJDIGQj+mzkzB6Qgw5hzfBMC5cLP4BBd/uQ1uTe0dNicwHaTlTkTZuGmQ+Si9HODxwHAdLZRv0p+rRUXe1AZsyORiqbDUkwaR8ui8cx6G2thYFBQWorKzsHo+KikJmZiZiY2PBJ9s0EgRBEJ08TcQdAGoHMxBi8BivadJGLgKu923V97jYWgWV1A+5Kfd6O5xhq+30GVx85VW4zGZIQkOgWbUCijiyasVTHMvhh++qkPfvMjAMi+BQBeb9KhOhEb7eDm1IczrsOH/qKIry98Okd2+dpfBTIX3CTCSPngixROrlCIeHXhuwiQXw04bBPzMCQlKN0Sen04mysjIUFBSgpcW9w5VAIIBGo0FmZiZCQsjuGwRBEMSPeZqIvwFgMYDlgxgLMQhcxlZYK86QJm19sDis+NfZzwAAv9LOg1xEOtX2F8cwqN39Aeo++gQAoBqdjcSlT0OoIB29PWU22fH5+0W4VNYMAMjKicY99ydDJCYN2W7kUulpfPv5u7Ca3TO3quBwZE66F4nasRCQrvweYTqcMBRfgb6g4doGbFkR8E0NhUBCzmNfzGYzioqKUFxcDJvNBgDw8fGBVquFVquFXC73coQEQRDEUObpJ2w0gF9SFDUFQDHcM+TdaJp+cqADIwaGqTivs0nbXaRJWy8+LN0Lo92MpOB4TIge7e1whh2H3oDyra/AcLYE4PMRvfARqOfNBY+UX3qsoqwJn+8ugsXsgEwuwpyHtdCkhnk7rCHNajbi6Be7UFFyCgAQEjkS2ZNnY2RSOvnZ81BvDdjEwT5QjVZDSQWRBmw3oNPpUFBQgPLy8u69v0NDQ5GZmQmKoiAQkBtoBEEQxM15mojHw52AA+6kvCfSuG2IcjdpywMA+GaQJm3Xq9HX4euKI+DxeHg8kzRo6y/jhTLQW7bC0doGkZ8fEv/we/inpXo7rGHD5WKQ9+8y/HC0CgAQEx+IuY+mw9ePVGX0heM4lBd/j+++fA82qxkisQTjZj6MUXdNJgm4h2xXOhuwlfdswOYP1ehIyEaQBmx9YRgGFy9eREFBAXQ6HQD33t+JiYnIzMxEREQEOXfXYRkn2huLYWi+gJARE6BQjfR2SARBEEOKp/uIk5rmYaijsgiMscXdpC1mlLfDGVI4jsPfCj4Ax3GYmTAZ0f5kKyNPcRwH3Zf/RvXf/wmOYeCbnITEPyyDJDDA26ENG82NJny6qxCNDUbw+TxMnklh3N1x4PPJhXxfzIZ2HPn8n6i+UAQAiIpPwd3zHiNd0D3AcRysle1oP1V3bQO2pCCoRkeSBmw30NHRgZKSEhQWFsJsNgMAJBIJ0tLSkJ6eDl9f0sPhenZrC5ovf4+WhlNgnFYAgEwRRhJxwqsYhsHmzZvVe/fuDbLb7fyUlBTzn/70p5qYmBhHX8+hKCpLLBZzfD6/e9Lx3XffLUtLS+u4PVETdzqy+OsO1t2kLX0aadJ2nfyaU7jQXAFfiQLzR83xdjjDhstqRcVrO9B6/AQAIGLu/YhetBB8sh7XIxzHoeD7Wuz//BxcThaqQDnm/SoD6hFkL+G+cByHC2fykf/v3XDYOiCWyjDhvgVIyvoFmYG8CdbFwnShCfrTDXC0uhOirgZsfpkREJEGbH1qbW1FQUEBzp8/D5fLBQAICAhARkYGUlJSIBKJvBzh0MJxLAzNZWi+fBzGVrp7XO4bieCoHASGZ3kxOoIAtm3bFnbw4MGAf/7zn2Vqtdr53HPPRS1evDh+375952+0nOS11167OHnyZNNtDJX4Genz6pmiqLcALKNp2tz5dZ/IGvGhx2VshfXiGYAvgII0abuG1dmBd4vdjcUWpj0IHzFpqOMJS00tyl7YAltDAwQyGRKefQqBOWO9Hdaw0WF14MsPz6Ks5AoAIC07ErMeHAWJlNzE6IuxvQWHP/s7Ll88BwCI0Wgxee5/QOFHblzcCGNzwVCsczdgs3Q2YFOI3Q3Y0sJIA7Y+cByHqqoqFBQUoKampns8JiYGmZmZiIkh2whez2k3o6X+JFrqvofD1g4A4PGFCAhLR3DUOPj4RXk5wsHx6VsvxDdU0bet8U7ESMow78nVFZ4c29jYKFy9enV0UVGRUqFQML/73e/q161bN/LNN98snzx5sqmhoUG0cuXK6PLych+Hw8GPjIy0LVu2rG7KlCkmAKiqqhLPnDkzdc2aNdW7du0Ka2xsFI8aNcr82muvVe7YsSPsyy+/DAKAxx57TLdkyZImADhy5Ihy8eLFiRs3bqzcsWOHuq2tTTR+/Hj9Cy+8ULNhw4aoI0eOqGQyGfv73//+cm5ubjsAlJSUSDdu3DiisrJSxjAMLy4urmPt2rW1GRkZgzLbvGfPnuBFixZd0Wg0dgB47rnn6iZMmKDNz89XTJo0yTwY70kQN3OjT+OEHo8n3OA4skZ8CDIVH3I3aaNyIFT4ezucIeWTc/ugtxmREBCDSSNJIumJpiPf4tKON8Ha7ZBHj4Bm1QrI1BHeDmvYqK5owWfvFcFksEEiFeLeX6YiNVPt7bCGLI5lUXryCI5/9RGcDhskMh9MnLMQieljSSJ0A06DDfozDTCUXAHn7GrAJodqdCRpwHYDDocD586dQ2FhIdrb3cmkUChESkoKMjIyEBgY6OUIhxaO42DRV6P58gm0N54FxzEAALEsAMFROQiKGA2hmCx38JZnn312pFgs5vLy8kp4PB6WL18e0/NxhmGQm5vbMm3atEqRSMRt3749bPny5XEHDhwoDQ4OdnUdd/DgQdXu3bvLeDwe5s+fr8nNzU1auHDhlWPHjhXv37/fb8WKFfEzZ87Ux8bGdpd2Hz9+3Hfv3r3nW1tbhQ899FDSvHnzkpYuXVq3ZcuWmrfffjt406ZNMTNmzDAolUoWABYvXqwbN26cmWEY3rp16yKfeeaZ+Ly8vFKxWNxrbjFjxozkpqYmcV9/9lWrVtUuWLCg7fpxvV4vaGpqEqenp1u6xlQqFRMREWE/d+6c/EaJ+OrVq0e6XC5+SEiIPTc3t/nxxx9v6etYguivPhPxnuvCyRrx4YVjGZiKvgEAKDOmezmaoaXOoMO+8kPggYf/yloAPinZvyHW6UTV23/Dla8PAACC756MuP9+EgIJKWn1BMOw+HZ/OfIPVQAcEBmtwoMLM6AKJFUYfTG0NuHQp++gvrIMABA3KhuT7v8V5Eqy60NfbI1mtJ+qg5nu0YAt2h/+o9WQR/uTmxd9MBqNKCwsRElJCex2OwBAqVQiPT0dqampkMlI48SeGJcdbboCNF8+gQ6zrnOUB7/gZARH5cA3MPFnswzO09np262urk5UWFjo+/nnn5cGBAQwALBixYr6Y8eOdc/IREVFOaOiovRd369cuVK3e/fu0NOnT8tnzZpl7BpfsmSJLigoiAGAcePGGfLz8/2feOKJFgCYPXu2Yd26dUxRUZG8ZyK+cuXKBoVCwSoUCodWqzWZzWbBnDlzDACwYMGC1pdffnkETdPS7Oxsa2pqqg2ArfOp3Nq1a+tzcnKCKyoqJMnJyV3j19i/f//5n3JejEYjHwD8/f2ZnuM+Pj6M2Wzusy59x44d5Tk5OWaBQIDDhw8r165dG+tyuXhPPvlk80+JgyCuR+rT7kAdlcVwGVsg9A+FbCTpYt2F4zi8U/gBGI7FtLhfIDbg+g0AiJ5sjU2g//wSzBWXwBOJEPvkfyF0+jRyUe+h9lYLPt1ViPpaPXg8YML0BEyangA+mZXsFcuyOHv8G3x/4BO4nA7IFL6YdP+vEJ9KthXsDcdxsFa1o/1UPTouG9yDXQ3YstWQhCi8G+AQxXEc6uvrUVBQgIqKCnCc+85FREQEMjMzkZCQAD7pwH+NDnMjmi+fQGvDabCM+4aFUOSDoMi7EBQ5FhIZWSoyVNTV1YkBoGcDspiYGHvPY1pbWwUbNmyIKiwsVJpMJiGPx+M6OjoELS0t1zQ+CA8Pd3Z9LZPJ2ICAAGfPxyUSCXt9EhsREdF9jFQqZaVSKdv1vVwuZwGg6zlVVVXizZs3R164cEFhsVgEPB6PA4CmpiZhcnLyTz8JvfD19WUBwGAwXBOvxWIRKBQKpvdnAVOnTu1eGz5z5kzj2bNnG/ft2xdIEnFioJBE/A7U3aQtgzRp6+mHukKUNNJQiH3wSOr93g5nSGs7fQYXX3kVLrMZkpAQaFb9AYr4OG+HNWycPVOHfZ+UwmF3wddfigcfzUB0HClv7Ut7kw55n/wVV2ovAQAS08fiF7MfhcxH6eXIhh7WxcJc1oz2U/XXNGDzTQuDf2YERL6kWqU3LpcLNE2joKAATU1NAAA+nw+NRoPMzEyEhYV5OcKhhWMZ6JtK0XT5BMztl7rHFf4jERyVA//QVPD55BJyqImMjHQAQHV1tbhrLXRNTc01pdybNm2K1Ol04t27d5d1Jc5ZWVnpXTelbpc1a9ZE+/n5uT777LPzISEhrra2NkFOTk46gD7v9k+fPj3lRqXpq1evrnnkkUd+VJru7+/PhISEOIqKinxGjx5tBdzl6jqdTpKSkmL1NGY+n8/d7vNE3NnIb9E7jMvUBuvF06RJ23VsLjv+UfQxAOCR1AeglJDZot5wDIPa9z9E3Yfuc6XKzkLC0qchUpKEyBN2mxP7Pi1FyZl6AEBSWjhmP5QKmbzP64afNZZhUPjd1ziZtweMywUfX39MnvsfGJmU7u3Qhhx3A7YrnQ3Y3JNdQoUY/pkR8NWSBmx9sVgsKC4uRnFxMazWzq20ZDJotVpotVooFOSzoCeHTY+Wuh/QUn8STru7SpkvECMgPBPBUTmQK0lvkKEsMjLSmZ6ebnr++ecjt23bVg0AW7ZsuaYhicViEUgkElalUjE2m423devWCJvN1nfb8EFiNpsFYWFhDn9/f0av1ws2btx4031kDx48eO6nvt/cuXObd+3aFTpx4kSjWq12bty4Ua1Wq20TJkzodX34mTNn5CzLIi0trYPP53NHjhzxff/990Mff/xxXW/HE8RPQT657zBXm7SNhVBBysW6fHb+a7Ra2zFSFYWpseO9Hc6Q5DQYQG/dBkPxWYDPR/TCR6CeNxc8Uqbpkbqadny6qxD6NitEYgFmzk1B+pgoUsrfh5Yrl5H38d/QXF8NAEjO/gXG37sAEhlZP98Tx3IwllxBy3c1YG3uPkriIDlUo9VQaoJJA7Y+NDU1oaCgAGVlZWAYd+VpcHAwMjIykJSUBCHZcrEbx3EwtVWg+fJx6JvPA5y7mljqE+reeiwiCwKh1MtREp7atm1b5erVq6OnTJmSqlAomCeffLIhPz9fJZFIWABYvnx5/apVq0bm5ORolUqla+HChY1BQUF97qU9WNasWXN5w4YN0dnZ2ekBAQHOJUuW1O/bty9osN5v6dKlV8xms2DRokUam83GT0lJMe/cubOia+uyo0ePKp5++umEL7744lx0dLSjoaFBtG3btsiWlhYxn8/nQkJCHIsXL274zW9+Q8rSiQHDu5NLLCiKigFQlZeXh8jIm95oG/Y4lsHlHb+Dy9CMsEf+H+SxZFYJAHSmJiz/eiNcrAubpq5AYlCst0MacswVl3DhTy/A0doGkZ8vEv+wDP5ppL+AJ1iWw7FDFTiyvxwcyyFM7Yt5CzMRFEpm2nrDuFw4c2QvTh/ZC5ZhoPQPxN0PPoYRiaO8HdqQ09FgRHNeJeyN7gkbWaQvVHdFQR5DGrD1hmVZXLp0CQUFBairq+sej4uLQ2ZmJqKiyI2xnlzODrQ2nEbz5ROwWztzCx4fqpBUBEflQKGKHbbnq66uDlOnTgWAkTRNV9/q6xUXF1drtdph2S27pKREmpubm3L48OGzPddwEwRx+xQXFwdptdqY68fJLeE7SEfVWWSyyssAACAASURBVLgMzRD6h0A2Ms3b4QwJHMfhnYIP4GJdmDwyhyThvbA3N+P8/26G02CAMkkDasUySMh2PR4x6jvw2XtFqLnUCgAYOykWU+6lIBTe9iq/YaGpvhp5H/8VrVfcSVLq2CnImZkLsYR0p+7JZXGg9bsaGEsbAQBCpRhBk2OhSAwctonRYLLb7SgpKUFRUREMBnfjOrFYjFGjRiEjIwP+/mQLz56sxjp38zVdITjWnZeJJH4IjrwLQZF3QSTx9XKExK0oLi6WdZVU63Q60aZNm0ZotVoTScIJYujxKBGnKCoYwEsApgEIxXWNFGiaJledQ0BXkzZl+nTSpK3TmYazKLpyHnKRDAvT5no7nCGHsdtx4U8vwmkwwE+bhuTn1oJPSjY9cuGsDl9+eBa2Did8lBI8sECLeE2It8MaklxOJ07m7UHhd1+DY1n4BYRgyi//E+pYjbdDG1I4loOhSIfWYzVg7QzA50E1Wo2Au6LAF5OP2eu1t7ejsLAQpaWlcDrdOYa/vz8yMjKQkpICCdlmsRvLONHeeBbNl4/DYqjtHlcGJLibrwUng8cnP2N3Ar1eL1i/fn1Ma2urSCqVsunp6ab169df9nZcBEH8mKdX3G8DSAWwHUADuncqJYYKl6kN1vJTAF8ApZY0aQMAh8uBdwo/AgDMHzUHflJyl78njuNwcfvrsFRWQRoWBmrFMpKEe8DpYLD/83Mo+N59MRufFIIH5mvhoyQX/b3R1VTg0Cd/Q3uzDuDxkD5hBu6a/iBEYnK+euqoM6Ap7xIcze6GYvIYFYKnxEIcQKoFeuI4DrW1tSgoKEBlZWX3+IgRI5CRkYHY2Fiy/VgPdmsrmuu+R0v9STBO98+WQChFYMRoBEeNhdSH3Dy800yaNMl8+PDhUm/HQRDEzXl61T0ZwD00Tf8wiLEQt6CrSZs88S7SpK3T52UH0GxpxQg/Ne6Jn+jtcIacuo8+Qeux4xDIZEhau5p0RvfAlXoDPt1ViJYmMwQCPqbNScKYCTGkXLgXTocd3x/4FMXHDwIcB1VwOKb88nGER8d7O7QhxWW2o+XbapguuNfoCn0lCJ4SC5+4APJz1YPT6cSFCxdQUFCA1lb3UhCBQICkpCRkZmYiODjYyxEOHRzHwthCo+nycRhbaHTNnciUaoREjYMqLB0CIdnJgSAIwts8TcTbAZhuehThFRzHwlT0DQDAN2O6l6MZGprMLdhTdgAA8HjmfAhIyd01Wn84idp/7QZ4PCQuXwr5iChvhzSkcRyHH76rQt7eMjAMi+BQBeb9KhOhEaTKojd1lWU4/Mk7MLQ1gcfnI3PSvRg95QEIRSJvhzZkcAwLfUEDWo9fBudkwBPwoBoTCdWYSPBF5PdVF5PJhKKiIpw9exY2mw0A4OPjg/T0dKSlpUEuJ132uzgdZrTWn0Lz5RNw2NoBADy+EKpQLUKixkHuR5rVEQRBDCWeJuKbAaylKOo/aJp2DWZARP91VBa7m7T5hUAWq/V2OEPC34s+hpNxYkL0GCSHJHg7nCHFUlOL8pe3AwCif/UoAkZnezmioc1ssuOL94tQUeaesczKicY99ydDRNbs/ojD3oHjX32E0h8OAwACw6IwNfdxhKhjvBvYEGOt0aM57xIcbR0AAJ/4AARPjoXIn2wR1UWn06GgoADl5eVgWfd2WqGhocjKykJiYiK6thz6ueM4DhZDDZovH0f7lbPgOPdWbWJZAIIjcxCkHg2h2MfLURIEQRC98TQRfxjAaAB1FEWVAbhmv0Gapu8Z6MAIz3U3acuYRpq0ASjUleJ0fTGkQgl+pX3Q2+EMKU6jCRc2Pw/WZkPQxAlQ/5KcnxupKGvC57uLYDE7IJOLMOdhLTSpYd4Oa0iqLS/F4c/+DpO+FXyBANl3z0HWpPsgIH0HujmNdrQcqYK53L0Lkshf6i5Djw3wcmRDA8dxuHTpEk6ePAmdTgcA4PF4SExMRGZmJiIiIsiMbifGZUfblUI0Xz6ODpOuc5QHv6AkBEeNg29QIrkeIAiCGOI8vUKq6/yPGGJcpnZYL54GeHwo06Z4OxyvczJOvFPwIQAgN+U+BMjItjVdWJcL9J9fgr2xCT5xcYh/agm5qO2Dy8Ug799l+OFoFQAgJj4Qcx9Nh68faZx1PXuHFfn73seF098BAILVMZia+ziCwshyhy6si4X+dD3avr8MzsWCJ+QjICcK/llq8IUkWQLc+z5/9913aGhoAABIpVKkpqYiPT0dvr5kCUiXDnMjmutOoLXhDFiXu1RfKPJBUOQYBEWOhURGbuoQBEEMFx4l4jRN/+dgB0L8NKazhwCWgZy6C0IladK2l87DFXMz1L5huDeR3Jjoqfpvf4ehpBQif38krVkFAdnap1fNjSZ8uqsQjQ1G8Pk8TJ5JYdzdceDzyU2L61VdKMKRPf+AxaiHQCjEmGlzkTFhJvikbLibpbINzYcq4fz/7J15WFN32v7vLGQjCYR93yUIsihgwRVFq9MXaxetWrWvXaY6drO1VovWulanOq39ddN3puNobdG2ttU61g1QwQ1RQEQIIvsaCGTfzzm/P2IYdHSkM0ocTj7XlesiZ/nmzuEkOc/5Ps/9KG1BkzDaC14ZYXARO9PQAaCrqwuFhYW4ceMGAIDP5yMtLQ3x8fFwcXoKAAAokoBSXoHOprPQ9NzoXe7qHgrv4FGQ+CaAyXRmnjhx4sTJfxu/6ZtbKpUGA4i9+bRCJpM5Z8kdCEWR0JQ4TdrsdOm78eO1XwHYDNrYToO2XtqPHUfb338Fg81GzLvvgOvl6WhJDx0URaHkQiOO/FwBq4WExFOAp+YNR2CI8wbX7Rh0GhT88i2qy84DAPxCIpH59IuQ+Pg7WNnDg0VpRGd+LXQ3ugEAHA8+vDMjIQh1ZukAgFqtxrlz51BRUQGKouDi4oLk5GSkpKQ4+3/fxGxUoav5ArpaLsBiUgMAmEwXeASMgHdQOgTiQAcrdOLkvweCILBx48bAQ4cOeZlMJmZcXJz2gw8+aAgLCzPfbR+9Xs/44IMPAvPy8jy0Wi3Lw8PDsnz58sbf/e53avv6VatWhZw6dUpCEARj5MiRqk2bNjV4enoS9jH27dvn8eWXXwYoFApOQECAcfny5U0TJ07sNcCura3lrFq1KrSiokLI5XLJadOmda5cubLV3oaxP7pPnDgh2rJlS3BrayvXy8vLsnjx4paZM2f22Nd3dXWxsrOzQ4uKitxYLBaVkZHRvXHjxiYej9fbjvqzzz7zycnJ8VWr1ezIyEjDmjVrGpKSkgz29ZcvX+avW7cu9MaNG3yxWGydO3dux+LFi+V9j9VgOBa5ubmiHTt2+NfW1go0Gg3ryJEj5eHh4Xc9R/5T+pUTJ5VKBVKpdBeAegC/3nzUS6XSv0mlUmeupoMw1F2BVSUH283badIGYHfpfpgIM9KCRyDeN8bRch4a1NcqUbvjLwCAyD8shDhG6mBFDx8GvRnf77qEQ9+Xw2ohkZAShJffGucMwu9ATflFfPvxSlSXnQfbhYOxWXPw1MJsZxB+E9JCQHGmAQ07L0F3oxsMFxa8xoch5H+HO4NwAAaDAadOncLOnTtx9epVMBgMJCUl4cUXX8To0aNpH4RTFAW1ogY3SnejvOADtNUeh8WkBs/VB8Ex05Ew/j2Exs5wBuFOnPxGtm3b5nf8+HGP3bt3VxUWFpb5+vqaFy5cGEUQxB23J0kSL730UlRtbS1/z549VVeuXCn5+uuvZTExMUb7Nu+9916wTCYTHDx4sCIvL++KXq9nLlmyJNy+/syZM64bNmwIe/vtt5uKi4tL5syZI1+yZElUQ0MDBwCsVisWLlw4xNfX11xYWFi2e/fuqmPHjnl++umnvv3VXVdXx3nzzTej5syZIy8uLi5dunRp07p168LOnz/f69L4+uuvR+j1emZeXt6VgwcPVlRVVbmuXr26t35s3759kp07dwZs3bq1tqioqDQtLU21aNGiIWq1mgkAKpWKuWjRoui0tDRVUVFR6datW2u/+uqrgP379/deJA2WYyEQCMhp06Yp1q5dW9fPU+s/or/FaVtg6yX+JADJzcfTACbcXOfEAWjsJm1JTpO28o4qnG+6DC6Lg+cSn3a0nIcGU2cnqjZ/CMpqhf+0LPhOcqbr3079DQV2bD2NqvJ2cHlsPDl3OJ6YkwQuz5nq2Re9RoVfv/kcR779AgadBoERMZjzxnokjn4U9rvVdIaiKGivK9Cw8zK6zzWBIiiIYr0R9mIyJKlBYLDofYwsFguKiorw1Vdfobi4GFarFVKpFAsWLEBmZiZcXent7G21GCBvKMS1s1tx/dIOKOXlAAB33wREpyxE7Ki34RMyBiwX59yHk39NR0cH+/nnn48cPnx40tixY+P37t3rIZVKk0+ePCkCgNbWVpd58+ZFjRw5MjEpKWl4VlbW0Ly8PJF9/7q6Oo5UKk3etWuX5+TJk+MSEhKGP/vss0MUCgVr/fr1gSNHjkwcOXJk4hdffOFj3+fkyZMiqVSa/N1330kyMjKGJSQkDP/DH/4QrlKpmG+99VboiBEjkkaPHp3www8/9AZu5eXlvGeeeSY6JSUlcfjw4UkzZsyQlpSUPLAT/Oeff/aeP39+e0xMjEkkEpGrV69ubm5u5hUWFgrvtP2JEyfE5eXlok8++aQuIiLCDADBwcEW++yoXq9nHDt2zOvVV19tCQwMtHh4eBDZ2dnNRUVFbvbgcu/evd7p6enKrKwsFZfLpRYsWNAVGhpqyMnJ8QSAwsJCUWtrK3f16tXNIpGIjImJMc2fP799//79Pv3VvXfvXq+wsDDDggULurhcLpWVlaVKT09Xffvtt96A7f956dIlcXZ2drOHhwcRGBhoefXVV1uOHDniaTAYGADw/fff+2RlZXWmp6fr+Hw+tWzZsjYAOHjwoAQADhw4IGEymdSyZcva+Hw+lZ6ersvKyurct2+f92A7Funp6br58+crYmNje7MBHiT9vdKcAeA5mUx2tM+yA1Kp1ARgF4BX+zOIVCplAtgA4EUArgAKASyUyWQN99gvGcB5AGdkMllGPzUPaqzaHuiqL9pM2hLpHVxZCSv+enkfAODJ2KnwcnWa1QAAYTSicuMfYVGp4Z6UiPDnn3O0pIcKgiBx6lg1CnNrAAoIDHXHU3NHQOLp7EvcF4qiUF16Dqd/+RYmgw4uHB5GP/YM4lLHg+EMwAEA5m4DOvNqoa+3Zb9xvAXwyYwEP8jNwcocD0mSqKiowNmzZ6HVagEAISEhGDt2LPz8nB0I9OoWdDadQ3fbZZCkBQDgwhXDK+gReAU+Ag7PeQ49jDTvvRJlaFYP2D+HHyRWBc1OqOnPtm+88UY4h8OhcnNzyxkMBpYuXRrWdz1BEJgxY0bXpEmTal1cXKhPPvnEb+nSpZHHjh276u3t3dui+Pjx45KcnJwqBoOBWbNmxcyYMWPo3Llz28+cOVN29OhRt2XLlkVNnTpVaQ9SAeDs2bPiQ4cOXVMoFOyZM2cOfeqpp4YuWbKkecuWLQ1/+ctfvDds2BA2ZcoUlUgkIgFg4cKFbaNGjdISBMF4//33g15//fWo3NzcqxwOh8IdmDJlSqxcLufc7b0vX768cfbs2d23L1cqlSy5XM5JSkrS2ZdJJBIiICDAVFFRIRg/frz29n3Onj0r8vX1NX388cf+ubm5HhwOhxw1apRy1apVLSKRiKyuruaZzWZGcnKy3r5PbGyskcvlkleuXOGHhoaaa2pqBFOmTFH0HTcmJkZfXV0tAICKigp+QECASSKR9E7LJyUl6f70pz9xVCoVk6Ioxr10V1dX82NiYvR9XyM2NlZ37NgxDwAoLy8XcLlcMjY2tncmPzk5WW8ymZjV1dW8xMREQ21tLX/27Nm9aeYsFgtRUVH6yspKPgBUVVUJoqKi9H3bRsbHx+sPHTrkDQCD6Vjcfh48aPobiLsBuNMUfR2A32Jn+g6AOQDGAWgB8BGAX6RSaZJMJiPvtINUKuUB+BuAU79B76BHU5ZvM2mLHgm2iN6B56/XT6JF3Q4/oTemSSc5Ws5DAUVRuP7/PoOurg48fz9Il70FhtNAq5cehQ4/flOClgYlGAxgzOQhGD95CJg0n7W8Ha2qG/k/7UaDrAwAEDJkGCY8tQAid6fHAACQZgLd55vQU9wCkBSYXBY8R4fCLckfDJqb+9lbkRUWFkKhsF17eXt7Y9y4cQgNDaV1xwaKIqGUV6Cj/hR0qn/MQ4g8ouAdPAru3rFgOD1OnPwbNDc3u5SUlIgPHDhw1cPDgwCAZcuWtZw5c6a3LiY4ONgSHBystD9/55132nJycnyLi4sF9tpnAFi8eHGbl5cXAQCjRo1SFRYWur/00ktdAJCVlaV6//33idLSUkHfQPydd95pFQqFpFAoNCcmJmq0Wi1r2rRpKgCYPXu24qOPPgqRyWS8lJQUfXx8vBGAPSCiVq5c2ZKenu5dU1PD7Rso9eXo0aPX/p3jYk+xdnd3vyUP3dXVldBqtXf8sCmVSnZTUxNv5MiR6ry8vPKuri724sWLI99///3gjz76qEGtVrPuNqZGo2EBgF6vZ4rF4lvWi8ViorGxkQcAWq2W5erqest6+3hqtZpFUdQty+6kW6fTsSIiIm45XmKxmNDr9SwA0Gg0zH/1GgBgMBhYbm5ut2wjEokInU5nfw2mSCS6Zb2bm1vvawymYzHQ9DewvQrgZQBv37Z84c11/WURgD/KZDIZAEil0ncAdAAYA+D0XfbZCCAXgBK29HjaQ1EkNKW2tHS6m7T1GFT4vuIQAOD5Ec/AheV02QWA5u/3Q3HmHFh8PoaufBds4R0zr2hJ+aVm/H3/VZhNVojdeHhy7nCERjoDy75QFIXK4gIU/n0vzCYDODw+xmY9i5gRo2kdQNmhKApaWRe6TtXBqrFdg4qH+cJzbCjYrnedrKENLS0tOH36dG8rMjc3N4wePRoxMTG0Pn8oikRP+xW01eXCqG0HADDZPHgFpMA7OB08V597jODkYaG/s9MDTXNzMwcA+ppXhYWFmfpuo1AoWGvXrg0uKSkRaTQaNoPBoAwGA6urq+uWCyh/f3+L/W8+n096eHhY+q7ncrnk7UFsQEBA7zY8Ho/k8Xi9k2wCgYAEbAEXYEsT3rhxY1BlZaVQp9OxGAwGBQByuZwdGxuL+4lYLCYBQKVS3aJXp9OxhELhHYvEBQIByWQy8d577zXz+XzK1dXV/Pzzz7d/+OGHIQAa7EGlSqVi9c0k0Ol0LHvQKhAISHsgaketVvcGnEKhsDfYtaNUKlk3NRMURTHupbtvsNv3NQQCAQEAIpGItAeid3oNAODz+cTtgahGo2HZ/+eurq5kd3f3LeeHSqXqfY3BdCwGmv4G4qthS0XvGzCPAzACwOP9GUAqlboBCAVQbF8mk8mUUqm0BkAS7hCIS6XScQCyAAyHbTbdCQBDXTmsSqdJGwB8XfYjjFYTUgISMNx/mKPlPBQozl9A4zc5AIOB6LffhCA4yNGSHgooisLxXypx/lQtAGBogj+yZsaDL3AGTn1R93Qh/8edaKqxTTyEDU1CxhPPQSh2GtcBgKlLj868GzA0qgAAXF8hfCZFgucvuseegx+FQoGCgoJ/akWWmJgIFo0zciiSQHd7Kdpqc2HSdwIAXLhu8AufAM+AVLDYzu8gJ/eHoKAgMwDU19dzYmJiTABgr9G1s2HDhqC2tjZOTk5OlT1wTk5OTrLPOA4U2dnZoW5ubtaffvrpmo+Pj7W7u5uVnp6eBOCud+smT54c969S01esWNEwZ86cf0pNd3d3J3x8fMylpaWuqampesAWgLW1tXHj4uL0/zwSEBcXp/vpp59uuXnY9+/o6Ggjh8OhLl26JJg6daoaACorK3kmk4kZHx9vAICoqCh9RUXFLQYYMplMMGrUKNXN1zB8+eWXXKVSybLPzJaVlbn6+vqa3dzcSAC4l+7o6GjDuXPnbslOvnbtmmtUVJQBsKWQG41GZmVlJW/o0KFGALh8+bKAw+GQ0dHRRgCIiIgwlJeXC55++ukewFa+UFNTI5g6dWoPYEshz8/PlxAE0ftdfvXqVUFkZKRdw6A5FgNNv/IwZTLZYQDJAKoBZN58VANIlslkR/r5WvYDo7xtuRJ3SG+XSqVCAH8F8HuZTHbHDwlducWkjcbpa9fk11HYUAQXJhsLhs90tJyHAl19A6o//n8AgND5c+GRkuxgRQ8HJEnh7z+U4/ypWjBZDGTNjMeM50Y4g/A+UCSJK+dykbNtFZpqroEnEOLRWQvxP/NfdwbhAAiTFZ35tWjcXQJDowpMHhs+k6MQPDeR9kG4RqPB0aNHsWvXLty4cQMuLi5IS0vDiy++iBEjRtA2CCdJK7qai1BxZgvqr+6FSd8JDk+CkNinMWzsCviEjHYG4U7uK0FBQZakpCTNpk2bgnp6elg9PT2sLVu23GKxr9PpWFwul5RIJITRaGRs3Lgx0Gg0DviHVKvVsvh8Punu7k4olUrW+vXr7zlrcPz48YqysrKSuz3uFITbeeKJJzr37NnjK5PJuFqtlrl+/frAwMBA45gxY/6pPhwAHn/8caW7u7vl5vFhtLS0uPztb3/zGz9+fA8ACAQC6tFHH+36/PPPA1tbW126u7tZmzZtCkpNTVXZMxJmz57dee7cObfDhw+7mc1mxq5duzzr6+v5s2fPVgDAmDFjNP7+/qb169cHarVapkwm43799dd+Tz31lLy/umfNmtVVV1fH37Vrl6fZbGYcPnzY7fz5827PPvtsJwCEh4ebk5OT1Zs2bQrq7u5mtba2unz++eeBU6dOVfD5fAoAZs6cKT906JD3hQsXBEajkbF161b/m8egBwCmT5/eQxAEY+vWrf5Go5Fx4cIFwaFDh7yfeeaZzsF2LAiCgMFgYJhMJgYAmEwmhsFgYFitvRP995V+11zLZLIrAP4Ttyd73cnt5hbufdb1ZSuAwzKZ7G4p67TEqlVCV11kM2lLmOBoOQ6DIAnsvGnQNn3oFPgIvRysyPFY1GpUfrAZpNEIr3FjEfjUE46W9FBAECQO5JTiakkr2GwmZi5IwZChzhTQvii72pG3fyda66sBAFHxqRj3+DwIhL/FAmRwQlEUNJWd6DpVB0Jny7p0S/SD55hQsPj0LoUxGo0oKipCSUkJrFYrmEwmEhISkJ6eTmsXdJK0QtFShPa6fJiNtrkHrsALfuET4ek/gtY30J08eLZt21a7YsWK0IkTJ8YLhULi5Zdfbi0sLJRwuVwSAJYuXdqyfPny8PT09ESRSGSdO3duh5eX1wPrk3w3srOzm9auXRuakpKS5OHhYVm8eHHL4cOHH9jF3JIlS9q1Wi1r/vz5MUajkRkXF6fdvn17jf1G4enTp4WvvfbakIMHD1aEhoaaRSIR+ec//7l67dq1IY888kiSq6srkZGR0bNy5coW+5jr169vWrlyZUhWVlYcSZKM1NRU1ebNm3uNH0aPHq1btWpVw4cffhi8fPlyTkBAgHHbtm019uCUzWZjx44d11euXBk6atSoRB6PR06bNq3r9ddf7+iv7oiICPPHH39cs2XLluCtW7eGenp6mletWlWflpbWa2r2ySef1GVnZ4dMnDgxgclkUhkZGT3r1q1rsq+fNWtWj1wud3nrrbeibvYR12/fvv26PaXfzc2N3L59e/XatWtD9+zZ4y8Wi60vvPBC64wZM3r7cw+WY1FQUCBauHBhtP359OnThwHAypUr65977rlbzObuB4yBTEWRSqX1ADbLZLLtN5+7wVYj/ujtAffNbd0B2G9BCAC4AFABSJXJZPfs7yaVSsMA1OXm5iIoaHCk5yrP/oju/G8giE6F38wVjpbjMH6tzsfOku/g7eqJj6euBofmswqk1Ypra9ZDVX4VrpGRiN+0Hiya9+MFAKuFwA9fX0Z1RQc4XDZmv5iKMGc9eC8kSaLszDGcP/YjCKsFAqEY46bPR9SwFEdLeygwybWQ59bC2GK7V8zzF8F7UiR4vvT2XLBYLCgtLcWFCxdgMtnKT6OjozFmzBhIJPTNniAJC7qaL6C9/iQsJlvpAs/VB34RmfDwTXQG4ANIc3MzMjMzASBcJpPV/6fjlZWV1ScmJnb9x8IcQHl5OW/GjBlx+fn5V/rWcDtx4mTgKCsr80pMTAy7ffldZ8SlUqkZQKBMJuuUSqUWAHeN2GUyWX+joO0Alkml0jzYXNP/CFuKe+Edtk27Td9bANIBzATQ1s/XG1RQFAl1yQkA9DZpUxnV2Hf1FwDAguEzaR+EA0DdVzuhKr8KF4k7hmYvdwbhAMwmK/btLEbd9S7w+C6Y+/IjCAxxv/eONKG7owW5+/+KjiZbzbx0+CiM+Z854LvSO8gEAMJohaKwAaqyNoACWAIXeI0LgyjOh9ZmYyRJ4tq1azhz5kxvK7Lg4GCMGzeO1q3ICKsJnc3n0FF/Claz7bjwhf7wj8iEu288GAx6dmNo0Rhwok6Oyx1KPDM0CKODnDdBB4KysjI+SZJISEgwtLW1uWzYsCEkMTFR4wzCnTh5+PhXqem/xz9Sxn+PfxGI/wY+hC01vRD/6CP+uEwmI6VS6VgAvwKIlclkjTKZrL3vjlKpVA3AJJPJmu+Djv9KDPXlsCo7wBZ7gR+R5Gg5DuObKz9DbzEgyS8WKQEJjpbjcNqPHkP74SNgsNkY+u5ycL2cFztGgwXf/rkIzQ09cBVxMW/hI/D1d6ZZAwBBWFFy+giKcg+AJKxwFUsw4cn/RVgMvY0fAVsauvpqBxSn60EYrAADcB8RAI9RIWDx6Ns9k6Io1NbWoqCgwNmKrA+E1Qh541l0NJwCYbFZ2QhEgfCPnAQ371haBuAUReFalwbH6+So6LJdQjIAsOh5ijgEpVLJWrNmTZhCoXDh8XhkUlKSZs2aNU333tOJEycDzV2vLGQy2a4+f//tfrzYzV7h79583L6uAMBdYNSQ/wAAIABJREFUp2JkMtma+6HhvxmnSRtQ3VWLk3XnwGay8fyIWbS9ALSjqqhA7Y6/AACiXlkEkTT6HnsMfnQaE775vwtob1XDTcLHvIWPwNPbOcsLAF1tjcj94St0tjYCAGJTx2P0Y8+AyxM4WJnjMbZrID9xA6b2mzOaQWJ4Z0aC603fWmfA1oqsoKAALS22skixWIwxY8bQuhWZ1aKHvLEQ8oZCEFYDAMDVLQT+EZMg9qLncbEQJC60duN4nRytWpv5MIfFxOggT2SGecPXledghfRh/Pjx2vz8/N/SWtiJEycOol+3+KVSaS1sddmK25a7A7gsk8kiHoQ4J//AqlVCJ7tp0pY40dFyHAJJkvjrTYO2LGkm/EX0NtwyyuWo2rwVFEEg4PEs+Eykr3mfHbXSgD07LqBLroWHlyvmL0qDm4TvaFkOh7BaUZz/Cy6d/DtIkoBI4oWJTy1AcFSco6U5HEJvQVdhPdRXbH4wLCEH3uPDIYzxomVAZUehUKCwsBA1NbZ2yTweD+np6UhISACbTc/sAKtZh46GAsibzoC02oJNoXs4/CMnQeQxhJbni8ZkwanGLuQ1dEJjtln6uHNdMDHMG+OCveDKoee54sSJEyf9ob/fkGEA7jQFywUwOFzQHnK0V/IBkoBgSCrYYnqmHufWnkFtTyM8+RI8Ffs7R8txKITRiKoP/girWg33pESELfhPGhoMDrq7dNiz4zyU3Qb4+Iswb2EahCJnrXxHUy1y9/8V3R22Gc349EykT5kBDpfeM1QUSUF1pR2KwgaQRivAZECSHACP9GAwaRw8aDQanD17FhUVFaAoCmw2GykpKUhJSQGXpt4TFpMGHQ2n0Nl0DiRhM5cWeUTBP2ISRB6RDlbnGNq0Bpyo68S5FgUspK1yMVjMx+RwH6T6S8Bm0i8t34kTJ05+K//yakMqlY7r8zRdKpX29HnOAvAoAGfdyQOGokioS+lt0qYxaZFTfgAA8Nzwp8Fj0/OCELDV4F3/5DPo6urBC/CHdNlbYNC0T6+dznYNvt5xHlq1CYEh7nj29yNp3yPcajGj6MTPKCk4Aoqi4Obpg4lPv4DAcKmjpTkcQ4sanbk3YJLbOprwQ93hMzECHE/6pujf3oqMwWAgMTERaWlpEArpWdphNqrQUX8Snc0XQJE2nyuxVwz8IzIhdA9zrDgHQFEUqhS2+u/yzn90nU3wEWNyuC+kHkJaZgU4ceLEyb/LvW77n4TNpI0C8NMd1msBLL7PmpzchrH+Kqw97WCJvcCPpKdJ297yg9CadRjmI0Va0AhHy3Eozd/9AMXZc2AJBBiavQJsml4k22ltUuKb/7sAg96C0EhPzH4hFVwaG2sBQGdrI47u/RLKznYwGAwMHzsVIyc9ARcOfW9gAYBVZ0bX6XpoKuQAALaIC68J4RAO8aRtAGG1WlFSUoKioiIYjbZ06+joaIwePRoeHh4OVucYzIYetNfno6vlIijSlm7t5h0L/4hJcHULdrC6gcdCkLjY1oPjdXI0a2w18S5MBkYFeWJSmA/8hPTOrnHixImTf5d7Xa0Gw2Z42QhgBIDOPuvMALpkMtnANSKnKeqbJm3ipExamrTVdjfgxI1CsBhMvEBzgzbFuQto/HYvwGAgeukSCILpXRnSWNuNnK+KYDJaETXUBzP/NxkuLvT7jPTl2sXTOHXwaxBWKyQ+Ach8+gX4hdAzfdYORZBQlrah+0wjSDMBBosBSWoQJI8EgUnT88Xeiuzs2bPQaDQAbK3Ixo4dC39/fwercwwmvQLtdXlQtF4CRREAGHD3TYB/RCYEogBHyxtwtGYrTjV2Ib+hEyrTzYwADhsTwrwxPsQbIhqXcDhx4sTJ/eBffovKZLKWm386i30cBKFT9TFpy3S0nAGHpEh8dXkfKFD4XXQmgtzoeYEIALr6BlRv+38AgNDn5sEjJdnBihzLDVkn9u28CKuFRGyiP558djhYbPp+VVnMJpw6uAdVlwoB2BzRx017FmwXeqfo6xuV6MyrhbnrZnupcAm8J0aAQ1MTv7u1Ihs7dizCwsJoeaPTqOtEe10uFG0lAEUCYEDilwT/iEzwhfTrj96uNSK3Xo6zzQqYb9Z/B4p4mBzui5H+Eriw6Ps968SJEyf3k/66pq8A0CmTyb66bfmLADxlMtmHD0KcE0BzJR8grRAMSaGlSdupuvO4rqiDO0+MGXGPOVqOw7Co1ajcuBmk0Qjv8eMQ+OR0R0tyKFXlbdj/dQkIgkTSyGBkzUwAk0m/AMJOT2c7jnz7ORTtzWC7cDB++nwMTR7jaFkOxaoxofNUHbRVXQAAFzcevCZGQBhJz3Rr4M6tyEaPHo2hQ4fSMgA3aNvRVpuLnvYyABTAYMIzIBl+4ZnguXo7Wt6AQlEUqru1OF4nR5lc1bt8mLcYk8N9MNRTRMtzxIkTJ04eJP3NK3oZwJ1smSsBfA3AGYg/ACiK7E1LF9HQpE1n1uObKzZrgvmJT0PgQs8ZLNJqRdUft8Ikl0MYFYnIVxbR+oLoyqVmHNhbBoqkMHJsGKY8HgcGjYPwmvKLyN3/V1hMRrh5+uJ3816Blx/96ljtUASJnkut6D7XCMpCgsFmQvJIECSpQWDSNGPiTq3I0tLSkJiYSMtWZHpNK9pqc6HsKAdAgcFgwTMgBX7hE8AV0OuGt5UkUXyz/rtRbav/ZjMZSA/0wKQwHwSI6Pm762TwQRAENm7cGHjo0CEvk8nEjIuL037wwQcNYWFh5jttn5OT47F58+bQvsvMZjMzJCTEcPTo0Wv9HfPEiROiLVu2BLe2tnK9vLwsixcvbpk5c2av+XVXVxcrOzs7tKioyI3FYlEZGRndGzdubOLxeL2lv5999plPTk6Or1qtZkdGRhrWrFnTkJSUZLCvv3z5Mn/dunWhN27c4IvFYuvcuXM7Fi9eLLev1+v1jFWrVoWcOnVKQhAEY+TIkapNmzY1eHp6EvZt9u3b5/Hll18GKBQKTkBAgHH58uVNEydO1NjX19bWclatWhVaUVEh5HK55LRp0zpXrlzZyrzZIWGwHIvS0lL+li1bgmpqagRKpZK9Y8eO6oyMjN7jcL/p71VJAIDmOyxvBRB4/+Q46YuxocJm0ibyhCByuKPlDDjfXT0EtUmLGK9IjAlNdbQch1H3l51QX62Ai8QdMdnLwaJpCyEAKD5bj5+/LQVFUhg7aQimTKdvEE4QVhQcysGRb7+AxWRE5LAUzHr1fVoH4br6HjTsKoHidD0oCwnXIZ4IfX4EPNNDaBmEazQaHDt2DLt27UJNTQ3YbDbS0tLw0ksvITk5mXZBuE7VhJqSnag89zGUHVfAYDDhHZyOYWOWIzRuBq2CcJ3Fil9vtOPdkxX4qqwBjWoDRBw2pg3xxx8nDMNz8aHOINzJoGLbtm1+x48f99i9e3dVYWFhma+vr3nhwoVRBEHccfs5c+Z0l5WVldgfFy9eLBWLxdbHHntM0d8x6+rqOG+++WbUnDlz5MXFxaVLly5tWrduXdj58+dd7WO8/vrrEXq9npmXl3fl4MGDFVVVVa6rV6/u/SHft2+fZOfOnQFbt26tLSoqKk1LS1MtWrRoiFqtZgKASqViLlq0KDotLU1VVFRUunXr1tqvvvoqYP/+/RL7GO+9916wTCYTHDx4sCIvL++KXq9nLlmyJNy+/syZM64bNmwIe/vtt5uKi4tL5syZI1+yZElUQ0MDB7CZei5cuHCIr6+vubCwsGz37t1Vx44d8/z00099B9ux4HA4VGZmZs9nn312vZ+n1n9Ef3+F5QDiAdTftjwBgOKftnZyX/iHSdsk2pm0NSibcaTmJBgMBl4YMZu2M8DtR46h/dcjYLDZGPrucnA96XOheDtn8mqQ+/cqAEDm/8Rg9MQoBytyHFpVN47kfIn2hhowmSyMfmwWEkZNou3nxKIyovNkHXTXbT9HLhI+vCdGwDVcco89BydGoxEXL17E5cuXna3IAGiV9Wi7cQJqhQwAwGC6wDsoDb5h48HhuTlY3cAi1xlxor4TZ5oVMBMkAMBfyMPkcB+kBXg467/7yb59+6Kam5sH7OQJCgpSzZo1q6Y/23Z0dLBXrFgRWlpaKhIKhcQrr7zS8v7774fbZ/ZaW1td3nnnndDq6mpXs9nMDAoKMr711lvN9tnPuro6ztSpU+Ozs7Pr9+zZ49fR0cEZNmyY9tNPP6394osv/H755RcvAFiwYEGbfabx5MmTooULF0avX7++9osvvgjs7u52GT16tHLz5s0Na9euDT558qSEz+eTb775ZtOMGTN6AKC8vJy3fv36kNraWj5BEIzIyEjDypUrG4cPH264+7v79/n555+958+f3x4TE2MCgNWrVzePGTMmsbCwUDh+/Hjtvfb/6aef3PV6PXPevHld/R1z7969XmFhYYYFCxZ0AUBWVpbq4MGDqm+//dY7LS1NV1dXx7l06ZL4p59+qvDw8CAAEK+++mrL8uXLI9euXdvE5/Op77//3icrK6szPT1dBwDLli1r+/nnn70PHjwomTdvnuLAgQMSJpNJLVu2rI3FYiE9PV2XlZXVuW/fPu+nn366R6/XM44dO+b14Ycf1gQGBloAIDs7u/nJJ5+Ma2ho4ISGhpr37t3rnZ6erszKylIBwIIFC7r279/vlZOT47lixYq2wsJCUWtrK/e7776rEolEZExMjGn+/Pnte/bs8XvjjTc6BtOxiI2NNcbGxhrvz1l3b/r7jfsjgI+lUmnvtKxUKh0B4E8AfngQwugOoVNBV3XBZtKWNNHRcgYUiqLw18v7QFEUpkSNR5iEns7gqooK1P7fXwAAUa8sgkga7WBFjoGiKOT9WmULwhnAY0/H0zoIb7xegb2fvo/2hhoI3SR48uUVSBw9mZZBOEWQ6D7XiIadl6G7rgDDhQnPcWEIXTCclkG41WpFcXExvvrqKxQVFcFqtSI6OhoLFizApEmTaBeEa7pvoLp4B2RFn0OtkIHJ4sA3LAPxY99FcMzjtAnC7fXfn1+6gVWnriG/oRNmgkSslwhvpEZh7dihGBvs5QzCBwlvvPFGOEEQjNzc3PKDBw9eO3bs2C1fhgRBYMaMGV15eXnlFy5cKB03bpxy6dKlkZ2dnbdMzh0/flySk5NTlZ+ff0Uul3NmzJgx1N/f33TmzJmy1atX13/66afBtbW1t7iBnj17Vnzo0KFrv/zyS8WlS5fETz311NAJEyYoL168WPrcc8+1bdiwIUyj0fSeaAsXLmwrKCi4UlBQcCU0NNTw+uuvR5nN5rv+mE2ZMiV2+PDhSXd77N27944mIEqlkiWXyzlJSUk6+zKJREIEBASYKioqBP05rt99951PRkZGjz2FuT9jVldX82NiYvR9x4mNjdXV1NTwAaC8vFzA5XLJvoFfcnKy3mQyMaurq3kAUFtby4+Pj+8dg8ViISoqSl9ZWckHgKqqKkFUVJSexfrHhF18fLz+xo0bdg08s9nMSE5O7h0jNjbWyOVyyStXrvABoKamRhAbG9v7PgAgJiZGX11dLQCAiooKfkBAgEkikfSmDyQlJek6Ojo4KpWKOZiOxUDT3xnxlQCSABRLpVJ7Lr8EQCGA7AchjO5oyk/aTNqiksEWezlazoBS2HARlZ01EHOFmDVsmqPlOARjhxxVm7eCIggEPPE4fCZOcLQkh0CRFI4erEBRQT0YTAamz05EQjI9b8xQJImL+b+gKPcAQFEIHhKHR2ctBN9V5GhpDsHQqob8aA3MCtvvqTDGC17jw+Eiol/pBkmSqKysxJkzZ3pbkQUFBWHcuHG0a0VGURQ03dfRduMEtMo6AACTzYNP8Gj4ho4Fm+N6jxEGD1aSwuX2Hhyrk6NBZfucsJkMPBJgq/8OEjtTz/9d+js7PdA0Nze7lJSUiA8cOHD15qwili1b1nLmzBl3+zbBwcGW4OBgpf35O++805aTk+NbXFws+N3vfqe2L1+8eHGbl5cXAQCjRo1SFRYWur/00ku9s5nvv/8+UVpaKoiIiDD3GatVKBSSQqHQnJiYqNFqtaxp06apAGD27NmKjz76KEQmk/FSUlL08fHxRgD2oItauXJlS3p6undNTQ33bjOS9trs34o9ddnd3f2WPHRXV1dCq9XeM+W0vLycd/XqVeHy5cubfsuYOp2OFRERcct7EYvFhF6vZwGARqNhurq63rK/fTy1Ws0CAIPBwHJzc7tlG5FIROh0OvtrMEUi0S3r3dzcel/DPs6ddGo0GhYA6PV6plgsvmW9WCwmGhsbeQCg1WpZ/0onRVG3LPtvPhYDTb8CcZlMpgOQIZVKM2HrJw4Al2QyWd4DU0ZjKIqChqYmbXqLAV+X7QcAzE14Eq6cft2oHFQQBgMqP9gMq1oN9+FJCHtunqMlOQSSpHDouysovdgEFouJp+cPR0w8vYIKOwadBsf3/R8ar18FGAyMzJyOlImPw26SQidIsxVdBQ1QlbQBAFwkPPhMjoIgxP0eew4+KIpCXV0dCgoK0NVly5b08vLCuHHjaNeKjKIoqLuq0FZ7AjpVIwCAxebDJ3QMfELGgO1Cn98SvcWKgiYF8url6Dba+n8LXVjICPVGRqg33LguDlbo5EHR3NzMAYC+BllhYWGmvtsoFArW2rVrg0tKSkQajYbNYDAog8HA6urquuXE8Pf3t9j/5vP5pIeHh6Xvei6XS94exAYEBPRuw+PxSB6PR9qfCwQCErAFdYAtBX7jxo1BlZWVQp1Ox2IwGBQAyOVydmxs7L9/EO6AWCwmAUClUt2iV6fTsYRC4Z2LxPuwe/dunyFDhuhHjhzZO5PanzHvFOCp1WqWQCAgAEAkEpH2INGOUqlk3RyfAAA+n0/YA0g7Go2GZf9/uLq6kt3d3bf871QqVe9r2MdRqVQsb29va1+d9qBVIBCQd9JpD4yFQmFvsHsnnRRFMQbLsRhofpNTi0wmywWQ+4C0OLmJseEqLN1tNpO2qBH33mEQsb/iMJRGNYZ4hGF8eJqj5Qw4FEni+iefQV/fAF5AAKRvvwUGyyE36RwKYSXx07cluFbWBrYLE7OeT0WklF7thOy0N97AkW8/h1bVA55AiEdnLURI9DBHy3II2hvd6DxRA6vGDDAAycggeKQFg+lCv89Ia2srCgoK0Nxs81G1tyKLiYmh1Q0aiiKh6ryGttpc6NW2Y8F2cYVP6Dj4hIwCi81zsMKBo1NvQm69HIVNCphu1n/7uXIxOdwXaYEe4DhTzwc9QUFBZgCor6/n2Gt17YZbdjZs2BDU1tbGycnJqbIHzsnJyUn2Wc2BIjs7O9TNzc36008/XfPx8bF2d3ez0tPTkwDc9Q7i5MmT4+RyOedu61esWNEwZ86c7tuXu7u7Ez4+PubS0lLX1NRUPWAL8tra2rhxcXH6fx7pH6jVaubx48c933zzzcbfOmZ0dLTh3Llz4r77Xbt2zTUqKsoA2NKmjUYjs7Kykjd06FAjAFy+fFnA4XDI6OhoIwBEREQYysvLBU8//XQPYCstqKmpEUydOrUHsKWQ5+fnSwiCgD0l++rVq4LIyEi7BiOHw6EuXbokmDp1qhoAKisreSaTiRkfH28AgKioKH1FRcUt6UIymUwwatQoFQDExcUZvvzyS65SqWTZZ5PLyspcfX19zW5ubiQADJZjMdD0+1tZKpVKpFLpHKlUukIqla7u+3iQAulIb8uypExambQ1q9pwuDoPDDDwQvJsMBn0u2ho+u4HKM6dB0sgwNCVK8AW0ieN0o7FQmDf34pxrawNXB4b815Oo2UQTlEUys4cx487NkGr6oFfSCRmvbaGlkG4VWdG2y9VaPvpGqwaM7i+QoTMT4LX2DDaBeEKhQIHDhxATk4OmpubwePxkJGRgeeffx6xsbG0CcIpikRPexkqz23DjdJd0KubweYIERSdhWFjs+EfMZE2QXhNjxZfXq7FypMVyK3vhIkgEeMpwmspkVg7LhbjQrycQThNCAoKsiQlJWk2bdoU1NPTw+rp6WFt2bLllu5GOp2OxeVySYlEQhiNRsbGjRsDjUbjgH+RarVaFp/PJ93d3QmlUslav379PevOjh8/XtHXyfz2x52CcDtPPPFE5549e3xlMhlXq9Uy169fHxgYGGgcM2bMvzRq27t3ryebzaZmzpz5T2Pfa8xZs2Z11dXV8Xft2uVpNpsZhw8fdjt//rzbs88+2wkA4eHh5uTkZPWmTZuCuru7Wa2trS6ff/554NSpUxV8Pp8CgJkzZ8oPHTrkfeHCBYHRaGRs3brVHwAef/zxHgCYPn16D0EQjK1bt/objUbGhQsXBIcOHfJ+5plnOgFAIBBQjz76aNfnn38e2Nra6tLd3c3atGlTUGpqqsqeOTF79uzOc+fOuR0+fNjNbDYzdu3a5VlfX8+fPXu2AgDGjBmj8ff3N61fvz5Qq9UyZTIZ9+uvv/Z76qmn5IPtWJAkCYPBwDAYDAwAMJvNDIPBwLBYbkkIuW/0a0ZcKpWmAjgC210qMYBOAD4A9ADaAKx7IOpoCKFTQSezmbSJE+lj0kZRFHaW7ANBkZgUORaRHqH33mmQoTh3Hk05+wAGA9K334QgiH6dAU1GK/b+9SIabijAF7hg3sI0+AfRw1CpL2ajAXk/7kRN+UUAQOLoRzFq6kywaNZuiqIoqK/K0XWqDqTRCgabCc8xoXAfEUC7tnVarRZnz57F1atXQVEU2Gw2kpOTkZqaCi6NWhpSJIHujjK01+bCqLNdA7pw3eAXngGvwEfAZNEj7ZogKZR0KHG8To5apc0ficVgYGSABJPCfRAipk8qvpNb2bZtW+2KFStCJ06cGC8UComXX365tbCwUMLlckkAWLp0acvy5cvD09PTE0UikXXu3LkdXl5ed+yl/SDJzs5uWrt2bWhKSkqSh4eHZfHixS2HDx9+YKZIS5Ysaddqtaz58+fHGI1GZlxcnHb79u019pnT06dPC1977bUhBw8erAgNDe09Hj/88IP31KlTuwQCwT+lDNxrzIiICPPHH39cs2XLluCtW7eGenp6mletWlWflpbWa2r2ySef1GVnZ4dMnDgxgclkUhkZGT3r1q3rrUWfNWtWj1wud3nrrbeibvbO1m/fvv26PTXezc2N3L59e/XatWtD9+zZ4y8Wi60vvPBCq92dHgDWr1/ftHLlypCsrKw4kiQZqampqs2bNzfY148ePVq3atWqhg8//DB4+fLlnICAAOO2bdtq7MEpm83Gjh07rq9cuTJ01KhRiTwej5w2bVrX66+/3jHYjkVDQwNn6tSp8fbnr7322hDA1iXg3Xffbb3nifYbYfQnFUUqlZ4EUA1gEQAVgEQAZgDfAvhYJpP9dL+F3Q+kUmkYgLrc3FwEBf13GDwpzx9Ed+4uCKKS4TeLPj5455su46Ozf4aQ44pPHlsDEZde7r66+npceScbpMmE0P+dj6CnnnC0pAHHoDfjmz8XobVRCaGYi/kL0+DtRz8jsq72Jhz55gsou9rhwuUh8+kXEBWf6mhZA45ZaYD8WA0MjSoAgCDMHT6TouDiTo9ZTjsmkwkXL17EpUuXeluRxcfHIz09nVYu6BRJQNF2Ge11eTDpbfXwHJ4EfuET4BmYCiaTHjepDBYChc1dyK3vhMJgixUELixkhHhhQqg33Hl3zdqlFc3NzcjMzASAcJlMVv+fjldWVlafmJjYde8tHz7Ky8t5M2bMiMvPz7/St4bbiRMnA0dZWZlXYmJi2O3L+/vLlQTgDzKZjJRKpSQAjkwmq5VKpcsB/BXAQxmI/7dBV5M2o9WEXaW2Lniz4x+nXRBuUalQuXEzSJMJ3hnjEPjkdEdLGnC0GhP27DgPeZsG7h58zF+UBokn/dLyqy6fwcmfd8NqMcPTLwhTn30FEm8/R8saUCiSgrK4BYqzjaCsJJh8NrwnREA01JtW5mMEQeDKlSs4d+4cDAZb6dqQIUMwZswYeHjcsUPPoIQkrVC0FqO9Ng9mo21Sg8P3gH9EJjz9k2lTvqUwmJBb34mCpi4Yrbb6bx8BF5PDfZAe6AEumx7Hwcm9KSsr45MkiYSEBENbW5vLhg0bQhITEzXOINyJk4eP/gbiBAD7B1gOIBhAFYAuAPTLIX5AGBsrYOluBUvkQSuTtp+uHYFC34NwSTAmRYxxtJwBhbRaUfXhn2CSd0I4ZAiiXvkDrYINAFD1GPD19vPo7tLBy0eIeYsegdiNXm11rBYLTv/yDa5dPAUAiBkxGuOnz4cLhz4pxwBg7NBCfvQ6THJbppoo1hteGRFgC+iRbgzYbshev34dBQUFUCptHYYCAgIwfvx4BAQEOFjdwEESFnS1FKG9Lh8Wky0rgivwhn9EJjz8kmgTgNcqdThe14HL7UqQNxMYoz2EmBzugwQfNzBp9nvh5N4olUrWmjVrwhQKhQuPxyOTkpI0a9asabr3nk6cOBlo+huIX4FtVrwGwHkA2VKplAng9wBkD0gb7eg1aUukj0lbm0aOX2QnAAAvjphNG6MhO3V/+SvUVyvgIpEg5t13wOTQK61Q0anFnh0XoOoxwC9AjLkvPwJXmvWBVnXLceSbz9HZ2ggWm43xj8/H0JSxtLohQ1oIdJ9tRE9xC0ABbDEXPpOj4BoucbS0AaW5uRmnT59GW5utNZtEIsHYsWMRFRVFm/OBJMzobD6PjvpTsJhsLY15Qj/4R2RC4psABg1MPEmKQunN+u+aHnv9N/BIgASTw30R6uas/3Zyd8aPH6/Nz8+/6mgdTpw4uTf9DcQ3ArDnC78H4O8AfoXNtG3GA9BFOwi9Grqq8wAYECdlOlrOgEBRFHZe3gcraUVGeDqivSIcLWlAafv1KNp/PQqGiwuGvvsOuJ70STcFgI42NfbsuACdxoSgUAme/f1I8Pj0mfkEgLprJTj+/Z9hNhog9vDG7+a+Au8AeiUZ6RuUkB+rgUVlBBiAe3IAPEeHgsmhx81IwOaEXlBQgBs3bgDGc854AAAgAElEQVQABAIBRo0ahWHDhvW2YBnsWC0GdDadhbyhAFaLLfjkiwLhH5EJd584WgTgRiuBM80KnKiTo8te/81mYdzN+m8PPr1u1Dpx4sTJYKe/gXgBbqam3zS9iJNKpR4AemQy2cA2HhykaMpPAoQV/MgRYLvRo1XTpdYrKG2/BoELH88m0MucTHW1AnV//goAEPXKIoik0Q5WNLC0NPbgm/8rgtFgQfgQL8x6PgUcLj3MlgCAJAicP7Yfl0//CgAIjx2OSTNeApdPn5kuwmBB58k6aCpsztccLwF8pwwBz58+Bn06nQ5nz55FeXk5KIqCi4sLUlJSkJKSAg5NsmMsJg3kjQWQN54FSZgAAAJxMPwjJ8HNaygtMgG6DWbkNchxulEBg5UAAHgLOJgU5oNRQZ7gOeu/nThx4mRQcs8rX6lUygagg80pvcK+XCaT3bVXn5PfRl+TNjFNTNrMVjN2lnwPAHhmWBbceWIHKxo4jB0dqNq8BRRBIOCJx+EzIcPRkgaU+hsK7P2qCGYTgeg4X8yYPwJsGvWC1qmVOJrzJVrrq8FgMpE+ZQaGj51Ki4ADsH3faWVd6MyrBaG3gMFiwCM9BJLUQDBo0uvYbDajuLgYxcXFsFgsYDAYSEhIoJUTusnQg476U+hquQCKtAIARB5R8AvPhMgjkhafh3qlDsfr5Chu7+mt/46SuGJyuC+SfJ31306cOHEy2LlnIC6TyaxSqbQJAD2ukByAsfEaLIpWsIQeEAxJdrScAeFA1TF06hQIcQvElKjxjpYzYBAGAyo3boZVo4H7iOEIe26eoyUNKNcr5fj+b8WwWkkMGx6A6XOSwKJJ8AUAzTcqcWzvdui1aghE7pg65w8ICKdPNoRFbYT8xA3oa23u1/wgMXweHQKOBz3M+QiCwNWrV3H27Fno9XoAQGRkJMaOHQtPT08HqxsYjDo52uvyoWi7DFA292837zj4h0+Eq3uIg9U9eKwkiUvtSuQ3dOLGzfpvJgNI9ZdgcrgPwt3p1y3CiRMnTuhKf3NB/wRgjVQqnSeTyQwPUhAd6W1ZljSRFiZtcm0Xfq46BgB4YcQssGjwngGAIklUb/sU+oZG8AICIF36Jhg0qf8EgGtlrfjxmxKQBIURaSF47Ol4MJn0mPGhSBKXTh/GhWM/gqIoBEbEYMrsRRCI3BwtbUCgSAqq0jZ0FTSAshBgclnwGh8OcbwvLWY+KYpCTU0NCgoK0NNjuwnh7++PcePGISgoyMHqBga9uhltdflQdpQDoAAw4OE/HH5hE8EXDf4WfUqjGacau3C6sQtqsy0DgM9mYmywFyaG+cDTWf/txIkTJ7Sjv4H4dAAjAbRIpdJK2FLVe5HJZI/eb2F0gdBroK06B4ABEU1M2v5W+gMshAVjQlIR6zPE0XIGjKZ936P7/AWwXAUYunIF2EL6zHyUFjXhl+/KQFFA2vgITJ5Gj9pPADDqtTj+3V/QICsDAKRMyMLISU/SpkOAqUsH+dEaGNs0AADhEE94Z0aCLaRH4NHa2opTp06htbUVAODu7o6xY8diyJAhtPgMaHpq0V6bB7XC1mCFwWDBMzAVfmEZ4AoGdxYARVG43qNFfkMnStqVIG6mnwcKeZgQ5o1HAjwGdf03RVG4VteN0upOTEgJQoAXPcounDhx4qS/9DcQb775cHKf+YdJ23C4uPk4Ws4Dp6TtKopbysBjczEv6SlHyxkwus6eQ9Pe7wAmE9K334IgKNDRkgaMooI6HPnZZi8xfko0xk2mRwACAB3NdTjyzefQKBXg8l0x+ZnfIywm0dGyBgTSSqLnQhO6LzQDJAWWKwc+kyIgHOLlaGkDQnd3NwoLC3H9+nUAAJ/PR3p6OhISEga9EzpFUVB3ydBelwetsg4AwGRx4B2UBp/QceDwBncmiMlK4EJrD/Ia5GjRGAHY0s+T/dwxIdQb0R7CQf0d2NljQN6lRuRebEJbl23exmIlsCArzsHKnNAZgiCwcePGwEOHDnmZTCZmXFyc9oMPPmgICwsz322fnJwcj507d/rJ5XKuQCAgMjIyelavXt3M4/GcRtVO7gv/MhCXSqXPAPhZJpM9P0B6aIXNpM2Wok0HkzYLYcHOy98BAGbE/Q88+O4OVjQw6OrqcX3bpwCAsP+dD8mI4Q5WNHAUnLiO/F9tM2GPPh6LtPH0aFFHURSuXshHwaEckIQVPoFhmDr3FYgl9AhCDc0qdByrgaXbVsnklugHz3FhYNHAGV+v1+PcuXO4cuUKSJIEm83udULncrmOlvdAoSgSyo5ytNXlwaCxZQCw2Hz4hIyBT8hosDmDOwtIrjMiv6ELZ5r/4X4u4rAxLsQL44K9BnX7MZOFwPnyNpy42Iiy652gboYpHmIeJiQHYWYmfbwwnDycbNu2ze/48eMeu3fvrgoMDLSsXr06eOHChVGHDx++dqebo6Wlpfx169aFb9iwofbJJ5/saWxs5Lz44otDtm7d6r9q1apWB7wFJ4OQe10V5QDwByAHgJtp6VNkMlnjgxZGB4xNdpM2CQRDUhwt54FzSJaLdm0nAsV+eCx6oqPlDAgWlQqVH2wGaTLBO2M8AqZPc7SkAYGiKOT+vQpn828ADCBrRjxGpNGjP7bZZMTJn3ehuvQ8ACA+bSLG/M9ssNiDv0c6YbJCcboeqrJ2AICLBx++j0aBHzS4Z0ABwGKx4NKlSygqKup1Qo+Pj0d6ejpEosHdko0krehuu4z2upMw6TsBAGyOCH5h4+EV9AhYbJ6DFT44SIrC1U418hs6cbVT3bs80t0VGaHeSPZzh8sgNaSkKArVjT04cbEJBSXN0Bltte9sFhNpw/yQmRqC4dHetDLkfBjo6Ohgr1ixIrS0tFQkFAqJV155peX9998P37FjR3VGRoamtbXV5Z133gmtrq52NZvNzKCgIONbb73VPHHiRA0A1NXVcaZOnRqfnZ1dv2fPHr+Ojg7OsGHDtJ9++mntF1984ffLL794AcCCBQva/j97bx7e1H3n+7/P0b6v3uXdRtgsNmATthgwEMjcZJompCFN08nMZMqUTpO0/ELS0ClhIG16M+2T3P4mbX6T9t5fm5ZJZmmTZtISYiDEJoQdDAZhY3mRN9mStW9nu38cWZaMCYRghJTzeh49Ouf7PZI/x9q+7/PZtmzZ4gSAgwcPajZv3jxr165d3a+++mqR2+2WLF++3PPiiy/27ty5s/jgwYMGhULBfuc73+nfuHHjOAC0t7fLd+3aVdLd3a1gGIaorKwMb9++vW/BggUzUovqD3/4Q86jjz46PHv27CgA/OAHP3CsWLGirrW1Vb1y5crA1ON7enpkarWafuCBB8YBoKysLLZs2TLvpUuXvjh9RgVmnGsJ8amxU5breIzAdeI/9QEAQFO3JuuLtI2F3PivDr5n8l8v+ArEWX6+AMBSFC7++J8RdY5CXV2Nqm/9fVaHI07AsRz+9PtzOH64FyRJ4L6v1mPugi9GKL7bOYg//fZfMO4chEQqw6ov/xWs9UvTbdYtIdDlwugHl0EHYgBJwLjYAsOSYpDi7F6EsyybqIQeDPJhuBUVFbjzzjthNmd3BATLxDDmOIrhnoOgol4AgFRhRH7ZKpgKG0CKsvfiUzBGo83hwsG+UYyG+MhWMUngjkIjVpfmoFSXvWt1ty+CA8f70XK8D/0jk/qlqliPtY0laFpQBI0ye73/AGA79vOqwHj3LbvCqDZUeK2N3+y6nmOffPLJcqlUyrW0tLQTBIGtW7eWJc8zDIONGzeOrV27tlsikXCvvPJK/tatWyvff//9czk5OfTEcfv27TPs2bPnIkEQeOihh2Zv3Lix5pFHHhlua2s7s3fvXt3TTz9dtWHDBk9FRUUitPvw4cPad999t8PlcokffPDBmvvvv7/mqaeecrz00ku9r7/+es7u3bvL1q9f79VoNCwAbN68eWjZsmUBhmGIHTt2WJ544omqlpaWc1KpdNrQ7/Xr19c6nc6rvrmeeeaZvk2bNl3RXtnj8YicTqe0vr4+UePKYDAwhYWF0fPnzyunE+Lr1q3z/fKXv4y9+eabhgceeGC8p6dH1tbWpv+rv/qroWu8BAIC140gqtMEE/IjeOGLU6Tt16f/E1EmhiWWhZifX5Nuc24J9td/Bd/5DkgMBsz+3jaQ0uxemAAAy7B4580zOHtiACIxiY1fXwTrnLx0m3VLuHT6CA78/v+AikVhyC3E3V/dAmNe9l+AoAMxjO6/jMAlFwBAXqBB7l1VkOVkdxgyx3Ho7u7GRx99BJeLP/e8vDw0NTWhpCS723DRVBij/Yfh7P0INMWva+WqPORXNMOYV5fVF5b7fCEc7B3FJwNuxOLNv00KKVaVmLGi2Ay1NDuXVRTN4Oj5EXxwrA8nL44k+p7r1TKsWmTB2sYSlBZo02ukABwOh+TUqVPat99++5zRaGQA4Omnnx5oa2tL5AIWFxdTxcXFnon9bdu2De3Zsyfv+PHjyrvvvjsR1rFly5Yhs9nMAMCyZcu8ra2t+scff3wMAO655x7vjh07mNOnTyuThfi2bdsG1Wo1q1arY3V1df5AICC69957vQCwadMm109/+tMSm80mb2hoCM2bNy8CIBJ/KLd9+/aBpUuX5nR1dclqa2snxlPYu3dvx438X3w+HwkAer2eSR5XqVRMIBCY9gtLpVKxX/rSl0ZffPHF0ueff76CZVncddddrkceecR1IzYICEzHtX4xuPht6tgNYbVaSQC7AfwtABWAVgCbbTZb7zTHLgHwjwAaACgAdAHYbbPZ/utG//7tRODch+AYCoqKBZDos7tIW/vIRRzpPwmZSIqv1z+QbnNuCUN/+jOG//w+CIkENc89A5nJmG6TZhyaZvBfb5zCxfZhSKQiPPTXjaiYld0eQQBgaAqt//1vaD+yHwBQXXcHVn/5MUhl2RuOC8QLcrWPYOxDO9goA0JCwnxnGXT1BSCyvC3d0NAQDh06BIeDr2Gq0+mwYsUKWK3WrI56oaIBOPs+grP/MFiaXycrtcUoqGiGLqcWBJGd0Q80y+LUsAf7e0fRNT7ZNKbWrMHq0hzMz9WBzMLXneM4XHZ40XKsDx+ecsAfogAAIpLA0rn5WNtYgoWzcyH+AoaeX693+lbjcDikAB9GPTFWVlYWTT7G5XKJdu7cWXzq1CmN3+8XEwTBhcNh0djYWEoIS0FBATWxrVAoWKPRSCXPy2QydqqILSwsTBwjl8tZuVzOTuwrlUoWACYeY7fbpS+88ILlwoUL6mAwKCIIggMAp9Mprq2tvfF/wjRotVoWALxeb4q9wWBQpFarmeke85vf/Mb085//3PLKK690LV++PDAyMiJ55plnSp944onyV1991X5TDRT4wnI9oen/brVaJz7QcgC/tlqtKfkbn6F92TYADwNoAjAA4KcA/mi1WuttNhs75VgjgDcB/BUAN4AvA/id1WptstlsR6/z792WcBwH38kvRpE2mqHxq5NvAgC+XLsBZlX2C1Jv+znY//VXAICqf/gmNLOyv0UbFWPw1v85jsu2UcgVEjz8+GIUlxnSbdaM4xsfw59/9yqcDjtIkRh33vMw5t6xOqvFGADExsNwvt+FcD8fjqwsNyB3bSUkuuy++ODxeNDa2gqbjS9AKJfLsWTJEtTV1UEszk5PKADEwuMY7v0QY45PwLF85KrGWIX88mZojFVZ+373RGI41DeGQ/1j8Eb585aLSSy3mLCqJAf56ux8v3v8URw86UDLsT70DE3mvZcXarG2sQQrF1qgU2d34cFMxWKxxACgp6dHOpEL3dvbmxKOt3v3bsvQ0JB0z549FyeE86JFi+o57tYWAn/uuedKdTod/fvf/74jNzeXdrvdoqVLl9bjyrTYBOvWrZvzaaHpzz77bO/DDz98RWi6Xq9ncnNzY6dPn1Y1NjaGAD5cfWhoSDZnzpzQdM917tw5ZX19vb+pqSkA8BcZvvKVr4x+//vf/2JUnRW4JVxr5fD/T9l/43P+vb8H8GNbfBVjtVq3ARgBsALAoeQDbTbbe1Me+59Wq/V78WMzWohH+i+Acg3Ei7QtSrc5M8qfOg9iwDeMfHUO7rWuTbc5M05kZAQXf/zP4BgGRV/+EnJXrUy3STNOJExhzy+Pod/uhlItxde+cQfyi7K/OFfPxTPY99a/IhoOQqM3YcNXtyCvOLt/nzmGxfjxAbgP94FjOIgUEuQ0V0A925y1YgzgK6F/8sknOH36dKIS+sKFC9HY2Ai5PDvFGABEgk4M2w/CNXQC4Phr5bqcWuSXN0Otz87iixzHoWs8iAO9ozg5PJ7o/V2glqO5NAdLirKz9zfNsDjWMYKWY304fmEETDz2XKOUJkLPK74A3+uZjsVioerr6/0/+tGPLC+//HIPALz00kspOVLBYFAkk8lYg8HARCIR4ic/+UlhJBK55W/qQCAgys/Pj+n1esbj8Yh27dpludZj9u3bd/5G/9599903+sYbb+Q1NTX5ioqKqF27dhUVFRVFVqxYcUV+OAA0NDQEfvzjH5cePnxYtWTJkuDo6Kj4rbfeyqmurp5WuAsI3AifKsRvZtsyq9WqA1AK4HjS83usVmsXgHpMEeLTPL4QQA2AMzfLpnThP7UPAKCpawYhyl4vynjYi38//y4A4K8XfgWSLC7cAwBMOIwLL7wI2u+HYdEClD76SLpNmnFCwRh++/99giGHFxqdHI9uXgJznjrdZs0oLMvi6Ae/x/ED/Hu71FqHdV95HHJldp93ZMiPkfc7ERvl1yCaObnIWVUOkSJ7P9cUReHkyZM4evQoYjE+MGzOnDlYtmwZtNrszYcN+QYwbN+P8ZF28NloBIz5C5BfvhoKTUG6zZsRogyLo4Nu7O8ZhcPPB/2RBLAwX4/mLO79bR/0ouVYPw6e7Ic3wL/HSZLA4tp8rGksRmNtPiRZXnAx23j55Ze7n3322dLm5uZ5arWa+cY3vjHY2tpqkMlkLABs3bp14JlnnilfunRpnUajoR955JERs9l81V7aM8Vzzz3Xv3PnztKGhoZ6o9FIbdmyZeC9996bsXy2p556ajgQCIgeffTR2ZFIhJwzZ07gF7/4RddE67JDhw6pv/3tb1e/884750tLS2MPPvjguNPplHz/+98vc7lcUplMxtbX1/tfeOGFK9JpBQRuFOJWhaJYrdZiAH0AZtlsts6k8TYAf7LZbLs/5bFqAB8A6LHZbJs+w98sA2BvaWmBxXLNC223BCbsR98rfweOoVH8rX+BRJ+9haz+15H/jdbeo2gonI9td34z3ebMKBzL4uKP/xnuI59AUVSI+S+9CLEqu4tV+X0RvPHaJxgd9sNgUuLRv18CvTF7KwUDQMjvxftvvgbH5QsgCAJ33HU/FjX9BQgyexeqbIyBq60XnpODAAeIdTLkrquCKotTD1iWRUdHB9ra2hAI8M6SsrIyNDU1IScnJ83WzRz+8W4M2w/AN3YRAEAQIpiKGpBftgoyZXbWe3AGozjYN4q2fhdCSb2/7yw2Y2VJdvb+9gVj+PCkAy3H+3DZ4U2MF+dpsLaxBKsXWWDQZnakh8PhwJo1awCg3Gaz9Xze5ztz5kxPXV3d2Oc2LA20t7fLN27cOOfAgQNnk3O4BQQEbh1nzpwx19XVlU0dv5Xu2IlEo6mxTfqkuSuIe9L/G8AQgK/PjGm3jkD7RJG2+qwW4R3OTrT2HoWEFOOxBQ+m25wZp//f3oL7yCcQqZSo2f69rBfhHncIv/nFEYy7QsjJU+Nrm5dAk+X5wYP2S/jznp8j5PdAodZi/abNsFTe3IIytxtB+zic+7pA+6IAAegbimBaVgJSmn2huQAfltzT04NDhw5hbIxfc+fm5qKpqQmlpdkbiu0bs2HYvh8BD19/iCQlMBcvRV5pE6Ty7AtHZjkO55N6f0+4I8r1SjSX5mBRviHren8zDIuTNidajvXjk/PDoBk+1UClkGDlgiKsaSxBdbE+K73+XzTOnDmjYFkW8+fPDw8NDUl2795dUldX5xdEuIDA7cctE+I2m81rtVp7wVdBPw4kRHYlgNPTPcZqtZoA7AXQCeBRm81GT3dcpsBxHHzxsPRsLtLGsAz+d7xA25dq1iNXnZ2elAnG2j5G/5v/DpAkrP/Pd6EoKky3STPKmDOAN35xBD5vBAUWHR75uzugVGef12gCjuNw6qM/4+O9/wGOZVFYNgt3Pfz3UGuz1yPMhCiMHuyGv2MUACDLVSH3rmrI87M3/H5kZASHDh1CX18fAECr1WLFihWYPXt2VooTjmPhGWnHkP0Awv4BAIBIrEBuyXLklqyAWJp9FxODFI3DDhcO9I5hNMQXkhaTBBoLDFhdmoNyffadc/+IHx8c7cOBE/0Y9/PnTBLAwtm5WNtQgjvm5kMqyc4La19UPB6P6Pnnny9zuVwSuVzO1tfX+59//vn+dNslICBwJbc6QfkXAJ62Wq37wVdN/zGAS+DbmKVgtVrzwYejHwXw+DRV1TOOqOMiqDEHRCo9lNUN6TZnxni/6xB6vQPIUZlw3+zrLaifmQS67eh85WcAgLLHHoVh4YI0WzSzDA/68MZrRxAKxFBcbsTDf9sIeRbnCEfDIbT8xy/R3XESALCg6W4svesBkKLsXLhyHAf/hVGMHegGE6ZBiEkYl5bA0FAIIss8hBN4vV60trbi4kU+HFsmk2HJkiWor6/PykroLEvDPXQKw/YDiIb4Cy1iqQZ5ZU3IsSyBSJx9kS39vhAOTOn9bZRLsaqU7/2tybLe34EwhY9OOdByrB+2vvHEeFGOCmsaS9DcUAyTTpFGCwVmkpUrVwYOHDhwLt12CAgIXJtb/evzP8GHprdiso/4X9psNtZqtd4J4E8Aam02Wx+AzQDmACgH8BWr1TrxHG/YbLa/v8V23xR8X4Aibd6ID2+e+yMA4LEFD0Iqzl5PaczjxcUfvgg2GkXO6lUo/Mt7023SjNLfM449rx9FJEyhYlYOHvrrBkiyNEQZAEYHe/Gn3/4LfO5RSOUKrN34OCrmLEy3WTMG5Y3Aue8yQj38wl1RrEPuXVWQGrJzwR4OhxOV0BmGgUgkwoIFC7B48WIoFNl3ziwTw9jAUQz3fAgq4gEASOUG5JevhqmwAWSWFdOkWQ6nRjw40DOKzvHJosg1Jg2ay7Kv9zfDcjjTOYqWo334+NwQKJr3XShkYjQtKMKahhLMLjNkZXSHgICAQKZyS9Vg3Kv9vfht6txHANRJ+zsB7Lx11s0sTNiPYMdhAIBmQfa28frt2T8gRIVRn1+LhsL56TZnxmApCrYfv4To6BjUs6pRtWVzVi9w7J1j+LdfHQMVYzB7Xj7u/9oCiLOwhQ/Ae4UvHP8IH77zGzA0DXNBCe5+5FvQmXLTbdqMwLEcPKcG4fqoFxzNgpSJYF5VDu3cvKx8T9M0jVOnTuGTTz5BNMqH6tbU1GD58uXQ6bIvH5qhwnD2fwxn7yHQVBAAIFflIb98NYz59SDI7PoceyIUPuofw4d9Y/BG+ZRYuZjE0iITVpeaUaDOrossg6MBfHCsDweO92PMG0mM11WbsaaxBEvnFUCeZR5/AQEBgWxB+Ha+RQTOHYoXaavL2iJtl8a6cdD+MUSkCI8t/EpWLuIBXqh1/+sv4eu4AKnRiJrvPQNSmr2ef9v5EfzHr0+AoVnMX1SEv3yoDmSWhilTsSg+fPs3uHiyDQBQ27gSTfd+FWJJdr6+0dEgRvZ2IjrMewzVVjNymisgVmXf+XIchwsXLqC1tRV+vx8AUFJSgqamJuTlZd93MhUNwNn3EZz9h8HSvEBTai0oqFgDXU4tCCJ7PsMcx+HyeBD7p+n9vbo0B0uzrPd3KEKh9cwgPjjahws97sR4vknJh54vKkZulnewEBAQEMgGBCF+C0gu0qbJ0iJtLMviV/ECbfda16JQk30L2wmG/7QXI3v3gZBIMPu5ZyA1Zm/RrnOnBvCH350Gy3JoWFaKu788FwSZnRdYxkeH8eff/Qtcww6IJVKs/NKjqFm0It1mzQgszcL9cR/Gjw0ALAexRoqctZVQV5rSbdqMMFEJfXSUz4k2m81YuXIlSktLs+6CYSziwUjPhxh1fAKO5T3CGkMl8iuaoTFWZ9X5TvT+PtA7in4f3/ubALAgT4fVpbmYbcqe3t8sy+Fc9xg+ONqHw+1DiMb4VmtyqQjL6wqxprEEc8pNILP0+1lAQEAgGxGE+C0g6rCBGu2HSKWHqrox3ebMCC3dbege74NJYcD9tXen25wZw3O2Hd3/+ksAQNU/bIGmuirNFs0cJ4/04d3/OAtwwLLVlVjzP7KzejQAdLUfQ8t//gpUNAKdKQ93f+1bMOcXp9usGSHU74Xz/S5Q47xw0dUXwHRnKUSy7Ps5cDqdOHToEHp7ewEAarUaK1asQE1NDcgs6/0eCY5iuOcAXIMnAI7PD9bl1CK/fDXU+rL0GneTGQ1FcbB3FK0OF0IUL0jVUjHuLDZhZUkOTFnU+3vYFcT+4/1oOd4PpzuUGJ9TYcLaxhIsryuEIgs/uwICAgJfBIRv71tAthdp80cD2NP+NgDg6wsegFwsS7NFM0NkeBi2//kTgGVRdP99yF3VlG6TZowjH3bj/Xc6AACr77bizrXVabZoZmBoGof//O840/Y+AKBybgPWPPA3kMqzK48UAJgIjbFDdvjOjgAApEYFctdXQ1GkTbNlNx+fz4e2tjZ0dPDvYalUijvuuAMLFiyARJJdRclCvgEM2w9gfOQsAA4AAUN+PfLLV0OpyZ5WiizHoWPMh/09U3p/65RYVZqDxoLs6f0didI43D6ID472o/3yWGI8x6BAc0Mx1jSUoMCcfa3WBAQEBL5oZJ8qvM1gwgEEL8SLtNWvSbM1M8O/tb+DQCyIublWLLFkZ1VpOhTGhR/+GLTfD8OihSj92lfTbdKMwHEcDu3rxId7LwEANtw3B4vvLE+zVTOD3+PC3j0/x5sDQTcAACAASURBVHDfZZCkCMv/4iuYv2xdVnr9A5fG4GzpBhOMASQB45JiGBZbQIqzQ7hMEIlEcPToUZw8eRIMw4AkSdTX1+OOO+6AUpldObOBcTuG7PvhG+PbrhGECKbCBuSVr4JcaU6zdTePEEXjsIMPP3dmce9vjuPQYXej5VgfWs8MIBzlPf1SMYll8wuxtrEE86rMQui5gICAQBYhCPEZJnDuEDg6BkV5HSSG/HSbc9Ppdvfig8utEBEk/mbhQ1kpYjiWRefL/wuh3j4oLEWYtfUpEFnYR5rjOOz74wUc+bAbBAHc+5U61C/OzvDsvkvn8P5bryESDECtM2D9w1tQUJp9aQa0Pwpny2UEu/iCTvJCDXLvqobMnF2ilKZpnDlzBkeOHEEkwhcms1qtWLFiBfR6fZqtu3lwHAefy4bh7v0IeOwAAJKUwFy8BHmlKyGVZ0/Vd4cvjAO9ozgy6EaM4UPtjXIJVpbk4M5iEzSy7IhsGB0PY/+JPrQc68fQWDAxPrvUgLWLS7CirggqRXacq4BAOmEYBi+88ELRu+++a45Go+ScOXMCP/zhD3vLyspiV3vMO++8o//5z39eODg4KNPpdPTXv/71occff3zsascLCHxWBCE+g2R7kTaWY/HLk2+CA4e7Z62BRVeQbpNmhL49b8L9yVGIVCrUPPcsxKrs8MAkw7Ic3vvPdpw80gdSROD+Rxagti57wlonYGgKJw7+N47ufwfgOBRXz8FdD22GQqVJt2k3FTZGw3feCddHvWBjDEipCKY7y6Crz8+qi2XhcBhdXV04cuQIfD4fAMBisWDlypXIz8+eC5+xiAc+1yWM9h1GyD8AABCJFcgtWY7ckhUQSzP/O4njOAwHo7C5/Dg2NI5L7tTe36tL+d7fogz3CNMMi+4BLzrsbpy4OIIznaPg4nH2Rq2cDz1vLIYlN7u+kwQE0s3LL7+cv2/fPuOvf/3ri0VFRdQPfvCD4s2bN1e99957HaJpnCtHjhxRbd++veKll17qWrduna+trU39D//wD9Vms5m+7777PGk4BYEsRBDiM0h0wAZqtI8v0jYr+4q0fWg/gk6XHXq5Fhvn/EW6zbnpsBSFkfc/gOOt/wBIEtanvwtFUXaJU+94GO0nB3D2hANjIwGIxSQefGwRqmuyp+o9Q1Po6zyPrvZjsHecQiwaBggCi9d8CQ3Nf5k1RbvoQAzByy4EutwI93nAxXs4qSqNyFlTCYk282s3cByHkZER2O122O12DA0NJeZMJhOamppQXl6e8RcbGCoM/3g3fK5O+N2diASdiTmxVI280pXIKV4CkVieRis/H7zwjsDmCsDm9uOSKwBfjE7My0QklllMWFViRqEmc2s2hCIULvaOo8PuwgW7G7a+8UTFcwAQi0gsmZuPtYtLUD8rN+MvNAikn5GREfGzzz5bevr0aY1arWa+9a1vDezYsaP8tddeu7Rq1Sr/4OCgZNu2baWXLl1SxWIx0mKxRL773e86mpub/QBgt9ulGzZsmPfcc8/1vPHGG/kjIyPSuXPnBn72s591v/rqq/l//OMfzQDw2GOPDW3ZssUJAAcPHtRs3rx51q5du7pfffXVIrfbLVm+fLnnxRdf7N25c2fxwYMHDQqFgv3Od77Tv3HjxnEAaG9vl+/atauku7tbwTAMUVlZGd6+fXvfggULwjPxf/nDH/6Q8+ijjw7Pnj07CgA/+MEPHCtWrKhrbW1Vr1y5MjD1+D/96U/6+vp634YNG3wA0NTUFFixYoXnd7/7Xa4gxAVuFoIQn0Emi7StzroibcFYCL89+3sAwNfq7odSkrkLpakEe3ox8kELRg8eAh3vN1z22NdhWFCfZstuDpEwhQtnh3D2xAB6L7sS4yqNDA98bQHKqjI/v5ShafR38eK7u+MkYpHJ33VzQQmWbXgQJbPmptHCzw/HcaDcYQS6XAh2uREZ8qfMy4u00C8shHqWKaOFaSQSQU9PD+x2O3p6ehAKTVaOJkkSFosFNTU1qK2tzdiLKhzLIODthd/VCZ+rE0Fff6LyOQCQIhk0hgrocufAVLAQpCjzQpWnCm+bKwB/kvAGAJ1MjFlGDWabNGgsMEAhybwUIJc3jI5uNzrsLnTY3egZ8oLlUo8pylGjttyI2nIT7pibD40ye6q8f1F46cilqkvuwC3LBZllVHufXjKr63qOffLJJ8ulUinX0tLSThAEtm7dWpY8zzAMNm7cOLZ27dpuiUTCvfLKK/lbt26tfP/998/l5OQkPpT79u0z7Nmz5yJBEHjooYdmb9y4seaRRx4ZbmtrO7N3717d008/XbVhwwZPRUVFIrT78OHD2nfffbfD5XKJH3zwwZr777+/5qmnnnK89NJLva+//nrO7t27y9avX+/VaDQsAGzevHlo2bJlAYZhiB07dlieeOKJqpaWlnNSqXTKp4Zn/fr1tU6n86ofmGeeeaZv06ZN7qnjHo9H5HQ6pfX19Yn8D4PBwBQWFkbPnz+vnE6IcxxHcBw3dQyXL1/OrtwugbSSXerwNoIJBxDsmCjStjbN1txcYgyF35z+T/iiAcw2V+LO0sXpNulzQweDGD3UCmfLfgQ6J3/rlGWlKPgff4G8dZldaI9hWFy2jeLscQcunR8BTfOLfJGYhHVOHuY3WFBpzYEog6sOMzQNx+UOXnyfP4loZFKwmfKLUT2/EZVzG2HIydyQZY7lEBnyI9DpQvCyC9R4JDFHiEkoS/VQVRmhqjBCrMrMxT3HcXA6nSle7+TFkEajQXl5OcrLy1FSUgKpNPPOk+M4RIIjvMfb1Qn/eDdYJjp5AEFCpS+D1lgNrakaKl0JCDKzRCnHcRgKRGBzB2Bz+XHJfXXhbTWpYTVqkKeSZdRFI5bl0D/iT4jujh53SosxABCRBKzFetTEhXdNmRF6TeZHpwjcnjgcDsmpU6e0b7/99jmj0cgAwNNPPz3Q1taWKJZRXFxMFRcXJzy627ZtG9qzZ0/e8ePHlXfffbdvYnzLli1DZrOZAYBly5Z5W1tb9RP50ffcc493x44dzOnTp5XJQnzbtm2DarWaVavVsbq6On8gEBDde++9XgDYtGmT66c//WmJzWaTNzQ0hObNmxcBMPEjxm3fvn1g6dKlOV1dXbLa2trJH7ck9u7d23Ej/xefz0cCgF6vZ5LHVSoVEwgEpv1yXbt2reeb3/zmrHfffVe3fv16b2trq6atrU1P03TmfEkJ3PYIQnyGmCzSNj9rirT1jPdjf/dhfNR3FMFYCARB4G8WbsqohVMyHMfBd74DI/ta4Dr8MdgY/1siUimR03Qn8taugaqyIqPPb7Dfg7PHB3D+9CBCwcl6JKWVJsxfVISa+QWQZ3AhIIah4bh8YVJ8hyeLHZnyLaia14iqeY0w5GRu/QKWYhDq8yDY6UbwshtMmErMkXIxVJVGqKuMUJYaQEozS6xNEI1G0dvbi+7ubvT09CAYnHwdJ7zeE+LbZMpMD38s4oXfzXu8fa5O0LEpEQyqXGhNs6AxVkNjrMi4sHOO4zAYiODSRKj5tMJbAqtRjVkZKrxjFIPOfk9CeF/ocSOY9HkEAKVcjNllxoTHu7pYD7lUWGplG9frnb7VOBwOKQAkFyArKyuLJh/jcrlEO3fuLD516pTG7/eLCYLgwuGwaGxsLGUxUFBQkHhzKxQK1mg0przZZTIZO1XEFhYWJo6Ry+WsXC5PhPYolUoWACYeY7fbpS+88ILlwoUL6mAwKCIIggMAp9Mprq2tvfF/wjRotVoWALxeb4q9wWBQpFarmeke09TUFPjHf/zHnp/97GdFO3bsKK+oqAjdc889Y/v37zfcVOMEvtAIvw4zAMdx8J/OjiJtwVgIrb3HsN/eBvt4f2K83FCM+2vvRpnBkkbrboyoywXn/oNwfrAfkeHhxLh27hzkrVsD09IlEMky12Mx7gqh/aQD7ScG4BqdFDTmPDXmL7Jg3sIi6AyZm0rAMgwc3RfR1X4Ul8+dSBHfxryihPg25mZuPj8TohDsdiPQ5UKoxwOOngxTFutkUFeZoKoyQVGkBZGBOaUcx2FsbCwhvAcGBlK83mq1OsXrLcvAzyNDR+B3dyfEdyQ4kjIvlmqgNVVDa6yGxlSdcRXPP4vwtpo0mGVUZ5zw9gVjuNgzGWbe2e8BzbApx5h1ctRWmFBbbkJtuREl+Vohz1sgbVgslhgA9PT0SCdyoXt7e1PChnbv3m0ZGhqS7tmz5+KEcF60aFH91DDsmea5554r1el09O9///uO3Nxc2u12i5YuXVoP4KofoHXr1s35tND0Z599tvfhhx++IjRdr9czubm5sdOnT6saGxtDAB+uPjQ0JJszZ07oymfi2bRpkzs51P1v//ZvK+vr6/1XO15A4LMiCPEZIDpwCTFnH0QqXUYWaeM4Dh2jnWjpbsMnjlOgGP4Cp0qqxJ0li9FcsQxlhsxqa8XSNMaPncDIBy0YP3kKYPnFlNRkRG7zauSuaYaiIHMjF8KhGDrO8Hnf/fbJ3yCVWoq5C4swf5EF+UXajFoEJ8MyDAbsF9F59hi6z59AJDSZzmXILUT1hPjOK0qjlZ8PyhOJ53u7EB7wAUlrIlmeGuoqI1RVJkjNyox8HaPRKPr6+hIh54HA5GtIEESK19tsNmfcOXIsg6C3D7648A56+6bkeUuhNlRAa5oFrbEacnVeRp0jOxFq7vLD5g6gcxrhrZdJEt5uq0mNXGXmCG+O4zDiDk2Gmdtd6B9JTRslCKCsQIvaciNq4sI71yCkiwrcPlgsFqq+vt7/ox/9yPLyyy/3AMBLL72U8sMYDAZFMpmMNRgMTCQSIX7yk58URiKRWx5OFQgERPn5+TG9Xs94PB7Rrl27runZ2bdv3/kb/Xv33Xff6BtvvJHX1NTkKyoqonbt2lVUVFQUWbFixRX54QCfS3/ixAnlwoULQ+FwmPzNb35jPnHihHbPnj0XbtQGAYGpCEJ8Bpgo0qaevxpEBhXVcYc8ONjzMQ7YP8ZIYDQxPi/PitXly7HYUg9pBp0PAIT6HXzhtQMfgvJ6AQCESATj0juQu3YNDAvqM7YnOEOz6LzgxNkTDnR2OMHEPTViCYnZc/Mxb5EFlbPMIDM075tlGAz22NB59hgunz+OSDBJfOcU8J7v+YthylDxzXEcoiMBBLt4z3dsLOmiPElAWaKDqsoEVZURkgzMKeU4Di6XKyG8BwYGwLKTwlSlUqV4veXyzAvFjgSdfIE1dyf87stX5nnrSqE18R5vla4EJJk5P7lThfcldwCBaYS31aRO5HlnkvBmGBb2QV+K8B73p0TwQiomMavUgJoyPsx8dpkR6gxO5RH4YvDyyy93P/vss6XNzc3z1Go1841vfGOwtbXVIJPJWADYunXrwDPPPFO+dOnSOo1GQz/yyCMjZrP5qr20Z4rnnnuuf+fOnaUNDQ31RqOR2rJly8B77703Y9Vin3rqqeFAICB69NFHZ0ciEXLOnDmBX/ziF10TrcsOHTqk/va3v139zjvvnC8tLY0xDEP80z/9U6nD4ZBzHIfa2trAr371q4s1NTXT5q8LCNwIV1QEzCasVmsZAHtLSwssllsTQs1Eguh75XFwdAzF3/x/ITHe3rmpNMvg5GA79ne34dTw+UR4qElhwKrypVhdvhS56syqok2HwnC1tWFk3374bbbEuKLYgrx1a5C7aiUkuswKA52A4zg4esZx9sQAOs4MIhyKp2MRQHmVGfMXFWH2vALI5Jmz4E+GZVkM2m3oaj+Gy+dPIBxI1I2B3pyP6vmLUTmvAaY8S8Ys+JPhGBahfi+CXW4EL7tA+yfXPqRUBGW5AeoqE5TlBogy8DWMxWIpXm+/fzKCjyAIFBQUoKKiAmVlZcjNzc2415CK+hI53n53J6ioL2VepszhPd6mKmgMlRBlUDcJluMw6I8kWoldcvsRoFJTJ/XyyVBzq1GNnAwS3uEoDVuvOyG6bb3jiMRSz0+jlCZyu2srjKgs0kMizswLmV90HA4H1qxZAwDlNput5/M+35kzZ3rq6urGPrdhaaC9vV2+cePGOQcOHDibnMMtICBw6zhz5oy5rq6ubOp45q30bnMSRdrK5t3WInzAN4z93W041PMJvFF+sSwiRWgsqkNzxTLMz6vJqFZAHMfBf9GGkX0tGGs7DDbCX7Ak5XLkNK1A3to1UM+qzphF41TcY0GcPcHnfY+7Jj2nuQUazF9kwdyFhdDqMmfRnwzLshjqucSL73PHEUoS3zpTHqrnN6Jq3mKY8jNTfDNRGiH7OJ/v3T0ONmnxL1JLoa7kQ84VxTqQGbbo5zgObrc7xevNMJPnp1QqUV5ejrKyMpSWlkKhyKz3KENHEYj38/a5Lk2T561O5HhrTdWQyvVXeabbD154h3lv96cI79lGTTzcPLOEt9sXSfTu7rC70D3oAzulj1iBWTUpvMuNKMpRZ8z5CQhcjTNnzihYlsX8+fPDQ0NDkt27d5fU1dX5BREuIHD7IQjxmwjHcfCfeh/A7VmkLUJFcLj/JA50t8Hm6k6MF2sLsLpiOZpKF0Mr16TRws9ObHwczgMfwtmyH2HHQGJcW1uD3LXNMC9fBlGGhbxOEArEcP7MIM6ecGCgN9FpBGqtDPMWFmHeIgvyC7VptPDGYVkWQ72d6Dp7FJfPn0DI703M6Yy5qJq/GFXzGmEuKM7IhTHljya83qE+L5IbCUtNSqiqTVBXGiHLz7yFP0VRKV5vny/VK1xQUIDy8nJUVFRknNebYxkEff2Jft4Bb29qnjcpgdpYCa2xChpTNRTqgow5v2ThPdFOLDhFeBvkElgTwluDHKU0I86PZTk4nP5EJfMOuwvDrtT6SyRJoLpYnxDdNeVGGDSZ+dsgIPBpeDwe0fPPP1/mcrkkcrmcra+v9z///PP9136kgIDArUYQ4jcRxjeGmLMPpFILlfX26K3NcRw6XXbs727D4f4TiNB8DpxCLMeykgY0VyxDlbEsIxZbE3AMg/ETJzHyQQvcx04kCq9J9HrkNq9C7ppmKC2ZmTdMUwwudYzg7IkBdF1wJjw4EqkINfMLMG9hEcqrzSAzsCovx7IY6utC19lj6Dp3HCH/5MUFrTEHVfMaUT1/McwFJRn1fgT4z1lsLIRglwuBLjeiyUWeCEBu0cYrnRsh1WeWVxgAxsfHYbfb0d3dDYfDkeL1VigUKCsrQ3l5OUpLS6FUZk7xKo7jEA2NToabj18GSyen/xFQ6Up4j7exGip9acbkebMchwF/GLZ4VfPOqwnveJi51aSBWZEZwpuiGXT1e5PaiLngD6U6+xQyEWaXGlFbwffutpYYIJdlxmsnIPB5WLlyZeDAgQPn0m2HgIDAtRF+lW4iIrUB+uUPQG6ZnfYibd6ID4d6jmK/vQ0DvskWXbPNlWiuWI4lxQshF2dWAajw4CBGPtgP5/6DoMbH+UGShHFxI194bdECkOLMe0tzLIc+uxvtJ/l+39EIXxCJIIBKaw7mLyqCdW4+pBm4iORYFsN9l9HVfgxd544h6EsS34YcVM3nq53nFJZmhABIhmM5RAZ88UrnblDeSQFHiEkoy/RQVZqgqjRCrMysAk8URcHhcCS83h6PJ2U+Pz8/UWgtLy8vo9JYqKgffncXfK5L8Lk6QUW9KfN8nndVvJ93FcQZkuc9VXhfcgcQmiK8jXHhPSvDhHcgFIt7unlvd2e/BxSd2kbMqJVjTlx015YbUVaghShDC1UKCAgICHwxyLyV/W0MIRLDuOqrafv7LMvi9HAH9tvbcGLgLJh4SKVOrsXKsiVoLl+KQm1mtehiIhG4Dn+MkX0t8HVMdoyQFxYib20zclevgtRoSKOFN87YSABn4/2+vePhxHh+kZbP+15QCLU280InOZbFcH83L77bjyHoG0/MafSmRNh5blFmRWIAAEsxCPV4ePHd7QYbnqwiLVKIoYrneytL9SAlmVWN3+PxJIR3f38/aHry3ORyecLrXVZWllFeb4aO8Xne7k74XZ0IB4ZS5sUSVSLHW2OshkyRGd8nLMfB4Q+n9PG+mvCeCDfPBOHNcRyc4+FJb7fdhd7hK9v2luZrEi3EastNyDUobvtzExAQEBAQSEYQ4lnASGAUB+yHcdB+BO4w77kiCRKLCuehuWI5FhTMhZjMHFHAcRwCnV0Y+aAFY4dawYR5kUrKZDAvX4a8dWugqZmdkYuuoD+Kc6cH0X7CgcH+SU+cVifn+303WJCbn1l5+kC8B2+S+A54J3uZa/QmVM5rQPW8xci1lGfc60aHKAQv817vUK8HXJInTqKXQ1VlgrrKCHmhFkQGpQzQNJ3i9R4fH0+Zz83NRUVFBcrLy5Gfn58xXm+OZRDyDcT7eV9C0NMLjpsUqAQpgcZQHhffs6BQ54Mgbv9zY1gOA4FrCW8prPH87ttReDMMC08gijFPGC5vBGPeMNzeCMY8Ebh8Ybg8Ebi8YcSmeLslYjIlv3t2mREapTRNZyEgICAgIHBzEIR4hhKjY/jEcRr77W0477yUGC9Q52J1xTKsLFsCgyKzWnRRPh9feO2DFoT6JuuKqGdVI2/dGphXLIc4gzxxE1AUA9u5YbSfGECXbRRcPO9bKhOjdn4B5jUUoazClFEiDoh7rhx2dLYfxeX24/B7XIk5tc6Aqnm85zuvuOK2EgPXQ2w8nMj3jgz6gKRiy7J89WS+t0mZUefm9XoTwruvry/F6y2TyVBaWpoIOVepVGm09Prh87zHEi3F/O4uMFPyvJXaYmjjXm+Vvuy2y/OO0AzGIxQ8kVj8noInSmE8EuO3IxS8UQpTm42aFNJEmLnVqIZZmb50oyjFwOXlBbYrSWi7vJHE+LgvAvY6OqZqlNJEiHltuQlVxTpIxJlzMVlAQEBAQOB6uL1WIwLXpNvdh/32NrT2HkOI4j3FUpEES4oXorl8OWpyqjJKGHAMA8+ZsxjZ1wL30WPg4sJArNUid/VK5K1thrKkJM1WfnY4lkNPtwvtxwfQcXYIsWg875skUF2Ti/mLLJg1Nw+SDAtf5jgOzoEe3vN99miK+FZpDaiax+d85xdXgMgQDyoQF3PDgUS+dyy54jJJQFmq4z3flUaINZlTW4GmaQwMDCTEt9vtTpnPyclJCO/CwsLbzuvNcSzoWACxqA9UxAcq6gUV9fH7UX4/FvGCoVIrZMuUZmiMVfFw8yqIJem5gMdyHHxRalJcRyiMRyfF9XgkBk+UQmSKB3g6CADmJOE96xYJb47jEAxTqcLaE4bLF0l4tl3e8BXF0q6GXi2DSS+HSavg73VymHUKmHRymOL3Snlm1VQQEBAQEBC4EQQhngEEokF81HsUB+yH0eNxJMYrjaVoLl+O5SUNUEozo6DQBJHhYYy0HICz5QBirriYI0kYFi1E7tpmGBsbQEoybzHmHPbj7HEHzp0cgC+peFdhsQ7zF1kwp74QqgwScgC/EB8d7I2L72PwjY8m5lRaParmNqJqfiPyiyszSnyzNItwvzchvplgLDFHykRQlhuhrjJCWW6A6DYtlMcwDEKhEILBIAKBAILBYOLm8/kwMDAAipoUSFKpNOH1Lisrg0aTnjQIjuPAUCHE4sKaivpARbxJAnvi5geu8ANfiUii5D3e8Z7eMoVxxs/hRr3Y0yElCejlUujlEujlEhjkEuhlUv5eLoFeLoVOJoH4JkfNMCwHb1Ko+ITnejJknBfc0RhzzecSkUSKmDbpFDCnCG4FjFo5JOLM+Y4QEBAQEBCYSW7P1aUAWI7FuREb9tsP45jjNCiW96iqpSo0lS5Gc8VylOgzq0UXE43C9fEncLbsh/dse2Jcnp+H3DXNyG1eDZnZlEYLbwy/L4JzpwbRftyB4cHJnso6gwLzFhVh/kILzHnqNFr42eE4DmNDfeg8exRd7cfgc0+Kb6VGj6q5Daia34iCkqqMEN9sjAEdioEJUqA8EQQvuxHqGQebJDDEGilUlSaoq01QWLQg0lhxmaKoK4T1xC15PBwOX/O5zGZzitdbJJq5KAyO48DSkSmC2pvk0Z68JedtfxpiiQoSuRYSmQ4SmRZSmRaSK26am5bnfTO92ACgkYonBfUUcT2xrRSLbnokE0UzcXEdmVZou7wRuH2RRIvET0MuFU0K62ShPSG89XLoVLKMbKsoICAgICCQLgQhfpsxFnLjoP0IDtgPYzTIe4oJEKjLr8Hq8uVoLJoPSZpbo31WApe7MbKvBaOHPgITDAIASKkUpqVLkLu2Gbq5czJCzCUTi9K4GM/77r40Ci6+lpXJxZhTX4h5i4pQUmbMqLxvXnz3xwuuHYXX5UzMKTU6VM5tQNW8RhSUVqc9hJnjOLAxBkyIAhOMgQ5RYIIUmNDEdiw+R4EOxlIKrCUjzVFCXWmCqsoEWZ5qRtM6OI5DJBJJiOlQKHRVsR2Lxa79hAAIgoBSqYRSqYRarYZKpUq55efnQ6vV3hT7WSY2RVBP48GOeMGy1xeiLBIrUsS0VJ4qrqUyHcQyzU3N547QTFxMU/DExfWEV5sX3BR8Ueq68pglcS82772e8GSnerV5L/bN/axwHIdQhIbLG8aYNwJ3/H5CcLvjQtsXvL73kFYlhVmngFEnh1mviIeKy2FMEtpKuTijUp4EBAQEpvLmm28a3nzzzdzu7m5lOBwmbTbbiWs9pru7W/r973+/9Pz582qZTMbee++9o9u3bx9M9xpIIHsQhPhtAM3QOD54Fvu723Bm+AK4eDBjjtKIVeVLsap8KXJUmeUppvx+jB36CCP79iNotyfGVZWVyFvXjJw774RYnRnFoCZgWQ72zjG0n3DgQvswqLg3lRQRmDU7F/MbLKiuyYX4Nsz7pikK4aAPkVAA4YAf4aAfkRB/P3FzDQ/A6xpJPEah1vKe73mNKCibNePim+M4sFEGTNxznSyoJ7zZTIgX1kyIuqq4ng5CRECklEKkkkCskkJRooO60gSJ/vO3h2NZFsFgcFph0ZVIUQAAIABJREFUnSy4Q6EQGOb6vMAikegKUa1Wq68Q3Eql8nO/LixLg4r6E/nXVNSHWFI+9sQttQDa1SFJCSRyXZKgnhDXOkjkk/uk6OZVvea92DQvqKPUtCHjnkgM4TR7sTmOA0WzCEdphCI0wlE6vk0lbdNXnfcFY3B5wwhHr/0+IkkCRu30OdgTgtuolUN6G35fCQgICNxs9Ho989BDD41GIhHihz/8Ydm1jqdpGps3b66eO3du4LXXXjszMDAg+bu/+7tZWq2WefLJJ0eu9XgBgetBEOJppN87iP3dh3Go9xP4owEAgJgUY3FRHZorlmNunhVkBrTVmYBjWXjPtmPkgxa4jhwFF89NFavVyFnZhLx1a6AqL0urjTfC8KCPz/s+NYCAL5oYt5QaMG9REebUF0KpunWtdDiOQywaThLUAYSDPn47GEgR1xP7VOz6RJRCpUl4vgvLrZ9b5HEcBzZCpwjolO1gDHRcYDOhGDjmejJqeQgxCZGSF9YilQQipRRipWRyO34vUklASj+7aKIo6qoh4cm3UCh07SeLI5VKE6J6qtBOHpfJZJ/bA8mxDKhYIEVMJ3Kyk8LEaSp4Xc9HECJeUMfDxFNDxHUJjzYpuj7baZZFhGYRZRhE6Pg2zSDCsIjQDKLx++RjEvc0iwjD8Pc0gwBFz5gXm+M4RClmUhR7o3A7g6liOUIhFJ3Ypvntqwht+jO8x6+GVCKCOS6ojVcR2jq1DKIMisgREMgkvvdqa9W5y65b1ppmbqXJ+6MtK7qu59iRkRHxs88+W3r69GmNWq1mvvWtbw3s2LGj/LXXXru0atUq/+DgoGTbtm2lly5dUsViMdJisUS++93vOpqbm/0AYLfbpRs2bJj33HPP9bzxxhv5IyMj0rlz5wZ+9rOfdb/66qv5f/zjH80A8Nhjjw1t2bLFCQAHDx7UbN68edauXbu6X3311SK32y1Zvny558UXX+zduXNn8cGDBw0KhYL9zne+079x48ZxAGhvb5fv2rWrpLu7W8EwDFFZWRnevn1734IFC66dc3UDrF+/3jdh6/Uc39raqhkcHJS99dZbFzUaDTt79uzoo48+OvzGG2/kC0Jc4GYhCPFbTIgK43DfCRzobkOnuycxXqorwuqKZbizdDE0sszKJ46OjiYKr0Wd8XBmgoC+vg65a9fAdEcjSGl6e77y4pVBJEwhHIohHJq858euvk8l5REbTEo+73uRBUbzzfHoswyDSDiYJJ7904rpxH7ID/Y6PasTkCIRFCoN5EoNFKrJm1ylTmyrtAbkWcpBXiOHmOM4sGGa91JPhH8nPNYTwnrSq31dCikOIRHFBbQEIlVcWCdvq6Rx8S0BIfns4pphGMRisRQv9XRe7M8SHg4ASqXyU4X1xE0yTQFCjmXAMjEwTAwsEwMbG0MgHANLx8Ay0clxJgaGifLbdNL2xBwdTTmOY+lpLJ0GgoREqkn1YE/JyRZLNWBIOaIsx4tlmkWYYeCJC+FIiEXUxyLCjKcI6mhCSF8pqhnu8wvSZDRScdyDzd/UYhEUJAk5QUDKEZBwAMtwCUEcHqcRikbQnSyUJ0T0FO/09eRRXy9iEQGFTAyFXAKlTBzf5u+VKdsSKOSpYxqlFGadHCqFRAgVFxAQmJYnn3yyXCqVci0tLe0EQWDr1q1lyfMMw2Djxo1ja9eu7ZZIJNwrr7ySv3Xr1sr333//XE5OTuKHY9++fYY9e/ZcJAgCDz300OyNGzfWPPLII8NtbW1n9u7dq3v66aerNmzY4KmoqEj8WB4+fFj77rvvdrhcLvGDDz5Yc//999c89dRTjpdeeqn39ddfz9m9e3fZ+vXrvRqNhgWAzZs3Dy1btizAMAyxY8cOyxNPPFHV0tJyTiqVTvulu379+lqn03nVBeUzzzzTt2nTJvfV5j8L58+fVxQWFkYNBkNiwVVfXx/8yU9+IvV6vaROp7v+sDwBgasgCPFbAMdxsI1dxv7uw/i4/wSiDP+dpZDIsaKkEc0Vy1FhKMmYhRXv5Yxg/MRJjOxrgefMWUwkSctyzHzhtTWrIc/Nvel/m2VYRMI0wuEJMU0hEkraThHaqfs3uphWKCXxvG8LLKX6a75ONBWbIqT9CCeJ6UjQj/BEWHjAj2gklPj/XS8SqfwKIZ26r40LbzUUag2kMsVV7eY4DhzNgo0xoNyRq3is4yHiQQpM+LOJa1IqmuKxnhTTiXBxpRSkQgyW5EBRFGiaBkVRoCgKMZoGRUVAUX5QHgr02OTc1GOT96cbZ9nr/90kSTI1JFylhEolg1IhhUIugVwmgUxKQiohwXF0XARHwdAxsEwQLOMGS8UQdcUQdsbgpJNF9eT2dQvm64TlCDAgwUAGTqIBJ9WDE2vBijVgxSrQIhUYUg6akIEmpIhx4rhQjnuioywi7gmPdAxRZgRReui6qn9PheM4gOXb+XEsB7Ac/35jOJAcBzFBQgICYgIQg4AIBETgQHIESA4gwT+e4MC/5zgOHBP/DmI4MAwLluFA0QwiURr2uJCORK/PQ369SMQkL47jgpjflkwzdu15oR+2gEDmc73e6VuNw+GQnDp1Svv222+fMxqNDAA8/fTTA21tbfqJY4qLi6ni4mLPxP62bduG9uzZk3f8+HHl3Xffnag4u2XLliGz2cwAwLJly7ytra36xx9/fAwA7rnnHu+OHTuY06dPK5OF+LZt2wbVajWrVqtjdXV1/kAgILr33nu9ALBp0ybXT3/60xKbzSZvaGgIzZs3LwJgIlyP2759+8DSpUtzurq6ZLW1tdOG8e3du7fj5v23Pp1AICBSqVQpXg+9Xs8AgM/nEwlCXOBmIAjxGcQT9uLDnk9wwH4Yg/7JKJbanGo0VyzHHZYFkIlvbUgzG42CCYVBh0JgwmEwoRCYUBhMOAQ6NLEf3w7H5+LH0sFQYoxL8sgSYjFMS+5A3ro10M2bC+I6qjJTFJMqmJM80OHw1cV1NHLjokUiFUGukEChnLhJk/alUCglV+xLZSKQBB3Ppx5Dz4WeSZEd4oV0woMdCiAS9IOKRa9tTDIEwQvmCSEd91orFVrIZWrI5WrIpCrIZEpIJXJIxHKQHMmLZ5oBR7Hxbf6e8zFg3Sw4mkaIciNIj/HzFMPP01OOv868WRYcGDBgwIKTEuDkJDg5AU5KgpUCnARgxQRYEQdWxIEhWDBgQbORVJHsokANTy+Urw8OBACC4EASAEHy9yTBgUjcx+cIDjISUMgnx6QSEeRyCeQyMWRSEhKJCBIxIBERIEmWfzzouLgeBUs7eMHMMUAAoAOAH/xtUvSKEvdsyj4Jlpvc5scVYKBOOk4ElpCAJSTgSAlYQgwGYrCEGCxE8e34c3D889AcARYEaI4AwxGgWYDmONAsny8NDrxojeAKAcyxDMAGwbEBXigz8bmJ46YK5/iN5HhBTMafm2D5+2ShzTIsWJYDQ3NgWBbMTQjDvlGkEtGVHudphHLy+NXmhZZbAgICmYDD4ZACQFlZWUIcl5WVpSxKXC6XaOfOncWnTp3S+P1+MUEQXDgcFo2NjaWEbBUUFCQqbyoUCtZoNKZU4pTJZGwgEEhZ8BUWFiaOkcvlrFwuTywwlEolC/ACF+BD4F944QXLhQsX1MFgUEQQBAcATqdTXFtbe+P/hJuEWq1mgsFgyvl5PB4RAGi12s8WliggcBUEIX6TYVgGp4bOY7/9ME4OtoPl+O8gg1yHleVL0Fy+DPmaz+YpnvBAJ8RxMC6Mk0R0iriOC2Y6SURPzOMzeAQ/DUIigcJigb5pFVSLFoMmpXCFKDjODieFdl893Ju57kJbLAAWBBgADEiChUxGQC4nIZMBEikJqRSQSACxhL8XiTiIRBwvqkgOJMGAAAuWpcFQFGiaAhO/UR4KkVEKo0ljNE2BoWgwNAWWnfyuFUEMkhBBRIhBQgwRIQJJiCECP6Yk1NBAD7FCCplMCZlUCalYAYlEDolIBrFICjEphoiQgCREIDkSBEcALMELYooFE2bABGj+NQcHFiwiCCOMUHyf+7/t3XmYHVWZx/HvqdvdSdjCJiQYlgiPLxo1LYsSkLCJ27A4CCLixiji4DIqI0SiAzEBBMRhRIzggiOIiizOwwAyiEFAcAGkRZEXQRIhBBCxgYROQnfV/HHO7Vt9053uDunqpv19nuc+t+rUqar33pPu9Fvn1KlUWpTW6yVFU3neVCeW9F1PtTLIQ0GeFfRkOUXWQx66Y/2im7zoju0QCrJ6kpsXZF0QVpYT4kYC3HhvJMgtGbSGgqy1gLZYVoQMQpwBnCyDLIuzzYfGqyBQhBDzywB5kVEQyMnICRTpfaD1bhr1lxeBHmp0FxndeY2elVlcLmr05IGeIm7ryUPcXgR6iow8lcXlmAAXRfwnWqTkt7cHuGmdooh16wlvUaqTlxLn1PMb6/bE5D9f1Vs37t98vL7r69R1PYJaanHUQGtLRmtLjdaWjLaWdAGkd1stbc9oqy+3Zml7bc196/u3xDr1hLmcTNdG8fFzIiKjYdq0aasBFi9e3LbzzjuvAliyZEmfHp8FCxZMW7ZsWdv3v//9++qJ86677tperOfbhQZz8sknbz958uTuq6666t6tttqq+6mnnqrNmjWrHRhw2OGBBx44Y21D0+fMmbPkqKOOWi9D02fMmNG1cOHCCZ2dnbV6T3hHR8eGW2+99Wr1hsv6UmkibmYZsAD4ILAhcCtwnLsvGaD+a4HzgXbgSeBL7v6VisIdtuee7+KzN3yRZc/G+6RrBPbYcgazp7RjG20LK1fR/cCjPPncg/Q8tyIl1o1e6b691I1e6e6ulRQ55KFGHjLyUKNI73nIKErlfdbJKMIE8jCJvFaj2CSjaGmDtgkUrW3Q0kbR0kZea6Go1eIrZORZRh4CRRFSohbIi5y8KMjznLzI6enO6el+nuK2xwm3/ZiYpMWEF3pS4pxTC3nsrSQnAyaEnEkZ1CZAS1ZQywK1jEaPJkUchlrkUMRHt2VkhJARiC9CRsgDoSvAyoyMmLzVaxMCPSnpIoQ+5dBGYAKtaUhsfXs8WYBaAbUAk9L/BCHlNVlBEcfHkoecIqQ0NhQUsWswloWcnlCwgm6eDU9ThE6KUE8eiT2SGWm/9N4CtAaKDYr4RUAjCU3LRYhJX5HKiiK1UfzGYlkI5EX8PHl6AfHfQdGoG5dJ2zNyarGsiGVFSjJzYsJZfhXldVJZHshzyPNGnaIgLad3UvwFvdtjHE1JaHk5ftCUtJaW+5Q3Es+iPha5z/H626ex3L+e9HrxygLUao3EtqU5gV3XBLi1KRmub2ttHKd8rJZapmdLi4hUZNq0ac+3t7c/e8YZZ0w799xzFwOcffbZLy3XWbFiRW3ChAn5Zptt1rNy5cpwzjnnbLNy5crK75lZvnx5bcqUKas33XTTns7Oztr8+fOnDbbPDTfc8Id1PV8ahRdWr14dALq6ugJAW1tbUetnJOcb3vCGZ6dOnbpq/vz5L503b94jS5cubb344ounHHbYYU+sUVlkHVXdI34icBQwG1gKfBm42sza3b3P1SUz2wT4CfA1YH9iMn6tmT3q7pdXG/bQdK9exatvWM1urduSpd69gue4L/sl94ZfQQZ5ViNkISVjAUJGkaWevmwSYYMNyDfYAlJZPQkLIeUOKT/LQyBQkKdEsiAQQkFe34cAoeibvJUStvp6npaghyJ0UxQZRfq7uUh1Yr4SUj9qY9+CNopSPXpjDOn+zNDYnpKevFRGUdreWyc0jkcjX+pTv6ifK8XWm1OFRn5VlGIv+jleb6IX+qwXearXU/oOUtJIuV7Rd5k+560HTN8Es77etL05UWycp/zhx5oxG9iwxB/TQC2LCWOtFuLFoVqWLhIFWmoZtVpGSy0uN95jwlqrBVqyjCy919L2+nFaaoEsa5Q1b6tljWPU9431U51U3oiltE/5WKW4lfyKiPxjOvfcc/88Z86c7ffff/9Xb7TRRj0f/vCHH7311ls3mzBhQg5wwgknLD3ppJOmz5o1a+bGG2/cffTRRz++5ZZbDn120vXk5JNPfnjevHnb77bbbu2bb77588cff/zSa6+9dsuROt+ll166xWmnnbZDfb29vX0XgPps8kuWLGk75JBDZpx33nl/mj179vKWlhYuuOCCP82dO3f7Pffcc+bEiRPzgw8++MlPfOITmjFd1ptQ5VAUM1sMnOnuC9P6psDjwIHufnNT3Q8ApwPT6km6mZ0J7O7u+w/xfDsAD914441MmzbohbYX7M5b7+D065exuitdU3jx5yky1oRGT31IF2igsRzqQ7xTvZCFuI2YcIZQrhvIQrks9CZx8ZWRhUCW0Vvem7Bmcd/exLX3la25Xkoya1mIyWvWtyyeJ73ScctlzXVqpbrN6+XPUBuojhJWEZFx65FHHuGAAw4AmO7ui1/o8To6OhbPnDnzyRcc2Ci45557Jh5++OEzFi1a9LvyPdwiUp2Ojo4tZ86cuUNzeWU94mY2GdgeuKNe5u6dZvYAsbf75qZdZgK/beopvwM4dqRjXVdb7bgdec+jgyfgoe9y72ppVuvexVB6K+0XBljuk6iVhlyH5u1N52guaz5+3/JQSgZTwldP5urLWehb3rS9NykkJoBZVk4MQxyqnoVGWSmhCtQTqqZ96okWjfr15DKErClxy3r37ZN0hjhUvrwtQG9CWasnn2lbSz05TUOBexPQEPqcL94jHfp8pr6fmd76a9ZtfBciIiIiA+no6JiU5zmvec1rupYtW9a6YMGC7WbOnPmsknCRsafKoembpPfOpvLO0rbm+kOtOyZsO3UrrlhwMD153pt0EhoJo4iIiIjISOns7KydeuqpO/ztb39rnThxYt7e3v7sqaee+vBoxyUia6oyEa8/m3ByU/mmpW3N9bceYt0xI/au6jmxIiIiIlKtffbZZ/miRYt+P9pxiMjgKnu+i7s/DSwBdquXpeHqOwJ397NLB/DaNNN63a4D1BURERERGQl5nuca2igiw5Z+d/T7yLuqH7T6deAzZvZyM9sQOBO4n/gYs2ZXEnvs55rZBDN7HfH+8IWVRSsiIiIi/9BCCI91dXVNHO04ROTFp6ura2II4bH+tlWdiJ8FXEZMvJ8ApgOHuHtuZnub2XIz2w7A3Z8B3gK8jXhv+BXAPHf/UcUxi4iIiMg/qO7u7nmLFy9uW7FixST1jIvIUOR5HlasWDFp8eLFbd3d3fP6q1Pp48uqVvXjy0RERERkdK3vx5cB3HXXXW9uaWk5pSiKKVTfkSUiLz55COGx7u7uebvsssv1/VWocrI2EREREZEXnfSHdL9/TIuIrAtd0RMRERERERGp0HjvEa8BPPZYv/fHi4iIiMg4U/q7T8+TFZExa7wn4lMBjj766NGOQ0RERESqNRV4cLSDEBHpz3hPxH8D7A0sA3pGORYRERERGXk1YhL+m9EORERkION61nQRERERERGRsUaTtYmIiIiIiIhUSIm4iIiIiIiISIWUiIuIiIiIiIhUSIm4iIiIiIiISIWUiIuIiIiIiIhUSIm4iIiIiIiISIWUiIuIiIiIiIhUSIm4iIiIiIiISIWUiIuIiIiIiIhUqGW0A5CxycwyYAHwQWBD4FbgOHdf0k/dPYDPA7sBk4AHgAXufmV1EctghtOmTfvtCvwS+IW77zvSccrQDLc9zWxSqn8ksBmwDPi4u19XTcQymHVo06OBOcD2wDPA5cBJ7r6qmohlIGb2LuCjwExgY3cPg9SfDiwE3gCsAL4BfN7di5GOVURERod6xGUgJwJHAbOBKcBfgKvTH4rNNgd+CMwANgVOAy41s9dVFKsMzXDaFAAzmwh8B/h5FQHKsAy5Pc0sAFcRf0b3dvcNgX2BP1YWrQzFcNp0JvBdYB4wGdgLeDPwucqilbX5O/A14JODVTSzGvC/xPaeQmz/o4ETRjJAEREZXeoRl4F8BDjT3R3AzE4EHiderb+5XNHdr23a9woz+2yq++sKYpWhGXKblpwG3Ah0EhM3GTuG054HAvsA27r7kwDu/kiFscrQDKdNXwY85e6Xp/UlZnYN0F5VsDIwd78ewMz2HUL1vYGdgL3cfTngZnYW8BngSyMWpIiIjCr1iMsazGwycajjHfUyd+8kDjkf9I88M9sGeAXQMVIxyvCsS5ua2WzgIODkKmKUoVuH9twfeAj4nJk9ZmaLzew8M9uokoBlUOvQptcDD5nZu8ysZmY7AgcDuiXoxWcm8EBq77o7gOlmtskoxSQiIiNMibj0p/4ff2dTeWdpW7/SH/ZXAle7+40jEJusm2G1aWrHbwPHuvtzIxybDN9wf0a3JF4cg9iTOhuYBZwzItHJuhhWm6afy28BXwdWERP224nD1eXFZRP6b/f6NhERGYeUiEt/nknvk5vKNy1tW0Pq0fkJcRKo941MaLKOhtumXwKudfeBhqzL6Bpuez4L9ABz3P05d/8LcCbw9pELUYZpWG1qZu8HziD2grcB2xAvuPz3CMYoI+MZ+m/3+jYRERmHlIjLGtz9aWAJcRZ0oDfJ3hG4u799zGwL4r3EDwNHuPvqCkKVIVqHNn0L8D4ze9LMniROIrVXWp9eRcwysHVoz7vSe3kGZs3GPIasQ5vuBixy91vcPXf3ZcCFwKFVxCvrVQewU2rvul2Bh9xdibiIyDilydpkIF8HPmNmPwOWEnvP7ic+TqcPM5sC/JQ4MduH3D2vMlAZsiG3KbAHfX8/fJo4lPkI4ogHGX3Dac+rgC8Cp5nZXGAL4sWVy/upK6NnOG16C7DQzGYRHy/4EuDDwJ0VxSprkWZCbyWOVqg/gQJgdT//R94CPAicaWYnAC8l/nwurChcEREZBUrEZSBnEYfK3UrjebaHuHtuZnsD1wGvTENcjyM+Fmk68E4zqx/jEnf/SOWRy0CG3Kbu/lh5RzN7BlilmbbHlOG053IzexPwVeBvxPtPfwTMHZ3QZQDDadPLzGwqcBExcXsOuAn411GJXJq9l9g2dV3pfT8z+zNwL/DWNKKhx8wOIl6IeYLGc8Q1Y7qIyDgWikKjE0VERERERESqonvERURERERERCqkRFxERERERESkQkrERURERERERCqkRFxERERERESkQkrERURERERERCqkRFxERERERESkQkrERUTkBTOzzMx+a2aHl8oKM3vPKMZ0gZmdM1rnFxERERlIy2gHICKyPpnZFsBJwKHA9sAzwH3AN4FL3b17PZ7rAeASdz91fR0zHfebwE7uvu/6PG7TOX4KPOLuH1hPhzwGCMAV6+l4AJjZNOBhYD93v2mYu38BuN/Mznf3P6/PuEREREReCPWIi8i4YWbbAncB7yAmYbsAewHfAv4deNXoRTfyzCyYWesonf5TwIXuXozS+dfg7kuBG4HjRzsWERERkbJQFGPmbyYRkRfEzK4GdgfM3Z9u2tYKtLn7irQ8H3gv8BLgAWCBu19aql8AHwVmAW8HngbOd/cz0vabgH2aQpgOLAEuBPYHtgGWAT8A5rn7qtLx3wicAuwKPA/cDfxLiumUpuMe4+7f6efzfoDY038g8GVgBnEkwH3AOcAewKbAg8BZ7n5x2u87wPubDrefu99kZlsDZwL/BEwEfgd81t1vbj5/KY524LfAS9390VJ5AXwSmA28BehMcfxXqc5GwGnA4cBmgAPz3f3K0jHKlrj7DmY2fW2fsXT8Y4DT3X3qQPGLiIiIVE094iIyLpjZ5sDbgK82J+EA7v68u69Iq6cDxxKTxFcBlwCXmNkBTbudAtwMtANnAKeX6hwGLCYmg1PT62Hi8OwngHcDr0jnOAY4uRTrG4HrgTuJif7rge8CrcCXgEuB20vH/eFaPnpGTJw/DewM3AFsBPwMeCvwauKFgYvMbL+0z78BtwCXlc5xm5lNAhYBG6d9XwtcC9xgZq9YSwz7AEvLSXjJKcBN6VhnAeeY2aHpewjA1cBM4EhiWywEflD6nndJ7+9Ice6e1gf7jHW/AqYMEr+IiIhIpXSPuIiMFzsRk9J711bJzDYAPgF8yt1/lIpPN7PdgbnEocx1P3T3b6Tl883sY8AbgRvd/Skz6wGWu/tjTaeZW1pebGY7EodH13u6TwGuc/dPlurdV4qxC1jdz3H7E4AT3P2WUtlfgXtK6+el5P/dwCJ3f9rMVgNd5XOkHvZNgCNL99KflpLi44gXFfozHVg6wLZr3P28tHy/mb2eeJvA/xAT+FnA1qWLJxea2R7Ax4lt8ddU/lQ5Vne/Z22fsVT+SHp/GfDHAWIUERERqZQScREZL8IQ6+0EtBF7ust+Dny2qezupvVHga0HO4GZHQt8CNgB2JD4u7Y8AmlXYM4Q4x2K3zSdfwPgP4CDib3IbcAE+iao/dkdmAJ0mlm5fALQtZb9JgErB9h2e9P6L4i3BdTP1wYsbTpfG/CntQU6jM9Yj2vS2o4nIiIiUiUl4iIyXvwJyIFXAleup2OublovGOSWHjM7AjifmGj/nDhr+xHE+6BHQo+7NyfBZxPvFf808Z7rFcQh9JMHOVZG7DX+5362PbeW/f4K7DmkaNc839M0hpuXNX/3zYb6GTcvxSgiIiIyJigRF5FxIQ0Vvw74mJmdN9BkbcSJ2VYRJxD7fanKPk3rQ7EaqDWVzQZ+6+5fLp17h6Y6dwJvAr4yjOMOx2zge+5+WTp/BrwceHyQc9wBvA94xt2fGMb57gJOMLNWd3++adsewNdK63vSuH3gDuJEaxPdfaDvvp6Q9/c9D/YZId4/3kOcTE5ERERkTFAiLiLjyfHEoc93mtl/EIeWryYmg58B3u/ud5vZV4D5ZvZXoIM4Y/ehxNnHh+MhYC8z247YY/wUsXf2g2lCst8DBxEndiubD1xnZucC3yZeGJgF3O7uno57hJnNICaWz5ZnXB8CBw41syuA5cRe423om6Q+BOyX7l9/Or2+R3wM2TVmNhe4nzgUf3/gj+7+4wHOVx/TE29iAAABnklEQVQOvgdxEriyg9K99dcTZ04/kjhCAOJkaz8FrjSzE4kztG9GTNZXpvvzn0yf4U1m9gdglbv/fYifEWBf4FZ3f2bgr0tERESkWpo1XUTGDXf/C3GW7R8DpxJ7am8jzpB+No0e77nAN4BzU9l7gPe4+40MzynEHl0nDn3eDrgAuBi4iNgL+/oUSznO/yPO8P564qzevyY+Tqzem/wt4n3ft6XjHjXMuD5FfIzaIuKEZ0uBy5vqnENMcjvSOfZKQ9z3IfZUX0RMxK8EXpeO16+UGP+A+Oi1Zl8gTnDXQZw5/kR3vyrtVwCHpHP8J3HCumuIj057MNXJiY+Reydx4rV6z/agnzHNyv5uYpuIiIiIjBl6jriIiLxgZrYT8eLBjAEeY1Y5M3sn8Hmg3d17RjseERERkTr1iIuIyAvm7g8QH3E2fbRjKZkAHKMkXERERMYa9YiLiIiIiIiIVEg94iIiIiIiIiIVUiIuIiIiIiIiUiEl4iIiIiIiIiIVUiIuIiIiIiIiUiEl4iIiIiIiIiIVUiIuIiIiIiIiUqH/B2crbSQia0pzAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "id": "0jddab0Kr12s", + "outputId": "cf491287-56b2-47fa-a7fa-e96bec5cec29" + }, + "source": [ + "\"\"\"ANS: From the diagram aboe the contract rate is estimated as 0.61, \n", + " the estimated time between contact is 1/0.61 = 1.64 days\"\"\"\n" + ], + "execution_count": 17, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + }, + "text/plain": [ + "'ANS: From the diagram aboe the contract rate is estimated as 0.61, \\n the estimated time between contact is 1/0.61 = 1.64 days'" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 17 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Jxb2s2Uer12t" + }, + "source": [ + "## SweepFrame\n", + "\n", + "The following sweeps two parameters and stores the results in a `SweepFrame`" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "4hMyDCQwr12t" + }, + "source": [ + "def sweep_parameters(beta_array, gamma_array):\n", + " \"\"\"Sweep a range of values for beta and gamma.\n", + " \n", + " beta_array: array of infection rates\n", + " gamma_array: array of recovery rates\n", + " \n", + " returns: SweepFrame with one row for each beta\n", + " and one column for each gamma\n", + " \"\"\"\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ], + "execution_count": 18, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "i01UEKywr12t" + }, + "source": [ + "Here's what the `SweepFrame` look like." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "qnmNYc68r12t", + "outputId": "d2527b81-43a5-4332-e33e-15146094718e" + }, + "source": [ + "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame.head()" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0.20.40.60.8
0.10.0107560.0036420.0021910.001567
0.20.1189840.0107630.0054470.003644
0.30.5890950.0301850.0107710.006526
0.40.8013390.1315630.0209170.010780
0.50.8965770.3964090.0461400.017640
\n", + "
" + ], + "text/plain": [ + " 0.2 0.4 0.6 0.8\n", + "0.1 0.010756 0.003642 0.002191 0.001567\n", + "0.2 0.118984 0.010763 0.005447 0.003644\n", + "0.3 0.589095 0.030185 0.010771 0.006526\n", + "0.4 0.801339 0.131563 0.020917 0.010780\n", + "0.5 0.896577 0.396409 0.046140 0.017640" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 19 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lyo3_OxPr12t" + }, + "source": [ + "And here's how we can plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "V3AD4Hxdr12u", + "outputId": "f7f4a240-f919-4205-9b14-493f46caec95" + }, + "source": [ + "for gamma in gamma_array:\n", + " label = 'gamma = ' + str(gamma)\n", + " plot(frame[gamma], label=label)\n", + " \n", + "decorate(xlabel='Contact rate (beta)',\n", + " ylabel='Fraction infected',\n", + " title='',\n", + " loc='upper left')" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhTZfbA8W+W7ntLFyjIzqVQECgFCggURlm0iCKCODKjIoLoIApuMDjwU4ZVcMYRZ0RwQRHFBQEBEWXXyiLQslxkLd1L16RL0iT390fa0JYCAdombd/P8/Rpcu9NcgptTu573/cclaIoCIIgCIKzUTs6AEEQBEGojkhQgiAIglMSCUoQBEFwSiJBCYIgCE5J6+gAapMkSW5ANJAGmB0cjiAIgnA1DdAUOCDLsqHijgadoLAmpz2ODkIQBEG4obuAvRU3NPQElQbw6aefEhYW5uhYBEEQhCrS09N59NFHoez9uqKGnqDMAGFhYTRv3tzRsQiCIAjXdtVlGDFJQhAEQXBKIkEJgiAITqlOh/gkSRoHTAXuBHxkWVbd4PjWwAqgP1AIvA/8XZZlUZ9JEAShgavra1C5wLuAB/DB9Q6UJEkDbAL2AWFAOLAVyAOW1G6YgiAIgqPV6RCfLMvbZFleC5yz4/C7gHbAS7Is62VZloFFwDO1GaMgCILgHJz5GtSdwBlZlvMqbDsItJYkyddBMQmCIAh1xJmnmftiHc6rKK/CvoK6DUcQBMGxFEXBbFEwmS1YLNbbFouColj3WRTrbYty7e22bZaK2yrvt1gU23ZL2fG2/ZbK25oFe9G6mV+t/LzOnKAKgKo/tX+FfYIgCDXCYlEwlpoxlH0ZS80YjGaMpRYMpabKt0stGIxmSk1mTGYFs8WC2axgsliwmBVMFgWz2WJLJOYK981lx5vM1gRhMluu3mapus1S9jrW/c5Go1bx2f8Nx9Pdpcaf25kT1FGgnSRJfrIs55dtiwLOy7IsEpQgNDKGUjMFeiO6IiP6YiMGY+VkUp5criSTyvuqHnclCZkxmiyO/vHsptWoUKvV1u8qFWq19btKBSqVCrUKVGrVldsVvlfapq64v8Lj1dbblZ/z6tvlx7UM88XDrXZSSV1PM9cALoBr2X33sl1GWZar/obsAc4CCyVJehHrLL6XsE47FwShnlIUhcISE7pCa7IpKLR+6YqM6AqNFJR/r7StFGNp7dZ7dnXR4Oaixs1FY73tqql027q/7MtVg4tWjVajRqNRoVVbv2sqfler0GpUaDTlt9Wor7nNer/qc1mT0ZX96rLE01jU9RnUY8DqCveLy77HSpJ0DjgBDJdleY8sy2ZJku4D3gMyubIOSkwxFwQnYTZb0BWVVptortpWZERXaD3WfAtDVVqNGl8vV3y9XPHycMHDTYtrNQnFrUpCse3Tln2vZp+rVt2o3vjrizpNULIsfwh8eJ1DvKscfx4YWoshCfWcxWJh+fLlrF+/nuLiYnr06MG8efMIDw+v9vgjR47w7rvvkpiYSElJCS1btmTKlCncc889dRx5/VBUUkpqViGpl/WkZBWSmqUnLbuQAr2RgkIDhSWmW3peDzctPl6u+Hq64OPpar3t5Ypv2W0fT+t9nwrb3F01Iok0Ms58DUoQbmjlypVs2rSJNWvWEBoayoIFC5g8eTIbNmxArb56FUV+fj4jRoxgwYIF+Pv7s337dl588UU+/fRTunbt6oCfwPFKTWbSLheSklVIWlkiSsnSk5qlJ1dnuO5jVSrw9nDF18ulLKm44WO7XX2i8fF0xUXrzCtcBGchElQ9kZ2dzZw5c4iPj8fX15fp06czY8YMPv74Y3r37k1mZiazZ88mISEBg8FA69atmTFjBjExMQAkJyczZMgQ5s+fz6pVq0hJSSEqKoqlS5eyevVqvvzySwAmT57MhAkTAIiPj2fChAksW7aMZcuWkZWVxZAhQ5g7dy6LFi1iy5YteHp68sorrzB8+HAATp8+zRtvvIEsy5jNZiIiInjttdeIiIiolX+Xzz//nIkTJ9KmTRsAZs6cSd++fTl06BDR0dFXHT9w4MBK94cOHcp///tfDh061KATlNmikJVbRGp58rmst93Oyi3iWiNuLlo1zZp40SzYm/Bgb8KDvWjaxBt/Hzd8PK1DbRq1OKsRaodIUBXMXfkrB09m1Mlr9YwI5fWJfew+fsaMGbi5ubFjxw5UKhWvvfZapf0Wi4UxY8awfPlytFotK1eu5Nlnn2X79u0EBgbajtu2bRtr1qxBpVIxfvx4xo4dy+OPP87u3bvZs2cPU6dOJTY2lhYtWtges2/fPjZs2EBeXh6jR49mzJgxzJw5k3/84x+sXbuWWbNmMWDAALy8vACYMmUKPXr0wGw2s2DBAqZOncq2bdtwcal+GmpcXBxpaVe1grF5/fXXiYuLu2q7TqcjJSWFyMhI2zZfX19atmzJyZMnq01QVWVkZHDu3Dk6dux4w2OdnaIo5OkMpGRdGY4rH5pLu1yIyVz9TDW1CpoGedEs2IvwYO+yZORFsybeNPH3QC0SkOAgIkHVAxkZGezfv58tW7bg52ddGjZ9+nS2b99uOyYsLKxSU8ZnnnmGVatWkZCQUOmsYcqUKQQEBAAwaNAgduzYwbhx4wCIjY3F29ubEydOVEpQ06ZNw9PTE09PT3r16oVer2fw4MEA3H///cybN4/z588TGRlJhw4dKsX+4osvsm7dOpKSkmjbtm21P9/GjRtv6d9Fr9cD1qRUkY+Pj23f9RQWFvLcc88RGxtrO9OsD/TFpdbkUyERpZSdERUbrn1NKNDXvSwBeZWdDVlvhwZ6iSE3wSmJBFXBzZzR1KX09HSASk0XqzZgzMvLY+HChcTHx5OXl4darUav15OTk1PpuODgYNttDw8PQkJCKu13d3ensLCw0raKx3h4eODh4VHpeMD2mOTkZBYtWsTRo0fR6XS260DZ2dnXTFC3ytvbOqdGp9NV2q7T6Wz7rkWn0zFp0iSCg4NZuHBhjcZV0/TFpfwuZ3LwZAZHTmeSU3Dt60LeHi6VklD50FzTJl61tlZFaLwUxTo2XFuTV8RvbD1QfmaUnJxsu9aSkpJS6ZilS5eSnJzM2rVrbQklOjra9gtUV+bMmUNAQADffPMNgYGB5Ofn06tXr+vGce+995KamnrN/XPnzmXkyJFXbffx8SE8PJzExES6dOkCWBNPUlLSda955ebm8uSTT9KqVSsWLVqEVutcfwaKonApQ8fBkxkcOJnBifM5lSoIuLpoaNbEq5qzIW98vVwdGLnQkJkL8zFmJWHMulT23Xpb4+lL86feQu3iVuOv6Vx/mUK1QkNDiYmJYfHixbZP+8uXL690jE6nw93dHV9fXwwGAytWrKCoqKjOY9XpdDRr1gwfHx90Oh2LFy++4WM2b958y683btw4PvjgA/r06UNoaCiLFy+mVatWREVFVXt8VlYWjz/+OF26dOHNN9+sdqafIxhLzSScvczBExn8djKDzJwr/3dqtYrItkFER4QSFRFKixAfcV1IqDXmkkJKqyQhY1YSlqLqC/io/UJQqTW1EotIUPXE4sWLmTNnDrGxsfj5+fHcc8+xbds23Nysn1qmTZvGq6++SkxMDP7+/jzxxBOVrknVlVmzZvH6668THR1NSEgIzz//vG2GYG2YOHEiOp2O8ePHU1xcTFRUFCtWrLAlnoMHD/LUU0+xefNmmjVrxrp16/jjjz9ITk5m69attueJi4tj3rx5tRZndS7nFXPgZAYHT2Rw9EwWBuOVSgm+Xq5EdQwhulMY3aUQvD1qvs6Z0LhZjCUYLydTWuWsyKzLqfZ4lZsnrsEtcG3SAteQO3ANtn5pvGqnUCyAqq6HgOqSJEmtgPM7duy46ppNfXf69Gni4uLYs2fPVdeRBOdktijIF3OsQ3cnMriQVvkTaZtwP6IjQunZKZT2LQLE9G2hRiimUozZKVedFZnyMoGr3/9VWldcmrTANaQsGQXfgWvIHWh8gmrlWlP5EhigtSzLFyruE2dQ9cSpU6dQFAVJksjKymL+/Pn07t1bJCcnpysycuhUJgdPZHBYzkBXVGrb5+6qoVuHYHpGhNEzIoQgP4/rPJMgXJ9iMVOak4Yx61KlZFSakwZKNUsM1FpcgppZz4qCy8+IWqD1r70hu5slElQ9odPpmD17NhkZGbbp3lXXQgmOpygKF9N1HDiRzsGTGZy6kFNpEWzTIC96dgolOiKUyLZBuGid441AqF8spQYMKacpSfmD0suXMGYmYcxOBnM1ywxUalwCm+ES3KJSMnIJbIpK49wpwLmjE2yio6PZtm2bo8MQqlFiNHHsjHWCw4GTGVzOK7bt06hVdG0bRHSnUHpGhBIe7C3qyQk3zVJqwJAsU3zxOCVJxylJ/aPaZKT1C7YmH1siaoFLUHitzLCrCyJBCcItyMgp4uCJdA6czCDhzOVK/YT8fdzo2dF6Lal7h+BaaeQmNGxXJaSUP8BSMSGpcA1tjXuLCFxDW1qTUZMWqN0a1jCxSFCCYKdTF3L4NTGN305kcCmj8uLg9i38bRMc2ob7i2ngwk2xGEsoSZEpuXic4ovHMaSeuTohhbXBo2Vn3O/ojHuLCDQe11+M3hCIBCUIN5CRU8T73yYQfzzdts3DTUt3Kdi6NqljKAG+7td5BkGozGIsoSRZpuRiIsVJxzGknq2ckFRqXMPaWhNSy7KE5O7luIAdRCQoQbgGY6mZb3ae4YsfT2M0WfBw03BP71ZEdwqlU+sgUb9OsJvFWFyWkI6XJaQzYKnQIVilxq1pW2syuqPxJqSqRIIShGocOpXBf79JIO2ytcbggO7hPBHXWUwFF+xSKSFdPI4hrbqE1A73lp3wuCMS9xYdUYuEdBWRoAShgszcIlZuSOSXBGv7jxah3kx+sCtd2wXf4JFCY2YxFlNy6RQlSeUJ6ew1ElJn67Bdc5GQ7CESlCAApSYL3+46w7ofT2MwmnF31fDIPR2Ju6uNGMoTrmIxGSkpm2Fnm9RQcTGsSo1bs/bWhHRHJ9xbRKB283RcwPWUSFBCvWaxWFi+fDnr16+nuLiYHj16MG/ePMLDw2/42MTERMaOHUuHjpGERk8iJcvaQ6r/nc14cmQkTfzFcJ5whaIoGJJPoTu2k8KT+7EYKhRjrpSQOluH7ERCum0iQQn12sqVK9m0aRNr1qwhNDSUBQsWMHnyZDZs2HDdSuUGg4GZL71McHOJ86kFmLL0hAd7M/nBLnTrIMpHCVeU5qShS9iFPnFXWf06K9fQ1ni0uROPlpHWIbsGtgbJGYgEVUHa529SfPZwnbyWR9seNB03y+7js7OzmTNnDvHx8fj6+jJ9+nRmzJjBxx9/TO/evcnMzGT27NkkJCRgMBho3bo1M2bMsHWKLS/IOH/+fFatWkVKSgpRUVEsXbqU1atX2yqOT548mQkTJgAQHx/PhAkTWLZsGcuWLSMrK4shQ4Ywd+5cFi1axJYtW/D09OSVV15h+PDhgLWI7RtvvIEsy5jNZiIiInjttdeu25/pdnz++edMnDjR1idr5syZ9O3bl0OHDl2z5XupycIzL8yhgKZYXNxQq88zYUQEowa2FaWHBADMxToKT+xHl7ALQ4ps267xCcKnywC8IwfiGtziOs8g1ASRoOqJGTNm4Obmxo4dO1CpVFfV4bNYLIwZM4bly5ej1WpZuXIlzz77LNu3bycwMNB23LZt21izZg0qlYrx48czduxYHn/8cXbv3s2ePXuYOnUqsbGxlVq+79u3jw0bNpCXl8fo0aMZM2YMM2fO5B//+Adr165l1qxZDBgwAC8v60XfKVOm0KNHD8xmMwsWLGDq1Kls27YNF5fqKyrExcWRlpZ2zZ/99ddfJy4u7qrtOp2OlJQUIiMjbdt8fX1p2bIlJ0+erDZBHTuTxT//8xUJv+yl5YDn8dIdQuXtz5ghHa46VmhcFHMpRWd+R5ewk6Izh2ylhFQu7nhF9MEnciDuLTs7TSHVxkAkqApu5oymLmVkZLB//362bNmCn5+198r06dPZvn277ZiwsLBK/Z+eeeYZVq1aRUJCAgMHDrRtnzJlCgEBAQAMGjSIHTt2MG7cOABiY2Px9vbmxIkTlRLUtGnT8PT0tBWp1ev1DB48GID777+fefPmcf78eSIjI+nQofIb/Ysvvsi6detISkq6Zsv3jRs33tK/i15vvWbk6+tbabuPj49tX7ns/GJWbTzOzgPnuLj7YzoNeIyXJw9g//Z0fvutcndiofFQFAVD6hn0CTvRn9iHpbisQohKjUebO/HuMgivDr1Qu4qF2I4gElQ9kJ5urWBQsadV1f5WeXl5LFy4kPj4ePLy8lCr1ej1enJyKjcfCw6+Ml3aw8PjqnYd7u7uFBYWVtpW8RgPDw88PDwqHQ/YHpOcnMyiRYs4evQoOp3Odh0oOzv7mgnqVnl7W0u96HSVyw7pdDrbPpPZwqa95/hs2ymKDWayT31Pj+gYPlg6CRethv3br3paoREozc9En7AbfcIuSnNSbdtdgu/Ap+sgvDvfhdYn8DrPINQFkaDqgfIzo+TkZNu1lpSUyp/6ly5dSnJyMmvXrrUllOjoaOq6IeWcOXMICAjgm2++ITAwkPz8fHr16nXdOO69915SU1OvuX/u3LmMHDnyqu0+Pj6Eh4eTmJhIly5dAGtySkpKIiIigsSzl3nv62NcTLcmsD6RYfxw8AInDifSv19fAEpKSjCZTPTu3Zv169dXOnMUGhaLoQj9yV/QJ+yiJOm4bbvGyx/vyLus15VCW4lq805EJKh6IDQ0lJiYGBYvXszChQsBWL58eaVjdDod7u7u+Pr6YjAYWLFiBUVFRdU9Xa3S6XQ0a9YMHx8fdDodixcvvuFjNm/efMuvN27cOD744AP69OlDaGgoixcvpsUdLdl1GnYd3gdAWJAnk0Z1IbpTGJPu+xKz+coCytWrV3PkyBHefvvtSmeXQsOgWMwUnztqva50+gCKyQhYu8Z6Sr3w6TIIj9ZdxXUlJyVWINYT5W/0sbGxjBo1itjYWADc3Kx9XqZNm4ZOpyMmJoZhw4YRFBRU6ZpUXZk1axYJCQlER0czevRo+vbtW6uvN3HiRIYPH8748ePp27cvvyf8gWv7sew6nIqLVk2/tiYOfDGTcH/rIsrg4GDb9bqwsDC8vb1xdXUlLCwMjUa8STUEiqJgSD9H9vbVJP1rEunr3qTwxD4UkxH3lp0Jvm8qLZ//gNBR0/Fs210kJyemqushoLokSVIr4PyOHTuuumZT350+fZq4uDj27Nkj2r4DJ85ns+KrY1xIKwCgZ0QoTz/QhbAgUU6msTAVZKM/vgddwi5Ks5Js212CmuHdZRDekXfh4if+VpxN+RIYoLUsyxcq7hNDfPXEqVOnUBQFSZLIyspi/vz59O7du9EnpzydgdWbjvPTwUsAhAR68vSoLvTqXPdnj0LdsxhLKJTj0Sfsovj8McD6gVvt4YN35/54dxmEW9O24rpSPSUSVD2h0+mYPXs2GRkZtuneVddCNSZmi8LW/ef5ZMtJCktMaDVqRg9ux0OD2+PuKn6tGzJFsVByIRFdwi4KT/2KUlpi3aHR4tW+J95dBuHZthsqjehkXN+Jv+R6Ijo6mm3btjk6DKdw6kIOK74+xrmUfAB6dAzh6Qe60KxJw+8w2tgVX0gge8cnGNPP2ra5NZfw6TIIr4i+jaLLbGNSpwlKkiQ18AbwJOAF7AWelmX54jWOfxR4BWgJFADrgZdlWTbUTcSCM8nXG/ho8wm2/2a9vhAc4MFT93ehT2SYGMJp4AwZF8j5aQ3F534HQOMdgE/3u/GJHIBLYFMHRyfUlro+g3oJeAQYAKQAbwEbJUnqJsuypeKBkiTdCXwMjAW+Au4AtgI64O91GbTgeD/EX2T1xuPoi0vRalQ8MKgdDw/pgLubGARoyEz5WeTs/hz9sV2AgsrNE/+YUfj1ug+1i5ujwxNqWV3/dU8GFsqyLANIkvQSkAH0B3ZXObYNkCPL8vqy+xclSdoMdKurYAXn8NPBS/z7iyMAdOsQzOQHuxIeLIZyGjJzsZ68/V9TcOB7FHMpqLX4Rg0loP9DaDx9b/wEQoNQZwlKkiQ/rEN1B8u3ybKcJ0nSGaxJp2qC2gaclyRpHPAl0AqIAxbUScCCU7iUoWPFV0cBmHh/JCPvaiOG8xowi8lIwcGt5O37CkuJtZ6iV6d+BA4aj0uAmJnZ2NTlGVT5x568KtvzKuyzkWW5SJKkD4D3gDWABvgI67Cf0AgYSs0s+uQgJUYzA7qHi+TUgCmKBX3ibnJ3rsVUcBkA95aRBA1+DLdm7RwcneAodZmgCsq++1XZ7l9hn40kSX8B/on1rGkfEAq8jzVJ/bn2whScxcoNiVxIK6BZEy+mPnSnSE4NVNG5I+T8tAZjxnkAXEPuIDD2MTzadhf/541cnSUoWZbzJUm6CPSkbJivbNivLXCkmof0BH6WZXlP2f00SZL+B3xaF/EKjrXn9xS2/nIBF62alydE4+le/ZqWW2n5XlJSwvLly/n+++8pKCggODiY2bNnV2pLItQ+Q/o5cn76pGyBrbUZYOCgR/COHCDKDwlA3U+SeA+YKUnST1hn8S0ETmOdbl7VHmCFJEkxwK9AMDAJOFRHsQoOknpZz7+/tH5meXJkJG3Cq550X3GzLd8VRWHq1KkAfPrpp7Ro0YL09HRMJlPt/DDCVUrzMsjduRb9cetnT7WbJ/79RuPbc7iYmVeP5BXns+3MbkotJsZ3ub/av7fbdc0EJUnSeHufRJblz+w8dBHWIb69XFkHNVKWZYskSXcBW4BOsiwnybL8hSRJTYHVQDhQBOwEptgbV0PSWFq+l5qs152KDSb6dW3GiL6trnv8zbZ837dvHwcOHGDnzp22TsOOKKrbGJmLdOTtW0/+oa3WbrUaLX49R+Df70E0Hj6ODk+wU0pBOhvlH9l9IR6TxYSLxoUHOw3DU+1x4wffpOudQa2pcl8Bqg4Il1eatStBla11erXsq+q+PYB3lW1vA2/b89w14Z+7/8PvaYl18lrdm0by6oCpdh/fWFq+G0vNlJosqFQqUndqWf/vmm35/uuvv9K8eXNWrFjB999/j5ubG7Gxsbzwwgu2+IWaZSk1UHDge/L2f43FUASo8I4cQMDAR3Dxb9y1JOuTU1ln+e7UDxxMtQ7JqlDRK7ybNTm51HxyguskKFmWbedrkiQNwpooXuPKcFx/rFUhptdKZIJNY2n5vv9YKv/86ABajYpFz91F+xYB1/13uZmW7+Vyc3M5e/Ys/fr148cffyQ3N5dnn32WhQsXMm/evOu+nnBzFIsZfcIucnZ9jlmXDYBH6zsJHPxn3MLaODg6wR4Wi4WDqcf47tR2TmefA8BFrWVg6xjuk4bQzCe0Vl/f3mtQy4EXZFneUWHbZkmSSoB/AV1rPDIHuJkzmrrUGFq+p2cX8q911jI2j9/X+YbJCexr+V6Vl5cXGo3Gdkbq4eHBU089xf/93/+JBFVDFEWh+Oxhsn9aY2t74RramsDBj+HZ5k4HRyfYw2gysutCPJvkH0nTZwLg5erJ0HYDGdZ+EP7udbNY2t4EJWGd1FBVCtC+5sIRqtPQW76PGDGCCxeTsSgKGrWK13/S8HqF/bfa8r06nTp1Aqg0fVlMZa45JalnyPnpY0ouWluqa/2CCRg0Hu/O/VGpRH9UZ6c3FLLtzC62/rGTfIP1g1+wVxD3dRhCbJu+uGvrdhKLvQnqNDBDkqRJ5TXzJElSATPK9gm1qKG3fB89eRHf7jpLcIAHb78wCB9PV7tfr7qW761atSIqKqra4++++26WLl3KsmXLmD59Orm5uaxcuZKhQ4fa/ZrC1Upz08n5+VMKT+4HQO3ujX//0fhGDUOttf//U3CMzMJsNsk/8vO5/RjMRgBaB7RgZMe76dO8BxoHTfu3N0E9D2wEhkiS9FvZtl5Yp35fffVaqHGLFy9mzpw5xMbG4ufnx3PPPce2bdsqtXx/9dVXiYmJwd/fnyeeeMJhLd9ff/11oqOjCQkJ4fnnn7fNEKzOb8fT+XbXWTRqFS891vOmkhNYW77rdDrGjx9PcXExUVFRrFixwja0ePDgQZ566ik2b95Ms2bN8PLyYtWqVcybN4/evXvj4+PDsGHDmD5dXEq9FebCfHL3rqfg8A9gMaHSuODb6178+z6Ixl1MOnF253KS+E7ezq+XDmNRrPW67wzrxP0d76ZziOTw0QW7W76XTfmeCpSPnZwAVsiynFpLsd020fLduWXmFjFt6U70xaU8fl8nHowVo8X1hcVYQv5vm8j75VsUYzGgwrvrIAIHjkPr28TR4QnXoSgKR9NP8t2pH0jMlAHQqNT0uyOauI5/oqV/3b5X1kjLd1mW04DZNRuaYK+G1vLdZLawZM0h9MWl9IwIZdRAUW+tPlAsZnRHfyJ39zrM+lwAPNp2JzD2z7iFtnJscMJ1mSxm9icdZOOp7VzMt17Ddte68ac2/RkhDaaJZ+ANnqHu2Z2gJEmSgKeBdsAkWZbTJUkaCVyUZflobQUoWDW0lu9rtpzk5IUcgvzceX5cd9RqMVHB2VkMRWR+u5yiM9ZiLm5N2xI4+DE8WnVxcGTC9RSXlrDj3F42yz+RXWz9UOHv7suIDoO5u+1deLl6OjjCa7MrQZVVefgB2I91/VP5T9QJ+AswulaiE2waUsv3Q6cy+OrnM6jVKmb+uSd+3qK8jbMrzU0n/Yt/Uno5GbWHN02GTsSrUz8xM8+J5RTnseX0z2w/u4ei0mIAwn3DiJPu5q6W0bhoql8470zsPYOaD8yTZfmfkiRVXHTyE9brUoJgl+z8Yt767DAAjw7tSOc2QQ6OSLiR4gsJZHy9BEuxHpcmzQl7+FXRm8mJJeen8Z28nT0Xf8NsMQMQEdyOkR3voXvTzqjr0YcKexPUnVjPlKrKwDqTTxBuyGy2sHjNIQoKjXTrEMxDg8WkCGdXcGgrl39YBRYznu2iCBn1PGo35x0SaqwUReFk1hm+k7dzODUBsJYi6t28OyM73k37oNYOjvDW2JugSri6jxNAByCr5sIRGrK122WOn8smwMeNF8b3ENednJhiNpG9fTUFh6jvhkwAACAASURBVLYC4NfnfgJjHxVtMJyMxWLht5QjfHdqO2dyLgDgonFhUKs+3Cf9iaY+9XMSVTl7E9T3wKtl7dcBFEmSmmCtxfddrUQmNChHTmfyxY+nUalgxp+jCPBxd3RIwjWYi3RkfL2EkouJoNESPGIKPl0HOTosoQJFUdhz8Te+PL6ZDL31HMHb1Yth7QcytN1A/OqoFFFtszdBvQT8DFwA3IFvgTbAecTUc+EGcgtKWPrZYRQFHrlHoms7MSrsrIxZl0j/cgGm3HQ0Xv6EPvQS7s0lR4clVJCUl8IHhz/nZNYZAEK8grhP+hODWsfUeSmi2mZXgpJlOVOSpChgHNZOt2qs1c0/lWXZUIvxCfWc2aKw5NND5OkMdG3XhLF3izc7Z1V05hAZ3yxDMRbjGtqasIdfEYtunUhxaQlfJm7i+z9+xqJY8HXz5tGuDzCgVW+HlSKqbfZOMx8A7Jdl+UPgwwrbtZIkDZBleXfthCfUd1/uOM2xM5fx83blxUej0IjrTk5HURTy478jZ8cngIJXRAzB9z2L2lUMwzoDRVH45dIhPjqyntzifFSouKfdAMZ1GYm3a8MuJ2XvEN/PQFMgs8p2v7J9DTN9C7cl4exl1m47hUoFL4yPItC35t/wLBYLy5cvZ/369RQXF9OjRw/mzZtHeHj4NR/z3Xff8f7775OSkoK3tzdDhw5l5syZuLo2vqKmiqmUrC3voT+2E4CAAWPx7z/G4TXYBKvUgnQ+OLyOhIxTALQLbMXEqHG0CWzp4Mjqhr0JSsWV7rkV+WFtxS4IleTrDSxZcwiLAmOGtKeHVDuziVauXMmmTZtYs2YNoaGhLFiwgMmTJ7NhwwZbwdiKTp06xcsvv8yyZcsYOnQoqampTJw4ES8vL55//vlaidFZmfS5ZKxfjCFFRuXiRvDI5/DuGOPosATAYDLy1Ynv2Sj/iNlixsvVk0e7jmJwm371ah3T7bpugpIkaVXZTQX4lyRJxRV2a4Ao4FAtxVbnTsx7k9xDh+vktQKietBpziy7j8/OzmbOnDnEx8fj6+vL9OnTmTFjBh9//DG9e/cmMzOT2bNnk5CQgMFgoHXr1syYMYOYGOsbTnlBxvnz57Nq1SpSUlKIiopi6dKlrF692lZxfPLkyUyYMAGA+Ph4JkyYwLJly1i2bBlZWVkMGTKEuXPnsmjRIrZs2YKnpyevvPIKw4cPB6xFbN944w1+P3ock8lEQOgd9Hh8QQ3/613x+eefM3HiRFufrJkzZ9K3b18OHTpUbcv3S5cu4efnx7BhwwAIDw9n0KBBnDp1qtZidEaG9HOkf7kQc8FlNL5NCBvzCm5h9XOtTEOiKAoHUo7y4e9fcrnI2mx0cOu+jL/zAXzdqm/C2ZDd6AyqvO+3CmgGGCvsMwI7gaU1H5ZQVXkH2B07dqBSqa6qw2exWBgzZgzLly9Hq9WycuVKnn32WbZv305g4JUikNu2bWPNmjWoVCrGjx/P2LFjefzxx9m9ezd79uxh6tSpxMbGVmr5vm/fPjZs2EBeXh6jR49mzJgxzJw5k3/84x+sXbuWWbNmMWDAALy8rOPhnfvEkR04Em8PLS2VA/ztb9bWIC4u1ZdWiYuLIy0t7Zo/++uvv05c3NVdXXQ6HSkpKURGRtq2+fr60rJlS06ePFltgurfvz/Nmzdn8+bNDBs2jJSUFH766ScmTZp0zddvaPQnfyFr479RSg24hUuEPvQSWm9/R4fV6GXos1h1+At+T0sEoJV/cyZGPUKHJm0cHJnjXDdBybJ8N4AkSauBabIsF9RJVA5yM2c0dSkjI4P9+/ezZcsW/Pys66WnT5/O9u3bbceEhYVV6v/0zDPPsGrVKhISEhg4cKBt+5QpUwgIsLZTHzRoEDt27GDcOOvyttjYWLy9vTlx4kSlBDVt2jQ8PT1tRWr1ej2DBw8G4P7772fevHmcP3+eyMhITC5B7D/vhlqjMHNCH9o3i6VXr14kJSVds+X7xo0bb+nfRa/XA9akVJGPj49tX1UeHh489NBDvP7668ycOROz2cwDDzzAqFGjbimG+kRRLOTtWU/unnUAeHcdRPDwyai0zl+TrSEzmkv57tQPfHNiK6UWEx4u7oyLHMk97QY02Nl59rqZhoVXHStJUiBgauiJy9HS09MBKvW0qtrfKi8vj4ULFxIfH09eXh5qtRq9Xk9OTk6l44KDr6xB8vDwuKpdh7u7O4WFhZW2VTzGw8MDDw+PSscDFBYWUlBo5P9WbCP5wNeoilKZ9HOJ7TpQdnb2NRPUrfL2tg556HS6Stt1Op1tX1XffPMNb731Fu+99x49evTg8uXL/P3vf+fll19myZIlNRqfM7EYS8ja+A6Fp34BVAQOmYBf7zgxGcLBjqQd54PD62yLbe9q2YvH7nwQf4/qCvc0PvYmqM+ArcC/q2x/BBiG6Kpbq8rPjJKTk23XWlJSUiods3TpUpKTk1m7dq0toURHR2NvQ8rbpSgKyz8/zKl9nxEQEMDnX35HSHAT8vPz6dWr13XjuPfee0lNvXbfy7lz5zJy5Mirtvv4+BAeHk5iYiJdulhbPuh0OpKSkoiIiLjqeIDExER69+5Nz549AWvyffjhh5kxY8bN/Lj1iqngMulfLMCYcR6Vmyeho57Hs12Uo8Nq1C4X5fDh71/yW/IRAJr7NmVi1Dg6hXRwcGTOxd4E1Rt4uZrtO4F/1FQwQvVCQ0OJiYlh8eLFLFy4EIDly5dXOkan0+Hu7o6vry8Gg4EVK1ZQVFR3Eyz3HUvlgKwBi4HuEeEE+Puh0+lYvHjxDR+7efPmW37dcePG8cEHH9CnTx9CQ0NZvHgxrVq1Iiqq+jfgqKgo5s6dy++//063bt3Iycnhiy++qHQdqyEpSZbJWL8Ic2Ee2oAwwsa8gmtwixs/UKgVJrOJTad38NXx7zGYjbhp3RjT+V5GdBiMtpEP51XH3vmKXoCpmu1moPFNLXGA8jf62NhYRo0aRWxsLABubtbSJtOmTUOn0xETE8OwYcMICgqqdE2qtm395SIAL8x4mTOnrRMURo8eTd++fWv1dSdOnMjw4cMZP348ffv2JSUlhRUrVtiGFg8ePEj37t1tZ2gjRozgmWee4dVXX6VHjx7ExcXh4eHBokWLajVOR9Ad20nqmjmYC/Nwb9WF8L8uEMnJgRIzZGb+8CafHfsWg9lIn+Y9WD78dUZ2vFskp2tQ2TMEJEnSQeBrWZbnV9k+Gxgty3L3WorvtkiS1Ao4v2PHjquu2dR3p0+fJi4ujj179ji07bu+yMi0t3aSmVvMyLva8NQo0V3V0RSLmZyfPyX/1w0A+EYNI+jux1Fp7G6gLdSg3OJ8Pj6ynn1JBwFo6h3CE1FjuTOsk4Mjcw7lS2CA1rIsX6i4z97f2MXAJ5IkhQLlU8fuwdoC/q81E6ZwPadOnUJRFCRJIisri/nz59O7d2+HJidFUfjXF0fIzC2mXQt//npfZ4fFIlhVasuu1tDknifxjRrq6LAaJbPFzNY/dvJF4iaKTSW4aFx4MGIYIzveXS+62ToDe4vFrpMkyRPr9abnyjYnA8/Isry2lmITKtDpdMyePZuMjAzbdO+qa6Hq2uZ95/klIQ1Pdy0vP9YTF23jWeHujKq2ZQ99cAYercQZrSOcyjrLB4fWcjHfOpkpqlkXHu/+MCHeovjuzbD7nF+W5dXAakmSgsvui0aFdSg6Oppt27Y5OgybM8l5fPDdcQD+9nB3woIadtFKZyfasjuHghIda459w87zvwAQ7BXE490fpmd4VwdHVj/d1KC0JEldgfbAlrL7bkCpLMuWWohNcFJFJaUs+vggJrOFEX1b0e/OZo4OqVETbdkdz2Kx8OO5vaxN2EChsQitWsvIjnfzQMQw3LSNrwhxTbG33UYg8DUwAGtdvvbAOeA/QAHwQm0FKDgXRVH49xdHSMsupE0zP54c2TCnZ9cHV7VljxlF4KDxoi17HTubc5GVB9dyNtc6k/XOsAge7zGWZj6hDo6s/rP3DGoJ1inlrYDjFbav5yZq8UmSpMbaJv5JrFPX9wJPy7J88RrHe5QdPxYIANKA52RZ3mLvawo1a+uvF9l7NBUPNw0vT+iJq4t4M3QE0Zbd8fSGQtYmbODHs3tRUAj08Oev3cfQu3l3UaGjhtiboO4B7pdlOUmSKnVEPQ3ccROv9xLW6hMDgBTgLWCjJEndqg4TSpKkAr4pu3uXLMvnJUlqfhMxCzXsfGo+73+bAMDUh7rRLFgsgXME0Zbd8eKTf+d/Bz9DZ9CjUakZ0WEID3W+Fw8X0eSxJtn7Zh8I5Faz3Qe4metPk4GFsizLAJIkvQRkAP2Bql157wYGAi1kWb4MIMty8k28llCDig0mFn58gFKThXt6t2Rgj4a1rqy+EG3ZHctisbAucSPfnLQOq3YKbs+TUeNo4Seuw9YGexPUYaw1996tsn0CEG/PE0iS5Ae0BA6Wb5NlOU+SpDNAN65OUIOB88BsSZLGASXARuBVWZarL1Ut1ApFUXj3q6OkZBXSMsyHp0aJ606OUCjHk7F+MaItu2MUGov496+rOZyWiEql4rE7H+TeDkPEcF4tsjdBzQW+LRti0wCPSZLUGbgfayKxR3lPhLwq2/Mq7KuoCRAB/AC0Kbv/NdZrXk/b+ZpCDdhxIImdh5Jxc9Xw8oRo3F3FKGtdM2ankPndvwEF/74PEjBovHhjrEPJBWks3vseabpMvF29eD7mSbqGVV+QWKg5dq2slGV5O9aK5TFYh/ReBsKAobIs77PztcpbclStI+9fYV9FOqwTM16RZblIluUkYCHQ8Bv3OJHC4lL++431utOUB7vSItTHwRE1PhZjMRnrF6EYi/GKiBHJqY4dTDnGrO2LSNNlcodfOP+8+2WRnOrINT8KS5I0B1giy3KRJEl3AD/LsvzTrb6QLMv5kiRdBHpSNsxXNuzXFjhSzUPKe69XLBZYN70jBJv44+mUGM10bhPEkOibmQ8j1ARFUcja9C6ll5NxadKc4HuniuRURyyKha9PbOWLRGtDzT4tevBMrwm4a90cHFnjcb2xmjnAe0AR1mtBTYHM23y994CZkiT9hHUW30KsMwH3VnPsN8AC4E1JkmYBQVhnAa6/zRiEm7D3qLVUy4Du4Q6OpHHK/20jhSf3o3L1IPShl1C7edz4QcJtKy4t4T/xH/FbyhFUqHik6/3c3/Ee8eGgjl0vQaUBD0qStBFQAWGSJFV7vCzL1+42V9kirEN8e7myDmqkLMsWSZLuwlqhopMsy0myLOslSboHeAfIxnqt6kvAOfuyN0D64lJ+lzNRqyCmS1NHh9PoFF9MJGfHJwCExD2Ha5D4kFAX0nWZLN77HpcK0vB08WBazBN0byomBjnC9RLUIqzJ4T9Yh9Z+r+YYVdk+u1Zrlq11erXsq+q+PVTpLSXL8nEg1p7nFmpefGIaJrNC13ZNCPARs8Xqkqkgm8xv3gLFgn/fB/Dq2NvRITUKR9JO8PYvKyksLSbcN4yZ/SeLihAOdM0EJcvyvyVJWo/1GtFuYDSQU1eBCY6396j1xLh/N/HJvS4pplIyvl6CuTAfj9ZdCRj4iKNDavAUReG7U9v5LOFbFEWhZ7OuPNvnr3i6iCFVR7rufGFZltOANEmS5gLbZFmuux7igkPpi4y24b2+YnivTmX/+CGGlNNofJsQcv/zorZeLTOYjKw48An7yxoKPtT5Xh7qPAK1SrSPcTR7+0HNre1ABOfya2IaZotCt/bB+HmLWUt1RXdsp7X4q0ZL6OiZaLyqrsoQalJmYTZL9r7Hhbxk3LVuPNv7r/Rq3s3RYQll7K1m7ol17dOfgFCqrJ+SZblNzYcmONKeI2J4r64Z0s9xect/AWgy9Cncm7VzcEQNW2KGzLL976MzFhLmHczM/pNFySInY29JgBXAfcA6IBWxHqlBKyg0cuSPLNRqlZi9V0fMxToyvlqMYjLi0+1P+Hb/k6NDarAURWHLHz/z8ZGvsCgWuoV14m8xT+DtKppuOht7E9R9wFhZln+szWAE5/BLQhoWi0IPKQRfL9FsrbYpFjOZ376NKS8Tt6ZtCRr6pKNDarCM5lLeP/gZuy78CsCoiKGMixyJWi2uNzkjexOUEUiqzUAE51G+OLe/6JRbJ3L3fEnxud9Re/gQOnomatGBtVZkF+WyZN9/OZtzETeNK1N6TaDvHVGODku4DnsT1H+wFmh9sRZjEZxAvt7AsTOX0ahV9BHDe7Wu8I+D5O39ElRqQh6YjtYv2NEhNUinss6ydP//yC8pINgriJn9JtMqQLSMcXb2JqiWwGhJkgYDR7GeUdnIsjyppgMTHKN8eC+qYwg+nuKTfG0qzUkja8PbAAQOegTP1nc6OKKGafuZPaz6fR1mi5nIEInn+07E100026wP7E1Q7bAmJrAmq4rEhIkG5Mrwnpi9V5ssxhIyvlqExVCEp9Qbv5gHHB1Sg2Mym1h1eB0/nrOW+hzRYTCP3fkgGrGurEZYSku5tO5LjNnZtHtuKqpauI5n7zooUW6oEcjTGUg4cxmtRkWfyDBHh9NgKYrC5e/fw5iZhEtQM0LinhVFSGtYXnE+S/e/j3z5LC5qLZN6PsrA1n0cHVaDUZySirzkLQrPnUft7k7rpyai9az5qhui85xg80tCKhYFenQIwVsM79WagoPfoz++B5WLO6GjX0Lt5unokBqUM9kXWLLvv+QU5xHkEcCM/k/TNrDqwI9wqzJ/3snZ997HUlKCe1goHV6cXivJCa7fD+p/wAtlVcX/d70nEdegGoby2nt3dROz92pLyaWTZP/4EQDBcVNxDW7h4Igalp3nf+H9g59RajHRsUlbXug3CX/36hp2CzfLVFTMuf++T9bOXQA0uasfbZ+ZjNaz9j5gXe8Mqn2F/e2vc5y4BtUA5BaUkHj2MlqNml6dxey92mDS5ZLx1RKwmPHrPRLviL6ODqnBMFnMfHLkK7b88TMA97QdwF+7j0GrEYNENUF/9hzykrcoSU1D7eZGm0lPEjJkcK0PTV+vmnlsdbeFhml/QhoWBXpKIXh7uDg6nAZHMZvI/GYp5sI83Ft2JnDwnx0dUoNRUKJj2S8rOZ55Go1aw5M9xvGntv0dHVaDoCgKaZs2c+HDT1BMJjxbtUSa8QKeLepmir74eCEAsOdI2ew9MbxXK7J3fETJpZNofAIJfeBFUaG8hlzIvcTive+RVZSDv7svL/abhNSkraPDahBKCwr441//IfeAtcp72PBhtHp8Ahq3uiseLRKUQHZ+MSfOZ+OiVdO7s5i9V9P0iXsoOPA9qEWF8pq0L+kAK377BKO5lPaBrXix/9MEevg7OqwGIT/xOKeXLseYk4PGy4v2z00lKKbum2aKBCWw/1gaigJRHUPwdBfDezXJkHGBrM3vAtDknidwD+/g4IjqP4vFwmcJG/ju1A8ADGodw8SoR3DViN/d26WYzVxa9yWXvvwKLBZ8IjrS4YVpuIeEOCQekaAEsTi3lphLCm0Vyr27DsKnxz2ODqnes1gsvBP/IXuTDqBRqflL9zEMbTdQrCOrAYasy5x+azkFJ06CSkXzhx/ijnEPo9I4bjhaJKhGzjq8l4OrVk10p1BHh9NgKIqFrA1vY8pNxzW0NU2GTRJvordJURT+d+gz9iYdwF3rxst3PUPnEHFGWhOy4w9w5t/vYNLpcQkIoMML0/Dv2sXRYYkE1djtK1v7FBURKob3alDe3q8oOnMItbs3oQ/NRO0iuhLfDkVR+PjIV/x0bh8uGhdeuesZOonkdNssRiMXPvyEtM3fAxAQ1YP2057Fxc85rpPa21E3GFjClY66lT4KyrIspiTVU7bFuWJ4r8YUnTlM7u51gIqQUc/j4i/OTG/Xl8c3sfn0DjRqDTP7PS2SUw0oSk7h9JK3KDx/AZVWS8sJf6ZZ3L21UlPvVtl7BrUS6AK8jeio22Bk5RZz8kIOri4aeorhvRpRmpdB5oa3AYWAgY/g2ba7o0Oq9747tZ31x79HpVIxrc8TdGva2dEh1WuKopD1807O/ndlWbmiMDrMmI5P+3aODu0q9iaoQcA9sizH12IsQh3bd8x69hQdEYqHmxjtvV2WUgMZ6xdjKdHj2b4n/v0edHRI9d4PZ3az5ujXADwTPYE+LXo4OKL6zVRUzLn3/kfWrt0ANBlwF22nTKrVckW3w953pVxAV5uBCHXPNntPLM69bYqicHnr/zBmnEcbEEbwyL+hUjnPUEl9tPtCPB8c+hyAJ3uME9XIb5P+zFlruaK0dGu5oqcnEjI41qkn79iboN4EZkmS9BdZlk21GZBQNzJzipAv5uLmqqFnRzG8d7t0h7ehP7YTlYsbYQ+9hMbdy9Eh1Wu/JR/h3d8+RkHh0a4PMLT9QEeHVG8pikLqd5u4+PEaFJMJr9at6DBjOp7Nnb+jsL0J6mEgGkiWJOkUV3fUFQs86pmKw3vuYnjvtpQky1z+YTUAwfdOwTVEtHa4HUfSTrDsl5VYFAujO43g/gjx9nKrSvPz+ePtd8g9dBiApvcOp9VfJ6B2rR/tdOx9Z0ou+xIaiCvDe2L23u0w6fPKKpSb8I2+F+/Odzk6pHrtROYfLNn3HmaLmREdBvNw5H2ODqneyjuWwOm33qY0NxettzftnnuGoD51X67odtjbUffx2g5EqDvp2YWcTsrD3VVDVEfHlDBpCBSLmcxv38Ksz8G9RQRBQyY4OqR67Uz2BRbueRejuZTBbfrxl24POfX1EWelmM0kff4FyV9+BYqCb6cIOrwwDbfgYEeHdtNuamxHkqQWQKeyu8dlWRZnVfVQ+eLcXp3CcHcVw3u3KuenNZRcPI7Gy5+QB15EJXoP3bKkvBTm736HYlMJ/e7oyaSo8SI53QJDVhan33rbVq6oxdgxtBg7xqHlim6HvQt1PYEVwJ+5skjXIknSGmCKLMvFtRSfUAvE8N7t05/YR378d6DWEDp6JlqfAEeHVG+l6TL5v13/Qm8spGezrkzt/VfUTrRYtL7I/iWeM++8i0mvxzUwkPbT/+YU5Ypuh70f+RZjXQv1ALCrbNsg4F9l+56t6cCE2pF2uZAzyfl4uInhvVtlzEoia5O1QnnQn/6Ke4uODo6o/rpcmMO8ncvJLymgS6jE830nohW9sm6KxWjk/KqPSN+yFYCAnlG0/9tUpylXdDvsTVAPARNkWd5WYdsGSZIMwEfYmaAkSVIDbwBPAl7AXuBpWZYv3uBxUcCvwD5ZlgfZGbNQjfKzp96dm+LqIt4IbpbFUETG+sUopSV4Rw7At+dwR4dUb+UW5zNv53Kyi3KRgtows/8U0TLjJhVdSkZe8hZFFy6i0mpp9ZfHaBp3b4MZHrX3PNoPOF/N9vOA70283kvAI8AAIAxIAjaWJa5qSZLkDnzIlTM34TaU197rf6dYnHuzFEUhc+M7lOak4hrSkiYjJjeYN4K6pjPoeWPn26Trs2jt34JXBkzFXSsK6t6MzJ27OfriSxRduIh70zC6LpxPs5H3NajfSXvPoBKBScCMKtufLttnr8nAQlmWZQBJkl4CMoD+wO5rPOZNYAeQh3VYUbhFqVl6zqXk4+mupbskhvduVv4v31Akx6N28yR0tKhQfquKSouZv+sdLhWkEe4bxqyBz+Hl6pyldpyRoihc+vwLLn3+BQDBAwfQZvIktJ4eDo6s5tmboOZgHdKrmEgGAD2AkfY8gSRJfkBL4GD5NlmW8yRJOgN0o5oEJUnSAOA+oDvWsy/hNpSfPfXuHCaG925SScppcnauBSD4/mm4BDZ1cET1k8FkZOGedzmbe5FQryb8fdA0fN19HB1WvWEpLeXMOyvI2rkL1GraTHycsBHDG9RZU0V2DfHJsvw9EAWcBoaUfZ0GomRZ3mrna5UPBeZV2Z5HNcOEkiR5A6uAp2RZLrLzNYTrELP3bo1iMXN56/ugWPCLGYVX+56ODqleKjWXsmTfe5zMOkOghz9/j32eQA9/R4dVb5j0ek7MfYOsnbtQu7kR8epLNL13RINNTnAT66BkWT4G3M5KxIKy71WnlvhX2FfREuB7WZavNfQn3ITkTB3nUwvwctfSvUP9W7DnSLrff8SYfg6NbxMC+o9xdDj1ktli5u1fVnE0/SS+bt78fdA0QryCHB1WvVGSkcGJeW9SnJyCS4A/nWa/hne7to4Oq9bV2cpCWZbzJUm6CPSkbJivbNivLXCkmocMA/wlSRpfdt8TcJEk6TIQLctydZM2hGsoX5zbO7IpLloxvGcvc1EBOTs/A6xTytWu7g6OqP6xKBbe/e1jfks5gpeLB7MHTiPcN8zRYdUbutN/cPKNf1Kan4/nHS3oNGdWvawKcSuumaAkSTIC4bIsZ0mSVMp1mhTKsmxv5cH3gJmSJP0EpAALsQ4V7q3m2D5V4nsBiAHGAGl2vp5QxtY5Vwzv3ZScnz/FUqLHo3VXvDqKdg83S1EUPjj0OXsu/oab1o1XBzxLqwDnr6LtLLJ/jef00uVYjEb87uxKx5dnoPVqPJXyr3cG9RRXht6eoma66C7COsS3lyvroEbKsmyRJOkuYAvQSZblJFmW0ys+UJKkAsAgyivdvEsZOi6kFeDl4cKd7RvHJ6+aUJJ6Bt2RHaDWEnTPkw16rL82KIrCmqNfs/3sHlw0LrzcfwodmrRxdFj1gqIopG3czPlVH4KiEPKnwbSd8jRqbeMqp3XNn1aW5Y8q3P6wJl5MlmUL8GrZV9V9ewDv6zz2HzURQ2O094h1ckRMZFNctKKEjD0UxUL2tpWAgl/v+3BtIj7136yvTnzPRvlHNCo1L/Z9ishQydEh1QuK2cz5Dz4kbfP3ANzx6CM0HzO6UX5AsrcW3zms132yq2z3Bw7Lsiw+FjmxPeWLc0XnXLvpjvyEIfUPNN6BBPR7yNHh1Dub5B18kbgJlUrF32KeoEez+l0Trq6YS0qQlywj98BBVFot7f/29mivywAAIABJREFULMEDG28LF3vPF1sB1V1ZdwPER0sndjG9gEsZOnw8xfCevczFOnJ+XgNA0J/+gtqt4S2ArE0/nt3Lx0fWAzAl+jFiWkQ5OKL6wZiTy4k3/knh2bNovb3p+NpL+HXu7OiwHOq6CapsoWy5GEmScivc1wD3AJdqIzChZuw9Yj17iunSDK1GDO/ZI3fX51iKdbi3jMSrUz9Hh1Ov7L34G+8ftM56fKLHWAa1jnFwRPVDUVISJ+a9iSHrMu5hoUT8fRaezcWEphudQe3EOjlCAb6pZr8eeKaGYxJqiKIoVxbnitp7djGkn6Pg8A+g1tBkqJgYcTMOpBzlnfiPUFB4pMv9DGs/yNEh1Qt5R45yauESzEVF+EgdiJj1SoOoRF4TbpSgWmDt/5SEtaxRVoV9RuCyLMs1MbtPqAUX03UkZ+rx8XSla7smjg7H6SmKhctbV1orRvSKwzX4DkeHVG8cSz/Jsv0rsSgWRkUM5YFOwxwdUr2Q8eNPnH33PRSzmaCYPrSf/jc0bqLGY7nrJihZllPKboqxoXqofPZe3/9v77zjq6zuP/6+K3uQRUIChOmRPVQUkeFEXLi3tlat46ettXXXn21dVau2Vas/q63VOoqKgyIuHIAgijJkHUAIkEAge9/5PL8/zpNwiYEkyL3PTXLer1de995nfu6T5Pk855zv+X5H98Glu/fapX7VZ/hKJK7kXmRMPt9uOV2G9WWbeGTRMwSNICcPncZFo2baLSnmMU2Tba+8RvEsNVZXcNZMCi+/FIcu1LgXHY3iux0ok1I+32r5lUCWlPLhSIjTHDjh3XuTx+i+7PYIeRuo+OQlADKPvxxnvM6u3RE2V27lwYVP4Qv5mTZgIj8dd57uFm0HIxBg0xN/o+zzBSrh68+vpM8M3eJsi47a9c8B2cbydaiSG5oYo2hnLSVlDaSnxDFysM551h5VC17DaKwlod8wUkZOaX8HDdtrdnD/50/QFPByVL/xXHvEpTgdugWwPwJ1day55w+Ufb4AZ0ICw+66XZvTfuhomHk+0FYGhx2AfjyPQRY2d++Nytfde+3g21VE7bL3weEka/pVugXQAUrry7jvs79S529gfJ+R/OLIK3Dq7qn94i0tVQlfS3YQl5nJsLvvIGWQnkK6PzpqULuBUUBRq+WjgYofbK2xFdW9pyfndgTTNFXGCNMg7fBTiM8dYLekmKe8sZJ7P/0zVd4aRvQ+hJuPvhq3q2el4OksdXID6+5/kEBNLUmF/Rl+913E5+jApfbo6CPPbOBxIcS45gVCiPHAo8AbkRCmOXA2l9Sws7yBXinxjBik/wn2R/3qBXi3r8OVnE7G1AvtlhPz1Hhrufezv1DWWMnQzAHcesx1xLk7miu6Z1K+eAmrf3sPgZpaeo0by6g/3q/NqYN09LHnLlTV22Vhk3UzUMle74yEMM2B09x6Onp0H1xO3V21LwxfI5XzXwQg89hLcSX0nCzRB4I34OXBBU+xs243hb36csfUG0j06PIj+8I0TXa8M4eiF14E0yT3xBMYdO3VPS7h64+hQ1dKStkATBNCHI+aDwXwjZTyk4gp0xwQpmm2jD/pyrn7p2rhLEIN1cQXCFJGT7NbTkwTMkI8vuR5Nldto3dyFndNvZGUOG3o+8IMhdj8939QOk8VHC+87BIKzjlLj292kk5ZuZRyPjA/Qlo0B4FNxdXsqmwkIzWe4QN19N6+8Jdto+aruYCD7JOvwqGjz/aJaZo8981rLN+5mtS4ZO6ceiO9EtLslhWzhJqaVMLXZd/g8HgY+ssbyZmsU2YdCB02KCFEBqrKbSGwV6ezlPIPB1mX5gBpzr03aXS+7t7bB6ZpUt4cGDF+OvF5OpJqf8xeO4/5mxfhcXm4dfJ15Kfm2i0pZvFVVLLuvgdo2LwFd2oKw+68nbThw+yW1WXp6ETdI4D3UWmP0lApj3oDjajqttqgYoC9cu/p7r190rBuMd6ta3AmppIx7SK75cQ0n21Zwn9Wz8GBg18e9TNE9mC7JcUsDUVbWfuH+/FXVJDQJ4/h/3sXifk6ivbH0NF+jUeAN4FsoAmYhGpJLQdui4w0TWfZuL2a3VVNZKYlMGxApt1yYhLD30TFxy8AVmBEYqq9gmKYlaVr+b+vVdmRK8afz4S+Y21WFLtULV/Bd7ffhb+igtRDBaMfflCb00GgowY1FnjcqohrAHFW6fXbgAciJU7TOVqCI8bk49Tde21StegNQnWVxPcZQurY4+yWE7MUVW3n0S+eJWQanHHoSToz+X4o/fBj1v7hfkJNTWRNOpqR9/4OT5oeozsYdHQMKgQErPe7UVnO1wPlqJaUxmb2mpyrc++1ib+8mJqlcwAHWSdfrQMj9kFZQwUPLngKb9DHpP6Hc/Fonfy1LUzDYNvLr1L8xmwACs4+k8LLLtEJXw8iHTWoVahW1CbgS+BOIYQTuJq2c/RpoozcVkV5dRPZ6QmIwgy75cQcpmlS8eHzYIRIHXsCCflD7JYUk9T7GnhgwZMtWSKun3C5zq/XBobfz8a/Pkn5wi/A6WTwdT8n76QT7ZbV7eioQd0PpFjv7wbmAvNQwRLnRkCXppO0RO+NKdDde23QIL+kacsqnIkpZB57id1yYhJ/KMAjXzxDSW0p/dL68JtJ1+BxeeyWFXMEampY9+DD1K1bjzMhgUNv+w0Z48e1v6Om03TUoBZidfFJKYuAEUKITKBKFyy0H8Mw+aIlek8PzLbG8Hup+OgFADKnXowrSY8PtMYwDZ5c+gLryjaRkZjOHVNvIDlOlxxpTeO27ay97wF8u3YTl5XF8LvvJHngALtldVvaNSghhBtoAMYAa5qXSykrI6hL0wnk1irKa7zkZCQi+uvuvdZUf/Emodpy4vIGkTruBLvlxCT/XjGbL7d/S6I7gTun3EB2ko4CbU3Vt8uRjzxGqLGRlKFDGHbn7cRl6v+3SNKuQUkpg0KI7eiqujFL89ynSaPzdSqVVgQqd1C99F0AsqdfhcPpsllR7DFXzue/G+bjcjj5zTHXUNirr92SYo6dc+ex+bl/gGGQdfREht50oy7NHgU6ajqPAr8TQiRGUoym8xjGnui9yXpy7l6ojBH/gFCQlNHHkdBX2C0p5vhy+7e8uOJNAK6bcDmjcg+1WVFsYYZCbH72OTY/+xwYBn3PPxdxy83anKJER8egZgITgBIhxDpUl18LUsqTDrYwTcdYV1RJZa2X3hmJDO3Xy245MUXjhq9p2rwcZ0IyWcddarecmGN92Sae+PKfmJhcPPpMpgw40m5JMUWwoQH5yGNUL1+Bw+1myI3X03vaVLtl9Sg6alDFtF1RV2Mzi1om5xbo7r0wjICPio/+CUDGlAtxJafbrCi2KKkt5aFFTxMwgpw0eAozD9XPmOF4d+1i7b0P0LS9GHdaGsPuvI20Ybp1GW32a1BCiPOBt6WUV0RJj6YThAyTL1bpyrltUb34LYI1u4nrXUjaYdPtlhNTVDfV8MDnT9Dgb+Tw/NH8bPwF+uEmjNp161n3wEMEa2tJ7NeX4XffSUKuTpBrB+21oF4F+qCyR2B1702XUm6LtDBN+6zdUkFVnY+8rCSG9NXde80EqkqpWfI2ANknX60DI8JosooONlfE/eXEK3HqzAct7P7sczY98TfMYJBe48YibrkZd7Kue2UX7RlU68eqvh3YRxMldPde21R89E/MUICUUVNJ6KdLHTQTNEI8tvjvbKneTl5KDrdNvp54Xa4dsNIWvfIaxa+rgJE+p85g4JVX4HDphxs70WbTRQkZJotX7QRUcliNonHjNzRuXIYjPonM4y6zW07MYJomzy57mZWla0mNT+HOKTeQlqAzuQOEfD42/vkJKhYvAaeTQVf9jD6nzrBblob2Dcq0flov09jMms3lVNf76JOdzKACHQAAYAT9lH/4PACZUy7AnaInUTbz+pq5fLZlCXEuD7dPvp681N52S4oJ/JVVrLv/Qeo3fY8rKQlxy806bVEM0ZEuvteFEH7rcwLwohCiKXyjjoaZWwlm7wOuBJKBRcA1UsqtbWx7FCrv3+FAIipR7X1SytkdOVd3pzn33jFj9OTcZmqWvEOweheenH6kHXay3XJihk82f8Eba+bicDi4aeKVDM0aaLekmKB+8xbW3fcg/ooK4nN7M/y3d5LUv5/dsjRhtDc6+i9gC1Bi/fwbZRQlrX46yq3ARcAUIA/YBsyxjKs1mcB/gBFAL1TC2leEEBM6cb5uSShksPg7PTk3nED1bqoXq2eX7OlX43Dp3muA5TtX8+yyVwC4cvyFHF4wxmZFsUHF0q/47o7fqgKDww5lzCN/1OYUg+z3vzgC4eXXAg9JKSWAEOJWYBdwDLCg1bnfa7Xvm0KIO6xtvzrIuroUq7+voKbeT0FOMgP66MSnABUfv4AZ9JM84hgSC0fYLScm2Fy5lccWP4dhGpw17GROGjLFbkm2Y5omO95+l6J/vQSmSc60qQy54TqcHp21PRaJWnypECIdVdxwWfMyKWU1qkXWbi1pIUQ+MAxYGSmNXYWFK3X0XjiN3y+nUS7FEZdA1vE/sVtOTLC7vpwHF/4NX9DHlMIjuXDUGXZLsh0jEGDTk09T9MKLYJr0v/Riht50ozanGCaa/SDNj/rVrZZXh61rEyFECjAbmCOlnB8BbV2GUMjYE72nu/cwgwFViBDIOOY83Kk6C3edr54HFjxJjbeWUbmCa4+4tMc/yATq6lj/x0eoXb0GZ1wcQ2/6BdmTJtotS9MO0TSoWuu1dchZr7B1P8Bqec0FdgKXR0Za12HlpnLqGv307Z1CYZ4OE675ag6Byp14sgpIn3Cq3XJsxx/08/DCp9lRt4vC9AJ+ffQ1uHv4eFxTyQ7W3vcA3h078WRkMOyu20kdqisqdwWi1sUnpawBtqKi8oAW8xkMrGhrHyFEFjAf2A6cJ6X0t7VdT0JPzt1DsLacqkVvAFYpjR5e/dUwDP765T+RFZvJSszgjik3kBTXswsQVK/6jpW33I53x06SBw5kzJ8e0ubUhYj2o9UzwC1CiE9Q0X8PARtQ4eZ7IYTIAz5GBURcJaU0oik0FgmGDJZ819y9pyfnVnz8AmbAR/KwiSQOHG23HFsxTZMXVrzOVyUrSPIkcseU/yEzqWenvyr98CM2P/N3zFCIzCOP4JBf/RJXYs827K5GtA3qYVQX3yL2zIM6Q0ppCCEmA/OA4Vauv2tQIeYDgfOFaKnl828p5bVR1h0TrNxYRn1TgH65qRTm9ezovcYtK2lYtwSHJ56sE35qtxzb+a+cz/sbP8PtdHPLMdfSv1fPHZ80QyGK/vUSO96ZA0DB2WdSeNklOHTOwS5HVA3KagXdYf20XrcQSAn7/Hvg99FTF/s0T86d3MNTG5mhABUfqMCIXpPOxZ2WbbMie/li29e8tFLlkLt+wuWM6H2IzYrsI9jYxIbHHqfq629wuFwMvv4ack843m5ZmgOkZ4+ediECQYMlq3X0HkDN1+8RqCjBk9mHXkeebrccW1m7ewNPLX0RgEvHnMUxhUfYrMg+fGVlrL3vQRqLtuJOTeHQ224hfdRIu2VpfgTaoLoIKzeW0dAUYECfNPrl9tzovWBdJVULZwGQddKVONw9NzBie80OHln0DEEjyMlDp3G6ONFuSbZRJzew7oGHCFRXk5Cfz/C77yAxv2f3NHQHtEF1ERa2RO/17H+6ivn/wvR7SRJHkjS45yb1rGyq5oEFT9IQaGJCwVh+Ova8HhvVWb7oCzb+5UkMv5/00aM49Lbf4E5JaX9HTcyjDaoLEAiGWGp1703qwQbVtHU1DWsW4XDH9ejAiMZAEw8ueIqKxioOyRrEL466okcWHTRNk+JZb7DtldcAyJ1+IoN+fhVOt76tdRf0b7ILsHxDGQ3eIAPz0+jbu2d275mhIOXNgRFHn42nV88sFxEMBXn0i2fZWl1Mn9Te3Dr5OuJ6YNFBw+9n4xN/o3zBQnA4GHDFT8g/47Qe24rsrmiD6gKET87tqdR+8z6Bsm24M/JInzjTbjm2YJgGzyz7N9/tWk96fKoqOhjf87qyvLt2seHRv1AnJc6EBMSvbyJzQs8NDunOaIOKcfyBEEvXlAI9c/zJNE0a1iyi8vNXAcg+8Wc4e2CLYVXpOl5aOZut1cXEu+K4fcr/kJuSY7esqNK4bRvFb75F2YJFYBjEZWcz/O47SB4wwG5pmgihDSrGWS530+gNMqggnfycnvW0HKjZTfm8Z2n6fjkAKSOnkDT0MJtVRZeiqmJeXvUWK0vXApCVmMF1Ey5jcGahzcqiR53cQPEbs6n86mu1wOkkZ9pUBvz0MuIydNXk7ow2qBhnYVjl3J6CaYSo/eZ9Kj99BTPgxZmQTObxPyF1zHF2S4saFY1VvPbduywoWoqJSaIngbOGncwpQ4/tEWNOpmlSvWIlxW/Mpnb1GgCccXH0PuE4Cs6cSUJuzxyD7Glog4pRvP4gL763js+XFwM9Z/zJX7aNsrlP4yvZAEDysIlknXQl7pSe8aTc6G/i7fUfMHfDJwRCAVwOJycNmcY5I07pEeNNpmFQ8eVSit94i4bvvwfAlZREn1NOps/ppxLXq2fnF+xpaIOKQeTWSh5/9VtKyhpwOR385NTh9MlOtltWRDGDAaq+eJPqxW+BEcSVkkn2yVeTLCbYLS0qBENBPvx+AW+ueY86fwMAR/Ubz8WjZpKX2v1bC0YgQNnnCymZ/RZNJarXwJOeTv4Zp5E3Yzru5O79969pG21QMUQgaPCfjySvz9+AYUK/3FRuvng8Q/p276dG7/b1lL33NIFy1VpMGz+dzGMvwZnQ/W9KpmmytHg5r6x6m9L6MgAOzR7MZWPPYWjWQJvVRZ6Q18uujz6m5O05+MvLAYjvnUPBWWfS+/hjccXH26xQYyfaoGKErTtreezVb9lcUoPDAWdOHcxlM4YR53HZLS1iGL5GKj99mdpv3gfAk5VP9inXkdh/uM3KosP6sk28tHI2Gyu2AJCfmsslY87i8PzR3X4+T7C+np1z57FjzlyCdXUAJPbrS99zziJ78jF6sq0G0AZlOyHD5J3PN/HSvPUEQwa5mUncdOE4Rg7u3hm6GzYuo3zes4TqKsDpotfEs+h1zDk9IoR8R20pL696m69LVgKQHp/KeSNP47hBk3A7u+8DCYC/soqSd96l9P0PMbxeAFIOGUrfc88h84jDdEkMzV5og7KRneUN/Pm1b1m7pRKA6UcV8rPTR5CU0H0ToAbrq6n46B80rP0CgPj8oeSceh1xvbt/2HS1t5Y3Vs/l482LMEyDeFccpx96AqeLE0n0JNgtL6I07Syl5K132D3/E8xgEIBeY8dQcM5ZpI8a2e1bjJoDQxuUDZimyftLivjHnDV4/SEy0+K58fxxHD4s125pEcM0TepXfUrFx//C8Nbj8MSTOe1i0g6fgaObtxq8QR//lfN5d/2HeIM+HA4Hxw86hvNGnkpmYvceX2woKqL4zbcoX7QYDAMcDrImHkXBOWfp0uuadtEGFWUqapr466wVfLt+NwCTxxZw7dmjSUvuvl1bgapSyuf9H01bVgGQOGgM2TOu7fb59AzD4NMti5m1+r9UeWsAGJ8/iktGn0m/9O49r6123XqK35hN1bJvAHC4XOQcfxwFZ88kqW9fm9VpugraoKKEaZosWF7C07NX0dAUIDXJw3Vnj2HyuO47v8k0QtR8NZeqz1/FDPpxJqaQdeIVpIyc2q27dEzTZPnO1by88i2216os9IMy+nPZ2HO6dbVb0zSp/na5mly7dh2gJtfmTj+RgplnEJ/TvcdVNQcfbVBRoKbex9OzV/HFSjW/4/Bhudx4/lgy07rvuIOvdAtlc5/GX6omW6aMmEzWiVfgSk63WVlk2Vy5lZdWzmbNbjXROCc5i4tHz2Riv8NwOrpnAIAZClG++EtK3nyLhi0qItGVnEyfU2eQf9opeNK79+9cEzm0QUWYr9aW8sSsFVTX+UiMd3HlGSM56cjCbtuCMAI+qhe9TvWSd8A0cKVlkzPj5yQN6d459HY3VPDaqndYtE3li0uOS+Kc4TOYPmQqHlf3DHoxAgF2f/oZJbPfxrtTJTT2ZPQi/4zTyTv5JNxJSTYr1HR1tEFFiEZvgOfeWc1HX20DYMSgLG66cBx5Wd138mnT1jWUv/c0gcqdgIO0w08hc9rFOOMT7ZYWMep9Dcxe9z7vb/yMoBHE43Qz45BjOXPYdFLiuufvOtTUROmHH7Hj7Tn4K1UEakJerppce9w0nHHddzxVE120QUWA7zaV8+fXvmV3VRMet5PLZgzjjCmDcTm7Z6sp5G2gcv6L1K34GABPdl9yTr2ehL7CZmWRIxAK8P7Gz5m9bh4N/kYAJhdO4MJRZ5CTnGWzuoOHEQjQVLKDhqKtNG7dSkPRVurkBkINKh1T0oBCNbl20tE4XN07GlMTfbRBHUR8gRAvvbeOdxaocZfBfdP51UXjKcxLs1lZ5GhYv5TyD/5OqL4KnG4yjjmHXkefhaO7dmuZBou3LePV796lrKECgJG9BZeOOZtBmf1tVvfj8FdVKSMq2tpiSI3bi1vmLYWTOuxQ+p57NhmHje+23dUa+9EGdZDYuL2Kx1/9lu276nE6HZx//CFccOIhuF3dc2A8WFdJ+QfP0SiXAhDfV5BzynXE5fSzWVlkaPA3Iss3M2v1HDZXqW7bfun5XDrmLMbmjehSN2kjEKBxezGNRUU0NJtR0VYCNTVtbp+Ql0fSgEKSBw4gubCQ5IGFxOfmdqnvrOmaaIP6kQRDBrM+3sB/Pt6AYZj07Z3Cry4azyH9u2d5CNM0qFsxn8r5L2L4GnHEJZB57KWkHTYdRxePUjNNk6qmGoprd1JSW6p+6kopri2lxlvbsl1GYjoXjDyDaQOOwhnDqXlM08RfWalaRFuKaNiqjKixuERNmm2FKymJ5AGFJFkmlDxgAEn9++FK7L5jiJrYRhvUj2BbaS2Pv/otm4rVk+fMKYO57JRhxHfTBK/+ih2Uv/cM3m2qgFzSkMPInvFz3Glda35LyAixq6G8xYSaDWlH7S6agt4294lzeShIzePIfuM49ZDjiY+xnIEhn4/GbdvVONGWopYuumBd/Q83djpJLMhXraIBA5QpDSgkPidHt4o0MYU2qAMgZJi8u+B7Xpq3jkDQoHdGIjddOJ5RQ7rWjbqjmKEg1V++S/XCWZihAM6kNLJPupLk4ZNi+obmC/rZUbeLktqdFDe3iGpL2Vm/m5ARanOflLhkCtLyKEjLo6/1WpDWh+ykjJiYx2SaJr6yspZxooaiIhqLttK0s7TNVpE7JcUyokLLiKxWkS5joekCaIPqJKUVDfz5teWs2awGyE+c0J+rZo7s8glezWCAYG0ZgZoygtVlBGvKCNbsJlhTRqByJ6GGagBSRk8j6/if4kpKtVdwGHW+eqsl1GxCOymp20V5QyUmZpv7ZCVlKANKVQbUbEhpCdH9XqZpEmpoJFBXS6CmlmBtLYHaWgK1dQRqagjW1lmf1Tp/dU1LFvC9cDpJ6t9PmVFhYcuYUVxmZkw/RGg0+0MbVAcxTZMPl27j+Xe/o8kXoldqPDeeN5YJI/LsltYhjIBPmU61Mp1gbRmB6t0Ea8oJ1uxWUXj7wd2rN9kzriVp0JgoKd4b0zSpaKyyTGhny/hQSW0ptb42urEAl8NJXkpuS4uo2YTyU3NJiFD2cCMQIFBbR9AynEBtHcHaGstw9hjNHtOpwwy13ZrbF570NJKsrrnm7rmkvn31/CNNt0MbVAeorPXyxKwVLFu3C4BJo/O57pzRpKfETjeJ4WtUrZ1mA6rZ0woK1JRhNNbu/wAOJ+60bNzpObh75eBOy8GdnoOnV2+1LD3nR2cdDxohGv2NNASaaPA30hBopMEf/n7PusY21oXMH3ZhAcS74ylIzQ0zIdUiyk3J6XR9JdMwMHw+Qj4fhtdLyOsl5LXe+3wE6+r3mExNbVjLR7V0Qo2Nnb4uzoQEPOlpeNLUjzstTX1OTcWTbn1u/klPw52S0ulzaDRdEW1Q7bBwRQlPv7mSusYAyYkerj17NFPHFUS128Q0TQxvfUvXW6CmtQmVYXjbbkW04HLjTsvGk56DO733HiNKz8GT3htXama7BmSaJt6gr01D2ctwrHWNgSbq/Y00+puoDzTiC/p+1HVIi09R3XEpufRNyKJPfAa5cemkEo/p8ysTqfUS2l2L4dvNLq9PmY3Xi+H1EfLteQ01efes8/laTMjw+3+URpxOy0xS9xhLehru1NSW9y0mZG2nWz4aTdtE1aCEEE7gPuBKIBlYBFwjpdy6j+3HAU8BY4Fy4E9Syr9GSS4vzVvHrI9V0s/xoje/uGAsWenth9yapoHp92EEvJh+L0bAZ716935tc90PP4caqjH9Pxx3MIGgAwIOB6H4eMy0LIzUTMyUXhgpaRhJaRiJKYQSkgh64giEggSMAP5QAH/Ijz9Uhb98F4FdQetzgECoeX34ez9evxeftwFnyMQVMnEZ4DRM3CFwGXuW7f1qkm5AhrXMbUACbuvHSZzpIs50Emc68ZiOlm1c1jGdIQNH0MARCkEwhOErw/AVt5hII7DlYP7CLZzx8bgS4nHGJ+z9mhCPOyV1v60bV1KSrgqr0Rwkot2CuhW4CJgClACPAXOEEGOllHv13wgh0oD3gb8Bx6FM6j0hxA4p5RvREFtTWsyk9LWMH5pO3+wyihcto8jvI+j3Egz6CPn9BAI+QsEAwUCAUCiAEQwQMkKEANN0YAAGDgzTxMCBaSpjMUC9t7bBWoZhrcMBptmyjUkSOJyYJmCq1gwhE6epjMJpgHNnJU6jUr03zb1f93pv4jYhrtUydawfLnO13bMWUYzm67EP9jKRxATrc8IPzMWVkIAzIaFNw9lr+4RE9RoXpw1Go4kRom1Q1wIPSSklgBDiVmAXcAywoNW2ZwMh4F7LvL4UQvzAp8UQAAANfUlEQVQduB6IikFlr3+ZURvqcH4LVW0Eg7msnx6B04nT48HhduP0eHB63Dg8HmuZ+uz0eKxl7pbt1Lq9t1fbuXG6w19bH8MTdgzrnM1mok1Eo+kRRM2ghBDpQCGwrHmZlLJaCLEJ1TpqbVBjgOWtWlbLgKsjrbWZjPgM3EZdy2fDAabDgekA0+kAh0O9Oh2YDuvV6cThdFrLnTisV6zluJwq44LLhcNa5nA5cThd6tXlwuF04Wx5deJ0uXF5PLhcHtwej3rvjsPt8aibu8uJw+VW+7pcON0u67O13O1qWedwq+M63O7O7acNQaPRRJlotqCaM6ZWt1peHbau9fYd3TYiTP/D4xiBgLo5O516PolGo9FEkWgaVHOcc+vymr3C1rXePreD20YMp6drT8DVaDSarkrU+m2klDXAVuDw5mVWt99gYEUbu6wExlmRf80cto9tNRqNRtPNiPbAwjPALUKIQ4QQycBDwAZUuHlrZqNaeHcJIeKFEBNQ409PR02tRqPRaGwj2gb1MDALZUi7gYHAGVJKQwgxWQhRL4ToDyClrAVOBk5BjT29CfxeSvl6lDVrNBqNxgaiGmZuReTdYf20XrcQSGm1bDkwMTrqNBqNRhNL6NhhjUaj0cQk2qA0Go1GE5N092SxLoDS0lK7dWg0Go2mDcLuzz9IzNPdDaoPwCWXXGK3Do1Go9Hsnz7A9+ELurtBfQ1MBnai8vppNBqNJrZwoczp69YrHKbZdklsjUaj0WjsRAdJaDQajSYm0Qal0Wg0mphEG5RGo9FoYhJtUBqNRqOJSbRBaTQajSYm0Qal0Wg0mphEG5RGo9FoYhJtUBqNRqOJSbRBaTQajSYm6e6pjmIeq6T9fcCVQDKqmOM1UsqtbWx7FHA3cDiQCGwC7pNSzo6e4sjQmevQar/DgC+BL6SU0yKtM9J09joIIRKt7S8AMlBpvW6UUs6LjuLIcADX4RLgdqAQqAXeAG6TUvqio/jgI4S4EPgfYAyQKqV0tLP9QFTF8WOABuDvwN1Syi6bLki3oOznVuAiYAqQB2wD5lj/oK3JBP4DjAB6AfcDrwghJkRJayTpzHUAQAiRALwAfB4NgVGiw9dBCOEA3kL9PUyWUiYD04B1UVMbOTpzHcYALwK/B9KBScB04LdRUxsZqoC/ATe1t6EQwgX8F3Wd8lDX7RLg15EUGGl0C8p+rgUeklJKACHErcAu1FPQgvANpZTvtdr3TSHEHda2X0VBayTp8HUI435gPlCNujF3BzpzHU4EpgL9pJTlAFLK4ihqjSSduQ6DgEop5RvW561CiLnA2GiJjQRSyg8AhBDTOrD5ZGAIMElKWQ9IIcTDwC3AnyImMsLoFpSNCCHSUV0Sy5qXSSmrUV137f5zCSHygWHAykhpjAYHch2EEFOA04A7o6ExGhzAdTgO2AL8VghRKoQoEkI8IYRIiYrgCHEA1+EDYIsQ4kIhhEsIMRg4HejyXd+dYAywybpOzSwDBgoh0mzS9KPRBmUvzX841a2WV4etaxPrJjQbmCOlnB8BbdGkU9fB+u7/AK6WUjZGWFs06ezfQzbqAQVUK2IKMBF4NCLqokenroP1N/A88AzgQxnZElS3X08hjbavV/O6Lok2KHuptV7TWy3vFbbuB1hPmO+jBsQvj4y0qNLZ6/An4D0p5b66/roqnb0Odag6Z7dLKRullNuAh4AzIycxKnTqOgghfgI8iGo1xQH5KPP+VwQ1xhq1tH29mtd1SbRB2YiUsgbYiorKA1rMZzCwoq19hBBZqHGX7cB5Ukp/FKRGlAO4DicDlwshyoUQ5agB9UnW54HR0BwJDuA6fGu9hkdpddmIrWYO4DocDnwqpVwopTSklDuBZ4GZ0dAbI6wEhljXqZnDgC1Syi5rUDpIwn6eAW4RQnwClKCegDegwmr3QgiRB3yMCoi4SkppRFNohOnwdQCOYu+/3ZtRXVvnoVqVXZnOXIe3gD8C9wsh7gKyUGb9RhvbdjU6cx0WAk8LISaiphzkAD8HvomS1ohgReZ5UK3C5qhVAH8b//sLUeXSHxJC/BooQP0tPB0luRFBG5T9PIxqmi9iz3yPM6SUhhBiMjAPGG5131yDCikeCJwvhGg+xr+llNdGXfnBpcPXQUpZGr6jEKIW8HWTCLbOXId6IcRJwJNABWrM4XXgLnukH1Q6cx1mCSH6AP9E3Zgbgc+A62xRfvC4DPWdmmmyXo8VQmwG1gIzrJZjSAhxGsrYd7NnHlSXjeADXfJdo9FoNDGKHoPSaDQaTUyiDUqj0Wg0MYk2KI1Go9HEJNqgNBqNRhOTaIPSaDQaTUyiDUqj0Wg0MYk2KI1Gs0+EEE4hxHIhxLlhy0whxKU2avo/IURXzzeo6QB6oq6mS2CleLoNlb6muSjdeuA54BUpZfAgnmsTavLz7w7WMa3jPgcMiWRhRSHEx0CxlPKnB+mQVwAO4M2DdDwAhBB9Uem6jpVSftbJ3f8AbBBCPCWl3HwwdWliC92C0sQ8Qoh+qLxz56BuTuNRRemeB34DjLRPXeQRQjiEEB6bTv8r4NlYqsoqpSxB5aO83m4tmsiiM0loYh4hxBzgCEBYiUTD13mAOCllg/X+XlSKmBxU2YX7pJSvhG1vospoT0Rl/a4BnpJSPmit/wxVBDCcgajkpc+iajDlo3L+vQb8PrysuBDiBOAeVKLOACq56c8sTfe0Ou4VUsoX2vi+P0W1DE8EHkOlt5qJajE+ispF2AuVe+1hKeVL1n4vAD9pdbhjpZSfCSFyUfnsTgUSgFXAHfvLCC+EGAssBwqklDvClpuoKq9TUIl7qy0dfwnbJgVVUPJcVCl6CdwrpZwddoxwtkopB1jJfvf5HcOOfwXwgJSyz770a7o+ugWliWmEEJnAKcCTrc0JQEoZkFI2WB8fAK5G3TxHAv8G/i2EOL7VbvegqrKORZVpeCBsm7OBItRNso/1sx3VzbUbuBhVg+kmVPdXS8FEy5w+QCUpnQgciapJ5EHlRHsFVaeo+bj/2c9Xd6IM5WbgUFTxuRTgE2AGMAplmP8UQhxr7fNLVNLQWWHnWCyESAQ+BVKtfccB7wEfCSGa60m1xVSgJNycwrgHle9uHCpv3qNCiJnWdXAAc1BF9C5A/S6eBl4Lu87jrddzLJ1HWJ/b+47NLAXy2tGv6eLoMShNrDMEdbNeu7+NhBBJwC+AX0kpX7cWPyCEOAKVPDW8qON/pJR/t94/JYS4ATgBmC+lrBRChID61klp2TsJa5FVufV69rSM7gHmSSlvCttufZjGJlQm6tbHbQsH8Gsp5cKwZWXAd2Gfn7BM8WJUuYkaIYQfaAo/h9UiSwMuCBuru98yi2tQZtsWA1GZxNtirpTyCev9BiHEkaju1ndQxjYRyA17qHhWCHEUcCPqd1FmLa8M1yql/G5/3zFseXNi4EHAun1o1HRxtEFpYh1HB7cbgipL0LrL6nPgjlbLWtcU2gHktncCIcTVwFXAAFSGbTd790IcBtzeQb0d4etW508C/hdVmK8P6vvGs/eNuy2OAPKA6rAM+Fj7NrW5hyIR8O5j3ZJWn79Ada82ny8OKGl1vjhg4/6EduI7NutK3N/xNF0bbVCaWGcjYADDUSXuDwatizyatNPdLYQ4D3gKZUCfo6IIz0ONs0SCkJSytTk8ghqLuhk1ptOA6opsXUm1NU5UK+OsNtY17me/MuDoDqn94flq2NNtF057BTY7+h0zwzRquinaoDQxjdXlNg+4QQjxxL6CJFABET7UwP3qsE2mtvrcEfyAq9WyKcByKeVjYece0Gqbb4CTgL924ridYQrwspRylnV+J3AIsKudcywDLgdqpZS7O3G+b4FfCyE8UspAq3VHAX8L+3w0e7phl6ECHBKklPu69s1G1dZ1bu87ghqfCqGCODTdFG1Qmq7A9agupG+EEP+L6qLzo26StwA/kVKuEEL8FbhXCFGGKoF9Lupp/MROnm8LqoR8f1QLoxL1NH+lFQiwGjgNFVARzr3APCHEn4F/oAxzIrBESimt454nhBiBuuHWhUcAdgAJzBRCvAnUo1oZ+ex9896CKmg3GNWKqQFeRoWLz7Uq725AdWkeB6yTUr69j/M1d6sdhQq+COc0a+zuA1Qk3wWoFiWoIIePgdlCiFtREYMZKBPzWuN/5dZ3OEkIsQZVcLKqg98RYBqwqCuXM9e0j47i08Q8VjXh8cDbwO9QT/aLURF7j7CnhXQXqoron61llwKXSinn0znuQbUAJKoLqT/wf8BLqAqny1ERer9rpfNDVMThkagos69QYd/NrY/nUeNKi63jXtRJXb9Chbt/igo0KOGH5d0fRd38V1rnmGR1FU5FtWz+iTKo2cAE63htYhnGa6gQ+db8ARVYshIVyXirlPItaz8TOMM6x+OoQJG5qBD3761tDFS4//mogIfmllC739GKErwY9TvRdGP0PCiNRrNPhBBDUKY6Yh/h5lFHCHE+cDcwVkoZsluPJnLoFpRGo9knUspNqFD0gXZrCSMeNclZm1M3R7egNBqNRhOT6BaURqPRaGISbVAajUajiUm0QWk0Go0mJtEGpdFoNJqYRBuURqPRaGISbVAajUajiUn+HxUnVq15WSNzAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gQyWDQh_r12u" + }, + "source": [ + "We can also plot one line for each value of `beta`, although there are a lot of them." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "Vlxg9NZcr12u", + "outputId": "03f8dda2-2cac-43dd-b802-0036733f6a71" + }, + "source": [ + "plt.figure(figsize=(7, 4))\n", + "\n", + "\n", + "for beta in [1.1, 0.9, 0.7, 0.5, 0.3]:\n", + " label = 'beta = ' + str(beta)\n", + " plot(frame.row[beta], label=label)\n", + " \n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Fraction infected')\n", + "\n", + "plt.legend(bbox_to_anchor=(1.02, 1.02))\n", + "plt.tight_layout()\n" + ], + "execution_count": 21, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-sI2kU02r12v" + }, + "source": [ + "It's often useful to separate the code that generates results from the code that plots the results, so we can run the simulations once, save the results, and then use them for different analysis, visualization, etc.\n", + "\n", + "After running `sweep_parameters`, we have a `SweepFrame` with one row for each value of `beta` and one column for each value of `gamma`." + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "UbiN4K46r12w", + "outputId": "b4855176-2450-40f3-91d0-e38b3589edef" + }, + "source": [ + "contour(frame)\n", + "\n", + "decorate(xlabel='Recovery rate (gamma)',\n", + " ylabel='Contact rate (beta)',\n", + " title='Fraction infected, contour plot')" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "rYrbymbTr12w" + }, + "source": [ + "" + ], + "execution_count": 22, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/colab/chap14.ipynb b/colab/chap14.ipynb index c8522091a..cd1e7ab78 100644 --- a/colab/chap14.ipynb +++ b/colab/chap14.ipynb @@ -1,487 +1,826 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Chapter 14" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "tags": [] - }, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# check if the libraries we need are installed\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint\n", - " import pint\n", - " \n", - "try:\n", - " from modsim import *\n", - "except ImportError:\n", - " !pip install modsimpy\n", - " from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Code from previous chapters" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "def make_system(beta, gamma):\n", - " \"\"\"Make a system object for the SIR model.\n", - " \n", - " beta: contact rate in days\n", - " gamma: recovery rate in days\n", - " \n", - " returns: System object\n", - " \"\"\"\n", - " init = State(S=89, I=1, R=0)\n", - " init /= np.sum(init)\n", - "\n", - " t0 = 0\n", - " t_end = 7 * 14\n", - "\n", - " return System(init=init, t0=t0, t_end=t_end,\n", - " beta=beta, gamma=gamma)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def update_func(state, t, system):\n", - " \"\"\"Update the SIR model.\n", - " \n", - " state: State (s, i, r)\n", - " t: time\n", - " system: System object\n", - " \n", - " returns: State (sir)\n", - " \"\"\"\n", - " s, i, r = state\n", - "\n", - " infected = system.beta * i * s \n", - " recovered = system.gamma * i\n", - " \n", - " s -= infected\n", - " i += infected - recovered\n", - " r += recovered\n", - " \n", - " return State(S=s, I=i, R=r)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Runs a simulation of the system.\n", - " \n", - " system: System object\n", - " update_func: function that updates state\n", - " \n", - " returns: TimeFrame\n", - " \"\"\"\n", - " init, t0, t_end = system.init, system.t0, system.t_end\n", - " \n", - " frame = TimeFrame(columns=init.index)\n", - " frame.row[t0] = init\n", - " \n", - " for t in linrange(t0, t_end):\n", - " frame.row[t+1] = update_func(frame.row[t], t, system)\n", - " \n", - " return frame" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "def calc_total_infected(results):\n", - " \"\"\"Fraction of population infected during the simulation.\n", - " \n", - " results: DataFrame with columns S, I, R\n", - " \n", - " returns: fraction of population\n", - " \"\"\"\n", - " return get_first_value(results.S) - get_last_value(results.S)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_beta(beta_array, gamma):\n", - " \"\"\"Sweep a range of values for beta.\n", - " \n", - " beta_array: array of beta values\n", - " gamma: recovery rate\n", - " \n", - " returns: SweepSeries that maps from beta to total infected\n", - " \"\"\"\n", - " sweep = SweepSeries()\n", - " for beta in beta_array:\n", - " system = make_system(beta, gamma)\n", - " results = run_simulation(system, update_func)\n", - " sweep[system.beta] = calc_total_infected(results)\n", - " return sweep" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "def sweep_parameters(beta_array, gamma_array):\n", - " \"\"\"Sweep a range of values for beta and gamma.\n", - " \n", - " beta_array: array of infection rates\n", - " gamma_array: array of recovery rates\n", - " \n", - " returns: SweepFrame with one row for each beta\n", - " and one column for each gamma\n", - " \"\"\"\n", - " frame = SweepFrame(columns=gamma_array)\n", - " for gamma in gamma_array:\n", - " frame[gamma] = sweep_beta(beta_array, gamma)\n", - " return frame" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Contact number" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", - "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", - "frame = sweep_parameters(beta_array, gamma_array)\n", - "frame.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "frame.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " print(beta, gamma, frac_infected)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_sweep_frame(frame):\n", - " \"\"\"Plot the values from a SweepFrame.\n", - " \n", - " For each (beta, gamma), compute the contact number,\n", - " beta/gamma\n", - " \n", - " frame: SweepFrame with one row per beta, one column per gamma\n", - " \"\"\"\n", - " for gamma in frame.columns:\n", - " column = frame[gamma]\n", - " for beta in column.index:\n", - " frac_infected = column[beta]\n", - " plot(beta/gamma, frac_infected, 'ro')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's what it looks like:" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "plot_sweep_frame(frame)\n", - "\n", - "decorate(xlabel='Contact number (beta/gamma)',\n", - " ylabel='Fraction infected')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n", - "\n", - "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "s_inf_array = linspace(0.0001, 0.9999, 101);" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "c_array = log(s_inf_array) / (s_inf_array - 1);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`total_infected` is the change in $s$ from the beginning to the end." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "frac_infected = 1 - s_inf_array\n", - "frac_infected_series = Series(frac_infected, index=c_array);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can plot the analytic results and compare them to the simulations." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "plot_sweep_frame(frame)\n", - "plot(frac_infected_series, label='Analysis')\n", - "\n", - "decorate(xlabel='Contact number (c)',\n", - " ylabel='Fraction infected')\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The agreement is generally good, except for values of `c` less than 1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercises" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", - "\n", - "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", - "\n", - "What do the results look like, and what does that imply? " - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", - "\n", - "What is your best estimate of `c`?\n", - "\n", - "Hint: if you print `frac_infected_series`, you can read off the answer. " - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.9" + }, + "colab": { + "name": "chap14.ipynb", + "provenance": [] + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "ldCqTSAtYi0P" + }, + "source": [ + "# Chapter 14" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "id": "tfLqgaqMYi0Y" + }, + "source": [ + "*Modeling and Simulation in Python* Chun San Yip Final Exam\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "DrI2kU7dYi0g" + }, + "source": [ + "# check if the libraries we need are installed\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint\n", + " import pint\n", + " \n", + "try:\n", + " from modsim import *\n", + "except ImportError:\n", + " !pip install modsimpy\n", + " from modsim import *" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tA6p4KUBYi0k" + }, + "source": [ + "### Code from previous chapters" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "jT2NtFYcYi0l" + }, + "source": [ + "def make_system(beta, gamma):\n", + " \"\"\"Make a system object for the SIR model.\n", + " \n", + " beta: contact rate in days\n", + " gamma: recovery rate in days\n", + " \n", + " returns: System object\n", + " \"\"\"\n", + " init = State(S=89, I=1, R=0)\n", + " init /= np.sum(init)\n", + "\n", + " t0 = 0\n", + " t_end = 7 * 14\n", + "\n", + " return System(init=init, t0=t0, t_end=t_end,\n", + " beta=beta, gamma=gamma)" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "HFiSQ6EfYi0n" + }, + "source": [ + "def update_func(state, t, system):\n", + " \"\"\"Update the SIR model.\n", + " \n", + " state: State (s, i, r)\n", + " t: time\n", + " system: System object\n", + " \n", + " returns: State (sir)\n", + " \"\"\"\n", + " s, i, r = state\n", + "\n", + " infected = system.beta * i * s \n", + " recovered = system.gamma * i\n", + " \n", + " s -= infected\n", + " i += infected - recovered\n", + " r += recovered\n", + " \n", + " return State(S=s, I=i, R=r)" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "zpqWezbyYi0p" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Runs a simulation of the system.\n", + " \n", + " system: System object\n", + " update_func: function that updates state\n", + " \n", + " returns: TimeFrame\n", + " \"\"\"\n", + " init, t0, t_end = system.init, system.t0, system.t_end\n", + " \n", + " frame = TimeFrame(columns=init.index)\n", + " frame.row[t0] = init\n", + " \n", + " for t in linrange(t0, t_end):\n", + " frame.row[t+1] = update_func(frame.row[t], t, system)\n", + " \n", + " return frame" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "Hme1Weg2Yi0q" + }, + "source": [ + "def calc_total_infected(results):\n", + " \"\"\"Fraction of population infected during the simulation.\n", + " \n", + " results: DataFrame with columns S, I, R\n", + " \n", + " returns: fraction of population\n", + " \"\"\"\n", + " return get_first_value(results.S) - get_last_value(results.S)" + ], + "execution_count": 5, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "wzCL0guZYi0s" + }, + "source": [ + "def sweep_beta(beta_array, gamma):\n", + " \"\"\"Sweep a range of values for beta.\n", + " \n", + " beta_array: array of beta values\n", + " gamma: recovery rate\n", + " \n", + " returns: SweepSeries that maps from beta to total infected\n", + " \"\"\"\n", + " sweep = SweepSeries()\n", + " for beta in beta_array:\n", + " system = make_system(beta, gamma)\n", + " results = run_simulation(system, update_func)\n", + " sweep[system.beta] = calc_total_infected(results)\n", + " return sweep" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "1D5HvcS7Yi0v" + }, + "source": [ + "def sweep_parameters(beta_array, gamma_array):\n", + " \"\"\"Sweep a range of values for beta and gamma.\n", + " \n", + " beta_array: array of infection rates\n", + " gamma_array: array of recovery rates\n", + " \n", + " returns: SweepFrame with one row for each beta\n", + " and one column for each gamma\n", + " \"\"\"\n", + " frame = SweepFrame(columns=gamma_array)\n", + " for gamma in gamma_array:\n", + " frame[gamma] = sweep_beta(beta_array, gamma)\n", + " return frame" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "f2B1a3jiYi0x" + }, + "source": [ + "### Contact number" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PoFEkAv8Yi0y" + }, + "source": [ + "Here's the `SweepFrame` from the previous chapter, with one row for each value of `beta` and one column for each value of `gamma`." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 + }, + "id": "vdxwlnoEYi0z", + "outputId": "50c60d69-f8bf-412f-eb0a-97660aca8f5f" + }, + "source": [ + "beta_array = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 , 1.1]\n", + "gamma_array = [0.2, 0.4, 0.6, 0.8]\n", + "frame = sweep_parameters(beta_array, gamma_array)\n", + "frame.head()" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0.20.40.60.8
0.10.0107560.0036420.0021910.001567
0.20.1189840.0107630.0054470.003644
0.30.5890950.0301850.0107710.006526
0.40.8013390.1315630.0209170.010780
0.50.8965770.3964090.0461400.017640
\n", + "
" + ], + "text/plain": [ + " 0.2 0.4 0.6 0.8\n", + "0.1 0.010756 0.003642 0.002191 0.001567\n", + "0.2 0.118984 0.010763 0.005447 0.003644\n", + "0.3 0.589095 0.030185 0.010771 0.006526\n", + "0.4 0.801339 0.131563 0.020917 0.010780\n", + "0.5 0.896577 0.396409 0.046140 0.017640" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 8 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-QXyeAb2Yi0z" + }, + "source": [ + "" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vgJh_tfOYi00", + "outputId": "229a8d16-0140-41c6-bd3c-ea04b915545b" + }, + "source": [ + "frame.shape" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(11, 4)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 9 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uFvTM1UeYi00" + }, + "source": [ + "The following loop shows how we can loop through the columns and rows of the `SweepFrame`. With 11 rows and 4 columns, there are 44 elements." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "r7rub0N4Yi00", + "outputId": "c4ddb5f9-2d2c-46cb-ea22-8a500538c63e" + }, + "source": [ + "for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " print(beta, gamma, frac_infected)" + ], + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.1 0.2 0.010756340768063644\n", + "0.2 0.2 0.11898421353185373\n", + "0.3 0.2 0.5890954199973404\n", + "0.4 0.2 0.8013385277185551\n", + "0.5 0.2 0.8965769637207062\n", + "0.6 0.2 0.942929291399791\n", + "0.7 0.2 0.966299311298026\n", + "0.8 0.2 0.9781518959989762\n", + "0.9 0.2 0.9840568957948106\n", + "1.0 0.2 0.9868823507202488\n", + "1.1 0.2 0.988148177093735\n", + "0.1 0.4 0.0036416926514175607\n", + "0.2 0.4 0.010763463373360094\n", + "0.3 0.4 0.030184952469116566\n", + "0.4 0.4 0.131562924303259\n", + "0.5 0.4 0.3964094037932606\n", + "0.6 0.4 0.5979016626615987\n", + "0.7 0.4 0.7284704154876106\n", + "0.8 0.4 0.8144604459153759\n", + "0.9 0.4 0.8722697237137128\n", + "1.0 0.4 0.9116692168795855\n", + "1.1 0.4 0.9386802509510287\n", + "0.1 0.6 0.002190722188881611\n", + "0.2 0.6 0.005446688837466351\n", + "0.3 0.6 0.010771139974975585\n", + "0.4 0.6 0.020916599304195316\n", + "0.5 0.6 0.04614035896610047\n", + "0.6 0.6 0.13288938996079536\n", + "0.7 0.6 0.3118432512847451\n", + "0.8 0.6 0.47832565854255393\n", + "0.9 0.6 0.605687582114665\n", + "1.0 0.6 0.7014254793376209\n", + "1.1 0.6 0.7738176405451065\n", + "0.1 0.8 0.0015665254038139675\n", + "0.2 0.8 0.003643953969662994\n", + "0.3 0.8 0.006526163529085194\n", + "0.4 0.8 0.010779807499500693\n", + "0.5 0.8 0.017639902596349066\n", + "0.6 0.8 0.030291868201986594\n", + "0.7 0.8 0.05882382948158804\n", + "0.8 0.8 0.13358889291095588\n", + "0.9 0.8 0.2668895539427739\n", + "1.0 0.8 0.40375121210421994\n", + "1.1 0.8 0.519583469821867\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RhFgMlb5Yi01" + }, + "source": [ + "Now we can wrap that loop in a function and plot the results. For each element of the `SweepFrame`, we have `beta`, `gamma`, and `frac_infected`, and we plot `beta/gamma` on the x-axis and `frac_infected` on the y-axis." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "MLOiE2bBYi01" + }, + "source": [ + "def plot_sweep_frame(frame):\n", + " \"\"\"Plot the values from a SweepFrame.\n", + " \n", + " For each (beta, gamma), compute the contact number,\n", + " beta/gamma\n", + " \n", + " frame: SweepFrame with one row per beta, one column per gamma\n", + " \"\"\"\n", + " for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " plot(beta/gamma, frac_infected, 'ro')" + ], + "execution_count": 11, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TLrzCoKmYi02" + }, + "source": [ + "Here's what it looks like:" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "__rnPcYFYi02", + "outputId": "7f00d532-8d90-4c84-f545-e83cb33ed8af" + }, + "source": [ + "plot_sweep_frame(frame)\n", + "\n", + "decorate(xlabel='Contact number (beta/gamma)',\n", + " ylabel='Fraction infected')\n", + "\n" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WLoGTh-hYi02" + }, + "source": [ + "It turns out that the ratio `beta/gamma`, called the \"contact number\" is sufficient to predict the total number of infections; we don't have to know `beta` and `gamma` separately.\n", + "\n", + "We can see that in the previous plot: when we plot the fraction infected versus the contact number, the results fall close to a curve." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TphjxSEYYi02" + }, + "source": [ + "### Analysis" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xtRlpGlLYi03" + }, + "source": [ + "In the book we figured out the relationship between $c$ and $s_{\\infty}$ analytically. Now we can compute it for a range of values:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Hwj_h57wYi03" + }, + "source": [ + "s_inf_array = linspace(0.0001, 0.9999, 101);" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "1A7FhZgaYi03" + }, + "source": [ + "c_array = log(s_inf_array) / (s_inf_array - 1);" + ], + "execution_count": 14, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "J62MuR9QYi04" + }, + "source": [ + "`total_infected` is the change in $s$ from the beginning to the end." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qJUEwS0yYi04" + }, + "source": [ + "frac_infected = 1 - s_inf_array\n", + "frac_infected_series = Series(frac_infected, index=c_array);" + ], + "execution_count": 15, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yTi29MB-Yi05" + }, + "source": [ + "Now we can plot the analytic results and compare them to the simulations." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "Lo760tC_Yi05", + "outputId": "bf39504d-a58e-4dcf-e698-4f97f9c794ba" + }, + "source": [ + "plot_sweep_frame(frame)\n", + "plot(frac_infected_series, label='Analysis')\n", + "\n", + "decorate(xlabel='Contact number (c)',\n", + " ylabel='Fraction infected')\n", + "\n" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "uw-lv1lbYi05" + }, + "source": [ + "The agreement is generally good, except for values of `c` less than 1." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aYp7D_zZYi05" + }, + "source": [ + "## Exercises" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aOoOytyUYi06" + }, + "source": [ + "**Exercise:** If we didn't know about contact numbers, we might have explored other possibilities, like the difference between `beta` and `gamma`, rather than their ratio.\n", + "\n", + "Write a version of `plot_sweep_frame`, called `plot_sweep_frame_difference`, that plots the fraction infected versus the difference `beta-gamma`.\n", + "\n", + "What do the results look like, and what does that imply? " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "sNpeVH71Yi06" + }, + "source": [ + "def plot_sweep_frame_difference(frame):\n", + " \"\"\"Plot the values from a SweepFrame.\n", + " \n", + " For each (beta, gamma), compute the contact number,\n", + " beta/gamma\n", + " \n", + " frame: SweepFrame with one row per beta, one column per gamma\n", + " \"\"\"\n", + " for gamma in frame.columns:\n", + " column = frame[gamma]\n", + " for beta in column.index:\n", + " frac_infected = column[beta]\n", + " plot(beta-gamma, frac_infected, 'ro')" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "cBAe2QP-Yi07", + "outputId": "b00a9fec-5be7-462b-b622-cca30cd00d47" + }, + "source": [ + "plot_sweep_frame_difference(frame)\n", + "\n", + "decorate(xlabel='Difference (beta-gamma)',\n", + " ylabel='Fraction infected')" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Znoxq-U9Yi07" + }, + "source": [ + "" + ], + "execution_count": 18, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oZoJ2q0dYi07" + }, + "source": [ + "**Exercise:** Suppose you run a survey at the end of the semester and find that 26% of students had the Freshman Plague at some point.\n", + "\n", + "What is your best estimate of `c`?\n", + "\n", + "Hint: if you print `frac_infected_series`, you can read off the answer. " + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true, + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Tj1lfhKPYi08", + "outputId": "859af73c-ea96-4cc9-8ae8-0844610caa32" + }, + "source": [ + "print(frac_infected_series.iloc[70:80])" + ], + "execution_count": 19, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.188948 0.300040\n", + "1.181034 0.290042\n", + "1.173263 0.280044\n", + "1.165630 0.270046\n", + "1.158132 0.260048\n", + "1.150765 0.250050\n", + "1.143524 0.240052\n", + "1.136407 0.230054\n", + "1.129409 0.220056\n", + "1.122527 0.210058\n", + "dtype: float64\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "H4CcoZ7fYi08" + }, + "source": [ + "The best estimate of c is 1.158" + ], + "execution_count": 20, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "B-LtYTdjYi08" + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/examples/queue.ipynb b/examples/queue.ipynb index eed8b76c1..869878818 100644 --- a/examples/queue.ipynb +++ b/examples/queue.ipynb @@ -1,592 +1,1153 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# One Queue or Two" - ] + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + }, + "colab": { + "name": "queue.ipynb", + "provenance": [] + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "*Modeling and Simulation in Python*\n", - "\n", - "Copyright 2021 Allen Downey\n", - "\n", - "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# install Pint if necessary\n", - "\n", - "try:\n", - " import pint\n", - "except ImportError:\n", - " !pip install pint" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# download modsim.py if necessary\n", - "\n", - "from os.path import exists\n", - "\n", - "filename = 'modsim.py'\n", - "if not exists(filename):\n", - " from urllib.request import urlretrieve\n", - " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", - " local, _ = urlretrieve(url+filename, filename)\n", - " print('Downloaded ' + local)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# import functions from modsim\n", - "\n", - "from modsim import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", - "\n", - "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n", - "\n", - "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", - "\n", - "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", - "\n", - "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", - "\n", - "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## One server, one queue\n", - "\n", - "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. " - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test this function by creating a `System` object with `lam=1/8` and `mu=1/5`." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n", - "\n", - "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n", - "\n", - "It should return the total number of customers at the end of the time step." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your function by calling it with `x=1`, `t=0`, and the `System` object you created. If you run it a few times, you should see different results." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can run the simulation. Here's a version of `run_simulation` that creates a `TimeSeries` with the total number of customers in the store, including the one checking out." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "def run_simulation(system, update_func):\n", - " \"\"\"Simulate a queueing system.\n", - " \n", - " system: System object\n", - " update_func: function object\n", - " \"\"\"\n", - " x = 0\n", - " results = TimeSeries()\n", - " results[0] = x\n", - " \n", - " for t in linrange(0, system.duration):\n", - " x = update_func(x, t, system)\n", - " results[t+1] = x\n", - "\n", - " return results" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call `run_simulation` with your update function and plot the results." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After the simulation, we can compute `L`, which is the average number of customers in the system, and `W`, which is the average time customers spend in the store. `L` and `W` are related by Little's Law:\n", - "\n", - "$L = \\lambda W$\n", - "\n", - "Where $\\lambda$ is the arrival rate. Here's a function that computes them." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "def compute_metrics(results, system):\n", - " \"\"\"Compute average number of customers and wait time.\n", - " \n", - " results: TimeSeries of queue lengths\n", - " system: System object\n", - " \n", - " returns: L, W\n", - " \"\"\"\n", - " L = results.mean()\n", - " W = L / system.lam\n", - " return L, W" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call `compute_metrics` with the results from your simulation." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Parameter sweep\n", - "\n", - "Since we don't know the actual value of $\\lambda$, we can sweep through a range of possibilities, from 10% to 80% of the completion rate, $\\mu$. (If customers arrive faster than the completion rate, the queue grows without bound. In that case the metrics `L` and `W` just depend on how long the store is open.)\n", - "\n", - "Create an array of values for `lam`." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write a function that takes an array of values for `lam`, a single value for `mu`, and an update function.\n", - "\n", - "For each value of `lam`, it should run a simulation, compute `L` and `W`, and store the value of `W` in a `SweepSeries`.\n", - "\n", - "It should return the `SweepSeries`." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Call your function to generate a `SweepSeries`, and plot it." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we imagine that this range of values represents arrival rates on different days, we can use the average value of `W`, for a range of values of `lam`, to compare different queueing strategies." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis\n", - "\n", - "The model I chose for this system is a common model in queueing theory, in part because many of its properties can be derived analytically.\n", - "\n", - "In particular, we can derive the average time in the store as a function of $\\mu$ and $\\lambda$:\n", - "\n", - "$W = 1 / (\\mu - \\lambda)$\n", - "\n", - "The following function plots the theoretical value of $W$ as a function of $\\lambda$." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_W(lam_array, mu):\n", - " \"\"\"Plot the theoretical mean wait time.\n", - " \n", - " lam_array: array of values for `lam`\n", - " mu: probability of finishing a checkout\n", - " \"\"\"\n", - " W_array = 1 / (mu - lam_array)\n", - " W_series = make_series(lam_array, W_array)\n", - " W_series.plot(style='-', label='analysis')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use this function to plot the theoretical results, then plot your simulation results again on the same graph. How do they compare?" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Multiple servers\n", - "\n", - "Now let's try the other two queueing strategies:\n", - "\n", - "1. One queue with two checkout counters.\n", - "2. Two queues, one for each counter.\n", - "\n", - "The following figure shows the three scenarios:\n", - "\n", - "![](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", - "\n", - "Write an update function for one queue with two servers." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use this update function to simulate the system, plot the results, and print the metrics." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since we have two checkout counters now, we can consider values for $\\lambda$ that exceed $\\mu$.\n", - "\n", - "Create a new array of values for `lam` from 10% to 160% of `mu`." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Use your sweep function to simulate the two server, one queue scenario with a range of values for `lam`.\n", - "\n", - "Plot the results and print the average value of `W` across all values of `lam`." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Multiple queues\n", - "\n", - "To simulate the scenario with two separate queues, we need two state variables to keep track of customers in each queue.\n", - "\n", - "Write an update function that takes `x1`, `x2`, `t`, and `system` as parameters and returns `x1` and `x2` as return values. f you are not sure how to return more than one return value, see `compute_metrics`.\n", - "\n", - "When a customer arrives, which queue do they join?" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Write a version of `run_simulation` that works with this update function." - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Test your functions by running a simulation with a single value of `lam`." - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Sweep a range of values for `lam`, plot the results, and print the average wait time across all values of `lam`.\n", - "\n", - "How do the results compare to the scenario with two servers and one queue." - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution goes here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "rTR10W46fb5B" + }, + "source": [ + "# One Queue or Two" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aN5sgJ2Efb5G" + }, + "source": [ + "*Modeling and Simulation in Python*\n", + "\n", + "Copyright 2021 Allen Downey\n", + "\n", + "License: [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "28lKMv5bfb5N" + }, + "source": [ + "# install Pint if necessary\n", + "\n", + "try:\n", + " import pint\n", + "except ImportError:\n", + " !pip install pint" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "OI4qD7p7fb5Q" + }, + "source": [ + "# download modsim.py if necessary\n", + "\n", + "from os.path import exists\n", + "\n", + "filename = 'modsim.py'\n", + "if not exists(filename):\n", + " from urllib.request import urlretrieve\n", + " url = 'https://raw.githubusercontent.com/AllenDowney/ModSim/main/'\n", + " local, _ = urlretrieve(url+filename, filename)\n", + " print('Downloaded ' + local)" + ], + "execution_count": 2, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "tags": [], + "id": "TxjXc0FKfb5S" + }, + "source": [ + "# import functions from modsim\n", + "\n", + "from modsim import *\n", + "import matplotlib.pyplot as plt\n" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "syF1fguXfb5U" + }, + "source": [ + "This notebook presents a case study from *Modeling and Simulation in Python*. It explores a question related to queueing theory, which is the study of systems that involve waiting in lines, also known as \"queues\".\n", + "\n", + "Suppose you are designing the checkout area for a new store. There is room for two checkout counters and a waiting area for customers. You can make two lines, one for each counter, or one line that serves both counters.\n", + "\n", + "In theory, you might expect a single line to be better, but it has some practical drawbacks: in order to maintain a single line, you would have to install rope barriers, and customers might be put off by what seems to be a longer line, even if it moves faster.\n", + "\n", + "So you'd like to check whether the single line is really better and by how much. Simulation can help answer this question." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Ia5gtH1gfb5V" + }, + "source": [ + "As we did in the bikeshare model, we'll assume that a customer is equally likely to arrive during any timestep. I'll denote this probability using the Greek letter lambda, $\\lambda$, or the variable name `lam`. The value of $\\lambda$ probably varies from day to day, so we'll have to consider a range of possibilities.\n", + "\n", + "Based on data from other stores, you know that it takes 5 minutes for a customer to check out, on average. But checkout times are highly variable: most customers take less than 5 minutes, but some take substantially more. A simple way to model this variability is to assume that when a customer is checking out, they have the same probability of finishing up during each time step. I'll denote this probability using the Greek letter mu, $\\mu$, or the variable name `mu`.\n", + "\n", + "If we choose $\\mu=1/5$, the average number of time steps for each checkout will be 5 minutes, which is consistent with the data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KXZB-uW_fb5X" + }, + "source": [ + "## One server, one queue\n", + "\n", + "Write a function called `make_system` that takes `lam` and `mu` as parameters and returns a `System` object with variables `lam`, `mu`, and `duration`. Set `duration`, which is the number of time steps to simulate, to 10 hours, expressed in minutes. " + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xo2kZ003fb5Y" + }, + "source": [ + "def make_system(lam, mu):\n", + " \"\"\" lam - a customer arrival rate\n", + " mu - process rate\"\"\"\n", + "\n", + " return System(lam=lam, mu=mu, duration=600)" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lC_ASxZRfb5a" + }, + "source": [ + "Test this function by creating a `System` object with `lam=1/8` and `mu=1/5`." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "jwwsXSkbfb5b", + "outputId": "d92179de-55ba-49e8-f27e-4b5fa081a779" + }, + "source": [ + "interarrival_time = 8\n", + "service_time = 5\n", + "\n", + "lam = 1/interarrival_time\n", + "mu = 1/service_time\n", + "\n", + "system1 = make_system(lam=lam, mu=mu)\n", + "system1" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "System(duration=600, lam=0.125, mu=0.2)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "YntObvyvfb5c" + }, + "source": [ + "Write an update function that takes as parameters `x`, which is the total number of customer in the store, including the one checking out; `t`, which is the number of minutes that have elapsed in the simulation, and `system`, which is a `System` object.\n", + "\n", + "If there's a customer checking out, it should use `flip` to decide whether they are done. And it should use `flip` to decide if a new customer has arrived.\n", + "\n", + "It should return the total number of customers at the end of the time step." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "dqlrPfpxfb5c" + }, + "source": [ + "def update_func(x, t, system):\n", + "\n", + " \"\"\" Check if the customers are done at check out\"\"\"\n", + " if x > 0:\n", + " if flip(system.mu):\n", + " x -= 1\n", + " \n", + " if flip(system.lam):\n", + " x += 1\n", + "\n", + " return x" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JCpd9NEafb5e" + }, + "source": [ + "Test your function by calling it with `x=1`, `t=0`, and the `System` object you created. If you run it a few times, you should see different results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "V5kLW5Zlfb5g", + "outputId": "c3c44903-3022-4a8e-e8d2-3279af1816fa" + }, + "source": [ + "update_func(1,0,system1)" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KucbdBmAfb5h" + }, + "source": [ + "Now we can run the simulation. Here's a version of `run_simulation` that creates a `TimeSeries` with the total number of customers in the store, including the one checking out." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "pxDUTd1Ifb5j" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate a queueing system.\n", + " \n", + " system: System object\n", + " update_func: function object\n", + " \"\"\"\n", + " x = 0\n", + " results = TimeSeries()\n", + " results[0] = x\n", + " \n", + " for t in linrange(0, system.duration):\n", + " x = update_func(x, t, system)\n", + " results[t+1] = x\n", + "\n", + " return results" + ], + "execution_count": 8, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "DmYMhFCWfb5j" + }, + "source": [ + "Call `run_simulation` with your update function and plot the results." + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "id": "58daXIAtfb5j", + "outputId": "fc952943-f036-4631-a35b-5a022de76715" + }, + "source": [ + "results1 = run_simulation(system1, update_func)\n", + "#results1.plot(label='results1')\n", + "plt.plot(results1, label='label')\n", + "decorate(title='Customer Checkout',\n", + " xlabel='Time (mins)',\n", + " ylabel='Number of customer')" + ], + "execution_count": 9, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JzGms4B1fb5j" + }, + "source": [ + "After the simulation, we can compute `L`, which is the average number of customers in the system, and `W`, which is the average time customers spend in the store. `L` and `W` are related by Little's Law:\n", + "\n", + "$L = \\lambda W$\n", + "\n", + "Where $\\lambda$ is the arrival rate. Here's a function that computes them." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "oL9Zv9UIfb5k" + }, + "source": [ + "def compute_metrics(results, system):\n", + " \"\"\"Compute average number of customers and wait time.\n", + " \n", + " results: TimeSeries of queue lengths\n", + " system: System object\n", + " \n", + " returns: L, W\n", + " \"\"\"\n", + " L = results.mean()\n", + " W = L / system.lam\n", + " return L, W" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E_F8wnVFfb5k" + }, + "source": [ + "Call `compute_metrics` with the results from your simulation." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CxSbMgtPfb5k", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "d570123a-14da-4714-ae9b-7889e4805573" + }, + "source": [ + "L, W = compute_metrics(results1, system1)\n", + "print(L,W)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "1.323920265780731 10.591362126245848\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mVan5hCGfb5l" + }, + "source": [ + "### Parameter sweep\n", + "\n", + "Since we don't know the actual value of $\\lambda$, we can sweep through a range of possibilities, from 10% to 80% of the completion rate, $\\mu$. (If customers arrive faster than the completion rate, the queue grows without bound. In that case the metrics `L` and `W` just depend on how long the store is open.)\n", + "\n", + "Create an array of values for `lam`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "313vn1h4fb5m", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "59487a31-07d9-4775-f3b2-f4341631f918" + }, + "source": [ + "lam_array = linspace(0.1*mu, 0.8*mu, 101)\n", + "lam_array" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.02 , 0.0214, 0.0228, 0.0242, 0.0256, 0.027 , 0.0284, 0.0298,\n", + " 0.0312, 0.0326, 0.034 , 0.0354, 0.0368, 0.0382, 0.0396, 0.041 ,\n", + " 0.0424, 0.0438, 0.0452, 0.0466, 0.048 , 0.0494, 0.0508, 0.0522,\n", + " 0.0536, 0.055 , 0.0564, 0.0578, 0.0592, 0.0606, 0.062 , 0.0634,\n", + " 0.0648, 0.0662, 0.0676, 0.069 , 0.0704, 0.0718, 0.0732, 0.0746,\n", + " 0.076 , 0.0774, 0.0788, 0.0802, 0.0816, 0.083 , 0.0844, 0.0858,\n", + " 0.0872, 0.0886, 0.09 , 0.0914, 0.0928, 0.0942, 0.0956, 0.097 ,\n", + " 0.0984, 0.0998, 0.1012, 0.1026, 0.104 , 0.1054, 0.1068, 0.1082,\n", + " 0.1096, 0.111 , 0.1124, 0.1138, 0.1152, 0.1166, 0.118 , 0.1194,\n", + " 0.1208, 0.1222, 0.1236, 0.125 , 0.1264, 0.1278, 0.1292, 0.1306,\n", + " 0.132 , 0.1334, 0.1348, 0.1362, 0.1376, 0.139 , 0.1404, 0.1418,\n", + " 0.1432, 0.1446, 0.146 , 0.1474, 0.1488, 0.1502, 0.1516, 0.153 ,\n", + " 0.1544, 0.1558, 0.1572, 0.1586, 0.16 ])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dBIa2Zxgfb5n" + }, + "source": [ + "Write a function that takes an array of values for `lam`, a single value for `mu`, and an update function.\n", + "\n", + "For each value of `lam`, it should run a simulation, compute `L` and `W`, and store the value of `W` in a `SweepSeries`.\n", + "\n", + "It should return the `SweepSeries`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "T3Lw9Hq0fb5n" + }, + "source": [ + "def sweep_lam(lam_array, mu, update_func):\n", + "\n", + " sweep = SweepSeries()\n", + " \"\"\"mu = 1/5\n", + " \"\"\"\n", + "\n", + " for lam in lam_array:\n", + " system = make_system(lam, mu) \n", + " results = run_simulation(system, update_func)\n", + " L, W=compute_metrics(results, system)\n", + " sweep[lam]=W\n", + " \n", + " return sweep\n" + ], + "execution_count": 13, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rbBAMakvfb5n" + }, + "source": [ + "Call your function to generate a `SweepSeries`, and plot it." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3vzZjt54fb5n", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "outputId": "7cbaa806-3144-4031-a967-bf4b56bcb228" + }, + "source": [ + "sweep1 = sweep_lam(lam_array, mu, update_func)\n", + "plt.scatter(sweep1.index, sweep1)\n", + "decorate(xlabel='Lamda, the arrival rate',\n", + " ylabel='Average Time Customer Spend')\n" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "OYwignSvfb5o", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "e212183d-7289-42d9-ce53-35dcea8d3da4" + }, + "source": [ + "print(sweep1)" + ], + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Parameter\n", + "0.0200 3.405316\n", + "0.0214 7.296550\n", + "0.0228 3.497115\n", + "0.0242 5.491337\n", + "0.0256 8.305648\n", + " ... \n", + "0.1544 29.769077\n", + "0.1558 8.412267\n", + "0.1572 11.739917\n", + "0.1586 10.410862\n", + "0.1600 20.691445\n", + "Name: Metric, Length: 101, dtype: float64\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_WIZ7TJSfb5o" + }, + "source": [ + "If we imagine that this range of values represents arrival rates on different days, we can use the average value of `W`, for a range of values of `lam`, to compare different queueing strategies." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "z434VukEfb5o", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "29dd82d9-87f5-4537-91b6-4f02d33a517f" + }, + "source": [ + "sweep1.mean()" + ], + "execution_count": 16, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "8.914936037880679" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 16 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "K1sF_1gkfb5p" + }, + "source": [ + "### Analysis\n", + "\n", + "The model I chose for this system is a common model in queueing theory, in part because many of its properties can be derived analytically.\n", + "\n", + "In particular, we can derive the average time in the store as a function of $\\mu$ and $\\lambda$:\n", + "\n", + "$W = 1 / (\\mu - \\lambda)$\n", + "\n", + "The following function plots the theoretical value of $W$ as a function of $\\lambda$." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "56XsHQKQfb5p" + }, + "source": [ + "def plot_W(lam_array, mu):\n", + " \"\"\"Plot the theoretical mean wait time.\n", + " \n", + " lam_array: array of values for `lam`\n", + " mu: probability of finishing a checkout\n", + " \"\"\"\n", + " W_array = 1 / (mu - lam_array)\n", + " W_series = make_series(lam_array, W_array)\n", + " W_series.plot(style='-', label='analysis')" + ], + "execution_count": 17, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5FY36b9gfb5q" + }, + "source": [ + "Use this function to plot the theoretical results, then plot your simulation results again on the same graph. How do they compare?" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "HSfR9uqDfb5q", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 282 + }, + "outputId": "09c6e867-97fc-43f7-da8d-f8da105a38f2" + }, + "source": [ + "plot_W(lam_array, mu)\n", + "plt.scatter(sweep1.index, sweep1)" + ], + "execution_count": 18, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 18 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mpwanurrfb5q" + }, + "source": [ + "## Multiple servers\n", + "\n", + "Now let's try the other two queueing strategies:\n", + "\n", + "1. One queue with two checkout counters.\n", + "2. Two queues, one for each counter.\n", + "\n", + "The following figure shows the three scenarios:\n", + "\n", + "![](https://github.com/AllenDowney/ModSim/raw/main/figs/queue.png)\n", + "\n", + "Write an update function for one queue with two servers." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "JmqYCbJXfb5q" + }, + "source": [ + "\"\"\" \n", + "x - the total number of customer in the store, including the one checking out\n", + "t - the number of minutes that have elapsed in the simulation\n", + "\"\"\"\n", + "\n", + "def update_func1(x, t, system):\n", + " \n", + " \"\"\" Check if the customers are done at check out\"\"\"\n", + " # if both servers are busy, check whether the\n", + " # second is complete\n", + " \n", + " if x > 1:\n", + " if flip(system.mu):\n", + " x -= 1\n", + " \n", + " # check whether the first is complete\n", + " if x > 0:\n", + " if flip(system.mu):\n", + " x -= 1\n", + " \n", + " if flip(system.lam):\n", + " x += 1\n", + "\n", + " return x" + ], + "execution_count": 19, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "v0sZ6kZzfb5r" + }, + "source": [ + "Use this update function to simulate the system, plot the results, and print the metrics." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "95-yeHQyfb5r", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 332 + }, + "outputId": "c14d91b7-2af5-4be5-e60c-b45dae28b607" + }, + "source": [ + "system=make_system(lam,mu)\n", + "print(lam,mu)\n", + "results2 = run_simulation(system, update_func1)\n", + "#results1.plot(label='results1')\n", + "plt.plot(results2, label='label')\n", + "decorate(title='Customer Checkout',\n", + " xlabel='Time (mins)',\n", + " ylabel='Number of customer')\n", + "compute_metrics(results2, system)" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "text": [ + "0.125 0.2\n" + ], + "name": "stdout" + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(0.8272425249169435, 6.617940199335548)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 20 + }, + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HUbVXSa1fb5r" + }, + "source": [ + "Since we have two checkout counters now, we can consider values for $\\lambda$ that exceed $\\mu$.\n", + "\n", + "Create a new array of values for `lam` from 10% to 160% of `mu`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Qz2NNqjTfb5s" + }, + "source": [ + "counter=2\n", + "lam_array2 = linspace(0.1*mu, 0.8*counter*mu, 101)" + ], + "execution_count": 21, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "W2XYsjwWfb5s" + }, + "source": [ + "Use your sweep function to simulate the two server, one queue scenario with a range of values for `lam`.\n", + "\n", + "Plot the results and print the average value of `W` across all values of `lam`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "wFDtQiGlfb5s", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "2e20dc8e-e9de-4470-e1b2-e9c75f7a4992" + }, + "source": [ + "sweep2 = sweep_lam(lam_array2, mu, update_func1)\n", + "sweep2.mean()" + ], + "execution_count": 22, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "6.107548279708789" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 22 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "qB4CA94zfb5t", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "outputId": "7de169a0-0cbc-44a2-f04c-91880cf43319" + }, + "source": [ + "plt.scatter(sweep2.index, sweep2)\n", + "decorate(xlabel='Lamda, the arrival rate',\n", + " ylabel='Average Time Customer Spend')" + ], + "execution_count": 23, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dQxYDULRfb5t" + }, + "source": [ + "## Multiple queues\n", + "\n", + "To simulate the scenario with two separate queues, we need two state variables to keep track of customers in each queue.\n", + "\n", + "Write an update function that takes `x1`, `x2`, `t`, and `system` as parameters and returns `x1` and `x2` as return values. f you are not sure how to return more than one return value, see `compute_metrics`.\n", + "\n", + "When a customer arrives, which queue do they join?" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "djikYu5sfb5t" + }, + "source": [ + "def update_func2(x1, x2, t, system):\n", + " \n", + " \"\"\" Check if the customers are done at check out\"\"\"\n", + " # if both servers are busy, check whether the\n", + " # second is complete\n", + " \n", + " if x1 > 1:\n", + " if flip(system.mu):\n", + " x1 -= 1\n", + " \n", + " # check whether the first is complete\n", + " if x2 > 0:\n", + " if flip(system.mu):\n", + " x2 -= 1\n", + " \n", + " if flip(system.lam):\n", + " if x1 > x2:\n", + " x2 += 1\n", + " else:\n", + " x1 += 1\n", + "\n", + " return x1, x2" + ], + "execution_count": 24, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6Lw5AJg7fb5u" + }, + "source": [ + "Write a version of `run_simulation` that works with this update function." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "sCOv3EVVfb5u" + }, + "source": [ + "def run_simulation(system, update_func):\n", + " \"\"\"Simulate a queueing system.\n", + " \n", + " system: System object\n", + " update_func: function object\n", + " \"\"\"\n", + " x1 = 0\n", + " x2 = 0\n", + " results = TimeSeries()\n", + " results[0]=x1+x2\n", + "\n", + " for t in linrange(0, system.duration):\n", + " x1, x2 = update_func(x1, x2, t, system)\n", + " results[t+1] = x1 + x2\n", + "\n", + " return results" + ], + "execution_count": 25, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0j_vDUnqfb5v" + }, + "source": [ + "Test your functions by running a simulation with a single value of `lam`." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "abcmm87wfb5w", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "1efab879-6fa5-47be-aa02-0ed7447af4a2" + }, + "source": [ + "system = make_system(lam, mu)\n", + "results3=run_simulation(system, update_func2)\n", + "results3" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "Time\n", + "0 0\n", + "1 1\n", + "2 1\n", + "3 1\n", + "4 2\n", + " ..\n", + "597 1\n", + "598 1\n", + "599 1\n", + "600 1\n", + "601 1\n", + "Name: Quantity, Length: 602, dtype: int64" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 26 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xENEzuUBfb5x" + }, + "source": [ + "Sweep a range of values for `lam`, plot the results, and print the average wait time across all values of `lam`.\n", + "\n", + "How do the results compare to the scenario with two servers and one queue." + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "3WSkdGLafb5x", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "2f475389-8c15-4043-c6e2-b2e982c5b5ca" + }, + "source": [ + "sweep3 = sweep_lam(lam_array, mu, update_func2)\n", + "sweep3.mean()" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "19.888128788954937" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QjF7RLbYfb5x", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "outputId": "2a26d2c3-6db9-490a-9dd7-169ce78f88c3" + }, + "source": [ + "plt.scatter(sweep3.index, sweep3)\n", + "decorate(xlabel='Lamda, the arrival rate',\n", + " ylabel='Average Time Customer Spend',\n", + " title='2 counters, 2 lines')" + ], + "execution_count": 33, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deZhcZZn38e8voYFGlkaNCI0xINuoYJCoKOoojuCMorzoC+7goOjM6ChiJDgziu8sROOIOrjhirgQEEQEJaLgyCAuCQkEBEZkb/alBZJIOsn9/nFOJdWVOlVPVfeppfv3ua660nX61Kn7dJK6+3nOfe5HEYGZmVmvmdHtAMzMzOpxgjIzs57kBGVmZj3JCcrMzHqSE5SZmfUkJygzM+tJTlBmhqRfSHpn/vVbJP202zGZOUFZX5K0laSvSbpN0qOSVkj6627HVU3SMZL+p0vvfaCkSyQ9JOl+SedI2jnltRHxnYg4pOwYzZpxgrJ+tQVwB/CXwA7APwNnS5rTxZgmlaQtJvDyHYHTgTnA04FHgW9MQlhmHeMEZX0pIlZFxMkRcWtEbIiIC4FbgAOKXiPpXZKuz0dcv5f03Hz7X+RTXKOSrpP02qrXbJz6yp+PGxVJCknvkfSH/PWfV+YvgC8BL5T0mKTRfP+tJH1K0u2S7pX0JUmD+fdeJulOSSdKugf4hqQnS7owP/ZDki6X1PT/bUT8JCLOiYhHImI1cBpwUMrPNvUcq77/t/nP9WFJSyQ9Pd8uSadKuk/SI5JWSnp2Sgxm4ARlU4SknYC9gOsKvv9/gZOBtwPbA68FHpQ0APwI+CnwFOB9wHck7d3C278GeB6wH3AkcGhEXA+8B7gyIraNiKF834V5nHOBPYBh4KNVx3oq8ESyUc9xwAnAncAsYCfgI0A7/cleSsHPJtFm5wgg6XV5TEfkMV4OfC9/zSH5++5FNso9EnhwAjHYNOMEZX0vTzLfAc6IiBsKdnsn8MmI+F1kboqI24ADgW2BhRGxNiIuBS4E3tRCCAsjYjQibgcuI0s+9eIUWdI5PiIeiohHgf8A3li12wbgYxHxeESsAcaAnYGnR8RYRFweLTbQlLQfWRKc38rrahSd43uAUyLi+ohYl5/P3HwUNQZsB+wDKN/n7gnEYNOME5T1tXy660xgLfDeBrs+Dfhjne27AHdExIaqbbeRjWxS3VP19WqyhFfPLGAbYFk+VTYKXJxvr7g/Iv5c9XwRcBPwU0k3S1rQQlxI2gP4CfD+iLi8ldfWKDrHpwOfrTqfhwABw3myPw34PHCfpNMlbT+BGGyacYKyvpWPSL5GNvX1+ogYa7D7HcAz6my/C3hazXWd2cBI/vUqsqRS8dQWQqwd6TwArAGeFRFD+WOHiNi26DUR8WhEnBARu5NNS35Q0itS3jwfxfwM+NeIOLOFuFtxB/DuqvMZiojBiPhVHv/nIuIA4JlkU30TGcXZNOMEZf3si8BfAIfl02GNfBX4kKQD8ov3e+Qf4L8hGxF8WNKApJcBhwFn5a9bARwhaZt8NHJsC/HdC+wqaUuAfJT2FeBUSU8BkDQs6dCiA0h6TR6rgD8B68mmAZH0TUnfLHjdMHApcFpEfKmFmFv1JeAkSc/K33eH/Hofkp4n6QX5FOwq4M+V2M1SOEFZX8qTy7vJroXck1fKPSbpLfX2j4hzgH8HvktWcn0+8MSIWEuWkP6abITzBeDtVdeyTiWbPrwXOIPsWleqS8kKE+6R9EC+7USyKbtfS3qEbITTqCBjz3yfx4ArgS9ExGX5954GXFHwuncCuwMnV/1sHmsh9iQR8QPgE8BZ+flcS/azhKwY5SvAw2TTpg+STVmaJZEXLDTrP/mo7GpgvyZTm2Z9ywnKzMx6kqf4zMysJzlBmZlZT3KCMjOznjSRZpQd8+QnPznmzJnT7TDMzKwEy5YteyAiZtVu74sENWfOHJYuXdrtMMzMrASSbqu33VN8ZmbWk5ygzMysJzlBmZlZT3KCMjOznuQEZWZmPakvqvgm4vzlIyxaciN3ja5hl6FB5h+6N4fv38pSP2Zm1g1TOkGdv3yEk85byZqx9QCMjK7hpPNWAjhJmZn1uCk9xbdoyY0bk1PFmrH1LFpyY5ciMjOzVFM6Qd01Wn8Nu6LtZmbWO6Z0gtplaLCl7WZm1jumdIKaf+jeDA7MHLdtcGAm8w9ttICpmZn1gildJFEphHAVn5lZ/5nSCQqyJOWEZGbWf6b0FJ+ZmfUvJygzM+tJTlBmZtaTnKDMzKwnOUGZmVlPcoIyM7Oe5ARlZmY9yQnKzMx6khOUmZn1JCcoMzPrSU5QZmbWk5ygzMysJzlBmZlZT3KCMjOznuQEZWZmPckJyszMepITlJmZ9aRSV9SVdCvwKLAeWBcR8yQ9EVgMzAFuBY6MiIfLjMPMzPpPJ0ZQL4+IuRExL3++APh5ROwJ/Dx/bmZmNk43pvheB5yRf30GcHgXYjAzsx5XOMUn6YONXhgRn044fgA/lRTAlyPidGCniLg7//49wE4F738ccBzA7NmzE97KzMymkkbXoLbL/9wbeB5wQf78MOC3icd/cUSMSHoKcImkG6q/GRGRJ6/N5MnsdIB58+bV3cfMzKauwgQVER8HkPRL4LkR8Wj+/GTgopSDR8RI/ud9kn4APB+4V9LOEXG3pJ2B+yZ2CmZmNhWlXIPaCVhb9XwtBdNy1SQ9QdJ2la+BQ4BryUZiR+e7HQ38sJWAzcxsekgpM/8W8Nt8BARZUcMZDfav2An4gaTK+3w3Ii6W9DvgbEnHArcBR7YetpmZTXVNE1RE/Luki4EX55veERHLE153M/CcOtsfBF7RaqBmZja9pN6ouwK4u7K/pNkRcXtpUZmZ2bTXNEFJeh/wMeBeso4QIisf36/c0MzMbDpLGUG9H9g7n5ozMzPriJQqvjuAP5UdiJmZWbWUEdTNwC8kXQQ8XtmY2EnCzMysLSkJ6vb8sWX+MDMzK11KmXmlo8Q2EbG6/JDMzMwSrkFJeqGk3wM35M+fI+kLpUdmZmbTWkqRxGeAQ4EHASLiauClZQZlZmaWdKNuRNyRtyyqWF9OOOU6f/kIi5bcyF2ja9hlaJD5h+7N4fsPdzssMzOrIyVB3SHpRUBIGiC7L+r6csOafOcvH+Gk81ayZizLrSOja5h/ztV8/EfXMbp6zAnLzKzHpEzxvQf4B2AYuAuYmz/vK4uW3LgxOVWMbQgeXj1GkCWsk85byfnLR7oToJmZjZNSxfcA8JYOxFKqu0bXNN1nzdh6Fi250aMoM7MekFLFt7ukH0m6X9J9kn4oafdOBDeZdhkaTNovJZGZmVn5Uqb4vgucDewM7AKcA3yvzKDKMP/QvRkcmNl0v9REZmZm5UpJUNtExJkRsS5/fBvYuuzAJtvh+w9zyhH7Mjw0iIChwQEGZo6rTGRwYCbzD927OwGamdk4KVV8P5G0ADiLbJmNo4AfS3oiQEQ8VGJ8k+rw/YfHXV9y2bmZWe9SRDTeQbqlwbcjIkq/HjVv3rxYunRp2W9jZmZdIGlZRMyr3Z5SxbdbOSGZmZkVK7wGJel5kp5a9fzteQXf5yrTe2ZmZmVpVCTxZWAtgKSXAguBb5EtXnh6+aGZmdl01miKb2ZVAcRRwOkRcS5wrqQV5YdmZmbTWcMEJWmLiFgHvAI4LvF1fckVfWZmvaVRovke8N+SHgDWAJcDSNqDbJpvyqjXSPak81YCOEmZmXVJ4TWoiPh34ATgm8CLY1M9+gzgfeWH1jn1GslW+vKZmVl3NJyqi4hf19n2v+WF0x1F/ffcl8/MrHtSWh1NeUX999yXz8yse5ygqN9ItlFfvvOXj3DQwkvZbcFFHLTwUq8hZWZWgoZTfJJmAj+LiJd3KJ6uqBRCFFXxVVf47TA4wKq16xhbn12Sc0GFmVk5ml2DWi9pg6QdImJKVe7Vqm0kW1Fb4Te6ZmyzfbzQoZnZ5Eu5n+kxYKWkS4BVlY0R8Y+lRdVD6lX41eOCCjOzyZWSoM7LH9NSauJxQYWZ2eRK6WZ+hqRBYHZETLsbg3YZGmSkSZLyQodmZpOvaRWfpMOAFcDF+fO5ki4oO7BeUa/Cb2CG2HGbAQQMDw1yyhH7+vqTmdkkS5niOxl4PvALgIhYIan0RQp7RbMKPzMzK0dKghqLiD9Jqt62IfUN8lL1pcBIRLxG0m5ky8c/CVgGvC0i1rYQc8cVVfiZmVl5Um7UvU7Sm8m6m+8p6b+AX7XwHu8Hrq96/gng1IjYA3gYOLaFY5mZ2TSRkqDeBzwLeJysw/kjwAdSDi5pV+DVwFfz5wIOBr6f73IGcHhrIZuZ2XSQUsW3Gvin/NGqzwAfBrbLnz8JGM3XmAK4E6g7dybpOPI1qGbPnt3GW5uZWT9LqeKbJ+k8SVdJuqbySHjda4D7ImJZO4FFxOkRMS8i5s2aNaudQ5iZWR9LKZL4DjAfWEkLxRHAQcBrJf0NsDWwPfBZYKhqpd5dAXdaNTOzzaRcg7o/Ii6IiFsi4rbKo9mLIuKkiNg1IuYAbwQujYi3AJcBb8h3Oxr4YbvBm5nZ1JUygvqYpK8CPycrlAAgItptf3QicJakfwOWA19r8zilqu5g7nufzMw6LyVBvQPYBxhg0xRf0EJ/voj4BZtu9L2Z7MbfnlXbwdxLapiZdV5KgnpeREyrRnP1Oph7SQ0zs85KuQb1K0nPLD2SHlLUwdxLapiZdU7KCOpAYIWkW8iuQQmIiNiv1Mi6qKiDuZfUMDPrnJQE9arSo+gx8w/de9w1KCheUsPFFGZm5UjpJHGbpOcAL8k3XR4RV5cbVneldjB3MYWZWXmaJihJ7wfexaaqvW9LOj0i/qvUyLospYO5iynMzMqTMsV3LPCCiFgFIOkTwJXAlE5QKVxMYWZWnpQqPgHVw4T1+bZpr6howsUUZmYTl5KgvgH8RtLJkk4Gfg18vdSo+kS95eCLiinMzKw1KUUSn5b0C+DF+aZ3RMTyUqPqE14O3sysPClFEmdGxNuAq+psm/a8HLyZWTlSpvieVf1E0kzggHLCMTMzyxQmKEknSXoU2E/SI/njUeA+vESGmZmVrDBBRcQpEbEdsCgits8f20XEkyLipA7GaGZm01DKFN+Fkp4AIOmtkj4t6eklx2VmZtNcSoL6IrA6b3d0AvBH4FulRjXNnL98hIMWXspuCy7ioIWXcv7ykW6HZGbWdSkJal1EBPA64LSI+DywXblhTR+Vfn4jo2sINvXzc5Iys+kuJUE9Kukk4K3ARZJmkK2ua5OgUT8/M7PpLCVBHUW2DtSxEXEPsCuwqNSophH38zMzqy+lk8Q9wKernt+Or0G1rGjdKC+OaGZWX9MRlKRHq+6D+rOk9ZL+1IngpopG15ncz8/MrL6UEdTGgghJIiuWOLDMoKaaRteZrlhw8MZ93M/PzGyTlPWgNsqr+c6X9DFgQTkhTT3NrjO5n5+Z2eZSmsUeUfV0BjAP+HNpEfWx2utML99nFpfdcD9RsL+vM5mZFUsZQR1W9fU64FayaT6rUrnOVJnKGxldw7d/fXvh/r7OZGbWWMo1qHd0IpB+V+86U5HhfHS1aMmNHL94ha87mZnV0aib+SJJ766z/d2SFpYbVv9JvW9JZCvxnrtsxN0jzMwaaFRmfjBwep3tXwFeU044/Sv1etIuQ4PuHmFmlqBRgtoqr9obJyI2kA0ErEq9+5lqVa47uXuEmVlzjRLUGkl71m7Mt/mTtMbh+w9zyhH7Mjw0iMiuM731wNnjnp9yxL4bu0fU46o+M7NNGhVJfBT4iaR/A5bl2+YBJwEfKDuwfpR6P9P8Q/ceV/EHruozM6tVmKAi4ieSDgfmA+/LN18LvD4iVnYiuKmqksTcPcLMrJjqXGbqOfPmzYulS5d2OwwzMyuBpGURMa92e8pyG2ZmZh3nBGVmZj3JCcrMzHpSynpQe0n6uaRr8+f7SfrnhNdtLem3kq6WdJ2kj+fbd5P0G0k3SVosacuJn8bUdf7yEQ5aeCm7LbiIgxZe6m4TZjZtpIygvkJWWj4GEBHXAG9MeN3jwMER8RxgLvAqSQcCnwBOjYg9gIeBY9sJfDqot9Dh8YtXMMfJysymgZRu5ttExG+ztQo3WtfsRXkXisfypwP5I8haKL05334GcDLwxcR4p5V6LZEqNZcjo2uYf87VfPxH1zG6esyl6mY25aSMoB6Q9Azyz0ZJbwDuTjm4pJmSVgD3AZcAfwRGI6KS4O4E6n6iSjpO0lJJS++///6Ut5tymrU+GtsQPLx6zA1nzWxKSklQ/wB8GdhH0ghZF4m/Szl4RKyPiLnArsDzgX1SA4uI0yNiXkTMmzVrVurLppRWWx9VN5z1tSsz63dNE1RE3BwRfwXMAvaJiBdHxK2tvElEjAKXAS8EhiRVphZ3BfzJWSClAW2tu0bX1L125dGVmfWblCXfh4C3A3OALSrXoiLiH5u8bhYwFhGjkgaBV5IVSFwGvAE4Czga+OEE4p9yapeNf/0Bw1x2w/2MjK5BULh8fEWz5Tx8jcrM+kXKFN+PyZLTSrKmsZVHMzsDl0m6BvgdcElEXAicCHxQ0k3Ak4CvtRH3lFRv5HPushHmH7o3ty58NaceNXdjd/ShwQEGZo5f9cTLeZjZVNK0F5+kqyLiuR2Kp67p0ovvoIWXMlIniQwPDXLFgoM321472qpU8RUdp3IsV/uZWS8p6sWXUmZ+pqR3AReS3dsEQEQ8NInxGcUjnKLtRct71FvOo6JyParyejOzXpUyxbcWWARcyabpvak/nOmCyVrIsHrxxHq8vLyZ9YOUBHUCsEdEzImI3fLH7mUHNh3Vq9prdyHDw/cf5ooFB6OC7/t6lJn1upQEdROwuuxArP6y8ZVl4tvl5eXNrF+lXINaBayQdBnjr0E1LDO39qQuG5/Ky8ubWb9KSVDn5w/rQ15e3sz6VdMEFRFndCIQK89kj8rMzDqhMEFJOjsijpS0kjoNDCJiv1IjMzOzaa3RCOrU/M/XdCIQMzOzao0S1OeB50bEbZ0KxszMrKJRgiq6hcZ6UFHbIzOzftUoQQ1L+lzRN11m3jsqTWYrpeRuZ2RmU0GjBLWGtK7l1mVeXsPMpqJGCepBl5j3By+vYWZTUaNWR2s7FoVNiNsZmdlUVJigIuLATgZi7ZvMJrNmZr0ipdWR9Ti3MzKzqcgJaopIbWfkcnQz6xcpy20g6cWS3pF/PUvSbuWGZWWolKOPjK4h2FSOfv7ykW6HZma2maYJStLHgBOBk/JNA8C3ywzKytGoHB2yBHbQwkvZbcFFHLTwUicuM+uqlCm+/wPsD1wFEBF3Sdqu1KisFI3K0X2zr5n1mpQpvrUREeQdzSU9odyQrCyNytGbja7MzDotJUGdLenLwJCkdwE/A75SblhWhkbl6L7Z18x6TcqChZ+S9ErgEWBv4KMRcUnpkdmka1SOvmjJjYzUSUZFoy5XA5pZ2ZLKzPOE5KQ0BdSWo1cKI0ZG1yDGr0xZdLOvr1eZWSc0TVCSHmXzFXX/BCwFToiIm8sIzMpXm2gCNiap4Qajok40p/UIzcxSRlCfAe4Evkv2+fVG4BlkVX1fB15WVnBWrnqJppKcrlhwcOHryr5e5RGamUFagnptRDyn6vnpklZExImSPlJWYFa+ZommaBSzy9BgS9erKlJHRZM1QvMozKy/pVTxrZZ0pKQZ+eNI4M/592qn/qyPNCo7b9R1ol41oPJ9im7wbaWLRVHibHT8ibyfmfWmlAT1FuBtwH3AvfnXb5U0CLy3xNisZI3KzpuNYk45Yl+G8wRXXVxRmwgqRRgfWLwiuYvFDKkw5tRE4/u6zPpf0wQVETdHxGER8eSImJV/fVNErImI/+lEkFaO6kQjsmtPpxyxL4fvP9x0FANwxYKDGR4a3GwYXUkE1aOYItVdLCqjnfXReGCekmh8X5dZ/0up4tsaOBZ4FrB1ZXtE/G2JcVmHFHVBL7rOBOOLFholgnqjmHrvU7TfTKkwWTVLNO1eJzOz3pEyxXcm8FTgUOC/gV2BR8sMyrqv3vRftcooptF1rGZJZGCGWL12XWEi3BCxcRqx3vEb8SKOZv0vJUHtERH/AqyKiDOAVwMvKDcs67ba60z13DW6pmEiaJREhgYHQPDw6rHCfSqVd+0kmkbTl2bWH1LKzCufIKOSng3cAzylvJCsV1Sm/yqdJmrtMjS4WfukHQYHkOD4xSvYYXCAgZlibP2mabrBgZmccsS+LFpyI6NripNTJQlNZLXg1EUczaw3KZpckJb0TuBcYF/gm8C2wL9ExJebvO5pwLeAnciKvE6PiM9KeiKwGJgD3AocGREPNzrWvHnzYunSpQmnY2WovXEWNiWa2rZJtfsNzBDbbr0Fo6vHxiWX3RZcVHiPQqMuFs3i9H1PZv1H0rKImFe7veEIStIM4JE8gfwS2L2F91xH1grpqnz9qGWSLgGOAX4eEQslLQAWkC2IaD0qdRRTr9hhbEOwzZZbsPyjh4zbXlTE0KyLRRF3nzCbehomqIjYIOnDwNmtHjgi7gbuzr9+VNL1wDDwOja1RzoD+AVOUD0vZbqsldLu+YfuXXdU1uzaUtEoqRP9Ac2ss1KuQf1M0ofIpuVWVTZGxEOpbyJpDtmqvL8BdsqTF2TXs3ZKPY71tlZKu9u5ttRolNRr9z15utFs4lIS1FH5n/9QtS1InO6TtC3ZNawPRMQjquoSEBEhqe6lCEnHAccBzJ49O+WtrMtaHRW1WsTQaJTUS/c9ebrRbHKkdJLYrc4jNTkNkCWn70TEefnmeyXtnH9/Z7IWSvXe9/SImBcR82bNmpV2NtZVZZd2NxolTeS+p+o2S6m9/hpxmyWzyZHSSWIb4IPA7Ig4TtKewN4RcWGT1wn4GnB9RHy66lsXAEcDC/M/f9hu8NZ7yiztbjRKarccvYzRTq9NN5r1q5Qpvm8Ay4AX5c9HgHOAhgkKOIissexKSSvybR8hS0xnSzoWuA04stWgbXqqN4VY6Uax24KL2rrWU0ZxRS9NN5r1s5QE9YyIOErSmwAiYrXUoN10Lm8kW7TfK1qI0QzYvLBih8EBVq1dt7EbRSujn0oRQ1GbpWZrYjXSboWimY2XkqDW5ktrBICkZwCPlxqVWYHqKcSDFl66WTeKlNFPvRuKa1WvidXq9N9Eul+Y2SYpCepk4GLgaZK+QzZ1d0yJMZklafdaT7Mu66lrYjXiNktmE9c0QUXETyUtAw4km7J7f0Q8UHpkZk20e62nUQIbquolWNSKycUOZp2RUsX3I+C7wAURsarZ/mad0u61nqLENjQ4wOPrNiStYVWrkzfm9tJNwL0Ui009KcttfAp4CfB7Sd+X9IZ8EUOzrmr3vquie6YkmianegmwdkXg1GXp29HJ9+qnWGxqatrNfOOO0kzgYOBdwKsiYvsyA6vmbuY2UbW/6b98n1lcdsP9437zbzStJygcIRQtR5LS+LbVEUjRe82U2BDR0VHMRM7brFpb3cyrXjwIHEbW9ui5ZE1ezfpCvWq8c5eNbDbaKio7r3zgVpLJ8YtXjEsE7RZrtFMlWHTM9fkvmp1sq+Qbkq1sTaf4JJ0NXE82ejqN7L6o95UdmNlkSW091KhdUqPprEbL3k8krnotmFJu9u1UW6V2z9ssVco1qK+RJaX3RMRlwIskfb7kuMwmTepv+o2uaTVKJu32AWwUV1FCfPk+szZ7r1aOPZkm0v/QLEVKmfkSSfvnnSSOBG4BzmvyMrOe0eoyIPWmxholk3ZvzG0UV1FC/Pavb2docICtB2YwunqMGdLG6b1m5zbZfEPy9NKNis3CBCVpL+BN+eMBsvWgFBEvLzUis0k2Ga2HmiW51Btzq/+T7zA4wMBMMbZ+U4KpxHX84hWFxxhdM8bgwExOPWouQFfbKvmG5OmhW0vIFFbxSdoAXA4cGxE35dtuTl1qYzK5is8maqK//dVrjzQwQ2y79RaMrh5ra8HF2mPskN8k3GhkVK22eKPZuU32fjZ9lF2x2U4V3xHAG4HLJF0MnEVx81eznjbR3/Qno1FtvWm7sQ3BNltuwccOe9a45NUsOcGmaceUc0v9DdiLLVo93arYLCySiIjzI+KNwD7AZcAHgKdI+qKkQ0qNyqwHHb7/MFcsOJhbFr6aJ2y1xbipOSiunqtU4zXqnF7UH3Bmg4UDWrnOlFrJ6MUWrZ5uVWymrKi7KiK+GxGHAbsCy4ETS43KrMel/kZZXY1XZJehwcLjbYjgM0fNnXC1XNHxR0bXjCtj971NVk+3KjaTbtStiIiHgdPzh9m0lVoZ2Ern9MleLTglXmBcGfvQNgMbpy0bnVeKbl3zSuka4unK1nSrYjO51VE3uUjCek29gofBgZmbdafYbcFFhe2Thqv+k6ceLyWueh8iKWtgQf2Gue3GkXI+9fYTWdIcnqRillrtnI+Va0KtjsxsvNTfKItGLrXVT5PxG2pKgUPl+EVJ809rxjj1qLkT/k05dS2tevtVYmunQKPZiLU2Dlcs9jaPoMxKNFkjoxStNJJtt2w49QO9aOQo4JaFr266XysxVcfV6FpfbRynHjW3Y3831ljRCCql1ZGZtandJUHa0aiRbG3/wHYuereyvEZq1VfKta3Uprupyanyvq5Y3Fy9/o/d5Ck+s5J1qttCo0KIisoHcGVE0sr0VrNpu9QuGdXqdfmod15QPHpLmdar1qxbR72EOB2mAnvxHjgnKLMpIuXDHurf4Fu0lEi919U7Xu2H2+iaMQZmiB23GWjYaaP62tjI6JqNBRIVtd3k6314NhphDTeo4mtUOVmtFz+4y1D0C8gJZ1/d8N9FmZygzKaI2kKI1EayqR/ArTa3rXTJWP7R8ff11xuNVEZ09UrEixJJ5cOzUZVko2tXqT0aUws++l0vrTVW4QRlNoXUjoom8wO40Qd66nRZs2TYLP5aRS2hiq6n1SbA1x8w3PQeqVZuXm40FTgZ04RlTjW2MkXsBGVmE5Jaut7KellFx0udLmtlNNLqtaWKovunUldWrt5/0ZIbC0dorYxEgQlPE5Y91djqFHEnOEGZTWEpBRqTsV5Ws+myZmXg9T702vkgFBRO67Va5LFq7brN+i1WtDISPeHsq+uO9FodjXkyficAAAvXSURBVLSS3NsZabU7RVwmJyizaS41uTT6sGs0ukqZqqv3oddoymlmGx+erRZ5FCkaoTW7hlNPpRdi7c+rXqum1OReb6Q1/5yr+fiPrmu6NEw7U8Rl8o26ZtZSi6RWb2Zt1Mm90fEavTfUX6ixUVyNbk4Gku6jqr3ROOX4qQYHZvL6A4Y5d9lIS1ObtTdip9ywnNpOqlPl9UU36jpBmVmhyVioLrUfYT2TWXTQKOEdv3hF044WlXiLzju132EjRSPDVLVl+il6oXuGe/GZWcsmY/mN1H6E9TS6htbqDdDtFHlUaza9lXoNp5FW9q+XzNpJbb1cMu8EZWaFWimgKJJ6v1EntFLkMTBDbLv1Fptdt2k0cku5hnPKEfu21DewnuEGa4i1o9VjdWrqzwnKzApNRnLp1lpCrUiNsZVS72bHbHc6sNkaYrWGmlQkQmu/cHSys4avQZlZQ9OhD12qybgmV5HSgb1Rq6aUa16VuKrfq/Y6VdFIschk/gwqXCRhZjZBjQo+BG0l8NSlSepplHgaVUc2ut+rWdHEROIt4uU2zMwmqNFUWLMlSFo9Zsq02+H7D3PFgoO5deGrOfWouUnLulRec8vCV/OErbbYbOqv2ZIjE4m3VU5QZmaJ6q2jVavVNaXaWZurnurEc8WCg5NGce1UaU5WvClKS1CSvi7pPknXVm17oqRLJP0h/3PHst7fzGyy1S5AWaSVqrhOLmpZq53RUCfjLe0alKSXAo8B34qIZ+fbPgk8FBELJS0AdoyIE5sdy9egzKwXlVEw0EmT0SlkMnT8GlRE/BJ4qGbz64Az8q/PAA4v6/3NzMrWyemuMnRz9Jai0/dB7RQRd+df3wPsVLSjpOOA4wBmz57dgdDMzFrTD/d4NdNqR45OKrXMXNIc4MKqKb7RiBiq+v7DEdH0OpSn+MzMpq5eKTO/V9LOeUA7A/d1+P3NzKxPdDpBXQAcnX99NPDDDr+/mZn1iTLLzL8HXAnsLelOSccCC4FXSvoD8Ff5czMzs82UViQREW8q+NYrynpPMzObOtxJwszMelJfNIuVdD9w2wQP82TggUkIp5t8Dr3B59AbfA7dN1nxPz0iZtVu7IsENRkkLa1XxthPfA69wefQG3wO3Vd2/J7iMzOznuQEZWZmPWk6JajTux3AJPA59AafQ2/wOXRfqfFPm2tQZmbWX6bTCMrMzPqIE5SZmfWkKZGgJL1K0o2SbsoXQqz9/laSFuff/03eZR1Jr5S0TNLK/M+urTDW7jlUfX+2pMckfahTMde8f9vxS9pP0pWSrsv/LrbuZOxVcbT772hA0hl57NdLOqnTsVfF2OwcXirpKknrJL2h5ntH56td/0HS0bWv7ZR2z0HS3Kp/R9dIOqqzkY+Lse2/h/z72+ct4k7rTMSbm+C/pdmSfpr/f/h97edVsojo6wcwE/gjsDuwJXA18Myaff4e+FL+9RuBxfnX+wO75F8/Gxjpt3Oo+v73gXOAD/VT/GTttq4BnpM/fxIws8/O4c3AWfnX2wC3AnN69BzmAPsB3wLeULX9icDN+Z875l/v2GfnsBewZ/71LsDdwFA/nUPV9z8LfBc4rdPxT8Y5AL8AXpl/vS2wTTtxTIUR1POBmyLi5ohYC5xFtnJvteqVfL8PvEKSImJ5RNyVb78OGJS0VUeiHq/tcwCQdDhwC9k5dMNE4j8EuCYirgaIiAcjYj2dN5FzCOAJkrYABoG1wCOdCXucpucQEbdGxDXAhprXHgpcEhEPRcTDwCXAqzoRdI22zyEi/jci/pB/fRfZcj6bdSfogIn8PSDpALLFXH/aiWALtH0Okp4JbBERl+T7PRYRq9sJYiokqGHgjqrnd+bb6u4TEeuAP5H9pl7t9cBVEfF4SXE20vY5SNoWOBH4eAfiLDKRv4O9gJC0JJ8u+HAH4q1nIufwfWAV2W/stwOfioiHyg64jpRzKOO1k2lS4pD0fLLf/P84SXG1ou1zkDQD+E+gK1P1VSby97AXMCrpPEnLJS2SNLOdIDq95HtPkvQs4BNkv833m5OBUyPisXxA1W+2AF4MPA9YDfxc2eqaP+9uWC15PrCebFppR+ByST+LiJu7G9b0pGwx1DOBoyNisxFKj/t74McRcWef/n+G7P/0S8guodwOLAaOAb7W6oGmwghqBHha1fNd821198mnYXYAHsyf7wr8AHh7RHTjt61x8eVaOYcXAJ+UdCvwAeAjkt5bdsBFseVaif9O4JcR8UA+DfBj4LmlR7y5iZzDm4GLI2IsIu4DrgC60V8t5RzKeO1kmlAckrYHLgL+KSJ+PcmxpZrIObwQeG/+//lTwNsldWPdvImcw53Ainx6cB1wPm3+n54KCep3wJ6SdpO0JdnF6wtq9qleyfcNwKUREZKGyP4xL4iIKzoW8ebaPoeIeElEzImIOcBngP+IiE5X/rQdP7AE2FfSNvmH/l8Cv+9Q3NUmcg63AwcDSHoCcCBwQ0eiHi/lHIosAQ6RtKOkHclmE5aUFGcjbZ9Dvv8PgG9FxPdLjLGZts8hIt4SEbPz/88fIjuXzSroOmAi/5Z+BwxJqlz/O5h2/093o0Jksh/A3wD/Szbf/E/5tv8HvDb/emuyCrebgN8Cu+fb/5ns2sGKqsdT+ukcao5xMl2o4pto/MBbyQo8rgU+2Yf/jrbNt1+X/0ec38Pn8Dyy33BXkY3+rqt67d/m53YT8I5+O4f839FYzf/nuf10DjXHOIYuVfFNwr+lV5JV564Evgls2U4MbnVkZmY9aSpM8ZmZ2RTkBGVmZj3JCcrMzHqSE5SZmfUkJygzM+tJTlDWdyQ9VvLxXybpwjZfOyTp7yfjWBMhaZ6kz7X52mMm0kVb0hxJb2739WYVTlBmk2uIrF1Nx+Q3OI97HhFLI+IfO/WeNeaQddcwmxAnKJsSJB2mbI2m5ZJ+JmmnfPvJytZqulzSbZKOkPRJZWs3XSxpIN/vVZJukHQVcETVcZ+vbI2h5ZJ+JWnvJqEsBJ4haYWkRfm2bSV9Pz/+d6q60B8g6b+VrUW2JO8h18p5nSnpCuDMOs9fJulCSTMk3Zp3Takc8w+Sdio6doOfce17zMl/rlfljxdV/Qxekv8Mjpc0U1nD0N8pW6fp3U1+hmaZbt2l7Icf7T6Ax+ps2xE23nj+TuA/869PBv4HGACeQ9aQ9q/z7/0AOJysQ8QdwJ6AgLOBC/N9tidbOgDgr4Bzm8Q2B7i26vnLyLqe70r2C+GVZM1xB4BfAbPy/Y4Cvt7ieS0DBguev6zqHD5L3hmCrHfjz5oc+xjqdDCo8x7bAFvnX+8JLK197/z5ccA/519vBSwFduv2vyM/ev/hbuY2VewKLM5HIVuSrY9V8ZOIGJO0kmwhtovz7SvJEso+wC2RryUk6dtkH6qQNYQ9Q9KeZOs+DbQR228j4s782Cvy9xwlWyTzknxANZNsuY5WzuuCiFjT4HnFYuCjwDfIF1pMOHaR6vcYAE6TNJesm/teBa85BNhPm1Zd3YEsoaW8n01jnuKzqeK/yH7r3xd4N9moqOJxgMiWXhiLiEp/rw00X3LmX4HLIuLZwGE1x01VvcbY+vw9Rda7bG7+2Dci6i330ui8VtXsW/u84kpgj7x55+HAeQnHLlL9HscD95KNTOeRJbl6BLyv6lx3i4huLsZnfcIJyqaKHdi0HMDRjXas4wZgjqRn5M/fVHDcYyobJQ1Lqrdm1aPAdgnveSMwS9IL8+MNKFuXrNZEzguAPCH/APg0cH1EPDhJx94BuDtP/G8jGwXC5j+DJcDfVV3v2yvv+m7WkBOU9aNtJN1Z9fgg2fWRcyQtAx5o5WAR8WeyKb2L8iKJ+6q+/UngFEnLGT/a2hlYV+dYDwJXSLq2qkii3nuuJVuy4xOSribrvP2iOru2fV41FpN1+15ctW2ix/4CcHQe/z5sGl1dA6yXdLWk44GvknV5v0rStcCX8WKplsDdzM3aoGxRyNsjInWNHDNrkROUmZn1JE/xmZlZT3KCMjOznuQEZWZmPckJyszMepITlJmZ9SQnKDMz60n/H6YDLangXrkbAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [], + "needs_background": "light" + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "aOnEiH2efb5y" + }, + "source": [ + "# Solution goes here" + ], + "execution_count": 29, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "19Km8lwGfb5y" + }, + "source": [ + "" + ], + "execution_count": 29, + "outputs": [] + } + ] +} \ No newline at end of file