From fdf447cb57bdb1b28f22d40f61d03db07f4e4fa3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ma=C3=ABl=20Madon?= <mael.madon@irit.fr>
Date: Tue, 15 Nov 2022 15:32:41 +0100
Subject: [PATCH] adding an notebook for example distances

---
 distance_batsim_output.py       |  10 +-
 test/input/3jobs.csv            |   6 +-
 test/input/3jobs_w_sessions.csv |   6 +-
 test_distance.ipynb             | 418 ++++++++++++++++++++++++++++++++
 4 files changed, 429 insertions(+), 11 deletions(-)
 create mode 100644 test_distance.ipynb

diff --git a/distance_batsim_output.py b/distance_batsim_output.py
index c4bcb3f..3e4b1dd 100755
--- a/distance_batsim_output.py
+++ b/distance_batsim_output.py
@@ -57,13 +57,13 @@ def euclidean_distance(s1, s2):
     """Returns the Euclidean distance between two series s1 and s2"""
 
     dist = np.sqrt(np.sum([(x-y) * (x-y) for x, y in zip(s1, s2)]))
-    return dist
+    return float(dist)
 
 
 def lateness_distance(s1, s2):
     """Returns the 'lateness' of s2 compared to s1"""
 
-    return np.sum([y-x for x, y in zip(s1, s2)])
+    return float(np.sum([y-x for x, y in zip(s1, s2)]))
 
 def normalized_euclidian_distance(s1, s2):
     """Return the euclidien distance normalized by the l2 norm of the vectors, 
@@ -73,12 +73,12 @@ def normalized_euclidian_distance(s1, s2):
     if n1==0 or n2==0:
         return None
     eucl_dist = euclidean_distance(s1, s2)
-    return eucl_dist**2 / (n1 * n2)
+    return float( eucl_dist**2 / (n1 * n2) )
 
 def l2_norm(s):
     """Return the l2 norm of the series s"""
 
-    return np.sqrt(np.sum([x * x for x in s]))
+    return float( np.sqrt(np.sum([x * x for x in s])) )
 
 
 def distances(file1, file2, euclidean=True, lateness=False, norm_eucl=False,
@@ -111,7 +111,7 @@ def distances(file1, file2, euclidean=True, lateness=False, norm_eucl=False,
 def pretty_print(dist):
     """Nice printing of the dictionnary dist"""
     
-    if type(dist) is dict:
+    if isinstance(dist, dict):
         pretty = json.dumps(dist, indent=4)
         print(pretty)
     else:
diff --git a/test/input/3jobs.csv b/test/input/3jobs.csv
index e899f77..067a02c 100644
--- a/test/input/3jobs.csv
+++ b/test/input/3jobs.csv
@@ -1,4 +1,4 @@
 job_id,workload_name,profile,submission_time,requested_number_of_resources,requested_time,success,final_state,starting_time,execution_time,finish_time,waiting_time,turnaround_time,stretch,allocated_resources,consumed_energy,metadata
-1216,user11,362,30,1,86400.000000,1,COMPLETED_SUCCESSFULLY,30,362.000000,80,0.000000,362.000000,1.000000,2,62671.250000,
-247,user5,57102,0,8,432000.000000,1,COMPLETED_SUCCESSFULLY,0,57102.000000,0,0.000000,57102.000000,1.000000,0,12391134.000000,
-1242,user11,9620,40,1,86400.000000,1,COMPLETED_SUCCESSFULLY,40,9620.000000,60,0.000000,9620.000000,1.000000,2,1665462.500000,
\ No newline at end of file
+1216,user11,362,30,1,86400.000000,1,COMPLETED_SUCCESSFULLY,30,50,80,0.000000,362.000000,1.000000,2,62671.250000,
+247,user5,57102,0,8,432000.000000,1,COMPLETED_SUCCESSFULLY,0,0,0,0.000000,57102.000000,1.000000,0,12391134.000000,
+1242,user11,9620,40,1,86400.000000,1,COMPLETED_SUCCESSFULLY,40,20,60,0.000000,9620.000000,1.000000,1,1665462.500000,
\ No newline at end of file
diff --git a/test/input/3jobs_w_sessions.csv b/test/input/3jobs_w_sessions.csv
index defb937..b9346a0 100644
--- a/test/input/3jobs_w_sessions.csv
+++ b/test/input/3jobs_w_sessions.csv
@@ -1,4 +1,4 @@
 job_id,workload_name,profile,submission_time,requested_number_of_resources,requested_time,success,final_state,starting_time,execution_time,finish_time,waiting_time,turnaround_time,stretch,allocated_resources,consumed_energy,metadata
-1216:s1,user11,362,30,1,86400.000000,1,COMPLETED_SUCCESSFULLY,30,362.000000,60,0.000000,362.000000,1.000000,2,62671.250000,
-247:s1,user5,57102,0,8,432000.000000,1,COMPLETED_SUCCESSFULLY,0,57102.000000,0,0.000000,57102.000000,1.000000,0,12391134.000000,
-1242:s1,user11,9620,40,1,86400.000000,1,COMPLETED_SUCCESSFULLY,40,9620.000000,80,0.000000,9620.000000,1.000000,2,1665462.500000,
\ No newline at end of file
+1216:s1,user11,362,30,1,86400.000000,1,COMPLETED_SUCCESSFULLY,30,30,60,0.000000,362.000000,1.000000,2,62671.250000,
+247:s1,user5,57102,0,8,432000.000000,1,COMPLETED_SUCCESSFULLY,0,0,0,0.000000,57102.000000,1.000000,0,12391134.000000,
+1242:s1,user11,9620,40,1,86400.000000,1,COMPLETED_SUCCESSFULLY,40,40,80,0.000000,9620.000000,1.000000,1,1665462.500000,
\ No newline at end of file
diff --git a/test_distance.ipynb b/test_distance.ipynb
new file mode 100644
index 0000000..a498406
--- /dev/null
+++ b/test_distance.ipynb
@@ -0,0 +1,418 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Example of distances\n",
+    "\n",
+    "This notebook calculate distances between several _jobs.csv as an example."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Initialization\n",
+    "import pandas as pd\n",
+    "from evalys.jobset import JobSet\n",
+    "from evalys.visu.gantt import plot_gantt\n",
+    "\n",
+    "three_jobs =            \"test/input/3jobs.csv\"\n",
+    "three_jobs_w_session =  \"test/input/3jobs_w_sessions.csv\"\n",
+    "three_jobs_zero =       \"test/input/3jobs_zeros.csv\"\n",
+    "mc_10days_a60 =         \"test/input/mc_10days_a60_jobs.csv\"\n",
+    "mc_10days_m60 =         \"test/input/mc_10days_m60_jobs.csv\"\n",
+    "mc_10days_rigid =       \"test/input/mc_10days_rigid_jobs.csv\""
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Vizualize the useful columns of a jobs.csv:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>job_id</th>\n",
+       "      <th>submission_time</th>\n",
+       "      <th>starting_time</th>\n",
+       "      <th>finish_time</th>\n",
+       "      <th>success</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>1216</td>\n",
+       "      <td>55532.0</td>\n",
+       "      <td>55532.0</td>\n",
+       "      <td>55894.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>247</td>\n",
+       "      <td>9327.0</td>\n",
+       "      <td>9327.0</td>\n",
+       "      <td>66429.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>1242</td>\n",
+       "      <td>56876.0</td>\n",
+       "      <td>56876.0</td>\n",
+       "      <td>66496.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>1434</td>\n",
+       "      <td>66504.0</td>\n",
+       "      <td>66504.0</td>\n",
+       "      <td>67496.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>1438</td>\n",
+       "      <td>66506.0</td>\n",
+       "      <td>66506.0</td>\n",
+       "      <td>69764.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>...</th>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>319</th>\n",
+       "      <td>18943</td>\n",
+       "      <td>643942.0</td>\n",
+       "      <td>643942.0</td>\n",
+       "      <td>954600.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>320</th>\n",
+       "      <td>18945</td>\n",
+       "      <td>643943.0</td>\n",
+       "      <td>643943.0</td>\n",
+       "      <td>958295.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>321</th>\n",
+       "      <td>21862</td>\n",
+       "      <td>753752.0</td>\n",
+       "      <td>753752.0</td>\n",
+       "      <td>960982.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>322</th>\n",
+       "      <td>18944</td>\n",
+       "      <td>643942.0</td>\n",
+       "      <td>643942.0</td>\n",
+       "      <td>961174.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>323</th>\n",
+       "      <td>21995</td>\n",
+       "      <td>760446.0</td>\n",
+       "      <td>760446.0</td>\n",
+       "      <td>1031099.0</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>324 rows × 5 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "     job_id  submission_time  starting_time  finish_time  success\n",
+       "0      1216          55532.0        55532.0      55894.0        1\n",
+       "1       247           9327.0         9327.0      66429.0        1\n",
+       "2      1242          56876.0        56876.0      66496.0        1\n",
+       "3      1434          66504.0        66504.0      67496.0        1\n",
+       "4      1438          66506.0        66506.0      69764.0        1\n",
+       "..      ...              ...            ...          ...      ...\n",
+       "319   18943         643942.0       643942.0     954600.0        1\n",
+       "320   18945         643943.0       643943.0     958295.0        1\n",
+       "321   21862         753752.0       753752.0     960982.0        1\n",
+       "322   18944         643942.0       643942.0     961174.0        1\n",
+       "323   21995         760446.0       760446.0    1031099.0        1\n",
+       "\n",
+       "[324 rows x 5 columns]"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "out1 = pd.read_csv(mc_10days_a60)\n",
+    "\n",
+    "# Select\n",
+    "desired_cols = [\"job_id\", \"submission_time\", \"starting_time\", \"finish_time\", \"success\"]\n",
+    "select = out1.loc[:, desired_cols]\n",
+    "\n",
+    "# Clean job_id\n",
+    "select.job_id = select.job_id.astype(str)\n",
+    "select.job_id = select.job_id.str.split(':', expand=True)[0]\n",
+    "select.job_id = select.job_id.astype(int)\n",
+    "\n",
+    "select"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## With mock files\n",
+    "Visualize our two mock files 3jobs and 3jobs_w_sessions:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/home/mael/.local/lib/python3.10/site-packages/evalys/visu/core.py:62: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
+      "  self.fig.show()\n",
+      "/home/mael/.local/lib/python3.10/site-packages/evalys/visu/core.py:62: UserWarning: Matplotlib is currently using module://matplotlib_inline.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
+      "  self.fig.show()\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGzCAYAAADuc1ebAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAApkElEQVR4nO3deXRUVbr+8afIUEnIBGFWwowoCEoYjIKgBOzgRRGbwaBGuE4YWmxsFdoWSGPE1tvOiigKXiGieBnUZjAiozIPAg4BNQxXwyBIQggkRWr//vBSP8sgrVLDtur7WavWytm1zznvm8OqPJxzqsphjDECAACwVI1gFwAAAHAmhBUAAGA1wgoAALAaYQUAAFiNsAIAAKxGWAEAAFYjrAAAAKsRVgAAgNUIKwAAwGqEFSDMOBwOjRw5Mthl/GoOh0MTJkz41etNnz5dDodDGzZs8H1RAAKCsAKEqI8//lgTJkzQkSNHgl0KAJyVyGAXAMA/Pv74Y+Xm5uqWW25RcnJysMs5a8ePH1dkJC9ZQDjizAqAX+zYsWNB23dMTAxhBQhThBUgBE2YMEH33XefJKlZs2ZyOBxyOBzatWuXZ868efPUrl07OZ1OtW3bVosWLaq2DYfDoc8++0xZWVmqVauWunXr5nl+xowZSktLU2xsrGrXrq0hQ4Zo79691WpZu3at/vCHPygpKUlxcXHq0aOHPvroo1/d0+nuWdm8ebMyMzOVmJio+Ph49erVS2vWrDnt+uXl5brjjjuUkpKixMRE3Xzzzfr++++95mzYsEFXXXWV6tSpo9jYWDVr1kzDhw//1bUC8C3+mwKEoAEDBmjHjh1644039OSTT6pOnTqSpLp160qSVq1apTlz5uiuu+5SQkKCnnnmGV1//fXas2ePUlJSvLY1cOBAtWrVSo888oiMMZKkvLw8PfTQQxo0aJBuvfVWHTx4UM8++6wuv/xybd682XPZ6cMPP1RmZqbS0tI0fvx41ahRQ9OmTdOVV16plStXqkuXLr+5x08//VTdu3dXYmKi7r//fkVFRWnKlCnq2bOnli9frq5du3rNHzlypJKTkzVhwgQVFhZq8uTJ2r17t5YtWyaHw6EDBw6oT58+qlu3rsaMGaPk5GTt2rVLc+bM+c01AvARAyAkPf7440aSKSoq8hqXZKKjo82XX37pGfvkk0+MJPPss896xsaPH28kmRtuuMFr/V27dpmIiAiTl5fnNb5t2zYTGRnpGXe73aZVq1bmqquuMm632zOvvLzcNGvWzPTu3ftX9SPJjB8/3rPcv39/Ex0dbb766ivP2LfffmsSEhLM5Zdf7hmbNm2akWTS0tJMZWWlZ/yxxx4zksz8+fONMcbMnTvXSDLr16//VXUB8D8uAwFhKCMjQy1atPAst2/fXomJifr666+rzb3zzju9lufMmSO3261Bgwbpu+++8zwaNGigVq1aaenSpZKkLVu2aOfOncrKytKhQ4c8844dO6ZevXppxYoVcrvdv6n+qqoqvf/+++rfv7+aN2/uGW/YsKGysrK0atUqlZaWeq1z++23KyoqyrM8YsQIRUZGasGCBZLkORv03nvvyeVy/aa6APgHl4GAMJSamlptrFatWtXu4ZB+uOflx3bu3CljjFq1anXabZ8KBDt37pQkZWdn/2wdJSUlqlWr1i+u+5SDBw+qvLxc5513XrXnzj//fLndbu3du1dt27b1jP+03vj4eDVs2NBzH0+PHj10/fXXKzc3V08++aR69uyp/v37KysrS06n81fXCMB3CCtAGIqIiDjtuPm/e1J+LDY21mvZ7XbL4XBo4cKFp91OfHy8Z54kPf7447roootOu79Tc23gcDj09ttva82aNXr33Xe1ePFiDR8+XP/85z+1Zs0aq2oFwg1hBQhRDofDL9tt0aKFjDFq1qyZWrdufcZ5kpSYmKiMjAyf1lC3bl3FxcWpsLCw2nNffPGFatSoocaNG3uN79y5U1dccYVnuaysTMXFxerbt6/XvEsuuUSXXHKJ8vLylJ+fr6FDh2rWrFm69dZbfdoDgF+Oe1aAEFWzZk1J8vkn2A4YMEARERHKzc2tdibGGKNDhw5JktLS0tSiRQv913/9l8rKyqpt5+DBg7+5hoiICPXp00fz58/3ejv2/v37lZ+fr27duikxMdFrnZdeesnrXpTJkyfr5MmTyszMlCR9//331fo5dUaooqLiN9cK4OxxZgUIUWlpaZKkBx98UEOGDFFUVJT69et31ttt0aKFHn74YY0dO1a7du1S//79lZCQoKKiIs2dO1e33367/vKXv6hGjRqaOnWqMjMz1bZtWw0bNkznnHOOvvnmGy1dulSJiYl69913f3MdDz/8sAoKCtStWzfdddddioyM1JQpU1RRUaHHHnus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q3Xr1vryyy9D9ng3bNhQF1xwgdfY+eef77n8Feqva5K0e/duffDBB7r11ls9Y6F6vO+77z6NGTNGQ4YM0YUXXqibbrpJf/7znzVp0iRJvj3eVoaV6OhopaWlacmSJZ4xt9utJUuWKD09PYiVBU6zZs3UoEEDr99BaWmp1q5d+7v+HRhjNHLkSM2dO1cffvihmjVr5vV8WlqaoqKivPouLCzUnj17ftd9/xy3262KioqQ7btXr17atm2btmzZ4nl06tRJQ4cO9fwcin2fTllZmb766is1bNgwZI/3ZZddVu2jCHbs2KEmTZpICt3XtR+bNm2a6tWrp6uvvtozFqrHu7y8XDVqeMeIiIgIud1uST4+3md9O7CfzJo1yzidTjN9+nTz2Wefmdtvv90kJyebffv2Bbs0nzl69KjZvHmz2bx5s5FknnjiCbN582aze/duY8wPb/lKTk428+fPN1u3bjXXXnvt7/4tfiNGjDBJSUlm2bJlXm/zKy8v98y58847TWpqqvnwww/Nhg0bTHp6uklPTw9i1b4xZswYs3z5clNUVGS2bt1qxowZYxwOh3n//feNMaHb90/9+N1AxoRu3/fee69ZtmyZKSoqMh999JHJyMgwderUMQcOHDDGhGbf69atM5GRkSYvL8/s3LnTzJw508TFxZkZM2Z45oTi69opVVVVJjU11TzwwAPVngvF452dnW3OOeccz1uX58yZY+rUqWPuv/9+zxxfHW9rw4oxxjz77LMmNTXVREdHmy5dupg1a9YEuySfWrp0qZFU7ZGdnW2M+eFtXw899JCpX7++cTqdplevXqawsDC4RZ+l0/UryUybNs0z5/jx4+auu+4ytWrVMnFxcea6664zxcXFwSvaR4YPH26aNGlioqOjTd26dU2vXr08QcWY0O37p34aVkK178GDB5uGDRua6Ohoc84555jBgwd7fd5IqPb97rvvmnbt2hmn02natGljXnrpJa/nQ/F17ZTFixcbSaftJxSPd2lpqRk1apRJTU01MTExpnnz5ubBBx80FRUVnjm+Ot4OY370UXMAAACWsfKeFQAAgFMIKwAAwGqEFQAAYDXCCgAAsBphBQAAWI2wAgAArEZYAQAAViOsAAAAqxFWAACA1QgrAADAaoQVAABgtf8H48CNKcvTwNwAAAAASUVORK5CYII=",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGzCAYAAADuc1ebAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyWUlEQVR4nO3dd3xUVf7/8fekDQkhgSRAgpAQiqBUAcEIKBjKNyiC8KUIKsgilqC4uCrgSlERVldXsWBBwVURxKVYUAgdBKQLKARYaYs0QRIgkAyZ8/uDL/NzDLBBMslh5vV8PObxyD33zLnnMzcZ3twy4zDGGAEAAFgqqKQnAAAAcDGEFQAAYDXCCgAAsBphBQAAWI2wAgAArEZYAQAAViOsAAAAqxFWAACA1QgrAADAaoQV4A9wOBwaOHBgSU/jkjkcDo0cOfKSnzdp0iQ5HA6tWbOm6CcVwHbt2iWHw6FJkyaV9FQAqxFWgItYvny5Ro4cqWPHjpX0VAAgYIWU9AQAmy1fvlyjRo1S3759VbZs2ZKezmU7deqUQkL4s7dFUlKSTp06pdDQ0JKeCmA1jqwAxezkyZMltu1SpUoRVizicDhUqlQpBQcHl/RUAKsRVoALGDlypB5//HFJUnJyshwOhxwOh3bt2uXpM3PmTNWtW1dOp1N16tTRN998U2AMh8OhH3/8Ub169VK5cuXUokULz/qPPvpIjRs3Vnh4uGJiYtSzZ0/t3bu3wFy+++47/c///I+io6MVERGhm2++Wd9+++0l13S+a1bWr1+vtLQ0RUVFKTIyUqmpqVq5cuV5n5+Tk6P7779fsbGxioqK0j333KNff/3Vq8+aNWvUvn17xcXFKTw8XMnJyerXr1+h5zhu3DgFBwd7nXp76aWX5HA4NHjwYE9bfn6+ypQpoyeffLLQY2/fvl1du3ZVfHy8SpUqpcqVK6tnz57Kysry6leY/VKYsTIyMtSiRQuVLVtWkZGRqlWrloYNG+ZZf6FrVhYsWKCWLVuqdOnSKlu2rDp16qQtW7Z49Tn3u7Vjxw7Pkb/o6Gjde++9ysnJKfRrAlwJ+C8WcAFdunTRtm3b9Mknn+gf//iH4uLiJEnly5eXJC1btkzTp0/XQw89pDJlymjcuHHq2rWr9uzZo9jYWK+xunXrppo1a+r555+XMUaSNHr0aD399NPq3r27+vfvr8OHD+u1117TTTfdpPXr13tOOy1YsEBpaWlq3LixRowYoaCgIE2cOFG33HKLli5dqqZNm/7hGn/44Qe1bNlSUVFReuKJJxQaGqq3335brVq10uLFi9WsWTOv/gMHDlTZsmU1cuRIZWZmavz48dq9e7cWLVokh8OhQ4cOqV27dipfvryGDBmismXLateuXZo+fXqh59SyZUu53W4tW7ZMt912myRp6dKlCgoK0tKlSz391q9frxMnTuimm24q1Lh5eXlq3769cnNz9fDDDys+Pl779u3Tl19+qWPHjik6OlpS4fZLYcb64YcfdNttt6l+/fp65pln5HQ6tWPHjv8aMufNm6e0tDRVq1ZNI0eO1KlTp/Taa6+pefPmWrdunapWrerVv3v37kpOTtaYMWO0bt06TZgwQRUqVNDf/va3Qr/mgPUMgAt68cUXjSSzc+dOr3ZJJiwszOzYscPT9v333xtJ5rXXXvO0jRgxwkgyd955p9fzd+3aZYKDg83o0aO92jdt2mRCQkI87W6329SsWdO0b9/euN1uT7+cnByTnJxs2rZte0n1SDIjRozwLHfu3NmEhYWZf//73562n3/+2ZQpU8bcdNNNnraJEycaSaZx48YmLy/P0/7CCy8YSWbWrFnGGGNmzJhhJJnVq1df0rx+Kz8/30RFRZknnnjCGHP2NYiNjTXdunUzwcHB5vjx48YYY15++WUTFBRkfv3110KNu379eiPJTJs27YJ9CrtfCjPWP/7xDyPJHD58+IJ9du7caSSZiRMnetoaNmxoKlSoYI4cOeJp+/77701QUJC55557PG3nfrf69evnNeYdd9xhYmNjL7hN4ErEaSDgD2rTpo2qV6/uWa5fv76ioqL0008/Fej7wAMPeC1Pnz5dbrdb3bt31y+//OJ5xMfHq2bNmlq4cKEkacOGDdq+fbt69eqlI0eOePqdPHlSqampWrJkidxu9x+af35+vubOnavOnTurWrVqnvaEhAT16tVLy5YtU3Z2ttdzBgwY4HUx6IMPPqiQkBDNnj1bkjxHg7788ku5XK4/NK+goCDdeOONWrJkiSRpy5YtOnLkiIYMGSJjjFasWCHp7NGWunXrFvrC53NHTubMmXPB0ySF3S+FGevcvGbNmlXofbR//35t2LBBffv2VUxMjKe9fv36atu2red1/q3f/261bNlSR44cKbDvgCsZYQX4gxITEwu0lStXrsA1HNLZa15+a/v27TLGqGbNmipfvrzXY8uWLTp06JCnnyT16dOnQL8JEyYoNze3wPUWhXX48GHl5OSoVq1aBdZdc801crvdBa7TqFmzptdyZGSkEhISPNfx3HzzzeratatGjRqluLg4derUSRMnTlRubu4lza1ly5Zau3atTp06paVLlyohIUGNGjVSgwYNPKeCli1bppYtWxZ6zOTkZA0ePFgTJkxQXFyc2rdvrzfeeMPr9SvsfinMWD169FDz5s3Vv39/VaxYUT179tSnn3560eCye/duSbrgPjkXVH/r97+H5cqVk6Tz/h4CVyquWQH+oAvdwWH+75qU3woPD/dadrvdcjgc+vrrr887TmRkpKefJL344otq2LDhebd3rq8NHA6HPvvsM61cuVJffPGF5syZo379+umll17SypUrCz3XFi1ayOVyacWKFVq6dKknlLRs2VJLly7V1q1bdfjw4UsKK9LZC3X79u2rWbNmae7cuXrkkUc0ZswYrVy5UpUrVy70finMWOHh4VqyZIkWLlyor776St98842mTp2qW265RXPnzi2yO4Au5fcQuFIRVoCLcDgcPhm3evXqMsYoOTlZV1999UX7SVJUVJTatGlTpHMoX768IiIilJmZWWDd1q1bFRQUpCpVqni1b9++Xa1bt/YsnzhxQvv371eHDh28+t1www264YYbNHr0aE2ePFm9e/fWlClT1L9//0LNrWnTpgoLC9PSpUu1dOlSz11ZN910k959913Nnz/fs3yp6tWrp3r16umvf/2rli9frubNm+utt97Sc889V+j9UpixpLOntFJTU5WamqqXX35Zzz//vJ566iktXLjwvPszKSlJki64T+Li4lS6dOlLrhm40nEaCLiIc/8wFPUn2Hbp0kXBwcEaNWpUgf8BG2N05MgRSVLjxo1VvXp1/f3vf9eJEycKjHP48OE/PIfg4GC1a9dOs2bN8rod++DBg5o8ebJatGihqKgor+e88847XteijB8/XmfOnFFaWpqks6cefl/PuSNCl3IqqFSpUrr++uv1ySefaM+ePV5HVk6dOqVx48apevXqSkhIKPSY2dnZOnPmjFdbvXr1FBQU5JlbYfdLYcY6evRogTn8t9ciISFBDRs21AcffOD1O7d582bNnTu3QCgEAgVHVoCLaNy4sSTpqaeeUs+ePRUaGqqOHTte9rjVq1fXc889p6FDh2rXrl3q3LmzypQpo507d2rGjBkaMGCA/vKXvygoKEgTJkxQWlqa6tSpo3vvvVdXXXWV9u3bp4ULFyoqKkpffPHFH57Hc8895/kskIceekghISF6++23lZubqxdeeKFA/7y8PKWmpqp79+7KzMzUm2++qRYtWuj222+XJH3wwQd68803dccdd6h69eo6fvy43n33XUVFRV3yP7QtW7bU2LFjFR0drXr16kmSKlSooFq1aikzM1N9+/a9pPEWLFiggQMHqlu3brr66qt15swZffjhhwoODlbXrl0lFX6/FGasZ555RkuWLNGtt96qpKQkHTp0SG+++aYqV67s9Vk7v/fiiy8qLS1NKSkp+tOf/uS5dTk6OvoPfa8T4BdK5iYk4Mrx7LPPmquuusoEBQV5bmOWZNLT0wv0TUpKMn369PEsn7u99EK3r/7rX/8yLVq0MKVLlzalS5c2tWvXNunp6SYzM9Or3/r1602XLl1MbGyscTqdJikpyXTv3t3Mnz//kmrR725dNsaYdevWmfbt25vIyEgTERFhWrdubZYvX+7V59yty4sXLzYDBgww5cqVM5GRkaZ3795et9iuW7fO3HnnnSYxMdE4nU5ToUIFc9ttt5k1a9Zc0jyNMearr74ykkxaWppXe//+/Y0k8957713SeD/99JPp16+fqV69uilVqpSJiYkxrVu3NvPmzSvQ97/tl8KMNX/+fNOpUydTqVIlExYWZipVqmTuvPNOs23bNk+f8926bIwx8+bNM82bNzfh4eEmKirKdOzY0fz4449efS70u3VuX/3+dnvgSuYwhquwgECQn5+vkJAQPfvss/rrX/9a0tMBgELjmhUgQOzfv1+SPJ/ECwBXCq5ZAa5w+fn5//VC23nz5unTTz+Vw+HwupunuB09elR5eXkXXB8cHOz5OgMbxgVgB8IKcIXbu3dvgQ+d+71zX8T43nvvnfcDx4pLly5dtHjx4guuT0pK8rozqaTHBWCHYrtmZezYsRo6dKgGDRqkV155pTg2CQSE06dPa9myZRftU61aNa+P1C8pa9euvegnq4aHh6t58+bWjAvADsUSVlavXq3u3bsrKipKrVu3JqwAAIBC8/kFtidOnFDv3r317rvver6zAgAAoLB8fs1Kenq6br31VrVp08bzEdQXkpub6/XJ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",
+      "text/plain": [
+       "<Figure size 640x480 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "plot_gantt(JobSet.from_csv(three_jobs), title=\"three_jobs\")\n",
+    "plot_gantt(JobSet.from_csv(three_jobs_w_session), title=\"three_jobs_w_session\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\n",
+      "    \"submission_time\": {\n",
+      "        \"euclidean\": 0.0,\n",
+      "        \"normalized_euclidean\": 0.0,\n",
+      "        \"lateness\": 0.0\n",
+      "    },\n",
+      "    \"starting_time\": {\n",
+      "        \"euclidean\": 0.0,\n",
+      "        \"normalized_euclidean\": 0.0,\n",
+      "        \"lateness\": 0.0\n",
+      "    },\n",
+      "    \"finish_time\": {\n",
+      "        \"euclidean\": 28.284271247461902,\n",
+      "        \"normalized_euclidean\": 0.08000000000000002,\n",
+      "        \"lateness\": 0.0\n",
+      "    }\n",
+      "}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!python3 distance_batsim_output.py {three_jobs} {three_jobs_w_session} --all"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\n",
+      "    \"submission_time\": {\n",
+      "        \"euclidean\": 50.0,\n",
+      "        \"normalized_euclidean\": null,\n",
+      "        \"lateness\": -70.0\n",
+      "    },\n",
+      "    \"starting_time\": {\n",
+      "        \"euclidean\": 50.0,\n",
+      "        \"normalized_euclidean\": null,\n",
+      "        \"lateness\": -70.0\n",
+      "    },\n",
+      "    \"finish_time\": {\n",
+      "        \"euclidean\": 100.0,\n",
+      "        \"normalized_euclidean\": null,\n",
+      "        \"lateness\": -140.0\n",
+      "    }\n",
+      "}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!python3 distance_batsim_output.py {three_jobs} {three_jobs_zero} --all"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\n",
+      "    \"submission_time\": {\n",
+      "        \"euclidean\": 172.1394783308001,\n",
+      "        \"normalized_euclidean\": 2.739806304756353e-10,\n",
+      "        \"lateness\": 2254.0\n",
+      "    },\n",
+      "    \"starting_time\": {\n",
+      "        \"euclidean\": 172.1394783308001,\n",
+      "        \"normalized_euclidean\": 2.739806304756353e-10,\n",
+      "        \"lateness\": 2254.0\n",
+      "    },\n",
+      "    \"finish_time\": {\n",
+      "        \"euclidean\": 172.1394783308001,\n",
+      "        \"normalized_euclidean\": 2.3852456580198333e-10,\n",
+      "        \"lateness\": 2254.0\n",
+      "    }\n",
+      "}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!python3 distance_batsim_output.py {mc_10days_a60} {mc_10days_m60} --all"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{\n",
+      "    \"submission_time\": {\n",
+      "        \"euclidean\": 241.15762480170517,\n",
+      "        \"normalized_euclidean\": 5.377222025784075e-10,\n",
+      "        \"lateness\": 3311.0\n",
+      "    },\n",
+      "    \"starting_time\": {\n",
+      "        \"euclidean\": 241.15762480170517,\n",
+      "        \"normalized_euclidean\": 5.377222025784075e-10,\n",
+      "        \"lateness\": 3311.0\n",
+      "    },\n",
+      "    \"finish_time\": {\n",
+      "        \"euclidean\": 255.14897609044016,\n",
+      "        \"normalized_euclidean\": 5.240304046302593e-10,\n",
+      "        \"lateness\": 3633.0\n",
+      "    }\n",
+      "}\n"
+     ]
+    }
+   ],
+   "source": [
+    "!python3 distance_batsim_output.py {mc_10days_a60} {mc_10days_rigid} --all"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3.10.6 64-bit",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.6"
+  },
+  "orig_nbformat": 4,
+  "vscode": {
+   "interpreter": {
+    "hash": "916dbcbb3f70747c44a77c7bcd40155683ae19c65e1c03b4aa3499c5328201f1"
+   }
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
-- 
GitLab