summaryrefslogtreecommitdiff
path: root/science/omnetpp/files/patch-src-sim-cstat.cc
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