10 #ifndef OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
11 #define OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED
29 template <
typename ValueType,
typename Less = std::less<ValueType> >
32 using Limits = std::numeric_limits<ValueType>;
40 static_assert(std::numeric_limits<ValueType>::is_specialized,
41 "openvdb::math::MinMax default constructor requires a std::numeric_limits specialization");
53 inline void add(
const ValueType &
val,
const Less &
less = Less())
60 inline const ValueType&
min()
const {
return mMin; }
63 inline const ValueType&
max()
const {
return mMax; }
77 std::ostringstream os;
78 os << std::setprecision(
precision) << std::setiosflags(std::ios::fixed);
80 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
81 os <<
" Min=" <<
mMin <<
", Max=" <<
mMax << std::endl;
100 ,
mMin(std::numeric_limits<double>::
max())
114 void add(
double val, uint64_t
n)
144 std::ostringstream os;
145 os << std::setprecision(
precision) << std::setiosflags(std::ios::fixed);
147 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
149 os <<
"with " <<
mSize <<
" samples:\n"
152 <<
", Range="<< this->
range() << std::endl;
154 os <<
": no samples were added." << std::endl;
163 assert(other.
mSize > 0);
196 const double delta = val -
mAvg;
197 mAvg += delta/double(
mSize);
202 void add(
double val, uint64_t
n)
204 const double denom = 1.0/double(
mSize + n);
205 const double delta = val -
mAvg;
206 mAvg += denom * delta * double(n);
207 mAux += denom * delta * delta * double(
mSize) * double(n);
214 if (other.
mSize > 0) {
215 const double denom = 1.0/double(
mSize + other.
mSize);
216 const double delta = other.
mAvg -
mAvg;
217 mAvg += denom * delta * double(other.
mSize);
249 std::ostringstream os;
250 os << std::setprecision(
precision) << std::setiosflags(std::ios::fixed);
252 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
254 os <<
"with " <<
mSize <<
" samples:\n"
258 <<
", Std=" << this->
stdDev()
259 <<
", Var=" << this->
variance() << std::endl;
261 os <<
": no samples were added." << std::endl;
284 : mSize(0), mMin(min), mMax(max + 1e-10),
287 if ( mMax <= mMin ) {
290 OPENVDB_THROW(ValueError,
"Histogram: expected at least one bin");
292 for (
size_t i=0; i<
numBins; ++i) mBins[i]=0;
298 mSize(0), mMin(s.
min()), mMax(s.
max()+1e-10),
301 if ( mMax <= mMin ) {
304 OPENVDB_THROW(ValueError,
"Histogram: expected at least one bin");
306 for (
size_t i=0; i<
numBins; ++i) mBins[i]=0;
312 inline bool add(
double val, uint64_t
n = 1)
315 mBins[size_t(mDelta*(val-mMin))] +=
n;
325 mBins.size() != other.mBins.size())
return false;
326 for (
size_t i=0, e=mBins.size(); i!=e; ++i) mBins[i] += other.mBins[i];
327 mSize += other.mSize;
332 inline size_t numBins()
const {
return mBins.size(); }
334 inline double min()
const {
return mMin; }
336 inline double max()
const {
return mMax; }
338 inline double min(
int n)
const {
return mMin+n/mDelta; }
340 inline double max(
int n)
const {
return mMin+(n+1)/mDelta; }
342 inline uint64_t
count(
int n)
const {
return mBins[
n]; }
344 inline uint64_t
size()
const {
return mSize; }
351 std::ostringstream os;
352 os << std::setprecision(6) << std::setiosflags(std::ios::fixed) << std::endl;
354 if (!
name.empty()) os <<
"for \"" <<
name <<
"\" ";
356 os <<
"with " << mSize <<
" samples:\n";
357 os <<
"==============================================================\n";
358 os <<
"|| # | Min | Max | Frequency | % ||\n";
359 os <<
"==============================================================\n";
360 for (
int i = 0, e =
int(mBins.size()); i != e; ++i) {
361 os <<
"|| " << std::setw(4) << i <<
" | " << std::setw(14) << this->
min(i) <<
" | "
362 << std::setw(14) << this->
max(i) <<
" | " << std::setw(9) << mBins[i] <<
" | "
363 << std::setw(3) << (100*mBins[i]/mSize) <<
" ||\n";
365 os <<
"==============================================================\n";
367 os <<
": no samples were added." << std::endl;
374 double mMin, mMax, mDelta;
375 std::vector<uint64_t> mBins;
382 #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.
GLuint const GLchar * name
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.
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)
GLsizei const GLchar *const * string
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.
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...