diff --git a/examples/ForestFire/.ipynb_checkpoints/Forest Fire Model-checkpoint.ipynb b/examples/ForestFire/.ipynb_checkpoints/Forest Fire Model-checkpoint.ipynb index 8c8746c5fbe..72b548058fd 100644 --- a/examples/ForestFire/.ipynb_checkpoints/Forest Fire Model-checkpoint.ipynb +++ b/examples/ForestFire/.ipynb_checkpoints/Forest Fire Model-checkpoint.ipynb @@ -1,584 +1,621 @@ { - "metadata": { - "name": "", - "signature": "sha256:7ad05bb257a0bc7d9176a2a5e02312695873a50206c8335653a47975f4e4ee8c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# The Forest Fire Model\n", - "## A rapid introduction to Mesa\n", - "\n", - "The [Forest Fire Model](http://en.wikipedia.org/wiki/Forest-fire_model) is one of the simplest examples of a model that exhibits self-organized criticality.\n", - "\n", - "Mesa is a new, Pythonic agent-based modeling framework. A big advantage of using Python is that it a great language for interactive data analysis. Unlike some other ABM frameworks, with Mesa you can write a model, run it, and analyze it all in the same environment. (You don't have to, of course. But you can).\n", - "\n", - "In this notebook, we'll go over a rapid-fire (pun intended, sorry) introduction to building and analyzing a model with Mesa." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, some imports. We'll go over what all the Mesa ones mean just below." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import random\n", - "\n", - "import numpy as np\n", - "\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "\n", - "from mesa import Model, Agent\n", - "from mesa.time import RandomActivation\n", - "from mesa.space import Grid\n", - "from mesa.datacollection import DataCollector\n", - "from mesa.batchrunner import BatchRunner " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Building the model\n", - "\n", - "Most models consist of basically two things: agents, and an world for the agents to be in. The Forest Fire model has only one kind of agent: a tree. A tree can either be unburned, on fire, or already burned. The environment is a grid, where each cell can either be empty or contain a tree.\n", - "\n", - "First, let's define our tree agent. The agent needs to be assigned **x** and **y** coordinates on the grid, and that's about it. We could assign agents a condition to be in, but for now let's have them all start as being 'Fine'. Since the agent doesn't move, and there is only at most one tree per cell, we can use a tuple of its coordinates as a unique identifier.\n", - "\n", - "Next, we define the agent's **step** method. This gets called whenever the agent needs to act in the world and takes the *model* object to which it belongs as an input. The tree's behavior is simple: If it is currently on fire, it spreads the fire to any trees above, below, to the left and the right of it that are not themselves burned out or on fire; then it burns itself out. " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class TreeCell(Agent):\n", - " '''\n", - " A tree cell.\n", - " \n", - " Attributes:\n", - " x, y: Grid coordinates\n", - " condition: Can be \"Fine\", \"On Fire\", or \"Burned Out\"\n", - " unique_id: (x,y) tuple. \n", - " \n", - " unique_id isn't strictly necessary here, but it's good practice to give one to each\n", - " agent anyway.\n", - " '''\n", - " def __init__(self, x, y):\n", - " '''\n", - " Create a new tree.\n", - " Args:\n", - " x, y: The tree's coordinates on the grid.\n", - " '''\n", - " self.x = x\n", - " self.y = y\n", - " self.unique_id = (x, y)\n", - " self.condition = \"Fine\"\n", - " \n", - " def step(self, model):\n", - " '''\n", - " If the tree is on fire, spread it to fine trees nearby.\n", - " '''\n", - " if self.condition == \"On Fire\":\n", - " neighbors = model.grid.get_neighbors(self.x, self.y, moore=False)\n", - " for neighbor in neighbors:\n", - " if neighbor.condition == \"Fine\":\n", - " neighbor.condition = \"On Fire\"\n", - " self.condition = \"Burned Out\"\n", - " " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we need to define the model object itself. The main thing the model needs is the grid, which the trees are placed on. But since the model is dynamic, it also needs to include time -- it needs a schedule, to manage the trees activation as they spread the fire from one to the other.\n", - "\n", - "The model also needs a few parameters: how large the grid is and what the density of trees on it will be. Density will be the key parameter we'll explore below.\n", - "\n", - "Finally, we'll give the model a data collector. This is a Mesa object which collects and stores data on the model as it runs for later analysis.\n", - "\n", - "The constructor needs to do a few things. It instantiates all the model-level variables and objects; it randomly places trees on the grid, based on the density parameter; and it starts the fire by setting all the trees on one edge of the grid (x=0) as being On \"Fire\".\n", - "\n", - "Next, the model needs a **step** method. Like at the agent level, this method defines what happens every step of the model. We want to activate all the trees, one at a time; then we run the data collector, to count how many trees are currently on fire, burned out, or still fine. If there are no trees left on fire, we stop the model by setting its **running** property to False." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class ForestFire(Model):\n", - " '''\n", - " Simple Forest Fire model.\n", - " '''\n", - " def __init__(self, height, width, density):\n", - " '''\n", - " Create a new forest fire model.\n", - " \n", - " Args:\n", - " height, width: The size of the grid to model\n", - " density: What fraction of grid cells have a tree in them.\n", - " '''\n", - " # Initialize model parameters\n", - " self.height = height\n", - " self.width = width\n", - " self.density = density\n", - " \n", - " # Set up model objects\n", - " self.schedule = RandomActivation(self)\n", - " self.grid = Grid(height, width, torus=False)\n", - " self.dc = DataCollector({\"Fine\": lambda m: self.count_type(m, \"Fine\"),\n", - " \"On Fire\": lambda m: self.count_type(m, \"On Fire\"),\n", - " \"Burned Out\": lambda m: self.count_type(m, \"Burned Out\")})\n", - " \n", - " # Place a tree in each cell with Prob = density\n", - " for x in range(self.width):\n", - " for y in range(self.height):\n", - " if random.random() < self.density:\n", - " # Create a tree\n", - " new_tree = TreeCell(x, y)\n", - " # Set all trees in the first column on fire.\n", - " if x == 0:\n", - " new_tree.condition = \"On Fire\"\n", - " self.grid[y][x] = new_tree\n", - " self.schedule.add(new_tree)\n", - " self.running = True\n", - " \n", - " def step(self):\n", - " '''\n", - " Advance the model by one step.\n", - " '''\n", - " self.schedule.step()\n", - " self.dc.collect(self)\n", - " # Halt if no more fire\n", - " if self.count_type(self, \"On Fire\") == 0:\n", - " self.running = False\n", - " \n", - " @staticmethod\n", - " def count_type(model, tree_condition):\n", - " '''\n", - " Helper method to count trees in a given condition in a given model.\n", - " '''\n", - " count = 0\n", - " for tree in model.schedule.agents:\n", - " if tree.condition == tree_condition:\n", - " count += 1\n", - " return count" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running the model\n", - "\n", - "Let's create a model with a 100 x 100 grid, and a tree density of 0.6. Remember, ForestFire takes the arguments *height*, *width*, *density*." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fire = ForestFire(100, 100, 0.6)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run the model until it's done (that is, until it sets its **running** property to False) just use the **run_model()** method. This is implemented in the Model parent object, so we didn't need to implement it above." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fire.run_model()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That's all there is to it!\n", - "\n", - "But... so what? This code doesn't include a visualization, after all. \n", - "\n", - "**TODO: Add a MatPlotLib visualization**\n", - "\n", - "Remember the data collector? Now we can put the data it collected into a pandas DataFrame:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "results = fire.dc.get_model_vars_dataframe()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And chart it, to see the dynamics." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "results.plot()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 7, - "text": [ - "" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nvMDe+t4vL6CooojodtHEh8cTFx5HXFhc3W10u2iiQqPsbbsoYtrFkBSZRIeoDnSI7ECHqA4kRiS2\n6AHhQHw/jofTk/y8efN49NFH2bZtG7GxsVx00UU88MADxMXFHdPrBQUFERkZWZfMQ0ND2bt3b0s2\nuc0cS5LX7pZqlpCgEPol9aNfUr8m1601tRRXFFN8oJiiiqK6+8UVxZRVlVFaWUpZZRn55flsK9xG\nfnk+eeV55JXlkVeeR1FFEfHh8SRHJZMcnUxyVDIdozoSGxZLbFgsMe1iiAmLITEikWGdh5EUmdQG\nfwHVFh599FEefvhhXnzxRc466yx27tzJtGnTGD9+PJ9//jmhoaHH9Lpr166lV69ezVrXm0Td1MM/\nEu3JK8epqa0hvzyf3LJccktz2VO2hz1leyg5UMK+yn11t7mluXyz6xuSo5IZ1W0Uo7raaVDHQTo0\n9Aic2pMvKSmhS5cuzJ07l0suuaRueVlZGT179mT27Nlcc8013HPPPWRmZhIREcE777xD9+7deeGF\nFxg2bFijrxsUFERWVlaDJJ+dnU2vXr2orq4mKCiItLQ0Ro8ezfLly1m9ejXfffcdlZWVTJ8+nW+/\n/ZYOHTrw17/+lUsvvbTV/w5Hoj15FRCCg4JtDz46uf56Y4dRU1tDZl4mX+78ki93fsnfvvobu0t3\nM7LrSM7odgZndDuDEV1H6EFjF/jiiy+oqKjg5z//eYPlUVFRnHvuuSxdupRrrrkGgA8++IB33nmH\nefPmcdddd3HjjTfy5ZdfHva1m7NTe/nll1m0aBF9+/Zl3759DBo0iHvvvZePPvqItWvXMn78eAYN\nGkT//v2PL9A2puPkW0GgjGd2QxzBQcEMTh7Mb4b9hrkXzGXTjZvImp7FtNOmUVpZyt3pd9P+t+3p\n9rdunPnCmfzmg9/w0OcP8e7Gd9lWuM2RPdrDabP3Q6RlpqOUn59PUlLSIVeDAujUqRP5+fl182PG\njGHChAmICJMnT2bNmjVHfO1TTz2VhIQEEhISuPnmmxsJWZgyZQr9+/cnKCiIxYsX111OMCgoqMHl\nBN1Ge/Iq4HSI6sAF/S7ggn4XALAsdRn/c+r/kLU3iy0FW8jam8V/tv+HtblrKTlQwsnJJzMkeQgn\nJ5/MSe1PoldCL7rGdj1xSz5+2vElJSWRn59PbW3tIYl+165ddOjQoW7e9zKAkZGRVFRUNPo8r9Wr\n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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, the fire burned itself out after about 90 steps, with many trees left unburned. \n", - "\n", - "You can try changing the density parameter and rerunning the code above, to see how different densities yield different dynamics. For example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fire = ForestFire(100, 100, 0.8)\n", - "fire.run_model()\n", - "results = fire.dc.get_model_vars_dataframe()\n", - "results.plot()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 8, - "text": [ - "" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "... But to really understand how the final outcome varies with density, we can't just tweak the parameter by hand over and over again. We need to do a batch run. \n", - "\n", - "## Batch runs\n", - "\n", - "Batch runs, also called parameter sweeps, allow use to systemically vary the density parameter, run the model, and check the output. Mesa provides a BatchRunner object which takes a model class, a dictionary of parameters and the range of values they can take and runs the model at each combination of these values. We can also give it reporters, which collect some data on the model at the end of each run and store it, associated with the parameters that produced it.\n", - "\n", - "For ease of typing and reading, we'll first create the parameters to vary and the reporter, and then assign them to a new BatchRunner." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "param_set = dict(height=50, # Height and width are constant\n", - " width=50,\n", - " # Vary density from 0.01 to 1, in 0.01 increments:\n", - " density=np.linspace(0,1,101)[1:]) " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# At the end of each model run, calculate the fraction of trees which are Burned Out\n", - "model_reporter = {\"BurnedOut\": lambda m: (ForestFire.count_type(m, \"Burned Out\") / \n", - " m.schedule.get_agent_count()) }" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Create the batch runner\n", - "param_run = BatchRunner(ForestFire, param_set, model_reporters=model_reporter)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 11 - }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Forest Fire Model\n", + "## A rapid introduction to Mesa\n", + "\n", + "The [Forest Fire Model](http://en.wikipedia.org/wiki/Forest-fire_model) is one of the simplest examples of a model that exhibits self-organized criticality.\n", + "\n", + "Mesa is a new, Pythonic agent-based modeling framework. A big advantage of using Python is that it a great language for interactive data analysis. Unlike some other ABM frameworks, with Mesa you can write a model, run it, and analyze it all in the same environment. (You don't have to, of course. But you can).\n", + "\n", + "In this notebook, we'll go over a rapid-fire (pun intended, sorry) introduction to building and analyzing a model with Mesa." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, some imports. We'll go over what all the Mesa ones mean just below." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import random\n", + "\n", + "import numpy as np\n", + "\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "from mesa import Model, Agent\n", + "from mesa.time import RandomActivation\n", + "from mesa.space import Grid\n", + "from mesa.datacollection import DataCollector\n", + "from mesa.batchrunner import BatchRunner " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building the model\n", + "\n", + "Most models consist of basically two things: agents, and an world for the agents to be in. The Forest Fire model has only one kind of agent: a tree. A tree can either be unburned, on fire, or already burned. The environment is a grid, where each cell can either be empty or contain a tree.\n", + "\n", + "First, let's define our tree agent. The agent needs to be assigned **x** and **y** coordinates on the grid, and that's about it. We could assign agents a condition to be in, but for now let's have them all start as being 'Fine'. Since the agent doesn't move, and there is only at most one tree per cell, we can use a tuple of its coordinates as a unique identifier.\n", + "\n", + "Next, we define the agent's **step** method. This gets called whenever the agent needs to act in the world and takes the *model* object to which it belongs as an input. The tree's behavior is simple: If it is currently on fire, it spreads the fire to any trees above, below, to the left and the right of it that are not themselves burned out or on fire; then it burns itself out. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class TreeCell(Agent):\n", + " '''\n", + " A tree cell.\n", + " \n", + " Attributes:\n", + " x, y: Grid coordinates\n", + " condition: Can be \"Fine\", \"On Fire\", or \"Burned Out\"\n", + " unique_id: (x,y) tuple. \n", + " \n", + " unique_id isn't strictly necessary here, but it's good practice to give one to each\n", + " agent anyway.\n", + " '''\n", + " def __init__(self, x, y):\n", + " '''\n", + " Create a new tree.\n", + " Args:\n", + " x, y: The tree's coordinates on the grid.\n", + " '''\n", + " self.x = x\n", + " self.y = y\n", + " self.unique_id = (x, y)\n", + " self.condition = \"Fine\"\n", + " \n", + " def step(self, model):\n", + " '''\n", + " If the tree is on fire, spread it to fine trees nearby.\n", + " '''\n", + " if self.condition == \"On Fire\":\n", + " neighbors = model.grid.get_neighbors(self.x, self.y, moore=False)\n", + " for neighbor in neighbors:\n", + " if neighbor.condition == \"Fine\":\n", + " neighbor.condition = \"On Fire\"\n", + " self.condition = \"Burned Out\"\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we need to define the model object itself. The main thing the model needs is the grid, which the trees are placed on. But since the model is dynamic, it also needs to include time -- it needs a schedule, to manage the trees activation as they spread the fire from one to the other.\n", + "\n", + "The model also needs a few parameters: how large the grid is and what the density of trees on it will be. Density will be the key parameter we'll explore below.\n", + "\n", + "Finally, we'll give the model a data collector. This is a Mesa object which collects and stores data on the model as it runs for later analysis.\n", + "\n", + "The constructor needs to do a few things. It instantiates all the model-level variables and objects; it randomly places trees on the grid, based on the density parameter; and it starts the fire by setting all the trees on one edge of the grid (x=0) as being On \"Fire\".\n", + "\n", + "Next, the model needs a **step** method. Like at the agent level, this method defines what happens every step of the model. We want to activate all the trees, one at a time; then we run the data collector, to count how many trees are currently on fire, burned out, or still fine. If there are no trees left on fire, we stop the model by setting its **running** property to False." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class ForestFire(Model):\n", + " '''\n", + " Simple Forest Fire model.\n", + " '''\n", + " def __init__(self, height, width, density):\n", + " '''\n", + " Create a new forest fire model.\n", + " \n", + " Args:\n", + " height, width: The size of the grid to model\n", + " density: What fraction of grid cells have a tree in them.\n", + " '''\n", + " # Initialize model parameters\n", + " self.height = height\n", + " self.width = width\n", + " self.density = density\n", + " \n", + " # Set up model objects\n", + " self.schedule = RandomActivation(self)\n", + " self.grid = Grid(height, width, torus=False)\n", + " self.dc = DataCollector({\"Fine\": lambda m: self.count_type(m, \"Fine\"),\n", + " \"On Fire\": lambda m: self.count_type(m, \"On Fire\"),\n", + " \"Burned Out\": lambda m: self.count_type(m, \"Burned Out\")})\n", + " \n", + " # Place a tree in each cell with Prob = density\n", + " for x in range(self.width):\n", + " for y in range(self.height):\n", + " if random.random() < self.density:\n", + " # Create a tree\n", + " new_tree = TreeCell(x, y)\n", + " # Set all trees in the first column on fire.\n", + " if x == 0:\n", + " new_tree.condition = \"On Fire\"\n", + " self.grid[y][x] = new_tree\n", + " self.schedule.add(new_tree)\n", + " self.running = True\n", + " \n", + " def step(self):\n", + " '''\n", + " Advance the model by one step.\n", + " '''\n", + " self.schedule.step()\n", + " self.dc.collect(self)\n", + " # Halt if no more fire\n", + " if self.count_type(self, \"On Fire\") == 0:\n", + " self.running = False\n", + " \n", + " @staticmethod\n", + " def count_type(model, tree_condition):\n", + " '''\n", + " Helper method to count trees in a given condition in a given model.\n", + " '''\n", + " count = 0\n", + " for tree in model.schedule.agents:\n", + " if tree.condition == tree_condition:\n", + " count += 1\n", + " return count" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the model\n", + "\n", + "Let's create a model with a 100 x 100 grid, and a tree density of 0.6. Remember, ForestFire takes the arguments *height*, *width*, *density*." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fire = ForestFire(100, 100, 0.6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run the model until it's done (that is, until it sets its **running** property to False) just use the **run_model()** method. This is implemented in the Model parent object, so we didn't need to implement it above." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fire.run_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's all there is to it!\n", + "\n", + "But... so what? This code doesn't include a visualization, after all. \n", + "\n", + "**TODO: Add a MatPlotLib visualization**\n", + "\n", + "Remember the data collector? Now we can put the data it collected into a pandas DataFrame:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "results = fire.dc.get_model_vars_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And chart it, to see the dynamics." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, "metadata": {}, - "source": [ - "Now the BatchRunner, which we've named param_run, is ready to go. To run the model at every combination of parameters (in this case, every density value), just use the **run_all()** method." - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "param_run.run_all()" - ], - "language": "python", + "data": { + "image/png": "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\nZ7ka7sesabTEPrbEnrTEfmmJfRHYjgFcDLwEdCWM9HcecH5xOzTL1BQkpa+jcZrtZLAZYF3S1pKB\n3y6T9OvXzyZPnlw3f99999l2221XNz9o0CC79tpr6+avu+4622effermJdmVV15p22yzjW299db2\n6KOPWs+ePe2yyy6zLbbYwnr06GHXXXdd3frLli2z733ve9anTx/r1q2bnXrqqfbhhx/WLb/00kut\nR48e1rNnTxs3bpxJsldffXUt3StXrrQ+ffrYz372s7XKP/3pT9v5559vZmZJktiIESPqlr/++usm\nyVasWGE/+MEPrGXLlrbxxhtb+/bt7fTTT1/nNarGZ8+n1Z69Btfxmn0TKMwpLTEYuJAQYvluWprW\npBpyc1ea+FDwwQcfcOutt7L33nvXLZO03trv3XffzdNPP8306dMxM+bNm8fixYv53//+x7hx4zjt\ntNN4772QQmXMmDHMnDmT5557jpkzZzJnzhx+/OMfAzBx4kQuu+wyHnroIWbMmMFDDz1U7zFffvll\n3nzzTY4++ujVyiXxla98hUmTJjWoWRL/93//x7777suVV17JkiVLuOKKdWYOKCvVcD/WukY39huA\nRHfgZuBYM2akrSfrSKWZmoKZccQRR9C5c2c6derE5MmT+f73v9+ofYwdO5ZOnTrRpk0bAFq3bs35\n559Py5YtOfjgg2nfvj0vv/wyZsY111zDL37xCzp16kT79u0ZO3Yst9xyCwATJkzgpJNOYsCAAbRt\n25ZcLlfvMRcsWABAjx491lrWvXv3uuXFkH/ZOc0T71TVBMzs0Th04HWEPPT1V81SwjLmfwRI09ZI\n4u6772b//ffHzLjrrrsYNGgQL774IltssUVR++jdu/dq85ttthktWqyqL7Vt25alS5cyf/58Pvjg\nA3bfffe6ZWbGypWhx/xbb73FHnvsUbesT58+9R6za9euddv07dt3tWVvvfUWm2++eVHaIV2/fRbv\nxzWpdY1es286pwGbAfVXy5xMIokjjzySli1b8ve//x2Adu3a8f7779etM3fu3HVuVwxdu3Zlk002\nYfr06SxcuJCFCxeyaNEiFi8Ogyj16NGD//73v3XrF35fk+23355evXoxYcKE1cpXrlzJHXfcwQEH\nHFCn/4MPPqhXf9oNtE76uLFvAtLRJxAGUT/WjOVp61kX1eB/rDR5N4aZcffdd7Nw4UL69+8PwC67\n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\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [], - "prompt_number": 12 - }, + "output_type": "display_data" + } + ], + "source": [ + "results.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, the fire burned itself out after about 90 steps, with many trees left unburned. \n", + "\n", + "You can try changing the density parameter and rerunning the code above, to see how different densities yield different dynamics. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, "metadata": {}, - "source": [ - "Like with the data collector, we can extract the data the batch runner collected into a dataframe:" - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "df = param_run.get_model_vars_dataframe()" - ], - "language": "python", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXe4FNX5xz/fexWkF1FABLGAgg1FxRoxikFjbImoUYSI\nRgMWbBHUOHfsIWLUWJKfDUsEscQuggajiQUbSkREoqggIChVQCnv748ze1kul1t3d3Znz+d55tmZ\nM+377uy+e/Y957xHZobH4/F4kklJ3AI8Ho/Hkz28k/d4PJ4E4528x+PxJBjv5D0ejyfBeCfv8Xg8\nCcY7eY/H40kw1Tp5ScMlfSRpiqSHJTWU1FrSBEnTJY2X1LLC8Z9Kmibp8LTyntE1PpV0S7YM8ng8\nHs86qnTykjoDZwJ7mtmuQClwEjAMmGBmXYGXo20kdQdOBLoDfYE7JCm63J3AIDPrAnSR1Dfj1ng8\nHo9nPaqryS8BVgGNJW0CNAa+Bo4G7o+OuR84Nlo/BhhtZqvMbCYwA+glqT3QzMwmRcc9kHaOx+Px\neLJElU7ezL4DRgJf4pz7IjObALQ1s3nRYfOAttH6VsCstEvMAjpUUj47Kvd4PB5PFqkuXLM9MBTo\njHPUTSWdmn6MubwIPjeCx+Px5CGbVLN/L+B1M/sWQNITwH7AXEntzGxuFIr5Jjp+NtAx7fytcTX4\n2dF6evnsym4oyf9geDweTy0xM1VWXp2Tnwb8QVIjYCVwGDAJ+B4YAPwxen0yOv5p4GFJN+HCMV2A\nSWZmkpZI6hWd3x+4tbZik4CkMjMri1tHNvE2Fj5Jtw/itVFCQAucn2wPtI6WVhXWW1RYmgMNgbW4\n9tJoUauN3atKJ29mH0h6AHgnuuh7wP8BzYCxkgYBM4F+0fFTJY0FpgKrgcG2Ls3lYGAU0Ah43szG\n1fQNSRid4xaQAzrHLSAHdI5bQJbpHLeAHNA5GxeVKAG2wDnwraOlsnXDRTrmAN8C3wELgfnA9Gh9\ncdqyCNcZ5gcz1la450YjINXV5DGzEcCICsXf4Wr1lR1/HXBdJeXvArtWdz+Px+MpJCQaA3sDB0TL\nfrhK8SzWhatnAf9KK5tlxpJc6KvWyXsyzqi4BeSAUXELyAGj4haQZUbFLSAHjKrriRJbAqcBv8JV\nXv8L/Ae4FxhkxtxMCMwEyrdJQyRZkmPyHo+nMJEoBX4GDAIOxbVFPgS8bsbyeLVt3G/mZe4ahWpb\n/VGFiaTecWvINt7Gwifp9kHNbZTYTOJKXPtjALwIdDJjoBkvxe3gqyMvnTzwoUKdrFC+Ru/xeGJD\noieQak880oxeZvxfruLpmSAvwzWUsQ9wHy4twu8ssDkxy/J4PEWExKbAcOAc4HwzRscsqUoKLlxj\ngb0N9MQ1ZnygUKf4Wr3H48kFEjviGlEPAPbIdwdfHXnp5AEssB8ssCuAI4DLgYcVbrzDf6HgY53J\nIOk2Jt0+2NBGiRKJ83AOfhTQ16zykfmFRN46+RQW2Lu4Wv18XK3+kJgleTyehCGxHfBPXCr1/c24\nwywZObnyMia/sdiSQvUF7gFGA5dbYD/kVJzH40kUUXqBs4BrgBuAP5uxJl5VtadKv1lITh5Aodrg\nUitsDwyywN7JmTiPx5MYJDrhKo0tgIFmTI1ZUp0puIbXqrDAFgC/BG4CnlaoBxWqU8yyakwxxjqT\nSNJtTLJ9EpLoDy99CEzEhWcK1sFXR8E5eQALzCyw+4Edgc+B9xXqeoVqEbM0j8eTx0i0BB4GhsF9\nF5lxnRmr49aVTQouXFPpOaE6AFcDR0avf7PAEv3gPB5P7ZD4CfAgLiX6781YEbOkjJGomHyV54ba\nHRfG2QI4xwJ7NaPiPB5PwRENbAqA04EzzXguZkkZJ1Ex+aqwwD7ApUC+GnhIof6uUFvFLGs9khzr\nTOFtLHySYl/UNfI1YE/cwKbn1u1Lho3VkSgnD+Xx+keBbsAXuDw4FytUg5ileTyeHCLRD3gTGAP8\n3Ix5MUuKhUSFayq9XqiuwC3ANsAQC2xipq7t8XjyD4lGwM24dMAnmvFuzJKyTtHE5Dd6TZf35hjc\ng38duMgnPfN4kodEd+ARYApwdiFli6wPRROT3xhRCOdJYGdcTugPFWqoQuV8ZqxiiAN6GwufQrRP\nYiBuir2bgVOqc/CFaGNdqNbJS9pR0vtpy2JJ50lqLWmCpOmSxktqmXbOcEmfSpom6fC08p6SpkT7\nbsmWURvDAvveArsMOAg4CnhPofbJtQ6Px5M5JBpI3IlLDdzbjHuSkncmE9QqXCOpBDcp7T7AucAC\nMxsh6VKglZkNk9QdN9hgb9ys5C8BXczMJE0CzjGzSZKeB241s3EV7pGT6f+iEM5JuF/924Drfd96\nj6ewkNgKeAz4BhhgxuKYJcVCJsM1hwEzzOwr4Gjg/qj8fuDYaP0YYLSZrTKzmbiJP3pJag80M7NJ\n0XEPpJ2Tc6IQzmhchsvewCsKtW1cejweT+2QOBB4G3geOL5YHXx11NbJnwTlCfTbmlmqS9I8IDUv\n61bArLRzZuFq9BXLZ0flsWKBzQL6AP8AJilU/2xOUFIMcUBvY+GTz/ZFuWfOAR4HzjDjGjPW1v46\n+WtjJqmxk5fUAPgF8GjFfeZiPgUbA7PA1lpgI3H/VIbhJihpHrMsj8dTAYmtgaeAM3GJxV6IWVLe\nU5veJUcA75rZ/Gh7nqR2ZjY3CsV8E5XPBjqmnbc1rgY/O1pPL6901hVJo3C9YAAWAZPN7JVoX2+A\nbGxbYB+omS6gD+ewO5MU6jjK3D+UTN0vVZYLe+LcTrc1H/T47cLeBnsV+C28dAN89iT89gQzfqjX\n993slXyxr47fr95AZ6qhxg2vksYAL5jZ/dH2COBbM/ujpGFAywoNr/uwruF1h6jh9S3gPGAS8Bwx\nNrxWh0L9BhgBnG2BPR63Ho+nWJHoCtwFNAQGmfFRzJLyjno3vEpqggtlPJFWfAPQR9J04KfRNmY2\nFRgLTAVeAAbbul+SwcDdwKe4Btz1HHw+YYHdB/QFRirUiEz1qS+GOKC3sfDJB/skNpUYhhvA+ARw\nQCYdfD7YmAuKYsRrfYhmonoYKAVOsqA8XFW366WFapKKt7Hwids+iT1wszbNB84yKw/fZvAeyXmG\nVflN7+RrgEKV4jJbngqcaIG9EbMkjyeRSGwGXAmcAVwCPOAHNlWPd/IZQqGOxoWbrgH+YkGevXke\nTwET9Xu/B/gQONeMuTFLKhgyORiqqLHAngb2BQYCYxSqWW2vUQxxQG9j4ZNL+6LY+0hcYrHhZpyQ\nCwef9GeYwjv5WmKBfQbsDywG3laoXWKW5PEULBKbA+OA7sCuZut17vBkAB+uqQcKNQC4ERhqgf09\nbj0eTyEhsRvwJG6A5WVmrIlZUsHiY/JZRKF2w3Xveh6Xp35VzJI8nrxH4lfAncB5ZuWpUjx1xMfk\ns4gF9iEu4+Z2wD8Vqn1VxxdDHNDbWPhkyz6JEomrgZHAz+J08El/him8k88AFthCXFbOCbg4/QEx\nS/J48o6oe+QY3HD8vc14L15FxYEP12QYhToSGIXrV3+b72bp8YBEa1z8/Wtc3vcfYpaUKHy4JodY\nYM8D+wG/AV5QqG1iluTxxIrENsC/cTmrfu0dfG7xTj4LWGD/A3rh5pt8V6HOUagSKI44oLex8MmU\nfRI9gP8AfzPj4rrkfc8WSX+GKbyTzxIW2CoL7HrgQNxkK68q1E4xy/J4coZEH2A8MNSMnM/p7HH4\nmHwOiGrxvwNC4E/AnyywvKnReDyZRELAEOAK4AQzXotZUuLx/eTzhCg+/yCwEuhvQfn0iR5PIpBo\nBPwV6AEcZ8ZnMUsqCnzDa55ggX3BtYTAm8B7CnVo3JqyQTHEOpNuY13sk+iEa2BtgJuaL68dfNKf\nYQrv5HPNKtZYYFcCpwEPKNRVmZqQxOOJC4lDgLeAv+N60HwfsyRPhA/XxIhCtQUewk1rdqoF9mXM\nkjyeWiFRAlwIXAycYsbLMUsqSnxMPo+JGmUvxX1JbgRussB8P2JP3hP1fx8FbAqcmo3Zmzw1w8fk\n84iKcUALbG3U1XJv3CCqKQrVNw5tmaIYYp1Jt7Eq+yQkcRrwDi5N8MGF6OCT/gxT1HQi75aSHpP0\nsaSpknpJai1pgqTpksZLapl2/HBJn0qaJunwtPKekqZE+3y/2TQssM8ssKOBC4DbFOpJhdo2bl0e\nTzoSbXCpgS8B+pjxR58iOL+paU3+FuB5M+sG7AZMA4YBE8ysK/BytI2k7sCJuEkA+gJ3SEr9jbgT\nGGRmXYAuUmHXWOtCdRMHW2DPAbvghoC/rVBDFKqgwldJmRy5KpJuY0X7otr7L4EPgJm4BGOTY5CW\nMZL+DFNUG5OX1AJ438y2q1A+DTjYzOZJage8YmY7SRoOrDWzP0bHjQPKgC+Af0Y/FEg6CehtZmdX\nuG5RxeSrQqG6Ag8Ds4FBFtiCmCV5ihCJbsCtQDtgiBmvxizJU4H6xuS3BeZLuk/Se5LuktQEaGtW\nPphnHtA2Wt8KmJV2/iygQyXls6PyoqI2cUALbDpuqsFPgMkK9dNs6cokxRDrTLqNknpLNJMYAbwK\nPAvsmSQHn/RnmKIm/bM3AfYEzjGztyXdTBSaSWFmJilj3XQkjYLyhpxFwOTUX6vUgynUbaCHpJof\nX8b+wPOUMQF4UMfoFV7kXltpL+eDPRvZ7gHkk56Mb6fIFz2Z3S4BrjoUeAgengK3/NbsrX/kjz6/\nHdEb6Ew11CRc0w54w8y2jbYPBIbjZkI6xMzmSmoPTIzCNcMiUTdEx48DAly4ZmJauOZkXLjHh2tq\niEJtCdwHtAKOscDmxyzJkzCibpF/BdoDg814PWZJnhpQr3CNmc0FvpLUNSo6DPgIeAYYEJUNwE0I\nAPA0cJKkBpK2BboAk6LrLJHrmSOgf9o5nhpggX0DHAX8E3hDobrELMmTEKJp+YbgukW+imtY9Q4+\nAdRoMJSk3YG7cTkp/oebEKMUGAt0woVW+pnZouj4y4DTgdXA+Wb2YlTeEzd4ohGut855ldwr0TV5\nSb0z0aqvUL/FZbU8zgJ7s97CMkimbMxnkmSjxI7APYCAQWZMS5J9GyNJNlblN/2I1xyTyQ9W2lSD\nZ1pgT2XimpkgSV+ejZEEG6OUBBcDv8f1gLsjNalHEuyrjiTZ6J18glGovXAhsmstsNvj1uMpDCS2\nxKW9boJPSVDweCefcBRqO+AF3BDzSyywH2OW5MljooyRD+H+BQZmrI5Xkae+1LefvCeDZKNvrgX2\nGbAvsD0wUaG2yvQ9akMx9D8uRBslSiUCXDrg35hx+cYcfCHaV1uKwUbwTj4xWGALgaNxNfp3FBbH\nB9hTMyTaAS8BPwF6mjE+ZkmeHOHDNQlEoQ4HHgBGAjdakGcP2ZNTJHoAT+HCM1f5hGLJw8fkixCF\n6gQ8BnwFDLTAlsYsyRMDEsfguj8PMWNs3Ho82cHH5POIXMUBo1mmDgK+A/4TTSKeE4oh1pnvNkZZ\nI38P3A4cWVsHn+/2ZYJisBG8k0800QxTv8WlQnhDofaNWZInB0g0wA1uOhnYz4y3Y5bkiREfrikS\nFOoo4F7gfAtsdNx6PNkhmtTjcdw/uP5mLItZkicH+Ji8BwCF2g03cOp+oMw3yCYLiZ1xz/dR4LLU\n6FVP8vEx+TwizjigBfYh0As4HBirUM2zcZ9iiHXmm40SPwcmAmVmDKuvg883+7JBMdgI3skXHRbY\nPOAQ4FvgXYXaM2ZJnnoQNbBeDNwFHGPGg3Fr8uQXPlxTxCjUScBfgKuA23z4prCQaIibN3lP4Ggz\nvoxZkicmfEzes1EUagfgEdykLoOikbOePEdic+AfwALgNN/AWtz4mHwekW9xQAtsBm4e2a+A9zPR\nzTLfbMwGcdoosQPwRrT8KhsO3j/D5OCdvAcL7AcL7HxgKPC0Qg1VKP9vKg+R2B/4NzDSjEt9DxpP\ndfhwjWc9orTFY4EvgdMtcLN9eeJHoh9uBOtpZrwQtx5P/uDDNZ4aE6UtPgD4Gt/7Ji+IetBciks4\nd5h38J7a4J18jimEOGAUvjkHuAx4UaF+V5vwTSHYWF9yZaNEY1z2yFSKgg9yc1//DJNCjZy8pJmS\nPpT0vqRJUVlrSRMkTZc0XlLLtOOHS/pU0jRJh6eV95Q0Jdp3S+bN8WQSC+wRXK3+d8D9CtU4ZklF\nhcT2uMbVTYADzJgVsyRPAVKjmLykz4GeZvZdWtkIYIGZjZB0KdDKzIZJ6g48DOwNdMBNVNDFzCz6\ngTjHzCZJeh641czGVbiXj8nnGQrVBDfYphtwnAU2M15FyUfiF7gkY1cBt5uRX41nnryi3v3kIye/\nl5l9m1Y2DTjYzOZJage8YmY7SRoOrDWzP0bHjcPNBP8F8E8z6xaVnwT0NrOzayrWEx9RuOZ8YBjQ\n3wKbELOkRCJRinPspwH9zHgj8/eQ/8EoYCrzj1X5zU1qel3gJUlrgL+Z2V1AWzObF+2fB7SN1rcC\n3kw7dxauRr8qWk8xOyovKiT1NrNX4tZRW6LRsDcr1GRgtELdDIyobJRsodpYG7Jho8RWuORxpbgp\n+r7J5PXTybdedZ6aoTr0bK6pkz/AzOZI2gKYENXiy4lCMRn71EgaBcyMNhcBk1NfqFRjSaFuAz0k\n5Y2eWusvA7bhPH7DxUBPNdHdLOfHCsf3APJCb7a2U2TmeiXAmq2Am+H/nocLHzRb9k0u9HsKj7Rn\n2BvoXO3xtf1FlxQAy4AzceGWuZLaAxOjcM0wADO7ITp+HBDgwjUT08I1J+PCPT5cU4Ao1Ga4Xh/t\ngGMssMXxKipMJLbA5Z/pjuv//k727ynzNfnCJKog1ipcU23vGkmNJTWL1pvg0tROweWtHhAdNgB4\nMlp/GjhJUgNJ2wJdgElmNhdYIqmX3H+O/mnneAoMC2wl8GvcZ+FfCtU+ZkkFh8SxwIfAZ8CeuXDw\nnuKjJl0o2wKvSZoMvAU8a2bjgRuAPpKmAz+NtjGzqbgRk1OBF4DBadWGwbhJhT8FZlTsWVMMJOnv\nsgW2FjgPN0nFv6NkZ4mycWPUx0aJxhL3AX/C5Z75vRkrMybOkzVKSkr47LPP4pZRK6p18mb2uZn1\niJZdzOz6qPw7MzvMzLqa2eFm64a/m9l1ZraDme1kZi+mlb9rZrtG+87LjkmeXGKBmQV2Le5H/lU/\nQrZq0pKLbQL0MOM/MUvKKzp37kzjxo1p1qwZrVu35qijjmLWrMIZHvDss8+yzz770LRpU9q0acOp\np57K7Nmza3x+7969ueeeezKqyY94zTFJ7XVigd0FDAHGUcamcevJNnV5jlHf99eBv+Hi799nWleh\nI4lnn32WpUuXMmfOHNq2bcu5555bp2utXr06w+qq5rHHHuOUU07hwgsv5Ntvv+Wjjz6iYcOGHHjg\ngSxaVLMUUHXpPVMtZpZXi5MUvw6/1PH5lXEQZcyhjAsocw37xb6AlYJdDfYV2H7x68Hylc6dO9vL\nL79cvv3cc89Z165dy7cPPvhgu/vuu8u377vvPjvwwAPLtyXZ7bffbjvssINtt9129sorr1iHDh1s\n5MiRtuWWW1r79u3tvvvuKz9+5cqVdtFFF1mnTp2sbdu2dvbZZ9uKFSvK948YMcLat29vHTp0sHvu\nucck2f/+978NdK9du9Y6depkf/rTnzYo32WXXezKK680M7MgCOzUU08t3//555+bJFu9erVddtll\nVlpaaptttpk1bdrUzj333A3uszH/WJXf9DX5HJP0eLUF9hoPMBTXsP6AQjWKW1M2qOlzlGgDPAcc\nCOxlWRjclDQip8Xy5ct55JFH2G+//cr3KcrWVhVPPfUUb7/9NlOnTsXMmDdvHkuWLOHrr7/mnnvu\nYciQISxe7DqDDRs2jBkzZvDBBx8wY8YMZs+ezVVXXQXAuHHjGDlyJC+99BLTp0/npZde2ug9P/nk\nE7766itOOOGE9col8ctf/pIJE6oeOyiJa6+9loMOOojbb7+dpUuXcuutt1Z5Tk3xTt6TeT5jHs6p\nlQKvKVTHmBXlHIkSiTOAj4DJQB8z5lVzWl4gZWapC2bGscceS6tWrWjZsiUvv/wyF198ca2uMXz4\ncFq2bEnDhg0B2HTTTbnyyispLS3liCOOoGnTpnzyySeYGXfddRc33XQTLVu2pGnTpgwfPpwxY8YA\nMHbsWE4//XS6d+9O48aNCcNwo/dcsGABAO3bb9jJrF27duX7a0LqRy5TeCefYyyhMfl0zOwVC2w5\ncAowBnhLoX4Ss6yMUtVzlOgB/AcYBPzMjGFm5DZAXA/MMrPUBUk89dRTLFy4kB9++IG//OUvHHzw\nwXzzTc0H/3bsuH6dYvPNN6ekZJ2ra9y4McuWLWP+/PksX76cnj170qpVK1q1asURRxxR7pDnzJmz\n3rU6deq00Xu2adOm/JyKzJkzhy222KLG+jMdl/dO3pM1op43NwK/AR5VqKuiQVSJRKK5xM3Ai7jk\nYgeYMTlmWQWLJI477jhKS0v597//DUCTJk34/vt17dVz586t9Lya0KZNGxo1asTUqVNZuHAhCxcu\n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\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [], - "prompt_number": 13 - }, + "output_type": "display_data" + } + ], + "source": [ + "fire = ForestFire(100, 100, 0.8)\n", + "fire.run_model()\n", + "results = fire.dc.get_model_vars_dataframe()\n", + "results.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... But to really understand how the final outcome varies with density, we can't just tweak the parameter by hand over and over again. We need to do a batch run. \n", + "\n", + "## Batch runs\n", + "\n", + "Batch runs, also called parameter sweeps, allow use to systemically vary the density parameter, run the model, and check the output. Mesa provides a BatchRunner object which takes a model class, a dictionary of parameters and the range of values they can take and runs the model at each combination of these values. We can also give it reporters, which collect some data on the model at the end of each run and store it, associated with the parameters that produced it.\n", + "\n", + "For ease of typing and reading, we'll first create the parameters to vary and the reporter, and then assign them to a new BatchRunner." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "param_set = dict(height=50, # Height and width are constant\n", + " width=50,\n", + " # Vary density from 0.01 to 1, in 0.01 increments:\n", + " density=np.linspace(0,1,101)[1:]) " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# At the end of each model run, calculate the fraction of trees which are Burned Out\n", + "model_reporter = {\"BurnedOut\": lambda m: (ForestFire.count_type(m, \"Burned Out\") / \n", + " m.schedule.get_agent_count()) }" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create the batch runner\n", + "param_run = BatchRunner(ForestFire, param_set, model_reporters=model_reporter)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the BatchRunner, which we've named param_run, is ready to go. To run the model at every combination of parameters (in this case, every density value), just use the **run_all()** method." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "param_run.run_all()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like with the data collector, we can extract the data the batch runner collected into a dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "df = param_run.get_model_vars_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "df.head()" - ], - "language": "python", + "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", + "
BurnedOutRundensityheightwidth
0 0.009288 11 0.12 50 50
1 1.000000 98 0.99 50 50
2 0.092608 48 0.49 50 50
3 0.024691 3 0.04 50 50
4 0.060748 42 0.43 50 50
\n", + "
" + ], + "text/plain": [ + " BurnedOut Run density height width\n", + "0 0.009288 11 0.12 50 50\n", + "1 1.000000 98 0.99 50 50\n", + "2 0.092608 48 0.49 50 50\n", + "3 0.024691 3 0.04 50 50\n", + "4 0.060748 42 0.43 50 50" + ] + }, + "execution_count": 14, "metadata": {}, - "outputs": [ - { - "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", - "
BurnedOutRundensityheightwidth
0 0.142256 45 0.46 50 50
1 0.946026 68 0.69 50 50
2 0.978022 71 0.72 50 50
3 0.027190 12 0.13 50 50
4 0.082645 43 0.44 50 50
\n", - "
" - ], - "metadata": {}, - "output_type": "pyout", - "prompt_number": 14, - "text": [ - " BurnedOut Run density height width\n", - "0 0.142256 45 0.46 50 50\n", - "1 0.946026 68 0.69 50 50\n", - "2 0.978022 71 0.72 50 50\n", - "3 0.027190 12 0.13 50 50\n", - "4 0.082645 43 0.44 50 50" - ] - } - ], - "prompt_number": 14 - }, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, each row here is a run of the model, identified by its parameter values (and given a unique index by the Run column). To view how the BurnedOut fraction varies with density, we can easily just plot them:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "(0, 1)" + ] + }, + "execution_count": 15, "metadata": {}, - "source": [ - "As you can see, each row here is a run of the model, identified by its parameter values (and given a unique index by the Run column). To view how the BurnedOut fraction varies with density, we can easily just plot them:" - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.scatter(df.density, df.BurnedOut)\n", - "plt.xlim(0,1)" - ], - "language": "python", + "data": { + "image/png": "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\nrkJggg==\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 15, - "text": [ - "(0, 1)" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nJ96yQeoR7++jxeYtG6Ql1O2KnPrnAezZ8zB79jxs6KuvHPFr4BUdaXf7iVt+UpeWmnfnlJpYjPDt\ndkWOK3m01LoNfj+IRQNt5857aqFfDd+jR6vfc9StMjP4pQV0uyLHlTxariz1aKAtVp2923kCV/Jo\nKVnjl+Zh+GpQGfzSMuCLjHrJdfxSF1qtz2937f5Mu8su+yBXX/1x9u69mr17r+baa7d5F04tT5nZ\n969qN6TempqayuHhdQkPJDyQw8PrcmpqasF98x9jQ+2/Wft6IEdHt/T6x1KJ1LKz48x1xK/SmrvU\nszoBPFOmabVv/mO8vXedlwpwOacGRv/r6zcCN5zacvmmlq1u/kxY7C8s9aigdksz7T6nu1LPAzk0\ndHauX78pR0e3LHh+qSi6LPW4qkddaTW67tXIu/48R468wTPP/Dad3h5hMX6O/v+lobLqdlVP30f7\n6Yh/xVmMkXKzY46Obmk6Um62r/E8q1adkzDhxKpKhS5H/H0P/TT4l5VWATxjdHTLvKtXWu2b79jd\nvJA0O8+qVW/t+AVHWsm6DX5X9SwT3d7vfbH7cO2125ZkHXqrYy/G6hqASy/9FUZHdzM6urvlbRkW\nY+2+tKJ182qx2F+UfMTfbXmkyPmajbxbjdbb7W8nI/T5/0qYyDVrLszR0S25fv3Gps8rUlJa7DKV\n1C9Y6mmtnRJGvywUuJ3Wv1tpFW7tBn83fVqoBDTbp4mEs+pWyfxSDg2dPWd7/fqNOTq6Jb/0pS91\n/P+02zKVtBwZ/C0sNJLr5kVhMV9I2g/F04Ov3RHqTH/XrLmwg3PNXZrYqka/0IvA+vUbc2jolxb8\nf9CsfzN9WL9+05wXgW5G5Aa/Bklpg7+d0KmGSfMVH62CtdsQa9W/+u2ZEWuzQJvZ1ywIZ24NMDuZ\n2fznqj9Pq9sKzATr3D7N/RkbR94zP3MnpZN2XkgWK5gXcyJZWq4GLvjbGVE3+0WdL7hgbcLUaWHX\nKljnD4Vm4blxwUAfGjq7rk+nlzSaj+RPPxdsqT1u3FetjTeed+4LxFTtWrQO9GYhWz3f3NAtssKn\nWcguRimqyF94y7kkKDUaqOBv992QrZf0NQvMDU3CrlWwzhdip09GVteRnx7oc19wNrQ4xnznmhvU\nc4/XzXlnXyBaTZ4udfAv9rLPepZsVBbdBn/he/VExGbgDmA18PXMvL1JmzuBjwL/F/jNzHym1THn\nLuGb5tixM3jmmU8AsG/ftpZL9U6evKj2vN2n7Vuz5qdcfvlujhx5d927PN9G/f1V4PeBB09tHTny\nBmNjW3n66f3Au2rfnXtPllWrHuDkya/UjrcVuJPZd5AC3AN0+27OcWAba9Z8kXe+8zwOHDjBsWM/\nAXYxPPwgO3ZM8Nhju3n66f28+eZ8593IqlWf4eTJ6neHhx/km9+sXsOxsa1Nz9r4sYFDQ58FjnPs\n2K7aMWbvQzPfxwt2+9GD4+PjTf//jo+P88gju+reJdv5J2lJotiIn2rYHwYuAM4EngXe29DmKuDR\n2uMrgR80OU5mzleTP330NlMSaSznzH335tyRcuuSQfMSydzSzAO1EfXEqX31k46tRvKzf2nMX+pp\nt9bcyVLM+pLVfCtgOjlXkcndbkfv3bBWr7KgH6Ue4APAVN32LcAtDW2+BlxXt30IWNfQ5rRf1tmQ\nPb1MMVvemBvAjatc5isRtRt2cwO9GqYzJZL5jzd/7X6+yd3FqDV3Mknd7Ln9qGsv5Xmt1asM+hX8\n/w64t277BuBPGtp8F/jVuu3/CVze0KbpiLU6Cm8c1c+/kiWz/V/4dtp1u4qkm/Xli8Gwk8ql2+Av\nWuPPNts13j3utOf96EcvAP8P+BtgBIDLL7+UPXsebrgL46/wTIsZgvnqw92066RG3Xi8HTsW7MKi\na/dnl7QyVSoVKpVK8QN182ox8wVsYG6p51Zge0ObrwH/vm67rVJPu/c/79ftDSSp3+hyxF/ofvwR\ncQbwIvBh4HXgfwHXZ+bBujZXATdn5lURsQG4IzM3NBwnM9P7n0tSB7q9H3/hD2KJiI8yu5zzvsz8\no4i4CSAz7661+SqwGfgH4BOZ+VcNx8ii/ZCksulb8C8Gg1+SOtdt8Hs/fkkqGYNfkkrG4JekkjH4\nJalkDH5JKhmDX5JKxuCXpJIx+CWpZAx+SSoZg1+SSsbgl6SSMfglqWQMfkkqGYNfkkrG4JekkjH4\nJalkDH5JKhmDX5JKxuCXpJIx+CWpZAx+SSoZg1+SSqbr4I+INRGxNyL+OiL2RMTZTdqcHxHfi4gD\nEfG/I+J3inVXklRUkRH/LcDezHw38Oe17UbHgc9k5sXABuA/R8R7C5xz4FUqlX53YdnwWszyWszy\nWhRXJPivBnbVHu8Cfq2xQWb+JDOfrT3+P8BB4O0Fzjnw/Ec9y2sxy2sxy2tRXJHgX5eZb9QevwGs\na9U4Ii4A1gNPFjinJKmgM1rtjIi9wNua7NpRv5GZGRHZ4jj/GPg28Lu1kb8kqU8ic968bv3EiEPA\nSGb+JCL+GfC9zPwXTdqdCfx34H9k5h3zHKu7TkhSyWVmdPqcliP+BewGtgG31/77p40NIiKA+4AX\n5gt96K7jkqTuFBnxrwH+G/AO4GXg1zPz7yLi7cC9mflvI+KDwF8CzwEzJ7o1M6cK91yS1JWug1+S\ntDL19J27EbE5Ig5FxEsRsX2eNnfW9u+PiPW97F8vLXQtIuJjtWvwXEQ8HhGX9KOfvdDOv4tau/dH\nxImI2NLL/vVSm78jIxHxTO1NkZUed7Fn2vgdWRsRUxHxbO1a/GYfurnkIuIbEfFGRDzfok1nuZmZ\nPfkCVgOHgQuAM4Fngfc2tLkKeLT2+ErgB73qXy+/2rwWHwD+ae3x5jJfi7p2f0F1ocDWfve7j/8u\nzgYOAOfVttf2u999vBaTwB/NXAfgZ8AZ/e77ElyLf0V1Kfzz8+zvODd7OeK/AjicmS9n5nHgIeCa\nhjan3hSWmU8CZ0dEy/cHrFALXovMfCIzf1HbfBI4r8d97JV2/l0AfJrqkuCf9rJzPdbOtfgN4OHM\nfBUgM4/0uI+90s61+FvgrNrjs4CfZeaJHvaxJzLz+8DPWzTpODd7GfznAq/Ubb9a+95CbQYx8Nq5\nFvU+BTy6pD3qnwWvRUScS/WX/q7atwZ1YqqdfxcXAWtq98B6KiI+3rPe9VY71+Je4OKIeB3YD/xu\nj/q23HScm0WWc3aq3V/WxqWdg/hL3vbPFBEfAj4JbFy67vRVO9fiDuCWzMzaEuFBXf7bzrU4E7gM\n+DDwFuCJiPhBZr60pD3rvXauxR8Az2bmSERcCOyNiEsz8++XuG/LUUe52cvgfw04v277fKqvTK3a\nnFf73qBp51pQm9C9F9icma3+1FvJ2rkWlwMPVTOftcBHI+J4Zu7uTRd7pp1r8QpwJDOPAkcj4i+B\nS4FBC/52rsWvAl8GyMwfRcTfAO8BnupJD5ePjnOzl6Wep4CLIuKCiBgCrqP6JrB6u4H/ABARG4C/\ny9n7AQ2SBa9FRLwD+A5wQ2Ye7kMfe2XBa5GZv5yZ78rMd1Gt8/+nAQx9aO935M+AD0bE6oh4C9XJ\nvBd63M9eaOdaHAI+AlCrab8H+HFPe7k8dJybPRvxZ+aJiLgZmKY6Y39fZh6MiJtq++/OzEcj4qqI\nOAz8A/CJXvWvl9q5FsDngXOAu2oj3eOZeUW/+rxU2rwWpdDm78ihiJii+qbIk1TfLDlwwd/mv4s/\nBO6PiP1UB7Gfy8w3+9bpJRIR3wI2AWsj4hXgNqolv65z0zdwSVLJ+NGLklQyBr8klYzBL0klY/BL\nUskY/JJUMga/JJWMwS9JJWPwS1LJ/H90HnxhfKFFXgAAAABJRU5ErkJggg==\n", - "text": [ - "" - ] - } - ], - "prompt_number": 15 - }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(df.density, df.BurnedOut)\n", + "plt.xlim(0,1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we see the very clear emergence of a critical value around 0.5, where the model quickly shifts from almost no trees being burned, to almost all of them.\n", + "\n", + "In this case we ran the model only once at each value. However, it's easy to have the BatchRunner execute multiple runs at each parameter combination, in order to generate more statistically reliable results. We do this using the *iteration* argument.\n", + "\n", + "Let's run the model 5 times at each parameter point, and export and plot the results as above." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "(0, 1)" + ] + }, + "execution_count": 16, "metadata": {}, - "source": [ - "And we see the very clear emergence of a critical value around 0.5, where the model quickly shifts from almost no trees being burned, to almost all of them.\n", - "\n", - "In this case we ran the model only once at each value. However, it's easy to have the BatchRunner execute multiple runs at each parameter combination, in order to generate more statistically reliable results. We do this using the *iteration* argument.\n", - "\n", - "Let's run the model 5 times at each parameter point, and export and plot the results as above." - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "param_run = BatchRunner(ForestFire, param_set, iterations=5, model_reporters=model_reporter)\n", - "param_run.run_all()\n", - "df = param_run.get_model_vars_dataframe()\n", - "plt.scatter(df.density, df.BurnedOut)\n", - "plt.xlim(0,1)" - ], - "language": "python", + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 16, - "text": [ - "(0, 1)" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\njfn/vIVXkfM6S7gAAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 16 + "output_type": "display_data" } ], - "metadata": {} + "source": [ + "param_run = BatchRunner(ForestFire, param_set, iterations=5, model_reporters=model_reporter)\n", + "param_run.run_all()\n", + "df = param_run.get_model_vars_dataframe()\n", + "plt.scatter(df.density, df.BurnedOut)\n", + "plt.xlim(0,1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } - ] -} \ No newline at end of file + ], + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/examples/ForestFire/Forest Fire Model.ipynb b/examples/ForestFire/Forest Fire Model.ipynb index 8c8746c5fbe..72b548058fd 100644 --- a/examples/ForestFire/Forest Fire Model.ipynb +++ b/examples/ForestFire/Forest Fire Model.ipynb @@ -1,584 +1,621 @@ { - "metadata": { - "name": "", - "signature": "sha256:7ad05bb257a0bc7d9176a2a5e02312695873a50206c8335653a47975f4e4ee8c" - }, - "nbformat": 3, - "nbformat_minor": 0, - "worksheets": [ + "cells": [ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# The Forest Fire Model\n", - "## A rapid introduction to Mesa\n", - "\n", - "The [Forest Fire Model](http://en.wikipedia.org/wiki/Forest-fire_model) is one of the simplest examples of a model that exhibits self-organized criticality.\n", - "\n", - "Mesa is a new, Pythonic agent-based modeling framework. A big advantage of using Python is that it a great language for interactive data analysis. Unlike some other ABM frameworks, with Mesa you can write a model, run it, and analyze it all in the same environment. (You don't have to, of course. But you can).\n", - "\n", - "In this notebook, we'll go over a rapid-fire (pun intended, sorry) introduction to building and analyzing a model with Mesa." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, some imports. We'll go over what all the Mesa ones mean just below." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "import random\n", - "\n", - "import numpy as np\n", - "\n", - "import matplotlib.pyplot as plt\n", - "%matplotlib inline\n", - "\n", - "from mesa import Model, Agent\n", - "from mesa.time import RandomActivation\n", - "from mesa.space import Grid\n", - "from mesa.datacollection import DataCollector\n", - "from mesa.batchrunner import BatchRunner " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 1 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Building the model\n", - "\n", - "Most models consist of basically two things: agents, and an world for the agents to be in. The Forest Fire model has only one kind of agent: a tree. A tree can either be unburned, on fire, or already burned. The environment is a grid, where each cell can either be empty or contain a tree.\n", - "\n", - "First, let's define our tree agent. The agent needs to be assigned **x** and **y** coordinates on the grid, and that's about it. We could assign agents a condition to be in, but for now let's have them all start as being 'Fine'. Since the agent doesn't move, and there is only at most one tree per cell, we can use a tuple of its coordinates as a unique identifier.\n", - "\n", - "Next, we define the agent's **step** method. This gets called whenever the agent needs to act in the world and takes the *model* object to which it belongs as an input. The tree's behavior is simple: If it is currently on fire, it spreads the fire to any trees above, below, to the left and the right of it that are not themselves burned out or on fire; then it burns itself out. " - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class TreeCell(Agent):\n", - " '''\n", - " A tree cell.\n", - " \n", - " Attributes:\n", - " x, y: Grid coordinates\n", - " condition: Can be \"Fine\", \"On Fire\", or \"Burned Out\"\n", - " unique_id: (x,y) tuple. \n", - " \n", - " unique_id isn't strictly necessary here, but it's good practice to give one to each\n", - " agent anyway.\n", - " '''\n", - " def __init__(self, x, y):\n", - " '''\n", - " Create a new tree.\n", - " Args:\n", - " x, y: The tree's coordinates on the grid.\n", - " '''\n", - " self.x = x\n", - " self.y = y\n", - " self.unique_id = (x, y)\n", - " self.condition = \"Fine\"\n", - " \n", - " def step(self, model):\n", - " '''\n", - " If the tree is on fire, spread it to fine trees nearby.\n", - " '''\n", - " if self.condition == \"On Fire\":\n", - " neighbors = model.grid.get_neighbors(self.x, self.y, moore=False)\n", - " for neighbor in neighbors:\n", - " if neighbor.condition == \"Fine\":\n", - " neighbor.condition = \"On Fire\"\n", - " self.condition = \"Burned Out\"\n", - " " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 2 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we need to define the model object itself. The main thing the model needs is the grid, which the trees are placed on. But since the model is dynamic, it also needs to include time -- it needs a schedule, to manage the trees activation as they spread the fire from one to the other.\n", - "\n", - "The model also needs a few parameters: how large the grid is and what the density of trees on it will be. Density will be the key parameter we'll explore below.\n", - "\n", - "Finally, we'll give the model a data collector. This is a Mesa object which collects and stores data on the model as it runs for later analysis.\n", - "\n", - "The constructor needs to do a few things. It instantiates all the model-level variables and objects; it randomly places trees on the grid, based on the density parameter; and it starts the fire by setting all the trees on one edge of the grid (x=0) as being On \"Fire\".\n", - "\n", - "Next, the model needs a **step** method. Like at the agent level, this method defines what happens every step of the model. We want to activate all the trees, one at a time; then we run the data collector, to count how many trees are currently on fire, burned out, or still fine. If there are no trees left on fire, we stop the model by setting its **running** property to False." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "class ForestFire(Model):\n", - " '''\n", - " Simple Forest Fire model.\n", - " '''\n", - " def __init__(self, height, width, density):\n", - " '''\n", - " Create a new forest fire model.\n", - " \n", - " Args:\n", - " height, width: The size of the grid to model\n", - " density: What fraction of grid cells have a tree in them.\n", - " '''\n", - " # Initialize model parameters\n", - " self.height = height\n", - " self.width = width\n", - " self.density = density\n", - " \n", - " # Set up model objects\n", - " self.schedule = RandomActivation(self)\n", - " self.grid = Grid(height, width, torus=False)\n", - " self.dc = DataCollector({\"Fine\": lambda m: self.count_type(m, \"Fine\"),\n", - " \"On Fire\": lambda m: self.count_type(m, \"On Fire\"),\n", - " \"Burned Out\": lambda m: self.count_type(m, \"Burned Out\")})\n", - " \n", - " # Place a tree in each cell with Prob = density\n", - " for x in range(self.width):\n", - " for y in range(self.height):\n", - " if random.random() < self.density:\n", - " # Create a tree\n", - " new_tree = TreeCell(x, y)\n", - " # Set all trees in the first column on fire.\n", - " if x == 0:\n", - " new_tree.condition = \"On Fire\"\n", - " self.grid[y][x] = new_tree\n", - " self.schedule.add(new_tree)\n", - " self.running = True\n", - " \n", - " def step(self):\n", - " '''\n", - " Advance the model by one step.\n", - " '''\n", - " self.schedule.step()\n", - " self.dc.collect(self)\n", - " # Halt if no more fire\n", - " if self.count_type(self, \"On Fire\") == 0:\n", - " self.running = False\n", - " \n", - " @staticmethod\n", - " def count_type(model, tree_condition):\n", - " '''\n", - " Helper method to count trees in a given condition in a given model.\n", - " '''\n", - " count = 0\n", - " for tree in model.schedule.agents:\n", - " if tree.condition == tree_condition:\n", - " count += 1\n", - " return count" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 3 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Running the model\n", - "\n", - "Let's create a model with a 100 x 100 grid, and a tree density of 0.6. Remember, ForestFire takes the arguments *height*, *width*, *density*." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fire = ForestFire(100, 100, 0.6)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 4 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run the model until it's done (that is, until it sets its **running** property to False) just use the **run_model()** method. This is implemented in the Model parent object, so we didn't need to implement it above." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fire.run_model()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 5 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That's all there is to it!\n", - "\n", - "But... so what? This code doesn't include a visualization, after all. \n", - "\n", - "**TODO: Add a MatPlotLib visualization**\n", - "\n", - "Remember the data collector? Now we can put the data it collected into a pandas DataFrame:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "results = fire.dc.get_model_vars_dataframe()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And chart it, to see the dynamics." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "results.plot()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 7, - "text": [ - "" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\nvMDe+t4vL6CooojodtHEh8cTFx5HXFhc3W10u2iiQqPsbbsoYtrFkBSZRIeoDnSI7ECHqA4kRiS2\n6AHhQHw/jofTk/y8efN49NFH2bZtG7GxsVx00UU88MADxMXFHdPrBQUFERkZWZfMQ0ND2bt3b0s2\nuc0cS5LX7pZqlpCgEPol9aNfUr8m1601tRRXFFN8oJiiiqK6+8UVxZRVlVFaWUpZZRn55flsK9xG\nfnk+eeV55JXlkVeeR1FFEfHh8SRHJZMcnUxyVDIdozoSGxZLbFgsMe1iiAmLITEikWGdh5EUmdQG\nfwHVFh599FEefvhhXnzxRc466yx27tzJtGnTGD9+PJ9//jmhoaHH9Lpr166lV69ezVrXm0Td1MM/\nEu3JK8epqa0hvzyf3LJccktz2VO2hz1leyg5UMK+yn11t7mluXyz6xuSo5IZ1W0Uo7raaVDHQTo0\n9Aic2pMvKSmhS5cuzJ07l0suuaRueVlZGT179mT27Nlcc8013HPPPWRmZhIREcE777xD9+7deeGF\nFxg2bFijrxsUFERWVlaDJJ+dnU2vXr2orq4mKCiItLQ0Ro8ezfLly1m9ejXfffcdlZWVTJ8+nW+/\n/ZYOHTrw17/+lUsvvbTV/w5Hoj15FRCCg4JtDz46uf56Y4dRU1tDZl4mX+78ki93fsnfvvobu0t3\nM7LrSM7odgZndDuDEV1H6EFjF/jiiy+oqKjg5z//eYPlUVFRnHvuuSxdupRrrrkGgA8++IB33nmH\nefPmcdddd3HjjTfy5ZdfHva1m7NTe/nll1m0aBF9+/Zl3759DBo0iHvvvZePPvqItWvXMn78eAYN\nGkT//v2PL9A2puPkW0GgjGd2QxzBQcEMTh7Mb4b9hrkXzGXTjZvImp7FtNOmUVpZyt3pd9P+t+3p\n9rdunPnCmfzmg9/w0OcP8e7Gd9lWuM2RPdrDabP3Q6RlpqOUn59PUlLSIVeDAujUqRP5+fl182PG\njGHChAmICJMnT2bNmjVHfO1TTz2VhIQEEhISuPnmmxsJWZgyZQr9+/cnKCiIxYsX111OMCgoqMHl\nBN1Ge/Iq4HSI6sAF/S7ggn4XALAsdRn/c+r/kLU3iy0FW8jam8V/tv+HtblrKTlQwsnJJzMkeQgn\nJ5/MSe1PoldCL7rGdj1xSz5+2vElJSWRn59PbW3tIYl+165ddOjQoW7e9zKAkZGRVFRUNPo8r9Wr\n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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 7 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, the fire burned itself out after about 90 steps, with many trees left unburned. \n", - "\n", - "You can try changing the density parameter and rerunning the code above, to see how different densities yield different dynamics. For example:" - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "fire = ForestFire(100, 100, 0.8)\n", - "fire.run_model()\n", - "results = fire.dc.get_model_vars_dataframe()\n", - "results.plot()" - ], - "language": "python", - "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 8, - "text": [ - "" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 8 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "... But to really understand how the final outcome varies with density, we can't just tweak the parameter by hand over and over again. We need to do a batch run. \n", - "\n", - "## Batch runs\n", - "\n", - "Batch runs, also called parameter sweeps, allow use to systemically vary the density parameter, run the model, and check the output. Mesa provides a BatchRunner object which takes a model class, a dictionary of parameters and the range of values they can take and runs the model at each combination of these values. We can also give it reporters, which collect some data on the model at the end of each run and store it, associated with the parameters that produced it.\n", - "\n", - "For ease of typing and reading, we'll first create the parameters to vary and the reporter, and then assign them to a new BatchRunner." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "param_set = dict(height=50, # Height and width are constant\n", - " width=50,\n", - " # Vary density from 0.01 to 1, in 0.01 increments:\n", - " density=np.linspace(0,1,101)[1:]) " - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 9 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# At the end of each model run, calculate the fraction of trees which are Burned Out\n", - "model_reporter = {\"BurnedOut\": lambda m: (ForestFire.count_type(m, \"Burned Out\") / \n", - " m.schedule.get_agent_count()) }" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 10 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "# Create the batch runner\n", - "param_run = BatchRunner(ForestFire, param_set, model_reporters=model_reporter)" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 11 - }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The Forest Fire Model\n", + "## A rapid introduction to Mesa\n", + "\n", + "The [Forest Fire Model](http://en.wikipedia.org/wiki/Forest-fire_model) is one of the simplest examples of a model that exhibits self-organized criticality.\n", + "\n", + "Mesa is a new, Pythonic agent-based modeling framework. A big advantage of using Python is that it a great language for interactive data analysis. Unlike some other ABM frameworks, with Mesa you can write a model, run it, and analyze it all in the same environment. (You don't have to, of course. But you can).\n", + "\n", + "In this notebook, we'll go over a rapid-fire (pun intended, sorry) introduction to building and analyzing a model with Mesa." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, some imports. We'll go over what all the Mesa ones mean just below." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import random\n", + "\n", + "import numpy as np\n", + "\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "from mesa import Model, Agent\n", + "from mesa.time import RandomActivation\n", + "from mesa.space import Grid\n", + "from mesa.datacollection import DataCollector\n", + "from mesa.batchrunner import BatchRunner " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Building the model\n", + "\n", + "Most models consist of basically two things: agents, and an world for the agents to be in. The Forest Fire model has only one kind of agent: a tree. A tree can either be unburned, on fire, or already burned. The environment is a grid, where each cell can either be empty or contain a tree.\n", + "\n", + "First, let's define our tree agent. The agent needs to be assigned **x** and **y** coordinates on the grid, and that's about it. We could assign agents a condition to be in, but for now let's have them all start as being 'Fine'. Since the agent doesn't move, and there is only at most one tree per cell, we can use a tuple of its coordinates as a unique identifier.\n", + "\n", + "Next, we define the agent's **step** method. This gets called whenever the agent needs to act in the world and takes the *model* object to which it belongs as an input. The tree's behavior is simple: If it is currently on fire, it spreads the fire to any trees above, below, to the left and the right of it that are not themselves burned out or on fire; then it burns itself out. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class TreeCell(Agent):\n", + " '''\n", + " A tree cell.\n", + " \n", + " Attributes:\n", + " x, y: Grid coordinates\n", + " condition: Can be \"Fine\", \"On Fire\", or \"Burned Out\"\n", + " unique_id: (x,y) tuple. \n", + " \n", + " unique_id isn't strictly necessary here, but it's good practice to give one to each\n", + " agent anyway.\n", + " '''\n", + " def __init__(self, x, y):\n", + " '''\n", + " Create a new tree.\n", + " Args:\n", + " x, y: The tree's coordinates on the grid.\n", + " '''\n", + " self.x = x\n", + " self.y = y\n", + " self.unique_id = (x, y)\n", + " self.condition = \"Fine\"\n", + " \n", + " def step(self, model):\n", + " '''\n", + " If the tree is on fire, spread it to fine trees nearby.\n", + " '''\n", + " if self.condition == \"On Fire\":\n", + " neighbors = model.grid.get_neighbors(self.x, self.y, moore=False)\n", + " for neighbor in neighbors:\n", + " if neighbor.condition == \"Fine\":\n", + " neighbor.condition = \"On Fire\"\n", + " self.condition = \"Burned Out\"\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we need to define the model object itself. The main thing the model needs is the grid, which the trees are placed on. But since the model is dynamic, it also needs to include time -- it needs a schedule, to manage the trees activation as they spread the fire from one to the other.\n", + "\n", + "The model also needs a few parameters: how large the grid is and what the density of trees on it will be. Density will be the key parameter we'll explore below.\n", + "\n", + "Finally, we'll give the model a data collector. This is a Mesa object which collects and stores data on the model as it runs for later analysis.\n", + "\n", + "The constructor needs to do a few things. It instantiates all the model-level variables and objects; it randomly places trees on the grid, based on the density parameter; and it starts the fire by setting all the trees on one edge of the grid (x=0) as being On \"Fire\".\n", + "\n", + "Next, the model needs a **step** method. Like at the agent level, this method defines what happens every step of the model. We want to activate all the trees, one at a time; then we run the data collector, to count how many trees are currently on fire, burned out, or still fine. If there are no trees left on fire, we stop the model by setting its **running** property to False." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class ForestFire(Model):\n", + " '''\n", + " Simple Forest Fire model.\n", + " '''\n", + " def __init__(self, height, width, density):\n", + " '''\n", + " Create a new forest fire model.\n", + " \n", + " Args:\n", + " height, width: The size of the grid to model\n", + " density: What fraction of grid cells have a tree in them.\n", + " '''\n", + " # Initialize model parameters\n", + " self.height = height\n", + " self.width = width\n", + " self.density = density\n", + " \n", + " # Set up model objects\n", + " self.schedule = RandomActivation(self)\n", + " self.grid = Grid(height, width, torus=False)\n", + " self.dc = DataCollector({\"Fine\": lambda m: self.count_type(m, \"Fine\"),\n", + " \"On Fire\": lambda m: self.count_type(m, \"On Fire\"),\n", + " \"Burned Out\": lambda m: self.count_type(m, \"Burned Out\")})\n", + " \n", + " # Place a tree in each cell with Prob = density\n", + " for x in range(self.width):\n", + " for y in range(self.height):\n", + " if random.random() < self.density:\n", + " # Create a tree\n", + " new_tree = TreeCell(x, y)\n", + " # Set all trees in the first column on fire.\n", + " if x == 0:\n", + " new_tree.condition = \"On Fire\"\n", + " self.grid[y][x] = new_tree\n", + " self.schedule.add(new_tree)\n", + " self.running = True\n", + " \n", + " def step(self):\n", + " '''\n", + " Advance the model by one step.\n", + " '''\n", + " self.schedule.step()\n", + " self.dc.collect(self)\n", + " # Halt if no more fire\n", + " if self.count_type(self, \"On Fire\") == 0:\n", + " self.running = False\n", + " \n", + " @staticmethod\n", + " def count_type(model, tree_condition):\n", + " '''\n", + " Helper method to count trees in a given condition in a given model.\n", + " '''\n", + " count = 0\n", + " for tree in model.schedule.agents:\n", + " if tree.condition == tree_condition:\n", + " count += 1\n", + " return count" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Running the model\n", + "\n", + "Let's create a model with a 100 x 100 grid, and a tree density of 0.6. Remember, ForestFire takes the arguments *height*, *width*, *density*." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fire = ForestFire(100, 100, 0.6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run the model until it's done (that is, until it sets its **running** property to False) just use the **run_model()** method. This is implemented in the Model parent object, so we didn't need to implement it above." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "fire.run_model()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That's all there is to it!\n", + "\n", + "But... so what? This code doesn't include a visualization, after all. \n", + "\n", + "**TODO: Add a MatPlotLib visualization**\n", + "\n", + "Remember the data collector? Now we can put the data it collected into a pandas DataFrame:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "results = fire.dc.get_model_vars_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And chart it, to see the dynamics." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, "metadata": {}, - "source": [ - "Now the BatchRunner, which we've named param_run, is ready to go. To run the model at every combination of parameters (in this case, every density value), just use the **run_all()** method." - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "param_run.run_all()" - ], - "language": "python", + "data": { + "image/png": "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\nZ7ka7sesabTEPrbEnrTEfmmJfRHYjgFcDLwEdCWM9HcecH5xOzTL1BQkpa+jcZrtZLAZYF3S1pKB\n3y6T9OvXzyZPnlw3f99999l2221XNz9o0CC79tpr6+avu+4622effermJdmVV15p22yzjW299db2\n6KOPWs+ePe2yyy6zLbbYwnr06GHXXXdd3frLli2z733ve9anTx/r1q2bnXrqqfbhhx/WLb/00kut\nR48e1rNnTxs3bpxJsldffXUt3StXrrQ+ffrYz372s7XKP/3pT9v5559vZmZJktiIESPqlr/++usm\nyVasWGE/+MEPrGXLlrbxxhtb+/bt7fTTT1/nNarGZ8+n1Z69Btfxmn0TKMwpLTEYuJAQYvluWprW\npBpyc1ea+FDwwQcfcOutt7L33nvXLZO03trv3XffzdNPP8306dMxM+bNm8fixYv53//+x7hx4zjt\ntNN4772QQmXMmDHMnDmT5557jpkzZzJnzhx+/OMfAzBx4kQuu+wyHnroIWbMmMFDDz1U7zFffvll\n3nzzTY4++ujVyiXxla98hUmTJjWoWRL/93//x7777suVV17JkiVLuOKKdWYOKCvVcD/WukY39huA\nRHfgZuBYM2akrSfrSKWZmoKZccQRR9C5c2c6derE5MmT+f73v9+ofYwdO5ZOnTrRpk0bAFq3bs35\n559Py5YtOfjgg2nfvj0vv/wyZsY111zDL37xCzp16kT79u0ZO3Yst9xyCwATJkzgpJNOYsCAAbRt\n25ZcLlfvMRcsWABAjx491lrWvXv3uuXFkH/ZOc0T71TVBMzs0Th04HWEPPT1V81SwjLmfwRI09ZI\n4u6772b//ffHzLjrrrsYNGgQL774IltssUVR++jdu/dq85ttthktWqyqL7Vt25alS5cyf/58Pvjg\nA3bfffe6ZWbGypWhx/xbb73FHnvsUbesT58+9R6za9euddv07dt3tWVvvfUWm2++eVHaIV2/fRbv\nxzWpdY1es286pwGbAfVXy5xMIokjjzySli1b8ve//x2Adu3a8f7779etM3fu3HVuVwxdu3Zlk002\nYfr06SxcuJCFCxeyaNEiFi8Ogyj16NGD//73v3XrF35fk+23355evXoxYcKE1cpXrlzJHXfcwQEH\nHFCn/4MPPqhXf9oNtE76uLFvAtLRJxAGUT/WjOVp61kX1eB/rDR5N4aZcffdd7Nw4UL69+8PwC67\n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\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [], - "prompt_number": 12 - }, + "output_type": "display_data" + } + ], + "source": [ + "results.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this case, the fire burned itself out after about 90 steps, with many trees left unburned. \n", + "\n", + "You can try changing the density parameter and rerunning the code above, to see how different densities yield different dynamics. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, "metadata": {}, - "source": [ - "Like with the data collector, we can extract the data the batch runner collected into a dataframe:" - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "df = param_run.get_model_vars_dataframe()" - ], - "language": "python", + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXe4FNX5xz/fexWkF1FABLGAgg1FxRoxikFjbImoUYSI\nRgMWbBHUOHfsIWLUWJKfDUsEscQuggajiQUbSkREoqggIChVQCnv748ze1kul1t3d3Znz+d55tmZ\nM+377uy+e/Y957xHZobH4/F4kklJ3AI8Ho/Hkz28k/d4PJ4E4528x+PxJBjv5D0ejyfBeCfv8Xg8\nCcY7eY/H40kw1Tp5ScMlfSRpiqSHJTWU1FrSBEnTJY2X1LLC8Z9Kmibp8LTyntE1PpV0S7YM8ng8\nHs86qnTykjoDZwJ7mtmuQClwEjAMmGBmXYGXo20kdQdOBLoDfYE7JCm63J3AIDPrAnSR1Dfj1ng8\nHo9nPaqryS8BVgGNJW0CNAa+Bo4G7o+OuR84Nlo/BhhtZqvMbCYwA+glqT3QzMwmRcc9kHaOx+Px\neLJElU7ezL4DRgJf4pz7IjObALQ1s3nRYfOAttH6VsCstEvMAjpUUj47Kvd4PB5PFqkuXLM9MBTo\njHPUTSWdmn6MubwIPjeCx+Px5CGbVLN/L+B1M/sWQNITwH7AXEntzGxuFIr5Jjp+NtAx7fytcTX4\n2dF6evnsym4oyf9geDweTy0xM1VWXp2Tnwb8QVIjYCVwGDAJ+B4YAPwxen0yOv5p4GFJN+HCMV2A\nSWZmkpZI6hWd3x+4tbZik4CkMjMri1tHNvE2Fj5Jtw/itVFCQAucn2wPtI6WVhXWW1RYmgMNgbW4\n9tJoUauN3atKJ29mH0h6AHgnuuh7wP8BzYCxkgYBM4F+0fFTJY0FpgKrgcG2Ls3lYGAU0Ah43szG\n1fQNSRid4xaQAzrHLSAHdI5bQJbpHLeAHNA5GxeVKAG2wDnwraOlsnXDRTrmAN8C3wELgfnA9Gh9\ncdqyCNcZ5gcz1la450YjINXV5DGzEcCICsXf4Wr1lR1/HXBdJeXvArtWdz+Px+MpJCQaA3sDB0TL\nfrhK8SzWhatnAf9KK5tlxpJc6KvWyXsyzqi4BeSAUXELyAGj4haQZUbFLSAHjKrriRJbAqcBv8JV\nXv8L/Ae4FxhkxtxMCMwEyrdJQyRZkmPyHo+nMJEoBX4GDAIOxbVFPgS8bsbyeLVt3G/mZe4ahWpb\n/VGFiaTecWvINt7Gwifp9kHNbZTYTOJKXPtjALwIdDJjoBkvxe3gqyMvnTzwoUKdrFC+Ru/xeGJD\noieQak880oxeZvxfruLpmSAvwzWUsQ9wHy4twu8ssDkxy/J4PEWExKbAcOAc4HwzRscsqUoKLlxj\ngb0N9MQ1ZnygUKf4Wr3H48kFEjviGlEPAPbIdwdfHXnp5AEssB8ssCuAI4DLgYcVbrzDf6HgY53J\nIOk2Jt0+2NBGiRKJ83AOfhTQ16zykfmFRN46+RQW2Lu4Wv18XK3+kJgleTyehCGxHfBPXCr1/c24\nwywZObnyMia/sdiSQvUF7gFGA5dbYD/kVJzH40kUUXqBs4BrgBuAP5uxJl5VtadKv1lITh5Aodrg\nUitsDwyywN7JmTiPx5MYJDrhKo0tgIFmTI1ZUp0puIbXqrDAFgC/BG4CnlaoBxWqU8yyakwxxjqT\nSNJtTLJ9EpLoDy99CEzEhWcK1sFXR8E5eQALzCyw+4Edgc+B9xXqeoVqEbM0j8eTx0i0BB4GhsF9\nF5lxnRmr49aVTQouXFPpOaE6AFcDR0avf7PAEv3gPB5P7ZD4CfAgLiX6781YEbOkjJGomHyV54ba\nHRfG2QI4xwJ7NaPiPB5PwRENbAqA04EzzXguZkkZJ1Ex+aqwwD7ApUC+GnhIof6uUFvFLGs9khzr\nTOFtLHySYl/UNfI1YE/cwKbn1u1Lho3VkSgnD+Xx+keBbsAXuDw4FytUg5ileTyeHCLRD3gTGAP8\n3Ix5MUuKhUSFayq9XqiuwC3ANsAQC2xipq7t8XjyD4lGwM24dMAnmvFuzJKyTtHE5Dd6TZf35hjc\ng38duMgnPfN4kodEd+ARYApwdiFli6wPRROT3xhRCOdJYGdcTugPFWqoQuV8ZqxiiAN6GwufQrRP\nYiBuir2bgVOqc/CFaGNdqNbJS9pR0vtpy2JJ50lqLWmCpOmSxktqmXbOcEmfSpom6fC08p6SpkT7\nbsmWURvDAvveArsMOAg4CnhPofbJtQ6Px5M5JBpI3IlLDdzbjHuSkncmE9QqXCOpBDcp7T7AucAC\nMxsh6VKglZkNk9QdN9hgb9ys5C8BXczMJE0CzjGzSZKeB241s3EV7pGT6f+iEM5JuF/924Drfd96\nj6ewkNgKeAz4BhhgxuKYJcVCJsM1hwEzzOwr4Gjg/qj8fuDYaP0YYLSZrTKzmbiJP3pJag80M7NJ\n0XEPpJ2Tc6IQzmhchsvewCsKtW1cejweT+2QOBB4G3geOL5YHXx11NbJnwTlCfTbmlmqS9I8IDUv\n61bArLRzZuFq9BXLZ0flsWKBzQL6AP8AJilU/2xOUFIMcUBvY+GTz/ZFuWfOAR4HzjDjGjPW1v46\n+WtjJqmxk5fUAPgF8GjFfeZiPgUbA7PA1lpgI3H/VIbhJihpHrMsj8dTAYmtgaeAM3GJxV6IWVLe\nU5veJUcA75rZ/Gh7nqR2ZjY3CsV8E5XPBjqmnbc1rgY/O1pPL6901hVJo3C9YAAWAZPN7JVoX2+A\nbGxbYB+omS6gD+ewO5MU6jjK3D+UTN0vVZYLe+LcTrc1H/T47cLeBnsV+C28dAN89iT89gQzfqjX\n993slXyxr47fr95AZ6qhxg2vksYAL5jZ/dH2COBbM/ujpGFAywoNr/uwruF1h6jh9S3gPGAS8Bwx\nNrxWh0L9BhgBnG2BPR63Ho+nWJHoCtwFNAQGmfFRzJLyjno3vEpqggtlPJFWfAPQR9J04KfRNmY2\nFRgLTAVeAAbbul+SwcDdwKe4Btz1HHw+YYHdB/QFRirUiEz1qS+GOKC3sfDJB/skNpUYhhvA+ARw\nQCYdfD7YmAuKYsRrfYhmonoYKAVOsqA8XFW366WFapKKt7Hwids+iT1wszbNB84yKw/fZvAeyXmG\nVflN7+RrgEKV4jJbngqcaIG9EbMkjyeRSGwGXAmcAVwCPOAHNlWPd/IZQqGOxoWbrgH+YkGevXke\nTwET9Xu/B/gQONeMuTFLKhgyORiqqLHAngb2BQYCYxSqWW2vUQxxQG9j4ZNL+6LY+0hcYrHhZpyQ\nCwef9GeYwjv5WmKBfQbsDywG3laoXWKW5PEULBKbA+OA7sCuZut17vBkAB+uqQcKNQC4ERhqgf09\nbj0eTyEhsRvwJG6A5WVmrIlZUsHiY/JZRKF2w3Xveh6Xp35VzJI8nrxH4lfAncB5ZuWpUjx1xMfk\ns4gF9iEu4+Z2wD8Vqn1VxxdDHNDbWPhkyz6JEomrgZHAz+J08El/him8k88AFthCXFbOCbg4/QEx\nS/J48o6oe+QY3HD8vc14L15FxYEP12QYhToSGIXrV3+b72bp8YBEa1z8/Wtc3vcfYpaUKHy4JodY\nYM8D+wG/AV5QqG1iluTxxIrENsC/cTmrfu0dfG7xTj4LWGD/A3rh5pt8V6HOUagSKI44oLex8MmU\nfRI9gP8AfzPj4rrkfc8WSX+GKbyTzxIW2CoL7HrgQNxkK68q1E4xy/J4coZEH2A8MNSMnM/p7HH4\nmHwOiGrxvwNC4E/AnyywvKnReDyZRELAEOAK4AQzXotZUuLx/eTzhCg+/yCwEuhvQfn0iR5PIpBo\nBPwV6AEcZ8ZnMUsqCnzDa55ggX3BtYTAm8B7CnVo3JqyQTHEOpNuY13sk+iEa2BtgJuaL68dfNKf\nYQrv5HPNKtZYYFcCpwEPKNRVmZqQxOOJC4lDgLeAv+N60HwfsyRPhA/XxIhCtQUewk1rdqoF9mXM\nkjyeWiFRAlwIXAycYsbLMUsqSnxMPo+JGmUvxX1JbgRussB8P2JP3hP1fx8FbAqcmo3Zmzw1w8fk\n84iKcUALbG3U1XJv3CCqKQrVNw5tmaIYYp1Jt7Eq+yQkcRrwDi5N8MGF6OCT/gxT1HQi75aSHpP0\nsaSpknpJai1pgqTpksZLapl2/HBJn0qaJunwtPKekqZE+3y/2TQssM8ssKOBC4DbFOpJhdo2bl0e\nTzoSbXCpgS8B+pjxR58iOL+paU3+FuB5M+sG7AZMA4YBE8ysK/BytI2k7sCJuEkA+gJ3SEr9jbgT\nGGRmXYAuUmHXWOtCdRMHW2DPAbvghoC/rVBDFKqgwldJmRy5KpJuY0X7otr7L4EPgJm4BGOTY5CW\nMZL+DFNUG5OX1AJ438y2q1A+DTjYzOZJage8YmY7SRoOrDWzP0bHjQPKgC+Af0Y/FEg6CehtZmdX\nuG5RxeSrQqG6Ag8Ds4FBFtiCmCV5ihCJbsCtQDtgiBmvxizJU4H6xuS3BeZLuk/Se5LuktQEaGtW\nPphnHtA2Wt8KmJV2/iygQyXls6PyoqI2cUALbDpuqsFPgMkK9dNs6cokxRDrTLqNknpLNJMYAbwK\nPAvsmSQHn/RnmKIm/bM3AfYEzjGztyXdTBSaSWFmJilj3XQkjYLyhpxFwOTUX6vUgynUbaCHpJof\nX8b+wPOUMQF4UMfoFV7kXltpL+eDPRvZ7gHkk56Mb6fIFz2Z3S4BrjoUeAgengK3/NbsrX/kjz6/\nHdEb6Ew11CRc0w54w8y2jbYPBIbjZkI6xMzmSmoPTIzCNcMiUTdEx48DAly4ZmJauOZkXLjHh2tq\niEJtCdwHtAKOscDmxyzJkzCibpF/BdoDg814PWZJnhpQr3CNmc0FvpLUNSo6DPgIeAYYEJUNwE0I\nAPA0cJKkBpK2BboAk6LrLJHrmSOgf9o5nhpggX0DHAX8E3hDobrELMmTEKJp+YbgukW+imtY9Q4+\nAdRoMJSk3YG7cTkp/oebEKMUGAt0woVW+pnZouj4y4DTgdXA+Wb2YlTeEzd4ohGut855ldwr0TV5\nSb0z0aqvUL/FZbU8zgJ7s97CMkimbMxnkmSjxI7APYCAQWZMS5J9GyNJNlblN/2I1xyTyQ9W2lSD\nZ1pgT2XimpkgSV+ejZEEG6OUBBcDv8f1gLsjNalHEuyrjiTZ6J18glGovXAhsmstsNvj1uMpDCS2\nxKW9boJPSVDweCefcBRqO+AF3BDzSyywH2OW5MljooyRD+H+BQZmrI5Xkae+1LefvCeDZKNvrgX2\nGbAvsD0wUaG2yvQ9akMx9D8uRBslSiUCXDrg35hx+cYcfCHaV1uKwUbwTj4xWGALgaNxNfp3FBbH\nB9hTMyTaAS8BPwF6mjE+ZkmeHOHDNQlEoQ4HHgBGAjdakGcP2ZNTJHoAT+HCM1f5hGLJw8fkixCF\n6gQ8BnwFDLTAlsYsyRMDEsfguj8PMWNs3Ho82cHH5POIXMUBo1mmDgK+A/4TTSKeE4oh1pnvNkZZ\nI38P3A4cWVsHn+/2ZYJisBG8k0800QxTv8WlQnhDofaNWZInB0g0wA1uOhnYz4y3Y5bkiREfrikS\nFOoo4F7gfAtsdNx6PNkhmtTjcdw/uP5mLItZkicH+Ji8BwCF2g03cOp+oMw3yCYLiZ1xz/dR4LLU\n6FVP8vEx+TwizjigBfYh0As4HBirUM2zcZ9iiHXmm40SPwcmAmVmDKuvg883+7JBMdgI3skXHRbY\nPOAQ4FvgXYXaM2ZJnnoQNbBeDNwFHGPGg3Fr8uQXPlxTxCjUScBfgKuA23z4prCQaIibN3lP4Ggz\nvoxZkicmfEzes1EUagfgEdykLoOikbOePEdic+AfwALgNN/AWtz4mHwekW9xQAtsBm4e2a+A9zPR\nzTLfbMwGcdoosQPwRrT8KhsO3j/D5OCdvAcL7AcL7HxgKPC0Qg1VKP9vKg+R2B/4NzDSjEt9DxpP\ndfhwjWc9orTFY4EvgdMtcLN9eeJHoh9uBOtpZrwQtx5P/uDDNZ4aE6UtPgD4Gt/7Ji+IetBciks4\nd5h38J7a4J18jimEOGAUvjkHuAx4UaF+V5vwTSHYWF9yZaNEY1z2yFSKgg9yc1//DJNCjZy8pJmS\nPpT0vqRJUVlrSRMkTZc0XlLLtOOHS/pU0jRJh6eV95Q0Jdp3S+bN8WQSC+wRXK3+d8D9CtU4ZklF\nhcT2uMbVTYADzJgVsyRPAVKjmLykz4GeZvZdWtkIYIGZjZB0KdDKzIZJ6g48DOwNdMBNVNDFzCz6\ngTjHzCZJeh641czGVbiXj8nnGQrVBDfYphtwnAU2M15FyUfiF7gkY1cBt5uRX41nnryi3v3kIye/\nl5l9m1Y2DTjYzOZJage8YmY7SRoOrDWzP0bHjcPNBP8F8E8z6xaVnwT0NrOzayrWEx9RuOZ8YBjQ\n3wKbELOkRCJRinPspwH9zHgj8/eQ/8EoYCrzj1X5zU1qel3gJUlrgL+Z2V1AWzObF+2fB7SN1rcC\n3kw7dxauRr8qWk8xOyovKiT1NrNX4tZRW6LRsDcr1GRgtELdDIyobJRsodpYG7Jho8RWuORxpbgp\n+r7J5PXTybdedZ6aoTr0bK6pkz/AzOZI2gKYENXiy4lCMRn71EgaBcyMNhcBk1NfqFRjSaFuAz0k\n5Y2eWusvA7bhPH7DxUBPNdHdLOfHCsf3APJCb7a2U2TmeiXAmq2Am+H/nocLHzRb9k0u9HsKj7Rn\n2BvoXO3xtf1FlxQAy4AzceGWuZLaAxOjcM0wADO7ITp+HBDgwjUT08I1J+PCPT5cU4Ao1Ga4Xh/t\ngGMssMXxKipMJLbA5Z/pjuv//k727ynzNfnCJKog1ipcU23vGkmNJTWL1pvg0tROweWtHhAdNgB4\nMlp/GjhJUgNJ2wJdgElmNhdYIqmX3H+O/mnneAoMC2wl8GvcZ+FfCtU+ZkkFh8SxwIfAZ8CeuXDw\nnuKjJl0o2wKvSZoMvAU8a2bjgRuAPpKmAz+NtjGzqbgRk1OBF4DBadWGwbhJhT8FZlTsWVMMJOnv\nsgW2FjgPN0nFv6NkZ4mycWPUx0aJxhL3AX/C5Z75vRkrMybOkzVKSkr47LPP4pZRK6p18mb2uZn1\niJZdzOz6qPw7MzvMzLqa2eFm64a/m9l1ZraDme1kZi+mlb9rZrtG+87LjkmeXGKBmQV2Le5H/lU/\nQrZq0pKLbQL0MOM/MUvKKzp37kzjxo1p1qwZrVu35qijjmLWrMIZHvDss8+yzz770LRpU9q0acOp\np57K7Nmza3x+7969ueeeezKqyY94zTFJ7XVigd0FDAHGUcamcevJNnV5jlHf99eBv+Hi799nWleh\nI4lnn32WpUuXMmfOHNq2bcu5555bp2utXr06w+qq5rHHHuOUU07hwgsv5Ntvv+Wjjz6iYcOGHHjg\ngSxaVLMUUHXpPVMtZpZXi5MUvw6/1PH5lXEQZcyhjAsocw37xb6AlYJdDfYV2H7x68Hylc6dO9vL\nL79cvv3cc89Z165dy7cPPvhgu/vuu8u377vvPjvwwAPLtyXZ7bffbjvssINtt9129sorr1iHDh1s\n5MiRtuWWW1r79u3tvvvuKz9+5cqVdtFFF1mnTp2sbdu2dvbZZ9uKFSvK948YMcLat29vHTp0sHvu\nucck2f/+978NdK9du9Y6depkf/rTnzYo32WXXezKK680M7MgCOzUU08t3//555+bJFu9erVddtll\nVlpaaptttpk1bdrUzj333A3uszH/WJXf9DX5HJP0eLUF9hoPMBTXsP6AQjWKW1M2qOlzlGgDPAcc\nCOxlWRjclDQip8Xy5ct55JFH2G+//cr3KcrWVhVPPfUUb7/9NlOnTsXMmDdvHkuWLOHrr7/mnnvu\nYciQISxe7DqDDRs2jBkzZvDBBx8wY8YMZs+ezVVXXQXAuHHjGDlyJC+99BLTp0/npZde2ug9P/nk\nE7766itOOOGE9col8ctf/pIJE6oeOyiJa6+9loMOOojbb7+dpUuXcuutt1Z5Tk3xTt6TeT5jHs6p\nlQKvKVTHmBXlHIkSiTOAj4DJQB8z5lVzWl4gZWapC2bGscceS6tWrWjZsiUvv/wyF198ca2uMXz4\ncFq2bEnDhg0B2HTTTbnyyispLS3liCOOoGnTpnzyySeYGXfddRc33XQTLVu2pGnTpgwfPpwxY8YA\nMHbsWE4//XS6d+9O48aNCcNwo/dcsGABAO3bb9jJrF27duX7a0LqRy5TeCefYyyhMfl0zOwVC2w5\ncAowBnhLoX4Ss6yMUtVzlOgB/AcYBPzMjGFm5DZAXA/MMrPUBUk89dRTLFy4kB9++IG//OUvHHzw\nwXzzTc0H/3bsuH6dYvPNN6ekZJ2ra9y4McuWLWP+/PksX76cnj170qpVK1q1asURRxxR7pDnzJmz\n3rU6deq00Xu2adOm/JyKzJkzhy222KLG+jMdl/dO3pM1op43NwK/AR5VqKuiQVSJRKK5xM3Ai7jk\nYgeYMTlmWQWLJI477jhKS0v597//DUCTJk34/vt17dVz586t9Lya0KZNGxo1asTUqVNZuHAhCxcu\n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\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [], - "prompt_number": 13 - }, + "output_type": "display_data" + } + ], + "source": [ + "fire = ForestFire(100, 100, 0.8)\n", + "fire.run_model()\n", + "results = fire.dc.get_model_vars_dataframe()\n", + "results.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "... But to really understand how the final outcome varies with density, we can't just tweak the parameter by hand over and over again. We need to do a batch run. \n", + "\n", + "## Batch runs\n", + "\n", + "Batch runs, also called parameter sweeps, allow use to systemically vary the density parameter, run the model, and check the output. Mesa provides a BatchRunner object which takes a model class, a dictionary of parameters and the range of values they can take and runs the model at each combination of these values. We can also give it reporters, which collect some data on the model at the end of each run and store it, associated with the parameters that produced it.\n", + "\n", + "For ease of typing and reading, we'll first create the parameters to vary and the reporter, and then assign them to a new BatchRunner." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "param_set = dict(height=50, # Height and width are constant\n", + " width=50,\n", + " # Vary density from 0.01 to 1, in 0.01 increments:\n", + " density=np.linspace(0,1,101)[1:]) " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# At the end of each model run, calculate the fraction of trees which are Burned Out\n", + "model_reporter = {\"BurnedOut\": lambda m: (ForestFire.count_type(m, \"Burned Out\") / \n", + " m.schedule.get_agent_count()) }" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create the batch runner\n", + "param_run = BatchRunner(ForestFire, param_set, model_reporters=model_reporter)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now the BatchRunner, which we've named param_run, is ready to go. To run the model at every combination of parameters (in this case, every density value), just use the **run_all()** method." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "param_run.run_all()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Like with the data collector, we can extract the data the batch runner collected into a dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "df = param_run.get_model_vars_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "code", - "collapsed": false, - "input": [ - "df.head()" - ], - "language": "python", + "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", + "
BurnedOutRundensityheightwidth
0 0.009288 11 0.12 50 50
1 1.000000 98 0.99 50 50
2 0.092608 48 0.49 50 50
3 0.024691 3 0.04 50 50
4 0.060748 42 0.43 50 50
\n", + "
" + ], + "text/plain": [ + " BurnedOut Run density height width\n", + "0 0.009288 11 0.12 50 50\n", + "1 1.000000 98 0.99 50 50\n", + "2 0.092608 48 0.49 50 50\n", + "3 0.024691 3 0.04 50 50\n", + "4 0.060748 42 0.43 50 50" + ] + }, + "execution_count": 14, "metadata": {}, - "outputs": [ - { - "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", - "
BurnedOutRundensityheightwidth
0 0.142256 45 0.46 50 50
1 0.946026 68 0.69 50 50
2 0.978022 71 0.72 50 50
3 0.027190 12 0.13 50 50
4 0.082645 43 0.44 50 50
\n", - "
" - ], - "metadata": {}, - "output_type": "pyout", - "prompt_number": 14, - "text": [ - " BurnedOut Run density height width\n", - "0 0.142256 45 0.46 50 50\n", - "1 0.946026 68 0.69 50 50\n", - "2 0.978022 71 0.72 50 50\n", - "3 0.027190 12 0.13 50 50\n", - "4 0.082645 43 0.44 50 50" - ] - } - ], - "prompt_number": 14 - }, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, each row here is a run of the model, identified by its parameter values (and given a unique index by the Run column). To view how the BurnedOut fraction varies with density, we can easily just plot them:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "(0, 1)" + ] + }, + "execution_count": 15, "metadata": {}, - "source": [ - "As you can see, each row here is a run of the model, identified by its parameter values (and given a unique index by the Run column). To view how the BurnedOut fraction varies with density, we can easily just plot them:" - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "plt.scatter(df.density, df.BurnedOut)\n", - "plt.xlim(0,1)" - ], - "language": "python", + "data": { + "image/png": "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\nrkJggg==\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 15, - "text": [ - "(0, 1)" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEACAYAAAC08h1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGS9JREFUeJzt3X+M3PV95/Hn24Y9bXTHgePKuQAJKUdyORqQQQGnzp03\nl+yuw0lQ7FM5GnJukhbudKRttE0MtS5slKQVulpBNBIBQsASStAphNY5cbv2tRkaI8IFCoYzNsVJ\nkfjRoDikUa9nyfb5fX/MrHd2PDs7M9/dmd35Ph/Sivnu9zPf72e/eF/z2ffnM9+JzESSVB6r+t0B\nSVJvGfySVDIGvySVjMEvSSVj8EtSyRj8klQyhYM/Ir4REW9ExPPz7P9YROyPiOci4vGIuKToOSVJ\n3VuMEf/9wOYW+38M/OvMvAT4InDPIpxTktSlwsGfmd8Hft5i/xOZ+Yva5pPAeUXPKUnqXq9r/J8C\nHu3xOSVJdc7o1Yki4kPAJ4GNvTqnJOl0PQn+2oTuvcDmzDytLBQR3jBIkrqQmdHpc5a81BMR7wC+\nA9yQmYfna5eZfmVy22239b0Py+XLa+G18Fq0/upW4RF/RHwL2ASsjYhXgNuAM2thfjfweeAc4K6I\nADiemVcUPa8kqTuFgz8zr19g/28Bv1X0PJKkxeE7d5eZkZGRfndh2fBazPJazPJaFBdF6kSL1omI\nXA79kKSVJCLI5Ti5K0laXgx+SSoZg1+SSsbgl6SSMfglqWQMfkkqGYNfkkrG4JekkjH4JalkDH5J\nKhmDX5JKxuCXpJIx+CWpZAx+SSoZg1+SSsbgl6SSMfglqWQMfkkqGYNfkkrG4JekkjH4JalkCgV/\nRHwjIt6IiOdbtLkzIl6KiP0Rsb7I+SRJxRUd8d8PbJ5vZ0RcBfzzzLwIuBG4q+D5JEkFFQr+zPw+\n8PMWTa4GdtXaPgmcHRHripxTklTMUtf4zwVeqdt+FThvic8pSWrhjB6cIxq2s1mjycnJU49HRkYY\nGRlZuh5JUpemp6fZufMeADZtuozHHvsrACYmbmR8fLzjY3TyvEqlQqVS6bzTDSKzaQ63f4CIC4Dv\nZub7muz7GlDJzIdq24eATZn5RkO7LNoPSf3RbYh1+vzGdkDTAG4M48Vst2nTZXz5y3/C0aO3A88D\n9wJ3AjA09FkuvvjdrF27bsHjzR4DhoZ+j4svvpS1a9/acZ/27v0Omdk4uF7QUgf/VcDNmXlVRGwA\n7sjMDU3aGfzSCjQ9Pc21125rK8TqA30mxI8c+RkHDuzn2LE7ABge3s6OHZ8+LeAa2w0N/R5wJseO\n/dfaEX8H+O3a4/owLtrufXMer1o1wcmTO4FtwFaq05jbas/ZBXwN+I8tjzf3GNPADcAfn9auvT7t\n7Cr4ycyuv4BvAa8Dx6jW8j8J3ATcVNfmq8BhYD9w2TzHSUkrw9TUVI6ObsnR0S25fv3GhAcSMmEq\nYW1teyLhrNrjB3J4eF1OTU2dev7w8LpT+6rPmaodYyJXrTqn6THmtttQd96sPd5S+6r/ftF2jY/r\n2zUeY752S3GMmcdkdpHdhWr8mXl9G21uLnIOSctH4wh/1arPUC15ANxDdeQ6Mxq+k5nR8NGj1ZLF\n+Pg4O3feU3v+troj3wOMA49z8uRXmh5jbrt+2ciqVZ/h5EmAd1Edec/4feDBDo/x+uJ3sQ29mNyV\ntAK0qrXP7Hv66f1zQvvkSWqli/dRLMReB3axatVLtUBs3W5o6BDwWY4dm/l+fQlnNoyLt9s15/Hw\n8IPs2DHBY4/tBmDTps/x2GO7a6WoExw79pMF+jf3GEeOrObAgebt2utTdwrX+BeDNX6pv06v1c9O\nVM6djKzWsOvr2uvX38/atW/lyJE3OHDgr2s16bkTn8PD23nkkV2Mj493cK7uJ0+XanJ3MSaf53tR\n7aZPfZvcXQwGv9Qf9SP5N9/8LzSbqGw1GVkf6PXHg/ZDrJMg7HTF0KCLiN5P7i7WF07uSouqfgJ2\nZlK1WZvZSdZ2JyOrE7Br1lzY8titzzV3slfdo8vJ3b6Hfhr80qJqN2RHR+tXlNSvyGm10qa70J57\nruoLy+jolsX6kUur2+B3clcaMI2rZupX1MxvHNjGmjVf5J3vPG/ORGXjhObExC5LLiucwS+V1MTE\njezbt42jR6vbw8MP8s1vzk7Azk5UVr+3Y8dinms7ExO7Cv4E6paTu9KAaVw10zgB29i2yO0WOu1X\nr85VFt1O7hr80gCaL2QN38Fi8EtqqZO/BLQyGPySWhob28revXNvKjY6ups9ex7uZ7dUQLfB74et\nSyvU9PQ0Y2NbGRvbyvT0dL+7oxXEVT3SCtRYttm3b9uCE7hHjrzB0NDsvV9cWVNelnqkFajdsk2r\n++U7ubvydVvqccQvDbDGN3MdOwZr11rXLzuDX1qBfEOUirDUI61Q7azJdwnnYHM5p6SmfNPW4DL4\npQFkaKsVg18aMJZptBCDXxowvtNWC/Gdu5KktricU1qmXLKppVK41BMRm4E7gNXA1zPz9ob9a4EH\ngbdRfaH548x8oKGNpR6pCSd31UpfavwRsRp4EfgI8BrwQ+D6zDxY12YS+EeZeWvtReBFYF1mnqhr\nY/BLUof6VeO/AjicmS9n5nHgIeCahjZ/C5xVe3wW8LP60Jck9VbRGv+5wCt1268CVza0uRf4i4h4\nHfgnwK8XPKckqYCiwd9OfeYPgGczcyQiLgT2RsSlmfn39Y0mJydPPR4ZGWFkZKRg16TBY82/3CqV\nCpVKpfBxitb4NwCTmbm5tn0rcLJ+gjciHgW+nJmP17b/HNiemU/VtbHGLy3AN3SpUb9q/E8BF0XE\nBRExBFwH7G5oc4jq5C8RsQ54D/DjgueVSmfuLZarLwAzo3+pE4VKPZl5IiJuBqapLue8LzMPRsRN\ntf13A38I3B8R+6m+0HwuM98s2G9JUpe8ZYO0QljqUSPv1SOVgJO7qmfwSyuYga5uGPzSCmUJR90y\n+KUVytsvq1vellmS1BZvyyz1mbdfVq9Z6pGWASd31Q1r/JJUMtb4JUltMfglqWQMfkkqGYNfkkrG\n4JekkjH4JalkDH5JKhmDX5JKxuCXpJIx+CWpZAx+aQBMT08zNraVsbGtTE9P97s7Wua8V4+0wvlB\nLuXlTdqkkvKDXMrLm7RJktriB7FIK5wf5KJOFS71RMRm4A5gNfD1zLy9SZsR4CvAmcCRzBxp2G+p\nRyrAD3Ipp77U+CNiNfAi8BHgNeCHwPWZebCuzdnA48B4Zr4aEWsz80jDcQx+SepQv2r8VwCHM/Pl\nzDwOPARc09DmN4CHM/NVgMbQlyT1VtHgPxd4pW771dr36l0ErImI70XEUxHx8YLnlCQVUHRyt536\nzJnAZcCHgbcAT0TEDzLzpfpGk5OTpx6PjIwwMjJSsGuSNFgqlQqVSqXwcYrW+DcAk5m5ubZ9K3Cy\nfoI3IrYDw5k5Wdv+OjCVmd+ua2ONX5I61K8a/1PARRFxQUQMAdcBuxva/BnwwYhYHRFvAa4EXih4\nXklSlwqVejLzRETcDExTXc55X2YejIibavvvzsxDETEFPAecBO7NTINfkvrEWzZI0grlLRskSW0x\n+CWpZAx+SSoZg1+SSsbgl6SSMfglqWQMfkkqGYNfkkrG4JekkjH4JalkDH5JKhmDX5JKxuCXpJIx\n+CWpZAx+SSoZg1+SSsbgl6SSMfglqWQMfkkqGYNfkkrG4JekkjH4JalkDH5JKpnCwR8RmyPiUES8\nFBHbW7R7f0SciIgtRc8pSepeoeCPiNXAV4HNwL8Ero+I987T7nZgCogi55QkFVN0xH8FcDgzX87M\n48BDwDVN2n0a+Dbw04Lnkwbe9PQ0Y2NbGRvbyvT0dL+7owF0RsHnnwu8Urf9KnBlfYOIOJfqi8G/\nAd4PZMFzSgNrenqaa6/dxtGjtwOwb982HnlkF+Pj433umQZJ0eBvJ8TvAG7JzIyIYJ5Sz+Tk5KnH\nIyMjjIyMFOyatHxNT0+zc+c9AExM3Hgq2HfuvKcW+tsAOHq0+j2DXwCVSoVKpVL4OEWD/zXg/Lrt\n86mO+utdDjxUzXzWAh+NiOOZubu+UX3wS4PMUb261Tgo/sIXvtDVcYoG/1PARRFxAfA6cB1wfX2D\nzPzlmccRcT/w3cbQl8qk1ah+YuJG9u3bxtGj1bbDw9uZmNjVv85qIBUK/sw8ERE3A9PAauC+zDwY\nETfV9t+9CH2USmN8fJxHHtlVVwbyLwEtvsjs/1xrRORy6IfUC42lnuHh7ZZ61JWIIDM7XiJv8Et9\nMN/krtQJg1+SSqbb4PdePZJUMga/JJWMwS9JJWPwS1LJGPySVDIGvySVjMEvSSVj8EtSyRj8klQy\nBr8klYzBL0klY/BLUskY/FIX/EB0rWTenVPqkPfT13LhbZmlHhkb28revVcz89GJsIvR0d3s2fNw\nP7ulEvK2zJKkthT9sHWpdPxAdK10lnqkLvjRiVoOrPFLUslY45cktcXgl6SSKRz8EbE5Ig5FxEsR\nsb3J/o9FxP6IeC4iHo+IS4qeU5LUvUI1/ohYDbwIfAR4DfghcH1mHqxr8wHghcz8RURsBiYzc0PD\ncazxS1KH+lXjvwI4nJkvZ+Zx4CHgmvoGmflEZv6itvkkcF7Bc0qSCiga/OcCr9Rtv1r73nw+BTxa\n8JzSiuT9fbRcFH0DV9v1mYj4EPBJYGOz/ZOTk6cej4yMMDIyUrBr0vLReH+fffu2eX8fdaxSqVCp\nVAofp2iNfwPVmv3m2vatwMnMvL2h3SXAd4DNmXm4yXGs8WugeX8fLYV+1fifAi6KiAsiYgi4Dtjd\n0LF3UA39G5qFviSptwqVejLzRETcDEwDq4H7MvNgRNxU23838HngHOCuiAA4nplXFOu2tLJ4fx8t\nJ96yQeoR7++jxeYtG6Ql1O2KnPrnAezZ8zB79jxs6KuvHPFr4BUdaXf7iVt+UpeWmnfnlJpYjPDt\ndkWOK3m01LoNfj+IRQNt5857aqFfDd+jR6vfc9StMjP4pQV0uyLHlTxariz1aKAtVp2923kCV/Jo\nKVnjl+Zh+GpQGfzSMuCLjHrJdfxSF1qtz2937f5Mu8su+yBXX/1x9u69mr17r+baa7d5F04tT5nZ\n969qN6TempqayuHhdQkPJDyQw8PrcmpqasF98x9jQ+2/Wft6IEdHt/T6x1KJ1LKz48x1xK/SmrvU\nszoBPFOmabVv/mO8vXedlwpwOacGRv/r6zcCN5zacvmmlq1u/kxY7C8s9aigdksz7T6nu1LPAzk0\ndHauX78pR0e3LHh+qSi6LPW4qkddaTW67tXIu/48R468wTPP/Dad3h5hMX6O/v+lobLqdlVP30f7\n6Yh/xVmMkXKzY46Obmk6Um62r/E8q1adkzDhxKpKhS5H/H0P/TT4l5VWATxjdHTLvKtXWu2b79jd\nvJA0O8+qVW/t+AVHWsm6DX5X9SwT3d7vfbH7cO2125ZkHXqrYy/G6hqASy/9FUZHdzM6urvlbRkW\nY+2+tKJ182qx2F+UfMTfbXmkyPmajbxbjdbb7W8nI/T5/0qYyDVrLszR0S25fv3Gps8rUlJa7DKV\n1C9Y6mmtnRJGvywUuJ3Wv1tpFW7tBn83fVqoBDTbp4mEs+pWyfxSDg2dPWd7/fqNOTq6Jb/0pS91\n/P+02zKVtBwZ/C0sNJLr5kVhMV9I2g/F04Ov3RHqTH/XrLmwg3PNXZrYqka/0IvA+vUbc2jolxb8\nf9CsfzN9WL9+05wXgW5G5Aa/Bklpg7+d0KmGSfMVH62CtdsQa9W/+u2ZEWuzQJvZ1ywIZ24NMDuZ\n2fznqj9Pq9sKzATr3D7N/RkbR94zP3MnpZN2XkgWK5gXcyJZWq4GLvjbGVE3+0WdL7hgbcLUaWHX\nKljnD4Vm4blxwUAfGjq7rk+nlzSaj+RPPxdsqT1u3FetjTeed+4LxFTtWrQO9GYhWz3f3NAtssKn\nWcguRimqyF94y7kkKDUaqOBv992QrZf0NQvMDU3CrlWwzhdip09GVteRnx7oc19wNrQ4xnznmhvU\nc4/XzXlnXyBaTZ4udfAv9rLPepZsVBbdBn/he/VExGbgDmA18PXMvL1JmzuBjwL/F/jNzHym1THn\n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\n", - "text": [ - "" - ] - } - ], - "prompt_number": 15 - }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(df.density, df.BurnedOut)\n", + "plt.xlim(0,1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And we see the very clear emergence of a critical value around 0.5, where the model quickly shifts from almost no trees being burned, to almost all of them.\n", + "\n", + "In this case we ran the model only once at each value. However, it's easy to have the BatchRunner execute multiple runs at each parameter combination, in order to generate more statistically reliable results. We do this using the *iteration* argument.\n", + "\n", + "Let's run the model 5 times at each parameter point, and export and plot the results as above." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ { - "cell_type": "markdown", + "data": { + "text/plain": [ + "(0, 1)" + ] + }, + "execution_count": 16, "metadata": {}, - "source": [ - "And we see the very clear emergence of a critical value around 0.5, where the model quickly shifts from almost no trees being burned, to almost all of them.\n", - "\n", - "In this case we ran the model only once at each value. However, it's easy to have the BatchRunner execute multiple runs at each parameter combination, in order to generate more statistically reliable results. We do this using the *iteration* argument.\n", - "\n", - "Let's run the model 5 times at each parameter point, and export and plot the results as above." - ] + "output_type": "execute_result" }, { - "cell_type": "code", - "collapsed": false, - "input": [ - "param_run = BatchRunner(ForestFire, param_set, iterations=5, model_reporters=model_reporter)\n", - "param_run.run_all()\n", - "df = param_run.get_model_vars_dataframe()\n", - "plt.scatter(df.density, df.BurnedOut)\n", - "plt.xlim(0,1)" - ], - "language": "python", + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, "metadata": {}, - "outputs": [ - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 16, - "text": [ - "(0, 1)" - ] - }, - { - "metadata": {}, - "output_type": "display_data", - "png": "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\njfn/vIVXkfM6S7gAAAAASUVORK5CYII=\n", - "text": [ - "" - ] - } - ], - "prompt_number": 16 + "output_type": "display_data" } ], - "metadata": {} + "source": [ + "param_run = BatchRunner(ForestFire, param_set, iterations=5, model_reporters=model_reporter)\n", + "param_run.run_all()\n", + "df = param_run.get_model_vars_dataframe()\n", + "plt.scatter(df.density, df.BurnedOut)\n", + "plt.xlim(0,1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } - ] -} \ No newline at end of file + ], + "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.4.2" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/mesa/datacollection.py b/mesa/datacollection.py index 4836d16c123..0a4a929091b 100644 --- a/mesa/datacollection.py +++ b/mesa/datacollection.py @@ -3,20 +3,27 @@ ===================================================== DataCollector is meant to provide a simple, standard way to collect data -generated by a Mesa model. It collects two types of data: model-level and -agent-level data. +generated by a Mesa model. It collects three types of data: model-level data, +agent-level data, and tables. A DataCollector is instantiated with two dictionaries of reporter names and associated functions for each, one for model-level data and one for -agent-level data. When the collect() method is called, each model-level -function is called, with the model as the argument, and the results associated -with the relevant variable. Then the agent-level functions are called on each +agent-level data; a third dictionary provides table names and columns. + +When the collect() method is called, each model-level function is called, with +the model as the argument, and the results associated with the relevant +variable. Then the agent-level functions are called on each agent in the model scheduler. -The DataCollector then stores the data it collects in two dictionaries: +Additionally, other objects can write directly to tables by passing in an +appropriate dictionary object for a table row. + +The DataCollector then stores the data it collects in dictionaries: * model_vars maps each reporter to a list of its values * agent_vars maps each reporter to a list of lists, where each nested list stores (agent_id, value) pairs. + * tables maps each table to a dictionary, with each column as a key with a + list as its value. Finally, DataCollector can create a pandas DataFrame from each collection. @@ -43,10 +50,11 @@ class DataCollector(object): model_vars = {} agent_vars = {} + tables = {} model = None - def __init__(self, model_reporters=None, agent_reporters=None): + def __init__(self, model_reporters={}, agent_reporters={}, tables={}): ''' Instantiate a DataCollector with lists of model and agent reporters. @@ -59,21 +67,62 @@ def __init__(self, model_reporters=None, agent_reporters=None): it might look like this: {"energy": lambda a: a.energy} + The tables arg accepts a dictionary mapping names of tables to lists of + columns. For example, if we want to allow agents to write their age + when they are destroyed (to keep track of lifespans), it might look + like: + {"Lifespan": ["unique_id", "age"]} + Args: model_reporters: Dictionary of reporter names and functions. agent_reporters: Dictionary of reporter names and functions. ''' - self.model_reporters = model_reporters - self.agent_reporters = agent_reporters + self.model_reporters = {} + self.agent_reporters = {} + self.tables = {} - if self.model_reporters: - for var in self.model_reporters: - self.model_vars[var] = [] + for name, func in model_reporters.items(): + self._new_model_reporter(name, func) - if self.agent_reporters: - for var in self.agent_reporters: - self.agent_vars[var] = [] + for name, func in agent_reporters.items(): + self._new_agent_reporter(name, func) + + for name, columns in tables.items(): + self._new_table(name, columns) + + def _new_model_reporter(self, reporter_name, reporter_function): + ''' + Add a new model-level reporter to collect. + Args: + reporter_name: Name of the model-level variable to collect. + reporter_function: Function object that returns the variable when + given a model instance. + ''' + + self.model_reporters[reporter_name] = reporter_function + self.model_vars[reporter_name] = [] + + def _new_agent_reporter(self, reporter_name, reporter_function): + ''' + Add a new agent-level reporter to collect. + Args: + reporter_name: Name of the agent-level variable to collect. + reporter_function: Function object that returns the variable when + given an agent object. + ''' + self.agent_reporters[reporter_name] = reporter_function + self.agent_vars[reporter_name] = [] + + def _new_table(self, table_name, table_columns): + ''' + Add a new table that objects can write to. + Args: + table_name: Name of the new table. + table_columns: List of columns to add to the table. + ''' + new_table = {column: [] for column in table_columns} + self.tables[table_name] = new_table def collect(self, model): ''' @@ -90,6 +139,27 @@ def collect(self, model): agent_records.append((agent.unique_id, reporter(agent))) self.agent_vars[var].append(agent_records) + def add_table_row(self, table_name, row, ignore_missing=False): + ''' + Add a row dictionary to a specific table. + + Args: + table_name: Name of the table to append a row to. + row: A dictionary of the form {column_name: value...} + ignore_missing: If True, fill any missing columns with Nones; + if False, throw an error if any columns are missing + ''' + if table_name not in self.tables: + raise Exception("Table does not exist.") + + for column in self.tables[table_name]: + if column in row: + self.tables[table_name][column].append(row[column]) + elif ignore_missing: + self.tables[table_name][column].append(None) + else: + raise Exception("Could not insert row with missing column") + def get_model_vars_dataframe(self): ''' Create a pandas DataFrame from the model variables. @@ -115,3 +185,14 @@ def get_agent_vars_dataframe(self): df = pd.DataFrame.from_dict(data, orient="index") df.index.names = ["Step", "AgentID"] return df + + def get_table_dataframe(self, table_name): + ''' + Create a pandas DataFrame from a particular table. + + Args: + table_name: The name of the table to convert. + ''' + if table_name not in self.tables: + raise Exception("No such table.") + return pd.DataFrame(self.tables[table_name]) diff --git a/tests/test_datacollector.py b/tests/test_datacollector.py new file mode 100644 index 00000000000..e1115978024 --- /dev/null +++ b/tests/test_datacollector.py @@ -0,0 +1,119 @@ +''' +Test the DataCollector +''' +import unittest + +from mesa import Model, Agent +from mesa.time import BaseScheduler +from mesa.datacollection import DataCollector + + +class MockAgent(Agent): + ''' + Minimalistic agent for testing purposes. + ''' + def __init__(self, unique_id, val): + self.unique_id = unique_id + self.val = val + + def step(self, model): + ''' + Increment val by 1. + ''' + self.val += 1 + + def write_final_values(self, model): + ''' + Write the final value to the appropriate table. + ''' + row = {"agent_id": self.unique_id, "final_value": self.val} + model.datacollector.add_table_row("Final_Values", row) + + +class MockModel(Model): + ''' + Minimalistic model for testing purposes. + ''' + + schedule = BaseScheduler(None) + + def __init__(self): + self.schedule = BaseScheduler(self) + for i in range(10): + a = MockAgent(i, i) + self.schedule.add(a) + self.datacollector = DataCollector( + {"total_agents": lambda m: m.schedule.get_agent_count()}, + {"value": lambda a: a.val}, + {"Final_Values": ["agent_id", "final_value"]}) + + def step(self): + self.schedule.step() + self.datacollector.collect(self) + + +class TestDataCollector(unittest.TestCase): + def setUp(self): + ''' + Create the model and run it a set number of steps. + ''' + self.model = MockModel() + for i in range(7): + self.model.step() + # Write to table: + for agent in self.model.schedule.agents: + agent.write_final_values(self.model) + + def test_model_vars(self): + ''' + Test model-level variable collection. + ''' + data_collector = self.model.datacollector + assert "total_agents" in data_collector.model_vars + assert len(data_collector.model_vars["total_agents"]) == 7 + for element in data_collector.model_vars["total_agents"]: + assert element == 10 + + def test_agent_vars(self): + ''' + Test agent-level variable collection. + ''' + data_collector = self.model.datacollector + assert len(data_collector.agent_vars["value"]) == 7 + for step in data_collector.agent_vars["value"]: + assert len(step) == 10 + for record in step: + assert len(record) == 2 + + def test_table_rows(self): + ''' + Test table collection + ''' + data_collector = self.model.datacollector + assert len(data_collector.tables["Final_Values"]) == 2 + assert "agent_id" in data_collector.tables["Final_Values"] + assert "final_value" in data_collector.tables["Final_Values"] + for key, data in data_collector.tables["Final_Values"].items(): + assert len(data) == 10 + + with self.assertRaises(Exception): + data_collector.add_table_row("error_table", {}) + + with self.assertRaises(Exception): + data_collector.add_table_row("Final_Values", {"final_value": 10}) + + def test_exports(self): + ''' + Test DataFrame exports + ''' + data_collector = self.model.datacollector + model_vars = data_collector.get_model_vars_dataframe() + agent_vars = data_collector.get_agent_vars_dataframe() + table_df = data_collector.get_table_dataframe("Final_Values") + + assert model_vars.shape == (7, 1) + assert agent_vars.shape == (70, 1) + assert table_df.shape == (10, 2) + + with self.assertRaises(Exception): + table_df = data_collector.get_table_dataframe("not a real table")