TsneControlPanel.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "pch.h"
  2. #include "TsneControlPanel.h"
  3. #include <QPushButton>
  4. #include <QProgressBar>
  5. #include <QGridLayout>
  6. #include <QSpacerItem>
  7. #include <QLineEdit>
  8. #include <QSlider>
  9. TsneControlPanel::TsneControlPanel(QWidget *parent)
  10. : QWidget(parent)
  11. {
  12. plott->setVisibleWindow(-20, 20, -20, 20);
  13. QVBoxLayout* layout = new QVBoxLayout(this);
  14. layout->setContentsMargins(0, 0, 0, 0);
  15. QHBoxLayout* buttonLayout = new QHBoxLayout();
  16. buttonLayout->setContentsMargins(0, 0, 0, 0);
  17. layout->addWidget(plott);
  18. layout->addLayout(buttonLayout);
  19. //ButtonPanel
  20. showOptionsButton = new QPushButton("Hide Options");
  21. connect(showOptionsButton, &QPushButton::pressed, this, &TsneControlPanel::toggleOptions);
  22. QPushButton* startButton = new QPushButton("Start");
  23. connect(startButton, &QPushButton::pressed, this, &TsneControlPanel::start);
  24. QPushButton* pauseButton = new QPushButton("Pause");
  25. connect(pauseButton, &QPushButton::pressed, this, &TsneControlPanel::pause);
  26. iterationLabel->setText("Iteration: 0");
  27. progressBar->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Preferred);
  28. progressBar->setAlignment(Qt::AlignCenter);
  29. progressBar->setValue(0);
  30. progressBar->setMaximum(tsneSettings->maxIter - 1);
  31. buttonLayout->addWidget(startButton);
  32. buttonLayout->addWidget(pauseButton);
  33. buttonLayout->addWidget(iterationLabel);
  34. buttonLayout->addWidget(progressBar);
  35. buttonLayout->addWidget(showOptionsButton);
  36. layout->addWidget(tsneSettings);
  37. layout->addWidget(slider);
  38. //Slider
  39. slider->setTitle("Iteration:");
  40. connect(slider, &RangeSlider::maxChanged, plott, &TsnePlott::setMaximumIterationToDispaly);
  41. connect(slider, &RangeSlider::minChanged, plott, &TsnePlott::setMinimumIterationToDispaly);
  42. //Gradient
  43. layout->addWidget(gradient);
  44. connect(gradient, &ColorGradient::gradientChanged, this, [this]() {this->plott->updateColors(*gradient); });
  45. //Settings
  46. QSettings settings("settings.ini", QSettings::IniFormat, this);
  47. settings.beginGroup("Tsne");
  48. if (settings.value("hideOptions", true).toBool()) {
  49. toggleOptions();
  50. }
  51. settings.endGroup();
  52. }
  53. TsneControlPanel::~TsneControlPanel()
  54. {
  55. //Settings
  56. QSettings settings("settings.ini", QSettings::IniFormat, this);
  57. settings.beginGroup("Tsne");
  58. settings.setValue("hideOptions", this->isOptionHidden);
  59. settings.endGroup();
  60. }
  61. void TsneControlPanel::assignData(std::vector<SolutionPointData>::iterator begin, std::vector<SolutionPointData>::iterator end, QString runName)
  62. {
  63. this->begin = begin;
  64. this->end = end;
  65. runName = runName;
  66. plott->setDisplayLabel(runName);
  67. resetPanel();
  68. plott->clear();
  69. }
  70. void TsneControlPanel::clear()
  71. {
  72. begin = std::vector<SolutionPointData>::iterator();
  73. end = std::vector<SolutionPointData>::iterator();
  74. runName = "";
  75. resetPanel();
  76. plott->clear();
  77. }
  78. void TsneControlPanel::toggleOptions()
  79. {
  80. this->isOptionHidden = !this->isOptionHidden;
  81. showOptionsButton->setText(this->isOptionHidden ? "More Options" : "Hide Options");
  82. this->slider->setHidden(this->isOptionHidden);
  83. this->gradient->setHidden(this->isOptionHidden);
  84. this->tsneSettings->setHidden(this->isOptionHidden);
  85. }
  86. void TsneControlPanel::resetPanel()
  87. {
  88. if (algo != nullptr) {
  89. delete algo;
  90. algo = nullptr;
  91. }
  92. iterationChanged(0);
  93. }
  94. void TsneControlPanel::pause()
  95. {
  96. if (algo != nullptr) {
  97. algo->pause();
  98. }
  99. }
  100. void TsneControlPanel::iterationChanged(int iter)
  101. {
  102. iterationLabel->setText("Iteration: " + QString::number(iter));
  103. plott->update();
  104. progressBar->setValue(iter);
  105. }
  106. void TsneControlPanel::start()
  107. {
  108. qDebug() << "start";
  109. if (begin == end) {
  110. qDebug() << "NoData";
  111. return;
  112. }
  113. double* matrixY = nullptr;
  114. double** matrixYPtr = &matrixY;
  115. resetPanel();
  116. algo = new tSneAlgo(begin, end, matrixYPtr, tsneSettings->perplexity, tsneSettings->learnrate, tsneSettings->maxIter);
  117. connect(algo, &tSneAlgo::changedIter, this, &TsneControlPanel::iterationChanged);
  118. connect(algo, &tSneAlgo::algoDone, this, &TsneControlPanel::finished);
  119. emit started();
  120. algo->start();
  121. qDebug() << "Y:" << matrixY;
  122. plott->assignMatrix(begin, end, matrixY, std::distance(begin, end), *gradient);
  123. }