stats: cleanup text output stuff and fix mysql output
authorNathan Binkert <nate@binkert.org>
Sat, 7 Mar 2009 22:30:53 +0000 (14:30 -0800)
committerNathan Binkert <nate@binkert.org>
Sat, 7 Mar 2009 22:30:53 +0000 (14:30 -0800)
src/base/statistics.hh
src/base/stats/mysql.cc
src/base/stats/mysql.hh
src/base/stats/text.cc

index 827c1d311657f7e1b1020be3e47f864026c6a106..06c15a77d6f2209c19751dad7a1527742eecbc37 100644 (file)
@@ -1423,6 +1423,22 @@ class Vector2dBase : public DataWrapVec2d<Derived, Vector2dInfo>
 //
 //////////////////////////////////////////////////////////////////////
 
+struct DistParams : public StorageParams
+{
+    const bool fancy;
+
+    /** The minimum value to track. */
+    Counter min;
+    /** The maximum value to track. */
+    Counter max;
+    /** The number of entries in each bucket. */
+    Counter bucket_size;
+    /** The number of buckets. Equal to (max-min)/bucket_size. */
+    size_type buckets;
+
+    explicit DistParams(bool f) : fancy(f) {}
+};
+
 /**
  * Templatized storage and interface for a distrbution stat.
  */
@@ -1430,18 +1446,9 @@ class DistStor
 {
   public:
     /** The parameters for a distribution stat. */
-    struct Params : public StorageParams
-    {
-        /** The minimum value to track. */
-        Counter min;
-        /** The maximum value to track. */
-        Counter max;
-        /** The number of entries in each bucket. */
-        Counter bucket_size;
-        /** The number of buckets. Equal to (max-min)/bucket_size. */
-        size_type buckets;
-
-        enum { fancy = false };
+    struct Params : public DistParams
+    {
+        Params() : DistParams(false) {}
     };
 
   private:
@@ -1578,9 +1585,9 @@ class DistStor
 class FancyStor
 {
   public:
-    struct Params : public StorageParams
+    struct Params : public DistParams
     {
-        enum { fancy = true };
+        Params() : DistParams(true) {}
     };
 
   private:
@@ -1654,9 +1661,9 @@ class FancyStor
 class AvgFancy
 {
   public:
-    struct Params : public StorageParams
+    struct Params : public DistParams
     {
-        enum { fancy = true };
+        Params() : DistParams(true) {}
     };
 
   private:
index 58c620ed1fbeb7200b9dbbc07b9fa80de9abb24d..1e0c923f1ebc5c99df6cc1b77ff2d748c108f506 100644 (file)
@@ -583,7 +583,8 @@ MySql::configure(const DistInfoBase &info)
     if (!configure(info, "DIST"))
         return;
 
-    const Params *params = safe_cast<const Params *>(info.storageParams);
+    const DistParams *params =
+        safe_cast<const DistParams *>(info.storageParams);
     if (!params->fancy) {
         stat.size = params->buckets;
         stat.min = params->min;
@@ -599,7 +600,8 @@ MySql::configure(const VectorDistInfoBase &info)
     if (!configure(info, "VECTORDIST"))
         return;
 
-    const Params *params = safe_cast<const Params *>(info.storageParams);
+    const DistParams *params =
+        safe_cast<const DistParams *>(info.storageParams);
     if (!params->fancy) {
         stat.size = params->buckets;
         stat.min = params->min;
@@ -765,7 +767,7 @@ MySql::output(const VectorInfoBase &info)
 }
 
 void
-MySql::output(const DistData &data)
+MySql::output(const DistData &data, const DistParams *params)
 {
     const int db_sum = -1;
     const int db_squares = -2;
@@ -787,7 +789,7 @@ MySql::output(const DistData &data)
     newdata.data = data.samples;
     newdata.insert();
 
-    if (data.samples && !data.fancy) {
+    if (data.samples && !params->fancy) {
         newdata.x = db_min_val;
         newdata.data = data.min_val;
         newdata.insert();
@@ -821,7 +823,7 @@ MySql::output(const DistInfoBase &info)
 
     newdata.stat = find(info.id);
     newdata.y = 0;
-    output(info.data);
+    output(info.data, safe_cast<const DistParams *>(info.storageParams));
 }
 
 void
@@ -835,7 +837,8 @@ MySql::output(const VectorDistInfoBase &info)
     size_type size = info.data.size();
     for (off_type y = 0; y < size; ++y) {
         newdata.y = y;
-        output(info.data[y]);
+        output(info.data[y],
+               safe_cast<const DistParams *>(info.storageParams));
     }
 }
 
index f0f79bebd02538bcae1876c0d678cf6ba3dfe059..86a4d6d2371048c8735d2395524f86ae382f94bf 100644 (file)
@@ -56,6 +56,7 @@ struct SetupStat
     bool total;
     bool pdf;
     bool cdf;
+
     double min;
     double max;
     double bktsize;
@@ -177,7 +178,7 @@ class MySql : public Output
     void output(const VectorDistInfoBase &info);
     void output(const Vector2dInfoBase &info);
     void output(const FormulaInfoBase &info);
-    void output(const DistData &data);
+    void output(const DistData &data, const DistParams *params);
 
     void configure();
     bool configure(const Info &info, std::string type);
index 6c2078bd0ce27fabb6ec72a1cd91b66f189b301a..c3e484cf4a89d679bc01561590980621a431cd63 100644 (file)
@@ -351,27 +351,63 @@ struct DistPrint
     bool descriptions;
     int precision;
 
-    Result min_val;
-    Result max_val;
-    Result underflow;
-    Result overflow;
-    VResult vec;
-    Result sum;
-    Result squares;
-    Result samples;
-
     Counter min;
     Counter max;
     Counter bucket_size;
     size_type size;
     bool fancy;
 
+    const DistData &data;
+
+    DistPrint(const DistInfoBase &info);
+    DistPrint(const VectorDistInfoBase &info, int i);
+    void init(const Info &info, const DistParams *params);
     void operator()(ostream &stream) const;
 };
 
+DistPrint::DistPrint(const DistInfoBase &info)
+    : data(info.data)
+{
+    init(info, safe_cast<const DistParams *>(info.storageParams));
+}
+
+DistPrint::DistPrint(const VectorDistInfoBase &info, int i)
+    : data(info.data[i])
+{
+    init(info, safe_cast<const DistParams *>(info.storageParams));
+
+    name = info.name + "_" +
+        (info.subnames[i].empty() ? (to_string(i)) : info.subnames[i]);
+
+    if (!info.subdescs[i].empty())
+        desc = info.subdescs[i];
+}
+
+void
+DistPrint::init(const Info &info, const DistParams *params)
+{
+    name = info.name;
+    desc = info.desc;
+    flags = info.flags;
+    compat = compat;
+    descriptions = descriptions;
+    precision = info.precision;
+
+    fancy = params->fancy;
+    min = params->min;
+    max = params->max;
+    bucket_size = params->bucket_size;
+    size = params->buckets;
+}
+
 void
 DistPrint::operator()(ostream &stream) const
 {
+    Result stdev = NAN;
+    if (data.samples)
+        stdev = sqrt((data.samples * data.squares - data.sum * data.sum) /
+                     (data.samples * (data.samples - 1.0)));
+
     if (fancy) {
         ScalarPrint print;
         string base = name + (compat ? "_" : "::");
@@ -385,28 +421,27 @@ DistPrint::operator()(ostream &stream) const
         print.cdf = NAN;
 
         print.name = base + "mean";
-        print.value = samples ? sum / samples : NAN;
+        print.value = data.samples ? data.sum / data.samples : NAN;
         print(stream);
 
         print.name = base + "stdev";
-        print.value = samples ? sqrt((samples * squares - sum * sum) /
-                                     (samples * (samples - 1.0))) : NAN;
+        print.value = stdev;
         print(stream);
 
         print.name = "**Ignore: " + base + "TOT";
-        print.value = samples;
+        print.value = data.samples;
         print(stream);
         return;
     }
 
-    assert(size == vec.size());
+    assert(size == data.cvec.size());
 
     Result total = 0.0;
 
-    total += underflow;
+    total += data.underflow;
     for (off_type i = 0; i < size; ++i)
-        total += vec[i];
-    total += overflow;
+        total += data.cvec[i];
+    total += data.overflow;
 
     string base = name + (compat ? "." : "::");
 
@@ -427,18 +462,18 @@ DistPrint::operator()(ostream &stream) const
     }
 
     print.name = base + "samples";
-    print.value = samples;
+    print.value = data.samples;
     print(stream);
 
     print.name = base + "min_value";
-    print.value = min_val;
+    print.value = data.min_val;
     print(stream);
 
-    if (!compat || underflow > 0.0) {
+    if (!compat || data.underflow > 0.0) {
         print.name = base + "underflows";
-        print.value = underflow;
+        print.value = data.underflow;
         if (!compat && total) {
-            print.pdf = underflow / total;
+            print.pdf = data.underflow / total;
             print.cdf += print.pdf;
         }
         print(stream);
@@ -456,9 +491,9 @@ DistPrint::operator()(ostream &stream) const
                 namestr << "-" << high;
 
             print.name = namestr.str();
-            print.value = vec[i];
+            print.value = data.cvec[i];
             if (total) {
-                print.pdf = vec[i] / total;
+                print.pdf = data.cvec[i] / total;
                 print.cdf += print.pdf;
             }
             print(stream);
@@ -471,17 +506,17 @@ DistPrint::operator()(ostream &stream) const
         print.flags = flags | __substat;
 
         for (off_type i = 0; i < size; ++i) {
-            if ((flags & nozero && vec[i] == 0.0) ||
-                (flags & nonan && isnan(vec[i])))
+            if ((flags & nozero && data.cvec[i] == 0.0) ||
+                (flags & nonan && isnan(data.cvec[i])))
                 continue;
 
             _min = i * bucket_size + min;
-            _pdf = vec[i] / total * 100.0;
+            _pdf = data.cvec[i] / total * 100.0;
             _cdf += _pdf;
 
 
             print.name = ValueToString(_min, 0, compat);
-            print.value = vec[i];
+            print.value = data.cvec[i];
             print.pdf = (flags & pdf) ? _pdf : NAN;
             print.cdf = (flags & cdf) ? _cdf : NAN;
             print(stream);
@@ -490,11 +525,11 @@ DistPrint::operator()(ostream &stream) const
         print.flags = flags;
     }
 
-    if (!compat || overflow > 0.0) {
+    if (!compat || data.overflow > 0.0) {
         print.name = base + "overflows";
-        print.value = overflow;
+        print.value = data.overflow;
         if (!compat && total) {
-            print.pdf = overflow / total;
+            print.pdf = data.overflow / total;
             print.cdf += print.pdf;
         } else {
             print.pdf = NAN;
@@ -513,17 +548,16 @@ DistPrint::operator()(ostream &stream) const
     }
 
     print.name = base + "max_value";
-    print.value = max_val;
+    print.value = data.max_val;
     print(stream);
 
-    if (!compat && samples != 0) {
+    if (!compat && data.samples != 0) {
         print.name = base + "mean";
-        print.value = sum / samples;
+        print.value = data.sum / data.samples;
         print(stream);
 
         print.name = base + "stdev";
-        print.value = sqrt((samples * squares - sum * sum) /
-                           (samples * (samples - 1.0)));
+        print.value = stdev;
         print(stream);
     }
 
@@ -651,39 +685,7 @@ Text::visit(const DistInfoBase &info)
     if (noOutput(info))
         return;
 
-    DistPrint print;
-
-    print.name = info.name;
-    print.desc = info.desc;
-    print.flags = info.flags;
-    print.compat = compat;
-    print.descriptions = descriptions;
-    print.precision = info.precision;
-
-    const DistData &data = info.data;
-
-    print.min_val = data.min_val;
-    print.max_val = data.max_val;
-    print.underflow = data.underflow;
-    print.overflow = data.overflow;
-    print.vec.resize(data.cvec.size());
-    for (off_type i = 0; i < print.vec.size(); ++i)
-        print.vec[i] = (Result)data.cvec[i];
-    print.sum = data.sum;
-    print.squares = data.squares;
-    print.samples = data.samples;
-
-    const DistStor::Params *params =
-        safe_cast<const DistStor::Params *>(info.storageParams);
-
-    print.fancy = params->fancy;
-    if (!params->fancy) {
-        print.min = params->min;
-        print.max = params->max;
-        print.bucket_size = params->bucket_size;
-        print.size = params->buckets;
-    }
-
+    DistPrint print(info);
     print(*stream);
 }
 
@@ -694,38 +696,7 @@ Text::visit(const VectorDistInfoBase &info)
         return;
 
     for (off_type i = 0; i < info.size(); ++i) {
-        DistPrint print;
-
-        print.name = info.name + "_" +
-            (info.subnames[i].empty() ? (to_string(i)) : info.subnames[i]);
-        print.desc = info.subdescs[i].empty() ? info.desc : info.subdescs[i];
-        print.flags = info.flags;
-        print.compat = compat;
-        print.descriptions = descriptions;
-        print.precision = info.precision;
-
-        print.min_val = info.data[i].min_val;
-        print.max_val = info.data[i].max_val;
-        print.underflow = info.data[i].underflow;
-        print.overflow = info.data[i].overflow;
-        print.vec.resize(info.data[i].cvec.size());
-        for (off_type j = 0; j < print.vec.size(); ++j)
-            print.vec[j] = (Result)info.data[i].cvec[j];
-        print.sum = info.data[i].sum;
-        print.squares = info.data[i].squares;
-        print.samples = info.data[i].samples;
-
-        const DistStor::Params *params =
-            safe_cast<const DistStor::Params *>(info.storageParams);
-
-        print.fancy = params->fancy;
-        if (!params->fancy) {
-            print.min = params->min;
-            print.max = params->max;
-            print.bucket_size = params->bucket_size;
-            print.size = params->buckets;
-        }
-
+        DistPrint print(info, i);
         print(*stream);
     }
 }