mg-pso-gui 0.2.22__py3-none-any.whl → 0.2.24__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mg-pso-gui
3
- Version: 0.2.22
3
+ Version: 0.2.24
4
4
  Summary: GUI for MG-PSO
5
5
  Author: Robert Cordingly
6
6
  Author-email: <rcording@uw.ed>
@@ -1,11 +1,11 @@
1
1
  mgpsogui/__init__.py,sha256=q7AfBjeJABnFtbsZnsObpUwaXKPDVYtz46G6MKXLF74,42
2
2
  mgpsogui/mgpsogui.py,sha256=NIZmyNcbwC8EgSwf1ubdMUSJscrIEgoD4jLYziqHQ-k,148
3
3
  mgpsogui/start.yaml,sha256=ZjCVLb-MLqAxrGRm9kA7_SDpa-45EuKIELNQ2QqCAiU,4713
4
- mgpsogui/gui/HomePage.py,sha256=RXG6pqPZZMKjJuHP8Nqc2jrD36zpro2yFmt4n09-2T0,21647
5
- mgpsogui/gui/OptionManager.py,sha256=6OXfCIa4xi-WY33zNOcN9lcdcIQJcDJjdKPbVynKgUI,20239
4
+ mgpsogui/gui/HomePage.py,sha256=CBUdasHxGXnI2fL-sE1IPNO4hVi8zR1rTs31z1VmvMQ,21381
5
+ mgpsogui/gui/OptionManager.py,sha256=riRYTgylVa07yITD1xea5MjCcCt7Fpa8uhJH2SUTd4w,21676
6
6
  mgpsogui/gui/OptionManager_backup.py,sha256=TCWfPnHL2foN5id47jsi267lamRG6yGU6y_M29eOOJk,18530
7
7
  mgpsogui/gui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- mgpsogui/gui/General/ParameterView.py,sha256=eMX9ECpRAMTBkoYmeW_lXtQVH-YmqgWU_F_LlzdkMtM,5628
8
+ mgpsogui/gui/General/ParameterView.py,sha256=ylnzYk9qTN31w_6LW4Iq3536CjfWswEqbE95M_SF8P4,5657
9
9
  mgpsogui/gui/General/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  mgpsogui/gui/PlatformTab/PlatformTab.py,sha256=XVaXjNoH1MBI-587CWigLIT3LGT00yzEAEnXNkzCLrk,10947
11
11
  mgpsogui/gui/PlatformTab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -19,13 +19,13 @@ mgpsogui/gui/SetupTab/FunctionsList.py,sha256=ntbIUs8q2Tm3KfBLleT7uL0gynwYuVycwv
19
19
  mgpsogui/gui/SetupTab/ListEditor.py,sha256=nin7Pl8z7d_yfKoAxM-yVS34uhj-LnprJ2mNRSB7Z0A,3197
20
20
  mgpsogui/gui/SetupTab/ListParametersView.py,sha256=mkGaC5cXhEOy5oD0MbTyK9z7VGZp019oK2Y8Ay-n05Q,7460
21
21
  mgpsogui/gui/SetupTab/OptimalParameterView.py,sha256=nliUEWA840cPBQt7wjiZ-L7uBOp_ozzJhyBkL08fJzI,1752
22
- mgpsogui/gui/SetupTab/OverrideParameterMetrics.py,sha256=un6lSEQE5SSVhv7xA1Ea-G4JRoaQXCFi052ufDYLBAo,3064
22
+ mgpsogui/gui/SetupTab/OverrideParameterMetrics.py,sha256=QFSwLRLHwbqyO8gPOzIQ8nhFUktFipKj_aM9QoP0QT0,3372
23
23
  mgpsogui/gui/SetupTab/OverrideParameterWindow.py,sha256=UpZDxTaFxee0BeviUYXeiIlMNYNy00qz3zlMlM5VcXE,1291
24
24
  mgpsogui/gui/SetupTab/SetupTab.py,sha256=uvz604wAgazX9P8naqX9eq-6xwaA8lq-cYTy8lHXkv0,2805
25
- mgpsogui/gui/SetupTab/StepView.py,sha256=Qz1S5Kt0G3LKdXrlI_ZbSEs1SNKmZn4VdVbRVU4vtLU,8701
25
+ mgpsogui/gui/SetupTab/StepView.py,sha256=7r3Sm2JUjPQN-l8jOVssSNk3Bhwpr0ZAFLt-sJBO_V0,8912
26
26
  mgpsogui/gui/SetupTab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  mgpsogui/gui/VisualizeTab/MatrixEditor.py,sha256=Gzyl2hRgjIfO5n0bCZZoXp_vOFvfsJPaGXDUMeRQg10,3171
28
- mgpsogui/gui/VisualizeTab/SideBar.py,sha256=FP77ZVEgF5KRX5mWbwpY2NcjptfdUh_-aNuyJdNzyHY,21704
28
+ mgpsogui/gui/VisualizeTab/SideBar.py,sha256=wPjzA8ZZsCTxBKN0_6-_ABtU5BeHqytNAWfKCWAPoe8,22106
29
29
  mgpsogui/gui/VisualizeTab/VisualizeTab.py,sha256=xeZS1J4RexoFgsKeJDdWi81Hy8xicROGTdawwcGk2O4,6724
30
30
  mgpsogui/gui/VisualizeTab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  mgpsogui/gui/defaults/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -43,8 +43,8 @@ mgpsogui/gui/images/stop.png,sha256=JPuxXQerCGpLikcp7cAj3iLCOjULMYYZ2sZe0lArh68,
43
43
  mgpsogui/gui/images/test.png,sha256=MUnVpRK-isxhEHzx4Q6Yh0M6FRZD1qvgCHH2XmiSBbk,3642
44
44
  mgpsogui/gui/images/trash.png,sha256=j8cf0kWbJd-4Jp20lUVV1o1NSeQ4v1Ej4gfcIA3DVRQ,2958
45
45
  mgpsogui/gui/images/up.png,sha256=AQvFWCUqSQNaQ1E6LKZ9zNfSvW6t4mgy8uswdg9T2Hg,2457
46
- mgpsogui/util/GraphGenerator.py,sha256=7JRq4um5UJd5tAYmffHWi558pcCMAwd6k3yvO0kEbPk,31779
47
- mgpsogui/util/PSORunner.py,sha256=kp2vv46RKmbOuWgLSXT4jLb-QDQAeCkuWfb18a8PeT8,9155
46
+ mgpsogui/util/GraphGenerator.py,sha256=dKzDPMK-0S6j1yIp5xoQIgN9GTKMhGpboAXjofCpmIk,31973
47
+ mgpsogui/util/PSORunner.py,sha256=UATYIop8IofEhyRyE2CuoTn8A6ZuB2xN4xy5SP_X5rs,20105
48
48
  mgpsogui/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  mgpsogui/util/debug.py,sha256=Swzny9_1S-CCONWGssj9iDoSpbwu5Vr4f95g_9L8bec,19759
50
50
  mgpsogui/util/helpers.py,sha256=Ht2rge_4pGO7halz6KoLsL2eukB0k2tlkx68lBBmBA8,2669
@@ -69,8 +69,8 @@ mgpsogui/util/recosu/utils/trace_writer.py,sha256=V9BJlOjCbNYGoXGEk3CF5wjifBxvar
69
69
  mgpsogui/util/recosu/utils/utils.py,sha256=QB8vftq3142ekG0ORjz0ZBHU5YknXbR0oTsrxrPAsF0,3951
70
70
  mgpsogui/util/recosu/utils/plot/__init__.py,sha256=h1KjM7_tNDv351pcwt8A6Ibb1jhwWyx5Gbu-zj-sI3Q,71
71
71
  mgpsogui/util/recosu/utils/plot/cost_steps.py,sha256=1Ce11AJyweWkmvjXPxEygzS-h8yVLmQEDLS53yjPLqQ,3779
72
- mg_pso_gui-0.2.22.dist-info/METADATA,sha256=YI0yGcryotepFZBB6foEb2bZ3wIjBc6JLU1uRfGOql4,9455
73
- mg_pso_gui-0.2.22.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
74
- mg_pso_gui-0.2.22.dist-info/entry_points.txt,sha256=jg82VOFjR1XDGrchs1wJSCqKYE4Ozv12aBcCSp--koA,117
75
- mg_pso_gui-0.2.22.dist-info/top_level.txt,sha256=y7JuS9xJN5YdxUsQ3PSVjN8MzQAnR146bP3ZN3PYWdE,9
76
- mg_pso_gui-0.2.22.dist-info/RECORD,,
72
+ mg_pso_gui-0.2.24.dist-info/METADATA,sha256=dA52rqGK-Y6TJ934cAJcbIsIYM_GnG_SJ5Zn4Y_MN1U,9455
73
+ mg_pso_gui-0.2.24.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
74
+ mg_pso_gui-0.2.24.dist-info/entry_points.txt,sha256=jg82VOFjR1XDGrchs1wJSCqKYE4Ozv12aBcCSp--koA,117
75
+ mg_pso_gui-0.2.24.dist-info/top_level.txt,sha256=y7JuS9xJN5YdxUsQ3PSVjN8MzQAnR146bP3ZN3PYWdE,9
76
+ mg_pso_gui-0.2.24.dist-info/RECORD,,
@@ -49,7 +49,7 @@ class ParameterView(CTkScrollableFrame):
49
49
  type_menu = CTkOptionMenu(self.containerFrame, variable=self.key_values[index]["type"], values=["integer", "float", "date", "boolean", "string"], width=20)
50
50
  type_menu.grid(row=row, column=3, columnspan=1, padx=(0, 0), pady=(5, 5), sticky="ew")
51
51
 
52
- dest_menu = CTkOptionMenu(self.containerFrame, variable=self.key_values[index]["destination"], values=["calibration_parameters", "param"], width=20)
52
+ dest_menu = CTkOptionMenu(self.containerFrame, variable=self.key_values[index]["destination"], values=["args", "kwargs", "conf", "options", "oh_strategy", "metainfo"], width=20)
53
53
  dest_menu.grid(row=row, column=4, columnspan=1, padx=(0, 0), pady=(5, 5), sticky="ew")
54
54
 
55
55
 
mgpsogui/gui/HomePage.py CHANGED
@@ -74,15 +74,6 @@ class App(customtkinter.CTk):
74
74
  self.open_file = "None"
75
75
  self.csv_data = None
76
76
 
77
- self.sensitivity_file = tk.StringVar()
78
- self.sensitivity_file.set("No files found...")
79
-
80
- self.sampling_method = tk.StringVar()
81
- self.sampling_method.set("Halton")
82
-
83
- self.sampling_output = tk.StringVar()
84
- self.sampling_output.set("Replace")
85
-
86
77
  self.selected_csv2 = tk.StringVar()
87
78
  self.selected_csv2.set("No files found...")
88
79
  self.open_file2 = "None"
@@ -343,9 +334,10 @@ class App(customtkinter.CTk):
343
334
  self.run()
344
335
 
345
336
  def run(self):
346
- pass
347
- """
348
- metrics = self.option_manager.get_metrics()
337
+
338
+ data = self.option_manager.get_all_data()
339
+ data["sensitivity_analysis_path"] = self.sensitivity_file.get()
340
+
349
341
  self.running_config = metrics
350
342
 
351
343
  if self.testing:
@@ -355,8 +347,6 @@ class App(customtkinter.CTk):
355
347
  param['default_value'] = param['optimal_value']
356
348
  self.testing = False
357
349
 
358
- metrics["sensitivity_analysis_path"] = self.sensitivity_file.get()
359
-
360
350
  self.progress_data = None
361
351
  self.calibration_data = None
362
352
 
@@ -410,7 +400,7 @@ class App(customtkinter.CTk):
410
400
  self.footer_progress_bar.configure(mode="determinate")
411
401
  #self.progress_bar.set(0)
412
402
  self.footer_progress_bar.set(0)
413
- """
403
+
414
404
 
415
405
  def stop(self):
416
406
  print("Stopping...")
@@ -33,7 +33,31 @@ class OptionManager():
33
33
  "figure_parameters": [],
34
34
  "sensitivity_parameters": [],
35
35
  "sensitivity_positiveBestMetrics": [],
36
- "sensitivity_negativeBestMetrics": []}
36
+ "sensitivity_negativeBestMetrics": [],
37
+
38
+ "sensitivity_analysis_path": sv(),
39
+ "sampling_output_mode": sv(),
40
+ "selected_graph": sv(),
41
+ "graph_theme": sv(),
42
+ "selected_csv": sv(),
43
+ "selected_csv2": sv(),
44
+ "selected_x": sv(),
45
+ "selected_y1": sv(),
46
+ "selected_y2": sv(),
47
+ "figure_style": sv(),
48
+ "matrix_values": []}
49
+
50
+ self._data[service]["selected_graph"].set("Best Cost Stacked")
51
+ self._data[service]["graph_theme"].set("Dark")
52
+ self._data[service]["selected_csv"].set("No files found...")
53
+ self._data[service]["selected_csv2"].set("No files found...")
54
+ self._data[service]["selected_x"].set("time")
55
+ self._data[service]["selected_y1"].set("NONE")
56
+ self._data[service]["selected_y2"].set("NONE")
57
+ self._data[service]["figure_style"].set("Scatter")
58
+ self._data[service]["matrix_values"].append(sv())
59
+ self._data[service]["matrix_values"][0].set("NONE")
60
+
37
61
 
38
62
  if service == "Sampling: Halton" or service == "Sampling: Random":
39
63
  self._data[service]["model_parameters"] = self.deserialize_data(self._default_sampling["model_parameters"])
@@ -76,12 +100,23 @@ class OptionManager():
76
100
  "data": self.serialize_data(self._data)}
77
101
  json.dump(results, file)
78
102
 
103
+ def get_all_data(self):
104
+ return self.serialize_data(self._data)
105
+
79
106
  def load_project(self, filename):
107
+ self._mode_sv = sv()
108
+ self.init_lists()
109
+
80
110
  with open(filename, 'r') as file:
81
111
  results = json.load(file)
82
- self._project_data = results["project_data"]
112
+ new_project_data = results["project_data"]
113
+ for key, value in new_project_data.items():
114
+ self._project_data[key] = value
83
115
  self._mode_sv.set(results["mode"])
84
- self._data = self.deserialize_data(results["data"])
116
+ new_data = self.deserialize_data(results["data"])
117
+ for key, value in new_data.items():
118
+ self._data[key] = value
119
+
85
120
 
86
121
  def add_arguments(self, arguments):
87
122
 
@@ -299,7 +334,7 @@ class OptionManager():
299
334
  def get_override(self, step_index):
300
335
  return self._data[self._mode_sv.get()]["steps"][step_index]["override_parameter"]
301
336
 
302
- def add_key_value(self, list_name, key, value, type="string", destination="calibration_parameters"):
337
+ def add_key_value(self, list_name, key, value, type="string", destination="args"):
303
338
  obj = {"name": sv(), "value": sv(), "type": sv(), "destination": sv()}
304
339
  obj["name"].set(key)
305
340
  obj["value"].set(value)
@@ -367,7 +402,7 @@ class OptionManager():
367
402
  def get_project_folder(self):
368
403
  return os.path.join(self._project_data['path'], self._project_data['name'])
369
404
 
370
- """
405
+
371
406
  def get_metrics(self):
372
407
 
373
408
  self._data["url"].set(self._data["urls"][self._data["mode"].get()].get())
@@ -434,5 +469,4 @@ class OptionManager():
434
469
  for objfunc in step['objfunc']:
435
470
  step_result['objfunc'].append({'name': objfunc['name'].get(), 'of': objfunc['of'].get(), 'weight': float(objfunc['weight'].get()), 'data': (objfunc['data'][0].get(), objfunc['data'][1].get())})
436
471
  result['steps'].append(step_result)
437
- return result
438
- """
472
+ return result
@@ -51,7 +51,19 @@ class OverrideParameterMetrics(CTkScrollableFrame):
51
51
  row += 1
52
52
 
53
53
  for key_value_pair in self.key_values:
54
- CTkEntry(self.containerFrame, textvariable=self.key_values[index]["name"]).grid(row=row, column=0, padx=(5, 5), pady=(5, 5), sticky="ew")
54
+ overwrite_values = [
55
+ 'iters',
56
+ 'ftol',
57
+ 'ftol_iter',
58
+ 'rtol',
59
+ 'rtol_iter',
60
+ 'n_threads',
61
+ 'n_particles',
62
+ 'cost_target'
63
+ ]
64
+
65
+
66
+ CTkOptionMenu(self.containerFrame, values=overwrite_values, variable=self.key_values[index]["name"]).grid(row=row, column=0, padx=(5, 5), pady=(5, 5), sticky="ew")
55
67
 
56
68
 
57
69
  if self.edit_mode:
@@ -93,8 +93,8 @@ class StepView(CTkScrollableFrame):
93
93
 
94
94
  if len(files) == 0:
95
95
  files = [" No CSV files found! Run sampling first! "]
96
- elif self.home_page.sensitivity_file.get() not in files:
97
- self.home_page.sensitivity_file.set(files[0])
96
+ elif self.option_manager["sensitivity_analysis_path"].get() not in files:
97
+ self.option_manager["sensitivity_analysis_path"].set(files[0])
98
98
 
99
99
  header_padding_x = (5, 5)
100
100
  header_padding_y = (10, 10)
@@ -104,7 +104,7 @@ class StepView(CTkScrollableFrame):
104
104
  self.logo_label = CTkLabel(self.file_selector_frame, text="Select File:")
105
105
  self.logo_label.grid(row=0, column=0, padx=(10, 10), pady=header_padding_y)
106
106
 
107
- self.file_selector = CTkOptionMenu(self.file_selector_frame, values=files, width=50, variable=self.home_page.sensitivity_file)
107
+ self.file_selector = CTkOptionMenu(self.file_selector_frame, values=files, width=50, variable=self.option_manager["sensitivity_analysis_path"])
108
108
  self.file_selector.grid(row=0, column=1, padx=(10, 10), pady=header_padding_y)
109
109
 
110
110
  row += 1
@@ -119,7 +119,9 @@ class StepView(CTkScrollableFrame):
119
119
  self.logo_label2 = CTkLabel(self.file_selector_frame, text="Output:")
120
120
  self.logo_label2.grid(row=0, column=1, padx=(20, 10), pady=header_padding_y)
121
121
 
122
- self.output_method = CTkOptionMenu(self.file_selector_frame, values=["Replace", "Append"], width=50, variable=self.home_page.sampling_output)
122
+ self.output_method = CTkOptionMenu(self.file_selector_frame, values=["Replace", "Append"], width=50, variable=self.option_manager["sampling_output_mode"])
123
+ if self.option_manager["sampling_output_mode"].get() == "":
124
+ self.option_manager["sampling_output_mode"].set("Replace")
123
125
  self.output_method.grid(row=0, column=2, padx=(10, 10), pady=header_padding_y)
124
126
 
125
127
  row += 1
@@ -39,7 +39,7 @@ class SideBar(CTkScrollableFrame):
39
39
  0, 0), pady=(0, 0), sticky="ew")
40
40
  self.containerFrame.grid_columnconfigure(0, weight=1)
41
41
 
42
- selected_graph = self.home_page.graph_selector_value.get()
42
+ selected_graph = self.option_manager.get("selected_graph").get()
43
43
 
44
44
  if (selected_graph == "Best Cost Stacked"):
45
45
  #self.graph_label = CTkLabel(self.containerFrame, text="Best Cost Stacked")
@@ -76,16 +76,16 @@ class SideBar(CTkScrollableFrame):
76
76
  if (len(name_list) == 0):
77
77
  name_list.append("No files found...")
78
78
  else:
79
- if (self.home_page.selected_csv.get() not in name_list):
80
- self.home_page.selected_csv.set(name_list[0])
79
+ if (self.option_manager.get("selected_csv").get() not in name_list):
80
+ self.option_manager.get("selected_csv").set(name_list[0])
81
81
 
82
82
  file_label = CTkLabel(self.containerFrame, text="CSV File:")
83
83
  file_label.grid(row=0, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
84
84
 
85
- self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.home_page.selected_csv, command=self.home_page.update_graph)
85
+ self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.option_manager.get("selected_csv"), command=self.home_page.update_graph)
86
86
  self.home_page.csv_file_selector.grid(row=1, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
87
87
 
88
- selected_file = self.home_page.selected_csv.get()
88
+ selected_file = self.option_manager.get("selected_csv").get()
89
89
  if (selected_file in path_map and selected_file != self.home_page.open_file):
90
90
  self.home_page.csv_data = self.load_special_csv(path_map[selected_file])
91
91
  print(self.home_page.csv_data)
@@ -98,7 +98,7 @@ class SideBar(CTkScrollableFrame):
98
98
  x_axis_label = CTkLabel(self.containerFrame, text="X Axis:")
99
99
  x_axis_label.grid(row=2, column=0, padx=(20, 20), pady=(40, 5), sticky="w")
100
100
 
101
- self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_x, command=self.home_page.update_graph)
101
+ self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_x"), command=self.home_page.update_graph)
102
102
  self.home_page.csv_x_selector.grid(row=3, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
103
103
 
104
104
  if (self.home_page.csv_x_selector.get() not in columns):
@@ -107,7 +107,7 @@ class SideBar(CTkScrollableFrame):
107
107
  y1_axis_label = CTkLabel(self.containerFrame, text="Y Axis:")
108
108
  y1_axis_label.grid(row=4, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
109
109
 
110
- self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_y1, command=self.home_page.update_graph)
110
+ self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_y1"), command=self.home_page.update_graph)
111
111
  self.home_page.csv_y1_selector.grid(row=5, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
112
112
 
113
113
  if (self.home_page.csv_y1_selector.get() not in columns):
@@ -116,7 +116,7 @@ class SideBar(CTkScrollableFrame):
116
116
  y2_axis_label = CTkLabel(self.containerFrame, text="Secondary Y Axis:")
117
117
  y2_axis_label.grid(row=6, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
118
118
 
119
- self.home_page.csv_y2_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_y2, command=self.home_page.update_graph)
119
+ self.home_page.csv_y2_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_y2"), command=self.home_page.update_graph)
120
120
  self.home_page.csv_y2_selector.grid(row=7, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
121
121
 
122
122
  if (self.home_page.csv_y2_selector.get() not in columns):
@@ -140,27 +140,27 @@ class SideBar(CTkScrollableFrame):
140
140
  if (len(name_list) == 0):
141
141
  name_list.append("No files found...")
142
142
  else:
143
- if (self.home_page.selected_csv.get() not in name_list):
144
- self.home_page.selected_csv.set(name_list[0])
145
- if (self.home_page.selected_csv2.get() not in name_list):
146
- self.home_page.selected_csv2.set(name_list[0])
143
+ if (self.option_manager.get("selected_csv").get() not in name_list):
144
+ self.option_manager.get("selected_csv").set(name_list[0])
145
+ if (self.option_manager.get("selected_csv2").get() not in name_list):
146
+ self.option_manager.get("selected_csv2").set(name_list[0])
147
147
 
148
148
  file_label = CTkLabel(self.containerFrame, text="CSV Files:")
149
149
  file_label.grid(row=0, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
150
150
 
151
- self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.home_page.selected_csv, command=self.home_page.update_graph)
151
+ self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.option_manager.get("selected_csv"), command=self.home_page.update_graph)
152
152
  self.home_page.csv_file_selector.grid(row=1, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
153
153
 
154
- self.home_page.csv_file_selector2 = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.home_page.selected_csv2, command=self.home_page.update_graph)
154
+ self.home_page.csv_file_selector2 = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.option_manager.get("selected_csv2"), command=self.home_page.update_graph)
155
155
  self.home_page.csv_file_selector2.grid(row=2, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
156
156
 
157
- selected_file = self.home_page.selected_csv.get()
157
+ selected_file = self.option_manager.get("selected_csv").get()
158
158
  if (selected_file in path_map and selected_file != self.home_page.open_file):
159
159
  self.home_page.csv_data = self.load_special_csv(path_map[selected_file])
160
160
  print(self.home_page.csv_data)
161
161
  self.home_page.open_file = selected_file
162
162
 
163
- selected_file2 = self.home_page.selected_csv2.get()
163
+ selected_file2 = self.option_manager.get("selected_csv2").get()
164
164
  if (selected_file2 in path_map and selected_file2 != self.home_page.open_file2):
165
165
  self.home_page.csv_data2 = self.load_special_csv(path_map[selected_file2])
166
166
  print(self.home_page.csv_data2)
@@ -174,7 +174,7 @@ class SideBar(CTkScrollableFrame):
174
174
  x_axis_label = CTkLabel(self.containerFrame, text="X Axis:")
175
175
  x_axis_label.grid(row=3, column=0, padx=(20, 20), pady=(40, 5), sticky="w")
176
176
 
177
- self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_x, command=self.home_page.update_graph)
177
+ self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_x"), command=self.home_page.update_graph)
178
178
  self.home_page.csv_x_selector.grid(row=4, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
179
179
 
180
180
  if (self.home_page.csv_x_selector.get() not in columns):
@@ -183,7 +183,7 @@ class SideBar(CTkScrollableFrame):
183
183
  y1_axis_label = CTkLabel(self.containerFrame, text="Y Axis:")
184
184
  y1_axis_label.grid(row=5, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
185
185
 
186
- self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_y1, command=self.home_page.update_graph)
186
+ self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_y1"), command=self.home_page.update_graph)
187
187
  self.home_page.csv_y1_selector.grid(row=6, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
188
188
 
189
189
  if (self.home_page.csv_y1_selector.get() not in columns):
@@ -192,7 +192,7 @@ class SideBar(CTkScrollableFrame):
192
192
  y2_axis_label = CTkLabel(self.containerFrame, text="Secondary Y Axis:")
193
193
  y2_axis_label.grid(row=7, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
194
194
 
195
- self.home_page.csv_y2_selector = CTkOptionMenu(self.containerFrame, values=columns2, variable=self.home_page.selected_y2, command=self.home_page.update_graph)
195
+ self.home_page.csv_y2_selector = CTkOptionMenu(self.containerFrame, values=columns2, variable=self.option_manager.get("selected_y2"), command=self.home_page.update_graph)
196
196
  self.home_page.csv_y2_selector.grid(row=8, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
197
197
 
198
198
  if (self.home_page.csv_y2_selector.get() not in columns2):
@@ -217,16 +217,16 @@ class SideBar(CTkScrollableFrame):
217
217
  if (len(name_list) == 0):
218
218
  name_list.append("No files found...")
219
219
  else:
220
- if (self.home_page.selected_csv.get() not in name_list):
221
- self.home_page.selected_csv.set(name_list[0])
220
+ if (self.option_manager.get("selected_csv").get() not in name_list):
221
+ self.option_manager.get("selected_csv").set(name_list[0])
222
222
 
223
223
  file_label = CTkLabel(self.containerFrame, text="CSV File:")
224
224
  file_label.grid(row=0, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
225
225
 
226
- self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.home_page.selected_csv, command=self.home_page.update_graph)
226
+ self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.option_manager.get("selected_csv"), command=self.home_page.update_graph)
227
227
  self.home_page.csv_file_selector.grid(row=1, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
228
228
 
229
- selected_file = self.home_page.selected_csv.get()
229
+ selected_file = self.option_manager.get("selected_csv").get()
230
230
  if (selected_file in path_map and selected_file != self.home_page.open_file):
231
231
  self.home_page.csv_data = pd.read_csv(path_map[selected_file])
232
232
  print(self.home_page.csv_data)
@@ -239,7 +239,7 @@ class SideBar(CTkScrollableFrame):
239
239
  x_axis_label = CTkLabel(self.containerFrame, text="X Axis:")
240
240
  x_axis_label.grid(row=2, column=0, padx=(20, 20), pady=(40, 5), sticky="w")
241
241
 
242
- self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_x, command=self.home_page.update_graph)
242
+ self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_x"), command=self.home_page.update_graph)
243
243
  self.home_page.csv_x_selector.grid(row=3, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
244
244
 
245
245
  if (self.home_page.csv_x_selector.get() not in columns):
@@ -248,7 +248,7 @@ class SideBar(CTkScrollableFrame):
248
248
  y1_axis_label = CTkLabel(self.containerFrame, text="Y Axis:")
249
249
  y1_axis_label.grid(row=4, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
250
250
 
251
- self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_y1, command=self.home_page.update_graph)
251
+ self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_y1"), command=self.home_page.update_graph)
252
252
  self.home_page.csv_y1_selector.grid(row=5, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
253
253
 
254
254
  if (self.home_page.csv_y1_selector.get() not in columns):
@@ -257,7 +257,7 @@ class SideBar(CTkScrollableFrame):
257
257
  y2_axis_label = CTkLabel(self.containerFrame, text="Secondary Y Axis:")
258
258
  y2_axis_label.grid(row=6, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
259
259
 
260
- self.home_page.csv_y2_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_y2, command=self.home_page.update_graph)
260
+ self.home_page.csv_y2_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_y2"), command=self.home_page.update_graph)
261
261
  self.home_page.csv_y2_selector.grid(row=7, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
262
262
 
263
263
  if (self.home_page.csv_y2_selector.get() not in columns):
@@ -266,7 +266,7 @@ class SideBar(CTkScrollableFrame):
266
266
  style_label = CTkLabel(self.containerFrame, text="Figure Style:")
267
267
  style_label.grid(row=8, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
268
268
 
269
- self.home_page.figure_style_selector = CTkOptionMenu(self.containerFrame, values=["Scatter", "Bars", "Lines", "Area", "Box"], variable=self.home_page.figure_style, command=self.home_page.update_graph)
269
+ self.home_page.figure_style_selector = CTkOptionMenu(self.containerFrame, values=["Scatter", "Bars", "Lines", "Area", "Box"], variable=self.option_manager.get("figure_style"), command=self.home_page.update_graph)
270
270
  self.home_page.figure_style_selector.grid(row=9, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
271
271
 
272
272
  elif (selected_graph == "Matrix Editor"):
@@ -288,16 +288,16 @@ class SideBar(CTkScrollableFrame):
288
288
  if (len(name_list) == 0):
289
289
  name_list.append("No files found...")
290
290
  else:
291
- if (self.home_page.selected_csv.get() not in name_list):
292
- self.home_page.selected_csv.set(name_list[0])
291
+ if (self.option_manager.get("selected_csv").get() not in name_list):
292
+ self.option_manager.get("selected_csv").set(name_list[0])
293
293
 
294
294
  file_label = CTkLabel(self.containerFrame, text="CSV File:")
295
295
  file_label.grid(row=0, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
296
296
 
297
- self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.home_page.selected_csv, command=self.home_page.update_graph)
297
+ self.home_page.csv_file_selector = CTkOptionMenu(self.containerFrame, values=name_list, variable=self.option_manager.get("selected_csv"), command=self.home_page.update_graph)
298
298
  self.home_page.csv_file_selector.grid(row=1, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
299
299
 
300
- selected_file = self.home_page.selected_csv.get()
300
+ selected_file = self.option_manager.get("selected_csv").get()
301
301
  if (selected_file in path_map and selected_file != self.home_page.open_file):
302
302
  self.home_page.csv_data = pd.read_csv(path_map[selected_file])
303
303
  print(self.home_page.csv_data)
@@ -310,13 +310,13 @@ class SideBar(CTkScrollableFrame):
310
310
  style_label = CTkLabel(self.containerFrame, text="Figure Style:")
311
311
  style_label.grid(row=2, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
312
312
 
313
- self.home_page.figure_style_selector = CTkOptionMenu(self.containerFrame, values=["Scatter", "Bars", "Lines", "Area", "Box"], variable=self.home_page.figure_style, command=self.home_page.update_graph)
313
+ self.home_page.figure_style_selector = CTkOptionMenu(self.containerFrame, values=["Scatter", "Bars", "Lines", "Area", "Box"], variable=self.option_manager.get("figure_style"), command=self.home_page.update_graph)
314
314
  self.home_page.figure_style_selector.grid(row=3, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
315
315
 
316
316
  x_axis_label = CTkLabel(self.containerFrame, text="Y Axis:")
317
317
  x_axis_label.grid(row=4, column=0, padx=(20, 20), pady=(40, 5), sticky="w")
318
318
 
319
- self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_x, command=self.home_page.update_graph)
319
+ self.home_page.csv_x_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_x"), command=self.home_page.update_graph)
320
320
  self.home_page.csv_x_selector.grid(row=5, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
321
321
 
322
322
  if (self.home_page.csv_x_selector.get() not in columns):
@@ -331,7 +331,7 @@ class SideBar(CTkScrollableFrame):
331
331
  #y1_axis_label = CTkLabel(self.containerFrame, text="Y Axis:")
332
332
  #y1_axis_label.grid(row=6, column=0, padx=(20, 20), pady=(20, 5), sticky="w")
333
333
 
334
- #self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.home_page.selected_y1, command=self.home_page.update_graph)
334
+ #self.home_page.csv_y1_selector = CTkOptionMenu(self.containerFrame, values=columns, variable=self.option_manager.get("selected_y1"), command=self.home_page.update_graph)
335
335
  #self.home_page.csv_y1_selector.grid(row=7, column=0, padx=(20, 20), pady=(5, 5), sticky="ew")
336
336
 
337
337
  #if (self.home_page.csv_y1_selector.get() not in columns):
@@ -65,9 +65,8 @@ theme_plot_color_pallet = [
65
65
  def generate_graphs(HomePage):
66
66
 
67
67
  try:
68
- selected_graph = HomePage.graph_selector_value.get()
69
- info = HomePage.option_manager.get_project_data()
70
- folder = os.path.join(info['path'], info['name'])
68
+ selected_graph = HomePage.option_manager.get("selected_graph").get()
69
+ folder = HomePage.option_manager.get_project_folder()
71
70
  if not os.path.exists(folder):
72
71
  os.makedirs(folder)
73
72
 
@@ -112,7 +111,7 @@ def generate_graphs(HomePage):
112
111
  traceback.print_exc()
113
112
 
114
113
  def best_cost_stacked(homepage, config, data, option_manager):
115
- theme = homepage.graph_theme_value.get()
114
+ theme = homepage.option_manager.get("graph_theme").get()
116
115
 
117
116
  fig = go.Figure()
118
117
 
@@ -183,7 +182,7 @@ def best_cost_stacked(homepage, config, data, option_manager):
183
182
  return fig
184
183
 
185
184
  def table(homepage, config, dataframe, option_manager):
186
- theme = homepage.graph_theme_value.get()
185
+ theme = homepage.option_manager.get("graph_theme").get()
187
186
 
188
187
  # Create a plotly table with the values in the dataframe
189
188
  fig = go.Figure(data=[go.Table(
@@ -256,7 +255,7 @@ def table(homepage, config, dataframe, option_manager):
256
255
  return fig
257
256
 
258
257
  def best_cost_by_round(homepage, config, data, option_manager):
259
- theme = homepage.graph_theme_value.get()
258
+ theme = homepage.option_manager.get("graph_theme").get()
260
259
 
261
260
  fig = go.Figure()
262
261
 
@@ -362,7 +361,7 @@ def best_cost_by_round(homepage, config, data, option_manager):
362
361
  return fig
363
362
 
364
363
  def calibrated_params_by_round(homepage, config, list_of_objs, option_manager):
365
- theme = homepage.graph_theme_value.get()
364
+ theme = homepage.option_manager.get("graph_theme").get()
366
365
 
367
366
  fig = go.Figure()
368
367
 
@@ -451,15 +450,15 @@ def calibrated_params_by_round(homepage, config, list_of_objs, option_manager):
451
450
  return fig
452
451
 
453
452
  def custom_csv(homepage, option_manager):
454
- theme = homepage.graph_theme_value.get()
453
+ theme = homepage.option_manager.get("graph_theme").get()
455
454
 
456
455
  fig = go.Figure()
457
456
 
458
457
  data = homepage.csv_data["data"]
459
458
 
460
- x = homepage.csv_x_selector.get()
461
- val = homepage.csv_y1_selector.get()
462
- val2 = homepage.csv_y2_selector.get()
459
+ x = option_manager.get("selected_x").get()
460
+ val = option_manager.get("selected_y1").get()
461
+ val2 = option_manager.get("selected_y2").get()
463
462
 
464
463
  xx = None
465
464
  if x == "time":
@@ -547,16 +546,16 @@ def custom_csv(homepage, option_manager):
547
546
  return fig
548
547
 
549
548
  def compare_csv(homepage, option_manager):
550
- theme = homepage.graph_theme_value.get()
549
+ theme = homepage.option_manager.get("graph_theme").get()
551
550
 
552
551
  fig = go.Figure()
553
552
 
554
553
  data = homepage.csv_data["data"]
555
554
  data2 = homepage.csv_data2["data"]
556
555
 
557
- x = homepage.csv_x_selector.get()
558
- val = homepage.csv_y1_selector.get()
559
- val2 = homepage.csv_y2_selector.get()
556
+ x = option_manager.get("selected_x").get()
557
+ val = option_manager.get("selected_y1").get()
558
+ val2 = option_manager.get("selected_y2").get()
560
559
 
561
560
  xx = None
562
561
  if x == "time":
@@ -652,17 +651,17 @@ def compare_csv(homepage, option_manager):
652
651
  return fig
653
652
 
654
653
  def sampling_csv(homepage, option_manager):
655
- theme = homepage.graph_theme_value.get()
654
+ theme = homepage.option_manager.get("graph_theme").get()
656
655
 
657
656
  fig = go.Figure()
658
657
 
659
- style = homepage.figure_style.get()
658
+ style = option_manager.get("figure_style").get()
660
659
 
661
660
  data = homepage.csv_data
662
661
 
663
- x = homepage.csv_x_selector.get()
664
- val = homepage.csv_y1_selector.get()
665
- val2 = homepage.csv_y2_selector.get()
662
+ x = option_manager.get("selected_x").get()
663
+ val = option_manager.get("selected_y1").get()
664
+ val2 = option_manager.get("selected_y2").get()
666
665
 
667
666
  xx = None
668
667
  if x == "time":
@@ -759,14 +758,14 @@ def sampling_csv(homepage, option_manager):
759
758
  return fig
760
759
 
761
760
  def matrix_editor(homepage, option_manager):
762
- theme = homepage.graph_theme_value.get()
761
+ theme = homepage.option_manager.get("graph_theme").get()
763
762
 
764
- style = homepage.figure_style.get()
763
+ style = option_manager.get("figure_style").get()
765
764
  data = homepage.csv_data
766
- x = homepage.csv_x_selector.get()
765
+ x = option_manager.get("selected_x").get()
767
766
 
768
767
  all_figures = []
769
- figure_parameters = option_manager.get_arguments()['figure_parameters']
768
+ figure_parameters = option_manager.get('figure_parameters')
770
769
 
771
770
  #color_list = ['#636EFA', '#EF553B', '#00CC96', '#AB63FA', '#FFA15A', '#19D3F3', '#FF6692', '#B6E880', '#FF97FF', '#FECB52']
772
771
  color_index = 0
@@ -12,13 +12,379 @@ import traceback
12
12
  import urllib
13
13
  import shutil
14
14
  import json
15
+ import numpy as np
15
16
 
16
17
  def enqueue_output(out, queue):
17
18
  for line in iter(out.readline, b''):
18
19
  queue.put(line)
19
20
  out.close()
20
21
 
21
- def run_process(stdout_queue, stderr_queue, results_queue, data, folder):
22
+ def run_process(stdout_queue, stderr_queue, results_queue, data, folder, mode):
23
+ """_summary_
24
+
25
+ Args:
26
+ stdout_queue (_type_): _description_
27
+ stderr_queue (_type_): _description_
28
+ results_queue (_type_): _description_
29
+ data (_type_): _description_
30
+ folder (_type_): _description_
31
+ mode (_type_): _description_
32
+ """
33
+
34
+ # Setup folders
35
+ if not os.path.exists(folder):
36
+ os.makedirs(folder)
37
+
38
+ if not os.path.exists(os.path.join(folder, "results")):
39
+ os.makedirs(os.path.join(folder, "results"))
40
+
41
+ if (os.path.exists(os.path.join(folder, 'output.txt'))):
42
+ os.remove(os.path.join(folder, 'output.txt'))
43
+
44
+ if (os.path.exists(os.path.join(folder, 'error.txt'))):
45
+ os.remove(os.path.join(folder, 'error.txt'))
46
+
47
+ # Redirect stdout and stderr to files
48
+ old_stdout = sys.stdout
49
+ old_stderr = sys.stderr
50
+
51
+ read_stdout, write_stdout = os.pipe()
52
+ read_stderr, write_stderr = os.pipe()
53
+
54
+ sys.stdout = os.fdopen(write_stdout, 'w')
55
+ sys.stderr = os.fdopen(write_stderr, 'w')
56
+
57
+ stdout_thread = threading.Thread(target=enqueue_output, args=(os.fdopen(read_stdout, 'r'), stdout_queue))
58
+ stderr_thread = threading.Thread(target=enqueue_output, args=(os.fdopen(read_stderr, 'r'), stderr_queue))
59
+ stdout_thread.daemon = True
60
+ stderr_thread.daemon = True
61
+ stdout_thread.start()
62
+ stderr_thread.start()
63
+
64
+ if mode == "Sampling: Halton":
65
+ run_sampling(data, "halton", folder, results_queue)
66
+ elif mode == "Sampling: Random":
67
+ run_sampling(data, "random", folder, results_queue)
68
+ elif mode == "Sensitivity Analysis":
69
+ run_sensitivity_analysis(data, folder, results_queue)
70
+ elif mode == "Optimization":
71
+ run_optimization(data, folder, results_queue)
72
+ else:
73
+ print("Invalid mode")
74
+
75
+ stdout_thread.join()
76
+ stderr_thread.join()
77
+
78
+ sys.stdout = old_stdout
79
+ sys.stderr = old_stderr
80
+
81
+ def process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, list_name):
82
+ """_summary_
83
+
84
+ Args:
85
+ data (_type_): _description_
86
+ parameter_map (_type_): _description_
87
+ args (_type_): _description_
88
+ options (_type_): _description_
89
+ oh_strategy (_type_): _description_
90
+ config (_type_): _description_
91
+ metainfo (_type_): _description_
92
+ list_name (_type_): _description_
93
+ """
94
+ for obj in data[list_name]:
95
+ name = obj['name']
96
+ type = obj['type']
97
+ destination = obj['destination']
98
+ original_value = obj['value']
99
+ converted_value = original_value
100
+ if type == "integer":
101
+ converted_value = int(converted_value)
102
+ elif type == "float":
103
+ converted_value = float(converted_value)
104
+ elif type == "boolean":
105
+ converted_value = True if converted_value == "True" else False
106
+
107
+ if destination == "args":
108
+ args['param'].append((name, obj['value']))
109
+ elif destination == "kwargs":
110
+ parameter_map[name] = original_value
111
+ elif destination == "conf":
112
+ config[name] = converted_value
113
+ elif destination == "metainfo":
114
+ metainfo[name] = converted_value
115
+ elif destination == "options":
116
+ option_name = name.replace("options_", "")
117
+ options[option_name] = converted_value
118
+ elif destination == "oh_strategy":
119
+ strategy_name = name.replace("strategy_", "")
120
+ oh_strategy[strategy_name] = converted_value
121
+
122
+ def process_steps(data):
123
+ """_summary_
124
+
125
+ Args:
126
+ data (_type_): _description_
127
+
128
+ Returns:
129
+ _type_: _description_
130
+ """
131
+
132
+ steps = data['steps']
133
+ output_steps = []
134
+ for step in steps:
135
+ output_step = {}
136
+ output_step['param'] = []
137
+ output_step['objfunc'] = []
138
+ for parameter in step['parameter_objects']:
139
+ parameter_object = {}
140
+ type = parameter['type']
141
+ if type != "list":
142
+ parameter_object['name'] = parameter['name']
143
+ parameter_object['bounds'] = (float(parameter['min_bound']), float(parameter['max_bound']))
144
+ output_step['param'].append(parameter_object)
145
+ else:
146
+ parameter_object['name'] = parameter['name']
147
+ parameter_object['bounds'] = (float(parameter['min_bound']), float(parameter['max_bound']))
148
+ parameter_object['type'] = "list"
149
+ parameter_object['calibration_strategy'] = parameter['calibration_strategy']
150
+ parameter_object['default_value'] = [float(x) for x in parameter['default_value'].replace("[", "").replace("]", "").split(",")]
151
+ output_step['param'].append(parameter_object)
152
+
153
+ for function in step['objective_functions']:
154
+ out_object = {}
155
+ out_object['name'] = function['name']
156
+ out_object['of'] = function['objective_function']
157
+ out_object['weight'] = float(function['weight'])
158
+ out_object['data'] = [
159
+ function["data_observed"],
160
+ function["data_simulated"]
161
+ ]
162
+ output_step['objfunc'].append(out_object)
163
+ output_steps.append(output_step)
164
+ return output_steps
165
+
166
+ def pp(parameter, parameter_map, default=None):
167
+ """_summary_
168
+
169
+ Args:
170
+ parameter (_type_): _description_
171
+ parameter_map (_type_): _description_
172
+ default (_type_, optional): _description_. Defaults to None.
173
+
174
+ Returns:
175
+ _type_: _description_
176
+ """
177
+ if parameter in parameter_map.keys:
178
+ if parameter_map[parameter] != "" \
179
+ and parameter_map[parameter] != "None" \
180
+ and parameter_map[parameter] != "null" \
181
+ and parameter_map[parameter] != "NULL":
182
+ return parameter_map[parameter]
183
+ else:
184
+ return default
185
+ return default
186
+
187
+ def run_sampling(data, mode, folder, results_queue):
188
+ """_summary_
189
+
190
+ Args:
191
+ data (_type_): _description_
192
+ mode (_type_): _description_
193
+ folder (_type_): _description_
194
+ results_queue (_type_): _description_
195
+ """
196
+
197
+ parameter_map = {}
198
+ args = {
199
+ "param": [],
200
+ "url": data["url"],
201
+ "files": {}
202
+ }
203
+ options = {}
204
+ oh_strategy = {}
205
+ config = {}
206
+ metainfo = {}
207
+
208
+ process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, "model_parameters")
209
+ process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, "hyperparameters")
210
+ process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, "service_parameters")
211
+
212
+ output_steps = process_steps(data)
213
+
214
+ config['step_trace'] = os.path.join(folder, 'pso_step_trace.json')
215
+
216
+ print("Running Sampling..\n", flush=True)
217
+ trace = run_sampler(output_steps,
218
+ args,
219
+ int(pp('count', parameter_map)),
220
+ int(pp('num_threads', parameter_map)),
221
+ mode,
222
+ conf=config,
223
+ metainfo=metainfo if len(metainfo) > 0 else None,
224
+ trace_file=os.path.join(folder, 'results', mode + '_trace.csv'),
225
+ offset=pp('offset', parameter_map))
226
+ results_queue.put(trace)
227
+ print(trace, flush=True)
228
+ print("\n", flush=True)
229
+
230
+ def run_optimization(data, folder, results_queue):
231
+ """_summary_
232
+
233
+ Args:
234
+ data (_type_): _description_
235
+ folder (_type_): _description_
236
+ results_queue (_type_): _description_
237
+ """
238
+ parameter_map = {}
239
+ args = {
240
+ "param": [],
241
+ "url": data["url"],
242
+ "files": {}
243
+ }
244
+ options = {}
245
+ oh_strategy = {}
246
+ config = {}
247
+ metainfo = {}
248
+
249
+ process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, "model_parameters")
250
+ process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, "hyperparameters")
251
+ process_list(data, parameter_map, args, options, oh_strategy, config, metainfo, "service_parameters")
252
+
253
+ output_steps = process_steps(data)
254
+
255
+ config['step_trace'] = os.path.join(folder, 'pso_step_trace.json')
256
+
257
+ print("Running MG-PSO Optimization...\n", flush=True)
258
+ optimizer, trace = global_best(output_steps,
259
+ rounds=(int(pp('min_rounds', parameter_map)), int(pp('max_rounds', parameter_map))),
260
+ args=args,
261
+ n_particles=int(pp('n_particles', parameter_map, 10)),
262
+ iters=int(pp('iters', parameter_map, 1)),
263
+ n_threads=int(pp('n_threads', parameter_map, 4)),
264
+ rtol=float(pp('rtol', parameter_map, 0.001)),
265
+ ftol=float(pp('ftol', parameter_map, -np.inf)),
266
+ ftol_iter=int(pp('ftol_iter', parameter_map, 1)),
267
+ rtol_iter=int(pp('rtol_iter', parameter_map, 1)),
268
+ options=options,
269
+ oh_strategy=oh_strategy,
270
+ metainfo=metainfo if len(metainfo) > 0 else None,
271
+ cost_target=float(pp('cost_target', parameter_map, -np.inf)),
272
+ conf=config
273
+ )
274
+
275
+ results_queue.put(trace)
276
+ print(trace, flush=True)
277
+ pass
278
+
279
+
280
+
281
+ def run_sensitivity_analysis(data, folder, results_queue):
282
+ """_summary_
283
+
284
+ Args:
285
+ data (_type_): _description_
286
+ folder (_type_): _description_
287
+ results_queue (_type_): _description_
288
+ """
289
+ print("Running Sensitivity Analysis", flush=True)
290
+
291
+ shutil.copyfile(data["sensitivity_analysis_path"], os.path.join(folder, 'results', 'trace.csv'))
292
+ trace_path = os.path.join(folder, 'results', 'trace.csv')
293
+
294
+ output_steps = process_steps(data)
295
+
296
+ # Get list of parameters from steps
297
+ parameters = []
298
+ for param in output_steps[0]['param']:
299
+ parameters.append(param['name'])
300
+
301
+ request_json = {
302
+ "metainfo": {
303
+ "service_url": None,
304
+ "description": "",
305
+ "name": "",
306
+ "mode": "async"
307
+ },
308
+ "parameter": [
309
+ {
310
+ "name": "parameters",
311
+ "value": parameters
312
+ },
313
+ {
314
+ "name": "positiveBestMetrics",
315
+ "value": ["ns","kge","mns","kge09","nslog2"]
316
+ },
317
+ {
318
+ "name": "zeroBestMetrics",
319
+ "value": ["pbias","rmse"]
320
+ }
321
+ ]
322
+ }
323
+
324
+ with open(os.path.join(folder, 'results', 'request.json'), 'w') as json_file:
325
+ json.dump(request_json, json_file, indent=4)
326
+
327
+ request_path = os.path.join(folder, 'results', 'request.json')
328
+
329
+ output_directory = os.path.join(folder, 'results')
330
+
331
+ print("Starting ", data['url'], request_path, trace_path, output_directory, flush=True)
332
+
333
+ sensitivity_analysis(data['url'], request_path, trace_path, output_directory)
334
+
335
+ print("Finished Sensitivity Analysis", flush=True)
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+ def create_request(request_file: str) -> Client:
345
+ request: Client = Client.from_file(request_file)
346
+ return request
347
+
348
+ def download_output(response: Client, target_directory) -> None:
349
+ data_names: list[str] = response.get_data_names()
350
+ for name in data_names:
351
+ url = response.get_data_value(name)
352
+ file_path = os.path.join(target_directory, name)
353
+ urllib.request.urlretrieve(url, file_path)
354
+
355
+ def sensitivity_analysis(url, request_file, trace_file, output_directory):
356
+ request: Client = create_request(request_file)
357
+ files: list[str] = [trace_file] if os.path.isfile(trace_file) else []
358
+ conf = {
359
+ 'service_timeout': 60.0, # (sec)
360
+ }
361
+ result: Client = Client()
362
+ try:
363
+ result = request.execute(url, files=files, sync=True, conf=conf)
364
+ except Exception as ex:
365
+ traceback.print_exc()
366
+ exit(1)
367
+
368
+ if result.is_finished():
369
+ download_output(result, output_directory)
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+
384
+
385
+
386
+ """
387
+ def run_process_old(stdout_queue, stderr_queue, results_queue, data, folder):
22
388
  steps = data['steps']
23
389
  args = data['arguments']
24
390
  calib = data['calibration_parameters']
@@ -222,30 +588,4 @@ def run_process(stdout_queue, stderr_queue, results_queue, data, folder):
222
588
 
223
589
  sys.stdout = old_stdout
224
590
  sys.stderr = old_stderr
225
-
226
- def create_request(request_file: str) -> Client:
227
- request: Client = Client.from_file(request_file)
228
- return request
229
-
230
- def download_output(response: Client, target_directory) -> None:
231
- data_names: list[str] = response.get_data_names()
232
- for name in data_names:
233
- url = response.get_data_value(name)
234
- file_path = os.path.join(target_directory, name)
235
- urllib.request.urlretrieve(url, file_path)
236
-
237
- def sensitivity_analysis(url, request_file, trace_file, output_directory):
238
- request: Client = create_request(request_file)
239
- files: list[str] = [trace_file] if os.path.isfile(trace_file) else []
240
- conf = {
241
- 'service_timeout': 60.0, # (sec)
242
- }
243
- result: Client = Client()
244
- try:
245
- result = request.execute(url, files=files, sync=True, conf=conf)
246
- except Exception as ex:
247
- traceback.print_exc()
248
- exit(1)
249
-
250
- if result.is_finished():
251
- download_output(result, output_directory)
591
+ """