| 107 | |
| 108 | |
| 109 | double DCGCalculator::CalDCGAtK(data_size_t k, const label_t* label, |
| 110 | const double* score, data_size_t num_data) { |
| 111 | // get sorted indices by score |
| 112 | std::vector<data_size_t> sorted_idx(num_data); |
| 113 | for (data_size_t i = 0; i < num_data; ++i) { |
| 114 | sorted_idx[i] = i; |
| 115 | } |
| 116 | std::stable_sort(sorted_idx.begin(), sorted_idx.end(), |
| 117 | [score](data_size_t a, data_size_t b) {return score[a] > score[b]; }); |
| 118 | |
| 119 | if (k > num_data) { k = num_data; } |
| 120 | double dcg = 0.0f; |
| 121 | // calculate dcg |
| 122 | for (data_size_t i = 0; i < k; ++i) { |
| 123 | data_size_t idx = sorted_idx[i]; |
| 124 | dcg += label_gain_[static_cast<int>(label[idx])] * discount_[i]; |
| 125 | } |
| 126 | return dcg; |
| 127 | } |
| 128 | |
| 129 | void DCGCalculator::CalDCG(const std::vector<data_size_t>& ks, const label_t* label, |
| 130 | const double * score, data_size_t num_data, std::vector<double>* out) { |
nothing calls this directly
no test coverage detected