omniopt2 7037__py3-none-any.whl → 7075__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. .omniopt.py +21 -9
  2. .tpe.py +202 -0
  3. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt.py +21 -9
  4. omniopt2-7075.data/data/bin/.tpe.py +202 -0
  5. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/requirements.txt +1 -0
  6. {omniopt2-7037.dist-info → omniopt2-7075.dist-info}/METADATA +2 -1
  7. {omniopt2-7037.dist-info → omniopt2-7075.dist-info}/RECORD +39 -37
  8. omniopt2.egg-info/PKG-INFO +2 -1
  9. omniopt2.egg-info/SOURCES.txt +1 -0
  10. omniopt2.egg-info/requires.txt +1 -0
  11. pyproject.toml +1 -1
  12. requirements.txt +1 -0
  13. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.colorfunctions.sh +0 -0
  14. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.general.sh +0 -0
  15. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.helpers.py +0 -0
  16. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_cpu_ram_usage.py +0 -0
  17. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_general.py +0 -0
  18. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_gpu_usage.py +0 -0
  19. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_kde.py +0 -0
  20. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_scatter.py +0 -0
  21. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_scatter_generation_method.py +0 -0
  22. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_scatter_hex.py +0 -0
  23. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_time_and_exit_code.py +0 -0
  24. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_trial_index_result.py +0 -0
  25. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.omniopt_plot_worker.py +0 -0
  26. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.random_generator.py +0 -0
  27. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/.shellscript_functions +0 -0
  28. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/LICENSE +0 -0
  29. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/apt-dependencies.txt +0 -0
  30. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/omniopt +0 -0
  31. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/omniopt_docker +0 -0
  32. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/omniopt_evaluate +0 -0
  33. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/omniopt_plot +0 -0
  34. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/omniopt_share +0 -0
  35. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/setup.py +0 -0
  36. {omniopt2-7037.data → omniopt2-7075.data}/data/bin/test_requirements.txt +0 -0
  37. {omniopt2-7037.dist-info → omniopt2-7075.dist-info}/WHEEL +0 -0
  38. {omniopt2-7037.dist-info → omniopt2-7075.dist-info}/licenses/LICENSE +0 -0
  39. {omniopt2-7037.dist-info → omniopt2-7075.dist-info}/top_level.txt +0 -0
.omniopt.py CHANGED
@@ -41,7 +41,7 @@ overwritten_to_random: bool = False
41
41
  valid_occ_types: list = ["geometric", "euclid", "signed_harmonic", "signed_minkowski", "weighted_euclid", "composite"]
42
42
  joined_valid_occ_types: str = ", ".join(valid_occ_types)
43
43
 
44
- SUPPORTED_MODELS: list = ["SOBOL", "FACTORIAL", "SAASBO", "BOTORCH_MODULAR", "UNIFORM", "BO_MIXED", "RANDOMFOREST", "EXTERNAL_GENERATOR", "PSEUDORANDOM"]
44
+ SUPPORTED_MODELS: list = ["SOBOL", "FACTORIAL", "SAASBO", "BOTORCH_MODULAR", "UNIFORM", "BO_MIXED", "RANDOMFOREST", "EXTERNAL_GENERATOR", "PSEUDORANDOM", "TPE"]
45
45
  joined_supported_models: str = ", ".join(SUPPORTED_MODELS)
46
46
 
47
47
  special_col_names: list = ["arm_name", "generation_method", "trial_index", "trial_status", "generation_node", "idxs"]
@@ -556,6 +556,7 @@ class ConfigLoader:
556
556
  follow: bool
557
557
  show_generation_and_submission_sixel: bool
558
558
  n_estimators_randomforest: int
559
+ max_num_of_parallel_sruns: int
559
560
  checkout_to_latest_tested_version: bool
560
561
  load_data_from_existing_jobs: List[str]
561
562
  time: str
@@ -659,6 +660,7 @@ class ConfigLoader:
659
660
  speed.add_argument('--dont_jit_compile', help='Disable JIT-compiling the model', action='store_true', default=False)
660
661
  speed.add_argument('--num_restarts', help='num_restarts option for optimizer_options', type=int, default=20)
661
662
  speed.add_argument('--raw_samples', help='raw_samples option for optimizer_options', type=int, default=1024)
663
+ speed.add_argument('--max_num_of_parallel_sruns', help='Maximal number of parallel sruns', type=int, default=16)
662
664
  speed.add_argument('--no_transform_inputs', help='Disable input transformations', action='store_true', default=False)
663
665
  speed.add_argument('--no_normalize_y', help='Disable target normalization', action='store_true', default=False)
664
666
 
@@ -4941,9 +4943,13 @@ def get_type_short(typename: str) -> str:
4941
4943
  return typename
4942
4944
 
4943
4945
  @beartype
4944
- def parse_single_experiment_parameter_table(classic_params: Union[list, dict]) -> list:
4946
+ def parse_single_experiment_parameter_table(classic_params: Optional[Union[list, dict]]) -> list:
4945
4947
  rows: list = []
4946
4948
 
4949
+ if classic_params is None:
4950
+ print_red("parse_single_experiment_parameter_table: classic_param is None")
4951
+ return rows
4952
+
4947
4953
  k = 0
4948
4954
 
4949
4955
  for param in classic_params:
@@ -5130,7 +5136,7 @@ def print_experiment_param_table_to_file(filtered_columns: list, filtered_data:
5130
5136
  print_red(f"Error trying to write file {fn}: {e}")
5131
5137
 
5132
5138
  @beartype
5133
- def print_experiment_parameters_table(classic_param: Union[list, dict]) -> None:
5139
+ def print_experiment_parameters_table(classic_param: Optional[Union[list, dict]]) -> None:
5134
5140
  if not classic_param:
5135
5141
  print_red("Cannot determine classic_param. No parameter table will be shown.")
5136
5142
  return
@@ -5161,10 +5167,7 @@ def print_experiment_parameters_table(classic_param: Union[list, dict]) -> None:
5161
5167
  print_experiment_param_table_to_file(filtered_columns, filtered_data)
5162
5168
 
5163
5169
  @beartype
5164
- def print_overview_tables(classic_params: Optional[Union[list, dict]], experiment_parameters: Union[list, dict], experiment_args: dict) -> None:
5165
- if classic_params is None or len(classic_params) == 0:
5166
- classic_params = experiment_parameters
5167
-
5170
+ def print_overview_tables(classic_params: Optional[Union[list, dict]], experiment_args: dict) -> None:
5168
5171
  print_experiment_parameters_table(classic_params)
5169
5172
 
5170
5173
  print_ax_parameter_constraints_table(experiment_args)
@@ -6567,6 +6570,8 @@ def execute_evaluation(_params: list) -> Optional[int]:
6567
6570
  trial_counter += 1
6568
6571
 
6569
6572
  progressbar_description(["started new job"])
6573
+
6574
+ save_results_csv()
6570
6575
  except submitit.core.utils.FailedJobError as error:
6571
6576
  handle_failed_job(error, trial_index, new_job)
6572
6577
  trial_counter += 1
@@ -7492,6 +7497,11 @@ def create_node(model_name: str, threshold: int, next_model_name: Optional[str])
7492
7497
 
7493
7498
  return node
7494
7499
 
7500
+ if model_name == "TPE":
7501
+ node = ExternalProgramGenerationNode(f"python3 {script_dir}/.tpe.py", "TPE")
7502
+
7503
+ return node
7504
+
7495
7505
  if model_name == "PSEUDORANDOM":
7496
7506
  node = ExternalProgramGenerationNode(f"python3 {script_dir}/.random_generator.py", "PSEUDORANDOM")
7497
7507
 
@@ -7705,7 +7715,9 @@ def execute_trials(
7705
7715
 
7706
7716
  cnt = 0
7707
7717
 
7708
- with ThreadPoolExecutor(max_workers=min(len(index_param_list), 16)) as tp_executor:
7718
+ nr_workers = max(1, min(len(index_param_list), args.max_num_of_parallel_sruns))
7719
+
7720
+ with ThreadPoolExecutor(max_workers=nr_workers) as tp_executor:
7709
7721
  future_to_args = {tp_executor.submit(execute_evaluation, args): args for args in index_param_list}
7710
7722
 
7711
7723
  for future in as_completed(future_to_args):
@@ -9239,7 +9251,7 @@ def main() -> None:
9239
9251
  checkpoint_parameters_filepath = f"{get_current_run_folder()}/state_files/checkpoint.json.parameters.json"
9240
9252
  save_experiment_parameters(checkpoint_parameters_filepath, experiment_parameters)
9241
9253
 
9242
- print_overview_tables(classic_params, experiment_parameters, experiment_args)
9254
+ print_overview_tables(experiment_parameters, experiment_args)
9243
9255
 
9244
9256
  write_files_and_show_overviews()
9245
9257
 
.tpe.py ADDED
@@ -0,0 +1,202 @@
1
+ import sys
2
+ import os
3
+ import json
4
+ import logging
5
+ from typing import Optional
6
+ try:
7
+ import optuna
8
+ from optuna.trial import create_trial
9
+ except ModuleNotFoundError:
10
+ print("Optuna not found. Cannot continue.")
11
+ sys.exit(1)
12
+
13
+ try:
14
+ from beartype import beartype
15
+ except ModuleNotFoundError:
16
+ print("beartype not found. Cannot continue.")
17
+ sys.exit(1)
18
+
19
+ logging.getLogger("optuna").setLevel(logging.WARNING)
20
+
21
+ @beartype
22
+ def check_constraint(constraint: str, params: dict) -> bool:
23
+ return eval(constraint, {}, params)
24
+
25
+ @beartype
26
+ def constraints_not_ok(constraints: list, point: dict) -> bool:
27
+ if not constraints or constraints is None or len(constraints) == 0:
28
+ return True
29
+
30
+ for constraint in constraints:
31
+ if not check_constraint(constraint, point):
32
+ return True
33
+
34
+ return False
35
+
36
+ @beartype
37
+ def tpe_suggest_point(trial: optuna.Trial, parameters: dict) -> dict:
38
+ point = {}
39
+ for param_name, param in parameters.items():
40
+ ptype = param['parameter_type']
41
+ pvaltype = param['type']
42
+
43
+ try:
44
+ if ptype == 'RANGE':
45
+ rmin, rmax = param['range']
46
+ if pvaltype == 'INT':
47
+ point[param_name] = trial.suggest_int(param_name, rmin, rmax)
48
+ elif pvaltype == 'FLOAT':
49
+ point[param_name] = trial.suggest_float(param_name, rmin, rmax)
50
+ else:
51
+ raise ValueError(f"Unsupported type {pvaltype} for RANGE")
52
+
53
+ elif ptype == 'CHOICE':
54
+ values = param['values']
55
+ point[param_name] = trial.suggest_categorical(param_name, values)
56
+
57
+ elif ptype == 'FIXED':
58
+ point[param_name] = param['value']
59
+
60
+ else:
61
+ raise ValueError(f"Unknown parameter_type {ptype}")
62
+ except KeyboardInterrupt:
63
+ print("You pressed CTRL-c.")
64
+ sys.exit(1)
65
+
66
+ return point
67
+
68
+ @beartype
69
+ def generate_tpe_point(data: dict, max_trials: int = 100) -> dict:
70
+ parameters = data["parameters"]
71
+ constraints = data.get("constraints", [])
72
+ seed = data.get("seed", None)
73
+ trials_data = data.get("trials", [])
74
+ objectives = data.get("objectives", {})
75
+
76
+ direction, result_key = parse_objectives(objectives)
77
+ study = create_study_with_seed(seed, direction)
78
+
79
+ for trial_entry in trials_data:
80
+ add_existing_trial_to_study(study, trial_entry, parameters, result_key)
81
+
82
+ study.optimize(lambda trial: wrapped_objective(trial, parameters, constraints, direction), n_trials=max_trials)
83
+
84
+ return get_best_or_new_point(study, parameters, direction)
85
+
86
+ @beartype
87
+ def parse_objectives(objectives: dict) -> tuple[str, str]:
88
+ if len(objectives) != 1:
89
+ raise ValueError("Only single-objective optimization is supported.")
90
+ result_key, result_goal = next(iter(objectives.items()))
91
+ if result_goal.lower() not in ("min", "max"):
92
+ raise ValueError(f"Unsupported objective direction: {result_goal}")
93
+ direction = "maximize" if result_goal.lower() == "max" else "minimize"
94
+ return direction, result_key
95
+
96
+ @beartype
97
+ def create_study_with_seed(seed: Optional[int], direction: str) -> optuna.study.study.Study:
98
+ return optuna.create_study(
99
+ sampler=optuna.samplers.TPESampler(seed=seed),
100
+ direction=direction
101
+ )
102
+
103
+ @beartype
104
+ def wrapped_objective(trial: optuna.Trial, parameters: dict, constraints: list, direction: str) -> float:
105
+ point = tpe_suggest_point(trial, parameters)
106
+ if not constraints_not_ok(constraints, point):
107
+ return 1e6 if direction == "minimize" else -1e6
108
+ return 0.0
109
+
110
+ @beartype
111
+ def add_existing_trial_to_study(study: optuna.study.study.Study, trial_entry: list, parameters: dict, result_key: str) -> None:
112
+ if len(trial_entry) != 2:
113
+ return
114
+ param_dict, result_dict = trial_entry
115
+
116
+ if not result_dict or result_key not in result_dict:
117
+ return
118
+
119
+ if not all(k in param_dict for k in parameters):
120
+ return
121
+
122
+ final_value = result_dict[result_key]
123
+
124
+ trial_params = {}
125
+ trial_distributions = {}
126
+
127
+ for name, p in parameters.items():
128
+ value = param_dict[name]
129
+
130
+ if p["parameter_type"] == "FIXED":
131
+ trial_params[name] = value
132
+ continue
133
+
134
+ if p["parameter_type"] == "RANGE":
135
+ if p["type"] == "INT":
136
+ dist = optuna.distributions.IntUniformDistribution(p["range"][0], p["range"][1])
137
+ elif p["type"] == "FLOAT":
138
+ dist = optuna.distributions.UniformDistribution(p["range"][0], p["range"][1])
139
+ else:
140
+ continue
141
+
142
+ elif p["parameter_type"] == "CHOICE":
143
+ dist = optuna.distributions.CategoricalDistribution(p["values"])
144
+ else:
145
+ continue
146
+
147
+ trial_params[name] = value
148
+ trial_distributions[name] = dist
149
+
150
+ study.add_trial(
151
+ create_trial(
152
+ params=trial_params,
153
+ distributions=trial_distributions,
154
+ value=final_value
155
+ )
156
+ )
157
+
158
+ @beartype
159
+ def get_best_or_new_point(study: optuna.study.study.Study, parameters: dict, direction: str) -> dict:
160
+ best_trial_value = study.best_trial.value
161
+ if best_trial_value is not None:
162
+ if (direction == "minimize" and best_trial_value < 1e6) or \
163
+ (direction == "maximize" and best_trial_value > -1e6):
164
+ return study.best_params
165
+ return tpe_suggest_point(study.best_trial, parameters)
166
+
167
+ @beartype
168
+ def main() -> None:
169
+ if len(sys.argv) != 2:
170
+ print("Usage: python script.py <path>")
171
+ sys.exit(1)
172
+
173
+ path = sys.argv[1]
174
+
175
+ if not os.path.isdir(path):
176
+ print(f"Error: The path '{path}' is not a valid folder.")
177
+ sys.exit(2)
178
+
179
+ json_file_path = os.path.join(path, 'input.json')
180
+ results_file_path = os.path.join(path, 'results.json')
181
+
182
+ try:
183
+ with open(json_file_path, mode='r', encoding="utf-8") as f:
184
+ data = json.load(f)
185
+ except FileNotFoundError:
186
+ print(f"Error: {json_file_path} not found.")
187
+ sys.exit(3)
188
+ except json.JSONDecodeError:
189
+ print(f"Error: Failed to decode JSON in {json_file_path}.")
190
+ sys.exit(4)
191
+
192
+ random_point = generate_tpe_point(data)
193
+
194
+ with open(results_file_path, mode='w', encoding="utf-8") as f:
195
+ json.dump({"parameters": random_point}, f, indent=4)
196
+
197
+ if __name__ == "__main__":
198
+ try:
199
+ main()
200
+ except KeyboardInterrupt:
201
+ print("You pressed CTRL-c.")
202
+ sys.exit(1)
@@ -41,7 +41,7 @@ overwritten_to_random: bool = False
41
41
  valid_occ_types: list = ["geometric", "euclid", "signed_harmonic", "signed_minkowski", "weighted_euclid", "composite"]
42
42
  joined_valid_occ_types: str = ", ".join(valid_occ_types)
43
43
 
44
- SUPPORTED_MODELS: list = ["SOBOL", "FACTORIAL", "SAASBO", "BOTORCH_MODULAR", "UNIFORM", "BO_MIXED", "RANDOMFOREST", "EXTERNAL_GENERATOR", "PSEUDORANDOM"]
44
+ SUPPORTED_MODELS: list = ["SOBOL", "FACTORIAL", "SAASBO", "BOTORCH_MODULAR", "UNIFORM", "BO_MIXED", "RANDOMFOREST", "EXTERNAL_GENERATOR", "PSEUDORANDOM", "TPE"]
45
45
  joined_supported_models: str = ", ".join(SUPPORTED_MODELS)
46
46
 
47
47
  special_col_names: list = ["arm_name", "generation_method", "trial_index", "trial_status", "generation_node", "idxs"]
@@ -556,6 +556,7 @@ class ConfigLoader:
556
556
  follow: bool
557
557
  show_generation_and_submission_sixel: bool
558
558
  n_estimators_randomforest: int
559
+ max_num_of_parallel_sruns: int
559
560
  checkout_to_latest_tested_version: bool
560
561
  load_data_from_existing_jobs: List[str]
561
562
  time: str
@@ -659,6 +660,7 @@ class ConfigLoader:
659
660
  speed.add_argument('--dont_jit_compile', help='Disable JIT-compiling the model', action='store_true', default=False)
660
661
  speed.add_argument('--num_restarts', help='num_restarts option for optimizer_options', type=int, default=20)
661
662
  speed.add_argument('--raw_samples', help='raw_samples option for optimizer_options', type=int, default=1024)
663
+ speed.add_argument('--max_num_of_parallel_sruns', help='Maximal number of parallel sruns', type=int, default=16)
662
664
  speed.add_argument('--no_transform_inputs', help='Disable input transformations', action='store_true', default=False)
663
665
  speed.add_argument('--no_normalize_y', help='Disable target normalization', action='store_true', default=False)
664
666
 
@@ -4941,9 +4943,13 @@ def get_type_short(typename: str) -> str:
4941
4943
  return typename
4942
4944
 
4943
4945
  @beartype
4944
- def parse_single_experiment_parameter_table(classic_params: Union[list, dict]) -> list:
4946
+ def parse_single_experiment_parameter_table(classic_params: Optional[Union[list, dict]]) -> list:
4945
4947
  rows: list = []
4946
4948
 
4949
+ if classic_params is None:
4950
+ print_red("parse_single_experiment_parameter_table: classic_param is None")
4951
+ return rows
4952
+
4947
4953
  k = 0
4948
4954
 
4949
4955
  for param in classic_params:
@@ -5130,7 +5136,7 @@ def print_experiment_param_table_to_file(filtered_columns: list, filtered_data:
5130
5136
  print_red(f"Error trying to write file {fn}: {e}")
5131
5137
 
5132
5138
  @beartype
5133
- def print_experiment_parameters_table(classic_param: Union[list, dict]) -> None:
5139
+ def print_experiment_parameters_table(classic_param: Optional[Union[list, dict]]) -> None:
5134
5140
  if not classic_param:
5135
5141
  print_red("Cannot determine classic_param. No parameter table will be shown.")
5136
5142
  return
@@ -5161,10 +5167,7 @@ def print_experiment_parameters_table(classic_param: Union[list, dict]) -> None:
5161
5167
  print_experiment_param_table_to_file(filtered_columns, filtered_data)
5162
5168
 
5163
5169
  @beartype
5164
- def print_overview_tables(classic_params: Optional[Union[list, dict]], experiment_parameters: Union[list, dict], experiment_args: dict) -> None:
5165
- if classic_params is None or len(classic_params) == 0:
5166
- classic_params = experiment_parameters
5167
-
5170
+ def print_overview_tables(classic_params: Optional[Union[list, dict]], experiment_args: dict) -> None:
5168
5171
  print_experiment_parameters_table(classic_params)
5169
5172
 
5170
5173
  print_ax_parameter_constraints_table(experiment_args)
@@ -6567,6 +6570,8 @@ def execute_evaluation(_params: list) -> Optional[int]:
6567
6570
  trial_counter += 1
6568
6571
 
6569
6572
  progressbar_description(["started new job"])
6573
+
6574
+ save_results_csv()
6570
6575
  except submitit.core.utils.FailedJobError as error:
6571
6576
  handle_failed_job(error, trial_index, new_job)
6572
6577
  trial_counter += 1
@@ -7492,6 +7497,11 @@ def create_node(model_name: str, threshold: int, next_model_name: Optional[str])
7492
7497
 
7493
7498
  return node
7494
7499
 
7500
+ if model_name == "TPE":
7501
+ node = ExternalProgramGenerationNode(f"python3 {script_dir}/.tpe.py", "TPE")
7502
+
7503
+ return node
7504
+
7495
7505
  if model_name == "PSEUDORANDOM":
7496
7506
  node = ExternalProgramGenerationNode(f"python3 {script_dir}/.random_generator.py", "PSEUDORANDOM")
7497
7507
 
@@ -7705,7 +7715,9 @@ def execute_trials(
7705
7715
 
7706
7716
  cnt = 0
7707
7717
 
7708
- with ThreadPoolExecutor(max_workers=min(len(index_param_list), 16)) as tp_executor:
7718
+ nr_workers = max(1, min(len(index_param_list), args.max_num_of_parallel_sruns))
7719
+
7720
+ with ThreadPoolExecutor(max_workers=nr_workers) as tp_executor:
7709
7721
  future_to_args = {tp_executor.submit(execute_evaluation, args): args for args in index_param_list}
7710
7722
 
7711
7723
  for future in as_completed(future_to_args):
@@ -9239,7 +9251,7 @@ def main() -> None:
9239
9251
  checkpoint_parameters_filepath = f"{get_current_run_folder()}/state_files/checkpoint.json.parameters.json"
9240
9252
  save_experiment_parameters(checkpoint_parameters_filepath, experiment_parameters)
9241
9253
 
9242
- print_overview_tables(classic_params, experiment_parameters, experiment_args)
9254
+ print_overview_tables(experiment_parameters, experiment_args)
9243
9255
 
9244
9256
  write_files_and_show_overviews()
9245
9257
 
@@ -0,0 +1,202 @@
1
+ import sys
2
+ import os
3
+ import json
4
+ import logging
5
+ from typing import Optional
6
+ try:
7
+ import optuna
8
+ from optuna.trial import create_trial
9
+ except ModuleNotFoundError:
10
+ print("Optuna not found. Cannot continue.")
11
+ sys.exit(1)
12
+
13
+ try:
14
+ from beartype import beartype
15
+ except ModuleNotFoundError:
16
+ print("beartype not found. Cannot continue.")
17
+ sys.exit(1)
18
+
19
+ logging.getLogger("optuna").setLevel(logging.WARNING)
20
+
21
+ @beartype
22
+ def check_constraint(constraint: str, params: dict) -> bool:
23
+ return eval(constraint, {}, params)
24
+
25
+ @beartype
26
+ def constraints_not_ok(constraints: list, point: dict) -> bool:
27
+ if not constraints or constraints is None or len(constraints) == 0:
28
+ return True
29
+
30
+ for constraint in constraints:
31
+ if not check_constraint(constraint, point):
32
+ return True
33
+
34
+ return False
35
+
36
+ @beartype
37
+ def tpe_suggest_point(trial: optuna.Trial, parameters: dict) -> dict:
38
+ point = {}
39
+ for param_name, param in parameters.items():
40
+ ptype = param['parameter_type']
41
+ pvaltype = param['type']
42
+
43
+ try:
44
+ if ptype == 'RANGE':
45
+ rmin, rmax = param['range']
46
+ if pvaltype == 'INT':
47
+ point[param_name] = trial.suggest_int(param_name, rmin, rmax)
48
+ elif pvaltype == 'FLOAT':
49
+ point[param_name] = trial.suggest_float(param_name, rmin, rmax)
50
+ else:
51
+ raise ValueError(f"Unsupported type {pvaltype} for RANGE")
52
+
53
+ elif ptype == 'CHOICE':
54
+ values = param['values']
55
+ point[param_name] = trial.suggest_categorical(param_name, values)
56
+
57
+ elif ptype == 'FIXED':
58
+ point[param_name] = param['value']
59
+
60
+ else:
61
+ raise ValueError(f"Unknown parameter_type {ptype}")
62
+ except KeyboardInterrupt:
63
+ print("You pressed CTRL-c.")
64
+ sys.exit(1)
65
+
66
+ return point
67
+
68
+ @beartype
69
+ def generate_tpe_point(data: dict, max_trials: int = 100) -> dict:
70
+ parameters = data["parameters"]
71
+ constraints = data.get("constraints", [])
72
+ seed = data.get("seed", None)
73
+ trials_data = data.get("trials", [])
74
+ objectives = data.get("objectives", {})
75
+
76
+ direction, result_key = parse_objectives(objectives)
77
+ study = create_study_with_seed(seed, direction)
78
+
79
+ for trial_entry in trials_data:
80
+ add_existing_trial_to_study(study, trial_entry, parameters, result_key)
81
+
82
+ study.optimize(lambda trial: wrapped_objective(trial, parameters, constraints, direction), n_trials=max_trials)
83
+
84
+ return get_best_or_new_point(study, parameters, direction)
85
+
86
+ @beartype
87
+ def parse_objectives(objectives: dict) -> tuple[str, str]:
88
+ if len(objectives) != 1:
89
+ raise ValueError("Only single-objective optimization is supported.")
90
+ result_key, result_goal = next(iter(objectives.items()))
91
+ if result_goal.lower() not in ("min", "max"):
92
+ raise ValueError(f"Unsupported objective direction: {result_goal}")
93
+ direction = "maximize" if result_goal.lower() == "max" else "minimize"
94
+ return direction, result_key
95
+
96
+ @beartype
97
+ def create_study_with_seed(seed: Optional[int], direction: str) -> optuna.study.study.Study:
98
+ return optuna.create_study(
99
+ sampler=optuna.samplers.TPESampler(seed=seed),
100
+ direction=direction
101
+ )
102
+
103
+ @beartype
104
+ def wrapped_objective(trial: optuna.Trial, parameters: dict, constraints: list, direction: str) -> float:
105
+ point = tpe_suggest_point(trial, parameters)
106
+ if not constraints_not_ok(constraints, point):
107
+ return 1e6 if direction == "minimize" else -1e6
108
+ return 0.0
109
+
110
+ @beartype
111
+ def add_existing_trial_to_study(study: optuna.study.study.Study, trial_entry: list, parameters: dict, result_key: str) -> None:
112
+ if len(trial_entry) != 2:
113
+ return
114
+ param_dict, result_dict = trial_entry
115
+
116
+ if not result_dict or result_key not in result_dict:
117
+ return
118
+
119
+ if not all(k in param_dict for k in parameters):
120
+ return
121
+
122
+ final_value = result_dict[result_key]
123
+
124
+ trial_params = {}
125
+ trial_distributions = {}
126
+
127
+ for name, p in parameters.items():
128
+ value = param_dict[name]
129
+
130
+ if p["parameter_type"] == "FIXED":
131
+ trial_params[name] = value
132
+ continue
133
+
134
+ if p["parameter_type"] == "RANGE":
135
+ if p["type"] == "INT":
136
+ dist = optuna.distributions.IntUniformDistribution(p["range"][0], p["range"][1])
137
+ elif p["type"] == "FLOAT":
138
+ dist = optuna.distributions.UniformDistribution(p["range"][0], p["range"][1])
139
+ else:
140
+ continue
141
+
142
+ elif p["parameter_type"] == "CHOICE":
143
+ dist = optuna.distributions.CategoricalDistribution(p["values"])
144
+ else:
145
+ continue
146
+
147
+ trial_params[name] = value
148
+ trial_distributions[name] = dist
149
+
150
+ study.add_trial(
151
+ create_trial(
152
+ params=trial_params,
153
+ distributions=trial_distributions,
154
+ value=final_value
155
+ )
156
+ )
157
+
158
+ @beartype
159
+ def get_best_or_new_point(study: optuna.study.study.Study, parameters: dict, direction: str) -> dict:
160
+ best_trial_value = study.best_trial.value
161
+ if best_trial_value is not None:
162
+ if (direction == "minimize" and best_trial_value < 1e6) or \
163
+ (direction == "maximize" and best_trial_value > -1e6):
164
+ return study.best_params
165
+ return tpe_suggest_point(study.best_trial, parameters)
166
+
167
+ @beartype
168
+ def main() -> None:
169
+ if len(sys.argv) != 2:
170
+ print("Usage: python script.py <path>")
171
+ sys.exit(1)
172
+
173
+ path = sys.argv[1]
174
+
175
+ if not os.path.isdir(path):
176
+ print(f"Error: The path '{path}' is not a valid folder.")
177
+ sys.exit(2)
178
+
179
+ json_file_path = os.path.join(path, 'input.json')
180
+ results_file_path = os.path.join(path, 'results.json')
181
+
182
+ try:
183
+ with open(json_file_path, mode='r', encoding="utf-8") as f:
184
+ data = json.load(f)
185
+ except FileNotFoundError:
186
+ print(f"Error: {json_file_path} not found.")
187
+ sys.exit(3)
188
+ except json.JSONDecodeError:
189
+ print(f"Error: Failed to decode JSON in {json_file_path}.")
190
+ sys.exit(4)
191
+
192
+ random_point = generate_tpe_point(data)
193
+
194
+ with open(results_file_path, mode='w', encoding="utf-8") as f:
195
+ json.dump({"parameters": random_point}, f, indent=4)
196
+
197
+ if __name__ == "__main__":
198
+ try:
199
+ main()
200
+ except KeyboardInterrupt:
201
+ print("You pressed CTRL-c.")
202
+ sys.exit(1)
@@ -31,3 +31,4 @@ setuptools
31
31
  pyright
32
32
  qrcode
33
33
  tabulate
34
+ optuna
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omniopt2
3
- Version: 7037
3
+ Version: 7075
4
4
  Summary: Automatic highly parallelized hyperparameter optimizer based on Ax/Botorch
5
5
  Home-page: https://scads.ai/transfer-2/verfuegbare-software-dienste-en/omniopt/
6
6
  Author: Norman Koch
@@ -41,6 +41,7 @@ Requires-Dist: setuptools
41
41
  Requires-Dist: pyright
42
42
  Requires-Dist: qrcode
43
43
  Requires-Dist: tabulate
44
+ Requires-Dist: optuna
44
45
  Requires-Dist: shellcheck-py
45
46
  Requires-Dist: vulture
46
47
  Requires-Dist: flake8
@@ -3,7 +3,7 @@
3
3
  .general.sh,sha256=uyGMN8xNToQ0v50KoiYxm6jRmgf0orroOaodM_Nuq30,2107
4
4
  .gitignore,sha256=OMaFWOR6wxjAlI85rF3euQcjQFFAl1F34abZkltKnaU,3714
5
5
  .helpers.py,sha256=srrRn0QBzG8JpNbHAYG2k1rQY6JYrUrNdTj-tDMJSyg,30526
6
- .omniopt.py,sha256=kHVrafvaD-9u3Zs9HlY-FDZqyNBtWLj-mbZa_5Dt7b0,372493
6
+ .omniopt.py,sha256=vM-EHVBna8VpfuW_kVf6e9r6Zc7I2dE089XXZcNCtYs,372875
7
7
  .omniopt_plot_cpu_ram_usage.py,sha256=DbOAmdrbcZtsMnHJgHfeRngjtv6zX5J0axyua_dYezc,3932
8
8
  .omniopt_plot_general.py,sha256=ZERZJkvVOoJhi7SszmTF1Iln-_08_0Aki48u3LHUW-k,6809
9
9
  .omniopt_plot_gpu_usage.py,sha256=ojxVicwSoiyl7f3c-6lLuT2EpyPcSJKEcbp75LgDY2k,5107
@@ -16,6 +16,7 @@
16
16
  .omniopt_plot_worker.py,sha256=VuluQq4W6KRR5RU08dxmDSFk5mbfDRkRJQFwwcLgAGw,4524
17
17
  .random_generator.py,sha256=ezBBUXpez_QaGdpCglMcJ0KZPdQP0XdX5gnLzO1xhwU,2987
18
18
  .shellscript_functions,sha256=7IjirQJpC7TCRPuRj1dO2W6A8h5cHt0dVzj6eH_2EiQ,14664
19
+ .tpe.py,sha256=Yd9s-ixCbWxTd3x0O1M1sok9QfM2mBEfsDwXhx50-Nc,6464
19
20
  LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
20
21
  MANIFEST.in,sha256=L3QBXyL1TtyWxbAPsfjZdCfpeBrRuI5MSgdnvwdQ22Q,24
21
22
  README.md,sha256=ImtT_VuWENewZKkJySRL_qpbHbs0pr6Xgs_n9HURg90,3332
@@ -25,43 +26,44 @@ omniopt_docker,sha256=LWVUeyvmA5AKqAHiH9jBUkR5uZ6AHMnSy0eET7mK6E4,3602
25
26
  omniopt_evaluate,sha256=9oBh0_ikCuIz_aJQZrN0j39NDiIDYoSvEFmSVIoFjJE,23842
26
27
  omniopt_plot,sha256=Z8ZR10p-ZRSgMeVPO-wVCJ8lk-LQtntjZ9Bk9RifCIs,13360
27
28
  omniopt_share,sha256=7g5I7YdoWcA6_GDwWwq0xPf23qiVc_VDrm9ySLH7SH0,14051
28
- pyproject.toml,sha256=T8vNX4vDZgsSm-oRDL_HKMvQmCJ46d8FIdhVLT6Ppbc,397
29
- requirements.txt,sha256=gj9r1kqJK9w1q6YJuViWlq7U0GZf5SOYVO1Ndcy24L0,280
29
+ pyproject.toml,sha256=BvXadxJ6k3tMW3CI6l6omcUgQVueJ2qORO8O0aUZ7Jw,397
30
+ requirements.txt,sha256=QsRYgd43IXr8rN9m0CxufI9mEneBrDeKh4s8E_W2xwI,287
30
31
  setup.cfg,sha256=HEc8uu6NpfxG5_AVh5SvXOpEFMNKPPPxgMIAH144vT4,38
31
32
  test_requirements.txt,sha256=dnCbKmKalrVzNZ_-iQWf1xCxcnDsdGuhbDAr9XlGm-U,477
32
- omniopt2-7037.data/data/bin/.colorfunctions.sh,sha256=CDlgjwrsrHR_E6c-Qak5wZlotArXm-nf9sVvXePzGZA,1083
33
- omniopt2-7037.data/data/bin/.general.sh,sha256=uyGMN8xNToQ0v50KoiYxm6jRmgf0orroOaodM_Nuq30,2107
34
- omniopt2-7037.data/data/bin/.helpers.py,sha256=srrRn0QBzG8JpNbHAYG2k1rQY6JYrUrNdTj-tDMJSyg,30526
35
- omniopt2-7037.data/data/bin/.omniopt.py,sha256=kHVrafvaD-9u3Zs9HlY-FDZqyNBtWLj-mbZa_5Dt7b0,372493
36
- omniopt2-7037.data/data/bin/.omniopt_plot_cpu_ram_usage.py,sha256=DbOAmdrbcZtsMnHJgHfeRngjtv6zX5J0axyua_dYezc,3932
37
- omniopt2-7037.data/data/bin/.omniopt_plot_general.py,sha256=ZERZJkvVOoJhi7SszmTF1Iln-_08_0Aki48u3LHUW-k,6809
38
- omniopt2-7037.data/data/bin/.omniopt_plot_gpu_usage.py,sha256=ojxVicwSoiyl7f3c-6lLuT2EpyPcSJKEcbp75LgDY2k,5107
39
- omniopt2-7037.data/data/bin/.omniopt_plot_kde.py,sha256=uRLWr72TDKvj3AqJ0O0AvkKZ1ok1O1QpXnbfQQdo0nA,6873
40
- omniopt2-7037.data/data/bin/.omniopt_plot_scatter.py,sha256=-amqmLR_YLCbHImLPh6gwVFv8iiVnXME544XHsRVCuw,8422
41
- omniopt2-7037.data/data/bin/.omniopt_plot_scatter_generation_method.py,sha256=rgKY_w1E516c9UucVaEvaKd8tCnoUq9xg-RrYSDzYEQ,4289
42
- omniopt2-7037.data/data/bin/.omniopt_plot_scatter_hex.py,sha256=w1L5gL6Bc_QudoSJi2lxEVvF17Apjjb3l2T-lXGnsUg,10279
43
- omniopt2-7037.data/data/bin/.omniopt_plot_time_and_exit_code.py,sha256=hC4RFDiJN_UImezFR6M5uVF-QKDqMDpq6R5DIg7dDDc,6463
44
- omniopt2-7037.data/data/bin/.omniopt_plot_trial_index_result.py,sha256=5DmqZAQO_PFmzdap-TIhSMAshRXpOHQacnHAtjwnzN4,4629
45
- omniopt2-7037.data/data/bin/.omniopt_plot_worker.py,sha256=VuluQq4W6KRR5RU08dxmDSFk5mbfDRkRJQFwwcLgAGw,4524
46
- omniopt2-7037.data/data/bin/.random_generator.py,sha256=ezBBUXpez_QaGdpCglMcJ0KZPdQP0XdX5gnLzO1xhwU,2987
47
- omniopt2-7037.data/data/bin/.shellscript_functions,sha256=7IjirQJpC7TCRPuRj1dO2W6A8h5cHt0dVzj6eH_2EiQ,14664
48
- omniopt2-7037.data/data/bin/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
49
- omniopt2-7037.data/data/bin/apt-dependencies.txt,sha256=X5tBB8ZLW9XaFtRh8B7C2pIkSoxNNawqioDr0QZAtuM,149
50
- omniopt2-7037.data/data/bin/omniopt,sha256=GQMKeZDU_FfjY7es2Yf1u-WowyZ-mdpcNx7TuS-JejE,48015
51
- omniopt2-7037.data/data/bin/omniopt_docker,sha256=LWVUeyvmA5AKqAHiH9jBUkR5uZ6AHMnSy0eET7mK6E4,3602
52
- omniopt2-7037.data/data/bin/omniopt_evaluate,sha256=9oBh0_ikCuIz_aJQZrN0j39NDiIDYoSvEFmSVIoFjJE,23842
53
- omniopt2-7037.data/data/bin/omniopt_plot,sha256=Z8ZR10p-ZRSgMeVPO-wVCJ8lk-LQtntjZ9Bk9RifCIs,13360
54
- omniopt2-7037.data/data/bin/omniopt_share,sha256=7g5I7YdoWcA6_GDwWwq0xPf23qiVc_VDrm9ySLH7SH0,14051
55
- omniopt2-7037.data/data/bin/requirements.txt,sha256=gj9r1kqJK9w1q6YJuViWlq7U0GZf5SOYVO1Ndcy24L0,280
56
- omniopt2-7037.data/data/bin/setup.py,sha256=g3uEqJHXhggXwgLYoxOjsXg9Z6IV1ubh-Og59AZ264Q,4648
57
- omniopt2-7037.data/data/bin/test_requirements.txt,sha256=dnCbKmKalrVzNZ_-iQWf1xCxcnDsdGuhbDAr9XlGm-U,477
58
- omniopt2-7037.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
59
- omniopt2.egg-info/PKG-INFO,sha256=-5zGZoMbgQ-tZr1sSuzZkitp434Q42VH2o-NwKCGwBM,5792
60
- omniopt2.egg-info/SOURCES.txt,sha256=kXBlYs2_3BE6tKUH1egGFa_9X5w8EQ5pm9dKgPEvdhY,770
33
+ omniopt2-7075.data/data/bin/.colorfunctions.sh,sha256=CDlgjwrsrHR_E6c-Qak5wZlotArXm-nf9sVvXePzGZA,1083
34
+ omniopt2-7075.data/data/bin/.general.sh,sha256=uyGMN8xNToQ0v50KoiYxm6jRmgf0orroOaodM_Nuq30,2107
35
+ omniopt2-7075.data/data/bin/.helpers.py,sha256=srrRn0QBzG8JpNbHAYG2k1rQY6JYrUrNdTj-tDMJSyg,30526
36
+ omniopt2-7075.data/data/bin/.omniopt.py,sha256=vM-EHVBna8VpfuW_kVf6e9r6Zc7I2dE089XXZcNCtYs,372875
37
+ omniopt2-7075.data/data/bin/.omniopt_plot_cpu_ram_usage.py,sha256=DbOAmdrbcZtsMnHJgHfeRngjtv6zX5J0axyua_dYezc,3932
38
+ omniopt2-7075.data/data/bin/.omniopt_plot_general.py,sha256=ZERZJkvVOoJhi7SszmTF1Iln-_08_0Aki48u3LHUW-k,6809
39
+ omniopt2-7075.data/data/bin/.omniopt_plot_gpu_usage.py,sha256=ojxVicwSoiyl7f3c-6lLuT2EpyPcSJKEcbp75LgDY2k,5107
40
+ omniopt2-7075.data/data/bin/.omniopt_plot_kde.py,sha256=uRLWr72TDKvj3AqJ0O0AvkKZ1ok1O1QpXnbfQQdo0nA,6873
41
+ omniopt2-7075.data/data/bin/.omniopt_plot_scatter.py,sha256=-amqmLR_YLCbHImLPh6gwVFv8iiVnXME544XHsRVCuw,8422
42
+ omniopt2-7075.data/data/bin/.omniopt_plot_scatter_generation_method.py,sha256=rgKY_w1E516c9UucVaEvaKd8tCnoUq9xg-RrYSDzYEQ,4289
43
+ omniopt2-7075.data/data/bin/.omniopt_plot_scatter_hex.py,sha256=w1L5gL6Bc_QudoSJi2lxEVvF17Apjjb3l2T-lXGnsUg,10279
44
+ omniopt2-7075.data/data/bin/.omniopt_plot_time_and_exit_code.py,sha256=hC4RFDiJN_UImezFR6M5uVF-QKDqMDpq6R5DIg7dDDc,6463
45
+ omniopt2-7075.data/data/bin/.omniopt_plot_trial_index_result.py,sha256=5DmqZAQO_PFmzdap-TIhSMAshRXpOHQacnHAtjwnzN4,4629
46
+ omniopt2-7075.data/data/bin/.omniopt_plot_worker.py,sha256=VuluQq4W6KRR5RU08dxmDSFk5mbfDRkRJQFwwcLgAGw,4524
47
+ omniopt2-7075.data/data/bin/.random_generator.py,sha256=ezBBUXpez_QaGdpCglMcJ0KZPdQP0XdX5gnLzO1xhwU,2987
48
+ omniopt2-7075.data/data/bin/.shellscript_functions,sha256=7IjirQJpC7TCRPuRj1dO2W6A8h5cHt0dVzj6eH_2EiQ,14664
49
+ omniopt2-7075.data/data/bin/.tpe.py,sha256=Yd9s-ixCbWxTd3x0O1M1sok9QfM2mBEfsDwXhx50-Nc,6464
50
+ omniopt2-7075.data/data/bin/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
51
+ omniopt2-7075.data/data/bin/apt-dependencies.txt,sha256=X5tBB8ZLW9XaFtRh8B7C2pIkSoxNNawqioDr0QZAtuM,149
52
+ omniopt2-7075.data/data/bin/omniopt,sha256=GQMKeZDU_FfjY7es2Yf1u-WowyZ-mdpcNx7TuS-JejE,48015
53
+ omniopt2-7075.data/data/bin/omniopt_docker,sha256=LWVUeyvmA5AKqAHiH9jBUkR5uZ6AHMnSy0eET7mK6E4,3602
54
+ omniopt2-7075.data/data/bin/omniopt_evaluate,sha256=9oBh0_ikCuIz_aJQZrN0j39NDiIDYoSvEFmSVIoFjJE,23842
55
+ omniopt2-7075.data/data/bin/omniopt_plot,sha256=Z8ZR10p-ZRSgMeVPO-wVCJ8lk-LQtntjZ9Bk9RifCIs,13360
56
+ omniopt2-7075.data/data/bin/omniopt_share,sha256=7g5I7YdoWcA6_GDwWwq0xPf23qiVc_VDrm9ySLH7SH0,14051
57
+ omniopt2-7075.data/data/bin/requirements.txt,sha256=QsRYgd43IXr8rN9m0CxufI9mEneBrDeKh4s8E_W2xwI,287
58
+ omniopt2-7075.data/data/bin/setup.py,sha256=g3uEqJHXhggXwgLYoxOjsXg9Z6IV1ubh-Og59AZ264Q,4648
59
+ omniopt2-7075.data/data/bin/test_requirements.txt,sha256=dnCbKmKalrVzNZ_-iQWf1xCxcnDsdGuhbDAr9XlGm-U,477
60
+ omniopt2-7075.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
61
+ omniopt2.egg-info/PKG-INFO,sha256=PPBNwHQR4kqh0JPRD6huR5ubH5S5uemdwNBVzBN_im0,5814
62
+ omniopt2.egg-info/SOURCES.txt,sha256=N-HtSaaqFRsd4XqAfeWVSp__3I-sw0d7cknJgyewRwQ,778
61
63
  omniopt2.egg-info/dependency_links.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
62
- omniopt2.egg-info/requires.txt,sha256=rH_jC1LI0Ch8b5iWYh7EFq1ylyc9uswwZnyPZnlp9Qo,757
64
+ omniopt2.egg-info/requires.txt,sha256=cZgCKMii2eXHaYbDhCwiLjxtFK6PW0aqFoJZ7xebsqM,764
63
65
  omniopt2.egg-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
64
- omniopt2-7037.dist-info/METADATA,sha256=-5zGZoMbgQ-tZr1sSuzZkitp434Q42VH2o-NwKCGwBM,5792
65
- omniopt2-7037.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
66
- omniopt2-7037.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
67
- omniopt2-7037.dist-info/RECORD,,
66
+ omniopt2-7075.dist-info/METADATA,sha256=PPBNwHQR4kqh0JPRD6huR5ubH5S5uemdwNBVzBN_im0,5814
67
+ omniopt2-7075.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
68
+ omniopt2-7075.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
69
+ omniopt2-7075.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: omniopt2
3
- Version: 7037
3
+ Version: 7075
4
4
  Summary: Automatic highly parallelized hyperparameter optimizer based on Ax/Botorch
5
5
  Home-page: https://scads.ai/transfer-2/verfuegbare-software-dienste-en/omniopt/
6
6
  Author: Norman Koch
@@ -41,6 +41,7 @@ Requires-Dist: setuptools
41
41
  Requires-Dist: pyright
42
42
  Requires-Dist: qrcode
43
43
  Requires-Dist: tabulate
44
+ Requires-Dist: optuna
44
45
  Requires-Dist: shellcheck-py
45
46
  Requires-Dist: vulture
46
47
  Requires-Dist: flake8
@@ -16,6 +16,7 @@
16
16
  .omniopt_plot_worker.py
17
17
  .random_generator.py
18
18
  .shellscript_functions
19
+ .tpe.py
19
20
  LICENSE
20
21
  MANIFEST.in
21
22
  README.md
@@ -31,6 +31,7 @@ setuptools
31
31
  pyright
32
32
  qrcode
33
33
  tabulate
34
+ optuna
34
35
  shellcheck-py
35
36
  vulture
36
37
  flake8
pyproject.toml CHANGED
@@ -5,7 +5,7 @@ authors = [
5
5
  {email = "norman.koch@tu-dresden.de"},
6
6
  {name = "Norman Koch"}
7
7
  ]
8
- version = "7037"
8
+ version = "7075"
9
9
 
10
10
  readme = "README.md"
11
11
  dynamic = ["dependencies"]
requirements.txt CHANGED
@@ -31,3 +31,4 @@ setuptools
31
31
  pyright
32
32
  qrcode
33
33
  tabulate
34
+ optuna