Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.95 KB | None | 0 0
  1. import sys
  2.  
  3. import numpy as np
  4. from PyQt5.QtGui import QDoubleValidator, QIntValidator
  5. from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow, QGroupBox, QGridLayout, QPushButton, QListWidget, \
  6. QTextEdit, QLineEdit, QCheckBox, QDoubleSpinBox
  7. from PyQt5.QtCore import Qt
  8. import matplotlib.pyplot as plt
  9. import helpers
  10. import randomizer
  11. from func_c_calc import FunCCalc
  12. from mpl_toolkits.mplot3d import Axes3D # <--- This is important for 3d plotting, dont remove
  13.  
  14.  
  15. def func1(x, y):
  16. return x**2 + y**2
  17.  
  18.  
  19. class MainWindow(QMainWindow):
  20. def __init__(self, *args, **kwargs):
  21. super(MainWindow, self).__init__(*args, **kwargs)
  22. self.setWindowTitle("WYSZUKIWANIA RÓWNOWAŻNOŚCI ROZMYTYCH")
  23.  
  24.  
  25.  
  26. ### Układ graficzny programu ###
  27. main_windowGroupBox = QGroupBox("Okno glowne")
  28. horizontalGroupBox = QGroupBox("Lista funkcji")
  29. verticalMenu = QGroupBox("Menu")
  30. logGroupBox = QGroupBox("Log")
  31.  
  32. layoutLayout = QGridLayout()
  33. verticalMenuLayout = QGridLayout()
  34. main_windowGridLayout = QGridLayout()
  35. logGroupLayout = QGridLayout()
  36.  
  37. main_windowGroupBox.setLayout(main_windowGridLayout)
  38. verticalMenu.setLayout(verticalMenuLayout)
  39. horizontalGroupBox.setLayout(layoutLayout)
  40. logGroupBox.setLayout(logGroupLayout)
  41.  
  42. main_windowGridLayout.addWidget(horizontalGroupBox, 0,0)
  43. main_windowGridLayout.addWidget(logGroupBox, 1,0)
  44.  
  45. #Ustawienie, ze w oknie głownym tylko 2 pierwsze kolumny maja sie rozciagać, a 3 (menu) ma być stałę.
  46. layoutLayout.setColumnStretch(0,1)
  47. layoutLayout.setColumnStretch(1,1)
  48.  
  49. layoutLayout.addWidget(QLabel("Funkcje C"), 0, 0)
  50. self.list_c = QListWidget()
  51. layoutLayout.addWidget(self.list_c, 1, 0)
  52.  
  53. layoutLayout.addWidget(QLabel("Funkcje I"), 0, 1)
  54. self.list_i = QListWidget()
  55. layoutLayout.addWidget(self.list_i, 1, 1)
  56.  
  57. layoutLayout.addWidget(QLabel("Ustawienia"), 0, 2)
  58. layoutLayout.addWidget(verticalMenu,1, 2)
  59. verticalMenuLayout.addWidget(QLabel('Ilosc trójek do wylosowania:'), 1, 0)
  60. self.random_triples_value = QLineEdit('1000')
  61. self.random_triples_value.setValidator(QIntValidator(0, 1000000))
  62. verticalMenuLayout.addWidget(self.random_triples_value, 2, 0)
  63. verticalMenuLayout.addWidget(QLabel('Param. Lambda:'), 3, 0)
  64. self.param_lambda = QDoubleSpinBox()
  65. self.param_lambda.setMinimum(0)
  66. self.param_lambda.setMaximum(1)
  67. self.param_lambda.setSingleStep(0.10)
  68. self.param_lambda.setDecimals(5)
  69. # verticalMenuLayout.addWidget(self.param_lambda, 4, 0)
  70.  
  71. # verticalMenuLayout.addWidget(QLabel('Błąd zaokrąglenia Ep:'
  72. # '\n(eg.2: 0,333==0,333 -> tak)'
  73. # '\n(eg.2: 0,333==0,334 -> może)'
  74. # '\n(eg.0: 0,333==0,334 -> nie)'), 5, 0)
  75. self.param_epsilon = QDoubleSpinBox()
  76. self.param_epsilon.setMinimum(0)
  77. self.param_epsilon.setMaximum(5)
  78. self.param_epsilon.setSingleStep(1)
  79. self.param_epsilon.setDecimals(0)
  80. verticalMenuLayout.addWidget(self.param_epsilon, 6, 0)
  81.  
  82.  
  83. #Dodajmy checkboxXYZ i reczne X Y Z
  84. self.checkbox_manual = QCheckBox("Własne X Y Z")
  85. verticalMenuLayout.addWidget(self.checkbox_manual, 7,0)
  86. self.checkbox_manual.stateChanged.connect(self.onChangeState_manual)
  87.  
  88. self.X = QDoubleSpinBox()
  89. self.X.setMinimum(0)
  90. self.X.setMaximum(1)
  91. self.X.setSingleStep(0.10)
  92. self.X.setDecimals(5)
  93. self.X.setDisabled(1)
  94.  
  95. self.Y = QDoubleSpinBox()
  96. self.Y.setMinimum(0)
  97. self.Y.setMaximum(1)
  98. self.Y.setSingleStep(0.10)
  99. self.Y.setDecimals(5)
  100. self.Y.setDisabled(1)
  101.  
  102. self.Z = QDoubleSpinBox()
  103. self.Z.setMinimum(0)
  104. self.Z.setMaximum(1)
  105. self.Z.setSingleStep(0.10)
  106. self.Z.setDecimals(5)
  107. self.Z.setDisabled(1)
  108.  
  109. verticalMenuLayout.addWidget(self.X, 8, 0)
  110. verticalMenuLayout.addWidget(self.Y, 9, 0)
  111. verticalMenuLayout.addWidget(self.Z, 10, 0)
  112.  
  113. self.log_positives = QCheckBox('Pokazuj pozywytne odpowiedzi')
  114. verticalMenuLayout.addWidget(self.log_positives, 11, 0)
  115.  
  116. self.log_negatives = QCheckBox('Pokazuj negatywne odpowiedzi')
  117. verticalMenuLayout.addWidget(self.log_negatives, 12, 0)
  118.  
  119. self.plot_points = QCheckBox('Rysuj rozkład punktów')
  120. verticalMenuLayout.addWidget(self.plot_points, 13, 0)
  121.  
  122. self.plot_function_i = QCheckBox('Rysuj funkcje I')
  123. verticalMenuLayout.addWidget(self.plot_function_i, 14, 0)
  124.  
  125. self.plot_function_e = QCheckBox('Rysuj funkcje E')
  126. verticalMenuLayout.addWidget(self.plot_function_e, 15, 0)
  127.  
  128. runBtn = QPushButton('Run')
  129. verticalMenuLayout.addWidget(runBtn, 16, 0)
  130.  
  131.  
  132. self.decisionLabel = QLabel("głosowanie")
  133. layoutLayout.addWidget(self.decisionLabel, 2, 2)
  134.  
  135. verticalMenuLayout.setAlignment(Qt.AlignTop)
  136.  
  137. # Ustawia self.onClick_run() funkcje do kliknięcia przycisku
  138. runBtn.clicked.connect(self.onClick_run)
  139.  
  140. # Logger
  141. self.logger_edit = QTextEdit("X,Y,Z,response")
  142. logGroupLayout.addWidget(self.logger_edit,0,0)
  143.  
  144.  
  145. ### Pobiera nazwy funkcji C oraz I, następnie dodaje do podglądu ###
  146. list_of_funs = helpers.get_funs_names()
  147. list_of_funs_i = list_of_funs["i"]
  148. list_of_funs_c = list_of_funs["c"]
  149. for fun in list_of_funs_i:
  150. self.list_i.addItem(fun)
  151. for fun in list_of_funs_c:
  152. self.list_c.addItem(fun)
  153. self.list_i.setCurrentRow(self.list_i.count() - 1 ) # Zaznacza ostatnie
  154. self.list_c.setCurrentRow(self.list_i.count() - 1 ) # Zaznacza ostatnie
  155.  
  156. self.setCentralWidget(main_windowGroupBox)
  157.  
  158.  
  159. def onChangeState_manual(self):
  160. if self.checkbox_manual.isChecked():
  161. self.X.setDisabled(0)
  162. self.Y.setDisabled(0)
  163. self.Z.setDisabled(0)
  164. self.random_triples_value.setDisabled(1)
  165. else:
  166. self.X.setDisabled(1)
  167. self.Y.setDisabled(1)
  168. self.Z.setDisabled(1)
  169. self.random_triples_value.setDisabled(0)
  170.  
  171.  
  172. def onClick_run(self):
  173. self.logger_edit.clear()
  174.  
  175. # Losuje N wybranych trójek
  176. if self.checkbox_manual.isChecked():
  177. triples = [[float(self.X.text().replace(",", ".")),
  178. float(self.Y.text().replace(",", ".")),
  179. float(self.Z.text().replace(",", "."))]]
  180. else:
  181. triple_radomizer = randomizer.TripleRadomizer()
  182. proposed_triples_iterator = int(self.random_triples_value.text())
  183. triples = triple_radomizer.rand_N_tripless(proposed_triples_iterator)
  184.  
  185. # final_decision = {"tak": 0, "może": 0, "nie": 0} # Stan poczatkowy zmiennej do głosowania
  186. final_decision = {"tak": 0, "nie": 0} # Stan poczatkowy zmiennej do głosowania
  187.  
  188. # Oblicza I dla kazdej trojki
  189. self.function_E_XY = [] # E(X,Y)
  190. self.function_I_XY = [] # E(I,I)
  191. self.function_C_XY = [] # C(E,E)
  192. try:
  193. for [X,Y,Z] in triples:
  194. fun_C_calc = FunCCalc(X, Y, Z, self.list_i.currentItem().text())
  195. output_6_values = fun_C_calc.calc_6_method()
  196.  
  197. # Dla 6 wynikow licze minima czyli funkcja E
  198. min_XY_YX = min(output_6_values["XY"], output_6_values["XY"])
  199. min_YZ_ZY = min(output_6_values["YZ"], output_6_values["ZY"])
  200. min_XZ_ZX = min(output_6_values["XZ"], output_6_values["ZX"])
  201.  
  202. # Dodajemy te punkty do listy (w celu wyrysowania) E(X,Y)
  203. self.function_E_XY.append([X, Y, min_XY_YX])
  204. self.function_E_XY.append([Y, Z, min_YZ_ZY])
  205. self.function_E_XY.append([X, Z, min_XZ_ZX])
  206.  
  207. # Dodajemy te punkty do listy (w celu wyrysowania) I(x,y)
  208. self.function_I_XY.append([X, Y, output_6_values["XY"]])
  209. self.function_I_XY.append([X, Z , output_6_values["XZ"]])
  210. self.function_I_XY.append([Z, Y, output_6_values["ZY"]])
  211. self.function_I_XY.append([Y, X , output_6_values["YX"]])
  212. self.function_I_XY.append([Z, X, output_6_values["ZX"]])
  213. self.function_I_XY.append([Y, Z, output_6_values["YZ"]])
  214.  
  215. # Teraz C
  216. fun_c = helpers.fun_c_by_name(self.list_c.currentItem().text()) # pobieramy funkcje C za pomocą nazwy
  217. lmbd = float(self.param_lambda.text().replace(",", ".")) # pobieramy labmde z okna głownego
  218. self.function_C_XY.append([X, Y, fun_c(min_XY_YX, min_YZ_ZY, lmbd)])
  219.  
  220. if fun_c(min_XY_YX, min_YZ_ZY, lmbd) <= min_XZ_ZX: # Warunek dla wybranego C z bilbioteki
  221. final_decision["tak"] = int(final_decision["tak"]) + 1
  222. if self.log_positives.isChecked():
  223. self.logger_edit.append(str(X) + "," + str(Y) + ","+str(Z) + "," + "true")
  224.  
  225. else:
  226. final_decision["nie"] = int(final_decision["nie"]) + 1
  227. if self.log_negatives.isChecked():
  228. self.logger_edit.append(str(X) + "," + str(Y) + ","+str(Z) + "," + "false")
  229.  
  230. self.decisionLabel.setText(final_decision.__str__())
  231.  
  232. # Rysujemy
  233. # if int(final_decision["tak"]) == len(triples) and self.plot_points.isChecked(): # Old
  234. if self.plot_points.isChecked():
  235. print("plot1")
  236. fig1 = plt.figure("Chmura punktow")
  237. ax = plt.axes(projection='3d')
  238. triples = np.array(triples).T.tolist() # Obracamy liste trójek
  239. xline = triples[0]
  240. yline = triples[1]
  241. zline = triples[2]
  242. ax.set_xlabel('X ')
  243. ax.set_ylabel('Y ')
  244. ax.set_zlabel('Z ')
  245. ax.set_xlim([0, 1])
  246. ax.set_ylim([0, 1])
  247. ax.set_zlim([0, 1])
  248. ax.scatter3D(xs=xline, ys=yline, zs=zline, cmap='Greens')
  249.  
  250. if self.plot_function_i.isChecked():
  251. print("plot2")
  252. fig2 = plt.figure("Funkcja I")
  253. ax = plt.axes(projection='3d')
  254. triples_i = np.array(self.function_I_XY).T.tolist() # Obracamy liste trójek
  255. xline = triples_i[0]
  256. yline = triples_i[1]
  257. zline = triples_i[2]
  258. ax.set_xlabel('X ')
  259. ax.set_ylabel('Y ')
  260. ax.set_zlabel('Z ')
  261. ax.set_xlim([0, 1])
  262. ax.set_ylim([0, 1])
  263. ax.set_zlim([0, 1])
  264. ax.plot_trisurf(xline, yline, zline)
  265.  
  266.  
  267. if self.plot_function_e.isChecked():
  268. print("plot3")
  269. fig2 = plt.figure("Funkcja E")
  270. ax = plt.axes(projection='3d')
  271. triples_e = np.array(self.function_E_XY).T.tolist() # Obracamy liste trójek
  272. print(triples_e)
  273. xline = triples_e[0]
  274. yline = triples_e[1]
  275. zline = triples_e[2]
  276. ax.set_xlabel('X ')
  277. ax.set_ylabel('Y ')
  278. ax.set_zlabel('Z ')
  279. ax.set_xlim([0, 1])
  280. ax.set_ylim([0, 1])
  281. ax.set_zlim([0, 1])
  282. plt.title("FunC: "+ self.list_c.currentItem().text()+ "\nFunI: "+ self.list_i.currentItem().text())
  283. ax.plot_trisurf(xline, yline, zline)
  284.  
  285. plt.show()
  286. except Exception as e:
  287. print(e)
  288.  
  289.  
  290.  
  291. app = QApplication(sys.argv)
  292.  
  293. window = MainWindow()
  294. window.show()
  295.  
  296. app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement