{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reading in the simulation data\n",
    "Simulation data for every trial was stored in a .sav-file, which is a pickle file created directly from python after each run.\n",
    "Besides the .sav-file, there is also a .json file which contains the same information as the .sav-file, but Python is not necessarily needed to read the results.\n",
    "\n",
    "This Notebook will show basics on how to get the data from the pickle-files."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Structure\n",
    "The folder following folders are important:\n",
    "- 30s Trials\n",
    "- 1800s Trials\n",
    "- 1800s Trials interrupted\n",
    "- Fluid Model\n",
    "- Volumeflow Demand\n",
    "\n",
    "The abbreviations are as followed:\n",
    "- MPC: Model Predictive Control\n",
    "- DMPC: Decentralized Model Predictive Control\n",
    "- MADRL: Multi-Agent Reinforcement Learning\n",
    "- MM: Market Mechanism"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Import libraries\n",
    "First, necessary libraries (Pickle, os and numpy) will be imported"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "import numpy as np\n",
    "import os"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Specify the path to the file you want to load."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "sav_path = \"./30s_Trials/DMPC_NN_3iter/complete_dict.sav\"\n",
    "sav_path = os.path.normpath(sav_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(sav_path, 'rb') as pickle_file:\n",
    "    data = pickle.load(pickle_file)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pickle Content\n",
    "After loading the dict, you can see it has several keys.\n",
    "'Mas_history' describes the history of the global parameters (see later), 'agent_histories' the data of the agents. 'Agent_names' defines the names of the agents in a list."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['mas_history', 'agent_histories', 'agent_names', 'pump_idx', 'valve_idx', 'agents_ls', 'agents_color', 'last_time', 'agents_observed_states', 'agents_names'])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'pump_idx' and 'valve_idx' specify which agent is a pump and which a valve:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([0, 1], [2, 3, 4, 5, 6])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['pump_idx'], data['valve_idx']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'agents_ls' and 'agents_color' give each agent a linestyle and a color to reproduce the exact plots every time:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(['--', '--', '-', '-', '-', '-', '-'],\n",
       " [(0, 0.31, 0.45),\n",
       "  (0.91, 0.31, 0.24),\n",
       "  (0.69, 0.8, 0.31),\n",
       "  (0.93, 0.48, 0.2),\n",
       "  (0.31, 0.71, 0.58),\n",
       "  (0.54, 0.54, 0.54),\n",
       "  (0.99, 0.79, 0)])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['agents_ls'], data['agents_color']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### IMPORTANT\n",
    "'last_time', 'agents_observed_states' and 'agents_names' were only used by the Python code used for simulating and can be ignored."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## MAS History\n",
    "In the MAS History, global reward and computation time are stored. Global reward is the cummulative reward from all agents. Computation time is the time recorded after that computation step with ```time.time()```.\n",
    "\n",
    "All other values can be ignored!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['global_reward', 'computation_time', 'pred_costs', 't_agents', 'v_users', 'pred_states', 'failure_reward'])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['mas_history'].keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Agent Histories\n",
    "Each agent has a history recored, which are dicts. Access the dict with the agent index:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['states', 'actions', 'rewards', 'time', 'pred_costs', 'pred_states'])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['agent_histories'][0].keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "States are the recorded output values, actions the input values, rewards the calculated rewards (or inversed costs).\n",
    "Time gives a time stamp to each value.\n",
    "\n",
    "'Pred_costs' and 'Pred_states' can be ignored."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Agent states\n",
    "For the pumps, the agent states are volumeflow in m³/h, pressure in Pa and energy consumption in W.\n",
    "\n",
    "For MPC and DMPC, only the volumeflow and the energy consumption was recorded.\n",
    "The first index is the volumeflow, the second is the pressure (if available) and the last one is the energy consumption."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-0.0036296803637896322, 12.086200031874975]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['agent_histories'][0]['states'][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the valves, the agent states are volumeflow in m³/h and pressure in Pa.\n",
    "\n",
    "For MPC and DMPC, only the volumeflow was recorded.\n",
    "The first index is the volumeflow and the second is the pressure (if available)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[-4.928767877908684e-13]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['agent_histories'][2]['states'][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Better handling can be achieved when using numpy. Here you can see the shape of the agents state values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1201, 1)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(data['agent_histories'][2]['states']).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example\n",
    "Here is an example of how to plot the first valves volumeflow. For better data handling, numpy will also be used."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "valve_idx = data['valve_idx'][0]\n",
    "valve_name = data['agents_names'][valve_idx]\n",
    "valve_history = data['agent_histories'][valve_idx]\n",
    "valve_time = np.array(valve_history['time'])\n",
    "valve_volumeflow = np.array(valve_history['states'])[:,0]\n",
    "ls = data['agents_ls'][valve_idx]\n",
    "c = data['agents_color'][valve_idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(valve_time, valve_volumeflow, ls=ls, color=c)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7.7 ('ec-debug')",
   "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.7"
  },
  "vscode": {
   "interpreter": {
    "hash": "4c40ef0c25bf27f8be95f0ac8332cf60ad9454a983a296b4f2649f7d7dde0187"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
