306 lines
48 KiB
Text
306 lines
48 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"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": 12,
|
|
"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": 13,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"#experiment_folder = \"casestudy_example\"\n",
|
|
"#experiment_name = \"cs_example_edf\"\n",
|
|
"experiment_folder = \"existing_system_monitor\"\n",
|
|
"experiment_name = \"uas_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": 14,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"with open(experiment_file) as f:\n",
|
|
" experiment_data_raw = json.load(f)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Number of records: 42\n",
|
|
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'CustomListenerNode/CustomListenerNode-wildfire_talk', 'count': 0}, 'time': 0.0}\n",
|
|
"Operation types: ['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": 16,
|
|
"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": 17,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Number of nodes: 2\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": 18,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "ab61935f394e43aeaa093dc378e11680",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"image/png": "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+PXXX4+NGzfG3LlzY/jw4dXLTTfdFBs3boyIiEsuuaR6/bnnnnvUwXreeedVPx41alREREyaNOmg61599dWIiHj66adj5cqV3ebz4Q9/OLq6uuLFF1+s3m/q1Klvee4bbrghdu3aVb1s3rz5qOcPAFBrvfoikD179kRExLe//e2DQnHgwIER8b+/H/jGG29ERMTgwYOP+hxvvk+lUjnsdV1dXdU5zZ8/PxYsWHDQsc4888zqx8OGDXvLc9fV1UVdXd1RzxkAoD+pBuDEiRNj8+bNsXnz5uqjgOvXr4+dO3fGe97znuqYxx57LGbNmlU9wNq1a6sfjxo1KsaMGRMvvPBCXHnllYc84emnn37QdQdecbt///5eWFJ373vf+2L9+vVx9tln9/qxAQCOR9UAnD59ekyaNCmuvPLK+NrXvhb79u2LT33qU9HW1lZ9evQzn/lMzJkzJ6ZOnRrvf//746677opnn3023vWud1UPuHTp0liwYEE0NjbGjBkzorOzM5588sl47bXX4rrrrjvkJMaOHRuVSiX+5V/+JWbOnBn19fUxfPjwXlng5z//+fjd3/3d+PSnPx1XX311DBs2LNavXx8PPPBAfOMb3+iVcwAAHE+qvwNYqVRi1apV8c53vjN+//d/P6ZPnx7vete74p577qkO/vjHPx6LFi2Kz33uczFlypT4xS9+EZ/85Ce7HfDqq6+OO++8M1asWBGTJk2Ktra2WLlyZYwfP/6wkzj99NNj6dKlcf3118eoUaMOeoVuT5x33nnx0EMPxfPPPx8f+MAHYvLkybF48eIYM2ZMr50DAOB4Uinl/75fCketo6MjGhsbY9euXdHQ0FDr6QAAb4Of373wt4ABADi+CEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIphqA06ZNi4ULFx5x8Lhx4+JrX/ta9fNt27bFxRdfHMOGDYumpqaIiKhUKvGjH/3oGEy15948t02bNkWlUol169bVdE4AAH2tR48A3nbbbbF169ZYt25dPP/88xERsXXr1rjkkkt6ZXKHItwAAHpmUE/uvHHjxpgyZUqcc8451etGjx59xPv8z//8TwwePLgnpwUAoAcO+wjgq6++Gn/wB38Q9fX1MX78+Ljrrru63T5u3Lj44Q9/GN/97nejUqnEnDlzIuLQT7Pec8890dbWFkOHDq0e584774yJEyfG0KFDY8KECXHHHXe8rQmPHz8+IiImT54clUolpk2bFhERTzzxRFx88cVx8sknR2NjY7S1tcXPfvazt70R+/fvjz/90z+NCRMmxEsvvfS27wcA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7rtj9erVMX/+/Fi2bFl87nOf6/GaTjQCEOjXXnnllZgxY0b88R//ccybN6/W0zkhffazn4329va4//77Y+DAgTFr1qwo/khUr1m+fHns3r07brjhhlpPJYXrrrsupk2bFuedd15ce+21ceutt8by5cujs7Oz1lPrVwRgLzv55JNj4MCBsX379m7Xb9++PUaPHn3I+4wePfqI4w/8+1ZjXn311W6379u3L3bs2HHY8x7ParXP2dR6n7ds2RIXXXRRXHjhhfGtb32rR2vpz2q9zyeffHK8+93vjosvvjjuvvvuuPfee2Pt2rU9WlN/VKt9/slPfhJr1qyJurq6GDRoUJx99tkRETF16tSYPXt2zxfWD9X6a/rNWlpaYt++fbFp06ajXcYJTQD2siFDhsSUKVPiwQcfrF7X1dUVDz74YLS2th7yPq2trd3GR0Q88MAD1fHjx4+P0aNHdxvT0dERjz32WHVMa2tr7Ny5M5566qnqmJ/85CfR1dUVLS0tvba+/qJW+5xNLff5lVdeiWnTpsWUKVNixYoVMWDAifvtqj99PXd1dUVEnJCPltRqn7/+9a/H008/HevWrYt169ZV39rknnvuiZtvvrlX19hf9Kev6XXr1sWAAQMO+jWp9Gr9KpQT0d13313q6urKypUry/r168s111xTmpqayrZt20oppVx11VXl+uuvr45/9NFHy6BBg8pXvvKVsmHDhrJkyZJDvvS9qamprFq1qjzzzDPl8ssvP+TbwEyePLk89thj5ZFHHinnnHPOCf82MLXY51/84helvb29LF26tAwfPry0t7eX9vb2snv37r5bfB+qxT6//PLL5eyzzy4f+tCHyssvv9zt7RxOVLXY57Vr15bly5eX9vb2smnTpvLggw+WCy+8sJx11lnl17/+dd9uQB+p1feNN3vxxRdTvAq4Fnv905/+tNx2221l3bp1ZePGjeX73/9+OeWUU8qsWbP6dvHHAQF4jCxfvryceeaZZciQIeWCCy4oa9eurd7W1tZWZs+e3W38D37wg/Lud7+7DBkypJx77rnlxz/+cbfbu7q6yqJFi8qoUaNKXV1d+dCHPlSee+65bmN+9atflSuuuKIMHz68NDQ0lD/5kz85YaPkgFrs8+zZs0tEHHRZvXr1sVpmzfX1Pq9YseKQe3yi/5+1r/f5mWeeKRdddFEZOXJkqaurK+PGjSvXXnttefnll4/pOmutFt833ixLAJbS93v91FNPlZaWltLY2FiGDh1aJk6cWJYtW3bC/oemJyql+E1fAIBMTtxfqgEA4JAEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkvk/MkCJF/d2EQ8AAAAASUVORK5CYII=",
|
|
"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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+PXXX4+NGzfG3LlzY/jw4dXLTTfdFBs3boyIiEsuuaR6/bnnnnvUwXreeedVPx41alREREyaNOmg61599dWIiHj66adj5cqV3ebz4Q9/OLq6uuLFF1+s3m/q1Klvee4bbrghdu3aVb1s3rz5qOcPAFBrvfoikD179kRExLe//e2DQnHgwIER8b+/H/jGG29ERMTgwYOP+hxvvk+lUjnsdV1dXdU5zZ8/PxYsWHDQsc4888zqx8OGDXvLc9fV1UVdXd1RzxkAoD+pBuDEiRNj8+bNsXnz5uqjgOvXr4+dO3fGe97znuqYxx57LGbNmlU9wNq1a6sfjxo1KsaMGRMvvPBCXHnllYc84emnn37QdQdecbt///5eWFJ373vf+2L9+vVx9tln9/qxAQCOR9UAnD59ekyaNCmuvPLK+NrXvhb79u2LT33qU9HW1lZ9evQzn/lMzJkzJ6ZOnRrvf//746677opnn3023vWud1UPuHTp0liwYEE0NjbGjBkzorOzM5588sl47bXX4rrrrjvkJMaOHRuVSiX+5V/+JWbOnBn19fUxfPjwXlng5z//+fjd3/3d+PSnPx1XX311DBs2LNavXx8PPPBAfOMb3+iVcwAAHE+qvwNYqVRi1apV8c53vjN+//d/P6ZPnx7vete74p577qkO/vjHPx6LFi2Kz33uczFlypT4xS9+EZ/85Ce7HfDqq6+OO++8M1asWBGTJk2Ktra2WLlyZYwfP/6wkzj99NNj6dKlcf3118eoUaMOeoVuT5x33nnx0EMPxfPPPx8f+MAHYvLkybF48eIYM2ZMr50DAOB4Uinl/75fCketo6MjGhsbY9euXdHQ0FDr6QAAb4Of373wt4ABADi+CEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIphqA06ZNi4ULFx5x8Lhx4+JrX/ta9fNt27bFxRdfHMOGDYumpqaIiKhUKvGjH/3oGEy15948t02bNkWlUol169bVdE4AAH2tR48A3nbbbbF169ZYt25dPP/88xERsXXr1rjkkkt6ZXKHItwAAHpmUE/uvHHjxpgyZUqcc8451etGjx59xPv8z//8TwwePLgnpwUAoAcO+wjgq6++Gn/wB38Q9fX1MX78+Ljrrru63T5u3Lj44Q9/GN/97nejUqnEnDlzIuLQT7Pec8890dbWFkOHDq0e584774yJEyfG0KFDY8KECXHHHXe8rQmPHz8+IiImT54clUolpk2bFhERTzzxRFx88cVx8sknR2NjY7S1tcXPfvazt70R+/fvjz/90z+NCRMmxEsvvfS27wcA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7rtj9erVMX/+/Fi2bFl87nOf6/GaTjQCEOjXXnnllZgxY0b88R//ccybN6/W0zkhffazn4329va4//77Y+DAgTFr1qwo/khUr1m+fHns3r07brjhhlpPJYXrrrsupk2bFuedd15ce+21ceutt8by5cujs7Oz1lPrVwRgLzv55JNj4MCBsX379m7Xb9++PUaPHn3I+4wePfqI4w/8+1ZjXn311W6379u3L3bs2HHY8x7ParXP2dR6n7ds2RIXXXRRXHjhhfGtb32rR2vpz2q9zyeffHK8+93vjosvvjjuvvvuuPfee2Pt2rU9WlN/VKt9/slPfhJr1qyJurq6GDRoUJx99tkRETF16tSYPXt2zxfWD9X6a/rNWlpaYt++fbFp06ajXcYJTQD2siFDhsSUKVPiwQcfrF7X1dUVDz74YLS2th7yPq2trd3GR0Q88MAD1fHjx4+P0aNHdxvT0dERjz32WHVMa2tr7Ny5M5566qnqmJ/85CfR1dUVLS0tvba+/qJW+5xNLff5lVdeiWnTpsWUKVNixYoVMWDAifvtqj99PXd1dUVEnJCPltRqn7/+9a/H008/HevWrYt169ZV39rknnvuiZtvvrlX19hf9Kev6XXr1sWAAQMO+jWp9Gr9KpQT0d13313q6urKypUry/r168s111xTmpqayrZt20oppVx11VXl+uuvr45/9NFHy6BBg8pXvvKVsmHDhrJkyZJDvvS9qamprFq1qjzzzDPl8ssvP+TbwEyePLk89thj5ZFHHinnnHPOCf82MLXY51/84helvb29LF26tAwfPry0t7eX9vb2snv37r5bfB+qxT6//PLL5eyzzy4f+tCHyssvv9zt7RxOVLXY57Vr15bly5eX9vb2smnTpvLggw+WCy+8sJx11lnl17/+dd9uQB+p1feNN3vxxRdTvAq4Fnv905/+tNx2221l3bp1ZePGjeX73/9+OeWUU8qsWbP6dvHHAQF4jCxfvryceeaZZciQIeWCCy4oa9eurd7W1tZWZs+e3W38D37wg/Lud7+7DBkypJx77rnlxz/+cbfbu7q6yqJFi8qoUaNKXV1d+dCHPlSee+65bmN+9atflSuuuKIMHz68NDQ0lD/5kz85YaPkgFrs8+zZs0tEHHRZvXr1sVpmzfX1Pq9YseKQe3yi/5+1r/f5mWeeKRdddFEZOXJkqaurK+PGjSvXXnttefnll4/pOmutFt833ixLAJbS93v91FNPlZaWltLY2FiGDh1aJk6cWJYtW3bC/oemJyql+E1fAIBMTtxfqgEA4JAEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkvk/MkCJF/d2EQ8AAAAASUVORK5CYII=' width=640.0/>\n",
|
|
" </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": 19,
|
|
"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": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"application/vnd.jupyter.widget-view+json": {
|
|
"model_id": "4461f17363834d11a2f9b35f79bbb477",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"image/png": "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+PXXX4+NGzfG3LlzY/jw4dXLTTfdFBs3boyIiEsuuaR6/bnnnnvUwXreeedVPx41alREREyaNOmg61599dWIiHj66adj5cqV3ebz4Q9/OLq6uuLFF1+s3m/q1Klvee4bbrghdu3aVb1s3rz5qOcPAFBrvfoikD179kRExLe//e2DQnHgwIER8b+/H/jGG29ERMTgwYOP+hxvvk+lUjnsdV1dXdU5zZ8/PxYsWHDQsc4888zqx8OGDXvLc9fV1UVdXd1RzxkAoD+pBuDEiRNj8+bNsXnz5uqjgOvXr4+dO3fGe97znuqYxx57LGbNmlU9wNq1a6sfjxo1KsaMGRMvvPBCXHnllYc84emnn37QdQdecbt///5eWFJ373vf+2L9+vVx9tln9/qxAQCOR9UAnD59ekyaNCmuvPLK+NrXvhb79u2LT33qU9HW1lZ9evQzn/lMzJkzJ6ZOnRrvf//746677opnn3023vWud1UPuHTp0liwYEE0NjbGjBkzorOzM5588sl47bXX4rrrrjvkJMaOHRuVSiX+5V/+JWbOnBn19fUxfPjwXlng5z//+fjd3/3d+PSnPx1XX311DBs2LNavXx8PPPBAfOMb3+iVcwAAHE+qvwNYqVRi1apV8c53vjN+//d/P6ZPnx7vete74p577qkO/vjHPx6LFi2Kz33uczFlypT4xS9+EZ/85Ce7HfDqq6+OO++8M1asWBGTJk2Ktra2WLlyZYwfP/6wkzj99NNj6dKlcf3118eoUaMOeoVuT5x33nnx0EMPxfPPPx8f+MAHYvLkybF48eIYM2ZMr50DAOB4Uinl/75fCketo6MjGhsbY9euXdHQ0FDr6QAAb4Of373wt4ABADi+CEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIphqA06ZNi4ULFx5x8Lhx4+JrX/ta9fNt27bFxRdfHMOGDYumpqaIiKhUKvGjH/3oGEy15948t02bNkWlUol169bVdE4AAH2tR48A3nbbbbF169ZYt25dPP/88xERsXXr1rjkkkt6ZXKHItwAAHpmUE/uvHHjxpgyZUqcc8451etGjx59xPv8z//8TwwePLgnpwUAoAcO+wjgq6++Gn/wB38Q9fX1MX78+Ljrrru63T5u3Lj44Q9/GN/97nejUqnEnDlzIuLQT7Pec8890dbWFkOHDq0e584774yJEyfG0KFDY8KECXHHHXe8rQmPHz8+IiImT54clUolpk2bFhERTzzxRFx88cVx8sknR2NjY7S1tcXPfvazt70R+/fvjz/90z+NCRMmxEsvvfS27wcAcLw57COAc+bMiS1btsTq1atj8ODBsWDBgnj11Vertz/xxBMxa9asaGhoiNtvvz3q6+sPe5Lrr78+br311pg8eXI1AhcvXhzf+MY3YvLkydHe3h7z5s2LYcOGxezZs4844ccffzwuuOCC+Pd///c499xzY8iQIRERsXv37pg9e3YsX748Silx6623xsyZM+PnP/95jBgx4ojH7OzsjCuuuCI2bdoUDz/8cJxyyilHHA8AcDw7ZAA+//zzcd9998Xjjz8ev/M7vxMREX/7t38bEydOrI455ZRToq6uLurr69/yad+FCxfGRz/60ernS5YsiVtvvbV63fjx42P9+vXxzW9+8y0D8ECcnXTSSd3O+8EPfrDbuG9961vR1NQUDz30UHzkIx857PH27NkTl156aXR2dsbq1aujsbHxsGM7Ozujs7Oz+nlHR8cR5woA0B8d8ingDRs2xKBBg2LKlCnV6yZMmFB9pe/Rmjp1avXj119/PTZu3Bhz586N4cOHVy833XRTbNy48Tc6fkTE9u3bY968eXHOOedEY2NjNDQ0xJ49e97y6dwrrrgiXn/99bj//vuPGH8REV/84hejsbGxemlubv6N5wsAUCs9ehHI2zVs2LDqx3v27ImIiG9/+9vR0tLSbdzAgQN/43PMnj07fvWrX8Xtt98eY8eOjbq6umhtbY29e/ce8X4zZ86M73//+7FmzZqDHkX8/91www1x3XXXVT/v6OgQgQDAceeQAThhwoTYt29fPPXUU9WngJ977rnYuXNnj084atSoGDNmTLzwwgtx5ZVXHvX9D/zO3/79+7td/+ijj8Ydd9wRM2fOjIiIzZs3xy9/+cu3PN4nP/nJ+O3f/u247LLL4sc//nG0tbUddmxdXV3U1dUd9ZwBAPqTQwbgb/3Wb8WMGTNi/vz58Td/8zcxaNCgWLhw4RFf6HE0li5dGgsWLIjGxsaYMWNGdHZ2xpNPPhmvvfZat0fYDuXUU0+N+vr6+Nd//dc444wzYujQodHY2BjnnHNOfO9734upU6dGR0dHfPazn33b8/3zP//z2L9/f3zkIx+J++67L37v936vN5YJANAvHfZtYFasWBFjxoyJtra2+OhHPxrXXHNNnHrqqb1y0quvvjruvPPOWLFiRUyaNCna2tpi5cqV1bd4OZJBgwbF17/+9fjmN78ZY8aMicsvvzwi/vdFKq+99lq8733vi6uuuioWLFhwVPNduHBhLF26NGbOnBk//elPf+O1AQD0d5VSSqn1JI5XHR0d0djYGLt27YqGhoZaTwcAeBv8/O7hn4IDAOD40+8CcNmyZd3eHubNl2P5N4YBALLod08B79ixI3bs2HHI2+rr6+P000/v4xkdnoeQAeD44+d3H70P4NEYOXJkjBw5stbTAAA4YfW7p4ABADi2BCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQhAAIBkBCAAQDICEAAgGQEIAJCMAAQASEYAAgAkIwABAJIRgAAAyQyq9QSOZ6WUiIjo6Oio8UwAgLfrwM/tAz/HMxKAPbB79+6IiGhubq7xTACAo7V79+5obGys9TRqolIy528PdXV1xZYtW2LEiBFRqVR69dgdHR3R3NwcmzdvjoaGhl49Nv+Pfe4b9rlv2Oe+YZ/7xrHc51JK7N69O8aMGRMDBuT8bTiPAPbAgAED4owzzjim52hoaPANpg/Y575hn/uGfe4b9rlvHKt9zvrI3wE5sxcAIDEBCACQjADsp+rq6mLJkiVRV1dX66mc0Oxz37DPfcM+9w373Dfs87HlRSAAAMl4BBAAIBkBCACQjAAEAEhGAAIAJCMAj5G//uu/jnHjxsXQoUOjpaUlHn/88SOO/8d//MeYMGFCDB06NCZNmhT33ntvt9tLKbF48eI47bTTor6+PqZPnx4///nPu43ZsWNHXHnlldHQ0BBNTU0xd+7c2LNnT6+vrT+pxT7ffPPNceGFF8Y73vGOaGpq6u0l9Ut9vc+bNm2KuXPnxvjx46O+vj7OOuusWLJkSezdu/eYrK+/qMXX82WXXRZnnnlmDB06NE477bS46qqrYsuWLb2+tv6kFvt8QGdnZ7z3ve+NSqUS69at660l9Vu12Otx48ZFpVLpdrnlllt6fW3HvUKvu/vuu8uQIUPK3/3d35Vnn322zJs3rzQ1NZXt27cfcvyjjz5aBg4cWL70pS+V9evXl7/8y78sgwcPLv/5n/9ZHXPLLbeUxsbG8qMf/ag8/fTT5bLLLivjx48vb7zxRnXMjBkzyvnnn1/Wrl1bHn744XL22WeXK6644pivt1Zqtc+LFy8uX/3qV8t1111XGhsbj/Uya64W+3zfffeVOXPmlH/7t38rGzduLKtWrSqnnnpq+Yu/+Is+WXMt1Orr+atf/WpZs2ZN2bRpU3n00UdLa2traW1tPebrrZVa7fMBCxYsKJdcckmJiNLe3n6sltkv1Gqvx44dW/7qr/6qbN26tXrZs2fPMV/v8UYAHgMXXHBB+bM/+7Pq5/v37y9jxowpX/ziFw85/mMf+1i59NJLu13X0tJS5s+fX0oppaurq4wePbp8+ctfrt6+c+fOUldXV/7hH/6hlFLK+vXrS0SUJ554ojrmvvvuK5VKpbzyyiu9trb+pBb7/GYrVqxIEYC13ucDvvSlL5Xx48f3ZCn9Wn/Z51WrVpVKpVL27t3bk+X0W7Xc53vvvbdMmDChPPvssykCsFZ7PXbs2HLbbbf14kpOTJ4C7mV79+6Np556KqZPn169bsCAATF9+vRYs2bNIe+zZs2abuMjIj784Q9Xx7/44ouxbdu2bmMaGxujpaWlOmbNmjXR1NQUU6dOrY6ZPn16DBgwIB577LFeW19/Uat9zqY/7fOuXbti5MiRPVlOv9Vf9nnHjh1x1113xYUXXhiDBw/u6bL6nVru8/bt22PevHnxve99L97xjnf05rL6pVp/Td9yyy1x0kknxeTJk+PLX/5y7Nu3r7eWdsIQgL3sl7/8Zezfvz9GjRrV7fpRo0bFtm3bDnmfbdu2HXH8gX/fasypp57a7fZBgwbFyJEjD3ve41mt9jmb/rLP//Vf/xXLly+P+fPn/0br6O9qvc+f//znY9iwYXHSSSfFSy+9FKtWrerRevqrWu1zKSXmzJkT1157bbf/pJ/Iavk1vWDBgrj77rtj9erVMX/+/Fi2bFl87nOf6/GaTjQCEOjXXnnllZgxY0b88R//ccybN6/W0zkhffazn4329va4//77Y+DAgTFr1qwo/khUr1m+fHns3r07brjhhlpPJYXrrrsupk2bFuedd15ce+21ceutt8by5cujs7Oz1lPrVwRgLzv55JNj4MCBsX379m7Xb9++PUaPHn3I+4wePfqI4w/8+1ZjXn311W6379u3L3bs2HHY8x7ParXP2dR6n7ds2RIXXXRRXHjhhfGtb32rR2vpz2q9zyeffHK8+93vjosvvjjuvvvuuPfee2Pt2rU9WlN/VKt9/slPfhJr1qyJurq6GDRoUJx99tkRETF16tSYPXt2zxfWD9X6a/rNWlpaYt++fbFp06ajXcYJTQD2siFDhsSUKVPiwQcfrF7X1dUVDz74YLS2th7yPq2trd3GR0Q88MAD1fHjx4+P0aNHdxvT0dERjz32WHVMa2tr7Ny5M5566qnqmJ/85CfR1dUVLS0tvba+/qJW+5xNLff5lVdeiWnTpsWUKVNixYoVMWDAifvtqj99PXd1dUVEnJCPltRqn7/+9a/H008/HevWrYt169ZV39rknnvuiZtvvrlX19hf9Kev6XXr1sWAAQMO+jWp9Gr9KpQT0d13313q6urKypUry/r168s111xTmpqayrZt20oppVx11VXl+uuvr45/9NFHy6BBg8pXvvKVsmHDhrJkyZJDvvS9qamprFq1qjzzzDPl8ssvP+TbwEyePLk89thj5ZFHHinnnHPOCf82MLXY51/84helvb29LF26tAwfPry0t7eX9vb2snv37r5bfB+qxT6//PLL5eyzzy4f+tCHyssvv9zt7RxOVLXY57Vr15bly5eX9vb2smnTpvLggw+WCy+8sJx11lnl17/+dd9uQB+p1feNN3vxxRdTvAq4Fnv905/+tNx2221l3bp1ZePGjeX73/9+OeWUU8qsWbP6dvHHAQF4jCxfvryceeaZZciQIeWCCy4oa9eurd7W1tZWZs+e3W38D37wg/Lud7+7DBkypJx77rnlxz/+cbfbu7q6yqJFi8qoUaNKXV1d+dCHPlSee+65bmN+9atflSuuuKIMHz68NDQ0lD/5kz85YaPkgFrs8+zZs0tEHHRZvXr1sVpmzfX1Pq9YseKQe3yi/5+1r/f5mWeeKRdddFEZOXJkqaurK+PGjSvXXnttefnll4/pOmutFt833ixLAJbS93v91FNPlZaWltLY2FiGDh1aJk6cWJYtW3bC/oemJyql+E1fAIBMTtxfqgEA4JAEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkvk/MkCJF/d2EQ8AAAAASUVORK5CYII=",
|
|
"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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+PXXX4+NGzfG3LlzY/jw4dXLTTfdFBs3boyIiEsuuaR6/bnnnnvUwXreeedVPx41alREREyaNOmg61599dWIiHj66adj5cqV3ebz4Q9/OLq6uuLFF1+s3m/q1Klvee4bbrghdu3aVb1s3rz5qOcPAFBrvfoikD179kRExLe//e2DQnHgwIER8b+/H/jGG29ERMTgwYOP+hxvvk+lUjnsdV1dXdU5zZ8/PxYsWHDQsc4888zqx8OGDXvLc9fV1UVdXd1RzxkAoD+pBuDEiRNj8+bNsXnz5uqjgOvXr4+dO3fGe97znuqYxx57LGbNmlU9wNq1a6sfjxo1KsaMGRMvvPBCXHnllYc84emnn37QdQdecbt///5eWFJ373vf+2L9+vVx9tln9/qxAQCOR9UAnD59ekyaNCmuvPLK+NrXvhb79u2LT33qU9HW1lZ9evQzn/lMzJkzJ6ZOnRrvf//746677opnn3023vWud1UPuHTp0liwYEE0NjbGjBkzorOzM5588sl47bXX4rrrrjvkJMaOHRuVSiX+5V/+JWbOnBn19fUxfPjwXlng5z//+fjd3/3d+PSnPx1XX311DBs2LNavXx8PPPBAfOMb3+iVcwAAHE+qvwNYqVRi1apV8c53vjN+//d/P6ZPnx7vete74p577qkO/vjHPx6LFi2Kz33uczFlypT4xS9+EZ/85Ce7HfDqq6+OO++8M1asWBGTJk2Ktra2WLlyZYwfP/6wkzj99NNj6dKlcf3118eoUaMOeoVuT5x33nnx0EMPxfPPPx8f+MAHYvLkybF48eIYM2ZMr50DAOB4Uinl/75fCketo6MjGhsbY9euXdHQ0FDr6QAAb4Of373wt4ABADi+CEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIphqA06ZNi4ULFx5x8Lhx4+JrX/ta9fNt27bFxRdfHMOGDYumpqaIiKhUKvGjH/3oGEy15948t02bNkWlUol169bVdE4AAH2tR48A3nbbbbF169ZYt25dPP/88xERsXXr1rjkkkt6ZXKHItwAAHpmUE/uvHHjxpgyZUqcc8451etGjx59xPv8z//8TwwePLgnpwUAoAcO+wjgq6++Gn/wB38Q9fX1MX78+Ljrrru63T5u3Lj44Q9/GN/97nejUqnEnDlzIuLQT7Pec8890dbWFkOHDq0e584774yJEyfG0KFDY8KECXHHHXe8rQmPHz8+IiImT54clUolpk2bFhERTzzxRFx88cVx8sknR2NjY7S1tcXPfvazt70R+/fvjz/90z+NCRMmxEsvvfS27wcA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7rtj9erVMX/+/Fi2bFl87nOf6/GaTjQCEOjXXnnllZgxY0b88R//ccybN6/W0zkhffazn4329va4//77Y+DAgTFr1qwo/khUr1m+fHns3r07brjhhlpPJYXrrrsupk2bFuedd15ce+21ceutt8by5cujs7Oz1lPrVwRgLzv55JNj4MCBsX379m7Xb9++PUaPHn3I+4wePfqI4w/8+1ZjXn311W6379u3L3bs2HHY8x7ParXP2dR6n7ds2RIXXXRRXHjhhfGtb32rR2vpz2q9zyeffHK8+93vjosvvjjuvvvuuPfee2Pt2rU9WlN/VKt9/slPfhJr1qyJurq6GDRoUJx99tkRETF16tSYPXt2zxfWD9X6a/rNWlpaYt++fbFp06ajXcYJTQD2siFDhsSUKVPiwQcfrF7X1dUVDz74YLS2th7yPq2trd3GR0Q88MAD1fHjx4+P0aNHdxvT0dERjz32WHVMa2tr7Ny5M5566qnqmJ/85CfR1dUVLS0tvba+/qJW+5xNLff5lVdeiWnTpsWUKVNixYoVMWDAifvtqj99PXd1dUVEnJCPltRqn7/+9a/H008/HevWrYt169ZV39rknnvuiZtvvrlX19hf9Kev6XXr1sWAAQMO+jWp9Gr9KpQT0d13313q6urKypUry/r168s111xTmpqayrZt20oppVx11VXl+uuvr45/9NFHy6BBg8pXvvKVsmHDhrJkyZJDvvS9qamprFq1qjzzzDPl8ssvP+TbwEyePLk89thj5ZFHHinnnHPOCf82MLXY51/84helvb29LF26tAwfPry0t7eX9vb2snv37r5bfB+qxT6//PLL5eyzzy4f+tCHyssvv9zt7RxOVLXY57Vr15bly5eX9vb2smnTpvLggw+WCy+8sJx11lnl17/+dd9uQB+p1feNN3vxxRdTvAq4Fnv905/+tNx2221l3bp1ZePGjeX73/9+OeWUU8qsWbP6dvHHAQF4jCxfvryceeaZZciQIeWCCy4oa9eurd7W1tZWZs+e3W38D37wg/Lud7+7DBkypJx77rnlxz/+cbfbu7q6yqJFi8qoUaNKXV1d+dCHPlSee+65bmN+9atflSuuuKIMHz68NDQ0lD/5kz85YaPkgFrs8+zZs0tEHHRZvXr1sVpmzfX1Pq9YseKQe3yi/5+1r/f5mWeeKRdddFEZOXJkqaurK+PGjSvXXnttefnll4/pOmutFt833ixLAJbS93v91FNPlZaWltLY2FiGDh1aJk6cWJYtW3bC/oemJyql+E1fAIBMTtxfqgEA4JAEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkhGAAADJCEAAgGQEIABAMgIQACAZAQgAkIwABABIRgACACQjAAEAkvk/MkCJF/d2EQ8AAAAASUVORK5CYII=' width=640.0/>\n",
|
|
" </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",
|
|
" if deadline.on_time:\n",
|
|
" print(\"On time deadline: \", deadline)\n",
|
|
" ax.plot([deadline.deadline, deadline.deadline], [0, num_nodes], color=('green' if deadline.on_time else '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": "venv310",
|
|
"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.10.16"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|