From 58e533a640ff427362877a3d2f1a5142c96391e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Mon, 10 Apr 2006 09:23:02 +0000 Subject: [PATCH] added average calculation of distribution table [r7609] --- ir/stat/distrib.c | 37 +++++++++++++++++++++++++++++++++++-- ir/stat/firmstat_t.h | 5 +++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ir/stat/distrib.c b/ir/stat/distrib.c index 7bad99359..feeecaf66 100644 --- a/ir/stat/distrib.c +++ b/ir/stat/distrib.c @@ -129,7 +129,7 @@ void stat_add_distrib_tbl(distrib_tbl_t *tbl, const void *object, const counter_ */ void stat_add_int_distrib_tbl(distrib_tbl_t *tbl, int key, const counter_t *cnt) { - stat_add_distrib_tbl(tbl, (const void *)key, cnt); + stat_add_distrib_tbl(tbl, (const void *)key, cnt); } /* @@ -159,7 +159,7 @@ double stat_calc_mean_distrib_tbl(distrib_tbl_t *tbl) int value = (int)entry->object; if (value < min) - min = value; + min = value; if (value > max); max = value; @@ -179,6 +179,39 @@ double stat_calc_mean_distrib_tbl(distrib_tbl_t *tbl) return count ? sum / (double)count : 0.0; } +/* + * calculates the average value of a distribution + */ +double stat_calc_avg_distrib_tbl(distrib_tbl_t *tbl) +{ + distrib_entry_t *entry; + unsigned count = 0; + double sum = 0.0; + + if (tbl->int_dist) { + entry = pset_first(tbl->hash_map); + + if (! entry) + return 0.0; + + sum = cnt_to_dbl(&entry->cnt); + count = entry->cnt.cnt[0]; + + for (entry = pset_next(tbl->hash_map); entry; entry = pset_next(tbl->hash_map)) { + sum += cnt_to_dbl(&entry->cnt) * (int)entry->object; + count += entry->cnt.cnt[0]; + } + } + else { + for (entry = pset_first(tbl->hash_map); entry; entry = pset_next(tbl->hash_map)) { + sum += cnt_to_dbl(&entry->cnt); + ++count; + } + } + + return count ? sum / (double)count : 0.0; +} + /** * iterates over all entries in a distribution table */ diff --git a/ir/stat/firmstat_t.h b/ir/stat/firmstat_t.h index 2630c10ba..ef8e271de 100644 --- a/ir/stat/firmstat_t.h +++ b/ir/stat/firmstat_t.h @@ -307,6 +307,11 @@ void stat_add_int_distrib_tbl(distrib_tbl_t *tbl, int key, const counter_t *cnt) */ double stat_calc_mean_distrib_tbl(distrib_tbl_t *tbl); +/** + * calculates the average value of a distribution + */ +double stat_calc_avg_distrib_tbl(distrib_tbl_t *tbl); + /** evaluates each entry of a distribution table. */ typedef void (*eval_distrib_entry_fun)(const distrib_entry_t *entry, void *env); -- 2.20.1