diff --git a/01 Tutorials/README.md b/01 Tutorials/README.md
index 2d7ecef..b004bfa 100644
--- a/01 Tutorials/README.md
+++ b/01 Tutorials/README.md
@@ -1,10 +1 @@
-**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
+cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)
\ No newline at end of file
diff --git a/01 Tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb b/01 Tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb
index 2cbf87f..61f4ce4 100644
--- a/01 Tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb
+++ b/01 Tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb
@@ -4,614 +4,7 @@
"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",
- "
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": [
- "
"
- ]
- },
- "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."
+ "cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)"
]
}
],
diff --git a/01 Tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb b/01 Tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb
index ed4fa89..61f4ce4 100644
--- a/01 Tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb
+++ b/01 Tutorials/robot-marbles-part-2/robot-marbles-part-2.ipynb
@@ -4,330 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# cadCAD Tutorials: The Robot and the Marbles, part 2\n",
- "In [Part 1](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/01%20Tutorials/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",
- "\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": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEKCAYAAAACS67iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xd4FOXXxvHvkxAIvYMgSADpAUKRIoIUkRKkCAgKCtJ7UVRAf9gootJERBFQ6SV0Ero0ld5DqEoLXQydAEnO+8cuvohIyZbJ7p7PdeXKbtjMfYbAyWQy8xwjIiillPJ8flYXoJRSyjm0oSullJfQhq6UUl5CG7pSSnkJbehKKeUltKErpZSX0IaulFJeQhu6Ukp5CW3oSinlJZK5MyxLliwSFBSUqM+9du0aqVOndm5BSTjXymzdZ9/I1n32nNxt27b9KSJZH/pCEXHbW5kyZSSxVq9enejPdYRVuVZm6z77Rrbus+fkAlvlEXqsnnJRSikvoQ1dKaW8hDZ0pZTyEm79pahSSv2X27dvEx0dTWxsrMsy0qdPz759+1y2fUdzAwMDyZUrFwEBAYnK0YaulEoSoqOjSZs2LUFBQRhjXJJx5coV0qZN65JtO5orIly4cIHo6Gjy5s2bqJyHnnIxxkw0xpwzxkTe9bFMxpgVxphD9vcZE5WulFJ2sbGxZM6c2WXNPKkzxpA5c2aHfkJ5lHPoPwK17/lYX2CViBQAVtmfK6WUQ3y1md/h6P4/tKGLyDrgr3s+3AD4yf74J6ChQ1U8xLFZEVxfsQnRcXlKKfWfzKM0SWNMELBYRILtzy+KSAb7YwPE3Hl+n8/tAHQAyJ49e5kZM2Y8dpEX+o7m5qZIUlQoTober+GfLdNjbyOxrl69Spo0adyWlxSydZ99Izup7XP69Ol5+umnXZobHx+Pv7+/SzMczT18+DCXLl36x8eqVau2TUTKPvSTH+XuIyAIiLzr+cV7/jzmUbaT2DtF4+PiZFHX92VGqpIyM20pOTh2miTExydqW49L76bzjWzdZ+uzo6KiXJ57+fLlB/75kSNHpFixYi7L3bFjhwCyZMmS/3zt/f4ecPGdomeNMTkA7O/PJXI7j8TP3580TV4gdM8iMpcrwZbOH7GqeisuHzrqylillHKq6dOn89xzzzF9+nSXbD+xly0uBFoBn9nfL3BaRQ+QJl9uqq/4gT9+mMP2tz5jSYn6FP+kB4V7t8YvmV6BqZS32NZrEDE79zt1mxlDClPw0x4PfV1cXBwtWrRg+/btFCtWjEmTJrFhwwb69OlDXFwczzzzDGPHjiU2NpZy5cqxcOFCChUqxKuvvkr16tVp3779fbcrIsyePZsVK1ZQuXJlYmNjCQwMdOo+Pspli9OBDUAhY0y0MaYttkZe0xhzCHjB/twtjDHkb9OE0KhwctR6jp3vfsHyCq8Qs8u5X3yllG86cOAAXbp0Yd++faRLl47hw4fTunVrZs6cyZ49e4iLi2Ps2LGkT5+er7/+mtatWzNjxgxiYmL+s5kD/Pbbb+TNm5f8+fNTtWpVwsPDnV77Qw9rReTV//ijGk6u5bGkypmdyvPGcCJsKVu7fcrSso0p2rc9wR90wT9FcitLU0o5qMzI912y3StXrjz0Nblz56ZSpUoAtGzZkk8//ZS8efNSsGBBAFq1asWYMWPo1asXNWvWZPbs2XTt2pVdu3Y9cLvTp0+nefPmADRv3pxJkybRuHFjB/fonzx6LRdjDE81rUNoVDh5Xg1l78CxLCnVkPMbdlhdmlLKQ917LXiGDPe9gA+AhIQE9u3bR6pUqYiJifnP18XHxzNnzhw++eQTgoKC6N69O0uXLn2kbzCPw6Mb+h0pMmfk2UmfUzViHHFXr7Oi0qts6zWIuGvXrS5NKeVhjh8/zoYNGwCYNm0aZcuW5ejRoxw+fBiAyZMn8/zzzwMwYsQIihQpwrRp03jzzTe5ffv2fbe5Zs0aSpQowYkTJzh69CjHjh2jcePGzJs3z6m1e0VDvyNnnecJ3buYAl1e48CoSYQH1+PMyt+sLksp5UEKFSrEmDFjKFKkCDExMfTu3ZsffviBpk2bUrx4cfz8/OjUqRMHDhxg/PjxDBs2jMqVK1OlShUGDhx4322GhYXRqFGjf3yscePGTr/axesuDQlIm4Znvh5AnmZ12dT2fX6u+Sb52jSm9LC+JM+QzurylFJJWFBQEPv3//sCixo1arBjxz9P5RYqVOgfKygOHz78P7c7duzYfy3OVb9+ferXr+9gxf/kVUfod8tWuSx1di2gaN8OHPlpPuFF63Ji/kqry1JKKZfx2oYOkCxlICFD3qbWplmkyJaZ9Y268ssrPblx9k+rS1NKeany5csTEhLyj7e9e/e6JdvrTrncT6YywdTeEsa+Lyaw5+OvObNyA6VH9ifv6w18fnU3pZRzbdq06V8fc/bVLP/Fq4/Q7+YXEECx/p2os2sB6YrkY2Or91hTtz3Xjp+yujSllHIKn2nod6QvnJ+a66dR5qsPOL9+G+HFQjk4ZiqSkGB1aUop5RCfa+gAxs+PQt1fp27kIrJULMXWbp+w8vmWXD7wh9WlKaVUojnU0I0xPY0xkcaYvcaYXs4qyl3SBOWi2rIJVPhhCBcjDxFRsgF7PxtHQlyc1aUppdRjS3RDN8YEA+2BckBJoJ4xxrWr07uAMYZ8rV+m3r4InqxXjV39hrGs/CvE7HT/ZHCllLWOHj1KcHCwS7YdFBRE8eLFCQkJoXjx4ixY4PxFah05Qi8CbBKR6yISB6wFXnZOWe6X8omsVA77iufCvuLGybMsLduYXe+PQG7d/1ZepZR6XKtXr2bnzp2EhYXRo8fDl/J9XI5cthgJDDLGZAZuAHWBrU6pykJPNa5F9mrl2fH2UPYO/pZkU57g/LRMZK1UxurSlPIZvWaNYGf0QaduMyRXQT6t0+6hr3PVeuh3u3z5MhkzZnTGbv3DI80U/c9Ptq2N3gW4BuwFbopIr3te4/BMUbBm/mHslihivpyEnL9I6oZVSdu+IX4pnbsg/YPorEnvz7UyO6nt890zRd9b+A17Tv3u1MziOfMzOLTjA2d7Hjt2jOLFi7N8+XIqVKhAly5dCAoK4ocffmDhwoUUKFCADh06ULJkSbp27crPP//MoEGD6Ny5M1OnTv3Pxbbi4+MpWbIkadKkQUQ4evQoP/74I3Xq1PnXa10+U/RR3oDBQJcHvSaxM0VFrJt/uCpiiWzp/qlMNYVkfp5qcmrZerdl66xJ78+1Mjup7XNSmSmaO3fuv5+vWrVKqlatKpUrV/77YytXrpRGjRr9/bx9+/aSKVMmOXHixANz8+TJI+fPnxcRkcOHD0uePHnkypUr/3qtFTNFATDGZLO/fwrb+fNpjmwvKfJLGUjZrz6g5vqp+KdMwepabdn4Zj9u/nXR6tKUUi7givXQ75U/f36yZ89OVFRUouu8H0evQ59jjIkCFgFdRcRru1zWSmWos2M+xd7vxJHJCwgvGsrxOcusLksp5WSuWA/9XufOnePIkSPkyZPHqbU71NBFpLKIFBWRkiKyyllFJVX+gSkoObA3tbfOIWXObPzSpAfrG3fnxulzVpemlHISV6yHfke1atUICQmhWrVqfPbZZ2TPnt2ptfvE4lzOljGkCLU2z2b/sIns/nA0Z37eSJkR/cjbqpEu9qWUB3PVeuhgu8bd1Xzy1n9n8EuWjKLvdaDurgVkCC7Axjf7sbpWW64ejba6NKWUj9KG7qB0hfLxwtoplB0zgD837CAi+CUOjJ5MQny81aUppSyg66F7OOPnR8EuLXiyXjU2dxzAth4DOTYjnPLjB5G+SH6ry1PKY4iIx5+2dGQ9dHHgviDQI3SnSv1UTqpGfE/FSUO5vP8IS0IaEDloLAmP+JtvpXxZYGAgFy5ccLipeSoR4cKFCwQGJv7mRT1CdzJjDHlfb8gTLz7Hth4D2f3BSI7PXkqFiYPJVLqY1eUplWTlypWL6Ohozp8/77KM2NhYhxqmq3MDAwPJlStXonO0obtIyuxZeG7mSE68Wo+tXT5iWbmmFOnThuAPu5HMjcsHKOUpAgICyJs3r0sz1qxZQ6lSpVyaYWWunnJxsdwNXyA0KoJ8rRsRNfR7loQ04Nx6j1/DTCmVBGlDd4PkGdJRfvwgqq/8kYTbcays0oItXT/m9uWrVpemlPIi2tDd6IkaFQnds4hCvVpxaOx0woPrcWrJWqvLUkp5CW3obpYsdSrKjOjPi7/NICBtatbU7cBvb7zLzQuPvrCPUkrdj6OrLfa2zxONNMZMN8bob/seUZYKIdTePo/gAV05Nj2cxUXqcmxWhM9esqWUcpwjM0WfBHoAZUUkGPAHmjurMF/gnyI5JT7uQe1tc0idJye/NuvN+kZduX7qrNWlKaU8kKOnXJIBKY0xyYBUwCnHS/I9GUsU5sUNMyn1xbucXvYL4UVD+X3CbD1aV0o9lkQ3dBE5CXwJHAdOA5dEZLmzCvM1fsmSUaRPW+ruWUTGkCJsavcBF94ewdU/TlhdmlLKQyR6pqgxJiMwB2gGXARmA2EiMuWe13nsTFGrciUhgeuLf+HSt2EYEdK2bUDqRtUx/u75HXZSmzXpzblWZus+e06uy2eKAk2BCXc9fwP45kGf44kzRa2cu7hy1lxZHdpBplJQlpZvKjGRB92Sm9RmTXpzrpXZus+ek4sbZooeByoYY1IZ2/JoNYB9D/kc9Rj8s2bk+UXf8uy0YVz9/ThLSzVizydfE3/rltWlKaWSIEfOoW8CwoDtwB77tsY5qS5lZ4wh6NV6hEZFkLtJLfZ8OJplZRtzYctuq0tTSiUxjs4U/VBECotIsIi8LiI3nVWY+qfArJmoNG0YVRaO5eZfl1heoRk73hlK3PUbVpemlEoi9E5RD5PrpeqE7g0nf7um7PtyIhElG3B2zb8X1FdK+R5t6B4oefq0lPvuE2r8/BOIsKraG2zuNIBblx5tKopSyjtpQ/dg2atVoO7uhRR+uw2/fz+b8GKhnAxfY3VZSimLaEP3cMlSpaT0l+9Rc8NMkmdMz9p6Hfm1xdvEnv/L6tKUUm6mDd1LZClXgtrb5lD84+6cmL2M8KJ1OTp9sS4foJQP0YbuRfyTJ6f4gG7U3j6XNPly89trb7O2fmeuR5+xujSllBtoQ/dCGYILUvO3GZQe3o+zqzYQXiyUw+NmIgkJVpemlHIhbeheys/fn8K9W1N3zyIylSnG5o4DWFWjFVcOH7O6NKWUi2hD93Jp8z9F9VU/Ue77gcRsjyKiRH32DZtIQny81aUppZxMG7oPMMbwdLumhEZF8ETNZ9nRZyjLKzbjYuRBq0tTSjmRNnQfkurJ7FSZ/w2VZozg2tGTLC39Mrs/Gq2LfSnlJRwZQVfIGLPzrrfLxphezixOOZ8xhjzN6hIaFc5TzeoQ+fHXLC39Mn9u2mV1aUopBzmy2uIBEQkRkRCgDHAdmOe0ypRLBWbJxLOTv+D5xd9x+9IVlldsxra3hhB37brVpSmlEslZp1xqAL+LiF5C4WGeDK1K6N5wCnRqzoERPxJRoj43t++3uiylVCI4q6E3B6Y7aVvKzQLSpeGZbz6ixprJ4OfHhbdHsKn9B9y6eNnq0pRSjyHRM0X/3oAxyYFTQDEROXufP9eZoh6ULTdvceH7udyatwa/TOnJ0Os1AiuVdFu+fp29P9fKbE/NdflM0TtvQANg+aO8VmeKekb26tWr5c8tuyW8xEsylYKyvlkvuXH2T7dlW8FXv85W8bV99oSZone8ip5u8TqZyxan9tY5lPi0J9HzVhBetC5Hpi7Uxb6USsIcaujGmNRATWCuc8pRSYlfQADBH3Shzo75pCkQxIaW77C2XkeunThtdWlKqftwdKboNRHJLCKXnFWQSnrSF32amr9Mo/TI/pxds5nwYqEcGjtNF/tSKonRO0XVI/Hz96dwz1aERi4iS/mSbOnyMauqvcHlQ0etLk0pZacNXT2WNHlzU235RMpPGETMrv0sKVGfqM+/JyEuzurSlPJ52tDVYzPGkL9NE0KjwslRuzI73/uS5RVeIWaX3pCklJW0oatES5UzO5Xnfs1zs0dx/cQZlpZtzK7/jST+pi72pZQVtKErhxhjeKpJbUKjwgl6rR57B45lSamGnN+ww+rSlPI52tCVU6TInJGKPw2l6pLvibt2gxWVXmVbr0HcvnrN6tKU8hna0JVT5axdhdDIRRTo8hoHRk0iovhLnF7xq9VlKeUTtKErpwtIm4Znvh7AC+um4pc8gNUvtmFj2/7citHbFZRyJW3oymWyVS5L3V0LKdqvI0d+ms/ioqGcmLfC6rKU8lra0JVL+QemIGTwW9TaPJuUT2Rh/cvd+OWVntw4+6fVpSnldbShK7fIVLoYtTbPpuTgt4he+DPhReryx6T5utiXUk7k6OJcGYwxYcaY/caYfcaYis4qTHkfv4AAivXrSJ2d80lXJB8bW73HmjrtuHbspNWlKeUVHD1CHwUsFZHCQElgn+MlKW+XvnB+aq6fRpnR/+P8L9sJD67HwTFTdbEvpRyU6IZujEkPVAEmAIjILRG56KzClHczfn4U6taSupGLyPJsabZ2+4SVz7ck7vgZq0tTymMlegSdMSYEGAdEYTs63wb0FJFr97xOR9B5WLa7c0WEG8s2cumbWUjsLdK2fok0r9TEJPN3Ww36dfaNbE/NdfkIOqAsEAeUtz8fBXz6oM/REXSekW1V7vXT52TO881lKgUlolRDubB9r9uy9evsG9memosbRtBFA9Eissn+PAwo7cD2lI9L+URWMn3UkcpzRnPj1DmWPdOEnf2HEx970+rSlPIIiW7oInIGOGGMKWT/UA1sp1+Uckjul1+k3r4I8r7RgKgh37EkpAHnf91mdVlKJXmOXuXSHZhqjNkNhACDHS9JKUieMT0VJg6h2rIJxMfeYkXlFmzt/im3r1y1ujSlkixHZ4ruFJGyIlJCRBqKSIyzClMKIMeLz1E3chEFu7fk4JiphAe/xKll660uS6kkSe8UVUleQJrUlB31ATXXTyVZqkDW1G7HhtZ9ufmXXiWr1N20oSuPkbVSGersmE+x9ztxdOoiwovU5XjYUqvLUirJ0IauPIp/YApKDuxN7S1hpMz1BL807cn6xt25cfqc1aUpZTlt6MojZQwpQq1Nswj57G1Ohq9hcdFQfv9hji72pXyaNnTlsfySJaPoex2ou3shGYoXZFOb/qyu1ZarR6OtLk0pS2hDVx4vXcG8vLBmMmXHDODPDTuICH6JA19NIiE+3urSlHIrbejKKxg/Pwp2aUHo3nCyVi7Dtp6DWFm5BZf2/W51aUq5jTZ05VVSP5WTqhHfU3HSUC4fOMKSkAZEDhpLwu3bVpemlMtpQ1dexxhD3tcbEhoVTq6GL7D7g5EsLduYv7ZFWl2aUi6lDV15rZTZs/DczJFUnjeGm+f/Yln5V9jx3hfE3Yi1ujSlXMLREXRHjTF7jDE7jTFbnVWUUs6Uu+ELhEZFkK91I/Z9Pp4lJRtwbt0Wq8tSyumccYReTURC5FEWX1fKIskzpKP8+EFUX/kjCXFxrHy+JVu6fMTty7rYl/IeespF+ZQnalQkdM8iCvVqxaFvZxAeXI+TEWutLkspp0jm4OcLsNwYI8B3IjLOCTUp5VLJUqeizIj+5GlWl41t+/NZj65sLZ2ZFJNSWVLPzZs3STFpqM/kWpltZe7k7Nl4ukhRl+YkeqYogDHmSRE5aYzJBqwAuovIunteozNFPSzbV/b5/PVLDN8yl41nDpD5BqSMM27JVb5pcLU25M5fIFGf6/KZove+AR8BfR70Gp0p6hnZ3r7P8fHx8u26uZK2VzVJ2b2KDF85TVauWuXy3P+iX2fNfRhcPVPUGJPaGJP2zmPgRUAv9FVJ2uFzJ6gxqhudpg3lmTxFifzfNHrXeBV/P/11kvJ8jpxDzw7MM8bc2c40EdHFqVWSFBcfx8ifZ/K/ReNIkSyA8S370+bZl7D/+1XKKyS6oYvIH0BJJ9ailEvsOXmYtpMHs+VYFA1KVuGb5u+QM0NWq8tSyukcvcpFqSTr5u1bDF76E4OX/kjGVOmY2W4gTUvX0KNy5bW0oSuvtOlIJG0nD2bv6T9oWa42I5v2JnOa9FaXpZRLaUNXXuXazRv8b9F3jPx5Jk9myEp41+HUDX7W6rKUcgtt6MprrNq/hfZThnDkwik6V3mZzxp2JV3K1FaXpZTbaENXHu/i9Su8M3c0439dSIFsuVn71liqFChldVlKuZ02dOXRFuxaR+fpn3PuSgzvvfg6H4a2JWXyQKvLUsoS2tCVRzp3+S96zBrOzG0rKZmrAIs6f0mZPIWtLkspS2lDVx5FRJi6eSk9Z4/g6s0bDKzfkXdffJ0Af/2nrJT+L1Ae48RfZ+k0fSgRkb9RMV9xJrTsT5Ecea0uS6kkQxu6SvISEhL4bv083p03hgRJYFTT3nSt2gR/P3+rS1MqSdGGrpK0g2eP027KYNYf3skLhZ9hXIt+5M2S0+qylEqSHG7oxhh/YCtwUkTqOV6SUrbFtIavms6Hi8cTmCw5E1//gNYVQ/W2faUewBlH6D2BfUA6J2xLKXZFH6LNpIFsP3GARiHPM6b5O+RIn8XqspRK8hxq6MaYXEAoMAh4yykVKZ918/YtJu5ZzvTZa8mUOh2z2w+mcalqelSu1CNy9Ah9JPAukNYJtSgf9tvvu2k3ZTD7zhylVYW6DG/Sk0ypdTEtpR5HomeKGmPqAXVFpIsxpiq28XP/OoeuM0U9L9uduTdu32T8nmXMO7SBbKnS07lYHZ7P5/5l9vXr7BvZnprr8pmiwBAgGjgKnAGuA1Me9Dk6U9Qzst2VuzxqowS931DoVF66zfhCLt+46vX7nJSydZ89J5dHnCnqyMSifkA/gLuO0FsmdnvKd8Rcu8zbc77ihw2LKZQ9D+vf/pbnng6xuiylPJ5eh67cat7ONXSZ/gXnr16kX61WDAhtQ2BACqvLUsorOKWhi8gaYI0ztqW805lLF+g+axhh238mJFdBwrsOo/RTupiWUs6kR+jKpUSESRsj6B02iuu3YhncoDN9arbQxbSUcgH9X6Vc5tiF03ScNpRlURuplL8E41v2p/ATQVaXpZTX0oaunC4hIYFv1s2h7/xvABjd7G26VGmMn5+fxZUp5d20oSunOnDmGG2nDOLX33dTq2gFvnvtPfJkzmF1WUr5BG3oyilux8fx5YqpfBw+gVTJA/nxjf/xRoW6etu+Um6kDV05bMeJA7SdPIgdJw7SpHR1Rr/yNk+kz2x1WUr5HG3oKtFib9/kk/CJfL5iClnTZGBOhyG8XKqa1WUp5bO0oatE+eXwTtpOHszBc8d5s2I9hjXuQcbUuoKyUlbShq4ey5XYa/SbP5Yxa8MIypyD5T1GUbNIeavLUkqhDV09hmVRG+kw9TNOxJylR7VXGFS/E2kCU1ldllLKThu6eqi/rl2i9+xRTNoUQeEn8vDL29/xbP4SVpellLpHohu6MSYQWAeksG8nTEQ+dFZhKmkI2/4zXWd8wV/XLvNBnTd5v05rXUxLqSTKkSP0m0B1EblqjAkAfjHGLBGRjU6qTVno9KU/6TbjS+buXEOZpwqzvMdXlMxVwOqylFIP4Mh66AJctT8NsL8lbvyRSjJEhCV/bKXRwkHExt1iaKOuvFXjVZLpYlpKJXmODon2B7YBTwNjRGSTU6pSljjy5yk6TB3Cyv1bqPx0CONb9qdg9qesLksp9YgSPVP0HxsxJgMwD+guIpH3/JnOFE3i2fEJCcw/vIHxu5dijKFVoeo0LVYFP+P+xbT06+z9uVZme2quy2eK3vsGDMA2hk5ninpQdtSpP6Ti5+2ETuWlzuhecuzCaa/f56SUa2W27rPn5OLqmaLGmKzAbRG5aIxJCdQEhiZ2e8q9bsfH8fnyyXwSMZG0KVIxufWHtChXG2MMf7Df6vKUUongyDn0HMBP9vPofsAsEVnsnLKUK207tp82kwey++RhmpV5ga9eeYts6TJZXZZSykGOXOWyGyjlxFqUi924FctH4eMZtnI62dJmZH6nz2lQsorVZSmlnESvRfMR6w7toN2UwRw6d4J2lerzxcvdyZAqrdVlKaWcSBu6l7t84xp9549h7Lq55M2ck5U9R1Oj8DNWl6WUcgFt6F4sIvI3Ok0bSvTFc/Su0ZxPX+pI6hQprS5LKeUi2tC90J9XL9J79kimbF5K0Rx5+a3P91TIF2x1WUopF9OG7kVEhNnbV9FtxjBirl/mw9C29KvVihQBya0uTSnlBtrQvcSpi+fpMuMLFuxaR9k8RVjVazTFn3za6rKUUm6kDd3DiQgTfl1In7mjuRl3my8bd6dntWa6mJZSPkj/13uwP86fpP3UIfx8YCvPFyjF+Jb9eTpbbqvLUkpZRBu6B4pPiOer1bN4f8G3JPP357vX+tKuUn38/Ny/mJZSKunQhu5h9p76g7aTB7Hp6F7qFa/E2FffI1fGbFaXpZRKArShe4hbcbf5bNkkBi75gfQp0zCtzSc0L1sTY4zVpSmlkghHVlvMDUwCsmObVDROREY5qzD1/7YcjaLtlEHsOfk7rz3zIiOb9iZr2oxWl6WUSmIcOUKPA94Wke3GmLTANmPMChGJclJtPi827hbvzBnN8FXTyZE+Mws7f8FLJSpbXZZSKolyZLXF08Bp++Mrxph9wJOANnQnWHNwG+2WjeLk1Qt0rNyIoY26kj6lNdNllFKewVkj6IKAdUCwiFy+5890BN3j5N2K5btdESz+YzM5UmXknXJNKJU9v9vyQUeT+Uq27rPn5LptBB2QBtug6Jcf9lodQfdgC3etkyf71hO/zhWlT9hXsmTFMrdl301Hk/lGtu6z5+Ti6hF0AMaYAGAOMFVE5jqyLV92/koMPWeNYPrW5RR/Mj/zOg7lmaCirFmzxurSlFIexJGrXAwwAdgnIsOdV5LvEBGmb1lOj1nDuRx7jY/rtadvrTdInizA6tKUUh7IkSP0SsDrwB5jzE77x/qLSITjZXm/6JhzdJ4+lMV7fqV8UDEmvP4+xXLms7ospZQHc+Qql18AvavlMSUkJPD9rwt4Z+5o4uLjGd6k7cnMAAAMW0lEQVSkJz2qvYK/n7/VpSmlPJzeKepGh8+doP3UIaw5uJ3qhcryfYt+5Mv6pNVlKaW8hDZ0N4iLj2PkzzP536JxpEgWwPiW/Wnz7Et6275Syqm0obvY7uhDtJ0ymK3H9tGgZBW+af4OOTNktbospZQX0obuIjdv32Lw0p8YvPRHMqZKx8x2A2lauoYelSulXEYbugts/COStlMGEXX6CC3L1WZk095kTpPe6rKUUl5OG7oTXbt5g/8t+o6RP8/kyQxZCe86nLrBz1pdllLKR2hDd5JV+7fQfsoQjlw4RecqL/NZw66kS5na6rKUUj5EG7qDLl6/Qp85XzHht0UUyJabtW+NpUqBUlaXpZTyQdrQHbBg1zo6T/+cc1dieO/F1/kwtC0pkwdaXZZSykdpQ0+Es5cv0GPWcGZtW0XJXAVY1PlLyuQpbHVZSikf5+hqixOBesA5EQl2TklJl4gwdfNSes4ewdWbNxhYvyPvvvg6Af76fVEpZT1HO9GPwNfYZot6teN/naHTtKEs2buBivmKM6Flf4rkyGt1WUop9TeHGrqIrLNPK/JaCZLAN2vDeG/eNyRIAqOa9qZr1Sa6mJZSKsnRcwUPcPDscXqvHsfu80epWaQc41r0JShzTqvLUkqp+3J4pqj9CH3xf51D98SZovEJ8cw6sJ4fIleS3C8Z3UrXo1ZQGbfftu+p8w89MVv32TeyPTXXnTNFg4DIR3mtJ8wU3XnioJQe9IbQqbw0+vZdCYtY4Jbc+/HU+YeemK377BvZnprLI84U9Uv0twwvE3v7Jh8s+JayQ1pz8tJ5wtoPZm7HoWROmc7q0pRS6pE4etnidKAqkMUYEw18KCITnFGYO/32+27aThnE/jPHaFWhLsOb9CRTal1MSynlWRy9yuVVZxVihaux1+m/YCxfrw0jd8bsLO0+klpFK1hdllJKJYrPXuWyPGoTHaYO4XjMWbo+35jBDTqTNlAX01JKeS6fa+gx1y7z1pxR/LghnELZ87DurbE893SI1WUppZTDfKqhz92xmq4zvuT81Yv0q9WKAaFtCAxIYXVZSinlFD7R0M9cukC3mV8yZ8dqQnIVJKLbcErlLmR1WUop5VRe3dBFhJ82hvNW2FdcvxXL4Aad6VOzhS6mpZTySl7b2Y5eOEXHqUNZvm8TlfKXYHzL/hR+IsjqspRSymW8rqEnJCQwZm0Y/RaMxWD4ulkfOld5GT8/vYdKKeXdvKqh7z9zlHZTBvPr77upVbQC3732Hnky57C6LKWUcguvaOi34+P4YvkUPo6YQOrkKfmp1QBeL1/H7YtpKaWUlTy+oW8/vp+2kwezM/ogTUpX5+tmb5M9XWary1JKKbfz2IZ+41Ysn0RM5IsVU8maJgNzOgzh5VLVrC5LKaUs4+jiXLWBUYA/MF5EPnNKVQ/xy+GdtJ08mIPnjvNmxXoMa9yDjKl1VUSllG9LdEM3xvgDY4CaQDSwxRizUESinFXcva7EXqPf/LGMWRtGUOYcLO8xippFyrsqTimlPIojR+jlgMMi8geAMWYG0ABwSUPffPoArT4dyYmYs/Ss1oyB9TuSJjCVK6KUUsojOdLQnwRO3PU8GnDJ4XLHqZ8x7pf5FHkiiF/7jKNivuKuiFFKKY+W6JmixpgmQG0RaWd//jpQXkS63fM6h2eKzti/lovXrtAmpDbJ3Xzbvs5d9I1s3WffyPbUXJfPFAUqAsvuet4P6Pegz/GEmaJJJdfKbN1n38jWffacXNwwU3QLUMAYk9cYkxxoDix0YHtKKaUckOjzFyISZ4zpBizDdtniRBHZ67TKlFJKPRZHZ4pGABFOqkUppZQDdAlCpZTyEtrQlVLKS2hDV0opL6ENXSmlvIQ2dKWU8hKJvlM0UWHGnAeOJfLTswB/OrGcpJ5rZbbus29k6z57Tm4eEcn6sBe5taE7whizVR7l1lcvybUyW/fZN7J1n70vV0+5KKWUl9CGrpRSXsKTGvo4H8u1Mlv32TeydZ+9LNdjzqErpZR6ME86QldKKfUAHtHQjTG1jTEHjDGHjTF93ZQ50RhzzhgT6Y68u3JzG2NWG2OijDF7jTE93ZgdaIzZbIzZZc/+2F3Z9nx/Y8wOY8xiN+ceNcbsMcbsNMZsdWNuBmNMmDFmvzFmnzGmoptyC9n39c7bZWNMLzdl97b/24o0xkw3xgS6KbenPXOvq/f1fr3DGJPJGLPCGHPI/j6jS8IfZdF0K9+wLc37O5APSA7sAoq6IbcKUBqIdPP+5gBK2x+nBQ66Y3/teQZIY38cAGwCKrhx398CpgGL3fx3fhTI4s5Me+5PQDv74+RABgtq8AfOYLvO2dVZTwJHgJT257OA1m7IDQYigVTYVphdCTztwrx/9Q7gc6Cv/XFfYKgrsj3hCP3vYdQicgu4M4zapURkHfCXq3Puk3taRLbbH18B9mH7j+CObBGRq/anAfY3t/ySxRiTCwgFxrsjz2rGmPTY/uNPABCRWyJy0YJSagC/i0hib/h7XMmAlMaYZNga7Ck3ZBYBNonIdRGJA9YCL7sq7D96RwNs38Cxv2/oimxPaOj3G0btlgZnNWNMEFAK25GyuzL9jTE7gXPAChFxV/ZI4F0gwU15dxNguTFmm30GrjvkBc4DP9hPM403xqR2U/bdmgPT3REkIieBL4HjwGngkogsd0N0JFDZGJPZGJMKqAvkdkPu3bKLyGn74zNAdleEeEJD90nGmDTAHKCXiFx2V66IxItICJALKGeMCXZ1pjGmHnBORLa5Ous/PCcipYE6QFdjTBU3ZCbD9mP5WBEpBVzD9qO429hHR9YHZrspLyO2I9W8QE4gtTGmpatzRWQfMBRYDiwFdgLxrs59QD2Ci37y9YSGfpJ/fjfNZf+Y1zLGBGBr5lNFZK4VNdh//F8N1HZDXCWgvjHmKLZTatWNMVPckAv8feSIiJwD5mE7zedq0UD0XT8BhWFr8O5UB9guImfdlPcCcEREzovIbWAu8Kw7gkVkgoiUEZEqQAy2302501ljTA4A+/tzrgjxhIbuU8OojTEG23nVfSIy3M3ZWY0xGeyPUwI1gf2uzhWRfiKSS0SCsH19fxYRlx+5ARhjUhtj0t55DLyI7Ud0lxKRM8AJY0wh+4dqAFGuzr3Hq7jpdIvdcaCCMSaV/d95DWy/I3I5Y0w2+/unsJ0/n+aO3LssBFrZH7cCFrgixKGZou4gFg2jNsZMB6oCWYwx0cCHIjLB1bnYjlZfB/bYz2UD9Bfb/FZXywH8ZIzxx/bNfpaIuPUSQgtkB+bZ+gvJgGkistRN2d2BqfYDlT+AN92Ue+ebV02go7syRWSTMSYM2A7EATtw352bc4wxmYHbQFdX/gL6fr0D+AyYZYxpi23F2Vdckm2/jEYppZSH84RTLkoppR6BNnSllPIS2tCVUspLaENXSikvoQ1dKaW8hDZ05VHsKxR2sT/Oab8MzlVZIcaYuq7avlLOpg1deZoMQBcAETklIk1cmBWCbd0PpTyCXoeuPIox5s5qmweAQ0AREQk2xrTGtoJdaqAAtkWgkmO7SesmUFdE/jLG5AfGAFmB60B7EdlvjGmK7QaQeOASttvUDwMpsS01MQRYDIzGthxrAPCRiCywZzcC0mNbOG6KiLh1LXmlwAPuFFXqHn2BYBEJsa9GefedrMHYVqcMxNaM3xORUsaYEcAb2FZ0HAd0EpFDxpjywDdAdWAAUEtEThpjMojILWPMAKCsiHQDMMYMxrYsQRv7EgmbjTEr7dnl7PnXgS3GmHARcduwDKVAG7ryLqvta8hfMcZcAhbZP74HKGFfwfJZYLb9Vn+AFPb3vwI/GmNmYVs06n5exLaIWB/780DgKfvjFSJyAcAYMxd4DtCGrtxKG7ryJjfvepxw1/MEbP/W/YCL9uWB/0FEOtmP2EOBbcaYMvfZvgEai8iBf3zQ9nn3nrvUc5nK7fSXosrTXME2mu+x2deVP2I/X46xKWl/nF9ENonIAGyDJ3LfJ2sZ0N2+UiDGmFJ3/VlN+9zIlNjO5f+amBqVcoQ2dOVR7Kc1frUP4P0iEZtoAbQ1xuwC9vL/4wy/MLZB0ZHAb9hm164GitoHKTcDPsX2y9Ddxpi99ud3bMa2hv1uYI6eP1dW0KtclHKQ/SqXv395qpRV9AhdKaW8hB6hK6WUl9AjdKWU8hLa0JVSyktoQ1dKKS+hDV0ppbyENnSllPIS2tCVUspL/B9zEYV421CkzQAAAABJRU5ErkJggg==\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",
- "\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."
+ "cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)"
]
}
],
diff --git a/01 Tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb b/01 Tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb
index 6726eed..61f4ce4 100644
--- a/01 Tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb
+++ b/01 Tutorials/robot-marbles-part-3/robot-marbles-part-3.ipynb
@@ -4,273 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# cadCAD Tutorials: The Robot and the Marbles, part 3\n",
- "In parts [1](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/01%20Tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb) and [2](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/01%20Tutorials/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."
+ "cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)"
]
}
],
@@ -290,7 +24,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.7.0"
+ "version": "3.6.5"
}
},
"nbformat": 4,
diff --git a/01 Tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb b/01 Tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb
index 01c1d8f..61f4ce4 100644
--- a/01 Tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb
+++ b/01 Tutorials/robot-marbles-part-4/robot-marbles-part-4.ipynb
@@ -4,690 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# cadCAD Tutorials: The Robot and the Marbles, part 4\n",
- "In parts [1](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/01%20Tutorials/robot-marbles-part-1/robot-marbles-part-1.ipynb) and [2](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/01%20Tutorials/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](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/01%20Tutorials/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",
- "
box_A
\n",
- "
box_B
\n",
- "
\n",
- "
\n",
- "
run
\n",
- "
timestep
\n",
- "
substep
\n",
- "
\n",
- "
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
1
\n",
- "
0
\n",
- "
0
\n",
- "
10
\n",
- "
0
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
1
\n",
- "
9
\n",
- "
1
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
1
\n",
- "
8
\n",
- "
2
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
1
\n",
- "
8
\n",
- "
2
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
1
\n",
- "
6
\n",
- "
4
\n",
- "
\n",
- "
\n",
- "
...
\n",
- "
...
\n",
- "
...
\n",
- "
...
\n",
- "
...
\n",
- "
\n",
- "
\n",
- "
50
\n",
- "
6
\n",
- "
1
\n",
- "
5
\n",
- "
5
\n",
- "
\n",
- "
\n",
- "
7
\n",
- "
1
\n",
- "
5
\n",
- "
5
\n",
- "
\n",
- "
\n",
- "
8
\n",
- "
1
\n",
- "
5
\n",
- "
5
\n",
- "
\n",
- "
\n",
- "
9
\n",
- "
1
\n",
- "
5
\n",
- "
5
\n",
- "
\n",
- "
\n",
- "
10
\n",
- "
1
\n",
- "
5
\n",
- "
5
\n",
- "
\n",
- " \n",
- "
\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?"
+ "cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)"
]
}
],
diff --git a/01 Tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb b/01 Tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb
index 84ceb4d..61f4ce4 100644
--- a/01 Tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb
+++ b/01 Tutorials/robot-marbles-part-5/robot-marbles-part-5.ipynb
@@ -4,331 +4,7 @@
"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. "
+ "cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)"
]
}
],
@@ -348,7 +24,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.7"
+ "version": "3.6.5"
}
},
"nbformat": 4,
diff --git a/01 Tutorials/videos/README.md b/01 Tutorials/videos/README.md
new file mode 100644
index 0000000..b004bfa
--- /dev/null
+++ b/01 Tutorials/videos/README.md
@@ -0,0 +1 @@
+cadCAD is now open source! The tutorials have been moved to the [main repo](https://github.com/BlockScience/cadCAD)
\ No newline at end of file
diff --git a/README.md b/README.md
index 28fd1f8..2439e09 100644
--- a/README.md
+++ b/README.md
@@ -1,165 +1 @@
-cadCAD
-===
-```
- __________ ____
- ________ __ _____/ ____/ | / __ \
- / ___/ __` / __ / / / /| | / / / /
-/ /__/ /_/ / /_/ / /___/ ___ |/ /_/ /
-\___/\__,_/\__,_/\____/_/ |_/_____/
-by BlockScience
-```
-
-**Introduction:**
-
-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.
-
-**Description:**
-
-cadCAD (complex adaptive systems computer-aided design) is a python based, unified modeling framework for stochastic
-dynamical systems and differential games for research, validation, and Computer Aided Design of economic systems created
-by BlockScience. It is capable of modeling systems at all levels of abstraction from Agent Based Modeling (ABM) to
-System Dynamics (SD), and enabling smooth integration of computational social science simulations with empirical data
-science workflows.
-
-
-An economic system is treated as a state-based model and defined through a set of endogenous and exogenous state
-variables which are updated through mechanisms and environmental processes, respectively. Behavioral models, which may
-be deterministic or stochastic, provide the evolution of the system within the action space of the mechanisms.
-Mathematical formulations of these economic games treat agent utility as derived from the state rather than direct from
-an action, creating a rich, dynamic modeling framework. Simulations may be run with a range of initial conditions and
-parameters for states, behaviors, mechanisms, and environmental processes to understand and visualize network behavior
-under various conditions. Support for A/B testing policies, Monte Carlo analysis, and other common numerical methods is
-provided.
-
-
-In essence, cadCAD tool allows us to represent a company’s or community’s current business model along with a desired
-future state and helps make informed, rigorously tested decisions on how to get from today’s stage to the future state.
-It allows us to use code to solidify our conceptualized ideas and see if the outcome meets our expectations. We can
-iteratively refine our work until we have constructed a model that closely reflects reality at the start of the model,
-and see how it evolves. We can then use these results to inform business decisions.
-
-
-#### Documentation:
-* ##### [Tutorials](https://github.com/BlockScience/cadCAD-Tutorials/tree/master/01%20Tutorials)
-* ##### [System Model Configuration](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/Simulation_Configuration.md)
-* ##### [System Simulation Execution](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/Simulation_Execution.md)
-
-
-#### 0. Installation:
-
-cadCAD is in private beta. Access to a JupyterHUB instance (or tokens) are issued to participants. If you'd like to
-participate in the beta program, contact cadcad [at] block [dot] science.
-
-Replace `` in the installation URL below.
-```bash
-pip3 install pandas pathos fn funcy tabulate
-pip3 install cadCAD --extra-index-url https://@repo.fury.io/blockscience/
-```
-
-#### 1. [Configure System Model](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/Simulation_Configuration.md)
-
-#### 2. [Execute Simulations:](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/Simulation_Execution.md)
-
-##### Single Process Execution:
-Example System Model Configurations:
-* [System Model A](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_A.py):
-`/documentation/examples/sys_model_A.py`
-* [System Model B](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_B.py):
-`/documentation/examples/sys_model_B.py`
-
-Example Simulation Executions:
-* [System Model A](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_A_exec.py):
-`/documentation/examples/sys_model_A_exec.py`
-* [System Model B](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_B_exec.py):
-`/documentation/examples/sys_model_B_exec.py`
-
-```python
-import pandas as pd
-from tabulate import tabulate
-from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
-from documentation.examples import sys_model_A
-from cadCAD import configs
-
-exec_mode = ExecutionMode()
-
-# Single Process Execution using a Single System Model Configuration:
-# sys_model_A
-sys_model_A = [configs[0]] # sys_model_A
-single_proc_ctx = ExecutionContext(context=exec_mode.single_proc)
-sys_model_A_simulation = Executor(exec_context=single_proc_ctx, configs=sys_model_A)
-
-sys_model_A_raw_result, sys_model_A_tensor_field = sys_model_A_simulation.execute()
-sys_model_A_result = pd.DataFrame(sys_model_A_raw_result)
-print()
-print("Tensor Field: sys_model_A")
-print(tabulate(sys_model_A_tensor_field, headers='keys', tablefmt='psql'))
-print("Result: System Events DataFrame")
-print(tabulate(sys_model_A_result, headers='keys', tablefmt='psql'))
-print()
-```
-
-##### Multiple Simulations (Concurrent):
-###### Multiple Simulation Execution (Multi Process Execution)
-System Model Configurations:
-* [System Model A](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_A.py):
-`/documentation/examples/sys_model_A.py`
-* [System Model B](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_B.py):
-`/documentation/examples/sys_model_B.py`
-
-[Example Simulation Executions:](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/sys_model_AB_exec.py)
-`/documentation/examples/sys_model_AB_exec.py`
-
-```python
-import pandas as pd
-from tabulate import tabulate
-from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
-from documentation.examples import sys_model_A, sys_model_B
-from cadCAD import configs
-
-exec_mode = ExecutionMode()
-
-# # Multiple Processes Execution using Multiple System Model Configurations:
-# # sys_model_A & sys_model_B
-multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc)
-sys_model_AB_simulation = Executor(exec_context=multi_proc_ctx, configs=configs)
-
-i = 0
-config_names = ['sys_model_A', 'sys_model_B']
-for sys_model_AB_raw_result, sys_model_AB_tensor_field in sys_model_AB_simulation.execute():
- sys_model_AB_result = pd.DataFrame(sys_model_AB_raw_result)
- print()
- print(f"Tensor Field: {config_names[i]}")
- print(tabulate(sys_model_AB_tensor_field, headers='keys', tablefmt='psql'))
- print("Result: System Events DataFrame:")
- print(tabulate(sys_model_AB_result, headers='keys', tablefmt='psql'))
- print()
- i += 1
-```
-
-##### Parameter Sweep Simulation (Concurrent):
-[Example:](https://github.com/BlockScience/cadCAD-Tutorials/blob/master/documentation/examples/param_sweep.py)
-`/documentation/examples/param_sweep.py`
-
-```python
-import pandas as pd
-from tabulate import tabulate
-# The following imports NEED to be in the exact order
-from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
-from documentation.examples import param_sweep
-from cadCAD import configs
-
-exec_mode = ExecutionMode()
-multi_proc_ctx = ExecutionContext(context=exec_mode.multi_proc)
-run = Executor(exec_context=multi_proc_ctx, configs=configs)
-
-for raw_result, tensor_field in run.execute():
- result = pd.DataFrame(raw_result)
- print()
- print("Tensor Field:")
- print(tabulate(tensor_field, headers='keys', tablefmt='psql'))
- print("Output:")
- print(tabulate(result, headers='keys', tablefmt='psql'))
- print()
-```
+cadCAD is now [open source](https://github.com/BlockScience/cadCAD)
\ No newline at end of file