Skip to content

Commit 870f23b

Browse files
committed
Added Preevaluation test and correct Operations singleton bug
1 parent fc7ceae commit 870f23b

File tree

6 files changed

+186
-15
lines changed

6 files changed

+186
-15
lines changed

MLC/Application.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import MLC.Log.log as lg
33

44
from MLC.Common.PreevaluationManager import PreevaluationManager
5+
from MLC.Common.Operations import Operations
56
from MLC.db.mlc_repository import MLCRepository
67
from MLC.Log.log import set_logger
78
from MLC.mlc_parameters.mlc_parameters import Config
@@ -21,6 +22,8 @@ class Application(object):
2122

2223
def __init__(self, simulation, callbacks={}, gen_creator=None):
2324
self._config = Config.get_instance()
25+
# Reload the Operations supported
26+
Operations.get_instance(reload_operations=True)
2427

2528
self._simulation = simulation
2629
self._mlc_repository = MLCRepository.get_instance()

MLC/Common/Operations.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@ def __init__(self):
2121
for operation_id in opsetrange:
2222
self._ops[operation_id] = available_operations[operation_id]
2323

24-
25-
def get_operation_from_op_num(self, op_num):
24+
def get_operation_from_op_num(self, op_num_index):
2625
try:
27-
return self._ops[op_num]
26+
return self._ops.values()[int(op_num_index) - 1]
2827
except KeyError:
29-
raise IndexError("get_operation", "Index must be one of the following values: " + str(self._ops.keys()))
28+
raise IndexError("get_operation_from_op_num",
29+
"Index must be one of the following values: {0}"
30+
.format(str(self._ops.keys())))
3031

3132
def get_operation_from_op_string(self, str_op):
3233
for k, op in self._ops.iteritems():
@@ -40,8 +41,8 @@ def length(self):
4041
return len(self._ops)
4142

4243
@staticmethod
43-
def get_instance():
44-
if Operations._instance is None:
44+
def get_instance(reload_operations=False):
45+
if reload_operations or Operations._instance is None:
4546
Operations._instance = Operations()
4647

4748
return Operations._instance

MLC/GUI/Autogenerated/autogenerated.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ class Ui_ExperimentWindow(object):
450450
def setupUi(self, ExperimentWindow):
451451
ExperimentWindow.setObjectName("ExperimentWindow")
452452
ExperimentWindow.setWindowModality(QtCore.Qt.ApplicationModal)
453-
ExperimentWindow.resize(961, 568)
453+
ExperimentWindow.resize(965, 615)
454454
self.centralWidget = QtWidgets.QWidget(ExperimentWindow)
455455
self.centralWidget.setObjectName("centralWidget")
456456
self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralWidget)
@@ -599,8 +599,37 @@ def setupUi(self, ExperimentWindow):
599599
self.test_indiv_edit.setObjectName("test_indiv_edit")
600600
self.gridLayout_4.addWidget(self.test_indiv_edit, 1, 3, 1, 1)
601601
self.verticalLayout_3.addWidget(self.groupBox_5)
602+
self.groupBox_12 = QtWidgets.QGroupBox(self.frame_3)
603+
self.groupBox_12.setObjectName("groupBox_12")
604+
self.gridLayout_8 = QtWidgets.QGridLayout(self.groupBox_12)
605+
self.gridLayout_8.setObjectName("gridLayout_8")
606+
self.test_preev_indiv_edit = QtWidgets.QLineEdit(self.groupBox_12)
607+
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
608+
sizePolicy.setHorizontalStretch(0)
609+
sizePolicy.setVerticalStretch(0)
610+
sizePolicy.setHeightForWidth(self.test_preev_indiv_edit.sizePolicy().hasHeightForWidth())
611+
self.test_preev_indiv_edit.setSizePolicy(sizePolicy)
612+
self.test_preev_indiv_edit.setObjectName("test_preev_indiv_edit")
613+
self.gridLayout_8.addWidget(self.test_preev_indiv_edit, 1, 1, 1, 1)
614+
self.label_15 = QtWidgets.QLabel(self.groupBox_12)
615+
self.label_15.setObjectName("label_15")
616+
self.gridLayout_8.addWidget(self.label_15, 1, 0, 1, 1)
617+
self.label_17 = QtWidgets.QLabel(self.groupBox_12)
618+
self.label_17.setObjectName("label_17")
619+
self.gridLayout_8.addWidget(self.label_17, 2, 0, 1, 1)
620+
self.test_preev_indiv_result = QtWidgets.QLabel(self.groupBox_12)
621+
self.test_preev_indiv_result.setFrameShape(QtWidgets.QFrame.Panel)
622+
self.test_preev_indiv_result.setFrameShadow(QtWidgets.QFrame.Raised)
623+
self.test_preev_indiv_result.setText("")
624+
self.test_preev_indiv_result.setAlignment(QtCore.Qt.AlignCenter)
625+
self.test_preev_indiv_result.setObjectName("test_preev_indiv_result")
626+
self.gridLayout_8.addWidget(self.test_preev_indiv_result, 2, 1, 1, 1)
627+
self.test_preev_indiv_button = QtWidgets.QPushButton(self.groupBox_12)
628+
self.test_preev_indiv_button.setObjectName("test_preev_indiv_button")
629+
self.gridLayout_8.addWidget(self.test_preev_indiv_button, 3, 1, 1, 1)
630+
self.verticalLayout_3.addWidget(self.groupBox_12)
602631
self.groupBox_6 = QtWidgets.QGroupBox(self.frame_3)
603-
self.groupBox_6.setFlat(True)
632+
self.groupBox_6.setFlat(False)
604633
self.groupBox_6.setObjectName("groupBox_6")
605634
self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBox_6)
606635
self.gridLayout_5.setObjectName("gridLayout_5")
@@ -828,7 +857,7 @@ def setupUi(self, ExperimentWindow):
828857
ExperimentWindow.setCentralWidget(self.centralWidget)
829858

