From: Andre Noll Date: Sat, 11 Jul 2009 14:53:50 +0000 (+0200) Subject: Scoring fixes. X-Git-Tag: v0.3.5~27 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=2a4d7bb5f5cecdbcbda6b9f9b531c919ecc6b161;ds=sidebyside Scoring fixes. Rename add_item_score to get_item_score(), properly check its return value, and use the computed score only for admissible files. --- diff --git a/error.h b/error.h index c53ab89a..95640da9 100644 --- a/error.h +++ b/error.h @@ -152,7 +152,6 @@ extern const char **para_errlist[]; #define MOOD_ERRORS \ PARA_ERROR(MOOD_SYNTAX, "mood syntax error"), \ PARA_ERROR(NO_MOOD, "no mood available"), \ - PARA_ERROR(NOT_ADMISSIBLE, "file is not admissible"), \ PARA_ERROR(DUMMY_ROW, "attempted to access blob dummy object"), \ diff --git a/mood.c b/mood.c index 540d0c70..24d1de29 100644 --- a/mood.c +++ b/mood.c @@ -248,14 +248,14 @@ static int mm_is_set_score_function(__a_unused const char *path, return -100; } -/* returns 1 if row matches score item, negative otherwise */ -static int add_item_score(const struct osl_row *row, struct mood_item *item, long *score, - long *score_arg_sum) +/* returns 1 if row matches score item, 0 if not, negative on errors */ +static int get_item_score(const struct osl_row *row, struct mood_item *item, + long *score, long *score_arg_sum) { struct afs_info afsi; struct afh_info afhi; char *path; - int ret; + int ret, match = 1; *score_arg_sum += item->random_score? 100 : PARA_ABS(item->score_arg); ret = 100; @@ -273,36 +273,55 @@ static int add_item_score(const struct osl_row *row, struct mood_item *item, lon ret = item->method->score_function(path, &afsi, &afhi, item->parser_data); if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not)) - return -1; /* no match */ + match = 0; /* no match */ } if (item->random_score) - *score += PARA_ABS(ret) * para_random(100); + *score = PARA_ABS(ret) * para_random(100); else - *score += PARA_ABS(ret) * item->score_arg; - return 1; + *score = PARA_ABS(ret) * item->score_arg; + return match; } +/* returns 1 if row admissible, 0 if not, negative on errors */ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m, long *result) { struct mood_item *item; - int match = 0; - long score_arg_sum = 0, score = 0; + int ret, match = 0; + long score_arg_sum = 0, score = 0, item_score; if (!m) return -E_NO_MOOD; /* reject audio file if it matches any entry in the deny list */ - list_for_each_entry(item, &m->deny_list, mood_item_node) - if (add_item_score(aft_row, item, &score, &score_arg_sum) > 0) - return -E_NOT_ADMISSIBLE; - list_for_each_entry(item, &m->accept_list, mood_item_node) - if (add_item_score(aft_row, item, &score, &score_arg_sum) > 0) - match = 1; + list_for_each_entry(item, &m->deny_list, mood_item_node) { + ret = get_item_score(aft_row, item, &item_score, + &score_arg_sum); + if (ret < 0) + return ret; + if (ret > 0) /* not admissible */ + return 0; + score += item_score; + } + list_for_each_entry(item, &m->accept_list, mood_item_node) { + ret = get_item_score(aft_row, item, &item_score, + &score_arg_sum); + if (ret < 0) + return ret; + if (ret == 0) + continue; + match = 1; + score += item_score; + } /* reject if there is no matching entry in the accept list */ if (!match && !list_empty(&m->accept_list)) - return -E_NOT_ADMISSIBLE; - list_for_each_entry(item, &m->score_list, mood_item_node) - add_item_score(aft_row, item, &score, &score_arg_sum); + return 0; + list_for_each_entry(item, &m->score_list, mood_item_node) { + ret = get_item_score(aft_row, item, &item_score, + &score_arg_sum); + if (ret < 0) + return ret; + score += item_score; + } if (score_arg_sum) score /= score_arg_sum; *result = score; @@ -730,7 +749,7 @@ struct admissible_array { * \param aft_row The audio file to be added. * \param private_data Pointer to a struct admissible_file_info. * - * \return Negative on errors, positive on success. + * \return 1 if row admissible, 0 if not, negative on errors. */ static int add_if_admissible(struct osl_row *aft_row, void *data) { @@ -739,8 +758,8 @@ static int add_if_admissible(struct osl_row *aft_row, void *data) long score = 0; ret = compute_mood_score(aft_row, aa->m, &score); - if (ret < 0) - return (ret == -E_NOT_ADMISSIBLE)? 1 : ret; + if (ret <= 0) + return ret; if (statistics.num >= aa->size) { aa->size *= 2; aa->size += 100; @@ -878,6 +897,8 @@ static int mood_update_audio_file(const struct osl_row *aft_row, return ret; was_admissible = ret; ret = compute_mood_score(aft_row, current_mood, &score); + if (ret < 0) + return ret; is_admissible = (ret > 0); if (!was_admissible && !is_admissible) return 1;