/* 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_num_rel (const EPI *epi, const REL_INFO *rel_info, const RESULTS *results, const TREC_MEAS *tm, TREC_EVAL *eval); static int te_calc_avg_num_rel (const EPI *epi, const TREC_MEAS *tm, const ALL_REL_INFO *all_rel_info, TREC_EVAL *accum_eval); /* See trec_eval.h for definition of TREC_MEAS */ TREC_MEAS te_meas_num_rel = {"num_rel", " Number of relevant documents for topic. \n\ May be affected by Judged_docs_only and Max_retrieved_per_topic command\n\ line parameters (as are most measures).\n\ Summary figure is sum of individual topics, not average.\n", te_init_meas_s_long, te_calc_num_rel, te_acc_meas_s, te_calc_avg_num_rel, te_print_single_meas_s_long, te_print_final_meas_s_long, NULL, -1}; static int te_calc_num_rel (const EPI *epi, const REL_INFO *rel_info, const RESULTS *results, const TREC_MEAS *tm, TREC_EVAL *eval) { RES_RELS res_rels; if (UNDEF == te_form_res_rels (epi, rel_info, results, &res_rels)) return (UNDEF); eval->values[tm->eval_index].value = (double) res_rels.num_rel; return (1); } /* Need custom calc_avg because of -c flag (epi->average_comple_flag). Have to go back to original qrels info to get num_qrels in all topics (not just those with retrieved docs) */ static int te_calc_avg_num_rel (const EPI *epi, const TREC_MEAS *tm, const ALL_REL_INFO *all_rel_info, TREC_EVAL *accum_eval) { long i,j,k; long num_rel; if (! epi->average_complete_flag) return (1); num_rel = 0; for (i = 0; i < all_rel_info->num_q_rels; i++) { if (0 == strcmp ("qrels", all_rel_info->rel_info[i].rel_format)) { TEXT_QRELS_INFO *trec_qrels; trec_qrels = (TEXT_QRELS_INFO *) all_rel_info->rel_info[i].q_rel_info; for (j = 0; j < trec_qrels->num_text_qrels; j++) { if (trec_qrels->text_qrels[j].rel > 0) num_rel++; } } else if (0 == strcmp ("qrels_jg", all_rel_info->rel_info[i].rel_format)) { TEXT_QRELS_JG_INFO *trec_qrels; trec_qrels = (TEXT_QRELS_JG_INFO *) all_rel_info->rel_info[i].q_rel_info; for (j = 0; j < trec_qrels->num_text_qrels_jg; j++) { for (k = 0; k < trec_qrels->text_qrels_jg[j].num_text_qrels; k++) { if (trec_qrels->text_qrels_jg[j].text_qrels[k].rel > 0) num_rel++; } } } else { fprintf (stderr, "trec_eval: m_num_rel: rel_info format not qrels or qrels_jg\n"); return (UNDEF); } } accum_eval->values[tm->eval_index].value = num_rel; return (1); }