Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
704f74f
test datasets added
J-Fabila Sep 9, 2025
c66feaa
nn templante added
J-Fabila Sep 9, 2025
a042037
rm unnecesary data load from original version
J-Fabila Sep 9, 2025
79e95ce
added new variable in cmdline
J-Fabila Sep 9, 2025
43be9b8
nuevas variables para el nn
J-Fabila Sep 10, 2025
56c383f
NN basico para empezar
J-Fabila Sep 10, 2025
09dc47c
nn :: client :: checkpoint
J-Fabila Sep 10, 2025
4e9a527
utisl primer borrador
J-Fabila Sep 10, 2025
9a97359
training terminado
J-Fabila Sep 10, 2025
6457ec8
evaluate terminada
J-Fabila Sep 10, 2025
60860a4
client lineas innecesarias eliminadas
J-Fabila Sep 10, 2025
fe613b1
correccion server sel
J-Fabila Sep 12, 2025
0547b6c
funcion implementada
J-Fabila Sep 12, 2025
ab96802
server_cmd ajustes para añadir nn
J-Fabila Sep 12, 2025
6b651d5
match cambiado por else if
J-Fabila Sep 12, 2025
6cd3273
correcciones checkpoint
J-Fabila Sep 12, 2025
19253a8
sandbox añadido
J-Fabila Sep 12, 2025
c638fa7
n feats y n out añadidas
J-Fabila Sep 12, 2025
1c5a9c5
añadidas imports
J-Fabila Sep 12, 2025
ea1b234
client funcionando
J-Fabila Sep 15, 2025
166c8ad
init actualizado
J-Fabila Sep 15, 2025
a44cb3b
terminación del código de Laura
J-Fabila Sep 15, 2025
d08f4f7
sanity check del strategy solo con NN
J-Fabila Sep 15, 2025
e4992a6
FedCustomAggregator listo
J-Fabila Sep 15, 2025
db8de02
parametro temperature añadido
J-Fabila Sep 15, 2025
d88e904
funciones de entropia ya utoria añadidas
J-Fabila Sep 15, 2025
24fb327
medidas de incertidumbre añadidas
J-Fabila Sep 15, 2025
f63cc39
temperatura añadida tambien
J-Fabila Sep 15, 2025
8ff06fa
añadido el uncertainty weight
J-Fabila Sep 15, 2025
14bb1d6
innecesarias eliminadas
J-Fabila Sep 15, 2025
f9f9ffc
corrección: temperatura -> T muestras
J-Fabila Sep 16, 2025
769cb0a
corrección ciclo for
J-Fabila Sep 16, 2025
1033d7f
letrero añadido
J-Fabila Sep 16, 2025
c473d7b
variables reorganizadas
J-Fabila Dec 10, 2025
a11b50a
sanity check checkpoint
J-Fabila Dec 10, 2025
cb070b4
pasar config como param
J-Fabila Dec 10, 2025
ee54f71
variables desamarradas
J-Fabila Dec 10, 2025
ff493ec
variables desamarradas nuevo formato
J-Fabila Dec 10, 2025
203c8e4
sanity check parquet list
J-Fabila Dec 10, 2025
43104ab
añadiendo regresion y clasificacion
J-Fabila Dec 10, 2025
cacac9a
prototipos añadidos
J-Fabila Dec 10, 2025
63ae3ae
lasso y ridge añadidas
J-Fabila Dec 12, 2025
a8f21ee
sanity check actualizado
J-Fabila Dec 12, 2025
3f74d5c
reorganizado y regresor añadido
J-Fabila Dec 12, 2025
10a46d1
regression crietrion añadido
J-Fabila Dec 12, 2025
e06bdf3
client_id eliminado: innecesario
J-Fabila Dec 12, 2025
de882fe
clien_id --> node_name
J-Fabila Dec 12, 2025
799a3bf
modelos lineales añadidos
J-Fabila Dec 12, 2025
ef62c68
moviendo cosas a utils
J-Fabila Dec 12, 2025
d701e52
compile results eliminado por ser irrelevante
J-Fabila Dec 12, 2025
e937ecf
saniycheck primera version
J-Fabila Dec 14, 2025
4629170
lr añadido y none como defecto
J-Fabila Dec 14, 2025
4b8a35f
limpieza de variables y sanity check
J-Fabila Dec 15, 2025
4658404
server_cmd reorganization
J-Fabila Dec 15, 2025
439b1d9
reorganizado y funciones del server añadidas
J-Fabila Dec 15, 2025
149c2cf
sanityyycheck server actualizado
J-Fabila Dec 15, 2025
141bbf7
correccion de variables
J-Fabila Dec 15, 2025
086f6cc
nuevas variables
J-Fabila Dec 15, 2025
fba0793
SVM regresion añadido y variables nuevas
J-Fabila Dec 15, 2025
6269272
correcciones server con linear regression
J-Fabila Dec 17, 2025
e674f21
random fores variables ajustadas
J-Fabila Dec 19, 2025
01a4b9f
quite el clasification para dejarlo general
J-Fabila Dec 19, 2025
ca6b7eb
nombre de variable corregida
J-Fabila Dec 19, 2025
01590a2
quité cosas innecesarias
J-Fabila Dec 19, 2025
811f702
pequeño ajuste en variables
J-Fabila Dec 19, 2025
daebdbd
mejoras en sanity check
J-Fabila Dec 19, 2025
444af4f
correccion lineales
J-Fabila Dec 20, 2025
3a6af91
cambio variables
J-Fabila Dec 20, 2025
0edb075
target_label -> targe_labels
J-Fabila Dec 20, 2025
9763e5c
checkpoint
J-Fabila Dec 20, 2025
328ad5d
checkpoint client linear funciones de perdida
J-Fabila Dec 20, 2025
5cefaac
nombres de modelos añadidos
J-Fabila Dec 20, 2025
499216d
linear svr añadido y params
J-Fabila Dec 20, 2025
7114ac8
metrics añadido regresion y multiclase
J-Fabila Dec 22, 2025
596c82b
ajustes en evaluate
J-Fabila Dec 22, 2025
bcd1635
linear regression funcionando
J-Fabila Dec 22, 2025
8049a66
conflicto penalty-l1_ratio resuelto
J-Fabila Dec 22, 2025
871cc8b
correcciones keys rotas
J-Fabila Dec 22, 2025
7338d50
correccion paths
J-Fabila Dec 23, 2025
21495d6
correcciones cliente random forest
J-Fabila Dec 23, 2025
05d546c
correcciones cliente random forest
J-Fabila Dec 23, 2025
c2c3e47
desjarcodeando cosas
J-Fabila Dec 27, 2025
cfbb605
corrección: val -> test
J-Fabila Dec 27, 2025
0447a31
correccion
J-Fabila Dec 27, 2025
47f52de
variables añadidas
J-Fabila Dec 28, 2025
3a6cc5d
correccion
J-Fabila Dec 28, 2025
f0eaeaa
random_forest terminado
J-Fabila Jan 5, 2026
7908093
adaptando nn para regresión tambien
J-Fabila Jan 6, 2026
ca31b6e
correccion, listo para pruebas
J-Fabila Jan 6, 2026
04c6afd
correccion client para clasificacion
J-Fabila Jan 6, 2026
cf6a6b7
server arreglado
J-Fabila Jan 6, 2026
d565638
primer intento de cliente xgboost
J-Fabila Jan 6, 2026
a603511
client checkpoint
J-Fabila Jan 7, 2026
5819796
client prelimianr
J-Fabila Jan 8, 2026
dc72699
server preliminar
J-Fabila Jan 8, 2026
bdc3871
linea equivocada corregida
J-Fabila Jan 8, 2026
f0a2cc0
variable XGB especifica añadida
J-Fabila Jan 8, 2026
2c2887f
xgb eliminado
J-Fabila Jan 8, 2026
70d710f
nuevo cliente y server
J-Fabila Jan 8, 2026
071d74a
correcciones añadidas
J-Fabila Jan 9, 2026
00529c2
correccion cliente
J-Fabila Jan 10, 2026
e469ab6
correccion modelos lineales
J-Fabila Jan 14, 2026
854cc00
correccion shapes pred modelos lineales
J-Fabila Jan 14, 2026
863b255
correccion default vars
J-Fabila Jan 14, 2026
4e8edfa
sanity check ajuste svm
J-Fabila Jan 14, 2026
c491483
correccion svm bin class
J-Fabila Jan 14, 2026
0b79b28
correccion svm
J-Fabila Jan 14, 2026
42987e1
correccion tipo de dato
J-Fabila Jan 15, 2026
8272fbe
correccion para multiclase
J-Fabila Jan 15, 2026
4714b50
correccion metrics
J-Fabila Jan 16, 2026
c62152c
correccion datasets
J-Fabila Jan 20, 2026
ab4b01e
correccion server
J-Fabila Jan 20, 2026
526467a
sandbox corregidos
J-Fabila Jan 26, 2026
c8e6e2b
modelos de Iratxe
J-Fabila Jan 26, 2026
81bfa68
variables del survival
J-Fabila Jan 26, 2026
9431140
survival añadido
J-Fabila Jan 26, 2026
d13b6f8
client id eliminad
J-Fabila Jan 26, 2026
44c0c07
dependencias nuevas
J-Fabila Jan 27, 2026
d68ec18
survival integrados
J-Fabila Jan 28, 2026
16564b0
sanity check del survival
J-Fabila Jan 28, 2026
8c8fad6
XGB IRH
J-Fabila Jan 31, 2026
106ec64
sanity check
J-Fabila Jan 31, 2026
f726aaf
correccion en init
J-Fabila Feb 1, 2026
3e38f4e
client id eliminado
J-Fabila Feb 1, 2026
f4c3052
id eliminado tambine
J-Fabila Feb 1, 2026
9e15717
requirements actualizados
J-Fabila Feb 5, 2026
a2a293c
parametro no requerido
J-Fabila Feb 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 69 additions & 95 deletions client_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,79 +12,79 @@
#import grpc

