00001 //========================================================================== 00002 // CSTAT.H - header for 00003 // OMNeT++ 00004 // Discrete System Simulation in C++ 00005 // 00006 // 00007 // Declaration of the following classes: 00008 // cStatistic : base for statistics 00009 // cStdDev : collects min, max, mean, standard deviation 00010 // 00011 //========================================================================== 00012 00013 #ifndef __CSTAT_H 00014 #define __CSTAT_H 00015 00016 #include <stdio.h> 00017 #include <iostream.h> 00018 #include "cobject.h" 00019 00020 class cTransientDetection; 00021 class cAccuracyDetection; 00022 00023 //========================================================================== 00024 00035 class SIM_API cStatistic : public cObject 00036 { 00037 public: 00038 cTransientDetection *td; // ptr to associated object 00039 cAccuracyDetection *ra; // ptr to associated object 00040 int genk; // index of random number generator to use 00041 00042 protected: 00043 00044 // internal: utility function for implementing loadFromFile() functions 00045 void freadvarsf (FILE *f, const char *fmt, ...); 00046 00047 public: 00050 00054 cStatistic(const cStatistic& r); 00055 00059 explicit cStatistic(const char *name=NULL); 00060 00064 virtual ~cStatistic() {} 00065 00070 cStatistic& operator=(const cStatistic& res); 00072 00075 00079 virtual const char *className() const {return "cStatistic";} 00080 00081 /* Note: No dup() because this is an abstract class! */ 00082 00087 virtual const char *inspectorFactoryName() const {return "cStatisticIFC";} 00088 00094 virtual int netPack(); 00095 00101 virtual int netUnpack(); 00103 00106 00111 virtual void collect(double val) = 0; 00112 00116 virtual void collect2(double val, double weight); 00117 00121 void operator+= (double val) {collect(val);} 00122 00128 virtual void clearResult() = 0; 00130 00133 00138 virtual long samples() const = 0; 00139 00144 virtual double weights() const = 0; 00145 00150 virtual double sum() const = 0; 00151 00156 virtual double sqrSum() const = 0; 00157 00162 virtual double min() const = 0; 00163 00168 virtual double max() const = 0; 00169 00174 virtual double mean() const = 0; 00175 00180 virtual double stddev() const = 0; 00181 00186 virtual double variance() const = 0; 00188 00191 00196 void addTransientDetection(cTransientDetection *object); 00197 00202 void addAccuracyDetection(cAccuracyDetection *object); 00203 00207 cTransientDetection *transientDetectionObject() const {return td;} 00208 00212 cAccuracyDetection *accuracyDetectionObject() const {return ra;} 00214 00217 00223 void setGenK(int gen_nr) {genk=gen_nr;} 00224 00229 virtual double random() const = 0; 00231 00234 00239 virtual void saveToFile(FILE *) const = 0; 00240 00245 virtual void loadFromFile(FILE *) = 0; 00247 }; 00248 00249 //========================================================================== 00250 00256 class SIM_API cStdDev : public cStatistic 00257 { 00258 protected: 00259 long num_samples; 00260 double min_samples,max_samples; 00261 double sum_samples,sqrsum_samples; 00262 00263 public: 00266 00270 cStdDev(const cStdDev& r) : cStatistic(r) {setName(r.name());operator=(r);} 00271 00275 explicit cStdDev(const char *name=NULL); 00276 00280 virtual ~cStdDev() {} 00281 00285 cStdDev& operator=(const cStdDev& res); 00287 00290 00294 virtual const char *className() const {return "cStdDev";} 00295 00300 virtual cObject *dup() const {return new cStdDev(*this);} 00301 00306 virtual void info(char *buf); 00307 00312 virtual void writeContents(ostream& os); 00313 00319 virtual int netPack(); 00320 00326 virtual int netUnpack(); 00328 00331 00335 virtual void collect(double val); 00336 00340 virtual long samples() const {return num_samples;} 00341 00345 virtual double weights() const {return num_samples;} 00346 00350 virtual double sum() const {return sum_samples;} 00351 00355 virtual double sqrSum() const {return sqrsum_samples;} 00356 00360 virtual double min() const {return min_samples;} 00361 00365 virtual double max() const {return max_samples;} 00366 00370 virtual double mean() const {return num_samples ? sum_samples/num_samples : 0.0;} 00371 00375 virtual double stddev() const; 00376 00380 virtual double variance() const; 00381 00386 virtual double random() const; 00387 00391 virtual void clearResult(); 00392 00396 virtual void saveToFile(FILE *) const; 00397 00402 virtual void loadFromFile(FILE *); 00404 }; 00405 00406 //========================================================================== 00407 00414 class SIM_API cWeightedStdDev : public cStdDev 00415 { 00416 protected: 00417 double sum_weights; 00418 00419 public: 00422 00426 cWeightedStdDev(const cWeightedStdDev& r) : cStdDev(r) {setName(r.name());operator=(r);} 00427 00431 explicit cWeightedStdDev(const char *name=NULL) : cStdDev(name) {sum_weights=0;} 00432 00436 virtual ~cWeightedStdDev() {} 00437 00441 cWeightedStdDev& operator=(const cWeightedStdDev& res); 00443 00446 00450 virtual const char *className() const {return "cWeightedStdDev";} 00451 00456 virtual cObject *dup() const {return new cWeightedStdDev(*this);} 00457 00463 virtual int netPack(); 00464 00470 virtual int netUnpack(); 00472 00475 00479 virtual void collect(double val) {collect2(val,1.0);} 00480 00484 virtual void collect2(double val, double weight); 00485 00489 virtual void clearResult(); 00490 00494 virtual double weights() const {return sum_weights;} 00495 00499 virtual double mean() const {return sum_weights!=0 ? sum_samples/sum_weights : 0.0;} 00500 00504 virtual double variance() const; 00505 00509 virtual void saveToFile(FILE *) const; 00510 00514 virtual void loadFromFile(FILE *); 00516 }; 00517 00518 #endif 00519