cadCAD/demos/simple_tracker.ipynb

528 lines
66 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SIMCad Demos: Simple Tracker"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Configuration\n",
"We begin with a simple configuration file that only defines a single exogenous state: a sinusoidal `signal`"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# SimCAD related imports\n",
"from datetime import timedelta\n",
"from SimCAD.configuration import Configuration\n",
"from SimCAD.configuration.utils import exo_update_per_ts, ep_time_step\n",
"\n",
"# System specific imports\n",
"import numpy as np\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# List of all the states in the system and their initial conditions\n",
"# In the current version of SimCAD, `timestamp` is mandatory\n",
"# The `signal` state is the exogenous state that we'll model\n",
"initial_conditions = {\n",
" 'signal': float(0),\n",
" 'timestamp': '2018-01-01 00:00:00'\n",
"}\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# Definitions of functions that update the exogenous states\n",
"# Functions must return a tuple containing the name of the state being updated and its new value\n",
"# For now, ignore all the arguments passed to the function, except `s`, \n",
"# which contains a copy of the current values of all the states\n",
"\n",
"# Definition of the function that updates the `timestamp` state\n",
"# In the current version of SimCAD, `timestamp` is a mandatory state\n",
"ts_format = '%Y-%m-%d %H:%M:%S'\n",
"t_delta = timedelta(days=0, minutes=0, seconds=1) # In this example, a time_step is defined as 1 second. The user can change this\n",
"def time_model(step, sL, s, _input):\n",
" y = 'timestamp'\n",
" x = ep_time_step(s, dt_str=s['timestamp'], fromat_str=ts_format, _timedelta=t_delta)\n",
" return (y, x)\n",
"\n",
"# Definition of the function that updates the `signal` state\n",
"# It's a simple sine wave with amplitude 1 and period 50 time_steps\n",
"period = 50\n",
"def sinusoid(step, sL, s, _input):\n",
" y = 'signal'\n",
" x = s['time_step']\n",
" x = np.sin(x * 2 * np.pi / period)\n",
" return (y, x)\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# This maps the exogenous states to their corresponding updating functions\n",
"exogenous_states = exo_update_per_ts(\n",
" {\n",
" 'signal': sinusoid, # The `signal` state is updated by the `sinusoid` function defined above\n",
" 'timestamp': time_model # The `timestamp` state is updated by the `time_model` function defined above\n",
" }\n",
")\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# Settings of general simulation parameters, unrelated to the system itself\n",
"# `T` is the number of discrete units of time the simulation will run for\n",
"# `N` is the number of times the simulation will be run\n",
"# In this example, we'll run the simulation once (N=1) and its duration will be of 50 discrete units of time\n",
"sim_config = {\n",
" 'T': range(50),\n",
" 'N': 1\n",
"}\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"\n",
"# We'll ignore these components of the configuration for now\n",
"env_processes = {}\n",
"seeds = {}\n",
"mechanisms = {}\n",
"\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# The configurations above are then packaged into a `Configuration` object\n",
"config = Configuration(sim_config=sim_config,\n",
" state_dict=initial_conditions,\n",
" seed=seeds,\n",
" exogenous_states=exogenous_states,\n",
" env_processes=env_processes,\n",
" mechanisms=mechanisms)"
]
},
{
"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 `main()` method of the Executor object, which returns the results of the experiment in the first element of a tuple."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single_proc: [<SimCAD.configuration.Configuration object at 0x10e17e160>]\n"
]
}
],
"source": [
"from SimCAD.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.main() # The `main()` 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": 3,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"count 5.100000e+01\n",
"mean -2.493893e-17\n",
"std 7.071068e-01\n",
"min -9.980267e-01\n",
"25% -6.845471e-01\n",
"50% 0.000000e+00\n",
"75% 6.845471e-01\n",
"max 9.980267e-01\n",
"Name: signal, dtype: float64"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import pandas as pd\n",
"df = pd.DataFrame(raw_result)\n",
"df.plot('timestamp', 'signal')\n",
"df['signal'].describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Modelling Internal States, Mechanisms and User Behavior\n",
"Let's now suppose we want to design a system with which an agent will interact with the intent of replicating the value of the previously defined `signal` in an internal state. The agent can read the current value of the `signal` and the current value of the internal state. And they can add or subtract any amount from the internal state."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First we redefine the `initial_conditions` object in order to add the internal state, which will call `follow`"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# List of all the states in the system and their initial conditions\n",
"# In the current version of SimCAD, `timestamp` is mandatory\n",
"# The `signal` state is the exogenous state that we'll model\n",
"initial_conditions = {\n",
" 'follow': float(1),\n",
" 'signal': float(0),\n",
" 'timestamp': '2018-01-01 00:00:00'\n",
"}\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, define the function that updates the `follow` state. As defined above, all it does is add or subtract an amount from the state."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# Definitions of functions that update internal states\n",
"# These functions must return a tuple containing the name of the state being updated and its new value\n",
"# As with the exogenous state update functions, the `s` argument contains a copy of the current values of all the states\n",
"# The argument `_input` contains a dictionary of inputs passed to the mechanisms by agents interacting with it \n",
"\n",
"#momentum term limiting my following\n",
"theta = .2 \n",
"\n",
"# Definition of the function that updates the `follow` state\n",
"def add(step, sL, s, _input):\n",
" y = 'follow'\n",
" x = (s['follow'] + _input['value'])*(1-theta)+ theta*s['follow']+.01*np.random.randn() # All the state update function does is add to the `follow` state the `value` passed to it\n",
" return (y, x)\n",
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The policies of the agents that interact with the system through `mechanisms` are modelled as `BEHAVIORS`. In this example, we are modelling a simple behavior in which the agent reads the current state of the exogenous `signal` and of the internal state `follow` and compares them. The `return value` of the behavior function will be passed by the SimCAD engine as the `_input` argument of the mechanism"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # \n",
"# Definitions of the Behavioral Models (or Behaviors for short) - functions that convey some information to mechanisms\n",
"# Behaviors must return a dictionary containing whatever information they should pass to the mechanism they relate to\n",
"# As with the state update functions, the `s` argument contains a copy of the current values of all the states\n",
"\n",
"# Definition of the `tracker` behavior\n",
"def tracker(step, sL, s):\n",
" currentSignal = s['signal'] # Read the current state of the exogenous `signal`\n",
" currentFollow = s['follow'] # Read the current state of the internal state `follow`\n",
" diff = currentSignal - currentFollow # Compare the two\n",
" return {'value': diff} # Return the difference between them"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, we map mechanisms to states and behaviors. In our example, we define that a mechanism called `simple_mechanism` updates the `follow` state through the `add` function, driven by the `tracker` behavior."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"mechanisms = {\n",
" 'simple_mechanism': { # The name of the mechanism; can be anything\n",
" 'behaviors': { # Dictionary of behavioral models related to this mechanism\n",
" 'behavior_group_1': tracker # The name of the behavior (key), followed by the function that defines it\n",
" },\n",
" 'states': { # Dictionary of states updated by this mechanism\n",
" 'follow': add # The name of the state (key) followed by the function that updates it\n",
" }\n",
" }\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Running the engine\n",
"We can now recreate the Configuration object and rerun the experiment with the expanded configurations"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single_proc: [<SimCAD.configuration.Configuration object at 0x10fe77eb8>]\n"
]
}
],
"source": [
"config = Configuration(sim_config=sim_config,\n",
" state_dict=initial_conditions,\n",
" seed=seeds,\n",
" exogenous_states=exogenous_states,\n",
" env_processes=env_processes,\n",
" mechanisms=mechanisms)\n",
"executor = Executor(exec_context, [config]) # Pass the configuration object inside an array\n",
"raw_result, tensor = executor.main() # The `main()` method returns a tuple; its first elements contains the raw results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Analyzing the results\n",
"And again we convert the raw results into a DataFrame for analysis"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>signal</th>\n",
" <th>follow</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>5.100000e+01</td>\n",
" <td>51.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>-2.493893e-17</td>\n",
" <td>0.024362</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>7.071068e-01</td>\n",
" <td>0.719889</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>-9.980267e-01</td>\n",
" <td>-1.008295</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>-6.845471e-01</td>\n",
" <td>-0.683094</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.000000e+00</td>\n",
" <td>0.131055</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>6.845471e-01</td>\n",
" <td>0.722606</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>9.980267e-01</td>\n",
" <td>1.013597</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" signal follow\n",
"count 5.100000e+01 51.000000\n",
"mean -2.493893e-17 0.024362\n",
"std 7.071068e-01 0.719889\n",
"min -9.980267e-01 -1.008295\n",
"25% -6.845471e-01 -0.683094\n",
"50% 0.000000e+00 0.131055\n",
"75% 6.845471e-01 0.722606\n",
"max 9.980267e-01 1.013597"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import pandas as pd\n",
"df = pd.DataFrame(raw_result)\n",
"df.plot('timestamp', ['signal','follow'])\n",
"df[['signal','follow']].describe()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"df[\"error\"]= df.follow-df.signal"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x120aab2b0>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.error.hist()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"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
}