StatisticCorrelationCreator.hh 8.42 KB
/*
 *  StatisticCorrelationCreator.hh
 *
 *  Created on: Mar 26, 2019
 *      Author: AKKA IS
 */

#ifndef STATISTICCORRELATIONCREATOR_HH_
#define STATISTICCORRELATIONCREATOR_HH_

#include "Operation.hh"
#include "ParameterManager.hh"
#include "ParamMgr.hh"
#include "ParamData.hh"
#include "VisitorOfParamData.hh"
#include "AMDA_exception.hh"
#include "CorrelationFunctions.hh"

namespace AMDA {
    namespace Parameters {

        /**
         * @class SumIntoTableIndexesCreator
         * @brief Creator of the Operation SumIntoTableIndexes parameterized with ParamData input type.
         * @details Implement the interface VisitorOfParamData.
         */
        class StatisticCorrelationCreator : public VisitorOfParamData {
        public:

            /**
             * @brief Constructor.
             */
            StatisticCorrelationCreator(Process& pProcess, TimeIntervalListSPtr pTimeIntervalList, ParamData& paramInput, ParamData& secondParamData, ParameterSPtr secondInputParam, double windowtime, std::string type_)
            : _process(pProcess), _timeIntervalList(pTimeIntervalList), _paramData(paramInput), _secondParamData(secondParamData), _secondInputParam(secondInputParam),_windowtime(windowtime), _type(type_) {
                _paramData.accept(*this);
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireShort *)
             */
            void visit(ParamDataScalaireShort *) {
                createOperation<short>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireFloat *)
             */
            void visit(ParamDataScalaireFloat *) {
                createOperation<float>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireDouble *)
             */
            void visit(ParamDataScalaireDouble *) {
                createOperation<double>();

            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireLongDouble *)
             */
            void visit(ParamDataScalaireLongDouble *) {
                createOperation<long double>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataScalaireInt *)
             */
            void visit(ParamDataScalaireInt *) {
                createOperation<int>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataLogicalData *)
             */
            void visit(ParamDataLogicalData *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DShort *)
             */
            void visit(ParamDataTab1DShort *) {
                createOperation1D<short>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DFloat *)
             */
            void visit(ParamDataTab1DFloat *) {
                createOperation1D<float>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DDouble *)
             */
            void visit(ParamDataTab1DDouble *) {
                createOperation1D<double>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DLongDouble *)
             */
            void visit(ParamDataTab1DLongDouble *) {
                createOperation1D<long double>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DInt *)
             */
            void visit(ParamDataTab1DInt *) {
                createOperation1D<int>();
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab1DLogicalData *)
             */
            void visit(ParamDataTab1DLogicalData *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DShort *)
             */
            void visit(ParamDataTab2DShort *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DFloat *)
             */
            void visit(ParamDataTab2DFloat *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DDouble *)
             */
            void visit(ParamDataTab2DDouble *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DLongDouble *)
             */
            void visit(ParamDataTab2DLongDouble *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DInt *)
             */
            void visit(ParamDataTab2DInt *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @overload VisitorOfParamData::visit(ParamDataTab2DLogicalData *)
             */
            void visit(ParamDataTab2DLogicalData *) {
                BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_ERROR_UNKNOWN) << AMDA::ex_msg("Tsyganenko96Creator operation not supported"));
            }

            /**
             * @brief get the Tsyganenko96 parameterized operation.
             */
            Operation * getOperation() const {
                return _operation;
            }
        private:

            template <typename Type>
            void createOperation() {
                _operation = new StatisticFunctions::Correlation<Type, Type>(_process, _timeIntervalList, dynamic_cast<ParamDataSpec<Type>&> (_paramData),
                        dynamic_cast<ParamDataSpec<Type>&> (_secondParamData), _windowtime, _type);
            pushSecondParamData<Type>();

            }
            
             template <typename Type>
             void pushSecondParamData(){
                      try {
                    ParamDataIndexInfo lParamDataIndexInfo;
                    lParamDataIndexInfo = _secondInputParam->getAsync(&_process).get();
                    while ((!lParamDataIndexInfo._noMoreTimeInt && !lParamDataIndexInfo._timeIntToProcessChanged) || (lParamDataIndexInfo._nbDataToProcess > 0)) {
                        reinterpret_cast<StatisticFunctions::AbstractCorrelationFunc<Type, Type>*> (_operation)->pushSecondParamData(lParamDataIndexInfo);
                        if (lParamDataIndexInfo._timeIntToProcessChanged || lParamDataIndexInfo._noMoreTimeInt)
                            break;
                        lParamDataIndexInfo = _secondInputParam->getAsync(&_process).get();
                    }
                } catch (...) {
                    throw;
                }
             }

            template <typename Type>
            void createOperation1D() {
                  _operation = new StatisticFunctions::Correlation1D<std::vector<Type>, std::vector<Type>, Type>(_process, _timeIntervalList, dynamic_cast<ParamDataSpec<std::vector<Type>>&> (_paramData),
                        dynamic_cast<ParamDataSpec<std::vector<Type>>&> (_secondParamData), _windowtime, _type);
            pushSecondParamData<std::vector<Type>>();
                
            }

            Process &_process;
            TimeIntervalListSPtr _timeIntervalList;
            ParamData &_paramData;
            ParamData &_secondParamData;
            ParameterSPtr _secondInputParam;
            double _windowtime;
            std::string _type;
            Operation *_operation;
        };

    } /* namespace Parameters */
} /* namespace AMDA */
#endif /* FRAMEINTOTABLEINDEXESCREATOR_HH_ */