stats: unify the two stats distribution type better
authorNathan Binkert <nate@binkert.org>
Thu, 22 Jul 2010 01:54:53 +0000 (18:54 -0700)
committerNathan Binkert <nate@binkert.org>
Thu, 22 Jul 2010 01:54:53 +0000 (18:54 -0700)
src/base/statistics.hh
src/base/stats/info.hh
src/base/stats/mysql.cc
src/base/stats/text.cc

index 5fca376e36dfa5393a6ecc26e622b6fee29d7d46..8c229d419546f1161de40f585f127a7a2c8b9c38 100644 (file)
@@ -160,6 +160,11 @@ class Vector2dInfoProxy : public InfoProxy<Stat, Vector2dInfo>
     Vector2dInfoProxy(Stat &stat) : InfoProxy<Stat, Vector2dInfo>(stat) {}
 };
 
+struct StorageParams
+{
+    virtual ~StorageParams();
+};
+
 class InfoAccess
 {
   protected:
@@ -1269,6 +1274,12 @@ class Vector2dBase : public DataWrapVec2d<Derived, Vector2dInfoProxy>
 // Non formula statistics
 //
 //////////////////////////////////////////////////////////////////////
+/** The parameters for a distribution stat. */
+struct DistParams : public StorageParams
+{
+    const DistType type;
+    DistParams(DistType t) : type(t) {}
+};
 
 /**
  * Templatized storage and interface for a distrbution stat.
@@ -1279,6 +1290,15 @@ class DistStor
     /** The parameters for a distribution stat. */
     struct Params : public DistParams
     {
+        /** 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;
+
         Params() : DistParams(Dist) {}
     };
 
@@ -1368,6 +1388,12 @@ class DistStor
     {
         const Params *params = safe_cast<const Params *>(info->storageParams);
 
+        assert(params->type == Dist);
+        data.type = params->type;
+        data.min = params->min;
+        data.max = params->max;
+        data.bucket_size = params->bucket_size;
+
         data.min_val = (min_val == CounterLimits::max()) ? 0 : min_val;
         data.max_val = (max_val == CounterLimits::min()) ? 0 : max_val;
         data.underflow = underflow;
@@ -1468,6 +1494,10 @@ class SampleStor
     void
     prepare(Info *info, DistData &data)
     {
+        const Params *params = safe_cast<const Params *>(info->storageParams);
+
+        assert(params->type == Deviation);
+        data.type = params->type;
         data.sum = sum;
         data.squares = squares;
         data.samples = samples;
@@ -1540,6 +1570,10 @@ class AvgSampleStor
     void
     prepare(Info *info, DistData &data)
     {
+        const Params *params = safe_cast<const Params *>(info->storageParams);
+
+        assert(params->type == Deviation);
+        data.type = params->type;
         data.sum = sum;
         data.squares = squares;
         data.samples = curTick;
index 4987fa81040984d3188760c9d5224ae6c458f14b..e5b9e4a65a956912a56c168d89586d31ec970260 100644 (file)
@@ -61,11 +61,7 @@ const FlagsType nonan =         0x0200;
 /** Mask of flags that can't be set directly */
 const FlagsType __reserved =    init | display;
 
-struct StorageParams
-{
-    virtual ~StorageParams();
-};
-
+struct StorageParams;
 struct Visit;
 
 class Info
@@ -168,8 +164,15 @@ class VectorInfo : public Info
     virtual Result total() const = 0;
 };
 
+enum DistType { Deviation, Dist };
+
 struct DistData
 {
+    DistType type;
+    Counter min;
+    Counter max;
+    Counter bucket_size;
+
     Counter min_val;
     Counter max_val;
     Counter underflow;
@@ -180,24 +183,6 @@ struct DistData
     Counter samples;
 };
 
-enum DistType { Deviation, Dist };
-
-struct DistParams : public StorageParams
-{
-    const DistType type;
-
-    /** 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(DistType t) : type(t) {}
-};
-
 class DistInfo : public Info
 {
   public:
index 6ef173f50106de395b9f8c5344d42aeccb1f0488..9d2dadb01bc79adc25b01f339b4a62587ae6b1be 100644 (file)
@@ -481,9 +481,10 @@ MySql::configure(const DistInfo &info)
     if (!configure(info, "DIST"))
         return;
 
-    const DistParams *params =
-        safe_cast<const DistParams *>(info.storageParams);
-    if (params->type == Dist) {
+    const DistStor::Params *params =
+        dynamic_cast<const DistStor::Params *>(info.storageParams);
+    if (params) {
+        assert(params->type == Dist);
         stat.size = params->buckets;
         stat.min = params->min;
         stat.max = params->max;
@@ -498,9 +499,10 @@ MySql::configure(const VectorDistInfo &info)
     if (!configure(info, "VECTORDIST"))
         return;
 
-    const DistParams *params =
-        safe_cast<const DistParams *>(info.storageParams);
-    if (params->type == Dist) {
+    const DistStor::Params *params =
+        dynamic_cast<const DistStor::Params *>(info.storageParams);
+    if (params) {
+        assert(params->type == Dist);
         stat.size = params->buckets;
         stat.min = params->min;
         stat.max = params->max;
index 87bb05323e5e5a19778ab71db6bd71528b7a7a91..425a917efdd6806c5e875d384756044b39949a3e 100644 (file)
@@ -306,30 +306,24 @@ struct DistPrint
     bool descriptions;
     int precision;
 
-    Counter min;
-    Counter max;
-    Counter bucket_size;
-    size_type size;
-    DistType type;
-
     const DistData &data;
 
     DistPrint(const Text *text, const DistInfo &info);
     DistPrint(const Text *text, const VectorDistInfo &info, int i);
-    void init(const Text *text, const Info &info, const DistParams *params);
+    void init(const Text *text, const Info &info);
     void operator()(ostream &stream) const;
 };
 
 DistPrint::DistPrint(const Text *text, const DistInfo &info)
     : data(info.data)
 {
-    init(text, info, safe_cast<const DistParams *>(info.storageParams));
+    init(text, info);
 }
 
 DistPrint::DistPrint(const Text *text, const VectorDistInfo &info, int i)
     : data(info.data[i])
 {
-    init(text, info, safe_cast<const DistParams *>(info.storageParams));
+    init(text, info);
 
     name = info.name + "_" +
         (info.subnames[i].empty() ? (to_string(i)) : info.subnames[i]);
@@ -339,27 +333,13 @@ DistPrint::DistPrint(const Text *text, const VectorDistInfo &info, int i)
 }
 
 void
-DistPrint::init(const Text *text, const Info &info, const DistParams *params)
+DistPrint::init(const Text *text, const Info &info)
 {
     name = info.name;
     desc = info.desc;
     flags = info.flags;
     precision = info.precision;
     descriptions = text->descriptions;
-
-    type = params->type;
-    switch (type) {
-      case Dist:
-        min = params->min;
-        max = params->max;
-        bucket_size = params->bucket_size;
-        size = params->buckets;
-        break;
-      case Deviation:
-        break;
-      default:
-        panic("unknown distribution type");
-    }
 }
 
 void
@@ -391,10 +371,10 @@ DistPrint::operator()(ostream &stream) const
     print.value = stdev;
     print(stream);
 
-    if (type == Deviation)
+    if (data.type == Deviation)
         return;
 
-    assert(size == data.cvec.size());
+    size_t size = data.cvec.size();
 
     Result total = 0.0;
     if (data.underflow != NAN)
@@ -419,8 +399,8 @@ DistPrint::operator()(ostream &stream) const
         stringstream namestr;
         namestr << base;
 
-        Counter low = i * bucket_size + min;
-        Counter high = ::min(low + bucket_size - 1.0, max);
+        Counter low = i * data.bucket_size + data.min;
+        Counter high = ::min(low + data.bucket_size - 1.0, data.max);
         namestr << low;
         if (low < high)
             namestr << "-" << high;