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: 11799\n",
|
|
"First record: {'entry': {'operation': 'start_work', 'chain': 0, 'node': 'node_0', 'count': 500, 'next_release_us': 99881}, 'time': 0.0001}\n",
|
|
"Operation types: ['get_next_executable', 'next_deadline', 'wait_for_work', '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": 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": "020847cef8dc4d5dbb6e2e7ce53ffb31",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJHVJREFUeJzt3X9w1/V9wPHXlx8GBJIYnSGZ0YLYAl7QThRRT7DmXNju5NauoT3OH7toJ27F1lWsdwOCxWjVXtlp3RQ6xTs2ZTdv3tnebHQt63UQxcmqkPY0UKGlwCqSqC3xRz77w+M7UgGDfL/fJLwfj7vvkW++7+/n/f688z3yvE/4hlyWZVkAAJCMYQO9AAAASksAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZsRAL2Ao6+3tjZ07d8a4ceMil8sN9HIAgH7IsizefPPNqK2tjWHD0rwWJgCPwc6dO6Ourm6glwEAfAw7duyI0047baCXMSAE4DEYN25cRHzwAiovLx/g1QAA/dHd3R11dXX57+MpEoDH4MCPfcvLywUgAAwxKf/zrTR/8A0AkDABCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBOATkcoUZ09/xH3WsXO7/x/Rn7LGs5WjHlHK+Qh7LfP3n9WK+YhyrUMcZjK/P/hqMXz+KRwACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJGbIBGBLS0uce+65A70MAIAhb8gEYKHdcccdcdFFF8WJJ54YlZWVA70cAICSSTYA33nnnfj85z8fCxYsGOilAACUVFECcPbs2bFw4cJYtGhRVFVVxfjx46OlpSX/+Pbt22Pu3LkxduzYKC8vj6ampti9e3efY9x1111RXV0d48aNi+bm5ti/f/+H5lm1alVMmTIlRo0aFZMnT44HHnig32tctmxZfPWrX436+vqPfZ4AAENR0a4Arl69OsaMGRPt7e1x9913x+233x5tbW3R29sbc+fOjb1798a6deuira0ttm7dGvPmzcs/d+3atdHS0hKtra2xcePGqKmp+VDcrVmzJpYsWRJ33HFHdHR0RGtrayxevDhWr15drFMCADgujCjWgadNmxZLly6NiIizzjor7r///nj22WcjIuKll16Kbdu2RV1dXUREPProo3H22WfH888/H+eff36sWLEimpubo7m5OSIili9fHs8880yfq4BLly6Nb33rW/HZz342IiImTJgQW7ZsiQcffDCuueaaopxTT09P9PT05O93d3cXZR4AgGIq2hXAadOm9blfU1MTe/bsiY6Ojqirq8vHX0TE1KlTo7KyMjo6OiIioqOjI2bMmNHn+TNnzsx//Pbbb0dnZ2c0NzfH2LFj87fly5dHZ2dnsU4p7rzzzqioqMjfDj4HAIChomhXAEeOHNnnfi6Xi97e3oIc+6233oqIiJUrV34oFIcPH16QOQ7ltttui5tvvjl/v7u7WwQCAENO0QLwcKZMmRI7duyIHTt25ONpy5YtsW/fvpg6dWp+THt7e1x99dX5523YsCH/cXV1ddTW1sbWrVtj/vz5JVt7WVlZlJWVlWw+AIBiKHkANjQ0RH19fcyfPz9WrFgR7733Xtx4440xa9asmD59ekRE3HTTTXHttdfG9OnT4+KLL441a9bE5s2bY+LEifnjLFu2LBYuXBgVFRXR2NgYPT09sXHjxnjjjTf6XKU7nO3bt8fevXtj+/bt8f7778emTZsiImLSpEkxduzYopw7AMBgUPIAzOVy8eSTT8aXv/zluPTSS2PYsGHR2NgY9913X37MvHnzorOzMxYtWhT79++Pz33uc7FgwYJ4+umn82Ouu+66OPHEE+Oee+6JW265JcaMGRP1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W7bE2WefHc8991ycf/75cdFFF8WnP/3p+M53vpN//oUXXhj79++PTZs2RUTEpEmT4hvf+EZ88YtfzI9Zvnx5fP/734//+q//6tc6b7311rj//vvjt7/9bVx44YXx1FNPxcknn3zY8T09PdHT05O/393dHXV1ddHV1RXl5eX9mvPjyOUiPuqr1J8xhZovl/vgzyzr39hCrL2/Yw6sqxTzFfJY5us/rxfzFeNYhZirkGsq5Ouzvwbj169Yuru7o6Kioujfvwezol0BnDZtWp/7NTU1sWfPnujo6Ii6urp8/EVETJ06NSorK6OjoyMiIjo6OmLGjBl9nj9z5sz8x2+//XZ0dnZGc3NzjB07Nn9bvnx5dHZ29nuNt9xyS7z44ovxgx/8IIYPHx5XX311HKmH77zzzqioqMjfDj4HAIChYkSxDvz7P0rN5XLR29tbkGO/9dZbERGxcuXKD4Xi8OHD+32cU045JU455ZT45Cc/GVOmTIm6urrYsGFDn9g82G233RY333xz/v6BK4AAAENJ0QLwcKZMmRI7duyIHTt29PkR8L59+2Lq1Kn5Me3t7XH11Vfnn7dhw4b8x9XV1VFbWxtbt26N+fPnF2RdB+L04B/x/r6ysrIoKysryHwAAAOl5AHY0NAQ9fX1MX/+/FixYkW89957ceONN8asWbNi+vTpERFx0003xbXXXhvTp0+Piy++ONasWRObN2+OiRMn5o+zbNmyWLhwYVRUVERjY2P09PTExo0b44033uhzle5Q2tvb4/nnn49LLrkkTjrppOjs7IzFixfHmWeeedirfwAAx4uS/x7AXC4XTz75ZJx00klx6aWXRkNDQ0ycODEef/zx/Jh58+bF4sWLY9GiRXHeeefFa6+9FgsWLOhznOuuuy5WrVoVDz/8cNTX18esWbPikUceiQkTJnzkGk488cR44okn4vLLL49PfepT0dzcHNOmTYt169a5wgcAHPeK8i7gVJTqXUSD7V2W3gVc+GOZr/+8XsxXjGMVYq5Crsm7gIvLu4AT/p9AAABSdVwGYGtra59fD3Pwbc6cOQO9PACAAVXyN4GUwg033BBNTU2HfGz06NElXg0AwOByXAZgVVVVVFVVDfQyAAAGpePyR8AAAByeAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjMiIFeAB8tywozplDzHfz40YwdDGMG67HM139DdQ8KeSzzFf5YhTrOYNyD/hrKa+fouQIIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBOIjlch/cjnXMweOONLa/8/VHodZ+NOdXqjUV8ljmG7j5SrWmQh7LfKWfbzCuqRjzlXo/C7UPfHwCEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxQyYAW1pa4txzzx3oZQAADHlDJgALbe/evTF//vwoLy+PysrKaG5ujrfeemuglwUAUHTJBuD8+fNj8+bN0dbWFk899VT853/+Z3zpS18a6GUBABRdUQJw9uzZsXDhwli0aFFUVVXF+PHjo6WlJf/49u3bY+7cuTF27NgoLy+Ppqam2L17d59j3HXXXVFdXR3jxo2L5ubm2L9//4fmWbVqVUyZMiVGjRoVkydPjgceeKBf6+vo6Ih///d/j1WrVsWMGTPikksuifvuuy8ee+yx2Llz5zGdOwDAYFe0K4CrV6+OMWPGRHt7e9x9991x++23R1tbW/T29sbcuXNj7969sW7dumhra4utW7fGvHnz8s9du3ZttLS0RGtra2zcuDFqamo+FHdr1qyJJUuWxB133BEdHR3R2toaixcvjtWrV3/k2tavXx+VlZUxffr0/OcaGhpi2LBh0d7eftjn9fT0RHd3d58bAMBQM6JYB542bVosXbo0IiLOOuusuP/+++PZZ5+NiIiXXnoptm3bFnV1dRER8eijj8bZZ58dzz//fJx//vmxYsWKaG5ujubm5oiIWL58eTzzzDN9rgIuXbo0vvWtb8VnP/vZiIiYMGFCbNmyJR588MG45pprjri2Xbt2xamnntrncyNGjIiq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aGhoyH9u2LBh0dDQEOvXrz/kc9avX99nfETEH//xH+fHb9u2LXbt2tVnTEVFRcyYMeOwxzzeFWOfObRS7XVXV1fkcrmorKwsyLqHmlLs8zvvvBMPPfRQVFRUxDnnnFO4xQ8hxdrn3t7euOqqq+KWW26Js88+uziLH2KK+Zr+0Y9+FKeeemp86lOfigULFsTrr79e+BM4DgnAIvrNb34T77//flRXV/f5fHV1dezateuQz9m1a9cRxx/482iOebwrxj5zaKXY6/3798ett94aX/ziF4vyH8APBcXc56eeeirGjh0bo0aNim9/+9vR1tYWp5xySmFPYIgo1j5/85vfjBEjRsTChQsLv+ghqlh73djYGI8++mg8++yz8c1vfjPWrVsXc+bMiffff7/wJ3GcGTHQCwA44N13342mpqbIsiz+/u//fqCXc1y67LLLYtOmTfGb3/wmVq5cGU1NTdHe3h6nnnrqQC/tuPDCCy/E3/3d38V///d/Ry6XG+jlHPe+8IUv5D+ur6+PadOmxZlnnhk/+tGP4vLLLx/AlQ1+rgAW0SmnnBLDhw+P3bt39/n87t27Y/z48Yd8zvjx4484/sCfR3PM410x9plDK+ZeH4i/1157Ldra2pK9+hdR3H0eM2ZMTJo0KS688ML47ne/GyNGjIjvfve7hT2BIaIY+/zjH/849uzZE6effnqMGDEiRowYEa+99lr8zd/8TXziE58oynkMBaX6e3rixIlxyimnxKuvvnrsiz7OCcAiOuGEE+K8886LZ599Nv+53t7eePbZZ2PmzJmHfM7MmTP7jI+IaGtry4+fMGFCjB8/vs+Y7u7uaG9vP+wxj3fF2GcOrVh7fSD+XnnllXjmmWfi5JNPLs4JDBGlfE339vZGT0/PsS96CCrGPl911VXx05/+NDZt2pS/1dbWxi233BJPP/108U5mkCvVa/qXv/xlvP7661FTU1OYhR/PBvpdKMe7xx57LCsrK8seeeSRbMuWLdmXvvSlrLKyMtu1a1eWZVl21VVXZV//+tfz43/yk59kI0aMyO69996so6MjW7p06SF/DUxlZWX25JNPZj/96U+zuXPn+jUwRdjn119/PXvxxRez733ve1lEZI899lj24osvZr/+9a9Lfn6DSaH3+p133smuvPLK7LTTTss2bdrU59c59PT0DMg5DgaF3ue33noru+2227L169dnv/jFL7KNGzdmf/EXf5GVlZVlL7/88oCc42BQjL87fp93AX+g0Hv95ptvZl/72tey9evXZ9u2bcueeeaZ7I/+6I+ys846K9u/f/+AnONQIgBL4L777stOP/307IQTTsguuOCCbMOGDfnHZs2alV1zzTV9xq9duzb75Cc/mZ1wwgnZ2WefnX3ve9/r83hvb2+2ePHirLq6OisrK8suv/zy7Oc//3kpTmVQK/Q+P/zww1lEfOi2dOnSEpzN4FbIvT7wa3YOdfvhD39YojManAq5z7/73e+yP/uzP8tqa2uzE044IaupqcmuvPLK7LnnnivV6Qxahf674/cJwP9XyL3+7W9/m11xxRXZH/zBH2QjR47MzjjjjOz666/PByVHlsuyLBuYa48AAAwE/wYQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAx/wetCVTe1NhmyAAAAABJRU5ErkJggg==",
|
|
"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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJHVJREFUeJzt3X9w1/V9wPHXlx8GBJIYnSGZ0YLYAl7QThRRT7DmXNju5NauoT3OH7toJ27F1lWsdwOCxWjVXtlp3RQ6xTs2ZTdv3tnebHQt63UQxcmqkPY0UKGlwCqSqC3xRz77w+M7UgGDfL/fJLwfj7vvkW++7+/n/f688z3yvE/4hlyWZVkAAJCMYQO9AAAASksAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkZsRAL2Ao6+3tjZ07d8a4ceMil8sN9HIAgH7IsizefPPNqK2tjWHD0rwWJgCPwc6dO6Ourm6glwEAfAw7duyI0047baCXMSAE4DEYN25cRHzwAiovLx/g1QAA/dHd3R11dXX57+MpEoDH4MCPfcvLywUgAAwxKf/zrTR/8A0AkDABCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBOATkcoUZ09/xH3WsXO7/x/Rn7LGs5WjHlHK+Qh7LfP3n9WK+YhyrUMcZjK/P/hqMXz+KRwACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJGbIBGBLS0uce+65A70MAIAhb8gEYKHdcccdcdFFF8WJJ54YlZWVA70cAICSSTYA33nnnfj85z8fCxYsGOilAACUVFECcPbs2bFw4cJYtGhRVFVVxfjx46OlpSX/+Pbt22Pu3LkxduzYKC8vj6ampti9e3efY9x1111RXV0d48aNi+bm5ti/f/+H5lm1alVMmTIlRo0aFZMnT44HHnig32tctmxZfPWrX436+vqPfZ4AAENR0a4Arl69OsaMGRPt7e1x9913x+233x5tbW3R29sbc+fOjb1798a6deuira0ttm7dGvPmzcs/d+3atdHS0hKtra2xcePGqKmp+VDcrVmzJpYsWRJ33HFHdHR0RGtrayxevDhWr15drFMCADgujCjWgadNmxZLly6NiIizzjor7r///nj22WcjIuKll16Kbdu2RV1dXUREPProo3H22WfH888/H+eff36sWLEimpubo7m5OSIili9fHs8880yfq4BLly6Nb33rW/HZz342IiImTJgQW7ZsiQcffDCuueaaopxTT09P9PT05O93d3cXZR4AgGIq2hXAadOm9blfU1MTe/bsiY6Ojqirq8vHX0TE1KlTo7KyMjo6OiIioqOjI2bMmNHn+TNnzsx//Pbbb0dnZ2c0NzfH2LFj87fly5dHZ2dnsU4p7rzzzqioqMjfDj4HAIChomhXAEeOHNnnfi6Xi97e3oIc+6233oqIiJUrV34oFIcPH16QOQ7ltttui5tvvjl/v7u7WwQCAENO0QLwcKZMmRI7duyIHTt25ONpy5YtsW/fvpg6dWp+THt7e1x99dX5523YsCH/cXV1ddTW1sbWrVtj/vz5JVt7WVlZlJWVlWw+AIBiKHkANjQ0RH19fcyfPz9WrFgR7733Xtx4440xa9asmD59ekRE3HTTTXHttdfG9OnT4+KLL441a9bE5s2bY+LEifnjLFu2LBYuXBgVFRXR2NgYPT09sXHjxnjjjTf6XKU7nO3bt8fevXtj+/bt8f7778emTZsiImLSpEkxduzYopw7AMBgUPIAzOVy8eSTT8aXv/zluPTSS2PYsGHR2NgY9913X37MvHnzorOzMxYtWhT79++Pz33uc7FgwYJ4+umn82Ouu+66OPHEE+Oee+6JW265JcaMGRP1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W7bE2WefHc8991ycf/75cdFFF8WnP/3p+M53vpN//oUXXhj79++PTZs2RUTEpEmT4hvf+EZ88YtfzI9Zvnx5fP/734//+q//6tc6b7311rj//vvjt7/9bVx44YXx1FNPxcknn3zY8T09PdHT05O/393dHXV1ddHV1RXl5eX9mvPjyOUiPuqr1J8xhZovl/vgzyzr39hCrL2/Yw6sqxTzFfJY5us/rxfzFeNYhZirkGsq5Ouzvwbj169Yuru7o6Kioujfvwezol0BnDZtWp/7NTU1sWfPnujo6Ii6urp8/EVETJ06NSorK6OjoyMiIjo6OmLGjBl9nj9z5sz8x2+//XZ0dnZGc3NzjB07Nn9bvnx5dHZ29nuNt9xyS7z44ovxgx/8IIYPHx5XX311HKmH77zzzqioqMjfDj4HAIChYkSxDvz7P0rN5XLR29tbkGO/9dZbERGxcuXKD4Xi8OHD+32cU045JU455ZT45Cc/GVOmTIm6urrYsGFDn9g82G233RY333xz/v6BK4AAAENJ0QLwcKZMmRI7duyIHTt29PkR8L59+2Lq1Kn5Me3t7XH11Vfnn7dhw4b8x9XV1VFbWxtbt26N+fPnF2RdB+L04B/x/r6ysrIoKysryHwAAAOl5AHY0NAQ9fX1MX/+/FixYkW89957ceONN8asWbNi+vTpERFx0003xbXXXhvTp0+Piy++ONasWRObN2+OiRMn5o+zbNmyWLhwYVRUVERjY2P09PTExo0b44033uhzle5Q2tvb4/nnn49LLrkkTjrppOjs7IzFixfHmWeeedirfwAAx4uS/x7AXC4XTz75ZJx00klx6aWXRkNDQ0ycODEef/zx/Jh58+bF4sWLY9GiRXHeeefFa6+9FgsWLOhznOuuuy5WrVoVDz/8cNTX18esWbPikUceiQkTJnzkGk488cR44okn4vLLL49PfepT0dzcHNOmTYt169a5wgcAHPeK8i7gVJTqXUSD7V2W3gVc+GOZr/+8XsxXjGMVYq5Crsm7gIvLu4AT/p9AAABSdVwGYGtra59fD3Pwbc6cOQO9PACAAVXyN4GUwg033BBNTU2HfGz06NElXg0AwOByXAZgVVVVVFVVDfQyAAAGpePyR8AAAByeAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjMiIFeAB8tywozplDzHfz40YwdDGMG67HM139DdQ8KeSzzFf5YhTrOYNyD/hrKa+fouQIIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBCACQGAEIAJAYAQgAkBgBOIjlch/cjnXMweOONLa/8/VHodZ+NOdXqjUV8ljmG7j5SrWmQh7LfKWfbzCuqRjzlXo/C7UPfHwCEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxQyYAW1pa4txzzx3oZQAADHlDJgALbe/evTF//vwoLy+PysrKaG5ujrfeemuglwUAUHTJBuD8+fNj8+bN0dbWFk899VT853/+Z3zpS18a6GUBABRdUQJw9uzZsXDhwli0aFFUVVXF+PHjo6WlJf/49u3bY+7cuTF27NgoLy+Ppqam2L17d59j3HXXXVFdXR3jxo2L5ubm2L9//4fmWbVqVUyZMiVGjRoVkydPjgceeKBf6+vo6Ih///d/j1WrVsWMGTPikksuifvuuy8ee+yx2Llz5zGdOwDAYFe0K4CrV6+OMWPGRHt7e9x9991x++23R1tbW/T29sbcuXNj7969sW7dumhra4utW7fGvHnz8s9du3ZttLS0RGtra2zcuDFqamo+FHdr1qyJJUuWxB133BEdHR3R2toaixcvjtWrV3/k2tavXx+VlZUxffr0/OcaGhpi2LBh0d7eftjn9fT0RHd3d58bAMBQM6JYB542bVosXbo0IiLOOuusuP/+++PZZ5+NiIiXXnoptm3bFnV1dRER8eijj8bZZ58dzz//fJx//vmxYsWKaG5ujubm5oiIWL58eTzzzDN9rgIuXbo0vvWtb8VnP/vZiIiYMGFCbNmyJR588MG45pprjri2Xbt2xamnntrncyNGjIiq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aGhoyH9u2LBh0dDQEOvXrz/kc9avX99nfETEH//xH+fHb9u2LXbt2tVnTEVFRcyYMeOwxzzeFWOfObRS7XVXV1fkcrmorKwsyLqHmlLs8zvvvBMPPfRQVFRUxDnnnFO4xQ8hxdrn3t7euOqqq+KWW26Js88+uziLH2KK+Zr+0Y9+FKeeemp86lOfigULFsTrr79e+BM4DgnAIvrNb34T77//flRXV/f5fHV1dezateuQz9m1a9cRxx/482iOebwrxj5zaKXY6/3798ett94aX/ziF4vyH8APBcXc56eeeirGjh0bo0aNim9/+9vR1tYWp5xySmFPYIgo1j5/85vfjBEjRsTChQsLv+ghqlh73djYGI8++mg8++yz8c1vfjPWrVsXc+bMiffff7/wJ3GcGTHQCwA44N13342mpqbIsiz+/u//fqCXc1y67LLLYtOmTfGb3/wmVq5cGU1NTdHe3h6nnnrqQC/tuPDCCy/E3/3d38V///d/Ry6XG+jlHPe+8IUv5D+ur6+PadOmxZlnnhk/+tGP4vLLLx/AlQ1+rgAW0SmnnBLDhw+P3bt39/n87t27Y/z48Yd8zvjx4484/sCfR3PM410x9plDK+ZeH4i/1157Ldra2pK9+hdR3H0eM2ZMTJo0KS688ML47ne/GyNGjIjvfve7hT2BIaIY+/zjH/849uzZE6effnqMGDEiRowYEa+99lr8zd/8TXziE58oynkMBaX6e3rixIlxyimnxKuvvnrsiz7OCcAiOuGEE+K8886LZ599Nv+53t7eePbZZ2PmzJmHfM7MmTP7jI+IaGtry4+fMGFCjB8/vs+Y7u7uaG9vP+wxj3fF2GcOrVh7fSD+XnnllXjmmWfi5JNPLs4JDBGlfE339vZGT0/PsS96CCrGPl911VXx05/+NDZt2pS/1dbWxi233BJPP/108U5mkCvVa/qXv/xlvP7661FTU1OYhR/PBvpdKMe7xx57LCsrK8seeeSRbMuWLdmXvvSlrLKyMtu1a1eWZVl21VVXZV//+tfz43/yk59kI0aMyO69996so6MjW7p06SF/DUxlZWX25JNPZj/96U+zuXPn+jUwRdjn119/PXvxxRez733ve1lEZI899lj24osvZr/+9a9Lfn6DSaH3+p133smuvPLK7LTTTss2bdrU59c59PT0DMg5DgaF3ue33noru+2227L169dnv/jFL7KNGzdmf/EXf5GVlZVlL7/88oCc42BQjL87fp93AX+g0Hv95ptvZl/72tey9evXZ9u2bcueeeaZ7I/+6I+ys846K9u/f/+AnONQIgBL4L777stOP/307IQTTsguuOCCbMOGDfnHZs2alV1zzTV9xq9duzb75Cc/mZ1wwgnZ2WefnX3ve9/r83hvb2+2ePHirLq6OisrK8suv/zy7Oc//3kpTmVQK/Q+P/zww1lEfOi2dOnSEpzN4FbIvT7wa3YOdfvhD39YojManAq5z7/73e+yP/uzP8tqa2uzE044IaupqcmuvPLK7LnnnivV6Qxahf674/cJwP9XyL3+7W9/m11xxRXZH/zBH2QjR47MzjjjjOz666/PByVHlsuyLBuYa48AAAwE/wYQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAx/wetCVTe1NhmyAAAAABJRU5ErkJggg==' 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": "5d212f9c6001419fb629d834907dc863",
|
|
"version_major": 2,
|
|
"version_minor": 0
|
|
},
|
|
"image/png": "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Yzo6OuLKK6/Mnbdjx47cxxUVFVFdXR3d3d2xbNmyIRt7cXFxFBcXD9nnAwDIhyEPwIaGhqitrY1ly5bFhg0b4q233oqVK1fGwoULY/78+RERcd1118XVV18d8+fPj4suuija2tpiz549MWPGjNx11q9fH6tWrYrS0tJobGyMvr6+2LVrVxw9enTAXboT2bdvXxw5ciT27dsXb7/9duzevTsiIs4666yYPHlyXuYOADAcDHkAFhUVxaOPPhpf/vKX4+KLL44xY8ZEY2Nj3HPPPbljli5dGl1dXbF69eo4duxYfP7zn48VK1bEY489ljvmmmuuiVNPPTXuuuuuuOGGG2LSpElRW1sbX/nKV05qHGvXrh3wE8Of+9znIiLi+9//fixatGhQ5goAMBwVZVmWFXoQI1Vvb2+UlpZGT09PlJSUDO7FDx+OqKgY3GsCwEjT3R0xffqgXjKvr98jRLJ/CQQAIFWjMgBbW1sH/HqYd2+LFy8u9PAAAApqyL8HcCgsX748mpqa3nPfxIkTh3g0AADDy6gMwPLy8igvLy/0MAAAhqVR+RYwAAAnJgABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASM2ICsKWlJc4999xCDwMAYMQbMQE4mH7xi19Ec3NzTJ8+PSZOnBgzZ86MdevWxRtvvFHooQEA5N24Qg+gEH72s59Ff39/fPvb346zzjornn766bj22mvjtddei7vvvrvQwwMAyKu83AFctGhRrFq1KlavXh3l5eVRWVkZLS0tuf379u2LJUuWxOTJk6OkpCSampri0KFDA65xxx13REVFRUyZMiWam5vj2LFjx32e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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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Yzo6OuLKK6/Mnbdjx47cxxUVFVFdXR3d3d2xbNmyIRt7cXFxFBcXD9nnAwDIhyEPwIaGhqitrY1ly5bFhg0b4q233oqVK1fGwoULY/78+RERcd1118XVV18d8+fPj4suuija2tpiz549MWPGjNx11q9fH6tWrYrS0tJobGyMvr6+2LVrVxw9enTAXboT2bdvXxw5ciT27dsXb7/9duzevTsiIs4666yYPHlyXuYOADAcDHkAFhUVxaOPPhpf/vKX4+KLL44xY8ZEY2Nj3HPPPbljli5dGl1dXbF69eo4duxYfP7zn48VK1bEY489ljvmmmuuiVNPPTXuuuuuuOGGG2LSpElRW1sbX/nKV05qHGvXrh3wE8Of+9znIiLi+9//fixatGhQ5goAMBwVZVmWFXoQI1Vvb2+UlpZGT09PlJSUDO7FDx+OqKgY3GsCwEjT3R0xffqgXjKvr98jRLJ/CQQAIFWjMgBbW1sH/HqYd2+LFy8u9PAAAApqyL8HcCgsX748mpqa3nPfxIkTh3g0AADDy6gMwPLy8igvLy/0MAAAhqVR+RYwAAAnJgABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASM2ICsKWlJc4999xCDwMAYMQbMQE4mH7xi19Ec3NzTJ8+PSZOnBgzZ86MdevWxRtvvFHooQEA5N24Qg+gEH72s59Ff39/fPvb346zzjornn766bj22mvjtddei7vvvrvQwwMAyKu83AFctGhRrFq1KlavXh3l5eVRWVkZLS0tuf379u2LJUuWxOTJk6OkpCSampri0KFDA65xxx13REVFRUyZMiWam5vj2LFjx32e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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.10 (venv310)",
|
|
"language": "python",
|
|
"name": "venv310"
|
|
},
|
|
"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
|
|
}
|