-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathm_err.c
More file actions
65 lines (53 loc) · 1.99 KB
/
m_err.c
File metadata and controls
65 lines (53 loc) · 1.99 KB
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
54
55
56
57
58
59
60
61
62
63
64
65
/*
Copyright (c) 2016 - Daniel Valcarce.
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_err(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_err =
{ "err",
" Expected 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 using graded relevance.\n\
Gain values are set to the appropriate relevance level by default.\n\
Cite: Olivier Chapelle, Donald Metlzer, Ya Zhang, and Pierre Grinspan.\n\
2009. Expected Reciprocal Rank for Graded Relevance. In Proceedings of\n\
the 18th ACM Conference on Information and Knowledge Management\n\
(CIKM '09). ACM, New York, NY, USA, 621-630.\n\
DOI=http://dx.doi.org/10.1145/1645953.1646033 \n",
te_init_meas_s_float, te_calc_err, te_acc_meas_s,
te_calc_avg_meas_s, te_print_single_meas_s_float,
te_print_final_meas_s_float, NULL, -1 };
static double compute_gain(const long rel_level, const long max_rel);
static int te_calc_err(const EPI *epi, const REL_INFO *rel_info,
const RESULTS *results, const TREC_MEAS *tm, TREC_EVAL *eval) {
RES_RELS res_rels;
double p;
double err;
double gain;
long r;
if (UNDEF == te_form_res_rels(epi, rel_info, results, &res_rels))
return (UNDEF);
p = 1.0;
err = 0.0;
for (r = 0; r < res_rels.num_ret; r++) {
gain = compute_gain(res_rels.results_rel_list[r],
res_rels.num_rel_levels);
err += p * gain / (double) (r + 1);
p *= 1.0 - gain;
}
eval->values[tm->eval_index].value = err;
return (1);
}
static inline double compute_gain(const long rel_level, const long max_rel) {
return rel_level > 0 ?
(pow(2.0, rel_level) - 1.0) / pow(2.0, (max_rel - 1)) : 0.0;
}