| 44 | ~LambdarankNDCG() { |
| 45 | } |
| 46 | void Init(const Metadata& metadata, data_size_t num_data) override { |
| 47 | num_data_ = num_data; |
| 48 | // get label |
| 49 | label_ = metadata.label(); |
| 50 | DCGCalculator::CheckLabel(label_, num_data_); |
| 51 | // get weights |
| 52 | weights_ = metadata.weights(); |
| 53 | // get boundries |
| 54 | query_boundaries_ = metadata.query_boundaries(); |
| 55 | if (query_boundaries_ == nullptr) { |
| 56 | Log::Fatal("Lambdarank tasks require query information"); |
| 57 | } |
| 58 | num_queries_ = metadata.num_queries(); |
| 59 | // cache inverse max DCG, avoid computation many times |
| 60 | inverse_max_dcgs_.resize(num_queries_); |
| 61 | #pragma omp parallel for schedule(static) |
| 62 | for (data_size_t i = 0; i < num_queries_; ++i) { |
| 63 | inverse_max_dcgs_[i] = DCGCalculator::CalMaxDCGAtK(optimize_pos_at_, |
| 64 | label_ + query_boundaries_[i], |
| 65 | query_boundaries_[i + 1] - query_boundaries_[i]); |
| 66 | |
| 67 | if (inverse_max_dcgs_[i] > 0.0) { |
| 68 | inverse_max_dcgs_[i] = 1.0f / inverse_max_dcgs_[i]; |
| 69 | } |
| 70 | } |
| 71 | // construct sigmoid table to speed up sigmoid transform |
| 72 | ConstructSigmoidTable(); |
| 73 | } |
| 74 | |
| 75 | void GetGradients(const double* score, score_t* gradients, |
| 76 | score_t* hessians) const override { |
nothing calls this directly
no test coverage detected