forked from usnistgov/trec_eval
-
Notifications
You must be signed in to change notification settings - Fork 0
/
m_binG.c
65 lines (59 loc) · 1.91 KB
/
m_binG.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
54
55
56
57
58
59
60
61
62
63
64
65
/*
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"
double log2(double x);
static int
te_calc_binG (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_binG = {"binG",
" Binary G\n\
Experimental measure. (4/10/2008)\n\
G is a gain related measure that combines qualities of MAP and NDCG.\n\
G(doc) == rel_level_gain (doc) / log2 (2+num_nonrel retrieved before doc)\n\
G is the average of G(doc) over all docs, normalized by\n\
sum (rel_level_gain).\n\
BinG restricts the gain to either 0 or 1 (nonrel or rel), and thus is the\n\
average over all rel docs of (1 / log2 (2+num_nonrel before doc))\n",
te_init_meas_s_float,
te_calc_binG,
te_acc_meas_s,
te_calc_avg_meas_s,
te_print_single_meas_s_float,
te_print_final_meas_s_float,
NULL, -1};
static int
te_calc_binG (const EPI *epi, const REL_INFO *rel_info, const RESULTS *results,
const TREC_MEAS *tm, TREC_EVAL *eval)
{
RES_RELS res_rels;
double sum;
long rel_so_far;
long i;
if (UNDEF == te_form_res_rels (epi, rel_info, results, &res_rels))
return (UNDEF);
rel_so_far = 0;
sum = 0.0;
for (i = 0; i < res_rels.num_ret; i++) {
if (res_rels.results_rel_list[i] >= epi->relevance_level) {
rel_so_far++;
sum += (double) 1.0 / (double) log2 ((double) (3 + i - rel_so_far));
if (epi->debug_level > 0)
printf("binG: %ld %ld %6.4f\n",
i, rel_so_far, sum);
}
}
/* Average over the rel docs */
if (rel_so_far) {
eval->values[tm->eval_index].value =
sum / (double) res_rels.num_rel;
}
return (1);
}