33 for (
auto k : eval_at_) {
34 name_.emplace_back(std::string(
"map@") + std::to_string(k));
38 label_ = metadata.
label();
41 if (query_boundaries_ ==
nullptr) {
42 Log::Fatal(
"For MAP metric, there should be query information");
45 Log::Info(
"Total groups: %d, total data: %d", num_queries_, num_data_);
48 if (query_weights_ ==
nullptr) {
49 sum_query_weights_ =
static_cast<double>(num_queries_);
51 sum_query_weights_ = 0.0f;
53 sum_query_weights_ += query_weights_[i];
57 npos_per_query_.resize(num_queries_, 0);
59 for (
data_size_t j = query_boundaries_[i]; j < query_boundaries_[i + 1]; ++j) {
60 if (label_[j] > 0.5f) {
108 std::vector<std::vector<double>> result_buffer_;
109 for (
int i = 0; i < num_threads_; ++i) {
110 result_buffer_.emplace_back(eval_at_.size(), 0.0f);
112 std::vector<double> tmp_map(eval_at_.size(), 0.0f);
113 if (query_weights_ ==
nullptr) {
114 #pragma omp parallel for schedule(guided) firstprivate(tmp_map)
116 const int tid = omp_get_thread_num();
117 CalMapAtK(eval_at_, npos_per_query_[i], label_ + query_boundaries_[i],
118 score + query_boundaries_[i], query_boundaries_[i + 1] - query_boundaries_[i], &tmp_map);
119 for (
size_t j = 0; j < eval_at_.size(); ++j) {
120 result_buffer_[tid][j] += tmp_map[j];
124 #pragma omp parallel for schedule(guided) firstprivate(tmp_map)
126 const int tid = omp_get_thread_num();
127 CalMapAtK(eval_at_, npos_per_query_[i], label_ + query_boundaries_[i],
128 score + query_boundaries_[i], query_boundaries_[i + 1] - query_boundaries_[i], &tmp_map);
129 for (
size_t j = 0; j < eval_at_.size(); ++j) {
130 result_buffer_[tid][j] += tmp_map[j] * query_weights_[i];
135 std::vector<double> result(eval_at_.size(), 0.0f);
136 for (
size_t j = 0; j < result.size(); ++j) {
137 for (
int i = 0; i < num_threads_; ++i) {
138 result[j] += result_buffer_[i][j];
140 result[j] /= sum_query_weights_;