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.
* overflows and rounding errors we store the common divisor of the
* correction factors separately.
*/
* 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)
{
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)
}
static int add_afs_statistics(const struct osl_row *row)