Skip to content

Instantly share code, notes, and snippets.

@dmasad
Created August 4, 2018 14:36
Show Gist options
  • Save dmasad/ea6416772a66601e2eddd1ee379da46b to your computer and use it in GitHub Desktop.
Save dmasad/ea6416772a66601e2eddd1ee379da46b to your computer and use it in GitHub Desktop.
Mesa data collection profiling
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import random\n",
"import time\n",
"from collections import defaultdict\n",
"import numpy as np\n",
"\n",
"\n",
"from mesa import Model, Agent\n",
"from mesa.time import BaseScheduler\n",
"from mesa.datacollection import DataCollector\n",
"\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Goal: test different strategies for collecting data generated by a Mesa model."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To start with, we'll set up a dummy model. It will consist of $N$ agents, each random walking in a notional space (that is, not in a Mesa space). "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class TestAgent(Agent):\n",
" def __init__(self, unique_id, model):\n",
" super().__init__(unique_id, model)\n",
" self.x = random.random()\n",
" self.y = random.random()\n",
" \n",
" def step(self):\n",
" self.x += random.normalvariate(0, 0.5)\n",
" self.y += random.normalvariate(0, 0.5)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class BaselineTestModel(Model):\n",
" '''Baseline model variant without a data collector at all'''\n",
" \n",
" def __init__(self, n_agents):\n",
" self.schedule = BaseScheduler(self)\n",
" for i in range(n_agents):\n",
" agent = TestAgent(i, self)\n",
" self.schedule.add(agent)\n",
"\n",
" def step(self):\n",
" self.schedule.step()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def run_experiment(ModelClass, agent_counts, n_runs, n_steps=1000):\n",
" '''Instantiate, run, and time a model class\n",
" '''\n",
" run_times = defaultdict(list)\n",
" for n_agents in agent_counts:\n",
" for _ in range(n_runs):\n",
" model = ModelClass(n_agents)\n",
" start = time.time()\n",
" for _ in range(n_steps):\n",
" model.step()\n",
" end = time.time()\n",
" delta = end - start\n",
" run_times[n_agents].append(delta)\n",
" return dict(run_times)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First test: no data collector, 1,000 agents, 1,000 steps."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"model = BaselineTestModel(1000)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.98\n"
]
}
],
"source": [
"start = time.time()\n",
"for _ in range(1000):\n",
" model.step()\n",
"end = time.time()\n",
"print(\"{:.2f}\".format(end - start))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vary the number of agents and see how it scales. Should be linear."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"agent_counts = range(500, 5500, 500)\n",
"run_times_base = run_experiment(BaselineTestModel, agent_counts, n_runs=1)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x113df26a0>]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot([x for x in run_times_base], [np.mean(times) for times in run_times_base.values()])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next experiment: add the standard data collector and compare"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class DCTestModel(BaselineTestModel):\n",
" '''Model with the data collector.'''\n",
" \n",
" def __init__(self, n_agents):\n",
" super().__init__(n_agents)\n",
" self.data_collector = DataCollector(agent_reporters={\"x\": \"x\", \"y\": \"y\"})\n",
" \n",
" def step(self):\n",
" super().step()\n",
" self.data_collector.collect(self)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"run_times_dc = run_experiment(DCTestModel, agent_counts, n_runs=1)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Runtime (seconds)')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"ax.plot([x for x in run_times_base], [np.mean(times) for times in run_times_base.values()],\n",
" label=\"No data collection\")\n",
"ax.plot([x for x in run_times_dc], [np.mean(times) for times in run_times_dc.values()],\n",
" label=\"Data collection\")\n",
"\n",
"ax.legend()\n",
"ax.set_xlabel(\"# of agents\")\n",
"ax.set_ylabel(\"Runtime (seconds)\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Adding SQLite writing"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import sqlite3"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"class SQLiteTestModel(BaselineTestModel):\n",
" '''Model with the data collector.'''\n",
" \n",
" def __init__(self, n_agents):\n",
" super().__init__(n_agents)\n",
" self.conn = sqlite3.connect(\":memory:\")\n",
" self.c = self.conn.cursor()\n",
" self.c.execute(\n",
" \"CREATE TABLE agent_data (turn INTEGER, unique_id REAL, x REAL, y REAL)\"\n",
" )\n",
" self.conn.commit()\n",
" self.insert_sql = \"INSERT INTO agent_data VALUES ({}, {}, {}, {})\"\n",
" \n",
" def step(self):\n",
" super().step()\n",
" self.record_data()\n",
" \n",
" def record_data(self):\n",
" self.c.execute(\"BEGIN TRANSACTION;\")\n",
" for agent in self.schedule.agents:\n",
" sql = self.insert_sql.format(\n",
" self.schedule.steps,\n",
" agent.unique_id,\n",
" agent.x, agent.y)\n",
" self.c.execute(sql)\n",
" self.conn.commit()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"m = SQLiteTestModel(100)\n",
"for _ in range(100):\n",
" m.step()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"run_times_sql = run_experiment(SQLiteTestModel, agent_counts, n_runs=1)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'Runtime (seconds)')"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots()\n",
"\n",
"ax.plot([x for x in run_times_base], [np.mean(times) for times in run_times_base.values()],\n",
" label=\"No data collection\")\n",
"ax.plot([x for x in run_times_dc], [np.mean(times) for times in run_times_dc.values()],\n",
" label=\"Data collection\")\n",
"\n",
"ax.plot([x for x in run_times_sql], [np.mean(times) for times in run_times_sql.values()],\n",
" label=\"SQLite data collection\")\n",
"\n",
"\n",
"ax.legend()\n",
"ax.set_xlabel(\"# of agents\")\n",
"ax.set_ylabel(\"Runtime (seconds)\")"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [mesa]",
"language": "python",
"name": "Python [mesa]"
},
"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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment