diff --git a/gui/NeuroUI/NeuroUI.pro b/gui/NeuroUI/NeuroUI.pro index 5a88fef..66639e1 100644 --- a/gui/NeuroUI/NeuroUI.pro +++ b/gui/NeuroUI/NeuroUI.pro @@ -17,13 +17,15 @@ SOURCES += main.cpp\ ../../Layer.cpp \ ../../Net.cpp \ ../../Neuron.cpp \ - netlearner.cpp + netlearner.cpp \ + errorplotter.cpp HEADERS += neuroui.h \ ../../Layer.h \ ../../Net.h \ ../../Neuron.h \ - netlearner.h + netlearner.h \ + errorplotter.h FORMS += neuroui.ui diff --git a/gui/NeuroUI/errorplotter.cpp b/gui/NeuroUI/errorplotter.cpp new file mode 100644 index 0000000..4e6f0b3 --- /dev/null +++ b/gui/NeuroUI/errorplotter.cpp @@ -0,0 +1,69 @@ +#include "errorplotter.h" + +#include + +ErrorPlotter::ErrorPlotter(QWidget *parent) + : QWidget(parent) + , m_maxErrorValue(0.0) +{ +} + +QSize ErrorPlotter::minimumSizeHint() const +{ + return QSize(100, 100); +} + +QSize ErrorPlotter::sizeHint() const +{ + return QSize(400, 200); +} + +void ErrorPlotter::clear() +{ + m_errorValues.clear(); + m_maxErrorValue = 0.0; + + update(); +} + +void ErrorPlotter::addErrorValue(double errorValue) +{ + m_errorValues.push_back(errorValue); + m_maxErrorValue = std::max(m_maxErrorValue, errorValue); + + update(); +} + +void ErrorPlotter::paintEvent(QPaintEvent *) +{ + if (m_errorValues.empty() || m_maxErrorValue == 0) + { + return; + } + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing, true); + + painter.translate(0.0, height()); + painter.scale(1.0, -1.0); + + double errorValueScale = height() / m_maxErrorValue; + + auto errorValueIt = m_errorValues.crbegin(); + + double prevErrorValue = *errorValueIt; + errorValueIt++; + + int xPos = width() - 2; + while(errorValueIt != m_errorValues.crend() && xPos >= 0) + { + double currentErrorValue = *errorValueIt; + + painter.drawLine(xPos + 1, prevErrorValue * errorValueScale, + xPos, currentErrorValue * errorValueScale); + + prevErrorValue = currentErrorValue; + errorValueIt++; + xPos--; + } +} diff --git a/gui/NeuroUI/errorplotter.h b/gui/NeuroUI/errorplotter.h new file mode 100644 index 0000000..47c5093 --- /dev/null +++ b/gui/NeuroUI/errorplotter.h @@ -0,0 +1,31 @@ +#ifndef ERRORPLOTTER_H +#define ERRORPLOTTER_H + +#include + +class ErrorPlotter : public QWidget +{ + Q_OBJECT + +private: + std::list m_errorValues; + double m_maxErrorValue; + +public: + explicit ErrorPlotter(QWidget *parent = 0); + + QSize minimumSizeHint() const Q_DECL_OVERRIDE; + QSize sizeHint() const Q_DECL_OVERRIDE; + + void clear(); + +protected: + void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE; + +signals: + +public slots: + void addErrorValue(double errorValue); +}; + +#endif // ERRORPLOTTER_H diff --git a/gui/NeuroUI/netlearner.cpp b/gui/NeuroUI/netlearner.cpp index 884f0af..4c68822 100644 --- a/gui/NeuroUI/netlearner.cpp +++ b/gui/NeuroUI/netlearner.cpp @@ -12,7 +12,7 @@ void NetLearner::run() double batchMaxError = 0.0; double batchMeanError = 0.0; - size_t numIterations = 100000; + size_t numIterations = 1000000; for (size_t iteration = 0; iteration < numIterations; ++iteration) { std::vector inputValues = @@ -47,6 +47,7 @@ void NetLearner::run() logString.append(QString::number(std::abs(batchMeanError / batchSize))); emit logMessage(logString); + emit currentNetError(batchMaxError); batchIndex = 0; batchMaxError = 0.0; diff --git a/gui/NeuroUI/netlearner.h b/gui/NeuroUI/netlearner.h index a21f6b1..2c2b6fa 100644 --- a/gui/NeuroUI/netlearner.h +++ b/gui/NeuroUI/netlearner.h @@ -13,6 +13,7 @@ private: signals: void logMessage(const QString &logMessage); void progress(double progress); + void currentNetError(double error); }; #endif // NETLEARNER_H diff --git a/gui/NeuroUI/neuroui.cpp b/gui/NeuroUI/neuroui.cpp index 75452b3..b8feeba 100644 --- a/gui/NeuroUI/neuroui.cpp +++ b/gui/NeuroUI/neuroui.cpp @@ -18,6 +18,7 @@ NeuroUI::~NeuroUI() void NeuroUI::on_runButton_clicked() { ui->logView->clear(); + ui->errorPlotter->clear(); if (m_netLearner == nullptr) { @@ -30,6 +31,8 @@ void NeuroUI::on_runButton_clicked() connect(m_netLearner.get(), &NetLearner::started, this, &NeuroUI::netLearnerStarted); connect(m_netLearner.get(), &NetLearner::finished, this, &NeuroUI::netLearnerFinished); + connect(m_netLearner.get(), &NetLearner::currentNetError, ui->errorPlotter, &ErrorPlotter::addErrorValue); + m_netLearner->start(); } diff --git a/gui/NeuroUI/neuroui.ui b/gui/NeuroUI/neuroui.ui index 1e021f7..b05a61f 100644 --- a/gui/NeuroUI/neuroui.ui +++ b/gui/NeuroUI/neuroui.ui @@ -22,6 +22,16 @@ + + + + + 0 + 0 + + + + @@ -50,6 +60,14 @@ + + + ErrorPlotter + QWidget +
errorplotter.h
+ 1 +
+