import flcore.datasets as datasets
from flcore.client_selector import get_model_client

# Start Flower client but after the server or error
from flcore.utils import StreamToLogger, GetModelClient, CheckClientConfig, survival_models_list

if __name__ == "__main__":

parser = argparse.ArgumentParser(description="Reads parameters from command line.")
# # parser.add_argument("--client_id", type=int, default="Client Id", help="Number of client")
# Variables node settings
parser.add_argument("--node_name", type=str, default="./", help="Node name for certificates")
parser.add_argument("--local_port", type=int, default=8081, help="Local port")
parser.add_argument("--sandbox_path", type=str, default="/sandbox", help="Sandbox path to use")
parser.add_argument("--certs_path", type=str, default="/certs", help="Certificates path")
parser.add_argument("--data_path", type=str, default="/data", help="Data path")
parser.add_argument("--production_mode", type=str, default="True", help="Production mode") # ¿Should exist?
parser.add_argument("--experiment_name", type=str, default="experiment_1", help="Experiment directory")
# Variables dataset related
parser.add_argument("--dataset", type=str, default="dt4h_format", help="Dataloader to use")
#parser.add_argument("--metadata_file", type=str, default="metadata.json", help="Json file with metadata")
parser.add_argument("--data_id", type=str, default="data_id.parquet" , help="Dataset ID")
parser.add_argument("--normalization_method",type=str, default="IQR", help="Type of normalization: IQR STD MIN_MAX")
parser.add_argument("--train_labels", type=str, nargs='+', default=None, help="Dataloader to use")
parser.add_argument("--target_label", type=str, nargs='+', default=None, help="Dataloader to use")
parser.add_argument("--train_size", type=float, default=0.8, help="Fraction of dataset to use for training. [0,1)")
parser.add_argument("--num_clients", type=int, default=1, help="Number of clients")
parser.add_argument("--model", type=str, default="random_forest", help="Model to train")
parser.add_argument("--target_labels", type=str, nargs='+', default=None, help="Dataloader to use")
parser.add_argument("--train_size", type=float, default=0.7, help="Fraction of dataset to use for training. [0,1)")
parser.add_argument("--validation_size", type=float, default=0.2, help="Fraction of dataset to use for validation. [0,1)")
parser.add_argument("--test_size", type=float, default=0.1, help="Fraction of dataset to use for testing. [0,1)")
# Variables training related
parser.add_argument("--num_rounds", type=int, default=50, help="Number of federated iterations")
parser.add_argument("--lr", type=float, default=1e-3, help="Learning rate when needed")
parser.add_argument("--checkpoint_selection_metric", type=str, default="precision", help="Metric used for checkpoints")
parser.add_argument("--dropout_method", type=str, default=None, help="Determines if dropout is used")
parser.add_argument("--smooth_method", type=str, default=None, help="Weight smoothing")
parser.add_argument("--seed", type=int, default=42, help="Seed")
parser.add_argument("--local_port", type=int, default=8081, help="Local port")
parser.add_argument("--production_mode", type=str, default="True", help="Production mode")
parser.add_argument("--node_name", type=str, default="./", help="Node name for certificates")

