From 53f05e5f0bc0b79b4422ecfbb3dde7e346fdddd4 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Wed, 15 Jan 2020 19:17:50 -0500 Subject: refactor --- quantity.hpp | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 quantity.hpp (limited to 'quantity.hpp') diff --git a/quantity.hpp b/quantity.hpp new file mode 100644 index 0000000..55d5a28 --- /dev/null +++ b/quantity.hpp @@ -0,0 +1,83 @@ + +#pragma once + +#include +#include +#include +#include + +class Quantity { +private: + double total; + double total2; + std::vector C; + unsigned wait; + +public: + unsigned n; + std::list hist; + + Quantity(unsigned lag, unsigned wait) : C(lag), wait(wait) { + n = 0; + total = 0; + total2 = 0; + } + + void add(double x) { + if (n > wait) { + hist.push_front(x); + if (hist.size() > C.size()) { + hist.pop_back(); + unsigned t = 0; + for (double a : hist) { + C[t] += a * x; + t++; + } + total += x; + total2 += pow(x, 2); + } + } + n++; + } + + double avg() const { return total / (n - wait); } + + double avg2() const { return total2 / (n - wait); } + + std::vector ρ() const { + double C0 = C.front() / (n - wait); + double avg2 = pow(total / (n - wait), 2); + + std::vector ρtmp; + + for (double Ct : C) { + ρtmp.push_back((Ct / (n - wait) - avg2) / (C0 - avg2)); + } + + return ρtmp; + } + + std::array τ() const { + double τtmp = 0.5; + unsigned M = 1; + double c = 8.0; + + std::vector ρ_tmp = this->ρ(); + + while (c * τtmp > M && M < C.size()) { + τtmp += ρ_tmp[M]; + M++; + } + + return {τtmp, 2.0 * (2.0 * M + 1) * pow(τtmp, 2) / (n - wait)}; + } + + double σ() const { + return 2.0 / (n - wait) * this->τ()[0] * (C[0] / (n - wait) - pow(this->avg(), 2)); + } + + double serr() const { return sqrt(this->σ()); } + + unsigned num_added() const { return n - wait; } +}; + -- cgit v1.2.3-54-g00ecf