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

303 lines
59 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-03-29 14:11:51 +01:00
"Number of records: 11236\n",
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'node_0', 'count': 500, 'next_release_us': 99799}, 'time': 0.0001}\n",
"Operation types: ['start_work', 'get_next_executable', 'next_deadline', 'end_work', 'wait_for_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-03-29 14:11:51 +01:00
"model_id": "9f7b2b16a21a439c849b44f675f73fbc",
"version_major": 2,
"version_minor": 0
},
2025-03-29 14:11:51 +01:00
"image/png": "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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",
2025-03-29 14:11:51 +01:00
" <img src='data:image/png;base64,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
" </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": {
2025-03-29 14:11:51 +01:00
"model_id": "9f6f1486922045bfacd302ecc325e4f1",
"version_major": 2,
"version_minor": 0
},
2025-03-29 14:11:51 +01:00
"image/png": "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ucdt2bIl93FFRUVUV1fH7t27Y+HChX029+Li4iguLu6z5wMAKIQ+D8CGhoaora2NhQsXxpo1a+L999+PJUuWxJw5c2LWrFkREXH99dfHNddcE7NmzYqLL744NmzYEDt37oxJkyblzrNq1apYunRplJaWRmNjYxw5ciS2bdsWb7zxRq+rdB9nz549cfDgwdizZ0988MEHsX379oiIOOuss2Ls2LEFWTsAwEDQ5wFYVFQUjz32WHzjG9+ISy65JIYNGxaNjY1xzz335MYsWLAgOjs7Y9myZXH48OH4yle+EosXL47HH388N+baa6+NU089Ne6666648cYbY8yYMVFbWxvf/OY3T2oeK1as6PUTw1/+8pcjIuLpp5+OuXPn5mWtAAADUVGWZVl/T2Kw6u7ujtLS0ujq6oqSkpL8nvzAgYiKivyeEwAGmx07IqZPz+spC/r6PUgk+5dAAABSNSQDsLW1tdevh/noMW/evP6eHgBAv+rz7wHsC4sWLYqmpqbj3jd69Og+ng0AwMAyJAOwvLw8ysvL+3saAAAD0pB8CxgAgI8nAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzaAKwpaUlzj333P6eBgDAoDdoAjDfDh48GAsXLoySkpIoKyuL5ubmeOutt/p7WgAABZdsAC5cuDB27twZbW1t8aMf/Sj+67/+K77+9a/397QAAAquIAE4d+7cWLp0aSxbtizKy8ujsrIyWlpacvfv2bMn5s+fH2PHjo2SkpJoamqK/fv39zrHHXfcERUVFTFu3Lhobm6Ow4cPH/M869ati6lTp8aoUaNiypQpce+9957U/Do6OuI//uM/Yt26dVFXVxezZ8+Oe+65Jx5++OHYt2/fZ1o7AMBAV7ArgOvXr48xY8ZEe3t73HnnnXHLLbdEW1tb9PT0xPz58+PgwYOxadOmaGtri927d8eCBQtyj924cWO0tLREa2trbNu2Laqqqo6Juw0bNsSKFSti9erV0dHREa2trbF8+fJYv379Cee2efPmKCsri1mzZuU+19DQEMOGDYv29vaPfdyRI0eiu7u71wEAMOhkBTBnzpxs9uzZvT53/vnnZzfddFP2xBNPZMOHD8/27NmTu2/nzp1ZRGRbt27NsizL6uvrsyVLlvR6fF1dXTZz5szc7cmTJ2cPPfRQrzG33nprVl9ff8L5rV69Ojv77LOP+fznPve57N577/3Yx61cuTKLiGOOrq6uEz7np7Z/f5ZFOBwOh8OR9rFjR95fYru6urKCvX4PEgW7Ajhjxoxet6uqquLAgQPR0dERNTU1UVN
"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-03-29 14:11:51 +01:00
" <img src='data:image/png;base64,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ucdt2bIl93FFRUVUV1fH7t27Y+HChX029+Li4iguLu6z5wMAKIQ+D8CGhoaora2NhQsXxpo1a+L999+PJUuWxJw5c2LWrFkREXH99dfHNddcE7NmzYqLL744NmzYEDt37oxJkyblzrNq1apYunRplJaWRmNjYxw5ciS2bdsWb7zxRq+rdB9nz549cfDgwdizZ0988MEHsX379oiIOOuss2Ls2LEFWTsAwEDQ5wFYVFQUjz32WHzjG9+ISy65JIYNGxaNjY1xzz335MYsWLAgOjs7Y9myZXH48OH4yle+EosXL47HH388N+baa6+NU089Ne6666648cYbY8yYMVFbWxvf/OY3T2oeK1as6PUTw1/+8pcjIuLpp5+OuXPn5mWtAAADUVGWZVl/T2Kw6u7ujtLS0ujq6oqSkpL8nvzAgYiKivyeEwAGmx07IqZPz+spC/r6PUgk+5dAAABSNSQDsLW1tdevh/noMW/evP6eHgBAv+rz7wHsC4sWLYqmpqbj3jd69Og+ng0AwMAyJAOwvLw8ysvL+3saAAAD0pB8CxgAgI8nAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzaAKwpaUlzj333P6eBgDAoDdoAjDfDh48GAsXLoySkpIoKyuL5ubmeOutt/p7WgAABZdsAC5cuDB27twZbW1t8aMf/Sj+67/+K77+9a/397QAAAquIAE4d+7cWLp0aSxbtizKy8ujsrIyWlpacvfv2bMn5s+fH2PHjo2SkpJoamqK/fv39zrHHXfcERUVFTFu3Lhobm6Ow4cPH/M869ati6lTp8aoUaNiypQpce+9957U/Do6OuI//uM/Yt26dVFXVxezZ8+Oe+65Jx5++OHYt2/fZ1o7AMBAV7ArgOvXr48xY8ZEe3t73HnnnXHLLbdEW1tb9PT0xPz58+PgwYOxadOmaGtri927d8eCBQtyj924cWO0tLREa2trbNu2Laqqqo6Juw0bNsSKFSti9erV0dHREa2trbF8+fJYv379Cee2efPmKCsri1mzZuU+19DQEMOGDYv29vaPfdyRI0eiu7u71wEAMOhkBTBnzpxs9uzZvT53/vnnZzfddFP2xBNPZMOHD8/27NmTu2/nzp1ZRGRbt27NsizL6uvrsyVLlvR6fF1dXTZz5szc7cmTJ2cPPfRQrzG33nprVl9ff8L5rV69Ojv77LOP+fznPve57N577/3Yx61cuTKLiGOOrq6uEz7np7Z/f5ZFOBwOh8OR9rFjR95fYru6urKCvX4
" </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
}