11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
17PROMEKI_NAMESPACE_BEGIN
49class StatsAccumulator {
52 StatsAccumulator() =
default;
58 void add(
double value) {
63 if (value < _min) _min = value;
64 if (value > _max) _max = value;
68 _sumSq += value * value;
76 void merge(
const StatsAccumulator &other) {
77 if (other._count == 0)
return;
82 if (other._min < _min) _min = other._min;
83 if (other._max > _max) _max = other._max;
85 _count += other._count;
87 _sumSq += other._sumSq;
102 uint64_t count()
const {
return _count; }
105 bool isEmpty()
const {
return _count == 0; }
108 double sum()
const {
return _sum; }
111 double sumSq()
const {
return _sumSq; }
114 double min()
const {
return _min; }
117 double max()
const {
return _max; }
123 double mean()
const {
124 if (_count == 0)
return 0.0;
125 return _sum /
static_cast<double>(_count);
132 double variance()
const {
133 if (_count < 2)
return 0.0;
134 double n =
static_cast<double>(_count);
135 double v = (_sumSq - _sum * _sum / n) / (n - 1.0);
136 return v > 0.0 ? v : 0.0;
143 double stddev()
const {
144 double v = variance();
145 return v > 0.0 ? std::sqrt(v) : 0.0;