7 #ifndef XGBOOST_COMMON_ROW_SET_H_
8 #define XGBOOST_COMMON_ROW_SET_H_
27 const size_t*
end{
nullptr};
37 inline size_t Size()
const {
47 inline std::vector<Elem>::const_iterator
begin()
const {
48 return elem_of_each_node_.begin();
51 inline std::vector<Elem>::const_iterator
end()
const {
52 return elem_of_each_node_.end();
57 const Elem& e = elem_of_each_node_[node_id];
58 CHECK(e.
begin !=
nullptr)
59 <<
"access element that is not in the set";
65 Elem& e = elem_of_each_node_[node_id];
71 elem_of_each_node_.clear();
75 CHECK_EQ(elem_of_each_node_.size(), 0U);
77 if (row_indices_.empty()) {
83 const size_t*
begin =
reinterpret_cast<size_t*
>(20);
89 const size_t*
begin = dmlc::BeginPtr(row_indices_);
90 const size_t*
end = dmlc::BeginPtr(row_indices_) + row_indices_.size();
94 std::vector<size_t>*
Data() {
return &row_indices_; }
97 unsigned left_node_id,
98 unsigned right_node_id,
101 const Elem e = elem_of_each_node_[node_id];
102 CHECK(e.
begin !=
nullptr);
103 size_t* all_begin = dmlc::BeginPtr(row_indices_);
104 size_t*
begin = all_begin + (e.
begin - all_begin);
106 CHECK_EQ(n_left + n_right, e.
Size());
108 CHECK_EQ(
begin + n_left + n_right, e.
end);
110 if (left_node_id >= elem_of_each_node_.size()) {
111 elem_of_each_node_.resize(left_node_id + 1,
Elem(
nullptr,
nullptr, -1));
113 if (right_node_id >= elem_of_each_node_.size()) {
114 elem_of_each_node_.resize(right_node_id + 1,
Elem(
nullptr,
nullptr, -1));
117 elem_of_each_node_[left_node_id] =
Elem(
begin,
begin + n_left, left_node_id);
118 elem_of_each_node_[right_node_id] =
Elem(
begin + n_left, e.
end, right_node_id);
119 elem_of_each_node_[node_id] =
Elem(
nullptr,
nullptr, -1);
124 std::vector<size_t> row_indices_;
126 std::vector<Elem> elem_of_each_node_;
132 #endif // XGBOOST_COMMON_ROW_SET_H_