Commit 9ddb15ea authored by iker_martin's avatar iker_martin
Browse files

Cambios analizador

parent 9a0629d9
......@@ -24,7 +24,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 52,
"metadata": {},
"outputs": [],
"source": [
......@@ -147,7 +147,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_9826/2056908859.py:18: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
"/tmp/ipykernel_3823/2056908859.py:18: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" groupM = dfM.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']\n"
]
}
......@@ -196,7 +196,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_9826/1294489315.py:13: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
"/tmp/ipykernel_3823/1294489315.py:13: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" groupL = dfL[dfL['NS'] != 0].groupby(['Tt', 'Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']\n"
]
}
......@@ -244,7 +244,7 @@
"text": [
"/home/usuario/miniconda3/lib/python3.9/site-packages/numpy/core/fromnumeric.py:3419: RuntimeWarning: Mean of empty slice.\n",
" return _methods._mean(a, axis=axis, dtype=dtype,\n",
"/tmp/ipykernel_9826/3028104048.py:17: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
"/tmp/ipykernel_3823/3028104048.py:17: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.\n",
" groupLT = dfLT[dfLT['NS'] != 0].groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']\n"
]
}
......@@ -283,9 +283,9 @@
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_9826/2150887515.py:12: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
"/tmp/ipykernel_3823/2150887515.py:12: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
" dfLT_aux = dfLT[dfLT[\"NP\"] == np_aux][dfLT[\"NS\"] == ns_aux][dfLT[\"Cst\"] == cst_aux][dfLT[\"Css\"] == css_aux]\n",
"/tmp/ipykernel_9826/2150887515.py:13: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
"/tmp/ipykernel_3823/2150887515.py:13: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n",
" dfM_aux = dfM[dfM[\"NP\"] == np_aux][dfM[\"NS\"] == ns_aux][dfM[\"Css\"] == css_aux]\n"
]
}
......@@ -548,7 +548,7 @@
},
{
"cell_type": "code",
"execution_count": 30,
"execution_count": 15,
"metadata": {},
"outputs": [
{
......@@ -572,180 +572,276 @@
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>TE</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Groups</th>\n",
" <th></th>\n",
" <th>N</th>\n",
" <th>%Async</th>\n",
" <th>NP</th>\n",
" <th>N_par</th>\n",
" <th>NS</th>\n",
" <th>Dist</th>\n",
" <th>Compute_tam</th>\n",
" <th>Comm_tam</th>\n",
" <th>Cst</th>\n",
" <th>Css</th>\n",
" <th>Time</th>\n",
" <th>Iters</th>\n",
" <th>Ti</th>\n",
" <th>Tt</th>\n",
" <th>To</th>\n",
" <th>omega</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1,10</th>\n",
" <td>6.369967</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1,120</th>\n",
" <td>7.105817</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1,20</th>\n",
" <td>6.795948</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1,40</th>\n",
" <td>6.937367</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1,80</th>\n",
" <td>6.966290</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10,1</th>\n",
" <td>6.056520</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10,120</th>\n",
" <td>6.979421</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10,20</th>\n",
" <td>6.574471</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10,40</th>\n",
" <td>6.838011</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10,80</th>\n",
" <td>6.981027</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120,1</th>\n",
" <td>6.348445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120,10</th>\n",
" <td>6.292254</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120,20</th>\n",
" <td>6.327157</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120,40</th>\n",
" <td>6.321162</td>\n",
" </tr>\n",
" <tr>\n",
" <th>120,80</th>\n",
" <td>6.423317</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20,1</th>\n",
" <td>6.072897</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20,10</th>\n",
" <td>6.073298</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20,120</th>\n",
" <td>7.171862</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20,40</th>\n",
" <td>6.991988</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20,80</th>\n",
" <td>7.069774</td>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.199854</td>\n",
" <td>0.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40,1</th>\n",
" <td>6.090644</td>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.226667</td>\n",
" <td>0.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40,10</th>\n",
" <td>5.739764</td>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.212055</td>\n",
" <td>0.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40,120</th>\n",
" <td>7.113592</td>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.374593</td>\n",
" <td>1.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40,20</th>\n",
" <td>6.218595</td>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>40</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.200724</td>\n",
" <td>1.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40,80</th>\n",
" <td>6.992810</td>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80,1</th>\n",
" <td>6.305216</td>\n",
" <th>71995</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.210870</td>\n",
" <td>1.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80,10</th>\n",
" <td>6.259644</td>\n",
" <th>71996</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.200096</td>\n",
" <td>0.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80,120</th>\n",
" <td>7.032920</td>\n",
" <th>71997</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.202437</td>\n",
" <td>0.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80,20</th>\n",
" <td>6.302444</td>\n",
" <th>71998</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.200116</td>\n",
" <td>0.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80,40</th>\n",
" <td>6.434365</td>\n",
" <th>71999</th>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>120</td>\n",
" <td>0</td>\n",
" <td>10</td>\n",
" <td>2</td>\n",
" <td>100000</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>0</td>\n",
" <td>0.2</td>\n",
" <td>3</td>\n",
" <td>0.324975</td>\n",
" <td>1.0</td>\n",
" <td>224.0</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>72000 rows × 16 columns</p>\n",
"</div>"
],
"text/plain": [
" TE\n",
"Groups \n",
"1,10 6.369967\n",
"1,120 7.105817\n",
"1,20 6.795948\n",
"1,40 6.937367\n",
"1,80 6.966290\n",
"10,1 6.056520\n",
"10,120 6.979421\n",
"10,20 6.574471\n",
"10,40 6.838011\n",
"10,80 6.981027\n",
"120,1 6.348445\n",
"120,10 6.292254\n",
"120,20 6.327157\n",
"120,40 6.321162\n",
"120,80 6.423317\n",
"20,1 6.072897\n",
"20,10 6.073298\n",
"20,120 7.171862\n",
"20,40 6.991988\n",
"20,80 7.069774\n",
"40,1 6.090644\n",
"40,10 5.739764\n",
"40,120 7.113592\n",
"40,20 6.218595\n",
"40,80 6.992810\n",
"80,1 6.305216\n",
"80,10 6.259644\n",
"80,120 7.032920\n",
"80,20 6.302444\n",
"80,40 6.434365"
]
},
"execution_count": 30,
" N %Async NP N_par NS Dist Compute_tam Comm_tam Cst Css Time \\\n",
"0 0 0.0 40 0 10 2 100000 0 3 0 0.2 \n",
"1 0 0.0 40 0 10 2 100000 0 3 0 0.2 \n",
"2 0 0.0 40 0 10 2 100000 0 3 0 0.2 \n",
"3 0 0.0 40 0 10 2 100000 0 3 0 0.2 \n",
"4 0 0.0 40 0 10 2 100000 0 3 0 0.2 \n",
"... .. ... ... ... .. ... ... ... ... ... ... \n",
"71995 0 0.0 120 0 10 2 100000 0 3 0 0.2 \n",
"71996 0 0.0 120 0 10 2 100000 0 3 0 0.2 \n",
"71997 0 0.0 120 0 10 2 100000 0 3 0 0.2 \n",
"71998 0 0.0 120 0 10 2 100000 0 3 0 0.2 \n",
"71999 0 0.0 120 0 10 2 100000 0 3 0 0.2 \n",
"\n",
" Iters Ti Tt To omega \n",
"0 3 0.199854 0.0 224.0 1 \n",
"1 3 0.226667 0.0 224.0 1 \n",
"2 3 0.212055 0.0 224.0 1 \n",
"3 3 0.374593 1.0 224.0 1 \n",
"4 3 0.200724 1.0 224.0 1 \n",
"... ... ... ... ... ... \n",
"71995 3 0.210870 1.0 224.0 1 \n",
"71996 3 0.200096 0.0 224.0 1 \n",
"71997 3 0.202437 0.0 224.0 1 \n",
"71998 3 0.200116 0.0 224.0 1 \n",
"71999 3 0.324975 1.0 224.0 1 \n",
"\n",
"[72000 rows x 16 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"grouped_aggG.loc[('2,2',0,2,1)]"
"dfL"
]
},
{
......@@ -2628,310 +2724,9 @@
},
{
"cell_type": "code",
"execution_count": 20,
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Se sigue una distribución guassiana: [False, True, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]\n",
"Un total de: 107 no siguen una gaussiana\n",
" 1 2 3 4 5 6 7 8\n",
"1 False False True True True True True False\n",
"2 False False True True True True True False\n",
"3 True True False False True True True True\n",
"4 True True False False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False False True\n",
"7 True True True True True False False False\n",
"8 False False True True True True False False\n",
"Redimensión 1/10 False Mejores: Merge single, Merge, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 1/20 False Mejores: Merge single, Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True False False False True\n",
"2 True False True False True True True False\n",
"3 False True False True True False False False\n",
"4 True False True False True True True False\n",
"5 False True True True False False False True\n",
"6 False True False True False False False True\n",
"7 False True False True False False False True\n",
"8 True False False False True True True False\n",
"Redimensión 1/40 False Mejores: Merge, Baseline, Merge single, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True False False False True\n",
"2 True False True True True True True False\n",
"3 True True False True True True True True\n",
"4 True True True False True True True False\n",
"5 False True True True False False False True\n",
"6 False True True True False False False True\n",
"7 False True True True False False False True\n",
"8 True False True False True True True False\n",
"Redimensión 1/80 False Mejores: Baseline, Merge, Merge single, Merge - Asynchronous, \n",
"Configuración: 1/120 tiene valores iguales\n",
" 1 2 3 4 5 6 7 8\n",
"1 False False True True True True True False\n",
"2 False False True True True True True False\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 False False True True True True True False\n",
"Redimensión 10/1 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True True\n",
"2 True False True True True True True True\n",
"3 False True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 10/20 False Mejores: Merge single, Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True True\n",
"2 True False True True True True True True\n",
"3 False True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False True True True\n",
"6 True True True True True False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 10/40 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True False\n",
"2 True False False True True True True True\n",
"3 False False False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False True False True\n",
"6 True True True True True False False True\n",
"7 True True True True False False False True\n",
"8 False True True True True True True False\n",
"Redimensión 10/80 False Mejores: Merge single, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True True\n",
"2 True False True True True True True False\n",
"3 False True False True True True True False\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True False False True True True True False\n",
"Redimensión 10/120 False Mejores: Merge, Merge single, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 20/1 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False True True True\n",
"6 True True True True True False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 20/10 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True False\n",
"2 True False True True True True True True\n",
"3 False True False True True True True False\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False True\n",
"7 True True True True False False False True\n",
"8 False True False True True True True False\n",
"Redimensión 20/40 False Mejores: Merge, Merge single, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True False\n",
"2 True False True True True True True True\n",
"3 False True False True True True True False\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False True\n",
"7 True True True True False False False True\n",
"8 False True False True True True True False\n",
"Redimensión 20/80 False Mejores: Merge, Merge single, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True False\n",
"2 True False True True True True True False\n",
"3 False True False True True True True False\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False True\n",
"7 True True True True False False False True\n",
"8 False False False True True True True False\n",
"Redimensión 20/120 False Mejores: Merge, Merge single, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 40/1 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 40/10 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 40/20 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True True\n",
"2 True False True True True True True True\n",
"3 False True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False True True\n",
"7 True True True True False True False True\n",
"8 True True True True True True True False\n",
"Redimensión 40/80 False Mejores: Merge single, Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True False\n",
"2 True False True True True True True True\n",
"3 False True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False True True True\n",
"6 True True True True True False False True\n",
"7 True True True True True False False True\n",
"8 False True True True True True True False\n",
"Redimensión 40/120 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False False True True True True False True\n",
"2 False False True True True True True False\n",
"3 True True False False True True True False\n",
"4 True True False False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False True\n",
"7 False True True True False False False True\n",
"8 True False False True True True True False\n",
"Redimensión 80/1 False Mejores: Merge, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True False\n",
"2 True False False True True True True True\n",
"3 True False False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False True\n",
"7 True True True True False False False False\n",
"8 False True True True True True False False\n",
"Redimensión 80/10 False Mejores: Merge, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False True True\n",
"7 True True True True True True False True\n",
"8 True True True True True True True False\n",
"Redimensión 80/20 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True False True True True True True\n",
"2 True False True True True True True True\n",
"3 False True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False True\n",
"7 True True True True False False False True\n",
"8 True True True True True True True False\n",
"Redimensión 80/40 False Mejores: Merge, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False False True\n",
"7 True True True True True False False True\n",
"8 True True True True True True True False\n",
"Redimensión 80/120 False Mejores: Merge, Merge single, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False False True True False False False True\n",
"2 False False False True False False False True\n",
"3 True False False False True True True False\n",
"4 True True False False True True True False\n",
"5 False False True True False False False True\n",
"6 False False True True False False False True\n",
"7 False False True True False False False True\n",
"8 True True False False True True True False\n",
"Redimensión 120/1 False Mejores: Merge, Baseline, Baseline single, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True False\n",
"2 True False False True True True True True\n",
"3 True False False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False False True\n",
"6 True True True True False False False False\n",
"7 True True True True False False False False\n",
"8 False True True True True False False False\n",
"Redimensión 120/10 False Mejores: Merge, Merge - Asynchronous, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True False\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False False True\n",
"7 True True True True True False False True\n",
"8 False True True True True True True False\n",
"Redimensión 120/20 False Mejores: Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False True True True True True True True\n",
"2 True False True True True True True True\n",
"3 True True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False True False False\n",
"6 True True True True True False True True\n",
"7 True True True True False True False False\n",
"8 True True True True False True False False\n",
"Redimensión 120/40 False Mejores: Merge - Asynchronous, Merge, \n",
" 1 2 3 4 5 6 7 8\n",
"1 False False False True True True True True\n",
"2 False False True True True True True True\n",
"3 False True False True True True True True\n",
"4 True True True False True True True True\n",
"5 True True True True False False True True\n",
"6 True True True True False False False True\n",
"7 True True True True True False False True\n",
"8 True True True True True True True False\n",
"Redimensión 120/80 False Mejores: Merge, \n",
"[[5, 4, 6], [5, 4], [4, 0, 5, 6], [0, 4, 5, 6], None, [4], [5, 4], [4], [5, 6], [4, 5], [4], [4], [4, 5, 6], [4, 5, 6], [4, 5, 6], [4], [4], [4], [5, 4], [4], [4, 6], [4, 6], [4], [4, 6], [4, 5], [4, 0, 1, 6], [4, 6], [4], [6, 4], [4]]\n"
]
}
],
"outputs": [],
"source": [
"checked_type='tc'\n",
"use_perc = False\n",
......@@ -3157,68 +2952,13 @@
},
{
"cell_type": "code",
"execution_count": 43,
"execution_count": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, 'Tiempo')"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"outputs": [],
"source": [
"#f, (ax1, ax2) = plt.subplots(nrows=2, sharex=True, gridspec_kw={'height_ratios': (1,3)}, figsize=(10,4))\n",
"f=plt.figure(figsize=(16, 8))\n",
"ax=f.add_subplot(111)\n",
" \n",
"thresh = 100000000 - 1\n",
"\n",
"x_low = []\n",
"x_high = []\n",
"\n",
"y_low = []\n",
"y_high = []\n",
"\n",
"y2_low = []\n",
"y2_high = []\n",
"\n",
"#Bucle de bajas prestaciones...\n",
"for i in range(len(x)):\n",
" if y[i] < thresh:\n",
" x_low.append(x[i])\n",
" y_low.append(y[i])\n",
" y2_low.append(intercept + slope*x[i])\n",
" else:\n",
" x_high.append(x[i])\n",
" y_high.append(y[i])\n",
" y2_high.append(intercept + slope*x[i])\n",
"\n",
"ax1.scatter(x_low,y_low, color='red')\n",
"ax1.plot(x_low,y2_low)\n",
"\n",
"ax2.scatter(x_high,y_low, color='red')\n",
"ax2.plot(x_high,y2_low)\n",
"\n",
"ax1.set_ylabel(\"Tamaño\", fontsize=36)\n",
"ax1.set_xlabel(\"Tiempo\", fontsize=36)\n",
"#ax.set_ylim(0,110000000)"
"x2 = np.array(x) * 1000\n",
"y_array = [y]\n",
"aux_labels = [\"Expected\"]"
]
},
{
......@@ -3260,33 +3000,112 @@
},
{
"cell_type": "code",
"execution_count": 31,
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.preprocessing import PolynomialFeatures\n",
"x = np.array(x).reshape((-1, 1))\n",
"y = np.array(y)"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9962787972985218\n",
"409360.65712023154\n",
"[6.56144796e+08]\n",
"[ 413953.67068972 411329.09150716 410672.94671151 ...\n",
" 99880255.53157426 98379652.38394217 99038421.75876622]\n"
"0.9720444025507028\n",
"417555.74204228446\n",
"[4.08208613e+09]\n",
"[4.25719914e+05 4.21637828e+05 4.21637828e+05 ... 9.36564851e+07\n",
" 1.00391927e+08 9.74120044e+07]\n"
]
}
],
"source": [
"from sklearn.linear_model import LinearRegression\n",
"\n",
"x = np.array(x).reshape((-1, 1))\n",
"y = np.array(y)\n",
"\n",
"reg = LinearRegression().fit(x, y)\n",
"print(reg.score(x, y))\n",
"print(reg.intercept_)\n",
"print(reg.coef_)\n",
"\n",
"print(reg.predict(x))"
"reg_array = reg.predict(x)\n",
"print(reg_array)\n",
"y_array.append(reg_array)\n",
"aux_labels.append(\"LinearReg\")"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.9994154481836294\n",
"27900.7721101176\n",
"[ 4.29146862e+09 2.70526901e+11 -1.56299343e+13 1.73278870e+14]\n",
"[3.64847913e+04 3.21925112e+04 3.21925112e+04 ... 1.00097111e+08\n",
" 1.00132901e+08 1.00289449e+08]\n"
]
}
],
"source": [
"degrees = 4\n",
"poly = PolynomialFeatures(degree=degrees, include_bias=False)\n",
"poly_features = poly.fit_transform(x)\n",
"poly_reg = LinearRegression()\n",
"poly_reg.fit(poly_features, y)\n",
"\n",
"print(poly_reg.score(poly_features, y))\n",
"print(poly_reg.intercept_)\n",
"print(poly_reg.coef_)\n",
"\n",
"poly_array = poly_reg.predict(poly_features)\n",
"print(poly_array)\n",
"y_array.append(poly_array)\n",
"aux_labels.append(\"PolyReg-\"+str(degrees))"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA9IAAAH8CAYAAAA9qpexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABuIklEQVR4nO3deXxcdbn48c/TnYCk7CCQFimCCIgSERBlKSgCBQREoS4oEoTrAvf6u1et2oJWvNcNN7jWK8KFiF5xgSqKUNkU1LaC7ApKWwqyQxDLUtrn98dM2kk6k8xkkkyWz/v1mtec8z3f8z3PJKdpnnyXE5mJJEmSJEmqzphGByBJkiRJ0nBiIi1JkiRJUg1MpCVJkiRJqoGJtCRJkiRJNTCRliRJkiSpBibSkiRJkiTVYFyjAxjqNt1005w6dWqjw5AkSZIkDYDFixc/lpmb1XKOiXQvpk6dyqJFixodhiRJkiRpAETE0lrPcWi3JEmSJEk1MJGuICJmRMS8jo6ORociSZIkSRpCTKQryMz5mdnW3Nzc6FAkSZIkSUOIibQkSZIkSTUwkZYkSZIkqQYm0pIkSZIk1cBEWpIkSZKkGphIV+Cq3ZIkSZKkcsY1OoChKjPnA/NbW1tPrvac5557joceeoiOjg5efPHFAYxOklSPcePG0dzczJZbbsmkSZMaHY4kSRpmTKT7yXPPPcef//xnNt98c3baaScmTJhARDQ6LElSN5nJCy+8wBNPPMGf//xndtxxR5NpSZJUE4d295OHHnqIzTffnK222oqJEyeaREvSEBURTJw4ka222orNN9+chx56qNEhSZKkYcZEup90dHSw8cYbNzoMSVINNt54Y1wLQ5Ik1cpEup+8+OKLTJgwodFhSJJqMGHCBNe0kCRJNTORrqAvq3Y7nFuShhd/bkuSpL4wka4gM+dnZltzc3OjQ5EkSZIkDSEm0pIkSZKkftXOrUzlK4xhDlP5Cu3c2uiQ+pWJtDSMRAT7779/o8PQEHHiiScSESxZsqTRoUiSJK3Rzq20MZ+ldJDAUjpoY/6ISqZNpNWvIqLX17XXXtvoMPvNnDlzRtxnUv/qfv+PHTuWTTfdlAMPPJD29vZGh8eSJUvWiXHcuHFsvvnmHHLIIVx22WWNDrEqf/nLX1h//fWJCN75znc2OhxJkka1WSxgBSu7lK1gJbNY0KCI+t+4RgegkWn27NkVj02dOnXwApGGiM5/EytXruTPf/4zP/3pT7nmmmtYvHgxX/7ylxscHTQ3N3P66acD8Pzzz3PHHXfws5/9jCuvvJIvfOELfPSjH21sgD148cUXede73sWYMf5tWJKkoWAZ5RdsrlQ+HJlIa0DMmTOn0SFIQ0r3fxMLFizg4IMP5pxzzuHDH/5ww//ANHny5HVi/P73v8/xxx/P7NmzOe2002hqampMcL343Oc+xy233MIXvvAFPvKRjzQ6HEmSRr0WmllaJmluYeQs5Oyf79Uw9913H5MnT2bjjTdm6dKlXY7985//5BWveAVjx47luuuuW1PeOSf0b3/7G1/+8pfZaaedmDRpEttssw1nnHEGTz/9dNlrLV++nA9+8IO87GUvY+LEiWyyySYcccQRLFy4sGz9VatW8d///d+8/vWvp7m5mfXWW49p06bx/ve/n3vuuQco9KyfeeaZABxwwAFdhsaWWrFiBWeffTa7774766+/PhtssAF77703l1xySdlrv/DCC3zmM59h++23Z+LEiWy33XZ88pOf5Pnnn6/uC6thYfr06ey0005kZpf7cPHixRxzzDFsvvnmTJw4kSlTpnDaaafx97//vdc27777biKCAw88sGKdXXfdlfHjx/PQQw/12t7b3/52NthgA1asWMGdd965zvErr7ySQw89lE033ZSJEyey/fbb8//+3//jqaeeKtvelVdeyetf/3rWX399Nt54Y4466ijuvvvuuuZ6L1q0iM985jN86lOfYrfddqv5fEmS1P/mMp0mxncpa2I8c5neoIj6nz3SapjtttuO//mf/+Ftb3sbxx9/PNdffz3jxhVuydNOO427776bOXPmsN9++61z7hlnnMH111/Pcccdx5FHHsmVV17JOeecww033MBvfvMbJk2atKbuH//4R970pjfxxBNP8OY3v5mjjz6axx57jJ/+9Kfsu+++/OQnP+HQQw9dU/+FF17gsMMO4+qrr2bbbbflhBNOYMMNN2TJkiX85Cc/Yd9992WHHXbg9NNP56c//SnXXXcd73nPe8r2KD711FMceOCB3HzzzbzmNa/hfe97H6tXr+bKK6/khBNO4I477uCzn/3smvqZyXHHHcdll13G9ttvzwc/+EFeeOEFzj//fG677bZ+/OprKMhMYO2zjH/2s59xzDHHkJkce+yxTJkyhcWLF3Peeedx2WWX8dvf/rbHnuuddtqJAw44gGuuuYa//OUvvPzlL+9y/MYbb+T222/nmGOOYcstt6wpxvHju/5neNZZZzF79mw23nhjDj/8cDbffHNuvfVWvvjFL3LFFVdw0003seGGG66p/4Mf/IATTjiBiRMnctxxx7HVVltx4403svfee/OqV72qqli6e/bZZ3n3u9/N7rvvzsc+9jF+85vf9KkdSZLUv2ZS+OP2LBawjA5aaGYu09eUjwiZ6auH1x577JHVWLRoUVX1RjoggZw9e3bZ19lnn73OOaeeemoC+bGPfSwzMy+88MIEcv/9989Vq1Z1qfue97wngdxkk01yyZIla8pXrVqVRx99dAJ51llnrSlfuXJlbr/99jlx4sS89tpru7T1wAMP5Etf+tLccsst87nnnltT/vGPfzyBnDFjRpfyzMznnnsuH3nkkTX7s2fPTiCvueaasl+Pznj/8z//s0v5s88+m29+85szIvLmm29eU97e3p5A7rXXXvnss8+uKX/88cfzZS97WQK53377lb2WhqbOfxPdXXXVVRkRGRG5ZMmS/Mc//pGbbLJJjhkzJq+//voudT//+c8nkAcffHCX8s7767777ltT9sMf/jCB/Ld/+7d1rtlZ/1e/+tWasvvuuy+BnDJlyjr1L7roogRys80263I//vrXv04g995773zyySe7nPPd7343gTz99NPXlD399NM5efLknDBhQt5yyy1d6v/Hf/zHmq9R6eeoxoc//OGcOHFi3nHHHZmZec011ySQM2fOrKkdf35LkjS6AYuyxjyx4YnqUH0BM4B506ZNq+qLP1i/iF1868U55StTMuZETvnKlLz41osH5brV6vyFuNKrubl5nXOeffbZfNWrXpURkV//+tdz/fXXz8022ywfeOCBdep2JgKlyXKnv/71rzlmzJicOnXqmrKf/vSnCeRHP/rRsvGec845CeTPf/7zzMx88cUXs7m5Oddbb72y1++up0T6sccey7Fjx2Zra2vZc2+55ZYE8v/9v/+3puyggw5KIH/961+vU78zQTGR7uriizOnTMmMKLxfPLT+Sazzx6VPfOITecwxx+TYsWMTyDPOOCMzMy+++OIE8vjjj1+njZUrV+bUqVMTyKVLl64pL5dIr1y5Ml/60pfmJpts0uUPQU8++WSut956uf322+fq1avXlHcm0s3NzWti/NjHPpaHH354RkROmDAhf/zjH3eJ56ijjkogb7/99rKfeffdd8/NNttszX5nQv7e9753nbr/+Mc/cvLkyTUn0ldffXVGRJc/UplIS5KkvuhLIu3Q7goycz4wv7W19eRGx9Kp/bZ22ua3sWLlCgCWdiylbX4bADN3ndnI0NZRuB+rM2nSJH7wgx/Q2trKhz70ISKCSy+9lJe+9KUVzyk33PtlL3sZ2267LUuWLOGpp55i8uTJ3HTTTQAsXbq07AJonfOd77rrLg499FDuvvtuOjo6eN3rXtfj9auxcOFCVq1aRUSUvfbKlSvXXLvTH//4R8aMGcO+++67Tn2fH72u9nZoa4MVhX8SLF1a2AeYObT+SayZTx8RTJ48mTe84Q2cdNJJax7V9Mc//hGg7PzmcePG8cY3vpElS5Zw880309LSUvE648aN4/3vfz9nnXUWP/rRjzjhhBMAuOiii3j22Wdpa2tbZx4/QEdHx5oYO02cOJHLLruMN7/5zV3Kb7rpJsaPH88Pf/hDfvjDH67T1gsvvMCjjz7K448/ziabbMLNN98MUPa+3mCDDdh9993XeYRcuX8zJ554IlOnTuWpp57ive99L6973ev4t3/7t4pfC0mSpIFiIj2MzFowa00S3WnFyhXMWjBryCXStXr5y1/Obrvtxo033sjOO+/Mm970ph7rb7HFFmXLt9xyS5YuXUpHRweTJ0/m8ccfByj7y36pZ555BmDNIklbb711jZ9gXZ3XXrhwYcVFzUqvDYVkZuONN15nPipQ9ZzW0WTWrLVJdKcVKwrlQy2R7u2PSx0dhZUtt9pqq7LHO8srLeRVqq2tjc997nN861vfWpNIz5s3jwkTJvDe97637DlTpkxZs9jX008/zVVXXcX73/9+jjvuOG666SZ23nnnNXUff/xxXnzxxXUS7+6eeeYZNtlkkzWfrdK/23Ll5dref//9mTp1Kv/6r//KY489xlVXXcXYsWN7jEGSJGkguGr3MLKsY1lN5cPJ5z//eW688UY23XRT7rjjDs4+++we6z/88MNlyztXIm5ubu7yftlll/U4NKPzGb+TJ08G4IEHHqj7M3Ve+4wzzujx2tdcc02Xc5544ok1vdXlPpvWWlbh1q9UPpR13i+Vvs+dq3Z31uvJ1ltvzYwZM7j++uu566671iwy9ta3vpXNNtus1/M33HBDjjnmGNrb23n66ad597vf3eUPAc3NzWy00Ua9DnmaMmXKmvag8r/bcuXl2usclfHHP/6RZ599lp122qnLavkHHHAAAO3t7UQEu+++e6+fVZIkqS9MpIeRlubywzkrlQ8XN954I5/+9KfZcccduf3229lxxx2ZPXt2jyvwlj4Sq9Pf/vY37r//fqZOnbomId5rr70AuOGGG6qKZaeddmLy5MnceuutPPjgg73W7+wNW7Vq1TrH9txzT8aMGVP1tQFe85rXsHr16rKfvfvQV0GlEc49jHwesl796lcD5b/PL7744pp74jWveU1V7Z122mlAoSd63rx5AJxyyik1xXTooYdyyCGHsHjxYr73ve+tKd9rr7148sknueOOO6pqp/Ozlbuvn3nmGW655Zaa4jr66KM56aST1nl1rr6//fbbc9JJJ3H00UfX1K4kSVLVap1UPdpeQ2nV7otvvTib5jYlc1jzaprbNKQWHKPCCsWVPPHEE9nS0pITJ05cs3r1LbfckhMnTsxtttkmH3vssS71q1m1+8wzz1xT/sILL+T222+f66233poFxbq78cYb85///Oea/U984hMVV+1+/vnnu6za/c1vfjOBPP/888u2/a53vWvN4mgrV65c5/i9996bf/vb39bsd67avffee6+zavf222/vYmPdXHxxZlNTJqx9NTUNrQXHqv038Y9//CM33njjHDt2bN50001djn3hC19IIA866KAu5eUWG+u0evXqfPnLX54bbbRRrrfeevnyl7+87HV7WrU7M3PhwoUJ5Pbbb7/mHr766qvX3KflFuV75plnunyGjo6ObG5u7vdVu7tzsTFJktQXuNjYyNY5D3rWglks61hGS3MLc6fPHZLzo8stFNTpqKOOWjPk8n3vex/Lli3ja1/72pqyV73qVXzpS1/igx/8IO9973u5/PLL12nj9a9/Pbvvvjtvf/vbaW5u5sorr+RPf/oTe+yxB//+7/++pt748eP58Y9/zJvf/GYOO+ww9tlnH3bffXeampq4//77WbhwIX/729/4+9//TlNTEwCzZ8/m97//PfPnz+flL385hx9+OC95yUu4//77+dWvfsUXvvAFTjzxRAAOOOAAxowZw8c//nFuv/12NtpoIwA++clPAvCNb3yDe+65h09/+tNcdNFF7LvvvmyxxRY8+OCD3HXXXSxcuJBLLrmE7bbbDoDjjz+eH/zgB1x++eXssssuHHnkkaxcuZJLL72U1772tfz1r3+t59sy4nTOg541qzCcu6UF5s4devOjq7HBBhtw/vnn87a3vY399tuPt73tbbS0tLB48WJ+9atfseWWW/Ktb32r6vYigg984AP867/+K1B7b3Sn1tZWjjzySC677DK+853vcMoppzB9+nQ+//nP8/GPf5wddtiBQw89lO22245nnnmGpUuXct1117Hvvvvyy1/+EigM7T733HN55zvfyT777NPlOdJ/+tOf2G+//bjuuusYM8ZBUpIkaZioNfMeba+h1CM9HNDL46+A/O53v5uZmV/72tcSyCOOOKJsW29961sTyC9/+ctryjp74P7617/mF7/4xdxxxx1z4sSJ+dKXvjQ/8pGPZEdHR9m2Hn744fyP//iPfOUrX5nrrbderr/++jlt2rQ85phj8qKLLlqnt3jlypX59a9/PV/72tfm+uuvn01NTTlt2rQ8+eST85577ulS96KLLspXvepVOWnSpLK9j88//3x+/etfz7333js33HDDnDBhQm677bZ54IEH5le+8pV1et2ff/75PPPMM3O77bbLCRMm5JQpU/ITn/hEPvfcc/ZID0Pl7ome/OEPf8ijjjoqN9100xw/fnxuu+22+YEPfKDHx8FV6sl94okncsyYMTlx4sR17rNOvfVIZxZGiUREbr311l1GStxwww35tre9LbfaaqscP358brrppvmqV70qzzjjjFy4cOE67VxxxRW5995753rrrZeTJ0/OI444Iu+666487LDDEljnmdS1skdakiT1BX3okY7CeaqktbU1Fy1a1Gu9xYsXs8ceewxCRKPbiSeeyIUXXsh9993H1KlTGx2ONKRde+21HHDAAbzzne/koosuanQ4Za1atYqXvexlPP/88w1bUM+f35IkjW4RsTgzW2s5x3F0kjRC/dd//RcAH/zgBxscSeGxXSu6PassM/nsZz/LsmXLXBhMkiQNK86RlqQR5LbbbuNnP/sZixcv5he/+AWHH344r3vd6xodFr/73e94+9vfzpve9CamTp3KM888w+9+9ztuueUWtt122x7XVZAkSRpqTKQlaQRZvHgxn/jEJ9hwww1529vexrnnntvokADYcccdOfzww/ntb3/LFVdcwYsvvsg222zDhz/8YT7xiU+w+eabNzpESZKkqo2qOdIR0QJ8A3gM+Etmfr63c5wjLUkjmz+/JUkDoZ1bmcUCltFBC83MZToz2a3RYamMUTlHOiLOj4hHIuL2buWHRMSfI+LeiPhYsfjlwM8z833AzoMerCRJkqRhK8Y9TURW9Xpn7MrSOJ2M2SyNj/Cei++hnVsb/REGzWmf/w3jNl5OxGrGbbyc0z7/m0aH1K+GfSINXAAcUloQEWOBbwJvoZAwHx8ROwM3A++IiF8D1wxynJIkSZKGqRj3NKx6CRB9eI1h1bveyikX/rURoQ+60z7/G8779KtZ9eQ2wBhWPbkN53361SMqmR72iXRmXg880a14T+DezPxbZr4AfB84EngvMDszDwQOG9xIJUmSJA1ba5LovhrDPz99QH9FM6TN+6+psHL9roUr1y+UjxDDPpGuYGvg/pL95cWyXwIfjoj/BpZUOjki2iJiUUQsevTRRwc0UEmSJEmjxP3NjY5gUKx68qU1lQ9HI3XV7nJ/KsrMvB04treTM3MeMA8Ki431c2ySJEmSRqExmz0MbNnoMAbc2I0eLA7rXrcc1i0fjkZqj/RyYNuS/W2AB2tpICJmRMS8jo6Ofg1MkiRJ0jC03vNAPX1sqznljHv7K5ohre3fl8D4f3YtHP/PQvkIMVIT6YXADhGxXURMAN4BXF5LA5k5PzPbmptHx/ALSZIkST1Y8fmSZLrW12pOPftGzv3Yvo2IfNCd+7F9OfWsmxm70XJgNWM3Ws6pZ908oj7/sB/aHRGXAPsDm0bEcgqLiX0nIj4IXAmMBc7PzDsaGKYkSZKk4W7F56uqNpmJPMnHS0oCGDlJZDXO/di+nNv5EGK2YaQM6e407BPpzDy+QvkVwBV9bTciZgAzpk2b1tcmJEmSJI0Qk5nIUzzf4/GuybNGspE6tLtuDu0eeBHB/vvv3+gwJEmSpF49yceZzMQuZZOZSDKHZI5J9ChjIq1+FRFE1PN8veFpzpw5az5752vSpElMmzaNtrY2lixZ0ugQJUmSVKcn+fiaxNnkeXQb9kO7B4pDuwfeXXfdRVNTU6PD6Ff77bffml72xx9/nF//+td8+9vf5tJLL+X3v/89O+ywQ2MDlCRJklQ3E+kKMnM+ML+1tfXkRscyUu20006NDqHf7b///syZM2fN/urVq5kxYwZXXHEFn/vc5/jud7/buOAkSZIk9QuHdqthys2R7hwife2113LppZey55570tTUxMYbb8w73vEOHnjggbJtPfHEE3z84x/nFa94Beuttx7Nzc1Mnz6dX/3qV+vU7ejo4Atf+AIHHngg22yzDRMmTGCzzTbjiCOO4He/+12PsT700EO8//3vZ+utt2bs2LFccMEFPX7GMWPGcOKJJwKwcOHCdY6vWLGCs88+m913353111+fDTbYgL333ptLLrmkbHvPP/88c+bM4WUvexkTJ05ku+2245Of/CTPP/+8c84lSZKkQWKPtIakc889l8svv5wjjjiC/fbbj9///vf84Ac/4E9/+hO33HILEyeuXehh6dKl7L///ixZsoQ3vOENHHLIIfzzn//kZz/7GYcccgjf+ta3OPnktQML7rrrLmbNmsUb3/hGDjvsMDbaaCOWLVvG5Zdfzi9+8Qvmz5/PIYccsk5MTzzxBHvttRcbbLABRx99NGPGjGGLLbbo9bNkJgDjx4/vUv7UU09x4IEHcvPNN/Oa17yG973vfaxevZorr7ySE044gTvuuIPPfvazXdo55phj+PnPf84OO+zABz/4QVauXMkFF1zAHXf4dDdJkiRpsJhIV+Ac6cb65S9/ycKFC9l1113XlJ1wwglccsklXHbZZRx33HFryt/znvewdOlSLrnkEt7xjnesKX/qqafYf//9+fCHP8wRRxyxJul9xStewYMPPsimm27a5ZrLly9nzz335IwzziibSN922228613v4vzzz2fcuOr+6axatYrzzz8fgH337frswNNPP52bb76Z//zP/+Tf//3f15Q/99xzHHXUUXzuc5/j2GOPZffddwfg4osv5uc//zlveMMbuPrqq5kwYQIAZ511FnvttVdV8UiSJEmqn0O7Kxiqj79q51am8hXGMIepfIV2bm10SAPiwx/+cJckGljTq/yHP/xhTdmf/vQnrrvuOo455pguSTTA5MmTOfPMM3nuuef40Y9+tKa8ubl5nSQaYJtttuHYY4/l7rvvZtmyZescnzBhAl/84hd7TKKvvfZa5syZw5w5c/jwhz/MLrvswpVXXsnOO+/Mpz71qTX1Hn/8cS6++GJaW1u7JNEAkyZN4j//8z/JTL73ve+tKb/wwgsB+OxnP7smie78nKVtS5IkSRpY9kgPI+3cShvzWcFKAJbSQRvzAZjJbo0Mrd+1trauU7btttsC8OSTT64pu+mmm4DCvOfSRb46Pfroo0BhOHep3/72t3z1q1/lpptu4pFHHuGFF17ocvyBBx6gpaWlS9nUqVPZfPPNe4z7uuuu47rrrutStvvuu3PttddS+keZhQsXsmrVKiKibNwrV65cJ+6bb76ZMWPGsM8++6xTv3tvtyRJkqSBYyI9jMxiwZokutMKVjKLBSMukZ48efI6ZZ09watWrVpT9vjjjwNw1VVXcdVVV1Vs75lnnlmz/ZOf/IRjjz2WSZMmcfDBB7P99tuz/vrrM2bMGK699lquu+46nn/++XXa2HLLLXuNe/bs2cyZM4fVq1fzwAMP8MUvfpGvfe1rHHfccfziF79gzJgxXeJeuHBh2UXIysXd0dHBxhtvXLZHvJq52pIkSZL6h4l0BUNxjvQyOmoqHw06e3m/+tWv8uEPf7iqcz71qU8xYcIEFi1axCte8Youx0455ZR1epQ7RUTVcY0ZM4Ztt92Wr371qzz44INceumlfOMb31gTY2fcZ5xxBl/+8peranPDDTfkiSee4MUXX1wnmX744Yerjk2SJElSfZwjXcFQnCPdQvlYKpWPBp2LbN1www1Vn3Pvvfey8847r5NEr169mt/85jf9Gh/Al770JSZOnMhZZ53F008/DcCee+7JmDFjaor71a9+NatXr+bGG29c59hAxC1JkiSpPBPpYWQu02mi6yOUmhjPXKY3KKLGa21t5Q1veAM//vGP16yO3d1tt93GI488smZ/6tSp3HPPPTz44INryjKTM888kzvvvLPfY2xpaeHkk0/m8ccf50tf+hIAm2++OTNnzmTRokV85jOf4cUXX1znvL/+9a/cd999a/bf/e53A/DJT36yy5zujo4OPvOZz/R73JIkSZLKc2j3MNI5D3oWC1hGBy00M5fpQ3J+9Iknnljx2LnnnktTU1O/Xet73/seBx54ICeddBJf+9rXeN3rXsfkyZNZvnw5t956K7fffjs33XTTmoXCzjjjDD7wgQ/w6le/mmOOOYbx48fz29/+ljvvvJMZM2Ywf/78fout0yc+8Qm+853v8JWvfIUPfehDbLrppnzjG9/gnnvu4dOf/jQXXXQR++67L1tssQUPPvggd911FwsXLuSSSy5hu+22AwqJ9Pe//31++ctfsssuu3DEEUewcuVKfvSjH9Ha2sqf//znNXOwJUmSJA0cE+lhZia7DcnE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\n",
"text/plain": [
"<Figure size 1152x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f=plt.figure(figsize=(16, 8))\n",
"ax=f.add_subplot(111)\n",
"\n",
"\n",
"for i in range(len(y_array)):\n",
" ax.scatter(x2,y_array[i], color=colors_spawn[i])\n",
"#ax.plot(x2,y, color=colors_spawn[0])\n",
"ax.set_ylabel(\"Tamaño (Bytes)\", fontsize=36)\n",
"ax.set_xlabel(\"Tiempo (ms)\", fontsize=36)\n",
"ax.axhline(7549560)\n",
"plt.legend(labels=aux_labels, loc='best', fontsize=20,ncol=2,framealpha=1)\n",
"plt.xscale(\"log\")\n",
"plt.yscale(\"log\")\n",
"f.savefig(\"Images/Regresion.png\", format=\"png\")"
]
},
{
%% Cell type:code id: tags:
 
``` python
%matplotlib inline
import pandas as pd
from pandas import DataFrame, Series
import numpy as np
import math
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.colors as colors
from matplotlib.legend_handler import HandlerLine2D, HandlerTuple
from matplotlib.colors import LinearSegmentedColormap
from scipy import stats
import scikit_posthocs as sp
import sys
```
 
%% Cell type:code id: tags:
 
``` python
matrixMalEX="data_GG.csv"
matrixMal="data_GM.csv"
matrixIt="data_L.csv"
matrixIt_Total="data_L_Total.csv"
n_qty=6 #CAMBIAR SEGUN LA CANTIDAD DE NODOS USADOS
n_groups= 2
repet = 10 #CAMBIAR EL NUMERO SEGUN NUMERO DE EJECUCIONES POR CONFIG
time_constant = True # Cambiar segun el speedUp usado
 
p_value = 0.05
values = [2, 10, 20, 40]
# WORST BEST
dist_names = ['null', 'BalancedFit', 'CompactFit']
 
processes = [1,10,20,40,80,120]
 
labelsP = [['(2,2)', '(2,10)', '(2,20)', '(2,40)'],['(10,2)', '(10,10)', '(10,20)', '(10,40)'],
['(20,2)', '(20,10)', '(20,20)', '(20,40)'],['(40,2)', '(40,10)', '(40,20)', '(40,40)']]
labelsP_J = ['(2,2)', '(2,10)', '(2,20)', '(2,40)','(10,2)', '(10,10)', '(10,20)', '(10,40)',
'(20,2)', '(20,10)', '(20,20)', '(20,40)','(40,2)', '(40,10)', '(40,20)', '(40,40)']
positions = [321, 322, 323, 324, 325]
positions_small = [221, 222, 223, 224]
 
labels = ['(1,10)', '(1,20)', '(1,40)','(1,80)','(1,120)',
'(10,1)', '(10,20)', '(10,40)','(10,80)','(10,120)',
'(20,1)', '(20,10)','(20,40)','(20,80)','(20,120)',
'(40,1)', '(40,10)', '(40,20)','(40,80)','(40,120)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)','(80,120)',
'(120,1)', '(120,10)', '(120,20)','(120,40)','(120,80)']
 
labelsExpand = ['(1,10)', '(1,20)', '(1,40)','(1,80)','(1,120)',
'(10,20)', '(10,40)','(10,80)','(10,120)',
'(20,40)','(20,80)','(20,120)',
'(40,80)','(40,120)',
'(80,120)']
labelsShrink = ['(10,1)',
'(20,1)', '(20,10)',
'(40,1)', '(40,10)', '(40,20)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)',
'(120,1)', '(120,10)', '(120,20)','(120,40)','(120,80)']
 
labelsExpandOrdered = ['(1,10)', '(1,20)', '(10,20)',
'(1,40)','(10,40)','(20,40)',
'(1,80)','(10,80)','(20,80)','(40,80)',
'(1,120)', '(10,120)', '(20,120)','(40,120)','(80,120)']
labelsShrinkOrdered = ['(10,1)', '(20,1)', '(40,1)', '(80,1)', '(120,1)',
'(20,10)', '(40,10)', '(80,10)', '(120,10)',
'(40,20)', '(80,20)', '(120,20)',
'(80,40)','(120,40)',
'(120,80)']
 
labelsExpandIntra = ['(1,10)', '(1,20)','(10,20)']
labelsShrinkIntra = ['(10,1)', '(20,1)', '(20,10)']
labelsExpandInter = ['(1,40)','(1,80)', '(1,160)',
'(10,40)','(10,80)', '(10,160)',
'(20,40)','(20,80)', '(20,160)',
'(40,80)', '(40,160)',
'(80,160)']
labelsShrinkInter = ['(40,1)', '(40,10)', '(40,20)',
'(80,1)', '(80,10)', '(80,20)','(80,40)',
'(160,1)', '(160,10)', '(160,20)','(160,40)', '(160,80)']
 
#0 #1 #2 #3
labelsMethods = ['Baseline', 'Baseline single','Baseline - Asynchronous','Baseline single - Asynchronous',
'Merge','Merge single','Merge - Asynchronous','Merge single - Asynchronous']
#4 #5 #6 #7
colors_spawn = ['green','springgreen','blue','darkblue','red','darkred','darkgoldenrod','olive']
linestyle_spawn = ['-', '--', '-.', ':']
markers_spawn = ['.','1','s','p', 'h','d','X','P']
 
OrMult_patch = mpatches.Patch(hatch='', facecolor='green', label='Baseline')
OrSing_patch = mpatches.Patch(hatch='', facecolor='springgreen', label='Baseline single')
OrPthMult_patch = mpatches.Patch(hatch='//', facecolor='blue', label='Baseline - Asyncrhonous')
OrPthSing_patch = mpatches.Patch(hatch='\\', facecolor='darkblue', label='Baseline single - Asyncrhonous')
MergeMult_patch = mpatches.Patch(hatch='||', facecolor='red', label='Merge')
MergeSing_patch = mpatches.Patch(hatch='...', facecolor='darkred', label='Merge single')
MergePthMult_patch = mpatches.Patch(hatch='xx', facecolor='yellow', label='Merge - Asyncrhonous')
MergePthSing_patch = mpatches.Patch(hatch='++', facecolor='olive', label='Merge single - Asyncrhonous')
 
handles_spawn = [OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
```
 
%% Cell type:code id: tags:
 
``` python
dfG = pd.read_csv( matrixMalEX )
 
dfG = dfG.drop(columns=dfG.columns[0])
dfG['S'] = dfG['N']
dfG['N'] = dfG['S'] + dfG['%Async']
dfG['%Async'] = (dfG['%Async'] / dfG['N']) * 100
dfG['%Async'] = dfG['%Async'].fillna(0)
 
if(n_qty == 1):
group = dfG.groupby(['%Async', 'Cst', 'Css', 'Groups'])['TE']
group2 = dfG.groupby(['%Async', 'Cst', 'Css', 'NP','NS'])['TE']
else:
group = dfG.groupby(['Dist', '%Async', 'Cst', 'Css', 'Groups'])['TE']
group2 = dfG.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP','NS'])['TE']
 
grouped_aggG = group.agg(['median'])
grouped_aggG.rename(columns={'median':'TE'}, inplace=True)
 
grouped_aggG2 = group2.agg(['median'])
grouped_aggG2.rename(columns={'median':'TE'}, inplace=True)
```
 
%% Cell type:code id: tags:
 
``` python
dfM = pd.read_csv( matrixMal )
dfM = dfM.drop(columns=dfM.columns[0])
 
dfM['S'] = dfM['N']
dfM['N'] = dfM['S'] + dfM['%Async']
dfM["TR"] = dfM["TC"] + dfM["TH"] + dfM["TS"] + dfM["TA"]
dfM['%Async'] = (dfM['%Async'] / dfM['N']) * 100
 
dfM['%Async'] = dfM['%Async'].fillna(0)
dfM['alpha'] = 1
 
#dfM = dfM.drop(dfM.loc[(dfM["Cst"] == 3) & (dfM["Css"] == 1) & (dfM["NP"] > dfM["NS"])].index)
#dfM = dfM.drop(dfM.loc[(dfM["Cst"] == 2) & (dfM["Css"] == 1) & (dfM["NP"] > dfM["NS"])].index)
 
if(n_qty == 1):
groupM = dfM.groupby(['%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']
else:
groupM = dfM.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']
 
#group
grouped_aggM = groupM.agg(['median'])
grouped_aggM.columns = grouped_aggM.columns.get_level_values(0)
 
for cst_aux in [1,3]:
for css_aux in [0,1]:
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux)]['alpha'] = \
grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux)]['TC'] / \
grouped_aggM.loc[('2,2',0, cst_aux-1, css_aux, np_aux,ns_aux)]['TC']
 
```
 
%%%% Output: stream
 
/tmp/ipykernel_9826/2056908859.py:18: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
/tmp/ipykernel_3823/2056908859.py:18: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
groupM = dfM.groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['TC', 'TH', 'TS', 'TA', 'TR', 'alpha']
 
%% Cell type:code id: tags:
 
``` python
dfL = pd.read_csv( matrixIt )
dfL = dfL.drop(columns=dfL.columns[0])
 
dfL['%Async'] = dfL['%Async'].fillna(0)
dfL['omega'] = 1
 
#dfL = dfL.drop(dfL.loc[(dfL["Cst"] == 3) & (dfL["Css"] == 1) & (dfL["NP"] > dfL["NS"])].index)
#dfL = dfL.drop(dfL.loc[(dfL["Cst"] == 2) & (dfL["Css"] == 1) & (dfL["NP"] > dfL["NS"])].index)
 
if(n_qty == 1):
groupL = dfL[dfL['NS'] != 0].groupby(['Tt', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']
else:
groupL = dfL[dfL['NS'] != 0].groupby(['Tt', 'Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']
 
#group
grouped_aggL = groupL.agg(['median', 'count'])
grouped_aggL.columns = grouped_aggL.columns.get_level_values(0)
grouped_aggL.set_axis(['Ti', 'Iters', 'To', 'Iters2', 'omega', 'omega2'], axis='columns', inplace=True)
grouped_aggL['Iters'] = np.round(grouped_aggL['Iters']/repet)
grouped_aggL['Iters2'] = np.round(grouped_aggL['Iters2']/repet)
 
for cst_aux in [1,3]:
for css_aux in [0,1]:
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
grouped_aggL.loc[(1,2,0, cst_aux, css_aux, np_aux,ns_aux), 'omega'] = \
grouped_aggL.loc[(1,2,0, cst_aux, css_aux, np_aux,ns_aux)]['Ti'] / \
grouped_aggL.loc[(0,2,0, cst_aux, css_aux, np_aux,ns_aux)]['Ti']
```
 
%%%% Output: stream
 
/tmp/ipykernel_9826/1294489315.py:13: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
/tmp/ipykernel_3823/1294489315.py:13: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
groupL = dfL[dfL['NS'] != 0].groupby(['Tt', 'Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Ti', 'To', 'omega']
 
%% Cell type:code id: tags:
 
``` python
dfLT = pd.read_csv( matrixIt_Total )
dfLT = dfLT.drop(columns=dfLT.columns[0])
 
dfLT['%Async'] = dfLT['%Async'].fillna(0)
dfLT['ItA']= dfLT.Ti.apply(lambda x: list(x.replace('(','').replace(')','').split(',')))
dfLT['TiA']= dfLT.ItA.apply(lambda x: np.median(list(map(float,[y for y in x if y]))) )
dfLT['TiA']= dfLT['TiA'].fillna(0)
dfLT['ItA']= dfLT.ItA.apply(lambda x: len([y for y in x if y]))
 
 
#dfL = dfL.drop(dfL.loc[(dfL["Cst"] == 3) & (dfL["Css"] == 1) & (dfL["NP"] > dfL["NS"])].index)
#dfL = dfL.drop(dfL.loc[(dfL["Cst"] == 2) & (dfL["Css"] == 1) & (dfL["NP"] > dfL["NS"])].index)
 
if(n_qty == 1):
groupLT = dfLT[dfLT['NS'] != 0].groupby(['%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']
else:
groupLT = dfLT[dfLT['NS'] != 0].groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']
 
#group
grouped_aggLT = groupLT.agg(['median'])
grouped_aggLT.columns = grouped_aggLT.columns.get_level_values(0)
grouped_aggLT.set_axis(['Sum','ItA'], axis='columns', inplace=True)
```
 
%%%% Output: stream
 
/home/usuario/miniconda3/lib/python3.9/site-packages/numpy/core/fromnumeric.py:3419: RuntimeWarning: Mean of empty slice.
return _methods._mean(a, axis=axis, dtype=dtype,
/tmp/ipykernel_9826/3028104048.py:17: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
/tmp/ipykernel_3823/3028104048.py:17: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
groupLT = dfLT[dfLT['NS'] != 0].groupby(['Dist', '%Async', 'Cst', 'Css', 'NP', 'NS'])['Sum', 'ItA']
 
%% Cell type:code id: tags:
 
``` python
tc_list = []
alpha_list = []
omega_list = []
ita_list = []
dfLT['index'] = dfLT.index
dfM['index'] = dfM.index
for cst_aux in [0,1,2,3]:
for css_aux in [0,1]:
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
dfLT_aux = dfLT[dfLT["NP"] == np_aux][dfLT["NS"] == ns_aux][dfLT["Cst"] == cst_aux][dfLT["Css"] == css_aux]
dfM_aux = dfM[dfM["NP"] == np_aux][dfM["NS"] == ns_aux][dfM["Css"] == css_aux]
if cst_aux == 1 or cst_aux == 3:
dfM_aux2= dfM_aux[dfM_aux["Cst"] == cst_aux-1]
dfM_aux2= dfM_aux2.sort_values(by=['TH'])
dfM_aux = dfM_aux[dfM_aux["Cst"] == cst_aux]
dfM_aux= dfM_aux.sort_values(by=['TH'])
index1_aux = dfM_aux.iloc[4]["index"]
index2_aux = dfM_aux.iloc[5]["index"]
 
# Comprobar que es un metodo asincrono
if cst_aux == 1 or cst_aux == 3:
value_aux1 = dfM_aux[dfM_aux["index"] == index1_aux]['TC'].values
value_aux2 = dfM_aux[dfM_aux["index"] == index2_aux]['TC'].values
valueS_aux1 = dfM_aux2.iloc[4]['TC']
valueS_aux2 = dfM_aux2.iloc[5]['TC']
value1_aux = (value_aux1 + value_aux2) / 2
value2_aux = (value_aux1/valueS_aux1 + value_aux2/valueS_aux2) / 2
else:
value1_aux = dfM_aux['TC'].median()
value2_aux = 1
tc_list.append(float(value1_aux))
alpha_list.append(float(value2_aux))
 
value_aux1 = dfLT_aux[dfLT_aux["index"] == index1_aux]['ItA'].values
value_aux2 = dfLT_aux[dfLT_aux["index"] == index2_aux]['ItA'].values
value3_aux = (value_aux1 + value_aux2) / 2
ita_list.append(int(value3_aux))
 
if cst_aux == 1 or cst_aux == 3:
iter_time_aux1 = dfLT_aux[dfLT_aux["index"] == index1_aux]['Time'].values
iter_time_aux2 = dfLT_aux[dfLT_aux["index"] == index2_aux]['Time'].values
if not time_constant:
iter_time_aux1 = iter_time_aux1 / np_aux
iter_time_aux2 = iter_time_aux2 / np_aux
iter_Atime_aux1 = dfLT_aux[dfLT_aux["index"] == index1_aux]['TiA'].values
iter_Atime_aux2 = dfLT_aux[dfLT_aux["index"] == index2_aux]['TiA'].values
value4_aux = (iter_Atime_aux1/iter_time_aux1 + iter_Atime_aux1/iter_time_aux2) / 2
else:
value4_aux = 1
omega_list.append(float(value4_aux))
grouped_aggM['TC_A'] = tc_list
grouped_aggM['ItA'] = ita_list
grouped_aggM['Alpha_A'] = alpha_list
grouped_aggM['Omega_A'] = omega_list
```
 
%%%% Output: stream
 
/tmp/ipykernel_9826/2150887515.py:12: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
/tmp/ipykernel_3823/2150887515.py:12: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
dfLT_aux = dfLT[dfLT["NP"] == np_aux][dfLT["NS"] == ns_aux][dfLT["Cst"] == cst_aux][dfLT["Css"] == css_aux]
/tmp/ipykernel_9826/2150887515.py:13: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
/tmp/ipykernel_3823/2150887515.py:13: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
dfM_aux = dfM[dfM["NP"] == np_aux][dfM["NS"] == ns_aux][dfM["Css"] == css_aux]
 
%% Cell type:code id: tags:
 
``` python
coherent_check_df = grouped_aggL.copy()
# Añadir suma total de iteraciones
coherent_check_df['Sum'] = 0
coherent_check_df.loc[(1,slice(None)),'Sum'] = grouped_aggLT[(grouped_aggLT['Sum'] != 0)].loc[(slice(None)),'Sum'].values
coherent_check_df = coherent_check_df[(coherent_check_df['Sum'] != 0)]
# Añadir tiempos TE y TC
coherent_check_df['TE'] = 0
coherent_check_df['TEA'] = 0
coherent_check_df['TR'] = 0
coherent_check_df['TRA'] = 0
for cst_aux in [1,3]:
coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TE'] = grouped_aggG2.loc[('2,2',0,cst_aux-1,slice(None)),'TE'].values
coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TR'] = grouped_aggM.loc[('2,2',0,cst_aux-1,slice(None)),'TC'].values
coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TEA'] = grouped_aggG2.loc[('2,2',0,cst_aux,slice(None)),'TE'].values
coherent_check_df.loc[(1,2,0,cst_aux,slice(None)),'TRA'] = grouped_aggM.loc[('2,2',0,cst_aux,slice(None)),'TC'].values
# Calcular tiempos teoricos
#coherent_check_df['Teorico-S'] = coherent_check_df['Ti'] * 3 + coherent_check_df['TR'] + TIEMPOITERNS * 97
#coherent_check_df['Rel-S'] = np.round(coherent_check_df['Teorico-S'] / coherent_check_df['TE'],2)
#coherent_check_df['Teorico-A'] = coherent_check_df['Ti'] * 3 + coherent_check_df['Sum'] + TIEMPOITERNS * (97 - coherent_check_df['Iters'])
#coherent_check_df['Rel-A'] = np.round(coherent_check_df['Teorico-A'] / coherent_check_df['TEA'],2)
coherent_check_df=coherent_check_df.droplevel('Tt').droplevel('%Async').droplevel('Dist')
for cst_aux in [1,3]:
for css_aux in [0,1]:
aux_df = coherent_check_df.loc[(cst_aux, css_aux, slice(None))]
aux_df.to_excel("coherent"+str(cst_aux)+"_"+str(css_aux)+".xlsx")
```
 
%% Cell type:code id: tags:
 
``` python
grouped_aggL.to_excel("resultL.xlsx")
grouped_aggLT.to_excel("resultLT.xlsx")
dfLT.to_excel("resultLT_all.xlsx")
grouped_aggM.to_excel("resultM.xlsx")
grouped_aggG2.to_excel("resultG.xlsx")
```
 
%% Cell type:code id: tags:
 
``` python
dfG
dfM
dfL
dfLT
grouped_aggG
grouped_aggM
grouped_aggL
grouped_aggLT
```
 
%%%% Output: execute_result
 
Sum ItA
Dist %Async Cst Css NP NS
2 0.0 0 0 1 10 0.000000 0.0
20 0.000000 0.0
40 0.000000 0.0
80 0.000000 0.0
120 0.000000 0.0
... ... ...
3 1 120 1 0.603147 2.0
10 0.576215 2.0
20 0.584821 2.0
40 0.611443 2.0
80 0.604689 2.0
[240 rows x 2 columns]
 
%% Cell type:code id: tags:
 
``` python
grouped_aggG.loc[('2,2',0,2,1)]
dfL
```
 
%%%% Output: execute_result
 
TE
Groups
1,10 6.369967
1,120 7.105817
1,20 6.795948
1,40 6.937367
1,80 6.966290
10,1 6.056520
10,120 6.979421
10,20 6.574471
10,40 6.838011
10,80 6.981027
120,1 6.348445
120,10 6.292254
120,20 6.327157
120,40 6.321162
120,80 6.423317
20,1 6.072897
20,10 6.073298
20,120 7.171862
20,40 6.991988
20,80 7.069774
40,1 6.090644
40,10 5.739764
40,120 7.113592
40,20 6.218595
40,80 6.992810
80,1 6.305216
80,10 6.259644
80,120 7.032920
80,20 6.302444
80,40 6.434365
N %Async NP N_par NS Dist Compute_tam Comm_tam Cst Css Time \
0 0 0.0 40 0 10 2 100000 0 3 0 0.2
1 0 0.0 40 0 10 2 100000 0 3 0 0.2
2 0 0.0 40 0 10 2 100000 0 3 0 0.2
3 0 0.0 40 0 10 2 100000 0 3 0 0.2
4 0 0.0 40 0 10 2 100000 0 3 0 0.2
... .. ... ... ... .. ... ... ... ... ... ...
71995 0 0.0 120 0 10 2 100000 0 3 0 0.2
71996 0 0.0 120 0 10 2 100000 0 3 0 0.2
71997 0 0.0 120 0 10 2 100000 0 3 0 0.2
71998 0 0.0 120 0 10 2 100000 0 3 0 0.2
71999 0 0.0 120 0 10 2 100000 0 3 0 0.2
Iters Ti Tt To omega
0 3 0.199854 0.0 224.0 1
1 3 0.226667 0.0 224.0 1
2 3 0.212055 0.0 224.0 1
3 3 0.374593 1.0 224.0 1
4 3 0.200724 1.0 224.0 1
... ... ... ... ... ...
71995 3 0.210870 1.0 224.0 1
71996 3 0.200096 0.0 224.0 1
71997 3 0.202437 0.0 224.0 1
71998 3 0.200116 0.0 224.0 1
71999 3 0.324975 1.0 224.0 1
[72000 rows x 16 columns]
 
%% Cell type:code id: tags:
 
``` python
grouped_aggM.loc[('2,2',0,2,0)]
```
 
%%%% Output: execute_result
 
TC TH TS TA TR alpha TC_A ItA Alpha_A \
NP NS
1 10 0.283736 0.0 0.0 0.0 0.283736 1.0 0.283736 0 1.0
20 0.716209 0.0 0.0 0.0 0.716209 1.0 0.716209 0 1.0
40 0.798951 0.0 0.0 0.0 0.798951 1.0 0.798951 0 1.0
80 0.931771 0.0 0.0 0.0 0.931771 1.0 0.931771 0 1.0
120 0.992033 0.0 0.0 0.0 0.992033 1.0 0.992033 0 1.0
10 1 0.000982 0.0 0.0 0.0 0.000982 1.0 0.000982 0 1.0
20 0.477040 0.0 0.0 0.0 0.477040 1.0 0.477040 0 1.0
40 0.766185 0.0 0.0 0.0 0.766185 1.0 0.766185 0 1.0
80 0.860920 0.0 0.0 0.0 0.860920 1.0 0.860920 0 1.0
120 0.890894 0.0 0.0 0.0 0.890894 1.0 0.890894 0 1.0
20 1 0.001005 0.0 0.0 0.0 0.001005 1.0 0.001005 0 1.0
10 0.001025 0.0 0.0 0.0 0.001025 1.0 0.001025 0 1.0
40 0.790193 0.0 0.0 0.0 0.790193 1.0 0.790193 0 1.0
80 0.864170 0.0 0.0 0.0 0.864170 1.0 0.864170 0 1.0
120 1.088929 0.0 0.0 0.0 1.088929 1.0 1.088929 0 1.0
40 1 0.029802 0.0 0.0 0.0 0.029802 1.0 0.029802 0 1.0
10 0.024519 0.0 0.0 0.0 0.024519 1.0 0.024519 0 1.0
20 0.116366 0.0 0.0 0.0 0.116366 1.0 0.116366 0 1.0
80 0.893692 0.0 0.0 0.0 0.893692 1.0 0.893692 0 1.0
120 0.922904 0.0 0.0 0.0 0.922904 1.0 0.922904 0 1.0
80 1 0.217198 0.0 0.0 0.0 0.217198 1.0 0.217198 0 1.0
10 0.180846 0.0 0.0 0.0 0.180846 1.0 0.180846 0 1.0
20 0.149038 0.0 0.0 0.0 0.149038 1.0 0.149038 0 1.0
40 0.148336 0.0 0.0 0.0 0.148336 1.0 0.148336 0 1.0
120 0.905912 0.0 0.0 0.0 0.905912 1.0 0.905912 0 1.0
120 1 0.231024 0.0 0.0 0.0 0.231024 1.0 0.231024 0 1.0
10 0.148412 0.0 0.0 0.0 0.148412 1.0 0.148412 0 1.0
20 0.177781 0.0 0.0 0.0 0.177781 1.0 0.177781 0 1.0
40 0.350567 0.0 0.0 0.0 0.350567 1.0 0.350567 0 1.0
80 0.156000 0.0 0.0 0.0 0.156000 1.0 0.156000 0 1.0
Omega_A
NP NS
1 10 1.0
20 1.0
40 1.0
80 1.0
120 1.0
10 1 1.0
20 1.0
40 1.0
80 1.0
120 1.0
20 1 1.0
10 1.0
40 1.0
80 1.0
120 1.0
40 1 1.0
10 1.0
20 1.0
80 1.0
120 1.0
80 1 1.0
10 1.0
20 1.0
40 1.0
120 1.0
120 1 1.0
10 1.0
20 1.0
40 1.0
80 1.0
 
%% Cell type:code id: tags:
 
``` python
grouped_aggL
```
 
%%%% Output: execute_result
 
Ti Iters To Iters2 alpha \
Tt Dist %Async Cst Css NP NS
0.0 2 0.0 0 0 1 10 3.999165 3.0 4485.0 3.0 1.000000
20 3.999194 3.0 4485.0 3.0 1.000000
40 3.999186 3.0 4485.0 3.0 1.000000
80 3.999236 3.0 4485.0 3.0 1.000000
120 3.999194 3.0 4485.0 3.0 1.000000
... ... ... ... ... ...
1.0 2 0.0 3 1 120 1 0.070046 3.0 37.0 3.0 2.108073
10 0.075896 4.0 37.0 4.0 2.292376
20 0.090617 5.0 37.0 5.0 2.733503
40 0.069103 4.0 37.0 4.0 2.089061
80 0.068959 4.0 37.0 4.0 2.083952
alpha2
Tt Dist %Async Cst Css NP NS
0.0 2 0.0 0 0 1 10 30
20 30
40 30
80 30
120 30
... ...
1.0 2 0.0 3 1 120 1 30
10 40
20 54
40 37
80 39
[360 rows x 6 columns]
 
%% Cell type:code id: tags:
 
``` python
auxIter = pd.DataFrame(dfM['Iters'].str.split(',',1).tolist(),columns = ['Iters0','Iters1'])
auxIter['Iters1'] = pd.to_numeric(auxIter['Iters1'], errors='coerce')
iters = auxIter['Iters1'].mean()
print(iters)
```
 
%%%% Output: stream
 
97.0
 
%% Cell type:markdown id: tags:
 
A partir de aquí se muestran gráficos
 
%% Cell type:code id: tags:
 
``` python
#Reserva de memoria para las estructuras
TP_data=[0]*2
TH_data=[0]*2
TM_data=[0]*2
 
TP_A_data=[0]*2
TH_A_data=[0]*2
TM_A_data=[0]*2
 
for dist in [1,2]:
dist_index=dist-1
 
TP_data[dist_index]=[0]*len(values)*(len(values))
TH_data[dist_index]=[0]*len(values)*(len(values))
TM_data[dist_index]=[0]*len(values)*(len(values))
 
TP_A_data[dist_index]=[0]*len(values)*(len(values))
TH_A_data[dist_index]=[0]*len(values)*(len(values))
TM_A_data[dist_index]=[0]*len(values)*(len(values))
 
# Obtencion de los grupos del dataframe necesarios
 
#ACTUALMENTE NO SE DIFERENCIAN LOS TIEMPOS DE ITERACIONES DE PADRES E HIJOS CUANDO COINCIDE EL NUMERO DE PROCESOS
if(n_qty == 1):
groupM_aux = dfM.groupby(['NP', 'NS'])['TC']
groupL_aux = dfL[dfL['Tt'] == 0].groupby(['NP'])['Ti']
else:
groupM_aux = dfM.groupby(['NP', 'NS', 'Dist'])['TC']
groupL_aux = dfL[dfL['Tt'] == 0].groupby(['Dist', 'NP'])['Ti']
 
grouped_aggM_aux = groupM_aux.agg(['mean'])
grouped_aggM_aux.columns = grouped_aggM_aux.columns.get_level_values(0)
 
grouped_aggL_aux = groupL_aux.agg(['mean'])
grouped_aggL_aux.columns = grouped_aggL_aux.columns.get_level_values(0)
grouped_aggL_aux.set_axis(['Ti'], axis='columns')
 
#Calculo de los valores para las figuras
#1=Best Fit
#2=Worst Fit
dist=1
for dist in [1,2]:
dist_index=dist-1
dist_v = str(dist)+","+str(dist)
i=0
r=0
for numP in values:
j=0
for numC in values:
 
tc_real = grouped_aggM_aux.loc[(numP,numC,dist_v)]['mean']
for tipo in [0]: #TODO Poner a 0,100
iters_aux=dfM[(dfM["NP"] == numP)][(dfM["NS"] == numC)][(dfM["Dist"] == dist_v)][(dfM["%Async"] == tipo)]['Iters'].head(1).tolist()[0].split(',')
itersP_aux = int(iters_aux[0])
itersS_aux = int(iters_aux[1])
iters_mal_aux = 0
if tipo != 0:
iters_mal_aux = grouped_aggL['Iters'].loc[(1,dist,tipo,numP,numC)]
 
t_iterP_aux = grouped_aggL_aux['Ti'].loc[(dist,numP)]
t_iterS_aux = grouped_aggL_aux['Ti'].loc[(dist,numC)]
 
 
p1 = t_iterP_aux * itersP_aux
p2 = t_iterS_aux * max((itersS_aux - iters_mal_aux),0)
 
array_aux = grouped_aggM[['TS', 'TA']].loc[(dist_v,tipo,numP,numC)].tolist()
p3 = tc_real + array_aux[0] + array_aux[1]
 
#Guardar datos
if tipo == 0:
TP_data[dist_index][i*len(values) + j] = p1
TH_data[dist_index][i*len(values) + j] = p2
TM_data[dist_index][i*len(values) + j] = p3
else:
TP_A_data[dist_index][i*len(values) + j] = p1
TH_A_data[dist_index][i*len(values) + j] = p2
TM_A_data[dist_index][i*len(values) + j] = p3
j+=1
i+=1
print(TP_data)
print(TH_data)
print(TM_data)
```
 
%%%% Output: stream
 
[[0.21241231578947362, 0.21241231578947362, 0.21241231578947362, 0.21241231578947362, 0.04632109565217393, 0.04632109565217393, 0.04632109565217393, 0.04632109565217393, 0.025296672413793103, 0.025296672413793103, 0.025296672413793103, 0.025296672413793103, 0.0355868547008547, 0.0355868547008547, 0.0355868547008547, 0.0355868547008547], [0.1981199732142857, 0.1981199732142857, 0.1981199732142857, 0.1981199732142857, 0.06233977876106192, 0.06233977876106192, 0.06233977876106192, 0.06233977876106192, 0.026912142857142853, 0.026912142857142853, 0.026912142857142853, 0.026912142857142853, 0.0343439649122807, 0.0343439649122807, 0.0343439649122807, 0.0343439649122807]]
[[2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703, 2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703, 2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703, 2.1241231578947364, 0.4632109565217393, 0.25296672413793103, 0.35586854700854703], [1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807, 1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807, 1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807, 1.9811997321428572, 0.6233977876106191, 0.2691214285714285, 0.343439649122807]]
[[0.22657399999999997, 0.22961033333333333, 0.37444533333333335, 1.0861523333333334, 0.18071299999999998, 0.2686593333333333, 0.48245, 1.8810366666666667, 0.22639533333333337, 0.31453400000000004, 0.564293, 2.4626886666666667, 0.4612826666666667, 1.0638560000000001, 1.5319243333333334, 2.1236686666666666], [0.21594133333333332, 0.36930899999999994, 1.1269756666666668, 1.1670603333333334, 0.22462733333333332, 0.47068400000000005, 1.5951943333333334, 1.693723, 0.7059706666666666, 1.368441, 1.8698483333333336, 2.2059883333333334, 0.4813296666666667, 1.3010543333333333, 1.8387883333333335, 2.1851773333333333]]
 
%%%% Output: stream
 
/home/usuario/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:36: FutureWarning: set_axis currently defaults to operating inplace.
This will change in a future version of pandas, use inplace=True to avoid this warning.
/home/usuario/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:53: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
 
%% Cell type:code id: tags:
 
``` python
#TP_A_data=[[0.1997793257575758, 0.1997793257575758, 0.1997793257575758, 0.1997793257575758, 0.040469166666666695, 0.040469166666666695, 0.040469166666666695, 0.040469166666666695, 0.019951386363636366, 0.019951386363636366, 0.019951386363636366, 0.019951386363636366, 0.010227022727272729, 0.010227022727272729, 0.010227022727272729, 0.010227022727272729], [0.20020575000000002, 0.20020575000000002, 0.20020575000000002, 0.20020575000000002, 0.039894712121212116, 0.039894712121212116, 0.039894712121212116, 0.039894712121212116, 0.020662818181818185, 0.020662818181818185, 0.020662818181818185, 0.020662818181818185, 0.010635333333333332, 0.010635333333333332, 0.010635333333333332, 0.010635333333333332]]
#TH_A_data=[[1.9977932575757578, 0.40469166666666695, 0.19951386363636364, 0.10227022727272729, 1.9977932575757578, 0.40469166666666695, 0.19951386363636364, 0.10227022727272729, 1.9977932575757578, 0.40469166666666695, 0.19951386363636364, 0.10227022727272729, 1.9977932575757578, 0.40469166666666695, 0.19951386363636364, 0.10227022727272729], [2.0020575000000003, 0.39894712121212117, 0.20662818181818185, 0.10635333333333331, 2.0020575000000003, 0.39894712121212117, 0.20662818181818185, 0.10635333333333331, 2.0020575000000003, 0.39894712121212117, 0.20662818181818185, 0.10635333333333331, 2.0020575000000003, 0.39894712121212117, 0.20662818181818185, 0.10635333333333331]]
#TM_A_data=[[0.2083043333333333, 0.2661843333333333, 0.41778833333333326, 0.9868953333333335, 0.242685, 0.3060793333333333, 0.4986676666666667, 1.2530743333333334, 0.305179, 0.373607, 0.7375183333333334, 1.5113886666666667, 0.501651, 0.8987069999999999, 1.138518666666667, 1.5091376666666665], [0.205789, 0.4116923333333334, 1.0607546666666667, 0.9947066666666666, 0.27494700000000005, 0.669121, 1.2705783333333334, 1.3951336666666665, 0.4765406666666667, 0.9758123333333333, 1.267633, 1.4479673333333334, 0.4905743333333333, 1.0088953333333333, 1.4447113333333332, 1.4516683333333333]]
 
 
for dist in [1,2]:
dist_index=dist-1
f=plt.figure(figsize=(20, 12))
#for numP in values:
 
x = np.arange(len(labelsP_J))
 
width = 0.35
sumaTP_TM = np.add(TP_data[dist_index], TM_data[dist_index]).tolist()
sumaTP_TM_A = np.add(TP_A_data[dist_index], TM_A_data[dist_index]).tolist()
 
ax=f.add_subplot(111)
 
ax.bar(x+width/2, TP_data[dist_index], width, color='blue')
ax.bar(x+width/2, TM_data[dist_index], width, bottom=TP_data[dist_index],color='orange')
ax.bar(x+width/2, TH_data[dist_index], width, bottom=sumaTP_TM, color='green')
 
ax.bar(x-width/2, TP_A_data[dist_index], width, hatch="\\/...", color='blue')
ax.bar(x-width/2, TM_A_data[dist_index], width, bottom=TP_A_data[dist_index], hatch="\\/...", color='orange')
ax.bar(x-width/2, TH_A_data[dist_index], width, bottom=sumaTP_TM_A, hatch="\\/...", color='green')
 
ax.set_ylabel("Time(s)", fontsize=20)
ax.set_xlabel("NP, NC", fontsize=20)
plt.xticks(x, labelsP_J, rotation=90)
 
blue_Spatch = mpatches.Patch(color='blue', label='Parents PR')
orange_Spatch = mpatches.Patch(color='orange', label='Resize PR')
green_Spatch = mpatches.Patch(color='green', label='Children PR')
blue_Apatch = mpatches.Patch(hatch='\\/...', facecolor='blue', label='Parents NR')
orange_Apatch = mpatches.Patch(hatch='\\/...', facecolor='orange', label='Resize NR')
green_Apatch = mpatches.Patch(hatch='\\/...', facecolor='green', label='Children NR')
 
 
handles=[blue_Spatch,orange_Spatch,green_Spatch,blue_Apatch,orange_Apatch,green_Apatch]
 
plt.legend(handles=handles, loc='upper left', fontsize=21,ncol=2)
 
ax.axvline((3.5), color='black')
ax.axvline((7.5), color='black')
ax.axvline((11.5), color='black')
 
ax.tick_params(axis='both', which='major', labelsize=24)
ax.tick_params(axis='both', which='minor', labelsize=22)
plt.ylim((0, 25.5))
#ax.axvline(4)
 
f.tight_layout()
f.savefig("Images/EX_Partitions_"+dist_names[dist]+".png", format="png")
```
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
def get_types_iker(checked_type='tc', used_direction='e', node_type="All", normality='m'):
if checked_type=='te':
var_aux='TE'
tipo_fig="TE"
grouped_aux=grouped_aggG2
elif checked_type=='tc':
var_aux='TC'
tipo_fig="Mall"
grouped_aux=grouped_aggM
 
if node_type=='Intra':
grouped_aux=grouped_aux.query('NP < 21 and NS < 21')
elif node_type=='Inter':
grouped_aux=grouped_aux.query('NP > 21 or NS > 21')
 
if used_direction=='s':
grouped_aux=grouped_aux.query('NP > NS')
if node_type=='Intra':
used_labels=labelsShrinkIntra
elif node_type=='Inter':
used_labels=labelsShrinkInter
elif node_type=='All':
used_labels=labelsShrink
name_fig="Shrink"
 
if normality=='r':
handles=[OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergePthMult_patch]
else:
handles=[OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergePthMult_patch]
elif used_direction=='e':
grouped_aux=grouped_aux.query('NP < NS')
if node_type=='Intra':
used_labels=labelsExpandIntra
elif node_type=='Inter':
used_labels=labelsExpandInter
elif node_type=='All':
used_labels=labelsExpand
name_fig="Expand"
if normality=='r':
handles=[OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
else:
handles=[OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
title=tipo_fig+"_Spawn_"+node_type+"_"+name_fig+"_"+normality
return var_aux, grouped_aux, handles, used_labels, title
```
 
%% Cell type:code id: tags:
 
``` python
def obtain_arrays_iker(grouped_aux, var_aux, used_direction='e', normality='m'):
vOrMult = list(grouped_aux.query('Cst == 0 and Css == 0')[var_aux])
vOrSingle = list(grouped_aux.query('Cst == 0 and Css == 1')[var_aux])
vMergeMult = list(grouped_aux.query('Cst == 2 and Css == 0')[var_aux])
vOrPthMult = list(grouped_aux.query('Cst == 1 and Css == 0')[var_aux])
vOrPthSingle = list(grouped_aux.query('Cst == 1 and Css == 1')[var_aux])
vMergePthMult = list(grouped_aux.query('Cst == 3 and Css == 0')[var_aux])
h_line = None
 
if used_direction=='e':
vMergeSingle = list(grouped_aux.query('Cst == 2 and Css == 1')[var_aux])
vMergePthSingle = list(grouped_aux.query('Cst == 3 and Css == 1')[var_aux])
else:
#FIXME Que tenga en cuenta TH al realizar shrink merge
vMergePthMult = list(grouped_aux.query('Cst == 3 and Css == 0')[var_aux])
vMergeSingle = None
vMergePthSingle = None
title_y = "Total time(s)"
 
if normality == 'r':
vOrSingle = np.subtract(vOrMult, vOrSingle)
vOrPthMult = np.subtract(vOrMult, vOrPthMult)
vOrPthSingle = np.subtract(vOrMult, vOrPthSingle)
vMergeMult = np.subtract(vOrMult, vMergeMult)
vMergePthMult = np.subtract(vOrMult, vMergePthMult)
if used_direction=='e':
vMergeSingle = np.subtract(vOrMult, vMergeSingle)
vMergePthSingle = np.subtract(vOrMult, vMergePthSingle)
vOrMult = None
h_line = 0
title_y = "Saved time(s)"
elif normality == 'n':
vOrSingle = np.divide(vOrSingle, vOrMult)
vOrPthMult = np.divide(vOrPthMult, vOrMult)
vOrPthSingle = np.divide(vOrPthSingle, vOrMult)
vMergeMult = np.divide(vMergeMult, vOrMult)
vMergePthMult = np.divide(vMergePthMult, vOrMult)
if used_direction=='e':
vMergeSingle = np.divide(vMergeSingle, vOrMult)
vMergePthSingle = np.divide(vMergePthSingle, vOrMult)
vOrMult = np.divide(vOrMult, vOrMult)
h_line = 1
title_y = "Relation Config time / Baseline Time"
 
data_array=[vOrMult,vOrSingle,vOrPthMult,vOrPthSingle,vMergeMult,vMergeSingle,vMergePthMult,vMergePthSingle]
v_lines=[]
value_aux = 0.4
if used_direction == 'e':
value_aux = 0.5
for i in range(0, len(vOrSingle)-1):
v_lines.append(value_aux + i)
return data_array, title_y, v_lines, h_line
 
```
 
%% Cell type:code id: tags:
 
``` python
def legend_loc_iker(data_array, len_x, ylim_zero):
 
max_value = np.nanmax([x for x in data_array if x is not None]) # Los valores None es necesario evitarlos
min_value = np.nanmin([x for x in data_array if x is not None]) # Los valores None es necesario evitarlos
if(ylim_zero):
min_value = 0
middle_value = (max_value + min_value) / 2
offset = (max_value - min_value) * 0.1
 
def array_check_loc(ini, end):
up = True
lower = True
for i in range(ini, end):
for j in range(len(data_array)):
if not (data_array[j] is None):
if data_array[j][i] > (middle_value + offset):
up = False
elif data_array[j][i] < (middle_value - offset):
lower = False
if not up and not lower:
break
else:
continue # Only executed if inner loop did NOT break
break # Only executed if inner loop did break
return up,lower
 
up_left, lower_left = array_check_loc(0, math.floor(len_x/2))
up_right, lower_right = array_check_loc(0, math.floor(len_x/2))
 
legend_loc = 'best'
if up_left:
legend_loc = 'upper left'
elif up_right:
legend_loc = 'upper right'
elif lower_left:
legend_loc = 'lower left'
elif lower_right:
lower_right = 'lower right'
 
return legend_loc
 
```
 
%% Cell type:code id: tags:
 
``` python
def graphic_iker(data_array, title="None", title_y="None", title_x="None", handles=None, used_labels=None, v_lines=None, h_line=None, ylim_zero=True):
f=plt.figure(figsize=(30, 12))
ax=f.add_subplot(111)
x = np.arange(len(used_labels))
width = 0.45/4
 
legend_loc = legend_loc_iker(data_array, len(used_labels), ylim_zero)
 
if not (data_array[0] is None):
ax.bar(x-width*3.5, data_array[0], width, color='green')
ax.bar(x-width*2.5, data_array[1], width, hatch="", color='springgreen')
ax.bar(x-width*1.5, data_array[2], width, hatch="//", color='blue')
ax.bar(x-width*0.5, data_array[3], width, hatch="\\",color='darkblue')
 
ax.bar(x+width*0.5, data_array[4], width, hatch="||", color='red')
if not (data_array[5] is None):
ax.bar(x+width*1.5, data_array[5], width, hatch="...", color='darkred')
ax.bar(x+width*2.5, data_array[6], width, hatch="xx", color='yellow')
else:
ax.bar(x+width*1.5, data_array[6], width, hatch="xx", color='yellow')
if not (data_array[7] is None):
ax.bar(x+width*3.5, data_array[7], width, hatch="++",color='olive')
 
ax.axhline((0), color='black', linestyle='dashed')
ax.set_ylabel(title_y, fontsize=30)
ax.set_xlabel(title_x, fontsize=28)
plt.xticks(x, used_labels, rotation=90)
plt.legend(handles=handles, loc=legend_loc, fontsize=26,ncol=2,framealpha=1)
 
if not ylim_zero: # Modifica los limites del eje y. No es buena practica que no aparezca el 0
max_value = np.nanmax([x for x in data_array if x is not None]) # Los valores None es necesario evitarlos
max_value += max_value * 0.1
min_value = np.nanmin([x for x in data_array if x is not None]) # Los valores None es necesario evitarlos
min_value -= min_value * 0.1
if min_value < 0.1:
min_value = 0
plt.ylim((min_value, max_value))
 
for line in v_lines:
ax.axvline((line), color='black')
if h_line != None:
ax.axhline((h_line), color='black')
 
ax.tick_params(axis='both', which='major', labelsize=30)
ax.tick_params(axis='both', which='minor', labelsize=28)
 
f.tight_layout()
f.savefig("Images/Spawn/"+title+".png", format="png")
```
 
%% Cell type:code id: tags:
 
``` python
checked_type='te' # Valores 'te' y 'tc'
used_direction='e' # Valores 's' y 'e'
node_type='All' # Valores 'Intra', 'Inter', 'All'
normality='n'
#Values 'n' (normalizar), 'l' (logaritmico), 'm' (sin modificaciones), 'r' (Comparar respecto al primero)
 
ylim_zero = True
 
var_aux, grouped_aux, handles, used_labels, title = get_types_iker(checked_type, used_direction, node_type, normality)
array_aux, title_y, v_lines, h_line = obtain_arrays_iker(grouped_aux, var_aux, used_direction, normality)
graphic_iker(array_aux, title, title_y, "(NP, NC)", handles, used_labels, v_lines, ylim_zero)
```
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
used_direction='e'
 
if used_direction=='s':
dfM_aux=dfM.query('NP > NS')
dfG_aux=dfG.query('NP > NS')
used_labels=labelsShrink
name_fig="Shrink"
handles=[OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergePthMult_patch]
elif used_direction=='e':
dfM_aux=dfM.query('NP < NS')
dfG_aux=dfG.query('NP < NS')
used_labels=labelsExpand
name_fig="Expand"
handles=[OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
# < Expand
# > Shrink
 
vOrMult = list(dfG_aux.query('Cst == 0 and Css == 0')['TE'])
vOrSingle = list(dfG_aux.query('Cst == 0 and Css == 1')['TE'])
vOrPthMult = list(dfG_aux.query('Cst == 1 and Css == 0')['TE'])
vOrPthSingle = list(dfG_aux.query('Cst == 1 and Css == 1')['TE'])
 
vMergeMult = list(dfG_aux.query('Cst == 2 and Css == 0')['TE'])
vMergeSingle = list(dfG_aux.query('Cst == 2 and Css == 1')['TE'])
vMergePthMult = list(dfG_aux.query('Cst == 3 and Css == 0')['TE'])
vMergePthSingle = list(dfG_aux.query('Cst == 3 and Css == 1')['TE'])
 
vOrMult2 = list(dfM_aux.query('Cst == 0 and Css == 0')['TC'])
vOrSingle2 = list(dfM_aux.query('Cst == 0 and Css == 1')['TC'])
vOrPthMult2 = list(dfM_aux.query('Cst == 1 and Css == 0')['TC'])
vOrPthSingle2 = list(dfM_aux.query('Cst == 1 and Css == 1')['TC'])
 
vMergeMult2 = list(dfM_aux.query('Cst == 2 and Css == 0')['TC'])
vMergeSingle2 = list(dfM_aux.query('Cst == 2 and Css == 1')['TC'])
vMergePthMult2 = list(dfM_aux.query('Cst == 3 and Css == 0')['TC'])
vMergePthSingle2 = list(dfM_aux.query('Cst == 3 and Css == 1')['TC'])
 
f=plt.figure(figsize=(30, 12))
ax=f.add_subplot(111)
 
ax.scatter(vOrMult,vOrMult2, color='green')
ax.scatter(vOrSingle,vOrSingle2, color='springgreen')
ax.scatter(vOrPthMult,vOrPthMult2, color='blue')
ax.scatter(vOrPthSingle,vOrPthSingle2,color='darkblue')
 
ax.scatter(vMergeMult,vMergeMult2, color='red')
if used_direction=='e':
ax.scatter(vMergeSingle,vMergeSingle2,color='darkred')
ax.scatter(vMergePthMult,vMergePthMult2, color='yellow')
if used_direction=='e':
ax.scatter(vMergePthSingle,vMergePthSingle2,color='olive')
 
ax.set_ylabel("Time TC(s)", fontsize=20)
ax.set_xlabel("Time EX (s)", fontsize=20)
#plt.xticks(x, used_labels, rotation=90)
plt.legend(handles=handles, loc='upper right', fontsize=21,ncol=2)
 
ax.tick_params(axis='both', which='major', labelsize=24)
ax.tick_params(axis='both', which='minor', labelsize=22)
 
f.tight_layout()
f.savefig("Images/Spawn/Dispersion_Spawn_"+name_fig+".png", format="png")
```
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
valores1 = [0]*10
valores2 = [0.2]*10
valores3 = [0.4]*10
valores4 = [0.6]*10
valores5 = [0.8]*10
valores6 = [1]*10
valores7 = [1.2]*10
valores8 = [1.4]*10
 
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
if np_aux > ns_aux:
used_labels=labelsShrink
name_fig="Shrink"
handles=[OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergePthMult_patch]
else:
used_labels=labelsExpand
name_fig="Expand"
handles=[OrMult_patch,OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
 
dfM_aux = dfM.query('NP == @np_aux and NS == @ns_aux')
vOrMult2 = list(dfM_aux.query('Cst == 0 and Css == 0')['TC'])
vOrSingle2 = list(dfM_aux.query('Cst == 0 and Css == 1')['TC'])
vOrPthMult2 = list(dfM_aux.query('Cst == 1 and Css == 0')['TC'])
vOrPthSingle2 = list(dfM_aux.query('Cst == 1 and Css == 1')['TC'])
 
vMergeMult2 = list(dfM_aux.query('Cst == 2 and Css == 0')['TC'])
vMergeSingle2 = list(dfM_aux.query('Cst == 2 and Css == 1')['TC'])
vMergePthMult2 = list(dfM_aux.query('Cst == 3 and Css == 0')['TC'])
vMergePthSingle2 = list(dfM_aux.query('Cst == 3 and Css == 1')['TC'])
 
f=plt.figure(figsize=(16, 8))
ax=f.add_subplot(111)
 
ax.scatter(vOrMult2,valores1, color='green')
ax.scatter(vOrSingle2,valores2, color='springgreen')
ax.scatter(vOrPthMult2,valores3, color='blue')
ax.scatter(vOrPthSingle2,valores4,color='darkblue')
 
ax.scatter(vMergeMult2,valores5, color='red')
if np_aux < ns_aux:
ax.scatter(vMergeSingle2,valores6,color='darkred')
ax.scatter(vMergePthMult2,valores7, color='yellow')
if np_aux < ns_aux:
ax.scatter(vMergePthSingle2,valores8,color='olive')
 
ax.set_xlabel("Time TC(s)", fontsize=16)
ax.set_ylabel("-", fontsize=16)
#plt.xticks(x, used_labels, rotation=90)
plt.legend(handles=handles, loc='upper right', fontsize=14,ncol=2)
 
ax.tick_params(axis='both', which='major', labelsize=20)
ax.tick_params(axis='both', which='minor', labelsize=18)
 
f.tight_layout()
f.savefig("Images/Spawn/Dispersion/Dispersion_Spawn_"+name_fig+"_"+str(np_aux)+"_"+str(ns_aux)+".png", format="png")
```
 
%% Cell type:code id: tags:
 
``` python
used_direction='e'
test_parameter='TA'
#TS es merge y TA connect para tests solo spawn
 
if used_direction=='s':
dfM_aux=dfM.query('NP > NS')
used_labels=labelsShrink
name_fig="Shrink"
handles=[OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergePthMult_patch]
elif used_direction=='e':
dfM_aux=dfM.query('NP < NS')
used_labels=labelsExpand
name_fig="Expand"
handles=[OrSing_patch,OrPthMult_patch,OrPthSing_patch,MergeMult_patch,MergeSing_patch,MergePthMult_patch,MergePthSing_patch]
# < Expand
# > Shrink
 
dfM_aux = dfM_aux.copy()
#dfM_aux['NTotal'] = dfM_aux['NP'] + dfM_aux['NS']
dfM_aux['NTotal'] = dfM_aux['NS']
 
#x = np.arange(len(used_labels))
for cst_aux in [0,1,2,3]:
for css_aux in [0,1]:
f=plt.figure(figsize=(20, 12))
ax=f.add_subplot(111)
 
#sns.boxplot(y=test_parameter, x="NS", hue="NP", data = dfM_aux[(dfM_aux.Cst == cst_aux)][(dfM_aux.Css == css_aux)], orient="v", ax=ax)
sns.boxplot(y=test_parameter, x="NTotal", data = dfM_aux[(dfM_aux.Cst == cst_aux)][(dfM_aux.Css == css_aux)], orient="v", ax=ax)
 
# Anyade en el plot el numero de iteraciones - Por hacer TODO
# https://stackoverflow.com/questions/45475962/labeling-boxplot-with-median-values
#medians_aux = dfM[(dfM.Cst == cst_aux)][(dfM.Css == css_aux)].groupby(['NS','NP'])['TC'].median()
#m1 = dfM[(dfM.Cst == cst_aux)][(dfM.Css == css_aux)].groupby(['NS','NP'])['TC'].median().values
#mL1 = [str(np.ceil(s)) for s in m1]
 
#ind = 0
#for tick in range(len(ax.get_xticklabels())):
# ax.text(tick-.2, m1[ind+1]+1, mL1[ind+1], horizontalalignment='center', color='w', weight='semibold')
# ax.text(tick+.2, m1[ind]+1, mL1[ind], horizontalalignment='center', color='w', weight='semibold')
# ind += 2
 
ax.set_ylabel("Time TC(s)", fontsize=20)
ax.set_xlabel("NC", fontsize=20)
plt.legend(loc='upper left', fontsize=21, title = "NP")
ax.tick_params(axis='both', which='major', labelsize=24)
ax.tick_params(axis='both', which='minor', labelsize=22)
 
ax.axvline((.5), color='black')
ax.axvline((1.5), color='black')
ax.axvline((2.5), color='black')
ax.axvline((3.5), color='black')
ax.axvline((4.5), color='black')
 
f.tight_layout()
f.savefig("Images/Spawn/Boxplot_"+name_fig+"_"+test_parameter+"_"+labelsMethods[cst_aux*2 + css_aux]+".png", format="png")
```
 
%% Cell type:code id: tags:
 
``` python
used_direction='e'
test_parameter='alpha' #Valores son "alpha" o "omega"
 
if test_parameter == 'alpha':
name_fig="Alpha_"
real_parameter='Alpha_A'
elif test_parameter == 'omega':
name_fig="Omega_"
real_parameter='Omega_A'
 
df_aux=grouped_aggM
if used_direction=='s':
df_aux=df_aux.query('NP > NS')
used_labels=labelsShrinkOrdered
name_fig= name_fig+"Shrink"
elif used_direction=='e':
df_aux=df_aux.query('NP < NS')
used_labels=labelsExpand
name_fig= name_fig+"Expand"
elif used_direction=='a':
df_aux=df_aux
used_labels=labels
name_fig= name_fig+"All"
 
x = np.arange(len(used_labels))
 
f=plt.figure(figsize=(22, 14))
ax=f.add_subplot(111)
ax.set_xlabel("(NP,NC)", fontsize=36)
ax.set_ylabel(test_parameter.capitalize(), fontsize=36)
plt.xticks(x, used_labels,rotation=90)
ax.tick_params(axis='both', which='major', labelsize=36)
ax.tick_params(axis='both', which='minor', labelsize=36)
 
for cst_aux in [1,3]:
df_aux2 = df_aux.query('Cst == @cst_aux')
for css_aux in [0,1]:
if cst_aux == 3 and css_aux == 1 and used_direction == 's':
continue
array_aux = df_aux2.query('Css == @css_aux')
if used_direction=='s':
array_aux = array_aux.sort_values(by=['NS'])
array_aux = array_aux[real_parameter].values
style_aux = cst_aux*2 + css_aux
ax.plot(x, array_aux, color=colors_spawn[style_aux], linestyle=linestyle_spawn[style_aux%4], \
marker=markers_spawn[style_aux], markersize=18, label=labelsMethods[style_aux])
 
ax.set_ylim(0,3.2)
plt.legend(loc='best', fontsize=30,ncol=2,framealpha=1)
 
f.tight_layout()
f.savefig("Images/Spawn/LinePlot_"+name_fig+".png", format="png")
```
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
used_direction='s'
test_parameter='alpha' #Valores son "alpha" o "omega"
 
if used_direction=='s':
df_aux=grouped_aggM.query('NP > NS')
used_labels=labelsShrink
name_fig="Shrink"
np_aux = [10, 20,20, 40,40,40, 80,80,80,80, 120,120,120,120,120]
nc_aux = [1, 1,10, 1,10,20, 1,10,20,40, 1,10,20,40,80]
elif used_direction=='e':
df_aux=grouped_aggM.query('NP < NS')
used_labels=labelsExpand
name_fig="Expand"
np_aux = [1,1,1,1,1, 10,10,10,10, 20,20,20, 40,40, 80 ]
nc_aux = [10,20,40,80,120, 20,40,80,120, 40,80,120, 80,120, 120]
elif used_direction=='a':
df_aux=grouped_aggM
used_labels=labels
name_fig="All"
np_aux = [1,1,1,1,1, 10,10,10,10,10, 20,20,20,20,20, 40,40,40,40,40, 80,80,80,80,80, 120,120,120,120,120]
nc_aux = [10,20,40,80,120, 1,20,40,80,120, 1,10,40,80,120, 1,10,20,80,120, 1,10,20,40,120, 1,10,20,40,80]
 
x = np.arange(len(used_labels))
handles = []
 
f=plt.figure(figsize=(20, 12))
#ax=f.add_subplot(111)
ax = plt.axes(projection='3d')
ax.azim = -60
ax.dist = 10
ax.elev = 10
ax.set_xlabel("NP", fontsize=20)
ax.set_ylabel("NC", fontsize=20)
ax.set_zlabel("Alpha", fontsize=20)
ax.tick_params(axis='both', which='major', labelsize=24)
ax.tick_params(axis='both', which='minor', labelsize=22)
 
for cst_aux in [1,3]:
df_aux2 = df_aux.query('Cst == @cst_aux')
for css_aux in [0,1]:
array_aux = df_aux2.query('Css == @css_aux')['alpha'].values
ax.plot3D(np_aux, nc_aux, array_aux, colors_spawn[cst_aux*2 + css_aux])
 
handles.append(handles_spawn[cst_aux*2 + css_aux])
 
#ax.set_zlim(0,4)
plt.legend(handles=handles, loc='best', fontsize=20,ncol=2,framealpha=1)
 
f.tight_layout()
f.savefig("Images/Spawn/3dPlot_"+name_fig+'_'+test_parameter+".png", format="png")
```
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
def check_normality(df, tipo):
normality=[True] * (len(processes) * (len(processes)-1))
total=0
i=-1
#Comprobar para cada configuración si se sigue una distribución normal/gaussiana
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
i+=1
for cst_aux in [0,1,2,3]:
for css_aux in [0,1]:
df_aux = df.query('NP == @np_aux and NS == @ns_aux and Cst == @cst_aux and Css == @css_aux')
dataList = list(df_aux[tipo])
st,p = stats.shapiro(dataList) # Tendrían que ser al menos 20 datos y menos de 50
if p < p_value:
normality[i]=False
total+=1
 
 
print("Se sigue una distribución guassiana: " + str(normality) + "\nUn total de: " + str(total) + " no siguen una gaussiana")
return normality
```
 
%% Cell type:code id: tags:
 
``` python
def compute_global_stat_difference(dataLists, parametric):
if parametric:
st,p=stats.f_oneway(dataLists[0],dataLists[1],dataLists[2],dataLists[3],dataLists[4],dataLists[5],dataLists[6],dataLists[7])
else:
st,p=stats.kruskal(dataLists[0],dataLists[1],dataLists[2],dataLists[3],dataLists[4],dataLists[5],dataLists[6],dataLists[7])
if p > p_value: # Si son iguales, no hay que hacer nada más
return False
return True
```
 
%% Cell type:code id: tags:
 
``` python
def compute_global_posthoc(dataLists, parametric):
data_stats=[]
ini=0
end=len(labelsMethods)
if parametric:
df_aux = sp.posthoc_ttest(dataLists)
df_Res = df_aux.copy()
for i in range(ini,end):
data_stats.append(np.mean(dataLists[i]))
for j in range(ini,end):
if df_Res.iat[i,j] < p_value: # Medias diferentes
df_Res.iat[i, j] = True
else:
df_Res.iat[i, j] = False
else:
df_aux = sp.posthoc_conover(dataLists)
df_Res = df_aux.copy()
for i in range(ini,end):
data_stats.append(np.median(dataLists[i]))
for j in range(ini,end):
if df_Res.iat[i,j] < p_value: # Medianas diferentes
df_Res.iat[i, j] = True
else:
df_Res.iat[i, j] = False
#print(df_Res)
#print(df_aux)
#print(data_stats)
return df_Res, data_stats
```
 
%% Cell type:code id: tags:
 
``` python
# Aquellos grupos que tengán valores por encima del límite no se considerarán
# Con sumar a si mismos su valor actual estarán fuera
def check_groups_boundaries(data_stats, np_aux, ns_aux, tc_boundary):
index_aux = 0
for cst_aux in [0,2]: # Primero los grupos síncronos
for css_aux in [0,1]:
if cst_aux == 2 and css_aux == 1 and np_aux > ns_aux: # Arreglo para coger bien el tiempo en Merge Single Shrink
index_aux = 1
tc_val = grouped_aggM.loc[('2,2',0, cst_aux, css_aux - index_aux, np_aux,ns_aux), 'TC_A']
if tc_val > tc_boundary:
data_stats[cst_aux*2 + css_aux]+=data_stats[cst_aux*2 + css_aux]
index_aux = 0
for cst_aux in [1,3]: # Segundo se comprueban los asíncronos
for css_aux in [0,1]:
if cst_aux == 3 and css_aux == 1 and np_aux > ns_aux: # Arreglo para coger bien el tiempo en Merge Single Shrink
index_aux = 1
tc_val = grouped_aggM.loc[('2,2',0, cst_aux, css_aux - index_aux, np_aux,ns_aux), 'TH']
if tc_val > tc_boundary:
data_stats[cst_aux*2 + css_aux]+=data_stats[cst_aux*2 + css_aux]
```
 
%% Cell type:code id: tags:
 
``` python
def get_stat_differences(df_Res, data_stats, np_aux, ns_aux, shrink, parametric):
best = 0
otherBest=[]
 
# TODO Descomentar tras anyadir RMS perspective en results_with_st
#if rms_boundary != 0: # Si se usa perspectiva de RMS, se desconsideran valores muy altos
# check_groups_boundaries(data_stats, np_aux, ns_aux, tc_boundary)
 
indexes = np.argsort(data_stats)
best = -1
i = 0
while best == -1:
index = indexes[i]
if not (shrink and (index == 5 or index == 7)): # Las opciones Merge single(5) y Merge single - Pthreads(7) no se utilizan al reducir
#if rms_boundary == 0 or data_stats[index] <= tc_boundary:
best = index
i+=1
otherBest=[]
for index in range(len(labelsMethods)): # Para cada metodo exceptuando best
if not (shrink and (index == 5 or index == 7)): # Las opciones Merge single(5) y Merge single - Pthreads(7) no se utilizan al reducir
if index != best and not df_Res.iat[best,index]: #Medias/Medianas iguales
#if data_stats[index] <= tc_boundary:
otherBest.append(index)
stringV=""
for i in otherBest:
stringV+=labelsMethods[i]+", "
print("Redimensión " + str(np_aux) + "/" + str(ns_aux) +" "+ str(parametric)+" Mejores: " + labelsMethods[best]+", " + stringV)
otherBest.insert(0,best)
 
return otherBest
```
 
%% Cell type:code id: tags:
 
``` python
def get_perc_differences(dataLists, np_aux, ns_aux, shrink, rms_boundary, tc_boundary):
data_stats = []
ini=0
end=len(labelsMethods)
for i in range(ini,end):
data_stats.append(np.median(dataLists[i]))
 
if rms_boundary != 0: # Si se usa perspectiva de RMS, se desconsideran valores muy altos
check_groups_boundaries(data_stats, np_aux, ns_aux, tc_boundary)
indexes = np.argsort(data_stats)
 
best = -1
bestMax = -1
otherBest=[]
for index in indexes: # Para cada metodo -- Empezando por el más bajo en media/mediana
if shrink and (index == 5 or index == 7): # Las opciones Merge single(5) y Merge single - Pthreads(7) no se utilizan al reducir
continue
 
if best == -1:
best = index
bestMax = data_stats[best] * 0.05 + data_stats[best]
elif data_stats[index] <= bestMax: # Medias/Medianas diferentes && Media/Medianas i < Media/Mediana best
otherBest.append(index)
 
 
stringV=""
for i in otherBest:
stringV+=labelsMethods[i]+", "
print("Redimensión " + str(np_aux) + "/" + str(ns_aux)+" Mejores: " + labelsMethods[best]+", " + stringV)
otherBest.insert(0,best)
 
return otherBest
```
 
%% Cell type:code id: tags:
 
``` python
#Obtiene
def check_groups_stats(dataLists, np_aux, ns_aux, shrink, parametric):
global_difference=compute_global_stat_difference(dataLists, parametric)
if not global_difference:
print("Configuración: " + str(np_aux) + "/" + str(ns_aux) + " tiene valores iguales")
return
 
df_Res,data_stats=compute_global_posthoc(dataLists,parametric)
return get_stat_differences(df_Res, data_stats, np_aux, ns_aux, shrink, parametric)
 
```
 
%% Cell type:code id: tags:
 
``` python
def results_with_st(tipo, data_aux):
normality=check_normality(data_aux,tipo)
if False in normality:
normality = False
else:
normality = True
 
 
results = []
shrink = False
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
dataSet = data_aux.query('NP == @np_aux and NS == @ns_aux')
dataLists=[]
if np_aux > ns_aux:
shrink = True
else:
shrink = False
#normality=True
for cst_aux in [0,1,2,3]:
for css_aux in [0,1]:
dataSet_aux = dataSet.query('Cst == @cst_aux and Css == @css_aux')
lista_aux = list(dataSet_aux[tipo])
dataLists.append(lista_aux)
#Si permito el shaphiro, acabare comparando manzanas y naranjas
# si hay distribuciones normales y no normales
#st,p = stats.shapiro(lista_aux) # Tendrían que ser al menos 20 datos y menos de 50
#if p < p_value:
#normality=False
 
aux_data = check_groups_stats(dataLists, np_aux, ns_aux, shrink, normality)
results.append(aux_data)
return results
```
 
%% Cell type:code id: tags:
 
``` python
def results_with_perc(tipo, data_aux, rms_boundary=0):
results = []
shrink = False
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
dataSet = data_aux.query('NP == @np_aux and NS == @ns_aux')
dataLists=[]
if np_aux > ns_aux:
shrink = True
else:
shrink = False
 
tc_boundary = dfM.query('NP == @np_aux and NS == @ns_aux')['TC'].max()
if rms_boundary == 0:
for cst_aux in [0,1,2,3]:
for css_aux in [0,1]:
dataSet_aux = dataSet.query('Cst == @cst_aux and Css == @css_aux')
lista_aux = list(dataSet_aux[tipo])
dataLists.append(lista_aux)
else:
boundaries = []
for cst_aux in [0,1,2,3]:
for css_aux in [0,1]:
dataSet_aux = dataSet.query('Cst == @cst_aux and Css == @css_aux')
lista_aux = list(dataSet_aux[tipo])
dataLists.append(lista_aux)
 
if cst_aux == 0 or cst_aux == 2:
if cst_aux == 2 and css_aux == 1 and (np_aux > ns_aux):
new_boundary = tc_boundary
else:
new_boundary = grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux), 'TC_A']
else:
if cst_aux == 3 and css_aux == 1 and (np_aux > ns_aux):
new_boundary = tc_boundary
else:
new_boundary = grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux), 'TH']
boundaries.append(new_boundary)
tc_boundary = min(boundaries)
tc_boundary = tc_boundary + tc_boundary*rms_boundary
 
aux_data = get_perc_differences(dataLists, np_aux, ns_aux, shrink, rms_boundary, tc_boundary)
results.append(aux_data)
return results
```
 
%% Cell type:code id: tags:
 
``` python
checked_type='tc'
use_perc = False
rms_boundary=0 # Poner a 0 para perspectiva de app. Valor >0 y <1 para perspectiva de RMS
if checked_type=='te':
tipo="TE"
data_aux=dfG
elif checked_type=='tc':
tipo="TC"
data_aux=dfM
 
if use_perc:
results = results_with_perc(tipo, data_aux, rms_boundary)
else:
results = results_with_st(tipo, data_aux)
 
print(results)
```
 
%%%% Output: stream
Se sigue una distribución guassiana: [False, True, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
Un total de: 107 no siguen una gaussiana
1 2 3 4 5 6 7 8
1 False False True True True True True False
2 False False True True True True True False
3 True True False False True True True True
4 True True False False True True True True
5 True True True True False False True True
6 True True True True False False False True
7 True True True True True False False False
8 False False True True True True False False
Redimensión 1/10 False Mejores: Merge single, Merge, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 1/20 False Mejores: Merge single, Merge,
1 2 3 4 5 6 7 8
1 False True False True False False False True
2 True False True False True True True False
3 False True False True True False False False
4 True False True False True True True False
5 False True True True False False False True
6 False True False True False False False True
7 False True False True False False False True
8 True False False False True True True False
Redimensión 1/40 False Mejores: Merge, Baseline, Merge single, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True False False False True
2 True False True True True True True False
3 True True False True True True True True
4 True True True False True True True False
5 False True True True False False False True
6 False True True True False False False True
7 False True True True False False False True
8 True False True False True True True False
Redimensión 1/80 False Mejores: Baseline, Merge, Merge single, Merge - Asynchronous,
Configuración: 1/120 tiene valores iguales
1 2 3 4 5 6 7 8
1 False False True True True True True False
2 False False True True True True True False
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 False False True True True True True False
Redimensión 10/1 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True True
2 True False True True True True True True
3 False True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 10/20 False Mejores: Merge single, Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True True
2 True False True True True True True True
3 False True False True True True True True
4 True True True False True True True True
5 True True True True False True True True
6 True True True True True False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 10/40 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True False
2 True False False True True True True True
3 False False False True True True True True
4 True True True False True True True True
5 True True True True False True False True
6 True True True True True False False True
7 True True True True False False False True
8 False True True True True True True False
Redimensión 10/80 False Mejores: Merge single, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True False True True True True True
2 True False True True True True True False
3 False True False True True True True False
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True False False True True True True False
Redimensión 10/120 False Mejores: Merge, Merge single,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 20/1 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False True True True
6 True True True True True False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 20/10 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True False
2 True False True True True True True True
3 False True False True True True True False
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False False True
7 True True True True False False False True
8 False True False True True True True False
Redimensión 20/40 False Mejores: Merge, Merge single, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True False True True True True False
2 True False True True True True True True
3 False True False True True True True False
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False False True
7 True True True True False False False True
8 False True False True True True True False
Redimensión 20/80 False Mejores: Merge, Merge single, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True False True True True True False
2 True False True True True True True False
3 False True False True True True True False
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False False True
7 True True True True False False False True
8 False False False True True True True False
Redimensión 20/120 False Mejores: Merge, Merge single, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 40/1 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 40/10 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 40/20 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True True
2 True False True True True True True True
3 False True False True True True True True
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False True True
7 True True True True False True False True
8 True True True True True True True False
Redimensión 40/80 False Mejores: Merge single, Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True False
2 True False True True True True True True
3 False True False True True True True True
4 True True True False True True True True
5 True True True True False True True True
6 True True True True True False False True
7 True True True True True False False True
8 False True True True True True True False
Redimensión 40/120 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False False True True True True False True
2 False False True True True True True False
3 True True False False True True True False
4 True True False False True True True True
5 True True True True False False False True
6 True True True True False False False True
7 False True True True False False False True
8 True False False True True True True False
Redimensión 80/1 False Mejores: Merge, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True False
2 True False False True True True True True
3 True False False True True True True True
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False False True
7 True True True True False False False False
8 False True True True True True False False
Redimensión 80/10 False Mejores: Merge, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False True True
7 True True True True True True False True
8 True True True True True True True False
Redimensión 80/20 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True False True True True True True
2 True False True True True True True True
3 False True False True True True True True
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False False True
7 True True True True False False False True
8 True True True True True True True False
Redimensión 80/40 False Mejores: Merge, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False False True
7 True True True True True False False True
8 True True True True True True True False
Redimensión 80/120 False Mejores: Merge, Merge single,
1 2 3 4 5 6 7 8
1 False False True True False False False True
2 False False False True False False False True
3 True False False False True True True False
4 True True False False True True True False
5 False False True True False False False True
6 False False True True False False False True
7 False False True True False False False True
8 True True False False True True True False
Redimensión 120/1 False Mejores: Merge, Baseline, Baseline single, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True False
2 True False False True True True True True
3 True False False True True True True True
4 True True True False True True True True
5 True True True True False False False True
6 True True True True False False False False
7 True True True True False False False False
8 False True True True True False False False
Redimensión 120/10 False Mejores: Merge, Merge - Asynchronous,
1 2 3 4 5 6 7 8
1 False True True True True True True False
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False False True
7 True True True True True False False True
8 False True True True True True True False
Redimensión 120/20 False Mejores: Merge,
1 2 3 4 5 6 7 8
1 False True True True True True True True
2 True False True True True True True True
3 True True False True True True True True
4 True True True False True True True True
5 True True True True False True False False
6 True True True True True False True True
7 True True True True False True False False
8 True True True True False True False False
Redimensión 120/40 False Mejores: Merge - Asynchronous, Merge,
1 2 3 4 5 6 7 8
1 False False False True True True True True
2 False False True True True True True True
3 False True False True True True True True
4 True True True False True True True True
5 True True True True False False True True
6 True True True True False False False True
7 True True True True True False False True
8 True True True True True True True False
Redimensión 120/80 False Mejores: Merge,
[[5, 4, 6], [5, 4], [4, 0, 5, 6], [0, 4, 5, 6], None, [4], [5, 4], [4], [5, 6], [4, 5], [4], [4], [4, 5, 6], [4, 5, 6], [4, 5, 6], [4], [4], [4], [5, 4], [4], [4, 6], [4, 6], [4], [4, 6], [4, 5], [4, 0, 1, 6], [4, 6], [4], [6, 4], [4]]
%% Cell type:code id: tags:
 
``` python
#Lista de indices de mayor a menor de los valores
aux_array = []
for data in results:
aux_array+=data
unique, counts = np.unique(aux_array, return_counts=True)
aux_dict = dict(zip(unique, counts))
aux_keys=list(aux_dict.keys())
aux_values=list(aux_dict.values())
aux_ordered_index=list(reversed(list(np.argsort(aux_values))))
 
i=0
j=0
used_aux=0
heatmap=np.zeros((len(processes),len(processes))).astype(int)
 
if use_perc:
for i in range(len(processes)):
for j in range(len(processes)):
if i==j:
heatmap[i][j]=-1
used_aux+=1
else:
results_index = i*len(processes) +j-used_aux
heatmap[i][j] = results[results_index][0]
else:
for i in range(len(processes)):
for j in range(len(processes)):
if i==j:
heatmap[i][j]=-1
used_aux+=1
else:
results_index = i*len(processes) +j-used_aux
for index in aux_ordered_index:
if aux_keys[index] in results[results_index]:
heatmap[i][j]=aux_keys[index]
break
heatmap[len(processes)-1][len(processes)-1]=8
print(heatmap)
```
 
%%%% Output: stream
 
[[-1 2 7 7 6 2]
[ 2 -1 7 7 6 6]
[ 4 6 -1 6 6 6]
[ 4 4 6 -1 6 6]
[ 6 6 6 6 -1 6]
[ 6 6 6 6 6 8]]
 
%% Cell type:code id: tags:
 
``` python
#Adapta results a una cadena asegurando que cada cadena no se sale de su celda
results_str = []
max_counts = 1
for i in range(len(results)):
results_str.append(list())
count = len(results[i])
new_data = str(results[i]).replace('[','').replace(']','')
remainder = count%3
 
if count <= 3:
results_str[i].append(new_data)
else:
if remainder == 0:
results_str[i].append(new_data[0:8])
results_str[i].append(new_data[9:])
else:
index = 1 + (remainder -1)*3
results_str[i].append(new_data[0:index+1])
results_str[i].append(new_data[index+2:])
 
if count > max_counts:
if count > 3:
aux_value = results_str[i].pop()[0:1]
results_str[i][0] = results_str[i][0][0:max_counts*3-2]
if remainder == 1 and max_counts > 1:
results_str[i][0] = results_str[i][0] + ' ' + aux_value
#print(results_str)
```
 
%% Cell type:code id: tags:
 
``` python
#Crea un heatmap teniendo en cuenta los colores anteriores
f=plt.figure(figsize=(24, 12))
ax=f.add_subplot(111)
 
myColors = (colors.to_rgba("white"),colors.to_rgba("green"), colors.to_rgba("springgreen"),colors.to_rgba("blue"),colors.to_rgba("darkblue"),
colors.to_rgba("red"),colors.to_rgba("darkred"),colors.to_rgba("darkgoldenrod"),colors.to_rgba("olive"),colors.to_rgba("white"))
cmap = LinearSegmentedColormap.from_list('Custom', myColors, len(myColors))
 
im = ax.imshow(heatmap,cmap=cmap,interpolation='nearest')
 
# Loop over data dimensions and create text annotations.
used_aux=0
for i in range(len(processes)):
for j in range(len(processes)):
if i!=j:
aux_color="white"
if heatmap[i, j] == 1: # El 1 puede necesitar texto en negro
aux_color="black"
results_index = i*len(processes) +j-used_aux
if len(results_str[results_index]) == 1:
text = results_str[results_index][0]
ax.text(j, i, text, ha="center", va="center", color=aux_color, fontsize=36)
else:
add_aux = 0.33
for line in range(len(results_str[results_index])):
i_range = i - 0.5 + add_aux
ax.text(j, i_range, results_str[results_index][line],
ha="center", va="center", color=aux_color, fontsize=36)
add_aux+=0.33
else:
used_aux+=1
 
ax.set_ylabel("NP", fontsize=36)
ax.set_xlabel("NC", fontsize=36)
 
ax.set_xticklabels(['']+processes, fontsize=36)
ax.set_yticklabels(['']+processes, fontsize=36)
 
#
labelsMethods_aux = ['Baseline (0)', 'Baseline single (1)','Baseline - Asynchronous (2)','Baseline single - Asynchronous (3)',
'Merge (4)','Merge single (5)','Merge - Asynchronous (6)','Merge single - Asynchronous (7)']
colorbar=f.colorbar(im, ax=ax)
colorbar.set_ticks([0.35, 1.25, 2.15, 3.05, 3.95, 4.85, 5.75, 6.65]) #TE
#colorbar.set_ticks([-2.55, 0.35, 1.25, 2.15, 3.05, 3.95, 4.85, 5.75, 6.65]) #TC
colorbar.set_ticklabels(labelsMethods_aux)
colorbar.ax.tick_params(labelsize=32)
#
 
f.tight_layout()
f.savefig("Images/Spawn/Heatmap_"+tipo+".png", format="png")
```
 
%%%% Output: stream
 
/tmp/ipykernel_8791/2593541567.py:36: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_xticklabels(['']+processes, fontsize=36)
/tmp/ipykernel_8791/2593541567.py:37: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_yticklabels(['']+processes, fontsize=36)
 
%%%% Output: display_data
 
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
tipo="bcast"
if tipo == "bcast":
#bcast
x = [0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001, 0.000001, 0.000001, 0.000000, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000000, 0.000001, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001, 0.000001, 0.000001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000001, 0.000001, 0.000000, 0.000000, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000000, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000003, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000018, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000008, 0.000003, 0.000003, 0.000008, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000020, 0.000009, 0.000011, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000004, 0.000005, 0.000004, 0.000005, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000005, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000004, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000011, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000011, 0.000004, 0.000004, 0.000004, 0.000005, 0.000092, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000018, 0.000018, 0.000019, 0.000024, 0.000019, 0.000018, 0.000018, 0.000018, 0.000018, 0.000018, 0.000018, 0.000018, 0.000018, 0.000019, 0.000018, 0.000018, 0.000018, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000019, 0.000019, 0.000019, 0.000019, 0.000018, 0.000019, 0.000018, 0.000018, 0.000019, 0.000019, 0.000018, 0.000019, 0.000130, 0.000028, 0.000027, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000026, 0.000026, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000026, 0.000027, 0.000027, 0.000026, 0.000027, 0.000026, 0.000028, 0.000026, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000026, 0.000026, 0.000026, 0.000027, 0.000026, 0.000027, 0.000027, 0.000026, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000028, 0.000027, 0.000026, 0.000030, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000026, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000026, 0.000026, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000027, 0.000283, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000107, 0.000107, 0.000108, 0.000107, 0.000106, 0.000107, 0.000106, 0.000106, 0.000108, 0.000107, 0.000106, 0.000106, 0.000106, 0.000107, 0.000107, 0.000107, 0.000107, 0.000107, 0.000110, 0.000107, 0.000107, 0.000107, 0.000108, 0.000106, 0.000107, 0.000106, 0.000106, 0.000107, 0.000107, 0.000106, 0.000107, 0.000107, 0.000106, 0.000107, 0.000107, 0.000106, 0.000106, 0.000106, 0.000107, 0.000106, 0.000106, 0.000107, 0.000106, 0.000106, 0.000106, 0.000107, 0.000107, 0.000107, 0.000107, 0.000107, 0.000106, 0.000106, 0.000107, 0.000107, 0.000107, 0.000110, 0.000107, 0.000107, 0.000107, 0.000106, 0.000106, 0.000107, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000106, 0.000107, 0.000106, 0.000107, 0.000106, 0.000106, 0.000107, 0.000106, 0.000107, 0.000106, 0.000107, 0.000107, 0.000106, 0.000106, 0.000107, 0.000107, 0.000106, 0.000107, 0.000106, 0.000524, 0.000207, 0.000204, 0.000207, 0.000206, 0.000206, 0.000205, 0.000206, 0.000205, 0.000206, 0.000205, 0.000205, 0.000206, 0.000206, 0.000206, 0.000206, 0.000205, 0.000205, 0.000210, 0.000205, 0.000205, 0.000205, 0.000206, 0.000206, 0.000206, 0.000206, 0.000206, 0.000205, 0.000206, 0.000206, 0.000205, 0.000205, 0.000205, 0.000205, 0.000208, 0.000205, 0.000207, 0.000211, 0.000206, 0.000205, 0.000206, 0.000206, 0.000206, 0.000206, 0.000205, 0.000206, 0.000207, 0.000205, 0.000206, 0.000207, 0.000207, 0.000205, 0.000206, 0.000206, 0.000206, 0.000206, 0.000206, 0.000209, 0.000205, 0.000205, 0.000206, 0.000205, 0.000205, 0.000206, 0.000205, 0.000205, 0.000206, 0.000206, 0.000206, 0.000205, 0.000206, 0.000205, 0.000206, 0.000206, 0.000206, 0.000206, 0.000210, 0.000204, 0.000206, 0.000206, 0.000206, 0.000205, 0.000205, 0.000205, 0.000206, 0.000205, 0.000206, 0.000205, 0.000206, 0.000206, 0.000205, 0.000207, 0.000205, 0.000207, 0.000206, 0.000209, 0.000205, 0.000205, 0.000206, 0.000205, 0.005969, 0.002010, 0.002004, 0.002009, 0.002005, 0.002008, 0.002003, 0.002006, 0.002007, 0.002007, 0.002003, 0.002008, 0.002003, 0.002009, 0.002004, 0.002009, 0.002003, 0.002008, 0.002005, 0.002007, 0.002003, 0.002008, 0.002005, 0.002008, 0.002005, 0.002005, 0.002003, 0.002007, 0.002002, 0.002007, 0.002003, 0.002007, 0.002004, 0.002006, 0.002002, 0.002007, 0.002003, 0.002006, 0.002004, 0.002005, 0.002002, 0.002004, 0.002002, 0.002005, 0.002002, 0.002005, 0.002002, 0.002007, 0.002003, 0.002007, 0.002002, 0.002009, 0.002002, 0.002005, 0.002004, 0.002008, 0.002003, 0.002007, 0.002003, 0.002003, 0.002003, 0.002010, 0.002003, 0.002005, 0.002000, 0.002007, 0.002002, 0.002009, 0.002001, 0.002006, 0.002002, 0.002006, 0.002001, 0.001998, 0.002001, 0.002010, 0.002002, 0.002003, 0.002000, 0.002007, 0.002004, 0.002008, 0.002001, 0.002004, 0.002005, 0.002006, 0.002001, 0.002007, 0.002002, 0.002009, 0.002001, 0.002005, 0.002003, 0.002008, 0.001999, 0.002004, 0.002002, 0.002005, 0.002003, 0.002006, \
0.059939, 0.024504, 0.022647, 0.022617, 0.021730, 0.024531, 0.024927, 0.024392, 0.024493, 0.024490, 0.024438, 0.021964, 0.021842, 0.024483, 0.021804, 0.024507, 0.024354, 0.024353, 0.024456, 0.022079, 0.024322, 0.024579, 0.022457, 0.024401, 0.024604, 0.024532, 0.023252, 0.023547, 0.023316, 0.021491, 0.024583, 0.024424, 0.024541, 0.022293, 0.024417, 0.023698, 0.024408, 0.021841, 0.023707, 0.023017, 0.024536, 0.024420, 0.021870, 0.021531, 0.022964, 0.023716, 0.024605, 0.024343, 0.024588, 0.022115, 0.021860, 0.023939, 0.021542, 0.024609, 0.024339, 0.022058, 0.024504, 0.024357, 0.024535, 0.021893, 0.024482, 0.022914, 0.022199, 0.024370, 0.024429, 0.024554, 0.023071, 0.023255, 0.023273, 0.024601, 0.022383, 0.024586, 0.022459, 0.024462, 0.022297, 0.024515, 0.021501, 0.023307, 0.023315, 0.021560, 0.024507, 0.023080, 0.022861, 0.022383, 0.024513, 0.022016, 0.022958, 0.022520, 0.021587, 0.024413, 0.022460, 0.023133, 0.021825, 0.023516, 0.022206, 0.023532, 0.024548, 0.022841, 0.024491, 0.023761]
slope = 4082094463.008053
intercept = 417444.446452
elif tipo == "allgather":
x = [0.000005, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000009, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000004, 0.000003, 0.000002, 0.000004, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000004, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000004, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000003, 0.000003, 0.000004, 0.000002, 0.000003, 0.000003, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000004, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000004, 0.000003, 0.000004, 0.000004, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000004, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000040, 0.000014, 0.000013, 0.000014, 0.000013, 0.000013, 0.000014, 0.000018, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000013, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000014, 0.000153, 0.000026, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000030, 0.000025, 0.000025, 0.000025, 0.000025, 0.000026, 0.000025, 0.000025, 0.000025, 0.000025, 0.000025, 0.000782, 0.000138, 0.000137, 0.000135, 0.000135, 0.000135, 0.000139, 0.000133, 0.000136, 0.000137, 0.000136, 0.000132, 0.000134, 0.000136, 0.000134, 0.000134, 0.000134, 0.000136, 0.000137, 0.000133, 0.000135, 0.000135, 0.000145, 0.000137, 0.000132, 0.000133, 0.000134, 0.000135, 0.000136, 0.000133, 0.000134, 0.000134, 0.000135, 0.000138, 0.000138, 0.000135, 0.000135, 0.000134, 0.000134, 0.000134, 0.000137, 0.000130, 0.000149, 0.000127, 0.000129, 0.000146, 0.000131, 0.000146, 0.000146, 0.000131, 0.000128, 0.000156, 0.000147, 0.000131, 0.000147, 0.000129, 0.000128, 0.000128, 0.000129, 0.000129, 0.000148, 0.000128, 0.000131, 0.000147, 0.000146, 0.000130, 0.000131, 0.000130, 0.000130, 0.000149, 0.000127, 0.000127, 0.000147, 0.000129, 0.000128, 0.000131, 0.000128, 0.000130, 0.000131, 0.000132, 0.000137, 0.000149, 0.000147, 0.000130, 0.000128, 0.000131, 0.000130, 0.000129, 0.000130, 0.000131, 0.000131, 0.000131, 0.000132, 0.000131, 0.000133, 0.000131, 0.000147, 0.000127, 0.000130, 0.000130, 0.000587, 0.000360, 0.000360, 0.000346, 0.000325, 0.000384, 0.000363, 0.000362, 0.000356, 0.000357, 0.000374, 0.000360, 0.000249, 0.000228, 0.000300, 0.000298, 0.000231, 0.000232, 0.000231, 0.000246, 0.000317, 0.000229, 0.000228, 0.000230, 0.000271, 0.000227, 0.000291, 0.000230, 0.000230, 0.000275, 0.000289, 0.000229, 0.000234, 0.000229, 0.000272, 0.000234, 0.000265, 0.000289, 0.000224, 0.000230, 0.000230, 0.000282, 0.000230, 0.000270, 0.000229, 0.000270, 0.000265, 0.000272, 0.000226, 0.000277, 0.000233, 0.000272, 0.000269, 0.000250, 0.000267, 0.000231, 0.000230, 0.000273, 0.000228, 0.000251, 0.000230, 0.000270, 0.000237, 0.000229, 0.000231, 0.000228, 0.000229, 0.000232, 0.000226, 0.000228, 0.000229, 0.000227, 0.000232, 0.000231, 0.000235, 0.000232, 0.000231, 0.000229, 0.000229, 0.000235, 0.000229, 0.000229, 0.000228, 0.000230, 0.000227, 0.000231, 0.000232, 0.000230, 0.000232, 0.000230, 0.000228, 0.000227, 0.000230, 0.000230, 0.000228, 0.000229, 0.000230, 0.000239, 0.000226, 0.000232, 0.008453, 0.002773, 0.002651, 0.002620, 0.002595, 0.002599, 0.002608, 0.002590, 0.002587, 0.002611, 0.002604, 0.002601, 0.002602, 0.002620, 0.002609, 0.002605, 0.002601, 0.002596, 0.002605, 0.002584, 0.002611, 0.002620, 0.002576, 0.002608, 0.002603, 0.002595, 0.002594, 0.002603, 0.002583, 0.002613, 0.002596, 0.002595, 0.002603, 0.002591, 0.002610, 0.002594, 0.002589, 0.002610, 0.002610, 0.002601, 0.002610, 0.002603, 0.002598, 0.002608, 0.002585, 0.002601, 0.002619, 0.002608, 0.002604, 0.002599, 0.002587, 0.002600, 0.002607, 0.002604, 0.002603, 0.002596, 0.002588, 0.002595, 0.002612, 0.002595, 0.002600, 0.002629, 0.002603, 0.002607, 0.002600, 0.002606, 0.002601, 0.002594, 0.002586, 0.002604, 0.002613, 0.002591, 0.002603, 0.002574, 0.002598, 0.002601, 0.002602, 0.002602, 0.002603, 0.002605, 0.002606, 0.002607, 0.002597, 0.002594, 0.002636, 0.002610, 0.002588, 0.002592, 0.002596, 0.002610, 0.002588, 0.002610, 0.002603, 0.002589, 0.002605, 0.002591, 0.002592, 0.002603, 0.002600, 0.002587, 0.095241, 0.035323, 0.035436, 0.035495, 0.035372, 0.035416, 0.035370, 0.035460, 0.035349, 0.035391, 0.035311, 0.035361, 0.035788, 0.035438, 0.035445, 0.035413, 0.035373, 0.035374, 0.035439, 0.035290, 0.035410, 0.035385, 0.035388, 0.035343, 0.035442, 0.035397, 0.035465, 0.036605, 0.035349, 0.035452, 0.035376, 0.035346, 0.035300, 0.035460, 0.035489, 0.035378, 0.035386, 0.035411, 0.035286, 0.035385, 0.035861, 0.035421, 0.035394, 0.035460, 0.035376, 0.035440, 0.035376, 0.035399, 0.035340, 0.035370, 0.035394, 0.035392, 0.035422, 0.035355, 0.035430, 0.035359, 0.036654, 0.035536, 0.035551, 0.035610, 0.035458, 0.035432, 0.035474, 0.035417, 0.035408, 0.035440, 0.035370, 0.035402, 0.035862, 0.035428, 0.035367, 0.035472, 0.035410, 0.035424, 0.035393, 0.035441, 0.035400, 0.035416, 0.035470, 0.035439, 0.035349, 0.035427, 0.035453, 0.035450, 0.036583, 0.035463, 0.035498, 0.035426, 0.035356, 0.035369, 0.035412, 0.035461, 0.035339, 0.035395, 0.035427, 0.035445, 0.035902, 0.035391, 0.035375, 0.035333]
slope = 2687592726.595444
intercept = 580231.389302
elif tipo == "reduce":
x = [0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000001, 0.000002, 0.000001, 0.000001, 0.000001, 0.000002, 0.000001, 0.000002, 0.000002, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000001, 0.000001, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000008, 0.000008, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000006, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000007, 0.000006, 0.000006, 0.000006, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000006, 0.000006, 0.000006, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000006, 0.000006, 0.000006, 0.000006, 0.000006, 0.000007, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000006, 0.000006, 0.000031, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000015, 0.000010, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000052, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000040, 0.000039, 0.000040, 0.000039, 0.000040, 0.000040, 0.000039, 0.000040, 0.000040, 0.000039, 0.000039, 0.000040, 0.000039, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000039, 0.000039, 0.000040, 0.000039, 0.000039, 0.000039, 0.000039, 0.000040, 0.000040, 0.000039, 0.000039, 0.000040, 0.000040, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000040, 0.000040, 0.000040, 0.000040, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000040, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000040, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000039, 0.000038, 0.000039, 0.000040, 0.000039, 0.000041, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000137, 0.000076, 0.000077, 0.000077, 0.000075, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000077, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000076, 0.000076, 0.000077, 0.000076, 0.000077, 0.000077, 0.000076, 0.000076, 0.000076, 0.000081, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000076, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000076, 0.000077, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000077, 0.000076, 0.000076, 0.000076, 0.000076, 0.000075, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000075, 0.000076, 0.000076, 0.000080, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000696, 0.000410, 0.000402, 0.000388, 0.000401, 0.000386, 0.000387, 0.000385, 0.000391, 0.000397, 0.000384, 0.000393, 0.000383, 0.000386, 0.000390, 0.000382, 0.000396, 0.000379, 0.000388, 0.000379, 0.000393, 0.000382, 0.000381, 0.000376, 0.000392, 0.000395, 0.000382, 0.000396, 0.000412, 0.000386, 0.000384, 0.000383, 0.000380, 0.000392, 0.000394, 0.000393, 0.000382, 0.000395, 0.000393, 0.000382, 0.000380, 0.000383, 0.000381, 0.000390, 0.000396, 0.000382, 0.000382, 0.000395, 0.000393, 0.000408, 0.000385, 0.000383, 0.000380, 0.000389, 0.000380, 0.000393, 0.000384, 0.000380, 0.000391, 0.000398, 0.000399, 0.000397, 0.000383, 0.000379, 0.000379, 0.000394, 0.000384, 0.000394, 0.000380, 0.000391, 0.000381, 0.000392, 0.000392, 0.000381, 0.000392, 0.000392, 0.000381, 0.000392, 0.000383, 0.000399, 0.000383, 0.000378, 0.000392, 0.000382, 0.000394, 0.000384, 0.000392, 0.000380, 0.000395, 0.000394, 0.000389, 0.000390, 0.000396, 0.000382, 0.000389, 0.000384, 0.000391, 0.000381, 0.000391, 0.000381, 0.001741, 0.000802, 0.000788, 0.000788, 0.000793, 0.000785, 0.000793, 0.000786, 0.000787, 0.000793, 0.000799, 0.000794, 0.000794, 0.000794, 0.000791, 0.000791, 0.000788, 0.000800, 0.000786, 0.000799, 0.000797, 0.000788, 0.000788, 0.000784, 0.000797, 0.000789, 0.000795, 0.000784, 0.000793, 0.000793, 0.000790, 0.000787, 0.000791, 0.000784, 0.000800, 0.000785, 0.000793, 0.000781, 0.000792, 0.000801, 0.000798, 0.000784, 0.000785, 0.000794, 0.000792, 0.000787, 0.000790, 0.000785, 0.000790, 0.000797, 0.000784, 0.000788, 0.000784, 0.000789, 0.000799, 0.000790, 0.000787, 0.000787, 0.000782, 0.000793, 0.000787, 0.000795, 0.000794, 0.000789, 0.000788, 0.000787, 0.000785, 0.000796, 0.000789, 0.000793, 0.000797, 0.000789, 0.000786, 0.000792, 0.000791, 0.000793, 0.000785, 0.000787, 0.000799, 0.000797, 0.000797, 0.000790, 0.000787, 0.000786, 0.000791, 0.000783, 0.000796, 0.000788, 0.000789, 0.000796, 0.000794, 0.000789, 0.000790, 0.000794, 0.000797, 0.000797, 0.000790, 0.000795, 0.000787, 0.000802, 0.018145, 0.015328, 0.015118, 0.015063, 0.015098, 0.014784, 0.014776, 0.014997, 0.015058, 0.015074, 0.014742, 0.014988, 0.015080, 0.014913, 0.015067, 0.015086, 0.015057, 0.015063, 0.015127, 0.015055, 0.015269, 0.015070, 0.015052, 0.015068, 0.015094, 0.015046, 0.015077, 0.015047, 0.014995, 0.015023, 0.014766, 0.014991, 0.014748, 0.014705, 0.014712, 0.015055, 0.015042, 0.014935, 0.015047, 0.014909, 0.014964, 0.015038, 0.015081, 0.015029, 0.015014, 0.015061, 0.015025, 0.015004, 0.015084, 0.015372, 0.015042, 0.014760, 0.015019, 0.014912, 0.015069, 0.015075, 0.014784, 0.015031, 0.015057, 0.015081, 0.015076, 0.015090, 0.015131, 0.015033, 0.015100, 0.015033, 0.015083, 0.014949, 0.015067, 0.015039, 0.014914, 0.015097, 0.014904, 0.015104, 0.014794, 0.015049, 0.015035, 0.015092, 0.015045, 0.014772, 0.015035, 0.015043, 0.015054, 0.015038, 0.015079, 0.015073, 0.015019, 0.015157, 0.015047, 0.014749, 0.014993, 0.015041, 0.015041, 0.015040, 0.015067, 0.015038, 0.015028, 0.015061, 0.015046, 0.015078, 0.212262, 0.185519, 0.186501, 0.185577, 0.184211, 0.186465, 0.186450, 0.184698, 0.186418, 0.187905, 0.184845, 0.186531, 0.186257, 0.185822, 0.186243, 0.186422, 0.186409, 0.185711, 0.183737, 0.185731, 0.186490, 0.186310, 0.185192, 0.184908, 0.186227, 0.185352, 0.186196, 0.186155, 0.186595, 0.186488, 0.185232, 0.186730, 0.185376, 0.185484, 0.183967, 0.186260, 0.187787, 0.186347, 0.186786, 0.186759, 0.186337, 0.186301, 0.183724, 0.183987, 0.184885, 0.183833, 0.186412, 0.188206, 0.185502, 0.184851, 0.186307, 0.185276, 0.184040, 0.184446, 0.186701, 0.186171, 0.185102, 0.186611, 0.187794, 0.185968, 0.186484, 0.183984, 0.186410, 0.187853, 0.186458, 0.186824, 0.184836, 0.186633, 0.187585, 0.185583, 0.183682, 0.186466, 0.183998, 0.185895, 0.185598, 0.186250, 0.186450, 0.184682, 0.186286, 0.185970, 0.186335, 0.184139, 0.183826, 0.186421, 0.186308, 0.188077, 0.185633, 0.184551, 0.186465, 0.186632, 0.186535, 0.186291, 0.186495, 0.186824, 0.186735, 0.185877, 0.187918, 0.186703, 0.186134, 0.186532]
slope = 536190943.875754
intercept = 277159.974610
elif tipo == "allreduce":
x = [0.000007, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000004, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000002, 0.000003, 0.000002, 0.000003, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000002, 0.000003, 0.000002, 0.000003, 0.000003, 0.000002, 0.000002, 0.000002, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000005, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000002, 0.000004, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000003, 0.000002, 0.000003, 0.000003, 0.000004, 0.000005, 0.000005, 0.000005, 0.000005, 0.000005, 0.000004, 0.000005, 0.000003, 0.000005, 0.000004, 0.000005, 0.000004, 0.000006, 0.000006, 0.000006, 0.000005, 0.000005, 0.000005, 0.000005, 0.000004, 0.000004, 0.000004, 0.000005, 0.000003, 0.000004, 0.000003, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000005, 0.000004, 0.000004, 0.000003, 0.000005, 0.000004, 0.000005, 0.000004, 0.000004, 0.000003, 0.000005, 0.000005, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000005, 0.000006, 0.000006, 0.000005, 0.000004, 0.000005, 0.000004, 0.000004, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000005, 0.000004, 0.000004, 0.000003, 0.000005, 0.000004, 0.000005, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000005, 0.000004, 0.000004, 0.000005, 0.000004, 0.000004, 0.000004, 0.000005, 0.000004, 0.000004, 0.000005, 0.000006, 0.000007, 0.000005, 0.000005, 0.000005, 0.000005, 0.000005, 0.000004, 0.000004, 0.000005, 0.000005, 0.000004, 0.000008, 0.000007, 0.000008, 0.000007, 0.000007, 0.000007, 0.000007, 0.000008, 0.000007, 0.000008, 0.000007, 0.000008, 0.000007, 0.000006, 0.000008, 0.000007, 0.000008, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000006, 0.000007, 0.000006, 0.000006, 0.000006, 0.000006, 0.000007, 0.000007, 0.000006, 0.000008, 0.000006, 0.000007, 0.000007, 0.000007, 0.000014, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000006, 0.000006, 0.000006, 0.000008, 0.000006, 0.000007, 0.000007, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000008, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000007, 0.000006, 0.000006, 0.000006, 0.000008, 0.000006, 0.000006, 0.000007, 0.000007, 0.000007, 0.000007, 0.000011, 0.000011, 0.000010, 0.000011, 0.000011, 0.000011, 0.000010, 0.000010, 0.000011, 0.000011, 0.000011, 0.000011, 0.000010, 0.000011, 0.000010, 0.000011, 0.000011, 0.000010, 0.000011, 0.000010, 0.000010, 0.000011, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000011, 0.000011, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000010, 0.000011, 0.000011, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000011, 0.000011, 0.000011, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000012, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000010, 0.000011, 0.000012, 0.000011, 0.000010, 0.000012, 0.000010, 0.000010, 0.000010, 0.000011, 0.000011, 0.000010, 0.000012, 0.000055, 0.000041, 0.000041, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000041, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000041, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000041, 0.000040, 0.000040, 0.000039, 0.000044, 0.000040, 0.000040, 0.000040, 0.000040, 0.000039, 0.000040, 0.000040, 0.000040, 0.000039, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000039, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000041, 0.000040, 0.000040, 0.000040, 0.000039, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000040, 0.000039, 0.000040, 0.000040, 0.000039, 0.000117, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000077, 0.000076, 0.000076, 0.000077, 0.000077, 0.000076, 0.000077, 0.000076, 0.000077, 0.000077, 0.000077, 0.000076, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000079, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000075, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000076, 0.000076, 0.000075, 0.000075, 0.000075, 0.000075, 0.000079, 0.000075, 0.000075, 0.000075, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000076, 0.000075, 0.000075, 0.000076, 0.000077, 0.000076, 0.000076, 0.000076, 0.000075, 0.000076, 0.000076, 0.000076, 0.000076, 0.000076, 0.000950, 0.000437, 0.000394, 0.000413, 0.000402, 0.000388, 0.000417, 0.000434, 0.000407, 0.000433, 0.000413, 0.000432, 0.000410, 0.000400, 0.000418, 0.000431, 0.000408, 0.000410, 0.000432, 0.000430, 0.000411, 0.000417, 0.000428, 0.000406, 0.000414, 0.000412, 0.000395, 0.000396, 0.000390, 0.000429, 0.000391, 0.000388, 0.000438, 0.000432, 0.000409, 0.000425, 0.000386, 0.000390, 0.000389, 0.000391, 0.000415, 0.000410, 0.000430, 0.000410, 0.000412, 0.000388, 0.000433, 0.000390, 0.000389, 0.000385, 0.000412, 0.000407, 0.000395, 0.000438, 0.000414, 0.000409, 0.000431, 0.000385, 0.000413, 0.000429, 0.000430, 0.000409, 0.000424, 0.000434, 0.000406, 0.000390, 0.000394, 0.000433, 0.000429, 0.000389, 0.000415, 0.000437, 0.000417, 0.000408, 0.000416, 0.000392, 0.000391, 0.000390, 0.000411, 0.000413, 0.000429, 0.000412, 0.000429, 0.000416, 0.000431, 0.000408, 0.000430, 0.000426, 0.000410, 0.000431, 0.000438, 0.000410, 0.000423, 0.000410, 0.000414, 0.000413, 0.000408, 0.000388, 0.000391, 0.000389, 0.001616, 0.000859, 0.000829, 0.000874, 0.000840, 0.000832, 0.000856, 0.000860, 0.000865, 0.000841, 0.000861, 0.000871, 0.000852, 0.000868, 0.000833, 0.000872, 0.000832, 0.000871, 0.000838, 0.000831, 0.000852, 0.000861, 0.000846, 0.000835, 0.000830, 0.000857, 0.000839, 0.000866, 0.000856, 0.000863, 0.000874, 0.000854, 0.000890, 0.000854, 0.000836, 0.000827, 0.000846, 0.000830, 0.000853, 0.000858, 0.000852, 0.000866, 0.000857, 0.000866, 0.000830, 0.000832, 0.000879, 0.000850, 0.000863, 0.000874, 0.000842, 0.000860, 0.000863, 0.000877, 0.000836, 0.000839, 0.000836, 0.000858, 0.000860, 0.000828, 0.000879, 0.000830, 0.000856, 0.000861, 0.000852, 0.000874, 0.000834, 0.000856, 0.000860, 0.000877, 0.000854, 0.000865, 0.000830, 0.000867, 0.000881, 0.000829, 0.000849, 0.000865, 0.000864, 0.000863, 0.000874, 0.000834, 0.000873, 0.000839, 0.000833, 0.000871, 0.000856, 0.000863, 0.000876, 0.000828, 0.000855, 0.000868, 0.000872, 0.000885, 0.000839, 0.000860, 0.000851, 0.000867, 0.000840, 0.000854, 0.020114, 0.010118, 0.010131, 0.010137, 0.010162, 0.010159, 0.010018, 0.010076, 0.009923, 0.010031, 0.010130, 0.010074, 0.010124, 0.010190, 0.010074, 0.010173, 0.010067, 0.010135, 0.010270, 0.010170, 0.010085, 0.010120, 0.010162, 0.010006, 0.010092, 0.010121, 0.010045, 0.010120, 0.009966, 0.010169, 0.010031, 0.010044, 0.010059, 0.010120, 0.010132, 0.010078, 0.010055, 0.009942, 0.010009, 0.010152, 0.010126, 0.010046, 0.010080, 0.010130, 0.009936, 0.010412, 0.009871, 0.010109, 0.010099, 0.010099, 0.010007, 0.010095, 0.010114, 0.010107, 0.010143, 0.010149, 0.010146, 0.010030, 0.010105, 0.010117, 0.009967, 0.010056, 0.010149, 0.010118, 0.010156, 0.010055, 0.009937, 0.009966, 0.009931, 0.010186, 0.010130, 0.010088, 0.010184, 0.010098, 0.010175, 0.010120, 0.010091, 0.010139, 0.010005, 0.010093, 0.010123, 0.010055, 0.010098, 0.010133, 0.010072, 0.010134, 0.010018, 0.009968, 0.010030, 0.010155, 0.010152, 0.010180, 0.010159, 0.010002, 0.009920, 0.010056, 0.010075, 0.010052, 0.009879, 0.010003, 0.223613, 0.148744, 0.152401, 0.151833, 0.152222, 0.148994, 0.153251, 0.150396, 0.152508, 0.150248, 0.151124, 0.149438, 0.150057, 0.151779, 0.150073, 0.152658, 0.148883, 0.152434, 0.152254, 0.149600, 0.153596, 0.149332, 0.150336, 0.151257, 0.149584, 0.149302, 0.149555, 0.150916, 0.151489, 0.149315, 0.149144, 0.149346, 0.152488, 0.152130, 0.151796, 0.152395, 0.151557, 0.151864, 0.149048, 0.149158, 0.153600, 0.149456, 0.152524, 0.151187, 0.152076, 0.152173, 0.151782, 0.151161, 0.152365, 0.150226, 0.149354, 0.149796, 0.149165, 0.150970, 0.150145, 0.150309, 0.151621, 0.151543, 0.149100, 0.153671, 0.153856, 0.150674, 0.152317, 0.149891, 0.149949, 0.152256, 0.150707, 0.152146, 0.152653, 0.150065, 0.149882, 0.149509, 0.152183, 0.149265, 0.150935, 0.152536, 0.152076, 0.149294, 0.149268, 0.152232, 0.153218, 0.151175, 0.152072, 0.149226, 0.149075, 0.150858, 0.149481, 0.153983, 0.150955, 0.152286, 0.152336, 0.149034, 0.152280, 0.150416, 0.152882, 0.151258, 0.149603, 0.151599, 0.149312, 0.150316]
slope = 656145059.536116
intercept = 409351.405089
y = [10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 10.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 100.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 1000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 5000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 10000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 50000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 100000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, \
500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 500000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 1000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 10000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000, 100000000.000000]
```
 
%% Cell type:code id: tags:
 
``` python
#f, (ax1, ax2) = plt.subplots(nrows=2, sharex=True, gridspec_kw={'height_ratios': (1,3)}, figsize=(10,4))
f=plt.figure(figsize=(16, 8))
ax=f.add_subplot(111)
thresh = 100000000 - 1
x_low = []
x_high = []
y_low = []
y_high = []
y2_low = []
y2_high = []
#Bucle de bajas prestaciones...
for i in range(len(x)):
if y[i] < thresh:
x_low.append(x[i])
y_low.append(y[i])
y2_low.append(intercept + slope*x[i])
else:
x_high.append(x[i])
y_high.append(y[i])
y2_high.append(intercept + slope*x[i])
ax1.scatter(x_low,y_low, color='red')
ax1.plot(x_low,y2_low)
ax2.scatter(x_high,y_low, color='red')
ax2.plot(x_high,y2_low)
ax1.set_ylabel("Tamaño", fontsize=36)
ax1.set_xlabel("Tiempo", fontsize=36)
#ax.set_ylim(0,110000000)
x2 = np.array(x) * 1000
y_array = [y]
aux_labels = ["Expected"]
```
 
%%%% Output: execute_result
Text(0.5, 0, 'Tiempo')
%%%% Output: display_data
[Hidden Image Output]
%% Cell type:code id: tags:
 
``` python
dfLinear_Reg = pd.DataFrame(y)
```
 
%% Cell type:code id: tags:
 
``` python
dfLinear_Reg[tipo] = x
```
 
%% Cell type:code id: tags:
 
``` python
gruped_Linear = dfLinear_Reg.groupby([0])['bcast', 'allgather', 'reduce', 'allreduce'].agg(['mean','min','max'])
gruped_Linear.to_excel("Linear_reg.xlsx")
```
 
%%%% Output: stream
 
/tmp/ipykernel_6968/2732890191.py:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
gruped_Linear = dfLinear_Reg.groupby([0])['bcast', 'allgather', 'reduce', 'allreduce'].agg(['mean','min','max'])
 
%% Cell type:code id: tags:
 
``` python
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
x = np.array(x).reshape((-1, 1))
y = np.array(y)
```
%% Cell type:code id: tags:
 
``` python
reg = LinearRegression().fit(x, y)
print(reg.score(x, y))
print(reg.intercept_)
print(reg.coef_)
 
print(reg.predict(x))
reg_array = reg.predict(x)
print(reg_array)
y_array.append(reg_array)
aux_labels.append("LinearReg")
```
%%%% Output: stream
0.9720444025507028
417555.74204228446
[4.08208613e+09]
[4.25719914e+05 4.21637828e+05 4.21637828e+05 ... 9.36564851e+07
1.00391927e+08 9.74120044e+07]
%% Cell type:code id: tags:
``` python
degrees = 4
poly = PolynomialFeatures(degree=degrees, include_bias=False)
poly_features = poly.fit_transform(x)
poly_reg = LinearRegression()
poly_reg.fit(poly_features, y)
print(poly_reg.score(poly_features, y))
print(poly_reg.intercept_)
print(poly_reg.coef_)
poly_array = poly_reg.predict(poly_features)
print(poly_array)
y_array.append(poly_array)
aux_labels.append("PolyReg-"+str(degrees))
```
 
%%%% Output: stream
 
0.9962787972985218
409360.65712023154
[6.56144796e+08]
[ 413953.67068972 411329.09150716 410672.94671151 ...
99880255.53157426 98379652.38394217 99038421.75876622]
0.9994154481836294
27900.7721101176
[ 4.29146862e+09 2.70526901e+11 -1.56299343e+13 1.73278870e+14]
[3.64847913e+04 3.21925112e+04 3.21925112e+04 ... 1.00097111e+08
1.00132901e+08 1.00289449e+08]
%% Cell type:code id: tags:
``` python
f=plt.figure(figsize=(16, 8))
ax=f.add_subplot(111)
for i in range(len(y_array)):
ax.scatter(x2,y_array[i], color=colors_spawn[i])
#ax.plot(x2,y, color=colors_spawn[0])
ax.set_ylabel("Tamaño (Bytes)", fontsize=36)
ax.set_xlabel("Tiempo (ms)", fontsize=36)
ax.axhline(7549560)
plt.legend(labels=aux_labels, loc='best', fontsize=20,ncol=2,framealpha=1)
plt.xscale("log")
plt.yscale("log")
f.savefig("Images/Regresion.png", format="png")
```
%%%% Output: display_data
[Hidden Image Output]
 
%% Cell type:code id: tags:
 
``` python
```
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment