Commit 3fda1b19 authored by Iker Martín Álvarez's avatar Iker Martín Álvarez
Browse files

The analyser is a huge monster to be converted into a python code...

parent 7d8eb475
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
......@@ -26,7 +26,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
......@@ -89,16 +89,16 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 264,
"metadata": {},
"outputs": [],
"source": [
"dfG = pd.read_pickle( AllName )\n",
"\n",
"dfG['ADR'] = (dfG['ADR'] / dfG['DR']) * 100\n",
"dfG['SDR'] = (dfG['SDR'] / dfG['DR']) * 100\n",
"dfG['ADR'] = round((dfG['ADR'] / dfG['DR']) * 100,1)\n",
"dfG['SDR'] = round((dfG['SDR'] / dfG['DR']) * 100,1)\n",
" \n",
"group = dfG.groupby(['Groups','ADR','Spawn_Method','Redistribution_Method', 'Redistribution_Strategy'])['T_total']\n",
"group = dfG.groupby(['ADR','Spawn_Method','Redistribution_Method', 'Redistribution_Strategy','Groups'])['T_total']\n",
"\n",
"grouped_aggG = group.agg(['median'])\n",
"grouped_aggG.rename(columns={'median':'T_total'}, inplace=True)\n",
......@@ -107,549 +107,18 @@
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>T_total</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Groups</th>\n",
" <th>ADR</th>\n",
" <th>Spawn_Method</th>\n",
" <th>Redistribution_Method</th>\n",
" <th>Redistribution_Strategy</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">(2, 10)</th>\n",
" <th rowspan=\"2\" valign=\"top\">0.0</th>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 0)</th>\n",
" <th>(0, 0)</th>\n",
" <th>(1, 1)</th>\n",
" <td>389.577585</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>389.559350</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">96.6</th>\n",
" <th rowspan=\"3\" valign=\"top\">(0, 0)</th>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 0)</th>\n",
" <th>(1, 1)</th>\n",
" <td>390.670604</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(1, 2)</th>\n",
" <td>390.207550</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>390.094789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">(160, 120)</th>\n",
" <th>0.0</th>\n",
" <th>(0, 0)</th>\n",
" <th>(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>143.140648</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">96.6</th>\n",
" <th rowspan=\"4\" valign=\"top\">(0, 0)</th>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 0)</th>\n",
" <th>(1, 1)</th>\n",
" <td>147.587313</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(1, 2)</th>\n",
" <td>146.947540</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">(0, 1)</th>\n",
" <th>(1, 1)</th>\n",
" <td>142.850494</td>\n",
" </tr>\n",
" <tr>\n",
" <th>(1, 2)</th>\n",
" <td>143.274009</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>252 rows × 1 columns</p>\n",
"</div>"
],
"text/plain": [
" T_total\n",
"Groups ADR Spawn_Method Redistribution_Method Redistribution_Strategy \n",
"(2, 10) 0.0 (0, 0) (0, 0) (1, 1) 389.577585\n",
" (0, 1) (1, 1) 389.559350\n",
" 96.6 (0, 0) (0, 0) (1, 1) 390.670604\n",
" (1, 2) 390.207550\n",
" (0, 1) (1, 1) 390.094789\n",
"... ...\n",
"(160, 120) 0.0 (0, 0) (0, 1) (1, 1) 143.140648\n",
" 96.6 (0, 0) (0, 0) (1, 1) 147.587313\n",
" (1, 2) 146.947540\n",
" (0, 1) (1, 1) 142.850494\n",
" (1, 2) 143.274009\n",
"\n",
"[252 rows x 1 columns]"
]
},
"execution_count": 23,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"grouped_aggG"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Total_Groups</th>\n",
" <th>Total_Stages</th>\n",
" <th>Granularity</th>\n",
" <th>SDR</th>\n",
" <th>ADR</th>\n",
" <th>DR</th>\n",
" <th>Redistribution_Method</th>\n",
" <th>Redistribution_Strategy</th>\n",
" <th>Spawn_Method</th>\n",
" <th>Spawn_Strategy</th>\n",
" <th>...</th>\n",
" <th>Stage_Bytes</th>\n",
" <th>Iters</th>\n",
" <th>Asynch_Iters</th>\n",
" <th>T_iter</th>\n",
" <th>T_stages</th>\n",
" <th>T_spawn</th>\n",
" <th>T_spawn_real</th>\n",
" <th>T_SR</th>\n",
" <th>T_AR</th>\n",
" <th>T_total</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.317149, 0.217414, 0.134276, 0.148773, 0.15...</td>\n",
" <td>(((0.010701, 0.015691, 0.005213, 0.280889), (0...</td>\n",
" <td>(2.954793,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.604612,)</td>\n",
" <td>(0,)</td>\n",
" <td>132.377707</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.234715, 0.150659, 0.147628, 0.130321, 0.13...</td>\n",
" <td>(((0.010705, 0.020385, 0.016089, 0.171352), (0...</td>\n",
" <td>(2.997034,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.521934,)</td>\n",
" <td>(0,)</td>\n",
" <td>138.576342</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.224323, 0.165911, 0.147396, 0.139989, 0.12...</td>\n",
" <td>(((0.011214, 0.003196, 0.004736, 0.187174), (0...</td>\n",
" <td>(2.962994,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.558318,)</td>\n",
" <td>(0,)</td>\n",
" <td>154.978141</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.211829, 0.151569, 0.152718, 0.128219, 0.11...</td>\n",
" <td>(((0.0107, 0.020957, 0.00406, 0.174168), (0.01...</td>\n",
" <td>(3.049718,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.509169,)</td>\n",
" <td>(0,)</td>\n",
" <td>137.381302</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>3947883504</td>\n",
" <td>0.0</td>\n",
" <td>3947883504</td>\n",
" <td>(0, 1)</td>\n",
" <td>(1, 1)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 1)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(0, 0)</td>\n",
" <td>((0.211283, 0.148917, 0.133463, 0.135542, 0.13...</td>\n",
" <td>(((0.010703, 0.010967, 0.000106, 0.171724), (0...</td>\n",
" <td>(3.106215,)</td>\n",
" <td>(0,)</td>\n",
" <td>(0.637513,)</td>\n",
" <td>(0,)</td>\n",
" <td>142.663098</td>\n",
" </tr>\n",
" <tr>\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",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>835</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.161252, 0.143764, 0.143709, 0.143632, 0.14...</td>\n",
" <td>(((0.124864, 0.000256, 4.5e-05, 0.036086), (0....</td>\n",
" <td>(2.302374,)</td>\n",
" <td>(2.236232,)</td>\n",
" <td>(0.111917,)</td>\n",
" <td>(1.997651,)</td>\n",
" <td>146.363428</td>\n",
" </tr>\n",
" <tr>\n",
" <th>836</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.159672, 0.142413, 0.142332, 0.142328, 0.14...</td>\n",
" <td>(((0.124902, 0.000214, 2.8e-05, 0.034524), (0....</td>\n",
" <td>(5.546667,)</td>\n",
" <td>(2.110774,)</td>\n",
" <td>(0.551958,)</td>\n",
" <td>(1.983407,)</td>\n",
" <td>150.696184</td>\n",
" </tr>\n",
" <tr>\n",
" <th>837</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.161999, 0.144079, 0.144051, 0.144055, 0.14...</td>\n",
" <td>(((0.124852, 0.00023, 7.5e-05, 0.036838), (0.1...</td>\n",
" <td>(3.725691,)</td>\n",
" <td>(2.051036,)</td>\n",
" <td>(0.12372,)</td>\n",
" <td>(2.11543,)</td>\n",
" <td>144.347781</td>\n",
" </tr>\n",
" <tr>\n",
" <th>838</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.159451, 0.142453, 0.142414, 0.142388, 0.14...</td>\n",
" <td>(((0.124922, 0.000181, 4.6e-05, 0.0343), (0.12...</td>\n",
" <td>(3.066206,)</td>\n",
" <td>(1.990711,)</td>\n",
" <td>(0.119849,)</td>\n",
" <td>(2.015445,)</td>\n",
" <td>144.380533</td>\n",
" </tr>\n",
" <tr>\n",
" <th>839</th>\n",
" <td>2</td>\n",
" <td>4</td>\n",
" <td>100000</td>\n",
" <td>134228039</td>\n",
" <td>96.6</td>\n",
" <td>3947883503</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>(0, 0)</td>\n",
" <td>(1, 2)</td>\n",
" <td>...</td>\n",
" <td>(0, 8, 8, 33176880)</td>\n",
" <td>(500, 500)</td>\n",
" <td>(2, 0)</td>\n",
" <td>((0.161346, 0.143941, 0.14389, 0.143897, 0.143...</td>\n",
" <td>(((0.124865, 0.000212, 8.1e-05, 0.036188), (0....</td>\n",
" <td>(3.480278,)</td>\n",
" <td>(2.165749,)</td>\n",
" <td>(0.119847,)</td>\n",
" <td>(1.868907,)</td>\n",
" <td>142.924103</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1260 rows × 25 columns</p>\n",
"</div>"
],
"text/plain": [
" Total_Groups Total_Stages Granularity SDR ADR DR \\\n",
"0 2 4 100000 3947883504 0.0 3947883504 \n",
"1 2 4 100000 3947883504 0.0 3947883504 \n",
"2 2 4 100000 3947883504 0.0 3947883504 \n",
"3 2 4 100000 3947883504 0.0 3947883504 \n",
"4 2 4 100000 3947883504 0.0 3947883504 \n",
".. ... ... ... ... ... ... \n",
"835 2 4 100000 134228039 96.6 3947883503 \n",
"836 2 4 100000 134228039 96.6 3947883503 \n",
"837 2 4 100000 134228039 96.6 3947883503 \n",
"838 2 4 100000 134228039 96.6 3947883503 \n",
"839 2 4 100000 134228039 96.6 3947883503 \n",
"\n",
" Redistribution_Method Redistribution_Strategy Spawn_Method Spawn_Strategy \\\n",
"0 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"1 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"2 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"3 (0, 1) (1, 1) (0, 0) (1, 1) \n",
"4 (0, 1) (1, 1) (0, 0) (1, 1) \n",
".. ... ... ... ... \n",
"835 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"836 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"837 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"838 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"839 (0, 0) (1, 2) (0, 0) (1, 2) \n",
"\n",
" ... Stage_Bytes Iters Asynch_Iters \\\n",
"0 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"1 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"2 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"3 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
"4 ... (0, 8, 8, 33176880) (500, 500) (0, 0) \n",
".. ... ... ... ... \n",
"835 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"836 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"837 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"838 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"839 ... (0, 8, 8, 33176880) (500, 500) (2, 0) \n",
"\n",
" T_iter \\\n",
"0 ((0.317149, 0.217414, 0.134276, 0.148773, 0.15... \n",
"1 ((0.234715, 0.150659, 0.147628, 0.130321, 0.13... \n",
"2 ((0.224323, 0.165911, 0.147396, 0.139989, 0.12... \n",
"3 ((0.211829, 0.151569, 0.152718, 0.128219, 0.11... \n",
"4 ((0.211283, 0.148917, 0.133463, 0.135542, 0.13... \n",
".. ... \n",
"835 ((0.161252, 0.143764, 0.143709, 0.143632, 0.14... \n",
"836 ((0.159672, 0.142413, 0.142332, 0.142328, 0.14... \n",
"837 ((0.161999, 0.144079, 0.144051, 0.144055, 0.14... \n",
"838 ((0.159451, 0.142453, 0.142414, 0.142388, 0.14... \n",
"839 ((0.161346, 0.143941, 0.14389, 0.143897, 0.143... \n",
"\n",
" T_stages T_spawn \\\n",
"0 (((0.010701, 0.015691, 0.005213, 0.280889), (0... (2.954793,) \n",
"1 (((0.010705, 0.020385, 0.016089, 0.171352), (0... (2.997034,) \n",
"2 (((0.011214, 0.003196, 0.004736, 0.187174), (0... (2.962994,) \n",
"3 (((0.0107, 0.020957, 0.00406, 0.174168), (0.01... (3.049718,) \n",
"4 (((0.010703, 0.010967, 0.000106, 0.171724), (0... (3.106215,) \n",
".. ... ... \n",
"835 (((0.124864, 0.000256, 4.5e-05, 0.036086), (0.... (2.302374,) \n",
"836 (((0.124902, 0.000214, 2.8e-05, 0.034524), (0.... (5.546667,) \n",
"837 (((0.124852, 0.00023, 7.5e-05, 0.036838), (0.1... (3.725691,) \n",
"838 (((0.124922, 0.000181, 4.6e-05, 0.0343), (0.12... (3.066206,) \n",
"839 (((0.124865, 0.000212, 8.1e-05, 0.036188), (0.... (3.480278,) \n",
"\n",
" T_spawn_real T_SR T_AR T_total \n",
"0 (0,) (0.604612,) (0,) 132.377707 \n",
"1 (0,) (0.521934,) (0,) 138.576342 \n",
"2 (0,) (0.558318,) (0,) 154.978141 \n",
"3 (0,) (0.509169,) (0,) 137.381302 \n",
"4 (0,) (0.637513,) (0,) 142.663098 \n",
".. ... ... ... ... \n",
"835 (2.236232,) (0.111917,) (1.997651,) 146.363428 \n",
"836 (2.110774,) (0.551958,) (1.983407,) 150.696184 \n",
"837 (2.051036,) (0.12372,) (2.11543,) 144.347781 \n",
"838 (1.990711,) (0.119849,) (2.015445,) 144.380533 \n",
"839 (2.165749,) (0.119847,) (1.868907,) 142.924103 \n",
"\n",
"[1260 rows x 25 columns]"
]
},
"execution_count": 10,
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"dfG"
]
......@@ -714,82 +183,352 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 296,
"metadata": {},
"outputs": [],
"source": [
"class MalleabilityIterator:\n",
" def __init__(self):\n",
" self._sm = [0,1]\n",
" self._rm = [0,1]\n",
" self._rs = [1,2]\n",
" self._adr = [0,96.6]\n",
" self._arrays = [self._sm, self._rm, self._rs, self._adr]\n",
" self._max_index = len(self._sm) * len(self._rm) * len(self._rs) * len(self._adr)\n",
" self._in_use = [0]*4\n",
" self._index = 0\n",
"\n",
" def __iter__(self):\n",
" return self\n",
"\n",
" def __next__(self):\n",
" if self._index < self._max_index:\n",
" for index in len(self._arrays):\n",
" if self._in_use[index] < len(self._arrays[index])-1:\n",
" self._in_use[index]+=1\n",
" break\n",
" elif index == len(self._arrays) - 1 && self._in_use[index] == len(self._arrays[index])-1:\n",
" result = []\n",
" for index in len(self._arrays):\n",
" result.append(self._arrays[index][self._in_use[index]])\n",
" \n",
" self._index += 1\n",
" return tuple(result)\n",
"from bt_scheme import PartialSolution, BacktrackingSolver\n",
"def elegirConf(parameters):\n",
" class StatePS(PartialSolution):\n",
" def __init__(self, config):\n",
" self.config= config\n",
" self.n= len(config) #Indica el valor a añadir\n",
"\n",
" def is_solution(self):\n",
" return self.n == len(parameters)\n",
"\n",
" def get_solution(self):\n",
" return tuple(self.config)\n",
"\n",
" def successors(self):\n",
" array = parameters[self.n]\n",
" for parameter_value in array: #Test all values of the next parameter\n",
" self.config.append(parameter_value)\n",
" yield StatePS(self.config)\n",
" self.config.pop()\n",
"\n",
" initialPs= StatePS([])\n",
" return BacktrackingSolver().solve(initialPs)\n",
"\n",
"\n",
"def obtenerConfs(parameters):\n",
" soluciones=[]\n",
" for solucion in elegirConf(parameters):\n",
" soluciones.append(solucion)\n",
" return soluciones\n",
"\n",
"def modifyToUsable(parameters, len_parameters, configuration):\n",
" usable_configuration = []\n",
" for i in range(len(parameters)):\n",
" if len_parameters[i] > 1:\n",
" aux = (parameters[i][0], configuration[i])\n",
" else:\n",
" raise StopIteration"
" aux = (configuration[i])\n",
" usable_configuration.append(aux)\n",
" \n",
" return usable_configuration\n",
"\n",
"def CheckConfExists(configuration):\n",
" remove = 0\n",
" config = list(configuration)\n",
" for np_aux in processes:\n",
" for ns_aux in processes:\n",
" if np_aux != ns_aux:\n",
" config.append((np_aux, ns_aux))\n",
" if tuple(config) in grouped_aggG.index: \n",
" remove = 1\n",
" elif remove != 1:\n",
" remove = -1\n",
" config.pop()\n",
" if remove == 1:\n",
" return True\n",
" return False"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 297,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[0, (0, 0), (0, 0), (1, 1)], [0, (0, 0), (0, 1), (1, 1)], [96.6, (0, 0), (0, 0), (1, 1)], [96.6, (0, 0), (0, 0), (1, 2)], [96.6, (0, 0), (0, 1), (1, 1)], [96.6, (0, 0), (0, 1), (1, 2)]]\n",
"6\n"
]
}
],
"source": [
"sp_method = [0,1]\n",
"rd_method = [0,1]\n",
"rd_strat = [1,2]\n",
"adr = [0,96.6]\n",
"parameters = [adr, sp_method, rd_method, rd_strat]\n",
"len_parameters = [1,2,2,2]\n",
"configurations_aux = obtenerConfs(parameters)\n",
"configurations = []\n",
"for configuration in configurations_aux:\n",
" aux_conf = modifyToUsable(parameters, len_parameters, configuration)\n",
" if CheckConfExists(aux_conf):\n",
" configurations.append(aux_conf)\n",
"\n",
"print(configurations)\n",
"print(len(configurations))"
]
},
{
"cell_type": "code",
"execution_count": 298,
"metadata": {},
"outputs": [],
"source": [
"# Aquellos grupos que tengán valores por encima del límite no se considerarán\n",
"# Con sumar a si mismos su valor actual estarán fuera\n",
"def check_groups_boundaries(data_stats, np_aux, ns_aux, tc_boundary):\n",
" index_aux = 0\n",
" for cst_aux in [0,2]: # Primero los grupos síncronos\n",
" for css_aux in [0,1]:\n",
" if cst_aux == 2 and css_aux == 1 and np_aux > ns_aux: # Arreglo para coger bien el tiempo en Merge Single Shrink\n",
" index_aux = 1\n",
" tc_val = grouped_aggM.loc[('2,2',0, cst_aux, css_aux - index_aux, np_aux,ns_aux), 'TC_A']\n",
" if tc_val > tc_boundary:\n",
" data_stats[cst_aux*2 + css_aux]+=data_stats[cst_aux*2 + css_aux]\n",
" index_aux = 0\n",
" for cst_aux in [1,3]: # Segundo se comprueban los asíncronos\n",
" for css_aux in [0,1]:\n",
" if cst_aux == 3 and css_aux == 1 and np_aux > ns_aux: # Arreglo para coger bien el tiempo en Merge Single Shrink\n",
" index_aux = 1\n",
" tc_val = grouped_aggM.loc[('2,2',0, cst_aux, css_aux - index_aux, np_aux,ns_aux), 'TH']\n",
" if tc_val > tc_boundary:\n",
" data_stats[cst_aux*2 + css_aux]+=data_stats[cst_aux*2 + css_aux]"
]
},
{
"cell_type": "code",
"execution_count": 299,
"metadata": {},
"outputs": [],
"source": [
"for sp_method in [0,1]:\n",
" df_aux = grouped_aggG.query('Spawn_Method == @sp_method')\n",
" for rp_method in [0,1]:\n",
" df_aux = grouped_aggG.query('Redistribution_Method == @rp_method')"
"def get_perc_differences(dataLists, np_aux, ns_aux, rms_boundary, tc_boundary):\n",
" #if rms_boundary != 0: # Si se usa perspectiva de RMS, se desconsideran valores muy altos\n",
" #check_groups_boundaries(data_stats, np_aux, ns_aux, tc_boundary) \n",
" indexes = np.argsort(dataLists)\n",
" \n",
" best = -1\n",
" bestMax = -1\n",
" otherBest=[]\n",
" for index in indexes: # Para cada metodo -- Empezando por el tiempo más bajo en media/mediana\n",
" if best == -1:\n",
" best = index\n",
" bestMax = dataLists[best] * 1.05\n",
" elif dataLists[index] <= bestMax: # Medias/Medianas diferentes && Media/Medianas i < Media/Mediana best\n",
" otherBest.append(index)\n",
" \n",
" otherBest.insert(0,best)\n",
" return otherBest"
]
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": 300,
"metadata": {},
"outputs": [],
"source": [
"def results_with_perc(tipo, data_aux, configurations, rms_boundary=0):\n",
" results = []\n",
" for np_aux in processes:\n",
" for ns_aux in processes:\n",
" if np_aux != ns_aux:\n",
" \n",
" # 1 - Get all values for particular config with these number of processes\n",
" dataLists=[]\n",
" for config in configurations:\n",
" config.append((np_aux,ns_aux))\n",
" if tuple(config) in data_aux.index:\n",
" aux_value = data_aux.loc[tuple(config),tipo].values[0]\n",
" else: # This configuration is not present in the dataset\n",
" aux_value = float('infinity')\n",
" dataLists.append(aux_value)\n",
" config.pop()\n",
" \n",
" tc_boundary = 0\n",
" #tc_boundary = dfM.query('NP == @np_aux and NS == @ns_aux')['TC'].max()\n",
" if rms_boundary != 0:\n",
" boundaries = []\n",
" for cst_aux in [0,1,2,3]:\n",
" for css_aux in [0,1]:\n",
" dataSet_aux = dataSet.query('Cst == @cst_aux and Css == @css_aux')\n",
" lista_aux = list(dataSet_aux[tipo])\n",
" dataLists.append(lista_aux)\n",
" \n",
" if cst_aux == 0 or cst_aux == 2:\n",
" if cst_aux == 2 and css_aux == 1 and (np_aux > ns_aux):\n",
" new_boundary = tc_boundary\n",
" else:\n",
" new_boundary = grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux), 'TC_A']\n",
" else:\n",
" if cst_aux == 3 and css_aux == 1 and (np_aux > ns_aux):\n",
" new_boundary = tc_boundary\n",
" else:\n",
" new_boundary = grouped_aggM.loc[('2,2',0, cst_aux, css_aux, np_aux,ns_aux), 'TH']\n",
" boundaries.append(new_boundary)\n",
" tc_boundary = min(boundaries)\n",
" tc_boundary = tc_boundary + tc_boundary*rms_boundary\n",
"\n",
" aux_data = get_perc_differences(dataLists, np_aux, ns_aux, rms_boundary, tc_boundary)\n",
" results.append(aux_data)\n",
" return results"
]
},
{
"cell_type": "code",
"execution_count": 301,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-0.00982064 -0.0113957 -0.01319036 ... -0.01522953 -0.01319036\n",
" -0.0113957 ]\n",
" [-0.0113957 -0.01322338 -0.01530587 ... -0.01767209 -0.01530587\n",
" -0.01322338]\n",
" [-0.01319036 -0.01530587 -0.01771632 ... -0.02045518 -0.01771632\n",
" -0.01530587]\n",
" ...\n",
" [-0.01200234 -0.01414685 -0.01660867 ... 0.02918791 0.03019517\n",
" 0.03085725]\n",
" [-0.01097235 -0.01288301 -0.01507265 ... 0.01583738 0.01709512\n",
" 0.01804782]\n",
" [-0.00988645 -0.01157475 -0.01350698 ... 0.00702321 0.0083816\n",
" 0.00947216]]\n"
"[[5, 1, 0, 4, 3, 2], [1, 4, 0, 5, 2, 3], [4, 5, 2, 3, 1, 0], [2, 1, 5, 4, 0, 3], [4, 0, 1, 3, 5, 2], [1, 3, 0, 5, 4, 2], [4, 2, 5, 3, 1], [1, 0, 2, 4, 5], [5, 0, 4, 3, 2, 1], [4, 2, 1, 5, 0, 3], [2, 1, 0, 4, 3, 5], [4, 1, 0, 5], [4, 2, 1, 0, 3, 5], [1, 0, 4, 2, 5], [0, 2, 4, 1], [1, 0, 2], [1, 4, 0, 2], [1, 0, 2], [1], [3, 0, 4, 2], [2, 0, 1, 4, 5, 3], [1, 0, 4], [2, 0, 1], [4, 0, 1, 2, 3, 5], [4, 2, 3], [2, 1, 0, 3], [4, 1, 5, 3, 2], [1, 4, 2], [1, 2, 4], [1, 0, 2, 4], [2, 4, 5, 3, 1, 0], [1, 2, 0, 5, 4], [1, 5, 4, 2, 0, 3], [4, 1], [1, 2, 4, 5], [1, 2], [4, 1, 0, 2, 3, 5], [2, 1, 4, 5, 0], [5, 4, 1], [4, 1, 2, 0], [2, 1, 4], [4, 1, 5, 3, 2, 0]]\n"
]
}
],
"source": [
"checked_type='te'\n",
"use_perc = True\n",
"rms_boundary=0 # Poner a 0 para perspectiva de app. Valor >0 y <1 para perspectiva de RMS\n",
"if checked_type=='te':\n",
" tipo=\"T_total\"\n",
" data_aux=grouped_aggG\n",
"elif checked_type=='tc':\n",
" tipo=\"TC\"\n",
" data_aux=dfM\n",
" \n",
"if use_perc:\n",
" results = results_with_perc(tipo, data_aux, configurations, rms_boundary)\n",
"else:\n",
" #results = results_with_st(tipo, data_aux)\n",
" results = None\n",
"#Results is a 2 dimensional array. First dimensional indicates winners of a particulal number of processes (NP->NC). \n",
"#Second dimension is an ordered preference of indexes in the array configurations.\n",
"print(results)"
]
},
{
"cell_type": "code",
"execution_count": 302,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-1 5 1 4 2 4 1]\n",
" [ 4 -1 1 5 4 2 4]\n",
" [ 4 1 -1 0 1 1 1]\n",
" [ 1 3 2 -1 1 2 4]\n",
" [ 4 2 4 1 -1 1 1]\n",
" [ 2 1 1 4 1 -1 1]\n",
" [ 4 2 5 4 2 4 6]]\n"
]
}
],
"source": [
"#Lista de indices de mayor a menor de los valores\n",
"aux_array = []\n",
"for data in results:\n",
" aux_array+=data\n",
"unique, counts = np.unique(aux_array, return_counts=True)\n",
"aux_dict = dict(zip(unique, counts))\n",
"aux_keys=list(aux_dict.keys())\n",
"aux_values=list(aux_dict.values())\n",
"aux_ordered_index=list(reversed(list(np.argsort(aux_values))))\n",
"\n",
"i=0\n",
"j=0\n",
"used_aux=0\n",
"heatmap=np.zeros((len(processes),len(processes))).astype(int)\n",
"\n",
"if use_perc:\n",
" for i in range(len(processes)):\n",
" for j in range(len(processes)):\n",
" if i==j:\n",
" heatmap[i][j]=-1\n",
" used_aux+=1\n",
" else:\n",
" results_index = i*len(processes) +j-used_aux\n",
" heatmap[i][j] = results[results_index][0]\n",
"else:\n",
" for i in range(len(processes)):\n",
" for j in range(len(processes)):\n",
" if i==j:\n",
" heatmap[i][j]=-1\n",
" used_aux+=1\n",
" else: \n",
" results_index = i*len(processes) +j-used_aux\n",
" for index in aux_ordered_index:\n",
" if aux_keys[index] in results[results_index]:\n",
" heatmap[i][j]=aux_keys[index]\n",
" break\n",
"heatmap[-1][-1]=len(configurations)\n",
"print(heatmap)"
]
},
{
"cell_type": "code",
"execution_count": 303,
"metadata": {},
"outputs": [],
"source": [
"#Adapta results a una cadena asegurando que cada cadena no se sale de su celda\n",
"results_str = []\n",
"max_counts = 1\n",
"max_per_line = 3\n",
"for i in range(len(results)):\n",
" results_str.append(list())\n",
" count = len(results[i])\n",
" results_aux = results[i]\n",
" if count > max_counts:\n",
" count = max_counts\n",
" results_aux = results[i][:count]\n",
" \n",
" remainder = count%max_per_line\n",
" if count <= max_per_line:\n",
" aux_str = str(results_aux).replace('[','').replace(']','')\n",
" results_str[i].append(aux_str)\n",
" else:\n",
" if remainder == 0:\n",
" index = count//2\n",
" else:\n",
" index = count - ((remainder-1)*max_per_line + 1)\n",
" aux_str = str(results_aux[:index]).replace('[','').replace(']','')\n",
" results_str[i].append(aux_str)\n",
" aux_str = str(results_aux[index:]).replace('[','').replace(']','')\n",
" results_str[i].append(aux_str)\n",
"#print(results_str)"
]
},
{
"cell_type": "code",
"execution_count": 308,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_4327/287705176.py:38: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
" ax.set_xticklabels(['']+processes, fontsize=36)\n",
"/tmp/ipykernel_4327/287705176.py:39: UserWarning: FixedFormatter should only be used together with FixedLocator\n",
" ax.set_yticklabels(['']+processes, fontsize=36)\n"
]
},
{
"data": {
"image/png": "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\n",
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
"<Figure size 1728x864 with 2 Axes>"
]
},
"metadata": {
......@@ -799,64 +538,145 @@
}
],
"source": [
"fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})\n",
"#Crea un heatmap teniendo en cuenta los colores anteriores\n",
"f=plt.figure(figsize=(24, 12))\n",
"ax=f.add_subplot(111)\n",
"\n",
"# Get the test data\n",
"X, Y, Z = axes3d.get_test_data(0.05)\n",
"myColors = (colors.to_rgba(\"white\"),colors.to_rgba(\"green\"), colors.to_rgba(\"springgreen\"),colors.to_rgba(\"blue\"),colors.to_rgba(\"darkblue\"),\n",
" colors.to_rgba(\"red\"),colors.to_rgba(\"darkred\"),colors.to_rgba(\"darkgoldenrod\"),colors.to_rgba(\"olive\"),\n",
" colors.to_rgba(\"green\"), colors.to_rgba(\"springgreen\"),colors.to_rgba(\"blue\"),colors.to_rgba(\"darkblue\"),\n",
" colors.to_rgba(\"red\"),colors.to_rgba(\"darkred\"),colors.to_rgba(\"darkgoldenrod\"),colors.to_rgba(\"olive\"),colors.to_rgba(\"white\"))\n",
"cmap = LinearSegmentedColormap.from_list('Custom', myColors, len(myColors))\n",
"\n",
"im = ax.imshow(heatmap,cmap=cmap,interpolation='nearest')\n",
"\n",
"# Loop over data dimensions and create text annotations.\n",
"used_aux=0\n",
"for i in range(len(processes)):\n",
" for j in range(len(processes)):\n",
" if i!=j:\n",
" aux_color=\"white\"\n",
" if heatmap[i, j] == 1: # El 1 puede necesitar texto en negro\n",
" aux_color=\"black\"\n",
" results_index = i*len(processes) +j-used_aux\n",
" if len(results_str[results_index]) == 1:\n",
" text = results_str[results_index][0]\n",
" ax.text(j, i, text, ha=\"center\", va=\"center\", color=aux_color, fontsize=36)\n",
" else:\n",
" add_aux = 0.33\n",
" for line in range(len(results_str[results_index])):\n",
" i_range = i - 0.5 + add_aux\n",
" ax.text(j, i_range, results_str[results_index][line],\n",
" ha=\"center\", va=\"center\", color=aux_color, fontsize=36)\n",
" add_aux+=0.33\n",
" else:\n",
" used_aux+=1\n",
"\n",
"Z[0] = 200\n",
"ax.set_ylabel(\"NP\", fontsize=36)\n",
"ax.set_xlabel(\"NC\", fontsize=36)\n",
"\n",
"ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)\n",
"ax.set_proj_type('ortho') # FOV = 0 deg\n",
"ax.set_title(\"'ortho'\\nfocal_length = ∞\", fontsize=10)\n",
"plt.show()"
"ax.set_xticklabels(['']+processes, fontsize=36)\n",
"ax.set_yticklabels(['']+processes, fontsize=36)\n",
"\n",
"\n",
"#labelsMethods_aux = ['Baseline - AllS (0)', 'Invalid (1)','Baseline - P2PS (2)','Invalid (3)',\n",
"# 'Merge -AllS (4)','Invalid (5)','Merge -P2PS (6)','Invalid(7)',\n",
"# 'Baseline - AllA (8)', 'Baseline - AllT (9)','Baseline - P2PA (10)','Baseline - P2PT (11)',\n",
"# 'Merge -AllA (12)','Merge - AllT (13)','Merge -P2PA (14)','Merge - P2PT (15)']\n",
"colorbar=f.colorbar(im, ax=ax)\n",
"tick_bar = []\n",
"for i in range(len(configurations)):\n",
" tick_bar.append(0.35 + i*0.95) #TE\n",
"#colorbar.set_ticks(tick_bar) \n",
"#colorbar.set_ticklabels(labelsMethods_aux)\n",
"colorbar.ax.tick_params(labelsize=32)\n",
"#\n",
"\n",
"f.tight_layout()\n",
"f.savefig(\"Images/Spawn/Heatmap_\"+tipo+\".png\", format=\"png\")"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"[[0, (0, 0), (0, 0), (1, 1)], [0, (0, 0), (0, 0), (1, 2)], [0, (0, 0), (0, 1), (1, 1)], [0, (0, 0), (0, 1), (1, 2)], [0, (0, 1), (0, 0), (1, 1)], [0, (0, 1), (0, 0), (1, 2)], [0, (0, 1), (0, 1), (1, 1)], [0, (0, 1), (0, 1), (1, 2)], [96.6, (0, 0), (0, 0), (1, 1)], [96.6, (0, 0), (0, 0), (1, 2)], [96.6, (0, 0), (0, 1), (1, 1)], [96.6, (0, 0), (0, 1), (1, 2)], [96.6, (0, 1), (0, 0), (1, 1)], [96.6, (0, 1), (0, 0), (1, 2)], [96.6, (0, 1), (0, 1), (1, 1)], [96.6, (0, 1), (0, 1), (1, 2)]]"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================"
]
},
{
"cell_type": "code",
"execution_count": 32,
"execution_count": 253,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[-3.0000000e+01 -2.9500000e+01 -2.9000000e+01 -2.8500000e+01\n",
" -2.8000000e+01 -2.7500000e+01 -2.7000000e+01 -2.6500000e+01\n",
" -2.6000000e+01 -2.5500000e+01 -2.5000000e+01 -2.4500000e+01\n",
" -2.4000000e+01 -2.3500000e+01 -2.3000000e+01 -2.2500000e+01\n",
" -2.2000000e+01 -2.1500000e+01 -2.1000000e+01 -2.0500000e+01\n",
" -2.0000000e+01 -1.9500000e+01 -1.9000000e+01 -1.8500000e+01\n",
" -1.8000000e+01 -1.7500000e+01 -1.7000000e+01 -1.6500000e+01\n",
" -1.6000000e+01 -1.5500000e+01 -1.5000000e+01 -1.4500000e+01\n",
" -1.4000000e+01 -1.3500000e+01 -1.3000000e+01 -1.2500000e+01\n",
" -1.2000000e+01 -1.1500000e+01 -1.1000000e+01 -1.0500000e+01\n",
" -1.0000000e+01 -9.5000000e+00 -9.0000000e+00 -8.5000000e+00\n",
" -8.0000000e+00 -7.5000000e+00 -7.0000000e+00 -6.5000000e+00\n",
" -6.0000000e+00 -5.5000000e+00 -5.0000000e+00 -4.5000000e+00\n",
" -4.0000000e+00 -3.5000000e+00 -3.0000000e+00 -2.5000000e+00\n",
" -2.0000000e+00 -1.5000000e+00 -1.0000000e+00 -5.0000000e-01\n",
" -1.0658141e-13 5.0000000e-01 1.0000000e+00 1.5000000e+00\n",
" 2.0000000e+00 2.5000000e+00 3.0000000e+00 3.5000000e+00\n",
" 4.0000000e+00 4.5000000e+00 5.0000000e+00 5.5000000e+00\n",
" 6.0000000e+00 6.5000000e+00 7.0000000e+00 7.5000000e+00\n",
" 8.0000000e+00 8.5000000e+00 9.0000000e+00 9.5000000e+00\n",
" 1.0000000e+01 1.0500000e+01 1.1000000e+01 1.1500000e+01\n",
" 1.2000000e+01 1.2500000e+01 1.3000000e+01 1.3500000e+01\n",
" 1.4000000e+01 1.4500000e+01 1.5000000e+01 1.5500000e+01\n",
" 1.6000000e+01 1.6500000e+01 1.7000000e+01 1.7500000e+01\n",
" 1.8000000e+01 1.8500000e+01 1.9000000e+01 1.9500000e+01\n",
" 2.0000000e+01 2.0500000e+01 2.1000000e+01 2.1500000e+01\n",
" 2.2000000e+01 2.2500000e+01 2.3000000e+01 2.3500000e+01\n",
" 2.4000000e+01 2.4500000e+01 2.5000000e+01 2.5500000e+01\n",
" 2.6000000e+01 2.6500000e+01 2.7000000e+01 2.7500000e+01\n",
" 2.8000000e+01 2.8500000e+01 2.9000000e+01 2.9500000e+01]\n"
"[0, 1, 100, 3, 4]\n",
"[0, 1, 100, 3, 4]\n"
]
}
],
"source": [
"a=[0,1,2,3,4]\n",
"b=a\n",
"count=3\n",
"a[2]=100\n",
"print(a)\n",
"print(b)"
]
},
{
"cell_type": "code",
"execution_count": 114,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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6arBYOC6667jK1/5CnfccceClLNO9ejSEEiA3/zmN3z22Wc8//zz1NXVcfXVV7sn41qBtcFMxgXV0N2x2Wx88sknPPPMM7z00kts2bKFM888Uzb8mYzSWyVccnKy/AUORlGJhBQhFBcXT4sQpI6hWq12ztNRg9XcwmazUVNTQ1SUq5RYWn7MdzpqoJpbeKp1iIiIYGBggM2bN8+7UrGtrY1rr72Wn/70p1x66aXzOpavXHXVVbz77rtotVrS0tK47777ePfdd6mqqkIQBPLy8vjjH/8oG/7999/Pk08+iUqloqmp6cuiKO4L5vktmKGD64tyzTXXcPfddxMfH8/evXvZt28fzc3NbN++nV27dnH66afPOJvbfStKq9XidDqJi4tDr9eTm5sbUOnqXCME90o4o9E443TU+eQQZsJbhCDJNLVardeecDPhaw5hrsgS5a4uwsLCJu1++DMd9eDBg9x22238z//8z9SE11JmeRfM+IrFYuHDDz9kz549vPvuuyQlJbFz50527949azLGaDRSW1tLVFQUFotFHlgw362oQEQI3irhRkZGGBgY8Kn91VzwNULw1BNupumoc8khzAVPEcJcesJN5bXXXuOXv/wlL7zwQsAy654KYe68807+/ve/o9FoKCgo4KmnniI+Pp62tjY2bNjAunXrANfI7j/84Q++PM3KMPRJTzjx4UvevrOzk1NOOYXdu3ezY8eOSZ5Rr9fT1NREUVER0dHRc+oJNxMWi4WampqANrdwOBzodDqOHz/O+Pi4nHNwr4SbD/OJEGaqhJP6ui3GLsNMPeHcax1EUeR3v/sd+/bt469//WtAqwg9FcK88cYbnHXWWahUKn784x8D8PDDD09bo8+BlWfoUzGbzbz33nvs2bOHDz74gIyMDHbt2sXQ0BBJSUlce+21Xg3FH+8wMjLCkSNHgtrcYvXq1XKyUafT4XA45tWSeqYcwlxxr4ST8g7Z2dnk5OTMexChhL8RwtRKOLvdTmtrK4cPH2ZsbIwnnngiIBfNqcxkwK+88govvvgif/7zn0OGHihEUaSxsZHvfe97NDQ0kJyczI4dO9i9ezcnn3zyjB+yJ+8geVQpOTU1QggUs5Wd2u12+Qs8l5bUC7HLsHbtWjknIlXCzafWIVAttJ1OJ9XV1dx11120trayfv167r77bs466yy/j+mNmQz4q1/9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cfbZZ5OQkDCjJ3bfG5cq4aKioujo6KCwsHDe0lWdTse1117LpZdeyne+851FScyOjY2Rk5NDS0uLvFNw3XXXeR2usAisLEO32Wycf/757N69mzvuuGPa32frspmXl0dMTAxKpVLen55JX3wiYLfbJ63XHQ4HBw4cYM+ePbz11luo1Wp5/l1RUdGsstuOjg7a29tRq9WTSnP9qV8/fvw4N9xwA/fccw8XXXSRPy9vpbByDF0URW644QYSExN55JFH5NvnEmLl5eVx8ODBSXO7vOmLVwJS6ylP8+/OOuusaU0Le3p66OrqoqSkBI1GM6/pqJ9++im33347Tz75JFu3bg3K6zuBLuwrx9A//PBDTj311ElTVx944AGee+45n0MsT4buTV+8ErHZbHz88cfs3buXd955h6ioKLmzzuuvv86pp55KRUWFxzW0L/PvwHVxeeWVV3jkkUd48cUXycvLC9rrOYEu7CvH0ANBfn6+vCb9l3/5F2699Vbi4+MxGo3yfRISEjAYDIt3kksEURTp6uritdde4xe/+AVxcXFs27aNc889l9NPP33Gdk1SJZxUped0OtFoNOh0Oqqrq3nvvfcWxJOeQBf25be9tph89NFHZGZmMjAwwM6dO1m/fv1in9KSRRAEcnJyiI2N5Y477uCb3/ymPP/ugQcemHH+nXslXF5eHjabjaqqKu6//36OHTvGueeey9GjRwPVfWXG1yA1pZAu7N4aR6x0TihDl7aBUlNTufjiizlw4IBXfbEnlokAIqBcd9118u9nn302Z599tqwx37t3L3fffTddXV1e59+Ba/vsoYce4stf/jJ33303NTU1AZ3H7o3Qhd13TpjQfXR0FKfTSUxMDKOjo+zcuZN77rmHt99+26O+eDaWsABiwTGbzbIQ58MPPyQzM1MuzdVoNFx99dV85zvf4dprr100XcO9995LdHQ0jz32WCh098AJ49H7+/u5+OKLAVfi6Oqrr+bcc89l69atXH755TzxxBOyvtgXVrIAYioRERGcd955nHfeeXJJ7N69e7n99ts5dOgQL730EmeeeeaCntPUC/sbb7zBPffcwwUXXMDTTz/NXXfdxdNPP82FF164oOe1VDlhPHqguemmmygvL+e2227j3nvvDVXneWFsbCygs+p8paWlZdqF/ac//Sk6nc5r44glTPDDIFEUZ/pZkVgsFjEpKUns6+sTRVEU+/r6RLvdLjocDvHuu+8Wb7zxxkn3v/HGG8WUlBRx06ZN8m06nU4855xzxDVr1ojnnHOOqNfr5b898MADYkFBgVhYWCju379/YV7UMqGjo0M844wzxPXr14sbN24UH3nkEVEURfFnP/uZmJmZKZaUlIglJSXinj17FvlMA8psdjjvn5Che+Bvf/ubuHPnTo9/a21tnWTQoiiK7733nnjo0KFJt995553igw8+KIqiKD744IPij370I1EURbGurk4sLi4Wx8fHxZaWFnH16tWi3W4P0itZfvT09IiHDh0SRVEUTSaTuHbtWrGurk782c9+Jv7yl79c5LMLGkE39IWRDi0znnvuuUm65d7eXvn3V155Zdpwv9NOO21aePjqq69yww03AHDDDTfwt7/9Tb79yiuvJCwsjPz8fNasWcOBAweC9EqWHxkZGZSXlwMhFWMgCRn6FMbGxnjzzTe55JJL5Nt+9KMfsXnzZoqLi/nnP//Jb37zm1mPM9MggJycHPl+y20QwELS1tZGZWUlJ510EuBqFFFcXMxNN90UKnqaIyFDn0JkZCQ6nW5Sx9Rnn32W2tpaampqeO211+alchJDrbZ8YmRkhEsvvZRHHnmE2NhY/vVf/5Xjx49TVVVFRkYGP/jBDxb7FJcVIUMPElKhDuDTIICbbrqJ1NTUScuCO++8k/Xr11NcXMzFF18sl/K2tbURERFBaWkppaWlfPOb31y4F7YA2Gw2Lr30Uq655ho5skpLS0OpVKJQKPjGN74RWu7MkZChBwlpPxeYtJ97wQUX8Pzzz2OxWGhtbeXYsWNs27aNr3/96+zfv3/SMXbu3MmRI0eoqamhsLBQbp0NUFBQQFVVFVVVVfzhD39YuBcWZERR5Oabb2bDhg2TpMqz5UlCzMIs2boQPnDllVeK6enpokqlErOyssTHH39c1Gq14llnnSWuWbNGPOuss0SdTiff/+c//7m4evVqsbCwUNy7d698u6eMvsTLL78sXn311bPeb7nzwQcfiIC4efPmSVtp1157rVhUVCRu3rxZ/OpXvyr29PQs9qkGktD22kpiJgM+//zzxWeffVa+X2RkpFhaWiqedtpp4vvvv7+Qpxkw9u3bJxYWFooFBQXyVuQKJeiGfsKUwJ7I3H///ahUKq655hrAlcXv6OggKSmJQ4cOcdFFF1FXVzetkcRSxuFw8O1vf3vS6K4LLrhgRY3uWkhCa/QlztNPP80//vEP/vznP8vZ+bCwMLmXW0VFBQUFBTQ1NXlM6N17771kZWXJibu9e/fKf3vwwQdZs2YN69atk0doLRQHDhxgzZo1rF69Go1Gw5VXXsmrr766oOewkggZ+hJm//79PPzww7z22muT6skHBwdxOByAq+b72LFjrF692mNCD+D73/++nLiT5LX19fU8//zz1NXVsX//fr71rW/Jx1wIQvUEC0vI0JcIV111FSeffDKNjY1kZ2fzxBNPcNtttzE8PMzOnTsnbaO9//77FBcXU1JSwte+9jX+8Ic/kJiY6LFCzxuLXaEnhuoJFpTQGn2J8Nxzz0277eabb/Z430svvZRLL73U52N7Gj3U3d3N9u3b5fsstEf1d3RXCP8IefQTHG8VZYvtUbdu3cqxY8dobW3FarXy/PPPc8EFFyzY8680Qh79BMfb6KHF9qj+ju4K4R8hj36C462izFuF3kLy5S9/maamJo4fP85Pf/rTBX3ulcZsHWZCLCMEQXgOOANIBvqBn038vxRXt6A24F9EUeyduP9PgZsAO/A9URT3LfQ5h1gYQoYeIsQKIBS6hwixAggZeogQK4CQoYcIsQIIGXqIECuAkKGHCLECCBl6iBArgJChhwixAggZeogQK4D/H0ODg96CZOYdAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"print(X[1])"
"fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})\n",
"\n",
"# Get the test data\n",
"#X, Y, Z = axes3d.get_test_data(0.05)\n",
"\n",
"aux = grouped_aggG.loc[u_sols[0],'T_total']\n",
"Z = [None] * len(processes)\n",
"X, Y = np.meshgrid(processes, processes)\n",
"removed_index = 0\n",
"for i in range(len(processes)):\n",
" Z[i] = [0] * len(processes)\n",
" for j in range(len(processes)):\n",
" if i!=j:\n",
" real_i = i - removed_index\n",
" real_j = j - removed_index\n",
" Z[i][j] = aux.values[real_i*len(processes)+real_j]\n",
" else:\n",
" Z[i][j] = 0\n",
" removed_index += 1 \n",
"Z = np.array(Z)\n",
"\n",
"ax.plot_wireframe(X, Y, Z, rstride=20, cstride=10)\n",
"ax.set_proj_type('ortho') # FOV = 0 deg\n",
"ax.set_title(\"'ortho'\\nfocal_length = ∞\", fontsize=10)\n",
"plt.show()"
]
},
{
......
%% 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
from mpl_toolkits.mplot3d import axes3d
```
%% Cell type:code id: tags:
``` python
AllName="dataG.pkl"
ResizesName="dataM.pkl"
matrixIt="dataL.pkl"
matrixIt_Total="data_L_Total.csv"
n_cores=20
repet = 5 #CAMBIAR EL NUMERO SEGUN NUMERO DE EJECUCIONES POR CONFIG
p_value = 0.05
processes = [2,10,20,40,80,120,160]
positions = [321, 322, 323, 324, 325]
positions_small = [221, 222, 223, 224]
labels = ['(1,10)', '(1,20)', '(1,40)', '(1,80)', '(1,120)','(1,160)',
'(10,1)', '(10,20)', '(10,40)', '(10,80)', '(10,120)','(10,160)',
'(20,1)', '(20,10)', '(20,40)', '(20,80)', '(20,120)','(20,160)',
'(40,1)', '(40,10)', '(40,20)', '(40,80)', '(40,120)','(40,160)',
'(80,1)', '(80,10)', '(80,20)', '(80,40)', '(80,120)','(80,160)',
'(120,1)','(120,10)', '(120,20)','(120,40)','(120,80)','(120,160)',
'(160,1)','(160,10)', '(160,20)','(160,40)','(160,80)','(160,120)']
labelsExpand = ['(1,10)', '(1,20)', '(1,40)', '(1,80)', '(1,120)','(1,160)',
'(10,20)', '(10,40)', '(10,80)', '(10,120)','(10,160)',
'(20,40)', '(20,80)', '(20,120)','(20,160)',
'(40,80)', '(40,120)','(40,160)',
'(80,120)','(80,160)',
'(120,160)']
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)',
'(160,1)','(160,10)', '(160,20)','(160,40)','(160,80)','(160,120)']
# WORST BEST
labels_dist = ['null', 'SpreadFit', 'CompactFit']
#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','violet']
linestyle_spawn = ['-', '--', '-.', ':']
markers_spawn = ['.','v','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_pickle( AllName )
dfG['ADR'] = (dfG['ADR'] / dfG['DR']) * 100
dfG['SDR'] = (dfG['SDR'] / dfG['DR']) * 100
dfG['ADR'] = round((dfG['ADR'] / dfG['DR']) * 100,1)
dfG['SDR'] = round((dfG['SDR'] / dfG['DR']) * 100,1)
group = dfG.groupby(['Groups','ADR','Spawn_Method','Redistribution_Method', 'Redistribution_Strategy'])['T_total']
group = dfG.groupby(['ADR','Spawn_Method','Redistribution_Method', 'Redistribution_Strategy','Groups'])['T_total']
grouped_aggG = group.agg(['median'])
grouped_aggG.rename(columns={'median':'T_total'}, inplace=True)
grouped_aggG.to_excel("resultG.xlsx")
```
%% Cell type:code id: tags:
``` python
grouped_aggG
```
%%%% Output: execute_result
T_total
Groups ADR Spawn_Method Redistribution_Method Redistribution_Strategy
(2, 10) 0.0 (0, 0) (0, 0) (1, 1) 389.577585
(0, 1) (1, 1) 389.559350
96.6 (0, 0) (0, 0) (1, 1) 390.670604
(1, 2) 390.207550
(0, 1) (1, 1) 390.094789
... ...
(160, 120) 0.0 (0, 0) (0, 1) (1, 1) 143.140648
96.6 (0, 0) (0, 0) (1, 1) 147.587313
(1, 2) 146.947540
(0, 1) (1, 1) 142.850494
(1, 2) 143.274009
[252 rows x 1 columns]
%% Cell type:code id: tags:
``` python
dfG
```
%%%% Output: execute_result
Total_Groups Total_Stages Granularity SDR ADR DR \
0 2 4 100000 3947883504 0.0 3947883504
1 2 4 100000 3947883504 0.0 3947883504
2 2 4 100000 3947883504 0.0 3947883504
3 2 4 100000 3947883504 0.0 3947883504
4 2 4 100000 3947883504 0.0 3947883504
.. ... ... ... ... ... ...
835 2 4 100000 134228039 96.6 3947883503
836 2 4 100000 134228039 96.6 3947883503
837 2 4 100000 134228039 96.6 3947883503
838 2 4 100000 134228039 96.6 3947883503
839 2 4 100000 134228039 96.6 3947883503
Redistribution_Method Redistribution_Strategy Spawn_Method Spawn_Strategy \
0 (0, 1) (1, 1) (0, 0) (1, 1)
1 (0, 1) (1, 1) (0, 0) (1, 1)
2 (0, 1) (1, 1) (0, 0) (1, 1)
3 (0, 1) (1, 1) (0, 0) (1, 1)
4 (0, 1) (1, 1) (0, 0) (1, 1)
.. ... ... ... ...
835 (0, 0) (1, 2) (0, 0) (1, 2)
836 (0, 0) (1, 2) (0, 0) (1, 2)
837 (0, 0) (1, 2) (0, 0) (1, 2)
838 (0, 0) (1, 2) (0, 0) (1, 2)
839 (0, 0) (1, 2) (0, 0) (1, 2)
... Stage_Bytes Iters Asynch_Iters \
0 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
1 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
2 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
3 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
4 ... (0, 8, 8, 33176880) (500, 500) (0, 0)
.. ... ... ... ...
835 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
836 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
837 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
838 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
839 ... (0, 8, 8, 33176880) (500, 500) (2, 0)
T_iter \
0 ((0.317149, 0.217414, 0.134276, 0.148773, 0.15...
1 ((0.234715, 0.150659, 0.147628, 0.130321, 0.13...
2 ((0.224323, 0.165911, 0.147396, 0.139989, 0.12...
3 ((0.211829, 0.151569, 0.152718, 0.128219, 0.11...
4 ((0.211283, 0.148917, 0.133463, 0.135542, 0.13...
.. ...
835 ((0.161252, 0.143764, 0.143709, 0.143632, 0.14...
836 ((0.159672, 0.142413, 0.142332, 0.142328, 0.14...
837 ((0.161999, 0.144079, 0.144051, 0.144055, 0.14...
838 ((0.159451, 0.142453, 0.142414, 0.142388, 0.14...
839 ((0.161346, 0.143941, 0.14389, 0.143897, 0.143...
T_stages T_spawn \
0 (((0.010701, 0.015691, 0.005213, 0.280889), (0... (2.954793,)
1 (((0.010705, 0.020385, 0.016089, 0.171352), (0... (2.997034,)
2 (((0.011214, 0.003196, 0.004736, 0.187174), (0... (2.962994,)
3 (((0.0107, 0.020957, 0.00406, 0.174168), (0.01... (3.049718,)
4 (((0.010703, 0.010967, 0.000106, 0.171724), (0... (3.106215,)
.. ... ...
835 (((0.124864, 0.000256, 4.5e-05, 0.036086), (0.... (2.302374,)
836 (((0.124902, 0.000214, 2.8e-05, 0.034524), (0.... (5.546667,)
837 (((0.124852, 0.00023, 7.5e-05, 0.036838), (0.1... (3.725691,)
838 (((0.124922, 0.000181, 4.6e-05, 0.0343), (0.12... (3.066206,)
839 (((0.124865, 0.000212, 8.1e-05, 0.036188), (0.... (3.480278,)
T_spawn_real T_SR T_AR T_total
0 (0,) (0.604612,) (0,) 132.377707
1 (0,) (0.521934,) (0,) 138.576342
2 (0,) (0.558318,) (0,) 154.978141
3 (0,) (0.509169,) (0,) 137.381302
4 (0,) (0.637513,) (0,) 142.663098
.. ... ... ... ...
835 (2.236232,) (0.111917,) (1.997651,) 146.363428
836 (2.110774,) (0.551958,) (1.983407,) 150.696184
837 (2.051036,) (0.12372,) (2.11543,) 144.347781
838 (1.990711,) (0.119849,) (2.015445,) 144.380533
839 (2.165749,) (0.119847,) (1.868907,) 142.924103
[1260 rows x 25 columns]
%% Cell type:code id: tags:
``` python
used_direction='s'
test_parameter='T_total'
if used_direction=='s':
df_aux=grouped_aggG.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")
```
%% Cell type:code id: tags:
``` python
class MalleabilityIterator:
def __init__(self):
self._sm = [0,1]
self._rm = [0,1]
self._rs = [1,2]
self._adr = [0,96.6]
self._arrays = [self._sm, self._rm, self._rs, self._adr]
self._max_index = len(self._sm) * len(self._rm) * len(self._rs) * len(self._adr)
self._in_use = [0]*4
self._index = 0
def __iter__(self):
return self
def __next__(self):
if self._index < self._max_index:
for index in len(self._arrays):
if self._in_use[index] < len(self._arrays[index])-1:
self._in_use[index]+=1
break
elif index == len(self._arrays) - 1 && self._in_use[index] == len(self._arrays[index])-1:
result = []
for index in len(self._arrays):
result.append(self._arrays[index][self._in_use[index]])
self._index += 1
return tuple(result)
from bt_scheme import PartialSolution, BacktrackingSolver
def elegirConf(parameters):
class StatePS(PartialSolution):
def __init__(self, config):
self.config= config
self.n= len(config) #Indica el valor a añadir
def is_solution(self):
return self.n == len(parameters)
def get_solution(self):
return tuple(self.config)
def successors(self):
array = parameters[self.n]
for parameter_value in array: #Test all values of the next parameter
self.config.append(parameter_value)
yield StatePS(self.config)
self.config.pop()
initialPs= StatePS([])
return BacktrackingSolver().solve(initialPs)
def obtenerConfs(parameters):
soluciones=[]
for solucion in elegirConf(parameters):
soluciones.append(solucion)
return soluciones
def modifyToUsable(parameters, len_parameters, configuration):
usable_configuration = []
for i in range(len(parameters)):
if len_parameters[i] > 1:
aux = (parameters[i][0], configuration[i])
else:
raise StopIteration
aux = (configuration[i])
usable_configuration.append(aux)
return usable_configuration
def CheckConfExists(configuration):
remove = 0
config = list(configuration)
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
config.append((np_aux, ns_aux))
if tuple(config) in grouped_aggG.index:
remove = 1
elif remove != 1:
remove = -1
config.pop()
if remove == 1:
return True
return False
```
%% Cell type:code id: tags:
``` python
for sp_method in [0,1]:
df_aux = grouped_aggG.query('Spawn_Method == @sp_method')
for rp_method in [0,1]:
df_aux = grouped_aggG.query('Redistribution_Method == @rp_method')
sp_method = [0,1]
rd_method = [0,1]
rd_strat = [1,2]
adr = [0,96.6]
parameters = [adr, sp_method, rd_method, rd_strat]
len_parameters = [1,2,2,2]
configurations_aux = obtenerConfs(parameters)
configurations = []
for configuration in configurations_aux:
aux_conf = modifyToUsable(parameters, len_parameters, configuration)
if CheckConfExists(aux_conf):
configurations.append(aux_conf)
print(configurations)
print(len(configurations))
```
%%%% Output: stream
[[0, (0, 0), (0, 0), (1, 1)], [0, (0, 0), (0, 1), (1, 1)], [96.6, (0, 0), (0, 0), (1, 1)], [96.6, (0, 0), (0, 0), (1, 2)], [96.6, (0, 0), (0, 1), (1, 1)], [96.6, (0, 0), (0, 1), (1, 2)]]
6
%% Cell type:code id: tags:
``` python
fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})
# 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]
```
# Get the test data
X, Y, Z = axes3d.get_test_data(0.05)
%% Cell type:code id: tags:
``` python
def get_perc_differences(dataLists, np_aux, ns_aux, rms_boundary, tc_boundary):
#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(dataLists)
best = -1
bestMax = -1
otherBest=[]
for index in indexes: # Para cada metodo -- Empezando por el tiempo más bajo en media/mediana
if best == -1:
best = index
bestMax = dataLists[best] * 1.05
elif dataLists[index] <= bestMax: # Medias/Medianas diferentes && Media/Medianas i < Media/Mediana best
otherBest.append(index)
otherBest.insert(0,best)
return otherBest
```
Z[0] = 200
%% Cell type:code id: tags:
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
ax.set_proj_type('ortho') # FOV = 0 deg
ax.set_title("'ortho'\nfocal_length = ∞", fontsize=10)
plt.show()
``` python
def results_with_perc(tipo, data_aux, configurations, rms_boundary=0):
results = []
for np_aux in processes:
for ns_aux in processes:
if np_aux != ns_aux:
# 1 - Get all values for particular config with these number of processes
dataLists=[]
for config in configurations:
config.append((np_aux,ns_aux))
if tuple(config) in data_aux.index:
aux_value = data_aux.loc[tuple(config),tipo].values[0]
else: # This configuration is not present in the dataset
aux_value = float('infinity')
dataLists.append(aux_value)
config.pop()
tc_boundary = 0
#tc_boundary = dfM.query('NP == @np_aux and NS == @ns_aux')['TC'].max()
if rms_boundary != 0:
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, rms_boundary, tc_boundary)
results.append(aux_data)
return results
```
%% Cell type:code id: tags:
``` python
checked_type='te'
use_perc = True
rms_boundary=0 # Poner a 0 para perspectiva de app. Valor >0 y <1 para perspectiva de RMS
if checked_type=='te':
tipo="T_total"
data_aux=grouped_aggG
elif checked_type=='tc':
tipo="TC"
data_aux=dfM
if use_perc:
results = results_with_perc(tipo, data_aux, configurations, rms_boundary)
else:
#results = results_with_st(tipo, data_aux)
results = None
#Results is a 2 dimensional array. First dimensional indicates winners of a particulal number of processes (NP->NC).
#Second dimension is an ordered preference of indexes in the array configurations.
print(results)
```
%%%% Output: stream
[[5, 1, 0, 4, 3, 2], [1, 4, 0, 5, 2, 3], [4, 5, 2, 3, 1, 0], [2, 1, 5, 4, 0, 3], [4, 0, 1, 3, 5, 2], [1, 3, 0, 5, 4, 2], [4, 2, 5, 3, 1], [1, 0, 2, 4, 5], [5, 0, 4, 3, 2, 1], [4, 2, 1, 5, 0, 3], [2, 1, 0, 4, 3, 5], [4, 1, 0, 5], [4, 2, 1, 0, 3, 5], [1, 0, 4, 2, 5], [0, 2, 4, 1], [1, 0, 2], [1, 4, 0, 2], [1, 0, 2], [1], [3, 0, 4, 2], [2, 0, 1, 4, 5, 3], [1, 0, 4], [2, 0, 1], [4, 0, 1, 2, 3, 5], [4, 2, 3], [2, 1, 0, 3], [4, 1, 5, 3, 2], [1, 4, 2], [1, 2, 4], [1, 0, 2, 4], [2, 4, 5, 3, 1, 0], [1, 2, 0, 5, 4], [1, 5, 4, 2, 0, 3], [4, 1], [1, 2, 4, 5], [1, 2], [4, 1, 0, 2, 3, 5], [2, 1, 4, 5, 0], [5, 4, 1], [4, 1, 2, 0], [2, 1, 4], [4, 1, 5, 3, 2, 0]]
%% 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[-1][-1]=len(configurations)
print(heatmap)
```
%%%% Output: stream
[[-1 5 1 4 2 4 1]
[ 4 -1 1 5 4 2 4]
[ 4 1 -1 0 1 1 1]
[ 1 3 2 -1 1 2 4]
[ 4 2 4 1 -1 1 1]
[ 2 1 1 4 1 -1 1]
[ 4 2 5 4 2 4 6]]
%% 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
max_per_line = 3
for i in range(len(results)):
results_str.append(list())
count = len(results[i])
results_aux = results[i]
if count > max_counts:
count = max_counts
results_aux = results[i][:count]
remainder = count%max_per_line
if count <= max_per_line:
aux_str = str(results_aux).replace('[','').replace(']','')
results_str[i].append(aux_str)
else:
if remainder == 0:
index = count//2
else:
index = count - ((remainder-1)*max_per_line + 1)
aux_str = str(results_aux[:index]).replace('[','').replace(']','')
results_str[i].append(aux_str)
aux_str = str(results_aux[index:]).replace('[','').replace(']','')
results_str[i].append(aux_str)
#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("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 - AllS (0)', 'Invalid (1)','Baseline - P2PS (2)','Invalid (3)',
# 'Merge -AllS (4)','Invalid (5)','Merge -P2PS (6)','Invalid(7)',
# 'Baseline - AllA (8)', 'Baseline - AllT (9)','Baseline - P2PA (10)','Baseline - P2PT (11)',
# 'Merge -AllA (12)','Merge - AllT (13)','Merge -P2PA (14)','Merge - P2PT (15)']
colorbar=f.colorbar(im, ax=ax)
tick_bar = []
for i in range(len(configurations)):
tick_bar.append(0.35 + i*0.95) #TE
#colorbar.set_ticks(tick_bar)
#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
[[-0.00982064 -0.0113957 -0.01319036 ... -0.01522953 -0.01319036
-0.0113957 ]
[-0.0113957 -0.01322338 -0.01530587 ... -0.01767209 -0.01530587
-0.01322338]
[-0.01319036 -0.01530587 -0.01771632 ... -0.02045518 -0.01771632
-0.01530587]
...
[-0.01200234 -0.01414685 -0.01660867 ... 0.02918791 0.03019517
0.03085725]
[-0.01097235 -0.01288301 -0.01507265 ... 0.01583738 0.01709512
0.01804782]
[-0.00988645 -0.01157475 -0.01350698 ... 0.00702321 0.0083816
0.00947216]]
/tmp/ipykernel_4327/287705176.py:38: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_xticklabels(['']+processes, fontsize=36)
/tmp/ipykernel_4327/287705176.py:39: UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_yticklabels(['']+processes, fontsize=36)
%%%% Output: display_data
[Hidden Image Output]
%% Cell type:raw id: tags:
[[0, (0, 0), (0, 0), (1, 1)], [0, (0, 0), (0, 0), (1, 2)], [0, (0, 0), (0, 1), (1, 1)], [0, (0, 0), (0, 1), (1, 2)], [0, (0, 1), (0, 0), (1, 1)], [0, (0, 1), (0, 0), (1, 2)], [0, (0, 1), (0, 1), (1, 1)], [0, (0, 1), (0, 1), (1, 2)], [96.6, (0, 0), (0, 0), (1, 1)], [96.6, (0, 0), (0, 0), (1, 2)], [96.6, (0, 0), (0, 1), (1, 1)], [96.6, (0, 0), (0, 1), (1, 2)], [96.6, (0, 1), (0, 0), (1, 1)], [96.6, (0, 1), (0, 0), (1, 2)], [96.6, (0, 1), (0, 1), (1, 1)], [96.6, (0, 1), (0, 1), (1, 2)]]
%% Cell type:raw id: tags:
================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
%% Cell type:code id: tags:
``` python
print(X[1])
a=[0,1,2,3,4]
b=a
count=3
a[2]=100
print(a)
print(b)
```
%%%% Output: stream
[-3.0000000e+01 -2.9500000e+01 -2.9000000e+01 -2.8500000e+01
-2.8000000e+01 -2.7500000e+01 -2.7000000e+01 -2.6500000e+01
-2.6000000e+01 -2.5500000e+01 -2.5000000e+01 -2.4500000e+01
-2.4000000e+01 -2.3500000e+01 -2.3000000e+01 -2.2500000e+01
-2.2000000e+01 -2.1500000e+01 -2.1000000e+01 -2.0500000e+01
-2.0000000e+01 -1.9500000e+01 -1.9000000e+01 -1.8500000e+01
-1.8000000e+01 -1.7500000e+01 -1.7000000e+01 -1.6500000e+01
-1.6000000e+01 -1.5500000e+01 -1.5000000e+01 -1.4500000e+01
-1.4000000e+01 -1.3500000e+01 -1.3000000e+01 -1.2500000e+01
-1.2000000e+01 -1.1500000e+01 -1.1000000e+01 -1.0500000e+01
-1.0000000e+01 -9.5000000e+00 -9.0000000e+00 -8.5000000e+00
-8.0000000e+00 -7.5000000e+00 -7.0000000e+00 -6.5000000e+00
-6.0000000e+00 -5.5000000e+00 -5.0000000e+00 -4.5000000e+00
-4.0000000e+00 -3.5000000e+00 -3.0000000e+00 -2.5000000e+00
-2.0000000e+00 -1.5000000e+00 -1.0000000e+00 -5.0000000e-01
-1.0658141e-13 5.0000000e-01 1.0000000e+00 1.5000000e+00
2.0000000e+00 2.5000000e+00 3.0000000e+00 3.5000000e+00
4.0000000e+00 4.5000000e+00 5.0000000e+00 5.5000000e+00
6.0000000e+00 6.5000000e+00 7.0000000e+00 7.5000000e+00
8.0000000e+00 8.5000000e+00 9.0000000e+00 9.5000000e+00
1.0000000e+01 1.0500000e+01 1.1000000e+01 1.1500000e+01
1.2000000e+01 1.2500000e+01 1.3000000e+01 1.3500000e+01
1.4000000e+01 1.4500000e+01 1.5000000e+01 1.5500000e+01
1.6000000e+01 1.6500000e+01 1.7000000e+01 1.7500000e+01
1.8000000e+01 1.8500000e+01 1.9000000e+01 1.9500000e+01
2.0000000e+01 2.0500000e+01 2.1000000e+01 2.1500000e+01
2.2000000e+01 2.2500000e+01 2.3000000e+01 2.3500000e+01
2.4000000e+01 2.4500000e+01 2.5000000e+01 2.5500000e+01
2.6000000e+01 2.6500000e+01 2.7000000e+01 2.7500000e+01
2.8000000e+01 2.8500000e+01 2.9000000e+01 2.9500000e+01]
[0, 1, 100, 3, 4]
[0, 1, 100, 3, 4]
%% Cell type:code id: tags:
``` python
fig, ax = plt.subplots(1, 1, subplot_kw={'projection': '3d'})
# Get the test data
#X, Y, Z = axes3d.get_test_data(0.05)
aux = grouped_aggG.loc[u_sols[0],'T_total']
Z = [None] * len(processes)
X, Y = np.meshgrid(processes, processes)
removed_index = 0
for i in range(len(processes)):
Z[i] = [0] * len(processes)
for j in range(len(processes)):
if i!=j:
real_i = i - removed_index
real_j = j - removed_index
Z[i][j] = aux.values[real_i*len(processes)+real_j]
else:
Z[i][j] = 0
removed_index += 1
Z = np.array(Z)
ax.plot_wireframe(X, Y, Z, rstride=20, cstride=10)
ax.set_proj_type('ortho') # FOV = 0 deg
ax.set_title("'ortho'\nfocal_length = ∞", fontsize=10)
plt.show()
```
%%%% 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