stats: when applying an operation to two vectors sum the components first.
authorWilliam Wang <William.Wang@arm.com>
Tue, 5 Jun 2012 05:23:11 +0000 (01:23 -0400)
committerWilliam Wang <William.Wang@arm.com>
Tue, 5 Jun 2012 05:23:11 +0000 (01:23 -0400)
Previously writing X/Y in a formula would result in:
x[0]/y[0] + x[1]/y[1]
In reality you want:
(x[0] +x[1])/(y[0] + y[1])

src/base/statistics.hh

index c36f8f4614ebfe3c9b4b97e5c5173bb60b05ae70..723c8bd9cdbcb713ff49f4eac06f0160330c793b 100644 (file)
@@ -2289,9 +2289,31 @@ class BinaryNode : public Node
     total() const
     {
         const VResult &vec = this->result();
+        const VResult &lvec = l->result();
+        const VResult &rvec = r->result();
         Result total = 0.0;
-        for (off_type i = 0; i < size(); i++)
+        Result lsum = 0.0;
+        Result rsum = 0.0;
+        Op op;
+
+        assert(lvec.size() > 0 && rvec.size() > 0);
+        assert(lvec.size() == rvec.size() ||
+               lvec.size() == 1 || rvec.size() == 1);
+
+        /** If vectors are the same divide their sums (x0+x1)/(y0+y1) */
+        if (lvec.size() == rvec.size() && lvec.size() > 1) {
+            for (off_type i = 0; i < size(); ++i) {
+                lsum += lvec[i];
+                rsum += rvec[i];
+            }
+            return op(lsum, rsum);
+        }
+
+        /** Otherwise divide each item by the divisor */
+        for (off_type i = 0; i < size(); ++i) {
             total += vec[i];
+        }
+
         return total;
     }