parser.add_argument("--experiment", type=json.loads, default={"name": "experiment_1", "log_path": "logs", "debug": "true"}, help="experiment logs")
parser.add_argument("--smoothWeights", type=json.loads, default= {"smoothing_strenght": 0.5}, help="Smoothing parameters")
parser.add_argument("--linear_models", type=json.loads, default={"n_features": 9}, help="Linear model parameters")
# parser.add_argument("--n_features", type=int, default=0, help="Number of features")
parser.add_argument("--random_forest", type=json.loads, default={"balanced_rf": "true"}, help="Random forest parameters")
parser.add_argument("--weighted_random_forest", type=json.loads, default={"balanced_rf": "true", "levelOfDetail": "DecisionTree"}, help="Weighted random forest parameters")
parser.add_argument("--xgb", type=json.loads, default={"batch_size": 32,"num_iterations": 100,"task_type": "BINARY","tree_num": 500}, help="XGB parameters")
parser.add_argument("--num_clients", type=int, default=1, help="Number of clients") # shouldnt exist here

# Variables hardcoded
parser.add_argument("--sandbox_path", type=str, default="/sandbox", help="Sandbox path to use")
parser.add_argument("--certs_path", type=str, default="/certs", help="Certificates path")
parser.add_argument("--data_path", type=str, default="/data", help="Data path")
# General variables model related
parser.add_argument("--model", type=str, default="random_forest", help="Model to train")
parser.add_argument("--n_feats", type=int, default=0, help="Number of input features")
parser.add_argument("--n_out", type=int, default=0, help="Number of output features")
parser.add_argument("--task", type=str, default="None", help="Task to perform (classification, regression)")
parser.add_argument("--device", type=str, default="cpu", help="Device for training, CPU, GPU")
parser.add_argument("--local_epochs", type=int, default=10, help="Number of local epochs to train in each round")
parser.add_argument("--batch_size", type=int, default=8, help="Batch size to train")
parser.add_argument("--penalty", type=str, default="none", help="Penalties: none, l1, l2, elasticnet, smooth l1")

# Specific variables model related
# # Linear models
parser.add_argument("--solver", type=str, default="saga", help="Numerical solver of optimization method")
parser.add_argument("--l1_ratio", type=str, default=0.5, help="L1-L2 Ratio, necessary for ElasticNet, 0 -> L1 ; 1 -> L2")
parser.add_argument("--max_iter", type=int, default=100000, help="Max iterations of optimizer")
parser.add_argument("--tol", type=float, default=0.001, help="Gamma for SVR")
parser.add_argument("--kernel", type=str, default="linear", help="Kernel of SVR")
#kernel{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’} or callable, default=’rbf’
parser.add_argument("--degree", type=int, default=3, help="Degree of polinonial")
parser.add_argument("--gamma", type=str, default="scale", help="Gamma for SVR")
# # Random forest
parser.add_argument("--balanced", type=str, default="True", help="Balanced Random Forest: True or False")
parser.add_argument("--n_estimators", type=int, default=100, help="Number of estimators")
parser.add_argument("--max_depth", type=int, default=2, help="Max depth")
parser.add_argument("--class_weight", type=str, default="balanced", help="Class weight")
parser.add_argument("--levelOfDetail", type=str, default="DecisionTree", help="Level of detail")
parser.add_argument("--regression_criterion", type=str, default="squared_error", help="Criterion for training")
# # Neural networks
# params : type: "nn", "BNN" Bayesiana, otros
parser.add_argument("--dropout_p", type=float, default=0.0, help="Montecarlo dropout rate")
parser.add_argument("--T", type=int, default=20, help="Samples of MC dropout")
# # XGB
parser.add_argument("--booster", type=str, default="gbtree", help="Booster to use: gbtree, gblinear or dart")
parser.add_argument("--tree_method", type=str, default="hist", help="Tree method: exact, approx hist")
parser.add_argument("--train_method", type=str, default="bagging", help="Train method: bagging, cyclic")
parser.add_argument("--eta", type=float, default=0.1, help="ETA value")
# # Survival
parser.add_argument("--time_col", type=str, default="time", help="")
parser.add_argument("--event_col", type=str, default="event", help="")
parser.add_argument("--negative_duration_strategy", type=str, default="clip", help="")

