Coverage for sparkle/CLI/help/global_variables.py: 77%

65 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-09-29 10:17 +0000

1#!/usr/bin/env python3 

2"""Definitions of constants broadly used in Sparkle.""" 

3 

4import ast 

5from argparse import Namespace 

6import random 

7import numpy as np 

8 

9from sparkle.platform.settings_objects import Settings 

10from sparkle.structures import PerformanceDataFrame 

11from sparkle.configurator.configurator import ConfigurationScenario 

12from sparkle.configurator.implementations import ( 

13 SMAC2Scenario, 

14 SMAC3Scenario, 

15 ParamILSScenario, 

16 IRACEScenario, 

17) 

18from sparkle.selector import SelectionScenario 

19 

20 

21__settings: Settings = None 

22 

23 

24def settings(argsv: Namespace = None) -> Settings: 

25 """Function to get the global settings object.""" 

26 global __settings 

27 if __settings is None: 

28 __settings = Settings(Settings.DEFAULT_settings_path, argsv=argsv) 

29 # Set global random state 

30 max_seed = 2**32 - 1 

31 latest_ini = Settings(Settings.DEFAULT_previous_settings_path) 

32 # Determine seed priority: latest.ini > __settings > random 

33 seed = latest_ini.seed or __settings.seed or random.randint(0, max_seed) 

34 # Set global RNG states 

35 np.random.seed(seed) 

36 random.seed(seed) 

37 __settings.random_state = seed 

38 # Next seed will be saved in latest.ini when the cli script calls 'write_used_settings()' 

39 next_seed = random.randint(0, max_seed) 

40 __settings.seed = next_seed 

41 

42 elif argsv is not None: 

43 __settings.apply_arguments(argsv) 

44 

45 return __settings 

46 

47 

48__configuration_scenarios: list[ConfigurationScenario] = None 

49__selection_scenarios: list[SelectionScenario] = None 

50 

51 

52def configuration_scenarios(refresh: bool = False) -> list[ConfigurationScenario]: 

53 """Fetch all known configuration scenarios.""" 

54 global __configuration_scenarios 

55 config_path = Settings.DEFAULT_configuration_output 

56 if __configuration_scenarios is None or refresh: 

57 __configuration_scenarios = [] 

58 for f in config_path.glob("*/*/*.*"): # We look for files at depth three 

59 if "scenario" not in f.name: 

60 continue 

61 if "SMAC2" in str(f): 

62 __configuration_scenarios.append(SMAC2Scenario.from_file(f)) 

63 elif "SMAC3" in str(f): 

64 __configuration_scenarios.append(SMAC3Scenario.from_file(f)) 

65 elif "ParamILS" in str(f): 

66 __configuration_scenarios.append(ParamILSScenario.from_file(f)) 

67 elif "IRACE" in str(f): 

68 __configuration_scenarios.append(IRACEScenario.from_file(f)) 

69 return __configuration_scenarios 

70 

71 

72def selection_scenarios(refresh: bool = False) -> list[SelectionScenario]: 

73 """Fetch all known selection scenarios.""" 

74 global __selection_scenarios 

75 selection_path = Settings.DEFAULT_selection_output 

76 if __selection_scenarios is None or refresh: 

77 __selection_scenarios = [] 

78 for f in selection_path.glob("*/*/*.txt"): # We look for files at depth three 

79 if "scenario" not in f.name: 

80 continue 

81 __selection_scenarios.append(SelectionScenario.from_file(f)) 

82 return __selection_scenarios 

83 

84 

85def parallel_portfolio_scenarios() -> list[PerformanceDataFrame]: 

86 """Fetch all known parallel portfolio scenarios.""" 

87 parallel_portfolio_path = Settings.DEFAULT_parallel_portfolio_output 

88 return [PerformanceDataFrame(f) for f in parallel_portfolio_path.glob("*/*.csv")] 

89 

90 

91reference_list_dir = Settings.DEFAULT_reference_dir 

92extractor_nickname_list_path = reference_list_dir / "sparkle_extractor_nickname_list.txt" 

93solver_nickname_list_path = reference_list_dir / "sparkle_solver_nickname_list.txt" 

94instances_nickname_path = reference_list_dir / "sparkle_instance_nickname_list.txt" 

95 

96file_storage_data_mapping = { 

97 solver_nickname_list_path: {}, 

98 instances_nickname_path: {}, 

99 extractor_nickname_list_path: {}, 

100} 

101 

102for data_path in file_storage_data_mapping.keys(): 

103 if data_path.exists(): 

104 with data_path.open("r+") as fo: 

105 file_storage_data_mapping[data_path] = ast.literal_eval(fo.read()) 

106 

107solver_nickname_mapping = file_storage_data_mapping[solver_nickname_list_path] 

108instance_set_nickname_mapping = file_storage_data_mapping[instances_nickname_path]