chistogramstrategy.h Source File

API: chistogramstrategy.h Source File
API
chistogramstrategy.h
1//==========================================================================
2// CHISTOGRAMSTRATEGY.H - part of
3// OMNeT++/OMNEST
4// Discrete System Simulation in C++
5//
6//==========================================================================
7
8/*--------------------------------------------------------------*
9 Copyright (C) 1992-2017 Andras Varga
10 Copyright (C) 2006-2017 OpenSim Ltd.
11
12 This file is distributed WITHOUT ANY WARRANTY. See the file
13 `license' for details on this and other legal matters.
14*--------------------------------------------------------------*/
15
16#ifndef __OMNETPP_CHISTOGRAMSTRATEGY_H
17#define __OMNETPP_CHISTOGRAMSTRATEGY_H
18
19#include <omnetpp/chistogram.h>
20
21namespace omnetpp {
22
29class SIM_API cIHistogramStrategy : public cObject
30{
31 friend class cHistogram;
32 public:
33 typedef enum cHistogram::Mode Mode;
34
35 protected:
36 cHistogram *hist = nullptr; // backreference to "owner"
37
38 public:
41 cIHistogramStrategy() {}
42 cIHistogramStrategy(const cIHistogramStrategy& other) {}
43 cIHistogramStrategy& operator=(const cIHistogramStrategy& other) {hist=nullptr; return *this;}
45
48
52 void setHistogram(cHistogram *hist);
53
57 cHistogram *getHistogram() const {return hist;}
59
62
67 virtual void collect(double value) = 0;
68
74 virtual void collectWeighted(double value, double weight) = 0;
75
82 virtual void setUpBins() = 0;
83
88 virtual void clear() = 0;
90};
91
105class SIM_API cFixedRangeHistogramStrategy : public cIHistogramStrategy
106{
107 protected:
108 double lo = NAN;
109 double hi = NAN;
110 int numBins = -1;
111 Mode mode = cHistogram::MODE_REALS; // may not be AUTO
112
113 private:
114 void copy(const cFixedRangeHistogramStrategy& other);
115
116 public:
119 cFixedRangeHistogramStrategy() {} // must be configured using setter methods
120 cFixedRangeHistogramStrategy(double lo, double hi, int numBins, Mode mode=cHistogram::MODE_REALS) :
121 lo(lo), hi(hi), numBins(numBins), mode(mode) {}
122 cFixedRangeHistogramStrategy(const cFixedRangeHistogramStrategy& other): cIHistogramStrategy(other) {copy(other);}
123 cFixedRangeHistogramStrategy& operator=(const cFixedRangeHistogramStrategy& other);
124 virtual cFixedRangeHistogramStrategy *dup() const override {return new cFixedRangeHistogramStrategy(*this);}
126
129 void setRange(double lo, double hi) {this->lo = lo; this->hi = hi;}
130 double getUpperLimit() const {return hi;}
131 void setUpperLimit(double hi) {this->hi = hi;}
132 double getLowerLimit() const {return lo;}
133 void setLowerLimit(double lo) {this->lo = lo;}
134 Mode getMode() const {return mode;}
135 void setMode(Mode mode) {this->mode = mode;}
136 double getBinSize() const {return numBins;}
137 void setBinSize(double binSize) {this->numBins = binSize;}
139
142 virtual void collect(double value) override;
143 virtual void collectWeighted(double value, double weight) override;
144 virtual void setUpBins() override;
145 virtual void clear() override {}
147};
148
157class SIM_API cPrecollectionBasedHistogramStrategy : public cIHistogramStrategy
158{
159 protected:
160 bool inPrecollection = true;
161 size_t numToPrecollect = 1000;
162 size_t numToCollate = 10;
163 double lastRange = NAN;
164 int rangeUnchangedCounter = 0;
165 int rangeUnchangedThreshold = 50;
166 double finiteMinValue = NAN, finiteMaxValue = NAN; // have to keep track separate from cStdDev, ignoring infs
167 std::vector<double> values;
168 std::vector<double> weights; // same size as values[]
169
170 protected:
171 virtual void moveValuesIntoHistogram();
172 virtual bool precollect(double value, double weight=1.0); // true: precollection over
173 virtual void createBins() = 0;
174
175 private:
176 void copy(const cPrecollectionBasedHistogramStrategy& other);
177
178 public:
181 cPrecollectionBasedHistogramStrategy() {}
182 cPrecollectionBasedHistogramStrategy(const cPrecollectionBasedHistogramStrategy& other): cIHistogramStrategy(other) {copy(other);}
183 cPrecollectionBasedHistogramStrategy& operator=(const cPrecollectionBasedHistogramStrategy& other);
185
188 int getNumToPrecollect() const {return numToPrecollect;}
189 void setNumToPrecollect(int numToPrecollect) {this->numToPrecollect = numToPrecollect;}
190 int getNumToCollate() const {return numToCollate;}
191 void setNumToCollate(int numToCollate) {this->numToCollate = numToCollate;}
192 int getRangeUnchangedThreshold() const {return rangeUnchangedThreshold;}
193 void setRangeUnchangedThreshold(int threshold) {this->rangeUnchangedThreshold = threshold;}
195
198 virtual void setUpBins() override;
199 virtual void clear() override;
201};
202
222class SIM_API cDefaultHistogramStrategy : public cPrecollectionBasedHistogramStrategy
223{
224 private:
225 static const int DEFAULT_NUM_BINS = 60; // a number with many divisors
226 double rangeExtensionFactor = 1.5;
227 double binSize = NAN;
228 int numBinsHint = -1;
229 int targetNumBins = DEFAULT_NUM_BINS;
230 Mode mode = cHistogram::MODE_AUTO;
231 bool autoExtend = true;
232 bool binMerging = true;
233 int maxNumBins = 1000;
234
235 protected:
236 virtual void createBins() override;
237 virtual void extendBinsTo(double value);
238 virtual void reduceNumBinsTo(int numBins);
239 virtual void mergeAllBinsIntoOne(double newApproxBinSize);
240
241 private:
242 void copy(const cDefaultHistogramStrategy& other);
243
244 public:
247 explicit cDefaultHistogramStrategy(int numBinsHint=-1, Mode mode=cHistogram::MODE_AUTO) : numBinsHint(numBinsHint), mode(mode) {}
248 cDefaultHistogramStrategy(const cDefaultHistogramStrategy& other): cPrecollectionBasedHistogramStrategy(other) {copy(other);}
249 cDefaultHistogramStrategy& operator=(const cDefaultHistogramStrategy& other);
250 virtual cDefaultHistogramStrategy *dup() const override {return new cDefaultHistogramStrategy(*this);}
252
255 int getNumBinsHint() const {return numBinsHint;}
256 void setNumBinsHint(int numBins) {this->numBinsHint = numBins;}
258
261 virtual void collect(double value) override;
262 virtual void collectWeighted(double value, double weight) override;
265};
266
304class SIM_API cAutoRangeHistogramStrategy : public cPrecollectionBasedHistogramStrategy
305{
306 private:
307 static const int DEFAULT_NUM_BINS = 60; // a number with many divisors
308 double lo = NAN; // range lower limit; use NaN for unspecified
309 double hi = NAN; // range upper limit; use NaN for unspecified
310 double rangeExtensionFactor = 1.5;
311 int numBinsHint = -1;
312 int targetNumBins = DEFAULT_NUM_BINS;
313 double requestedBinSize = NAN; // user-given
314 double binSize = NAN; // actual (computed)
315 Mode mode = cHistogram::MODE_AUTO;
316 bool binSizeRounding = true;
317 bool autoExtend = true;
318 bool binMerging = true;
319 int maxNumBins = 1000;
320
321 protected:
322 virtual void createBins() override;
323 virtual void extendBinsTo(double value);
324 virtual void reduceNumBinsTo(int numBins);
325 virtual void mergeAllBinsIntoOne(double newApproxBinSize);
326
327 private:
328 void copy(const cAutoRangeHistogramStrategy& other);
329
330 public:
333 explicit cAutoRangeHistogramStrategy(Mode mode=cHistogram::MODE_AUTO) : mode(mode) {}
334 explicit cAutoRangeHistogramStrategy(int numBins, Mode mode=cHistogram::MODE_AUTO) : numBinsHint(numBins), mode(mode) {}
335 cAutoRangeHistogramStrategy(const cAutoRangeHistogramStrategy& other): cPrecollectionBasedHistogramStrategy(other) {copy(other);}
336 cAutoRangeHistogramStrategy& operator=(const cAutoRangeHistogramStrategy& other);
337 virtual cAutoRangeHistogramStrategy *dup() const override {return new cAutoRangeHistogramStrategy(*this);}
339
342 void setRangeHint(double lo, double hi) {this->lo = lo; this->hi = hi;}
343 double getUpperLimitHint() const {return hi;}
344 void setUpperLimitHint(double hi) {this->hi = hi;}
345 double getLowerLimitHint() const {return lo;}
346 void setLowerLimitHint(double lo) {this->lo = lo;}
347 double getRangeExtensionFactor() const {return rangeExtensionFactor;}
348 void setRangeExtensionFactor(double rangeExtensionFactor) {this->rangeExtensionFactor = rangeExtensionFactor;}
349 Mode getMode() const {return mode;}
350 void setMode(Mode mode) {this->mode = mode;}
351 double getBinSizeHint() const {return requestedBinSize;}
352 void setBinSizeHint(double binSize) {this->requestedBinSize = binSize;}
353 bool getBinSizeRounding() const {return binSizeRounding;}
354 void setBinSizeRounding(bool binSizeRounding) {this->binSizeRounding = binSizeRounding;}
355 int getNumBinsHint() const {return numBinsHint;}
356 void setNumBinsHint(int numBins) {this->numBinsHint = numBins;}
357 void setAutoExtend(bool enable) {this->autoExtend = enable;}
358 bool getAutoExtend() const {return autoExtend;}
359 void setBinMerging(bool enable) {this->binMerging = enable;}
360 bool getBinMerging() const {return binMerging;}
361 int getMaxNumBins() const {return maxNumBins;}
362 void setMaxNumBins(int numBins) {this->maxNumBins = numBins;}
364
367 virtual void collect(double value) override;
368 virtual void collectWeighted(double value, double weight) override;
369 virtual void clear() override;
371};
372
373} // namespace omnetpp
374
375
376#endif
377
378
379
virtual void collectWeighted(double value, double weight) override
virtual void collect(double value) override
virtual cAutoRangeHistogramStrategy * dup() const override
Definition chistogramstrategy.h:337
virtual void clear() override
void setRangeHint(double lo, double hi)
Use NAN to leave either value unspecified.
Definition chistogramstrategy.h:342
virtual void collectWeighted(double value, double weight) override
virtual void collect(double value) override
virtual void clear() override
Definition chistogramstrategy.h:263
virtual cDefaultHistogramStrategy * dup() const override
Definition chistogramstrategy.h:250
virtual void collectWeighted(double value, double weight) override
virtual void collect(double value) override
virtual void clear() override
Definition chistogramstrategy.h:145
virtual cFixedRangeHistogramStrategy * dup() const override
Definition chistogramstrategy.h:124
virtual void setUpBins() override
Mode
Definition chistogram.h:96
virtual void collect(double value)=0
cHistogram * getHistogram() const
Definition chistogramstrategy.h:57
void setHistogram(cHistogram *hist)
virtual void collectWeighted(double value, double weight)=0
virtual void setUpBins()=0
cObject()
Definition cobject.h:124