args = parser.parse_args()

config = vars(args)

est = config["data_id"]
id = est.split("/")[-1]
# dir_name = os.path.dirname(config["data_id"])
dir_name_parent = str(Path(config["data_id"]).parent)

# config["metadata_file"] = os.path.join(dir_name_parent,"metadata.json")
config["metadata_file"] = os.path.join(est,"metadata.json")

pattern = "*.parquet"
parquet_files = glob.glob(os.path.join(est, pattern))
# ¿How to choose one of the list?
config["data_file"] = parquet_files[-1]

new = []
for i in config["train_labels"]:
parsed = i.replace("]", "").replace("[", "").replace(",", "")
new.append(parsed)
config["train_labels"] = new

new = []
for i in config["target_label"]:
parsed = i.replace("]", "").replace("[", "").replace(",", "")
new.append(parsed)
config["target_labels"] = new

if config["model"] in ("logistic_regression", "elastic_net", "lsvc"):
config["linear_models"] = {}
n_feats = len(config["train_labels"])
config['linear_models']['n_features'] = n_feats # config["n_features"]
config["held_out_center_id"] = -1
config = CheckClientConfig(config)

# Create sandbox log file path
sandbox_log_file = Path(os.path.join(config["sandbox_path"], "log_client.txt"))
Expand All @@ -108,19 +108,6 @@
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# Redirect print() and sys.stdout/sys.stderr into logger
class StreamToLogger:
def __init__(self, logger, level):
self.logger = logger
self.level = level

def write(self, message):
for line in message.rstrip().splitlines():
self.logger.log(self.level, line.rstrip())

def flush(self):
pass

# Create two sub-loggers
stdout_logger = logging.getLogger("STDOUT")
stderr_logger = logging.getLogger("STDERR")
Expand All @@ -135,7 +122,8 @@ def flush(self):
# Now you can use logging in both places
logging.debug("This will be logged to both the console and the file.")

model = config["model"]
#### PODRIAMOS QUITAR ESTO DE PRODUCTION MODE; NO TIENE NINGUN SENTIDO
#model = config["model"]
if config["production_mode"] == "True":
node_name = os.getenv("NODE_NAME")
# num_client = int(node_name.split("_")[-1])
Expand Down Expand Up @@ -170,30 +158,12 @@ def flush(self):
# raise ValueError("Please provide the client id when running in simulation mode")
# num_client = int(sys.argv[1])

# *******************************************************************************************
# Aquí lo correcto es cargar todo como instancias de dataloader de torch
num_client = 0 # config["client_id"]
(X_train, y_train), (X_test, y_test) = datasets.load_dataset(config, num_client)

data = (X_train, y_train), (X_test, y_test)
client = get_model_client(config, data, num_client)
"""
if isinstance(client, fl.client.NumPyClient):
fl.client.start_numpy_client(
server_address=f"{central_ip}:{central_port}",
# credentials=ssl_credentials,
root_certificates=root_certificate,
client=client,
# channel = channel,
)
else:
fl.client.start_client(
server_address=f"{central_ip}:{central_port}",
# credentials=ssl_credentials,
root_certificates=root_certificate,
client=client,
# channel = channel,
)
#fl.client.start_client(channel=channel, client=client)
"""
data = datasets.load_dataset(config, num_client)
client = GetModelClient(config, data)
# *******************************************************************************************
for attempt in range(3):
try:
if isinstance(client, fl.client.NumPyClient):
Expand All @@ -220,3 +190,7 @@ def flush(self):
else:
print("All connection attempts failed.")
raise

sys.stdout.flush()
sys.stderr.flush()
os._exit(0)
Binary file not shown.
Loading
Loading