00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CSTDDEV_H
00022 #define __CSTDDEV_H
00023
00024 #include <stdio.h>
00025 #include "cstatistic.h"
00026
00027 NAMESPACE_BEGIN
00028
00034 class SIM_API cStdDev : public cStatistic
00035 {
00036 protected:
00037 long num_vals;
00038 double min_vals, max_vals;
00039 double sum_vals, sqrsum_vals;
00040
00041 private:
00042 void copy(const cStdDev& other);
00043
00044 protected:
00045 void doMerge(const cStatistic *other);
00046
00047 public:
00050
00054 cStdDev(const cStdDev& r) : cStatistic(r) {copy(r);}
00055
00059 explicit cStdDev(const char *name=NULL);
00060
00064 virtual ~cStdDev() {}
00065
00069 cStdDev& operator=(const cStdDev& res);
00071
00074
00079 virtual cStdDev *dup() const {return new cStdDev(*this);}
00080
00085 virtual std::string info() const;
00086
00091 virtual std::string detailedInfo() const;
00092
00098 virtual void parsimPack(cCommBuffer *buffer);
00099
00105 virtual void parsimUnpack(cCommBuffer *buffer);
00107
00110
00114 virtual void collect(double value);
00115
00119 virtual void collect(SimTime value) {collect(value.dbl());}
00120
00127 virtual void merge(const cStatistic *other);
00128
00132 virtual bool isWeighted() const {return false;}
00133
00137 virtual long getCount() const {return num_vals;}
00138
00142 virtual double getSum() const {return sum_vals;}
00143
00147 virtual double getSqrSum() const {return sqrsum_vals;}
00148
00152 virtual double getMin() const {return min_vals;}
00153
00157 virtual double getMax() const {return max_vals;}
00158
00163 virtual double getMean() const {return num_vals==0 ? 0 : sum_vals/num_vals;}
00164
00168 virtual double getStddev() const;
00169
00173 virtual double getVariance() const;
00174
00178 virtual double getWeights() const {return getCount();}
00179
00184 virtual double getWeightedSum() const {return getSum();}
00185
00190 virtual double getSqrSumWeights() const {return getCount();}
00191
00196 virtual double getWeightedSqrSum() const {return getSqrSum();}
00197
00202 virtual double random() const;
00203
00207 virtual void clearResult();
00208
00212 virtual void saveToFile(FILE *) const;
00213
00218 virtual void loadFromFile(FILE *);
00220 };
00221
00222
00223
00230 class SIM_API cWeightedStdDev : public cStdDev
00231 {
00232 protected:
00233 double sum_weights;
00234 double sum_weighted_vals;
00235 double sum_squared_weights;
00236 double sum_weights_squared_vals;
00237
00238 private:
00239 void copy(const cWeightedStdDev& other);
00240
00241 public:
00244
00248 cWeightedStdDev(const cWeightedStdDev& r) : cStdDev(r) {copy(r);}
00249
00253 explicit cWeightedStdDev(const char *name=NULL) : cStdDev(name) {sum_weights=sum_weighted_vals=sum_squared_weights=sum_weights_squared_vals=0.0;}
00254
00258 virtual ~cWeightedStdDev() {}
00259
00263 cWeightedStdDev& operator=(const cWeightedStdDev& res);
00265
00268
00273 virtual cWeightedStdDev *dup() const {return new cWeightedStdDev(*this);}
00274
00279 virtual std::string info() const;
00280
00286 virtual void parsimPack(cCommBuffer *buffer);
00287
00293 virtual void parsimUnpack(cCommBuffer *buffer);
00295
00298
00302 virtual void collect(double value) {collect2(value,1.0);}
00303
00307 virtual void collect(SimTime value) {collect(value.dbl());}
00308
00312 virtual bool isWeighted() const {return true;}
00313
00317 virtual void collect2(double value, double weight);
00318
00322 virtual void collect2(SimTime value, double weight) {collect2(value.dbl(), weight);}
00323
00327 virtual void collect2(double value, SimTime weight) {collect2(value, weight.dbl());}
00328
00332 virtual void collect2(SimTime value, SimTime weight) {collect2(value.dbl(), weight.dbl());}
00333
00339 virtual void merge(const cStatistic *other);
00340
00344 virtual void clearResult();
00345
00350 virtual double getMean() const {return sum_weights==0 ? 0 : sum_weighted_vals / sum_weights;}
00351
00355 virtual double getVariance() const;
00356
00360 virtual double getWeights() const {return sum_weights;}
00361
00365 virtual double getWeightedSum() const {return sum_weighted_vals;}
00366
00370 virtual double getSqrSumWeights() const {return sum_squared_weights;}
00371
00375 virtual double getWeightedSqrSum() const {return sum_weights_squared_vals;}
00376
00380 virtual void saveToFile(FILE *) const;
00381
00385 virtual void loadFromFile(FILE *);
00387 };
00388
00389 NAMESPACE_END
00390
00391 #endif
00392