#include "./helpers.h" #include "xgboost/c_api.h" #include std::string TempFileName() { return std::tmpnam(nullptr); } bool FileExists(const std::string name) { struct stat st; return stat(name.c_str(), &st) == 0; } long GetFileSize(const std::string filename) { struct stat st; stat(filename.c_str(), &st); return st.st_size; } std::string CreateSimpleTestData() { return CreateBigTestData(6); } std::string CreateBigTestData(size_t n_entries) { std::string tmp_file = TempFileName(); std::ofstream fo; fo.open(tmp_file); const size_t entries_per_row = 3; size_t n_rows = (n_entries + entries_per_row - 1) / entries_per_row; for (size_t i = 0; i < n_rows; ++i) { const char* row = i % 2 == 0 ? " 0:0 1:10 2:20\n" : " 0:0 3:30 4:40\n"; fo << i << row; } fo.close(); return tmp_file; } void CheckObjFunction(xgboost::ObjFunction * obj, std::vector preds, std::vector labels, std::vector weights, std::vector out_grad, std::vector out_hess) { xgboost::MetaInfo info; info.num_row_ = labels.size(); info.labels_ = labels; info.weights_ = weights; xgboost::HostDeviceVector in_preds(preds); xgboost::HostDeviceVector out_gpair; obj->GetGradient(&in_preds, info, 1, &out_gpair); std::vector& gpair = out_gpair.HostVector(); ASSERT_EQ(gpair.size(), in_preds.Size()); for (int i = 0; i < static_cast(gpair.size()); ++i) { EXPECT_NEAR(gpair[i].GetGrad(), out_grad[i], 0.01) << "Unexpected grad for pred=" << preds[i] << " label=" << labels[i] << " weight=" << weights[i]; EXPECT_NEAR(gpair[i].GetHess(), out_hess[i], 0.01) << "Unexpected hess for pred=" << preds[i] << " label=" << labels[i] << " weight=" << weights[i]; } } xgboost::bst_float GetMetricEval(xgboost::Metric * metric, std::vector preds, std::vector labels, std::vector weights) { xgboost::MetaInfo info; info.num_row_ = labels.size(); info.labels_ = labels; info.weights_ = weights; return metric->Eval(preds, info, false); } std::shared_ptr CreateDMatrix(int rows, int columns, float sparsity, int seed) { const float missing_value = -1; std::vector test_data(rows * columns); std::mt19937 gen(seed); std::uniform_real_distribution dis(0.0f, 1.0f); for (auto &e : test_data) { if (dis(gen) < sparsity) { e = missing_value; } else { e = dis(gen); } } DMatrixHandle handle; XGDMatrixCreateFromMat(test_data.data(), rows, columns, missing_value, &handle); return *static_cast *>(handle); }