From: Andre Noll Date: Sat, 22 Oct 2022 17:59:52 +0000 (+0200) Subject: mood: Fix compute_score(). X-Git-Tag: v0.7.2~22 X-Git-Url: http://git.tuebingen.mpg.de/versions/paraslash-0.3.1.tar.bz2.asc?a=commitdiff_plain;h=bbf102f76c471be5e6b5d6c76e010c4c49f031de;p=paraslash.git mood: Fix compute_score(). This fixes a bug which was introduced 10 months ago in merge commit 88bf6848d1c (Merge branch 'refs/heads/t/rm_v1_moods'). This merge conflicted in mood.c, and the conflicting hunks that touched compute_score() were resolved incorrectly. Put simply, we kept the old code and disregarded the correction factors that were introduced by the other side of the merge. As a result, at mood load time the correction factors were initialized correctly but not taken into account for computing the score of the admissible files. The fact that the bug went unnoticed for so long can only mean that the correction factors don't make much of a difference in practice. However, the bug was found because one particular mood behaved unexpectedly, likely because its admissible files consisted of a bunch of very new files among many very old ones. --- diff --git a/mood.c b/mood.c index bcc9bc57..d47c54ef 100644 --- a/mood.c +++ b/mood.c @@ -249,20 +249,22 @@ int mood_check_callback(struct afs_callback_arg *aca) * overflows and rounding errors we store the common divisor of the * correction factors separately. */ -static int64_t normalized_value(int64_t x, int64_t n, int64_t sum, int64_t qd) -{ - if (!n || !qd) - return 0; - return 100 * (n * x - sum) / (int64_t)int_sqrt(n) / (int64_t)int_sqrt(qd); -} - static long compute_score(struct afs_info *afsi) { - long score = -normalized_value(afsi->num_played, statistics.num, - statistics.num_played_sum, statistics.num_played_qd); - score -= normalized_value(afsi->last_played, statistics.num, - statistics.last_played_sum, statistics.last_played_qd); - return score / 2; + int64_t mean_n, mean_l,score_n, score_l; + + assert(statistics.normalization_divisor > 0); + assert(statistics.num > 0); + mean_n = statistics.num_played_sum / statistics.num; + mean_l = statistics.last_played_sum / statistics.num; + + score_n = -((int64_t)afsi->num_played - mean_n) + * statistics.num_played_correction + / statistics.normalization_divisor; + score_l = -((int64_t)afsi->last_played - mean_l) + * statistics.last_played_correction + / statistics.normalization_divisor; + return (score_n + score_l) / 2; } static int add_afs_statistics(const struct osl_row *row)