forked from usnistgov/trec_eval
-
Notifications
You must be signed in to change notification settings - Fork 1
/
m_recip_rank.c
53 lines (46 loc) · 1.38 KB
/
m_recip_rank.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
Copyright (c) 2008 - Chris Buckley.
Permission is granted for use and modification of this file for
research, non-commercial purposes.
*/
#include "common.h"
#include "sysfunc.h"
#include "trec_eval.h"
#include "functions.h"
#include "trec_format.h"
static int
te_calc_recip_rank (const EPI *epi, const REL_INFO *rel_info,
const RESULTS *results, const TREC_MEAS *tm,
TREC_EVAL *eval);
/* See trec_eval.h for definition of TREC_MEAS */
TREC_MEAS te_meas_recip_rank =
{"recip_rank",
" Reciprocal Rank of the first relevant retrieved doc.\n\
Measure is most useful for tasks in which there is only one relevant\n\
doc, or the user only wants one relevant doc.\n",
te_init_meas_s_double,
te_calc_recip_rank,
te_acc_meas_s,
te_calc_avg_meas_s,
te_print_single_meas_s_double,
te_print_final_meas_s_double,
NULL, -1
};
static int
te_calc_recip_rank (const EPI *epi, const REL_INFO *rel_info,
const RESULTS *results, const TREC_MEAS *tm,
TREC_EVAL *eval)
{
RES_RELS res_rels;
long i;
if (UNDEF == te_form_res_rels (epi, rel_info, results, &res_rels))
return (UNDEF);
for (i = 0; i < res_rels.num_ret; i++) {
if (res_rels.results_rel_list[i] >= epi->relevance_level)
break;
}
if (i < res_rels.num_ret)
eval->values[tm->eval_index].value =
(double) 1.0 / (double) (i+1);
return (1);
}