metavis.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include "pch.h"
  2. #include "metavis.h"
  3. #include "SettingDialog.h"
  4. #include <QStandardPaths>
  5. #include <QDockwidget>
  6. #include <QLabel>
  7. #include <QLayout>
  8. #include <QDebug>
  9. #include <QStyleFactory>
  10. #include <QtWebChannel/QtWebChannel>
  11. #include <QtWebEngineWidgets/QWebEngineView>
  12. #include <QFileDialog>
  13. #include <QDir>
  14. #include <map>
  15. #include <boost/multiprecision/cpp_int.hpp>
  16. #include <QDesktopWidget>
  17. #include <QSlider>
  18. #include <QSizePolicy>
  19. #include "DockableGraphView.h"
  20. #include "ProjectManager.h"
  21. #include "RangeSlider.h"
  22. #include "tsneIteractive.h"
  23. #include "util.h"
  24. metavis::metavis(QWidget* parent)
  25. : QMainWindow(parent), actualBestAverageGraph(createCustomWidget("Best vs Avg")), actualParticleGraph(createCustomWidget("Particle", true)), actualMinMaxGraph(createCustomWidget("MinMaxGraph", true)), actualMeanHmmingDistanceGraph(createCustomWidget("MeanHammingDistance", true)),
  26. multiBestGraph(createCustomWidget("All Runs: Best")), multiAvgGraph(createCustomWidget("All Runs: Avg", true)), multiMinGraph(createCustomWidget("All Runs: Min", true)), multiMaxGraph(createCustomWidget("All Runs: Max", true)), multiMeanHammingDistanceGraph(createCustomWidget("All Runs: Mean Hamming Distance", true))
  27. {
  28. ui.setupUi(this);
  29. /* create settings object*/
  30. settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, "TK", "metavis", this);
  31. setStyleSheet(styleSheet() + "QMainWindow::separator {background: rgb(200, 200, 200);width: 1px;height: 1px;}");
  32. setStyleSheet(styleSheet() + "QTabBar::tab:selected {color: rgb(0, 122, 204);}");
  33. setStyleSheet(styleSheet() + "QTabWidget::pane {border-top: 0px solid #C2C7CB;margin: -9px -9px -13px -9px;}");
  34. readMainWindowSettings();
  35. createBitField();
  36. createProjectManager();
  37. createTSNE();
  38. }
  39. void metavis::openSetting() {
  40. SettingDialog settingDialog(settings, this);
  41. /* Blocking operation */
  42. settingDialog.exec();
  43. }
  44. metavis::~metavis()
  45. {
  46. writeActualMainWindowSettings();
  47. }
  48. GraphView* metavis::createCustomWidget(QString titleString, bool tabToLast)
  49. {
  50. DockableGraphView* dock = new DockableGraphView(this, titleString);
  51. qDebug() << titleString;
  52. if (tabToLast && lastDocked) {
  53. tabifyDockWidget(lastDocked, dock);
  54. }
  55. else {
  56. addDockWidget(Qt::LeftDockWidgetArea, dock);
  57. lastDocked = dock;
  58. }
  59. return dock->view;
  60. }
  61. void metavis::createBitField()
  62. {
  63. bitField = new GraphView(this, Bound(-0.1, 1.1, 0.0, 1601.0));
  64. bitField->setUseFixedBound(true);
  65. bitField->setMinimumSize(200, 200);
  66. bitField->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  67. bitField->maxIter = -2;
  68. bitField->useInterval = true;
  69. //this->setCentralWidget(bitField);
  70. QVBoxLayout* layout = new QVBoxLayout;
  71. layout->addWidget(bitField);
  72. RangeSlider* rangeSlider = new RangeSlider(this);
  73. rangeSlider->setMinimumSize(100, 50);
  74. rangeSlider->setMinRange(-2);
  75. rangeSlider->setMaxRange(100);
  76. connect(rangeSlider, &RangeSlider::maxChanged,
  77. bitField, &GraphView::setMaxIter);
  78. connect(rangeSlider, &RangeSlider::minChanged,
  79. bitField, &GraphView::setMinIter);
  80. rangeSlider->setMinSliderValue(-2);
  81. rangeSlider->setMaxSliderValue(100);
  82. layout->addWidget(rangeSlider);
  83. ui.BitFieldWidget->setLayout(layout);
  84. }
  85. void metavis::createProjectManager()
  86. {
  87. QDockWidget* dockWidget = new QDockWidget(this);
  88. ProjectManager* manager = new ProjectManager(this, this);
  89. dockWidget->setWindowTitle("Project Manager");
  90. dockWidget->setWidget(manager);
  91. addDockWidget(Qt::RightDockWidgetArea, dockWidget);
  92. }
  93. void metavis::createTSNE()
  94. {
  95. tsneIteractive* window = new tsneIteractive(ui.tabWidget);
  96. ui.tabWidget->addTab(window, "tSNE");
  97. }
  98. void metavis::writeActualMainWindowSettings()
  99. {
  100. settings->beginGroup("MainWindow");
  101. settings->setValue("maximized", isMaximized());
  102. if (!isMaximized()) {
  103. /* position and size of the window if not maximized */
  104. settings->setValue("pos", pos());
  105. settings->setValue("size", size());
  106. settings->setValue("screenCount", QApplication::desktop()->screenCount());
  107. }
  108. settings->endGroup();
  109. }
  110. void metavis::readMainWindowSettings()
  111. {
  112. settings->beginGroup("MainWindow");
  113. if (QApplication::desktop()->screenCount() == settings->value("screenCount", 1)) {
  114. //Only when same screeenCount move the window;
  115. move(settings->value("pos", QPoint(200, 200)).toPoint());
  116. }
  117. resize(settings->value("size", QSize(600, 400)).toSize());
  118. if (settings->value("maximized", false).toBool()) {
  119. showMaximized();
  120. }
  121. settings->endGroup();
  122. }
  123. QColor metavis::interpolate(QColor& first, QColor& second, double alpha)
  124. {
  125. double firstH, firstS, firstL;
  126. double secondH, secondS, secondL;
  127. first.getHslF(&firstH, &firstS, &firstL);
  128. second.getHslF(&secondH, &secondS, &secondL);
  129. const double h = util::linearInterpolate(firstH, secondH, alpha);
  130. const double s = util::linearInterpolate(firstS, secondS, alpha);
  131. const double l = util::linearInterpolate(firstL, secondL, alpha);
  132. return QColor::fromHslF(h,s,l);
  133. }
  134. void metavis::updateBitFieldColors()
  135. {
  136. QColor best(64, 186, 37);
  137. QColor worst(255, 19, 71);
  138. double bestValue = 32;
  139. double worstValue = 46;
  140. for (GraphDataPoint& data : runList.back().dotsForBitField) {
  141. data.color = interpolate(best, worst, std::clamp(util::inverseLinearInterpolation(bestValue, worstValue, data.orginalPoint->objectiveFunction), 0.0, 1.0));
  142. }
  143. }
  144. void metavis::openFile()
  145. {
  146. qDebug() << "openFile";
  147. QStringList pathList = QFileDialog::getOpenFileNames(this, "Open LogFile", QStandardPaths::displayName(QStandardPaths::DesktopLocation), "Metavis Logfile (*.metalog)");
  148. if (pathList.isEmpty()) {
  149. qDebug() << "No file selected";
  150. return;
  151. }
  152. //int oldIndex = runVec.size();
  153. int size = runList.size();
  154. for (int i = 0; i < pathList.size(); i++) {
  155. qDebug() << "file:" << pathList[i];
  156. runList.push_back(RunData(pathList[i].toStdString()));
  157. }
  158. for (std::list<RunData>::iterator iter = std::next(runList.begin(), size); iter != runList.end(); iter++) {
  159. QColor runColor = multiBestGraph->generateNextColorForGraph();
  160. multiBestGraph->addLine(&iter->bestSolutionPerIteration, &*iter, runColor);
  161. multiAvgGraph->addLine(&iter->averageSolutionPerItertion, &*iter, runColor);
  162. multiMaxGraph->addLine(&iter->maxSolutionPerItertion, &*iter, runColor);
  163. multiMinGraph->addLine(&iter->minSolutionPerItertion, &*iter, runColor);
  164. multiMeanHammingDistanceGraph->addLine(&iter->meanHammingDistancePerIteration, &*iter, runColor);
  165. }
  166. /*
  167. for (int i = 0; i < runList.size(); i++) {
  168. QColor runColor = multiBestGraph->generateNextColorForGraph();
  169. multiBestGraph->addLine(&runList[i].bestSolutionPerIteration, &runList[i], runColor);
  170. multiAvgGraph->addLine(&runList[i].averageSolutionPerItertion, &runList[i], runColor);
  171. multiMaxGraph->addLine(&runList[i].maxSolutionPerItertion, &runList[i], runColor);
  172. multiMinGraph->addLine(&runList[i].minSolutionPerItertion, &runList[i], runColor);
  173. //multiMeanHammingDistanceGraph->addLine(&runVec[i].meanHammingDistancePerIteration, &runVec[i], runColor);
  174. }*/
  175. /*std::vector<RunData>::iterator end = runVec.end();
  176. for (int i = 0; i < pathList.size(); i++) {
  177. qDebug() << "file:" << pathList[i];
  178. runVec.push_back(RunData(pathList[i].toStdString()));
  179. }
  180. for (std::vector<RunData>::iterator iter = end; iter != runVec.end(); iter++) {
  181. QColor runColor = multiBestGraph->generateNextColorForGraph();
  182. multiBestGraph->addLine(&iter->bestSolutionPerIteration, &*iter, runColor);
  183. multiAvgGraph->addLine(&iter->averageSolutionPerItertion, &*iter, runColor);
  184. multiMaxGraph->addLine(&iter->maxSolutionPerItertion, &*iter, runColor);
  185. multiMinGraph->addLine(&iter->minSolutionPerItertion, &*iter, runColor);
  186. multiMeanHammingDistanceGraph->addLine(&iter->meanHammingDistancePerIteration, &*iter, runColor);
  187. }*/
  188. //actualBestAverageGraph->addLine(runVec[0].bestSolutionPerIteration, QColor(255, 0, 0));
  189. //actualBestAverageGraph->addLine(runVec[0].averageSolutionPerItertion, QColor(0, 0, 255));
  190. //actualMinMaxGraph->addLine(runVec[0].minSolutionPerItertion, QColor(255, 0, 0));
  191. //actualMinMaxGraph->addLine(runVec[0].maxSolutionPerItertion, QColor(0, 0, 255));
  192. //actualMinMaxGraph->addDots(runVec[0].dotsForDistribution, QColor(255, 165, 0, 100));
  193. //for (auto iter = runVec[0].particleMap.begin(); iter != runVec[0].particleMap.end(); iter++) {
  194. // actualParticleGraph->addLine(iter->second);
  195. //}
  196. ////Test
  197. bitField->addDots(&runList.back().dotsForBitField, &runList.front(), QColor(255, 165, 0, 100));
  198. updateBitFieldColors();
  199. bitField->graphSeriesVec.back().useDataPointColor = true;
  200. //actualMeanHmmingDistanceGraph->addLine(runVec[0].meanHammingDistancePerIteration, QColor(255, 0, 0));
  201. }