mg-pso-gui 0.0.1__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- mg-pso-gui/BoundsEditorWindow.py +74 -0
- mg-pso-gui/BoundsList.py +263 -0
- mg-pso-gui/CTkToolTip/__init__.py +11 -0
- mg-pso-gui/CTkToolTip/ctk_tooltip.py +187 -0
- mg-pso-gui/CalibrationParametersView.py +61 -0
- mg-pso-gui/FunctionsList.py +83 -0
- mg-pso-gui/GraphGenerator.py +215 -0
- mg-pso-gui/ListParametersView.py +173 -0
- mg-pso-gui/OptionManager.py +259 -0
- mg-pso-gui/PSORunner.py +68 -0
- mg-pso-gui/StaticParameterView.py +61 -0
- mg-pso-gui/StepView.py +118 -0
- mg-pso-gui/__init__.py +1 -0
- mg-pso-gui/main.py +485 -0
- mg_pso_gui-0.0.1.dist-info/LICENSE +21 -0
- mg_pso_gui-0.0.1.dist-info/METADATA +23 -0
- mg_pso_gui-0.0.1.dist-info/RECORD +19 -0
- mg_pso_gui-0.0.1.dist-info/WHEEL +5 -0
- mg_pso_gui-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,215 @@
|
|
1
|
+
import plotly.express as px
|
2
|
+
import plotly.graph_objs as go
|
3
|
+
import pandas as pd
|
4
|
+
import numpy as np
|
5
|
+
|
6
|
+
def best_cost_stacked(config, dataframe):
|
7
|
+
fig = go.Figure()
|
8
|
+
|
9
|
+
total_steps = len(config)
|
10
|
+
|
11
|
+
# Get unique values from the round_step column of the dataframe
|
12
|
+
for iteration in dataframe['round_step'].unique():
|
13
|
+
# Get best_cost and completed rounds rows for this iteration
|
14
|
+
df = dataframe[dataframe['round_step'] == iteration]
|
15
|
+
|
16
|
+
step_index = ((iteration) % total_steps)
|
17
|
+
round_index = ((iteration) // total_steps)
|
18
|
+
|
19
|
+
fig.add_trace(go.Scatter(x=df['completed_rounds'], y=df['best_cost'], name='Round ' + str(round_index + 1) + ' Step ' + str(step_index + 1)))
|
20
|
+
|
21
|
+
fig.update_layout(
|
22
|
+
title="",
|
23
|
+
xaxis_title="Iteration",
|
24
|
+
yaxis_title="Best Cost",
|
25
|
+
font=dict(color='white'),
|
26
|
+
paper_bgcolor='rgba(42, 42, 42, 0)',
|
27
|
+
plot_bgcolor='rgb(62, 62, 62)',
|
28
|
+
xaxis=dict(
|
29
|
+
gridcolor='rgb(72, 72, 72)',
|
30
|
+
gridwidth=1
|
31
|
+
),
|
32
|
+
yaxis=dict(
|
33
|
+
range=[0, 0.6],
|
34
|
+
autorange='reversed',
|
35
|
+
gridcolor='rgb(72, 72, 72)',
|
36
|
+
gridwidth=0.1
|
37
|
+
)
|
38
|
+
)
|
39
|
+
|
40
|
+
fig.write_image("./best_cost_stacked.png", width=1280, height=720)
|
41
|
+
fig.write_html("./best_cost_stacked.html", include_plotlyjs='cdn', auto_open=False)
|
42
|
+
with open("./best_cost_stacked.html", "r") as f:
|
43
|
+
html = f.read()
|
44
|
+
html = html.replace("<body>", "<body bgcolor='#2a2a2a'>")
|
45
|
+
with open("./best_cost_stacked.html", "w") as f:
|
46
|
+
f.write(html)
|
47
|
+
|
48
|
+
return fig
|
49
|
+
|
50
|
+
def table(config, dataframe):
|
51
|
+
# Create a plotly table with the values in the dataframe
|
52
|
+
fig = go.Figure(data=[go.Table(
|
53
|
+
header=dict(
|
54
|
+
values=list(dataframe.columns),
|
55
|
+
font=dict(color='black'),
|
56
|
+
align="left"
|
57
|
+
),
|
58
|
+
cells=dict(
|
59
|
+
values=[dataframe[k].tolist() for k in dataframe.columns],
|
60
|
+
font=dict(color='black'),
|
61
|
+
align = "left")
|
62
|
+
)])
|
63
|
+
|
64
|
+
fig.update_layout(
|
65
|
+
title="",
|
66
|
+
xaxis_title="Iteration",
|
67
|
+
yaxis_title="Best Cost",
|
68
|
+
font=dict(color='white'),
|
69
|
+
paper_bgcolor='rgba(42, 42, 42, 0)',
|
70
|
+
plot_bgcolor='rgb(62, 62, 62)',
|
71
|
+
xaxis=dict(
|
72
|
+
gridcolor='rgb(72, 72, 72)',
|
73
|
+
gridwidth=1
|
74
|
+
),
|
75
|
+
yaxis=dict(
|
76
|
+
range=[0, 0.6],
|
77
|
+
autorange='reversed',
|
78
|
+
gridcolor='rgb(72, 72, 72)',
|
79
|
+
gridwidth=0.1
|
80
|
+
)
|
81
|
+
)
|
82
|
+
|
83
|
+
fig.write_image("./table.png", width=1280, height=720)
|
84
|
+
fig.write_html("./table.html", include_plotlyjs='cdn', auto_open=False)
|
85
|
+
with open("./table.html", "r") as f:
|
86
|
+
html = f.read()
|
87
|
+
html = html.replace("<body>", "<body bgcolor='#2a2a2a'>")
|
88
|
+
with open("./table.html", "w") as f:
|
89
|
+
f.write(html)
|
90
|
+
|
91
|
+
return fig
|
92
|
+
|
93
|
+
def best_cost_by_round(config, dataframe):
|
94
|
+
fig = go.Figure()
|
95
|
+
|
96
|
+
total_steps = len(config)
|
97
|
+
|
98
|
+
# Get unique values from the round_step column of the dataframe
|
99
|
+
for iteration in dataframe['round_step'].unique():
|
100
|
+
# Get best_cost and completed rounds rows for this iteration
|
101
|
+
df = dataframe[dataframe['round_step'] == iteration]
|
102
|
+
|
103
|
+
step_index = ((iteration) % total_steps)
|
104
|
+
round_index = ((iteration) // total_steps)
|
105
|
+
|
106
|
+
fig.add_trace(go.Scatter(x=df['completed_rounds'] + (df['total_rounds'] * round_index), y=df['best_cost'], name='Step ' + str(step_index + 1)))
|
107
|
+
|
108
|
+
xx = np.max(df['completed_rounds']) + (np.max(df['total_rounds']) * round_index)
|
109
|
+
fig.add_shape(
|
110
|
+
type='line',
|
111
|
+
x0=xx,
|
112
|
+
y0=0,
|
113
|
+
x1=xx,
|
114
|
+
y1=1,
|
115
|
+
yref='paper',
|
116
|
+
line=dict(
|
117
|
+
color='rgb(102, 102, 102)',
|
118
|
+
width=2
|
119
|
+
)
|
120
|
+
)
|
121
|
+
|
122
|
+
fig.add_annotation(
|
123
|
+
x=xx + 0.5,
|
124
|
+
y=1,
|
125
|
+
yref='paper',
|
126
|
+
text='Round ' + str(round_index + 1),
|
127
|
+
showarrow=False,
|
128
|
+
yshift=-10
|
129
|
+
)
|
130
|
+
|
131
|
+
fig.update_layout(
|
132
|
+
title="",
|
133
|
+
xaxis_title="Iteration",
|
134
|
+
yaxis_title="Best Cost",
|
135
|
+
font=dict(color='white'),
|
136
|
+
paper_bgcolor='rgba(42, 42, 42, 0)',
|
137
|
+
plot_bgcolor='rgb(62, 62, 62)',
|
138
|
+
xaxis=dict(
|
139
|
+
gridcolor='rgb(72, 72, 72)',
|
140
|
+
gridwidth=1
|
141
|
+
),
|
142
|
+
yaxis=dict(
|
143
|
+
range=[0, 0.6],
|
144
|
+
autorange='reversed',
|
145
|
+
gridcolor='rgb(72, 72, 72)',
|
146
|
+
gridwidth=0.1
|
147
|
+
)
|
148
|
+
)
|
149
|
+
|
150
|
+
fig.write_image("./best_cost_by_round.png", width=1280, height=720)
|
151
|
+
fig.write_html("./best_cost_by_round.html", include_plotlyjs='cdn', auto_open=False)
|
152
|
+
with open("./best_cost_by_round.html", "r") as f:
|
153
|
+
html = f.read()
|
154
|
+
html = html.replace("<body>", "<body bgcolor='#2a2a2a'>")
|
155
|
+
with open("./best_cost_by_round.html", "w") as f:
|
156
|
+
f.write(html)
|
157
|
+
|
158
|
+
return fig
|
159
|
+
|
160
|
+
def calibrated_params_by_round(config, list_of_objs):
|
161
|
+
fig = go.Figure()
|
162
|
+
|
163
|
+
total_steps = len(config)
|
164
|
+
|
165
|
+
datalines = {"step": [], "round": []}
|
166
|
+
step = 1
|
167
|
+
round = 1
|
168
|
+
for index, obj in enumerate(list_of_objs):
|
169
|
+
if (obj == {}):
|
170
|
+
continue
|
171
|
+
for key in obj.keys():
|
172
|
+
if key not in datalines:
|
173
|
+
datalines[key] = []
|
174
|
+
datalines[key].append(obj[key])
|
175
|
+
datalines["step"].append(step)
|
176
|
+
datalines['round'].append(round)
|
177
|
+
step += 1
|
178
|
+
if (step > total_steps):
|
179
|
+
step = 1
|
180
|
+
round += 1
|
181
|
+
|
182
|
+
# Get unique values from the round_step column of the dataframe
|
183
|
+
for key in datalines.keys():
|
184
|
+
# Get best_cost and completed rounds rows for this iteration
|
185
|
+
if key == 'step' or key == 'round':
|
186
|
+
continue
|
187
|
+
|
188
|
+
fig.add_trace(go.Scatter(x=datalines['round'], y=datalines[key], name=key))
|
189
|
+
|
190
|
+
fig.update_layout(
|
191
|
+
title="",
|
192
|
+
xaxis_title="Round",
|
193
|
+
yaxis_title="Particle Parameters",
|
194
|
+
font=dict(color='white'),
|
195
|
+
paper_bgcolor='rgba(42, 42, 42, 0)',
|
196
|
+
plot_bgcolor='rgb(62, 62, 62)',
|
197
|
+
xaxis=dict(
|
198
|
+
gridcolor='rgb(72, 72, 72)',
|
199
|
+
gridwidth=1
|
200
|
+
),
|
201
|
+
yaxis=dict(
|
202
|
+
gridcolor='rgb(72, 72, 72)',
|
203
|
+
gridwidth=0.1
|
204
|
+
)
|
205
|
+
)
|
206
|
+
|
207
|
+
fig.write_image("./calibrated_params_by_round.png", width=1280, height=720)
|
208
|
+
fig.write_html("./calibrated_params_by_round.html", include_plotlyjs='cdn', auto_open=False)
|
209
|
+
with open("./calibrated_params_by_round.html", "r") as f:
|
210
|
+
html = f.read()
|
211
|
+
html = html.replace("<body>", "<body bgcolor='#2a2a2a'>")
|
212
|
+
with open("./calibrated_params_by_round.html", "w") as f:
|
213
|
+
f.write(html)
|
214
|
+
|
215
|
+
return fig
|
@@ -0,0 +1,173 @@
|
|
1
|
+
from customtkinter import CTkScrollableFrame
|
2
|
+
from customtkinter import CTkFrame
|
3
|
+
from customtkinter import CTkLabel
|
4
|
+
from customtkinter import CTkButton
|
5
|
+
from customtkinter import CTkEntry
|
6
|
+
import tkinter as tk
|
7
|
+
import subprocess
|
8
|
+
|
9
|
+
global option_manager
|
10
|
+
|
11
|
+
class ListParametersView(CTkScrollableFrame):
|
12
|
+
def __init__(self, *args,
|
13
|
+
option_manager: None,
|
14
|
+
step_index: 0,
|
15
|
+
bound_index: 0,
|
16
|
+
**kwargs):
|
17
|
+
super().__init__(*args, **kwargs)
|
18
|
+
|
19
|
+
self.option_manager = option_manager
|
20
|
+
self.step_index = step_index
|
21
|
+
self.bounds_index = bound_index
|
22
|
+
self.key_values = []
|
23
|
+
self.visual_name = tk.StringVar()
|
24
|
+
self.visual_name.set("name")
|
25
|
+
|
26
|
+
|
27
|
+
self.name = self.option_manager.get_steps()[self.step_index]["param"][bound_index]["name"].get()
|
28
|
+
self.default = self.option_manager.get_steps()[self.step_index]["param"][bound_index]["default_value"].get()
|
29
|
+
try:
|
30
|
+
if self.name != "" and self.default != "":
|
31
|
+
|
32
|
+
self.visual_name.set(self.name.rsplit('/', 1)[0] + '/')
|
33
|
+
self.names = self.name.split('/')
|
34
|
+
self.rows = self.names[-1].split(';')
|
35
|
+
self.defaults = self.default.replace("[", "").replace("]", "").replace("(", "").replace(")", "").replace(" ", "").split(",")
|
36
|
+
|
37
|
+
print("rows", self.rows)
|
38
|
+
print("defaults", self.defaults)
|
39
|
+
index = 0
|
40
|
+
|
41
|
+
for name in self.rows:
|
42
|
+
obj = {"name": tk.StringVar(), "value": tk.StringVar()}
|
43
|
+
obj['name'].set(name)
|
44
|
+
obj['value'].set(self.defaults[index])
|
45
|
+
self.key_values.append(obj)
|
46
|
+
index += 1
|
47
|
+
except Exception as e:
|
48
|
+
print(e)
|
49
|
+
|
50
|
+
if (len(self.key_values) == 0):
|
51
|
+
self.add_key()
|
52
|
+
|
53
|
+
self.edit_mode = False
|
54
|
+
|
55
|
+
self.render()
|
56
|
+
|
57
|
+
def clear(self):
|
58
|
+
self.containerFrame.destroy()
|
59
|
+
|
60
|
+
def toggle_edit_mode(self):
|
61
|
+
self.clear()
|
62
|
+
self.edit_mode = not self.edit_mode
|
63
|
+
self.render()
|
64
|
+
|
65
|
+
def add_key(self, key="0000", value="0"):
|
66
|
+
obj = {"name": tk.StringVar(), "value": tk.StringVar()}
|
67
|
+
obj['name'].set(key)
|
68
|
+
obj['value'].set(value)
|
69
|
+
self.key_values.append(obj)
|
70
|
+
|
71
|
+
def remove_key(self, index):
|
72
|
+
self.key_values.pop(index)
|
73
|
+
|
74
|
+
def open_csv(self):
|
75
|
+
# Shell out to the terminal and run "open ./example.html"
|
76
|
+
path = self.visual_name.get()
|
77
|
+
path = path.replace(" ", "")
|
78
|
+
file_path = path.split("/")[0]
|
79
|
+
subprocess.run(["open", "./" + file_path])
|
80
|
+
|
81
|
+
def import_csv(self):
|
82
|
+
# Get data from the clipboard using Tkinter
|
83
|
+
data = self.clipboard_get()
|
84
|
+
|
85
|
+
lines = data.split('\n')
|
86
|
+
|
87
|
+
# Initialize empty lists for the two columns
|
88
|
+
column1 = []
|
89
|
+
column2 = []
|
90
|
+
|
91
|
+
# Loop through each line and split it into two values
|
92
|
+
for line in lines:
|
93
|
+
if line.strip() != '':
|
94
|
+
values = line.split()
|
95
|
+
column1.append(values[0])
|
96
|
+
column2.append(values[1])
|
97
|
+
|
98
|
+
# Print the two columns
|
99
|
+
print(column1)
|
100
|
+
print(column2)
|
101
|
+
|
102
|
+
if (len(column1) == len(column2)):
|
103
|
+
self.clear()
|
104
|
+
index = 0
|
105
|
+
for name in column1:
|
106
|
+
self.add_key(name, column2[index])
|
107
|
+
index += 1
|
108
|
+
self.render()
|
109
|
+
|
110
|
+
|
111
|
+
def render(self):
|
112
|
+
row = 0
|
113
|
+
index = 0
|
114
|
+
|
115
|
+
self.containerFrame = CTkFrame(self)
|
116
|
+
self.containerFrame.grid(row=0, column=0, padx=(5, 5), pady=(5, 5), sticky="nsew")
|
117
|
+
self.containerFrame.grid_columnconfigure((0, 1), weight=1)
|
118
|
+
|
119
|
+
CTkLabel(self.containerFrame, text="Path:").grid(row=row, column=0, columnspan=2, padx=5, pady=5, sticky="")
|
120
|
+
row += 1
|
121
|
+
|
122
|
+
self.path_name = CTkEntry(self.containerFrame, textvariable=self.visual_name)
|
123
|
+
self.path_name.grid(row=row, column=0, columnspan=2, padx=(5, 5), pady=(5, 5), sticky="ew")
|
124
|
+
row += 1
|
125
|
+
|
126
|
+
CTkButton(self.containerFrame, text="Open", command=self.open_csv).grid(row=row, column=0, padx=(5, 5), pady=(5, 5), sticky="ew")
|
127
|
+
CTkButton(self.containerFrame, text="Import", command=self.import_csv).grid(row=row, column=1, padx=(5, 5), pady=(5, 5), sticky="ew")
|
128
|
+
row += 1
|
129
|
+
|
130
|
+
|
131
|
+
CTkLabel(self.containerFrame, text="Row:").grid(row=row, column=0, columnspan=1, padx=5, pady=5, sticky="")
|
132
|
+
CTkLabel(self.containerFrame, text="Default:").grid(row=row, column=1, columnspan=1, padx=5, pady=5, sticky="")
|
133
|
+
row += 1
|
134
|
+
|
135
|
+
for key_value_pair in self.key_values:
|
136
|
+
CTkEntry(self.containerFrame, textvariable=self.key_values[index]["name"]).grid(row=row, column=0, padx=(5, 5), pady=(5, 5), sticky="ew")
|
137
|
+
|
138
|
+
if self.edit_mode:
|
139
|
+
return_func = lambda index=index: (self.clear(), self.remove_key(index), self.render())
|
140
|
+
CTkButton(self.containerFrame, text="Remove", command=return_func).grid(row=row, column=1, padx=(5, 5), pady=(5, 5), sticky="ew")
|
141
|
+
else:
|
142
|
+
bb = CTkEntry(self.containerFrame)
|
143
|
+
bb.grid(row=row, column=1, padx=(5, 5), pady=(5, 5), sticky="ew")
|
144
|
+
bb.configure(textvariable=self.key_values[index]["value"])
|
145
|
+
row += 1
|
146
|
+
index += 1
|
147
|
+
|
148
|
+
if self.edit_mode:
|
149
|
+
CTkButton(self.containerFrame, text="Exit", command=self.toggle_edit_mode).grid(row=row, column=0, padx=(5, 5), pady=(5, 5), sticky="ew")
|
150
|
+
else:
|
151
|
+
CTkButton(self.containerFrame, text="Edit", command=self.toggle_edit_mode).grid(row=row, column=0, padx=(5, 5), pady=(5, 5), sticky="ew")
|
152
|
+
|
153
|
+
add_key_func = lambda: (self.clear(), self.add_key(), self.render())
|
154
|
+
CTkButton(self.containerFrame, text="Add", command=add_key_func).grid(row=row, column=1, padx=(5, 5), pady=(5, 5), sticky="ew")
|
155
|
+
|
156
|
+
row += 1
|
157
|
+
|
158
|
+
def push_to_option_manager(self):
|
159
|
+
visual_name = self.visual_name.get()
|
160
|
+
default_values = "["
|
161
|
+
first = True
|
162
|
+
for key_value_pair in self.key_values:
|
163
|
+
if first:
|
164
|
+
visual_name += key_value_pair['name'].get()
|
165
|
+
first = False
|
166
|
+
else:
|
167
|
+
visual_name += ";" + key_value_pair['name'].get()
|
168
|
+
default_values += key_value_pair['value'].get() + ","
|
169
|
+
|
170
|
+
default_values = default_values[:-1] + "]"
|
171
|
+
|
172
|
+
self.option_manager.get_steps()[self.step_index]["param"][self.bounds_index]["name"].set(visual_name)
|
173
|
+
self.option_manager.get_steps()[self.step_index]["param"][self.bounds_index]["default_value"].set(default_values)
|
@@ -0,0 +1,259 @@
|
|
1
|
+
from tkinter import StringVar as sv
|
2
|
+
from tkinter import IntVar as iv
|
3
|
+
from tkinter import BooleanVar as bv
|
4
|
+
from tkinter import DoubleVar as dv
|
5
|
+
import json
|
6
|
+
|
7
|
+
class OptionManager():
|
8
|
+
|
9
|
+
def __init__(self):
|
10
|
+
|
11
|
+
self.project_data = {"name": sv()}
|
12
|
+
self.arguments = {"param": [],
|
13
|
+
"url": sv(),
|
14
|
+
"files": {},
|
15
|
+
"calibration_parameters": []}
|
16
|
+
self.steps = []
|
17
|
+
self.service_parameters = {}
|
18
|
+
|
19
|
+
def clear(self):
|
20
|
+
self.arguments['param'].clear()
|
21
|
+
self.arguments['url'].set("")
|
22
|
+
self.arguments['files'] = {}
|
23
|
+
self.arguments['calibration_parameters'].clear()
|
24
|
+
self.steps = []
|
25
|
+
self.service_parameters = {}
|
26
|
+
|
27
|
+
def add_arguments(self, arguments):
|
28
|
+
|
29
|
+
if ("url" in arguments):
|
30
|
+
self.arguments["url"].set(arguments["url"])
|
31
|
+
|
32
|
+
if ("files" in arguments):
|
33
|
+
for file in arguments["files"]:
|
34
|
+
name = file["name"]
|
35
|
+
value = file["value"]
|
36
|
+
obj = {"name": sv(), "value": sv()}
|
37
|
+
obj["name"].set(name)
|
38
|
+
obj["value"].set(value)
|
39
|
+
self.arguments["files"][name] = obj
|
40
|
+
|
41
|
+
for param in arguments["param"]:
|
42
|
+
name = param["name"]
|
43
|
+
value = param["value"]
|
44
|
+
obj = {"name": sv(), "value": sv()}
|
45
|
+
obj["name"].set(name)
|
46
|
+
obj["value"].set(value)
|
47
|
+
self.arguments["param"].append(obj)
|
48
|
+
|
49
|
+
for param in arguments["calibration_parameters"]:
|
50
|
+
name = param["name"]
|
51
|
+
value = param["value"]
|
52
|
+
obj = {"name": sv(), "value": sv()}
|
53
|
+
obj["name"].set(name)
|
54
|
+
obj["value"].set(value)
|
55
|
+
self.arguments["calibration_parameters"].append(obj)
|
56
|
+
|
57
|
+
def add_steps(self, steps):
|
58
|
+
for step in steps:
|
59
|
+
obj = {"param": [], "objfunc": [], "name": sv(), "message": sv(), "open": False}
|
60
|
+
obj["name"].set("Step " + str(len(self.steps) + 1))
|
61
|
+
obj["message"].set("Wow")
|
62
|
+
|
63
|
+
for param in step["param"]:
|
64
|
+
param_obj = {
|
65
|
+
"name": sv(),
|
66
|
+
"bounds": (sv(), sv()),
|
67
|
+
"default_value": sv(),
|
68
|
+
"type": sv(),
|
69
|
+
"calibration_strategy": sv()
|
70
|
+
}
|
71
|
+
param_obj["name"].set(param["name"])
|
72
|
+
if "bounds" in param:
|
73
|
+
param_obj["bounds"][0].set(param["bounds"][0])
|
74
|
+
param_obj["bounds"][1].set(param["bounds"][1])
|
75
|
+
else:
|
76
|
+
param_obj["bounds"][0].set(0)
|
77
|
+
param_obj["bounds"][1].set(1)
|
78
|
+
if "type" in param:
|
79
|
+
param_obj["type"].set(param["type"])
|
80
|
+
else:
|
81
|
+
param_obj["type"].set("float")
|
82
|
+
if "default_value" in param:
|
83
|
+
param_obj["default_value"].set(param["default_value"])
|
84
|
+
else:
|
85
|
+
param_obj["default_value"].set(1)
|
86
|
+
if "calibration_strategy" in param:
|
87
|
+
param_obj["calibration_strategy"].set(param["calibration_strategy"])
|
88
|
+
else:
|
89
|
+
param_obj["calibration_strategy"].set("none")
|
90
|
+
obj["param"].append(param_obj)
|
91
|
+
|
92
|
+
for objfunc in step["objfunc"]:
|
93
|
+
objfunc_obj = {"name": sv(), "of": sv(), "weight": sv(), "data": (sv(), sv())}
|
94
|
+
objfunc_obj["name"].set(objfunc["name"])
|
95
|
+
objfunc_obj["of"].set(objfunc["of"])
|
96
|
+
|
97
|
+
if ("weight" in objfunc):
|
98
|
+
objfunc_obj["weight"].set(objfunc["weight"])
|
99
|
+
else:
|
100
|
+
objfunc_obj["weight"].set(1)
|
101
|
+
|
102
|
+
objfunc_obj["data"][0].set(objfunc["data"][0])
|
103
|
+
objfunc_obj["data"][1].set(objfunc["data"][1])
|
104
|
+
obj["objfunc"].append(objfunc_obj)
|
105
|
+
|
106
|
+
self.steps.append(obj)
|
107
|
+
|
108
|
+
def add_function(self, step_index):
|
109
|
+
obj = {"name": sv(), "of": sv(), "weight": sv(), "data": (sv(), sv())}
|
110
|
+
obj["name"].set("ns")
|
111
|
+
obj["of"].set("ns")
|
112
|
+
obj["weight"].set(1)
|
113
|
+
obj["data"][0].set("")
|
114
|
+
obj["data"][1].set("")
|
115
|
+
self.steps[step_index]["objfunc"].append(obj)
|
116
|
+
|
117
|
+
def remove_function(self, step_index, index):
|
118
|
+
self.steps[step_index]["objfunc"].pop(index)
|
119
|
+
|
120
|
+
def add_bound(self, step_index,
|
121
|
+
name="name",
|
122
|
+
min=0,
|
123
|
+
max=1,
|
124
|
+
type="float",
|
125
|
+
default_value=1,
|
126
|
+
calibration_strategy="none"):
|
127
|
+
obj = {
|
128
|
+
"name": sv(),
|
129
|
+
"bounds": (sv(), sv()),
|
130
|
+
"default_value": sv(),
|
131
|
+
"type": sv(),
|
132
|
+
"calibration_strategy": sv()
|
133
|
+
}
|
134
|
+
obj["name"].set(name)
|
135
|
+
obj["type"].set(type)
|
136
|
+
obj["default_value"].set(default_value)
|
137
|
+
obj["calibration_strategy"].set(calibration_strategy)
|
138
|
+
obj["bounds"][0].set(min)
|
139
|
+
obj["bounds"][1].set(max)
|
140
|
+
self.steps[step_index]["param"].append(obj)
|
141
|
+
|
142
|
+
def remove_bound(self, step_index, index):
|
143
|
+
self.steps[step_index]["param"].pop(index)
|
144
|
+
|
145
|
+
def add_argument(self, key, value):
|
146
|
+
obj = {"name": sv(), "value": sv()}
|
147
|
+
obj["name"].set(key)
|
148
|
+
obj["value"].set(value)
|
149
|
+
self.arguments["param"].append(obj)
|
150
|
+
|
151
|
+
def add_calibration_param(self, key, value):
|
152
|
+
obj = {"name": sv(), "value": sv()}
|
153
|
+
obj["name"].set(key)
|
154
|
+
obj["value"].set(value)
|
155
|
+
self.arguments["calibration_parameters"].append(obj)
|
156
|
+
|
157
|
+
def move_argument_up(self, index):
|
158
|
+
if index > 0:
|
159
|
+
self.arguments["param"][index], self.arguments["param"][index - 1] = self.arguments["param"][index - 1], self.arguments["param"][index]
|
160
|
+
|
161
|
+
def move_argument_down(self, index):
|
162
|
+
if index < len(self.arguments["param"]) - 1:
|
163
|
+
self.arguments["param"][index], self.arguments["param"][index + 1] = self.arguments["param"][index + 1], self.arguments["param"][index]
|
164
|
+
|
165
|
+
def move_step_up(self, index):
|
166
|
+
if index > 0:
|
167
|
+
self.steps[index], self.steps[index - 1] = self.steps[index - 1], self.steps[index]
|
168
|
+
|
169
|
+
def move_step_down(self, index):
|
170
|
+
if index < len(self.steps) - 1:
|
171
|
+
self.steps[index], self.steps[index + 1] = self.steps[index + 1], self.steps[index]
|
172
|
+
|
173
|
+
def toggle_step_open(self, index):
|
174
|
+
self.steps[index]["open"] = not self.steps[index]["open"]
|
175
|
+
|
176
|
+
def remove_argument(self, index):
|
177
|
+
self.arguments["param"].pop(index)
|
178
|
+
|
179
|
+
def remove_calibration_parameter(self, index):
|
180
|
+
self.arguments["calibration_parameters"].pop(index)
|
181
|
+
|
182
|
+
def remove_step(self, index):
|
183
|
+
self.steps.pop(index)
|
184
|
+
|
185
|
+
def get_arguments(self):
|
186
|
+
return self.arguments
|
187
|
+
|
188
|
+
def get_steps(self):
|
189
|
+
return self.steps
|
190
|
+
|
191
|
+
|
192
|
+
def get_all_as_json(self):
|
193
|
+
obj = {"arguments": self.arguments, "steps": self.steps}
|
194
|
+
return obj
|
195
|
+
|
196
|
+
|
197
|
+
def get_metrics(self):
|
198
|
+
result = {}
|
199
|
+
result['arguments'] = {}
|
200
|
+
result['calibration_parameters'] = []
|
201
|
+
for key, value in self.arguments.items():
|
202
|
+
if key == 'url':
|
203
|
+
result['arguments'][key] = value.get()
|
204
|
+
elif key == 'files':
|
205
|
+
result['arguments'][key] = {}
|
206
|
+
#for name, obj in value.items():
|
207
|
+
# result['arguments'][key].append({'name': obj['name'].get(), 'value': obj['value'].get()})
|
208
|
+
elif key == 'param':
|
209
|
+
result['arguments'][key] = []
|
210
|
+
for obj in value:
|
211
|
+
result['arguments'][key].append({'name': obj['name'].get(), 'value': obj['value'].get()})
|
212
|
+
elif key == "calibration_parameters":
|
213
|
+
#result['calibration_parameters'][key] = []
|
214
|
+
for obj in value:
|
215
|
+
result['calibration_parameters'].append({'name': obj['name'].get(), 'value': obj['value'].get()})
|
216
|
+
result['steps'] = []
|
217
|
+
for step in self.steps:
|
218
|
+
step_result = {}
|
219
|
+
#step_result['name'] = step['name'].get()
|
220
|
+
#step_result['open'] = step['open']
|
221
|
+
step_result['param'] = []
|
222
|
+
for param in step['param']:
|
223
|
+
# try converting the bounds to numbers
|
224
|
+
#try:
|
225
|
+
if param['type'].get() == 'float':
|
226
|
+
step_result['param'].append(
|
227
|
+
{
|
228
|
+
'name': param['name'].get(),
|
229
|
+
'bounds': (float(param['bounds'][0].get()),
|
230
|
+
float(param['bounds'][1].get())),
|
231
|
+
'default_value': float(param['default_value'].get()),
|
232
|
+
'type': 'float',
|
233
|
+
'calibration_strategy': param['calibration_strategy'].get()
|
234
|
+
}
|
235
|
+
)
|
236
|
+
elif param['type'].get() == 'list':
|
237
|
+
step_result['param'].append(
|
238
|
+
{
|
239
|
+
'name': param['name'].get(),
|
240
|
+
'bounds': (float(param['bounds'][0].get()),
|
241
|
+
float(param['bounds'][1].get())),
|
242
|
+
'default_value': param['default_value'].get(),
|
243
|
+
'type': 'list',
|
244
|
+
'calibration_strategy': param['calibration_strategy'].get()
|
245
|
+
}
|
246
|
+
)
|
247
|
+
#except ValueError:
|
248
|
+
# step_result['param'].append(
|
249
|
+
# {
|
250
|
+
# 'name': param['name'].get(),
|
251
|
+
# 'bounds': (param['bounds'][0].get(),
|
252
|
+
# param['bounds'][1].get())
|
253
|
+
# }
|
254
|
+
# )
|
255
|
+
step_result['objfunc'] = []
|
256
|
+
for objfunc in step['objfunc']:
|
257
|
+
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())})
|
258
|
+
result['steps'].append(step_result)
|
259
|
+
return result
|