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.
- {mg_pso_gui-0.2.22.dist-info → mg_pso_gui-0.2.24.dist-info}/METADATA +1 -1
- {mg_pso_gui-0.2.22.dist-info → mg_pso_gui-0.2.24.dist-info}/RECORD +13 -13
- mgpsogui/gui/General/ParameterView.py +1 -1
- mgpsogui/gui/HomePage.py +5 -15
- mgpsogui/gui/OptionManager.py +41 -7
- mgpsogui/gui/SetupTab/OverrideParameterMetrics.py +13 -1
- mgpsogui/gui/SetupTab/StepView.py +6 -4
- mgpsogui/gui/VisualizeTab/SideBar.py +34 -34
- mgpsogui/util/GraphGenerator.py +23 -24
- mgpsogui/util/PSORunner.py +368 -28
- {mg_pso_gui-0.2.22.dist-info → mg_pso_gui-0.2.24.dist-info}/WHEEL +0 -0
- {mg_pso_gui-0.2.22.dist-info → mg_pso_gui-0.2.24.dist-info}/entry_points.txt +0 -0
- {mg_pso_gui-0.2.22.dist-info → mg_pso_gui-0.2.24.dist-info}/top_level.txt +0 -0
@@ -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=
|
5
|
-
mgpsogui/gui/OptionManager.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
47
|
-
mgpsogui/util/PSORunner.py,sha256=
|
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.
|
73
|
-
mg_pso_gui-0.2.
|
74
|
-
mg_pso_gui-0.2.
|
75
|
-
mg_pso_gui-0.2.
|
76
|
-
mg_pso_gui-0.2.
|
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=["
|
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
|
-
|
347
|
-
|
348
|
-
|
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...")
|
mgpsogui/gui/OptionManager.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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="
|
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
|
-
|
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.
|
97
|
-
self.
|
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.
|
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.
|
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.
|
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.
|
80
|
-
self.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
144
|
-
self.
|
145
|
-
if (self.
|
146
|
-
self.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
221
|
-
self.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
292
|
-
self.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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):
|
mgpsogui/util/GraphGenerator.py
CHANGED
@@ -65,9 +65,8 @@ theme_plot_color_pallet = [
|
|
65
65
|
def generate_graphs(HomePage):
|
66
66
|
|
67
67
|
try:
|
68
|
-
selected_graph = HomePage.
|
69
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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 =
|
461
|
-
val =
|
462
|
-
val2 =
|
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.
|
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 =
|
558
|
-
val =
|
559
|
-
val2 =
|
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.
|
654
|
+
theme = homepage.option_manager.get("graph_theme").get()
|
656
655
|
|
657
656
|
fig = go.Figure()
|
658
657
|
|
659
|
-
style =
|
658
|
+
style = option_manager.get("figure_style").get()
|
660
659
|
|
661
660
|
data = homepage.csv_data
|
662
661
|
|
663
|
-
x =
|
664
|
-
val =
|
665
|
-
val2 =
|
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.
|
761
|
+
theme = homepage.option_manager.get("graph_theme").get()
|
763
762
|
|
764
|
-
style =
|
763
|
+
style = option_manager.get("figure_style").get()
|
765
764
|
data = homepage.csv_data
|
766
|
-
x =
|
765
|
+
x = option_manager.get("selected_x").get()
|
767
766
|
|
768
767
|
all_figures = []
|
769
|
-
figure_parameters = option_manager.
|
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
|
mgpsogui/util/PSORunner.py
CHANGED
@@ -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
|
+
"""
|
File without changes
|
File without changes
|
File without changes
|