tsneIteractive.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "pch.h"
  2. #include "tsneIteractive.h"
  3. #include <QDebug>
  4. #include <thread>
  5. #include <future>
  6. #include <chrono>
  7. #include "src/t_sne/tsne.h"
  8. #include "tSneAlgo.h"
  9. tsneIteractive::tsneIteractive(QWidget *parent)
  10. : QWidget(parent), view(new GraphView(this, Bound(-50,50,-50,50))), gradient(new ColorGradient(this))
  11. {
  12. ui.setupUi(this);
  13. ui.verticalLayout->insertWidget(0, view);
  14. view->setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);
  15. ui.verticalLayout->addWidget(gradient);
  16. //ui.gridLayout->addWidget(gradient, 4, 0);
  17. //ui.gridLayout->addWidget(gradient, 4, 0, 1, 4);
  18. view->setUseFixedBound(true);
  19. connect(timer, &QTimer::timeout, this, static_cast<void (tsneIteractive::*)()>(&tsneIteractive::updateCanvasIfAlgoRuns));
  20. connect(ui.startButton, &QPushButton::pressed,
  21. this, &tsneIteractive::startRun);
  22. connect(ui.pauseButton, &QPushButton::pressed,
  23. this, &tsneIteractive::pauseRun);
  24. connect(gradient, &ColorGradient::gradientChanged, this, &tsneIteractive::updateViewGradient);
  25. ui.perplexitySlider->setMinimum(1);
  26. ui.perplexitySlider->setMaximum(50);
  27. ui.perplexitySlider->setValue(20);
  28. ui.perplexityLineEdit->setText(QString::number(20));
  29. ui.learnrateSlider->setMinimum(1);
  30. ui.learnrateSlider->setMaximum(1000);
  31. ui.learnrateSlider->setValue(200);
  32. ui.learnrateLineEdit->setText(QString::number(200));
  33. connect(ui.learnrateSlider, &QSlider::valueChanged, this, [this](int value){
  34. ui.learnrateSlider->setToolTip(QString::number(value));
  35. ui.learnrateLineEdit->setText(QString::number(value));
  36. if (tsneConcurrent != nullptr) {
  37. this->tsneConcurrent->setLearningRate(value);
  38. }
  39. });
  40. connect(ui.perplexitySlider, &QSlider::valueChanged, this, [this](int value) {
  41. ui.perplexitySlider->setToolTip(QString::number(value));
  42. ui.perplexityLineEdit->setText(QString::number(value));
  43. if (tsneConcurrent != nullptr) {
  44. this->tsneConcurrent->setPerplexity(value);
  45. }
  46. });
  47. ui.progressBar->setMinimum(0);
  48. ui.progressBar->setMaximum(750);
  49. ui.progressBar->setValue(0);
  50. }
  51. tsneIteractive::~tsneIteractive()
  52. {
  53. if (tsneConcurrent != nullptr) {
  54. delete tsneConcurrent;
  55. }
  56. }
  57. void tsneIteractive::assignRunData(RunData* data)
  58. {
  59. this->data = data;
  60. }
  61. tSneAlgo* tsneIteractive::getTsneConcurrent()
  62. {
  63. return tsneConcurrent;
  64. }
  65. void tsneIteractive::updateCanvasIfAlgoRuns()
  66. {
  67. if (tsneConcurrent->actualIteration >= 750) {
  68. timer->stop();
  69. }
  70. ui.progressBar->setValue(tsneConcurrent->actualIteration);
  71. //view->autoZoomOut();
  72. view->update();
  73. ui.iterLabel->setText(QString("Iteration: ") + QString::number(tsneConcurrent->actualIteration));
  74. }
  75. void tsneIteractive::updateViewGradient()
  76. {
  77. view->updateGraphColors(*gradient);
  78. update();
  79. }
  80. void tsneIteractive::pauseRun()
  81. {
  82. qDebug() << "Pause";
  83. tsneConcurrent->pause();
  84. if (timer->isActive()) {
  85. timer->stop();
  86. }
  87. else {
  88. timer->start();
  89. }
  90. }
  91. void tsneIteractive::startRun()
  92. {
  93. if (data == nullptr) {
  94. qDebug() << "NoData!";
  95. return;
  96. }
  97. double* Y = nullptr;
  98. double** X = &Y;
  99. if (tsneConcurrent != nullptr) {
  100. delete tsneConcurrent;
  101. }
  102. tsneConcurrent = new tSneAlgo(data->solutionVec.begin(), data->solutionVec.end(), X, 20, 200, 750);
  103. tsneConcurrent->start();
  104. qDebug() << "Y:" << Y;
  105. view->addYMatrix(Y, data->solutionVec);
  106. view->updateGraphColors(*gradient);
  107. view->update();
  108. timer->start(34);
  109. }