diff --git a/config.py b/config.py index 78294cb..31c1a0f 100644 --- a/config.py +++ b/config.py @@ -53,6 +53,10 @@ SIMULAZIONE = { # Cartella di output. "cartella_output": "dataset", + + # Numero di processi paralleli per la generazione dei run. + # None = usa tutti i core disponibili. + "num_processi": None, } FASCETTA = { diff --git a/simulate.py b/simulate.py index 1cac1a5..7b482b0 100644 --- a/simulate.py +++ b/simulate.py @@ -1,7 +1,9 @@ import csv import math +import os import random import shutil +from concurrent.futures import ProcessPoolExecutor from copy import deepcopy from pathlib import Path @@ -442,19 +444,33 @@ def simula_singolo(cfg_run: dict, output_csv: Path, rng: random.Random) -> dict: } +def _esegui_run(indice_e_seme: tuple[int, int]) -> dict: + # Ogni run riceve un seme indipendente derivato dal seed globale, così + # l'esecuzione in parallelo resta riproducibile indipendentemente + # dall'ordine in cui i processi la completano. + indice, seme = indice_e_seme + rng = random.Random(seme) + cfg_run = configurazione_randomizzata(indice, rng) + cartella_output = Path(SIMULAZIONE["cartella_output"]) + percorso_csv = cartella_output / f"{cfg_run['id_run']}.csv" + return simula_singolo(cfg_run, percorso_csv, rng) + + def main() -> None: cartella_output = Path(SIMULAZIONE["cartella_output"]) if cartella_output.exists(): shutil.rmtree(cartella_output) cartella_output.mkdir(parents=True, exist_ok=True) - rng = random.Random(SIMULAZIONE["seed"]) + rng_semi = random.Random(SIMULAZIONE["seed"]) + num_run = SIMULAZIONE["num_run"] + semi = [rng_semi.randrange(2**63) for _ in range(num_run)] - righe_metadata = [] - for i in range(1, SIMULAZIONE["num_run"] + 1): - cfg_run = configurazione_randomizzata(i, rng) - percorso_csv = cartella_output / f"{cfg_run['id_run']}.csv" - righe_metadata.append(simula_singolo(cfg_run, percorso_csv, rng)) + num_processi = SIMULAZIONE["num_processi"] or os.cpu_count() or 1 + with ProcessPoolExecutor(max_workers=num_processi) as executor: + righe_metadata = list( + executor.map(_esegui_run, enumerate(semi, start=1)) + ) percorso_metadata = cartella_output / "metadata.csv" with percorso_metadata.open("w", newline="") as f: