blob: 554ed4def7d8714bd431b04c101d4f3845dea38e (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
--- src/sim/cstat.cc 2003-06-25 17:38:24.000000000 +0200
+++ src/sim/cstat.cc 2004-11-19 12:23:03.000000000 +0100
@@ -252,8 +252,31 @@
void cWeightedStdDev::collect2(double val, double weight)
{
- cStdDev::collect(weight*val);
+ // Lars Westerhoff: collect weight*val*val for sqrsum_samples for variance
+
+ if (++num_samples <= 0)
+ {
+ // FIXME: num_samples overflow: issue warning and must stop collecting!
+ ev.printf("\a\nWARNING: (%s)%s: observation count overflow!\n\n",className(),fullPath());
+ }
+ sum_samples+=weight*val;
+ sqrsum_samples+=weight*val*val;
sum_weights += weight;
+
+ if (num_samples>1)
+ {
+ if (val<min_samples)
+ min_samples=val;
+ else if (val>max_samples)
+ max_samples=val;
+ }
+ else
+ {
+ min_samples=max_samples=val;
+ }
+
+ if (transientDetectionObject()) td->collect(val); //NL
+ if (accuracyDetectionObject()) ra->collect(val); //NL
}
void cWeightedStdDev::clearResult()
@@ -264,18 +287,18 @@
double cWeightedStdDev::variance() const
{
- throw new cException(this, "variance()/stddev() not implemented");
+ // Lars Westerhoff
- // if (sum_weights==0)
- // return 0.0;
- // else
- // {
- // double devsqr = (sqrsum_samples - sum_samples*sum_samples/sum_weights)/(sum_weights-1);
- // if (devsqr<=0)
- // return 0.0;
- // else
- // return devsqr;
- //}
+ if (sum_weights==0)
+ return 0.0;
+ else
+ {
+ double devsqr = (sqrsum_samples - sum_samples*sum_samples/sum_weights)/(sum_weights); // sum_weights-1 ???
+ if (devsqr<=0)
+ return 0.0;
+ else
+ return devsqr;
+ }
}
void cWeightedStdDev::saveToFile(FILE *f) const
|