19 #define mUndefReplacement 0 43 , needvariance_(false)
44 , needmostfreq_(false) {}
46 CalcSetup& require(
Type);
48 static int medianEvenHandling();
107 inline double getValue(
Type)
const;
108 inline int getIndex(
Type)
const;
110 inline bool hasUndefs()
const {
return nrused_ != nradded_; }
111 inline int size(
bool used=
true )
const 112 {
return used ? nrused_ : nradded_; }
114 inline bool isEmpty()
const {
return size() == 0; }
116 inline int count()
const {
return nrused_; }
117 inline double average()
const;
118 inline T mostFreq()
const;
119 inline T sum()
const;
120 inline T min(
int* index_of_min=0)
const;
121 inline T max(
int* index_of_max=0)
const;
122 inline T extreme(
int* index_of_extr=0)
const;
123 inline T median(
int* index_of_median=0)
const;
124 inline T sqSum()
const;
125 inline double rms()
const;
126 inline double stdDev()
const;
127 inline double normvariance()
const;
128 virtual inline double variance()
const;
130 inline T clipVal(
float ratio,
bool upper)
const;
137 : setup_(s) {
clear(); }
157 inline bool isZero(
const T& t )
const;
171 template <
class T>
inline 194 inline RunCalc<T>& addValue(T data,T weight=1);
195 inline RunCalc<T>& addValues(
int sz,
const T* data,
const T* weights=0);
196 inline RunCalc<T>& replaceValue(T olddata,T newdata,T wt=1);
197 inline RunCalc<T>& removeValue(T data,T weight=1);
199 inline RunCalc<T>& operator +=( T t ) {
return addValue(t); }
205 inline void setMostFrequent(T val,T wt);
240 , wts_(calc_.isWeighted() ? new T [sz] : 0)
241 , vals_(new T [sz]) {
clear(); }
243 {
delete [] vals_;
delete [] wts_; }
246 inline WindowedCalc& addValue(T data,T weight=1);
247 inline WindowedCalc& operator +=( T t ) {
return addValue(t); }
249 inline int getIndex(
Type)
const;
251 inline double getValue(
Type)
const;
253 inline T
count()
const {
return full_ ? sz_ : posidx_; }
255 # define mRunCalc_DefEqFn(ret,fn) \ 256 inline ret fn() const { return calc_.fn(); } 265 # undef mRunCalc_DefEqFn 267 inline T min(
int* i=0)
const;
268 inline T max(
int* i=0)
const;
269 inline T extreme(
int* i=0)
const;
270 inline T median(
int* i=0)
const;
288 template <
class T>
inline 291 sum_x_ = sum_w_ = sum_xx_ = sum_wx_ = sum_wxx_ = 0;
292 nradded_ = nrused_ = minidx_ = maxidx_ = 0;
293 minval_ = maxval_ =
mUdf(T);
294 clss_.erase(); clsswt_.erase(); medvals_.erase(); medwts_.erase();
298 template <
class T>
inline 303 case Count:
return count();
304 case Average:
return average();
305 case Median:
return median();
306 case RMS:
return rms();
307 case StdDev:
return stdDev();
310 case Min:
return min();
311 case Max:
return max();
312 case Extreme:
return extreme();
313 case Sum:
return sum();
314 case SqSum:
return sqSum();
322 template <
class T>
inline 328 case Min: (void)min( &ret );
break;
329 case Max: (void)max( &ret );
break;
330 case Extreme: (void)extreme( &ret );
break;
331 case Median: (void)median( &ret );
break;
332 default: ret = 0;
break;
339 #undef mBaseCalc_ChkEmpty 340 #define mBaseCalc_ChkEmpty(typ) \ 341 if ( nrused_ < 1 ) return mUdf(typ); 358 if ( !setup_.weighted_ )
359 return ((
double)sum_x_) / nrused_;
361 return this->isZero(sum_w_) ?
mUdf(
double) : ((double)sum_wx_) / sum_w_;
386 if ( !setup_.weighted_ )
387 return Math::Sqrt( ((
double)sum_xx_) / nrused_ );
389 return this->isZero(sum_w_) ?
mUdf(
double)
397 if ( nrused_ < 2 )
return 0;
399 if ( !setup_.weighted_ )
400 return ( sum_xx_ - (sum_x_ * ((
double)sum_x_) / nrused_) )
403 return (sum_wxx_ - (sum_wx_ * ((
double)sum_wx_) / sum_w_) )
404 / ( (nrused_-1) * ((double)sum_w_) / nrused_ );
411 pErrMsg(
"Undefined operation for float_complex in template");
419 if ( nrused_ < 2 )
return 0;
422 double avg = average();
424 const double divisor = avg*avg + fact*var;
428 return var / divisor;
435 if ( index_of_min ) *index_of_min = minidx_;
444 if ( index_of_max ) *index_of_max = maxidx_;
453 if ( index_of_extr ) *index_of_extr = 0;
456 const T maxcmp = maxval_ < 0 ? -maxval_ : maxval_;
457 const T mincmp = minval_ < 0 ? -minval_ : minval_;
458 if ( maxcmp < mincmp )
460 if ( index_of_extr ) *index_of_extr = minidx_;
465 if ( index_of_extr ) *index_of_extr = maxidx_;
476 const int lastidx = medvals_.size();
477 const float fidx = ratio * lastidx;
478 const int idx = fidx <= 0 ? 0 : (fidx > lastidx ? lastidx : (int)fidx);
479 return medvals_[upper ? lastidx - idx : idx];
486 if ( clss_.isEmpty() )
489 T maxwt = clsswt_[0];
int ret = clss_[0];
490 for (
int idx=1; idx<clss_.size(); idx++ )
492 if ( clsswt_[idx] > maxwt )
493 { maxwt = clsswt_[idx]; ret = clss_[idx]; }
505 template <
class T>
inline 508 if ( idx_of_med ) *idx_of_med = 0;
510 return sz < 1 ?
mUdf(T) : data[0];
513 T* valarr =
const_cast<T*
>( data );
520 *idx_of_med = idxs[ mididx ];
527 return (data[mididx] + data[mididx-1]) / 2;
532 return data[ mididx ];
536 template <
class T>
inline 540 if ( idx_of_med ) *idx_of_med = 0;
542 return sz < 1 ?
mUdf(T) : data[0];
544 T* valarr =
const_cast<T*
>( data );
547 T* wtcopy =
new T[sz];
548 OD::memCopy( wtcopy, wts, sz*
sizeof(T) );
550 for (
int idx=0; idx<sz; idx++ )
552 const_cast<T&
>(wts[idx]) = wtcopy[ idxs[idx] ];
553 wsum += (float) wts[idx];
557 const float hwsum = wsum * 0.5f;
560 for (
int idx=0; idx<sz; idx++ )
562 wsum += (float) wts[idx];
564 { medidx = idx;
break; }
566 if ( idx_of_med ) *idx_of_med = medidx;
567 return valarr[ medidx ];
574 const int policy = setup_.medianEvenHandling();
575 const int sz = medvals_.size();
576 const T* vals = medvals_.arr();
577 return setup_.weighted_ ?
585 template <
class T>
inline 591 if ( setup_.weighted_ && (
mIsUdf(wt) || this->isZero(wt)) )
594 if ( setup_.needmed_ )
597 if ( setup_.weighted_ )
601 if ( setup_.needextreme_ )
604 minval_ = maxval_ = val;
607 if ( val < minval_ ) { minval_ = val; minidx_ = nradded_ - 1; }
608 if ( val > maxval_ ) { maxval_ = val; maxidx_ = nradded_ - 1; }
612 if ( setup_.needmostfreq_ )
613 setMostFrequent( val, wt );
615 if ( setup_.needsums_ )
618 sum_xx_ += val * val;
619 if ( setup_.weighted_ )
623 sum_wxx_ += wt * val * val;
632 template <
class T>
inline 636 int setidx = clss_.indexOf( ival );
639 { clss_ += ival; clsswt_ += wt; }
641 clsswt_[setidx] += wt;
648 {
pErrMsg(
"Undefined operation for float_complex in template"); }
651 template <
class T>
inline 657 if ( setup_.weighted_ && (
mIsUdf(wt) || this->isZero(wt)) )
660 if ( setup_.needmed_ )
662 int idx = medvals_.size();
665 idx = medvals_.indexOf( val,
false, idx-1 );
666 if ( idx < 0 )
break;
667 if ( setup_.weighted_ && medwts_[idx] == wt )
669 medvals_.removeSingle( idx );
670 medwts_.removeSingle( idx );
676 if ( setup_.needmostfreq_ )
679 int setidx = clss_.indexOf( ival );
681 if ( setup_.weighted_ )
686 clsswt_[setidx] -= wt;
687 if ( clsswt_[setidx] <= 0 )
689 clss_.removeSingle( setidx );
690 clsswt_.removeSingle( setidx );
695 if ( setup_.needsums_ )
698 sum_xx_ -= val * val;
699 if ( setup_.weighted_ )
703 sum_wxx_ -= wt * val * val;
712 template <
class T>
inline 715 for (
int idx=0; idx<sz; idx++ )
716 addValue( data[idx], weights ? weights[idx] : 1 );
721 template <
class T>
inline 724 removeValue( oldval, wt );
725 return addValue( newval, wt );
731 template <
class T>
inline 734 posidx_ = 0; empty_ =
true; full_ =
false;
735 needcalc_ = calc_.setup().needSums() || calc_.setup().needMostFreq();
740 template <
class T>
inline 743 if ( empty_ )
return;
745 const int stopidx = full_ ? sz_ : posidx_;
746 for (
int idx=posidx_; idx<stopidx; idx++ )
747 calc.
addValue( vals_[idx], wts_ ? wts_[idx] : 1 );
748 for (
int idx=0; idx<posidx_; idx++ )
749 calc.
addValue( vals_[idx], wts_ ? wts_[idx] : 1 );
753 template <
class T>
inline 758 case Min:
return min();
759 case Max:
return max();
760 case Extreme:
return extreme();
761 case Median:
return median();
764 return calc_.getValue( t );
768 template <
class T>
inline 774 case Min: (void)min( &ret );
break;
775 case Max: (void)max( &ret );
break;
776 case Extreme: (void)extreme( &ret );
break;
777 case Median: (void)median( &ret );
break;
778 default: ret = 0;
break;
784 template <
class T>
inline 789 return calc.
min( index_of_min );
793 template <
class T>
inline 798 return calc.
max( index_of_max );
802 template <
class T>
inline 807 return calc.
extreme( index_of_extr );
811 template <
class T>
inline 814 CalcSetup rcs( calc_.setup().weighted_ );
817 return calc.median( index_of_med );
830 if ( !wts_ || wt == wts_[posidx_] )
831 calc_.replaceValue( vals_[posidx_], val, wt );
834 calc_.removeValue( vals_[posidx_], wts_[posidx_] );
840 vals_[posidx_] = val;
841 if ( wts_ ) wts_[posidx_] = wt;
844 if ( posidx_ >= sz_ )
845 { full_ =
true; posidx_ = 0; }
851 #undef mRunCalc_ChkEmpty bool needextreme_
Definition: statruncalc.h:69
Definition: stattype.h:25
#define mExpClass(module)
Definition: commondefs.h:157
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
T maxval_
Definition: statruncalc.h:146
#define mGetIdxArr(tp, var, sz)
Creates new array of an integer type filled with index.
Definition: commondefs.h:256
BaseCalc(const CalcSetup &s)
Definition: statruncalc.h:136
T median(int *i=0) const
Definition: statruncalc.h:812
bool needMedian() const
Definition: statruncalc.h:53
T count() const
Definition: statruncalc.h:253
#define mBaseCalc_ChkEmpty(typ)
Definition: statruncalc.h:340
int maxidx_
Definition: statruncalc.h:144
Setup for the Stats::RunCalc and Stats::ParallelCalc objects.
Definition: statruncalc.h:35
const CalcSetup & setup() const
Definition: statruncalc.h:104
Definition: stattype.h:25
int getIndex(Type) const
only for Median, Min and Max
Definition: statruncalc.h:323
bool needvariance_
Definition: statruncalc.h:73
T minval_
Definition: statruncalc.h:145
Definition: stattype.h:23
T sum() const
Definition: statruncalc.h:366
#define mIsZero(x, eps)
Definition: commondefs.h:55
double normvariance() const
Definition: statruncalc.h:417
RunCalc< T > & replaceValue(T olddata, T newdata, T wt=1)
Definition: statruncalc.h:722
void clear()
Definition: statruncalc.h:289
T * vals_
Definition: statruncalc.h:277
double getValue(Type) const
Definition: statruncalc.h:754
RunCalc< T > & removeValue(T data, T weight=1)
Definition: statruncalc.h:652
RunCalc< T > & addValues(int sz, const T *data, const T *weights=0)
Definition: statruncalc.h:713
int minidx_
Definition: statruncalc.h:143
bool isWeighted() const
Definition: statruncalc.h:50
RunCalc(const CalcSetup &s)
Definition: statruncalc.h:191
void clear()
Definition: statruncalc.h:732
int posidx_
Definition: statruncalc.h:278
void set(T &_to, const F &fr)
template based type conversion
Definition: convert.h:27
double getValue(Type) const
Definition: statruncalc.h:299
T computeWeightedMedian(const T *data, const T *wts, int sz, int *idx_of_med)
Definition: statruncalc.h:537
TypeSet< int > clss_
Definition: statruncalc.h:153
T max(int *index_of_max=0) const
Definition: statruncalc.h:442
RunCalc< T > & addValue(T data, T weight=1)
Definition: statruncalc.h:586
Definition: stattype.h:24
Stats computation running in parallel.
Definition: statparallelcalc.h:31
T median(int *index_of_median=0) const
Definition: statruncalc.h:572
bool needVariance() const
Definition: statruncalc.h:55
int nrused_
Definition: statruncalc.h:142
float variance(const X &x, int sz)
Definition: simpnumer.h:286
virtual double variance() const
Definition: statruncalc.h:395
Type
Definition: stattype.h:19
bool needExtreme() const
Definition: statruncalc.h:51
void quickSort(T *arr, I sz)
Definition: sorting.h:257
bool needSums() const
Definition: statruncalc.h:52
int getIndex(Type) const
Only use for Min, Max or Median.
Definition: statruncalc.h:769
int count() const
Definition: statruncalc.h:116
bool needcalc_
Definition: statruncalc.h:281
TypeSet< T > clsswt_
Definition: statruncalc.h:154
void setMostFrequent(T val, T wt)
Definition: statruncalc.h:633
bool needmed_
Definition: statruncalc.h:71
bool isEmpty() const
Definition: statruncalc.h:114
Set of (small) copyable elements.
Definition: commontypes.h:26
Definition: stattype.h:24
bool needMostFreq() const
Definition: statruncalc.h:54
T sum_xx_
Definition: statruncalc.h:148
int nradded_
Definition: statruncalc.h:141
T computeMedian(const T *data, int sz, int pol, int *idx_of_med)
Definition: statruncalc.h:506
T * wts_
Definition: statruncalc.h:276
int size(bool used=true) const
Definition: statruncalc.h:111
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
T mostFreq() const
Definition: statruncalc.h:484
WindowedCalc(const CalcSetup &rcs, int sz)
Definition: statruncalc.h:237
T min(int *i=0) const
Definition: statruncalc.h:785
Definition: stattype.h:22
Definition: stattype.h:26
std::complex< float > float_complex
Definition: odcomplex.h:16
TypeSet< T > medvals_
Definition: statruncalc.h:133
RunCalc manager which buffers a part of the data.
Definition: statruncalc.h:234
T extreme(int *i=0) const
Definition: statruncalc.h:803
Definition: stattype.h:22
bool empty_
Definition: statruncalc.h:279
T extreme(int *index_of_extr=0) const
Definition: statruncalc.h:451
#define mDefEps
Definition: commondefs.h:60
Definition: stattype.h:23
~WindowedCalc()
Definition: statruncalc.h:242
double rms() const
Definition: statruncalc.h:382
bool weighted_
Definition: statruncalc.h:68
double stdDev() const
Definition: statruncalc.h:344
bool hasUndefs() const
Definition: statruncalc.h:110
CalcSetup(bool weighted=false)
Definition: statruncalc.h:38
Calculates mean, min, max etc., as running values.
Definition: statruncalc.h:188
void fillCalc(RunCalc< T > &) const
Definition: statruncalc.h:741
T clipVal(float ratio, bool upper) const
require median; 0 <= ratio <= 1
Definition: statruncalc.h:472
T sum_wx_
Definition: statruncalc.h:150
Definition: stattype.h:23
Base class to calculate mean, min, max, etc.. can be used either as running values (Stats::RunCalc) o...
Definition: statruncalc.h:97
virtual ~BaseCalc()
Definition: statruncalc.h:101
bool full_
Definition: statruncalc.h:280
Statistics.
Definition: array2dinterpol.h:27
T min(int *index_of_min=0) const
Definition: statruncalc.h:433
#define mRunCalc_DefEqFn(ret, fn)
Definition: statruncalc.h:255
Definition: stattype.h:21
const int sz_
Definition: statruncalc.h:275
T sum_x_
Definition: statruncalc.h:147
T sum_wxx_
Definition: statruncalc.h:151
T sum_w_
Definition: statruncalc.h:149
RunCalc< T > calc_
Definition: statruncalc.h:274
T sqSum() const
Definition: statruncalc.h:374
Definition: stattype.h:22
bool needsums_
Definition: statruncalc.h:70
CalcSetup setup_
Definition: statruncalc.h:139
double average() const
Definition: statruncalc.h:354
#define mClass(module)
Definition: commondefs.h:161
Definition: stattype.h:24
#define pErrMsg(msg)
Usual access point for programmer error messages.
Definition: errmsg.h:34
bool isZero(const T &t) const
Definition: statruncalc.h:172
T max(int *i=0) const
Definition: statruncalc.h:794
bool isWeighted() const
Definition: statruncalc.h:105
bool needmostfreq_
Definition: statruncalc.h:72
TypeSet< T > medwts_
Definition: statruncalc.h:155
WindowedCalc & addValue(T data, T weight=1)
Definition: statruncalc.h:822