xgboost
base.h
Go to the documentation of this file.
1 
6 #ifndef XGBOOST_BASE_H_
7 #define XGBOOST_BASE_H_
8 
9 #include <dmlc/base.h>
10 #include <dmlc/omp.h>
11 #include <cmath>
12 #include <iostream>
13 #include <vector>
14 #include <string>
15 #include <utility>
16 
20 #ifndef XGBOOST_STRICT_R_MODE
21 #define XGBOOST_STRICT_R_MODE 0
22 #endif // XGBOOST_STRICT_R_MODE
23 
30 #ifndef XGBOOST_LOG_WITH_TIME
31 #define XGBOOST_LOG_WITH_TIME 1
32 #endif // XGBOOST_LOG_WITH_TIME
33 
37 #ifndef XGBOOST_CUSTOMIZE_LOGGER
38 #define XGBOOST_CUSTOMIZE_LOGGER XGBOOST_STRICT_R_MODE
39 #endif // XGBOOST_CUSTOMIZE_LOGGER
40 
44 #ifndef XGBOOST_CUSTOMIZE_GLOBAL_PRNG
45 #define XGBOOST_CUSTOMIZE_GLOBAL_PRNG XGBOOST_STRICT_R_MODE
46 #endif // XGBOOST_CUSTOMIZE_GLOBAL_PRNG
47 
51 #if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 8) || __GNUC__ > 4)
52 #define XGBOOST_ALIGNAS(X) alignas(X)
53 #else
54 #define XGBOOST_ALIGNAS(X)
55 #endif // defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 8) || __GNUC__ > 4)
56 
57 #if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 8) || __GNUC__ > 4) && \
58  !defined(__CUDACC__)
59 #include <parallel/algorithm>
60 #define XGBOOST_PARALLEL_SORT(X, Y, Z) __gnu_parallel::sort((X), (Y), (Z))
61 #define XGBOOST_PARALLEL_STABLE_SORT(X, Y, Z) \
62  __gnu_parallel::stable_sort((X), (Y), (Z))
63 #elif defined(_MSC_VER) && (!__INTEL_COMPILER)
64 #include <ppl.h>
65 #define XGBOOST_PARALLEL_SORT(X, Y, Z) concurrency::parallel_sort((X), (Y), (Z))
66 #define XGBOOST_PARALLEL_STABLE_SORT(X, Y, Z) std::stable_sort((X), (Y), (Z))
67 #else
68 #define XGBOOST_PARALLEL_SORT(X, Y, Z) std::sort((X), (Y), (Z))
69 #define XGBOOST_PARALLEL_STABLE_SORT(X, Y, Z) std::stable_sort((X), (Y), (Z))
70 #endif // GLIBC VERSION
71 
72 #if defined(__GNUC__)
73 #define XGBOOST_EXPECT(cond, ret) __builtin_expect((cond), (ret))
74 #else
75 #define XGBOOST_EXPECT(cond, ret) (cond)
76 #endif // defined(__GNUC__)
77 
81 #if defined (__CUDA__) || defined(__NVCC__)
82 #define XGBOOST_DEVICE __host__ __device__
83 #else
84 #define XGBOOST_DEVICE
85 #endif // defined (__CUDA__) || defined(__NVCC__)
86 
87 // These check are for Makefile.
88 #if !defined(XGBOOST_MM_PREFETCH_PRESENT) && !defined(XGBOOST_BUILTIN_PREFETCH_PRESENT)
89 /* default logic for software pre-fetching */
90 #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64))) || defined(__INTEL_COMPILER)
91 // Enable _mm_prefetch for Intel compiler and MSVC+x86
92  #define XGBOOST_MM_PREFETCH_PRESENT
93  #define XGBOOST_BUILTIN_PREFETCH_PRESENT
94 #elif defined(__GNUC__)
95 // Enable __builtin_prefetch for GCC
96 #define XGBOOST_BUILTIN_PREFETCH_PRESENT
97 #endif // GUARDS
98 
99 #endif // !defined(XGBOOST_MM_PREFETCH_PRESENT) && !defined()
100 
102 namespace xgboost {
103 
105 using bst_uint = uint32_t; // NOLINT
107 using bst_int = int32_t; // NOLINT
109 using bst_ulong = uint64_t; // NOLINT
111 using bst_float = float; // NOLINT
112 
114 using bst_feature_t = uint32_t; // NOLINT
121 using bst_row_t = std::size_t; // NOLINT
123 using bst_node_t = int32_t; // NOLINT
125 using bst_group_t = uint32_t; // NOLINT
126 
127 namespace detail {
131 template <typename T>
134  T grad_;
136  T hess_;
137 
138  XGBOOST_DEVICE void SetGrad(T g) { grad_ = g; }
139  XGBOOST_DEVICE void SetHess(T h) { hess_ = h; }
140 
141  public:
142  using ValueT = T;
143 
144  inline void Add(const ValueT& grad, const ValueT& hess) {
145  grad_ += grad;
146  hess_ += hess;
147  }
148 
149  inline static void Reduce(GradientPairInternal<T>& a, const GradientPairInternal<T>& b) { // NOLINT(*)
150  a += b;
151  }
152 
153  XGBOOST_DEVICE GradientPairInternal() : grad_(0), hess_(0) {}
154 
156  SetGrad(grad);
157  SetHess(hess);
158  }
159 
160  // Copy constructor if of same value type, marked as default to be trivially_copyable
161  GradientPairInternal(const GradientPairInternal<T> &g) = default;
162 
163  // Copy constructor if different value type - use getters and setters to
164  // perform conversion
165  template <typename T2>
167  SetGrad(g.GetGrad());
168  SetHess(g.GetHess());
169  }
170 
171  XGBOOST_DEVICE T GetGrad() const { return grad_; }
172  XGBOOST_DEVICE T GetHess() const { return hess_; }
173 
175  const GradientPairInternal<T> &rhs) {
176  grad_ += rhs.grad_;
177  hess_ += rhs.hess_;
178  return *this;
179  }
180 
182  const GradientPairInternal<T> &rhs) const {
184  g.grad_ = grad_ + rhs.grad_;
185  g.hess_ = hess_ + rhs.hess_;
186  return g;
187  }
188 
190  const GradientPairInternal<T> &rhs) {
191  grad_ -= rhs.grad_;
192  hess_ -= rhs.hess_;
193  return *this;
194  }
195 
197  const GradientPairInternal<T> &rhs) const {
199  g.grad_ = grad_ - rhs.grad_;
200  g.hess_ = hess_ - rhs.hess_;
201  return g;
202  }
203 
205  grad_ *= multiplier;
206  hess_ *= multiplier;
207  return *this;
208  }
209 
212  g.grad_ = grad_ * multiplier;
213  g.hess_ = hess_ * multiplier;
214  return g;
215  }
216 
218  grad_ /= divisor;
219  hess_ /= divisor;
220  return *this;
221  }
222 
225  g.grad_ = grad_ / divisor;
226  g.hess_ = hess_ / divisor;
227  return g;
228  }
229 
231  return grad_ == rhs.grad_ && hess_ == rhs.hess_;
232  }
233 
234  XGBOOST_DEVICE explicit GradientPairInternal(int value) {
235  *this = GradientPairInternal<T>(static_cast<float>(value),
236  static_cast<float>(value));
237  }
238 
239  friend std::ostream &operator<<(std::ostream &os,
240  const GradientPairInternal<T> &g) {
241  os << g.GetGrad() << "/" << g.GetHess();
242  return os;
243  }
244 };
245 } // namespace detail
246 
249 
252 
253 using Args = std::vector<std::pair<std::string, std::string> >;
254 
256 constexpr bst_float kRtEps = 1e-6f;
257 
259 using omp_ulong = dmlc::omp_ulong; // NOLINT
261 using bst_omp_uint = dmlc::omp_uint; // NOLINT
263 using XGBoostVersionT = int32_t;
264 
269 #if DMLC_USE_CXX11 && defined(__GNUC__) && !defined(__clang_version__)
270 #if __GNUC__ == 4 && __GNUC_MINOR__ < 8
271 #define override
272 #define final
273 #endif // __GNUC__ == 4 && __GNUC_MINOR__ < 8
274 #endif // DMLC_USE_CXX11 && defined(__GNUC__) && !defined(__clang_version__)
275 } // namespace xgboost
276 
277 #endif // XGBOOST_BASE_H_
XGBOOST_DEVICE GradientPairInternal(const GradientPairInternal< T2 > &g)
Definition: base.h:166
float bst_float
float type, used for storing statistics
Definition: base.h:111
XGBOOST_DEVICE GradientPairInternal< T > & operator-=(const GradientPairInternal< T > &rhs)
Definition: base.h:189
XGBOOST_DEVICE GradientPairInternal< T > operator*(float multiplier) const
Definition: base.h:210
int32_t bst_int
integer type.
Definition: base.h:107
XGBOOST_DEVICE T GetHess() const
Definition: base.h:172
XGBOOST_DEVICE GradientPairInternal(int value)
Definition: base.h:234
std::vector< std::pair< std::string, std::string > > Args
Definition: base.h:253
dmlc::omp_ulong omp_ulong
define unsigned long for openmp loop
Definition: base.h:259
XGBOOST_DEVICE GradientPairInternal< T > operator/(float divisor) const
Definition: base.h:223
uint32_t bst_feature_t
Type for data column (feature) index.
Definition: base.h:114
dmlc::omp_uint bst_omp_uint
define unsigned int for openmp loop
Definition: base.h:261
XGBOOST_DEVICE GradientPairInternal()
Definition: base.h:153
int32_t XGBoostVersionT
Type used for representing version number in binary form.
Definition: base.h:263
uint64_t bst_ulong
unsigned long integers
Definition: base.h:109
Implementation of gradient statistics pair. Template specialisation may be used to overload different...
Definition: base.h:132
XGBOOST_DEVICE bool operator==(const GradientPairInternal< T > &rhs) const
Definition: base.h:230
XGBOOST_DEVICE T GetGrad() const
Definition: base.h:171
uint32_t bst_group_t
Type for ranking group index.
Definition: base.h:125
int32_t bst_node_t
Type for tree node index.
Definition: base.h:123
XGBOOST_DEVICE GradientPairInternal< T > & operator+=(const GradientPairInternal< T > &rhs)
Definition: base.h:174
void Add(const ValueT &grad, const ValueT &hess)
Definition: base.h:144
#define XGBOOST_DEVICE
Tag function as usable by device.
Definition: base.h:84
XGBOOST_DEVICE GradientPairInternal(T grad, T hess)
Definition: base.h:155
std::size_t bst_row_t
Type for data row index.
Definition: base.h:121
namespace of xgboost
Definition: base.h:102
friend std::ostream & operator<<(std::ostream &os, const GradientPairInternal< T > &g)
Definition: base.h:239
constexpr bst_float kRtEps
small eps gap for minimum split decision.
Definition: base.h:256
XGBOOST_DEVICE GradientPairInternal< T > operator-(const GradientPairInternal< T > &rhs) const
Definition: base.h:196
XGBOOST_DEVICE GradientPairInternal< T > operator+(const GradientPairInternal< T > &rhs) const
Definition: base.h:181
uint32_t bst_uint
unsigned integer type used for feature index.
Definition: base.h:105
XGBOOST_DEVICE GradientPairInternal< T > & operator*=(float multiplier)
Definition: base.h:204
static void Reduce(GradientPairInternal< T > &a, const GradientPairInternal< T > &b)
Definition: base.h:149
T ValueT
Definition: base.h:142
XGBOOST_DEVICE GradientPairInternal< T > & operator/=(float divisor)
Definition: base.h:217