diff --git a/analysis/analysis.ipynb b/analysis/analysis.ipynb
index d43703d..ee39612 100644
--- a/analysis/analysis.ipynb
+++ b/analysis/analysis.ipynb
@@ -27,11 +27,12 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "experiment_folder = \"casestudy_example\"\n",
+ "#experiment_folder = \"casestudy_example\"\n",
+ "experiment_folder = \"casestudy_wildfire_drone\"\n",
"experiment_name = \"cs_example_edf\"\n",
"\n",
"experiment_file = os.path.join(results_dir, experiment_folder, experiment_name + \".json\")\n",
@@ -60,7 +61,7 @@
"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"
+ "Operation types: ['wait_for_work', 'get_next_executable', 'next_deadline', 'end_work', 'start_work']\n"
]
}
],
@@ -164,18 +165,18 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "98aed7649afd4e958ddfe602039f901b",
+ "model_id": "eabdbc0b05594f0bbbb97b9b63edf92e",
"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+eff36sWrUqWlpaoqWlJSIiVq5cGU899VSfq4DLly+Pb33rW/HZz342IiImTJgQ27ZtiwceeCCuueaaY+5tz549cdppp/X52LBhw6K2tjb27Nlz1PvdeeedsWLFihM8EwAAA0vRrgBOmzatz/t1dXWxb9++6OzsjIaGhnz8RURMnTo1xo4dG52dnRHx/o9oZ86c2ef+s2bNyr/91ltvRVdXV7S0tMTo0aPzt5UrV0ZXV1exDiluu+22OHjwYP62a9euoq0FAFAsRbsCOHz48D7v53K56O3tLcjch1+tu3r16g+F4tChQ497//Hjx8e+ffv6fOzdd9+N/fv3x/jx4496v6qqqqiqqvoIOwYAGDhK/irgKVOmxK5du/pcPdu2bVscOHAgpk6dmh/z//8t3qZNm/Jvjxs3Lurr62P79u0xadKkPrcJEyYcdw+zZs2KAwcOxHPPPZf/2L//+79Hb2/vh4ISAGCwKdoVwKNpamqKxsbGWLhwYaxatSrefffduPHGG2P27Nn5F2XcdNNNce2118aMGTPi4osvjnXr1sXWrVtj4sSJ+XlWrFgRixcvjpqammhubo6enp7YvHlzvP7663HzzTcfcw9TpkyJ5ubmuP766+Pv//7v45133om/+qu/ii984QtRX19f1OMHACi3kl8BzOVy8cQTT8Qpp5wSl156aTQ1NcXEiRPjsccey49ZsGBBLF26NJYsWRLTp0+P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M888k0VE9vLLLxdm0xWoFOf54MGDWURkTz31VGE2XaGKda5/85vfZL//+7+fvfjii9mZZ56ZfAAW4zxfc8012bx584qy38HOj4CL6O23347nnnsumpqa8h8bMmRINDU1xcaNG494n40bN/YZHxHxR3/0R/nxO3bsiD179vQZU1NTEzNnzjzqnINdMc4zR1aqc33w4MHI5XIxduzYguy70pTiPL/99tvx4IMPRk1NTZx77rmF23yFKda57u3tjauuuipuueWWOOecc4qz+QpSzOf0T37ykzjttNPi05/+dCxatChee+21wh/AICQAi+jVV1+N9957L8aNG9fn4+PGjYs9e/Yc8T579uw55vjDf57InINdMc4zR1aKc33o0KG49dZb44tf/GJR/gP4SlDM8/z9738/Ro8eHSNGjIhvf/vb0d7eHqeeemphD6CCFOtcf/Ob34xhw4bF4sWLC7/pClSs89zc3ByPPPJIPP300/HNb34zNmzYEHPnzo333nuv8AcxyAwr9wYADnvnnXdi/vz5kWVZ/N3f/V25tzMoXXbZZbFly5Z49dVXY/Xq1TF//vzo6OiI0047rdxbGzSee+65+Nu//dv4r//6r8jlcuXezqD2hS98If92Y2NjTJs2Lc4666z4yU9+EpdffnkZdzbwuQJYRKeeemoMHTo09u7d2+fje/fujfHjxx/xPuPHjz/m+MN/nsicg10xzjNHVsxzfTj+Xn755Whvb0/26l9Ecc/zqFGjYtKkSXHhhRfG9773vRg2bFh873vfK+wBVJBinOuf/vSnsW/fvjjjjDNi2LBhMWzYsHj55Zfjr//6r+OTn/xkUY5joCvV1+mJEyfGqaeeGi+99NLH3/QgJwCL6KSTTorp06fH008/nf9Yb29vPP300zFr1qwj3mfWrFl9xkdEtLe358dPmDAhxo8f32dMd3d3dHR0HHXOwa4Y55kjK9a5Phx/v/rVr+Kpp56KT3ziE8U5gApRyud0b29v9PT0fPxNV6hinOurrroqfv7zn8eWLVvyt/r6+rjlllviySefLN7BDGClek7/5je/iddeey3q6uoKs/HBrNyvQhnsHn300ayqqip7+OGHs23btmVf+tKXsrFjx2Z79uzJsizLrrrqquzrX/96fvzPfvazbNiwYdm9996bdXZ2ZsuXLz/ir4EZO3Zs9sQTT2Q///nPs3nz5vk1MEU4z6+99lr2/PPPZz/4wQ+yiMgeffTR7Pnnn89++9vflvz4BpJCn+u33347u/LKK7PTTz8927JlS59f59DT01OWYxwICn2e33zzzey2227LNm7cmP3617/ONm/enP35n/95VlVVlb344otlOcaBohhfP/4/rwIu/Hl+4403sq997WvZxo0bsx07dmRPPfVU9gd/8AfZ2WefnR06dKgsx1hJBGAJ3HfffdkZZ5yRnXTSSdkFF1yQbdq0Kf+52bNnZ9dcc02f8evXr88+9alPZSeddFJ2zjnnZD/4wQ/6fL63tzdbunRpNm7cuKyqqiq7/PLLs1/+8pelOJQBrdDn+aGHHsoi4kO35cuXl+BoBrZCnuvDv2bnSLcf//jHJTqigamQ5/l3v/td9qd/+qdZfX19dtJJJ2V1dXXZlVdemT3zzDOlOpwBrdBfP/4/Afi+Qp7n//3f/82uuOKK7Pd+7/ey4cOHZ2eeeWZ2/fXX54OSY8tlWZaV59ojAADl4N8AAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAk5v8AT4r/JDEMlw4AAAAASUVORK5CYII=",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJMtJREFUeJzt3XuQleV9wPHf4eKCwC5urMtuXQ2ICeAsmoIi6gjWHbu0MzJNGkiG8dJZTcU2mNiIcabAYnA1aiZ0TGwVUsUZWqVTp84kmZrVJjSTwipWGoVNJi5EiASoIqzasF727R8OZ9zKZdFz2cPz+cycYS/PeZ7nfc9h9zvvcpZclmVZAACQjCHl3gAAAKUlAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjOs3BuoZH19fbFr164YM2ZM5HK5cm8HABiALMvijTfeiIaGhhgyJM1rYQLwY9i1a1c0NjaWexsAwEewc+fOOP3008u9jbIQgB/DmDFjIuL9J1B1dXWZdwMADERPT080Njbmv4+nSAB+DId+7FtdXS0AAaDCpPzPt9L8wTcAQMIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIEIABAYgQgAEBiBCAAQGIE4CCWy71/G8iYgY4rxZhizFWoMaWcq1zrlfq5YL3B+1wo5XoDma9SH5vjWe9YBvNzYTA+NhSPAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABITMUEYFtbW5x33nnl3gYAQMWrmAAspF//+tfR2toa48ePj5EjR8ZZZ50Vy5Yti7fffrvcWwMAKLph5d5AOfziF7+Ivr6+eOCBB2LixInx4osvxvXXXx9vvfVW3HvvveXeHgBAURXlCuDs2bNj0aJFsXjx4qitrY1x48ZFW1tb/vM7duyIuXPnxujRo6O6ujrmzZsXe/bs6TfHXXfdFXV1dTFmzJhobW2NgwcPfmid1atXx+TJk2PEiBExadKkuP/++we0v5aWlnjooYfiiiuuiAkTJsSVV14ZX/va1+Lxxx//WMcNAFAJivYj4DVr1sSoUaOis7Mz7r777rj99tujo6Mj+vr6Yu7cubFv375Yv359dHR0xLZt22L+/Pn5+65bty7a2tqivb09Nm3aFPX19R+Ku7Vr18bSpUvjjjvuiK6urmhvb48lS5bEmjVrPtJ+Dxw4ELW1tR/rmAEAKkEuy7Ks0JPOnj073nvvvfjpT3+a/9gFF1wQf/iHfxiXX355zJkzJ7Zv3x6NjY0REbF169Y455xz4plnnonzzz8/LrroovjMZz4T3/3ud/P3v/DCC+PgwYOxefPmiIiYOHFifOMb34gvfvGL+TErVqyIH/7wh/Gf//mfx7Xfl156KaZNmxb33ntvXH/99Ucc19vbG729vfn3e3p6orGxMQ4cOBDV1dXHteZA5HLv/3m0R+jQmIGOK8WYYsxVqDGFXO9Yc5VrvULsy3qlX+/QuEp97mXZseer1MfmeNar5K9DhZir0I9N4QvlfT09PVFTU1O079+VoGhXAKdOndrv/fr6+ti7d290dXVFY2NjPv4iIqZMmRJjx46Nrq6uiIjo6uqKGTNm9Lv/zJkz82+/9dZb0d3dHa2trTF69Oj8bcWKFdHd3X1c+3zllVeipaUlPv/5zx81/iIi7rzzzqipqcnfPngMAACVomgvAhk+fHi/93O5XPT19RVk7jfffDMiIlatWvWhUBw6dOiA59m1a1dcdtllcdFFF8WDDz54zPG33XZb3Hzzzfn3D10BBACoJCV/FfDkyZNj586dsXPnzn4/At6/f39MmTIlP6azszOuvvrq/P02btyYf7uuri4aGhpi27ZtsWDBgo+0j1deeSUuu+yymDZtWjz00EMxZMixL4ZWVVVFVVXVR1oPAGCwKHkANjc3R1NTUyxYsCBWrlwZ7777btx4440xa9asmD59ekRE3HTTTXHttdfG9OnT4+KLL461a9fGli1bYsKECfl5li9fHosWLYqamppoaWmJ3t7e2LRpU7z++uv9rtIdziuvvBKzZ8+OM888M+699974n//5n/znxo0bV5wDBwAYJEoegLlcLp544on48pe/HJdeemkMGTIkWlpa4r777suPmT9/fnR3d8fixYvj4MGD8bnPfS4WLlwYTz75ZH7MddddFyeffHLcc889ccstt8SoUaOiqakpvvKVrxxzDx0dHfHSSy/FSy+9FKeffnq/zxXhNTEAAINKUV4FnIpiv4poML8abjC+UrGSX33nVcDWOzSuUp97XgVc+V+HCjGXVwFXjiT/KzgAgJSdkAHY3t7e79fDfPA2Z86ccm8PAKCsTsj/C/iGG26IefPmHfZzI0eOLPFuAAAGlxMyAGtra/23bgAAR3BC/ggYAIAjE4AAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJGVbuDXBkWVaYMYWcq9TrFXIu61lvMK9XyLnKtd6xxlb68VXiXCf6enx0rgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAVoBcrrRzFWpModc71rhDYwYyrhDrHc9cpVxvoAbr41wojq+056CQx3Y8BtvfwUI/pwbb43w8czG4CUAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxFRMALa1tcV5551X7m0AAFS8ignAQrvyyivjjDPOiBEjRkR9fX1cddVVsWvXrnJvCwCg6JINwMsuuyzWrVsXv/zlL+Nf/uVforu7O/7sz/6s3NsCACi6ogTg7NmzY9GiRbF48eKora2NcePGRVtbW/7zO3bsiLlz58bo0aOjuro65s2bF3v27Ok3x1133RV1dXUxZsyYaG1tjYMHD35ondWrV8fkyZNjxIgRMWnSpLj//vsHvMevfvWrceGFF8aZZ54ZF110UXz961+PjRs3xjvvvPORjxsAoBIU7QrgmjVrYtSoUdHZ2Rl333133H777dHR0RF9fX0xd+7c2LdvX6xfvz46Ojpi27ZtMX/+/Px9161bF21tbdHe3h6bNm2K+vr6D8Xd2rVrY+nSpXHHHXdEV1dXtLe3x5IlS2LNmjXHvdd9+/bF2rVr46KLLorhw4cfcVxvb2/09PT0uwEAVJysCGbNmpVdcskl/T52/vnnZ7feemv2ox/9KBs6dGi2Y8eO/Oe2bNmSRUT2zDPPZFmWZTNnzsxuvPHGfvefMWNGdu655+bfP+uss7J//Md/7DfmG9/4RjZz5swB73Px4sXZySefnEVEduGFF2avvvrqUccvW7Ysi4gP3Q4cODDgNT+KQj5KA5mrUGMKvd6xxh0aM5BxhVjveOYq5XoDNVgf50JxfKU9B8X5bnJsg+3vYKGfU4PtcT6euQazAwcOlOT792BWtCuAU6dO7fd+fX197N27N7q6uqKxsTEaGxvzn5syZUqMHTs2urq6IiKiq6srZsyY0e/+M2fOzL/91ltvRXd3d7S2tsbo0aPztxUrVkR3d/eA93jLLbfE888/Hz/60Y9i6NChcfXVV0eWZUccf9ttt8WBAwfyt507dw54LQCAwWJYsSb+/z9KzeVy0dfXV5C533zzzYiIWLVq1YdCcejQoQOe59RTT41TTz01PvWpT8XkyZOjsbExNm7c2C82P6iqqiqqqqo++sYBAAaBkr8KePLkybFz585+V8+2bt0a+/fvjylTpuTHdHZ29rvfxo0b82/X1dVFQ0NDbNu2LSZOnNjvNn78+I+0r0Nx2tvb+5HuDwBQKYp2BfBImpubo6mpKRYsWBArV66Md999N2688caYNWtWTJ8+PSIibrrpprj22mtj+vTpcfHFF8fatWtjy5YtMWHChPw8y5cvj0WLFkVNTU20tLREb29vbNq0KV5//fW4+eabj7qHzs7OePbZZ+OSSy6JU045Jbq7u2PJkiVx1llnHfHqHwDAiaLkVwBzuVw88cQTccopp8Sll14azc3NMWHChHjsscfyY+bPnx9LliyJxYsXx7Rp0+Lll1+OhQsX9pvnuuuui9WrV8dDDz0UTU1NMWvWrHj44YcHdAXw5JNPjscffzwuv/zy+PSnPx2tra0xderUWL9+vR/xAgAnvFx2tFc9cFQ9PT1RU1MTBw4ciOrq6qKtk8u9/1qwUs1VqDGFXi/i6OMOjRnIuEKsdzxzlXK9gRqsj7PjG5jB9ne5kMd2PAbb38FCP6cKsadi7KvSy6FU378Hs2T/JxAAgFSdkAHY3t7e79fDfPA2Z86ccm8PAKCsSv4ikFK44YYbYt68eYf93MiRI0u8GwCAweWEDMDa2tqora0t9zYAAAalE/JHwAAAHJkABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASMywcm+AY8uy0s5VqDGlXq/UeyrkXIVcb6Aq+TwMhOMr7Tko5LEdj0o9D4Px+VnouRjcXAEEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEjMsHJvgCPL5d7/M8uOPWag40oxppLXOzSuktcrxL6sV/r1CjlXOdbLsmM/l49nrqMp53PhaGML9Xe5kHOV67lXqLmOtW8+OlcAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABJTMQHY1tYW5513Xrm3AQBQ8SomAAtt3759sWDBgqiuro6xY8dGa2trvPnmm+XeFgBA0SUbgAsWLIgtW7ZER0dHfP/734//+I//iC996Uvl3hYAQNEVJQBnz54dixYtisWLF0dtbW2MGzcu2tra8p/fsWNHzJ07N0aPHh3V1dUxb9682LNnT7857rrrrqirq4sxY8ZEa2trHDx48EPrrF69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/vNs7ty5fg1MEc7za6+9lj3//PPZD37wgywiskcffTR7/vnns9/+9rclP77BpNDn+u23386uvPLK7PTTT882b97c79c59Pb2luUYB4NCn+c333wzu+2227INGzZkv/71r7NNmzZlf/7nf55VVVVlL774YlmOcbAoxteP/8+rgAt/nt94443sa1/7WrZhw4Zs+/bt2VNPPZX9wR/8QXb22WdnBw8eLMsxVhIBWAL33XdfdsYZZ2QnnXRSdsEFF2QbN27Mf27WrFnZNddc02/8unXrsk996lPZSSedlJ1zzjnZD37wg36f7+vry5YsWZLV1dVlVVVV2eWXX5798pe/LMWhDGqFPs8PPfRQFhEfui1btqwERzO4FfJcH/o1O4e7/fjHPy7REQ1OhTzPv/vd77I//dM/zRoaGrKTTjopq6+vz6688srsmWeeKdXhDGqF/vrx/wnA9xXyPP/v//5vdsUVV2S/93u/lw0fPjw788wzs+uvvz4flBxdLsuyrDzXHgEAKAf/BhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDECEAAgMQIQACAxAhAAIDH/Bx8t/0b+Fn1kAAAAAElFTkSuQmCC",
"text/html": [
"\n",
"
\n",
"
\n",
" Figure\n",
"
\n",
- "

\n",
+ "

\n",
"
\n",
" "
],
@@ -228,21 +229,1032 @@
"execution_count": 10,
"metadata": {},
"outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "On time deadline: Deadline(chain_id=0, deadline=0.0003, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0003, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0004, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0004, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0005, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0005, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0006, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0006, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0007, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0007, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0008, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0008, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0009, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0009, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.001, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.001, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0011, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0011, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0012, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0012, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0013, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0013, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0014, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0014, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0015, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0015, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0016, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0016, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0017, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0017, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0018, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0018, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0019, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0019, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.002, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.002, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0021, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0021, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0022, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0022, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0023, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0023, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0024, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0024, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0025, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0025, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0026, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0026, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0027, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0027, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0028, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0028, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0029, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0029, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.003, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.003, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0031, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0031, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0032, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0032, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0033, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0033, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0034, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0034, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0035, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0035, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0036, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0036, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0037, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0037, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0038, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0038, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0039, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0039, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.004, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.004, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0041, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0041, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0042, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0043, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0042, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0043, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0044, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0044, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0045, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0046, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0045, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0047, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0046, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0048, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0047, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0048, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0049, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0049, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.005, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.005, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0051, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0051, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0052, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0053, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0052, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0054, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0053, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0055, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0054, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0055, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0056, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0057, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0056, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0057, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0058, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0058, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0059, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0059, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.006, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.006, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0061, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0061, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0062, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0062, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0063, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0063, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0064, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0064, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0065, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0065, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0066, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0066, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0067, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0067, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0068, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0069, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0068, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0069, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.007, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0071, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.007, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0071, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0072, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0072, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0073, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0073, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0074, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0074, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0075, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0075, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0076, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0076, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0077, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0077, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0078, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0078, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0079, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0079, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.008, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.008, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0081, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0081, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0082, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0082, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0083, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0083, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0084, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0084, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0085, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0085, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0086, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0086, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0087, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0087, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0088, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0088, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0089, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0089, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.009, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.009, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0091, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0091, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0092, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0092, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0093, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0093, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0094, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0094, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0095, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0095, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0096, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0096, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0097, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0097, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0098, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0098, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0099, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0099, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.01, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.01, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0101, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0101, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0102, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0102, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0103, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0103, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0104, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0104, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0105, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0105, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0106, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0106, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0107, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0107, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0108, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0108, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0109, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0109, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.011, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.011, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0111, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0111, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0112, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0112, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0113, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0113, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0114, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0114, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0115, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0115, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0116, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0116, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0117, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0117, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0118, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0118, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0119, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0119, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.012, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.012, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0121, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0121, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0122, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0122, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0123, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0123, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0124, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0124, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0125, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0125, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0126, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0126, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0127, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0127, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0128, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0128, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0129, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0129, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.013, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.013, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0131, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0131, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0132, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0132, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0133, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0133, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0134, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0134, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0135, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0135, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0136, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0136, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0137, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0137, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0138, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0138, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0139, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0139, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.014, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.014, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0141, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0141, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0142, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0142, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0143, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0143, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0144, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0144, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0145, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0145, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0146, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0146, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0147, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0147, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0148, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0148, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0149, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0149, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.015, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.015, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0151, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0151, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0152, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0152, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0153, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0153, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0154, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0155, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0154, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0156, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0155, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0157, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0156, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0158, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0157, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0158, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0159, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.016, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0159, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.016, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0161, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0161, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0162, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0162, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0163, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0164, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0163, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0165, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0164, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0165, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0166, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0167, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0166, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0167, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0168, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0169, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0168, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0169, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.017, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0171, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.017, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0171, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0172, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0173, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0172, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0173, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0174, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0175, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0174, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0175, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0176, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0177, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0176, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0177, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0178, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0179, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0178, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0179, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.018, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.018, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0181, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0181, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0182, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0182, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0183, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0183, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0184, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0185, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0184, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0185, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0186, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0186, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0187, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0187, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0188, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0188, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0189, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.019, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0189, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0191, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.019, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0191, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0192, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0193, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0192, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0193, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0194, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0195, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0194, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0196, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0195, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0196, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0197, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0197, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0198, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0198, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0199, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0199, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.02, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.02, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0201, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0201, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0202, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0202, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0203, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0203, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0204, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0204, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0205, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0205, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0206, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0206, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0207, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0207, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0208, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0208, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0209, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0209, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.021, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.021, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0211, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0211, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0212, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0212, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0213, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0213, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0214, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0214, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0215, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0215, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0216, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0216, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0217, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0217, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0218, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0218, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0219, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0219, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.022, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.022, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0221, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0221, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0222, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0222, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0223, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0223, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0224, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0224, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0225, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0225, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0226, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0226, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0227, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0227, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0228, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0228, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0229, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0229, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.023, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.023, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0231, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0231, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0232, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0232, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0233, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0233, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0234, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0234, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0235, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0235, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0236, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0236, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0237, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0237, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0238, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0238, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0239, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0239, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.024, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.024, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0241, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0241, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0242, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0242, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0243, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0243, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0244, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0244, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0245, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0245, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0246, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0246, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0247, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0247, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0248, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0248, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0249, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0249, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.025, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.025, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0251, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0251, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0252, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0252, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0253, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0253, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0254, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0254, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0255, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0255, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0256, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0256, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0257, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0257, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0258, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0258, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0259, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0259, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.026, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.026, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0261, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0261, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0262, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0262, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0263, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0263, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0264, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0264, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0265, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0265, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0266, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0266, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0267, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0267, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0268, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0268, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0269, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.027, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0269, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.027, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0271, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0272, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0271, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0272, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0273, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0274, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0273, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0274, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0275, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0275, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0276, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0277, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0276, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0277, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0278, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0279, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0278, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0279, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.028, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0281, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.028, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0281, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0282, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0283, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0282, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0283, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0284, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0285, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0284, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0285, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0286, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0287, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0286, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0287, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0288, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0288, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0289, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.029, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0289, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.029, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0291, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0292, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0291, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0292, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0293, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0294, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0293, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0294, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0295, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0296, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0295, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0296, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0297, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0298, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0297, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0298, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0299, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.03, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0299, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.03, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0301, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0302, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0301, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0302, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0303, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0304, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0303, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0304, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0305, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0306, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0305, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0306, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0307, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0308, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0307, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0308, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0309, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.031, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0309, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0311, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.031, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0312, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0311, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0312, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0313, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0314, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0313, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0314, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0315, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0316, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0315, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0316, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0317, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0318, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0317, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0318, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0319, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.032, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0319, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.032, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0321, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0322, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0321, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0322, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0323, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0324, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0323, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0324, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0325, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0326, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0325, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0326, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0327, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0328, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0327, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0328, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0329, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.033, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0329, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.033, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0331, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0332, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0331, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0332, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0333, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0334, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0333, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0334, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0335, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0336, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0335, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0336, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0337, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0338, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0337, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0338, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0339, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.034, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0339, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.034, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0341, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0342, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0341, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0342, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0343, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0343, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0344, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0344, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0345, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0346, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0345, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0346, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0347, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0348, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0347, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0348, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0349, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0349, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.035, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0351, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.035, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0351, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0352, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0353, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0352, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0353, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0354, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0355, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0354, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0356, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0355, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0357, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0356, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0357, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0358, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0359, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0358, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.036, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0359, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.036, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0361, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0362, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0361, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0363, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0362, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0363, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0364, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0364, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0365, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0365, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0366, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0367, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0366, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0367, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0368, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0369, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0368, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.037, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0369, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0371, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.037, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0372, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0371, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0372, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0373, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0373, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0374, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0375, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0374, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0376, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0375, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0376, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0377, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0377, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0378, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0378, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0379, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.038, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0379, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0381, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.038, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0381, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0382, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0383, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0382, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0383, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0384, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0385, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0384, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0385, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0386, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0387, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0386, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0387, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0388, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0388, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0389, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0389, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.039, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.039, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0391, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0392, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0391, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0392, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0393, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0394, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0393, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0394, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0395, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0396, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0395, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0396, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0397, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0397, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0398, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0398, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0399, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.04, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0399, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.04, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0401, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0402, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0401, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0402, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0403, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0403, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0404, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0404, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0405, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0406, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0405, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0406, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0407, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0408, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0407, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0408, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0409, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.041, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0409, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.041, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0411, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0412, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0411, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0412, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0413, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0413, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0414, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0414, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0415, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0415, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0416, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0417, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0416, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0417, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0418, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0419, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0418, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.042, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0419, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0421, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.042, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0421, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0422, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0422, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0423, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0424, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0423, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0425, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0424, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0425, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0426, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0427, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0426, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0427, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0428, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0429, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0428, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0429, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.043, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.043, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0431, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0432, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0431, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0433, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0432, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0434, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0433, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0434, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0435, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0435, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0436, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0436, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0437, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0437, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0438, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0438, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0439, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0439, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.044, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.044, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0441, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0441, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0442, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0442, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0443, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0443, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0444, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0444, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0445, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0446, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0445, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0447, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0446, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0447, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0448, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0449, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0448, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.045, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0449, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0451, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.045, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0451, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0452, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0453, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0452, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0453, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0454, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0455, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0454, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0455, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0456, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0457, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0456, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0457, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0458, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0459, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0458, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0459, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.046, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.046, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0461, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0462, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0461, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0462, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0463, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0463, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0464, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0464, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0465, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0465, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0466, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0466, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0467, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0468, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0467, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0468, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0469, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.047, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0469, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.047, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0471, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0472, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0471, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0472, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0473, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0474, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0473, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0475, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0474, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0475, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0476, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0476, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0477, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0478, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0477, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0478, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0479, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.048, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0479, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.048, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0481, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0481, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0482, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0482, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0483, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0484, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0483, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0484, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0485, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0485, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0486, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0486, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0487, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0487, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0488, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0488, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0489, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.049, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0489, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0491, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.049, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0491, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0492, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0492, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0493, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0494, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0493, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0494, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0495, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0496, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0495, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0496, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0497, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0497, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0498, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0498, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0499, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0499, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.05, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.05, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0501, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0501, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0502, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0502, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0503, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0503, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0504, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=0, deadline=0.0505, on_time=1)\n",
+ "On time deadline: Deadline(chain_id=1, deadline=0.0504, on_time=1)\n"
+ ]
+ },
{
"data": {
"application/vnd.jupyter.widget-view+json": {
- "model_id": "9f92a0a66e734ecd994bf447537c04c6",
+ "model_id": "bdb0bc3eb0004c57851767172be9370d",
"version_major": 2,
"version_minor": 0
},
- "image/png": "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L8aiRYvitdde6/0TyIAALKJXX3013n///aiqqupxf1VVVbzyyivHfMwrr7zyscd/+N9PMubprhjrTE99scaHDx+OZcuWxZ/92Z/1yR+CH4iKuc4/+tGPYvTo0TFixIj43ve+F62trTF27NjePYFBoFhr/N3vfjeGDRsWS5Ys6f1JD0LFWufGxsb44Q9/GE899VR897vfjc2bN8ecOXPi/fff7/2TOM0N6+8JALz77rsxb968SCnF3/3d3/X3dE5LV155ZezcuTNeffXVWLt2bcybNy+2bdsWn/vc5/p7aoPeM888E3/7t38b//3f/x0lJSX9PZ3T2le/+tXCx7W1tTFt2rSYNGlS/OQnP4mrrrqqH2c2+LgCWERjx46NoUOHxv79+3vcv3///hg3btwxHzNu3LiPPf7D/36SMU93xVhneirmGn8Yfy+99FK0trZme/UvorjrPGrUqDjvvPPi0ksvjR/84AcxbNiw+MEPftC7JzAIFGON/+u//isOHDgQ55xzTgwbNiyGDRsWL730Uvz1X/91fOELXyjKeQx0ffXv8sSJE2Ps2LHxwgsvnPqkMyMAi+iMM86Iiy66KJ566qnCfd3d3fHUU09FfX39MR9TX1/f4/iIiNbW1sLxEyZMiHHjxvU4pqurK7Zt23bcMU93xVhneirWGn8Yf88//3w8+eST8ZnPfKY4JzBI9OXXcnd3dxw5cuTUJz3IFGONr7322vjFL34RO3fuLGzjx4+PW2+9NR5//PHincwA1ldfy7/5zW/itddei+rq6t6ZeE76+6dQTncPP/xwKi0tTQ8++GDavXt3+trXvpYqKirSK6+8klJK6dprr03f/va3C8f/9Kc/TcOGDUv33ntvamtrSytXrjzmr4GpqKhIjz32WPrFL36R5s6d69fAFGGdX3vttfTss8+mH//4xyki0sMPP5yeffbZ9Nvf/rbPz28g6O01fuedd9I111yTzj777LRz584ev9bhyJEj/XKOA0Fvr/Obb76ZbrvttrRly5b061//Ou3YsSP9+Z//eSotLU3PPfdcv5xjfyvGvxf/l58C7v11fuONN9K3vvWttGXLlvTiiy+mJ598Mv3+7/9++r3f+710+PDhfjnHwUwA9oH77rsvnXPOOemMM85Il1xySdq6dWth36xZs9L111/f4/hNmzal888/P51xxhnpggsuSD/+8Y977O/u7k7Lly9PVVVVqbS0NF111VXpV7/6VV+cyoDW2+u8fv36FBFHbStXruyDsxmYenONP/z1Osfann766T46o4GpN9f57bffTn/yJ3+Sxo8fn84444xUXV2drrnmmrR9+/a+Op0Bqbf/vfi/BOAHenOd//d//zddffXV6bOf/WwaPnx4Ovfcc9NNN91UCEo+mZKUUuqfa48AAPQH3wMIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJAZAQgAkBkBCACQGQEIAJCZ/w/Wdq4F5OFHHAAAAABJRU5ErkJggg==",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAI9hJREFUeJzt3XtwlfWd+PFPuBgQSEJkzaVGC2LL5ReKC8pFR7Bk3LA7I7vtNtRhvOxEu+Bu0boV68wCwWK0XqbseNlV6CrOMKvsrLPOWGfd6Las00IUV6pC2qmBChWBVoSISlTy/P7Y8awpoig5uX1fr5kz5JzzPN/zfb7JJO95Dk9SkGVZFgAAJGNAT08AAIDuJQABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIzqKcn0Jd1dHTE7t27Y8SIEVFQUNDT0wEAjkOWZfHWW29FZWVlDBiQ5rkwAXgCdu/eHVVVVT09DQDgc9i1a1ecdtppPT2NHiEAT8CIESMi4n+/gIqKinp4NgDA8Whra4uqqqrcz/EUCcAT8OHbvkVFRQIQAPqYlP/7VppvfAMAJEwAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkRgACACRGAAIAJEYAAgAkxt8C7qU6Ojpi36F98bt3fhdZR3bUc28efjMiIkYOGRkDBhzd8Z+2jTGMYQxjGMMYvXWMLMuivaM9Rp08Ks4oOSMGDhx41BicGAHYS/3+nd9HxQ8renoaANCjti/eHqNHju7pafQ73gIGAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASIwABABIjAAEAEiMAAQASEyfCcCGhoaYPHlyT08DAKDP6zMB2JV+85vfRH19fYwePTqGDh0aZ555Zixfvjzee++9np4aAEDeDerpCfSEX/7yl9HR0RH33XdfjB07Nl5++eW46qqr4u2334477rijp6cHAJBXeTkDOHv27Fi8eHEsWbIkSktLo7y8PBoaGnLP79y5M+bNmxfDhw+PoqKiqKuri71793Ya49Zbb42ysrIYMWJE1NfXx+HDh496nTVr1sT48eNjyJAhMW7cuLj33nuPa361tbXxwAMPxEUXXRRjxoyJiy++OL773e/Go48+ekLHDQDQF+TtLeC1a9fGsGHDorm5OW677ba46aaboqmpKTo6OmLevHmxf//+2LBhQzQ1NcX27dtj/vz5uX3Xr18fDQ0N0djYGJs3b46Kioqj4m7dunWxbNmyuPnmm6OlpSUaGxtj6dKlsXbt2s8134MHD0ZpaekJHTMAQF9QkGVZ1tWDzp49O44cORLPPPNM7rFzzz03vvrVr8acOXNi7ty5sWPHjqiqqoqIiG3btsXEiRPj2WefjXPOOSdmzpwZZ599dtxzzz25/adPnx6HDx+OLVu2RETE2LFj4/vf/35ccskluW1WrlwZTzzxRPz85z//TPN95ZVXYsqUKXHHHXfEVVdddczt2tvbo729PXe/ra0tqqqq4uDBg1FUVPSZXvPT7Du0L8ruLOvSMQGgr9m+eHuMHjm6S8dsa2uL4uLivPz87ivydgZw0qRJne5XVFTEvn37oqWlJaqqqnLxFxExYcKEKCkpiZaWloiIaGlpiWnTpnXaf8aMGbmP33777WhtbY36+voY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DyABAjCPfv/738eRI0eirKys0+NlZWWxZ8+ej91nz549n7j9h/9+ljH7u3ysM511xxofPnw4brjhhrjkkku65Q/B90b5XOfHH388hg8fHkOGDIkf/vCH0dTUFKNGjeraA+gD8rXGP/jBD2LQoEGxePHirp90H5Svda6trY2HHnoonn766fjBD34QGzZsiLlz58aRI0e6/iD6uUE9PQGA999/P+rq6iLLsvjHf/zHnp5Ov3ThhRfGli1b4ve//32sXr066urqorm5OU499dSenlqf9/zzz8c//MM/xP/8z/9EQUFBT0+nX/vmN7+Z+7i6ujomTZoUZ555Zvz0pz+NOXPm9ODM+h5nAPNo1KhRMXDgwNi7d2+nx/fu3Rvl5eUfu095efknbv/hv59lzP4uH+tMZ/lc4w/j79VXX42mpqZkz/5F5Hedhw0bFmPHjo3p06fHj370oxg0aFD86Ec/6toD6APyscbPPPNM7Nu3L04//fQYNGhQDBo0KF599dX4u7/7u/jiF7+Yl+Po7brr+/KYMWNi1KhR8corr5z4pBMjAPPopJNOiilTpsTTTz+de6yjoyOefvrpmDFjxsfuM2PGjE7bR0Q0NTXlth89enSUl5d32qatrS2am5uPOWZ/l491prN8rfGH8ffrX/86nnrqqTjllFPycwB9RHd+LXd0dER7e/uJT7qPyccaX3rppfHiiy/Gli1bcrfKysq4/vrr48knn8zfwfRi3fW1/Nvf/jbeeOONqKio6JqJp6Snr0Lp7x5++OGssLAwe/DBB7Nt27Zl3/rWt7KSkpJsz549WZZl2aWXXpp973vfy23/s5/9LBs0aFB2xx13ZC0tLdny5cs/9tfAlJSUZI899lj24osvZvPmzfNrYPKwzm+88Ub2wgsvZD/+8Y+ziMgefvjh7IUXXshef/31bj++3qCr1/i9997LLr744uy0007LtmzZ0unXOrS3t/fIMfYGXb3Ohw4dym688cZs48aN2W9+85ts8+bN2V/91V9lhYWF2csvv9wjx9jT8vH94g+5Crjr1/mtt97Kvvvd72YbN27MduzYkT311FPZH//xH2dnnXVWdvjw4R45xr5MAHaDu+66Kzv99NOzk046KTv33HOzTZs25Z6bNWtWdvnll3fafv369dmXvvSl7KSTTsomTpyY/fjHP+70fEdHR7Z06dKsrKwsKywszObMmZP96le/6o5D6dW6ep0feOCBLCKOui1fvrwbjqZ36so1/vDX63zc7Sc/+Uk3HVHv1JXr/O6772Z/8Rd/kVVWVmYnnXRSVlFRkV188cXZs88+212H0yt19feLPyQA/1dXrvM777yTXXTRRdkf/dEfZYMHD87OOOOM7KqrrsoFJZ9NQZZlWc+cewQAoCf4P4AAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIkRgAAAiRGAAACJEYAAAIn5/ysNasRZiL3iAAAAAElFTkSuQmCC",
"text/html": [
"\n",
" \n",
"
\n",
" Figure\n",
"
\n",
- "

\n",
+ "

\n",
"
\n",
" "
],
@@ -263,7 +1275,9 @@
"# 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",
+ " if deadline.on_time:\n",
+ " print(\"On time deadline: \", deadline)\n",
+ " ax.plot([deadline.deadline, deadline.deadline], [0, num_nodes], color=('green' if deadline.on_time else 'red'))\n",
"\n",
"ax.set_yticks(range(num_nodes))\n",
"ax.set_yticklabels(name_to_id.keys())\n",
diff --git a/results/casestudy_example/.gitignore b/results/casestudy_example/.gitignore
deleted file mode 100644
index e69de29..0000000
diff --git a/src/casestudy/src/casestudy_2023customfile_singlethread.cpp b/src/casestudy/src/casestudy_2023customfile_singlethread.cpp
index 71c09fe..92f4960 100755
--- a/src/casestudy/src/casestudy_2023customfile_singlethread.cpp
+++ b/src/casestudy/src/casestudy_2023customfile_singlethread.cpp
@@ -111,11 +111,11 @@ int main(int argc, char* argv[]) {
for (uint j = 0; j < root["node_ids"][i].size(); j++) {
node_ids_row.push_back(root["node_ids"][i][j].asUInt());
}
- config.node_ids.push_back(std::move(node_ids_row));
+ config.callback_ids.push_back(std::move(node_ids_row));
}
for (uint i = 0; i < root["node_priorities"].size(); i++) {
- config.node_priorities.push_back(root["node_priorities"][i].asUInt());
+ config.callback_priorities.push_back(root["node_priorities"][i].asUInt());
}
config.num_groups = 0;
@@ -125,7 +125,7 @@ int main(int argc, char* argv[]) {
}
for (uint i = 0; i < root["node_runtimes"].size(); i++) {
- config.node_runtimes.push_back(root["node_runtimes"][i].asDouble());
+ config.callback_runtimes.push_back(root["node_runtimes"][i].asDouble());
}
for (uint i = 0; i < root["chain_periods"].size(); i++) {
@@ -133,7 +133,7 @@ int main(int argc, char* argv[]) {
}
for (uint i = 0; i < root["node_executor_assignments"].size(); i++) {
- config.node_executor_assignments.push_back(root["node_executor_assignments"][i].asUInt() - 1);
+ config.callback_executor_assignments.push_back(root["node_executor_assignments"][i].asUInt() - 1);
}
for (uint i = 0; i < root["executor_to_cpu_core"].size(); i++) {
diff --git a/src/casestudy/src/casestudy_2024ours_executor2executor.cpp b/src/casestudy/src/casestudy_2024ours_executor2executor.cpp
index b85a0fa..368e493 100755
--- a/src/casestudy/src/casestudy_2024ours_executor2executor.cpp
+++ b/src/casestudy/src/casestudy_2024ours_executor2executor.cpp
@@ -122,28 +122,28 @@ int main(int argc, char* argv[]) {
// runtimes and timers subject to change
config.chain_lengths = {};
- config.node_ids = {};
+ config.callback_ids = {};
config.chain_timer_control = {};
config.chain_periods = {};
- config.node_runtimes = {};
- config.node_executor_assignments = {};
+ config.callback_runtimes = {};
+ config.callback_executor_assignments = {};
int node_id = 0;
for (int c = 0; c < num_chains; c++) {
- config.node_ids.push_back({});
+ config.callback_ids.push_back({});
for (int i = 0; i < num_s + 1; i++) {
- config.node_ids[c].push_back(node_id);
+ config.callback_ids[c].push_back(node_id);
if (i == 0) {
// first node is the publisher, and goes in the first executor
- config.node_executor_assignments.push_back(0);
+ config.callback_executor_assignments.push_back(0);
} else {
// all other nodes go in the second executor
- config.node_executor_assignments.push_back(1);
+ config.callback_executor_assignments.push_back(1);
}
node_id++;
}
for (int i = 0; i < num_s + 1; i++) {
- config.node_priorities.push_back(i);
- config.node_runtimes.push_back(runtime);
+ config.callback_priorities.push_back(i);
+ config.callback_runtimes.push_back(runtime);
}
config.chain_lengths.push_back(num_s+1);
config.chain_periods.push_back(10);
@@ -153,9 +153,9 @@ int main(int argc, char* argv[]) {
config.executor_to_cpu_assignments = {0, 1};
std::cout << "node ids: " << std::endl;
- for (size_t i = 0; i < config.node_ids.size(); i++) {
- for (size_t j = 0; j < config.node_ids[i].size(); j++) {
- std::cout << config.node_ids[i][j] << " ";
+ for (size_t i = 0; i < config.callback_ids.size(); i++) {
+ for (size_t j = 0; j < config.callback_ids[i].size(); j++) {
+ std::cout << config.callback_ids[i][j] << " ";
}
std::cout << std::endl;
}
diff --git a/src/casestudy/src/casestudy_2024ours_latency.cpp b/src/casestudy/src/casestudy_2024ours_latency.cpp
index 9128e65..373b939 100755
--- a/src/casestudy/src/casestudy_2024ours_latency.cpp
+++ b/src/casestudy/src/casestudy_2024ours_latency.cpp
@@ -117,32 +117,32 @@ int main(int argc, char* argv[]) {
// runtimes and timers subject to change
config.chain_lengths = {};
- config.node_ids = {};
+ config.callback_ids = {};
config.chain_timer_control = {};
config.chain_periods = {};
- config.node_runtimes = {};
+ config.callback_runtimes = {};
int node_id = 0;
for (int c = 0; c < num_chains; c++) {
- config.node_ids.push_back({});
+ config.callback_ids.push_back({});
for (int i = 0; i < num_s + 1; i++) {
- config.node_ids[c].push_back(node_id);
+ config.callback_ids[c].push_back(node_id);
node_id++;
}
for (int i = 0; i < num_s + 1; i++) {
- config.node_priorities.push_back(i);
+ config.callback_priorities.push_back(i);
}
config.chain_lengths.push_back(num_s + 1);
config.chain_periods.push_back(10);
for (int i = 0; i < num_s + 1; i++) {
- config.node_runtimes.push_back(runtime);
+ config.callback_runtimes.push_back(runtime);
}
config.chain_timer_control.push_back(c);
}
std::cout << "node ids: " << std::endl;
- for (size_t i = 0; i < config.node_ids.size(); i++) {
- for (size_t j = 0; j < config.node_ids[i].size(); j++) {
- std::cout << config.node_ids[i][j] << " ";
+ for (size_t i = 0; i < config.callback_ids.size(); i++) {
+ for (size_t j = 0; j < config.callback_ids[i].size(); j++) {
+ std::cout << config.callback_ids[i][j] << " ";
}
std::cout << std::endl;
}
@@ -150,7 +150,7 @@ int main(int argc, char* argv[]) {
config.num_groups = 0;
config.group_memberships = {}; // no groups
- config.node_executor_assignments = {};
+ config.callback_executor_assignments = {};
// config.node_executor_assignments = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
config.parallel_mode = false;
config.cores = 1;
diff --git a/src/casestudy/src/casestudy_example.cpp b/src/casestudy/src/casestudy_example.cpp
index ca9ac06..776036c 100644
--- a/src/casestudy/src/casestudy_example.cpp
+++ b/src/casestudy/src/casestudy_example.cpp
@@ -108,14 +108,14 @@ int main(int argc, char* argv[]) {
ExperimentConfig config;
config.chain_lengths = {2, 2};
- config.node_ids = {{0, 1}, {2, 3}};
- config.node_priorities = {1, 0, 3, 2};
+ config.callback_ids = {{0, 1}, {2, 3}};
+ config.callback_priorities = {1, 0, 3, 2};
config.chain_timer_control = {0, 1};
- config.node_runtimes = {10, 10, 10, 10};
+ config.callback_runtimes = {10, 10, 10, 10};
// node 0 has a period of 80, and is the only timer
config.chain_periods = {100, 100};
- config.node_executor_assignments = {};
+ config.callback_executor_assignments = {};
config.parallel_mode = true;
config.cores = 2;
diff --git a/src/casestudy/src/casestudy_fire_drone.cpp b/src/casestudy/src/casestudy_fire_drone.cpp
index 409a7e9..06b477d 100644
--- a/src/casestudy/src/casestudy_fire_drone.cpp
+++ b/src/casestudy/src/casestudy_fire_drone.cpp
@@ -97,7 +97,7 @@ int ros_experiment(
t.join();
}
- std::string const outputname = "casestudy_example";
+ std::string const outputname = "casestudy_wildfire_drone";
experiment.writeLogsToFile(file_name, outputname);
/*
@@ -140,17 +140,34 @@ int main(int argc, char* argv[]) {
calibrate_dummy_load();
ExperimentConfig config;
- config.chain_lengths = {2, 2};
- config.node_ids = {{0, 1}, {2, 3}};
- config.node_priorities = {1, 0, 3, 2};
- config.chain_timer_control = {0, 1};
+ // call back id: 0 1 2 3 4 5 6 7 8 9 10 11 12 13
+ config.callback_priorities = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ // duration of the callback in ms
+ config.callback_runtimes = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
- config.node_runtimes = {10, 10, 10, 10};
- // node 0 has a period of 80, and is the only timer
- config.chain_periods = {100, 100};
- config.node_executor_assignments = {};
- config.parallel_mode = true;
- config.cores = 2;
+ // we have four chains where
+ // - the first is 1 + numOf(radiometric corrections) + 1 long
+ // - the second is 1 + numOf(radiometric corrections) + numOf(geometric corrections) + 1 long
+ // - the third is 3 long
+ // - the fourth is 4 long
+ config.callback_ids = {
+ {1, 2, 3, 0},
+ {1, 2, 3, 4, 5, 6},
+ {1, 2, 3, 4, 5, 6, 9, 7, 8},
+ {9, 12, 13, 10, 11}
+ };
+ config.chain_lengths = {4, 6, 9, 5};
+
+ // period of the timer of the starting node in ms - thus basically sensor frequency
+ config.chain_periods = {100, 100, 100, 100};
+ config.chain_timer_control = {0, 0, 0, 0};
+
+ // TODO: ?
+ config.callback_executor_assignments = {};
+ config.parallel_mode = false;
+ config.cores = 1;
+
+ // TODO: you can add nodes to the config - what does it do? do we want that?
sanity_check_config(config);
diff --git a/src/casestudy_tools/include/casestudy_tools/experiment.hpp b/src/casestudy_tools/include/casestudy_tools/experiment.hpp
index 5254e98..e746fbd 100755
--- a/src/casestudy_tools/include/casestudy_tools/experiment.hpp
+++ b/src/casestudy_tools/include/casestudy_tools/experiment.hpp
@@ -11,14 +11,18 @@
struct ExperimentConfig
{
std::vector chain_lengths;
- // TODO: rename to callback_ids
- std::vector> node_ids;
- // TODO: rename to callback_runtimes
- std::vector node_runtimes;
- // TODO: rename to callback_priorities
- std::vector node_priorities;
+ std::vector> callback_ids;
+
+ // duration of the callback in ms
+ std::vector callback_runtimes;
+
+ // used for picas or in edf as tie breaker
+ std::vector callback_priorities;
+
+ // period of the timer of the starting node in ms
std::vector chain_periods;
- // for each chain, the index of the timer node
+
+ // for each chain, the index of the timer node - TODO: why would I ever want this to be non 0?
std::vector chain_timer_control;
uint num_groups = 0;
@@ -29,8 +33,8 @@ struct ExperimentConfig
std::string executor_type = "default";
// if this is empty, then the nodes will be assigned to a single executor
- // TODO: rename this to callback_executor_assignments
- std::vector node_executor_assignments;
+ std::vector callback_executor_assignments;
+
// used in single-threaded mode to assign executors to cores
std::vector executor_to_cpu_assignments;
diff --git a/src/casestudy_tools/src/experiment.cpp b/src/casestudy_tools/src/experiment.cpp
index 2e936fc..be82510 100755
--- a/src/casestudy_tools/src/experiment.cpp
+++ b/src/casestudy_tools/src/experiment.cpp
@@ -1,17 +1,20 @@
#include "casestudy_tools/experiment.hpp"
-#include "casestudy_tools/primes_workload.hpp"
#include "casestudy_tools/test_nodes.hpp"
-#include "priority_executor/multithread_priority_executor.hpp"
+#include "casestudy_tools/primes_workload.hpp"
+
#include "priority_executor/priority_executor.hpp"
#include "priority_executor/priority_memory_strategy.hpp"
+#include "priority_executor/multithread_priority_executor.hpp"
-#include
#include
-#include
-#include
#include
-#include
#include
+#include
+#include
+#include
+#include
+#include
+
Experiment::Experiment(ExperimentConfig config)
: config(std::move(config)) {
@@ -20,19 +23,19 @@ Experiment::Experiment(ExperimentConfig config)
void sanity_check_config(ExperimentConfig const &config) {
// make sure chain_lengths and node_ids are the same size
- if (config.chain_lengths.size() != config.node_ids.size()) {
+ if (config.chain_lengths.size() != config.callback_ids.size()) {
std::cout << "ros_experiment: chain_lengths.size()= "
<< config.chain_lengths.size()
- << " != node_ids.size()= " << config.node_ids.size() << std::endl;
+ << " != node_ids.size()= " << config.callback_ids.size() << std::endl;
exit(1);
}
// make sure each chain_lengths is the same size as the corresponding node_ids
for (uint32_t i = 0; i < config.chain_lengths.size(); i++) {
- if (config.chain_lengths[i] != config.node_ids[i].size()) {
+ if (config.chain_lengths[i] != config.callback_ids[i].size()) {
std::cout << "ros_experiment: chain_lengths[" << i
<< "]= " << config.chain_lengths[i] << " != node_ids[" << i
- << "].size()= " << config.node_ids[i].size() << std::endl;
+ << "].size()= " << config.callback_ids[i].size() << std::endl;
exit(1);
}
}
@@ -47,22 +50,22 @@ void sanity_check_config(ExperimentConfig const &config) {
}
std::set all_node_ids;
- for (auto const &chain : config.node_ids) {
+ for (auto const &chain : config.callback_ids) {
for (auto const &node_id : chain) {
all_node_ids.insert(node_id);
}
}
// make sure we have the right number of node_priorities and node_runtimes
- if (all_node_ids.size() != config.node_priorities.size()) {
+ if (all_node_ids.size() != config.callback_priorities.size()) {
std::cout << "ros_experiment: all_node_ids.size()= " << all_node_ids.size()
- << " != node_priorities.size()= " << config.node_priorities.size()
+ << " != node_priorities.size()= " << config.callback_priorities.size()
<< std::endl;
exit(1);
}
- if (all_node_ids.size() != config.node_runtimes.size()) {
+ if (all_node_ids.size() != config.callback_runtimes.size()) {
std::cout << "ros_experiment: all_node_ids.size()= " << all_node_ids.size()
- << " != node_runtimes.size()= " << config.node_runtimes.size()
+ << " != node_runtimes.size()= " << config.callback_runtimes.size()
<< std::endl;
exit(1);
}
@@ -71,7 +74,7 @@ void sanity_check_config(ExperimentConfig const &config) {
std::string Experiment::run(std::atomic& should_do_task) {
// TODO: split into setup and run, so that run can be re-used in
// Experiment::getRunFunctions
- if (!config.node_executor_assignments.empty()
+ if (!config.callback_executor_assignments.empty()
|| numExecutorsRequired(config) != 1) {
std::cerr << "called Experiment::run with non-empty node_executor_assignments"
<< std::endl;
@@ -124,12 +127,12 @@ Experiment::getRunFunctions() {
}
size_t Experiment::numExecutorsRequired(ExperimentConfig const &config) {
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
return 1;
}
std::set unique_executors;
- for (auto const &assignment : config.node_executor_assignments) {
+ for (auto const &assignment : config.callback_executor_assignments) {
unique_executors.insert(assignment);
}
return unique_executors.size();
@@ -140,7 +143,7 @@ experiment_executor Experiment::getExecutor(int const executor_idx) {
}
void Experiment::createExecutors() {
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
// Create a single executor
executors.push_back(createSingleExecutor(0));
return;
@@ -161,12 +164,10 @@ void Experiment::createExecutors() {
exit(1);
}
- // Create the required host nodes - re-use any existing nodes
- for (uint i = config.nodes.size();
- i < config.executor_to_cpu_assignments.size(); i++) {
+ // Create the required host nodes - re-use any existing nodes (by not starting at 0)
+ for (uint i = config.nodes.size(); i < config.executor_to_cpu_assignments.size(); i++) {
// create a node for each executor
- auto const node = std::make_shared(
- "node_" + std::to_string(i));
+ auto const node = std::make_shared("node_" + std::to_string(i));
config.nodes.push_back(node);
}
std::cout << "created " << config.nodes.size() << " nodes" << std::endl;
@@ -195,7 +196,7 @@ experiment_executor Experiment::createSingleExecutor(uint const executor_num) {
executor.executor->prio_memory_strategy_ = executor.strat;
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
// Add all nodes to the executor
for (auto const &node : config.nodes) {
executor.executor->add_node(node);
@@ -215,7 +216,7 @@ experiment_executor Experiment::createSingleExecutor(uint const executor_num) {
executor.default_executor = std::make_shared();
}
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
// Add all nodes to the executor
for (auto const &node : config.nodes) {
executor.default_executor->add_node(node);
@@ -232,11 +233,11 @@ experiment_executor Experiment::createSingleExecutor(uint const executor_num) {
}
experiment_executor Experiment::getExecutorForNode(int const node_id) {
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
return executors[0];
}
- int const executor_idx = config.node_executor_assignments[node_id];
+ int const executor_idx = config.callback_executor_assignments[node_id];
std::cout << "node " << node_id << " assigned to executor " << executor_idx
<< std::endl;
return executors[executor_idx];
@@ -280,14 +281,14 @@ void Experiment::createNodesAndAssignProperties() {
}
// for each chain
- for (uint32_t chain_id = 0; chain_id < config.node_ids.size(); chain_id++) {
+ for (uint32_t chain_id = 0; chain_id < config.callback_ids.size(); chain_id++) {
all_nodes.push_back(std::vector>());
// for each node in the chain
bool first_node = true;
for (uint32_t node_chain_idx = 0;
- node_chain_idx < config.node_ids[chain_id].size(); node_chain_idx++) {
- uint32_t const node_id = config.node_ids[chain_id][node_chain_idx];
+ node_chain_idx < config.callback_ids[chain_id].size(); node_chain_idx++) {
+ uint32_t const node_id = config.callback_ids[chain_id][node_chain_idx];
// has this node been created yet?
if (nodes.find(node_id) != nodes.end()) {
// if it has, then this node exists in another chain
@@ -310,16 +311,16 @@ void Experiment::createNodesAndAssignProperties() {
cb_group = cb_groups[config.group_memberships[node_id] - 1];
}
std::shared_ptr node;
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
node = std::make_shared(
- "node_" + std::to_string(node_id), config.node_runtimes[node_id],
+ "node_" + std::to_string(node_id), config.callback_runtimes[node_id],
config.chain_periods[chain_id], chain_id, config.nodes[0],
cb_group);
} else {
node = std::make_shared(
- "node_" + std::to_string(node_id), config.node_runtimes[node_id],
+ "node_" + std::to_string(node_id), config.callback_runtimes[node_id],
config.chain_periods[chain_id], chain_id,
- config.nodes[config.node_executor_assignments[node_id]],
+ config.nodes[config.callback_executor_assignments[node_id]],
cb_group);
}
handle = node->timer_->get_timer_handle();
@@ -332,7 +333,7 @@ void Experiment::createNodesAndAssignProperties() {
all_nodes[chain_id].push_back(node);
} else {
// create a subscriber node
- int const subscription_id = config.node_ids[chain_id][node_chain_idx - 1];
+ int const subscription_id = config.callback_ids[chain_id][node_chain_idx - 1];
rclcpp::CallbackGroup::SharedPtr cb_group;
if (jiang2022_cb && ((chain_id == 1 && node_chain_idx == 1) ||
(chain_id == 2 && node_chain_idx == 1))) {
@@ -349,24 +350,24 @@ void Experiment::createNodesAndAssignProperties() {
std::shared_ptr node;
if (ours2024_latency) {
- uint32_t const first_node_id = config.node_ids[chain_id][0];
+ uint32_t const first_node_id = config.callback_ids[chain_id][0];
node = std::make_shared(
"node_" + std::to_string(first_node_id),
- "node_" + std::to_string(node_id), config.node_runtimes[node_id],
+ "node_" + std::to_string(node_id), config.callback_runtimes[node_id],
config.chain_periods[chain_id], chain_id, config.nodes[0],
cb_group);
- } else if (config.node_executor_assignments.empty()) {
+ } else if (config.callback_executor_assignments.empty()) {
node = std::make_shared(
"node_" + std::to_string(subscription_id),
- "node_" + std::to_string(node_id), config.node_runtimes[node_id],
+ "node_" + std::to_string(node_id), config.callback_runtimes[node_id],
config.chain_periods[chain_id], chain_id, config.nodes[0],
cb_group);
} else {
node = std::make_shared(
"node_" + std::to_string(subscription_id),
- "node_" + std::to_string(node_id), config.node_runtimes[node_id],
+ "node_" + std::to_string(node_id), config.callback_runtimes[node_id],
config.chain_periods[chain_id], chain_id,
- config.nodes[config.node_executor_assignments[node_id]],
+ config.nodes[config.callback_executor_assignments[node_id]],
cb_group);
}
handle = node->sub_->get_subscription_handle();
@@ -390,22 +391,22 @@ void Experiment::createNodesAndAssignProperties() {
executor.strat->get_priority_settings(handle)->timer_handle =
chain_timer_handles[config.chain_timer_control[chain_id]];
executor.strat->get_priority_settings(handle)->priority =
- config.node_priorities[node_id]; // use priority as tiebreaker
+ config.callback_priorities[node_id]; // use priority as tiebreaker
if (first_node) {
executor.strat->set_first_in_chain(handle);
first_node = false;
}
// is this the last node in the chain?
- if (node_chain_idx == config.node_ids[chain_id].size() - 1) {
+ if (node_chain_idx == config.callback_ids[chain_id].size() - 1) {
executor.strat->set_last_in_chain(handle);
}
} else if (config.executor_type == "picas") {
// executor.executor->add_node(nodes[node_id]);
executor.strat->set_executable_priority(
- handle, config.node_priorities[node_id], type,
+ handle, config.callback_priorities[node_id], type,
priority_executor::ExecutableScheduleType::CHAIN_AWARE_PRIORITY, chain_id);
std::cout << "node " << node_id << " has priority "
- << config.node_priorities[node_id] << std::endl;
+ << config.callback_priorities[node_id] << std::endl;
} else if (config.executor_type == "default") {
// executor.default_executor->add_node(nodes[node_id]);
}
@@ -498,10 +499,10 @@ void Experiment::setInitialDeadlines() {
for (uint32_t chain_index = 0; chain_index < config.chain_lengths.size();
chain_index++) {
size_t executor_idx;
- if (config.node_executor_assignments.empty()) {
+ if (config.callback_executor_assignments.empty()) {
executor_idx = 0;
} else {
- executor_idx = config.node_executor_assignments[chain_index];
+ executor_idx = config.callback_executor_assignments[chain_index];
}
std::shared_ptr> deadlines =
executors[executor_idx].strat->get_chain_deadlines(chain_index);
@@ -538,24 +539,26 @@ void Experiment::resetTimers() {
}
void Experiment::writeLogsToFile(std::string const &file_name,
- std::string const &experiment_name) {
- std::ofstream output_file;
- std::string const name = experiment_name;
- // make sure results directory exists. we don't have access to std::filesystem
- // here :(
- std::string const command = "mkdir -p results/" + name;
- int const result = system(command.c_str());
- if (result != 0) {
- std::cout << "could not create results directory: " << result << ": "
- << strerror(errno) << std::endl;
+ std::string const &experiment_name) {
+ std::filesystem::path results_dir = "results";
+ std::filesystem::path exp_dir = results_dir / experiment_name;
+
+ // Create directories if they don't exist
+ try {
+ std::filesystem::create_directories(exp_dir);
+ } catch (std::filesystem::filesystem_error const &e) {
+ std::cout << "Could not create results directory: " << e.what() << std::endl;
+ return;
}
- output_file.open("results/" + name + "/" + file_name + "_" +
- this->config.executor_type + ".json");
+
+ std::string output_filename = (file_name + "_" + this->config.executor_type + ".json");
+ std::filesystem::path output_path = exp_dir / output_filename;
+
+ std::ofstream output_file(output_path);
output_file << buildLogs();
output_file.close();
- std::cout << "results written to results/" + name + "/" + file_name + "_" +
- this->config.executor_type + ".json"
- << std::endl;
+
+ std::cout << "results written to " << output_path.string() << std::endl;
}
int do_other_task(double const work_time, uint const period,
diff --git a/src/casestudy_tools/src/test_nodes.cpp b/src/casestudy_tools/src/test_nodes.cpp
index d5c7709..bf44280 100755
--- a/src/casestudy_tools/src/test_nodes.cpp
+++ b/src/casestudy_tools/src/test_nodes.cpp
@@ -139,6 +139,7 @@ WorkerNode::WorkerNode(
// RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
// nth_prime_silly(runtime_);
+ // TODO: investigate jitter generation
double used_runtime = runtime_;
if (use_random_runtime) {
if (rand() % 100 < runtime_over_chance * 100) {
diff --git a/src/existing_system_monitor/CMakeLists.txt b/src/existing_system_monitor/CMakeLists.txt
new file mode 100644
index 0000000..ccb5402
--- /dev/null
+++ b/src/existing_system_monitor/CMakeLists.txt
@@ -0,0 +1,70 @@
+cmake_minimum_required(VERSION 3.5)
+project(existing_system_monitor)
+
+# Default to C++14
+if(NOT CMAKE_CXX_STANDARD)
+ set(CMAKE_CXX_STANDARD 17)
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ add_compile_options(-Wall -Wextra -Wpedantic)
+endif()
+
+find_package(ament_cmake REQUIRED)
+find_package(rclcpp REQUIRED)
+find_package(casestudy_tools REQUIRED)
+find_package(simple_timer REQUIRED)
+
+include_directories(include)
+
+add_library(${PROJECT_NAME} src/instrumented_node.cpp)
+target_include_directories(${PROJECT_NAME} PUBLIC
+ $
+ $)
+ament_target_dependencies(${PROJECT_NAME}
+ rclcpp
+ casestudy_tools
+ simple_timer
+)
+
+install(
+ DIRECTORY include/
+ DESTINATION include
+)
+
+install(TARGETS
+ ${PROJECT_NAME}
+ EXPORT export_${PROJECT_NAME}
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib
+ RUNTIME DESTINATION bin
+ INCLUDES DESTINATION include
+)
+
+# add executable for uas.cpp
+add_library(uas src/uas.cpp src/instrumented_node.cpp)
+
+ament_target_dependencies(uas
+ rclcpp
+ casestudy_tools
+ simple_timer
+)
+
+target_link_libraries(uas
+ ${PROJECT_NAME}
+)
+
+target_include_directories(uas PUBLIC
+ $
+ $)
+install(TARGETS
+ uas
+ EXPORT export_${PROJECT_NAME}
+ RUNTIME DESTINATION bin
+)
+
+ament_export_include_directories(include)
+ament_export_libraries(${PROJECT_NAME})
+ament_export_targets(export_${PROJECT_NAME})
+
+ament_package()
diff --git a/src/existing_system_monitor/include/existing_system_monitor/instrumented_node.hpp b/src/existing_system_monitor/include/existing_system_monitor/instrumented_node.hpp
new file mode 100644
index 0000000..5154dd4
--- /dev/null
+++ b/src/existing_system_monitor/include/existing_system_monitor/instrumented_node.hpp
@@ -0,0 +1,113 @@
+#ifndef EXISTING_SYSTEM_MONITOR_INSTRUMENTED_NODE_HPP
+#define EXISTING_SYSTEM_MONITOR_INSTRUMENTED_NODE_HPP
+
+#include
+#include
+#include
+#include
+#include
+
+#include "rclcpp/rclcpp.hpp"
+#include "simple_timer/rt-sched.hpp"
+
+namespace existing_system_monitor {
+
+// Base class for instrumented callbacks
+class InstrumentedCallback {
+public:
+ InstrumentedCallback(std::string const &node_name, std::string const &callback_name, int chain_id)
+ : node_name_(node_name)
+ , callback_name_(callback_name)
+ , chain_id_(chain_id) {
+ logger_ = create_logger();
+ }
+ virtual ~InstrumentedCallback() = default;
+
+ template
+ void before_callback(Args&&... args);
+
+ template
+ void after_callback(Args&&... args);
+
+private:
+ std::string node_name_;
+ std::string callback_name_;
+ int chain_id_;
+ node_time_logger logger_;
+ std::chrono::high_resolution_clock::time_point start_time_;
+};
+
+// Wrapper for a subscription callback
+template
+class InstrumentedSubscriptionCallback : public InstrumentedCallback {
+public:
+ using CallbackT = std::function;
+
+ InstrumentedSubscriptionCallback(
+ const std::string& node_name,
+ const std::string& topic_name,
+ int chain_id,
+ CallbackT original_callback);
+
+ void callback(typename MessageT::SharedPtr msg) {
+ before_callback();
+ original_callback_(msg);
+ after_callback();
+ }
+
+private:
+ CallbackT original_callback_;
+};
+
+// Wrapper for a timer callback
+class InstrumentedTimerCallback : public InstrumentedCallback {
+public:
+ using CallbackT = std::function;
+
+ InstrumentedTimerCallback(
+ const std::string& node_name,
+ const std::string& timer_name,
+ int chain_id,
+ CallbackT original_callback);
+
+ void callback();
+
+private:
+ CallbackT original_callback_;
+};
+
+// Factory class for creating instrumented nodes
+class NodeInstrumenter {
+public:
+ static std::shared_ptr instrument_node(
+ std::shared_ptr original_node,
+ int chain_id = 0);
+
+ template
+ static typename rclcpp::Subscription::SharedPtr instrument_subscription(
+ std::shared_ptr node,
+ typename rclcpp::Subscription::SharedPtr original_subscription,
+ int chain_id = 0);
+
+ static rclcpp::TimerBase::SharedPtr instrument_timer(
+ std::shared_ptr node,
+ rclcpp::TimerBase::SharedPtr original_timer,
+ int chain_id = 0);
+};
+
+// Class to hold metrics collection and analysis
+class MetricsCollector {
+public:
+ static MetricsCollector& get_instance();
+
+ void register_callback(std::shared_ptr callback);
+ void write_logs_to_file(const std::string& file_name, const std::string& experiment_name);
+
+private:
+ MetricsCollector() = default;
+ std::unordered_map> callbacks_;
+};
+
+} // namespace existing_system_monitor
+
+#endif // EXISTING_SYSTEM_MONITOR_INSTRUMENTED_NODE_HPP
diff --git a/src/existing_system_monitor/include/existing_system_monitor/node_adapter.hpp b/src/existing_system_monitor/include/existing_system_monitor/node_adapter.hpp
new file mode 100644
index 0000000..0af3ebb
--- /dev/null
+++ b/src/existing_system_monitor/include/existing_system_monitor/node_adapter.hpp
@@ -0,0 +1,76 @@
+#ifndef EXISTING_SYSTEM_MONITOR_NODE_ADAPTER_HPP
+#define EXISTING_SYSTEM_MONITOR_NODE_ADAPTER_HPP
+
+#include "rclcpp/rclcpp.hpp"
+
+#include "existing_system_monitor/instrumented_node.hpp"
+
+
+namespace existing_system_monitor {
+
+/**
+ * Adapter class that wraps an existing ROS2 node with instrumentation
+ * Usage: instead of inheriting from rclcpp::Node, inherit from InstrumentedNode
+ */
+template
+class InstrumentedNode : public NodeT {
+public:
+ template
+ InstrumentedNode(int chain_id, Args&&... args)
+ : NodeT(std::forward(args)...), chain_id_(chain_id) {
+ }
+
+ // Override subscription creation
+ template
+ typename rclcpp::Subscription::SharedPtr create_subscription(
+ const std::string& topic_name,
+ const rclcpp::QoS& qos,
+ CallbackT&& callback,
+ const rclcpp::SubscriptionOptions& options = rclcpp::SubscriptionOptions()) {
+
+ // Create a wrapper for the callback
+ auto instrumented_callback = std::make_shared>(
+ this->get_name(), topic_name, chain_id_,
+ std::forward(callback));
+
+ // Create the subscription with the instrumented callback
+ auto subscription = NodeT::template create_subscription(
+ topic_name, qos,
+ [instrumented_callback](typename MessageT::SharedPtr msg) {
+ instrumented_callback->callback(msg);
+ },
+ options);
+
+ return subscription;
+ }
+
+ // Override timer creation
+ template
+ rclcpp::TimerBase::SharedPtr create_wall_timer(
+ DurationT period,
+ CallbackT&& callback,
+ rclcpp::CallbackGroup::SharedPtr group = nullptr) {
+
+ // Create a wrapper for the callback
+ auto instrumented_callback = std::make_shared(
+ this->get_name(), "timer", chain_id_,
+ std::forward(callback));
+
+ // Create the timer with the instrumented callback
+ auto timer = NodeT::create_wall_timer(
+ period,
+ [instrumented_callback]() {
+ instrumented_callback->callback();
+ },
+ group);
+
+ return timer;
+ }
+
+private:
+ int chain_id_;
+};
+
+} // namespace existing_system_monitor
+
+#endif // EXISTING_SYSTEM_MONITOR_NODE_ADAPTER_HPP
diff --git a/src/existing_system_monitor/package.xml b/src/existing_system_monitor/package.xml
new file mode 100644
index 0000000..668b946
--- /dev/null
+++ b/src/existing_system_monitor/package.xml
@@ -0,0 +1,19 @@
+
+
+
+ existing_system_monitor
+ 0.1.0
+ Tools for monitoring existing ROS2 systems
+ user
+ Apache License 2.0
+
+ ament_cmake
+
+ rclcpp
+ casestudy_tools
+ simple_timer
+
+
+ ament_cmake
+
+
diff --git a/src/existing_system_monitor/src/instrumented_node.cpp b/src/existing_system_monitor/src/instrumented_node.cpp
new file mode 100644
index 0000000..a3c1e9f
--- /dev/null
+++ b/src/existing_system_monitor/src/instrumented_node.cpp
@@ -0,0 +1,103 @@
+#include
+#include
+
+#include "std_msgs/msg/string.hpp"
+
+#include "existing_system_monitor/instrumented_node.hpp"
+
+namespace existing_system_monitor {
+
+
+template
+void InstrumentedCallback::before_callback(Args&&... args) {
+ // Record start time
+ start_time_ = std::chrono::high_resolution_clock::now();
+
+ // Log start of callback execution
+ std::ostringstream ss;
+ ss << "{\"operation\": \"start_work\", \"chain\": " << chain_id_
+ << ", \"node\": \"" << node_name_ << "/" << callback_name_ << "\", \"count\": 0}";
+ log_entry(logger_, ss.str());
+}
+
+template
+void InstrumentedCallback::after_callback(Args&&... args) {
+ // Calculate execution time
+ auto end_time = std::chrono::high_resolution_clock::now();
+ auto duration = std::chrono::duration_cast(
+ end_time - start_time_).count();
+
+ // Log end of callback execution
+ std::ostringstream ss;
+ ss << "{\"operation\": \"end_work\", \"chain\": " << chain_id_
+ << ", \"node\": \"" << node_name_ << "/" << callback_name_
+ << "\", \"count\": 0, \"duration_us\": " << duration << "}";
+ log_entry(logger_, ss.str());
+}
+
+template
+InstrumentedSubscriptionCallback::InstrumentedSubscriptionCallback(
+ const std::string& node_name,
+ const std::string& topic_name,
+ int chain_id,
+ CallbackT original_callback)
+ : InstrumentedCallback(node_name, topic_name, chain_id),
+ original_callback_(original_callback) {
+}
+
+InstrumentedTimerCallback::InstrumentedTimerCallback(
+ const std::string& node_name,
+ const std::string& timer_name,
+ int chain_id,
+ CallbackT original_callback)
+ : InstrumentedCallback(node_name, timer_name, chain_id),
+ original_callback_(original_callback) {
+}
+
+void InstrumentedTimerCallback::callback() {
+ before_callback();
+ original_callback_();
+ after_callback();
+}
+
+std::shared_ptr NodeInstrumenter::instrument_node(
+ std::shared_ptr original_node,
+ int chain_id) {
+ // For now, we just return the original node
+ // In a more advanced implementation, we might create a proxy node
+ return original_node;
+}
+
+template
+typename rclcpp::Subscription::SharedPtr NodeInstrumenter::instrument_subscription(
+ std::shared_ptr node,
+ typename rclcpp::Subscription::SharedPtr original_subscription,
+ int chain_id) {
+ // To be implemented
+ return original_subscription;
+}
+
+rclcpp::TimerBase::SharedPtr NodeInstrumenter::instrument_timer(
+ std::shared_ptr node,
+ rclcpp::TimerBase::SharedPtr original_timer,
+ int chain_id) {
+ // To be implemented
+ return original_timer;
+}
+
+MetricsCollector& MetricsCollector::get_instance() {
+ static MetricsCollector instance;
+ return instance;
+}
+
+void MetricsCollector::register_callback(std::shared_ptr callback) {
+ // To be implemented
+}
+
+void MetricsCollector::write_logs_to_file(const std::string& file_name, const std::string& experiment_name) {
+ // This would use similar code to the existing Experiment::writeLogsToFile method
+}
+
+template class InstrumentedSubscriptionCallback;
+
+} // namespace existing_system_monitor
diff --git a/src/existing_system_monitor/src/uas.cpp b/src/existing_system_monitor/src/uas.cpp
new file mode 100644
index 0000000..94b85e9
--- /dev/null
+++ b/src/existing_system_monitor/src/uas.cpp
@@ -0,0 +1,132 @@
+#include
+#include
+#include
+
+#include "rclcpp/rclcpp.hpp"
+#include "std_msgs/msg/string.hpp"
+
+#include "casestudy_tools/primes_workload.hpp"
+#include "existing_system_monitor/node_adapter.hpp"
+#include "priority_executor/priority_executor.hpp"
+#include "priority_executor/priority_memory_strategy.hpp"
+
+using namespace std::chrono_literals;
+
+// the topic
+constexpr char const* TOPIC_NAME = "wildfire_talk";
+
+
+// Modified Node - Inherit from InstrumentedNode instead of rclcpp::Node
+class CustomTalkerNode : public existing_system_monitor::InstrumentedNode {
+public:
+ // Pass chain_id to InstrumentedNode constructor
+ CustomTalkerNode(int chain_id, const std::string& node_name) : InstrumentedNode(chain_id, node_name) {
+ // The rest of the code stays the same!
+ timer_ = create_wall_timer(
+ std::chrono::milliseconds(100),
+ std::bind(&CustomTalkerNode::timer_callback, this));
+
+ publisher_ = this->create_publisher(TOPIC_NAME, 10);
+ timer_ = this->create_wall_timer(
+ 500ms, std::bind(&CustomTalkerNode::timer_callback, this));
+ }
+
+ rclcpp::TimerBase::SharedPtr timer_;
+
+private:
+ void timer_callback() {
+ auto message = std_msgs::msg::String();
+ message.data = "Hello, world! " + std::to_string(count_++);
+ RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
+ publisher_->publish(message);
+ }
+
+ rclcpp::Publisher::SharedPtr publisher_;
+ int count_;
+};
+
+// Modified Node - Inherit from InstrumentedNode instead of rclcpp::Node
+class CustomListenerNode : public existing_system_monitor::InstrumentedNode {
+public:
+ // Pass chain_id to InstrumentedNode constructor
+ CustomListenerNode(int chain_id, const std::string& node_name) : InstrumentedNode(chain_id, node_name) {
+ sub_ = this->create_subscription(
+ TOPIC_NAME, 10, std::bind(&CustomListenerNode::topic_callback, this, std::placeholders::_1));
+ }
+
+ rclcpp::Subscription::SharedPtr sub_;
+
+private:
+ void topic_callback(const std_msgs::msg::String::SharedPtr msg) const {
+ RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
+ }
+};
+
+
+int main(int argc, char* argv[]) {
+ // calibrate the dummy load for the current system
+ calibrate_dummy_load();
+
+ rclcpp::init(argc, argv);
+
+ // Create nodes for the experiment
+ /*
+ auto talker = std::make_shared>(0, "CustomTalkerNode");
+ auto listener1 = std::make_shared>(0, "CustomListenerNode");
+ auto listener2 = std::make_shared>(0, "CustomListenerNode");
+ */
+ auto talker = std::make_shared(0, "CustomTalkerNode");
+ auto listener1 = std::make_shared(0, "CustomListenerNode");
+ auto listener2 = std::make_shared(0, "CustomListenerNode");
+
+ rclcpp::ExecutorOptions options;
+
+ auto strategy = std::make_shared>();
+ options.memory_strategy = strategy;
+ auto executor = new priority_executor::TimedExecutor(options);
+
+ // must be set to post_execute can set new deadlines
+ executor->prio_memory_strategy_ = strategy;
+
+
+ // the new funcitons in PriorityMemoryStrategy accept the handle of the
+ // timer/subscription as the first argument
+ strategy->set_executable_deadline(talker->timer_->get_timer_handle(), 1000,
+ priority_executor::ExecutableType::TIMER, 0);
+ // you _must_ set the timer_handle for each chain
+ strategy->get_priority_settings(talker->timer_->get_timer_handle())
+ ->timer_handle = talker->timer_;
+ // you _must_ mark the first executable in the chain
+ strategy->set_first_in_chain(talker->timer_->get_timer_handle());
+ // set the same period and chain_id for each callback in the chain
+ strategy->set_executable_deadline(listener1->sub_->get_subscription_handle(),
+ 1000, priority_executor::ExecutableType::SUBSCRIPTION, 0);
+ strategy->set_executable_deadline(listener2->sub_->get_subscription_handle(),
+ 1000, priority_executor::ExecutableType::SUBSCRIPTION, 0);
+ // you _must_ mark the last executable in the chain (used to keep track of different instances of the same chain)
+ strategy->set_last_in_chain(listener2->sub_->get_subscription_handle());
+ // add all the nodes to the executor
+ executor->add_node(talker);
+ executor->add_node(listener1);
+ executor->add_node(listener2);
+
+ // if the executor behaves unexpectedly, you can print the priority settings to make sure they are correct
+ std::cout << *strategy->get_priority_settings(
+ talker->timer_->get_timer_handle())
+ << std::endl;
+ std::cout << *strategy->get_priority_settings(
+ listener1->sub_->get_subscription_handle())
+ << std::endl;
+ std::cout << *strategy->get_priority_settings(
+ listener2->sub_->get_subscription_handle())
+ << std::endl;
+ executor->spin();
+
+ rclcpp::shutdown();
+
+ // Get all collected metrics and write them to a file
+ auto& collector = existing_system_monitor::MetricsCollector::get_instance();
+ collector.write_logs_to_file("my_system_analysis", "real_system_test");
+
+ return 0;
+}
\ No newline at end of file