7 #ifndef XGBOOST_TREE_MODEL_H_
8 #define XGBOOST_TREE_MODEL_H_
15 #include <xgboost/logging.h>
24 #include <type_traits>
30 struct ScalarTreeView;
31 struct MultiTargetTreeView;
93 static_assert(
sizeof(
Node) == 4 *
sizeof(
int) +
sizeof(Info),
"Node: 64 bit align");
95 Node(int32_t cleft, int32_t cright, int32_t parent, uint32_t split_ind,
float split_cond,
97 : parent_{parent}, cleft_{cleft}, cright_{cright} {
99 this->
SetSplit(split_ind, split_cond, default_left);
112 static_assert(!std::is_signed_v<bst_feature_t>);
113 return sindex_ & ((1U << 31) - 1U);
148 bool default_left =
false) {
149 if (default_left) split_index |= (1U << 31);
150 this->sindex_ = split_index;
151 (this->info_).split_cond = split_cond;
160 (this->info_).leaf_value = value;
162 this->cright_ = right;
170 if (is_left_child) pidx |= (1U << 31);
171 this->parent_ = pidx;
174 return parent_ == b.parent_ && cleft_ == b.cleft_ && cright_ == b.cright_ &&
175 sindex_ == b.sindex_ && info_.leaf_value == b.info_.leaf_value;
205 auto& h_nodes = nodes_.HostVector();
206 CHECK(h_nodes[h_nodes[nidx].
LeftChild()].IsLeaf());
207 CHECK(h_nodes[h_nodes[nidx].
RightChild()].IsLeaf());
208 this->DeleteNode(h_nodes[nidx].
LeftChild());
210 h_nodes[nidx].SetLeaf(value);
219 auto& h_nodes = nodes_.HostVector();
220 if (h_nodes[nidx].IsLeaf())
return;
221 if (!h_nodes[h_nodes[nidx].
LeftChild()].IsLeaf()) {
224 if (!h_nodes[h_nodes[nidx].
RightChild()].IsLeaf()) {
231 nodes_.HostVector().resize(param_.
num_nodes);
232 stats_.HostVector().resize(param_.
num_nodes);
234 split_categories_segments_.HostVector().resize(param_.
num_nodes);
235 auto& h_nodes = nodes_.HostVector();
236 for (
int i = 0; i < param_.
num_nodes; i++) {
237 h_nodes[i].SetLeaf(0.0f);
259 return device.
IsCPU() ? nodes_.ConstHostSpan()
260 : (nodes_.SetDevice(device), nodes_.ConstDeviceSpan());
266 return device.
IsCPU() ? stats_.ConstHostSpan()
267 : (stats_.SetDevice(device), stats_.ConstDeviceSpan());
277 return nodes_.ConstHostVector() == b.nodes_.ConstHostVector() &&
278 stats_.ConstHostVector() == b.stats_.ConstHostVector() &&
279 deleted_nodes_ == b.deleted_nodes_ && param_ == b.param_;
308 bst_float loss_change,
float sum_hess,
float left_sum,
float right_sum,
322 float left_sum,
float right_sum);
354 float left_sum,
float right_sum);
363 float sum_hess,
float left_sum,
float right_sum);
371 [[nodiscard]]
bool IsMultiTarget()
const {
return static_cast<bool>(p_mt_tree_); }
381 return p_mt_tree_.get();
419 return this->p_mt_tree_->SetRoot(weight, sum_hess);
435 void Init(
size_t size);
451 [[nodiscard]]
size_t Size()
const;
463 [[nodiscard]]
bool IsMissing(
size_t i)
const;
465 void HasMissing(
bool has_missing) { this->has_missing_ = has_missing; }
475 std::vector<float> data_;
487 std::string format)
const;
496 return device.
IsCPU()
501 return split_categories_segments_.ConstHostVector();
525 if (device.
IsCPU()) {
526 view.
node_ptr = split_categories_segments_.ConstHostSpan();
528 split_categories_segments_.SetDevice(device);
529 view.
node_ptr = split_categories_segments_.ConstDeviceSpan();
536 return this->p_mt_tree_->LeftChild(nidx);
538 return nodes_.ConstHostVector()[nidx].LeftChild();
542 return this->p_mt_tree_->RightChild(nidx);
544 return nodes_.ConstHostVector()[nidx].RightChild();
548 return this->p_mt_tree_->Size();
550 return this->nodes_.Size();
558 template <
bool typed>
559 void LoadCategoricalSplit(
Json const& in);
560 void SaveCategoricalSplit(
Json* p_out)
const;
566 std::vector<int> deleted_nodes_;
576 std::unique_ptr<MultiTargetTree> p_mt_tree_;
581 int nid = deleted_nodes_.back();
582 deleted_nodes_.pop_back();
588 CHECK_LT(param_.
num_nodes, std::numeric_limits<int>::max())
589 <<
"number of nodes in the tree exceed 2^31";
597 void DeleteNode(
int nid) {
599 auto pid = (*this)[nid].Parent();
606 deleted_nodes_.push_back(nid);
614 std::fill(data_.begin(), data_.end(), std::numeric_limits<float>::quiet_NaN());
619 auto p_data = inst.
data();
620 auto p_out = data_.data();
622 for (std::size_t i = 0, n = inst.
size(); i < n; ++i) {
623 auto const& entry = p_data[i];
624 p_out[entry.index] = entry.fvalue;
626 has_missing_ = data_.size() != inst.
size();
641 return " support for multi-target tree is not yet implemented.";
Defines configuration macros and basic types for xgboost.
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:57
Feature map data structure to help text model dump. TODO(tqchen) consider make it even more lightweig...
Definition: feature_map.h:22
Definition: host_device_vector.h:89
bool Empty() const
Definition: host_device_vector.h:104
common::Span< T const > ConstHostSpan() const
Definition: host_device_vector.h:118
std::vector< T > & HostVector()
common::Span< const T > ConstDeviceSpan() const
void SetDevice(DeviceOrd device) const
Data structure representing JSON format.
Definition: json.h:396
Tree structure for multi-target model.
Definition: multi_target_tree_model.h:38
static constexpr bst_node_t InvalidNodeId()
Definition: multi_target_tree_model.h:40
tree node
Definition: tree_model.h:89
XGBOOST_DEVICE int Parent() const
get parent of the node
Definition: tree_model.h:124
XGBOOST_DEVICE void MarkDelete()
mark that this node is deleted
Definition: tree_model.h:165
XGBOOST_DEVICE bool IsRoot() const
whether current node is root
Definition: tree_model.h:130
XGBOOST_DEVICE int RightChild() const
index of right child
Definition: tree_model.h:105
XGBOOST_DEVICE float LeafValue() const
Definition: tree_model.h:120
XGBOOST_DEVICE Node()
Definition: tree_model.h:91
XGBOOST_DEVICE void SetParent(int pidx, bool is_left_child=true)
Definition: tree_model.h:169
XGBOOST_DEVICE void SetLeaf(bst_float value, int right=kInvalidNodeId)
set the leaf value of the node
Definition: tree_model.h:159
XGBOOST_DEVICE bool IsLeftChild() const
whether current node is left child
Definition: tree_model.h:126
XGBOOST_DEVICE void SetSplit(unsigned split_index, SplitCondT split_cond, bool default_left=false)
set split condition of current node
Definition: tree_model.h:147
XGBOOST_DEVICE void SetLeftChild(int nid)
set the left child
Definition: tree_model.h:135
XGBOOST_DEVICE bst_feature_t SplitIndex() const
feature index of split condition
Definition: tree_model.h:111
XGBOOST_DEVICE bool IsDeleted() const
whether this node is deleted
Definition: tree_model.h:128
XGBOOST_DEVICE bool IsLeaf() const
whether current node is leaf node
Definition: tree_model.h:118
bool operator==(const Node &b) const
Definition: tree_model.h:173
Node(int32_t cleft, int32_t cright, int32_t parent, uint32_t split_ind, float split_cond, bool default_left)
Definition: tree_model.h:95
XGBOOST_DEVICE void Reuse()
Reuse this deleted node.
Definition: tree_model.h:167
XGBOOST_DEVICE void SetRightChild(int nid)
set the right child
Definition: tree_model.h:140
XGBOOST_DEVICE bool DefaultLeft() const
when feature is unknown, whether goes to left child
Definition: tree_model.h:116
XGBOOST_DEVICE int LeftChild() const
index of left child
Definition: tree_model.h:103
XGBOOST_DEVICE int DefaultChild() const
index of default child when feature is missing
Definition: tree_model.h:107
XGBOOST_DEVICE SplitCondT SplitCond() const
Definition: tree_model.h:122
define regression tree to be the most common tree model.
Definition: tree_model.h:81
void SaveModel(Json *out) const override
saves the model config to a JSON object
tree::MultiTargetTreeView HostMtView() const
void ChangeToLeaf(bst_node_t nidx, float value)
Change a non leaf node to a leaf node, delete its children.
Definition: tree_model.h:204
bst_target_t NumTargets() const
The size of leaf weight.
Definition: tree_model.h:375
bool operator==(const RegTree &b) const
Definition: tree_model.h:276
bst_node_t NumNodes() const noexcept
Get the total number of nodes including deleted ones in this tree.
Definition: tree_model.h:390
void ExpandNode(bst_node_t nid, unsigned split_index, bst_float split_value, bool default_left, bst_float base_weight, bst_float left_leaf_weight, bst_float right_leaf_weight, bst_float loss_change, float sum_hess, float left_sum, float right_sum, bst_node_t leaf_right_child=kInvalidNodeId)
Expands a leaf node into two additional leaf nodes.
RegTree()
Definition: tree_model.h:230
static constexpr bst_node_t kInvalidNodeId
Definition: tree_model.h:84
void ExpandNode(bst_node_t nidx, bst_feature_t split_index, float split_cond, bool default_left, linalg::VectorView< float const > base_weight, linalg::VectorView< float const > left_weight, linalg::VectorView< float const > right_weight, float loss_chg, float sum_hess, float left_sum, float right_sum)
Expands a leaf node into two additional leaf nodes for a multi-target tree.
Node & operator[](bst_node_t nidx)
get node given nid
Definition: tree_model.h:253
static constexpr uint32_t kDeletedNodeMarker
Definition: tree_model.h:85
bool IsMultiTarget() const
Whether this is a multi-target tree.
Definition: tree_model.h:371
bst_node_t NumExtraNodes() const noexcept
number of extra nodes besides the root
Definition: tree_model.h:400
bst_node_t MaxDepth() const
Get the maximum depth.
auto GetMultiTargetTree() const
Get the underlying implementaiton of multi-target tree.
Definition: tree_model.h:379
void ExpandCategorical(bst_node_t nidx, bst_feature_t split_index, common::Span< const uint32_t > split_cat, bool default_left, linalg::VectorView< float const > base_weight, linalg::VectorView< float const > left_weight, linalg::VectorView< float const > right_weight, float loss_chg, float sum_hess, float left_sum, float right_sum)
Expands a leaf node with categories for a multi-target tree.
bst_node_t LeftChild(bst_node_t nidx) const
Definition: tree_model.h:534
common::Span< RTreeNodeStat const > GetStats(DeviceOrd device) const
Get const reference to stats.
Definition: tree_model.h:264
void SetLeaves(std::vector< bst_node_t > leaves, common::Span< float const > weights)
Set all leaf weights for a multi-target tree.
void CollapseToLeaf(bst_node_t nidx, float value)
Collapse a non leaf node to a leaf node, delete its children.
Definition: tree_model.h:218
bst_node_t GetNumLeaves() const
common::Span< Node const > GetNodes(DeviceOrd device) const
Get const reference to nodes.
Definition: tree_model.h:257
RegTree(bst_target_t n_targets, bst_feature_t n_features)
Constructor that initializes the tree model with shape.
Definition: tree_model.h:244
bst_node_t RightChild(bst_node_t nidx) const
Definition: tree_model.h:540
common::Span< FeatureType const > GetSplitTypes(DeviceOrd device) const
Get split types for all nodes.
Definition: tree_model.h:491
RTreeNodeStat & Stat(int nid)
get node statistics given nid
Definition: tree_model.h:271
void SetRoot(linalg::VectorView< float const > weight, float sum_hess)
Set the root weight and statistics for a multi-target tree.
Definition: tree_model.h:417
void ExpandCategorical(bst_node_t nid, bst_feature_t split_index, common::Span< const uint32_t > split_cat, bool default_left, bst_float base_weight, bst_float left_leaf_weight, bst_float right_leaf_weight, bst_float loss_change, float sum_hess, float left_sum, float right_sum)
Expands a leaf node with categories.
bool Equal(const RegTree &b) const
Compares whether 2 trees are equal from a user's perspective. The equality compares only non-deleted ...
bst_node_t NumValidNodes() const noexcept
Get the total number of valid nodes in this tree.
Definition: tree_model.h:394
float SplitCondT
Definition: tree_model.h:83
CategoricalSplitMatrix GetCategoriesMatrix(DeviceOrd device) const
Definition: tree_model.h:521
common::Span< uint32_t const > GetSplitCategories(DeviceOrd device) const
Definition: tree_model.h:495
void LoadModel(Json const &in) override
load the model from a JSON object
std::string DumpModel(const FeatureMap &fmap, bool with_stats, std::string format) const
dump the model in the requested format as a text string
bst_feature_t NumFeatures() const noexcept
Get the number of features.
Definition: tree_model.h:386
tree::ScalarTreeView HostScView() const
bool HasCategoricalSplit() const
Whether this tree has categorical split.
Definition: tree_model.h:367
static constexpr bst_node_t kRoot
Definition: tree_model.h:86
bst_node_t GetNumSplitNodes() const
auto const & GetSplitCategoriesPtr() const
Definition: tree_model.h:500
bst_node_t GetDepth(bst_node_t nidx) const
Get the depth of a node.
bst_node_t Size() const
Definition: tree_model.h:546
span class implementation, based on ISO++20 span<T>. The interface should be the same.
Definition: span.h:435
constexpr XGBOOST_DEVICE pointer data() const __span_noexcept
Definition: span.h:554
constexpr XGBOOST_DEVICE index_type size() const __span_noexcept
Definition: span.h:559
A tensor view with static type and dimension. It implements indexing and slicing.
Definition: linalg.h:278
The input data structure of xgboost.
Feature map data structure to help visualization and model dump.
A device-and-host vector abstraction layer.
Linear algebra related utilities.
Defines the abstract interface for different components in XGBoost.
Learner interface that integrates objective, gbm and evaluation together. This is the user facing XGB...
Definition: base.h:89
std::int32_t bst_node_t
Type for tree node index and tree depth.
Definition: base.h:111
std::uint32_t bst_target_t
Type for indexing into output targets.
Definition: base.h:119
std::uint32_t bst_feature_t
Type for data column (feature) index.
Definition: base.h:99
float bst_float
float type, used for storing statistics
Definition: base.h:95
StringView MTNotImplemented()
Definition: tree_model.h:640
A type for device ordinal. The type is packed into 32-bit for efficient use in viewing types like lin...
Definition: context.h:40
bool IsCPU() const
Definition: context.h:56
node statistics used in regression tree
Definition: tree_model.h:57
RTreeNodeStat(float loss_chg, float sum_hess, float weight)
Definition: tree_model.h:68
float sum_hess
sum of hessian values, used to measure coverage of data
Definition: tree_model.h:61
int leaf_child_cnt
number of child that is leaf node known up to now
Definition: tree_model.h:65
float loss_chg
loss change caused by current split
Definition: tree_model.h:59
float base_weight
weight of current node
Definition: tree_model.h:63
bool operator==(const RTreeNodeStat &b) const
Definition: tree_model.h:70
Definition: tree_model.h:512
std::size_t size
Definition: tree_model.h:514
std::size_t beg
Definition: tree_model.h:513
CSR-like matrix for categorical splits.
Definition: tree_model.h:511
common::Span< uint32_t const > categories
Definition: tree_model.h:517
common::Span< Segment const > node_ptr
Definition: tree_model.h:518
common::Span< FeatureType const > split_type
Definition: tree_model.h:516
dense feature vector that can be taken by RegTree and can be construct from sparse feature vector.
Definition: tree_model.h:430
void HasMissing(bool has_missing)
Definition: tree_model.h:465
void Drop()
drop the trace after fill, must be called after fill.
Definition: tree_model.h:629
bool HasMissing() const
Definition: tree_model.h:637
bool IsMissing(size_t i) const
check whether i-th entry is missing
Definition: tree_model.h:635
size_t Size() const
returns the size of the feature vector
Definition: tree_model.h:631
void Init(size_t size)
initialize the vector with size vector
Definition: tree_model.h:612
common::Span< float > Data()
Definition: tree_model.h:467
void Fill(SparsePage::Inst const &inst)
fill the vector with sparse vector
Definition: tree_model.h:618
bst_float GetFvalue(size_t i) const
get ith value
Definition: tree_model.h:633
Definition: string_view.h:16
meta parameters of the tree
Definition: tree_model.h:37
bst_node_t num_deleted
The number of deleted nodes.
Definition: tree_model.h:41
bst_feature_t num_feature
The number of features used for tree construction.
Definition: tree_model.h:43
bool operator==(const TreeParam &b) const
Definition: tree_model.h:47
bst_node_t num_nodes
The number of nodes.
Definition: tree_model.h:39
void ToJson(Json *p_out) const
void FromJson(Json const &in)
bst_target_t size_leaf_vector
leaf vector size. Used by the vector leaf.
Definition: tree_model.h:45