/* * © Copyright 2014 – Urheberrechtshinweis * Alle Rechte vorbehalten / All Rights Reserved * * Programmcode ist urheberrechtlich geschuetzt. * Das Urheberrecht liegt, soweit nicht ausdruecklich anders gekennzeichnet, bei Frank Ebner. * Keine Verwendung ohne explizite Genehmigung. * (vgl. § 106 ff UrhG / § 97 UrhG) */ #ifndef MOVINGAVERAGETS_H #define MOVINGAVERAGETS_H #include #include "../data/Timestamp.h" #include #include "KahanSum.h" template class MovingAverageTS { private: /** timestamp -> value combination */ struct Entry { Timestamp ts; T value; Entry(const Timestamp ts, const T& value) : ts(ts), value(value) {;} }; /** the regional window to use */ Timestamp window; /** the value history for the window-size */ std::vector history; const T zero; /** current sum */ T sum; /** more exact running summation of many values */ KahanSum kSum; public: /** ctor with the window-size to use */ MovingAverageTS(const Timestamp window, const T zeroElement) : window(window), zero(zeroElement), sum(zeroElement), kSum(zeroElement) { } /** add a new entry */ void add(const Timestamp ts, const T& data) { // append to history history.push_back(Entry(ts, data)); // adjust sum sum += data; kSum += data; // remove too-old history entries const Timestamp oldest = ts - window; while(history.front().ts < oldest) { // adjust sum sum -= history.front().value; kSum -= history.front().value; // remove from history history.erase(history.begin()); } } /** get the current average (with increasing error due to float sum!) */ T getOldAPX() const { return sum / history.size(); } /** get the current average */ T get() const { return kSum.get() / history.size(); } // T get() const { // T sum = zero; // volatile T comp = zero; // for (const auto e : history) { // T inp = e.value; // T y = inp - comp; // T t = sum + y; // comp = (t-sum) - y; // sum = t; // } // return sum / history.size(); // } }; #endif // MOVINGAVERAGETS_H