32 std::map<bst_node_t, std::size_t> node_map_;
34 std::size_t current_size_{0};
38 std::unique_ptr<Vec> data_{
new Vec{}};
43 std::size_t n_cached_nodes_{0};
45 bool has_exceeded_{
false};
50 auto offset = node_map_.at(idx);
51 return common::Span{data_->data(), data_->size()}.subspan(offset, n_total_bins_);
54 auto offset = node_map_.at(idx);
55 return common::Span{data_->data(), data_->size()}.subspan(offset, n_total_bins_);
57 void Reset(
bst_bin_t n_total_bins, std::size_t n_cached_nodes) {
58 n_total_bins_ = n_total_bins;
59 n_cached_nodes_ = n_cached_nodes;
68 has_exceeded_ = exceeded;
73 auto n_new_nodes = nodes_to_build.size() + nodes_to_sub.size();
74 return n_new_nodes + node_map_.size() <= n_cached_nodes_;
85 auto n_new_nodes = nodes_to_build.size() + nodes_to_sub.size();
86 auto alloc_size = n_new_nodes * n_total_bins_;
87 auto new_size = alloc_size + current_size_;
88 if (new_size > data_->size()) {
89 data_->Resize(new_size);
91 for (
auto nidx : nodes_to_build) {
92 node_map_[nidx] = current_size_;
93 current_size_ += n_total_bins_;
95 for (
auto nidx : nodes_to_sub) {
96 node_map_[nidx] = current_size_;
97 current_size_ += n_total_bins_;
99 CHECK_EQ(current_size_, new_size);
106 [[nodiscard]]
bool HasExceeded()
const {
return has_exceeded_; }
107 [[nodiscard]]
bool HistogramExists(
bst_node_t nidx)
const {
108 return node_map_.find(nidx) != node_map_.cend();
110 [[nodiscard]] std::size_t Size()
const {
return current_size_; }
void AllocateHistograms(common::Span< bst_node_t const > nodes_to_build, common::Span< bst_node_t const > nodes_to_sub)
Allocate histogram buffers for all nodes.
Definition hist_cache.h:83