| 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) { |
| 131 | // get sorted indices by score |
| 132 | std::vector<data_size_t> sorted_idx(num_data); |
| 133 | for (data_size_t i = 0; i < num_data; ++i) { |
| 134 | sorted_idx[i] = i; |
| 135 | } |
| 136 | std::stable_sort(sorted_idx.begin(), sorted_idx.end(), |
| 137 | [score](data_size_t a, data_size_t b) {return score[a] > score[b]; }); |
| 138 | |
| 139 | double cur_result = 0.0f; |
| 140 | data_size_t cur_left = 0; |
| 141 | // calculate multi dcg by one pass |
| 142 | for (size_t i = 0; i < ks.size(); ++i) { |
| 143 | data_size_t cur_k = ks[i]; |
| 144 | if (cur_k > num_data) { cur_k = num_data; } |
| 145 | for (data_size_t j = cur_left; j < cur_k; ++j) { |
| 146 | data_size_t idx = sorted_idx[j]; |
| 147 | cur_result += label_gain_[static_cast<int>(label[idx])] * discount_[j]; |
| 148 | } |
| 149 | (*out)[i] = cur_result; |
| 150 | cur_left = cur_k; |
| 151 | } |
| 152 | } |
| 153 | |
| 154 | void DCGCalculator::CheckLabel(const label_t* label, data_size_t num_data) { |
| 155 | for (data_size_t i = 0; i < num_data; ++i) { |
nothing calls this directly
no test coverage detected