35 #ifndef OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
36 #define OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
39 #include <openvdb/version.h>
62 Stats(): mSize(0), mAvg(0.0), mAux(0.0),
63 mMin(std::numeric_limits<double>::
max()), mMax(-mMin) {}
69 mMin = std::min<double>(val, mMin);
70 mMax = std::max<double>(val, mMax);
71 const double delta = val - mAvg;
72 mAvg += delta/double(mSize);
73 mAux += delta*(val - mAvg);
77 void add(
double val, uint64_t n)
79 mMin = std::min<double>(val, mMin);
80 mMax = std::max<double>(val, mMax);
81 const double denom = 1.0/double(mSize + n);
82 const double delta = val - mAvg;
83 mAvg += denom*delta*n;
84 mAux += denom*delta*delta*mSize*n;
91 mMin = std::min<double>(mMin, other.mMin);
92 mMax = std::max<double>(mMax, other.mMax);
93 const double denom = 1.0/double(mSize + other.mSize);
94 const double delta = other.mAvg - mAvg;
95 mAvg += denom*delta*other.mSize;
96 mAux += other.mAux + denom*delta*delta*mSize*other.mSize;
101 uint64_t
size()
const {
return mSize; }
103 double min()
const {
return mMin; }
105 double max()
const {
return mMax; }
107 double mean()
const {
return mAvg; }
110 double variance()
const {
return mSize<2 ? 0.0 : mAux/double(mSize); }
113 double stdDev()
const {
return sqrt(this->variance()); }
116 void print(
const std::string &name=
"", std::ostream &strm=std::cout,
int precision=3)
const
120 std::ostringstream os;
121 os << std::setprecision(precision) << std::setiosflags(std::ios::fixed);
123 if (!name.empty()) os <<
"for \"" << name <<
"\" ";
124 os <<
"with " << mSize <<
" samples:\n"
128 <<
", Std=" << this->stdDev()
129 <<
", Var=" << this->variance() << std::endl;
135 double mAvg, mAux, mMin, mMax;
149 : mSize(0), mMin(min), mMax(max+1e-10),
150 mDelta(double(numBins)/(max-min)), mBins(numBins)
153 assert(mMax-mMin > 1e-10);
154 for (
size_t i=0; i<numBins; ++i) mBins[i]=0;
160 mSize(0), mMin(s.
min()), mMax(s.
max()+1e-10),
161 mDelta(double(numBins)/(mMax-mMin)), mBins(numBins)
164 assert(mMax-mMin > 1e-10);
165 for (
size_t i=0; i<numBins; ++i) mBins[i]=0;
171 bool add(
double val, uint64_t n = 1)
173 if (val<mMin || val>mMax)
return false;
174 mBins[size_t(mDelta*(val-mMin))] += n;
184 mBins.size() != other.mBins.size())
return false;
185 for (
size_t i=0, e=mBins.size(); i!=e; ++i) mBins[i] += other.mBins[i];
186 mSize += other.mSize;
191 size_t numBins()
const {
return mBins.size(); }
193 double min()
const {
return mMin; }
195 double max()
const {
return mMax; }
197 double min(
int n)
const {
return mMin+n/mDelta; }
199 double max(
int n)
const {
return mMin+(n+1)/mDelta; }
201 uint64_t
count(
int n)
const {
return mBins[n]; }
203 uint64_t
size()
const {
return mSize; }
206 void print(
const std::string& name =
"", std::ostream& strm = std::cout)
const
210 std::ostringstream os;
211 os << std::setprecision(6) << std::setiosflags(std::ios::fixed) << std::endl;
213 if (!name.empty()) os <<
"for \"" << name <<
"\" ";
214 os <<
"with " << mSize <<
" samples:\n";
215 os <<
"==============================================================\n";
216 os <<
"|| # | Min | Max | Frequency | % ||\n";
217 os <<
"==============================================================\n";
218 for (
size_t i=0, e=mBins.size(); i!=e; ++i) {
219 os <<
"|| " << std::setw(4) << i <<
" | " << std::setw(14) << this->
min(i) <<
" | "
220 << std::setw(14) << this->
max(i) <<
" | " << std::setw(9) << mBins[i] <<
" | "
221 << std::setw(3) << (100*mBins[i]/mSize) <<
" ||\n";
223 os <<
"==============================================================\n";
229 double mMin, mMax, mDelta;
230 std::vector<uint64_t> mBins;
237 #endif // OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED