Implement categorical prediction for CPU and GPU predict leaf. (#7001)
* Categorical prediction with CPU predictor and GPU predict leaf. * Implement categorical prediction for CPU prediction. * Implement categorical prediction for GPU predict leaf. * Refactor the prediction functions to have a unified get next node function. Co-authored-by: Shvets Kirill <kirill.shvets@intel.com>
This commit is contained in:
31
src/predictor/predict_fn.h
Normal file
31
src/predictor/predict_fn.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*!
|
||||
* Copyright 2021 by XGBoost Contributors
|
||||
*/
|
||||
#ifndef XGBOOST_PREDICTOR_PREDICT_FN_H_
|
||||
#define XGBOOST_PREDICTOR_PREDICT_FN_H_
|
||||
#include "../common/categorical.h"
|
||||
#include "xgboost/tree_model.h"
|
||||
|
||||
namespace xgboost {
|
||||
namespace predictor {
|
||||
template <bool has_missing, bool has_categorical>
|
||||
inline XGBOOST_DEVICE bst_node_t
|
||||
GetNextNode(const RegTree::Node &node, const bst_node_t nid, float fvalue,
|
||||
bool is_missing, RegTree::CategoricalSplitMatrix const &cats) {
|
||||
if (has_missing && is_missing) {
|
||||
return node.DefaultChild();
|
||||
} else {
|
||||
if (has_categorical && common::IsCat(cats.split_type, nid)) {
|
||||
auto node_categories = cats.categories.subspan(cats.node_ptr[nid].beg,
|
||||
cats.node_ptr[nid].size);
|
||||
return Decision(node_categories, common::AsCat(fvalue))
|
||||
? node.LeftChild()
|
||||
: node.RightChild();
|
||||
} else {
|
||||
return node.LeftChild() + !(fvalue < node.SplitCond());
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace predictor
|
||||
} // namespace xgboost
|
||||
#endif // XGBOOST_PREDICTOR_PREDICT_FN_H_
|
||||
Reference in New Issue
Block a user