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": [
"Number of records: 12055\n",
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'node_0', 'count': 500, 'next_release_us': 99890}, 'time': 0.0001}\n",
"Operation types: ['get_next_executable', 'end_work', 'next_deadline', 'wait_for_work', '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": "98aed7649afd4e958ddfe602039f901b",
"version_major": 2,
"version_minor": 0
},
"image/png": "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UVVV9ZHWAwAYKEoegE1NTdHY2BgLFy6MVatWxbvvvhs33nhjzJ49O2bMmBERETfddFNce+21MWPGjLj44otj3bp1sXXr1pg4cWJ+nhUrVsTixYujpqYmmpubo6enJzZv3hyvv/56n6t0R/LKK6/EnDlz4swzz4x77703/ud//if/ufHjxxfnwAEABoiSB2Aul4snnngivvzlL8ell14aQ4YMiebm5rjvvvvyYxYsWBBdXV2xZMmSOHToUHzuc5+LRYsWxZNPPpkfc91118XJJ58c99xzT9xyyy0xatSoaGxsjK985SvH3UN7e3u89NJL8dJLL8Xpp5/e53NFeE0MAMCAUpRXAaei2K8iGsivhhuIr1Ss5FffeRWw9Q6Pq9TnnlcBV/7XoULM5VXAlSPJ/woOACBlgzIA29ra+vx6mA/e5s6dW+7tAQCU1aD8v4BvuOGGmD9//hE/N3LkyBLvBgBgYBmUAVhbW+u/dQMAOIpB+SNgAACOTgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZli5N8DRZVlhxhRyrlKvV8i5rGe9gbxeIecq13rHG1vpx1eJcw329fjoXAEEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMywcm+Ao8vl3v8zy44/pr/jSjGmktc7PK6S1yvEvqxX+vUKOVc51suy4z+XT2SuYynnc+FYYwv1d7mQc5XruVeouY63bz46VwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAElMxAdja2hrnnXdeubcBAFDxKiYAC23//v2xcOHCqK6ujrFjx0ZLS0u8+eab5d4WAEDRJRuACxcujK1bt0Z7e3t8//vfj//4j/+IL33pS+XeFgBA0RUlAOfMmROLFy+OJUuWRG1tbYwfPz5aW1vzn9+5c2fMmzcvRo8eHdXV1TF//vzYu3dvnznuuuuuGDduXIwZMyZaWlri0KFDH1pnzZo1MWXKlBgxYkRMnjw57r///n7tr7OzM/7t3/4t1qxZEzNnzoxLLrkk7rvvvnj00Udj9+7dH+vYAQAGuqJdAVy7dm2MGjUqOjo64u67747bb7892tvbo7e3N+bNmxf79++PDRs2RHt7e2zfvj0WLFiQv+/69eujtbU12traYvPmzVFXV/ehuFu3bl0sW7Ys7rjjjujs7Iy2trZYunRprF279rh727hxY4wdOzZmzJiR/1hTU1MMGTIkOjo6jnq/np6e6O7u7nMDAKg0w4o18bRp02L58uUREXH22WfHd77znXj66acjIuKFF16IHTt2RENDQ0REPPLII3HOOefEs88+G+e
"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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UVVV9ZHWAwAYKEoegE1NTdHY2BgLFy6MVatWxbvvvhs33nhjzJ49O2bMmBERETfddFNce+21MWPGjLj44otj3bp1sXXr1pg4cWJ+nhUrVsTixYujpqYmmpubo6enJzZv3hyvv/56n6t0R/LKK6/EnDlz4swzz4x77703/ud//if/ufHjxxfnwAEABoiSB2Aul4snnngivvzlL8ell14aQ4YMiebm5rjvvvvyYxYsWBBdXV2xZMmSOHToUHzuc5+LRYsWxZNPPpkfc91118XJJ58c99xzT9xyyy0xatSoaGxsjK985SvH3UN7e3u89NJL8dJLL8Xpp5/e53NFeE0MAMCAUpRXAaei2K8iGsivhhuIr1Ss5FffeRWw9Q6Pq9TnnlcBV/7XoULM5VXAlSPJ/woOACBlgzIA29ra+vx6mA/e5s6dW+7tAQCU1aD8v4BvuOGGmD9//hE/N3LkyBLvBgBgYBmUAVhbW+u/dQMAOIpB+SNgAACOTgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZli5N8DRZVlhxhRyrlKvV8i5rGe9gbxeIecq13rHG1vpx1eJcw329fjoXAEEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMywcm+Ao8vl3v8zy44/pr/jSjGmktc7PK6S1yvEvqxX+vUKOVc51suy4z+XT2SuYynnc+FYYwv1d7mQc5XruVeouY63bz46VwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAElMxAdja2hrnnXdeubcBAFDxKiYAC23//v2xcOHCqK6ujrFjx0ZLS0u8+eab5d4WAEDRJRuACxcujK1bt0Z7e3t8//vfj//4j/+IL33pS+XeFgBA0RUlAOfMmROLFy+OJUuWRG1tbYwfPz5aW1vzn9+5c2fMmzcvRo8eHdXV1TF//vzYu3dvnznuuuuuGDduXIwZMyZaWlri0KFDH1pnzZo1MWXKlBgxYkRMnjw57r///n7tr7OzM/7t3/4t1qxZEzNnzoxLLrkk7rvvvnj00Udj9+7dH+vYAQAGuqJdAVy7dm2MGjUqOjo64u67747bb7892tvbo7e3N+bNmxf79++PDRs2RHt7e2zfvj0WLFiQv+/69eujtbU12traYvPmzVFXV/ehuFu3bl0sW7Ys7rjjjujs7Iy2trZYunRprF279rh727hxY4wdOzZmzJiR/1hTU1MMGTIkOjo6jnq/np6e6O7u7nMDAKg0w4o18bRp02L58uUREXH22WfHd77znXj66acjIuK
" </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": {
"model_id": "9f92a0a66e734ecd994bf447537c04c6",
"version_major": 2,
"version_minor": 0
},
"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",
" <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": [
"# 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": "venv310",
"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
}