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-03-29 15:20:20 +01:00
"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": {
2025-03-29 15:20:20 +01:00
"model_id": "f4ac2c553514434b9f1980bd9bc391d7",
"version_major": 2,
"version_minor": 0
},
2025-03-29 15:20:20 +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 15:20:20 +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 15:20:20 +01:00
"model_id": "313f869f82f04c929d3c1eb8f7f127d3",
"version_major": 2,
"version_minor": 0
},
2025-03-29 15:20:20 +01:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAI25JREFUeJzt3X9wVfWd+P9XCBgQSEJKzY8aLWBbwAnYBY1RRvBjxg27M7K73YbuMP7YiXaB3WLrVqwzCwR/RIvulB237lboIs7EVXbWWWfandXotOxOB0LpSlshdjSxgqVAFUzUlfgj5/tHv94xBRRqbn7wfjxmziT33vc9933eZLjPOTf3piDLsiwAAEjGqKGeAAAAg0sAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZvRQT2Ak6+vri/3798fEiROjoKBgqKcDAJyELMvi9ddfj6qqqhg1Ks1zYQLwY9i/f39UV1cP9TQAgN/Dvn374uyzzx7qaQwJAfgxTJw4MSJ++wNUXFw8xLMBAE5GT09PVFdX557HUyQAP4b3X/YtLi4WgAAwwqT861tpvvANAJAwAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBh/C3i46uuLOHQo4je/iciy499+5Mhvv580KWLUcVreGGOMMcYYY0bimCyL6O2NmDw54txzIwoLjx3DxyIAh6tXXomorBzqWQDA0OrqipgyZahncdrxEjAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYkZMADY3N8cFF1ww1NMAABjxRkwADrSrrroqzjnnnBg7dmxUVlbG1VdfHfv37x/qaQEA5F2yAXj55ZfHli1b4he/+EX8+7//e3R2dsaf//mfD/W0AADyLi8BuGDBglixYkWsXLkyysrKoqKiIpqbm3O37927NxYtWhQTJkyI4uLiaGxsjIMHD/bbx9133x3l5eUxceLEaGpqiqNHjx7zOBs3bowZM2bE2LFjY/r06XH//fef9By/9rWvxcUXXxznnntuXHLJJfGNb3wjtm/fHu+8887vfdwAACNB3s4Abt68OcaPHx/t7e2xbt26uO2226KtrS36+vpi0aJFcfjw4di6dWu0tbVFV1dXLF68OHffLVu2RHNzc7S0tMTOnTujsrLymLhrbW2N1atXx5133hkdHR3R0tISq1atis2bN5/yXA8fPhytra1xySWXxJgxYz72sQMADGtZHsyfPz+bN29ev+suvPDC7JZbbsmefPLJrLCwMNu7d2/utt27d2cRke3YsSPLsiyrq6vLli9f3u/+tbW12ezZs3OXp02blj388MP9xtx+++1ZXV3dSc9z5cqV2ZlnnplFRHbxxRdnr7zyyoeOP3r0aNbd3Z3b9u3bl0VE1t3dfdKPedIOHsyyCJvNZrPZ0t66ugb8Kba7uzvL2/P3CJG3M4CzZs3qd7mysjIOHToUHR0dUV1dHdXV1bnbZs6cGaWlpdHR0RERER0dHVFbW9vv/nV1dbnv33zzzejs7IympqaYMGFCbrvjjjuis7PzpOd48803xzPPPBNPPvlkFBYWxjXXXBNZlp1w/F133RUlJSW57YPHAAAwUozO145/96XUgoKC6OvrG5B9v/HGGxERsWHDhmNCsbCw8KT3M3ny5Jg8eXJ89rOfjRkzZkR1dXVs3769X2x+0K233ho33XRT7nJPT48IBABGnLwF4InMmDEj9u3bF/v27cvF0549e+K1116LmTNn5sa0t7fHNddck7vf9u3bc9+Xl5dHVVVVdHV1xZIlSwZkXu/HaW9v7wnHFBUVRVFR0YA8HgDAUBn0AKyvr4+amppYsmRJrF+/Pt59991Yvnx5zJ8/P+bOnRsRETfeeGNcd911MXfu3Lj00kujtbU1du/eHVOnTs3tZ+3atbFixYooKSmJhoaG6O3tjZ07d8aRI0f6naU7nvb29vjxj38c8+bNi0mTJkVnZ2esWrUqpk2bdsKzfwAAp4tB/xzAgoKCePzxx2PSpElx2WWXRX19fUydOjUeffTR3JjFixfHqlWrYuXKlTFnzpx46aWXYtmyZf32c/3118fGjRtj06ZNUVNTE/Pnz48HH3wwpkyZ8pFzOPPMM+Oxxx6LK664Ij73uc9FU1NTzJo1K7Zu3eoMHwBw2ivIPuxdD3yonp6eKCkpie7u7iguLh7YnR86FFFePrD7BICRpqsr4iRO7pyKvD5/jxDJ/iUQAIBUnZYB2NLS0u/jYT64LVy4cKinBwAwpAb9TSCDYenSpdHY2Hjc28aNGzfIswEAGF5OywAsKyuLsrKyoZ4GAMCwdFq+BAwAwIkJQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMSMmABsbm6OCy64YKinAQAw4o2YABxIv/zlL6OpqSmmTJkS48aNi2nTpsWaNWvi7bffHuqpAQDk3eihnsBQeO6556Kvry++853vxHnnnRfPPvts3HDDDfHmm2/GvffeO9TTAwDIq7ycAVywYEGsWLEiVq5cGWVlZVFRURHNzc252/fu3RuLFi2KCRMmRHFxcTQ2NsbBgwf77ePuu++O8vLymDhxYjQ1NcXRo0ePeZyNGzfGjBkzYuzYsTF9+vS4//77T2p+DQ0NsWnTprjyyitj6tSpcdVVV8XXv/71eOyxxz7WcQMAjAR5ewl48+bNMX78+Ghvb49169bFbbfdFm1tbdHX1xeLFi2Kw4cPx9atW6OtrS26urpi8eLFuftu2bIlmpubo6WlJXbu3BmVlZXHxF1ra2usXr067rzzzujo6IiWlpZYtWpVbN68+feab3d3d5SVlX3omN7e3ujp6em3AQCMOFkezJ8/P5s3b16/6y688MLslltuyZ588smssLAw27t3b+623bt3ZxGR7dixI8uyLKurq8uWL1/e7/61tbX
"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 15:20:20 +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": [
"# 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
}