diff --git a/README.md b/README.md index 09f2a70..b42ebdb 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,6 @@ pip3 install dist/*.whl ***IMPORTANT NOTE:*** Tokens are issued to those with access to proprietary builds of cadCAD and BlockScience employees **ONLY**. Replace \ with an issued token in the script below. ```bash -pip3 install pandas pathos fn funcy tabulate pip3 install cadCAD --extra-index-url https://@repo.fury.io/blockscience/ ``` diff --git a/simulations/external_data/output.csv b/simulations/external_data/output.csv new file mode 100644 index 0000000..c28448f --- /dev/null +++ b/simulations/external_data/output.csv @@ -0,0 +1,27 @@ +ds1,ds2,ds3,run,substep,timestep +0,0,1,1,0,0 +1,40,5,1,1,1 +2,40,5,1,2,1 +3,40,5,1,3,1 +4,40,5,1,1,2 +5,40,5,1,2,2 +6,40,5,1,3,2 +7,40,5,1,1,3 +8,40,5,1,2,3 +9,40,5,1,3,3 +10,40,5,1,1,4 +11,40,5,1,2,4 +12,40,5,1,3,4 +0,0,1,2,0,0 +1,40,5,2,1,1 +2,40,5,2,2,1 +3,40,5,2,3,1 +4,40,5,2,1,2 +5,40,5,2,2,2 +6,40,5,2,3,2 +7,40,5,2,1,3 +8,40,5,2,2,3 +9,40,5,2,3,3 +10,40,5,2,1,4 +11,40,5,2,2,4 +12,40,5,2,3,4 diff --git a/simulations/validation/conviction_cadCAD.ipynb b/simulations/validation/conviction_cadCAD.ipynb index c7b219f..494e28b 100644 --- a/simulations/validation/conviction_cadCAD.ipynb +++ b/simulations/validation/conviction_cadCAD.ipynb @@ -34,7 +34,7 @@ "\n", "cadCAD is a Python library that assists in the processes of designing, testing and validating complex systems through simulation. At its core, cadCAD is a differential games engine that supports parameter sweeping and Monte Carlo analyses and can be easily integrated with other scientific computing Python modules and data science workflows.\n", "\n", - "To learn more about cadCAD, follow our [tutorial series](https://github.com/BlockScience/cadCAD-Tutorials/tree/master/01%20Tutorials)\n", + "To learn more about cadCAD, follow our [tutorial series](../../tutorials)\n", "\n", "**Installing cadCAD:**\n", "\n", diff --git a/tutorials/README.md b/tutorials/README.md new file mode 100644 index 0000000..2d7ecef --- /dev/null +++ b/tutorials/README.md @@ -0,0 +1,10 @@ +**Robot and Marbles Tutorial Series** + +In this series, we introduce basic concepts of cadCAD and system modelling in general using a simple toy model. +[Part 1](robot-marbles-part-1/robot-marbles-part-1.ipynb) - States and State Update Functions +[Part 2](robot-marbles-part-2/robot-marbles-part-2.ipynb) - Actions and State Dependent Policies +[Part 3](robot-marbles-part-3/robot-marbles-part-3.ipynb) - From Synchronous to Asynchronous Time +[Part 4](robot-marbles-part-4/robot-marbles-part-4.ipynb) - Uncertainty and Stochastic Processes +[Part 5](robot-marbles-part-5/robot-marbles-part-5.ipynb) - Using class objects as state variables + +Check out the [videos](videos) folder for detailed walkthroughs of each one of the tutorials. \ No newline at end of file diff --git a/tutorials/robot-marbles-part-1/partial-state-update-blocks.png b/tutorials/robot-marbles-part-1/partial-state-update-blocks.png new file mode 100644 index 0000000..746a748 Binary files /dev/null and b/tutorials/robot-marbles-part-1/partial-state-update-blocks.png differ diff --git a/tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb b/tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb new file mode 100644 index 0000000..2cbf87f --- /dev/null +++ b/tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb @@ -0,0 +1,639 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Tutorials: The Robot and the Marbles, part 1\n", + "## What is cadCAD?\n", + "cadCAD is a Python library that assists in the processes of designing, testing and validating complex systems through simulation. At its core, cadCAD is a differential games engine that supports parameter sweeping and Monte Carlo analyses and can be easily integrated with other scientific computing Python modules and data science workflows.\n", + "\n", + "At [BlockScience](http://bit.ly/github_articles_M_1), we've been using cadCAD as a tool for [Token Engineering](https://medium.com/block-science/on-the-practice-of-token-engineering-part-i-c2cc2434e727) - the design of self-organizing systems enabled through cryptographic peer-to-peer networks. But cadCAD can simulate any system that can be described as state variables that evolve over time according to a set of equations. This series of articles will go over the basic concepts of cadCAD and the 'language' in which a system must be described in order for it to be interpretable by the library. This article will cover the following concepts:\n", + "* State Variables\n", + "* Timestep\n", + "* State Update Functions\n", + "* Partial State Update Blocks\n", + "* Simulation Configuration Parameters\n", + "\n", + "To help illustrate, we'll refer to a simple example system\n", + "\n", + "__The robot and the marbles__ \n", + "* Picture a box (`box_A`) with ten marbles in it; an empty box (`box_B`) next to the first one; and a robot arm capable of taking a marble from any one of the boxes and dropping it into the other one. \n", + "* The robot is programmed to take one marble at a time from the box containing the largest number of marbles and drop it in the other box. It repeats that process until the boxes contain an equal number of marbles. \n", + "\n", + "## State Variables\n", + ">A state variable is one of the set of variables that are used to describe the mathematical \"state\" of a dynamical system. Intuitively, the state of a system describes enough about the system to determine its future behaviour in the absence of any external forces affecting the system. [_(source: Wikipedia)_](https://en.wikipedia.org/wiki/State_variable)\n", + "\n", + "cadCAD can handle state variables of any Python data type, including custom classes. It is up to the user of cadCAD to determine the state variables needed to sufficiently accurately describe the system they are interested in.\n", + "\n", + "We could describe the simple system in our example with only two state variables: the number of marbles in `box_A` and in `box_B`. These are not the only two variables that describe the system, of course. Things like the position of the robot arm in space or its temperature also qualify as \"variables that describe the state of the system\". But if we assume those variables have no impact on the behavior of the system (as implied by the description) we can safely disregard them.\n", + "\n", + "cadCAD expects state variables to be passed to it as a Python `dict` where the `dict_keys` are the __names of the \n", + "variables__ and the `dict_values` are their __initial values__." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# List of all the state variables in the system and their initial values\n", + "initial_conditions = {\n", + " 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it\n", + " 'box_B': 0 # as per the description of the example, box_B starts out empty\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Timestep\n", + "Computer simulations run in discrete time:\n", + ">Discrete time views values of variables as occurring at distinct, separate \"points in time\", or equivalently as being unchanged throughout each non-zero region of time (\"time period\")—that is, time is viewed as a discrete variable. Thus a non-time variable jumps from one value to another as time moves from one time period to the next. This view of time corresponds to a digital clock that gives a fixed reading of 10:37 for a while, and then jumps to a new fixed reading of 10:38, etc. [_(source: Wikipedia)_](https://en.wikipedia.org/wiki/Discrete_time_and_continuous_time)\n", + "\n", + "The concept of Timestep in cadCAD refers to a discrete unit of time. cadCAD increments a \"time counter\", and at each step it updates the state variables according to the equations that describe the system. If time itself is a state variable that the user is interested in keeping track of, they may specify a state update function that models the passing of time. We'll cover that scenario in an upcoming article. For the moment, it suffices to define that the robot acts once per timestep.\n", + "# State Update Functions\n", + "State Update Functions are Python functions that represent the equations according to which the state variables change over time. Each state update function must return a tuple containing the name of the state variable being updated and its new value. The general structure of a state update function is:\n", + "```python\n", + "def function(params, step, sL, s, _input):\n", + " ...\n", + " y = ...\n", + " x = ...\n", + " return (y, x)\n", + "```\n", + "State update functions can read the current state of the system from argument `s`. We'll ignore the other arguments for now. `s` is a Python `dict` where the `dict_keys` are the __names of the variables__ and the `dict_values` are their __current values__. With this, we can define the state update functions for variables `box_A` and `box_B`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def update_A(params, step, sL, s, _input):\n", + " y = 'box_A'\n", + " add_to_A = 0\n", + " if (s['box_A'] > s['box_B']):\n", + " add_to_A = -1\n", + " elif (s['box_A'] < s['box_B']):\n", + " add_to_A = 1\n", + " x = s['box_A'] + add_to_A\n", + " return (y, x)\n", + "\n", + "def update_B(params, step, sL, s, _input):\n", + " y = 'box_B'\n", + " add_to_B = 0\n", + " if (s['box_B'] > s['box_A']):\n", + " add_to_B = -1\n", + " elif (s['box_B'] < s['box_A']):\n", + " add_to_B = 1\n", + " x = s['box_B'] + add_to_B\n", + " return (y, x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Partial State Update Blocks\n", + "Within a timestep, state update functions can be run in any combination of serial or parallel executions. Take the following diagram for example:\n", + "![partial state update blocks](partial-state-update-blocks.png \"Partial State Update Blocks\")
Figure 1: Visual representation of Partial State Update Blocks
\n", + "\n", + "State update functions (SUF) 1 and 2 are run in parallel. This means that if SUF2 reads the value of variable A, it will not get the value updated by SUF1. On the other hand, SUF3 and SUF4 are executed after SUF1 and SUF2 have completed, thus having access to the updated values of variables A and C.\n", + "\n", + "We refer to the groups of state update functions that are executed in parallel within a timestep as Partial State Update Blocks. cadCAD expects partial state update blocks to be specified as a list of `dict`s with the following structure:\n", + "```python\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': {\n", + " 'policy1': policy_function_1,\n", + " 'policy2': policy_function_2,\n", + " ...\n", + " },\n", + " 'variables': {\n", + " 'variable1': state_update_function_1,\n", + " 'variable2': state_update_function_2,\n", + " ...\n", + " }\n", + " },\n", + " ...\n", + "]\n", + "```\n", + "\n", + "We'll ignore the `policies` key for now. The `dict` that represents the structure of Figure 1 would be:\n", + "```python\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': {\n", + " },\n", + " 'variables': {\n", + " 'variableA': state_update_function_1,\n", + " 'variableC': state_update_function_2,\n", + " }\n", + " },\n", + " { \n", + " 'policies': {\n", + " },\n", + " 'variables': {\n", + " 'variableA': state_update_function_3,\n", + " 'variableB': state_update_function_4,\n", + " }\n", + " }\n", + "]\n", + "```\n", + "\n", + "In the case of our robot and marbles example system, we can model the system so that all state update functions are executed in parallel. In other words, we consider the marbles move from one box to the other simultaneously (ie, `box_A + box_B` is constant)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, the user specifies if state update functions will be run in series or in parallel\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # We'll ignore policies for now\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'box_A': update_A,\n", + " 'box_B': update_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simulation Configuration Parameters\n", + "Lastly, we define the number of timesteps and the number of Monte Carlo runs of the simulation. These parameters must be passed in a dictionary, in `dict_keys` `T` and `N`, respectively. In our example, we'll run the simulation for 10 timesteps. And because we are dealing with a deterministic system, it makes no sense to have multiple Monte Carlo runs, so we set `N=1`. We'll ignore the `M` key for now and set it to an empty `dict`" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n", + "# We'll cover the `M` key in a future article. For now, let's leave it empty\n", + "simulation_parameters = {\n", + " 'T': range(10),\n", + " 'N': 1,\n", + " 'M': {}\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Putting it all together\n", + "We have defined the state variables of our system and their initial conditions, as well as the state update functions, which have been grouped in a single state update block. We have also specified the parameters of the simulation (number of timesteps and runs). We are now ready to put all those pieces together in a `Configuration` object." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "from cadCAD.configuration import Configuration\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Running the engine\n", + "We are now ready to run the engine with the configuration defined above. Instantiate an ExecutionMode, an ExecutionContext and an Executor objects, passing the Configuration object to the latter. Then run the `execute()` method of the Executor object, which returns the results of the experiment in the first element of a tuple." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Analyzing the results\n", + "We can now convert the raw results into a DataFrame for analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
1191
2182
3173
4164
5155
6155
7155
8155
9155
10155
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 9 1\n", + " 2 1 8 2\n", + " 3 1 7 3\n", + " 4 1 6 4\n", + " 5 1 5 5\n", + " 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%matplotlib inline\n", + "import pandas as pd\n", + "df = pd.DataFrame(raw_result)\n", + "df.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because the number of marbles in the system is even, it converges to an equilibrium with 5 marbles in each box. Simulating a scenario with an odd number of marbles is as easy as modifying the `initial_condition` of the system, recreating the configuration object and rerunning the simulation:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "initial_conditions = {\n", + " 'box_A': 11,\n", + " 'box_B': 0\n", + "}\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "executor = Executor(exec_context, [config])\n", + "raw_result, tensor = executor.execute()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100110
11101
2192
3183
4174
5165
6156
7165
8156
9165
10156
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 11 0\n", + " 1 1 10 1\n", + " 2 1 9 2\n", + " 3 1 8 3\n", + " 4 1 7 4\n", + " 5 1 6 5\n", + " 6 1 5 6\n", + " 7 1 6 5\n", + " 8 1 5 6\n", + " 9 1 6 5\n", + " 10 1 5 6" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(raw_result)\n", + "df.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As was to be expected, the system oscilates between 5 and 6 marbles in each box.\n", + "\n", + "In the next article of this series we'll cover another base concept in cadCAD: **policies**.\n", + "\n", + "---\n", + "\n", + "_About BlockScience_ \n", + "[BlockScience](http://bit.ly/github_articles_M_1) is a research and engineering firm specialized in complex adaptive systems and applying practical methodologies from engineering design, development and testing to projects in emerging technologies such as blockchain. Follow us on [Medium](http://bit.ly/bsci-medium) or [Twitter](http://bit.ly/bsci-twitter) to stay in touch." + ] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/robot-marbles-part-2/policies.png b/tutorials/robot-marbles-part-2/policies.png new file mode 100644 index 0000000..c50e55a Binary files /dev/null and b/tutorials/robot-marbles-part-2/policies.png differ diff --git a/tutorials/robot-marbles-part-2/policy.png b/tutorials/robot-marbles-part-2/policy.png new file mode 100644 index 0000000..cede32f Binary files /dev/null and b/tutorials/robot-marbles-part-2/policy.png differ diff --git a/tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb b/tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb new file mode 100644 index 0000000..4d68ba9 --- /dev/null +++ b/tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb @@ -0,0 +1,355 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Tutorials: The Robot and the Marbles, part 2\n", + "In [Part 1](../robot-marbles-part-1/robot-marbles-part-1.ipynb) we introduced the 'language' in which a system must be described in order for it to be interpretable by cadCAD and some of the basic concepts of the library:\n", + "* State Variables\n", + "* Timestep\n", + "* State Update Functions\n", + "* Partial State Update Blocks\n", + "* Simulation Configuration Parameters\n", + "\n", + "This article will introduce the concept of __Policies__. But first let's copy the base configuration from Part 1. As a reminder, here's the description of the simple system we are using for illustration purposes.\n", + "\n", + "__The robot and the marbles__ \n", + "* Picture a box (`box_A`) with ten marbles in it; an empty box (`box_B`) next to the first one; and a robot arm capable of taking a marble from any one of the boxes and dropping it into the other one. \n", + "* The robot is programmed to take one marble at a time from the box containing the largest number of marbles and drop it in the other box. It repeats that process until the boxes contain an equal number of marbles. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# List of all the state variables in the system and their initial values\n", + "initial_conditions = {\n", + " 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it\n", + " 'box_B': 0 # as per the description of the example, box_B starts out empty\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "def update_A(params, step, sL, s, _input):\n", + " y = 'box_A'\n", + " add_to_A = 0\n", + " if (s['box_A'] > s['box_B']):\n", + " add_to_A = -1\n", + " elif (s['box_A'] < s['box_B']):\n", + " add_to_A = 1\n", + " x = s['box_A'] + add_to_A\n", + " return (y, x)\n", + "\n", + "def update_B(params, step, sL, s, _input):\n", + " y = 'box_B'\n", + " add_to_B = 0\n", + " if (s['box_B'] > s['box_A']):\n", + " add_to_B = -1\n", + " elif (s['box_B'] < s['box_A']):\n", + " add_to_B = 1\n", + " x = s['box_B'] + add_to_B\n", + " return (y, x)\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, the user specifies if state update functions will be run in series or in parallel\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # We'll ignore policies for now\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'box_A': update_A,\n", + " 'box_B': update_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n", + "# We'll cover the `M` key in a future article. For now, let's leave it empty\n", + "simulation_parameters = {\n", + " 'T': range(10),\n", + " 'N': 1,\n", + " 'M': {}\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "from cadCAD.configuration import Configuration\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "\n", + "%matplotlib inline\n", + "import pandas as pd\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Policies\n", + "In part 1, we ignored the `_input` argument of state update functions. That argument is a signal passed to the state update function by another set of functions: Policy Functions.\n", + "\n", + "Policy Functions are most commonly used as representations of the behavior of agents that interact with the components of the system we're simulating in cadCAD. But more generally, they describe the logic of some component or mechanism of the system. It is possible to encode the functionality of a policy function in the state update functions themselves (as we did in part 1, where we had the robot's algorithm reside in the `update_A` and `update_B` functions), but as systems grow more complex this approach makes the code harder to read and maintain, and in some cases more inefficient because of unnecessary repetition of computational steps.\n", + "\n", + "The general structure of a policy function is:\n", + "```python\n", + "def policy_function(params, step, sL, s):\n", + " ...\n", + " return {'value1': value1, 'value2': value2, ...}\n", + "```\n", + "Just like State Update Functions, policies can read the current state of the system from argument `s`, a Python `dict` where the `dict_keys` are the __names of the variables__ and the `dict_values` are their __current values__. The Policy Function must return a dictionary, which will be passed as an argument (`_input`) to the state update functions.\n", + "![Policy](policy.png \"Policy\")\n", + "\n", + "Let's update our simulation so that the robot arm's logic is encoded in a Policy instead of in the State Update Functions." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We specify the robot arm's logic in a Policy Function\n", + "def robot_arm(params, step, sL, s):\n", + " add_to_A = 0\n", + " if (s['box_A'] > s['box_B']):\n", + " add_to_A = -1\n", + " elif (s['box_A'] < s['box_B']):\n", + " add_to_A = 1\n", + " return({'add_to_A': add_to_A, 'add_to_B': -add_to_A})\n", + " \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We make the state update functions less \"intelligent\",\n", + "# ie. they simply add the number of marbles specified in _input \n", + "# (which, per the policy function definition, may be negative)\n", + "def increment_A(params, step, sL, s, _input):\n", + " y = 'box_A'\n", + " x = s['box_A'] + _input['add_to_A']\n", + " return (y, x)\n", + "\n", + "def increment_B(params, step, sL, s, _input):\n", + " y = 'box_B'\n", + " x = s['box_B'] + _input['add_to_B']\n", + " return (y, x)\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, \n", + "# the user specifies if state update functions will be run in series or in parallel\n", + "# and the policy functions that will be evaluated in that block\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'robot_arm': robot_arm\n", + " },\n", + " 'states': { # The following state variables will be updated simultaneously\n", + " 'box_A': increment_A,\n", + " 'box_B': increment_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " colormap = 'RdYlGn',\n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As expected, the results are the same as when the robot arm logic was encoded within the state update functions. \n", + "\n", + "Several policies may be evaluated within a Partial State Update Block. When that's the case, cadCAD's engine aggregates the outputs of the policies and passes them as a single signal to the state update functions. \n", + "![Policies](policies.png \"Policies\")\n", + "\n", + "Aggregation of policies is defined in cadCAD as __key-wise sum (+) of the elements of the outputted `dict`s__.\n", + "```python\n", + ">policy_1_output = {'int': 1, 'str': 'abc', 'list': [1, 2], '1-only': 'Specific to policy 1'}\n", + ">policy_2_output = {'int': 2, 'str': 'def', 'list': [3, 4], '2-only': 'Specific to policy 2'}\n", + ">print(aggregate([policy_1_output, policy_2_output]))\n", + "```\n", + "```\n", + "{'int': 3, 'str': 'abcdef', 'list': [1, 2, 3, 4], '1-only': 'Specific to policy 1', '2-only': 'Specific to policy 2'}\n", + "```\n", + "\n", + "To illustrate, let's add to another system another robot arm identical to the first one, that acts in tandem with it. All it takes is to add a policy to the `dict` that describes the partial state update block." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, \n", + "# the user specifies if state update functions will be run in series or in parallel\n", + "# and the policy functions that will be evaluated in that block\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'robot_arm_1': robot_arm,\n", + " 'robot_arm_2': robot_arm\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'box_A': increment_A,\n", + " 'box_B': increment_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib inline\n", + "df = pd.DataFrame(raw_result)\n", + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " colormap = 'RdYlGn',\n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because we have made it so that both robots read and update the state of the system at the same time, the equilibrium we had before (with 5 marbles in each box) is never reached. Instead, the system oscillates around that point.\n", + "\n", + "---\n", + "\n", + "_About BlockScience_ \n", + "[BlockScience](http://bit.ly/github_articles_M_02) is a research and engineering firm specialized in complex adaptive systems and applying practical methodologies from engineering design, development and testing to projects in emerging technologies such as blockchain. Follow us on [Medium](http://bit.ly/bsci-medium) or [Twitter](http://bit.ly/bsci-twitter) to stay in touch." + ] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb b/tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb new file mode 100644 index 0000000..c3d5ba5 --- /dev/null +++ b/tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb @@ -0,0 +1,298 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Tutorials: The Robot and the Marbles, part 3\n", + "In parts [1](../robot-marbles-part-1/robot-marbles-part-1.ipynb) and [2](../robot-marbles-part-2/robot-marbles-part-2.ipynb) we introduced the 'language' in which a system must be described in order for it to be interpretable by cadCAD and some of the basic concepts of the library:\n", + "* State Variables\n", + "* Timestep\n", + "* State Update Functions\n", + "* Partial State Update Blocks\n", + "* Simulation Configuration Parameters\n", + "* Policies\n", + "\n", + "In this notebook we'll look at how subsystems within a system can operate in different frequencies. But first let's copy the base configuration with which we ended Part 2. Here's the description of that system:\n", + "\n", + "__The robot and the marbles__ \n", + "* Picture a box (`box_A`) with ten marbles in it; an empty box (`box_B`) next to the first one; and __two__ robot arms capable of taking a marble from any one of the boxes and dropping it into the other one. \n", + "* The robots are programmed to take one marble at a time from the box containing the largest number of marbles and drop it in the other box. They repeat that process until the boxes contain an equal number of marbles.\n", + "* The robots act simultaneously; in other words, they assess the state of the system at the exact same time, and decide what their action will be based on that information." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# List of all the state variables in the system and their initial values\n", + "initial_conditions = {\n", + " 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it\n", + " 'box_B': 0 # as per the description of the example, box_B starts out empty\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n", + "# We'll cover the `M` key in a future article. For now, let's leave it empty\n", + "simulation_parameters = {\n", + " 'T': range(10),\n", + " 'N': 1,\n", + " 'M': {}\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We specify the robot arm's logic in a Policy Function\n", + "def robot_arm(params, step, sL, s):\n", + " add_to_A = 0\n", + " if (s['box_A'] > s['box_B']):\n", + " add_to_A = -1\n", + " elif (s['box_A'] < s['box_B']):\n", + " add_to_A = 1\n", + " return({'add_to_A': add_to_A, 'add_to_B': -add_to_A})\n", + " \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We make the state update functions less \"intelligent\",\n", + "# ie. they simply add the number of marbles specified in _input \n", + "# (which, per the policy function definition, may be negative)\n", + "def increment_A(params, step, sL, s, _input):\n", + " y = 'box_A'\n", + " x = s['box_A'] + _input['add_to_A']\n", + " return (y, x)\n", + "\n", + "def increment_B(params, step, sL, s, _input):\n", + " y = 'box_B'\n", + " x = s['box_B'] + _input['add_to_B']\n", + " return (y, x)\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, \n", + "# the user specifies if state update functions will be run in series or in parallel\n", + "# and the policy functions that will be evaluated in that block\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'robot_arm_1': robot_arm,\n", + " 'robot_arm_2': robot_arm\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'box_A': increment_A,\n", + " 'box_B': increment_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "from cadCAD.configuration import Configuration\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "\n", + "%matplotlib inline\n", + "import pandas as pd\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " colormap = 'RdYlGn',\n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Asynchronous Subsystems\n", + "We have defined that the robots operate simultaneously on the boxes of marbles. But it is often the case that agents within a system operate asynchronously, each having their own operation frequencies or conditions.\n", + "\n", + "Suppose that instead of acting simultaneously, the robots in our examples operated in the following manner:\n", + "* Robot 1: acts once every 2 timesteps\n", + "* Robot 2: acts once every 3 timesteps\n", + "\n", + "One way to simulate the system with this change is to introduce a check of the current timestep before the robots act, with the definition of separate policy functions for each robot arm." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We specify each of the robots logic in a Policy Function\n", + "robots_periods = [2,3] # Robot 1 acts once every 2 timesteps; Robot 2 acts once every 3 timesteps\n", + "\n", + "def get_current_timestep(cur_substep, s):\n", + " if cur_substep == 1:\n", + " return s['timestep']+1\n", + " return s['timestep']\n", + "\n", + "def robot_arm_1(params, step, sL, s):\n", + " _robotId = 1\n", + " if get_current_timestep(step, s)%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 2, Robot 1 acts\n", + " return robot_arm(params, step, sL, s)\n", + " else:\n", + " return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 1 doesn't interfere with the system\n", + "\n", + "def robot_arm_2(params, step, sL, s):\n", + " _robotId = 2\n", + " if get_current_timestep(step, s)%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 3, Robot 2 acts\n", + " return robot_arm(params, step, sL, s)\n", + " else:\n", + " return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 2 doesn't interfere with the system\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, \n", + "# the user specifies if state update functions will be run in series or in parallel\n", + "# and the policy functions that will be evaluated in that block\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'robot_arm_1': robot_arm_1,\n", + " 'robot_arm_2': robot_arm_2\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'box_A': increment_A,\n", + " 'box_B': increment_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], \n", + " grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+max(df['box_A'].max(),df['box_B'].max()))),\n", + " colormap = 'RdYlGn'\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's take a step-by-step look at what the simulation tells us:\n", + "* Timestep 1: the number of marbles in the boxes does not change, as none of the robots act\n", + "* Timestep 2: Robot 1 acts, Robot 2 doesn't; resulting in one marble being moved from box A to box B\n", + "* Timestep 3: Robot 2 acts, Robot 1 doesn't; resulting in one marble being moved from box A to box B\n", + "* Timestep 4: Robot 1 acts, Robot 2 doesn't; resulting in one marble being moved from box A to box B\n", + "* Timestep 5: the number of marbles in the boxes does not change, as none of the robots act\n", + "* Timestep 6: Robots 1 __and__ 2 act, as 6 is a multiple of 2 __and__ 3; resulting in two marbles being moved from box A to box B and an equilibrium being reached." + ] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb b/tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb new file mode 100644 index 0000000..1fac437 --- /dev/null +++ b/tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb @@ -0,0 +1,715 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Tutorials: The Robot and the Marbles, part 4\n", + "In parts [1](../robot-marbles-part-1/robot-marbles-part-1.ipynb) and [2](../robot-marbles-part-2/robot-marbles-part-2.ipynb) we introduced the 'language' in which a system must be described in order for it to be interpretable by cadCAD and some of the basic concepts of the library:\n", + "* State Variables\n", + "* Timestep\n", + "* State Update Functions\n", + "* Partial State Update Blocks\n", + "* Simulation Configuration Parameters\n", + "* Policies\n", + "\n", + "In [part 3](../robot-marbles-part-3/robot-marbles-part-3.ipynb) we covered how to describe the presence of asynchronous subsystems within the system being modeled in cadCAD.\n", + "\n", + "So far, all the examples referred to deterministic systems: no matter how many times you ran one of those simulations, the results would be the same. However, systems are more commonly non-deterministic, and modelling them as deterministic might be an oversimplification sometimes. \n", + "\n", + "In this notebook, we'll cover cadCAD's support for modelling non-deterministic systems and Monte Carlo simulations. But first let's copy the base configuration with which we ended Part 3. Here's the description of that system:\n", + "\n", + "__The robot and the marbles__ \n", + "* Picture a box (`box_A`) with ten marbles in it; an empty box (`box_B`) next to the first one; and __two__ robot arms capable of taking a marble from any one of the boxes and dropping it into the other one. \n", + "* The robots are programmed to take one marble at a time from the box containing the largest number of marbles and drop it in the other box. They repeat that process until the boxes contain an equal number of marbles.\n", + "* The robots act __asynchronously__; robot 1 acts once every two timesteps, and robot 2 acts once every three timesteps." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# List of all the state variables in the system and their initial values\n", + "initial_conditions = {\n", + " 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it\n", + " 'box_B': 0 # as per the description of the example, box_B starts out empty\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n", + "# We'll cover the `M` key in a future article. For now, let's leave it empty\n", + "simulation_parameters = {\n", + " 'T': range(10),\n", + " 'N': 1,\n", + " 'M': {}\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We specify the robot arm's logic in a Policy Function\n", + "def robot_arm(params, step, sL, s):\n", + " add_to_A = 0\n", + " if (s['box_A'] > s['box_B']):\n", + " add_to_A = -1\n", + " elif (s['box_A'] < s['box_B']):\n", + " add_to_A = 1\n", + " return({'add_to_A': add_to_A, 'add_to_B': -add_to_A})\n", + " \n", + "robots_periods = [2,3] # Robot 1 acts once every 2 timesteps; Robot 2 acts once every 3 timesteps\n", + "\n", + "def robot_arm_1(params, step, sL, s):\n", + " _robotId = 1\n", + " if s['timestep']%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 2, Robot 1 acts\n", + " return robot_arm(params, step, sL, s)\n", + " else:\n", + " return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 1 doesn't interfere with the system\n", + "\n", + "def robot_arm_2(params, step, sL, s):\n", + " _robotId = 2\n", + " if s['timestep']%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 3, Robot 2 acts\n", + " return robot_arm(params, step, sL, s)\n", + " else:\n", + " return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 2 doesn't interfere with the system\n", + "\n", + " \n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We make the state update functions less \"intelligent\",\n", + "# ie. they simply add the number of marbles specified in _input \n", + "# (which, per the policy function definition, may be negative)\n", + "def increment_A(params, step, sL, s, _input):\n", + " y = 'box_A'\n", + " x = s['box_A'] + _input['add_to_A']\n", + " return (y, x)\n", + "\n", + "def increment_B(params, step, sL, s, _input):\n", + " y = 'box_B'\n", + " x = s['box_B'] + _input['add_to_B']\n", + " return (y, x)\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# In the Partial State Update Blocks, \n", + "# the user specifies if state update functions will be run in series or in parallel\n", + "# and the policy functions that will be evaluated in that block\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'robot_arm_1': robot_arm_1,\n", + " 'robot_arm_2': robot_arm_2\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'box_A': increment_A,\n", + " 'box_B': increment_B\n", + " }\n", + " }\n", + "]\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "\n", + "\n", + "from cadCAD.configuration import Configuration\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "\n", + "%matplotlib inline\n", + "import pandas as pd\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " colormap = 'RdYlGn',\n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Non-determinism\n", + "Non-deterministic systems exhibit different behaviors on different runs for the same input. The order of heads and tails in a series of 3 coin tosses, for example, is non deterministic. \n", + "\n", + "Our robots and marbles system is currently modelled as a deterministic system. Meaning that every time we run the simulation: none of the robots act on timestep 1; robot 1 acts on timestep 2; robot 2 acts on timestep 3; an so on. \n", + "\n", + "If however we were to define that at every timestep each robot would act with a probability P, then we would have a non-deterministic (probabilistic) system. Let's make the following changes to our system.\n", + "* Robot 1: instead of acting once every two timesteps, there's a 50% chance it will act in any given timestep\n", + "* Robot 2: instead of acting once every three timesteps, there's a 33.33% chance it will act in any given timestep" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "from numpy.random import rand\n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# We specify each of the robots logic in a Policy Function\n", + "robots_probabilities = [0.5,1/3] # Robot 1 acts with a 50% probability; Robot 2, 33.33%\n", + "\n", + "def robot_arm_1(params, step, sL, s):\n", + " _robotId = 1\n", + " if rand()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " colormap = 'RdYlGn',\n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And if we run it again, it returns yet another result" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " colormap = 'RdYlGn',\n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In order to take advantage of cadCAD's Monte Carlo simulation features, we should modify the configuration file so as to define the number of times we want the same simulation to be run. This is done in the `N` key of the `simulation_parameters` dict." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "%%capture\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "# In this example, we'll run the simulation once (N=1) and its duration will be of 10 timesteps\n", + "# We'll cover the `M` key in a future article. For now, let's leave it empty\n", + "simulation_parameters = {\n", + " 'T': range(10),\n", + " 'N': 50, # We'll run the same simulation 50 times; the random events in each simulation are independent\n", + " 'M': {}\n", + "}\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "\n", + "# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )\n", + "\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
1191
2182
3182
4164
...............
506155
7155
8155
9155
10155
\n", + "

550 rows Ă— 2 columns

\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 9 1\n", + " 2 1 8 2\n", + " 3 1 8 2\n", + " 4 1 6 4\n", + "... ... ...\n", + "50 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5\n", + "\n", + "[550 rows x 2 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import display\n", + "tmp_rows = pd.options.display.max_rows\n", + "pd.options.display.max_rows = 10\n", + "display(df.set_index(['run', 'timestep', 'substep']))\n", + "pd.options.display.max_rows = tmp_rows" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting two of those runs allows us to see the different behaviors over time." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df[df['run']==1].plot('timestep', ['box_A', 'box_B'], grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(11)),\n", + " colormap = 'RdYlGn');\n", + "df[df['run']==9].plot('timestep', ['box_A', 'box_B'], grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(11)),\n", + " colormap = 'RdYlGn');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we plot all those runs onto a single chart, we can see every possible trajectory for the number of marbles in each box." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = None\n", + "for i in range(simulation_parameters['N']):\n", + " ax = df[df['run']==i+1].plot('timestep', ['box_A', 'box_B'],\n", + " grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+max(df['box_A'].max(),df['box_B'].max()))),\n", + " legend = (ax == None),\n", + " colormap = 'RdYlGn',\n", + " ax = ax\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For some analyses, it might make sense to look at the data in aggregate. Take the median for example:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dfmc_median = df.groupby(['timestep', 'substep']).median().reset_index()\n", + "dfmc_median.plot('timestep', ['box_A', 'box_B'], \n", + " grid=True,\n", + " xticks=list(dfmc_median['timestep'].drop_duplicates()), \n", + " yticks=list(range(int(1+max(dfmc_median['box_A'].max(),dfmc_median['box_B'].max())))),\n", + " colormap = 'RdYlGn'\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or look at edge cases" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "max_final_A = df[df['timestep']==df['timestep'].max()]['box_A'].max()\n", + "# max_final_A\n", + "slow_runs = df[(df['timestep']==df['timestep'].max()) & \n", + " (df['box_A']==max_final_A)]['run']\n", + "slow_runs = list(slow_runs)\n", + "slow_runs\n", + "\n", + "ax = None\n", + "for i in slow_runs:\n", + " ax = df[df['run']==i].plot('timestep', ['box_A', 'box_B'],\n", + " grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+max(df['box_A'].max(),df['box_B'].max()))),\n", + " legend = (ax == None),\n", + " colormap = 'RdYlGn',\n", + " ax = ax\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We invite the reader to fork this code and come up with answers for their other questions that might be interesting to look at. For example:\n", + "* How often does box B momentarily contain more marbles than box A?\n", + "* What's the frequency distribution of the time to reach equilibrium?\n", + "* What's the probability distribution of the waiting times of each one of the robots?" + ] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb b/tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb new file mode 100644 index 0000000..84ceb4d --- /dev/null +++ b/tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Tutorials: The Robot and the Marbles Part 5 - Networks\n", + "\n", + "To expand upon our previous examples, we will introduce the concept of using a graph network object that is updated during each state update. The ability to essential embed a graph 'database' into a state is a game changer for scalability, allowing increased complexity with multiple agents or components is represented, easily updated. Below, building upon our previous examples, we will represent the Robots and Marbles example with n boxes, and a variable number of marbles. \n", + "\n", + "## Behavior and Mechanisms:\n", + "* A network of robotic arms is capable of taking a marble from their one of their boxes and dropping it into the other one. \n", + "* Each robotic arm in the network only controls two boxes and they act by moving a marble from one box to the other.\n", + "* Each robotic arm is programmed to take one marble at a time from the box containing the most significant number of marbles and drop it in the other box. It repeats that process until the boxes contain an equal number of marbles.\n", + "* For our analysis of this system, suppose we are only interested in monitoring the number of marbles in only their two boxes." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "from cadCAD.configuration import Configuration\n", + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "#from copy import deepcopy\n", + "\n", + "%matplotlib inline\n", + "\n", + "# define global variables\n", + "T = 25 #iterations in our simulation\n", + "boxes=5 #number of boxes in our network\n", + "m= 2 #for barabasi graph type number of edges is (n-2)*m" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create a [BarabĂ¡si–Albert](https://en.wikipedia.org/wiki/Barab%C3%A1si%E2%80%93Albert_model) graph and then fill the 5 boxes with between 1 and 10 balls. You can create as many different nodes or types of nodes as needed" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# create graph object with the number of boxes as nodes\n", + "network = nx.barabasi_albert_graph(boxes, m)\n", + "\n", + "# add balls to box nodes\n", + "for node in network.nodes:\n", + " network.nodes[node]['balls'] = np.random.randint(1,10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will plot the network of boxes and with their labels showing how many balls are in each box." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/aclarkdata/anaconda3/lib/python3.6/site-packages/networkx/drawing/nx_pylab.py:611: MatplotlibDeprecationWarning: isinstance(..., numbers.Number)\n", + " if cb.is_numlike(alpha):\n" + ] + }, + { + "data": { + "image/png": "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K6+8omHDhql169Z64YUXSEFRgP/GgHNIujihnj176r333tOUKVP0f//3f9q5c6d1SXCI9Uoc8DK2l3HSLrroImVmZqp+/fpq3LixVq5caV0SHELSBZxhvail6UaY0047TWPGjFFaWpq6du2qRx55RPn5+dZloQxZr8QBryPposTatWunQCCgzMxMpaam6uuvv7YuCWXEeiUOeJn1+KLpRrDzzjtPGRkZ6tixoxITEzVnzhzrklBGSLqAc0i6KLVy5cppyJAheuuttzR48GD169dPubm51mXhFFivxAEvsz59Q9P1iKZNmyoQCGj37t1KSkrSxx9/bF0STgFJF3CG9aKWpushsbGxeu211zRw4EClpqZqwoQJTN4RyHolDngdSRdlxufz6bbbbtPq1as1fvx4de7cWbt27bIuCyVgvRIHvMx6fNF0PepPf/qT1q1bp1q1asnv92vt2rXWJaEESLqAc0i6cESlSpX03HPP6fnnn9eNN96okSNHqqCgwLosnID1ShzwMuvTNzTdKNCxY0dlZ2dryZIlat26tb799lvrknACJF3AGdaLWppulKhdu7aWLl2qVq1aKSEhQW+99ZZ1SSiG9Uoc8DqSLlxRvnx5PfTQQ5o9e7buu+8+DRgwQAcOHLAuC0exXokDXmY9vmi6USglJUXvv/++vvnmGzVr1kybN2+2LglHIekCziHpwnXVqlXTm2++qbvvvlstWrTQ5MmTmejDhPVKHPAy69M3NN0o5vP51LdvXy1fvlxPP/20unfvrj179liXBZF0AadYL2pputBll12mrKwsxcbGKj4+Xhs2bLAuKapZr8QBryPpwlxMTIzGjx+v0aNHq2PHjho9erQKCwuty4pK1itxwMusxxdNF79z4403KisrSwsWLFDbtm31ww8/WJcUlUi6gHNIuggr559/vlasWKHk5GT5/X6988471iVFFbaXAedYjy+aLopUoUIFjRgxQjNmzNCdd96pwYMHKy8vz7qsqGC9/QV4mfX4ouniuFJTUxUIBLRlyxY1b95cW7dutS4pKpB0AeeQdBHWzjnnHM2fP1+9e/dWs2bNNH36dOuSPM16JQ54mfX4ounipPh8PvXv319LlizRyJEj1bt3b+3du9e6LM8i6QLOIekiYjRq1EjZ2dmqUKGCEhISlJ2dbV2S51hf6AF4mfX4oumixKpUqaKX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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot of boxes and balls\n", + "nx.draw_kamada_kawai(network,labels=nx.get_node_attributes(network,'balls'))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# we initialize the cadCAD state as a network object\n", + "initial_conditions = {'network':network}" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#Behavior: node by edge dimensional operator\n", + "#input the states of the boxes output the deltas along the edges\n", + "\n", + "# We specify the robotic networks logic in a Policy/Behavior Function\n", + "# unlike previous examples our policy controls a vector valued action, defined over the edges of our network\n", + "def robotic_network(params, step, sL, s):\n", + " network = s['network']\n", + " delta_balls = {}\n", + " for e in network.edges:\n", + " src = e[0]\n", + " dst = e[1]\n", + " #transfer one ball across the edge in the direction of more balls to less\n", + " delta_balls[e] = np.sign(network.nodes[src]['balls']-network.nodes[dst]['balls'])\n", + " return({'delta': delta_balls})" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#mechanism: edge by node dimensional operator\n", + "#input the deltas along the edges and update the boxes\n", + "\n", + "# We make the state update functions less \"intelligent\",\n", + "# ie. they simply add the number of marbles specified in _input \n", + "# (which, per the policy function definition, may be negative)\n", + "\n", + "def update_network(params, step, sL, s, _input):\n", + " network = s['network'] #deepcopy(s['network']) \n", + " delta_balls = _input['delta']\n", + " for e in network.edges:\n", + " move_ball = delta_balls[e]\n", + " src = e[0]\n", + " dst = e[1]\n", + " if (network.nodes[src]['balls'] >= move_ball) and (network.nodes[dst]['balls'] >= -move_ball):\n", + " network.nodes[src]['balls'] = network.nodes[src]['balls']-move_ball\n", + " network.nodes[dst]['balls'] = network.nodes[dst]['balls']+move_ball\n", + " \n", + " return ('network', network)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# wire up the mechanisms and states\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'action': robotic_network\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'network': update_network\n", + " \n", + " }\n", + " }\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "simulation_parameters = {\n", + " 'T': range(T),\n", + " 'N': 1,\n", + " 'M': {}\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: []\n", + "[]\n" + ] + } + ], + "source": [ + "# Run the simulations\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create some helper functions to extract the networkx graph object from the Pandas dataframe and plot it." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "#NetworkX helper functions\n", + "def get_nodes(g):\n", + " return [node for node in g.nodes if g.nodes[node]]\n", + "\n", + "\n", + "def pad(vec, length,fill=True):\n", + "\n", + " if fill:\n", + " padded = np.zeros(length,)\n", + " else:\n", + " padded = np.empty(length,)\n", + " padded[:] = np.nan\n", + " \n", + " for i in range(len(vec)):\n", + " padded[i]= vec[i]\n", + " \n", + " return padded\n", + "\n", + "def make2D(key, data, fill=False):\n", + " maxL = data[key].apply(len).max()\n", + " newkey = 'padded_'+key\n", + " data[newkey] = data[key].apply(lambda x: pad(x,maxL,fill))\n", + " reshaped = np.array([a for a in data[newkey].values])\n", + " \n", + " return reshaped" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using our helper function get_nodes() we pull out the boxes ball quantity and save it to a new dataframe column." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "df['Balls'] = df.network.apply(lambda g: np.array([g.nodes[j]['balls'] for j in get_nodes(g)]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we will plot the number of balls in each box over the simulation time period. We can see an oscillation occurs never reaching an equilibrium due to the uneven nature of the boxes and balls." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(df.timestep,make2D('Balls', df))\n", + "plt.title('Number of balls in boxes over simulation period')\n", + "plt.ylabel('Qty')\n", + "plt.xlabel('Iteration')\n", + "plt.legend(['Box #'+str(node) for node in range(boxes)], ncol = 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In summary, we created a graph network of boxes and robotic arms to transfer balls between the boxes, striving for an unachievable equilibrium state. The ability to embed a graph, virtually a graph database, into a cadCAD state allows for tremendous scalability and flexibility as a modeling tool. " + ] + } + ], + "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.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/videos/robot-marbles-part-1/README.md b/tutorials/videos/robot-marbles-part-1/README.md new file mode 100644 index 0000000..8639784 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-1/README.md @@ -0,0 +1 @@ +(https://youtu.be/uJEiYHRWA9g) diff --git a/tutorials/videos/robot-marbles-part-1/config.py b/tutorials/videos/robot-marbles-part-1/config.py new file mode 100644 index 0000000..da40790 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-1/config.py @@ -0,0 +1,85 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { + # 'z': np.random.RandomState(1), + # 'a': np.random.RandomState(2) +} + +sim_config = config_sim({ + 'T': range(10), #number of discrete iterations in each experiement + 'N': 1, #number of times the simulation will be run (Monte Carlo runs) + #'M': g #parameter sweep dictionary +}) + + +# define the time deltas for the discrete increments in the model +# ts_format = '%Y-%m-%d %H:%M:%S' +# t_delta = timedelta(days=0, minutes=1, seconds=0) +# def time_model(_g, step, sL, s, _input): +# y = 'time' +# x = ep_time_step(s, dt_str=s['time'], fromat_str=ts_format, _timedelta=t_delta) +# return (y, x) + +# Behaviors + +# Mechanisms +def update_A(_g, step, sL, s, _input): + y = 'box_A' + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + x = s['box_A'] + add_to_A + return (y, x) + +def update_B(_g, step, sL, s, _input): + y = 'box_B' + add_to_B = 0 + if (s['box_B'] > s['box_A']): + add_to_B = -1 + elif (s['box_B'] < s['box_A']): + add_to_B = 1 + x = s['box_B'] + add_to_B + return (y, x) + +# Initial States +genesis_states = { + 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it + 'box_B': 0 # as per the description of the example, box_B starts out empty +} + +exogenous_states = { + #'time': time_model +} + +env_processes = { +} + +#build mechanism dictionary to "wire up the circuit" +mechanisms = [ + { + 'policies': { + }, + 'variables': { # The following state variables will be updated simultaneously + 'box_A': update_A, + 'box_B': update_B + } + } +] + + + +append_configs( + sim_configs=sim_config, + initial_state=genesis_states, + seeds=seeds, + raw_exogenous_states=exogenous_states, + env_processes=env_processes, + partial_state_update_blocks=mechanisms +) diff --git a/tutorials/videos/robot-marbles-part-1/config2.py b/tutorials/videos/robot-marbles-part-1/config2.py new file mode 100644 index 0000000..c87f05d --- /dev/null +++ b/tutorials/videos/robot-marbles-part-1/config2.py @@ -0,0 +1,85 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { + # 'z': np.random.RandomState(1), + # 'a': np.random.RandomState(2) +} + +sim_config = config_sim({ + 'T': range(10), #number of discrete iterations in each experiement + 'N': 1, #number of times the simulation will be run (Monte Carlo runs) + #'M': g #parameter sweep dictionary +}) + + +# define the time deltas for the discrete increments in the model +# ts_format = '%Y-%m-%d %H:%M:%S' +# t_delta = timedelta(days=0, minutes=1, seconds=0) +# def time_model(_g, step, sL, s, _input): +# y = 'time' +# x = ep_time_step(s, dt_str=s['time'], fromat_str=ts_format, _timedelta=t_delta) +# return (y, x) + +# Behaviors + +# Mechanisms +def update_A(_g, step, sL, s, _input): + y = 'box_A' + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + x = s['box_A'] + add_to_A + return (y, x) + +def update_B(_g, step, sL, s, _input): + y = 'box_B' + add_to_B = 0 + if (s['box_B'] > s['box_A']): + add_to_B = -1 + elif (s['box_B'] < s['box_A']): + add_to_B = 1 + x = s['box_B'] + add_to_B + return (y, x) + +# Initial States +genesis_states = { + 'box_A': 11, # as per the description of the example, box_A starts out with 10 marbles in it + 'box_B': 0 # as per the description of the example, box_B starts out empty +} + +exogenous_states = { + #'time': time_model +} + +env_processes = { +} + +#build mechanism dictionary to "wire up the circuit" +mechanisms = [ + { + 'policies': { + }, + 'variables': { # The following state variables will be updated simultaneously + 'box_A': update_A, + 'box_B': update_B + } + } +] + + + +append_configs( + sim_configs=sim_config, + initial_state=genesis_states, + seeds=seeds, + raw_exogenous_states=exogenous_states, + env_processes=env_processes, + partial_state_update_blocks=mechanisms +) diff --git a/tutorials/videos/robot-marbles-part-1/images/Mech.jpeg b/tutorials/videos/robot-marbles-part-1/images/Mech.jpeg new file mode 100644 index 0000000..26606d5 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-1/images/Mech.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-1/images/Overview.jpeg b/tutorials/videos/robot-marbles-part-1/images/Overview.jpeg new file mode 100644 index 0000000..b978dd5 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-1/images/Overview.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-1/images/equations.png b/tutorials/videos/robot-marbles-part-1/images/equations.png new file mode 100644 index 0000000..5421cb0 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-1/images/equations.png differ diff --git a/tutorials/videos/robot-marbles-part-1/robot-marbles-part-1.ipynb b/tutorials/videos/robot-marbles-part-1/robot-marbles-part-1.ipynb new file mode 100644 index 0000000..81552c6 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-1/robot-marbles-part-1.ipynb @@ -0,0 +1,409 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Template: Robot and the Marbles\n", + "\n", + "![](images/Overview.jpeg)\n", + "![](images/Mech.jpeg)\n", + "![](images/equations.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# import libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib \n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "import config\n", + "from cadCAD import configs\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "\n", + "exec_mode = ExecutionMode()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: []\n", + "[]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
1191
2182
3173
4164
5155
6155
7155
8155
9155
10155
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 9 1\n", + " 2 1 8 2\n", + " 3 1 7 3\n", + " 4 1 6 4\n", + " 5 1 5 5\n", + " 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run Cad^2\n", + "\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df = pd.DataFrame(raw_result)\n", + "df.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: [, ]\n", + "[, ]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100110
11101
2192
3183
4174
5165
6156
7165
8156
9165
10156
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 11 0\n", + " 1 1 10 1\n", + " 2 1 9 2\n", + " 3 1 8 3\n", + " 4 1 7 4\n", + " 5 1 6 5\n", + " 6 1 5 6\n", + " 7 1 6 5\n", + " 8 1 5 6\n", + " 9 1 6 5\n", + " 10 1 5 6" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import config2\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df2 = pd.DataFrame(raw_result)\n", + "df2.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df2.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/videos/robot-marbles-part-2/README.md b/tutorials/videos/robot-marbles-part-2/README.md new file mode 100644 index 0000000..4e0cd6e --- /dev/null +++ b/tutorials/videos/robot-marbles-part-2/README.md @@ -0,0 +1 @@ +(https://youtu.be/Y5MzhVRQyzY) diff --git a/tutorials/videos/robot-marbles-part-2/config.py b/tutorials/videos/robot-marbles-part-2/config.py new file mode 100644 index 0000000..c8ff8be --- /dev/null +++ b/tutorials/videos/robot-marbles-part-2/config.py @@ -0,0 +1,85 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { + # 'z': np.random.RandomState(1), + # 'a': np.random.RandomState(2) +} + +sim_config = config_sim({ + 'T': range(10), #number of discrete iterations in each experiement + 'N': 1, #number of times the simulation will be run (Monte Carlo runs) + #'M': g #parameter sweep dictionary +}) + + +# define the time deltas for the discrete increments in the model +# ts_format = '%Y-%m-%d %H:%M:%S' +# t_delta = timedelta(days=0, minutes=1, seconds=0) +# def time_model(_g, step, sL, s, _input): +# y = 'time' +# x = ep_time_step(s, dt_str=s['time'], fromat_str=ts_format, _timedelta=t_delta) +# return (y, x) + +# Behaviors +def robot_arm(_g, step, sL, s): + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + return({'add_to_A': add_to_A, 'add_to_B': -add_to_A}) + + + +# Mechanisms +def increment_A(_g, step, sL, s, _input): + y = 'box_A' + x = s['box_A'] + _input['add_to_A'] + return (y, x) + +def increment_B(_g, step, sL, s, _input): + y = 'box_B' + x = s['box_B'] + _input['add_to_B'] + return (y, x) + +# Initial States +genesis_states = { + 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it + 'box_B': 0 # as per the description of the example, box_B starts out empty +} + +exogenous_states = { + #'time': time_model +} + +env_processes = { +} + +#build mechanism dictionary to "wire up the circuit" +mechanisms = [ + { + 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions + 'robot_arm': robot_arm + }, + 'states': { # The following state variables will be updated simultaneously + 'box_A': increment_A, + 'box_B': increment_B + } + } +] + + + +append_configs( + sim_configs=sim_config, + initial_state=genesis_states, + seeds=seeds, + raw_exogenous_states=exogenous_states, + env_processes=env_processes, + partial_state_update_blocks=mechanisms +) diff --git a/tutorials/videos/robot-marbles-part-2/config2.py b/tutorials/videos/robot-marbles-part-2/config2.py new file mode 100644 index 0000000..fb471f4 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-2/config2.py @@ -0,0 +1,87 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { + # 'z': np.random.RandomState(1), + # 'a': np.random.RandomState(2) +} + +sim_config = config_sim({ + 'T': range(10), #number of discrete iterations in each experiement + 'N': 1, #number of times the simulation will be run (Monte Carlo runs) + #'M': g #parameter sweep dictionary +}) + + +# define the time deltas for the discrete increments in the model +# ts_format = '%Y-%m-%d %H:%M:%S' +# t_delta = timedelta(days=0, minutes=1, seconds=0) +# def time_model(_g, step, sL, s, _input): +# y = 'time' +# x = ep_time_step(s, dt_str=s['time'], fromat_str=ts_format, _timedelta=t_delta) +# return (y, x) + +# Behaviors +def robot_arm(_g, step, sL, s): + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + return({'add_to_A': add_to_A, 'add_to_B': -add_to_A}) + + + +# Mechanisms +def increment_A(_g, step, sL, s, _input): + y = 'box_A' + x = s['box_A'] + _input['add_to_A'] + return (y, x) + +def increment_B(_g, step, sL, s, _input): + y = 'box_B' + x = s['box_B'] + _input['add_to_B'] + return (y, x) + +# Initial States +genesis_states = { + 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it + 'box_B': 0 # as per the description of the example, box_B starts out empty +} + +exogenous_states = { + #'time': time_model +} + +env_processes = { +} + +#build mechanism dictionary to "wire up the circuit" +mechanisms = [ + { + 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions + 'robot_arm_1': robot_arm, + 'robot_arm_2': robot_arm + }, + + 'states': { # The following state variables will be updated simultaneously + 'box_A': increment_A, + 'box_B': increment_B + } + } +] + + + +append_configs( + sim_configs=sim_config, + initial_state=genesis_states, + seeds=seeds, + raw_exogenous_states=exogenous_states, + env_processes=env_processes, + partial_state_update_blocks=mechanisms +) diff --git a/tutorials/videos/robot-marbles-part-2/configBlank.py b/tutorials/videos/robot-marbles-part-2/configBlank.py new file mode 100644 index 0000000..913497e --- /dev/null +++ b/tutorials/videos/robot-marbles-part-2/configBlank.py @@ -0,0 +1,71 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { +} + +sim_config = config_sim({ + 'T': range(10), + 'N': 1 +}) + +# Behaviors +def robot_arm(_g, step, sL, s): + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + return({'add_to_A': add_to_A, 'add_to_B': -add_to_A}) + + +# Mechanisms +def increment_A(_g, step, sL, s, _input): + y = 'box_A' + x = s['box_A'] + _input['add_to_A'] + return (y, x) + +def increment_B(_g, step, sL, s, _input): + y = 'box_B' + x = s['box_B'] + _input['add_to_B'] + return (y, x) + +# Initial States +genesis_states = { + 'box_A': 10, + 'box_B': 0 +} + +exogenous_states = { +} + + +env_processes = { +} + + +mechanisms = [ + { + 'policies': { + 'robot_arm': robot_arm + }, + 'states': { + 'box_A': increment_A, + 'box_B': increment_B + } + } +] + + +append_configs( + sim_configs=sim_config, + initial_state=genesis_states, + seeds=seeds, + raw_exogenous_states=exogenous_states, + env_processes=env_processes, + partial_state_update_blocks=mechanisms +) \ No newline at end of file diff --git a/tutorials/videos/robot-marbles-part-2/images/Mech.jpeg b/tutorials/videos/robot-marbles-part-2/images/Mech.jpeg new file mode 100644 index 0000000..1a1d5d2 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-2/images/Mech.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-2/images/Mech2.jpeg b/tutorials/videos/robot-marbles-part-2/images/Mech2.jpeg new file mode 100644 index 0000000..e4bb295 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-2/images/Mech2.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-2/images/Overview.jpeg b/tutorials/videos/robot-marbles-part-2/images/Overview.jpeg new file mode 100644 index 0000000..b978dd5 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-2/images/Overview.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-2/robot-marbles-part-2.ipynb b/tutorials/videos/robot-marbles-part-2/robot-marbles-part-2.ipynb new file mode 100644 index 0000000..6f3b6a0 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-2/robot-marbles-part-2.ipynb @@ -0,0 +1,239 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Template: Robot and the Marbles - Part 2\n", + "\n", + "![](images/Overview.jpeg)\n", + "![](images/Mech.jpeg)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# import libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib \n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "import configBlank\n", + "from cadCAD import configs\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "\n", + "exec_mode = ExecutionMode()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: []\n", + "[]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
1191
2182
3173
4164
5155
6155
7155
8155
9155
10155
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 9 1\n", + " 2 1 8 2\n", + " 3 1 7 3\n", + " 4 1 6 4\n", + " 5 1 5 5\n", + " 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run Cad^2\n", + "\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df = pd.DataFrame(raw_result)\n", + "df.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Because we have made it so that both robots read and update the state of the system at the same time, the equilibrium we had before (with 5 marbles in each box) is never reached. Instead, the system oscillates around that point." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/videos/robot-marbles-part-3/README.md b/tutorials/videos/robot-marbles-part-3/README.md new file mode 100644 index 0000000..1d73674 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-3/README.md @@ -0,0 +1 @@ +(https://youtu.be/wF539-K0qXs) diff --git a/tutorials/videos/robot-marbles-part-3/config.py b/tutorials/videos/robot-marbles-part-3/config.py new file mode 100644 index 0000000..fdbe1a9 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-3/config.py @@ -0,0 +1,108 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { + # 'z': np.random.RandomState(1), + # 'a': np.random.RandomState(2) +} + +sim_config = config_sim({ + 'T': range(10), #number of discrete iterations in each experiement + 'N': 1, #number of times the simulation will be run (Monte Carlo runs) + #'M': g #parameter sweep dictionary +}) + + +# define the time deltas for the discrete increments in the model +# ts_format = '%Y-%m-%d %H:%M:%S' +# t_delta = timedelta(days=0, minutes=1, seconds=0) +# def time_model(_g, step, sL, s, _input): +# y = 'time' +# x = ep_time_step(s, dt_str=s['time'], fromat_str=ts_format, _timedelta=t_delta) +# return (y, x) + +# Behaviors +def robot_arm(_g, step, sL, s): + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + return({'add_to_A': add_to_A, 'add_to_B': -add_to_A}) + +robots_periods = [2,3] # Robot 1 acts once every 2 timesteps; Robot 2 acts once every 3 timesteps + +def get_current_timestep(cur_substep, s): + if cur_substep == 1: + return s['timestep']+1 + return s['timestep'] + +def robot_arm_1(_g, step, sL, s): + _robotId = 1 + if get_current_timestep(step, s)%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 2, Robot 1 acts + return robot_arm(_g, step, sL, s) + else: + return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 1 doesn't interfere with the system + +def robot_arm_2(_g, step, sL, s): + _robotId = 2 + if get_current_timestep(step, s)%robots_periods[_robotId-1]==0: # on timesteps that are multiple of 3, Robot 2 acts + return robot_arm(_g, step, sL, s) + else: + return({'add_to_A': 0, 'add_to_B': 0}) # for all other timesteps, Robot 2 doesn't interfere with the system + + + +# Mechanisms +def increment_A(_g, step, sL, s, _input): + y = 'box_A' + x = s['box_A'] + _input['add_to_A'] + return (y, x) + +def increment_B(_g, step, sL, s, _input): + y = 'box_B' + x = s['box_B'] + _input['add_to_B'] + return (y, x) + +# Initial States +genesis_states = { + 'box_A': 10, # as per the description of the example, box_A starts out with 10 marbles in it + 'box_B': 0 # as per the description of the example, box_B starts out empty +} + +exogenous_states = { + #'time': time_model +} + +env_processes = { +} + +#build mechanism dictionary to "wire up the circuit" +mechanisms = [ + { + 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions + 'robot_arm_1': robot_arm_1, + 'robot_arm_2': robot_arm_2 + }, + + 'states': { # The following state variables will be updated simultaneously + 'box_A': increment_A, + 'box_B': increment_B + } + } +] + + + +append_configs( + sim_configs=sim_config, + initial_state=genesis_states, + seeds=seeds, + raw_exogenous_states=exogenous_states, + env_processes=env_processes, + partial_state_update_blocks=mechanisms +) diff --git a/tutorials/videos/robot-marbles-part-3/images/Mech1.jpeg b/tutorials/videos/robot-marbles-part-3/images/Mech1.jpeg new file mode 100644 index 0000000..e4bb295 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-3/images/Mech1.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-3/images/Overview.jpeg b/tutorials/videos/robot-marbles-part-3/images/Overview.jpeg new file mode 100644 index 0000000..b978dd5 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-3/images/Overview.jpeg differ diff --git a/tutorials/videos/robot-marbles-part-3/robot-marbles-part-3.ipynb b/tutorials/videos/robot-marbles-part-3/robot-marbles-part-3.ipynb new file mode 100644 index 0000000..21bfa41 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-3/robot-marbles-part-3.ipynb @@ -0,0 +1,257 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Template: Robot and the Marbles - Part 3\n", + "\n", + "![](images/Overview.jpeg)\n", + "![](images/Mech1.jpeg)\n", + "\n", + "\n", + "### Asynchronous Subsystems\n", + "We have defined that the robots operate simultaneously on the boxes of marbles. But it is often the case that agents within a system operate asynchronously, each having their own operation frequencies or conditions.\n", + "\n", + "Suppose that instead of acting simultaneously, the robots in our examples operated in the following manner:\n", + "\n", + "* Robot 1: acts once every 2 timesteps\n", + "* Robot 2: acts once every 3 timesteps\n", + "\n", + "One way to simulate the system with this change is to introduce a check of the current timestep before the robots act, with the definition of separate policy functions for each robot arm." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# import libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib \n", + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "import config\n", + "from cadCAD import configs\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline\n", + "\n", + "exec_mode = ExecutionMode()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: []\n", + "[]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
11100
2191
3182
4173
5173
6155
7155
8155
9155
10155
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 10 0\n", + " 2 1 9 1\n", + " 3 1 8 2\n", + " 4 1 7 3\n", + " 5 1 7 3\n", + " 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run Cad^2\n", + "\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df = pd.DataFrame(raw_result)\n", + "df.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's take a step-by-step look at what the simulation tells us:\n", + "\n", + "* Timestep 1: the number of marbles in the boxes does not change, as none of the robots act\n", + "* Timestep 2: Robot 1 acts, Robot 2 doesn't; resulting in one marble being moved from box A to box B\n", + "* Timestep 3: Robot 2 acts, Robot 1 doesn't; resulting in one marble being moved from box A to box B\n", + "* Timestep 4: Robot 1 acts, Robot 2 doesn't; resulting in one marble being moved from box A to box B\n", + "* Timestep 5: the number of marbles in the boxes does not change, as none of the robots act\n", + "* Timestep 6: Robots 1 and 2 act, as 6 is a multiple of 2 and 3; resulting in two marbles being moved from box A to box B and an equilibrium being reached." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/videos/robot-marbles-part-4/README.md b/tutorials/videos/robot-marbles-part-4/README.md new file mode 100644 index 0000000..5ae38d9 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-4/README.md @@ -0,0 +1 @@ +(https://youtu.be/MLNTqqX47Ew) diff --git a/tutorials/videos/robot-marbles-part-4/config.py b/tutorials/videos/robot-marbles-part-4/config.py new file mode 100644 index 0000000..d4b2c99 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-4/config.py @@ -0,0 +1,103 @@ +# import libraries +from decimal import Decimal +import numpy as np +from datetime import timedelta +from cadCAD.configuration import append_configs +from cadCAD.configuration.utils import bound_norm_random, ep_time_step, config_sim + +seeds = { + # 'z': np.random.RandomState(1), + # 'a': np.random.RandomState(2) +} + +sim_config = config_sim({ + 'T': range(10), #number of discrete iterations in each experiement + 'N': 1, #number of times the simulation will be run (Monte Carlo runs) + #'M': g #parameter sweep dictionary +}) + + +# define the time deltas for the discrete increments in the model +# ts_format = '%Y-%m-%d %H:%M:%S' +# t_delta = timedelta(days=0, minutes=1, seconds=0) +# def time_model(_g, step, sL, s, _input): +# y = 'time' +# x = ep_time_step(s, dt_str=s['time'], fromat_str=ts_format, _timedelta=t_delta) +# return (y, x) + +# Behaviors +def robot_arm(_g, step, sL, s): + add_to_A = 0 + if (s['box_A'] > s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + return({'add_to_A': add_to_A, 'add_to_B': -add_to_A}) + +robots_probabilities = [0.5,1/3] # Robot 1 acts with a 50% probability; Robot 2, 33.33% + +def robot_arm_1(_g, step, sL, s): + _robotId = 1 + if np.random.rand() s['box_B']): + add_to_A = -1 + elif (s['box_A'] < s['box_B']): + add_to_A = 1 + return({'add_to_A': add_to_A, 'add_to_B': -add_to_A}) + +robots_probabilities = [0.5,1/3] # Robot 1 acts with a 50% probability; Robot 2, 33.33% + +def robot_arm_1(_g, step, sL, s): + _robotId = 1 + if np.random.rand()]\n", + "[]\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
11100
2191
3191
4182
5164
6155
7155
8155
9155
10155
\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 10 0\n", + " 2 1 9 1\n", + " 3 1 9 1\n", + " 4 1 8 2\n", + " 5 1 6 4\n", + " 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run Cad^2\n", + "\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df = pd.DataFrame(raw_result)\n", + "df.set_index(['run', 'timestep', 'substep'])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Since it is random, lets run it again:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: []\n", + "[]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Run Cad^2\n", + "\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df = pd.DataFrame(raw_result)\n", + "df.plot('timestep', ['box_A', 'box_B'], grid=True, \n", + " colormap = 'RdYlGn',\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+(df['box_A']+df['box_B']).max())));" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run 50 Monte Carlo Runs\n", + "In order to take advantage of cadCAD's Monte Carlo simulation features, we should modify the configuration file so as to define the number of times we want the same simulation to be run. This is done in the N key of the sim_config dictionary." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: [, ]\n", + "[, ]\n" + ] + } + ], + "source": [ + "import config2\n", + "first_config = configs # only contains config1\n", + "single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)\n", + "run = Executor(exec_context=single_proc_ctx, configs=first_config)\n", + "\n", + "raw_result, tensor_field = run.execute()\n", + "df2 = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
box_Abox_B
runtimestepsubstep
100100
1182
2164
3155
4155
...............
506155
7155
8155
9155
10155
\n", + "

550 rows Ă— 2 columns

\n", + "
" + ], + "text/plain": [ + " box_A box_B\n", + "run timestep substep \n", + "1 0 0 10 0\n", + " 1 1 8 2\n", + " 2 1 6 4\n", + " 3 1 5 5\n", + " 4 1 5 5\n", + "... ... ...\n", + "50 6 1 5 5\n", + " 7 1 5 5\n", + " 8 1 5 5\n", + " 9 1 5 5\n", + " 10 1 5 5\n", + "\n", + "[550 rows x 2 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from IPython.display import display\n", + "tmp_rows = pd.options.display.max_rows\n", + "pd.options.display.max_rows = 10\n", + "display(df2.set_index(['run', 'timestep', 'substep']))\n", + "pd.options.display.max_rows = tmp_rows" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting two of those runs allows us to see the different behaviors over time." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEGCAYAAACevtWaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deZyN9fvH8dc1YxnM2KVCZoghS8paspevypJI+qovKbIkRKXl275QRAtKCpUlwtdSKbtKSbasI7K3kG2GLLNcvz/O4SdZ55w592fOXM/H4zzmnHHO/XnP4Jp77nPf1yWqijHGmPAS4XUAY4wxwWfF3RhjwpAVd2OMCUNW3I0xJgxZcTfGmDCULZSL5c+fX6+88spQLvkPhw8fJk+ePJ5mcCWHCxlcyeFCBldyuJDBlRwuZABYtmzZn6pa5KJepKohu5UtW1a9Nn/+fK8jqKobOVzIoOpGDhcyqLqRw4UMqm7kcCGDqirwo15kvbXDMsYYE4asuBtjTBiy4m6MMWEopG+oGmPM2SQnJ7Nz506OHj0KQL58+Vi/fr2nmUKdISoqiuLFi5M9e/aAt2XF3RjjhJ07dxITE0NsbCwiQlJSEjExMZ5mCmUGVWXv3r3s3LmTuLi4gLd33sMyIvKBiOwWkTWnfK6giMwWkZ/9HwsEnMQYk6UdPXqUQoUKISJeR/GEiFCoUKGTv7kE6kKOuY8Gmpz2uX7AXFUtA8z1PzbGmIBk1cJ+QjC//vMWd1VdBOw77dMtgDH++2OA2y5kMT167KLCGWOMSR/RC+jnLiKxwExVreh/fEBV8/vvC7D/xOMzvLYz0BkgVqKqvjfuY7JdWig46dPh0KFDREdHe7a+SzlcyOBKDhcyuJLDqwz58uXj1CvYU1NTiYyMDHmOU3mRYdOmTRw8ePBvn2vQoMEyVa12URu6kCudgFhgzSmPD5z25/svZDtxEbn0s0pN9fjBpAy6juv8XLnizIUcLmRQdSOHCxlU3cjhVYZ169b97XFiYmLIM2zZskUrVKiQYRlWrFihgH7xxRdnfc7p3wfV0F6h+oeIXAbg/7j7Ql6U7fIiHFy3mW/vepi0lJR0Lm2MMZnT+PHjueGGGxg/fnyGr5XeUyGnA+2B/v6P0y7kRZI7impDn2Zpl2dY3qc/1d54Kp3LG2PC2bJeL/HnsjVERgbvbO0CVcpRdciT531eSkoK7dq1Y/ny5cTHxzNu3Di+++47+vbtS0pKCtWrV2f48OEcPXqUGjVqMH36dOLj47nrrrto2LAhnTp1OuN2VZVJkyYxe/Zs6tSpw9GjR4mKigra13e6CzkVcjzwHRAvIjtF5D58Rf0mEfkZuNH/+IKUeaAt8b07sPHNj9g4bGx6cxtjTIZISEigW7durF+/npiYGF5//XU6dOjAJ598wurVq0lJSWH48OHky5ePt99+mw4dOjBhwgT2799/1sIOsHjxYuLi4ihdujT169fns88+y9Cv47w/FlX1rrP8UaP0LnrNa4+S9PM2lj30EtGlr+Dyf9VJ76aMMWGo6pAnPbuIqUSJEtSuXRuAO++8k0GDBhEXF0fZsmUBaN++PUOHDqVXr17cdNNNTJo0ie7du7Nq1apzbnf8+PG0bdsWgLZt2/Lhhx/SqlWrDPs6POktExEZSe1xA8lX4Uq+bdOLA2t/9iKGMcb8w+nnmufPf8YTAQFIS0tj/fr15M6dm/3795/1eampqUyePJnnn3+e2NhYevTowaxZs0hKSgpa7tN51jgse0w09Wa+S2TuXCxs+gBHd+/1Kooxxpy0fft2vvvuOwAmTZpEtWrV2Lp1K5s2bQLgo48+ol69egAMHjyY8uXLM27cOO69916Sk5PPuM25c+dSuXJlduzYwdatW9m2bRutWrVi6tSpGfZ1eNoVMk+Jy6g3fRhH/9jLotu6k2oXORljPBYfH8/QoUMpX748Bw4coHfv3owaNYo77riDSpUqERERQZcuXUhISGDkyJEMGjSIOnXqULduXV588cUzbnP8+PG0bNnyb59r1apVhp4143njsELVK3PdhwP45o6efN/xCa4fOzDLX4JsjPFGbGwsGzZsOPk4KSmJ3Llz06hRI1asWPG358bHx/+tY+Trr79+1u2OGjXqH59r3rw5zZs3D0LqM3Oin/sVrZtw9csPs238TNa8MNTrOMYYk+l5vud+wlX9OpOYsIXVz7xFTNk4Ytve6nUkY4y5aDVr1uTYsb8fYv7oo4+oVKlSSHM4U9xFhBrvPs+hX3bwfYd+5Cl5OUWuu8brWMYYc1GWLFnidQTAkcMyJ0TmzEGdKW+Ru/ilLGrRjUNbd3odyRhjMiWnijtAVOGC1P/sXdKSU1jYtAvHD2bceaDGGBOunCvuAHnjS1Hn0zdJTNjCt217W5MxY4y5SE4Wd4BLG11H9WHP8Nusr1ne+xWv4xhjTKYSUHEXkZ4iskZE1opIr2CFOuHKTm0o16cjG9/+mIS3Pw725o0x5m+2bt1KxYoVM2TbsbGxVKpUiSpVqlCpUiWmTbugZrrplu6zZUSkItAJqAEcB2aJyExV3RSscABVBvQl6eetLO/5EjGlS3D5zfWCuXljjAmZ+fPnU7hwYRISEmjcuDEtWrTIsLUCORWyPLBEVf8CEJGFwO3Aq8EIdkJEZCTXjx3InDrt+ObO3jRePIH8FcsGcwljjGN6TRzMsm3rgzrirkrxsgxp0/u8z8uofu6nSkxMpECBAsH4ss7qgmaonvGFIuXxDem4DjgCzMU3CqrHac87OUO1SJEiVSdOnJiu9VL37GdP11eQbNkoPKwfkQXzpms7LsyodCWHCxlcyeFCBldyuDBD9bHpw/hp16agtiKpdHlpBjTvds7nbNu2jUqVKvHVV19Rq1YtunbtSlxcHKNGjWL69OmUKVOGzp07c/XVV9O9e3fmzZvHSy+9RNeuXRk7duw5G4FVrFiR6OhoVJWtW7cyevRobr755n88L6QzVM92A+4DlgGLgOHAkHM9v2zZshc/dPAUe39crRNyVdZZtdpo8l9H0rUNF2ZUqrqRw4UMqm7kcCGDqhs5svoM1RIlSpx8PGPGDK1fv77WqVPn5OfmzJmjLVu2PPm4U6dOWrBgQd2xY8c5t12yZEnds2ePqqpu2rRJS5YsqUlJ/5wn7fUM1RM/GN5X1aqqWhfYD2wMZHvnU7BqRa7/+DX2fr+SJR2fOPEDxhhjgiYj+rmfrnTp0hQtWpR169alO+f5BHq2zCX+j1fgO94+LhihzqXE7Y2p0r8P2yZ8xupn38ro5YwxWUxG9HM/3e7du9myZQslS5bMmC+CwHvLTBaRQkAy0F1VDwQh03mVf7QTiRu3sub5ocSUjSWuXca1zTTGZC0n+rl37NiRsmXL0rt3b2rVqsUdd9xx8g3VU/u5//DDD8TExJzs5/7cc8+dddsNGjQgMjKS5ORk+vfvT9GiRTPs6wiouKuqJ8NPRYTqw5/l0OYdLOn4BNGxxShSu6oXUYwxYSSj+rmD7xz6UHL2CtXzicyRgzqT3yRPyWIsuq07h37Z4XUkY4xxRqYt7gA5CxWg3sx30NQ0FjazJmPGGO/VrFmTKlWq/O22evXqkOdwpp97euUtG0edyW8yr/F9fNOmF/U/e5eIbJn+yzImS1LVTD9mM5B+7sE8AzBT77mfULRBLWq8+xy/f/UNyx560U6RNCYTioqKYu/evVn2/6+qsnfvXqKiooKyvbDZxS3dsTWJCVtY/+pIYuLjKNezvdeRjDEXoXjx4uzcuZM9e/YAcPTo0aAVuvQKdYaoqCiKFy8elG2FTXEHqPJKH5I2bmXFw/2JubIkxW6t73UkY8wFyp49O3FxcScfL1iwgGuu8XbUpgsZ0issDsucIBERXP/xa+SvUp5v2/Zm/08bzv8iY4wJQ2FV3AGy5clNvenDyZ43moVNu3Dk9z1eRzLGmJALu+IOkLtYUerNeIdjew+wqEU3Uo4c9TqSMcaEVFgWd4CC11ag9riB7F26mu/bP4ampXkdyRhjQiZsiztA8RY3cs2rj7B90ix+euZNr+MYY0zIBHS2jIj0Bu4HFFgN3KuqTh0DKdenI4kbfmHti8PJWzYWSpy9facxxoSLdO+5i0gx4CGgmqpWBCKBtsEKFiwiQrVhz1C0QU2W3P8Ux1YHdcSrMcY4KdDDMtmAXCKSDcgN/Bp4pODzNRl7izyxxdj/1DCSNm/3OpIxxmSodM9QBRCRnsBL+GaofqWq7c7wnKDMUA2GlF272dP1FSIL5KXw0MeIiM7tWZasPCvTxRwuZHAlhwsZXMnhQgYI8QxVoAAwDygCZAf+B9x9rtcEOkM1GGYNflfHZ6+gc2/soKnHj3uWIyvPyjydCzlcyKDqRg4XMqi6kcOFDKqhn6F6I7BFVfeoajIwBbg+gO2FRM4qZakx4nl+n7OYH3u8kGWbFBljwlsgZ8tsB2qJSG58h2UaAT8GJVUGK9XhdhITtrCu/wjyxpeiXO8OXkcyxpigSndxV9UlIvIpsBxIAVYAI4IVLKNd/VJvkn7exvI+/Ym+8gqKN2vodSRjjAmagM6WUdVnVLWcqlZU1XtU9ViwgmU0iYjgug8HUPDaq1h8Vx/2r1x//hcZY0wmEdZXqJ5Ptty5qDt9ODkK5GVhsy4c+W2315GMMSYosnRxB8h9ua/J2PH9iSxs3pWUv454HckYYwKW5Ys7QIEq5bl+/CD2LVvLd/+xJmPGmMzPirtf8WYNuWbgY+yY/CWrnhridRxjjAlIWI3ZC1S53h1I3PAL6155l7xlYynV4XavIxljTLrYnvspRITqQ5+maKPr+KHz0+xetNTrSMYYky5W3E8TkT07dSa9QXSp4ixq+SBJm7Z5HckYYy6aFfczyFEgH/U+G4EILLi1M8f3H/Q6kjHGXBQr7mcRU/oK6kwdyuEtu/i69UOkJSd7HckYYy6YFfdzuKRONWqMfJE/5n3P0m7PWZMxY0ymEcgkpngRWXnKLVFEegUznAtK/ec2KjzRhc0jJ7Hh9VFexzHGmAsSSOOwBKAKgIhEAruAqUHK5ZTKL/QkceMWVjzyKjFXXkHxFjd6HckYY84pWIdlGgGbVTUsTy2RiAiuGzOAgtUq8u2/+7JvxTqvIxljzDkFq7i3BcYHaVtOypY7F/WmDSNnofwsbNaFv3b94XUkY4w5q4BmqAKISA58g7ErqOo/Kp5LM1Qh8JmIyZt28OdDr5GteFEKvdGXiFw5PckRDC5kcCWHCxlcyeFCBldyuJABQjxD9cQNaIFvOPZ5n+vCDNVgzETcOWOejosopwtbdte01FTPcgTKhQyqbuRwIYOqGzlcyKDqRg4XMqiGfobqCXcR5odkTlesaQOuGfQYO6fOZtUTr3sdxxhj/iGgxmEikge4CXggOHEyj/ie7X1Nxga8R0x8HKXvbeV1JGOMOSmg4q6qh4FCQcqSqYgI1d76L4d+2ckPnZ8mOq44RevX9DqWMcYAdoVqQCKyZ+eGiUOIKVOSr2/vQeLGLV5HMsYYwIp7wHLkz0v9me8ikREsbNqFY/sOeB3JGGOsuAdDdKkS1Jn6Noe37eLrVj1IPX7c60jGmCzOinuQXHJDNWq+/xK7F/zA0q7PWpMxY4ynbMxeEMXd3YLEhC2sfXE4eePjuOrRTl5HMsZkUVbcg6zycw+RtHErK/sNIqZMLCVa3uR1JGNMFmSHZYJMIiKoNbo/hapXYnG7vuxbtsbrSMaYLMiKewbIliuKutOGkbNIQRY272pNxowxIWfFPYPkurQI9WYMJznxEAubdSH50GGvIxljshAr7hmoQOVy1P5kCAdWbeC7ux8hLTXV60jGmCzCinsGK3ZLPa4d/Dg7p81lVb+BXscxxmQRARV3EckvIp+KyAYRWS8i1wUrWDgp2+MeynS9i/UDP2DTyElexzHGZAGBngr5BjBLVVv7h3bkDkKmsCMiVH3zKZI272Bp12eJLlXcfmcyxmSodJcYEckH1AXeB1DV46pqjVXOIiJbNm6YOIS8ZWP5utVDJG/a4XUkY0wYS/eYPRGpAowA1gFXA8uAnv42wKc+L6zG7AUq5bc/+bP7ANISD5Hn9obEtG9KRJ5cnmTx+nvhUg4XMriSw4UMruRwIQOEeMweUA1IAWr6H78BvHCu14TLmL1AHdm9V6fe2lHHSrxOLnq9bh49Jd3j+gLhwvdC1Y0cLmRQdSOHCxlU3cjhQgbV0I/Z2wnsVNUl/sefAtcGsL0sI6pIQfL3vYd/LZlInthifN+hH7Nv+Df7lq/1OpoxJkyku7ir6u/ADhGJ93+qEb5DNOYCFapemcaLJ1Dzg5c5tHk7s6q14ocHnubon/u8jmaMyeQCPWejBzBWRH4CqgAvBx4pa5GICErf24qmG78kvud/2Pz+p8ws24SNQ8eSlpLidTxjTCYVUHFX1ZWqWk1VK6vqbaq6P1jBspoc+WKoOvgJbl41jQLXlOfHB59nVrVW7P76R6+jGWMyITvb2jH5K5Sh4ZzR3DDpDY7vO8icuu34tl0faz5mjLkoVtwdJCJc0boJTdd/ToWnurJj8lfMjG/CugEjSD1mI/yMMednxd1h2fLk5uoXetF03ecUbVSLlf0G8XmlZvz6xUKvoxljHGfFPROILlWCetOGU//zEQAsuKUzC5t3IWnzdo+TGWNcZcU9E7n85nrcsnoGVfr34Y95S/iswq2s+u8QUv464nU0Y4xjrLhnMpE5c3DVY51pmjCLEq0as/bF4cwsdzPbJ31x4sphY4yx4p5Z5S5WlNpjB3HjorHkKJiPb9r0Yt6NHTiw9mevoxljHGDFPZO7pE41mvw4mWpDn2b/ivV8cXULlvV+meMHk7yOZozxkBX3MBCRLRtlu7Wj6cZZlL6vNQlvfMjMsv9i86jJaFqa1/GMMR6w4h5GogoXpMa7z9Nk6adEl76CJR2f4Kvr27J36U9eRzPGhJgV9zBUsGpFbvpmHLXGDODw1l18WbMNS+5/kqN7rCGZMVlFoDNUt4rIahFZKSLWBMUhEhFBqf/cRrONX1Kudwd+GfM/ZpRpTMKbH1pDMmOygGDsuTdQ1Sp6sVNCTEhkzxvNtYP6cctP0ylUvRLLer7ErGtb8sfCH7yOZozJQOkeswe+PXegmqr+eSHPj4+P14SEhHSvFwwLFiygfv36nmbwKoeqsnPqbJY9/Apzs+1h2bWFyBHt/UzzY8eOkTNnziyfwZUcLmRwJYcLGQAWjpp10WP2sgW4pgJfiYgC76rqiNOfcNoMVRYsWBDgkoE5dOiQ5xm8zLE5Yi9v3V2UVXuPUPDIMXIfd6ARmQDHPb7K1oUM4EYOFzKAGzlcyJBeFzuX79QbUMz/8RJgFVD3XM+3Gar/L9Q59h06qA9OeE0jul6nhfo01ncXTdU5c+eGNMPZuPB34kIGVTdyuJBB1Y0cLmRQTd8M1YD23FV1l//jbhGZCtQAFgX008YEVWpaKh8snsET095h3+FEutRpyQvNO1MwTz4nfoMxxmSMdBd3EckDRKhqkv9+Y+D5oCUzAVuyZQ0PfjKIH7et54bSV/N2275cXbyM17GMMSEQyJ57UWCqiJzYzjhVnRWUVCYgfyTupd//hjH6u8+4PF8Rxt77HHdVb4z/78oYkwWku7ir6i/A1UHMYgKUnJrC2wsm8ezMkRxJPsZjje/hyZs7EBOVx+toxpgQC/RsGeOIeRt+pMfEQaz7bQtNrqrFkDt6E39pSa9jGWM8YsU9k9u+73f6TH6TT5fPI67Q5Uzr8irNKtexQzDGZHFW3DOpo8nHeG32WF6ZNQaAF5p1pu9N7YjK7v0FF8YY71lxz2RUlek/fU3vSUPYsvdXWl/bkEGtHuKKgpd6Hc0Y4xAr7plIwu/b6DlpMF+u+56rLotjTs+3aFSuutexjDEOsuKeCSQdPcyLX4xi8NwJ5Mqek8Gte9G9fmuyR9pfnzHmzKw6OExVGbf0Sx6Z8ja/HfyTDtfdSv/bulE0byGvoxljHGfF3VErd2ykxyeD+GbzKqqVLM+Uzv2pVaqi17GMMZmEFXfH7Dt8kP9OH8E7X0+lYJ68vNfucTpe34yICBuaZYy5cFbcHZGalsrIb6fz5LR32P9XEt3rteK5pp0okCev19GMMZmQFXcHLN78Ez0+GcTyHQnULXMNb7V5mMrW4MsYE4CAi7uIRAI/ArtUtWngkbKO3w/u5bGpQ/lwyecUy1+E8R1f4M5qN9rVpcaYgAVjz70nsB6w4wcXKDk1hYkbFvHxtOc5lpLM4/9qzxNN2hMd5f3IO2NMeAiouItIceBW4CXg4aAkCnP7DyfScMiDrNy5kVsqXs+QO3pR5pIrvI5ljAkzgQ7I/hR4BYgB+p7psMxpM1SrTpw4Md3rBcOhQ4eIjo72ZO2UtFQeXfgBq//cyiNVWtK4zEXNuw06L78XruVwIYMrOVzI4EoOFzIANGjQ4KIHZAcyP7UpMMx/vz4w83yvycozVNPS0rTTxy8rXWrq6MUznZjN6EIGVTdyuJBB1Y0cLmRQdSOHCxlU0zdDNZCTp2sDzUVkKzABaCgiHwewvbD2+txxvPfNNB7/V3vaX3er13GMMWEu3cVdVR9X1eKqGgu0Beap6t1BSxZGpq1axCNT3qb1tQ15sfkDXscxxmQBdtljBluxI4F/f/A0Va8ox5j2T9uVpsaYkAjKRUyqugBYEIxthZNfD+yh2bC+FMyTl+ldXyN3jiivIxljsgi7QjWDHD52hObDH+HAkUN823cEl+Ur7HUkY0wWYsU9A6SlpfGf0c+xfEcC07q8ytXWSsAYE2J2ADgDPDn9HaasXMCgVg/RrHIdr+MYY7IgK+5BNmrxTPp/+SEP1GlJr4ZtvY5jjMmirLgH0cKNy3lgXH9uLFedt+7sYw3AjDGeseIeJD/v3s7tI/pRukgxJnV62eabGmM8ZcU9CPYdPsitQ/sgCDO7DSJ/7hivIxljsjjbvQzQ8ZRkWo94gm37fmduz7coXaS415GMMcb23AOhqnQb/yrzNy5j5N1PcMOVVbyOZIwxgBX3gAycPZb3F8/gySYduKfmzV7HMcaYk9Jd3EUkSkR+EJFVIrJWRJ4LZjDX/W/lQh7731DuuLYRzzfr7HUcY4z5m0COuR8DGqrqIRHJDnwjIl+o6vdByuas5ds30G7UM1QvWZ4x7f9rzcCMMc5Jd3H3N5A/5H+Y3X9L/1inTGLXgd00G/YIhaPzM63La+SyZmDGGAcFtMspIpEishLYDcxW1SXBieWmw8eO0GxYXxKPHmZG19e4NF8hryMZY8wZBTRD9eRGRPIDU4EeqrrmtD8LixmqaZrGM99+zOJf1/PiDe257vJynuQIJhcyuJLDhQyu5HAhgys5XMgAIZ6hevoNeBrfkOywnKH66JS3lC41dcjcCZ7mCCYXMqi6kcOFDKpu5HAhg6obOVzIoBriGaoiUsS/x46I5AJuAjakd3sue//b6bz61cd0rXs7DzVo43UcY4w5r0DOlrkMGCMikfiO3U9U1ZnBieWO+QnL6DJuAI3L1+TNNg9bMzBjTKYQyNkyPwHXBDGLczb+sZ1WIx6nbNErmNjpJbJZMzBjTCZhJ2ifxd5DB7l16MNERkQwo+tA8uXy/k0VY4y5ULYregbHU5JpNaIf2/f/wbxeb1OqSDGvIxljzEWxPffTqCpdxg1g4c8r+OCeJ6ld+mqvIxljzEWz4n6aV7/6iFHfzeTpW+6jXY0mXscxxph0seJ+iikr5tPvf8NoW+0mnm16v9dxjDEm3ay4+y3btoG7Rz1LrbiKfHDPk3bKozEmU7PiDuzcv5tmw/tySUwB/tdlgDUDM8Zkeln+bJlDR/+i2bC+HDr2F4v7vkfRvNYMzBiT+WXp4p6alkq7Uc/w065NfNZ9EBWLlfY6kjHGBEWWPizTb+owpv/0NW+06U2TCtd5HccYY4Imyxb3kd9MY+CcsXSv15oH69/hdRxjjAmqQLpClhCR+SKyzj9DtWcwg2WkuRuW0nX8qzS5qhZD7ujldRxjjAm6QI65pwB9VHW5iMQAy0RktqquC1K2DLE9cTc9p79HfNGSTLj/RWsGZowJS+nec1fV31R1uf9+ErAecLoJy95DB3n86zFkj8zGzO7WDMwYE76CNWYvFlgEVFTVxNP+zIkxe8dTU3hk4UjW793B4AadqVC4pCc5TnBhfJcLGVzJ4UIGV3K4kMGVHC5kAI/G7AHRwDLg9vM916sxe2lpadp+9HNKl5r61OjBnmQ4nQvju1zIoOpGDhcyqLqRw4UMqm7kcCGDavrG7AV0wFlEsgOTgbGqOiWQbWWk/l9+yJjvP+fZW++nXvSVXscxxpgMF8jZMgK8D6xX1deDFym4Pl0+jyemDeff1Rvz9K33eR3HGGNCIpDz3GsD9wANRWSl/3ZLkHIFxdKt67hn9HNcX6oS71szMGNMFhLIDNVvAGer5Y59f9B8+CNcmrcgUx8YQFT2nF5HMsaYkAnLk7wPHf2LZsP78tfxo8zp+RaX5C3odSRjjAmpsCvuqWmp3PXBf1nz6y981n0QFS4v5XUkY4wJubDrLfPIlLeYufpb3mzTm39dVcvrOMYY44mwKu7vfj2VwXMn8FCDNnSr19rrOMYY45mwKe5z1v9A9wkDuaXi9bzeOtP0MDPGmAwRFsV9/W9baP3eE5S/NJbxHV8gMiLS60jGGOOpTF/c/zx0gKbD+hKVPQczuw0kb648XkcyxhjPZeqzZY4lH6flO4/x68E/WdB7KCULXeZ1JGOMcUKmLe6qyv0fv8w3m1fxyf0vUjOuoteRjDHGGZn2sMzLs0bz8Q+zeKFZZ9pUvdHrOMYY45RMWdwnLpvDU9Pf5e4aTXjy5nu9jmOMMc4JqLiLyAcisltE1gQr0Pks2bKG9mNeoHbpyoy8+wlrBmaMMWcQ6J77aKBJEHJckG17f6PFO49yeb7CTH1gADmz5wjV0sYYk6kEVNxVdRGwL0hZzinxyGGaDe/L0eTjzOw2kCIxBUKxrDHGZEoBz1D1z0+dqapnPF0lGDNUU9PSePKbMSz9/WcG1L2XapeWSXdeV2YiupDDhQyu5HAhgys5XMjgSg4XMoB3M1RjgTUX8tz0zlDt+cnrShQ7p8YAAAnhSURBVJeaOnzh5HS9/lSuzER0IYcLGVTdyOFCBlU3criQQdWNHC5kUE3fDFXnz5YZvnAyb8z/hF4N29Kl7u1exzHGmEzB6eL+5brv6THxdZpWqs3AVj28jmOMMZlGoKdCjge+A+JFZKeIBG0C9dpff6HNe09S4bI4xnV83pqBGWPMRQio/YCq3hWsIKfak7SfpsP6kDtHFDO7DSImypqBGWPMxXCut8zR5GPc9s6j/J64j4UPD6NEwaJeRzLGmEzHqeKuqtz30Uss/mU1kzq9TI3YCl5HMsaYTMmpN1Rf+PwDxi39ipead6H1tQ29jmOMMZmWM8V9wtLZPDPzPdrXuoXHm7T3Oo4xxmRqThT3739ZQ4cPX6DOlVV499/9rBmYMcYEyPPivnXvr7R45xGKF7iEKQ/0t2ZgxhgTBJ4W98Qjh2k27BGOp6Qws9tACkfn9zKOMcaEDc/OlklJTeHOkU+y4fetzOoxhHKXxnoVxRhjwo5ne+69Px3CrHXfM+yuR2hUrrpXMYwxJix5UtzfXjCJtxd8Sp8b/02nG27zIoIxxoS1kBf3WWu/o+fEwTSvXIcBLbuHenljjMkSAm0c1kREEkRkk4j0O9/zj6Um02bkk1QudiVj733OmoEZY0wGSXdxF5FIYChwM3AVcJeIXHWu1+w6tJfonLmZ0W0g0VG507u0McaY8whkz70GsElVf1HV48AEoMW5XpCalsaMrgMpXuCSAJY1xhhzPumeoSoirYEmqnq///E9QE1VffC0552coZq3SMGq0yZODixxgFyZiehCDhcyuJLDhQyu5HAhgys5XMgAIZ6hCrQGRp7y+B7g7XO9Jr0zVIPJlZmILuRwIYOqGzlcyKDqRg4XMqi6kcOFDKqhn6G6CyhxyuPi/s8ZY4zxWCDFfSlQRkTiRCQH0BaYHpxYxhhjApHu9gOqmiIiDwJfApHAB6q6NmjJjDHGpFugM1Q/Bz4PUhZjjDFB4nnLX2OMMcFnxd0YY8KQFXdjjAlDVtyNMSYMpfsK1XQtJpIEJIRswTMrDPzpcQZwI4cLGcCNHC5kADdyuJAB3MjhQgaAeFWNuZgXhHoSU4Je7CW0QSYiP3qdwZUcLmRwJYcLGVzJ4UIGV3K4kOFEjot9jR2WMcaYMGTF3RhjwlCoi/uIEK93Ji5kADdyuJAB3MjhQgZwI4cLGcCNHC5kgHTkCOkbqsYYY0LDDssYY0wYsuJujDFhKCTF/WIHaWdQhg9EZLeIrPFifX+GEiIyX0TWichaEenpUY4oEflBRFb5czznRQ5/lkgRWSEiMz3MsFVEVovIyvScchakDPlF5FMR2SAi60XkOg8yxPu/ByduiSLSy4Mcvf3/LteIyHgRiQp1Bn+Onv4Ma0P1fThTnRKRgiIyW0R+9n8scEEbu9jpHhd7w9cOeDNQCsgBrAKuyuh1z5CjLnAtsCbUa5+S4TLgWv/9GGCjR98LAaL997MDS4BaHn1PHgbGATM9/HvZChT2an1/hjHA/f77OYD8HueJBH4HSoZ43WLAFiCX//FEoIMHX39FYA2QG9/1QHOAK0Ow7j/qFPAq0M9/vx8w4EK2FYo994sepJ0RVHURsC/U656W4TdVXe6/nwSsx/ePOdQ5VFUP+R9m999C/s66iBQHbgVGhnptl4hIPnz/qd8HUNXjqnrA21Q0Ajar6jYP1s4G5BKRbPiK668eZCgPLFHVv1Q1BVgI3J7Ri56lTrXA98Mf/8fbLmRboSjuxYAdpzzeiQcFzTUiEgtcg2+v2Yv1I0VkJbAbmK2qXuQYAjwKpHmw9qkU+EpElvkHuodaHLAHGOU/RDVSRPJ4kONUbYHxoV5UVXcBA4HtwG/AQVX9KtQ58O211xGRQiKSG7iFv48VDaWiqvqb//7vQNELeZG9oeoBEYkGJgO9VDXRiwyqmqqqVfDNvq0hIhVDub6INAV2q+qyUK57Fjeo6rXAzUB3Eakb4vWz4ftVfLiqXgMcxvfrtyf8YzObA5M8WLsAvj3VOOByII+I3B3qHKq6HhgAfAXMAlYCqaHOcTr1HZu5oN+yQ1HcbZD2KUQkO77CPlZVp3idx//r/3ygSYiXrg00F5Gt+A7VNRSRj0OcATi5t4iq7gam4juUGEo7gZ2n/Pb0Kb5i75WbgeWq+ocHa98IbFHVPaqaDEwBrvcgB6r6vqpWVdW6wH5875F54Q8RuQzA/3H3hbwoFMXdBmn7iYjgO666XlVf9zBHERHJ77+fC7gJ2BDKDKr6uKoWV9VYfP8m5qlqyPfQRCSPiMScuA80xvcrecio6u/ADhGJ93+qEbAulBlOcxceHJLx2w7UEpHc/v8vjfC9NxVyInKJ/+MV+I63j/MiB7562d5/vz0w7UJelOFdIdWRQdoiMh6oDxQWkZ3AM6r6fohj1AbuAVb7j3cDPKG+WbShdBkwRkQi8f2An6iqnp2K6LGiwFRfHSEbME5VZ3mQowcw1r8D9AtwrwcZTvyAuwl4wIv1VXWJiHwKLAdSgBV41wJgsogUApKB7qF4k/tMdQroD0wUkfuAbUCbC9qW//QaY4wxYcTeUDXGmDBkxd0YY8KQFXdjjAlDVtyNMSYMWXE3xpgwZMXdZCr+7ond/Pcv9582l1FrVRGRWzJq+8ZkJCvuJrPJD3QDUNVfVbV1Bq5VBV9PEWMyHTvP3WQqInKiq2gC8DNQXlUrikgHfN3y8gBl8DWfyoHvorFjwC2quk9ESgNDgSLAX0AnVd0gInfgu2AkFTiI7zL4TUAufO0yXgFmAm/hawebHXhWVaf5124J5MPXFO9jVfWsR74xEIIrVI0Jsn5ARVWt4u+seeqVtRXxddqMwleYH1PVa0RkMPAffF0oRwBdVPVnEakJDAMaAk8D/1LVXSKSX1WPi8jTQDVVfRBARF7G1yaho799ww8iMse/dg3/+n8BS0XkM1X1ZPCHMWDF3YSX+f4++UkichCY4f/8aqCyvxvn9cAkf7sBgJz+j98Co0VkIr5mVWfSGF+zs77+x1HAFf77s1V1L4CITAFuAKy4G89YcTfh5Ngp99NOeZyG7996BHDA3+r4b1S1i39P/lZgmYhUPcP2BWilqgl/+6Tvdacf37TjncZT9oaqyWyS8I0ovGj+3vlb/MfXEZ+r/fdLq+oSVX0a3+CMEmdY60ugh79bISJyzSl/dpN/1mUufMf+v01PRmOCxYq7yVT8hz6+9Q8Qfi0dm2gH3Cciq4C1/P/Ix9fENyR7DbAY36zf+cBV/mHRdwIv4Hsj9ScRWet/fMIP+Pr0/wRMtuPtxmt2towxAfKfLXPyjVdjXGB77sYYE4Zsz90YY8KQ7bkbY0wYsuJujDFhyIq7McaEISvuxhgThqy4G2NMGPo/bqkn0V0pEoMAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df2[df2['run']==1].plot('timestep', ['box_A', 'box_B'], grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(11)),\n", + " colormap = 'RdYlGn');\n", + "df2[df2['run']==9].plot('timestep', ['box_A', 'box_B'], grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(11)),\n", + " colormap = 'RdYlGn');" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we plot all those runs onto a single chart, we can see every possible trajectory for the number of marbles in each box." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ax = None\n", + "for i in range(50):\n", + " ax = df2[df2['run']==i+1].plot('timestep', ['box_A', 'box_B'],\n", + " grid=True,\n", + " xticks=list(df['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+max(df2['box_A'].max(),df2['box_B'].max()))),\n", + " legend = (ax == None),\n", + " colormap = 'RdYlGn',\n", + " ax = ax\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For some analyses, it might make sense to look at the data in aggregate. Take the median for example:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dfmc_median = df2.groupby(['timestep', 'substep']).median().reset_index()\n", + "dfmc_median.plot('timestep', ['box_A', 'box_B'], \n", + " grid=True,\n", + " xticks=list(dfmc_median['timestep'].drop_duplicates()), \n", + " yticks=list(range(int(1+max(dfmc_median['box_A'].max(),dfmc_median['box_B'].max())))),\n", + " colormap = 'RdYlGn'\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or look at edge cases" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "max_final_A = df2[df2['timestep']==df2['timestep'].max()]['box_A'].max()\n", + "# max_final_A\n", + "slow_runs = df2[(df2['timestep']==df2['timestep'].max()) & \n", + " (df2['box_A']==max_final_A)]['run']\n", + "slow_runs = list(slow_runs)\n", + "slow_runs\n", + "\n", + "ax = None\n", + "for i in slow_runs:\n", + " ax = df2[df2['run']==i].plot('timestep', ['box_A', 'box_B'],\n", + " grid=True,\n", + " xticks=list(df2['timestep'].drop_duplicates()), \n", + " yticks=list(range(1+max(df2['box_A'].max(),df2['box_B'].max()))),\n", + " legend = (ax == None),\n", + " colormap = 'RdYlGn',\n", + " ax = ax\n", + " )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tutorials/videos/robot-marbles-part-5/README.md b/tutorials/videos/robot-marbles-part-5/README.md new file mode 100644 index 0000000..af35b9f --- /dev/null +++ b/tutorials/videos/robot-marbles-part-5/README.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=I0mSQppibLs&feature=youtu.be diff --git a/tutorials/videos/robot-marbles-part-5/images/Mech1.png b/tutorials/videos/robot-marbles-part-5/images/Mech1.png new file mode 100644 index 0000000..b9d7a91 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-5/images/Mech1.png differ diff --git a/tutorials/videos/robot-marbles-part-5/images/Overview.png b/tutorials/videos/robot-marbles-part-5/images/Overview.png new file mode 100644 index 0000000..139b067 Binary files /dev/null and b/tutorials/videos/robot-marbles-part-5/images/Overview.png differ diff --git a/tutorials/videos/robot-marbles-part-5/robot-marbles-part-5.ipynb b/tutorials/videos/robot-marbles-part-5/robot-marbles-part-5.ipynb new file mode 100644 index 0000000..761bd34 --- /dev/null +++ b/tutorials/videos/robot-marbles-part-5/robot-marbles-part-5.ipynb @@ -0,0 +1,317 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# cadCAD Template: Robot and the Marbles - Part 5\n", + "\n", + "![](images/Overview.png)\n", + "![](images/Mech1.png)\n", + "\n", + "To expand upon our previous examples, we will introduce the concept of using a graph network object that is updated during each state update. The ability to essential embed a graph 'database' into a state is a game changer for scalability, allowing increased complexity with multiple agents or components is represented, easily updated. Below, building upon our previous examples, we will represent the Robots and Marbles example with n boxes, and a variable number of marbles.\n", + "\n", + "## Behavior and Mechanisms:\n", + "* A network of robotic arms is capable of taking a marble from their one of their boxes and dropping it into the other one.\n", + "* Each robotic arm in the network only controls two boxes and they act by moving a marble from one box to the other.\n", + "* Each robotic arm is programmed to take one marble at a time from the box containing the most significant number of marbles and drop it in the other box. It repeats that process until the boxes contain an equal number of marbles.\n", + "* For our analysis of this system, suppose we are only interested in monitoring the number of marbles in only their two boxes." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n", + "from cadCAD.configuration import Configuration\n", + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "#from copy import deepcopy\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# define global variables\n", + "T = 25 #iterations in our simulation\n", + "boxes=5 #number of boxes in our network\n", + "m= 2 #for barabasi graph type number of edges is (n-2)*m\n", + "\n", + "# Settings of general simulation parameters, unrelated to the system itself\n", + "# `T` is a range with the number of discrete units of time the simulation will run for;\n", + "# `N` is the number of times the simulation will be run (Monte Carlo runs)\n", + "simulation_parameters = {\n", + " 'T': range(T),\n", + " 'N': 1,\n", + " 'M': {}\n", + "}\n", + "\n", + "# We create a BarabĂ¡si–Albert graph and then fill the 5 boxes with between 1 and 10 balls.\n", + "# create graph object with the number of boxes as nodes\n", + "network = nx.barabasi_albert_graph(boxes, m)\n", + "\n", + "# add balls to box nodes\n", + "for node in network.nodes:\n", + " network.nodes[node]['balls'] = np.random.randint(1,10)\n", + " \n", + " \n", + "\n", + "#Behavior: node by edge dimensional operator\n", + "#input the states of the boxes output the deltas along the edges\n", + "\n", + "# We specify the robotic networks logic in a Policy/Behavior Function\n", + "# unlike previous examples our policy controls a vector valued action, defined over the edges of our network\n", + "def robotic_network(params, step, sL, s):\n", + " network = s['network']\n", + " delta_balls = {}\n", + " for e in network.edges:\n", + " src = e[0]\n", + " dst = e[1]\n", + " #transfer one ball across the edge in the direction of more balls to less\n", + " delta_balls[e] = np.sign(network.nodes[src]['balls']-network.nodes[dst]['balls'])\n", + " return({'delta': delta_balls}) \n", + " \n", + "\n", + "#mechanism: edge by node dimensional operator\n", + "#input the deltas along the edges and update the boxes\n", + "\n", + "# We make the state update functions less \"intelligent\",\n", + "# ie. they simply add the number of marbles specified in _input \n", + "# (which, per the policy function definition, may be negative)\n", + "\n", + "def update_network(params, step, sL, s, _input):\n", + " network = s['network'] #deepcopy(s['network']) \n", + " delta_balls = _input['delta']\n", + " for e in network.edges:\n", + " move_ball = delta_balls[e]\n", + " src = e[0]\n", + " dst = e[1]\n", + " if (network.nodes[src]['balls'] >= move_ball) and (network.nodes[dst]['balls'] >= -move_ball):\n", + " network.nodes[src]['balls'] = network.nodes[src]['balls']-move_ball\n", + " network.nodes[dst]['balls'] = network.nodes[dst]['balls']+move_ball\n", + " \n", + " return ('network', network)\n", + "\n", + " \n", + "# we initialize the cadCAD state as a network object\n", + "initial_conditions = {'network':network}\n", + "\n", + "\n", + "# wire up the mechanisms and states\n", + "partial_state_update_blocks = [\n", + " { \n", + " 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n", + " 'action': robotic_network\n", + " },\n", + " 'variables': { # The following state variables will be updated simultaneously\n", + " 'network': update_network\n", + " \n", + " }\n", + " }\n", + "]\n", + "\n", + "\n", + "# The configurations above are then packaged into a `Configuration` object\n", + "config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n", + " partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n", + " sim_config=simulation_parameters #dict containing simulation parameters\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we will plot the network of boxes and with their labels showing how many balls are in each box." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.7/site-packages/networkx/drawing/nx_pylab.py:579: MatplotlibDeprecationWarning: \n", + "The iterable function was deprecated in Matplotlib 3.1 and will be removed in 3.3. Use np.iterable instead.\n", + " if not cb.iterable(width):\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plot of boxes and balls\n", + "nx.draw_kamada_kawai(network,labels=nx.get_node_attributes(network,'balls'))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "single_proc: []\n", + "[]\n" + ] + } + ], + "source": [ + "# Run the simulations\n", + "exec_mode = ExecutionMode()\n", + "exec_context = ExecutionContext(exec_mode.single_proc)\n", + "executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n", + "raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n", + "df = pd.DataFrame(raw_result)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We create some helper functions to extract the networkx graph object from the Pandas dataframe and plot it." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#NetworkX helper functions\n", + "def get_nodes(g):\n", + " return [node for node in g.nodes if g.nodes[node]]\n", + "\n", + "\n", + "def pad(vec, length,fill=True):\n", + " if fill:\n", + " padded = np.zeros(length,)\n", + " else:\n", + " padded = np.empty(length,)\n", + " padded[:] = np.nan\n", + " \n", + " for i in range(len(vec)):\n", + " padded[i]= vec[i]\n", + " \n", + " return padded\n", + "\n", + "def make2D(key, data, fill=False):\n", + " maxL = data[key].apply(len).max()\n", + " newkey = 'padded_'+key\n", + " data[newkey] = data[key].apply(lambda x: pad(x,maxL,fill))\n", + " reshaped = np.array([a for a in data[newkey].values])\n", + " \n", + " return reshaped" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using our helper function get_nodes() we pull out the boxes ball quantity and save it to a new dataframe column." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "df['Balls'] = df.network.apply(lambda g: np.array([g.nodes[j]['balls'] for j in get_nodes(g)]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we will plot the number of balls in each box over the simulation time period. We can see an oscillation occurs never reaching an equilibrium due to the uneven nature of the boxes and balls." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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yUht6yZKadoTgYni6caNG9m7dy8LFiwAYGhoiAULFuQyTHp4i0BK+Zb59453vEOeCHr+8KDcvniJTO7efUJ0piq2b98+2V2Q1dXVub937NghI5GITKfT8p577pEf+MAHZDqdlsePH5dz586VR48elalUSp511lny2WeflTfeeKO85ZZbLOmm02n5rne9S0op5fve9z7Z29tred28efNkZ2en8wObREw2T/P7kI+3wrybygBelTYydYpp8KN54SsXLpzk3niwwmSlC/7pT3/KzTffTEdHB6tWreLSSy/NvSx8u2OyeOrhrY8pkS5YR+rYcfZeeCEzvvV/abruOgd7NjXgpW31MBnw5p27mPLpgnUEpkURwSBp70WrBw8ePEwtAS98PgKzZzHiuUp68ODBw9QS8KDK93mukh48ePAwBQV8YPZsLx+NBw8ePDAFBXxFczOZWIxsMjnZXfHgwYOHScWUE/C5tMHtRye5Jx48ePAwuXBVwAshGoQQdwshdgohdgghznOzPfAKf7zVMVmpba+//noWL17MihUruOGGG0ilUo6268HDWxFua/A/ATZIKZcALcAOl9vzCn+8xTFZqW2vv/56du7cyZYtW0gkElMmyMmDh2JwTcALIeqBC4BfAUgpR6SUPY43NDIET34X9jwKQGD6dAgEJlWDjyVi3LP7HtfoSym5c9edxBNx19oYTA0ymBp0jX46m6Y91u5qatsPXfohfv6LnwNw6aWXIoRACME555zD4cOHT3gMQ6khBkaczR5pRCabIZ6I42YwYs9wDyOZEdfoJ9IJkmn33ocl00n+a9t/kc6mXWtjw4EN7O/d7xr9hw88zK0bb3WFtpupCk4FOoHbhBAtwGvAl6SUJqkhhPhL4C8B5s6dO/ZWApWw8XfQvhEW/hkiECA4c+akavD3772fH7/+Yy485UKi4ajj9DsGO/jOi98hkU7wyeWfHBeN77/8fXZ27bT9PZlOIpGEA+GyaS5pWsLXzvla0Wv0sPrBxCAdRzt45LFHAOdT2375y1/mpp/dxLSqaabrUqkUv/3tb/nJT35S9rjs0JnoZCQzwsIKd9Ji9I/00zHYQVWwakzPoVxkZZYj/UeIhCPMrC7kqROIJWL0Dve6Qhvg2SPPcsurt7A8upx3zHiH4/SllPyfZ/8PVy28im+e+03H6QM8c/gZXul4hc+f8XnH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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(df.timestep,make2D('Balls', df))\n", + "plt.title('Number of balls in boxes over simulation period')\n", + "plt.ylabel('Qty')\n", + "plt.xlabel('Iteration')\n", + "plt.legend(['Box #'+str(node) for node in range(boxes)], ncol = 2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In summary, we created a graph network of boxes and robotic arms to transfer balls between the boxes, striving for an unachievable equilibrium state. The ability to embed a graph, virtually a graph database, into a cadCAD state allows for tremendous scalability and flexibility as a modeling tool." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}