830859
self.retranslateUi(ExperimentWindow)
831-
self.tabWidget.setCurrentIndex(1)
860+
self.tabWidget.setCurrentIndex(0)
832861
self.next_gen_button.clicked.connect(ExperimentWindow.on_next_gen_button_clicked)
833862
self.save_config_button.clicked.connect(ExperimentWindow.on_save_config_button_clicked)
834863
self.dimension_check.clicked.connect(ExperimentWindow.on_dimension_check_clicked)
@@ -861,6 +890,7 @@ def setupUi(self, ExperimentWindow):
861890
self.first_remove_indiv.clicked.connect(ExperimentWindow.on_first_remove_indiv_button_clicked)
862891
self.gen_cut_button.clicked.connect(ExperimentWindow.on_gen_cut_button_clicked)
863892
self.gen_start_over_button.clicked.connect(ExperimentWindow.on_gen_start_over_button_clicked)
893+
self.test_preev_indiv_button.clicked.connect(ExperimentWindow.on_test_preev_indiv_button_clicked)
864894
# QtCore.QMetaObject.connectSlotsByName(ExperimentWindow)
865895

866896
def retranslateUi(self, ExperimentWindow):
@@ -884,6 +914,10 @@ def retranslateUi(self, ExperimentWindow):
884914
self.test_button.setText(_translate("ExperimentWindow", "Test"))
885915
self.label.setText(_translate("ExperimentWindow", "Test Result:"))
886916
self.label_2.setText(_translate("ExperimentWindow", "Test Individual:"))
917+
self.groupBox_12.setTitle(_translate("ExperimentWindow", "Preevaluation"))
918+
self.label_15.setText(_translate("ExperimentWindow", "Test Individual:"))
919+
self.label_17.setText(_translate("ExperimentWindow", "Test Result:"))
920+
self.test_preev_indiv_button.setText(_translate("ExperimentWindow", "Test"))
887921
self.groupBox_6.setTitle(_translate("ExperimentWindow", "Experiment"))
888922
self.start_button.setText(_translate("ExperimentWindow", "Start Experiment"))
889923
self.label_5.setText(_translate("ExperimentWindow", "To Generation:"))

