From 3cdfd83e6c2c5c45bf2e8bde5ed4e8c8e88d6420 Mon Sep 17 00:00:00 2001 From: Yu Shi Date: Thu, 28 Mar 2024 08:59:59 +0000 Subject: [PATCH] refactor template initializations with macro --- include/LightGBM/bin.h | 6 +- include/LightGBM/dataset.h | 3 +- .../LightGBM/pairwise_ranking_feature_group.h | 3 +- src/io/bin.cpp | 24 +- src/io/dataset.cpp | 23 +- src/io/pairwise_lambdarank_bin.cpp | 1146 +++-------------- src/io/pairwise_lambdarank_bin.hpp | 257 +++- src/io/pairwise_ranking_feature_group.cpp | 9 +- 8 files changed, 447 insertions(+), 1024 deletions(-) diff --git a/include/LightGBM/bin.h b/include/LightGBM/bin.h index bec1f5f6bd3..2d77e74eec1 100644 --- a/include/LightGBM/bin.h +++ b/include/LightGBM/bin.h @@ -509,9 +509,10 @@ class Bin { * \param num_bin Number of bin * \param paired_ranking_item_index_map Map from data index to the original index for items in the pair * \param diff_bin_mappers Bin mappers for differential features in this group + * \param bin_offsets Bin offsets in feature group * \return The bin data object */ - static Bin* CreateDensePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers); + static Bin* CreateDensePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers, const std::vector>* ori_bin_mappers, const std::vector* bin_offsets); /*! * \brief Create object for bin data of the differential feature in pair, used for pairwise ranking, for an original sparse bin @@ -519,9 +520,10 @@ class Bin { * \param num_bin Number of bin * \param paired_ranking_item_index_map Map from data index to the original index for items in the pair * \param diff_bin_mappers Bin mappers for differential features in this group + * \param bin_offsets Bin offsets in feature group * \return The bin data object */ - static Bin* CreateSparsePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers); + static Bin* CreateSparsePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers, const std::vector>* ori_bin_mappers, const std::vector* bin_offsets); /*! * \brief Deep copy the bin diff --git a/include/LightGBM/dataset.h b/include/LightGBM/dataset.h index ff59d76c325..8d4d745af63 100644 --- a/include/LightGBM/dataset.h +++ b/include/LightGBM/dataset.h @@ -1065,9 +1065,10 @@ class Dataset { void CreatePairwiseRankingDifferentialFeatures( const std::vector>& sample_values, const std::vector>& sample_indices, - const std::vector& bin_mappers, + const std::vector>& bin_mappers, const data_size_t num_total_sample_data, std::vector>* differential_feature_bin_mappers, + std::vector* diff_original_feature_index, const Config& config) const; std::string data_filename_; diff --git a/include/LightGBM/pairwise_ranking_feature_group.h b/include/LightGBM/pairwise_ranking_feature_group.h index d6ba3f123c9..1cca9f1fc3c 100644 --- a/include/LightGBM/pairwise_ranking_feature_group.h +++ b/include/LightGBM/pairwise_ranking_feature_group.h @@ -126,7 +126,7 @@ class PairwiseRankingDifferentialFeatureGroup: public PairwiseRankingFeatureGrou * \param is_first_or_second_in_pairing Mark whether features in this group belong to the first or second element in the pairing */ - PairwiseRankingDifferentialFeatureGroup(const FeatureGroup& other, int num_original_data, const int is_first_or_second_in_pairing, int num_pairs, const std::pair* paired_ranking_item_index_map, std::vector>& diff_feature_bin_mappers); + PairwiseRankingDifferentialFeatureGroup(const FeatureGroup& other, int num_original_data, const int is_first_or_second_in_pairing, int num_pairs, const std::pair* paired_ranking_item_index_map, std::vector>& diff_feature_bin_mappers, std::vector>& ori_feature_bin_mappers); /*! \brief Destructor */ ~PairwiseRankingDifferentialFeatureGroup() {} @@ -135,6 +135,7 @@ class PairwiseRankingDifferentialFeatureGroup: public PairwiseRankingFeatureGrou void CreateBinData(int num_data, bool is_multi_val, bool force_dense, bool force_sparse) override; std::vector> diff_feature_bin_mappers_; + std::vector> ori_feature_bin_mappers_; }; diff --git a/src/io/bin.cpp b/src/io/bin.cpp index 75142fab03b..0abeba22eef 100644 --- a/src/io/bin.cpp +++ b/src/io/bin.cpp @@ -677,14 +677,26 @@ namespace LightGBM { } } - Bin* Bin::CreateDensePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers) { - // TODO(shiyu1994) - return nullptr; + Bin* Bin::CreateDensePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers, const std::vector>* ori_bin_mappers, const std::vector* bin_offsets) { + if (num_bin <= 16) { + return new DensePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new DenseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } else if (num_bin <= 256) { + return new DensePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new DenseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } else if (num_bin <= 65536) { + return new DensePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new DenseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } else { + return new DensePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new DenseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } } - Bin* Bin::CreateSparsePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers) { - // TODO(shiyu1994) - return nullptr; + Bin* Bin::CreateSparsePairwiseRankingDiffBin(data_size_t num_original_data, int num_bin, data_size_t num_pairs, const std::pair* paired_ranking_item_index_map, const std::vector>* diff_bin_mappers, const std::vector>* ori_bin_mappers, const std::vector* bin_offsets) { + if (num_bin <= 256) { + return new SparsePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new SparseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } else if (num_bin <= 65536) { + return new SparsePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new SparseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } else { + return new SparsePairwiseRankingDiffBin(num_pairs, paired_ranking_item_index_map, new SparseBin(num_original_data), diff_bin_mappers, ori_bin_mappers, bin_offsets); + } } MultiValBin* MultiValBin::CreateMultiValBin(data_size_t num_data, int num_bin, int num_feature, diff --git a/src/io/dataset.cpp b/src/io/dataset.cpp index 21a4ba79c0b..c99eadb82a3 100644 --- a/src/io/dataset.cpp +++ b/src/io/dataset.cpp @@ -875,17 +875,18 @@ void Dataset::CreatePairWiseRankingData(const Dataset* dataset, const bool is_va // create differential features std::vector> diff_feature_bin_mappers; - std::vector original_bin_mappers; + std::vector> original_bin_mappers; + std::vector diff_original_feature_index; for (int i = 0; i < dataset->num_total_features_; ++i) { const int inner_feature_index = dataset->InnerFeatureIndex(i); if (inner_feature_index >= 0) { - original_bin_mappers.push_back(dataset->FeatureBinMapper(inner_feature_index)); + original_bin_mappers.emplace_back(dataset->FeatureBinMapper(inner_feature_index)); } else { - original_bin_mappers.push_back(nullptr); + original_bin_mappers.emplace_back(nullptr); } } - CreatePairwiseRankingDifferentialFeatures(sampled_values_, sampled_indices_, original_bin_mappers, num_total_sampled_data_, &diff_feature_bin_mappers, config); + CreatePairwiseRankingDifferentialFeatures(sampled_values_, sampled_indices_, original_bin_mappers, num_total_sampled_data_, &diff_feature_bin_mappers, &diff_original_feature_index, config); std::vector used_diff_features; for (int diff_feature_index = 0; diff_feature_index < static_cast(diff_feature_bin_mappers.size()); ++diff_feature_index) { @@ -926,6 +927,8 @@ void Dataset::CreatePairWiseRankingData(const Dataset* dataset, const bool is_va const std::vector& features_in_group = diff_feature_groups[i]; group_feature_start_.push_back(cur_feature_index); int sub_feature_index = 0; + std::vector> ori_bin_mappers; + std::vector> diff_bin_mappers; for (size_t j = 0; j < features_in_group.size(); ++j) { const int diff_feature_index = features_in_group[j]; if (!diff_feature_bin_mappers[diff_feature_index]->is_trivial()) { @@ -936,9 +939,15 @@ void Dataset::CreatePairWiseRankingData(const Dataset* dataset, const bool is_va feature2subfeature_.push_back(sub_feature_index); ++cur_feature_index; ++sub_feature_index; + const int ori_feature_index = dataset->InnerFeatureIndex(diff_original_feature_index[diff_feature_index]); + ori_bin_mappers.emplace_back(new BinMapper(*dataset->FeatureBinMapper(ori_feature_index))); + diff_bin_mappers.emplace_back(new BinMapper(*diff_feature_bin_mappers[diff_feature_index])); } } + FeatureGroup feature_group(sub_feature_index, 0, &ori_bin_mappers, dataset->num_data(), i + num_groups_); + feature_groups_.emplace_back(new PairwiseRankingDifferentialFeatureGroup(feature_group, dataset->num_data(), 2, metadata_.paired_ranking_item_index_map_size(), metadata_.paired_ranking_item_global_index_map(), diff_bin_mappers, ori_bin_mappers)); + group_feature_cnt_.push_back(cur_feature_index - group_feature_start_.back()); } @@ -1937,16 +1946,17 @@ const void* Dataset::GetColWiseData( void Dataset::CreatePairwiseRankingDifferentialFeatures( const std::vector>& sample_values, const std::vector>& sample_indices, - const std::vector& bin_mappers, + const std::vector>& bin_mappers, const data_size_t num_total_sample_data, std::vector>* differential_feature_bin_mappers, + std::vector* diff_original_feature_index, const Config& config) const { const int num_original_features = static_cast(sample_values.size()); const data_size_t filter_cnt = static_cast( static_cast(config.min_data_in_leaf * num_total_sample_data) / num_data_); std::vector numerical_feature_indices; for (int i = 0; i < num_original_features; ++i) { - if (bin_mappers[i] != nullptr && bin_mappers[i]->bin_type() == BinType::NumericalBin) { + if (bin_mappers[i] != nullptr && !bin_mappers[i]->is_trivial() && bin_mappers[i]->bin_type() == BinType::NumericalBin) { numerical_feature_indices.push_back(i); } } @@ -1959,6 +1969,7 @@ void Dataset::CreatePairwiseRankingDifferentialFeatures( #pragma omp parallel for schedule(static) num_threads(num_threads) for (int i = 0; i < num_numerical_features; ++i) { const int feature_index = numerical_feature_indices[i]; + diff_original_feature_index->push_back(feature_index); const data_size_t num_samples_for_feature = static_cast(sample_values[feature_index].size()); if (config.zero_as_missing) { for (int j = 0; j < num_samples_for_feature; ++j) { diff --git a/src/io/pairwise_lambdarank_bin.cpp b/src/io/pairwise_lambdarank_bin.cpp index 6d85179099c..bade0372444 100644 --- a/src/io/pairwise_lambdarank_bin.cpp +++ b/src/io/pairwise_lambdarank_bin.cpp @@ -13,161 +13,41 @@ void PairwiseRankingBin::InitStreaming(uint32_t num_thr unpaired_bin_->InitStreaming(num_thread, omp_max_threads); } -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); - template class ITERATOR_TYPE> void PairwiseRankingBin::Push(int tid, data_size_t idx, uint32_t value) { unpaired_bin_->Push(tid, idx, value); } -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::Push(int tid, data_size_t idx, uint32_t value); - template class ITERATOR_TYPE> void PairwiseRankingBin::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices) { unpaired_bin_->CopySubrow(full_bin, used_indices, num_used_indices); } -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); - template class ITERATOR_TYPE> void PairwiseRankingBin::SaveBinaryToFile(BinaryWriter* writer) const { unpaired_bin_->SaveBinaryToFile(writer); } -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::SaveBinaryToFile(BinaryWriter* writer) const; - template class ITERATOR_TYPE> void PairwiseRankingBin::LoadFromMemory(const void* memory, const std::vector& local_used_indices) { unpaired_bin_->LoadFromMemory(memory, local_used_indices); } -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::LoadFromMemory(const void* memory, const std::vector& local_used_indices); - template class ITERATOR_TYPE> size_t PairwiseRankingBin::SizesInByte() const { return unpaired_bin_->SizesInByte(); } -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; -template size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::SizesInByte() const; - template class ITERATOR_TYPE> data_size_t PairwiseRankingBin::num_data() const { return unpaired_bin_->num_data(); } -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingFirstIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; -template data_size_t PairwiseRankingBin, PairwiseRankingSecondIterator>::num_data() const; - template class ITERATOR_TYPE> void PairwiseRankingBin::ReSize(data_size_t num_data) { return unpaired_bin_->ReSize(num_data); } -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingFirstIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); -template void PairwiseRankingBin, PairwiseRankingSecondIterator>::ReSize(data_size_t num_data); - template class ITERATOR_TYPE> template void DensePairwiseRankingBin::ConstructHistogramInner( @@ -283,46 +163,6 @@ void DensePairwiseRankingBin::ConstructHistogram( data_indices, start, end, ordered_gradients, ordered_hessians, out); } -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, data_size_t end, - const score_t* ordered_gradients, const score_t* ordered_hessians, - hist_t* out) const; - template class ITERATOR_TYPE> void DensePairwiseRankingBin::ConstructHistogram( data_size_t start, data_size_t end, @@ -333,54 +173,6 @@ void DensePairwiseRankingBin::ConstructHistogram( nullptr, start, end, ordered_gradients, ordered_hessians, out); } -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* ordered_hessians, - hist_t* out) const; - template class ITERATOR_TYPE> void DensePairwiseRankingBin::ConstructHistogram( const data_size_t* data_indices, data_size_t start, @@ -390,46 +182,6 @@ void DensePairwiseRankingBin::ConstructHistogram( ordered_gradients, nullptr, out); } -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - template class ITERATOR_TYPE> void DensePairwiseRankingBin::ConstructHistogram( data_size_t start, data_size_t end, @@ -439,46 +191,6 @@ void DensePairwiseRankingBin::ConstructHistogram( nullptr, start, end, ordered_gradients, nullptr, out); } -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogram( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - template class ITERATOR_TYPE> void DensePairwiseRankingBin::ConstructHistogramInt8( const data_size_t* data_indices, data_size_t start, @@ -489,637 +201,109 @@ void DensePairwiseRankingBin::ConstructHistogramI data_indices, start, end, ordered_gradients, out); } -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt8( + data_size_t start, data_size_t end, + const score_t* ordered_gradients, const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + nullptr, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt8( const data_size_t* data_indices, data_size_t start, data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + data_indices, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt8( + data_size_t start, data_size_t end, + const score_t* ordered_gradients, + hist_t* out) const { + ConstructHistogramIntInner( + nullptr, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt16( const data_size_t* data_indices, data_size_t start, data_size_t end, const score_t* ordered_gradients, const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + data_indices, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt16( + data_size_t start, data_size_t end, + const score_t* ordered_gradients, const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + nullptr, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt16( const data_size_t* data_indices, data_size_t start, data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + data_indices, start, end, ordered_gradients, out); +} template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt8( +void DensePairwiseRankingBin::ConstructHistogramInt16( data_size_t start, data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, hist_t* out) const { - ConstructHistogramIntInner( + ConstructHistogramIntInner( nullptr, start, end, ordered_gradients, out); } -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt32( + const data_size_t* data_indices, data_size_t start, + data_size_t end, const score_t* ordered_gradients, const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + data_indices, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt32( data_size_t start, data_size_t end, const score_t* ordered_gradients, const score_t* /*ordered_hessians*/, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + nullptr, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt32( + const data_size_t* data_indices, data_size_t start, + data_size_t end, const score_t* ordered_gradients, + hist_t* out) const { + ConstructHistogramIntInner( + data_indices, start, end, ordered_gradients, out); +} -template void DensePairwiseRankingBin::ConstructHistogramInt8( +template class ITERATOR_TYPE> +void DensePairwiseRankingBin::ConstructHistogramInt32( data_size_t start, data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const { - ConstructHistogramIntInner( - data_indices, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const { - ConstructHistogramIntInner( - nullptr, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt8( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const { - ConstructHistogramIntInner( - data_indices, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const { - ConstructHistogramIntInner( - nullptr, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const { - ConstructHistogramIntInner( - data_indices, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const { - ConstructHistogramIntInner( - nullptr, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt16( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const { - ConstructHistogramIntInner( - data_indices, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const { - ConstructHistogramIntInner( - nullptr, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - const score_t* /*ordered_hessians*/, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const { - ConstructHistogramIntInner( - data_indices, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - const data_size_t* data_indices, data_size_t start, - data_size_t end, const score_t* ordered_gradients, - hist_t* out) const; - -template class ITERATOR_TYPE> -void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const { - ConstructHistogramIntInner( - nullptr, start, end, ordered_gradients, out); -} - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; - -template void DensePairwiseRankingBin::ConstructHistogramInt32( - data_size_t start, data_size_t end, - const score_t* ordered_gradients, - hist_t* out) const; + hist_t* out) const { + ConstructHistogramIntInner( + nullptr, start, end, ordered_gradients, out); +} template class ITERATOR_TYPE> template ::Split(uint32 #undef ARGUMENTS } -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - -template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, - uint32_t default_bin, uint32_t most_freq_bin, - MissingType missing_type, bool default_left, - uint32_t threshold, const data_size_t* data_indices, - data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; - template class ITERATOR_TYPE> data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, uint32_t most_freq_bin, MissingType missing_type, @@ -1327,60 +447,88 @@ data_size_t DensePairwiseRankingBin::Split(uint32 #undef ARGUMENTS } -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, +#define REGISTER_BIN_TYPE(BIN_TYPE, ITERATOR_TYPE) \ + template void PairwiseRankingBin::InitStreaming(uint32_t num_thread, int32_t omp_max_threads); \ + template void PairwiseRankingBin::Push(int tid, data_size_t idx, uint32_t value); \ + template void PairwiseRankingBin::CopySubrow(const Bin* full_bin, const data_size_t* used_indices, data_size_t num_used_indices); \ + template void PairwiseRankingBin::SaveBinaryToFile(BinaryWriter* writer) const; \ + template void PairwiseRankingBin::LoadFromMemory(const void* memory, const std::vector& local_used_indices); \ + template size_t PairwiseRankingBin::SizesInByte() const; \ + template data_size_t PairwiseRankingBin::num_data() const; \ + template void PairwiseRankingBin::ReSize(data_size_t num_data); + +#define COMMA , + +#define REGISTER_DENSE_HISTOGRAM_CONSTRUCTION_WITH_ITERATOR_TYPE_AND_FUNC_NAME(DATA_TYPE, USE_4BIT, ITERATOR_TYPE, FUNC_NAME) \ + template void DensePairwiseRankingBin::FUNC_NAME( \ + const data_size_t* data_indices, data_size_t start, data_size_t end, \ + const score_t* ordered_gradients, const score_t* ordered_hessians, \ + hist_t* out) const; \ + template void DensePairwiseRankingBin::FUNC_NAME( \ + data_size_t start, data_size_t end, \ + const score_t* ordered_gradients, \ + const score_t* ordered_hessians, \ + hist_t* out) const; \ + template void DensePairwiseRankingBin::FUNC_NAME( \ + const data_size_t* data_indices, data_size_t start, \ + data_size_t end, const score_t* ordered_gradients, \ + hist_t* out) const; \ + template void DensePairwiseRankingBin::FUNC_NAME( \ + data_size_t start, data_size_t end, \ + const score_t* ordered_gradients, \ + hist_t* out) const; + + +#define REGISTER_DENSE_TREE_LEARNING_FUNC_WITH_ITERATOR_TYPE(DATA_TYPE, USE_4BIT, ITERATOR_TYPE) \ + REGISTER_DENSE_HISTOGRAM_CONSTRUCTION_WITH_ITERATOR_TYPE_AND_FUNC_NAME(DATA_TYPE, USE_4BIT, ITERATOR_TYPE, ConstructHistogram) \ + REGISTER_DENSE_HISTOGRAM_CONSTRUCTION_WITH_ITERATOR_TYPE_AND_FUNC_NAME(DATA_TYPE, USE_4BIT, ITERATOR_TYPE, ConstructHistogramInt8) \ + REGISTER_DENSE_HISTOGRAM_CONSTRUCTION_WITH_ITERATOR_TYPE_AND_FUNC_NAME(DATA_TYPE, USE_4BIT, ITERATOR_TYPE, ConstructHistogramInt16) \ + REGISTER_DENSE_HISTOGRAM_CONSTRUCTION_WITH_ITERATOR_TYPE_AND_FUNC_NAME(DATA_TYPE, USE_4BIT, ITERATOR_TYPE, ConstructHistogramInt32) \ + template data_size_t DensePairwiseRankingBin::Split(uint32_t min_bin, uint32_t max_bin, \ + uint32_t default_bin, uint32_t most_freq_bin, \ + MissingType missing_type, bool default_left, \ + uint32_t threshold, const data_size_t* data_indices, \ + data_size_t cnt, \ + data_size_t* lte_indices, \ + data_size_t* gt_indices) const; \ + template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, \ + uint32_t most_freq_bin, MissingType missing_type, \ + bool default_left, uint32_t threshold, \ + const data_size_t* data_indices, data_size_t cnt, \ + data_size_t* lte_indices, \ data_size_t* gt_indices) const; -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; +#define REGISTER_DENSE_TREE_LEARNING_FUNC_FOR_ITERATOR_TYPE(ITERATOR_TYPE) \ + REGISTER_DENSE_TREE_LEARNING_FUNC_WITH_ITERATOR_TYPE(uint8_t, true, ITERATOR_TYPE) \ + REGISTER_DENSE_TREE_LEARNING_FUNC_WITH_ITERATOR_TYPE(uint8_t, false, ITERATOR_TYPE) \ + REGISTER_DENSE_TREE_LEARNING_FUNC_WITH_ITERATOR_TYPE(uint16_t, false, ITERATOR_TYPE) \ + REGISTER_DENSE_TREE_LEARNING_FUNC_WITH_ITERATOR_TYPE(uint32_t, false, ITERATOR_TYPE) -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; +#define REGISTER_ITERATOR(ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(DenseBin, ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(DenseBin, ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(DenseBin, ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(DenseBin, ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(SparseBin, ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(SparseBin, ITERATOR_TYPE) \ + REGISTER_BIN_TYPE(SparseBin, ITERATOR_TYPE) \ + REGISTER_DENSE_TREE_LEARNING_FUNC_FOR_ITERATOR_TYPE(ITERATOR_TYPE) -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; -template data_size_t DensePairwiseRankingBin::Split(uint32_t max_bin, uint32_t default_bin, - uint32_t most_freq_bin, MissingType missing_type, - bool default_left, uint32_t threshold, - const data_size_t* data_indices, data_size_t cnt, - data_size_t* lte_indices, - data_size_t* gt_indices) const; +REGISTER_ITERATOR(PairwiseRankingFirstIterator) +REGISTER_ITERATOR(PairwiseRankingSecondIterator) +REGISTER_ITERATOR(PairwiseRankingDiffIterator) + + +#undef COMMA +#undef REGISTER_TYPE +#undef REGISTER_BIN_TYPE +#undef REGISTER_DENSE_TREE_LEARNING_FUNC_FOR_ITERATOR_TYPE +#undef REGISTER_DENSE_TREE_LEARNING_FUNC_WITH_ITERATOR_TYPE +#undef REGISTER_DENSE_HISTOGRAM_CONSTRUCTION_WITH_ITERATOR_TYPE_AND_FUNC_NAME + } // namespace LightGBM diff --git a/src/io/pairwise_lambdarank_bin.hpp b/src/io/pairwise_lambdarank_bin.hpp index 6fd839ed2d7..311a25b588e 100644 --- a/src/io/pairwise_lambdarank_bin.hpp +++ b/src/io/pairwise_lambdarank_bin.hpp @@ -22,6 +22,9 @@ class PairwiseRankingFirstBin; template class PairwiseRankingSecondBin; +template +class PairwiseRankingDiffBin; + template class PairwiseRankingFirstIterator: public BinIterator { public: @@ -59,7 +62,8 @@ class PairwiseRankingFirstIterator: public BinIterator { } void Reset(data_size_t idx) { - unpaired_bin_iterator_->Reset(idx); + const data_size_t first_idx = paired_ranking_item_index_map_[idx].first; + unpaired_bin_iterator_->Reset(first_idx); prev_index_ = -1; prev_val_ = 0; } @@ -106,7 +110,8 @@ class PairwiseRankingSecondIterator: public BinIterator { } void Reset(data_size_t idx) { - unpaired_bin_iterator_->Reset(idx); + const data_size_t second_idx = paired_ranking_item_index_map_[idx].second; + unpaired_bin_iterator_->Reset(second_idx); prev_index_ = 0; } @@ -117,6 +122,74 @@ class PairwiseRankingSecondIterator: public BinIterator { data_size_t prev_index_; }; + +template +class PairwiseRankingDiffIterator: public BinIterator { + public: + friend PairwiseRankingDiffBin; + + PairwiseRankingDiffIterator(const BIN_TYPE* unpaired_bin, const std::pair* paired_ranking_item_index_map, const uint32_t min_bin, const uint32_t max_bin, const uint32_t most_freq_bin, const BinMapper* original_feature_bin_mapper, const BinMapper* diff_feature_bin_mapper): min_bin_(min_bin), max_bin_(max_bin), offset_(diff_feature_bin_mapper->GetMostFreqBin() == 0) { + unpaired_bin_ = unpaired_bin; + first_unpaired_bin_iterator_.reset(unpaired_bin_->GetIterator(min_bin, max_bin, most_freq_bin)); + first_unpaired_bin_iterator_->Reset(0); + second_unpaired_bin_iterator_.reset(unpaired_bin_->GetIterator(min_bin, max_bin, most_freq_bin)); + second_unpaired_bin_iterator_->Reset(0); + paired_ranking_item_index_map_ = paired_ranking_item_index_map; + first_prev_index_ = 0; + second_prev_index_ = 0; + original_feature_bin_mapper_ = original_feature_bin_mapper; + diff_feature_bin_mapper_ = diff_feature_bin_mapper; + } + + ~PairwiseRankingDiffIterator() {} + + uint32_t Get(data_size_t idx) { + const data_size_t first_data_index = paired_ranking_item_index_map_[idx].first; + const data_size_t second_data_index = paired_ranking_item_index_map_[idx].second; + if (second_data_index < second_prev_index_) { + second_unpaired_bin_iterator_->Reset(0); + } + first_prev_index_ = first_data_index; + second_prev_index_ = second_data_index; + const uint32_t first_bin = first_unpaired_bin_iterator_->Get(first_data_index); + const uint32_t second_bin = second_unpaired_bin_iterator_->Get(second_data_index); + // TODO(shiyu1994): better original value + const double first_value = original_feature_bin_mapper_->BinToValue(first_bin); + const double second_value = original_feature_bin_mapper_->BinToValue(second_bin); + const double diff_value = first_value - second_value; + const uint32_t diff_bin = diff_feature_bin_mapper_->ValueToBin(diff_value); + return diff_bin; + } + + uint32_t RawGet(data_size_t idx) { + const uint32_t bin = Get(idx); + return bin + min_bin_ - offset_; + } + + void Reset(data_size_t idx) { + const data_size_t first_idx = paired_ranking_item_index_map_[idx].first; + const data_size_t second_idx = paired_ranking_item_index_map_[idx].second; + first_unpaired_bin_iterator_->Reset(first_idx); + second_unpaired_bin_iterator_->Reset(second_idx); + first_prev_index_ = -1; + second_prev_index_ = 0; + } + + private: + const BIN_TYPE* unpaired_bin_; + std::unique_ptr first_unpaired_bin_iterator_; + std::unique_ptr second_unpaired_bin_iterator_; + const std::pair* paired_ranking_item_index_map_; + const BinMapper* original_feature_bin_mapper_; + const BinMapper* diff_feature_bin_mapper_; + data_size_t first_prev_index_; + data_size_t second_prev_index_; + const uint32_t min_bin_; + const uint32_t max_bin_; + const uint32_t offset_; +}; + + template class ITERATOR_TYPE> class PairwiseRankingBin: public BIN_TYPE { public: @@ -126,10 +199,6 @@ class PairwiseRankingBin: public BIN_TYPE { virtual ~PairwiseRankingBin() {} - BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { - return new ITERATOR_TYPE(unpaired_bin_.get(), paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin); - } - void InitStreaming(uint32_t num_thread, int32_t omp_max_threads) override; void Push(int tid, data_size_t idx, uint32_t value) override; @@ -193,6 +262,98 @@ class PairwiseRankingBin: public BIN_TYPE { return 0; } + void ConstructHistogram( + const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogram(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt8( + const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt8(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt16( + const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt16(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt32( + const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt32(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, const score_t* /*ordered_hessians*/, + hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogram(const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogram(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt8(const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt8(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt16(const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt16(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt32(const data_size_t* /*data_indices*/, data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + + void ConstructHistogramInt32(data_size_t /*start*/, data_size_t /*end*/, + const score_t* /*ordered_gradients*/, hist_t* /*out*/) const override { + Log::Fatal("Not implemented."); + } + const void* GetColWiseData(uint8_t* /*bit_type*/, bool* /*is_sparse*/, std::vector* /*bin_iterator*/, const int /*num_threads*/) const override { Log::Fatal("Not implemented."); return nullptr; @@ -326,6 +487,11 @@ template class DensePairwiseRankingFirstBin: public DensePairwiseRankingBin { public: DensePairwiseRankingFirstBin(data_size_t num_data, const std::pair* paired_ranking_item_index_map, DenseBin* unpaired_bin): DensePairwiseRankingBin(num_data, paired_ranking_item_index_map, unpaired_bin) {} + + BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { + return new PairwiseRankingFirstIterator>(this->unpaired_bin_.get(), this->paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin); + } + private: data_size_t get_unpaired_index(const data_size_t paired_index) const { return this->paired_ranking_item_index_map_[paired_index].first; @@ -336,16 +502,58 @@ template class DensePairwiseRankingSecondBin: public DensePairwiseRankingBin { public: DensePairwiseRankingSecondBin(data_size_t num_data, const std::pair* paired_ranking_item_index_map, DenseBin* unpaired_bin): DensePairwiseRankingBin(num_data, paired_ranking_item_index_map, unpaired_bin) {} + + BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { + return new PairwiseRankingSecondIterator>(this->unpaired_bin_.get(), this->paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin); + } + private: data_size_t get_unpaired_index(const data_size_t paired_index) const { return this->paired_ranking_item_index_map_[paired_index].second; } }; +template +class DensePairwiseRankingDiffBin: public DensePairwiseRankingBin { + public: + DensePairwiseRankingDiffBin(data_size_t num_data, const std::pair* paired_ranking_item_index_map, DenseBin* unpaired_bin, const std::vector>* diff_bin_mappers, const std::vector>* ori_bin_mappers, const std::vector* bin_offsets): DensePairwiseRankingBin(num_data, paired_ranking_item_index_map, unpaired_bin) { + diff_bin_mappers_ = diff_bin_mappers; + ori_bin_mappers_ = ori_bin_mappers; + bin_offsets_ = bin_offsets; + } + + BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { + int sub_feature_index = -1; + for (int i = 0; i < static_cast(bin_offsets_->size()); ++i) { + if (bin_offsets_->at(i) == min_bin) { + CHECK_GT(i, 0); + sub_feature_index = i - 1; + break; + } + } + CHECK_GE(sub_feature_index, 0); + return new PairwiseRankingDiffIterator>(this->unpaired_bin_.get(), this->paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin, ori_bin_mappers_->at(sub_feature_index).get(), diff_bin_mappers_->at(sub_feature_index).get()); + } + + private: + data_size_t get_unpaired_index(const data_size_t /*paired_index*/) const { + Log::Fatal("get_unpaired_index of DensePairwiseRankingDiffBin should not be called."); + } + + const std::vector* bin_offsets_; + const std::vector>* diff_bin_mappers_; + const std::vector>* ori_bin_mappers_; +}; + template class SparsePairwiseRankingFirstBin: public SparsePairwiseRankingBin { public: SparsePairwiseRankingFirstBin(data_size_t num_data, const std::pair* paired_ranking_item_index_map, SparseBin* unpaired_bin): SparsePairwiseRankingBin(num_data, paired_ranking_item_index_map, unpaired_bin) {} + + BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { + return new PairwiseRankingFirstIterator>(this->unpaired_bin_.get(), this->paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin); + } + private: data_size_t get_unpaired_index(const data_size_t paired_index) const { return this->paired_ranking_item_index_map_[paired_index].first; @@ -356,12 +564,49 @@ template class SparsePairwiseRankingSecondBin: public SparsePairwiseRankingBin { public: SparsePairwiseRankingSecondBin(data_size_t num_data, const std::pair* paired_ranking_item_index_map, SparseBin* unpaired_bin): SparsePairwiseRankingBin(num_data, paired_ranking_item_index_map, unpaired_bin) {} + + BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { + return new PairwiseRankingSecondIterator>(this->unpaired_bin_.get(), this->paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin); + } + private: data_size_t get_unpaired_index(const data_size_t paired_index) const { return this->paired_ranking_item_index_map_[paired_index].second; } }; +template +class SparsePairwiseRankingDiffBin: public SparsePairwiseRankingBin { + public: + SparsePairwiseRankingDiffBin(data_size_t num_data, const std::pair* paired_ranking_item_index_map, SparseBin* unpaired_bin, const std::vector>* diff_bin_mappers, const std::vector>* ori_bin_mappers, const std::vector* bin_offsets): SparsePairwiseRankingBin(num_data, paired_ranking_item_index_map, unpaired_bin) { + bin_offsets_ = bin_offsets; + diff_bin_mappers_ = diff_bin_mappers; + ori_bin_mappers_ = ori_bin_mappers; + } + + BinIterator* GetIterator(uint32_t min_bin, uint32_t max_bin, uint32_t most_freq_bin) const override { + int sub_feature_index = -1; + for (int i = 0; i < static_cast(bin_offsets_->size()); ++i) { + if (bin_offsets_->at(i) == min_bin) { + CHECK_GT(i, 0); + sub_feature_index = i - 1; + break; + } + } + CHECK_GE(sub_feature_index, 0); + return new PairwiseRankingDiffIterator>(this->unpaired_bin_.get(), this->paired_ranking_item_index_map_, min_bin, max_bin, most_freq_bin, ori_bin_mappers_->at(sub_feature_index).get(), diff_bin_mappers_->at(sub_feature_index).get()); + } + + private: + data_size_t get_unpaired_index(const data_size_t /*paired_index*/) const { + Log::Fatal("get_unpaired_index of SparsePairwiseRankingDiffBin should not be called."); + } + + const std::vector* bin_offsets_; + const std::vector>* diff_bin_mappers_; + const std::vector>* ori_bin_mappers_; +}; + } // namespace LightGBM diff --git a/src/io/pairwise_ranking_feature_group.cpp b/src/io/pairwise_ranking_feature_group.cpp index e24234434d2..d795db1e257 100644 --- a/src/io/pairwise_ranking_feature_group.cpp +++ b/src/io/pairwise_ranking_feature_group.cpp @@ -76,10 +76,13 @@ void PairwiseRankingFeatureGroup::CreateBinData(int num_data, bool is_multi_val, } } -PairwiseRankingDifferentialFeatureGroup::PairwiseRankingDifferentialFeatureGroup(const FeatureGroup& other, int num_original_data, const int is_first_or_second_in_pairing, int num_pairs, const std::pair* paired_ranking_item_index_map, std::vector>& diff_feature_bin_mappers): PairwiseRankingFeatureGroup(other, num_original_data, is_first_or_second_in_pairing, num_pairs, paired_ranking_item_index_map) { +PairwiseRankingDifferentialFeatureGroup::PairwiseRankingDifferentialFeatureGroup(const FeatureGroup& other, int num_original_data, const int is_first_or_second_in_pairing, int num_pairs, const std::pair* paired_ranking_item_index_map, std::vector>& diff_feature_bin_mappers, std::vector>& ori_feature_bin_mappers): PairwiseRankingFeatureGroup(other, num_original_data, is_first_or_second_in_pairing, num_pairs, paired_ranking_item_index_map) { for (auto& bin_mapper_ref : diff_feature_bin_mappers) { diff_feature_bin_mappers_.emplace_back(bin_mapper_ref.release()); } + for (auto& bin_mapper_ref : ori_feature_bin_mappers) { + ori_feature_bin_mappers_.emplace_back(bin_mapper_ref.release()); + } } void PairwiseRankingDifferentialFeatureGroup::CreateBinData(int num_data, bool is_multi_val, bool force_dense, bool force_sparse) { @@ -88,10 +91,10 @@ void PairwiseRankingDifferentialFeatureGroup::CreateBinData(int num_data, bool i (!force_dense && num_feature_ == 1 && bin_mappers_[0]->sparse_rate() >= kSparseThreshold)) { is_sparse_ = true; - bin_data_.reset(Bin::CreateDensePairwiseRankingDiffBin(num_data, num_total_bin_, num_data_, paired_ranking_item_index_map_, &diff_feature_bin_mappers_)); + bin_data_.reset(Bin::CreateDensePairwiseRankingDiffBin(num_data, num_total_bin_, num_data_, paired_ranking_item_index_map_, &diff_feature_bin_mappers_, &ori_feature_bin_mappers_, &bin_offsets_)); } else { is_sparse_ = false; - bin_data_.reset(Bin::CreateDensePairwiseRankingDiffBin(num_data, num_total_bin_, num_data_, paired_ranking_item_index_map_, &diff_feature_bin_mappers_)); + bin_data_.reset(Bin::CreateDensePairwiseRankingDiffBin(num_data, num_total_bin_, num_data_, paired_ranking_item_index_map_, &diff_feature_bin_mappers_, &ori_feature_bin_mappers_, &bin_offsets_)); } is_multi_val_ = false; }