/ src / simulation_runner / runner.py
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