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];
63 Elem& e = elem_of_each_node_[node_id];
69 elem_of_each_node_.clear();
73 CHECK_EQ(elem_of_each_node_.size(), 0U);
75 if (row_indices_.empty()) {
76 constexpr
size_t* kBegin =
nullptr;
77 constexpr
size_t* kEnd =
nullptr;
78 static_assert(kEnd - kBegin == 0,
"");
79 elem_of_each_node_.emplace_back(
Elem(kBegin, kEnd, 0));
83 const size_t*
begin = dmlc::BeginPtr(row_indices_);
84 const size_t*
end = dmlc::BeginPtr(row_indices_) + row_indices_.size();
88 std::vector<size_t>*
Data() {
return &row_indices_; }
90 inline void AddSplit(
unsigned node_id,
unsigned left_node_id,
unsigned right_node_id,
91 size_t n_left,
size_t n_right) {
92 const Elem e = elem_of_each_node_[node_id];
94 size_t* all_begin{
nullptr};
95 size_t*
begin{
nullptr};
96 if (e.
begin ==
nullptr) {
100 all_begin = dmlc::BeginPtr(row_indices_);
104 CHECK_EQ(n_left + n_right, e.
Size());
106 CHECK_EQ(
begin + n_left + n_right, e.
end);
108 if (left_node_id >= elem_of_each_node_.size()) {
109 elem_of_each_node_.resize(left_node_id + 1,
Elem(
nullptr,
nullptr, -1));
111 if (right_node_id >= elem_of_each_node_.size()) {
112 elem_of_each_node_.resize(right_node_id + 1,
Elem(
nullptr,
nullptr, -1));
115 elem_of_each_node_[left_node_id] =
Elem(
begin,
begin + n_left, left_node_id);
116 elem_of_each_node_[right_node_id] =
Elem(
begin + n_left, e.
end, right_node_id);
117 elem_of_each_node_[node_id] =
Elem(
nullptr,
nullptr, -1);
122 std::vector<size_t> row_indices_;
124 std::vector<Elem> elem_of_each_node_;
130 #endif // XGBOOST_COMMON_ROW_SET_H_