cadCAD/tutorials/videos/robot-marbles-part-5/robot-marbles-part-5.ipynb

318 lines
84 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# cadCAD Template: Robot and the Marbles - Part 5\n",
"\n",
"![](images/Overview.png)\n",
"![](images/Mech1.png)\n",
"\n",
"To expand upon our previous examples, we will introduce the concept of using a graph network object that is updated during each state update. The ability to essential embed a graph 'database' into a state is a game changer for scalability, allowing increased complexity with multiple agents or components is represented, easily updated. Below, building upon our previous examples, we will represent the Robots and Marbles example with n boxes, and a variable number of marbles.\n",
"\n",
"## Behavior and Mechanisms:\n",
"* A network of robotic arms is capable of taking a marble from their one of their boxes and dropping it into the other one.\n",
"* Each robotic arm in the network only controls two boxes and they act by moving a marble from one box to the other.\n",
"* Each robotic arm is programmed to take one marble at a time from the box containing the most significant number of marbles and drop it in the other box. It repeats that process until the boxes contain an equal number of marbles.\n",
"* For our analysis of this system, suppose we are only interested in monitoring the number of marbles in only their two boxes."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from cadCAD.engine import ExecutionMode, ExecutionContext, Executor\n",
"from cadCAD.configuration import Configuration\n",
"import networkx as nx\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"#from copy import deepcopy\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# define global variables\n",
"T = 25 #iterations in our simulation\n",
"boxes=5 #number of boxes in our network\n",
"m= 2 #for barabasi graph type number of edges is (n-2)*m\n",
"\n",
"# Settings of general simulation parameters, unrelated to the system itself\n",
"# `T` is a range with the number of discrete units of time the simulation will run for;\n",
"# `N` is the number of times the simulation will be run (Monte Carlo runs)\n",
"simulation_parameters = {\n",
" 'T': range(T),\n",
" 'N': 1,\n",
" 'M': {}\n",
"}\n",
"\n",
"# We create a BarabásiAlbert graph and then fill the 5 boxes with between 1 and 10 balls.\n",
"# create graph object with the number of boxes as nodes\n",
"network = nx.barabasi_albert_graph(boxes, m)\n",
"\n",
"# add balls to box nodes\n",
"for node in network.nodes:\n",
" network.nodes[node]['balls'] = np.random.randint(1,10)\n",
" \n",
" \n",
"\n",
"#Behavior: node by edge dimensional operator\n",
"#input the states of the boxes output the deltas along the edges\n",
"\n",
"# We specify the robotic networks logic in a Policy/Behavior Function\n",
"# unlike previous examples our policy controls a vector valued action, defined over the edges of our network\n",
"def robotic_network(params, step, sL, s):\n",
" network = s['network']\n",
" delta_balls = {}\n",
" for e in network.edges:\n",
" src = e[0]\n",
" dst = e[1]\n",
" #transfer one ball across the edge in the direction of more balls to less\n",
" delta_balls[e] = np.sign(network.nodes[src]['balls']-network.nodes[dst]['balls'])\n",
" return({'delta': delta_balls}) \n",
" \n",
"\n",
"#mechanism: edge by node dimensional operator\n",
"#input the deltas along the edges and update the boxes\n",
"\n",
"# We make the state update functions less \"intelligent\",\n",
"# ie. they simply add the number of marbles specified in _input \n",
"# (which, per the policy function definition, may be negative)\n",
"\n",
"def update_network(params, step, sL, s, _input):\n",
" network = s['network'] #deepcopy(s['network']) \n",
" delta_balls = _input['delta']\n",
" for e in network.edges:\n",
" move_ball = delta_balls[e]\n",
" src = e[0]\n",
" dst = e[1]\n",
" if (network.nodes[src]['balls'] >= move_ball) and (network.nodes[dst]['balls'] >= -move_ball):\n",
" network.nodes[src]['balls'] = network.nodes[src]['balls']-move_ball\n",
" network.nodes[dst]['balls'] = network.nodes[dst]['balls']+move_ball\n",
" \n",
" return ('network', network)\n",
"\n",
" \n",
"# we initialize the cadCAD state as a network object\n",
"initial_conditions = {'network':network}\n",
"\n",
"\n",
"# wire up the mechanisms and states\n",
"partial_state_update_blocks = [\n",
" { \n",
" 'policies': { # The following policy functions will be evaluated and their returns will be passed to the state update functions\n",
" 'action': robotic_network\n",
" },\n",
" 'variables': { # The following state variables will be updated simultaneously\n",
" 'network': update_network\n",
" \n",
" }\n",
" }\n",
"]\n",
"\n",
"\n",
"# The configurations above are then packaged into a `Configuration` object\n",
"config = Configuration(initial_state=initial_conditions, #dict containing variable names and initial values\n",
" partial_state_update_blocks=partial_state_update_blocks, #dict containing state update functions\n",
" sim_config=simulation_parameters #dict containing simulation parameters\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we will plot the network of boxes and with their labels showing how many balls are in each box."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/local/lib/python3.7/site-packages/networkx/drawing/nx_pylab.py:579: MatplotlibDeprecationWarning: \n",
"The iterable function was deprecated in Matplotlib 3.1 and will be removed in 3.3. Use np.iterable instead.\n",
" if not cb.iterable(width):\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot of boxes and balls\n",
"nx.draw_kamada_kawai(network,labels=nx.get_node_attributes(network,'balls'))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single_proc: [<cadCAD.configuration.Configuration object at 0x11a8c1828>]\n",
"[<cadCAD.configuration.Configuration object at 0x11a8c1828>]\n"
]
}
],
"source": [
"# Run the simulations\n",
"exec_mode = ExecutionMode()\n",
"exec_context = ExecutionContext(exec_mode.single_proc)\n",
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
"raw_result, tensor = executor.execute() # The `execute()` method returns a tuple; its first elements contains the raw results\n",
"df = pd.DataFrame(raw_result)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We create some helper functions to extract the networkx graph object from the Pandas dataframe and plot it."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"#NetworkX helper functions\n",
"def get_nodes(g):\n",
" return [node for node in g.nodes if g.nodes[node]]\n",
"\n",
"\n",
"def pad(vec, length,fill=True):\n",
" if fill:\n",
" padded = np.zeros(length,)\n",
" else:\n",
" padded = np.empty(length,)\n",
" padded[:] = np.nan\n",
" \n",
" for i in range(len(vec)):\n",
" padded[i]= vec[i]\n",
" \n",
" return padded\n",
"\n",
"def make2D(key, data, fill=False):\n",
" maxL = data[key].apply(len).max()\n",
" newkey = 'padded_'+key\n",
" data[newkey] = data[key].apply(lambda x: pad(x,maxL,fill))\n",
" reshaped = np.array([a for a in data[newkey].values])\n",
" \n",
" return reshaped"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using our helper function get_nodes() we pull out the boxes ball quantity and save it to a new dataframe column."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"df['Balls'] = df.network.apply(lambda g: np.array([g.nodes[j]['balls'] for j in get_nodes(g)]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next we will plot the number of balls in each box over the simulation time period. We can see an oscillation occurs never reaching an equilibrium due to the uneven nature of the boxes and balls."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x11ce29320>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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yUht6yZKadoTgYni6caNG9m7dy8LFiwAYGhoiAULFuQyTHp4i0BK+Zb59453vEOeCHr+8KDcvniJTO7efUJ0piq2b98+2V2Q1dXVub937NghI5GITKfT8p577pEf+MAHZDqdlsePH5dz586VR48elalUSp511lny2WeflTfeeKO85ZZbLOmm02n5rne9S0op5fve9z7Z29tred28efNkZ2en8wObREw2T/P7kI+3wrybygBelTYydYpp8KN54SsXLpzk3niwwmSlC/7pT3/KzTffTEdHB6tWreLSSy/NvSx8u2OyeOrhrY8pkS5YR+rYcfZeeCEzvvV/abruOgd7NjXgpW31MBnw5p27mPLpgnUEpkURwSBp70WrBw8ePEwtAS98PgKzZzHiuUp68ODBw9QS8KDK93mukh48ePAwBQV8YPZsLx+NBw8ePDAFBXxFczOZWIxsMjnZXfHgwYOHScWUE/C5tMHtRye5Jx48ePAwuXBVwAshGoQQdwshdgohdgghznOzPfAKf7zVMVmpba+//noWL17MihUruOGGG0ilUo6268HDWxFua/A/ATZIKZcALcAOl9vzCn+8xTFZqW2vv/56du7cyZYtW0gkElMmyMmDh2JwTcALIeqBC4BfAUgpR6SUPY43NDIET34X9jwKQGD6dAgEJlWDjyVi3LP7HtfoSym5c9edxBNx19oYTA0ymBp0jX46m6Y91u5qatsPXfohfv6LnwNw6aWXIoRACME555zD4cOHT3gMQ6khBkaczR5pRCabIZ6I42YwYs9wDyOZEdfoJ9IJkmn33ocl00n+a9t/kc6mXWtjw4EN7O/d7xr9hw88zK0bb3WFtpupCk4FOoHbhBAtwGvAl6SUJqkhhPhL4C8B5s6dO/ZWApWw8XfQvhEW/hkiECA4c+akavD3772fH7/+Yy485UKi4ajj9DsGO/jOi98hkU7wyeWfHBeN77/8fXZ27bT9PZlOIpGEA+GyaS5pWsLXzvla0Wv0sPrBxCAdRzt45LFHAOdT2375y1/mpp/dxLSqaabrUqkUv/3tb/nJT35S9rjs0JnoZCQzwsIKd9Ji9I/00zHYQVWwakzPoVxkZZYj/UeIhCPMrC7kqROIJWL0Dve6Qhvg2SPPcsurt7A8upx3zHiH4/SllPyfZ/8PVy28im+e+03H6QM8c/gZXul4hc+f8XnH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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(df.timestep,make2D('Balls', df))\n",
"plt.title('Number of balls in boxes over simulation period')\n",
"plt.ylabel('Qty')\n",
"plt.xlabel('Iteration')\n",
"plt.legend(['Box #'+str(node) for node in range(boxes)], ncol = 2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In summary, we created a graph network of boxes and robotic arms to transfer balls between the boxes, striving for an unachievable equilibrium state. The ability to embed a graph, virtually a graph database, into a cadCAD state allows for tremendous scalability and flexibility as a modeling tool."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}