libmcts
A Monte Carlo Tree Search Library
running_stats.cpp
1 #include "running_stats.hpp"
2 #include <cmath>
3 #include <vector>
4 
5 namespace mcts {
6 
7 RunningStats::RunningStats() { clear(); }
8 
9 void RunningStats::clear() {
10  n = 0;
11  M1 = M2 = M3 = M4 = 0.0;
12 }
13 
14 void RunningStats::push(const double& x) {
15  double delta, delta_n, delta_n2, term1;
16 
17  long long n1 = n;
18  n++;
19  delta = x - M1;
20  delta_n = delta / n;
21  delta_n2 = delta_n * delta_n;
22  term1 = delta * delta_n * n1;
23  M1 += delta_n;
24  M4 += term1 * delta_n2 * (n * n - 3 * n + 3) + 6 * delta_n2 * M2 -
25  4 * delta_n * M3;
26  M3 += term1 * delta_n * (n - 2) - 3 * delta_n * M2;
27  M2 += term1;
28 }
29 
30 long long RunningStats::num_data_values() const { return n; }
31 
32 double RunningStats::mean() const { return M1; }
33 
34 double RunningStats::variance() const { return M2 / (n - 1.0); }
35 
36 double RunningStats::standard_deviation() const { return sqrt(variance()); }
37 
38 double RunningStats::skewness() const {
39  return sqrt(double(n)) * M3 / pow(M2, 1.5);
40 }
41 
42 double RunningStats::kurtosis() const {
43  return double(n) * M4 / (M2 * M2) - 3.0;
44 }
45 
46 RunningStats operator+(const RunningStats a, const RunningStats b) {
47  RunningStats combined;
48 
49  combined.n += a.n + b.n;
50 
51  double delta = b.M1 - a.M1;
52  double delta2 = delta * delta;
53  double delta3 = delta * delta2;
54  double delta4 = delta2 * delta2;
55 
56  combined.M1 = (a.n * a.M1 + b.n * b.M1) / combined.n;
57 
58  combined.M2 = a.M2 + b.M2 + delta2 * a.n * b.n / combined.n;
59 
60  combined.M3 = a.M3 + b.M3 +
61  delta3 * a.n * b.n * (a.n - b.n) / (combined.n * combined.n);
62  combined.M3 += 3.0 * delta * (a.n * b.M2 - b.n * a.M2) / combined.n;
63 
64  combined.M4 = a.M4 + b.M4 + delta4 * a.n * b.n *
65  (a.n * a.n - a.n * b.n + b.n * b.n) /
66  (combined.n * combined.n * combined.n);
67  combined.M4 += 6.0 * delta2 * (a.n * a.n * b.M2 + b.n * b.n * a.M2) /
68  (combined.n * combined.n) +
69  4.0 * delta * (a.n * b.M3 - b.n * a.M3) / combined.n;
70 
71  return combined;
72 }
73 
74 RunningStats &RunningStats::operator+=(const RunningStats &rhs) {
75  RunningStats combined = *this + rhs;
76  *this = combined;
77  return *this;
78 }
79 }
void push(const double &x)
add a new value to the object
long long num_data_values() const
number of samples from which mean etc are calculated