stats: unify the two stats distribution type better

This commit is contained in:
Nathan Binkert 2010-07-21 18:54:53 -07:00
parent 2a1309f213
commit 21bf6ff101
4 changed files with 58 additions and 57 deletions

View 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;

View 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:

View 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;

View 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;