// from https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm srecord HalfWelford(long count, dbl mean) { void add(double newValue) { count++; dbl delta = newValue - mean; mean += delta / count; } void remove(double valueToRemove) { guarantee(count > 0); double newValue = valueToRemove; mean = (mean-newValue/count)/(1-1.0/count); --count; } bool isEmpty() { ret count == 0; } dbl average aka avg aka mean() { ret count == 0 ? Double.NaN : mean; } toString { S s = nValues(count); if (!isEmpty()) s += ", avg: " + avg(); ret s; } double get() { ret avg(); } }