runner.py
1 # Python Imports 2 import os 3 import shutil 4 import random 5 from typing import Generator 6 7 # Project Imports 8 from src.utilities.env_variables import BINARY_PATH, CONFIGURATION_SETTINGS, SHARED_FOLDER 9 from src.utilities.files.json.json_utils import write_json 10 11 12 class SimulationRunner: 13 14 def __init__(self, arguments_config: dict, simulation_config: dict): 15 self._arguments_config = arguments_config 16 self._base_simulation_config = simulation_config 17 random.seed(self._base_simulation_config["seed"]) 18 19 def run_simulation(self): 20 21 output_path = self._create_folder() 22 23 seeds_generator = self._create_seeds_generator() 24 25 for seed in seeds_generator: 26 self._base_simulation_config["seed"] = seed 27 28 write_json(self._base_simulation_config, CONFIGURATION_SETTINGS) 29 30 file_format = self._arguments_config["output-format"] 31 output_name = self._arguments_config["output-file"] + "_" + str(seed) 32 33 os.system(f"{BINARY_PATH} -f {file_format} -i {CONFIGURATION_SETTINGS} -o {output_name}") 34 35 os.system(f"mv {output_name}.{file_format} {output_path}") 36 37 def _create_folder(self): 38 output_path = SHARED_FOLDER + self._arguments_config["output-folder"] 39 40 if os.path.exists(output_path): 41 shutil.rmtree(output_path) 42 os.makedirs(output_path) 43 44 return output_path 45 46 def _create_seeds_generator(self) -> Generator[int, None, None]: 47 # Rust binary seed uses u64 int 48 seeds = (random.randint(0, 2 ** 64) for _ in range(self._arguments_config["number-of-simulations"])) 49 50 return seeds