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": [
2025-04-02 15:51:09 +02:00
"Number of records: 12035\n",
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'node_0', 'count': 500, 'next_release_us': 99436}, 'time': 0.000101}\n",
"Operation types: ['next_deadline', 'wait_for_work', 'get_next_executable', '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": {
2025-04-02 15:51:09 +02:00
"model_id": "5f9cc11846554ad4968929054ae2ba3c",
"version_major": 2,
"version_minor": 0
},
2025-04-02 15:51:09 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJH9JREFUeJzt3X9w1/V9wPHXlx8GBJKYOkkyowWxBbygHSiinuDMubDdya1dQ3ucP3bRTtyKratY7wYEi9GqvbKzdVPoFO/YlN28edf2ZqNrWa+DKE5WhbRXAxUqBaZIoq7EH/nsjx7fMxM01e+PJO/H4+57JPl+vu/P+/3OF/K8T/gmuSzLsgAAIBmjyj0BAABKSwACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRmTLknMJz19/fHvn37YtKkSZHL5co9HQBgELIsi9deey3q6+tj1Kg0r4UJwI9g37590dDQUO5pAAAfwt69e+PUU08t9zTKQgB+BJMmTYqI3z6BKisryzwbAGAwent7o6GhIf91PEUC8CM4+m3fyspKAQgAw0zK/30rzW98AwAkTAACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgAOYblcYY4p5FjlOF8p517q9RVyrMGebzCG8/qG83PP+TwXBnvMYA3V/SzU+fjwBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYoZNALa1tcU555xT7mkAAAx7wyYAC+3QoUOxZMmSqKysjOrq6mhtbY3XX3+93NMCACi6ZANwyZIlsWPHjujo6Ijvfve78R//8R/xhS98odzTAgAouqIE4IIFC2LZsmWxfPnyqKmpidra2mhra8vfv2fPnli0aFFMnDgxKisro6WlJQ4cODBgjDvuuCMmT54ckyZNitbW1jhy5Mh7zrN+/fqYMWNGjBs3LqZPnx733nvvoObX1dUV//Zv/xbr16+PuXPnxkUXXRT33HNPPPzww7Fv376PtHYAgKGuaFcAN2zYEBMmTIjOzs64884749Zbb42Ojo7o7++PRYsWxaFDh2Lz5s3R0dERu3btisWLF+cfu2nTpmhra4v29vbYtm1b1NXVvSfuNm7cGCtXrozbbrsturq6or29PVasWBEbNmz4wLlt2bIlqqurY86cOfmPNTU1xahRo6Kzs7NwmwAAMASNKdbAs2bNilWrVkVExJlnnhnf+ta34sknn4yIiOeeey52794dDQ0NERHx0EMPxVlnnRVPP/10nHvuubF27dpobW2N1tbWiIhYs2ZNPPHEEwOuAq5atSq+8Y1vxKc//emIiJgyZUrs3Lkz7rvvvrjqqqved2779++PU045ZcDHxowZEzU1NbF///7jPq6vry/6+vry7/f29g52OwAAhoyiXQGcNWvWgPfr6uri4MGD0dXVFQ0NDfn4i4iYOXNmVFdXR1dXV0T89lu0c+fOHfD4efPm5d9+4403oru7O1pbW2PixIn525o1a6K7u7tYS4rbb789qqqq8rd3rwEAYLgo2hXAsWPHDng/l8tFf39/QcY++mrddevWvScUR48e/YGPr62tjYMHDw742Ntvvx2HDh2K2tra4z7ulltuiRtvvDH/fm9vrwgEAIadkr8KeMaMGbF3797Yu3dv/mM7d+6Mw4cPx8yZM/PH/P//i7d169b825MnT476+vrYtWtXTJs2bcBtypQpHziHefPmxeHDh+OZZ57Jf+zf//3fo7+//z1B+W4VFRVRWVk54AYAMNwU7Qrg8TQ1NUVjY2MsWbIk1q5dG2+//XZcf/31MX/+/PyLMm644Ya4+uqrY86cOXHhhRfGxo0bY8eOHTF16tT8OKtXr45ly5ZFVVVVNDc3R19fX2zbti1effXVAVfpjmXGjBnR3Nwc1157bfz93/99vPXWW/FXf/VX8bnPfS7q6+uLun4AgHIr+RXAXC4Xjz32WJx00klx8cUXR1NTU0ydOjUeeeSR/DGLFy+OFStWxPLly2P27Nnx4osvxtKlSweMc80118T69evjgQceiMbGxpg/f348+OCDg7oCGPHbVxFPnz49Lr300vjjP/7juOiii+L+++8v6FoBAIaiXJZlWbknMVz19vZGVVVV9PT0FOXbwblcxAd9dgZzTCHHKsf5Iko391Kvr5BjDfZ8gzGc1zecn3vO57kw2GMGa6juZ6HO92EV++v3cJDsbwIBAEjViAzA9vb2AT8e5t23hQsXlnt6AABlVfIXgZTCddddFy0tLce8b/z48SWeDQDA0DIiA7CmpiZqamrKPQ0AgCFpRH4LGACA4xOAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRlT7glwfFlWmGMKOZbzDd2xBnu+wRjO63M+5yv0WEP1fIMxnNdXyH3gvVwBBABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMABzicrnCHFPIsXK5wo41GKU8X6nnVMixyjGnUs+91GMNZryjY73fcaWe+3D/3BTimKE61lCc02CV4+8fxSEAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzbAKwra0tzjnnnHJPAwBg2Bs2AVhol19+eZx22mkxbty4qKuriyuuuCL27dtX7mkBABRdsgF4ySWXxKZNm+LnP/95/Mu//Et0d3fHn/3Zn5V7WgAARVeUAFywYEEsW7Ysli9fHjU1NVFbWxttbW35+/fs2ROLFi2KiRMnRmVlZbS0tMSBAwcGjHHHHXfE5MmTY9KkSdHa2hpHjhx5z3nWr18fM2bMiHHjxsX06dPj3nvvHfQcv/zlL8f5558fp59+elxwwQXx1a9+NbZu3RpvvfXWh143AMBwULQrgBs2bIgJEyZEZ2dn3HnnnXHrrbdGR0dH9Pf3x6JFi+LQoUOxefPm6OjoiF27dsXixYvzj920aVO0tbVFe3t7bNu2Lerq6t4Tdxs3boyVK1fGbbfdFl1dXdHe3h4rVqyIDRs2/M5zPXToUGzcuDEuuOCCGDt27HGP6+vri97e3gE3AIBhJyuC+fPnZxdddNGAj5177rnZzTffnP3gBz/IRo8ene3Zsyd/344dO7KIyJ566qksy7Js3rx52fXXXz/g8XPnzs3OPvvs/PtnnHFG9o//+I8Djvna176WzZs3b9DzXL58eXbiiSdmEZGdf/752csvv/y+x69atSqLiPfcenp6Bn3O39V
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
2025-04-02 15:51:09 +02:00
" <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJH9JREFUeJzt3X9w1/V9wPHXlx8GBJKYOkkyowWxBbygHSiinuDMubDdya1dQ3ucP3bRTtyKratY7wYEi9GqvbKzdVPoFO/YlN28edf2ZqNrWa+DKE5WhbRXAxUqBaZIoq7EH/nsjx7fMxM01e+PJO/H4+57JPl+vu/P+/3OF/K8T/gmuSzLsgAAIBmjyj0BAABKSwACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRmTLknMJz19/fHvn37YtKkSZHL5co9HQBgELIsi9deey3q6+tj1Kg0r4UJwI9g37590dDQUO5pAAAfwt69e+PUU08t9zTKQgB+BJMmTYqI3z6BKisryzwbAGAwent7o6GhIf91PEUC8CM4+m3fyspKAQgAw0zK/30rzW98AwAkTAACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgAOYblcYY4p5FjlOF8p517q9RVyrMGebzCG8/qG83PP+TwXBnvMYA3V/SzU+fjwBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYoZNALa1tcU555xT7mkAAAx7wyYAC+3QoUOxZMmSqKysjOrq6mhtbY3XX3+93NMCACi6ZANwyZIlsWPHjujo6Ijvfve78R//8R/xhS98odzTAgAouqIE4IIFC2LZsmWxfPnyqKmpidra2mhra8vfv2fPnli0aFFMnDgxKisro6WlJQ4cODBgjDvuuCMmT54ckyZNitbW1jhy5Mh7zrN+/fqYMWNGjBs3LqZPnx733nvvoObX1dUV//Zv/xbr16+PuXPnxkUXXRT33HNPPPzww7Fv376PtHYAgKGuaFcAN2zYEBMmTIjOzs64884749Zbb42Ojo7o7++PRYsWxaFDh2Lz5s3R0dERu3btisWLF+cfu2nTpmhra4v29vbYtm1b1NXVvSfuNm7cGCtXrozbbrsturq6or29PVasWBEbNmz4wLlt2bIlqqurY86cOfmPNTU1xahRo6Kzs7NwmwAAMASNKdbAs2bNilWrVkVExJlnnhnf+ta34sknn4yIiOeeey52794dDQ0NERHx0EMPxVlnnRVPP/10nHvuubF27dpobW2N1tbWiIhYs2ZNPPHEEwOuAq5atSq+8Y1vxKc//emIiJgyZUrs3Lkz7rvvvrjqqqved2779++PU045ZcDHxowZEzU1NbF///7jPq6vry/6+vry7/f29g52OwAAhoyiXQGcNWvWgPfr6uri4MGD0dXVFQ0NDfn4i4iYOXNmVFdXR1dXV0T89lu0c+fOHfD4efPm5d9+4403oru7O1pbW2PixIn525o1a6K7u7tYS4rbb789qqqq8rd3rwEAYLgo2hXAsWPHDng/l8tFf39/QcY++mrddevWvScUR48e/YGPr62tjYMHDw742Ntvvx2HDh2K2tra4z7ulltuiRtvvDH/fm9vrwgEAIadkr8KeMaMGbF3797Yu3dv/mM7d+6Mw4cPx8yZM/PH/P//i7d169b825MnT476+vrYtWtXTJs2bcBtypQpHziHefPmxeHDh+OZZ57Jf+zf//3fo7+//z1B+W4VFRVRWVk54AYAMNwU7Qrg8TQ1NUVjY2MsWbIk1q5dG2+//XZcf/31MX/+/PyLMm644Ya4+uqrY86cOXHhhRfGxo0bY8eOHTF16tT8OKtXr45ly5ZFVVVVNDc3R19fX2zbti1effXVAVfpjmXGjBnR3Nwc1157bfz93/99vPXWW/FXf/VX8bnPfS7q6+uLun4AgHIr+RXAXC4Xjz32WJx00klx8cUXR1NTU0ydOjUeeeSR/DGLFy+OFStWxPLly2P27Nnx4osvxtKlSweMc80118T69evjgQceiMbGxpg/f348+OCDg7oCGPHbVxFPnz49Lr300vjjP/7juOiii+L+++8v6FoBAIaiXJZlWbknMVz19vZGVVVV9PT0FOXbwblcxAd9dgZzTCHHKsf5Iko391Kvr5BjDfZ8gzGc1zecn3vO57kw2GMGa6juZ6HO92EV++v3cJDsbwIBAEjViAzA9vb2AT8e5t23hQsXlnt6AABlVfIXgZTCddddFy0tLce8b/z48SWeDQDA0DIiA7CmpiZqamrKPQ0AgCFpRH4LGACA4xOAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRlT7glwfFlWmGMKOZbzDd2xBnu+wRjO63M+5yv0WEP1fIMxnNdXyH3gvVwBBABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMABzicrnCHFPIsXK5wo41GKU8X6nnVMixyjGnUs+91GMNZryjY73fcaWe+3D/3BTimKE61lCc02CV4+8fxSEAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzbAKwra0tzjnnnHJPAwBg2Bs2AVhol19+eZx22mkxbty4qKuriyuuuCL27dtX7mkBABRdsgF4ySWXxKZNm+LnP/95/Mu//Et0d3fHn/3Zn5V7WgAARVeUAFywYEEsW7Ysli9fHjU1NVFbWxttbW35+/fs2ROLFi2KiRMnRmVlZbS0tMSBAwcGjHHHHXfE5MmTY9KkSdHa2hpHjhx5z3nWr18fM2bMiHHjxsX06dPj3nvvHfQcv/zlL8f5558fp59+elxwwQXx1a9+NbZu3RpvvfXWh143AMBwULQrgBs2bIgJEyZEZ2dn3HnnnXHrrbdGR0dH9Pf3x6JFi+LQoUOxefPm6OjoiF27dsXixYvzj920aVO0tbVFe3t7bNu2Lerq6t4Tdxs3boyVK1fGbbfdFl1dXdHe3h4rVqyIDRs2/M5zPXToUGzcuDEuuOCCGDt27HGP6+vri97e3gE3AIBhJyuC+fPnZxdddNGAj5177rnZzTffnP3gBz/IRo8ene3Zsyd/344dO7KIyJ566qksy7Js3rx52fXXXz/g8XPnzs3OPvvs/PtnnHFG9o//+I8Djvna176WzZs3b9DzXL58eXbiiSdmEZG
" </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": {},
2025-04-02 15:51:09 +02:00
"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": {
2025-04-02 15:51:09 +02:00
"model_id": "6bb50c1987ec45a2b25dc1cdee9e794c",
"version_major": 2,
"version_minor": 0
},
2025-04-02 15:51:09 +02:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAI4BJREFUeJzt3X9sXfV9+P+X4wQnJLEdN8M/iqH50TYJcqAjYAwRCR8s5mwS2dbV6RRRmAxdkq2BshKKtCQOPwwFpmZiZStJF4IUBpmGhtROA8PabKoShzBoS2IqsClJG5IUktjAiPnh8/2jX65wk1ADvv71fjykI3zvfZ9z3+eN4T51rq9dkGVZFgAAJGPMUE8AAIDBJQABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzdqgnMJL19vbG/v37Y/LkyVFQUDDU0wEA+iHLsnj99dejqqoqxoxJ81qYAPwE9u/fH9XV1UM9DQDgY9i3b1+cfvrpQz2NISEAP4HJkydHxG++gYqLi4d4NgBAf3R3d0d1dXXudTxFAvATeP9t3+LiYgEIACNMyj++leYb3wAACROAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJ8beAh6ve3ohDhyJ+/euILDvx40eO/ObrKVMixpyg5Y0xxhhjjDFmJI7JsoienoipUyPOPDOisPD4MXwiAnC4evXViMrKoZ4FAAytzs6IadOGehajjreAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzYgKwubk5zjnnnKGeBgDAiDdiAnCgHT58OJYuXRrFxcVRWloaTU1N8cYbbwz1tAAA8i7ZAFy6dGns3r07Wltb4/vf/37893//d3z1q18d6mkBAORdXgJw4cKFsXLlyli1alWUlZVFRUVFNDc35x7fu3dvLF68OCZNmhTFxcXR2NgYBw8e7HOMO+64I8rLy2Py5MnR1NQUx44dO+55Nm7cGLNnz47x48fHrFmz4t577+3X/Nrb2+M///M/Y+PGjVFbWxvz58+Pe+65Jx566KHYv3//Jzp3AIDhLm9XADdv3hwTJ06Mtra2uPPOO+Pmm2+O1tbW6O3tjcWLF8fhw4dj27Zt0draGp2dnbFkyZLcvlu3bo3m5uZoaWmJXbt2RWVl5XFxt2XLllizZk3cdttt0d7eHi0tLbF69erYvHnz75zb9u3bo7S0NObNm5e7r76+PsaMGRNtbW0DtwgAAMPQ2HwdeO7cubF27dqIiPjsZz8b//AP/xBPPvlkRET87Gc/i5deeimqq6sjIuKBBx6Is846K5566qk477zzYv369dHU1BRNTU0REXHrrbfGE0880ecq4Nq1a+Pv/u7v4k//9E8jImLatGmxZ8+e+O53vxtXXnnlh87twIEDcdppp/W5b+zYsVFWVhYHDhw46X49PT3R09OTu93d3d3f5QAAGDbydgVw7ty5fW5XVlbGoUOHor29Paqrq3PxFxExZ86cKC0tjfb29oj4zVu0tbW1ffavq6vLff3mm29GR0dHNDU1xaRJk3LbrbfeGh0dHfk6pbj99tujpKQkt33wHAAARoq8XQEcN25cn9sFBQXR29s7IMd+/9O6GzZsOC4UCwsLf+f+FRUVcejQoT73vfvuu3H48OGoqKg46X433XRTXH/99bnb3d3dIhAAGHEG/VPAs2fPjn379sW+ffty9+3ZsyeOHj0ac+bMyY357Z/F27FjR+7r8vLyqKqqis7Ozpg5c2afbdq0ab9zDnV1dXH06NF4+umnc/f913/9V/T29h4XlB9UVFQUxcXFfTYAgJEmb1cAT6a+vj5qampi6dKlsX79+nj33XdjxYoVsWDBgtyHMq699tq46qqrYt68eXHRRRfFli1bYvfu3TF9+vTccdatWxcrV66MkpKSaGhoiJ6enti1a1ccOXKkz1W6E5k9e3Y0NDTENddcE//0T/8U77zzTvz1X/91fPnLX46qqqq8nj8AwFAb9CuABQUF8eijj8aUKVPi4osvjvr6+pg+fXo8/PDDuTFLliyJ1atXx6pVq+Lcc8+Nl19+OZYvX97nOFdffXVs3LgxNm3aFDU1NbFgwYK4//77+3UFMOI3nyKeNWtWXHrppfGHf/iHMX/+/LjvvvsG9FwBAIajgizLsqGexEjV3d0dJSUl0dXVNfBvBx86FFFePrDHBICRprMzop8Xd/orr6/fI0SyfwkEACBVozIAW1pa+vx6mA9uixYtGurpAQAMqUH/EMhgWLZsWTQ2Np7wsQkTJgzybAAAhpdRGYBlZWVRVlY21NMAABiWRuVbwAAAnJwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMyICcDm5uY455xzhnoaAAAj3ogJwIF2+eWXxxlnnBHjx4+PysrKuOKKK2L//v1DPS0AgLxLNgAvueSS2Lp1a/z85z+Pf/u3f4uOjo74sz/7s6GeFgBA3uUlABcuXBgrV66MVatWRVlZWVRUVERzc3Pu8b1798bixYtj0qRJUVxcHI2NjXHw4ME+x7jjjjuivLw8Jk+eHE1NTXHs2LHjnmfjxo0xe/bsGD9+fMyaNSvuvffefs/x61//elxwwQVx5plnxoUXXhjf/OY3Y8eOHfHOO+987PMGABgJ8nYFcPPmzTFx4sRoa2uLO++8M26++eZobW2N3t7eWLx4cRw+fDi2bdsWra2t0dnZGUuWLMntu3Xr1mhubo6WlpbYtWtXVFZWHhd3W7ZsiTVr1sRtt90W7e3t0dLSEqtXr47Nmzd/5LkePnw4tmzZEhdeeGGMGzfupON6enqiu7u7zwYAMOJkebBgwYJs/vz5fe4777zzshtvvDF7/PHHs8LCwmzv3r25x3bv3p1FRLZz584sy7Ksrq4uW7FiRZ/9a2trs7PPPjt3e8aMGdmDDz7
"text/html": [
"\n",
" <div style=\"display: inline-block;\">\n",
" <div class=\"jupyter-widgets widget-label\" style=\"text-align: center;\">\n",
" Figure\n",
" </div>\n",
2025-04-02 15:51:09 +02:00
" <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAI4BJREFUeJzt3X9sXfV9+P+X4wQnJLEdN8M/iqH50TYJcqAjYAwRCR8s5mwS2dbV6RRRmAxdkq2BshKKtCQOPwwFpmZiZStJF4IUBpmGhtROA8PabKoShzBoS2IqsClJG5IUktjAiPnh8/2jX65wk1ADvv71fjykI3zvfZ9z3+eN4T51rq9dkGVZFgAAJGPMUE8AAIDBJQABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzdqgnMJL19vbG/v37Y/LkyVFQUDDU0wEA+iHLsnj99dejqqoqxoxJ81qYAPwE9u/fH9XV1UM9DQDgY9i3b1+cfvrpQz2NISEAP4HJkydHxG++gYqLi4d4NgBAf3R3d0d1dXXudTxFAvATeP9t3+LiYgEIACNMyj++leYb3wAACROAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJ8beAh6ve3ohDhyJ+/euILDvx40eO/ObrKVMixpyg5Y0xxhhjjDFmJI7JsoienoipUyPOPDOisPD4MXwiAnC4evXViMrKoZ4FAAytzs6IadOGehajjreAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzYgKwubk5zjnnnKGeBgDAiDdiAnCgHT58OJYuXRrFxcVRWloaTU1N8cYbbwz1tAAA8i7ZAFy6dGns3r07Wltb4/vf/37893//d3z1q18d6mkBAORdXgJw4cKFsXLlyli1alWUlZVFRUVFNDc35x7fu3dvLF68OCZNmhTFxcXR2NgYBw8e7HOMO+64I8rLy2Py5MnR1NQUx44dO+55Nm7cGLNnz47x48fHrFmz4t577+3X/Nrb2+M///M/Y+PGjVFbWxvz58+Pe+65Jx566KHYv3//Jzp3AIDhLm9XADdv3hwTJ06Mtra2uPPOO+Pmm2+O1tbW6O3tjcWLF8fhw4dj27Zt0draGp2dnbFkyZLcvlu3bo3m5uZoaWmJXbt2RWVl5XFxt2XLllizZk3cdttt0d7eHi0tLbF69erYvHnz75zb9u3bo7S0NObNm5e7r76+PsaMGRNtbW0DtwgAAMPQ2HwdeO7cubF27dqIiPjsZz8b//AP/xBPPvlkRET87Gc/i5deeimqq6sjIuKBBx6Is846K5566qk477zzYv369dHU1BRNTU0REXHrrbfGE0880ecq4Nq1a+Pv/u7v4k//9E8jImLatGmxZ8+e+O53vxtXXnnlh87twIEDcdppp/W5b+zYsVFWVhYHDhw46X49PT3R09OTu93d3d3f5QAAGDbydgVw7ty5fW5XVlbGoUOHor29Paqrq3PxFxExZ86cKC0tjfb29oj4zVu0tbW1ffavq6vLff3mm29GR0dHNDU1xaRJk3LbrbfeGh0dHfk6pbj99tujpKQkt33wHAAARoq8XQEcN25cn9sFBQXR29s7IMd+/9O6GzZsOC4UCwsLf+f+FRUVcejQoT73vfvuu3H48OGoqKg46X433XRTXH/99bnb3d3dIhAAGHEG/VPAs2fPjn379sW+ffty9+3ZsyeOHj0ac+bMyY357Z/F27FjR+7r8vLyqKqqis7Ozpg5c2afbdq0ab9zDnV1dXH06NF4+umnc/f913/9V/T29h4XlB9UVFQUxcXFfTYAgJEmb1cAT6a+vj5qampi6dKlsX79+nj33XdjxYoVsWDBgtyHMq699tq46qqrYt68eXHRRRfFli1bYvfu3TF9+vTccdatWxcrV66MkpKSaGhoiJ6enti1a1ccOXKkz1W6E5k9e3Y0NDTENddcE//0T/8U77zzTvz1X/91fPnLX46qqqq8nj8AwFAb9CuABQUF8eijj8aUKVPi4osvjvr6+pg+fXo8/PDDuTFLliyJ1atXx6pVq+Lcc8+Nl19+OZYvX97nOFdffXVs3LgxNm3aFDU1NbFgwYK4//77+3UFMOI3nyKeNWtWXHrppfGHf/iHMX/+/LjvvvsG9FwBAIajgizLsqGexEjV3d0dJSUl0dXVNfBvBx86FFFePrDHBICRprMzop8Xd/orr6/fI0SyfwkEACBVozIAW1pa+vx6mA9uixYtGurpAQAMqUH/EMhgWLZsWTQ2Np7wsQkTJgzybAAAhpdRGYBlZWVRVlY21NMAABiWRuVbwAAAnJwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMyICcDm5uY455xzhnoaAAAj3ogJwIF2+eWXxxlnnBHjx4+PysrKuOKKK2L//v1DPS0AgLxLNgAvueSS2Lp1a/z85z+Pf/u3f4uOjo74sz/7s6GeFgBA3uUlABcuXBgrV66MVatWRVlZWVRUVERzc3Pu8b1798bixYtj0qRJUVxcHI2NjXHw4ME+x7jjjjuivLw8Jk+eHE1NTXHs2LHjnmfjxo0xe/bsGD9+fMyaNSvuvffefs/x61//elxwwQVx5plnxoUXXhjf/OY3Y8eOHfHOO+987PMGABgJ8nYFcPPmzTFx4sRoa2uLO++8M26++eZobW2N3t7eWLx4cRw+fDi2bdsWra2t0dnZGUuWLMntu3Xr1mhubo6WlpbYtWtXVFZWHhd3W7ZsiTVr1sRtt90W7e3t0dLSEqtXr47Nmzd/5LkePnw4tmzZEhdeeGGMGzfupON6enqiu7u7zwYAMOJkebBgwYJs/vz5fe4777zzshtvvDF7/PHHs8LCwmzv3r25x3bv3p1FRLZz584sy7K
" </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": {
2025-03-29 14:11:51 +01:00
"display_name": "Python 3 (ipykernel)",
"language": "python",
2025-03-29 14:11:51 +01:00
"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.10.16"
}
},
"nbformat": 4,
"nbformat_minor": 4
}