Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import numpy as np
- from PyQt5.QtGui import QDoubleValidator, QIntValidator
- from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QGroupBox, QGridLayout, QPushButton, QListWidget, \
- QTextEdit, QLineEdit, QCheckBox, QDoubleSpinBox
- from PyQt5.QtCore import Qt
- import matplotlib.pyplot as plt
- import helpers
- import randomizer
- from func_c_calc import FunCCalc
- from mpl_toolkits.mplot3d import Axes3D # <--- This is important for 3d plotting, dont remove
- def func1(x, y):
- return x**2 + y**2
- class MainWindow(QMainWindow):
- def __init__(self, *args, **kwargs):
- super(MainWindow, self).__init__(*args, **kwargs)
- self.setWindowTitle("WYSZUKIWANIA RÓWNOWAŻNOŚCI ROZMYTYCH")
- ### Układ graficzny programu ###
- main_windowGroupBox = QGroupBox("Okno glowne")
- horizontalGroupBox = QGroupBox("Lista funkcji")
- verticalMenu = QGroupBox("Menu")
- logGroupBox = QGroupBox("Log")
- layoutLayout = QGridLayout()
- verticalMenuLayout = QGridLayout()
- main_windowGridLayout = QGridLayout()
- logGroupLayout = QGridLayout()
- main_windowGroupBox.setLayout(main_windowGridLayout)
- verticalMenu.setLayout(verticalMenuLayout)
- horizontalGroupBox.setLayout(layoutLayout)
- logGroupBox.setLayout(logGroupLayout)
- main_windowGridLayout.addWidget(horizontalGroupBox, 0,0)
- main_windowGridLayout.addWidget(logGroupBox, 1,0)
- #Ustawienie, ze w oknie głownym tylko 2 pierwsze kolumny maja sie rozciagać, a 3 (menu) ma być stałę.
- layoutLayout.setColumnStretch(0,1)
- layoutLayout.setColumnStretch(1,1)
- layoutLayout.addWidget(QLabel("Funkcje C"), 0, 0)
- self.list_c = QListWidget()
- layoutLayout.addWidget(self.list_c, 1, 0)
- layoutLayout.addWidget(QLabel("Funkcje I"), 0, 1)
- self.list_i = QListWidget()
- layoutLayout.addWidget(self.list_i, 1, 1)
- layoutLayout.addWidget(QLabel("Ustawienia"), 0, 2)
- layoutLayout.addWidget(verticalMenu,1, 2)
- verticalMenuLayout.addWidget(QLabel('Ilosc trójek do wylosowania:'), 1, 0)
- self.random_triples_value = QLineEdit('1000')
- self.random_triples_value.setValidator(QIntValidator(0, 1000000))
- verticalMenuLayout.addWidget(self.random_triples_value, 2, 0)
- verticalMenuLayout.addWidget(QLabel('Param. Lambda:'), 3, 0)
- self.param_lambda = QDoubleSpinBox()
- self.param_lambda.setMinimum(0)
- self.param_lambda.setMaximum(1)
- self.param_lambda.setSingleStep(0.10)
- self.param_lambda.setDecimals(5)
- # verticalMenuLayout.addWidget(self.param_lambda, 4, 0)
- # verticalMenuLayout.addWidget(QLabel('Błąd zaokrąglenia Ep:'
- # '\n(eg.2: 0,333==0,333 -> tak)'
- # '\n(eg.2: 0,333==0,334 -> może)'
- # '\n(eg.0: 0,333==0,334 -> nie)'), 5, 0)
- self.param_epsilon = QDoubleSpinBox()
- self.param_epsilon.setMinimum(0)
- self.param_epsilon.setMaximum(5)
- self.param_epsilon.setSingleStep(1)
- self.param_epsilon.setDecimals(0)
- verticalMenuLayout.addWidget(self.param_epsilon, 6, 0)
- #Dodajmy checkboxXYZ i reczne X Y Z
- self.checkbox_manual = QCheckBox("Własne X Y Z")
- verticalMenuLayout.addWidget(self.checkbox_manual, 7,0)
- self.checkbox_manual.stateChanged.connect(self.onChangeState_manual)
- self.X = QDoubleSpinBox()
- self.X.setMinimum(0)
- self.X.setMaximum(1)
- self.X.setSingleStep(0.10)
- self.X.setDecimals(5)
- self.X.setDisabled(1)
- self.Y = QDoubleSpinBox()
- self.Y.setMinimum(0)
- self.Y.setMaximum(1)
- self.Y.setSingleStep(0.10)
- self.Y.setDecimals(5)
- self.Y.setDisabled(1)
- self.Z = QDoubleSpinBox()
- self.Z.setMinimum(0)
- self.Z.setMaximum(1)
- self.Z.setSingleStep(0.10)
- self.Z.setDecimals(5)
- self.Z.setDisabled(1)
- verticalMenuLayout.addWidget(self.X, 8, 0)
- verticalMenuLayout.addWidget(self.Y, 9, 0)
- verticalMenuLayout.addWidget(self.Z, 10, 0)
- self.log_positives = QCheckBox('Pokazuj pozywytne odpowiedzi')
- verticalMenuLayout.addWidget(self.log_positives, 11, 0)
- self.log_negatives = QCheckBox('Pokazuj negatywne odpowiedzi')
- verticalMenuLayout.addWidget(self.log_negatives, 12, 0)
- self.plot_points = QCheckBox('Rysuj rozkład punktów')
- verticalMenuLayout.addWidget(self.plot_points, 13, 0)
- self.plot_function_i = QCheckBox('Rysuj funkcje I')
- verticalMenuLayout.addWidget(self.plot_function_i, 14, 0)
- self.plot_function_e = QCheckBox('Rysuj funkcje E')
- verticalMenuLayout.addWidget(self.plot_function_e, 15, 0)
- runBtn = QPushButton('Run')
- verticalMenuLayout.addWidget(runBtn, 16, 0)
- self.decisionLabel = QLabel("głosowanie")
- layoutLayout.addWidget(self.decisionLabel, 2, 2)
- verticalMenuLayout.setAlignment(Qt.AlignTop)
- # Ustawia self.onClick_run() funkcje do kliknięcia przycisku
- runBtn.clicked.connect(self.onClick_run)
- # Logger
- self.logger_edit = QTextEdit("X,Y,Z,response")
- logGroupLayout.addWidget(self.logger_edit,0,0)
- ### Pobiera nazwy funkcji C oraz I, następnie dodaje do podglądu ###
- list_of_funs = helpers.get_funs_names()
- list_of_funs_i = list_of_funs["i"]
- list_of_funs_c = list_of_funs["c"]
- for fun in list_of_funs_i:
- self.list_i.addItem(fun)
- for fun in list_of_funs_c:
- self.list_c.addItem(fun)
- self.list_i.setCurrentRow(self.list_i.count() - 1 ) # Zaznacza ostatnie
- self.list_c.setCurrentRow(self.list_i.count() - 1 ) # Zaznacza ostatnie
- self.setCentralWidget(main_windowGroupBox)
- def onChangeState_manual(self):
- if self.checkbox_manual.isChecked():
- self.X.setDisabled(0)
- self.Y.setDisabled(0)
- self.Z.setDisabled(0)
- self.random_triples_value.setDisabled(1)
- else:
- self.X.setDisabled(1)
- self.Y.setDisabled(1)
- self.Z.setDisabled(1)
- self.random_triples_value.setDisabled(0)
- def onClick_run(self):
- self.logger_edit.clear()
- # Losuje N wybranych trójek
- if self.checkbox_manual.isChecked():
- triples = [[float(self.X.text().replace(",", ".")),
- float(self.Y.text().replace(",", ".")),
- float(self.Z.text().replace(",", "."))]]
- else:
- triple_radomizer = randomizer.TripleRadomizer()
- proposed_triples_iterator = int(self.random_triples_value.text())
- triples = triple_radomizer.rand_N_tripless(proposed_triples_iterator)
- # final_decision = {"tak": 0, "może": 0, "nie": 0} # Stan poczatkowy zmiennej do głosowania
- final_decision = {"tak": 0, "nie": 0} # Stan poczatkowy zmiennej do głosowania
- # Oblicza I dla kazdej trojki
- self.function_E_XY = [] # E(X,Y)
- self.function_I_XY = [] # E(I,I)
- self.function_C_XY = [] # C(E,E)
- try:
- for [X,Y,Z] in triples:
- fun_C_calc = FunCCalc(X, Y, Z, self.list_i.currentItem().text())
- output_6_values = fun_C_calc.calc_6_method()
- # Dla 6 wynikow licze minima czyli funkcja E
- min_XY_YX = min(output_6_values["XY"], output_6_values["XY"])
- min_YZ_ZY = min(output_6_values["YZ"], output_6_values["ZY"])
- min_XZ_ZX = min(output_6_values["XZ"], output_6_values["ZX"])
- # Dodajemy te punkty do listy (w celu wyrysowania) E(X,Y)
- self.function_E_XY.append([X, Y, min_XY_YX])
- self.function_E_XY.append([Y, Z, min_YZ_ZY])
- self.function_E_XY.append([X, Z, min_XZ_ZX])
- # Dodajemy te punkty do listy (w celu wyrysowania) I(x,y)
- self.function_I_XY.append([X, Y, output_6_values["XY"]])
- self.function_I_XY.append([X, Z , output_6_values["XZ"]])
- self.function_I_XY.append([Z, Y, output_6_values["ZY"]])
- self.function_I_XY.append([Y, X , output_6_values["YX"]])
- self.function_I_XY.append([Z, X, output_6_values["ZX"]])
- self.function_I_XY.append([Y, Z, output_6_values["YZ"]])
- # Teraz C
- fun_c = helpers.fun_c_by_name(self.list_c.currentItem().text()) # pobieramy funkcje C za pomocą nazwy
- lmbd = float(self.param_lambda.text().replace(",", ".")) # pobieramy labmde z okna głownego
- self.function_C_XY.append([X, Y, fun_c(min_XY_YX, min_YZ_ZY, lmbd)])
- if fun_c(min_XY_YX, min_YZ_ZY, lmbd) <= min_XZ_ZX: # Warunek dla wybranego C z bilbioteki
- final_decision["tak"] = int(final_decision["tak"]) + 1
- if self.log_positives.isChecked():
- self.logger_edit.append(str(X) + "," + str(Y) + ","+str(Z) + "," + "true")
- else:
- final_decision["nie"] = int(final_decision["nie"]) + 1
- if self.log_negatives.isChecked():
- self.logger_edit.append(str(X) + "," + str(Y) + ","+str(Z) + "," + "false")
- self.decisionLabel.setText(final_decision.__str__())
- # Rysujemy
- # if int(final_decision["tak"]) == len(triples) and self.plot_points.isChecked(): # Old
- if self.plot_points.isChecked():
- print("plot1")
- fig1 = plt.figure("Chmura punktow")
- ax = plt.axes(projection='3d')
- triples = np.array(triples).T.tolist() # Obracamy liste trójek
- xline = triples[0]
- yline = triples[1]
- zline = triples[2]
- ax.set_xlabel('X ')
- ax.set_ylabel('Y ')
- ax.set_zlabel('Z ')
- ax.set_xlim([0, 1])
- ax.set_ylim([0, 1])
- ax.set_zlim([0, 1])
- ax.scatter3D(xs=xline, ys=yline, zs=zline, cmap='Greens')
- if self.plot_function_i.isChecked():
- print("plot2")
- fig2 = plt.figure("Funkcja I")
- ax = plt.axes(projection='3d')
- triples_i = np.array(self.function_I_XY).T.tolist() # Obracamy liste trójek
- xline = triples_i[0]
- yline = triples_i[1]
- zline = triples_i[2]
- ax.set_xlabel('X ')
- ax.set_ylabel('Y ')
- ax.set_zlabel('Z ')
- ax.set_xlim([0, 1])
- ax.set_ylim([0, 1])
- ax.set_zlim([0, 1])
- ax.plot_trisurf(xline, yline, zline)
- if self.plot_function_e.isChecked():
- print("plot3")
- fig2 = plt.figure("Funkcja E")
- ax = plt.axes(projection='3d')
- triples_e = np.array(self.function_E_XY).T.tolist() # Obracamy liste trójek
- print(triples_e)
- xline = triples_e[0]
- yline = triples_e[1]
- zline = triples_e[2]
- ax.set_xlabel('X ')
- ax.set_ylabel('Y ')
- ax.set_zlabel('Z ')
- ax.set_xlim([0, 1])
- ax.set_ylim([0, 1])
- ax.set_zlim([0, 1])
- plt.title("FunC: "+ self.list_c.currentItem().text()+ "\nFunI: "+ self.list_i.currentItem().text())
- ax.plot_trisurf(xline, yline, zline)
- plt.show()
- except Exception as e:
- print(e)
- app = QApplication(sys.argv)
- window = MainWindow()
- window.show()
- app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement