CorrelationProcess.cc 5.12 KB
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   CorrelationProcess.cc
 * Author: hacene
 * 
 * Created on September 27, 2021, 10:02 AM
 */
#include <stdlib.h>
#include <string>

#include <boost/lexical_cast.hpp>

#include "DicError.hh"
#include "AMDA_exception.hh"

#include "Operation.hh"
#include "ParameterManager.hh"
#include "ParamMgr.hh"
#include "ParameterCreatorFromExpression.hh"
#include "CorrelationProcess.hh"
#include "StatisticCorrelationCreator.hh"
#include "CorrelationFunctions.hh"
#include <typeinfo>

using namespace std;
using namespace boost;
using namespace log4cxx;

namespace AMDA {
    namespace Parameters {

        CorrelationProcess::CorrelationProcess(Parameter &parameter) : SingleParamProcess_CRTP(parameter) {
            _type = "";
        }

        CorrelationProcess::CorrelationProcess(const CorrelationProcess& pProcess, Parameter &parameter) : SingleParamProcess_CRTP(pProcess, parameter) {
            _type = "";
        }

        CorrelationProcess::~CorrelationProcess() {
            if (_secondInputParam != nullptr)
                _secondInputParam->closeConnection(this);
        }

        void CorrelationProcess::establishConnection() {


            if (_attributList.size() < 2) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_PROCESS_ERR) << AMDA::ex_msg(std::string("CorrelationProcess::parse require 3 attributes'")));
            }

            //Imf parameter
            ParameterCreatorFromExpression creator(_parameter.getParameterManager());
            std::string secondParamExpression;
            
            if(_attributList[0][0] == '$'  || _attributList[0][0] == '#')
                 secondParamExpression=_attributList[0];
            else
                secondParamExpression = "$" + _attributList[0];
            _secondInputParam = creator.getOneParameterFromExpression(_parameter,secondParamExpression ,true);
            if (_secondInputParam == nullptr) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_PROCESS_ERR) << AMDA::ex_msg(std::string("CorrelationProcess::parse cannot retrieve imf param")));
            }
            _secondInputParam->openConnection(this);

            SingleParamProcess::establishConnection();
        }

        TimeStamp CorrelationProcess::init() {
            _windowtime = atof(_attributList[1].c_str());
            
            if(_type.empty() && _attributList.size() >=3)
                _type =  _attributList[2];

            TimeStamp time = _parameterInput->init(this, _timeIntervalList);
            _paramInput = _parameterInput->getParamData(this).get();

            _secondInputParam->init(this, _timeIntervalList);
            ParamData* lSecondParamInput = _secondInputParam->getParamData(this).get();

            StatisticCorrelationCreator lCreator(*this, _timeIntervalList, *_paramInput, *lSecondParamInput, _secondInputParam, _windowtime, _type);
            _operation = lCreator.getOperation();
            _paramData = ParamDataSPtr(_operation->getParamOutput());
            _paramData->setMinSampling(_paramInput->getMinSampling());
            return time;
        }
        
// Covariance 
        CovarianceProcess::CovarianceProcess(Parameter& parameter):CorrelationProcess(parameter){
            CorrelationProcess::_type = "covariance";
        }
        
        CovarianceProcess::CovarianceProcess(const CorrelationProcess& pProcess, Parameter& parameter):CorrelationProcess(pProcess, parameter){
            CorrelationProcess::_type = "covariance";
        }
        
        CovarianceProcess::~CovarianceProcess(){        
        }
       
    
    // Pearson 
        PearsonProcess::PearsonProcess(Parameter& parameter):CorrelationProcess(parameter){
            CorrelationProcess::_type = "pearson";
        }
        
        PearsonProcess::PearsonProcess(const CorrelationProcess& pProcess, Parameter& parameter):CorrelationProcess(pProcess, parameter){
            CorrelationProcess::_type = "pearson";
        }
        
        PearsonProcess::~PearsonProcess(){        
        }
        
    

// Kendall 
        KendallProcess::KendallProcess(Parameter& parameter):CorrelationProcess(parameter){
            CorrelationProcess::_type = "kendall";
        }
        
        KendallProcess::KendallProcess(const CorrelationProcess& pProcess, Parameter& parameter):CorrelationProcess(pProcess, parameter){
            CorrelationProcess::_type = "kendall";
        }
        
        KendallProcess::~KendallProcess(){        
        }
        
        // Spearman  
        SpearmanProcess::SpearmanProcess(Parameter& parameter):CorrelationProcess(parameter){
            CorrelationProcess::_type = "spearman ";
        }
        
        SpearmanProcess::SpearmanProcess(const CorrelationProcess& pProcess, Parameter& parameter):CorrelationProcess(pProcess, parameter){
            CorrelationProcess::_type = "spearman ";
        }
        
        SpearmanProcess::~SpearmanProcess(){        
        }
        
    }
    
    
}