10 #ifndef OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
11 #define OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
30 template <
typename ValueType,
typename Less = std::less<ValueType> >
33 using Limits = std::numeric_limits<ValueType>;
41 static_assert(std::numeric_limits<ValueType>::is_specialized,
42 "openvdb::math::MinMax default constructor requires a std::numeric_limits specialization");
74 std::ostringstream os;
77 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
78 os <<
" Min=" <<
mMin <<
", Max=" <<
mMax << std::endl;
97 ,
mMin(std::numeric_limits<double>::
max())
111 void add(
double val, uint64_t
n)
141 std::ostringstream os;
144 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
146 os <<
"with " <<
mSize <<
" samples:\n"
149 <<
", Range="<< this->
range() << std::endl;
151 os <<
": no samples were added." << std::endl;
193 const double delta = val -
mAvg;
194 mAvg += delta/double(
mSize);
199 void add(
double val, uint64_t
n)
201 const double denom = 1.0/double(
mSize + n);
202 const double delta = val -
mAvg;
203 mAvg += denom * delta * double(n);
204 mAux += denom * delta * delta * double(
mSize) * double(n);
211 if (other.
mSize > 0) {
212 const double denom = 1.0/double(
mSize + other.
mSize);
213 const double delta = other.
mAvg -
mAvg;
214 mAvg += denom * delta * double(other.
mSize);
246 std::ostringstream os;
249 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
251 os <<
"with " <<
mSize <<
" samples:\n"
255 <<
", Std=" << this->
stdDev()
256 <<
", Var=" << this->
variance() << std::endl;
258 os <<
": no samples were added." << std::endl;
281 : mSize(0), mMin(min), mMax(max + 1e-10),
284 if ( mMax <= mMin ) {
287 OPENVDB_THROW(ValueError,
"Histogram: expected at least one bin");
289 for (
size_t i=0; i<
numBins; ++i) mBins[i]=0;
295 mSize(0), mMin(s.
min()), mMax(s.
max()+1e-10),
298 if ( mMax <= mMin ) {
301 OPENVDB_THROW(ValueError,
"Histogram: expected at least one bin");
303 for (
size_t i=0; i<
numBins; ++i) mBins[i]=0;
309 inline bool add(
double val, uint64_t
n = 1)
312 mBins[size_t(mDelta*(val-mMin))] +=
n;
322 mBins.size() != other.mBins.size())
return false;
323 for (
size_t i=0, e=mBins.size(); i!=e; ++i) mBins[i] += other.mBins[i];
324 mSize += other.mSize;
329 inline size_t numBins()
const {
return mBins.size(); }
331 inline double min()
const {
return mMin; }
333 inline double max()
const {
return mMax; }
335 inline double min(
int n)
const {
return mMin+n/mDelta; }
337 inline double max(
int n)
const {
return mMin+(n+1)/mDelta; }
339 inline uint64_t
count(
int n)
const {
return mBins[
n]; }
341 inline uint64_t
size()
const {
return mSize; }
344 void print(
const std::string&
name =
"", std::ostream& strm = std::cout)
const
348 std::ostringstream os;
349 os << std::setprecision(6) << std::setiosflags(
std::ios::fixed) << std::endl;
351 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
353 os <<
"with " << mSize <<
" samples:\n";
354 os <<
"==============================================================\n";
355 os <<
"|| # | Min | Max | Frequency | % ||\n";
356 os <<
"==============================================================\n";
357 for (
int i = 0, e =
int(mBins.size()); i != e; ++i) {
358 os <<
"|| " << std::setw(4) << i <<
" | " << std::setw(14) << this->
min(i) <<
" | "
359 << std::setw(14) << this->
max(i) <<
" | " << std::setw(9) << mBins[i] <<
" | "
360 << std::setw(3) << (100*mBins[i]/mSize) <<
" ||\n";
362 os <<
"==============================================================\n";
364 os <<
": no samples were added." << std::endl;
371 double mMin, mMax, mDelta;
372 std::vector<uint64_t> mBins;
379 #endif // OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
double stdDev() const
Return the standard deviation (=Sqrt(variance)) as defined from the (biased) population variance...
vfloat4 sqrt(const vfloat4 &a)
bool add(const Histogram &other)
Add all the contributions from the other histogram, provided that it has the same configuration as th...
#define OPENVDB_USE_VERSION_NAMESPACE
void add(const Extrema &other)
Add the samples from the other Stats instance.
void add(const ValueType &val, const Less &less=Less())
Add a single sample.
void print(const std::string &name="", std::ostream &strm=std::cout) const
Print the histogram to the specified output stream.
uint64_t size() const
Return the population size, i.e., the total number of samples.
void add(const MinMax &other, const Less &less=Less())
Add the samples from the other Stats instance.
#define OPENVDB_ASSERT(X)
uint64_t count(int n) const
Return the number of samples in the nth bin.
double mean() const
Return the arithmetic mean, i.e. average, value.
bool isApproxEqual(const Type &a, const Type &b, const Type &tolerance)
Return true if a is equal to b to within the given tolerance.
double min(int n) const
Return the minimum value in the nth bin.
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
size_t numBins() const
Return the number of bins in this histogram.
double variance() const
Return the population variance.
double max(int n) const
Return the maximum value in the nth bin.
void join(const Extrema &other)
const ValueType & max() const
Return the maximum value.
double range() const
Return the range defined as the maximum value minus the minimum value.
This class computes statistics (minimum value, maximum value, mean, variance and standard deviation) ...
void add(double val)
Add a single sample.
double avg() const
Return the arithmetic mean, i.e. average, value.
GLuint const GLchar * name
uint64_t size() const
Return the size of the population, i.e., the total number of samples.
Templated class to compute the minimum and maximum values.
void print(const std::string &name="", std::ostream &strm=std::cout, int precision=3) const
Print statistics to the specified output stream.
MinMax(const ValueType &min, const ValueType &max)
Constructor.
void add(double val, uint64_t n)
Add n samples with constant value val.
double min() const
Return the minimum value.
double min() const
Return the lower bound of this histogram's value range.
MinMax()
Empty constructor.
GLenum GLint GLint * precision
This class computes a histogram, with a fixed interval width, of a population of floating-point value...
Library and file format version numbers.
void add(double val, uint64_t n)
Add n samples with constant value val.
void add(const Stats &other)
Add the samples from the other Stats instance.
double var() const
Return the population variance.
const ValueType & min() const
Return the minimum value.
void print(const std::string &name="", std::ostream &strm=std::cout, int precision=3) const
Print MinMax to the specified output stream.
void print(const std::string &name="", std::ostream &strm=std::cout, int precision=3) const
Print extrema to the specified output stream.
double max() const
Return the upper bound of this histogram's value range.
Histogram(const Stats &s, size_t numBins=10)
Construct with the given bin count and with minimum and maximum values taken from a Stats object...
Histogram(double min, double max, size_t numBins=10)
Construct with given minimum and maximum values and the given bin count.
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
bool add(double val, uint64_t n=1)
Add n samples with constant value val, provided that the val falls within this histogram's value rang...
double max() const
Return the maximum value.
double std() const
Return the standard deviation (=Sqrt(variance)) as defined from the (biased) population variance...
void add(double val)
Add a single sample.
#define OPENVDB_THROW(exception, message)
This class computes the minimum and maximum values of a population of floating-point values...