gramods
Loading...
Searching...
No Matches
AccumulativeMean.hh
1
5#ifndef GRAMODS_MISC_ACCUMULATIVEMEAN
6#define GRAMODS_MISC_ACCUMULATIVEMEAN
7
8#include <gmMisc/config.hh>
9
10#include <cmath>
11
12BEGIN_NAMESPACE_GMMISC
13
18template<class TYPE, class FLOAT = float> class AccumulativeMean {
19
20public:
21 AccumulativeMean(const TYPE &zero = 0)
22 : intermediate_value(zero),
23 mean_value(zero),
24 intermediate_count(0),
25 mean_count(0),
26 zero(zero) {}
27
28 AccumulativeMean(TYPE intermediate_value,
29 size_t intermediate_count,
30 TYPE mean_value,
31 size_t mean_count,
32 const TYPE &zero)
33 : intermediate_value(intermediate_value),
34 intermediate_count(intermediate_count),
35 mean_value(mean_value),
36 mean_count(mean_count),
37 zero(zero) {}
38
42 std::function<TYPE(FLOAT r, const TYPE &a, const TYPE &b)> func_interp;
43
48 func_interp = [](FLOAT r, const TYPE &a, const TYPE &b) -> TYPE {
49 return (1 - r) * a + r * b;
50 };
51 }
52
53 AccumulativeMean &operator+=(const TYPE &value) {
54 if (intermediate_count == 0) {
55 intermediate_value = value;
56 intermediate_count = 1;
57 } else {
58 auto r = FLOAT(1) / FLOAT(1 + intermediate_count);
59 intermediate_value = func_interp(r, intermediate_value, value);
60 ++intermediate_count;
61 }
62
63 if (intermediate_count < next_accumulation_count)
64 return *this;
65
66 auto r = FLOAT(intermediate_count) / FLOAT(intermediate_count + mean_count);
67 mean_value = func_interp(r, mean_value, intermediate_value);
68 intermediate_value = zero;
69
70 mean_count += intermediate_count;
71 intermediate_count = 0;
72
73 next_accumulation_count = size_t(std::sqrt(mean_count));
74
75 return *this;
76 }
77
78 operator TYPE() const {
79 if (!mean_count) return intermediate_value;
80 auto r = FLOAT(intermediate_count) / FLOAT(intermediate_count + mean_count);
81 return func_interp(r, mean_value, intermediate_value);
82 }
83
84private:
85 TYPE intermediate_value;
86 size_t intermediate_count;
87 size_t next_accumulation_count = 1;
88
89 TYPE mean_value;
90 size_t mean_count;
91
92 const TYPE zero;
93};
94
95END_NAMESPACE_GMMISC
96
97#endif
A means for accumulating values into a mean using two lists, one intermediate and one final,...
Definition AccumulativeMean.hh:18
void setDefaultFunc()
Creates default interpolation function.
Definition AccumulativeMean.hh:47
std::function< TYPE(FLOAT r, const TYPE &a, const TYPE &b)> func_interp
Function to estimate weighted mean, i.e.
Definition AccumulativeMean.hh:42