ROS-Dynamic-Executor-Experi.../analysis/analysis.ipynb

303 lines
58 KiB
Text
Raw Normal View History

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import json\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from dataclasses import dataclass\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"this_dir = os.path.dirname(os.path.abspath(''))\n",
"# results is in \"../results\"\n",
"results_dir = os.path.join(this_dir, \"results\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"experiment_folder = \"casestudy_example\"\n",
"experiment_name = \"cs_example_edf\"\n",
"\n",
"experiment_file = os.path.join(results_dir, experiment_folder, experiment_name + \".json\")\n",
"if not os.path.exists(experiment_file):\n",
" print(\"Experiment file not found: \", experiment_file)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"with open(experiment_file) as f:\n",
" experiment_data_raw = json.load(f)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of records: 11799\n",
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'node_0', 'count': 500, 'next_release_us': 99881}, 'time': 0.0001}\n",
"Operation types: ['get_next_executable', 'next_deadline', 'wait_for_work', 'start_work', 'end_work']\n"
]
}
],
"source": [
"def pre_process_data(data):\n",
" for record in data:\n",
" record[\"time\"] = int(record[\"time\"])\n",
"\n",
" min_time = min([record[\"time\"] for record in data])\n",
" for record in data:\n",
" record[\"time\"] -= min_time\n",
" record[\"time\"] /= (1000 * 1000)\n",
"\n",
" if record[\"entry\"][\"operation\"] == \"next_deadline\":\n",
" #print(\"Record: \", record)\n",
" record[\"entry\"][\"deadline\"] = int(record[\"entry\"][\"deadline\"])\n",
" record[\"entry\"][\"deadline\"] -= min_time\n",
" record[\"entry\"][\"deadline\"] /= (1000 * 1000)\n",
"\n",
" # data = sorted(data, key=lambda x: x[\"time\"])\n",
" return data\n",
"\n",
"experiment_data = pre_process_data(experiment_data_raw)\n",
"\n",
"print(\"Number of records: \", len(experiment_data))\n",
"print(\"First record: \", experiment_data[0])\n",
"operation_types = list(set([record[\"entry\"][\"operation\"] for record in experiment_data]))\n",
"print(\"Operation types: \", operation_types)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"@dataclass\n",
"class Record:\n",
" start_time: float\n",
" end_time: float\n",
" node_name: str\n",
"\n",
"@dataclass\n",
"class RecordLine:\n",
" node_name: str\n",
" count: int\n",
"\n",
" def __eq__(self, other):\n",
" return self.node_name == other.node_name and self.count == other.count\n",
"\n",
" def __hash__(self):\n",
" return hash((self.node_name, self.count))\n",
"\n",
"def get_records(data) -> list[Record]:\n",
" # used to match start_work and end_work records\n",
" current_records: dict[RecordLine, Record] = {}\n",
" records = []\n",
" for record in data:\n",
" if record[\"entry\"][\"operation\"] == \"start_work\":\n",
" current_record = Record(start_time=record[\"time\"], node_name=record[\"entry\"][\"node\"], end_time=None)\n",
" current_record_line = RecordLine(node_name=record[\"entry\"][\"node\"], count=record[\"entry\"][\"count\"])\n",
" if current_record_line in current_records:\n",
" raise Exception(\"Overlapping records\")\n",
" current_records[current_record_line] = current_record\n",
" elif record[\"entry\"][\"operation\"] == \"end_work\":\n",
" current_record_line = RecordLine(node_name=record[\"entry\"][\"node\"], count=record[\"entry\"][\"count\"])\n",
" if current_record_line not in current_records:\n",
" raise Exception(\"No start record\")\n",
" current_record = current_records[current_record_line]\n",
" current_record.end_time = record[\"time\"]\n",
" records.append(current_record)\n",
" del current_records[current_record_line]\n",
" return records\n",
"\n",
"records = get_records(experiment_data)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of nodes: 4\n"
]
}
],
"source": [
"num_nodes = len(set([record.node_name for record in records]))\n",
"print(\"Number of nodes: \", num_nodes)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "020847cef8dc4d5dbb6e2e7ce53ffb31",
"version_major": 2,
"version_minor": 0
},
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJHVJREFUeJzt3X9w1/V9wPHXlx8GBJIYnSGZ0YLYAl7QThRRT7DmXNju5NauoT3OH7toJ27F1lWsdwOCxWjVXtlp3RQ6xTs2ZTdv3tnebHQt63UQxcmqkPY0UKGlwCqSqC3xRz77w+M7UgGDfL/fJLwfj7vvkW++7+/n/f688z3yvE/4hlyWZVkAAJCMYQO9AAAASksAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZsRAL2Ao6+3tjZ07d8a4ceMil8sN9HIAgH7IsizefPPNqK2tjWHD0rwWJgCPwc6dO6Ourm6glwEAfAw7duyI0047baCXMSAE4DEYN25cRHzwAiovLx/g1QAA/dHd3R11dXX57+MpEoDH4MCPfcvLywUgAAwxKf/zrTR/8A0AkDABCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBOATkcoUZ09/xH3WsXO7/x/Rn7LGs5WjHlHK+Qh7LfP3n9WK+YhyrUMcZjK/P/hqMXz+KRwACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJGbIBGBLS0uce+65A70MAIAhb8gEYKHdcccdcdFFF8WJJ54YlZWVA70cAICSSTYA33nnnfj85z8fCxYsGOilAACUVFECcPbs2bFw4cJYtGhRVFVVxfjx46OlpSX/+Pbt22Pu3LkxduzYKC8vj6ampti9e3efY9x1111RXV0d48aNi+bm5ti/f/+H5lm1alVMmTIlRo0aFZMnT44HHnig32tctmxZfPWrX436+vqPfZ4AAENR0a4Arl69OsaMGRPt7e1x9913x+233x5tbW3R29sbc+fOjb1798a6deuira0ttm7dGvPmzcs/d+3atdHS0hKtra2xcePGqKmp+VDcrVmzJpYsWRJ33HFHdHR0RGtrayxevDhWr15drFMCADgujCjWgadNmxZLly6NiIizzjor7r///nj22WcjIuKll16Kbdu2RV1dXUREPProo3H22WfH888/H+eff36sWLEimpubo7m5OSIili9fHs8880yfq4BLly6Nb33rW/HZz342IiImTJgQW7ZsiQcffDCuueaaopxTT09P9PT05O93d3cXZR4AgGIq2hXAadOm9blfU1MTe/bsiY6Ojqirq8vHX0TE1KlTo7KyMjo6OiIioqOjI2bMmNHn+TNnzsx//Pbbb0dnZ2c0NzfH2LFj87fly5dHZ2dnsU4p7rzzzqioqMjfDj4HAIChomhXAEeOHNnnfi6Xi97e3oIc+6233oqIiJUrV34oFIcPH16QOQ7ltttui5tvvjl/v7u7WwQCAENO0QLwcKZMmRI7duyIHTt25ONpy5YtsW/fvpg6dWp+THt7e1x99dX5523YsCH/cXV1ddTW1sbWrVtj/vz5JVt7WVlZlJWVlWw+AIBiKHkANjQ0RH19fcyfPz9WrFgR7733Xtx4440xa9asmD59ekRE3HTTTXHttdfG9OnT4+KLL441a9bE5s2bY+LEifnjLFu2LBYuXBgVFRXR2NgYPT09sXHjxnjjjTf6XKU7nO3bt8fevXtj+/bt8f7778emTZsiImLSpEkxduzYopw7AMBgUPIAzOVy8eSTT8aXv/zluPTSS2PYsGHR2NgY9913X37MvHnzorOzMxYtWhT79++Pz33uc7FgwYJ4+umn82Ouu+66OPHEE+Oee+6JW265JcaMGRP19fXxla98pV/rWLJkSZ93DH/605+OiIgf/vCHMXv27IKcKwDAYJTLsiwb6EUMVd3d3VFRURFdXV1RXl5etHlyuYiP+ir1Z0x/x3/UsXK5D/7Msv6NLcTa+zvmwLpKMV8hj2W+/vN6MV8xjlWIuQq5pkK+PvtrMH79iqVU378Hs2T/JxAAgFQdlwHY2tra59fDHHybM2fOQC8PAGBAlfzfAJbCDTfcEE1NTYd8bPTo0SVeDQDA4HJcBmBVVVVUVVUN9DIAAAal4/JHwAAAHJ4ABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMyIgV4AHy3LCjOmv+M/6lgHP340YwfDmMF6LPP131Ddg0Iey3yFP1ahjjMY96C/hvLaOXquAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgAOYrncB7djHXPwuCON7e98/VGotR/N+ZVqTYU8lvkGbr5SramQxzJf6ecbjGsqxnyl3s9C7QMfnwAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMyQCcCWlpY499xzB3oZAABD3pAJwEL6xS9+Ec3NzTFhwoQYPXp0nHnmmbF06dJ45513BnppAABFN2KgFzAQfvazn0Vvb288+OCDMWnSpHj55Zfj+uuvj7fffjvuvffegV4eAEBRFeUK4OzZs2PhwoWxaNGiqKqqivHjx0dLS0v+8e3bt8fcuXNj7NixUV5eHk1NTbF79+4+x7jrrruiuro6xo0bF83NzbF///4PzbNq1aqYMmVKjBo1KiZPnhwPPPBAv9bX2NgYDz/8cFxxxRUxceLEuPLKK+NrX/taPPHEE8d03gAAQ0HRfgS8evXqGDNmTLS3t8fdd98dt99+e7S1tUVvb2/MnTs39u7dG+vWrYu2trbYunVrzJs3L//ctWvXRktLS7S2tsbGjRujpqbmQ3G3Zs2aWLJkSdxxxx3R0dERra2tsXjx4li9evXHWm9XV1dUVVUdcUxPT090d3f3uQEADDlZEcyaNSu75JJL+nzu/PPPz2699dbsBz/4QTZ8+PBs+/bt+cc2b96cRUT23HPPZVmWZTNnzsxuvPHGPs+fMWNGds455+Tvn3nmmdk//dM/9RnzjW98I5s5c+ZRr/eVV17JysvLs4ceeuiI45YuXZpFxIduXV1dRz1nf0R8cDvWMQePO9LY/s7XH4Va+9GcX6nWVMhjmW/g5ivVmgp5LPOVfr7BuKZizFfq/SzUPnxcXV1dRf3+PRQU7QrgtGnT+tyvqamJPXv2REdHR9TV1UVdXV3+salTp0ZlZWV0dHRERERHR0fMmDGjz/N
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
" <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJHVJREFUeJzt3X9w1/V9wPHXlx8GBJIYnSGZ0YLYAl7QThRRT7DmXNju5NauoT3OH7toJ27F1lWsdwOCxWjVXtlp3RQ6xTs2ZTdv3tnebHQt63UQxcmqkPY0UKGlwCqSqC3xRz77w+M7UgGDfL/fJLwfj7vvkW++7+/n/f688z3yvE/4hlyWZVkAAJCMYQO9AAAASksAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZsRAL2Ao6+3tjZ07d8a4ceMil8sN9HIAgH7IsizefPPNqK2tjWHD0rwWJgCPwc6dO6Ourm6glwEAfAw7duyI0047baCXMSAE4DEYN25cRHzwAiovLx/g1QAA/dHd3R11dXX57+MpEoDH4MCPfcvLywUgAAwxKf/zrTR/8A0AkDABCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBOATkcoUZ09/xH3WsXO7/x/Rn7LGs5WjHlHK+Qh7LfP3n9WK+YhyrUMcZjK/P/hqMXz+KRwACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJGbIBGBLS0uce+65A70MAIAhb8gEYKHdcccdcdFFF8WJJ54YlZWVA70cAICSSTYA33nnnfj85z8fCxYsGOilAACUVFECcPbs2bFw4cJYtGhRVFVVxfjx46OlpSX/+Pbt22Pu3LkxduzYKC8vj6ampti9e3efY9x1111RXV0d48aNi+bm5ti/f/+H5lm1alVMmTIlRo0aFZMnT44HHnig32tctmxZfPWrX436+vqPfZ4AAENR0a4Arl69OsaMGRPt7e1x9913x+233x5tbW3R29sbc+fOjb1798a6deuira0ttm7dGvPmzcs/d+3atdHS0hKtra2xcePGqKmp+VDcrVmzJpYsWRJ33HFHdHR0RGtrayxevDhWr15drFMCADgujCjWgadNmxZLly6NiIizzjor7r///nj22WcjIuKll16Kbdu2RV1dXUREPProo3H22WfH888/H+eff36sWLEimpubo7m5OSIili9fHs8880yfq4BLly6Nb33rW/HZz342IiImTJgQW7ZsiQcffDCuueaaopxTT09P9PT05O93d3cXZR4AgGIq2hXAadOm9blfU1MTe/bsiY6Ojqirq8vHX0TE1KlTo7KyMjo6OiIioqOjI2bMmNHn+TNnzsx//Pbbb0dnZ2c0NzfH2LFj87fly5dHZ2dnsU4p7rzzzqioqMjfDj4HAIChomhXAEeOHNnnfi6Xi97e3oIc+6233oqIiJUrV34oFIcPH16QOQ7ltttui5tvvjl/v7u7WwQCAENO0QLwcKZMmRI7duyIHTt25ONpy5YtsW/fvpg6dWp+THt7e1x99dX5523YsCH/cXV1ddTW1sbWrVtj/vz5JVt7WVlZlJWVlWw+AIBiKHkANjQ0RH19fcyfPz9WrFgR7733Xtx4440xa9asmD59ekRE3HTTTXHttdfG9OnT4+KLL441a9bE5s2bY+LEifnjLFu2LBYuXBgVFRXR2NgYPT09sXHjxnjjjTf6XKU7nO3bt8fevXtj+/bt8f7778emTZsiImLSpEkxduzYopw7AMBgUPIAzOVy8eSTT8aXv/zluPTSS2PYsGHR2NgY9913X37MvHnzorOzMxYtWhT79++Pz33uc7FgwYJ4+umn82Ouu+66OPHEE+Oee+6JW265JcaMGRP19fXxla98pV/rWLJkSZ93DH/605+OiIgf/vCHMXv27IKcKwDAYJTLsiwb6EUMVd3d3VFRURFdXV1RXl5etHlyuYiP+ir1Z0x/x3/UsXK5D/7Msv6NLcTa+zvmwLpKMV8hj2W+/vN6MV8xjlWIuQq5pkK+PvtrMH79iqVU378Hs2T/JxAAgFQdlwHY2tra59fDHHybM2fOQC8PAGBAlfzfAJbCDTfcEE1NTYd8bPTo0SVeDQDA4HJcBmBVVVVUVVUN9DIAAAal4/JHwAAAHJ4ABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMyIgV4AHy3LCjOmv+M/6lgHP340YwfDmMF6LPP131Ddg0Iey3yFP1ahjjMY96C/hvLaOXquAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgAOYrncB7djHXPwuCON7e98/VGotR/N+ZVqTYU8lvkGbr5SramQxzJf6ecbjGsqxnyl3s9C7QMfnwAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMyQCcCWlpY499xzB3oZAABD3pAJwEL6xS9+Ec3NzTFhwoQYPXp0nHnmmbF06dJ45513BnppAABFN2KgFzAQfvazn0Vvb288+OCDMWnSpHj55Zfj+uuvj7fffjvuvffegV4eAEBRFeUK4OzZs2PhwoWxaNGiqKqqivHjx0dLS0v+8e3bt8fcuXNj7NixUV5eHk1NTbF79+4+x7jrrruiuro6xo0bF83NzbF///4PzbNq1aqYMmVKjBo1KiZPnhwPPPBAv9bX2NgYDz/8cFxxxRUxceLEuPLKK+NrX/taPPHEE8d03gAAQ0HRfgS8evXqGDNmTLS3t8fdd98dt99+e7S1tUVvb2/MnTs39u7dG+vWrYu2trbYunVrzJs3L//ctWvXRktLS7S2tsbGjRujpqbmQ3G3Zs2aWLJkSdxxxx3R0dERra2tsXjx4li9evXHWm9XV1dUVVUdcUxPT090d3f3uQEADDlZEcyaNSu75JJL+nzu/PPPz2699dbsBz/4QTZ8+PBs+/bt+cc2b96cRUT23HPPZVmWZTNnzsxuvPHGPs+fMWNGds455+Tvn3nmmdk//dM/9RnzjW98I5s5c+ZRr/eVV17JysvLs4ceeuiI45YuXZpFxIduXV1dRz1nf0R8cDvWMQePO9LY/s7XH4Va+9GcX6nWVMhjmW/g5ivVmgp5LPOVfr7BuKZizFfq/SzUPnxcXV1dRf3+PRQU7QrgtGnT+tyvqamJPXv2REdHR9TV1UV
" </div>\n",
" "
],
"text/plain": [
"Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib widget\n",
"\n",
"# swimlane plot\n",
"name_to_id = {name: i for i, name in enumerate(set([record.node_name for record in records]))}\n",
"fig, ax = plt.subplots()\n",
"for i, record in enumerate(records):\n",
" # ax.plot([record.start_time, record.end_time], [name_to_id[record.node_name], name_to_id[record.node_name]], label=record.node_name)\n",
" ax.broken_barh([(record.start_time, record.end_time - record.start_time)], (name_to_id[record.node_name] - 0.4, 0.8), facecolors='blue')\n",
"ax.set_yticks(range(num_nodes))\n",
"ax.set_yticklabels(name_to_id.keys())\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"@dataclass\n",
"class Deadline:\n",
" chain_id: int\n",
" deadline: float\n",
" on_time: bool\n",
"\n",
"def get_deadlines(data) -> list[Deadline]:\n",
" deadlines = []\n",
" for record in data:\n",
" if record[\"entry\"][\"operation\"] == \"next_deadline\" and \"on_time\" in record[\"entry\"]:\n",
" deadlines.append(Deadline(chain_id=record[\"entry\"][\"chain_id\"], deadline=record[\"entry\"][\"deadline\"], on_time=record[\"entry\"][\"on_time\"]))\n",
" return deadlines\n",
"\n",
"deadlines = get_deadlines(experiment_data)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5d212f9c6001419fb629d834907dc863",
"version_major": 2,
"version_minor": 0
},
"image/png": "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Yzo6OuLKK6/Mnbdjx47cxxUVFVFdXR3d3d2xbNmyIRt7cXFxFBcXD9nnAwDIhyEPwIaGhqitrY1ly5bFhg0b4q233oqVK1fGwoULY/78+RERcd1118XVV18d8+fPj4suuija2tpiz549MWPGjNx11q9fH6tWrYrS0tJobGyMvr6+2LVrVxw9enTAXboT2bdvXxw5ciT27dsXb7/9duzevTsiIs4666yYPHlyXuYOADAcDHkAFhUVxaOPPhpf/vKX4+KLL44xY8ZEY2Nj3HPPPbljli5dGl1dXbF69eo4duxYfP7zn48VK1bEY489ljvmmmuuiVNPPTXuuuuuuOGGG2LSpElRW1sbX/nKV05qHGvXrh3wE8Of+9znIiLi+9//fixatGhQ5goAMBwVZVmWFXoQI1Vvb2+UlpZGT09PlJSUDO7FDx+OqKgY3GsCwEjT3R0xffqgXjKvr98jRLJ/CQQAIFWjMgBbW1sH/HqYd2+LFy8u9PAAAApqyL8HcCgsX748mpqa3nPfxIkTh3g0AADDy6gMwPLy8igvLy/0MAAAhqVR+RYwAAAnJgABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASM2ICsKWlJc4999xCDwMAYMQbMQE4mH7xi19Ec3NzTJ8+PSZOnBgzZ86MdevWxRtvvFHooQEA5N24Qg+gEH72s59Ff39/fPvb346zzjornn766bj22mvjtddei7vvvrvQwwMAyKu83AFctGhRrFq1KlavXh3l5eVRWVkZLS0tuf379u2LJUuWxOTJk6OkpCSampri0KFDA65xxx13REVFRUyZMiWam5vj2LFjx32eTZs2xezZs2PChAkxa9asuPfee09qfI2NjbF58+a47LLLYsaMGXH55ZfH1772tXjkkUc+1rwBAEaCvL0FvGXLlpg0aVJ0dHTEnXfeGTfffHO0t7dHf39/LFmyJI4cORLbtm2L9vb26O7ujqVLl+bO3bp1a7S0tERra2vs2rUrqqqqjou7tra2WLt2bdx2223R2dkZra2tsWbNmtiyZctHGm9PT0+Ul5e/7zF9fX3R29s7YAMAGHGyPFi4cGG2YMGCAc+dd9552Y033pg9/vjj2dixY7N9+/bl9u3ZsyeLiGznzp1ZlmVZfX19tnLlygHn19XVZeecc07u8cyZM7MHH3xwwDG33HJLVl9f/6HH+8wzz2QlJSXZfffd977HrVu3LouI47aenp4P/Tk/0KFDWRZhs9lsNlvaW3f3oL/E9vT0ZHl7/R4h8nYHcO7cuQMeV1VVxeHDh6OzszNqamqipqYmt2/
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
" <img src='data:image/png;base64,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Yzo6OuLKK6/Mnbdjx47cxxUVFVFdXR3d3d2xbNmyIRt7cXFxFBcXD9nnAwDIhyEPwIaGhqitrY1ly5bFhg0b4q233oqVK1fGwoULY/78+RERcd1118XVV18d8+fPj4suuija2tpiz549MWPGjNx11q9fH6tWrYrS0tJobGyMvr6+2LVrVxw9enTAXboT2bdvXxw5ciT27dsXb7/9duzevTsiIs4666yYPHlyXuYOADAcDHkAFhUVxaOPPhpf/vKX4+KLL44xY8ZEY2Nj3HPPPbljli5dGl1dXbF69eo4duxYfP7zn48VK1bEY489ljvmmmuuiVNPPTXuuuuuuOGGG2LSpElRW1sbX/nKV05qHGvXrh3wE8Of+9znIiLi+9//fixatGhQ5goAMBwVZVmWFXoQI1Vvb2+UlpZGT09PlJSUDO7FDx+OqKgY3GsCwEjT3R0xffqgXjKvr98jRLJ/CQQAIFWjMgBbW1sH/HqYd2+LFy8u9PAAAApqyL8HcCgsX748mpqa3nPfxIkTh3g0AADDy6gMwPLy8igvLy/0MAAAhqVR+RYwAAAnJgABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASM2ICsKWlJc4999xCDwMAYMQbMQE4mH7xi19Ec3NzTJ8+PSZOnBgzZ86MdevWxRtvvFHooQEA5N24Qg+gEH72s59Ff39/fPvb346zzjornn766bj22mvjtddei7vvvrvQwwMAyKu83AFctGhRrFq1KlavXh3l5eVRWVkZLS0tuf379u2LJUuWxOTJk6OkpCSampri0KFDA65xxx13REVFRUyZMiWam5vj2LFjx32eTZs2xezZs2PChAkxa9asuPfee09qfI2NjbF58+a47LLLYsaMGXH55ZfH1772tXjkkUc+1rwBAEaCvL0FvGXLlpg0aVJ0dHTEnXfeGTfffHO0t7dHf39/LFmyJI4cORLbtm2L9vb26O7ujqVLl+bO3bp1a7S0tERra2vs2rUrqqqqjou7tra2WLt2bdx2223R2dkZra2tsWbNmtiyZctHGm9PT0+Ul5e/7zF9fX3R29s7YAMAGHGyPFi4cGG2YMGCAc+dd9552Y033pg9/vjj2dixY7N9+/bl9u3ZsyeLiGznzp1ZlmVZfX19tnLlygHn19XVZeecc07u8cyZM7MHH3xwwDG33HJLVl9f/6HH+8wzz2QlJSXZfffd977HrVu3LouI47aenp4P/Tk/0KFDWRZhs9lsNlvaW3f3oL/E9vT0ZHl7/R4h8nY
" </div>\n",
" "
],
"text/plain": [
"Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plot with lines for deadlines\n",
"fig, ax = plt.subplots()\n",
"for i, record in enumerate(records):\n",
" ax.broken_barh([(record.start_time, record.end_time - record.start_time)], (name_to_id[record.node_name] - 0.4, 0.8), facecolors='blue')\n",
"\n",
"# draw a vertical line for each deadline\n",
"for deadline in deadlines:\n",
" # may have to adjust the y value depending on your chain layout\n",
" ax.plot([deadline.deadline, deadline.deadline], [0, num_nodes], color='red')\n",
"\n",
"ax.set_yticks(range(num_nodes))\n",
"ax.set_yticklabels(name_to_id.keys())\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.10 (venv310)",
"language": "python",
"name": "venv310"
},
"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.10.16"
}
},
"nbformat": 4,
"nbformat_minor": 4
}