@@ -857,11 +857,28 @@ data_size_t Metadata::BuildPairwiseFeatureRanking(const Metadata& metadata) {
857
857
num_data_ = 0 ;
858
858
num_queries_ = metadata.num_queries ();
859
859
label_.clear ();
860
- paired_label_.clear ();
861
860
if (pairwise_ranking_mode_ == PairwiseRankingMode::kRelevance ) {
862
- const label_t * labels = metadata.label ();
861
+ const label_t * original_label = metadata.label ();
863
862
paired_ranking_item_index_map_.clear ();
864
863
const data_size_t * query_boundaries = metadata.query_boundaries ();
864
+
865
+ // backup original query boundaries
866
+ original_query_boundaries_.clear ();
867
+ original_query_boundaries_.resize (num_queries_);
868
+ const int num_threads = OMP_NUM_THREADS ();
869
+ #pragma omp parallel for schedule(static) num_threads(num_threads) if (num_queries_ >= 1024)
870
+ for (data_size_t i = 0 ; i < num_queries_; ++i) {
871
+ original_query_boundaries_[i] = query_boundaries[i];
872
+ }
873
+
874
+ // copy labels
875
+ const data_size_t original_num_data = query_boundaries[num_queries_];
876
+ label_.resize (original_num_data);
877
+ #pragma omp parallel for schedule(static) num_threads(num_threads) if (original_num_data >= 1024)
878
+ for (data_size_t i = 0 ; i < original_num_data; ++i) {
879
+ label_[i] = original_label[i];
880
+ }
881
+
865
882
data_size_t num_pairs_in_query = 0 ;
866
883
query_boundaries_.clear ();
867
884
query_boundaries_.push_back (0 );
@@ -870,16 +887,14 @@ data_size_t Metadata::BuildPairwiseFeatureRanking(const Metadata& metadata) {
870
887
const data_size_t query_start = query_boundaries[query_index];
871
888
const data_size_t query_end = query_boundaries[query_index + 1 ];
872
889
for (data_size_t item_index_i = query_start; item_index_i < query_end; ++item_index_i) {
873
- const label_t label_i = labels [item_index_i];
890
+ const label_t label_i = label_ [item_index_i];
874
891
for (data_size_t item_index_j = query_start; item_index_j < query_end; ++item_index_j) {
875
892
if (item_index_i == item_index_j) {
876
893
continue ;
877
894
}
878
- const label_t label_j = labels[item_index_j];
879
- label_.push_back (label_i);
880
- paired_label_.push_back (label_j);
895
+ const label_t label_j = label_[item_index_j];
881
896
if (label_i != label_j) {
882
- paired_ranking_item_index_map_.push_back (std::pair<data_size_t , data_size_t >{item_index_i, item_index_j});
897
+ paired_ranking_item_index_map_.push_back (std::pair<data_size_t , data_size_t >{item_index_i - query_start , item_index_j - query_start });
883
898
++num_pairs_in_query;
884
899
++num_data_;
885
900
}
@@ -894,7 +909,7 @@ data_size_t Metadata::BuildPairwiseFeatureRanking(const Metadata& metadata) {
894
909
// TODO(shiyu1994)
895
910
Log::Fatal (" Not implemented." );
896
911
}
897
-
912
+
898
913
return num_data_;
899
914
}
900
915
0 commit comments