1717dirname = os .path .dirname (__file__ )
1818
1919
20+ def save_class_count_per_participant (experiment_name , class_counter : Counter , idx ):
21+ class_count = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ), experiment_name , "trustworthiness" , f"{ str (idx )} _class_count.json" )
22+ result = {hashids .encode (int (class_id )): count for class_id , count in class_counter .items ()}
23+ with open (class_count , "w" ) as f :
24+ json .dump (result , f )
25+
26+ def count_all_class_samples (experiment_name ):
27+ participant_id = 0
28+ global_class_count = {}
29+
30+ while True :
31+ data_class_count_file = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ), experiment_name , "trustworthiness" , f"{ str (participant_id )} _class_count.json" )
32+
33+ if not os .path .exists (data_class_count_file ):
34+ break
35+
36+ with open (data_class_count_file , "r" ) as f :
37+ class_count = json .load (f )
38+
39+ for class_hash , count in class_count .items ():
40+ global_class_count [class_hash ] = global_class_count .get (class_hash , 0 ) + count
41+
42+ participant_id += 1
43+
44+ # Guardar conteo total en class_count.json
45+ output_file = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ),experiment_name , "trustworthiness" , "count_class.json" )
46+
47+ with open (output_file , "w" ) as f :
48+ json .dump (global_class_count , f , indent = 2 )
49+
2050def count_class_samples (scenario_name , dataloaders_files , class_counter : Counter = None ):
2151 """
2252 Counts the number of samples by class.
@@ -56,6 +86,35 @@ def count_class_samples(scenario_name, dataloaders_files, class_counter: Counter
5686 json .dump (result , f )
5787
5888
89+ def get_all_data_entropy (experiment_name ):
90+ participant_id = 0
91+ data_class_count_file = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ), experiment_name , "trustworthiness" , f"{ str (participant_id )} _class_count.json" )
92+ entropy_per_participant = {}
93+
94+ while True :
95+ data_class_count_file = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ), experiment_name , "trustworthiness" , f"{ str (participant_id )} _class_count.json" )
96+
97+ if not os .path .exists (data_class_count_file ):
98+ break
99+
100+ with open (data_class_count_file , "r" ) as f :
101+ class_count = json .load (f )
102+
103+ total = sum (class_count .values ())
104+ if total == 0 :
105+ entropy_value = 0.0
106+ else :
107+ probabilities = [count / total for count in class_count .values ()]
108+ entropy_value = entropy (probabilities , base = 2 )
109+
110+ entropy_per_participant [str (participant_id )] = round (entropy_value , 6 )
111+ participant_id += 1
112+
113+ name_file = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ),experiment_name , "trustworthiness" , "entropy.json" )
114+
115+ with open (name_file , "w" ) as f :
116+ json .dump (entropy_per_participant , f , indent = 2 )
117+
59118def get_entropy (client_id , scenario_name , dataloader ):
60119 """
61120 Get the entropy of each client in the scenario.
@@ -72,6 +131,7 @@ def get_entropy(client_id, scenario_name, dataloader):
72131 name_file = os .path .join (os .environ .get ('NEBULA_LOGS_DIR' ), scenario_name , "trustworthiness" , "entropy.json" )
73132
74133 if os .path .exists (name_file ):
134+ logging .info (f"entropy fiel already exists.. loading." )
75135 with open (name_file , "r" ) as f :
76136 client_entropy = json .load (f )
77137
0 commit comments