/* * VarFunc.hh * * Created on: Jun 22, 2018 * Author: benjamin */ #ifndef VARFUNC_HH_ #define VARFUNC_HH_ #include "AbstractFunc.hh" #include "Toolbox.hh" namespace AMDA { namespace Parameters { namespace StatisticFunctions { template OutputElemType computeVar(std::list>& mem, OutputElemType& nanVal) { OutputElemType result = nanVal; if (mem.empty()) { return result; } result << ElemNull(); OutputElemType sum = result; int n = 0; for (auto val : mem) { if (isNAN(val.second)) continue; sum = sum+val.second; result = result+StatisticFunctions::square(val.second); ++n; } if (n == 0) { result << NotANumber(); return result; } result = 1./n*result; OutputElemType mean = sum/n; result = result - StatisticFunctions::square(mean); return result; } /** * @class VarFunc * @brief * @details This class implements AbstractFunc. */ template class VarFunc : public ClassicAbstractFunc { public: /** * @brief Constructor. */ VarFunc(Process& pProcess, TimeIntervalListSPtr pTimeIntervalList, ParamDataSpec& paramInput, double windowtime) : ClassicAbstractFunc(pProcess, pTimeIntervalList, paramInput, windowtime) { } virtual ~VarFunc() { } OutputElemType compute() { return computeVar(ClassicAbstractFunc::_mem, ClassicAbstractFunc::_nanVal); } }; /** * @class VarFuncSm * @brief * @details This class implements AbstractFunc. */ template class VarSmFunc : public SmAbstractFunc { public: /** * @brief Constructor. */ VarSmFunc(Process& pProcess, TimeIntervalListSPtr pTimeIntervalList, ParamDataSpec& paramInput, double windowtime) : SmAbstractFunc(pProcess, pTimeIntervalList, paramInput, windowtime) { } virtual ~VarSmFunc() { } OutputElemType compute() { return computeVar(SmAbstractFunc::_mem, SmAbstractFunc::_nanVal); } }; } /* namespace StatisticFunctions */ } /* namespace Parameters */ } /* namespace AMDA */ #endif /* MINFUNC_HH_ */