302 lines
58 KiB
Text
302 lines
58 KiB
Text
{
|
|
"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: 11755\n",
|
|
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'node_0', 'count': 500, 'next_release_us': 99884}, 'time': 0.0001}\n",
|
|
"Operation types: ['wait_for_work', 'next_deadline', 'end_work', 'get_next_executable', 'start_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": "f4ac2c553514434b9f1980bd9bc391d7",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"image/png": "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CjfeeGM0NTUd9r7Ro0eXeDUAAAPLkAzAysrKqKys7O9lAAAMSEPyR8AAAByZAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjMiP5eAMeWZSd2//GOLdSYwXy8Qs51vGOONr7U+9mXsYN1zws9V1/GDrTzK+Q+9XVcofe8lMcbaM9fCsejeFwBBABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMABzAcrkPb8caU8i5CjFmKByvVGsfyPtZqjUVci7HO765CjHP8Ryv0Od3tLEpPH+pH48TIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjNoArClpSXOO++8/l4GAMCgN2gCsND27t0b8+fPj/Ly8hg/fnw0NzfH22+/3d/LAgAoumQDcP78+bF58+Zoa2uLp59+Ov7rv/4rvvSlL/X3sgAAiq4oATh79uxYuHBhLFq0KCorK6O6ujpaWlry92/fvj3mzp0bY8eOjfLy8mhqaordu3f3muPuu++OqqqqGDduXDQ3N8eBAwc+cpxVq1bFlClTYtSoUTF58uR48MEH+7S+jo6O+I//+I9YtWpVzJgxIy699NK4//774/HHH4+dO3ee0LkDAAx0RbsCuHr16hgzZky0t7fHPffcE3fccUe0tbVFT09PzJ07N/bu3Rvr1q2Ltra22Lp1a8ybNy//2LVr10ZLS0u0trbGxo0bo6am5iNxt2bNmliyZEnceeed0dHREa2trbF48eJYvXr1Mde2fv36GD9+fEyfPj3/sYaGhhg2bFi0t7cf8XHd3d3R1dXV6wYAMNiMKNbE06ZNi6VLl0ZExNlnnx0PPPBAPPfccxER8fLL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",
|
|
"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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CjfeeGM0NTUd9r7Ro0eXeDUAAAPLkAzAysrKqKys7O9lAAAMSEPyR8AAAByZAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjMiP5eAMeWZSd2//GOLdSYwXy8Qs51vGOONr7U+9mXsYN1zws9V1/GDrTzK+Q+9XVcofe8lMcbaM9fCsejeFwBBABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMABzAcrkPb8caU8i5CjFmKByvVGsfyPtZqjUVci7HO765CjHP8Ryv0Od3tLEpPH+pH48TIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjNoArClpSXOO++8/l4GAMCgN2gCsND27t0b8+fPj/Ly8hg/fnw0NzfH22+/3d/LAgAoumQDcP78+bF58+Zoa2uLp59+Ov7rv/4rvvSlL/X3sgAAiq4oATh79uxYuHBhLFq0KCorK6O6ujpaWlry92/fvj3mzp0bY8eOjfLy8mhqaordu3f3muPuu++OqqqqGDduXDQ3N8eBAwc+cpxVq1bFlClTYtSoUTF58uR48MEH+7S+jo6O+I//+I9YtWpVzJgxIy699NK4//774/HHH4+dO3ee0LkDAAx0RbsCuHr16hgzZky0t7fHPffcE3fccUe0tbVFT09PzJ07N/bu3Rvr1q2Ltra22Lp1a8ybNy//2LVr10ZLS0u0trbGxo0bo6am5iNxt2bNmliyZEnceeed0dHREa2trbF48eJYvXr1Mde2fv36GD9+fEyfPj3/sYaGhhg2bFi0t7cf8XHd3d3R1dXV6wYAMNiMKNbE06ZNi6VLl0ZExNlnnx0PPPBAPPfccxER8fLL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' 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": 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": "313f869f82f04c929d3c1eb8f7f127d3",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"image/png": "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RG7M9ddfH2eeeWbcc889cfPNN8f48eOjpqYmvvrVr37kHNra2uKFF16IF154Ic4+++x+t2VZNmDHCgAwHBVkiuf31tPTEyUlJdHd3R3FxcUDu/NDhyLKywd2nwAw0nR1RZzkr3edrLw+f48QfvENACAxp2UAtrS09Pt4mA9uCxcuHOrpAQAMqdPybwEvXbo0Ghsbj3vbuHHjBnk2AADDy2kZgGVlZR/5Z90AAFJ1Wr4EDADAiQlAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMSMmABsbm6OCy64YKinAQAw4o2YABxod955Z1xyySVx5plnRmlp6VBPBwBg0CQbgG+//XZ88YtfjGXLlg31VAAABlVeAnDBggWxYsWKWLlyZZSVlUVFRUU0Nzfnbt+7d28sWrQoJkyYEMXFxdHY2BgHDx7st4+77747ysvLY+LEidHU1BRHjx495nE2btwYM2bMiLFjx8b06dPj/vvvP+k5rl27Nr72ta9FTU3N732cAAAjUd7OAG7evDnGjx8f7e3tsW7durjtttuira0t+vr6YtGiRXH48OHYunVrtLW1RVdXVyxevDh33y1btkRzc3O0tLTEzp07o7Ky8pi4a21tjdWrV8edd94ZHR0d0dLSEqtWrYrNmzfn65Cit7c3enp6+m0AACNOlgfz58/P5s2b1++6Cy+8MLvllluyJ598MissLMz27t2bu2337t1ZRGQ7duzIsizL6urqsuXLl/e7f21tbTZ79uzc5WnTpmUPP/xwvzG33357VldXd0pz3bRpU1ZSUnJSY9esWZNFxDFbd3f3KT3mSTl4MMsibDabzWZLe+vqGvCn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",
|
|
"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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RG7M9ddfH2eeeWbcc889cfPNN8f48eOjpqYmvvrVr37kHNra2uKFF16IF154Ic4+++x+t2VZNmDHCgAwHBVkiuf31tPTEyUlJdHd3R3FxcUDu/NDhyLKywd2nwAw0nR1RZzkr3edrLw+f48QfvENACAxp2UAtrS09Pt4mA9uCxcuHOrpAQAMqdPybwEvXbo0Ghsbj3vbuHHjBnk2AADDy2kZgGVlZR/5Z90AAFJ1Wr4EDADAiQlAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMSMmABsbm6OCy64YKinAQAw4o2YABxod955Z1xyySVx5plnRmlp6VBPBwBg0CQbgG+//XZ88YtfjGXLlg31VAAABlVeAnDBggWxYsWKWLlyZZSVlUVFRUU0Nzfnbt+7d28sWrQoJkyYEMXFxdHY2BgHDx7st4+77747ysvLY+LEidHU1BRHjx495nE2btwYM2bMiLFjx8b06dPj/vvvP+k5rl27Nr72ta9FTU3N732cAAAjUd7OAG7evDnGjx8f7e3tsW7durjtttuira0t+vr6YtGiRXH48OHYunVrtLW1RVdXVyxevDh33y1btkRzc3O0tLTEzp07o7Ky8pi4a21tjdWrV8edd94ZHR0d0dLSEqtWrYrNmzfn65Cit7c3enp6+m0AACNOlgfz58/P5s2b1++6Cy+8MLvllluyJ598MissLMz27t2bu2337t1ZRGQ7duzIsizL6urqsuXLl/e7f21tbTZ79uzc5WnTpmUPP/xwvzG33357VldXd0pz3bRpU1ZSUnJSY9esWZNFxDFbd3f3KT3mSTl4MMsibDabzWZLe+vqGvCn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' 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",
|
|
" 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 (ipykernel)",
|
|
"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
|
|
}
|