//
// Created by martin on 21.11.18.
//

#include <cmath>
#include <stdexcept>
#include <boost/serialization/export.hpp>

#include "NormalizationStrategy.h"
#include "NormalizationStrategySerialization.h"

BOOST_CLASS_EXPORT_IMPLEMENT(NormalizationStrategy);
BOOST_CLASS_EXPORT_IMPLEMENT(DoubleUnitStrategy);

double NormalizationStrategy::get_max_value() {
    return this->max_min_inp_val.at(0);
}

double NormalizationStrategy::get_min_value() {
    return this->max_min_inp_val.at(1);
}

DoubleUnitStrategy::DoubleUnitStrategy() {}

double DoubleUnitStrategy::normalize(double n, double max, double min) {
    if(this->max_min_inp_val.empty()) {
        this->max_min_inp_val.emplace_back(max);
        this->max_min_inp_val.emplace_back(min);
    } else {
        this->max_min_inp_val.at(0) = max;
        this->max_min_inp_val.at(1) = min;
    }

    return 2*(n - min)/(max - min) - 1;
}

double DoubleUnitStrategy::de_normalize(double n) {
    if(this->max_min_inp_val.empty()) {
        throw std::runtime_error("Data were not normalized, so de-normalization cannot progress!");
    }

    return 0.5 * (1 + (this->get_max_value() - this->get_min_value()) * n) + this->get_min_value();
}