/* main()-25 statements */ int main(int argc, char *argv[]) { char str[STR_SIZE],query[STR_SIZE],c; int bytes=0,count_l=1; ranker_t ranked_lines[MAX_LINES_OUT]; initialize_ranked(ranked_lines); /* Checking if no command line query is given as input */ if(argc<2) { printf("Sorry !! But the query is cannot be empty !!"); exit(EXIT_FAILURE); } strcpy(query,argv[1]); check_query(query); /* Printing the query for S0 */ printf("S0: query = %s",query); printf("\n---"); /*Taking each line as input */ while((c=getchar())!=EOF) { /* Checking for end of each line */ if(c=='\n') { str[bytes]='\0'; /* Checking if each line is valid */ check_line(str); /* Manipulations to give the S1,S2,S3 AND S4*/ manip(str,query,count_l,ranked_lines); strcpy(str,""); bytes=0; count_l++; } else { str[bytes]=c; /* Putting characters into the string */ bytes++; } } printf("---------------------------------------------"); print_rankedlines(ranked_lines); /* All done !! Thank You. */ return 0; }
int ir_eval_results() { return testing::run_test( "ir-eval-results", [&]() { create_config("file"); index::ir_eval eval{"test-config.toml"}; ASSERT_APPROX_EQUAL(eval.map(), 0.0); ASSERT_APPROX_EQUAL(eval.gmap(), 0.0); // make some fake results based on the loaded qrels file std::vector<std::pair<doc_id, double>> results; query_id qid{0}; auto idcg_5 = 1.0 + 1.0 / std::log2(3.0) + 1.0 / std::log2(4.0) + 1.0 / std::log2(5.0) + 1.0 / std::log2(6.0); auto idcg = idcg_5 + 1.0 / std::log2(7.0) + 1.0 / std::log2(8.0) + 1.0 / std::log2(9.0) + 1.0 / std::log2(10.0) + 1.0 / std::log2(11.0); results.emplace_back(doc_id{0}, 1.0); // relevant check_query(eval, results, qid, 0.2 / 1.1, 1, 0.1, 0.1, 1.0 / idcg); check_query(eval, results, qid, 0.2 / 1.1, 1, 0.1, 0.2, 1.0 / idcg_5, 5); results.emplace_back(doc_id{2}, 0.9); // not relevant check_query(eval, results, qid, 0.1 / 0.6, 0.5, 0.1, 0.1, 1.0 / idcg); check_query(eval, results, qid, 0.1 / 0.6, 0.5, 0.1, 0.2, 1.0 / idcg_5, 5); results.emplace_back(doc_id{1}, 0.8); // relevant check_query(eval, results, qid, (2.0 * (2.0 / 3.0) * 0.2) / (2.0 / 3.0 + 0.2), 2.0 / 3.0, 0.2, 1.0 / 6.0, 1.5 / idcg); check_query(eval, results, qid, (2.0 * (2.0 / 3.0) * 0.2) / (2.0 / 3.0 + 0.2), 2.0 / 3.0, 0.2, 1.0 / 3.0, 1.5 / idcg_5, 5); results.emplace_back(doc_id{30}, 0.8); // relevant results.emplace_back(doc_id{6}, 0.7); // relevant results.emplace_back(doc_id{43}, 0.6); // relevant results.emplace_back(doc_id{24}, 0.5); // relevant results.emplace_back(doc_id{34}, 0.4); // relevant results.emplace_back(doc_id{35}, 0.3); // relevant results.emplace_back(doc_id{38}, 0.2); // relevant results.emplace_back(doc_id{754}, 0.1); // relevant auto avg_p_5 = (1.0 + 2.0 / 3.0 + 3.0 / 4.0 + 4.0 / 5.0 + 5.0 / 6.0) / 5.0; auto avg_p = (1.0 + 2.0 / 3.0 + 3.0 / 4.0 + 4.0 / 5.0 + 5.0 / 6.0 + 6.0 / 7.0 + 7.0 / 8.0 + 8.0 / 9.0 + 9.0 / 10.0 + 10.0 / 11.0) / 10.0; auto dcg_5 = 1.0 + 1.0 / std::log2(4.0) + 1.0 / std::log2(5.0) + 1.0 / std::log2(6.0); // 4 terms, 1 zero term auto dcg = dcg_5 + 1.0 / std::log2(7.0) + 1.0 / std::log2(8.0) + 1.0 / std::log2(9.0) + 1.0 / std::log2(10.0) + 1.0 / std::log2(11.0) + 1.0 / std::log2(12.0); check_query(eval, results, qid, (2.0 * (10.0 / 11.0)) / ((10.0 / 11.0) + 1.0), 10.0 / 11.0, 1.0, avg_p, dcg / idcg); check_query(eval, results, qid, (2.0 * (4.0 / 5.0) * 0.4) / ((4.0 / 5.0) + 0.4), 4.0 / 5.0, 0.4, avg_p_5, dcg_5 / idcg_5, 5); results.erase(results.begin() + 1); // remove non-relevant result check_query(eval, results, qid, 1.0, 1.0, 1.0, 1.0, 1.0); // recall is still not perfect @5 check_query(eval, results, qid, 1.0 / 1.5, 1.0, 0.5, 1.0, 1.0, 5); system("rm test-config.toml"); }); }