/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "base/polygraph.h"
#include "xstd/h/math.h"
#include "base/ILog.h"
#include "base/OLog.h"
#include "base/AggrStat.h"
#include "xstd/gadgets.h"
AggrStat::AggrStat() {
reset();
}
void AggrStat::reset() {
theCount = 0;
theSum = theSqSum = 0;
theMax = theMin = -1;
}
void AggrStat::record(Val v) {
if (theCount++) {
theSum += v;
theSqSum += v*(double)v;
if (theMax < v)
theMax = v;
else
if (theMin > v)
theMin = v;
} else {
theSum = theMin = theMax = v;
theSqSum = v*(double)v;
}
}
AggrStat &AggrStat::operator +=(const AggrStat &s) {
if (s.theCount) {
if (theCount) {
theCount += s.theCount;
theSum += s.theSum;
theSqSum += s.theSqSum;
theMax = Max(theMax, s.theMax);
theMin = Min(theMin, s.theMin);
} else {
theCount = s.theCount;
theSum = s.theSum;
theSqSum = s.theSqSum;
theMax = s.theMax;
theMin = s.theMin;
}
}
return *this;
}
double AggrStat::stdDev() const {
if (theCount < 2)
return -1;
const double diff = theSqSum - theSum*theSum/theCount;
if (diff < 0)
return 0; // should not happen
return sqrt(diff / (theCount-1));
}
double AggrStat::relDevp() const {
return theCount > 1 ? 100*Ratio(stdDev(), mean()) : -1.0;
}
void AggrStat::store(OLog &log) const {
log << theCount;
if (theCount)
log << theMin << theMax << theSum << theSqSum;
}
void AggrStat::load(ILog &log) {
log >> theCount;
if (theCount)
log >> theMin >> theMax >> theSum >> theSqSum;
}
bool AggrStat::sane() const {
return !theCount ||
(theCount > 0 && theMin <= theMax && theSqSum >= 0);
}
ostream &AggrStat::print(ostream &os, const String &pfx) const {
return os
<< pfx << "count: \t " << theCount << endl
<< pfx << "mean: \t " << mean() << endl
<< pfx << "min: \t " << theMin << endl
<< pfx << "max: \t " << theMax << endl
<< pfx << "std_dev:\t " << stdDev() << endl
<< pfx << "rel_dev:\t " << relDevp() << endl
<< pfx << "sum: \t " << theSum << endl
;
}
syntax highlighted by Code2HTML, v. 0.9.1