diff --git a/0_mojitos.py b/0_mojitos.py new file mode 100644 index 0000000000000000000000000000000000000000..4eb48cae11fda63965e5b07b2c9d02a52d7ebd2e --- /dev/null +++ b/0_mojitos.py @@ -0,0 +1,91 @@ +# python3 0_mojitos.py --dir "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1" + +import os +import json +import pandas as pd +from pathlib import Path +import glob +import argparse + +# Command-line argument parsing +parser = argparse.ArgumentParser(description="Specify log directory for processing Mojitos files") +parser.add_argument('--dir', required=True, help="Path to the directory containing log files") +args = parser.parse_args() + +# Directory from command line argument +processing_dir = args.dir + +# Correct the directory name if necessary +config_pattern = os.path.join(processing_dir, "Expetator", "config_instance_*.json") +config_files = glob.glob(config_pattern) +print(config_files) + +if config_files: + meta_file = config_files[0] # Since there is only one, take the first match + print("Found config file:", meta_file) +else: + print("No config file found") + exit(1) + +with open(meta_file, "r") as file: + metadata = json.load(file) + +server_ip = metadata["server"]["ip"] +clients_info = metadata["clients"] +clients_ips = {client["ip"]: client["name"] for client in clients_info} + +# Function to find the single "_mojitos" directory +def find_single_mojitos_dir(folder_path): + for root, dirs, files in os.walk(folder_path): + for dir_name in dirs: + if dir_name.endswith("mojitos"): + return os.path.join(root, dir_name) + return None # Return None if no mojitos folder is found + +# Find the single "_mojitos" directory +mojitos_dir = find_single_mojitos_dir(processing_dir) + +if mojitos_dir is None: + print("No mojitos directory found") + exit(1) + +# Defined pattern to find all files in the mojitos directory +mojitos_file_pattern = os.path.join(mojitos_dir, "*-*.grid5000.fr_flower_*") +mojitos_file_list = glob.glob(mojitos_file_pattern) + +# Dictionary to store all the individual frames +mojitos_individual_frames = {} +# Create output directory for processed files +output_dir = os.path.join(mojitos_dir, "processed_files") +os.makedirs(output_dir, exist_ok=True) + +for file_path in sorted(mojitos_file_list): + + filename = os.path.basename(file_path) + identifier, last_number = filename.split("_flower_") + identifier = identifier.split('.')[0] + last_number = last_number.strip() + + df = pd.read_csv(file_path, sep="\s+") + + energy_columns = [col for col in df.columns if col.startswith("package") or col.startswith("dram")] + + if energy_columns: + df["sum_package_dram_idle"] = df[energy_columns].sum(axis=1) # Sum of package, dram and idle energy + + mojitos_individual_frames[filename] = df + + output_file = os.path.join(output_dir, f"processed_{filename}") + df.to_csv(output_file, index=False) + +# # Merging all dataframes into one +# merged_df = pd.concat(mojitos_individual_frames.values(), ignore_index=True) + +# # Save the merged dataframe into a CSV file +# test_camp = os.path.basename(os.path.dirname(processing_dir)) +# test_case = os.path.basename(processing_dir) + +# output_merged_file = os.path.join(output_dir, f"merged_mojitos_{test_camp}_{test_case}.csv") +# merged_df.to_csv(output_merged_file, index=False) + +# print(f"Merged file saved to: {output_merged_file}") \ No newline at end of file diff --git a/1_mojitos_ana.py b/1_mojitos_ana.py new file mode 100644 index 0000000000000000000000000000000000000000..31f7dfcbf3661532007e0c57366b59ff4eb250f7 --- /dev/null +++ b/1_mojitos_ana.py @@ -0,0 +1,143 @@ +# cmd: python3 1_mojitos_ana.py --dir "Log/Flower_TetHoliday/Flower_instance_fedAvg_cifar10" +# output: merged_mojitos_{test_camp}_{test_case}.csv -> merged_mojitos_Flower_TetHoliday_Flower_instance_fedAvg_cifar10.csv + +import os +import json +import pandas as pd +from pathlib import Path +import glob +import argparse + +current_dir = os.getcwd() +parent_dir = os.path.abspath(os.path.join(current_dir)) + +parser = argparse.ArgumentParser(description="Specify log directory with parsed values") +parser.add_argument('--dir', required=True, help="Value of log directory") +args = parser.parse_args() + +processing_str = args.dir +processing_dir = os.path.join(parent_dir, processing_str) +test_camp = os.path.basename(os.path.dirname(processing_dir)) +test_case = os.path.basename(processing_dir) + +config_pattern = os.path.join(processing_dir, "Expetator", "config_instance*.json") +config_files = glob.glob(config_pattern) + +if config_files: + meta_file = config_files[0] # Since there is only one, take the first match + print("Found config file:", meta_file) +else: + print("No config file found") + +with open(meta_file,"r") as file: + metadata = json.load(file) + +server_ip = metadata["server"]["ip"] +clients_info = metadata["clients"] +clients_ips = {client["ip"]: client["name"] for client in clients_info} + + +# a_dataset = metadata["dataset"] +# a_num_round = metadata["round"] +# a_strategy = metadata["strategy"] +# a_timestamp = metadata["timestamp"] + +# Function to find the single "_mojitos" directory +def find_single_mojitos_dir(folder_path): + for root, dirs, files in os.walk(folder_path): + for dir_name in dirs: + if dir_name.endswith("mojitos"): + return os.path.join(root, dir_name) + return None # Return None if no mojitos folder is found + +# Find the single mojitos in processed directory +mojitos_dir = find_single_mojitos_dir(processing_dir) +mojitos_dir_p = os.path.join(mojitos_dir, "processed_files") +print("Found mojitos directory:", mojitos_dir_p) +# File pattern to match all relevant files +mojitos_file_pattern = os.path.join(mojitos_dir_p, "*-*.grid5000.fr_flower_*") +mojitos_file_list = glob.glob(mojitos_file_pattern) +print("Found", len(mojitos_file_list), "files") + +# Dictionary to store individual DataFrames +mojitos_individual_frames = {} +# Initialize a list to collect all DataFrames for the single, merged output +mojitos_df_list = [] + +# Process each file +# Process each file +for file_path in sorted(mojitos_file_list): + # Extract 'gros-xx' and the final numeric identifier from the filename + filename = os.path.basename(file_path) + identifier, last_number = filename.split("_flower_") + identifier = identifier.split('.')[0] + identifier = identifier.split('_')[1] + last_number = last_number.strip() + + df = pd.read_csv(file_path, sep=",", engine='python') + + # List of columns for energy consumption + energy_columns = [col for col in df.columns if col.startswith("package") or col.startswith("dram") or col.startswith("idle")] + + # Check if necessary columns exist + if energy_columns: + # Calculate sum of package, dram, and idle at each timestamp + df["sum_package_dram_idle"] = df[energy_columns].sum(axis=1) + + # Compute statistics on the sum column + sum_stats = { + "median_sum_package_dram_idle": df["sum_package_dram_idle"].median(), + "mean_sum_package_dram_idle": df["sum_package_dram_idle"].mean(), + "std_sum_package_dram_idle": df["sum_package_dram_idle"].std(), + "min_sum_package_dram_idle": df["sum_package_dram_idle"].min(), + "max_sum_package_dram_idle": df["sum_package_dram_idle"].max(), + "q1_sum_package_dram_idle": df["sum_package_dram_idle"].quantile(0.25), + "q3_sum_package_dram_idle": df["sum_package_dram_idle"].quantile(0.75), + "sum_package_dram_idle": df["sum_package_dram_idle"].sum() + } + else: + sum_stats = {} # No data available + + # Calculate statistics for specific columns + columns_to_analyze = ["br0:rxp", "br0:rxb", "br0:txp", "br0:txb"] + df_list = [] + + for column in columns_to_analyze: + if column in df.columns: + stats = { + f"median_{column}": df[column].median(), + f"mean_{column}": df[column].mean(), + f"std_{column}": df[column].std(), + } + df_list.append(pd.DataFrame([stats])) + + # Convert sum stats to DataFrame + df_list.append(pd.DataFrame([sum_stats])) + + # Concatenate all DataFrames for the current file + concatenated_df = pd.concat(df_list, axis=1) + + # Count number of data points + concatenated_df["n_data"] = df.shape[0] + concatenated_df["time (s)"] = df['#timestamp'].max() - df['#timestamp'].min() + concatenated_df["source"] = identifier + concatenated_df["file_number"] = last_number + + # Append to final DataFrame list + mojitos_df_list.append(concatenated_df) + +# Combine all DataFrames +mojitos_merged_df = pd.concat(mojitos_df_list, ignore_index=True) +print(mojitos_merged_df) + +# Save the single, merged DataFrame to a CSV file +# Construct the full path +mojitos_output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_1") +mojitos_output_file = os.path.join(mojitos_output_dir, f"merged_mojitos_{test_camp}_{test_case}.csv") + + +# Ensure the directory exists +os.makedirs(mojitos_output_dir, exist_ok=True) + +mojitos_merged_df.to_csv(mojitos_output_file, index=False) +print(f"Combined summary saved to {mojitos_output_file}") diff --git a/2_power_ana.py b/2_power_ana.py new file mode 100644 index 0000000000000000000000000000000000000000..08bc4ab8dc522556bfe86c1914d2845ba07b8020 --- /dev/null +++ b/2_power_ana.py @@ -0,0 +1,126 @@ +# cmd python3 2_power_ana.py --dir "Log/Flower_TetHoliday/Flower_instance_fedAvg_cifar10" +# output: merged_power_{test_camp}_{test_case}.csv -> merged_power_Flower_TetHoliday_Flower_instance_fedAvg_cifar10.csv + +import os +import json +import pandas as pd +import glob +import argparse +from datetime import datetime + +# Set up directories and parse arguments +current_dir = os.getcwd() +parent_dir = os.path.abspath(os.path.join(current_dir)) +print(parent_dir) +parser = argparse.ArgumentParser(description="Specify log directory with parsed values") +parser.add_argument('--dir', required=True, help="Value of log directory") +args = parser.parse_args() + +processing_str = args.dir +processing_dir = os.path.join(parent_dir, processing_str) +test_camp = os.path.basename(os.path.dirname(processing_dir)) +test_case = os.path.basename(processing_dir) + +config_pattern = os.path.join(processing_dir, "Expetator", "config_instance*.json") +config_files = glob.glob(config_pattern) + +if config_files: + meta_file = config_files[0] # Since there is only one, take the first match + print("Found config file:", meta_file) +else: + print("No config file found") + +# Load metadata to identify server and clients +with open(meta_file, "r") as file: + metadata = json.load(file) + +server_ip = metadata["server"]["ip"] +clients_info = metadata["clients"] +clients_ips = {client["ip"]: client["name"] for client in clients_info} + + +# Function to find the single "_power" directory +def find_single_power_dir(folder_path): + for root, dirs, files in os.walk(folder_path): + for dir_name in dirs: + if dir_name.endswith("power"): + return os.path.join(root, dir_name) + return None + +# Find the power directory +power_dir = find_single_power_dir(processing_dir) + +# Pattern to match all relevant files in the new directory +power_file_pattern = os.path.join(power_dir, "*-*.grid5000.fr_flower_*") +power_file_list = glob.glob(power_file_pattern) + +# List to collect all DataFrames for the single, merged output +power_df_list = [] + +# Process each file +for file_path in sorted(power_file_list): + filename = os.path.basename(file_path) + identifier, last_number = filename.split("_flower_") + last_number = last_number.strip() + + # Load data from the JSON power file + with open(file_path, 'r') as f: + data = json.load(f) + + # List to store DataFrames for each device + df_list = [] + + # Iterate over each entry in the data list + for entry in data: + # Assume entry has a structure like {"device": "hostname", "timestamps": [...], "power": [...]} + device = entry[0] # Assuming entry[0] is "device" identifier + timestamps = entry[1] # Assuming entry[1] is list of timestamps + power_values = entry[2] # Assuming entry[2] is list of power values + + # Create a DataFrame for the current device + df = pd.DataFrame({ + '#timestamp': timestamps, + 'power': power_values + }) + + # Calculate processing time for the device + processing_time = max(timestamps) - min(timestamps) + + # Calculate statistics for the power column + stats = { + "median_power": df['power'].median(), + "mean_power": df['power'].mean(), + "std_power": df['power'].std(), + "min_power": df["power"].min(), + "max_power": df["power"].max(), + "q1_power": df["power"].quantile(0.25), + "q3_power": df["power"].quantile(0.75), + "n_data": len(df), + "source": device, + "time (s)": processing_time, + "file_number": last_number + } + + # Append the stats to the list for the device + df_list.append(pd.DataFrame([stats])) + + # Concatenate all device DataFrames into a single DataFrame for this file + file_df = pd.concat(df_list, ignore_index=True) + + # Append to the list for the merged DataFrame + power_df_list.append(file_df) + +# Combine all DataFrames into a single DataFrame +power_merged_df = pd.concat(power_df_list, ignore_index=True) + +print(power_merged_df) + +# Construct the full path +power_output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_1") +power_output_file = os.path.join(power_output_dir, f"merged_power_{test_camp}_{test_case}.csv") + +# Ensure the directory exists +os.makedirs(power_output_dir, exist_ok=True) + +power_merged_df.to_csv(power_output_file, index=False) +print(f"Combined summary saved to {power_output_file}") diff --git a/3_mean_energy.py b/3_mean_energy.py new file mode 100644 index 0000000000000000000000000000000000000000..ae707156dfccf731ed3c40ca4c25c7b9bfc76519 --- /dev/null +++ b/3_mean_energy.py @@ -0,0 +1,77 @@ +# cmd python3 3_mean_energy.py --power Data_analysis/Output_level_1/merged_power_Flower_TetHoliday_Flower_instance_fedAvg_cifar10.csv --mojitos Data_analysis/Output_level_1/merged_mojitos_Flower_TetHoliday_Flower_instance_fedAvg_cifar10.csv +# output: meam_energy_{instance}.csv -> mean_energy_Flower_TetHoliday_Flower_instance_fedAvg_cifar10.csv + +import pandas as pd +import os +import argparse +import numpy as np + +# Set up directories and parse arguments +current_dir = os.getcwd() +parent_dir = os.path.abspath(os.path.join(current_dir)) + +parser = argparse.ArgumentParser(description="Specify files with parsed values") +parser.add_argument('--power', required=True, help="Value of power file") +parser.add_argument('--mojitos', required=True, help="Value of mojitos file") +args = parser.parse_args() + +# Load the CSV files into DataFrames +power_file = os.path.join(parent_dir, args.power) +mojitos_file = os.path.join(parent_dir, args.mojitos) +basename = os.path.basename(power_file) +extracted = os.path.splitext(basename)[0].replace("merged_power_", "") + +df_power = pd.read_csv(power_file) +df_mojitos = pd.read_csv(mojitos_file) + +# Group by 'file_number' and calculate the mean of the respective columns +mean_power_by_file_number = df_power.groupby("file_number")["mean_power"].mean() +mean_mojitos_by_file_number = df_mojitos.groupby("file_number")["mean_sum_package_dram_idle"].mean() + +# std by file_number +def combined_std(df_group, std_col, n_col): + num = np.sum((df_group[n_col] - 1) * df_group[std_col]**2) + denom = np.sum(df_group[n_col] - 1) + return np.sqrt(num / denom) + +# combined std by file_number +std_power_by_file = df_power.groupby("file_number").apply(lambda x: combined_std(x, "std_power", "n_data"), include_groups=False) +std_mojitos_by_file = df_mojitos.groupby("file_number").apply(lambda x: combined_std(x, "std_sum_package_dram_idle", "n_data"), include_groups=False) + +# # Combine the two Series into a single DataFrame +# combined_df = pd.DataFrame({ +# "mean_power": mean_power_by_file_number, +# "mean_mojitos": mean_mojitos_by_file_number +# }).reset_index() + +# dataframe +combined_df = pd.DataFrame({ + "file_number": mean_power_by_file_number.index, + "mean_power": mean_power_by_file_number.values, + "mean_mojitos": mean_mojitos_by_file_number.values, + "std_power_combined": std_power_by_file.values, + "std_mojitos_combined": std_mojitos_by_file.values, + # "min_power": df_power.groupby("file_number")["min_power"].min().values, + # "max_power": df_power.groupby("file_number")["max_power"].max().values, + # "min_mojitos": df_mojitos.groupby("file_number")["min_package_dram_idle"].min().values, + # "max_mojitos": df_mojitos.groupby("file_number")["max_package_dram_idle"].max().values, + "sum_mojitos": df_mojitos.groupby("file_number")["sum_package_dram_idle"].sum().values, + "n_data_mojitos": df_power.groupby("file_number")["n_data"].sum().values, + "n_data_power": df_mojitos.groupby("file_number")["n_data"].sum().values +}) + +# Print the combined DataFrame +print(combined_df) + +# # Construct the full path +# E_output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_2") +# E_output_file = os.path.join(E_output_dir, "mean_E_fedAvg2Clients.csv") + +E_output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_2") +E_output_file = os.path.join(E_output_dir, f"mean_energy_{extracted}.csv") + +# Ensure the directory exists +os.makedirs(E_output_dir, exist_ok=True) + +combined_df.to_csv(E_output_file, index=False) +print(f"Combined summary saved to {E_output_file}") \ No newline at end of file diff --git a/4_flower_ana.py b/4_flower_ana.py new file mode 100644 index 0000000000000000000000000000000000000000..6278178f4a53578d7c5b1183cd07ed0c24e61308 --- /dev/null +++ b/4_flower_ana.py @@ -0,0 +1,111 @@ +# cmd python3 4_flower_ana.py --dir +# output: flower_<pattern>_accuracy_time.csv -> flower_fedAvg_accuracy_time.csv + +# import os, glob +# import pandas as pd +# import argparse + +# parser = argparse.ArgumentParser(description="Specify pattern with parsed values") +# parser.add_argument('--pattern', required=True, help="String of pattern") +# parser.add_argument('--dir', required=False, help="Path to the directory containing log files") +# args = parser.parse_args() + +# current_dir = os.getcwd() +# parent_dir = os.path.abspath(os.path.join(current_dir)) +# flower_dir = os.path.join(parent_dir, "Log_autres") + +# # flower_dir = "/home/hdomai/Documents/RepoLab/Data/Log_autres" +# # File pattern to match all relevant files +# flower_file_pattern = os.path.join(flower_dir, f"*_*_{args.pattern}_*") +# flower_file_list = glob.glob(flower_file_pattern) + +# # Initialize an empty list to store the data +# data_list = [] + +# # Loop over all files +# for file in flower_file_list: +# with open(file, "r") as f: +# data = pd.read_csv(f) +# df = pd.DataFrame(data) +# max_round = df["round"].max() +# accuracy = df.loc[df["round"] == max_round, "accuracy"].values[0] +# # can replace max_round with the specific round number to get the accuracy at that round +# #time = df.loc[df["round"] == max_round, "time"].values[0] +# time = df["time"].sum() +# # Append the data to the list +# data_list.append({"filepath": file, "accuracy": accuracy, "time": time}) + +# # Create a DataFrame from the list +# flower_data = pd.DataFrame(data_list) + +# output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_2") +# output_file = os.path.join(output_dir, f"flower_{args.pattern}_accuracy_time.csv") + +# # Ensure the directory exists +# os.makedirs(output_dir, exist_ok=True) + +# # Save the DataFrame to a CSV file +# flower_data.to_csv(output_file, index=False) +# print(f"Data saved to {output_file}") + +import os +import glob +import pandas as pd +import argparse + +parser = argparse.ArgumentParser(description="Specify instance directory and pattern") +parser.add_argument('--dir', required=True, help="Path to the instance directory") +args = parser.parse_args() + +instance_dir = args.dir # Instance directory (vd: Flower_instance_fedAvg2Clients_cifar10_epoch1) + +filename = os.path.basename(instance_dir) +identifier = filename.split("_instance_")[1] + +# Set up directories and parse arguments +current_dir = os.getcwd() +parent_dir = os.path.abspath(os.path.join(current_dir)) + +# Lấy danh sách tất cả thư mục Flwr_... bên trong instance +flwr_dirs = [os.path.join(instance_dir, d) for d in os.listdir(instance_dir) if d.startswith("Flwr") and os.path.isdir(os.path.join(instance_dir, d))] + +# Tìm file training_results_... trong từng thư mục Flwr_ +flower_file_list = [] +for flwr_dir in flwr_dirs: + flower_file_pattern = os.path.join(flwr_dir, "training_results_*") + flower_file_list.extend(glob.glob(flower_file_pattern)) + +# Kiểm tra có file nào không +if not flower_file_list: + print(f" Không tìm thấy file training_results_... trong {instance_dir}") + exit() + +# Initialize list to store data +data_list = [] + +# Process each file +for file in flower_file_list: + df = pd.read_csv(file) + max_round = df["round"].max() + accuracy = df.loc[df["round"] == max_round, "accuracy"].values[0] + max_accuracy = df["accuracy"].max() + round_max_accuracy = df.loc[df["accuracy"] == max_accuracy, "round"].values[0] + total_time = df["time"].sum() + + # Append data + data_list.append({"filepath": file, "accuracy": accuracy, "max_acc": max_accuracy, "in_round": round_max_accuracy, "time": total_time}) + +# Create DataFrame +flower_data = pd.DataFrame(data_list) + +# Lưu output + +output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_2") +output_file = os.path.join(output_dir, f"flower_{identifier}_accuracy_time.csv") + +# Ensure the directory exists +os.makedirs(output_dir, exist_ok=True) + +# Save the DataFrame to a CSV file +flower_data.to_csv(output_file, index=False) +print(f"Data saved to {output_file}") diff --git a/5_combine_energy_fl.py b/5_combine_energy_fl.py new file mode 100644 index 0000000000000000000000000000000000000000..e3b62e02cb10c2b4e36ad10e83f5aaa97537bb10 --- /dev/null +++ b/5_combine_energy_fl.py @@ -0,0 +1,86 @@ +# cmd python3 5_combine_energy_fl.py -a Data_analysis/Output_level_2/flower_fedAvg2Clients_accuracy_time.csv -e Data_analysis/Output_level_2/mean_energy_Flower_TetHoliday_Flower_instance_fedAvg2Clients_cifar10.csv -m Log/Flower_TetHoliday/Flower_instance_fedAvg2Clients_cifar10/Expetator_gros-24.nancy.grid5000.fr_1738035839 +# output: combine_{extracted_name}.csv -> combine_Flower_TetHoliday_Flower_instance_fedAvg2Clients_cifar10.csv + +import pandas as pd +import os +from datetime import datetime +import argparse + +parser = argparse.ArgumentParser(description="Specify pattern with parsed values") +parser.add_argument('-a','--accuracy', required=True, help="Accuracy file path") +parser.add_argument('-e','--energy', required=True, help="Energy file path") +parser.add_argument('-m','--meta', required=True, help="Meta data file path") +args = parser.parse_args() + +current_dir = os.getcwd() +parent_dir = os.path.abspath(os.path.join(current_dir)) + +# Load data +accuracies_file = os.path.abspath(os.path.join(current_dir, args.accuracy)) +energy_file = os.path.abspath(os.path.join(current_dir, args.energy)) +exp_file = os.path.abspath(os.path.join(current_dir, args.meta)) +# accuracies_file = "/home/hdomai/Documents/RepoLab/Data/Data_analysis/Output_level_2/fedAvg_accuracies.csv" +# energy_file = "/home/hdomai/Documents/RepoLab/Data/Data_analysis/Output_level_2/mean_E_fedAvg_file_number.csv" +# exp_file = "/home/hdomai/Documents/RepoLab/Data/Log/Flower_TetHoliday/Flower_instance_fedAvg_cifar10/Expetator_gros-24.nancy.grid5000.fr_1738029020" + +# Get the name of output file +basename = os.path.basename(energy_file) +extracted = os.path.splitext(basename)[0].replace("mean_energy_", "") + +df_acc = pd.read_csv(accuracies_file) +df_energy = pd.read_csv(energy_file) +df_exp = pd.read_csv(exp_file, sep='\s+') + +# # Print columns to debug +# print("Columns in df_exp:", df_exp.columns) +# exit() +# Step 1: Extract timestamp from file_path in accuracies +def extract_timestamp(file_path): + date_str = file_path.split("_")[-2] + "_" + file_path.split("_")[-1].split(".")[0] + return int(datetime.strptime(date_str, "%Y%m%d_%H%M%S").timestamp()) + +df_acc['timestamp'] = df_acc['filepath'].apply(extract_timestamp) + +# Step 2: Find the closest file_number from energy for each timestamp +df_energy['file_number'] = df_energy['file_number'].astype(int) + +def find_closest_file_number(acc_timestamp, energy_timestamps): + closest_timestamp = min(energy_timestamps, key=lambda x: abs(x - acc_timestamp)) + return closest_timestamp + +df_acc['mapped_file_number'] = df_acc['timestamp'].apply( + lambda x: find_closest_file_number(x, df_energy['file_number'].values) +) + +# Step 3: Combine accuracies and energy data +df_combined = pd.merge( + df_acc, + df_energy, + left_on="mapped_file_number", + right_on="file_number", + how="inner" +) + +# Step 4: Add the fmax column by merging with file mojitos records +df_combined = pd.merge( + df_combined, + df_exp[["startTime", "fmax"]], + left_on="file_number", + right_on="startTime", + how="left" +) + +df_combined = df_combined[['file_number','fmax', 'accuracy','max_acc', 'in_round', 'time', 'mean_power', 'mean_mojitos', 'std_power_combined', 'std_mojitos_combined', 'sum_mojitos', 'n_data_mojitos', 'n_data_power', 'startTime','filepath',]] + + +print(df_combined) + +# Construct the full path +output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_3") +output_file = os.path.join(output_dir, f"combine_{extracted}.csv") + +# Ensure the directory exists +os.makedirs(output_dir, exist_ok=True) + +df_combined.to_csv(output_file, index=False) +print(f"Combined summary saved to {output_file}") diff --git a/6_final.py b/6_final.py new file mode 100644 index 0000000000000000000000000000000000000000..c4c6c35291019ddec76531a08ce9c89e4724db6f --- /dev/null +++ b/6_final.py @@ -0,0 +1,68 @@ +# cmd: python3 6_final.py -f Data_analysis/Output_level_3/combine_Flower_TetHoliday_Flower_instance_fedAvg_cifar10.csv Data_analysis/Output_level_3/combine_Flower_TetHoliday_Flower_instance_fedAvg2Clients_cifar10.csv +# output: /home/hdomai/Documents/RepoLab/Data/Data_analysis/Output_level_4/combine_Flower_TetHoliday_campaign.csv + + +import pandas as pd +import plotly.graph_objects as go +from plotly.subplots import make_subplots +import plotly.express as px +import os +import argparse + +current_dir = os.getcwd() +parent_dir = os.path.abspath(os.path.join(current_dir)) +''' +parser = argparse.ArgumentParser(description="Specify pattern with parsed values") +parser.add_argument('-f1','--file1', required=True, help="1st file path") +parser.add_argument('-f2','--file2', required=True, help="2nd file path") +args = parser.parse_args() + +file_path_1 = args.file1 +file_path_2 = args.file2 + +# Load the data +df_2clients = pd.read_csv(file_path_1) +df_fedavg = pd.read_csv(file_path_2) + +# Add a source column to distinguish between fedAvg and fedAvg2Clients +df_2clients['source'] = 'fedAvg2Clients' +df_fedavg['source'] = 'fedAvg' + +# Combine the two dataframes +df = pd.concat([df_2clients, df_fedavg]) +print(df) + +''' + +parser = argparse.ArgumentParser(description="Specify pattern with parsed values") +parser.add_argument('-f', '--files', nargs='+', required=True, help="List of file paths") +parser.add_argument('-c', '--campaign', required=True, help="Text of campaign") +args = parser.parse_args() + +file_paths = args.files +campaign = args.campaign + +# Initialize an empty list to hold dataframes +dataframes = [] + +# Loop through each file path, load the data, and add the source column +for i, file_path in enumerate(file_paths): + df = pd.read_csv(file_path) + + indentifier = os.path.basename(file_path).split("_instance_")[1].split(".csv")[0] + df["instance"] = indentifier + dataframes.append(df) + +# Combine all dataframes +combined_df = pd.concat(dataframes) +print(combined_df) + +# Construct the full path +output_dir = os.path.join(parent_dir, "Data_analysis", "Output_level_4") +output_file = os.path.join(output_dir, f"combine_{campaign}.csv") + +# Ensure the directory exists +os.makedirs(output_dir, exist_ok=True) + +combined_df.to_csv(output_file, index=False) +print(f"Combined summary saved to {output_file}") \ No newline at end of file diff --git a/7_PLOT.ipynb b/7_PLOT.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..0e5945bfe0df2f388f171b7a6af8704bc142237f --- /dev/null +++ b/7_PLOT.ipynb @@ -0,0 +1,4133 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import plotly.graph_objects as go\n", + "from plotly.subplots import make_subplots\n", + "import plotly.express as px \n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "file_number", + "rawType": "int64", + "type": "integer" + }, + { + "name": "fmax", + "rawType": "int64", + "type": "integer" + }, + { + "name": "accuracy", + "rawType": "float64", + "type": "float" + }, + { + "name": "max_acc", + "rawType": "float64", + "type": "float" + }, + { + "name": "in_round", + "rawType": "int64", + "type": "integer" + }, + { + "name": "time", + "rawType": "float64", + "type": "float" + }, + { + "name": "mean_power", + "rawType": "float64", + "type": "float" + }, + { + "name": "mean_mojitos", + "rawType": "float64", + "type": "float" + }, + { + "name": "std_power_combined", + "rawType": "float64", + "type": "float" + }, + { + "name": "std_mojitos_combined", + "rawType": "float64", + "type": "float" + }, + { + "name": "sum_mojitos", + "rawType": "int64", + "type": "integer" + }, + { + "name": "n_data_mojitos", + "rawType": "int64", + "type": "integer" + }, + { + "name": "n_data_power", + "rawType": "int64", + "type": "integer" + }, + { + "name": "startTime", + "rawType": "int64", + "type": "integer" + }, + { + "name": "filepath", + "rawType": "object", + "type": "string" + }, + { + "name": "instance", + "rawType": "object", + "type": "string" + } + ], + "conversionMethod": "pd.DataFrame", + "ref": "92a29339-a0e8-44cb-a3d1-87a66beebbb5", + "rows": [ + [ + "0", + "1740648154", + "1200000", + "0.5814999938011169", + "0.5814999938011169", + "15", + "1392.2722568511963", + "105.38996080016084", + "5060513.98086803", + "5.068565416268908", + "604219.3886861373", + "287330492345", + "5688", + "56779", + "1740648154", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_102234/training_results_fedAvg_15_20250227_102251.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "1", + "1740651708", + "2300000", + "0.567799985408783", + "0.567799985408783", + "15", + "864.9643280506134", + "123.40182417484618", + "6929047.658940774", + "14.541948786273547", + "1655680.2954797468", + "243348153782", + "3520", + "35120", + "1740651708", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_112148/training_results_fedAvg_15_20250227_112155.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "2", + "1740650725", + "2000000", + "0.5465999841690063", + "0.5465999841690063", + "15", + "953.1918060779572", + "117.10082970209118", + "6265128.5890256055", + "11.56021433950976", + "1349006.1256989143", + "242295652380", + "3876", + "38674", + "1740650725", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_110525/training_results_fedAvg_15_20250227_110533.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "3", + "1740654039", + "1600000", + "0.5552999973297119", + "0.5552999973297119", + "15", + "1096.626095533371", + "111.41730608342914", + "5721363.712901507", + "6.475912020216462", + "758281.9840159224", + "254705838906", + "4464", + "44518", + "1740654039", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_120039/training_results_fedAvg_15_20250227_120049.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "4", + "1740655170", + "2000000", + "0.5627999901771545", + "0.5627999901771545", + "15", + "957.5192320346832", + "117.07391332073108", + "6283479.824282484", + "11.5929868497731", + "1346304.3352809658", + "244509911021", + "3900", + "38913", + "1740655170", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_121930/training_results_fedAvg_15_20250227_121939.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "5", + "1740652602", + "1200000", + "0.5332000255584717", + "0.5449000000953674", + "13", + "1398.0218079090118", + "105.02145278586704", + "5047958.87025023", + "4.968871878461256", + "605649.6912841498", + "286490112838", + "5688", + "56754", + "1740652602", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_113643/training_results_fedAvg_15_20250227_113655.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "6", + "1740656160", + "2300000", + "0.4330999851226806", + "0.5604000091552734", + "14", + "827.0279178619385", + "126.01207415770152", + "7192341.455179865", + "10.603284146185189", + "1224443.583747428", + "241814848191", + "3368", + "33621", + "1740656160", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_123600/training_results_fedAvg_15_20250227_123607.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "7", + "1740649591", + "1600000", + "0.4392000138759613", + "0.5440999865531921", + "14", + "1100.0017387866974", + "111.54505112392268", + "5706891.389373671", + "6.59917219430932", + "775390.6730767189", + "254863409963", + "4476", + "44659", + "1740649591", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Flwr_20250227_104631/training_results_fedAvg_15_20250227_104641.csv", + "fedAvg_cifar10_epoch1" + ], + [ + "8", + "1740613326", + "2300000", + "0.6534000039100647", + "0.6611999869346619", + "14", + "1447.2822539806366", + "127.82648993316536", + "7418295.734983884", + "8.68510169758422", + "990531.0034409312", + "433077049864", + "5844", + "58379", + "1740613326", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250227_004206/training_results_fedAvg_15_20250227_004213.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "9", + "1740599436", + "1200000", + "0.6629999876022339", + "0.6629999876022339", + "15", + "2519.957053899765", + "105.37884944916924", + "5038438.644105584", + "5.952432725049492", + "748439.5431176852", + "513347842744", + "10200", + "101886", + "1740599436", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250226_205036/training_results_fedAvg_15_20250226_205053.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "10", + "1740603975", + "2000000", + "0.6274999976158142", + "0.6317999958992004", + "14", + "1653.2104058265686", + "119.09164018507396", + "6469935.336886635", + "10.395887218232176", + "1213171.8342983408", + "431655715874", + "6676", + "66717", + "1740603975", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250226_220616/training_results_fedAvg_15_20250226_220624.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "11", + "1740609641", + "1600000", + "0.6477000117301941", + "0.6477000117301941", + "15", + "2002.8348944187164", + "111.15923143945864", + "5674178.340394711", + "8.006235886369092", + "973371.7094467937", + "458292036197", + "8088", + "80768", + "1740609641", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250226_234041/training_results_fedAvg_15_20250226_234051.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "12", + "1740607169", + "1200000", + "0.6985999941825867", + "0.6985999941825867", + "15", + "2431.2939360141754", + "106.0386968892087", + "5145985.112531083", + "4.304305322603749", + "528498.0364792093", + "504944643182", + "9824", + "98124", + "1740607169", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250226_225929/training_results_fedAvg_15_20250226_225942.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "13", + "1740605660", + "2300000", + "0.609499990940094", + "0.6403999924659729", + "14", + "1479.546894311905", + "126.13514901047029", + "7225771.80463565", + "12.412628907044253", + "1400654.2323676054", + "431147352039", + "5976", + "59668", + "1740605660", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250226_223420/training_results_fedAvg_15_20250226_223427.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "14", + "1740611679", + "2000000", + "0.6600000262260437", + "0.6600000262260437", + "15", + "1615.520221233368", + "120.08260797970584", + "6635431.132699118", + "7.325927297253776", + "856935.1678566966", + "432553457913", + "6528", + "65189", + "1740611679", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250227_001439/training_results_fedAvg_15_20250227_001447.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "15", + "1740602002", + "1600000", + "0.5546000003814697", + "0.6617000102996826", + "14", + "1938.12327170372", + "112.9002729383568", + "5824188.17136245", + "5.562732666362737", + "666704.2061826768", + "455448605122", + "7828", + "78199", + "1740602002", + "Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Flwr_20250226_213322/training_results_fedAvg_15_20250226_213332.csv", + "fedAvg_cifar10_epoch2" + ], + [ + "16", + "1740658525", + "1600000", + "0.5396000146865845", + "0.5396000146865845", + "15", + "1157.261950492859", + "104.62784292691876", + "4849996.884117246", + "12.810439404926772", + "1582591.3305805747", + "227678253728", + "4704", + "46944", + "1740658525", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_131525/training_results_fedAvg2Clients_15_20250227_131535.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "17", + "1740657023", + "1200000", + "0.450899988412857", + "0.4848000109195709", + "14", + "1460.888531923294", + "100.63904627441326", + "4417581.322526457", + "8.814656155878305", + "1176522.495132642", + "262212837478", + "5944", + "59357", + "1740657023", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_125024/training_results_fedAvg2Clients_15_20250227_125037.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "18", + "1740665257", + "2300000", + "0.4805000126361847", + "0.4805000126361847", + "15", + "858.2312998771667", + "113.89320911186717", + "5884250.460134128", + "19.101196658053297", + "2234263.265721659", + "205313267055", + "3492", + "34892", + "1740665257", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_150738/training_results_fedAvg2Clients_15_20250227_150746.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "19", + "1740660698", + "2300000", + "0.4963999986648559", + "0.4963999986648559", + "15", + "862.0375521183014", + "114.92594544048954", + "5934778.380671152", + "20.59443940612749", + "2399078.4794463613", + "207832865556", + "3504", + "35019", + "1740660698", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_135139/training_results_fedAvg2Clients_15_20250227_135146.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "20", + "1740664269", + "2000000", + "0.3617999851703644", + "0.4751000106334686", + "14", + "954.4941120147704", + "109.78395575022728", + "5402196.320108715", + "16.201531585573722", + "1965523.1312041709", + "209596831157", + "3892", + "38798", + "1740664269", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_145110/training_results_fedAvg2Clients_15_20250227_145118.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "21", + "1740667836", + "1200000", + "0.4792999923229217", + "0.5182999968528748", + "14", + "1463.0615174770355", + "100.0268486148358", + "4413694.673633483", + "9.269731922844024", + "1231760.16483163", + "262142805561", + "5944", + "59393", + "1740667836", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_155036/training_results_fedAvg2Clients_15_20250227_155048.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "22", + "1740663090", + "1600000", + "0.4571999907493591", + "0.4735000133514404", + "13", + "1146.0609273910522", + "104.59999197541364", + "4860656.526460717", + "12.697037252831", + "1580728.8042826469", + "226034534771", + "4660", + "46503", + "1740663090", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_143130/training_results_fedAvg2Clients_15_20250227_143140.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "23", + "1740659716", + "2000000", + "0.4740000069141388", + "0.4740000069141388", + "15", + "949.8004450798036", + "109.74996435388162", + "5413313.879658546", + "16.630251377277222", + "1987202.8134305533", + "208938799963", + "3868", + "38597", + "1740659716", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Flwr_20250227_133516/training_results_fedAvg2Clients_15_20250227_133524.csv", + "fedAvg2Clients_cifar10_epoch1" + ], + [ + "24", + "1740627169", + "2000000", + "0.6223999857902527", + "0.6223999857902527", + "15", + "1645.9683847427368", + "109.64007204973969", + "5475961.381925907", + "17.333212347407716", + "2053383.323461548", + "363869593234", + "6656", + "66449", + "1740627169", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_043249/training_results_fedAvg2Clients_15_20250227_043258.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "25", + "1740622608", + "1200000", + "0.5741000175476074", + "0.6261000037193298", + "13", + "2504.0025584697723", + "100.03473613725632", + "4456411.350465162", + "9.283359440769177", + "1218865.7749033456", + "450275802851", + "10116", + "101040", + "1740622608", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_031648/training_results_fedAvg2Clients_15_20250227_031701.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "26", + "1740614809", + "1200000", + "0.6254000067710876", + "0.6254000067710876", + "15", + "2510.4407687187195", + "100.61613436047112", + "4443187.801370453", + "9.482188376630289", + "1255291.0646059592", + "449942750616", + "10140", + "101266", + "1740614809", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_010650/training_results_fedAvg2Clients_15_20250227_010702.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "27", + "1740625153", + "1600000", + "0.5512999892234802", + "0.6039999723434448", + "14", + "1982.211465120316", + "104.57904301785771", + "4906910.311505554", + "13.107222762101172", + "1640022.787027996", + "392278037943", + "8004", + "79944", + "1740625153", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_035913/training_results_fedAvg2Clients_15_20250227_035923.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "28", + "1740639013", + "2300000", + "0.6467000246047974", + "0.6467000246047974", + "15", + "1484.367873430252", + "115.81512246175252", + "6004137.033166582", + "20.56617966142136", + "2368307.09371275", + "359458669348", + "5996", + "59869", + "1740639013", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_075013/training_results_fedAvg2Clients_15_20250227_075020.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "29", + "1740621095", + "2300000", + "0.6467999815940857", + "0.6467999815940857", + "15", + "1484.6246845722198", + "114.83550906866476", + "6004353.127672011", + "21.300525071628204", + "2426428.8023777944", + "359540665285", + "5996", + "59880", + "1740621095", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_025135/training_results_fedAvg2Clients_15_20250227_025142.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "30", + "1740619411", + "2000000", + "0.6193000078201294", + "0.6435999870300293", + "13", + "1651.836879491806", + "110.0813749651592", + "5469168.578076003", + "17.262528132099366", + "2053484.7104683355", + "364627422349", + "6676", + "66670", + "1740619411", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_022331/training_results_fedAvg2Clients_15_20250227_022339.csv", + "fedAvg2Clients_cifar10_epoch2" + ], + [ + "31", + "1740617359", + "1600000", + "0.6103000044822693", + "0.6103000044822693", + "15", + "1981.5543630123136", + "105.05085770714436", + "4923267.035512208", + "12.899081772465122", + "1597152.3419951904", + "393501659258", + "8004", + "79927", + "1740617359", + "Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Flwr_20250227_014920/training_results_fedAvg2Clients_15_20250227_014929.csv", + "fedAvg2Clients_cifar10_epoch2" + ] + ], + "shape": { + "columns": 16, + "rows": 32 + } + }, + "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>file_number</th>\n", + " <th>fmax</th>\n", + " <th>accuracy</th>\n", + " <th>max_acc</th>\n", + " <th>in_round</th>\n", + " <th>time</th>\n", + " <th>mean_power</th>\n", + " <th>mean_mojitos</th>\n", + " <th>std_power_combined</th>\n", + " <th>std_mojitos_combined</th>\n", + " <th>sum_mojitos</th>\n", + " <th>n_data_mojitos</th>\n", + " <th>n_data_power</th>\n", + " <th>startTime</th>\n", + " <th>filepath</th>\n", + " <th>instance</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1740648154</td>\n", + " <td>1200000</td>\n", + " <td>0.5815</td>\n", + " <td>0.5815</td>\n", + " <td>15</td>\n", + " <td>1392.272257</td>\n", + " <td>105.389961</td>\n", + " <td>5.060514e+06</td>\n", + " <td>5.068565</td>\n", + " <td>6.042194e+05</td>\n", + " <td>287330492345</td>\n", + " <td>5688</td>\n", + " <td>56779</td>\n", + " <td>1740648154</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1740651708</td>\n", + " <td>2300000</td>\n", + " <td>0.5678</td>\n", + " <td>0.5678</td>\n", + " <td>15</td>\n", + " <td>864.964328</td>\n", + " <td>123.401824</td>\n", + " <td>6.929048e+06</td>\n", + " <td>14.541949</td>\n", + " <td>1.655680e+06</td>\n", + " <td>243348153782</td>\n", + " <td>3520</td>\n", + " <td>35120</td>\n", + " <td>1740651708</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>1740650725</td>\n", + " <td>2000000</td>\n", + " <td>0.5466</td>\n", + " <td>0.5466</td>\n", + " <td>15</td>\n", + " <td>953.191806</td>\n", + " <td>117.100830</td>\n", + " <td>6.265129e+06</td>\n", + " <td>11.560214</td>\n", + " <td>1.349006e+06</td>\n", + " <td>242295652380</td>\n", + " <td>3876</td>\n", + " <td>38674</td>\n", + " <td>1740650725</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>1740654039</td>\n", + " <td>1600000</td>\n", + " <td>0.5553</td>\n", + " <td>0.5553</td>\n", + " <td>15</td>\n", + " <td>1096.626096</td>\n", + " <td>111.417306</td>\n", + " <td>5.721364e+06</td>\n", + " <td>6.475912</td>\n", + " <td>7.582820e+05</td>\n", + " <td>254705838906</td>\n", + " <td>4464</td>\n", + " <td>44518</td>\n", + " <td>1740654039</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>1740655170</td>\n", + " <td>2000000</td>\n", + " <td>0.5628</td>\n", + " <td>0.5628</td>\n", + " <td>15</td>\n", + " <td>957.519232</td>\n", + " <td>117.073913</td>\n", + " <td>6.283480e+06</td>\n", + " <td>11.592987</td>\n", + " <td>1.346304e+06</td>\n", + " <td>244509911021</td>\n", + " <td>3900</td>\n", + " <td>38913</td>\n", + " <td>1740655170</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>1740652602</td>\n", + " <td>1200000</td>\n", + " <td>0.5332</td>\n", + " <td>0.5449</td>\n", + " <td>13</td>\n", + " <td>1398.021808</td>\n", + " <td>105.021453</td>\n", + " <td>5.047959e+06</td>\n", + " <td>4.968872</td>\n", + " <td>6.056497e+05</td>\n", + " <td>286490112838</td>\n", + " <td>5688</td>\n", + " <td>56754</td>\n", + " <td>1740652602</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>1740656160</td>\n", + " <td>2300000</td>\n", + " <td>0.4331</td>\n", + " <td>0.5604</td>\n", + " <td>14</td>\n", + " <td>827.027918</td>\n", + " <td>126.012074</td>\n", + " <td>7.192341e+06</td>\n", + " <td>10.603284</td>\n", + " <td>1.224444e+06</td>\n", + " <td>241814848191</td>\n", + " <td>3368</td>\n", + " <td>33621</td>\n", + " <td>1740656160</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>1740649591</td>\n", + " <td>1600000</td>\n", + " <td>0.4392</td>\n", + " <td>0.5441</td>\n", + " <td>14</td>\n", + " <td>1100.001739</td>\n", + " <td>111.545051</td>\n", + " <td>5.706891e+06</td>\n", + " <td>6.599172</td>\n", + " <td>7.753907e+05</td>\n", + " <td>254863409963</td>\n", + " <td>4476</td>\n", + " <td>44659</td>\n", + " <td>1740649591</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>1740613326</td>\n", + " <td>2300000</td>\n", + " <td>0.6534</td>\n", + " <td>0.6612</td>\n", + " <td>14</td>\n", + " <td>1447.282254</td>\n", + " <td>127.826490</td>\n", + " <td>7.418296e+06</td>\n", + " <td>8.685102</td>\n", + " <td>9.905310e+05</td>\n", + " <td>433077049864</td>\n", + " <td>5844</td>\n", + " <td>58379</td>\n", + " <td>1740613326</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>1740599436</td>\n", + " <td>1200000</td>\n", + " <td>0.6630</td>\n", + " <td>0.6630</td>\n", + " <td>15</td>\n", + " <td>2519.957054</td>\n", + " <td>105.378849</td>\n", + " <td>5.038439e+06</td>\n", + " <td>5.952433</td>\n", + " <td>7.484395e+05</td>\n", + " <td>513347842744</td>\n", + " <td>10200</td>\n", + " <td>101886</td>\n", + " <td>1740599436</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>1740603975</td>\n", + " <td>2000000</td>\n", + " <td>0.6275</td>\n", + " <td>0.6318</td>\n", + " <td>14</td>\n", + " <td>1653.210406</td>\n", + " <td>119.091640</td>\n", + " <td>6.469935e+06</td>\n", + " <td>10.395887</td>\n", + " <td>1.213172e+06</td>\n", + " <td>431655715874</td>\n", + " <td>6676</td>\n", + " <td>66717</td>\n", + " <td>1740603975</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>1740609641</td>\n", + " <td>1600000</td>\n", + " <td>0.6477</td>\n", + " <td>0.6477</td>\n", + " <td>15</td>\n", + " <td>2002.834894</td>\n", + " <td>111.159231</td>\n", + " <td>5.674178e+06</td>\n", + " <td>8.006236</td>\n", + " <td>9.733717e+05</td>\n", + " <td>458292036197</td>\n", + " <td>8088</td>\n", + " <td>80768</td>\n", + " <td>1740609641</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>1740607169</td>\n", + " <td>1200000</td>\n", + " <td>0.6986</td>\n", + " <td>0.6986</td>\n", + " <td>15</td>\n", + " <td>2431.293936</td>\n", + " <td>106.038697</td>\n", + " <td>5.145985e+06</td>\n", + " <td>4.304305</td>\n", + " <td>5.284980e+05</td>\n", + " <td>504944643182</td>\n", + " <td>9824</td>\n", + " <td>98124</td>\n", + " <td>1740607169</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>1740605660</td>\n", + " <td>2300000</td>\n", + " <td>0.6095</td>\n", + " <td>0.6404</td>\n", + " <td>14</td>\n", + " <td>1479.546894</td>\n", + " <td>126.135149</td>\n", + " <td>7.225772e+06</td>\n", + " <td>12.412629</td>\n", + " <td>1.400654e+06</td>\n", + " <td>431147352039</td>\n", + " <td>5976</td>\n", + " <td>59668</td>\n", + " <td>1740605660</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>1740611679</td>\n", + " <td>2000000</td>\n", + " <td>0.6600</td>\n", + " <td>0.6600</td>\n", + " <td>15</td>\n", + " <td>1615.520221</td>\n", + " <td>120.082608</td>\n", + " <td>6.635431e+06</td>\n", + " <td>7.325927</td>\n", + " <td>8.569352e+05</td>\n", + " <td>432553457913</td>\n", + " <td>6528</td>\n", + " <td>65189</td>\n", + " <td>1740611679</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>1740602002</td>\n", + " <td>1600000</td>\n", + " <td>0.5546</td>\n", + " <td>0.6617</td>\n", + " <td>14</td>\n", + " <td>1938.123272</td>\n", + " <td>112.900273</td>\n", + " <td>5.824188e+06</td>\n", + " <td>5.562733</td>\n", + " <td>6.667042e+05</td>\n", + " <td>455448605122</td>\n", + " <td>7828</td>\n", + " <td>78199</td>\n", + " <td>1740602002</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg_cif...</td>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>16</th>\n", + " <td>1740658525</td>\n", + " <td>1600000</td>\n", + " <td>0.5396</td>\n", + " <td>0.5396</td>\n", + " <td>15</td>\n", + " <td>1157.261950</td>\n", + " <td>104.627843</td>\n", + " <td>4.849997e+06</td>\n", + " <td>12.810439</td>\n", + " <td>1.582591e+06</td>\n", + " <td>227678253728</td>\n", + " <td>4704</td>\n", + " <td>46944</td>\n", + " <td>1740658525</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>17</th>\n", + " <td>1740657023</td>\n", + " <td>1200000</td>\n", + " <td>0.4509</td>\n", + " <td>0.4848</td>\n", + " <td>14</td>\n", + " <td>1460.888532</td>\n", + " <td>100.639046</td>\n", + " <td>4.417581e+06</td>\n", + " <td>8.814656</td>\n", + " <td>1.176522e+06</td>\n", + " <td>262212837478</td>\n", + " <td>5944</td>\n", + " <td>59357</td>\n", + " <td>1740657023</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>18</th>\n", + " <td>1740665257</td>\n", + " <td>2300000</td>\n", + " <td>0.4805</td>\n", + " <td>0.4805</td>\n", + " <td>15</td>\n", + " <td>858.231300</td>\n", + " <td>113.893209</td>\n", + " <td>5.884250e+06</td>\n", + " <td>19.101197</td>\n", + " <td>2.234263e+06</td>\n", + " <td>205313267055</td>\n", + " <td>3492</td>\n", + " <td>34892</td>\n", + " <td>1740665257</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>19</th>\n", + " <td>1740660698</td>\n", + " <td>2300000</td>\n", + " <td>0.4964</td>\n", + " <td>0.4964</td>\n", + " <td>15</td>\n", + " <td>862.037552</td>\n", + " <td>114.925945</td>\n", + " <td>5.934778e+06</td>\n", + " <td>20.594439</td>\n", + " <td>2.399078e+06</td>\n", + " <td>207832865556</td>\n", + " <td>3504</td>\n", + " <td>35019</td>\n", + " <td>1740660698</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>20</th>\n", + " <td>1740664269</td>\n", + " <td>2000000</td>\n", + " <td>0.3618</td>\n", + " <td>0.4751</td>\n", + " <td>14</td>\n", + " <td>954.494112</td>\n", + " <td>109.783956</td>\n", + " <td>5.402196e+06</td>\n", + " <td>16.201532</td>\n", + " <td>1.965523e+06</td>\n", + " <td>209596831157</td>\n", + " <td>3892</td>\n", + " <td>38798</td>\n", + " <td>1740664269</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>21</th>\n", + " <td>1740667836</td>\n", + " <td>1200000</td>\n", + " <td>0.4793</td>\n", + " <td>0.5183</td>\n", + " <td>14</td>\n", + " <td>1463.061517</td>\n", + " <td>100.026849</td>\n", + " <td>4.413695e+06</td>\n", + " <td>9.269732</td>\n", + " <td>1.231760e+06</td>\n", + " <td>262142805561</td>\n", + " <td>5944</td>\n", + " <td>59393</td>\n", + " <td>1740667836</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>22</th>\n", + " <td>1740663090</td>\n", + " <td>1600000</td>\n", + " <td>0.4572</td>\n", + " <td>0.4735</td>\n", + " <td>13</td>\n", + " <td>1146.060927</td>\n", + " <td>104.599992</td>\n", + " <td>4.860657e+06</td>\n", + " <td>12.697037</td>\n", + " <td>1.580729e+06</td>\n", + " <td>226034534771</td>\n", + " <td>4660</td>\n", + " <td>46503</td>\n", + " <td>1740663090</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>23</th>\n", + " <td>1740659716</td>\n", + " <td>2000000</td>\n", + " <td>0.4740</td>\n", + " <td>0.4740</td>\n", + " <td>15</td>\n", + " <td>949.800445</td>\n", + " <td>109.749964</td>\n", + " <td>5.413314e+06</td>\n", + " <td>16.630251</td>\n", + " <td>1.987203e+06</td>\n", + " <td>208938799963</td>\n", + " <td>3868</td>\n", + " <td>38597</td>\n", + " <td>1740659716</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>24</th>\n", + " <td>1740627169</td>\n", + " <td>2000000</td>\n", + " <td>0.6224</td>\n", + " <td>0.6224</td>\n", + " <td>15</td>\n", + " <td>1645.968385</td>\n", + " <td>109.640072</td>\n", + " <td>5.475961e+06</td>\n", + " <td>17.333212</td>\n", + " <td>2.053383e+06</td>\n", + " <td>363869593234</td>\n", + " <td>6656</td>\n", + " <td>66449</td>\n", + " <td>1740627169</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>25</th>\n", + " <td>1740622608</td>\n", + " <td>1200000</td>\n", + " <td>0.5741</td>\n", + " <td>0.6261</td>\n", + " <td>13</td>\n", + " <td>2504.002558</td>\n", + " <td>100.034736</td>\n", + " <td>4.456411e+06</td>\n", + " <td>9.283359</td>\n", + " <td>1.218866e+06</td>\n", + " <td>450275802851</td>\n", + " <td>10116</td>\n", + " <td>101040</td>\n", + " <td>1740622608</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>26</th>\n", + " <td>1740614809</td>\n", + " <td>1200000</td>\n", + " <td>0.6254</td>\n", + " <td>0.6254</td>\n", + " <td>15</td>\n", + " <td>2510.440769</td>\n", + " <td>100.616134</td>\n", + " <td>4.443188e+06</td>\n", + " <td>9.482188</td>\n", + " <td>1.255291e+06</td>\n", + " <td>449942750616</td>\n", + " <td>10140</td>\n", + " <td>101266</td>\n", + " <td>1740614809</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>27</th>\n", + " <td>1740625153</td>\n", + " <td>1600000</td>\n", + " <td>0.5513</td>\n", + " <td>0.6040</td>\n", + " <td>14</td>\n", + " <td>1982.211465</td>\n", + " <td>104.579043</td>\n", + " <td>4.906910e+06</td>\n", + " <td>13.107223</td>\n", + " <td>1.640023e+06</td>\n", + " <td>392278037943</td>\n", + " <td>8004</td>\n", + " <td>79944</td>\n", + " <td>1740625153</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>28</th>\n", + " <td>1740639013</td>\n", + " <td>2300000</td>\n", + " <td>0.6467</td>\n", + " <td>0.6467</td>\n", + " <td>15</td>\n", + " <td>1484.367873</td>\n", + " <td>115.815122</td>\n", + " <td>6.004137e+06</td>\n", + " <td>20.566180</td>\n", + " <td>2.368307e+06</td>\n", + " <td>359458669348</td>\n", + " <td>5996</td>\n", + " <td>59869</td>\n", + " <td>1740639013</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>29</th>\n", + " <td>1740621095</td>\n", + " <td>2300000</td>\n", + " <td>0.6468</td>\n", + " <td>0.6468</td>\n", + " <td>15</td>\n", + " <td>1484.624685</td>\n", + " <td>114.835509</td>\n", + " <td>6.004353e+06</td>\n", + " <td>21.300525</td>\n", + " <td>2.426429e+06</td>\n", + " <td>359540665285</td>\n", + " <td>5996</td>\n", + " <td>59880</td>\n", + " <td>1740621095</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>30</th>\n", + " <td>1740619411</td>\n", + " <td>2000000</td>\n", + " <td>0.6193</td>\n", + " <td>0.6436</td>\n", + " <td>13</td>\n", + " <td>1651.836879</td>\n", + " <td>110.081375</td>\n", + " <td>5.469169e+06</td>\n", + " <td>17.262528</td>\n", + " <td>2.053485e+06</td>\n", + " <td>364627422349</td>\n", + " <td>6676</td>\n", + " <td>66670</td>\n", + " <td>1740619411</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>31</th>\n", + " <td>1740617359</td>\n", + " <td>1600000</td>\n", + " <td>0.6103</td>\n", + " <td>0.6103</td>\n", + " <td>15</td>\n", + " <td>1981.554363</td>\n", + " <td>105.050858</td>\n", + " <td>4.923267e+06</td>\n", + " <td>12.899082</td>\n", + " <td>1.597152e+06</td>\n", + " <td>393501659258</td>\n", + " <td>8004</td>\n", + " <td>79927</td>\n", + " <td>1740617359</td>\n", + " <td>Log/Flower_campaign/Flower_instance_fedAvg2Cli...</td>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " file_number fmax accuracy max_acc in_round time \\\n", + "0 1740648154 1200000 0.5815 0.5815 15 1392.272257 \n", + "1 1740651708 2300000 0.5678 0.5678 15 864.964328 \n", + "2 1740650725 2000000 0.5466 0.5466 15 953.191806 \n", + "3 1740654039 1600000 0.5553 0.5553 15 1096.626096 \n", + "4 1740655170 2000000 0.5628 0.5628 15 957.519232 \n", + "5 1740652602 1200000 0.5332 0.5449 13 1398.021808 \n", + "6 1740656160 2300000 0.4331 0.5604 14 827.027918 \n", + "7 1740649591 1600000 0.4392 0.5441 14 1100.001739 \n", + "8 1740613326 2300000 0.6534 0.6612 14 1447.282254 \n", + "9 1740599436 1200000 0.6630 0.6630 15 2519.957054 \n", + "10 1740603975 2000000 0.6275 0.6318 14 1653.210406 \n", + "11 1740609641 1600000 0.6477 0.6477 15 2002.834894 \n", + "12 1740607169 1200000 0.6986 0.6986 15 2431.293936 \n", + "13 1740605660 2300000 0.6095 0.6404 14 1479.546894 \n", + "14 1740611679 2000000 0.6600 0.6600 15 1615.520221 \n", + "15 1740602002 1600000 0.5546 0.6617 14 1938.123272 \n", + "16 1740658525 1600000 0.5396 0.5396 15 1157.261950 \n", + "17 1740657023 1200000 0.4509 0.4848 14 1460.888532 \n", + "18 1740665257 2300000 0.4805 0.4805 15 858.231300 \n", + "19 1740660698 2300000 0.4964 0.4964 15 862.037552 \n", + "20 1740664269 2000000 0.3618 0.4751 14 954.494112 \n", + "21 1740667836 1200000 0.4793 0.5183 14 1463.061517 \n", + "22 1740663090 1600000 0.4572 0.4735 13 1146.060927 \n", + "23 1740659716 2000000 0.4740 0.4740 15 949.800445 \n", + "24 1740627169 2000000 0.6224 0.6224 15 1645.968385 \n", + "25 1740622608 1200000 0.5741 0.6261 13 2504.002558 \n", + "26 1740614809 1200000 0.6254 0.6254 15 2510.440769 \n", + "27 1740625153 1600000 0.5513 0.6040 14 1982.211465 \n", + "28 1740639013 2300000 0.6467 0.6467 15 1484.367873 \n", + "29 1740621095 2300000 0.6468 0.6468 15 1484.624685 \n", + "30 1740619411 2000000 0.6193 0.6436 13 1651.836879 \n", + "31 1740617359 1600000 0.6103 0.6103 15 1981.554363 \n", + "\n", + " mean_power mean_mojitos std_power_combined std_mojitos_combined \\\n", + "0 105.389961 5.060514e+06 5.068565 6.042194e+05 \n", + "1 123.401824 6.929048e+06 14.541949 1.655680e+06 \n", + "2 117.100830 6.265129e+06 11.560214 1.349006e+06 \n", + "3 111.417306 5.721364e+06 6.475912 7.582820e+05 \n", + "4 117.073913 6.283480e+06 11.592987 1.346304e+06 \n", + "5 105.021453 5.047959e+06 4.968872 6.056497e+05 \n", + "6 126.012074 7.192341e+06 10.603284 1.224444e+06 \n", + "7 111.545051 5.706891e+06 6.599172 7.753907e+05 \n", + "8 127.826490 7.418296e+06 8.685102 9.905310e+05 \n", + "9 105.378849 5.038439e+06 5.952433 7.484395e+05 \n", + "10 119.091640 6.469935e+06 10.395887 1.213172e+06 \n", + "11 111.159231 5.674178e+06 8.006236 9.733717e+05 \n", + "12 106.038697 5.145985e+06 4.304305 5.284980e+05 \n", + "13 126.135149 7.225772e+06 12.412629 1.400654e+06 \n", + "14 120.082608 6.635431e+06 7.325927 8.569352e+05 \n", + "15 112.900273 5.824188e+06 5.562733 6.667042e+05 \n", + "16 104.627843 4.849997e+06 12.810439 1.582591e+06 \n", + "17 100.639046 4.417581e+06 8.814656 1.176522e+06 \n", + "18 113.893209 5.884250e+06 19.101197 2.234263e+06 \n", + "19 114.925945 5.934778e+06 20.594439 2.399078e+06 \n", + "20 109.783956 5.402196e+06 16.201532 1.965523e+06 \n", + "21 100.026849 4.413695e+06 9.269732 1.231760e+06 \n", + "22 104.599992 4.860657e+06 12.697037 1.580729e+06 \n", + "23 109.749964 5.413314e+06 16.630251 1.987203e+06 \n", + "24 109.640072 5.475961e+06 17.333212 2.053383e+06 \n", + "25 100.034736 4.456411e+06 9.283359 1.218866e+06 \n", + "26 100.616134 4.443188e+06 9.482188 1.255291e+06 \n", + "27 104.579043 4.906910e+06 13.107223 1.640023e+06 \n", + "28 115.815122 6.004137e+06 20.566180 2.368307e+06 \n", + "29 114.835509 6.004353e+06 21.300525 2.426429e+06 \n", + "30 110.081375 5.469169e+06 17.262528 2.053485e+06 \n", + "31 105.050858 4.923267e+06 12.899082 1.597152e+06 \n", + "\n", + " sum_mojitos n_data_mojitos n_data_power startTime \\\n", + "0 287330492345 5688 56779 1740648154 \n", + "1 243348153782 3520 35120 1740651708 \n", + "2 242295652380 3876 38674 1740650725 \n", + "3 254705838906 4464 44518 1740654039 \n", + "4 244509911021 3900 38913 1740655170 \n", + "5 286490112838 5688 56754 1740652602 \n", + "6 241814848191 3368 33621 1740656160 \n", + "7 254863409963 4476 44659 1740649591 \n", + "8 433077049864 5844 58379 1740613326 \n", + "9 513347842744 10200 101886 1740599436 \n", + "10 431655715874 6676 66717 1740603975 \n", + "11 458292036197 8088 80768 1740609641 \n", + "12 504944643182 9824 98124 1740607169 \n", + "13 431147352039 5976 59668 1740605660 \n", + "14 432553457913 6528 65189 1740611679 \n", + "15 455448605122 7828 78199 1740602002 \n", + "16 227678253728 4704 46944 1740658525 \n", + "17 262212837478 5944 59357 1740657023 \n", + "18 205313267055 3492 34892 1740665257 \n", + "19 207832865556 3504 35019 1740660698 \n", + "20 209596831157 3892 38798 1740664269 \n", + "21 262142805561 5944 59393 1740667836 \n", + "22 226034534771 4660 46503 1740663090 \n", + "23 208938799963 3868 38597 1740659716 \n", + "24 363869593234 6656 66449 1740627169 \n", + "25 450275802851 10116 101040 1740622608 \n", + "26 449942750616 10140 101266 1740614809 \n", + "27 392278037943 8004 79944 1740625153 \n", + "28 359458669348 5996 59869 1740639013 \n", + "29 359540665285 5996 59880 1740621095 \n", + "30 364627422349 6676 66670 1740619411 \n", + "31 393501659258 8004 79927 1740617359 \n", + "\n", + " filepath \\\n", + "0 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "1 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "2 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "3 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "4 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "5 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "6 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "7 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "8 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "9 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "10 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "11 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "12 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "13 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "14 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "15 Log/Flower_campaign/Flower_instance_fedAvg_cif... \n", + "16 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "17 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "18 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "19 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "20 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "21 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "22 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "23 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "24 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "25 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "26 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "27 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "28 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "29 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "30 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "31 Log/Flower_campaign/Flower_instance_fedAvg2Cli... \n", + "\n", + " instance \n", + "0 fedAvg_cifar10_epoch1 \n", + "1 fedAvg_cifar10_epoch1 \n", + "2 fedAvg_cifar10_epoch1 \n", + "3 fedAvg_cifar10_epoch1 \n", + "4 fedAvg_cifar10_epoch1 \n", + "5 fedAvg_cifar10_epoch1 \n", + "6 fedAvg_cifar10_epoch1 \n", + "7 fedAvg_cifar10_epoch1 \n", + "8 fedAvg_cifar10_epoch2 \n", + "9 fedAvg_cifar10_epoch2 \n", + "10 fedAvg_cifar10_epoch2 \n", + "11 fedAvg_cifar10_epoch2 \n", + "12 fedAvg_cifar10_epoch2 \n", + "13 fedAvg_cifar10_epoch2 \n", + "14 fedAvg_cifar10_epoch2 \n", + "15 fedAvg_cifar10_epoch2 \n", + "16 fedAvg2Clients_cifar10_epoch1 \n", + "17 fedAvg2Clients_cifar10_epoch1 \n", + "18 fedAvg2Clients_cifar10_epoch1 \n", + "19 fedAvg2Clients_cifar10_epoch1 \n", + "20 fedAvg2Clients_cifar10_epoch1 \n", + "21 fedAvg2Clients_cifar10_epoch1 \n", + "22 fedAvg2Clients_cifar10_epoch1 \n", + "23 fedAvg2Clients_cifar10_epoch1 \n", + "24 fedAvg2Clients_cifar10_epoch2 \n", + "25 fedAvg2Clients_cifar10_epoch2 \n", + "26 fedAvg2Clients_cifar10_epoch2 \n", + "27 fedAvg2Clients_cifar10_epoch2 \n", + "28 fedAvg2Clients_cifar10_epoch2 \n", + "29 fedAvg2Clients_cifar10_epoch2 \n", + "30 fedAvg2Clients_cifar10_epoch2 \n", + "31 fedAvg2Clients_cifar10_epoch2 " + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "file = 'Data_analysis/Output_level_4/combine_Flower_full_campaign.csv'\n", + "df = pd.read_csv(file)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.microsoft.datawrangler.viewer.v0+json": { + "columns": [ + { + "name": "index", + "rawType": "int64", + "type": "integer" + }, + { + "name": "instance", + "rawType": "object", + "type": "string" + }, + { + "name": "fmax", + "rawType": "float64", + "type": "float" + }, + { + "name": "accuracy", + "rawType": "float64", + "type": "float" + }, + { + "name": "max_acc", + "rawType": "float64", + "type": "float" + }, + { + "name": "in_round", + "rawType": "float64", + "type": "float" + }, + { + "name": "time", + "rawType": "float64", + "type": "float" + }, + { + "name": "mean_power", + "rawType": "float64", + "type": "float" + }, + { + "name": "mean_mojitos", + "rawType": "float64", + "type": "float" + }, + { + "name": "sum_mojitos", + "rawType": "float64", + "type": "float" + }, + { + "name": "std_power_combined", + "rawType": "float64", + "type": "float" + }, + { + "name": "std_mojitos_combined", + "rawType": "float64", + "type": "float" + }, + { + "name": "n_data_mojitos", + "rawType": "int64", + "type": "integer" + }, + { + "name": "n_data_power", + "rawType": "int64", + "type": "integer" + } + ], + "conversionMethod": "pd.DataFrame", + "ref": "79960b21-1ba8-470a-b22c-b43fcc012fe7", + "rows": [ + [ + "0", + "fedAvg2Clients_cifar10_epoch1", + "1200000.0", + "0.46509999036788935", + "0.5015500038862228", + "14.0", + "1461.9750247001648", + "100.33294744462452", + "4415637.9980799705", + "262177821519.5", + "9.045125428332847", + "1204458.0285794898", + "11888", + "118750" + ], + [ + "1", + "fedAvg2Clients_cifar10_epoch2", + "1200000.0", + "0.5997500121593475", + "0.6257500052452087", + "14.0", + "2507.221663594246", + "100.32543524886373", + "4449799.575917807", + "450109276733.5", + "9.38341161519843", + "1237234.0571073429", + "20256", + "202306" + ], + [ + "2", + "fedAvg_cifar10_epoch1", + "1200000.0", + "0.5573500096797943", + "0.5631999969482422", + "14.0", + "1395.147032380104", + "105.20570679301395", + "5054236.42555913", + "286910302591.5", + "5.018977160475504", + "604934.9627095608", + "11376", + "113533" + ], + [ + "3", + "fedAvg_cifar10_epoch2", + "1200000.0", + "0.6807999908924103", + "0.6807999908924103", + "15.0", + "2475.62549495697", + "105.70877316918896", + "5092211.878318334", + "509146242963.0", + "5.209436577483834", + "649902.3512222569", + "20024", + "200010" + ], + [ + "4", + "fedAvg2Clients_cifar10_epoch1", + "1600000.0", + "0.4984000027179718", + "0.5065500140190125", + "14.0", + "1151.6614389419556", + "104.6139174511662", + "4855326.705288982", + "226856394249.5", + "12.754131957180716", + "1581664.718380795", + "9364", + "93447" + ], + [ + "5", + "fedAvg2Clients_cifar10_epoch2", + "1600000.0", + "0.5807999968528748", + "0.6071499884128571", + "14.5", + "1981.8829140663147", + "104.81495036250104", + "4915088.673508881", + "392889848600.5", + "13.00357978997065", + "1618729.4933854446", + "16008", + "159871" + ], + [ + "6", + "fedAvg_cifar10_epoch1", + "1600000.0", + "0.4972500056028366", + "0.549699991941452", + "14.5", + "1098.3139171600342", + "111.48117860367591", + "5714127.551137589", + "254784624434.5", + "6.537930039430139", + "766895.5246203286", + "8940", + "89177" + ], + [ + "7", + "fedAvg_cifar10_epoch2", + "1600000.0", + "0.6011500060558319", + "0.6547000110149384", + "14.5", + "1970.4790830612183", + "112.02975218890772", + "5749183.255878581", + "456870320659.5", + "6.9130178651197465", + "836709.0946698901", + "15916", + "158967" + ], + [ + "8", + "fedAvg2Clients_cifar10_epoch1", + "2000000.0", + "0.4178999960422516", + "0.4745500087738037", + "14.5", + "952.147278547287", + "109.76696005205446", + "5407755.099883631", + "209267815560.0", + "16.416734301888877", + "1976359.1652553577", + "7760", + "77395" + ], + [ + "9", + "fedAvg2Clients_cifar10_epoch2", + "2000000.0", + "0.620849996805191", + "0.632999986410141", + "14.0", + "1648.9026321172714", + "109.86072350744945", + "5472564.980000955", + "364248507791.5", + "17.297847669572537", + "2053434.09364995", + "13332", + "133119" + ], + [ + "10", + "fedAvg_cifar10_epoch1", + "2000000.0", + "0.5546999871730804", + "0.5546999871730804", + "15.0", + "955.3555190563202", + "117.08737151141113", + "6274304.206654045", + "243402781700.5", + "11.576662669281491", + "1347651.7370545832", + "7776", + "77587" + ], + [ + "11", + "fedAvg_cifar10_epoch2", + "2000000.0", + "0.643750011920929", + "0.6459000110626221", + "14.5", + "1634.3653135299683", + "119.58712408238989", + "6552683.234792877", + "432104586893.5", + "9.010380743328987", + "1052233.5495065076", + "13204", + "131906" + ], + [ + "12", + "fedAvg2Clients_cifar10_epoch1", + "2300000.0", + "0.4884500056505203", + "0.4884500056505203", + "15.0", + "860.1344259977341", + "114.40957727617835", + "5909514.4204026405", + "206573066305.5", + "19.86321135158165", + "2318277.3906743433", + "6996", + "69911" + ], + [ + "13", + "fedAvg2Clients_cifar10_epoch2", + "2300000.0", + "0.6467500030994415", + "0.6467500030994415", + "15.0", + "1484.496279001236", + "115.32531576520864", + "6004245.080419296", + "359499667316.5", + "20.936605961859737", + "2397544.0791712953", + "11992", + "119749" + ], + [ + "14", + "fedAvg_cifar10_epoch1", + "2300000.0", + "0.5004499852657318", + "0.5640999972820282", + "14.5", + "845.9961229562759", + "124.70694916627386", + "7060694.55706032", + "242581500986.5", + "12.768274300694875", + "1460814.0352161247", + "6888", + "68741" + ], + [ + "15", + "fedAvg_cifar10_epoch2", + "2300000.0", + "0.6314499974250793", + "0.6507999897003174", + "14.0", + "1463.4145741462708", + "126.98081947181782", + "7322033.769809767", + "432112200951.5", + "10.732266495547679", + "1215306.0445802794", + "11820", + "118047" + ] + ], + "shape": { + "columns": 13, + "rows": 16 + } + }, + "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>instance</th>\n", + " <th>fmax</th>\n", + " <th>accuracy</th>\n", + " <th>max_acc</th>\n", + " <th>in_round</th>\n", + " <th>time</th>\n", + " <th>mean_power</th>\n", + " <th>mean_mojitos</th>\n", + " <th>sum_mojitos</th>\n", + " <th>std_power_combined</th>\n", + " <th>std_mojitos_combined</th>\n", + " <th>n_data_mojitos</th>\n", + " <th>n_data_power</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " <td>1200000.0</td>\n", + " <td>0.46510</td>\n", + " <td>0.50155</td>\n", + " <td>14.0</td>\n", + " <td>1461.975025</td>\n", + " <td>100.332947</td>\n", + " <td>4.415638e+06</td>\n", + " <td>2.621778e+11</td>\n", + " <td>9.045125</td>\n", + " <td>1.204458e+06</td>\n", + " <td>11888</td>\n", + " <td>118750</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " <td>1200000.0</td>\n", + " <td>0.59975</td>\n", + " <td>0.62575</td>\n", + " <td>14.0</td>\n", + " <td>2507.221664</td>\n", + " <td>100.325435</td>\n", + " <td>4.449800e+06</td>\n", + " <td>4.501093e+11</td>\n", + " <td>9.383412</td>\n", + " <td>1.237234e+06</td>\n", + " <td>20256</td>\n", + " <td>202306</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " <td>1200000.0</td>\n", + " <td>0.55735</td>\n", + " <td>0.56320</td>\n", + " <td>14.0</td>\n", + " <td>1395.147032</td>\n", + " <td>105.205707</td>\n", + " <td>5.054236e+06</td>\n", + " <td>2.869103e+11</td>\n", + " <td>5.018977</td>\n", + " <td>6.049350e+05</td>\n", + " <td>11376</td>\n", + " <td>113533</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " <td>1200000.0</td>\n", + " <td>0.68080</td>\n", + " <td>0.68080</td>\n", + " <td>15.0</td>\n", + " <td>2475.625495</td>\n", + " <td>105.708773</td>\n", + " <td>5.092212e+06</td>\n", + " <td>5.091462e+11</td>\n", + " <td>5.209437</td>\n", + " <td>6.499024e+05</td>\n", + " <td>20024</td>\n", + " <td>200010</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " <td>1600000.0</td>\n", + " <td>0.49840</td>\n", + " <td>0.50655</td>\n", + " <td>14.0</td>\n", + " <td>1151.661439</td>\n", + " <td>104.613917</td>\n", + " <td>4.855327e+06</td>\n", + " <td>2.268564e+11</td>\n", + " <td>12.754132</td>\n", + " <td>1.581665e+06</td>\n", + " <td>9364</td>\n", + " <td>93447</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " <td>1600000.0</td>\n", + " <td>0.58080</td>\n", + " <td>0.60715</td>\n", + " <td>14.5</td>\n", + " <td>1981.882914</td>\n", + " <td>104.814950</td>\n", + " <td>4.915089e+06</td>\n", + " <td>3.928898e+11</td>\n", + " <td>13.003580</td>\n", + " <td>1.618729e+06</td>\n", + " <td>16008</td>\n", + " <td>159871</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " <td>1600000.0</td>\n", + " <td>0.49725</td>\n", + " <td>0.54970</td>\n", + " <td>14.5</td>\n", + " <td>1098.313917</td>\n", + " <td>111.481179</td>\n", + " <td>5.714128e+06</td>\n", + " <td>2.547846e+11</td>\n", + " <td>6.537930</td>\n", + " <td>7.668955e+05</td>\n", + " <td>8940</td>\n", + " <td>89177</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " <td>1600000.0</td>\n", + " <td>0.60115</td>\n", + " <td>0.65470</td>\n", + " <td>14.5</td>\n", + " <td>1970.479083</td>\n", + " <td>112.029752</td>\n", + " <td>5.749183e+06</td>\n", + " <td>4.568703e+11</td>\n", + " <td>6.913018</td>\n", + " <td>8.367091e+05</td>\n", + " <td>15916</td>\n", + " <td>158967</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " <td>2000000.0</td>\n", + " <td>0.41790</td>\n", + " <td>0.47455</td>\n", + " <td>14.5</td>\n", + " <td>952.147279</td>\n", + " <td>109.766960</td>\n", + " <td>5.407755e+06</td>\n", + " <td>2.092678e+11</td>\n", + " <td>16.416734</td>\n", + " <td>1.976359e+06</td>\n", + " <td>7760</td>\n", + " <td>77395</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " <td>2000000.0</td>\n", + " <td>0.62085</td>\n", + " <td>0.63300</td>\n", + " <td>14.0</td>\n", + " <td>1648.902632</td>\n", + " <td>109.860724</td>\n", + " <td>5.472565e+06</td>\n", + " <td>3.642485e+11</td>\n", + " <td>17.297848</td>\n", + " <td>2.053434e+06</td>\n", + " <td>13332</td>\n", + " <td>133119</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " <td>2000000.0</td>\n", + " <td>0.55470</td>\n", + " <td>0.55470</td>\n", + " <td>15.0</td>\n", + " <td>955.355519</td>\n", + " <td>117.087372</td>\n", + " <td>6.274304e+06</td>\n", + " <td>2.434028e+11</td>\n", + " <td>11.576663</td>\n", + " <td>1.347652e+06</td>\n", + " <td>7776</td>\n", + " <td>77587</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " <td>2000000.0</td>\n", + " <td>0.64375</td>\n", + " <td>0.64590</td>\n", + " <td>14.5</td>\n", + " <td>1634.365314</td>\n", + " <td>119.587124</td>\n", + " <td>6.552683e+06</td>\n", + " <td>4.321046e+11</td>\n", + " <td>9.010381</td>\n", + " <td>1.052234e+06</td>\n", + " <td>13204</td>\n", + " <td>131906</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>fedAvg2Clients_cifar10_epoch1</td>\n", + " <td>2300000.0</td>\n", + " <td>0.48845</td>\n", + " <td>0.48845</td>\n", + " <td>15.0</td>\n", + " <td>860.134426</td>\n", + " <td>114.409577</td>\n", + " <td>5.909514e+06</td>\n", + " <td>2.065731e+11</td>\n", + " <td>19.863211</td>\n", + " <td>2.318277e+06</td>\n", + " <td>6996</td>\n", + " <td>69911</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>fedAvg2Clients_cifar10_epoch2</td>\n", + " <td>2300000.0</td>\n", + " <td>0.64675</td>\n", + " <td>0.64675</td>\n", + " <td>15.0</td>\n", + " <td>1484.496279</td>\n", + " <td>115.325316</td>\n", + " <td>6.004245e+06</td>\n", + " <td>3.594997e+11</td>\n", + " <td>20.936606</td>\n", + " <td>2.397544e+06</td>\n", + " <td>11992</td>\n", + " <td>119749</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>fedAvg_cifar10_epoch1</td>\n", + " <td>2300000.0</td>\n", + " <td>0.50045</td>\n", + " <td>0.56410</td>\n", + " <td>14.5</td>\n", + " <td>845.996123</td>\n", + " <td>124.706949</td>\n", + " <td>7.060695e+06</td>\n", + " <td>2.425815e+11</td>\n", + " <td>12.768274</td>\n", + " <td>1.460814e+06</td>\n", + " <td>6888</td>\n", + " <td>68741</td>\n", + " </tr>\n", + " <tr>\n", + " <th>15</th>\n", + " <td>fedAvg_cifar10_epoch2</td>\n", + " <td>2300000.0</td>\n", + " <td>0.63145</td>\n", + " <td>0.65080</td>\n", + " <td>14.0</td>\n", + " <td>1463.414574</td>\n", + " <td>126.980819</td>\n", + " <td>7.322034e+06</td>\n", + " <td>4.321122e+11</td>\n", + " <td>10.732266</td>\n", + " <td>1.215306e+06</td>\n", + " <td>11820</td>\n", + " <td>118047</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " instance fmax accuracy max_acc in_round \\\n", + "0 fedAvg2Clients_cifar10_epoch1 1200000.0 0.46510 0.50155 14.0 \n", + "1 fedAvg2Clients_cifar10_epoch2 1200000.0 0.59975 0.62575 14.0 \n", + "2 fedAvg_cifar10_epoch1 1200000.0 0.55735 0.56320 14.0 \n", + "3 fedAvg_cifar10_epoch2 1200000.0 0.68080 0.68080 15.0 \n", + "4 fedAvg2Clients_cifar10_epoch1 1600000.0 0.49840 0.50655 14.0 \n", + "5 fedAvg2Clients_cifar10_epoch2 1600000.0 0.58080 0.60715 14.5 \n", + "6 fedAvg_cifar10_epoch1 1600000.0 0.49725 0.54970 14.5 \n", + "7 fedAvg_cifar10_epoch2 1600000.0 0.60115 0.65470 14.5 \n", + "8 fedAvg2Clients_cifar10_epoch1 2000000.0 0.41790 0.47455 14.5 \n", + "9 fedAvg2Clients_cifar10_epoch2 2000000.0 0.62085 0.63300 14.0 \n", + "10 fedAvg_cifar10_epoch1 2000000.0 0.55470 0.55470 15.0 \n", + "11 fedAvg_cifar10_epoch2 2000000.0 0.64375 0.64590 14.5 \n", + "12 fedAvg2Clients_cifar10_epoch1 2300000.0 0.48845 0.48845 15.0 \n", + "13 fedAvg2Clients_cifar10_epoch2 2300000.0 0.64675 0.64675 15.0 \n", + "14 fedAvg_cifar10_epoch1 2300000.0 0.50045 0.56410 14.5 \n", + "15 fedAvg_cifar10_epoch2 2300000.0 0.63145 0.65080 14.0 \n", + "\n", + " time mean_power mean_mojitos sum_mojitos std_power_combined \\\n", + "0 1461.975025 100.332947 4.415638e+06 2.621778e+11 9.045125 \n", + "1 2507.221664 100.325435 4.449800e+06 4.501093e+11 9.383412 \n", + "2 1395.147032 105.205707 5.054236e+06 2.869103e+11 5.018977 \n", + "3 2475.625495 105.708773 5.092212e+06 5.091462e+11 5.209437 \n", + "4 1151.661439 104.613917 4.855327e+06 2.268564e+11 12.754132 \n", + "5 1981.882914 104.814950 4.915089e+06 3.928898e+11 13.003580 \n", + "6 1098.313917 111.481179 5.714128e+06 2.547846e+11 6.537930 \n", + "7 1970.479083 112.029752 5.749183e+06 4.568703e+11 6.913018 \n", + "8 952.147279 109.766960 5.407755e+06 2.092678e+11 16.416734 \n", + "9 1648.902632 109.860724 5.472565e+06 3.642485e+11 17.297848 \n", + "10 955.355519 117.087372 6.274304e+06 2.434028e+11 11.576663 \n", + "11 1634.365314 119.587124 6.552683e+06 4.321046e+11 9.010381 \n", + "12 860.134426 114.409577 5.909514e+06 2.065731e+11 19.863211 \n", + "13 1484.496279 115.325316 6.004245e+06 3.594997e+11 20.936606 \n", + "14 845.996123 124.706949 7.060695e+06 2.425815e+11 12.768274 \n", + "15 1463.414574 126.980819 7.322034e+06 4.321122e+11 10.732266 \n", + "\n", + " std_mojitos_combined n_data_mojitos n_data_power \n", + "0 1.204458e+06 11888 118750 \n", + "1 1.237234e+06 20256 202306 \n", + "2 6.049350e+05 11376 113533 \n", + "3 6.499024e+05 20024 200010 \n", + "4 1.581665e+06 9364 93447 \n", + "5 1.618729e+06 16008 159871 \n", + "6 7.668955e+05 8940 89177 \n", + "7 8.367091e+05 15916 158967 \n", + "8 1.976359e+06 7760 77395 \n", + "9 2.053434e+06 13332 133119 \n", + "10 1.347652e+06 7776 77587 \n", + "11 1.052234e+06 13204 131906 \n", + "12 2.318277e+06 6996 69911 \n", + "13 2.397544e+06 11992 119749 \n", + "14 1.460814e+06 6888 68741 \n", + "15 1.215306e+06 11820 118047 " + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# std calculate\n", + "def combined_std(df_group, std_col, n_col):\n", + " num = np.sum((df_group[n_col] - 1) * df_group[std_col]**2)\n", + " denom = np.sum(df_group[n_col] - 1)\n", + " return np.sqrt(num / denom)\n", + "\n", + "#remove file_number and startTime columns\n", + "df = df.drop(columns=['file_number', 'startTime'])\n", + "\n", + "# Separate columns into normal data and std data\n", + "std_columns = [col for col in df.columns if col.startswith(\"std\")]\n", + "n_columns = [col for col in df.columns if col.startswith(\"n_data\")]\n", + "normal_columns = [col for col in df.columns if col not in std_columns + n_columns]\n", + "\n", + "# Calculate sum for number of data columns\n", + "df_sum = df.groupby(['fmax', 'instance'], as_index=False)[n_columns].sum(numeric_only=True)\n", + "\n", + "# Calculate mean for normal data columns\n", + "df_mean = df.groupby(['fmax', 'instance'], as_index=False)[normal_columns].mean(numeric_only=True)\n", + "\n", + "# Calculate combined std for std data columns\n", + "df_std = df.groupby(['fmax', 'instance']).apply(lambda x: pd.Series({col: combined_std(x, col, f\"n_data_{col.split('_')[1]}\") for col in std_columns}), include_groups=False).reset_index()\n", + "\n", + "# Merge the mean and std dataframes\n", + "df_grouped = pd.merge(df_mean, df_std, on=['fmax', 'instance'])\n", + "df_grouped = pd.merge(df_grouped, df_sum, on=['fmax', 'instance'])\n", + "df_grouped" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "marker": { + "color": "rgb(228,26,28)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 1 epoch", + "showlegend": true, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x6", + "y": [ + 0.12631144896879037, + 0.10374650710722544, + 0.08999843558130959, + 0.08473989162366002 + ], + "yaxis": "y6" + }, + { + "marker": { + "color": "rgb(228,26,28)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x2", + "y": [ + 1461.9750247001648, + 1151.6614389419556, + 952.147278547287, + 860.1344259977341 + ], + "yaxis": "y2" + }, + { + "marker": { + "color": "rgb(228,26,28)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x3", + "y": [ + 100.33294744462452, + 104.6139174511662, + 109.76696005205446, + 114.40957727617835 + ], + "yaxis": "y3" + }, + { + "marker": { + "color": "rgb(228,26,28)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x5", + "y": [ + 26217.78215195, + 22685.63942495, + 20926.781556, + 20657.30663055 + ], + "yaxis": "y5" + }, + { + "marker": { + "color": "rgb(228,26,28)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x", + "y": [ + 0.46509999036788935, + 0.4984000027179718, + 0.4178999960422516, + 0.4884500056505203 + ], + "yaxis": "y" + }, + { + "marker": { + "color": "rgb(228,26,28)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x4", + "y": [ + 146684.26331859527, + 120479.81470516503, + 104514.31228797243, + 98407.61607908907 + ], + "yaxis": "y4" + }, + { + "marker": { + "color": "rgb(55,126,184)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 2 epochs", + "showlegend": true, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x6", + "y": [ + 0.21660225679526832, + 0.17887943714240667, + 0.15598996446916602, + 0.14742222405474834 + ], + "yaxis": "y6" + }, + { + "marker": { + "color": "rgb(55,126,184)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x2", + "y": [ + 2507.221663594246, + 1981.8829140663147, + 1648.9026321172714, + 1484.496279001236 + ], + "yaxis": "y2" + }, + { + "marker": { + "color": "rgb(55,126,184)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x3", + "y": [ + 100.32543524886373, + 104.81495036250104, + 109.86072350744945, + 115.32531576520864 + ], + "yaxis": "y3" + }, + { + "marker": { + "color": "rgb(55,126,184)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x5", + "y": [ + 45010.92767335, + 39288.98486005, + 36424.85077915, + 35949.96673165 + ], + "yaxis": "y5" + }, + { + "marker": { + "color": "rgb(55,126,184)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x", + "y": [ + 0.5997500121593475, + 0.5807999968528748, + 0.620849996805191, + 0.6467500030994415 + ], + "yaxis": "y" + }, + { + "marker": { + "color": "rgb(55,126,184)" + }, + "mode": "markers", + "name": "FedAvgClients, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x4", + "y": [ + 251538.1046654729, + 207730.95926214967, + 181149.6361577412, + 171200.0021280948 + ], + "yaxis": "y4" + }, + { + "marker": { + "color": "rgb(77,175,74)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 1 epoch", + "showlegend": true, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x6", + "y": [ + 0.12639167550759633, + 0.10543558968934559, + 0.09632394622616544, + 0.09084859612532126 + ], + "yaxis": "y6" + }, + { + "marker": { + "color": "rgb(77,175,74)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x2", + "y": [ + 1395.147032380104, + 1098.3139171600342, + 955.3555190563202, + 845.9961229562759 + ], + "yaxis": "y2" + }, + { + "marker": { + "color": "rgb(77,175,74)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x3", + "y": [ + 105.20570679301395, + 111.48117860367591, + 117.08737151141113, + 124.70694916627386 + ], + "yaxis": "y3" + }, + { + "marker": { + "color": "rgb(77,175,74)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x5", + "y": [ + 28691.03025915, + 25478.46244345, + 24340.27817005, + 24258.15009865 + ], + "yaxis": "y5" + }, + { + "marker": { + "color": "rgb(77,175,74)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x", + "y": [ + 0.5573500096797943, + 0.4972500056028366, + 0.5546999871730804, + 0.5004499852657318 + ], + "yaxis": "y" + }, + { + "marker": { + "color": "rgb(77,175,74)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 1 epoch", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x4", + "y": [ + 146777.42962172476, + 122441.32996182068, + 111860.06658522438, + 105501.59550037308 + ], + "yaxis": "y4" + }, + { + "marker": { + "color": "rgb(152,78,163)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 2 epochs", + "showlegend": true, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x6", + "y": [ + 0.22534875974573035, + 0.19009224401200017, + 0.16830334649713705, + 0.16001647326152604 + ], + "yaxis": "y6" + }, + { + "marker": { + "color": "rgb(152,78,163)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x2", + "y": [ + 2475.62549495697, + 1970.4790830612183, + 1634.3653135299683, + 1463.4145741462708 + ], + "yaxis": "y2" + }, + { + "marker": { + "color": "rgb(152,78,163)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x3", + "y": [ + 105.70877316918896, + 112.02975218890772, + 119.58712408238989, + 126.98081947181782 + ], + "yaxis": "y3" + }, + { + "marker": { + "color": "rgb(152,78,163)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x5", + "y": [ + 50914.6242963, + 45687.03206595, + 43210.45868935, + 43211.22009515 + ], + "yaxis": "y5" + }, + { + "marker": { + "color": "rgb(152,78,163)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x", + "y": [ + 0.6807999908924103, + 0.6011500060558319, + 0.643750011920929, + 0.6314499974250793 + ], + "yaxis": "y" + }, + { + "marker": { + "color": "rgb(152,78,163)" + }, + "mode": "markers", + "name": "FedAvg, CIFAR10, 2 epochs", + "showlegend": false, + "type": "scatter", + "x": [ + "1.2", + "1.6", + "2.0", + "2.3" + ], + "xaxis": "x4", + "y": [ + 261695.3338982675, + 220752.2833687744, + 195449.04754506238, + 185825.58185209477 + ], + "yaxis": "y4" + } + ], + "layout": { + "annotations": [ + { + "font": { + "size": 22 + }, + "showarrow": false, + "text": "(a)", + "x": 0.13, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 22 + }, + "showarrow": false, + "text": "(b)", + "x": 0.5, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 22 + }, + "showarrow": false, + "text": "(c)", + "x": 0.87, + "xanchor": "center", + "xref": "paper", + "y": 1, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 22 + }, + "showarrow": false, + "text": "(d)", + "x": 0.13, + "xanchor": "center", + "xref": "paper", + "y": 0.4, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 22 + }, + "showarrow": false, + "text": "(e)", + "x": 0.5, + "xanchor": "center", + "xref": "paper", + "y": 0.4, + "yanchor": "bottom", + "yref": "paper" + }, + { + "font": { + "size": 22 + }, + "showarrow": false, + "text": "(f)", + "x": 0.87, + "xanchor": "center", + "xref": "paper", + "y": 0.4, + "yanchor": "bottom", + "yref": "paper" + } + ], + "font": { + "size": 18 + }, + "height": 800, + "legend": { + "font": { + "size": 22 + }, + "orientation": "h", + "x": 0.5, + "xanchor": "center", + "y": -0.3, + "yanchor": "bottom" + }, + "showlegend": true, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "heatmapgl": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmapgl" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "width": 1300, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 0.26 + ], + "title": { + "text": "CPU frequencies (GHz)" + } + }, + "xaxis2": { + "anchor": "y2", + "domain": [ + 0.37, + 0.63 + ], + "title": { + "text": "CPU frequencies (GHz)" + } + }, + "xaxis3": { + "anchor": "y3", + "domain": [ + 0.74, + 1 + ], + "title": { + "text": "CPU frequencies (GHz)" + } + }, + "xaxis4": { + "anchor": "y4", + "domain": [ + 0, + 0.26 + ], + "title": { + "text": "CPU frequencies (GHz)" + } + }, + "xaxis5": { + "anchor": "y5", + "domain": [ + 0.37, + 0.63 + ], + "title": { + "text": "CPU frequencies (GHz)" + } + }, + "xaxis6": { + "anchor": "y6", + "domain": [ + 0.74, + 1 + ], + "title": { + "text": "CPU frequencies (GHz)" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0.6000000000000001, + 1 + ], + "range": [ + 0, + 0.7488799899816514 + ], + "title": { + "text": "Accuracy" + } + }, + "yaxis2": { + "anchor": "x2", + "domain": [ + 0.6000000000000001, + 1 + ], + "range": [ + 0, + 2757.9438299536705 + ], + "title": { + "text": "Time (s)" + } + }, + "yaxis3": { + "anchor": "x3", + "domain": [ + 0.6000000000000001, + 1 + ], + "range": [ + 0, + 139.67890141899963 + ], + "title": { + "text": "Power (W) - Kwollect" + } + }, + "yaxis4": { + "anchor": "x4", + "domain": [ + 0, + 0.4 + ], + "range": [ + 0, + 287864.8672880943 + ], + "title": { + "text": "Energy (J) - Kwollect" + } + }, + "yaxis5": { + "anchor": "x5", + "domain": [ + 0, + 0.4 + ], + "range": [ + 0, + 56006.08672593 + ], + "title": { + "text": "Energy (J) - MojitO/S" + } + }, + "yaxis6": { + "anchor": "x6", + "domain": [ + 0, + 0.4 + ], + "range": [ + 0, + 0.2478836357203034 + ], + "title": { + "text": "CO<sub>2</sub> (gram)" + } + } + } + } + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import plotly.graph_objects as go\n", + "import plotly.express as px\n", + "from plotly.subplots import make_subplots\n", + "import numpy as np\n", + "import pandas as pd\n", + "from scipy.stats import norm\n", + "\n", + "# Function to calculate confidence interval\n", + "def calculate_ci(mean, std, n):\n", + " confidence = 0.95 # % confidence interval\n", + " tail_probability = (1 - confidence) / 2\n", + " z_score = -1 * np.abs(norm.ppf(tail_probability))\n", + " ci = z_score * (std / np.sqrt(n))\n", + " return ci\n", + "\n", + "# Create a copy of df_grouped for plotting (may in future use df_grouped for other purposes)\n", + "df_plot = df_grouped.copy()\n", + "\n", + "# Calculate confidence intervals\n", + "df_plot['ci_power'] = df_plot.apply(lambda row: calculate_ci(row['mean_power'], row['std_power_combined'], row['n_data_power']), axis=1)\n", + "df_plot['ci_mojitos'] = df_plot.apply(lambda row: calculate_ci(row['mean_mojitos'], row['std_mojitos_combined'], row['n_data_mojitos']), axis=1)\n", + "\n", + "# Convert Energy Mojitos from µJ to J\n", + "df_plot['mean_mojitos'] = df_plot['mean_mojitos'] / 10e6\n", + "df_plot['ci_mojitos'] = df_plot['ci_mojitos'] / 10e6 # cause sampling in 0.1 seconds\n", + "df_plot['sum_mojitos'] = df_plot['sum_mojitos'] / 10e6\n", + "\n", + "df_plot['e=p*t'] = df_plot['mean_power'] * df_plot['time']\n", + "\n", + "# Convert fmax to GHz for plotting\n", + "df_plot[\"fmax\"] = (df_plot[\"fmax\"].astype(int) / 1e6).astype(str)\n", + "\n", + "# Sort by fmax\n", + "df_plot = df_plot.sort_values(by=\"fmax\")\n", + "\n", + "# List of instances\n", + "instances = df_plot[\"instance\"].unique()\n", + "\n", + "# Create subplots (2 rows, 3 columns)\n", + "fig = make_subplots(\n", + " rows=2, cols=3,\n", + " subplot_titles=( \"(a)\", \"(b)\", \"(c)\", \"(d)\", \"(e)\", \"(f)\"),\n", + " vertical_spacing=0.2, horizontal_spacing=0.11\n", + ")\n", + "\n", + "# Generate a color map for instances\n", + "colors = px.colors.qualitative.Set1\n", + "color_map = {instance: colors[i % len(colors)] for i, instance in enumerate(instances)}\n", + "\n", + "# Define custom legend names for each instance (you can customize this as needed)\n", + "custom_legend_names = {\n", + " \"fedAvg2Clients_cifar10_epoch1\": \"FedAvgClients, CIFAR10, 1 epoch\", # Replace these with your custom names\n", + " \"fedAvg2Clients_cifar10_epoch2\": \"FedAvgClients, CIFAR10, 2 epochs\",\n", + " \"fedAvg_cifar10_epoch1\": \"FedAvg, CIFAR10, 1 epoch\",\n", + " \"fedAvg_cifar10_epoch2\": \"FedAvg, CIFAR10, 2 epochs\",\n", + " # Add more instances as necessary\n", + "}\n", + "\n", + "# Plot graphs for each instance\n", + "for instance in instances:\n", + " df_instance = df_plot[df_plot[\"instance\"] == instance]\n", + " color = color_map[instance] # Get the corresponding color for the instance\n", + " \n", + " # Custom name for the legend entry\n", + " custom_name = custom_legend_names.get(instance, instance) # Use custom name if available\n", + "\n", + " # Plot Accuracy\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_instance[\"fmax\"], y=df_instance[\"e=p*t\"] * 31 / (3.6 * 10e6),\n", + " mode='markers', marker=dict(color=color),\n", + " name=custom_name, # Set custom name in legend\n", + " showlegend=True\n", + " ),\n", + " row=2, col=3\n", + " )\n", + " \n", + " # Plot Time\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_instance[\"fmax\"], y=df_instance[\"time\"],\n", + " mode='markers', marker=dict(color=color),\n", + " name=custom_name, # Set custom name in legend\n", + " showlegend=False\n", + " ),\n", + " row=1, col=2\n", + " )\n", + " \n", + " # Plot Mean Power with confidence intervals\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_instance[\"fmax\"], y=df_instance[\"mean_power\"],\n", + " mode='markers', marker=dict(color=color),\n", + " name=custom_name, # Set custom name in legend\n", + " showlegend=False\n", + " ),\n", + " row=1, col=3\n", + " )\n", + " \n", + " # Plot sum Mojitos with confidence intervals\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_instance[\"fmax\"], y=df_instance[\"sum_mojitos\"],\n", + " mode='markers', marker=dict(color=color),\n", + " name=custom_name, # Set custom name in legend\n", + " showlegend=False\n", + " ),\n", + " row=2, col=2\n", + " )\n", + " \n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_instance[\"fmax\"], y=df_instance[\"accuracy\"],\n", + " mode='markers', marker=dict(color=color),\n", + " name=custom_name, # Set custom name in legend\n", + " showlegend=False\n", + " ),\n", + " row=1, col=1\n", + " )\n", + "\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_instance[\"fmax\"], y=df_instance[\"e=p*t\"],\n", + " mode='markers', marker=dict(color=color),\n", + " name=custom_name, # Set custom name in legend\n", + " showlegend=False\n", + " ),\n", + " row=2, col=1\n", + " )\n", + "\n", + "# Update layout\n", + "fig.update_layout(\n", + " showlegend=True,\n", + " height=800,\n", + " font=dict(size=18), # Title font size\n", + " width=1300,\n", + " legend=dict(\n", + " font=dict(size=22), \n", + " orientation=\"h\", # Make the legend horizontal\n", + " x=0.5, # Center the legend horizontally\n", + " y=-0.3, # Move the legend below the plot (adjust as needed)\n", + " xanchor=\"center\", # Anchor the x-position in the center\n", + " yanchor=\"bottom\" # Anchor the y-position at the bottom\n", + " )\n", + ")\n", + "\n", + "# Update axis titles for individual subplots\n", + "fig.update_xaxes(title_text=\"CPU frequencies (GHz)\", row=2, col=3)\n", + "fig.update_yaxes(title_text=\"CO<sub>2</sub> (gram)\", row=2, col=3)\n", + "\n", + "fig.update_xaxes(title_text=\"CPU frequencies (GHz)\", row=1, col=2)\n", + "fig.update_yaxes(title_text=\"Time (s)\", row=1, col=2)\n", + "\n", + "fig.update_xaxes(title_text=\"CPU frequencies (GHz)\", row=1, col=3)\n", + "fig.update_yaxes(title_text=\"Power (W) - Kwollect\", row=1, col=3)\n", + "\n", + "fig.update_xaxes(title_text=\"CPU frequencies (GHz)\", row=2, col=2)\n", + "fig.update_yaxes(title_text=\"Energy (J) - MojitO/S\", row=2, col=2)\n", + "\n", + "fig.update_xaxes(title_text=\"CPU frequencies (GHz)\", row=1, col=1)\n", + "fig.update_yaxes(title_text=\"Accuracy\", row=1, col=1)\n", + "\n", + "fig.update_xaxes(title_text=\"CPU frequencies (GHz)\", row=2, col=1)\n", + "fig.update_yaxes(title_text=\"Energy (J) - Kwollect\", row=2, col=1)\n", + "\n", + "# Adjust y-axes limits and labels\n", + "for i in range(1, 3): # 2 rows\n", + " for j in range(1, 4): # 3 columns\n", + " subplot_index = (i - 1) * 3 + j\n", + " yaxis_name = \"y\" if subplot_index == 1 else f\"y{subplot_index}\"\n", + "\n", + " # Get y data for this subplot\n", + " traces = [trace for trace in fig.data if trace.yaxis == yaxis_name]\n", + " y_values = [point for trace in traces if trace.y is not None for point in trace.y]\n", + "\n", + " if y_values: \n", + " y_max = max(y_values)\n", + " y_max_with_padding = y_max * 1.1 \n", + " fig.update_layout(**{f\"yaxis{subplot_index if subplot_index > 1 else ''}\": dict(range=[0, y_max_with_padding])})\n", + "\n", + "# Increase font size for subplot titles\n", + "for annotation in fig['layout']['annotations']:\n", + " annotation['font'] = dict(size=22) # Increase font size\n", + "\n", + "# Show the plot\n", + "fig.show()\n", + "fig.write_image(\"energy_plot.pdf\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "usr", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Data_analysis.zip b/Data_analysis.zip new file mode 100644 index 0000000000000000000000000000000000000000..ce8490455c2a8be7e51039669de70f6f005768ab Binary files /dev/null and b/Data_analysis.zip differ diff --git a/Log.zip b/Log.zip new file mode 100644 index 0000000000000000000000000000000000000000..40932367e29357af9d76e4c47196b12c2998a987 Binary files /dev/null and b/Log.zip differ diff --git a/README.md b/README.md index ddf31b99638a07334b13e7347bf72678e9f7eab5..fdff77ee3aabd9afc24734c72db0af9ce0266c4e 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,116 @@ # FedEator_Results_analysis +Unzip the folders: +```bash +unzip Log.zip #original data +unzip Data_analysis.zip #processed data (output from all steps follow) +``` +All results of experiment are stored in `/Log/Flower_campaign`. -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files +`/Data_analysis` will store the output of all data analysis steps. -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: +## Data Analysis Steps +### 0. **Process Mojitos Folder:** + - Calculate `sum_package_dram` for each timestamp in the Mojitos folder. + - Command to reproduce: +```bash +python3 0_mojitos.py --dir <path_to_instance_folder> ``` -cd existing_repo -git remote add origin https://gitlab.irit.fr/sepia-pub/delight/fedeator_results_analysis.git -git branch -M main -git push -uf origin main +```bash +python3 0_mojitos.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1 +python3 0_mojitos.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2 +python3 0_mojitos.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2 +python3 0_mojitos.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1 ``` -## Integrate with your tools - -- [ ] [Set up project integrations](https://gitlab.irit.fr/sepia-pub/delight/fedeator_results_analysis/-/settings/integrations) - -## Collaborate with your team - -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) - -## Test and Deploy - -Use the built-in continuous integration in GitLab. - -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) - -*** - -# Editing this README - -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. - -## Suggestions for a good README - -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. +### 1. **Analyze Processed Mojitos Folder:** + - Calculate required statistics (e.g., standard deviation, sum, mean) on the processed Mojitos data. + - Command to reproduce: -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. +```bash +python3 1_mojitos_ana.py --dir <path_to_instance_folder> +``` +```bash +python3 1_mojitos_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1 +python3 1_mojitos_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2 +python3 1_mojitos_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2 +python3 1_mojitos_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1 +``` -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. +### 2. **Analyze Power Data:** + - Calculate statistics (e.g., standard deviation, sum, mean) on the power data. + - Command to reproduce: +```bash +python3 2_power_ana.py --dir <path_to_instance_folder> +``` +```bash +python3 2_power_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1 +python3 2_power_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2 +python3 2_power_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2 +python3 2_power_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1 +``` -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. +### 3. **Combine Mojitos and Power Data:** + - Combine the outputs from steps 1 and 2 (Mojitos and Power processed data). + - Command to reproduce: +```bash +python3 3_mean_energy.py --power <power_file_processed> --mojitos <mojitos_file_processed> +``` +```bash +python3 3_mean_energy.py --power Data_analysis/Output_level_1/merged_power_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch1.csv --mojitos Data_analysis/Output_level_1/merged_mojitos_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch1.csv +python3 3_mean_energy.py --power Data_analysis/Output_level_1/merged_power_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch2.csv --mojitos Data_analysis/Output_level_1/merged_mojitos_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch2.csv +python3 3_mean_energy.py --power Data_analysis/Output_level_1/merged_power_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch2.csv --mojitos Data_analysis/Output_level_1/merged_mojitos_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch2.csv +python3 3_mean_energy.py --power Data_analysis/Output_level_1/merged_power_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch1.csv --mojitos Data_analysis/Output_level_1/merged_mojitos_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch1.csv +``` -## Contributing -State if you are open to contributions and what your requirements are for accepting them. +### 4. **Analyze Flower Performance Data:** + - Process the performance data (accuracy, time). + - Command to reproduce: +```bash +python3 4_performance_ana.py --dir <path_to_instance_folder> +``` +```bash +python3 4_flower_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1 +python3 4_flower_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1 +python3 4_flower_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2 +python3 4_flower_ana.py --dir Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2 +``` -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. +### 5. **Combine Energy/Power and Performance Data:** + - Combine the Energy/Power data with performance data. + - Command to reproduce: +```bash +python3 5_combine_energy_fl.py -a <accuracy_time_file> -e <energy_file> -m <metadata_file> +``` +```bash +python3 5_combine_energy_fl.py -a Data_analysis/Output_level_2/flower_fedAvg2Clients_cifar10_epoch2_accuracy_time.csv -e /home/hdomai/Documents/RepoLab/Data/Data_analysis/Output_level_2/mean_energy_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch2.csv -m Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch2/Expetator_taurus-1.lyon.grid5000.fr_1740614797 +python3 5_combine_energy_fl.py -a Data_analysis/Output_level_2/flower_fedAvg_cifar10_epoch2_accuracy_time.csv -e /home/hdomai/Documents/RepoLab/Data/Data_analysis/Output_level_2/mean_energy_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch2.csv -m Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch2/Expetator_taurus-1.lyon.grid5000.fr_1740599416 +python3 5_combine_energy_fl.py -a Data_analysis/Output_level_2/flower_fedAvg2Clients_cifar10_epoch1_accuracy_time.csv -e Data_analysis/Output_level_2/mean_energy_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch1.csv -m Log/Flower_campaign/Flower_instance_fedAvg2Clients_cifar10_epoch1/Expetator_taurus-1.lyon.grid5000.fr_1740657011 +python3 5_combine_energy_fl.py -a Data_analysis/Output_level_2/flower_fedAvg_cifar10_epoch1_accuracy_time.csv -e Data_analysis/Output_level_2/mean_energy_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch1.csv -m Log/Flower_campaign/Flower_instance_fedAvg_cifar10_epoch1/Expetator_taurus-1.lyon.grid5000.fr_1740648134 +``` -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. +### 6. **Compile All Instances into One Campaign File:** + - Gather all the combined instance files into one campaign file. + - Command to reproduce: +```bash +python3 6_final.py -f <combined_file_1> <combined_file_n> -c <str_of_campaign_name> +``` +```bash +python3 6_final.py -f Data_analysis/Output_level_3/combine_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch1.csv Data_analysis/Output_level_3/combine_Flower_campaign_Flower_instance_fedAvg_cifar10_epoch2.csv Data_analysis/Output_level_3/combine_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch1.csv Data_analysis/Output_level_3/combine_Flower_campaign_Flower_instance_fedAvg2Clients_cifar10_epoch2.csv -c Flower_full_campaign +``` -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. +### 7. **Plot the Data (Visualization):** + - Visualize the combined campaign data using the Jupyter notebook. + - Open `7_PLOT.ipynb` and provide the path to the campaign file: +```python +file = '<path_to_campaign_file>' +``` +```bash +file = 'Data_analysis/Output_level_4/combine_Flower_full_campaign.csv' +``` -## License -For open source projects, say how it is licensed. + -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/energy_plot.pdf b/energy_plot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..efd4ed88132a2963c5f56e36328fecdb6a7e9a61 Binary files /dev/null and b/energy_plot.pdf differ