aboutsummaryrefslogtreecommitdiff
path: root/projectionobserver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'projectionobserver.cpp')
-rw-r--r--projectionobserver.cpp210
1 files changed, 0 insertions, 210 deletions
diff --git a/projectionobserver.cpp b/projectionobserver.cpp
deleted file mode 100644
index 94f266a..0000000
--- a/projectionobserver.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-#include "projectionobserver.h"
-
-#include <algorithm>
-#include <cmath>
-
-#include "mp.h"
-#include "numericrange.h"
-
-ProjectionObserver::ProjectionObserver(const arma::mat &X,
- const arma::uvec &cpIndices)
- : m_type(ObserverCurrent)
- , m_X(X)
- , m_cpIndices(cpIndices)
- , m_rpIndices(X.n_rows - cpIndices.n_elem)
- , m_cpSelectionEmpty(true)
- , m_rpSelectionEmpty(true)
- , m_values(X.n_rows)
- , m_prevValues(X.n_rows)
- , m_firstValues(X.n_rows)
- , m_hasFirst(false)
- , m_hasPrev(false)
-{
- m_distX = mp::dist(m_X);
-
- NumericRange<arma::uword> allIndices(0, m_X.n_rows);
- std::set_symmetric_difference(allIndices.cbegin(), allIndices.cend(),
- m_cpIndices.cbegin(), m_cpIndices.cend(), m_rpIndices.begin());
-
- computeAlphas();
-}
-
-void ProjectionObserver::computeAlphas()
-{
- m_influences.set_size(m_X.n_rows);
- m_alphas.set_size(m_rpIndices.n_elem, m_cpIndices.n_elem);
-
- for (arma::uword i = 0; i < m_rpIndices.n_elem; i++) {
- double sum = 0;
- const arma::rowvec &x = m_X.row(m_rpIndices[i]);
- for (arma::uword j = 0; j < m_cpIndices.n_elem; j++) {
- double norm = arma::norm(x - m_X.row(m_cpIndices[j]));
- m_alphas(i, j) = 1.0 / std::max(norm * norm, 1e-6);
- sum += m_alphas(i, j);
- }
-
- for (arma::uword j = 0; j < m_cpIndices.n_elem; j++) {
- m_alphas(i, j) /= sum;
- }
- }
-}
-
-void ProjectionObserver::undo()
-{
- if (m_hasPrev) {
- m_hasPrev = false;
- m_distY = m_prevDistY;
- m_values = m_prevValues;
-
- if (m_cpSelectionEmpty && m_rpSelectionEmpty) {
- emitValuesChanged();
- }
- }
-}
-
-void ProjectionObserver::reset()
-{
- if (m_hasFirst) {
- m_hasPrev = false;
- m_distY = m_firstDistY;
- m_values = m_firstValues;
-
- if (m_cpSelectionEmpty && m_rpSelectionEmpty) {
- emitValuesChanged();
- }
- }
-}
-
-void ProjectionObserver::addMap(const arma::mat &Y)
-{
- if (m_hasFirst) {
- m_hasPrev = true;
- m_prevDistY = m_distY;
- m_prevValues = m_values;
- }
-
- m_distY = mp::dist(Y);
-
- mp::aggregatedError(m_distX, m_distY, m_values);
-
- if (!m_hasFirst) {
- m_hasFirst = true;
- m_firstDistY = m_distY;
- m_firstValues = m_values;
- }
-
- if (m_cpSelectionEmpty && m_rpSelectionEmpty) {
- emitValuesChanged();
- }
-}
-
-bool ProjectionObserver::setType(ObserverType type)
-{
- if (m_type == type) {
- return true;
- }
-
- if ((type == ObserverDiffPrevious && !m_hasPrev)
- || (type == ObserverDiffFirst && !m_hasFirst)) {
- return false;
- }
-
- m_type = type;
- if (!m_cpSelectionEmpty || !m_rpSelectionEmpty) {
- // We changed our type, but cannot emit values since we have non-empty
- // selections
- return true;
- }
- return emitValuesChanged();
-}
-
-void ProjectionObserver::setCPSelection(const std::vector<bool> &cpSelection)
-{
- m_cpSelection.clear();
- for (int i = 0; i < cpSelection.size(); i++) {
- if (cpSelection[i]) {
- m_cpSelection.push_back(i);
- }
- }
- m_cpSelectionEmpty = m_cpSelection.empty();
-
- if (!m_cpSelectionEmpty) {
- // compute the influence of CP selection on each RP
- for (arma::uword rp = 0; rp < m_rpIndices.n_elem; rp++) {
- m_influences[m_rpIndices[rp]] = 0;
- const arma::rowvec &row = m_alphas.row(rp);
- for (auto cp: m_cpSelection) {
- m_influences[m_rpIndices[rp]] += row[cp];
- }
- }
-
- emit rpValuesChanged(m_influences(m_rpIndices));
- } else {
- emitValuesChanged();
- }
-}
-
-void ProjectionObserver::setRPSelection(const std::vector<bool> &rpSelection)
-{
- m_rpSelection.clear();
- for (int i = 0; i < rpSelection.size(); i++) {
- if (rpSelection[i]) {
- m_rpSelection.push_back(i);
- }
- }
- m_rpSelectionEmpty = m_rpSelection.empty();
-
- if (!m_rpSelectionEmpty) {
- // compute how influent is each CP on RP selection
- for (arma::uword cp = 0; cp < m_cpIndices.n_elem; cp++) {
- m_influences[m_cpIndices[cp]] = 0;
- for (auto rp: m_rpSelection) {
- m_influences[m_cpIndices[cp]] += m_alphas(rp, cp);
- }
- }
-
- emit cpValuesChanged(m_influences(m_cpIndices));
- } else {
- emit cpValuesChanged(arma::vec());
- }
-}
-
-bool ProjectionObserver::emitValuesChanged() const
-{
- switch (m_type) {
- case ObserverCurrent:
- emit rpValuesChanged(m_values(m_rpIndices));
- emit valuesChanged(m_values);
- return true;
- case ObserverDiffPrevious:
- if (m_hasPrev) {
- arma::vec diff = m_values - m_prevValues;
- emit rpValuesChanged(diff(m_rpIndices));
- emit valuesChanged(diff);
- return true;
- }
- return false;
- case ObserverDiffFirst:
- if (m_hasFirst) {
- arma::vec diff = m_values - m_firstValues;
- emit rpValuesChanged(diff(m_rpIndices));
- emit valuesChanged(diff);
- return true;
- }
- return false;
- default:
- return false;
- }
-}
-
-void ProjectionObserver::setRewind(double t)
-{
- if (!m_hasPrev || !m_cpSelectionEmpty || !m_rpSelectionEmpty) {
- return;
- }
-
- arma::vec values = m_values * t + m_prevValues * (1.0 - t);
- emit cpValuesRewound(values(m_cpIndices));
- emit rpValuesRewound(values(m_rpIndices));
- emit valuesRewound(values);
-}