MLC/GUI/Autogenerated/mlc_qtcreator/experiment.ui

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<rect>
1010
<x>0</x>
1111
<y>0</y>
12-
<width>961</width>
13-
<height>568</height>
12+
<width>965</width>
13+
<height>615</height>
1414
</rect>
1515
</property>
1616
<property name="windowTitle">
@@ -274,13 +274,69 @@
274274
</layout>
275275
</widget>
276276
</item>
277+
<item>
278+
<widget class="QGroupBox" name="groupBox_12">
279+
<property name="title">
280+
<string>Preevaluation</string>
281+
</property>
282+
<layout class="QGridLayout" name="gridLayout_8">
283+
<item row="1" column="1">
284+
<widget class="QLineEdit" name="test_preev_indiv_edit">
285+
<property name="sizePolicy">
286+
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
287+
<horstretch>0</horstretch>
288+
<verstretch>0</verstretch>
289+
</sizepolicy>
290+
</property>
291+
</widget>
292+
</item>
293+
<item row="1" column="0">
294+
<widget class="QLabel" name="label_15">
295+
<property name="text">
296+
<string>Test Individual:</string>
297+
</property>
298+
</widget>
299+
</item>
300+
<item row="2" column="0">
301+
<widget class="QLabel" name="label_17">
302+
<property name="text">
303+
<string>Test Result:</string>
304+
</property>
305+
</widget>
306+
</item>
307+
<item row="2" column="1">
308+
<widget class="QLabel" name="test_preev_indiv_result">
309+
<property name="frameShape">
310+
<enum>QFrame::Panel</enum>
311+
</property>
312+
<property name="frameShadow">
313+
<enum>QFrame::Raised</enum>
314+
</property>
315+
<property name="text">
316+
<string/>
317+
</property>
318+
<property name="alignment">
319+
<set>Qt::AlignCenter</set>
320+
</property>
321+
</widget>
322+
</item>
323+
<item row="3" column="1">
324+
<widget class="QPushButton" name="test_preev_indiv_button">
325+
<property name="text">
326+
<string>Test</string>
327+
</property>
328+
</widget>
329+
</item>
330+
</layout>
331+
</widget>
332+
</item>
277333
<item>
278334
<widget class="QGroupBox" name="groupBox_6">
279335
<property name="title">
280336
<string>Experiment</string>
281337
</property>
282338
<property name="flat">
283-
<bool>true</bool>
339+
<bool>false</bool>
284340
</property>
285341
<layout class="QGridLayout" name="gridLayout_5">
286342
<item row="2" column="1">
@@ -1270,6 +1326,22 @@
12701326
</hint>
12711327
</hints>
12721328
</connection>
1329+
<connection>
1330+
<sender>test_preev_indiv_button</sender>
1331+
<signal>clicked()</signal>
1332+
<receiver>ExperimentWindow</receiver>
1333+
<slot>on_test_preev_indiv_button_clicked()</slot>
1334+
<hints>
1335+
<hint type="sourcelabel">
1336+
<x>860</x>
1337+
<y>359</y>
1338+
</hint>
1339+
<hint type="destinationlabel">
1340+
<x>482</x>
1341+
<y>304</y>
1342+
</hint>
1343+
</hints>
1344+
</connection>
12731345
</connections>
12741346
<slots>
12751347
<slot>on_closed_dialog()</slot>
@@ -1299,5 +1371,6 @@
12991371
<slot>on_first_add_indiv_from_textfile_button_clicked()</slot>
13001372
<slot>on_gen_cut_button_clicked()</slot>
13011373
<slot>on_gen_start_over_button_clicked()</slot>
1374+
<slot>on_test_preev_indiv_button_clicked()</slot>
13021375
</slots>
13031376
</ui>

