Skip to content

Commit 0d129e1

Browse files
authored
Keep input type when computing averages (#643)
1 parent 6dd5d7d commit 0d129e1

File tree

6 files changed

+33
-16
lines changed

6 files changed

+33
-16
lines changed

include/caliper/common/Variant.h

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ class Variant
8888

8989
Variant& min(const Variant& val);
9090
Variant& max(const Variant& val);
91+
Variant div(unsigned count);
9192

9293
static void update_minmaxsum(const Variant& val, Variant& min_val, Variant& max_val, Variant& sum_val);
9394

src/common/Variant.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,24 @@ Variant& Variant::max(const Variant& val)
302302
return *this;
303303
}
304304

305+
Variant Variant::div(unsigned count)
306+
{
307+
cali_attr_type type = this->type();
308+
309+
switch (type) {
310+
case CALI_TYPE_DOUBLE:
311+
return Variant(m_v.value.v_double / static_cast<double>(count));
312+
case CALI_TYPE_INT:
313+
return Variant(cali_make_variant_from_int64(m_v.value.v_int / static_cast<int64_t>(count)));
314+
case CALI_TYPE_UINT:
315+
return Variant(cali_make_variant_from_uint(m_v.value.v_uint / count));
316+
default:
317+
break;
318+
}
319+
320+
return Variant();
321+
}
322+
305323
void Variant::update_minmaxsum(const Variant& val, Variant& min_val, Variant& max_val, Variant& sum_val)
306324
{
307325
if (min_val.empty()) {

src/reader/Aggregator.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -646,11 +646,11 @@ class AvgKernel : public AggregateKernel
646646

647647
int prop = CALI_ATTR_SKIP_EVENTS | CALI_ATTR_ASVALUE;
648648

649-
m_stat_attrs.avg = db.create_attribute("avg#" + m_target_attr_name, CALI_TYPE_DOUBLE, prop);
649+
m_stat_attrs.avg = db.create_attribute("avg#" + m_target_attr_name, m_target_attr.type(), prop);
650650
m_stat_attrs.count =
651651
db.create_attribute("avg.count#" + m_target_attr_name, CALI_TYPE_UINT, prop | CALI_ATTR_HIDDEN);
652652
m_stat_attrs.sum =
653-
db.create_attribute("avg.sum#" + m_target_attr_name, CALI_TYPE_DOUBLE, prop | CALI_ATTR_HIDDEN);
653+
db.create_attribute("avg.sum#" + m_target_attr_name, m_target_attr.type(), prop | CALI_ATTR_HIDDEN);
654654

655655
a = m_stat_attrs;
656656
return true;
@@ -663,7 +663,7 @@ class AvgKernel : public AggregateKernel
663663
static AggregateKernelConfig* create(const std::vector<std::string>& cfg) { return new Config(cfg.front()); }
664664
};
665665

666-
AvgKernel(Config* config) : m_count(0), m_sum(0.0), m_config(config) {}
666+
AvgKernel(Config* config) : m_count(0), m_config(config) {}
667667

668668
const AggregateKernelConfig* config() { return m_config; }
669669

@@ -679,10 +679,10 @@ class AvgKernel : public AggregateKernel
679679

680680
for (const Entry& e : list) {
681681
if (e.attribute() == target_attr.id()) {
682-
m_sum += e.value().to_double();
682+
m_sum += e.value();
683683
++m_count;
684684
} else if (e.attribute() == stat_attr.sum.id()) {
685-
m_sum += e.value().to_double();
685+
m_sum += e.value();
686686
} else if (e.attribute() == stat_attr.count.id()) {
687687
m_count += e.value().to_uint();
688688
}
@@ -697,16 +697,16 @@ class AvgKernel : public AggregateKernel
697697
if (!m_config->get_statistics_attributes(db, stat_attr))
698698
return;
699699

700-
list.push_back(Entry(stat_attr.avg, Variant(m_sum / m_count)));
701-
list.push_back(Entry(stat_attr.sum, Variant(m_sum)));
700+
list.push_back(Entry(stat_attr.avg, m_sum.div(m_count)));
701+
list.push_back(Entry(stat_attr.sum, m_sum));
702702
list.push_back(Entry(stat_attr.count, Variant(cali_make_variant_from_uint(m_count))));
703703
}
704704
}
705705

706706
private:
707707

708708
unsigned m_count;
709-
double m_sum;
709+
Variant m_sum;
710710

711711
std::mutex m_lock;
712712

src/reader/test/test_aggregator.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ TEST(AggregatorTest, StatisticsKernels)
723723

724724
EXPECT_EQ(dict[attr_min.id()].value().to_int(), -4);
725725
EXPECT_EQ(dict[attr_max.id()].value().to_int(), 36);
726-
EXPECT_DOUBLE_EQ(dict[attr_avg.id()].value().to_double(), 16.5);
726+
EXPECT_EQ(dict[attr_avg.id()].value().to_int(), 16);
727727
EXPECT_DOUBLE_EQ(dict[attr_var.id()].value().to_double(), 2018.0 / 4.0 - (16.5 * 16.5));
728728
}
729729

src/services/aggregate/Aggregate.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class Aggregate
116116
res.min_attr = c->create_attribute(std::string("min#") + name, type, prop);
117117
res.max_attr = c->create_attribute(std::string("max#") + name, type, prop);
118118
res.sum_attr = c->create_attribute(std::string("sum#") + name, type, prop);
119-
res.avg_attr = c->create_attribute(std::string("avg#") + name, CALI_TYPE_DOUBLE, prop);
119+
res.avg_attr = c->create_attribute(std::string("avg#") + name, type, prop);
120120
#ifdef CALIPER_ENABLE_HISTOGRAMS
121121
for (int jj = 0; jj < CALI_AGG_HISTOGRAM_BINS; jj++) {
122122
res.histogram_attr[jj] = c->create_attribute(

src/services/aggregate/AggregationDB.cpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -286,12 +286,10 @@ struct AggregationDB::AggregationDBImpl {
286286
if (k->count == 0)
287287
continue;
288288

289-
double avg = k->sum.to_double() / k->count;
290-
291-
rec.push_back(Entry(info.result_attrs[a].min_attr, Variant(k->min)));
292-
rec.push_back(Entry(info.result_attrs[a].max_attr, Variant(k->max)));
293-
rec.push_back(Entry(info.result_attrs[a].sum_attr, Variant(k->sum)));
294-
rec.push_back(Entry(info.result_attrs[a].avg_attr, Variant(avg)));
289+
rec.push_back(Entry(info.result_attrs[a].min_attr, k->min));
290+
rec.push_back(Entry(info.result_attrs[a].max_attr, k->max));
291+
rec.push_back(Entry(info.result_attrs[a].sum_attr, k->sum));
292+
rec.push_back(Entry(info.result_attrs[a].avg_attr, k->sum.div(k->count)));
295293
#ifdef CALIPER_ENABLE_HISTOGRAMS
296294
for (int ii = 0; ii < CALI_AGG_HISTOGRAM_BINS; ii++) {
297295
rec.push_back(Entry(

0 commit comments

Comments
 (0)