MLC/GUI/Experiment/ExperimentWindow.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from MLC.Log.log import get_gui_logger
1010
from MLC.GUI.util import test_individual_value
11+
from MLC.GUI.util import check_if_indiv_pass_preevaluation
1112
from MLC.GUI.Autogenerated.autogenerated import Ui_ExperimentWindow
1213
from MLC.GUI.Experiment.ArduinoConfigManager.ArduinoBoardManager import ArduinoBoardManager
1314
from MLC.GUI.Experiment.ChartConfiguration import ChartConfiguration
@@ -203,7 +204,7 @@ def on_test_button_clicked(self):
203204
if test_indiv_edit.text() == "":
204205
logger.warn('[EXPERIMENT {0}] [TEST_BUTTON] - The individual value cannot be an empty string'
205206
.format(self._experiment_name))
206-
QMessageBox.information(self, "Test Individual",
207+
QMessageBox.information(self, "Test Evaluation Script",
207208
"The individual value cannot be an empty string.", QMessageBox.Ok)
208209
return
209210

@@ -217,6 +218,28 @@ def on_test_button_clicked(self):
217218
test_label_result = self._autogenerated_object.test_label_result
218219
test_label_result.setText(str(cost))
219220

221+
def on_test_preev_indiv_button_clicked(self):
222+
logger.debug('[EXPERIMENT {0}] [TEST_BUTTON] - Executing on_test_button_clicked function'
223+
.format(self._experiment_name))
224+
225+
test_indiv_edit = self._autogenerated_object.test_preev_indiv_edit
226+
if test_indiv_edit.text() == "":
227+
logger.warn('[EXPERIMENT {0}] [TEST_BUTTON] - The individual value cannot be an empty string'
228+
.format(self._experiment_name))
229+
QMessageBox.information(self, "Test Preevaluation Script",
230+
"The individual value cannot be an empty string.", QMessageBox.Ok)
231+
return
232+
233+
result = check_if_indiv_pass_preevaluation(parent=self,
234+
experiment_name=self._experiment_name,
235+
log_prefix="[EXPERIMENT_WINDOW]",
236+
indiv_value=test_indiv_edit.text(),
237+
config=Config.get_instance())
238+
239+
if result is not None:
240+
test_label_result = self._autogenerated_object.test_preev_indiv_result
241+
test_label_result.setText(str(result))
242+
220243
def on_log_check_clicked(self):
221244
logger.debug('[EXPERIMENT {0}] [LOG_CHECK_CLICKED] - Executing on_log_check_clicked function'
222245
.format(self._experiment_name))

MLC/GUI/util.py

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from MLC.Common.LispTreeExpr.LispTreeExpr import LispTreeExpr
22
from MLC.Common.LispTreeExpr.LispTreeExpr import ExprException
3+
from MLC.Common.PreevaluationManager import PreevaluationManager
34
from MLC.individual.Individual import Individual
45
from MLC.Log.log import get_gui_logger
56
from MLC.Population.Evaluation.EvaluatorFactory import EvaluatorFactory
@@ -49,7 +50,6 @@ def test_individual_value(parent, experiment_name, log_prefix, indiv_value, conf
4950
return None
5051

5152

52-
5353
def check_individual_value(parent, experiment_name, log_prefix, indiv_value, nodialog=False):
5454
try:
5555
"""
@@ -71,4 +71,41 @@ def check_individual_value(parent, experiment_name, log_prefix, indiv_value, nod
7171
"Error Msg: {2}"
7272
.format(log_prefix, experiment_name,
7373
err.message[err.message.find(']') + 2:]))
74-
return False
74+
return False
75+
76+
77+
def check_if_indiv_pass_preevaluation(parent, experiment_name, log_prefix, indiv_value, config):
78+
try:
79+
"""
80+
Evaluate an individual in order to check its correctness. Handle Exceptions
81+
"""
82+
LispTreeExpr.check_expression(indiv_value)
83+
individual = Individual.generate(config=config,
84+
rhs_value=indiv_value)
85+
callback = PreevaluationManager.get_callback()
86+
return callback.preev(individual)
87+
except ExprException, err:
88+
# Print the error message returned in the exception,
89+
# removing the prefix ([EXPR_EXCEPTION]])
90+
QMessageBox.critical(parent,
91+
"Invalid Individual",
92+
"Individual inserted is not well-formed. "
93+
"Error Msg: {0}"
94+
.format(err.message[err.message.find(']') + 2:]))
95+
logger.error("{0} Experiment {1} - "
96+
"Individual inserted is not well-formed. "
97+
"Error Msg: {2}"
98+
.format(log_prefix, experiment_name,
99+
err.message[err.message.find(']') + 2:]))
100+
except Exception, err:
101+
QMessageBox.critical(parent,
102+
"Invalid Evaluation Script",
103+
"Check the evaluation script to be correct. "
104+
"Error Msg: {0}.".format(err))
105+
logger.error("{0} Experiment {1} - "
106+
"Individual inserted is not a valid individual. "
107+
"Check the evaluation script to be correct. "
108+
"Error Msg: {2}."
109+
.format(log_prefix, experiment_name, err))
110+
111+
return None

0 commit comments

Comments
 (0)